#!/bin/sh
#### Patch script - GNU Emacs - version 19.30 to 19.31

#### This file contains patches to turn version 19.30 of GNU Emacs into
#### 19.31.  To apply them, cd to the top of the Emacs source tree, and
#### then type 'sh <this file>'.

#### After you apply the patches, you should run Emacs (an earlier 19 will do,
#### as long as it's at least 19.29) and type M-x byte-recompile-directory RET
#### lisp RET to recompile the changed Emacs Lisp files.  Then you can build
#### the new Emacs version.

#### Also byte-compile these files in directory lisp/:
# cal-china.el cal-coptic.el cal-hebrew.el cal-islam.el cal-iso.el
# cal-julian.el cal-move.el cal-persia.el cc-compat.el decipher.el
# ediff-vers.el emacs-lock.el follow.el gulp.el iso02-syn.el morse.el
# shadow.el sun-curs.el sun-fns.el term/win32-win.el vt-control.el
#### Use M-x byte-compile-file RET <filename> RET to compile
#### file <filename>.  You need to do it once for each of these files.

#### We don't include patches for Info files since you can
#### regenerate them from the Texinfo files that we do include.
#### To update the changed info files, do
#### (cd man; make)

if [ -d lisp ] ; then
  true
else
  if [ -d emacs-19.30/lisp ] ; then
    cd emacs-19.30
  else
    (echo "$0: In order to apply this patch, the current directory"
     echo "must be the top of the Emacs distribution tree.") >&2
    exit 1
  fi
fi

### moves and renames
rm lisp/dired.todo
rm lisp/iso02-acc.el
rm lwlib/lwlib-Xol*
rm nt/config.w95
rm src/gmalloc1.c
rm src/gmalloc2.c
rm src/s/windows95.h

mv lisp/bytecpat.el lisp/patcomp.el
mv lisp/cal-chinese.el lisp/cal-china.el
test -f lisp/cal-chinese.elc && mv lisp/cal-chinese.elc lisp/cal-china.elc
mv lisp/cal-islamic.el lisp/cal-islam.el
test -f lisp/cal-islamic.elc && mv lisp/cal-islamic.elc lisp/cal-islam.elc
mv src/s/linux.h src/s/lignux.h
mv src/unexelfsgi.c src/unexsgi.c
mv src/unexelfsni.c src/unexsni.c

patch -p1 << \end-of-emacs-patch-kit
diff -2rcpP --exclude=*.elc emacs-19.30/ChangeLog emacs-19.31/ChangeLog
*** emacs-19.30/ChangeLog	Sat Nov 25 00:49:54 1995
--- emacs-19.31/ChangeLog	Sat May 25 15:30:21 1996
***************
*** 1,2 ****
--- 1,253 ----
+ Sat May 25 15:30:10 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
+ 
+ 	* Version 19.31 released.
+ 
+ Sat May 25 10:37:33 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
+ 
+ 	* configure.in: Recognize sparc-*-lignux.
+ 
+ Fri May  3 17:46:54 1996  Richard Stallman  <rms@delasyd.gnu.ai.mit.edu>
+ 
+ 	* make-dist: Include nt/inc/arpa and nt/inc/netinet in the dist.
+ 	Don't include config.w95.
+ 
+ Sun Apr 21 02:53:56 1996  Richard Stallman  <rms@delasyd.gnu.ai.mit.edu>
+ 
+ 	* make-dist: Replace --no-clean-up and --no-tar options
+ 	with --clean-up and --tar, so that the default is useful.
+ 
+ Mon Apr 15 19:28:14 1996  Eli Zaretskii  <eliz@is.elta.co.il>
+ 
+ 	* config.bat: Make sure the GDB init file is called src/_gdbinit;
+ 	if not, tell the user to rename it and abort.
+ 
+ Sun Apr 14 16:01:17 1996  Eli Zaretskii  <eliz@is.elta.co.il>
+ 
+ 	* config.bat: With DJGPP v1.x, use `COFF2EXE' to produce JUNK.EXE
+ 	test program.
+ 
+ Fri Apr 12 02:38:00 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* config.bat (djgpp_ver): Variable renamed from djgpp-ver.
+ 
+ 	* make-dist (MANIFEST): Fix previous change.
+ 	(msdos): Put mainmake.v2 into the dist.
+ 
+ Wed Apr 10 06:08:48 1996  Roland McGrath  <roland@charlie-brown.gnu.ai.mit.edu>
+ 
+ 	* make-dist: Exit if autoconf fails.
+ 
+ Wed Apr 10 13:28:33 1996  Eli Zaretskii  <eliz@is.elta.co.il>
+ 
+ 	* config.bat: Set djgpp-ver, and unset it at the end.
+ 	Add a number ofconditionals for DJGPP version 2.
+ 	Rename label libsrc2 to libsrc3.
+ 	Substitute for LDFLAGS in src/Makefile.
+ 	Substitute for ALL_CFLAGS in lib-src/Makefile.
+ 
+ Mon Apr  8 17:08:03 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* configure.in (ncurses): Check this after checking fns like strerror.
+ 
+ Mon Apr  8 00:45:19 1996  Erik Naggum  <erik@naggum.no>
+ 
+ 	* make-dist (MANIFEST): Don't include lines from =files.
+ 
+ Sun Apr  7 20:11:34 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* make-dist: Don't put lisp/dired.todo in the dist.
+ 
+ Fri Apr  5 13:09:47 1996  Richard Stallman  <rms@lucy.gnu.ai.mit.edu>
+ 
+ 	* configure.in (HAVE_NCURSES): Look for library named ncurses.
+ 
+ 	* configure.in (setlocale): Check for it.
+ 
+ 	* configure.in (*-*-sysv4.2*): If no /usr/ccs/lib/cpp, use /lib/cpp.
+ 	
+ Tue Mar 26 21:47:17 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* configure.in: Use lignux instead of linux as value of opsys.
+ 
+ Fri Mar 22 12:11:29 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* Makefile.in (install-strip): Fix whitespace.
+ 	Get rid of continuation.
+ 
+ 	* config.sub: Convert linux or gnu/linux to lignux.
+ 
+ Thu Mar 21 19:04:42 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* configure.in: Accept lignux in configuration name.
+ 
+ Wed Mar 20 09:51:01 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* Makefile.in (install-strip): New target.
+ 
+ Mon Mar 18 01:51:33 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* Makefile.in (top_distclean): Use `|| true' to ignore error in rm.
+ 	-f failed to do the job on Suns.
+ 
+ Wed Mar 13 03:20:00 1996  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
+ 
+ 	* Makefile.in (install-arch-dep): Don't depend on install-arch-indep.
+ 
+ 	* configure.in (linux/version.h): Check for this header.
+ 
+ Tue Mar 12 02:58:53 1996  Roland McGrath  <roland@charlie-brown.gnu.ai.mit.edu>
+ 
+ 	* configure.in: Remove -fno-builtin hackery from -lm check.
+ 
+ Fri Mar  8 15:31:44 1996  Roland McGrath  <roland@charlie-brown.gnu.ai.mit.edu>
+ 
+ 	* configure.in (-lm check): If $GCC, append -fno-builtin to $CC for
+  	just this test.
+ 
+ 	* configure.in (AC_PREREQ): Require version 2.8 of Autoconf.
+ 
+ Mon Mar  4 03:54:56 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* configure.in: Check for ncurses.
+ 
+ Wed Feb 28 21:48:07 1996  Paul Eggert  <eggert@twinsun.com>
+ 
+ 	* configure.in (LOCALTIME_CACHE):
+ 	Also define if localtime mishandles unsetting TZ.
+ 	This works around a localtime bug in mips-dec-ultrix.
+ 
+ Sun Feb 25 17:59:44 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* make-dist (finder-inf.el): Use finder-compile-keywords-make-dist.
+ 
+ 	* configure.in: Improve messages about X versions.
+ 
+ Sat Feb 24 00:10:17 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* configure.in (LOCALTIME_CACHE): Cope if $ac_cv_func_tzset is null.
+ 
+ Fri Feb 23 16:39:09 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* configure.in (HAVE_X11XTR6): Set it as a shell variable.
+ 	(HAVE_LIBXMU): If HAVE_X11XTR6, use -lSM and -lICE.
+ 
+ 	* Makefile.in (install-arch-dep): Depend on install-arch-indep.
+ 	(install): Put install-arch-indep before install-arch-dep.
+ 
+ Tue Feb 20 14:12:35 1996  Dave Love  <d.love@dl.ac.uk>
+ 
+ 	* INSTALL: Clarify info about MS-DOS path handling.
+ 
+ Mon Feb 12 13:54:35 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* Makefile.in (install-arch-indep): Install info/ccmode*.
+ 	In previous change, protect against /bin/pwd returning null string.
+ 
+ Wed Feb  7 14:12:10 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* Makefile.in (install-arch-indep): Copy build-dir's lisp subdir
+ 	to lispdir.
+ 
+ Thu Feb  1 16:36:36 1996  Paul Eggert  <eggert@twinsun.com>
+ 
+ 	* configure.in (LD_RUN_PATH): Prepend x_libraries to this envvar.
+ 
+ Tue Jan 30 21:22:40 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* configure.in (HAVE_TIMEVAL): Set explicitly to `no' if test fails.
+ 
+ Thu Jan 25 01:59:04 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* Makefile.in (extraclean): Use ${top_distclean} to ensure
+ 	we delete everything distclean deletes.
+ 
+ Tue Jan 23 12:35:24 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
+ 
+ 	* make-dist (lwlib): Don't distribute lwlib-Xol* files.
+ 
+ Wed Jan 17 17:02:23 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* configure.in (HAVE_X11): Merge $LD_SWITCH_X_SITE
+ 	into LDFLAGS instead of into LIBS.
+ 
+ Tue Jan 16 17:53:38 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* configure.in (HAVE_XMU): Fix typo in previous change.
+ 
+ Mon Jan 15 15:07:46 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* configure.in [Solaris]: Don't let $CC make us use /usr/ucb/cc.
+ 
+ Wed Jan 10 15:09:50 1996  Erik Naggum  <erik@naggum.no>
+ 
+ 	* configure.in (USE_X_TOOLKIT = maybe): Delete redundant `fi'.
+ 
+ Wed Jan 10 14:41:50 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
+ 
+ 	* Makefile.in (install-arch-indep): Ignore error if no chmod -R.
+ 
+ Wed Jan 10 14:20:18 1996  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
+ 
+ 	* configure.in (HAVE_XMU): Check for libXmu.a only if using toolkit
+ 	and use -lXt to link it.
+ 
+ Mon Jan  8 09:48:39 1996  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
+ 
+ 	* configure.in (locallisppath): Put version-specific dir first.
+ 
+ Sun Jan  7 10:47:11 1996  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
+ 
+ 	* configure.in (hppa-*-nextstep*): New alternative.
+ 	(USE_X_TOOLKIT): By default, set this to "maybe";
+ 	and change that later to LUCID or "no" according to X11 version.
+ 
+ 	* make-dist: Recompile outdated .elc files and update all autoloads.
+ 
+ Fri Jan  5 18:12:10 1996  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* configure.in (locallisppath): Fix typo in last change: " -> '.
+ 
+ Thu Jan  4 21:14:35 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* configure.in (locallisppath): Add ../emacs/VERSION/site-lisp.
+ 
+ Wed Dec 27 08:58:41 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* Makefile.in (install-arch-indep): Give all files read permission.
+ 
+ Tue Dec 26 00:07:16 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* configure.in (hppa*-hp-hpux9shr*, hppa*-hp-hpux9*, hppa*-hp-hpux*):
+ 	If it is hpux 9, check for /usr/include/X11R5 and /usr/lib/x11R5.
+ 
+ Sun Dec 24 18:10:14 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* configure.in: Determine HAVE_X11R6.
+ 	(HAVE_MENUS): Renamed from HAVE_X_MENU.
+ 
+ Thu Dec 21 02:23:44 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
+ 
+ 	* configure.in: Just "solaris" now defaults to version 2.4.
+ 	Add sunos4.1.n-noshare as alternative.
+ 
+ Fri Dec  1 13:07:57 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* configure.in (mips-sgi-irix6*): Set NON_GNU_CPP.
+ 
+ Wed Nov 29 22:44:43 1995  Erik Naggum  <erik@naggum.no>
+ 
+ 	* Makefile.in (install-arch-indep): Add missing backslash.
+ 
+ Wed Nov 29 14:44:31 1995  Karl Eichwalder  <ke@ke.Central.DE>
+ 
+ 	* Makefile.in (install-arch-indep): Don't install
+ 	lispdir/[Mm]akefile*, lispdir/ChangeLog, lispdir/dired.todo.
+ 
+ Wed Nov 29 00:13:03 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* Makefile.in (install-arch-indep): Fix previous change.
+ 
+ 	* configure.in (mips-sni-sysv*): New alias for mips-siemens-sysv*.
+ 
  Fri Nov 24 23:40:55 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
*************** Sat Aug  5 01:58:56 1995  Richard Stallm
*** 130,134 ****
  	(i*86-*-nextstep*): Use nextstep.h.
  	(sparc-*-nextstep*): New configuration.
! 	
  Wed Aug  2 22:05:03 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
--- 381,385 ----
  	(i*86-*-nextstep*): Use nextstep.h.
  	(sparc-*-nextstep*): New configuration.
! 
  Wed Aug  2 22:05:03 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
*************** Tue Jun 27 19:00:12 1995  Richard Stallm
*** 185,189 ****
  	* configure.in: On hpux9, use hpux9-x11r4.h if we have X11R4.
  	On hpux9shr, use hpux9shxr4.h.
! 	
  Sat Jun 24 18:58:17 1995  Morten Welinder  <terra+@cs.cmu.edu>
  
--- 436,440 ----
  	* configure.in: On hpux9, use hpux9-x11r4.h if we have X11R4.
  	On hpux9shr, use hpux9shxr4.h.
! 
  Sat Jun 24 18:58:17 1995  Morten Welinder  <terra+@cs.cmu.edu>
  
*************** Wed Sep 21 12:59:04 1994  David J. MacKe
*** 594,598 ****
  Wed Sep 21 05:28:03 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* configure.in (i[345]86-sequent-ptx*): Handle 
  
  Tue Sep 20 18:16:15 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
--- 845,849 ----
  Wed Sep 21 05:28:03 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* configure.in (i[345]86-sequent-ptx*): Handle
  
  Tue Sep 20 18:16:15 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
*************** Thu Feb 24 16:16:10 1994  Karl Heuer  (k
*** 1079,1083 ****
  Thu Feb 24 15:41:16 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* configure.in (*-sysv4.1): Set NON_GNU_CPP. 
  
  Tue Feb 22 19:05:02 1994  Karl Heuer  (kwzh@geech.gnu.ai.mit.edu)
--- 1330,1334 ----
  Thu Feb 24 15:41:16 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* configure.in (*-sysv4.1): Set NON_GNU_CPP.
  
  Tue Feb 22 19:05:02 1994  Karl Heuer  (kwzh@geech.gnu.ai.mit.edu)
*************** Tue Jan 18 18:47:51 1994  Richard Stallm
*** 1188,1192 ****
  Mon Jan 17 17:17:14 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* configure.in: If CPP has a value that is a directory, 
  	discard the value.
  
--- 1439,1443 ----
  Mon Jan 17 17:17:14 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* configure.in: If CPP has a value that is a directory,
  	discard the value.
  
*************** Sun Nov 21 04:01:46 1993  Richard Stallm
*** 1312,1316 ****
  Sat Nov 20 01:03:10 1993  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* configure.in (version): When --run-in-place, exclude 
  	${datadir}/emacs/site-lisp from locallisppath.
  
--- 1563,1567 ----
  Sat Nov 20 01:03:10 1993  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* configure.in (version): When --run-in-place, exclude
  	${datadir}/emacs/site-lisp from locallisppath.
  
*************** Fri Sep 10 01:18:13 1993  Roland McGrath
*** 1453,1457 ****
  
  	* configure.in: Remove check for $srcdir being configured.  This
! 	pretty much works now.  
  	Grok {m68*-hp,i[34]86-*}-netbsd* and set opsys=netbsd.
  	Check for XFree86 (/usr/X386/include) independent of whether
--- 1704,1708 ----
  
  	* configure.in: Remove check for $srcdir being configured.  This
! 	pretty much works now.
  	Grok {m68*-hp,i[34]86-*}-netbsd* and set opsys=netbsd.
  	Check for XFree86 (/usr/X386/include) independent of whether
*************** Wed Aug 11 00:12:45 1993  Richard Stallm
*** 1488,1492 ****
  
  	* configure.in (m68*-hp-hpux*, hppa*-hp-hpux*):
! 	Recognize *.B8.* as hpux version 8. 
  	(m68*-tektronix-bsd*): Fix typo in tek4300.
  	(AC_HAVE_FUNCS): Add ftime.
--- 1739,1743 ----
  
  	* configure.in (m68*-hp-hpux*, hppa*-hp-hpux*):
! 	Recognize *.B8.* as hpux version 8.
  	(m68*-tektronix-bsd*): Fix typo in tek4300.
  	(AC_HAVE_FUNCS): Add ftime.
*************** Fri Jul 30 20:54:58 1993  David J. MacKe
*** 1542,1546 ****
  	or if we were told to use X11 but not told where.
  	Search the libraries from the s and/or m files when checking for
! 	functions. 
  
  	* configure.in: Remove any trailing slashes in prefix and exec_prefix.
--- 1793,1797 ----
  	or if we were told to use X11 but not told where.
  	Search the libraries from the s and/or m files when checking for
! 	functions.
  
  	* configure.in: Remove any trailing slashes in prefix and exec_prefix.
*************** Thu Jun 10 01:45:45 1993  Jim Blandy  (j
*** 1686,1690 ****
  	* configure.in: Recognize configuration name for Data General
  	AViiON machines.
! 	
  	* configure.in: Use AC_LONG_FILE_NAMES.
  
--- 1937,1941 ----
  	* configure.in: Recognize configuration name for Data General
  	AViiON machines.
! 
  	* configure.in: Use AC_LONG_FILE_NAMES.
  
*************** Fri Apr  9 07:20:40 1993  Jim Blandy  (j
*** 2219,2223 ****
  	file-editing facilities.
  	* configure.in: Renamed from configure.
! 	Quote the sections of shell script we want copied literally to 
  	the configure script.
  	(compile): Initialize this to make the autoconf macros' code happy.
--- 2470,2474 ----
  	file-editing facilities.
  	* configure.in: Renamed from configure.
! 	Quote the sections of shell script we want copied literally to
  	the configure script.
  	(compile): Initialize this to make the autoconf macros' code happy.
*************** Tue Feb 23 06:54:11 1993  Jim Blandy  (j
*** 2382,2386 ****
  Wed Feb 17 20:19:06 1993  Jim Blandy  (jimb@totoro.cs.oberlin.edu)
  
! 	* make-dist: Don't distribute the external-lisp directory anymore.  
  	* INSTALL: Remove all references to external-lisp.
  
--- 2633,2637 ----
  Wed Feb 17 20:19:06 1993  Jim Blandy  (jimb@totoro.cs.oberlin.edu)
  
! 	* make-dist: Don't distribute the external-lisp directory anymore.
  	* INSTALL: Remove all references to external-lisp.
  
*************** Fri Aug 14 12:31:45 1992  Eric S. Raymon
*** 2710,2714 ****
  Thu Aug 13 13:02:31 1992  Jim Blandy  (jimb@pogo.cs.oberlin.edu)
  
! 	* configure: When writing config.status, don't prefix progname 
  	with a '.'; it might be absolute.
  
--- 2961,2965 ----
  Thu Aug 13 13:02:31 1992  Jim Blandy  (jimb@pogo.cs.oberlin.edu)
  
! 	* configure: When writing config.status, don't prefix progname
  	with a '.'; it might be absolute.
  
*************** Tue Jul  7 14:47:31 1992  Jim Blandy  (j
*** 2726,2730 ****
  
  	* Makefile.in (clean, mostlyclean): Don't bother trying to `make
! 	clean' in arch-lib; it doesn't even have a Makefile.	
  
  	* Makefile.in (clean, mostlyclean): In the test which tries to
--- 2977,2981 ----
  
  	* Makefile.in (clean, mostlyclean): Don't bother trying to `make
! 	clean' in arch-lib; it doesn't even have a Makefile.
  
  	* Makefile.in (clean, mostlyclean): In the test which tries to
*************** Wed Jun 10 19:20:27 1992  Jim Blandy  (j
*** 2788,2795 ****
  
  Thu May 28 09:51:46 1992  Ken Raeburn  (Raeburn@Cygnus.COM)
! 	
  	* make-dist: Don't distribute configured versions of config.h.in,
  	paths.h.in, Makefile.in in src.
! 		
  	* configure: Delete .tmp files before creating them; don't bother
  	trying to make final targets writeable first, since it won't
--- 3039,3046 ----
  
  Thu May 28 09:51:46 1992  Ken Raeburn  (Raeburn@Cygnus.COM)
! 
  	* make-dist: Don't distribute configured versions of config.h.in,
  	paths.h.in, Makefile.in in src.
! 
  	* configure: Delete .tmp files before creating them; don't bother
  	trying to make final targets writeable first, since it won't
*************** Mon Apr 20 09:54:48 1992  Jim Blandy  (j
*** 2864,2868 ****
  	change in the Makefile.
  
! 	* configure: Accept "-OPTION VALUE" as well as "-OPTION=VALUE". 
  
  	* INSTALL: Mention that you have to copy all the 'FOO.in' files to
--- 3115,3119 ----
  	change in the Makefile.
  
! 	* configure: Accept "-OPTION VALUE" as well as "-OPTION=VALUE".
  
  	* INSTALL: Mention that you have to copy all the 'FOO.in' files to
*************** Wed Apr  8 00:58:46 1992  Jim Blandy  (j
*** 2911,2915 ****
  
  	* Makefile, build-install: Renamed to Makefile.in and
! 	build-install.in; the configure script will edit these to produce 
  	the usable Makefile and build-install.
  	* configure: Changed to produce ./Makefile, ./build-install,
--- 3162,3166 ----
  
  	* Makefile, build-install: Renamed to Makefile.in and
! 	build-install.in; the configure script will edit these to produce
  	the usable Makefile and build-install.
  	* configure: Changed to produce ./Makefile, ./build-install,
*************** Thu Apr  2 01:54:22 1992  Jim Blandy  (j
*** 2948,2952 ****
  	* INSTALL: Doc fix.
  
! 	* Makefile: brought the Makefile up to the GNU coding 
  	standards, as described in standards.text:
  	(TAGS): New name for the target which rebuilds the tags table.
--- 3199,3203 ----
  	* INSTALL: Doc fix.
  
! 	* Makefile: brought the Makefile up to the GNU coding
  	standards, as described in standards.text:
  	(TAGS): New name for the target which rebuilds the tags table.
*************** Tue Mar 31 10:25:57 1992  Jim Blandy  (j
*** 2989,2993 ****
  	* share-lib: Re-renamed to etc, for the sake of tradition.
  	* config.emacs: Changed default value for datadir to ../etc.
! 	* INSTALL, README: Adjusted.	
  
  Wed Mar 18 15:54:58 1992  Jim Blandy  (jimb@pogo.cs.oberlin.edu)
--- 3240,3244 ----
  	* share-lib: Re-renamed to etc, for the sake of tradition.
  	* config.emacs: Changed default value for datadir to ../etc.
! 	* INSTALL, README: Adjusted.
  
  Wed Mar 18 15:54:58 1992  Jim Blandy  (jimb@pogo.cs.oberlin.edu)
*************** Thu Jan 30 10:26:45 1992  Jim Blandy  (j
*** 3019,3023 ****
  
  	* config.emacs: Print out progress report messages.
! 	
  	* Makefile (src/paths.h): Don't generically replace
  	/usr/local/lib/emacs with LIBROOT.  This can hide bugs in the
--- 3270,3274 ----
  
  	* config.emacs: Print out progress report messages.
! 
  	* Makefile (src/paths.h): Don't generically replace
  	/usr/local/lib/emacs with LIBROOT.  This can hide bugs in the
*************** Thu Dec  5 14:39:44 1991  Jim Blandy  (j
*** 3053,3057 ****
  	(EMACSROOT): New variable, giving the directory under which all of
  	Emacs's libraries should be installed.  Changed rest of file to
! 	use it. 
  	(LIBDIR): Now denotes only architecture-dependent dir - relevant cha
  	(DATADIR): New variable, denoting architecture-independent dir.
--- 3304,3308 ----
  	(EMACSROOT): New variable, giving the directory under which all of
  	Emacs's libraries should be installed.  Changed rest of file to
! 	use it.
  	(LIBDIR): Now denotes only architecture-dependent dir - relevant cha
  	(DATADIR): New variable, denoting architecture-independent dir.
*************** Thu Dec  5 14:39:44 1991  Jim Blandy  (j
*** 3063,3067 ****
  	* build-install: Changes parallel to the above.
  	* README: Describe the new arrangement.
! 	
  	* vms: New subdirectory for all the VMS stuff.
  
--- 3314,3318 ----
  	* build-install: Changes parallel to the above.
  	* README: Describe the new arrangement.
! 
  	* vms: New subdirectory for all the VMS stuff.
  
diff -2rcpP --exclude=*.elc emacs-19.30/INSTALL emacs-19.31/INSTALL
*** emacs-19.30/INSTALL	Mon Jul 17 16:52:44 1995
--- emacs-19.31/INSTALL	Tue May  7 15:00:45 1996
*************** Copyright (c) 1992, 1994 Free software F
*** 17,22 ****
  
  BUILDING AND INSTALLATION:
! (This is for a Unix or Unix-like system.  For MSDOS, see below;
! search for MSDOG.  For Windows NT, see the file nt/install.)
  
  1) Make sure your system has enough swapping space allocated to handle
--- 17,23 ----
  
  BUILDING AND INSTALLATION:
! 
! (This is for a Unix or Unix-like system.  For MSDOS, see below; search
! for MSDOG.  For Windows NT or Windows 95, see the file nt/INSTALL.)
  
  1) Make sure your system has enough swapping space allocated to handle
*************** a program whose pure code is 900k bytes 
*** 24,28 ****
  least 400k and can reach 8Mb or more.  If the swapping space is
  insufficient, you will get an error in the command `temacs -batch -l
! loadup dump', found in `./src/Makefile.in.in', or possibly when
  running the final dumped Emacs.
   
--- 25,29 ----
  least 400k and can reach 8Mb or more.  If the swapping space is
  insufficient, you will get an error in the command `temacs -batch -l
! loadup dump', found in `./src/Makefile.in', or possibly when
  running the final dumped Emacs.
   
*************** Lisp code you want Emacs to load before 
*** 146,150 ****
  site-load.el for additional libraries if you arrange for their
  documentation strings to be in the etc/DOC file (see
! src/Makefile.in.in if you wish to figure out how to do that).  For all
  else, use site-init.el.
  
--- 147,151 ----
  site-load.el for additional libraries if you arrange for their
  documentation strings to be in the etc/DOC file (see
! src/Makefile.in if you wish to figure out how to do that).  For all
  else, use site-init.el.
  
*************** are installed in the following directori
*** 183,196 ****
  		`VERSION' stands for the number of the Emacs version
  		you are installing, like `18.59' or `19.27'.  Since the
! 		lisp library changes from one version of Emacs to
  		another, including the version number in the path
  		allows you to have several versions of Emacs installed
! 		at the same time; this means that you don't have to
! 		make Emacs unavailable while installing a new
! 		version.
! 
! 		Emacs searches for its lisp files in
! 		`/usr/local/share/emacs/site-lisp', then in this
! 		directory.
  
  `/usr/local/share/emacs/VERSION/etc' holds the Emacs tutorial, the DOC
--- 184,203 ----
  		`VERSION' stands for the number of the Emacs version
  		you are installing, like `18.59' or `19.27'.  Since the
! 		Lisp library changes from one version of Emacs to
  		another, including the version number in the path
  		allows you to have several versions of Emacs installed
! 		at the same time; in particular, you don't have to
! 		make Emacs unavailable while installing a new version.
! 
! `/usr/local/share/emacs/VERSION/site-lisp' holds the local Emacs Lisp
! 		files installed for Emacs version VERSION only.
! 
! `/usr/local/share/emacs/site-lisp' holds the local Emacs Lisp
! 		files installed for all Emacs versions.
! 
! 		When Emacs is installed, it searches for its Lisp files
! 		in `/usr/local/share/emacs/VERSION/site-lisp', then in
! 		`/usr/local/share/emacs/site-lisp', and finally in
! 		`/usr/local/share/emacs/VERSION/lisp'.
  
  `/usr/local/share/emacs/VERSION/etc' holds the Emacs tutorial, the DOC
*************** are installed in the following directori
*** 229,233 ****
  If these directories are not what you want, you can specify where to
  install Emacs's libraries and data files or where Emacs should search
! for its lisp files by giving values for `make' variables as part of
  the command.  See the section below called `MAKE VARIABLES' for more
  information on this.
--- 236,240 ----
  If these directories are not what you want, you can specify where to
  install Emacs's libraries and data files or where Emacs should search
! for its Lisp files by giving values for `make' variables as part of
  the command.  See the section below called `MAKE VARIABLES' for more
  information on this.
*************** Here is a complete list of the variables
*** 269,273 ****
  	defaults to /usr/local/share.  We create the following
  	subdirectories under `datadir':
! 	- `emacs/VERSION/lisp', containing the Emacs lisp library, and
  	- `emacs/VERSION/etc', containing the Emacs tutorial, the DOC
  		file, and the `yow' database.
--- 276,280 ----
  	defaults to /usr/local/share.  We create the following
  	subdirectories under `datadir':
! 	- `emacs/VERSION/lisp', containing the Emacs Lisp library, and
  	- `emacs/VERSION/etc', containing the Emacs tutorial, the DOC
  		file, and the `yow' database.
*************** The above variables serve analogous purp
*** 340,357 ****
  GNU software; here are some variables specific to Emacs.
  
! `lispdir' indicates where Emacs installs and expects its lisp library.
  	Its default value, based on `datadir' (see above), is
  	`/usr/local/share/emacs/VERSION/lisp' (where `VERSION' is as
  	described above).
  
! `locallisppath' indicates where Emacs should search for lisp files
  	specific to your site.  It should be a colon-separated list of
  	directories; Emacs checks them in order before checking
! 	`lispdir'.  Its default value, based on `datadir' (see above),
! 	is `/usr/local/share/emacs/site-lisp'.
  
  `lisppath' is the complete list of directories Emacs should search for
! 	its lisp files; its default value is the concatenation of
! 	`lispdir' and `locallisppath'.  It should be a colon-separated
  	list of directories; Emacs checks them in the order they
  	appear.
--- 347,364 ----
  GNU software; here are some variables specific to Emacs.
  
! `lispdir' indicates where Emacs installs and expects its Lisp library.
  	Its default value, based on `datadir' (see above), is
  	`/usr/local/share/emacs/VERSION/lisp' (where `VERSION' is as
  	described above).
  
! `locallisppath' indicates where Emacs should search for Lisp files
  	specific to your site.  It should be a colon-separated list of
  	directories; Emacs checks them in order before checking
! 	`lispdir'.  Its default value, based on `datadir' (see above), is
! 	`/usr/local/share/emacs/VERSION/site-lisp:/usr/local/share/emacs/site-lisp'.
  
  `lisppath' is the complete list of directories Emacs should search for
! 	its Lisp files; its default value is the concatenation of
! 	`locallisppath' and `lispdir'.  It should be a colon-separated
  	list of directories; Emacs checks them in the order they
  	appear.
*************** Instead of running the `configure' progr
*** 390,394 ****
  following steps.
  
! 1) Copy `./src/config.h.in' to `./src/config.h'.
  
  2) Consult `./etc/MACHINES' to see what configuration name you should
--- 397,401 ----
  following steps.
  
! 1) Copy `./src/config.in' to `./src/config.h'.
  
  2) Consult `./etc/MACHINES' to see what configuration name you should
*************** redefine parameters used in `./lib-src/m
*** 406,411 ****
  
  3) Create src/Makefile and lib-src/Makefile from the corresponding
! `Makefile.in.in' files.  First copy `Makefile.in.in' to `Makefile.in',
! then edit in appropriate substituions for the @...@ constructs,
  and then copy the shell commands near the end of `configure'
  that run cpp to construct `Makefile'.
--- 413,418 ----
  
  3) Create src/Makefile and lib-src/Makefile from the corresponding
! `Makefile.in' files.  First copy `Makefile.in' to `Makefile.c',
! then edit in appropriate substitutions for the @...@ constructs,
  and then copy the shell commands near the end of `configure'
  that run cpp to construct `Makefile'.
*************** the following steps.
*** 424,428 ****
  
  1) Run `make src/paths.h' in the top directory.  This produces
! `./src/paths.h' from the template file `./src/paths.h.in', changing
  the paths to the values specified in `./Makefile'.
  
--- 431,435 ----
  
  1) Run `make src/paths.h' in the top directory.  This produces
! `./src/paths.h' from the template file `./src/paths.in', changing
  the paths to the values specified in `./Makefile'.
  
*************** Installation on MSDOG (a.k.a. MSDOS)
*** 505,515 ****
  
  To install on MSDOG, you need to have the GNU C compiler for MSDOG
! (also known as djgpp), GNU Make, rm, mv, chmod, and sed.
  
  Some users report that running Emacs 19.29 requires dpmi memory
  management.  We do not know why this is so, since 19.28 did not need
! it.  If we find out what change introduced this requirement, we will
! try to eliminate it.  It is possible that this problem happens only
! when there is not enough physical memory on the machine.
  
  You can find out if you have a dpmi host by running go32 (part of
--- 512,537 ----
  
  To install on MSDOG, you need to have the GNU C compiler for MSDOG
! (also known as djgpp), GNU Make, rm, mv, chmod, and sed.  See the
! remarks in config.bat for more information about locations and
! versions.
! 
! If you are compiling on an MSDOG-like system which has long file
! names, you may need to do `SET LFN=y' for some of the commands,
! especially the compilation commands.  It might be more convenient to
! unpack the Emacs distribution with djtar, which comes with djgpp; if
! you do `SET LFN=n' before unpacking, djtar truncates file names to 8.3
! naming as it extracts files, even if the system allows long file
! names, and this ensures that build procedures designed for 8.3 file
! names still work.  Use djtar with the command `djtar -x foo.tar' or
! `djtar -x foo.tgz'.
  
  Some users report that running Emacs 19.29 requires dpmi memory
  management.  We do not know why this is so, since 19.28 did not need
! it.  If we find out what change introduced this requirement, we may
! try to eliminate it.  ("May" because perhaps djgpp version 2's
! improved dpmi handling means this is no longer a problem.)
! 
! It is possible that this problem happens only when there is not enough
! physical memory on the machine.
  
  You can find out if you have a dpmi host by running go32 (part of
*************** To build and install Emacs, type these c
*** 522,535 ****
      make install
  
! You may need to work around a type conflict between gmalloc.c and the
! header file djgppstd.h regarding declarations of memalign and valloc.
! Temporarily deleting those declarations from djgppstd.h while compiling
! Emacs or while compiling gmalloc.c should do it.  We found out about this
! problem too late to include a more convenient fix--sorry.
! 
! To save disk space, Emacs is built with the idea that you will execute
! it from the same place in the file system where you built it.  As the
! /usr/local/ subtree does not exist on most MSDOG systems, the
! executables are placed in /emacs/bin/.
  
  MSDOG is a not a multitasking operating system, so Emacs features such
--- 544,560 ----
      make install
  
! Building Emacs creates executable files in the src and lib-src
! directories.  Installing Emacs on MSDOS moves these executables to a
! sibling directory called bin.  For example, if you build in directory
! /emacs, installing moves the executables from /emacs/src and
! /emacs/lib-src to the directory /emacs/bin, so you can then delete the
! subdirectories /emacs/src and /emacs/lib-src if you wish.  The only
! subdirectories you need to keep are bin, lisp, etc and info.
! 
! Emacs on MSDOS finds the lisp, etc and info directories by looking in
! ../lisp, ../etc and ../info, starting from the directory where the
! Emacs executable was run from.  You can override this by setting the
! environment variable HOME; if you do that, the directories lisp, etc
! and info are accessed as subdirectories of the HOME directory.
  
  MSDOG is a not a multitasking operating system, so Emacs features such
diff -2rcpP --exclude=*.elc emacs-19.30/Makefile.in emacs-19.31/Makefile.in
*** emacs-19.30/Makefile.in	Thu Nov 16 12:23:21 1995
--- emacs-19.31/Makefile.in	Fri Mar 22 23:25:01 1996
*************** lwlib/Makefile: lwlib/Makefile.in config
*** 295,303 ****
  ## We don't depend on `all', but rather on ${SUBDIR}, so that we won't
  ## ever modify src/paths.h.
! install: ${SUBDIR} install-arch-dep install-arch-indep blessmail
  	@true
  
! ### Note that we copy the DOC-* files from the build etc directory
! ### as well as lots of things from ${srcdir}/etc.
  install-arch-dep: mkdir
  	(cd lib-src; \
--- 295,306 ----
  ## We don't depend on `all', but rather on ${SUBDIR}, so that we won't
  ## ever modify src/paths.h.
! ### We do install-arch-indep first because
! ### the executable needs the Lisp files and DOC file to work properly.
! install: ${SUBDIR} install-arch-indep install-arch-dep blessmail
  	@true
  
! ### Install the executables that were compiled specifically for this machine.
! ### It would be nice to do something for a parallel make
! ### to ensure that install-arch-indep finishes before this starts.
  install-arch-dep: mkdir
  	(cd lib-src; \
*************** install-arch-dep: mkdir
*** 310,351 ****
  	-ln ${bindir}/emacs-${version} ${bindir}/$(EMACS)
  
! ### Note that we copy the DOC-* files from the build etc directory
! ### as well as lots of things from ${srcdir}/etc.
  ### Note that we copy DOC* and then delete DOC
  ### as a workaround for a bug in tar on Ultrix 4.2.
- 
  install-arch-indep: mkdir
  	-set ${COPYDESTS} ; \
! 	 for dir in ${COPYDIR} ; do \
! 	   if [ `(cd $$1 && /bin/pwd)` != `(cd $${dir} && /bin/pwd)` ] ; then \
! 	     rm -rf $$1 ; \
! 	   fi ; \
! 	   shift ; \
! 	 done
  	-set ${COPYDESTS} ; \
! 	 mkdir ${COPYDESTS} ; \
! 	 chmod ugo+rx ${COPYDESTS} ; \
! 	 for dir in ${COPYDIR} ; do \
! 	   dest=$$1 ; shift ; \
! 	   [ -d $${dir} ] \
! 	   && [ `(cd $${dir} && /bin/pwd)` != `(cd $${dest} && /bin/pwd)` ] \
! 	   && (echo "Copying $${dir}..." ; \
! 	       (cd $${dir}; tar -cf - . )|(cd $${dest};umask 022; tar -xvf - ); \
! 	       for subdir in `find $${dest} -type d ! -name RCS -print` ; do \
! 		 rm -rf $${subdir}/RCS ; \
! 		 rm -rf $${subdir}/CVS ; \
! 		 rm -f  $${subdir}/\#* ; \
! 		 rm -f  $${subdir}/.\#* ; \
! 		 rm -f  $${subdir}/*~ ; \
! 		 rm -f  $${subdir}/*.orig ; \
! 	       done) ; \
! 	 done
  	-rm -f ${lispdir}/subdirs.el
  	$(srcdir)/update-subdirs ${lispdir}
  	if [ `(cd ./etc; /bin/pwd)` != `(cd ${docdir}; /bin/pwd)` ]; \
  	then \
! 	   echo "Copying etc/DOC-* ..." ; \
  	   (cd etc; tar -cf - DOC*)|(cd ${docdir}; umask 0; tar -xvf - ); \
! 	   (cd $(docdir); rm DOC) \
  	else true; fi
  	thisdir=`/bin/pwd`; \
--- 313,366 ----
  	-ln ${bindir}/emacs-${version} ${bindir}/$(EMACS)
  
! ### Install the files that are machine-independent.
! ### Most of them come straight from the distribution;
! ### the exception is the DOC-* files, which are copied
! ### from the build directory.
! 
  ### Note that we copy DOC* and then delete DOC
  ### as a workaround for a bug in tar on Ultrix 4.2.
  install-arch-indep: mkdir
  	-set ${COPYDESTS} ; \
! 	for dir in ${COPYDIR} ; do \
! 	  if [ `(cd $$1 && /bin/pwd)` != `(cd $${dir} && /bin/pwd)` ] ; then \
! 	    rm -rf $$1 ; \
! 	  fi ; \
! 	  shift ; \
! 	done
  	-set ${COPYDESTS} ; \
! 	mkdir ${COPYDESTS} ; \
! 	chmod ugo+rx ${COPYDESTS} ; \
! 	for dir in ${COPYDIR} ; do \
! 	  dest=$$1 ; shift ; \
! 	  [ -d $${dir} ] \
! 	  && [ `(cd $${dir} && /bin/pwd)` != `(cd $${dest} && /bin/pwd)` ] \
! 	  && (echo "Copying $${dir} to $${dest}..." ; \
! 	      (cd $${dir}; tar -cf - . )|(cd $${dest};umask 022; tar -xvf - ); \
! 	      for subdir in `find $${dest} -type d ! -name RCS -print` ; do \
! 		rm -rf $${subdir}/RCS ; \
! 		rm -rf $${subdir}/CVS ; \
! 		rm -f  $${subdir}/\#* ; \
! 		rm -f  $${subdir}/.\#* ; \
! 		rm -f  $${subdir}/*~ ; \
! 		rm -f  $${subdir}/*.orig ; \
! 		rm -f  $${subdir}/[mM]akefile* ; \
! 		rm -f  $${subdir}/ChangeLog* ; \
! 		rm -f  $${subdir}/dired.todo ; \
! 	      done) ; \
! 	done
  	-rm -f ${lispdir}/subdirs.el
  	$(srcdir)/update-subdirs ${lispdir}
+ 	-chmod -R a+r ${COPYDESTS}
  	if [ `(cd ./etc; /bin/pwd)` != `(cd ${docdir}; /bin/pwd)` ]; \
  	then \
! 	   echo "Copying etc/DOC-* to ${docdir} ..." ; \
  	   (cd etc; tar -cf - DOC*)|(cd ${docdir}; umask 0; tar -xvf - ); \
! 	   (cd $(docdir); chmod a+r DOC*; rm DOC) \
! 	else true; fi
! 	if [ x`(cd ./lisp; /bin/pwd)` != x`(cd ${lispdir}; /bin/pwd)` ] \
! 	   && [ x`(cd ${srcdir}/lisp; /bin/pwd)` != x`(cd ./lisp; /bin/pwd)` ]; \
! 	then \
! 	   echo "Copying lisp/*.el and lisp/*.elc to ${lispdir} ..." ; \
! 	   (cd lisp; tar -cf - *.el *.elc)|(cd ${lispdir}; umask 0; tar -xvf - ); \
  	else true; fi
  	thisdir=`/bin/pwd`; \
*************** install-arch-indep: mkdir
*** 353,368 ****
  	then \
  	  (cd ${infodir};  \
! 	   if [ -f dir ] && [ ! -f dir.old ]; then mv -f dir dir.old; \
! 	   else mv -f dir dir.bak; fi; \
  	   cd ${srcdir}/info ; \
  	   (cd $${thisdir}; ${INSTALL_DATA} ${srcdir}/info/dir ${infodir}/dir); \
! 	   for f in cl* dired-x* ediff* emacs* forms* gnus* info* mh-e* sc* vip*; do \
! 	     (cd $${thisdir}; ${INSTALL_DATA} ${srcdir}/info/$$f ${infodir}/$$f); \
  	   done); \
  	else true; fi
! 	thisdir=`/bin/pwd`; cd ${srcdir}/etc; for page in emacs etags ctags ; do \
! 	  (cd $${thisdir}; ${INSTALL_DATA} ${srcdir}/etc/$${page}.1 ${man1dir}/$${page}${manext}); \
  	done
  
  ### Build all the directories we're going to install Emacs in.	Since
  ### we may be creating several layers of directories (for example,
--- 368,396 ----
  	then \
  	  (cd ${infodir};  \
! 	   if [ -f dir ]; then \
! 	     if [ ! -f dir.old ]; then mv -f dir dir.old; \
! 	     else mv -f dir dir.bak; fi; \
! 	   fi; \
  	   cd ${srcdir}/info ; \
  	   (cd $${thisdir}; ${INSTALL_DATA} ${srcdir}/info/dir ${infodir}/dir); \
! 	   (cd $${thisdir}; chmod a+r ${infodir}/dir); \
! 	   for f in ccmode* cl* dired-x* ediff* emacs* forms* gnus* info* mh-e* sc* vip*; do \
! 	     (cd $${thisdir}; \
! 	      ${INSTALL_DATA} ${srcdir}/info/$$f ${infodir}/$$f; \
! 	      chmod a+r ${infodir}/$$f); \
  	   done); \
  	else true; fi
! 	thisdir=`/bin/pwd`; \
! 	cd ${srcdir}/etc; \
! 	for page in emacs etags ctags ; do \
! 	  (cd $${thisdir}; \
! 	   ${INSTALL_DATA} ${srcdir}/etc/$${page}.1 ${man1dir}/$${page}${manext}; \
! 	   chmod a+r ${man1dir}/$${page}${manext}); \
  	done
  
+ ### Build Emacs and install it, stripping binaries while installing them.
+ install-strip:
+ 	$(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' install
+ 
  ### Build all the directories we're going to install Emacs in.	Since
  ### we may be creating several layers of directories (for example,
*************** top_distclean=\
*** 445,449 ****
  	rm -f config.status config.cache config.log ; \
  	rm -f Makefile ${SUBDIR_MAKEFILES} ; \
! 	(cd lock && rm -f *)
  distclean: FRC
  	(cd src;      $(MAKE) $(MFLAGS) distclean)
--- 473,477 ----
  	rm -f config.status config.cache config.log ; \
  	rm -f Makefile ${SUBDIR_MAKEFILES} ; \
! 	(cd lock && (rm * || true))
  distclean: FRC
  	(cd src;      $(MAKE) $(MFLAGS) distclean)
*************** maintainer-clean: FRC
*** 479,484 ****
  extraclean:
  	for i in ${SUBDIR}; do (cd $$i; $(MAKE) $(MFLAGS) extraclean); done
! 	-(cd lock && rm *)
! 	-rm config.status config-tmp-*
  	-rm -f *~ \#*
  
--- 507,512 ----
  extraclean:
  	for i in ${SUBDIR}; do (cd $$i; $(MAKE) $(MFLAGS) extraclean); done
! 	${top_distclean}
! 	-rm config-tmp-*
  	-rm -f *~ \#*
  
diff -2rcpP --exclude=*.elc emacs-19.30/PROBLEMS emacs-19.31/PROBLEMS
*** emacs-19.30/PROBLEMS	Fri Nov 10 12:46:16 1995
--- emacs-19.31/PROBLEMS	Thu May 23 12:14:03 1996
*************** This file describes various problems tha
*** 2,5 ****
--- 2,71 ----
  in compiling, installing and running GNU Emacs.
  
+ * On Windows 95, Alt-f6 does not get through to Emacs.
+ 
+ This character seems to be trapped by the kernel in Windows 95.
+ You can enter M-f6 by typing ESC f6.
+ 
+ * Typing Alt-Shift has strange effects on Windows 95.
+ 
+ This combination of keys is a command to change keyboard layout.  If
+ you proceed to type another non-modifier key before you let go of Alt
+ and Shift, the Alt and Shift act as modifiers in the usual way.
+ 
+ * `tparam' reported as a multiply-defined symbol when linking with ncurses.
+ 
+ This problem results from an incompatible change in ncurses, in
+ version 1.9.9e approximately.  This version is unable to provide a
+ definition of tparm without also defining tparam.  This is also
+ incompatible with Terminfo; as a result, the Emacs Terminfo support
+ does not work with this version of ncurses.
+ 
+ Until ncurses is fixed, the workaround is to link temacs without
+ terminfo.o.
+ 
+ * Strange results from format %d in a few cases, on a Sun.
+ 
+ Sun compiler version SC3.0 has been found to miscompile part of
+ editfns.c.  The workaround is to compile with some other compiler such
+ as GCC.
+ 
+ * Output from subprocess (such as man or diff) is randomly truncated
+ on GNU/Linux systems.
+ 
+ This is due to a kernel bug which seems to be fixed in Linux version
+ 1.3.75.
+ 
+ * Error messages `internal facep []' happen on GNU/Linux systems.
+ 
+ There is a report that replacing libc.so.5.0.9 with libc.so.5.2.16
+ caused this to start happening.  People are not sure why, but the
+ problem seems unlikely to be in Emacs itself.  Some suspect that it
+ is actually Xlib which won't work with libc.so.5.2.16.
+ 
+ Using the old library version is a workaround.
+ 
+ * On Solaris, Emacs crashes if you use (display-time).
+ 
+ This can happen if you configure Emacs without specifying the precise
+ version of Solaris that you are using.
+ 
+ * Emacs dumps core on startup, on Solaris.
+ 
+ Bill Sebok says that the cause of this is Solaris 2.4 vendor patch
+ 102303-05, which extends the Solaris linker to deal with the Solaris
+ Common Desktop Environment's linking needs.  You can fix the problem
+ by removing this patch and installing patch 102049-02 instead.
+ However, that linker version won't work with CDE.
+ 
+ On Solaris 2.5, the linker has this bug and there is no patch you
+ could remove to get rid of the bug.  However, the GNU linker does
+ work.
+ 
+ * Emacs dumps core if lisp-complete-symbol is called, on Solaris.
+ 
+ If you compile Emacs with the -fast or -xO4 option with version 3.0.2
+ of the Sun C compiler, Emacs dumps core when lisp-complete-symbol is
+ called.  The problem does not happen if you compile with GCC.
+ 
  * "Cannot find callback list" messages from dialog boxes on HPUX, in
  Emacs built with Motif.
*************** find that string, and take out the space
*** 16,19 ****
--- 82,118 ----
  Compiler fixes in Irix 6.0.1 should eliminate this problem.
  
+ * "out of virtual swap space" on Irix 5.3
+ 
+ This message occurs when the system runs out of swap space due to too
+ many large programs running.  The solution is either to provide more
+ swap space or to reduce the number of large programs being run.  You
+ can check the current status of the swap space by executing the
+ command `swap -l'.
+ 
+ You can increase swap space by changing the file /etc/fstab.  Adding a
+ line like this:
+ 
+ /usr/swap/swap.more     swap    swap    pri=3 0 0
+ 
+ where /usr/swap/swap.more is a file previously created (for instance
+ by using /etc/mkfile), will increase the swap space by the size of
+ that file.  Execute `swap -m' or reboot the machine to activate the
+ new swap area.  See the manpages for `swap' and `fstab' for further
+ information.
+ 
+ The objectserver daemon can use up lots of memory because it can be
+ swamped with NIS information.  It collects information about all users
+ on the network that can log on to the host.
+ 
+ If you want to disable the objectserver completely, you can execute
+ the command `chkconfig objectserver off' and reboot.  That may disable
+ some of the window system functionality, such as responding CDROM
+ icons.
+ 
+ You can also remove NIS support from the objectserver.  The SGI `admin'
+ FAQ has a detailed description on how to do that; see question 35
+ ("Why isn't the objectserver working?").  The admin FAQ can be found at
+ ftp://viz.tamu.edu/pub/sgi/faq/.
+ 
  * With certain fonts, when the cursor appears on a character, the
  character doesn't appear--you get a solid box instead.
*************** twm normally ignores "program-specified"
*** 103,107 ****
  You can tell it to obey them with this command in your `.twmrc' file:
  
!   UsePPosition	"on"		#allow clents to request a position
  
  * Compiling lib-src says there is no rule to make test-distrib.c.
--- 202,206 ----
  You can tell it to obey them with this command in your `.twmrc' file:
  
!   UsePPosition	"on"		#allow clients to request a position
  
  * Compiling lib-src says there is no rule to make test-distrib.c.
*************** directory contains scalable fonts if it 
*** 396,400 ****
  
  If this is so, re-order your X windows font path to put the scalable
! font directories last.  See the documentatoin of `xset' for details.
  
  With some X servers, it may be necessary to take the scalable font
--- 495,499 ----
  
  If this is so, re-order your X windows font path to put the scalable
! font directories last.  See the documentation of `xset' for details.
  
  With some X servers, it may be necessary to take the scalable font
diff -2rcpP --exclude=*.elc emacs-19.30/README emacs-19.31/README
*** emacs-19.30/README	Sat Nov 25 01:01:27 1995
--- emacs-19.31/README	Sat May 25 20:17:36 1996
***************
*** 1,3 ****
! This directory tree holds version 19.30 of GNU Emacs, the extensible,
  customizable, self-documenting real-time display editor.
  
--- 1,3 ----
! This directory tree holds version 19.31 of GNU Emacs, the extensible,
  customizable, self-documenting real-time display editor.
  
diff -2rcpP --exclude=*.elc emacs-19.30/config.bat emacs-19.31/config.bat
*** emacs-19.30/config.bat	Fri Sep  1 12:10:22 1995
--- emacs-19.31/config.bat	Mon Apr 15 14:40:49 1996
*************** rem   YOU'LL NEED THE FOLLOWING UTILITIE
*** 23,40 ****
  rem
  rem   + msdos version 3 or better.
! rem   + djgpp version 1,11 maint 4 or better.
  rem   + make utility that allows breaking of the 128 chars limit on
  rem     command lines.  ndmake (as of version 4.5) won't work due to a
! rem     line length limit.
! rem   + rm, mv, chmod (From GNU file utilities).
! rem   + sed.
  rem
! rem   You should be able to get all the above utilities from all
! rem   Simtel repositories, e.g., oak.oakland.edu in the directories
! rem   "/pub/msdos/djgpp" and "/pub/msdos/gnuish".  As usual, please
! rem   use your local mirroring site to reduce trans-Atlantic traffic.
  rem   ----------------------------------------------------------------------
  set X11=
  set nodebug=
  :again
  if "%1" == "" goto usage
--- 23,42 ----
  rem
  rem   + msdos version 3 or better.
! rem   + djgpp version 1.12maint1 or later (version 2.0 or later recommended).
  rem   + make utility that allows breaking of the 128 chars limit on
  rem     command lines.  ndmake (as of version 4.5) won't work due to a
! rem     line length limit.  The make that comes with djgpp does work.
! rem   + rm and mv (from GNU file utilities).
! rem   + sed (you can use the port that comes with DJGPP).
  rem
! rem   You should be able to get all the above utilities from any SimTel
! rem   repository, e.g. ftp.coast.net, in the directories
! rem   "SimTel/vendors/djgpp" and "SimTel/vendors/gnu/gnuish/dos_only".  As
! rem   usual, please use your local mirroring site to reduce trans-Atlantic
! rem   traffic.
  rem   ----------------------------------------------------------------------
  set X11=
  set nodebug=
+ set djgpp_ver=
  :again
  if "%1" == "" goto usage
*************** rm -f junk.c
*** 88,92 ****
  Goto End
  :gccOk
! rm -f junk.c junk.o
  Rem   ----------------------------------------------------------------------
  Echo Configuring the source directory...
--- 90,121 ----
  Goto End
  :gccOk
! rm -f junk.c junk.o junk junk.exe
! Echo Checking what version of DJGPP is installed...
! If Not "%DJGPP%" == "" goto djgppOk
! Echo To compile 'Emacs' under MS-DOS you MUST have DJGPP installed!
! Goto End
! :djgppOk
! echo int main()           >junk.c
! echo #ifdef __DJGPP__    >>junk.c
! echo {return (__DJGPP__)*10;} >>junk.c
! echo #else               >>junk.c
! echo #ifdef __GO32__     >>junk.c
! echo {return 10;}         >>junk.c
! echo #else               >>junk.c
! echo {return 0;}         >>junk.c
! echo #endif              >>junk.c
! echo #endif              >>junk.c
! gcc -o junk junk.c
! if not exist junk.exe coff2exe junk
! junk
! If ErrorLevel 10 Goto go32Ok
! rm -f junk.c junk junk.exe
! Echo To compile 'Emacs' under MS-DOS you MUST have DJGPP installed!
! Goto End
! :go32Ok
! set djgpp_ver=1
! If ErrorLevel 20 set djgpp_ver=2
! rm -f junk.c junk junk.exe
! Echo Configuring for DJGPP Version %DJGPP_VER% ...
  Rem   ----------------------------------------------------------------------
  Echo Configuring the source directory...
*************** rem   Create "makefile" from "makefile.i
*** 114,118 ****
--- 143,152 ----
  rm -f makefile junk.c
  sed -e "1,/cpp stuff/s@^# .*$@@" <makefile.in >junk.c
+ If "%DJGPP_VER%" == "1" Goto mfV1
+ gcc -E junk.c | sed -f ../msdos/sed1v2.inp >makefile
+ goto mfDone
+ :mfV1
  gcc -E junk.c | sed -f ../msdos/sed1.inp >makefile
+ :mfDone
  rm -f junk.c
  
*************** rm -f makefile.tmp
*** 125,129 ****
  if "%nodebug%" == "" goto src6
  sed -e "/^CFLAGS *=/s/ *-g//" <makefile >makefile.tmp
! mv -f makefile.tmp makefile
  :src6
  cd ..
--- 159,164 ----
  if "%nodebug%" == "" goto src6
  sed -e "/^CFLAGS *=/s/ *-g//" <makefile >makefile.tmp
! sed -e "/^LDFLAGS *=/s/=/=-s/" <makefile.tmp >makefile
! rm -f makefile.tmp
  :src6
  cd ..
*************** rem   Create "makefile" from "makefile.i
*** 134,143 ****
  sed -e "1,/cpp stuff/s@^# .*$@@" <makefile.in >junk.c
  gcc -E -I. -I../src junk.c | sed -e "s/^ /	/" -e "/^#/d" -e "/^[ 	]*$/d" >makefile.new
  sed -f ../msdos/sed3.inp <makefile.new >makefile
  rm -f makefile.new junk.c
! if "%nodebug%" == "" goto libsrc2
  sed -e "/^CFLAGS *=/s/ *-g//" <makefile >makefile.tmp
! mv -f makefile.tmp makefile
! :libsrc2
  cd ..
  rem   ----------------------------------------------------------------------
--- 169,184 ----
  sed -e "1,/cpp stuff/s@^# .*$@@" <makefile.in >junk.c
  gcc -E -I. -I../src junk.c | sed -e "s/^ /	/" -e "/^#/d" -e "/^[ 	]*$/d" >makefile.new
+ If "%DJGPP_VER%" == "2" goto libsrc-v2
  sed -f ../msdos/sed3.inp <makefile.new >makefile
+ Goto libsrc2
+ :libsrc-v2
+ sed -f ../msdos/sed3v2.inp <makefile.new >makefile
+ :libsrc2
  rm -f makefile.new junk.c
! if "%nodebug%" == "" goto libsrc3
  sed -e "/^CFLAGS *=/s/ *-g//" <makefile >makefile.tmp
! sed -e "/^ALL_CFLAGS *=/s/=/= -s/" <makefile.tmp >makefile
! rm -f makefile.tmp
! :libsrc3
  cd ..
  rem   ----------------------------------------------------------------------
*************** cd ..
*** 154,160 ****
  rem   ----------------------------------------------------------------------
  Echo Configuring the main directory...
! copy msdos\mainmake makefile >nul
  rem   ----------------------------------------------------------------------
  :end
  set X11=
  set nodebug=
--- 195,217 ----
  rem   ----------------------------------------------------------------------
  Echo Configuring the main directory...
! If "%DJGPP_VER%" == "1" goto mainv1
! Echo Looking for the GDB init file...
! If Exist src\_gdbinit goto gdbinitOk
! Echo ERROR:
! Echo I cannot find the GDB init file.  It was called ".gdbinit" in
! Echo the Emacs distribution, but was probably renamed to some other
! Echo name without the leading dot when you untarred the archive.
! Echo It should be in the "src/" subdirectory.  Please make sure this
! Echo file exists and is called "_gdbinit" with a leading underscore.
! Echo Then run CONFIG.BAT again with the same arguments you did now.
! goto End
! :gdbinitOk
! Echo Looking for the GDB init file...found
! copy msdos\mainmake.v2 makefile >nul
! :mainv1
! If "%DJGPP_VER%" == "1" copy msdos\mainmake makefile >nul
  rem   ----------------------------------------------------------------------
  :end
  set X11=
  set nodebug=
+ set djgpp_ver=
diff -2rcpP --exclude=*.elc emacs-19.30/config.guess emacs-19.31/config.guess
*** emacs-19.30/config.guess	Sat Nov 25 01:01:25 1995
--- emacs-19.31/config.guess	Sat May 25 20:17:34 1996
***************
*** 1,5 ****
  #! /bin/sh
  # Attempt to guess a canonical system name.
! #   Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
  #
  # This file is free software; you can redistribute it and/or modify it
--- 1,5 ----
  #! /bin/sh
  # Attempt to guess a canonical system name.
! #   Copyright (C) 1992, 93, 94, 95, 1996 Free Software Foundation, Inc.
  #
  # This file is free software; you can redistribute it and/or modify it
*************** trap 'rm -f dummy.c dummy.o dummy; exit 
*** 52,66 ****
  
  case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
-     alpha:OSF1:V*:*)
- 	# After 1.2, OSF1 uses "V1.3" for uname -r.
- 	echo alpha-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^V//'`
- 	exit 0 ;;
      alpha:OSF1:*:*)
  	# 1.2 uses "1.2" for uname -r.
! 	echo alpha-dec-osf${UNAME_RELEASE}
!         exit 0 ;;
      21064:Windows_NT:50:3)
  	echo alpha-dec-winnt3.5
  	exit 0 ;;
      amiga:NetBSD:*:*)
        echo m68k-cbm-netbsd${UNAME_RELEASE}
--- 52,68 ----
  
  case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
      alpha:OSF1:*:*)
+ 	# A Vn.n version is a released version.
+ 	# A Tn.n version is a released field test version.
+ 	# A Xn.n version is an unreleased experimental baselevel.
  	# 1.2 uses "1.2" for uname -r.
! 	echo alpha-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//'`
! 	exit 0 ;;
      21064:Windows_NT:50:3)
  	echo alpha-dec-winnt3.5
  	exit 0 ;;
+     Amiga*:UNIX_System_V:4.0:*)
+ 	echo m68k-cbm-sysv4
+ 	exit 0;;
      amiga:NetBSD:*:*)
        echo m68k-cbm-netbsd${UNAME_RELEASE}
*************** case "${UNAME_MACHINE}:${UNAME_SYSTEM}:$
*** 121,124 ****
--- 123,129 ----
  	echo mips-mips-riscos${UNAME_RELEASE}
  	exit 0 ;;
+     Night_Hawk:Power_UNIX:*:*)
+ 	echo powerpc-harris-powerunix
+ 	exit 0 ;;
      m88k:CX/UX:7*:*)
  	echo m88k-harris-cxux7
*************** case "${UNAME_MACHINE}:${UNAME_SYSTEM}:$
*** 131,134 ****
--- 136,142 ----
  	exit 0 ;;
      AViiON:dgux:*:*)
+         # DG/UX returns AViiON for all architectures
+         UNAME_PROCESSOR=`/usr/bin/uname -p`
+         if [ $UNAME_PROCESSOR = mc88100 -o $UNAME_PROCESSOR = mc88100 ] ; then
  	if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx \
  	     -o ${TARGET_BINARY_INTERFACE}x = x ] ; then
*************** case "${UNAME_MACHINE}:${UNAME_SYSTEM}:$
*** 137,140 ****
--- 145,150 ----
  		echo m88k-dg-dguxbcs${UNAME_RELEASE}
  	fi
+         else echo i586-dg-dgux${UNAME_RELEASE}
+         fi
   	exit 0 ;;
      M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
*************** EOF
*** 220,224 ****
  	    9000/31? )            HP_ARCH=m68000 ;;
  	    9000/[34]?? )         HP_ARCH=m68k ;;
! 	    9000/7?? | 9000/8?[79] ) HP_ARCH=hppa1.1 ;;
  	    9000/8?? )            HP_ARCH=hppa1.0 ;;
  	esac
--- 230,234 ----
  	    9000/31? )            HP_ARCH=m68000 ;;
  	    9000/[34]?? )         HP_ARCH=m68k ;;
! 	    9000/7?? | 9000/8?[679] ) HP_ARCH=hppa1.1 ;;
  	    9000/8?? )            HP_ARCH=hppa1.0 ;;
  	esac
*************** EOF
*** 313,316 ****
--- 323,335 ----
  	echo ${UNAME_MACHINE}-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
  	exit 0 ;;
+     i*:CYGWIN*:*)
+ 	echo i386-unknown-cygwin32
+ 	exit 0 ;;
+     p*:CYGWIN*:*)
+ 	echo powerpcle-unknown-cygwin32
+ 	exit 0 ;;
+     prep*:SunOS:5.*:*)
+ 	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ 	exit 0 ;;
      *:GNU:*:*)
  	echo `echo ${UNAME_MACHINE}|sed -e 's,/.*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
*************** EOF
*** 320,336 ****
  	# first see if it will tell us.
  	ld_help_string=`ld --help 2>&1`
! 	if echo $ld_help_string | grep >/dev/null 2>&1 "supported emulations: elf_i[345]86"; then
! 	  echo "${UNAME_MACHINE}-unknown-linux" ; exit 0
! 	elif echo $ld_help_string | grep >/dev/null 2>&1 "supported emulations: i[345]86linux"; then
! 	  echo "${UNAME_MACHINE}-unknown-linuxaout" ; exit 0
! 	elif echo $ld_help_string | grep >/dev/null 2>&1 "supported emulations: i[345]86coff"; then
! 	  echo "${UNAME_MACHINE}-unknown-linuxcoff" ; exit 0
  	elif test "${UNAME_MACHINE}" = "alpha" ; then
! 	  echo alpha-unknown-linux ; exit 0
  	else
! 	  # Either a pre-BFD a.out linker (linuxoldld) or one that does not give us
! 	  # useful --help.  Gcc wants to distinguish between linuxoldld and linuxaout.
  	  test ! -d /usr/lib/ldscripts/. \
! 	    && echo "${UNAME_MACHINE}-unknown-linuxoldld" && exit 0
  	  # Determine whether the default compiler is a.out or elf
  	  cat >dummy.c <<EOF
--- 339,361 ----
  	# first see if it will tell us.
  	ld_help_string=`ld --help 2>&1`
! 	if echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: elf_i[345]86"; then
! 	  echo "${UNAME_MACHINE}-unknown-lignux" ; exit 0
! 	elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: i[345]86linux"; then
! 	  echo "${UNAME_MACHINE}-unknown-lignuxaout" ; exit 0
! 	elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: i[345]86coff"; then
! 	  echo "${UNAME_MACHINE}-unknown-lignuxcoff" ; exit 0
! 	elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: m68kelf"; then
! 	  echo "${UNAME_MACHINE}-unknown-lignux" ; exit 0
! 	elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: m68klinux"; then
! 	  echo "${UNAME_MACHINE}-unknown-lignuxaout" ; exit 0
  	elif test "${UNAME_MACHINE}" = "alpha" ; then
! 	  echo alpha-unknown-lignux ; exit 0
! 	elif test "${UNAME_MACHINE}" = "sparc" ; then
! 	  echo sparc-unknown-lignux ; exit 0
  	else
! 	  # Either a pre-BFD a.out linker (lignuxoldld) or one that does not give us
! 	  # useful --help.  Gcc wants to distinguish between lignuxoldld and lignuxaout.
  	  test ! -d /usr/lib/ldscripts/. \
! 	    && echo "${UNAME_MACHINE}-unknown-lignuxoldld" && exit 0
  	  # Determine whether the default compiler is a.out or elf
  	  cat >dummy.c <<EOF
*************** char *argv[];
*** 340,346 ****
  {
  #ifdef __ELF__
!   printf ("%s-unknown-linux\n", argv[1]);
  #else
!   printf ("%s-unknown-linuxaout\n", argv[1]);
  #endif
    return 0;
--- 365,371 ----
  {
  #ifdef __ELF__
!   printf ("%s-unknown-lignux\n", argv[1]);
  #else
!   printf ("%s-unknown-lignuxaout\n", argv[1]);
  #endif
    return 0;
*************** EOF
*** 369,372 ****
--- 394,399 ----
  		UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
  		(/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
+ 		(/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
+ 			&& UNAME_MACHINE=i586
  		echo ${UNAME_MACHINE}-unknown-sco$UNAME_REL
  	else
*************** EOF
*** 425,428 ****
--- 452,465 ----
  	fi
  	exit 0 ;;
+     mc68*:A/UX:*:*)
+ 	echo m68k-apple-aux${UNAME_RELEASE}
+ 	exit 0 ;;
+     R3000:*System_V*:*:*)
+ 	if [ -d /usr/nec ]; then
+ 	        echo mips-nec-sysv${UNAME_RELEASE}
+ 	else
+ 	        echo mips-unknown-sysv${UNAME_RELEASE}
+ 	fi
+         exit 0 ;;
  esac
  
diff -2rcpP --exclude=*.elc emacs-19.30/config.sub emacs-19.31/config.sub
*** emacs-19.30/config.sub	Sat Nov 25 01:01:25 1995
--- emacs-19.31/config.sub	Sat May 25 20:17:33 1996
***************
*** 1,8 ****
  #! /bin/sh
  # Configuration validation subroutine script, version 1.1.
! #   Copyright (C) 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
  # This file is (in principle) common to ALL GNU software.
  # The presence of a machine in this file suggests that SOME GNU software
! # can handle that machine.  It does not imply ALL GNU software can. 
  #
  # This file is free software; you can redistribute it and/or modify
--- 1,8 ----
  #! /bin/sh
  # Configuration validation subroutine script, version 1.1.
! #   Copyright (C) 1991, 92, 93, 94, 95, 1996 Free Software Foundation, Inc.
  # This file is (in principle) common to ALL GNU software.
  # The presence of a machine in this file suggests that SOME GNU software
! # can handle that machine.  It does not imply ALL GNU software can.
  #
  # This file is free software; you can redistribute it and/or modify
***************
*** 18,22 ****
  # You should have received a copy of the GNU General Public License
  # along with this program; if not, write to the Free Software
! # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  
  # As a special exception to the GNU General Public License, if you
--- 18,23 ----
  # You should have received a copy of the GNU General Public License
  # along with this program; if not, write to the Free Software
! # Foundation, Inc., 59 Temple Place - Suite 330,
! # Boston, MA 02111-1307, USA.
  
  # As a special exception to the GNU General Public License, if you
*************** case $os in
*** 81,85 ****
  	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
  	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
! 	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp )
  		os=
  		basic_machine=$1
--- 82,87 ----
  	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
  	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
! 	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
! 	-apple)
  		os=
  		basic_machine=$1
*************** case $os in
*** 88,91 ****
--- 90,97 ----
  		os=-hiuxwe2
  		;;
+ 	-sco5)
+ 		os=sco3.2v5
+ 		basic_machine=`echo $1 | sed -e 's/86-.*/86-unknown/'`
+ 		;;
  	-sco4)
  		os=-sco3.2v4
*************** case $os in
*** 123,126 ****
--- 129,135 ----
  		os=`echo $os | sed -e 's/windowsnt/winnt/'`
  		;;
+ 	-psos*)
+ 		os=-psos
+ 		;;
  esac
  
*************** case $basic_machine in
*** 129,138 ****
  	# Recognize the basic CPU types without company name.
  	# Some are omitted here because they have special meanings below.
! 	tahoe | i[345]86 | i860 | m68k | m68000 | m88k | ns32k | arm | pyramid \
  		| tron | a29k | 580 | i960 | h8300 | hppa1.0 | hppa1.1 \
! 		| alpha | we32k | ns16k | clipper | sparclite | i370 | sh \
! 		| powerpc | sparc64 | 1750a | dsp16xx | mips64 | mipsel \
  		| pdp11 | mips64el | mips64orion | mips64orionel \
! 		| sparc)
  		basic_machine=$basic_machine-unknown
  		;;
--- 138,148 ----
  	# Recognize the basic CPU types without company name.
  	# Some are omitted here because they have special meanings below.
! 	tahoe | i[3456]86 | i860 | m68k | m68000 | m88k | ns32k | arm \
! 		| arme[lb] | pyramid \
  		| tron | a29k | 580 | i960 | h8300 | hppa1.0 | hppa1.1 \
! 		| alpha | we32k | ns16k | clipper | i370 | sh \
! 		| powerpc | powerpcle | 1750a | dsp16xx | mips64 | mipsel \
  		| pdp11 | mips64el | mips64orion | mips64orionel \
! 		| sparc | sparclet | sparclite | sparc64)
  		basic_machine=$basic_machine-unknown
  		;;
*************** case $basic_machine in
*** 143,153 ****
  		;;
  	# Recognize the basic CPU types with company name.
! 	vax-* | tahoe-* | i[345]86-* | i860-* | m68k-* | m68000-* | m88k-* \
  	      | sparc-* | ns32k-* | fx80-* | arm-* | c[123]* \
! 	      | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \
  	      | none-* | 580-* | cray2-* | h8300-* | i960-* | xmp-* | ymp-* \
  	      | hppa1.0-* | hppa1.1-* | alpha-* | we32k-* | cydra-* | ns16k-* \
  	      | pn-* | np1-* | xps100-* | clipper-* | orion-* | sparclite-* \
! 	      | pdp11-* | sh-* | powerpc-* | sparc64-* | mips64-* | mipsel-* \
  	      | mips64el-* | mips64orion-* | mips64orionel-*)
  		;;
--- 153,163 ----
  		;;
  	# Recognize the basic CPU types with company name.
! 	vax-* | tahoe-* | i[3456]86-* | i860-* | m68k-* | m68000-* | m88k-* \
  	      | sparc-* | ns32k-* | fx80-* | arm-* | c[123]* \
! 	      | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* | power-* \
  	      | none-* | 580-* | cray2-* | h8300-* | i960-* | xmp-* | ymp-* \
  	      | hppa1.0-* | hppa1.1-* | alpha-* | we32k-* | cydra-* | ns16k-* \
  	      | pn-* | np1-* | xps100-* | clipper-* | orion-* | sparclite-* \
! 	      | pdp11-* | sh-* | powerpc-* | powerpcle-* | sparc64-* | mips64-* | mipsel-* \
  	      | mips64el-* | mips64orion-* | mips64orionel-*)
  		;;
*************** case $basic_machine in
*** 189,192 ****
--- 199,210 ----
  		os=-sysv
  		;;
+ 	aux)
+ 		basic_machine=m68k-apple
+ 		os=-aux
+ 		;;
+ 	aux)
+ 		basic_machine=m68k-apple
+ 		os=-aux
+ 		;;
  	balance)
  		basic_machine=ns32k-sequent
*************** case $basic_machine in
*** 221,224 ****
--- 239,246 ----
  		os=-unicos
  		;;
+ 	[ctj]90-cray)
+ 		basic_machine=c90-cray
+ 		os=-unicos
+ 		;;
  	crds | unos)
  		basic_machine=m68k-crds
*************** case $basic_machine in
*** 307,323 ****
  		;;
  # I'm not sure what "Sysv32" means.  Should this be sysv3.2?
! 	i[345]86v32)
  		basic_machine=`echo $1 | sed -e 's/86.*/86-unknown/'`
  		os=-sysv32
  		;;
! 	i[345]86v4*)
  		basic_machine=`echo $1 | sed -e 's/86.*/86-unknown/'`
  		os=-sysv4
  		;;
! 	i[345]86v)
  		basic_machine=`echo $1 | sed -e 's/86.*/86-unknown/'`
  		os=-sysv
  		;;
! 	i[345]86sol2)
  		basic_machine=`echo $1 | sed -e 's/86.*/86-unknown/'`
  		os=-solaris2
--- 329,345 ----
  		;;
  # I'm not sure what "Sysv32" means.  Should this be sysv3.2?
! 	i[3456]86v32)
  		basic_machine=`echo $1 | sed -e 's/86.*/86-unknown/'`
  		os=-sysv32
  		;;
! 	i[3456]86v4*)
  		basic_machine=`echo $1 | sed -e 's/86.*/86-unknown/'`
  		os=-sysv4
  		;;
! 	i[3456]86v)
  		basic_machine=`echo $1 | sed -e 's/86.*/86-unknown/'`
  		os=-sysv
  		;;
! 	i[3456]86sol2)
  		basic_machine=`echo $1 | sed -e 's/86.*/86-unknown/'`
  		os=-solaris2
*************** case $basic_machine in
*** 418,429 ****
  		basic_machine=ns32k-pc532
  		;;
! 	pentium-*)
! 		# We will change tis to say i586 once there has been
! 		# time for various packages to start to recognize that.
! 		basic_machine=i486-`echo $basic_machine | sed 's/^[^-]*-//'`
  		;;
  	pn)
  		basic_machine=pn-gould
  		;;
  	ps2)
  		basic_machine=i386-ibm
--- 440,478 ----
  		basic_machine=ns32k-pc532
  		;;
! 	pentium | p5)
! 		basic_machine=i586-intel
! 		;;
! 	pentiumpro | p6)
! 		basic_machine=i686-intel
! 		;;
! 	pentium-* | p5-*)
! 		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
! 		;;
! 	pentiumpro-* | p6-*)
! 		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
! 		;;
! 	k5)
! 		# We don't have specific support for AMD's K5 yet, so just call it a Pentium
! 		basic_machine=i586-amd
! 		;;
! 	nexen)
! 		# We don't have specific support for Nexgen yet, so just call it a Pentium
! 		basic_machine=i586-nexgen
  		;;
  	pn)
  		basic_machine=pn-gould
  		;;
+ 	power)	basic_machine=rs6000-ibm
+ 		;;
+ 	ppc)	basic_machine=powerpc-unknown
+ 	        ;;
+ 	ppc-*)	basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+ 		;;
+ 	ppcle | powerpclittle | ppc-le | powerpc-little)
+ 		basic_machine=powerpcle-unknown
+ 	        ;;
+ 	ppcle-* | powerpclittle-*)
+ 		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+ 		;;
  	ps2)
  		basic_machine=i386-ibm
*************** case $basic_machine in
*** 520,523 ****
--- 569,576 ----
  		os=-vxworks
  		;;
+ 	vxworks29k)
+ 		basic_machine=a29k-wrs
+ 		os=-vxworks
+ 		;;
  	xmp)
  		basic_machine=xmp-cray
*************** case $os in
*** 598,616 ****
  		;;
  	-gnu/linux*)
! 		os=`echo $os | sed -e 's|gnu/linux|linux|'`
  		;;
  	# First accept the basic system types.
  	# The portable systems comes first.
! 	# Each alternative must end in a *, to match a version number.
  	# -sysv* is not here because it comes later, after sysvr4.
  	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
! 	      | -vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[345]* \
  	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
! 	      | -amigados* | -msdos* | -newsos* | -unicos* | -aos* \
  	      | -nindy* | -vxworks* | -ebmon* | -hms* | -mvs* | -clix* \
! 	      | -riscos* | -linux* | -uniplus* | -iris* | -rtu* | -xenix* \
  	      | -hiux* | -386bsd* | -netbsd* | -freebsd* | -riscix* \
  	      | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* \
! 	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta | -udi | -eabi)
  		;;
  	-sunos5*)
--- 651,675 ----
  		;;
  	-gnu/linux*)
! 		os=`echo $os | sed -e 's|gnu/linux|lignux|'`
! 		;;
! 	-linux*)
! 		os=`echo $os | sed -e 's|linux|lignux|'`
  		;;
  	# First accept the basic system types.
  	# The portable systems comes first.
! 	# Each alternative MUST END IN A *, to match a version number.
  	# -sysv* is not here because it comes later, after sysvr4.
  	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
! 	      | -vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]* \
  	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
! 	      | -amigados* | -msdos* | -newsos* | -unicos* | -aof* | -aos* \
  	      | -nindy* | -vxworks* | -ebmon* | -hms* | -mvs* | -clix* \
! 	      | -riscos* | -lignux* | -uniplus* | -iris* | -rtu* | -xenix* \
  	      | -hiux* | -386bsd* | -netbsd* | -freebsd* | -riscix* \
  	      | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* \
! 	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
! 	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
! 	      | -cygwin32* | -pe* | -psos* | -moss* )
! 	# Remember, each alternative MUST END IN *, to match a version number.
  		;;
  	-sunos5*)
*************** case $os in
*** 638,641 ****
--- 697,703 ----
  		os=-sysv
  		;;
+ 	-ns2 )
+ 	        os=-nextstep2
+ 		;;
  	# Preserve the version number of sinix5.
  	-sinix5.*)
*************** case $basic_machine in
*** 691,694 ****
--- 753,759 ----
  		os=-riscix1.2
  		;;
+ 	arm*-semi)
+ 		os=-aout
+ 		;;
          pdp11-*)
  		os=-none
*************** case $basic_machine in
*** 742,745 ****
--- 807,813 ----
  		os=-luna
  		;;
+ 	*-next )
+ 		os=-nextstep
+ 		;;
  	*-sequent)
  		os=-ptx
*************** case $basic_machine in
*** 826,829 ****
--- 894,902 ----
  				vendor=wrs
  				;;
+ 			-aux*)
+ 				vendor=apple
+ 				;;
+ 			-aux*)
+ 				vendor=apple
  		esac
  		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
diff -2rcpP --exclude=*.elc emacs-19.30/configure emacs-19.31/configure
*** emacs-19.30/configure	Mon Nov 20 01:42:18 1995
--- emacs-19.31/configure	Sat May 25 11:59:44 1996
***************
*** 2,7 ****
  
  # Guess values for system-dependent variables and create Makefiles.
! # Generated automatically using autoconf version 2.5 
! # Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc.
  #
  # This configure script is free software; the Free Software Foundation
--- 2,7 ----
  
  # Guess values for system-dependent variables and create Makefiles.
! # Generated automatically using autoconf version 2.10 
! # Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
  #
  # This configure script is free software; the Free Software Foundation
*************** Directory and file names:
*** 161,167 ****
    --sbindir=DIR           system admin executables in DIR [EPREFIX/sbin]
    --libexecdir=DIR        program executables in DIR [EPREFIX/libexec]
!   --datadir=DIR           read-only architecture-independent data in DIR [PREFIX/share]
    --sysconfdir=DIR        read-only single-machine data in DIR [PREFIX/etc]
!   --sharedstatedir=DIR    modifiable architecture-independent data in DIR [PREFIX/com]
    --localstatedir=DIR     modifiable single-machine data in DIR [PREFIX/var]
    --libdir=DIR            object code libraries in DIR [EPREFIX/lib]
--- 161,169 ----
    --sbindir=DIR           system admin executables in DIR [EPREFIX/sbin]
    --libexecdir=DIR        program executables in DIR [EPREFIX/libexec]
!   --datadir=DIR           read-only architecture-independent data in DIR
!                           [PREFIX/share]
    --sysconfdir=DIR        read-only single-machine data in DIR [PREFIX/etc]
!   --sharedstatedir=DIR    modifiable architecture-independent data in DIR
!                           [PREFIX/com]
    --localstatedir=DIR     modifiable single-machine data in DIR [PREFIX/var]
    --libdir=DIR            object code libraries in DIR [EPREFIX/lib]
*************** Directory and file names:
*** 173,177 ****
    --program-prefix=PREFIX prepend PREFIX to installed program names
    --program-suffix=SUFFIX append SUFFIX to installed program names
!   --program-transform-name=PROGRAM run sed PROGRAM on installed program names
  EOF
      cat << EOF
--- 175,180 ----
    --program-prefix=PREFIX prepend PREFIX to installed program names
    --program-suffix=SUFFIX append SUFFIX to installed program names
!   --program-transform-name=PROGRAM
!                           run sed PROGRAM on installed program names
  EOF
      cat << EOF
*************** Features and packages:
*** 187,192 ****
    --x-includes=DIR        X include files are in DIR
    --x-libraries=DIR       X library files are in DIR
- --enable and --with options recognized:$ac_help
  EOF
      exit 0 ;;
  
--- 190,197 ----
    --x-includes=DIR        X include files are in DIR
    --x-libraries=DIR       X library files are in DIR
  EOF
+     if test -n "$ac_help"; then
+       echo "--enable and --with options recognized:$ac_help"
+     fi
      exit 0 ;;
  
*************** EOF
*** 338,342 ****
  
    -version | --version | --versio | --versi | --vers)
!     echo "configure generated by autoconf version 2.5"
      exit 0 ;;
  
--- 343,347 ----
  
    -version | --version | --versio | --versi | --vers)
!     echo "configure generated by autoconf version 2.10"
      exit 0 ;;
  
*************** fi
*** 503,512 ****
  ac_ext=c
  # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
! ac_cpp='echo $CPP $CPPFLAGS 1>&5;
! $CPP $CPPFLAGS'
! ac_compile='echo ${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5;
! ${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5 2>&5'
! ac_link='echo ${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5;
! ${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5 2>&5'
  
  if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
--- 508,514 ----
  ac_ext=c
  # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
! ac_cpp='$CPP $CPPFLAGS'
! ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
! ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
  
  if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
*************** fi
*** 526,530 ****
  
  lispdir='${datadir}/emacs/${version}/lisp'
! locallisppath='${datadir}/emacs/site-lisp'
  lisppath='${locallisppath}:${lispdir}'
  etcdir='${datadir}/emacs/${version}/etc'
--- 528,533 ----
  
  lispdir='${datadir}/emacs/${version}/lisp'
! locallisppath='${datadir}/emacs/${version}/site-lisp:'\
! '${datadir}/emacs/site-lisp'
  lisppath='${locallisppath}:${lispdir}'
  etcdir='${datadir}/emacs/${version}/etc'
*************** case "${canonical}" in
*** 746,751 ****
    ;;
  
!   alpha-*-linux* )
!     machine=alpha opsys=linux
    ;;
  
--- 749,754 ----
    ;;
  
!   alpha-*-linux* | alpha-*-lignux* )
!     machine=alpha opsys=lignux
    ;;
  
*************** case "${canonical}" in
*** 754,758 ****
      machine=altos opsys=usg5-2
    ;;
!     
    ## Amdahl UTS
    580-amdahl-sysv* )
--- 757,761 ----
      machine=altos opsys=usg5-2
    ;;
! 
    ## Amdahl UTS
    580-amdahl-sysv* )
*************** case "${canonical}" in
*** 812,816 ****
    *-convex-bsd* | *-convex-convexos* )
      machine=convex opsys=bsd4-3
!     ## Prevents suprious white space in makefiles - d.m.cooke@larc.nasa.gov
      NON_GNU_CPP="cc -E -P"
    ;;
--- 815,819 ----
    *-convex-bsd* | *-convex-convexos* )
      machine=convex opsys=bsd4-3
!     ## Prevents spurious white space in makefiles - d.m.cooke@larc.nasa.gov
      NON_GNU_CPP="cc -E -P"
    ;;
*************** case "${canonical}" in
*** 862,866 ****
        then CC="gnucc -m68040"
        else CC="gnucc -m68881"
!       fi 
      else
        if test -z "`type gcc | grep 'not found'`"
--- 865,869 ----
        then CC="gnucc -m68040"
        else CC="gnucc -m68881"
!       fi
      else
        if test -z "`type gcc | grep 'not found'`"
*************** case "${canonical}" in
*** 920,923 ****
--- 923,927 ----
         [7].[0-9] ) machine=nh4000 opsys=cxux7 ;;
      esac
+     NON_GNU_CPP="/lib/cpp"
    ;;
    ## Harris ecx or gcx running CX/UX (Series 1200, Series 3000)
*************** case "${canonical}" in
*** 925,928 ****
--- 929,937 ----
      machine=nh3000 opsys=cxux
    ;;
+   ## Harris power pc NightHawk running Power UNIX (Series 6000)
+   powerpc-harris-powerunix )
+     machine=nh6000 opsys=powerunix
+     NON_GNU_CPP="cc -Xo -E -P"
+   ;;
  
    ## Honeywell XPS100
*************** case "${canonical}" in
*** 977,980 ****
--- 986,992 ----
      esac
    ;;
+   hppa-*-nextstep* )
+     machine=hp800 opsys=nextstep
+   ;;
  
    ## Orion machines
*************** case "${canonical}" in
*** 1013,1017 ****
    romp-ibm-bsd4.3* )
      machine=ibmrt opsys=bsd4-3
!   ;;	
    romp-ibm-bsd4.2* )
      machine=ibmrt opsys=bsd4-2
--- 1025,1029 ----
    romp-ibm-bsd4.3* )
      machine=ibmrt opsys=bsd4-3
!   ;;
    romp-ibm-bsd4.2* )
      machine=ibmrt opsys=bsd4-2
*************** case "${canonical}" in
*** 1019,1023 ****
    romp-ibm-aos4.3* )
      machine=ibmrt opsys=bsd4-3
!   ;;	
    romp-ibm-aos4.2* )
      machine=ibmrt opsys=bsd4-2
--- 1031,1035 ----
    romp-ibm-aos4.3* )
      machine=ibmrt opsys=bsd4-3
!   ;;
    romp-ibm-aos4.2* )
      machine=ibmrt opsys=bsd4-2
*************** case "${canonical}" in
*** 1172,1176 ****
  
    ## Siemens Nixdorf
!   mips-siemens-sysv* )
      machine=mips-siemens opsys=usg5-4
      NON_GNU_CC=/usr/ccs/bin/cc
--- 1184,1188 ----
  
    ## Siemens Nixdorf
!   mips-siemens-sysv* | mips-sni-sysv*)
      machine=mips-siemens opsys=usg5-4
      NON_GNU_CC=/usr/ccs/bin/cc
*************** case "${canonical}" in
*** 1194,1198 ****
    ;;
    mips-sgi-irix6* )
!     machine=iris4d opsys=irix6-0
    ;;
    mips-sgi-irix5.[01]* )
--- 1206,1210 ----
    ;;
    mips-sgi-irix6* )
!     machine=iris4d opsys=irix6-0  NON_GNU_CPP=/lib/cpp
    ;;
    mips-sgi-irix5.[01]* )
*************** case "${canonical}" in
*** 1226,1229 ****
--- 1238,1245 ----
  
    ## Suns
+   sparc-*-linux* | sparc-*-lignux* )
+     machine=sparc opsys=lignux
+   ;;
+ 
    *-sun-sunos* | *-sun-bsd* | *-sun-solaris* \
      | i[345]86-*-solaris2* | i[345]86-*-sunos5* | powerpc*-*-solaris2* \
*************** case "${canonical}" in
*** 1247,1251 ****
  		NON_GNU_CPP=/usr/lib/cpp
  		;;
!       *-sunos4* | *-sunos ) opsys=sunos4-1
  		NON_GCC_TEST_OPTIONS=-Bstatic
  		GCC_TEST_OPTIONS=-static
--- 1263,1274 ----
  		NON_GNU_CPP=/usr/lib/cpp
  		;;
!       *-sunos4.1.[3-9]*-noshare )
! 		opsys=sunos4-1-3
! 		NON_GNU_CPP=/usr/lib/cpp
! 		NON_GCC_TEST_OPTIONS=-Bstatic
! 		GCC_TEST_OPTIONS=-static
! 		;;
!       *-sunos4* | *-sunos )
! 		opsys=sunos4-1
  		NON_GCC_TEST_OPTIONS=-Bstatic
  		GCC_TEST_OPTIONS=-static
*************** case "${canonical}" in
*** 1266,1274 ****
  		;;
        *-sunos5* | *-solaris* )
! 		opsys=sol2
  		NON_GNU_CPP=/usr/ccs/lib/cpp
  		;;
        *			  ) opsys=bsd4-2   ;;
      esac
    ;;
    sparc-*-nextstep* )
--- 1289,1308 ----
  		;;
        *-sunos5* | *-solaris* )
! 		opsys=sol2-4
  		NON_GNU_CPP=/usr/ccs/lib/cpp
  		;;
        *			  ) opsys=bsd4-2   ;;
      esac
+     ## Watch out for a compiler that we know will not work.
+     case "${canonical}" in
+      *-solaris* | *-sunos5* )
+ 		if [ "x$CC" = x/usr/ucb/cc ]; then
+ 		  ## /usr/ucb/cc doesn't work;
+ 		  ## we should find some other compiler that does work.
+ 		  unset CC
+ 		fi
+ 		;;
+       *) ;;
+     esac
    ;;
    sparc-*-nextstep* )
*************** case "${canonical}" in
*** 1314,1318 ****
      machine=titan opsys=usg5-3
    ;;
!   
    ## Ustation E30 (SS5E)
    m68*-unisys-uniplus* )
--- 1348,1352 ----
      machine=titan opsys=usg5-3
    ;;
! 
    ## Ustation E30 (SS5E)
    m68*-unisys-uniplus* )
*************** case "${canonical}" in
*** 1361,1365 ****
        *-esix* )			opsys=esix ;;
        *-xenix* )		opsys=xenix ;;
!       *-linux* )		opsys=linux ;;
        *-sco3.2v4* )		opsys=sco4 ; NON_GNU_CPP=/lib/cpp  ;;
        *-bsd386* | *-bsdi1* )	opsys=bsd386 ;;
--- 1395,1399 ----
        *-esix* )			opsys=esix ;;
        *-xenix* )		opsys=xenix ;;
!       *-linux* | *-lignux* )	opsys=lignux ;;
        *-sco3.2v4* )		opsys=sco4 ; NON_GNU_CPP=/lib/cpp  ;;
        *-bsd386* | *-bsdi1* )	opsys=bsd386 ;;
*************** case "${canonical}" in
*** 1372,1378 ****
    ;;
  
!   ## Linux/68k
!   m68k-*-linux* )
!     machine=m68k opsys=linux
    ;;
  
--- 1406,1412 ----
    ;;
  
!   ## Lignux/68k
!   m68k-*-linux* | m68k-*-lignux* )
!     machine=m68k opsys=lignux
    ;;
  
*************** if test x"${opsys}" = x; then
*** 1403,1407 ****
      *-sysv4.[2-9]* | *-sysvr4.[2-9]* )
  	if [ x$NON_GNU_CPP = x ]; then
! 	  NON_GNU_CPP=/usr/ccs/lib/cpp
  	fi
  	opsys=usg5-4-2 ;;
--- 1437,1445 ----
      *-sysv4.[2-9]* | *-sysvr4.[2-9]* )
  	if [ x$NON_GNU_CPP = x ]; then
! 	  if [ -f /usr/ccs/lib/cpp ]; then
! 	    NON_GNU_CPP=/usr/ccs/lib/cpp
! 	  else
! 	    NON_GNU_CPP=/lib/cpp
! 	  fi
  	fi
  	opsys=usg5-4-2 ;;
*************** else
*** 1454,1458 ****
    done
    IFS="$ac_save_ifs"
-   test -z "$ac_cv_prog_CC" && ac_cv_prog_CC="cc"
  fi
  fi
--- 1492,1495 ----
*************** else
*** 1464,1467 ****
--- 1501,1553 ----
  fi
  
+ if test -z "$CC"; then
+   # Extract the first word of "cc", so it can be a program name with args.
+ set dummy cc; ac_word=$2
+ echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+ if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+   if test -n "$CC"; then
+   ac_cv_prog_CC="$CC" # Let the user override the test.
+ else
+   IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+   ac_prog_rejected=no
+   for ac_dir in $PATH; do
+     test -z "$ac_dir" && ac_dir=.
+     if test -f $ac_dir/$ac_word; then
+       if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
+         ac_prog_rejected=yes
+ 	continue
+       fi
+       ac_cv_prog_CC="cc"
+       break
+     fi
+   done
+   IFS="$ac_save_ifs"
+ if test $ac_prog_rejected = yes; then
+   # We found a bogon in the path, so make sure we never use it.
+   set dummy $ac_cv_prog_CC
+   shift
+   if test $# -gt 0; then
+     # We chose a different compiler from the bogus one.
+     # However, it has the same basename, so the bogon will be chosen
+     # first if we set CC to just the basename; use the full file name.
+     shift
+     set dummy "$ac_dir/$ac_word" "$@"
+     shift
+     ac_cv_prog_CC="$@"
+   fi
+ fi
+ fi
+ fi
+ CC="$ac_cv_prog_CC"
+ if test -n "$CC"; then
+   echo "$ac_t""$CC" 1>&6
+ else
+   echo "$ac_t""no" 1>&6
+ fi
+ 
+   test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
+ fi
  
  echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
*************** else
*** 1474,1478 ****
  #endif
  EOF
! if ${CC-cc} -E conftest.c 2>&5 | egrep yes >/dev/null 2>&1; then
    ac_cv_prog_gcc=yes
  else
--- 1560,1564 ----
  #endif
  EOF
! if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1563: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
    ac_cv_prog_gcc=yes
  else
*************** if test x$GCC = xyes && test "x$GCC_TEST
*** 1538,1547 ****
  then
    CC="$CC $GCC_TEST_OPTIONS"
! fi  
  
  if test x$GCC = x && test "x$NON_GCC_TEST_OPTIONS" != x
  then
    CC="$CC $NON_GCC_TEST_OPTIONS"
! fi  
  
  #### Some other nice autoconf tests.  If you add a test here which
--- 1624,1633 ----
  then
    CC="$CC $GCC_TEST_OPTIONS"
! fi
  
  if test x$GCC = x && test "x$NON_GCC_TEST_OPTIONS" != x
  then
    CC="$CC $NON_GCC_TEST_OPTIONS"
! fi
  
  #### Some other nice autoconf tests.  If you add a test here which
*************** else
*** 1584,1593 ****
    # not just through cpp.
    cat > conftest.$ac_ext <<EOF
! #line 1587 "configure"
  #include "confdefs.h"
  #include <assert.h>
  Syntax Error
  EOF
! eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
  ac_err=`grep -v '^ *+' conftest.out`
  if test -z "$ac_err"; then
--- 1670,1680 ----
    # not just through cpp.
    cat > conftest.$ac_ext <<EOF
! #line 1673 "configure"
  #include "confdefs.h"
  #include <assert.h>
  Syntax Error
  EOF
! ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:1679: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  ac_err=`grep -v '^ *+' conftest.out`
  if test -z "$ac_err"; then
*************** else
*** 1598,1607 ****
    CPP="${CC-cc} -E -traditional-cpp"
    cat > conftest.$ac_ext <<EOF
! #line 1601 "configure"
  #include "confdefs.h"
  #include <assert.h>
  Syntax Error
  EOF
! eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
  ac_err=`grep -v '^ *+' conftest.out`
  if test -z "$ac_err"; then
--- 1685,1695 ----
    CPP="${CC-cc} -E -traditional-cpp"
    cat > conftest.$ac_ext <<EOF
! #line 1688 "configure"
  #include "confdefs.h"
  #include <assert.h>
  Syntax Error
  EOF
! ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:1694: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  ac_err=`grep -v '^ *+' conftest.out`
  if test -z "$ac_err"; then
*************** test -n "$YACC" || YACC="yacc"
*** 1718,1722 ****
  echo $ac_n "checking for AIX""... $ac_c" 1>&6
  cat > conftest.$ac_ext <<EOF
! #line 1721 "configure"
  #include "confdefs.h"
  #ifdef _AIX
--- 1806,1810 ----
  echo $ac_n "checking for AIX""... $ac_c" 1>&6
  cat > conftest.$ac_ext <<EOF
! #line 1809 "configure"
  #include "confdefs.h"
  #ifdef _AIX
*************** rm -f conftest*
*** 1740,1744 ****
  
  
! for ac_hdr in sys/select.h sys/timeb.h sys/time.h unistd.h utime.h
  do
  ac_safe=`echo "$ac_hdr" | tr './\055' '___'`
--- 1828,1832 ----
  
  
! for ac_hdr in sys/select.h sys/timeb.h sys/time.h unistd.h utime.h linux/version.h
  do
  ac_safe=`echo "$ac_hdr" | tr './\055' '___'`
*************** if eval "test \"`echo '$''{'ac_cv_header
*** 1748,1756 ****
  else
    cat > conftest.$ac_ext <<EOF
! #line 1751 "configure"
  #include "confdefs.h"
  #include <$ac_hdr>
  EOF
! eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
  ac_err=`grep -v '^ *+' conftest.out`
  if test -z "$ac_err"; then
--- 1836,1845 ----
  else
    cat > conftest.$ac_ext <<EOF
! #line 1839 "configure"
  #include "confdefs.h"
  #include <$ac_hdr>
  EOF
! ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:1844: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  ac_err=`grep -v '^ *+' conftest.out`
  if test -z "$ac_err"; then
*************** else
*** 1785,1793 ****
  else
  cat > conftest.$ac_ext <<EOF
! #line 1788 "configure"
  #include "confdefs.h"
  main(){return(0);}
  EOF
! eval $ac_link
  if test -s conftest && (./conftest; exit) 2>/dev/null; then
    ac_cv_c_cross=no
--- 1874,1882 ----
  else
  cat > conftest.$ac_ext <<EOF
! #line 1877 "configure"
  #include "confdefs.h"
  main(){return(0);}
  EOF
! { (eval echo configure:1881: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }
  if test -s conftest && (./conftest; exit) 2>/dev/null; then
    ac_cv_c_cross=no
*************** if eval "test \"`echo '$''{'ac_cv_header
*** 1807,1811 ****
  else
    cat > conftest.$ac_ext <<EOF
! #line 1810 "configure"
  #include "confdefs.h"
  #include <stdlib.h>
--- 1896,1900 ----
  else
    cat > conftest.$ac_ext <<EOF
! #line 1899 "configure"
  #include "confdefs.h"
  #include <stdlib.h>
*************** else
*** 1814,1818 ****
  #include <float.h>
  EOF
! eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
  ac_err=`grep -v '^ *+' conftest.out`
  if test -z "$ac_err"; then
--- 1903,1908 ----
  #include <float.h>
  EOF
! ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:1907: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  ac_err=`grep -v '^ *+' conftest.out`
  if test -z "$ac_err"; then
*************** if test $ac_cv_header_stdc = yes; then
*** 1829,1833 ****
    # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
  cat > conftest.$ac_ext <<EOF
! #line 1832 "configure"
  #include "confdefs.h"
  #include <string.h>
--- 1919,1923 ----
    # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
  cat > conftest.$ac_ext <<EOF
! #line 1922 "configure"
  #include "confdefs.h"
  #include <string.h>
*************** if test $ac_cv_header_stdc = yes; then
*** 1847,1851 ****
    # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
  cat > conftest.$ac_ext <<EOF
! #line 1850 "configure"
  #include "confdefs.h"
  #include <stdlib.h>
--- 1937,1941 ----
    # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
  cat > conftest.$ac_ext <<EOF
! #line 1940 "configure"
  #include "confdefs.h"
  #include <stdlib.h>
*************** if test $ac_cv_header_stdc = yes; then
*** 1865,1872 ****
    # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
  if test "$cross_compiling" = yes; then
!   ac_cv_header_stdc=no
  else
  cat > conftest.$ac_ext <<EOF
! #line 1871 "configure"
  #include "confdefs.h"
  #include <ctype.h>
--- 1955,1962 ----
    # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
  if test "$cross_compiling" = yes; then
!   :
  else
  cat > conftest.$ac_ext <<EOF
! #line 1961 "configure"
  #include "confdefs.h"
  #include <ctype.h>
*************** exit (0); }
*** 1879,1883 ****
  
  EOF
! eval $ac_link
  if test -s conftest && (./conftest; exit) 2>/dev/null; then
    :
--- 1969,1973 ----
  
  EOF
! { (eval echo configure:1972: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }
  if test -s conftest && (./conftest; exit) 2>/dev/null; then
    :
*************** if eval "test \"`echo '$''{'ac_cv_header
*** 1903,1907 ****
  else
    cat > conftest.$ac_ext <<EOF
! #line 1906 "configure"
  #include "confdefs.h"
  #include <sys/types.h>
--- 1993,1997 ----
  else
    cat > conftest.$ac_ext <<EOF
! #line 1996 "configure"
  #include "confdefs.h"
  #include <sys/types.h>
*************** struct tm *tp;
*** 1913,1917 ****
  ; return 0; }
  EOF
! if eval $ac_compile; then
    rm -rf conftest*
    ac_cv_header_time=yes
--- 2003,2007 ----
  ; return 0; }
  EOF
! if { (eval echo configure:2006: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    ac_cv_header_time=yes
*************** if eval "test \"`echo '$''{'ac_cv_decl_s
*** 1937,1941 ****
  else
    cat > conftest.$ac_ext <<EOF
! #line 1940 "configure"
  #include "confdefs.h"
  #include <sys/types.h>
--- 2027,2031 ----
  else
    cat > conftest.$ac_ext <<EOF
! #line 2030 "configure"
  #include "confdefs.h"
  #include <sys/types.h>
*************** char *msg = *(sys_siglist + 1);
*** 1950,1954 ****
  ; return 0; }
  EOF
! if eval $ac_compile; then
    rm -rf conftest*
    ac_cv_decl_sys_siglist=yes
--- 2040,2044 ----
  ; return 0; }
  EOF
! if { (eval echo configure:2043: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    ac_cv_decl_sys_siglist=yes
*************** fi
*** 1972,1976 ****
  echo $ac_n "checking for struct utimbuf""... $ac_c" 1>&6
  cat > conftest.$ac_ext <<EOF
! #line 1975 "configure"
  #include "confdefs.h"
  #ifdef TIME_WITH_SYS_TIME
--- 2062,2066 ----
  echo $ac_n "checking for struct utimbuf""... $ac_c" 1>&6
  cat > conftest.$ac_ext <<EOF
! #line 2065 "configure"
  #include "confdefs.h"
  #ifdef TIME_WITH_SYS_TIME
*************** static struct utimbuf x; x.actime = x.mo
*** 1992,1996 ****
  ; return 0; }
  EOF
! if eval $ac_compile; then
    rm -rf conftest*
    echo "$ac_t""yes" 1>&6
--- 2082,2086 ----
  ; return 0; }
  EOF
! if { (eval echo configure:2085: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    echo "$ac_t""yes" 1>&6
*************** if eval "test \"`echo '$''{'ac_cv_type_s
*** 2011,2015 ****
  else
    cat > conftest.$ac_ext <<EOF
! #line 2014 "configure"
  #include "confdefs.h"
  #include <sys/types.h>
--- 2101,2105 ----
  else
    cat > conftest.$ac_ext <<EOF
! #line 2104 "configure"
  #include "confdefs.h"
  #include <sys/types.h>
*************** else
*** 2019,2025 ****
  #endif
  #ifdef __cplusplus
! extern "C"
! #endif
  void (*signal ()) ();
  int main() { return 0; }
  int t() {
--- 2109,2117 ----
  #endif
  #ifdef __cplusplus
! extern "C" void (*signal (int, void (*)(int)))(int);
! #else
  void (*signal ()) ();
+ #endif
+ 
  int main() { return 0; }
  int t() {
*************** int i;
*** 2027,2031 ****
  ; return 0; }
  EOF
! if eval $ac_compile; then
    rm -rf conftest*
    ac_cv_type_signal=void
--- 2119,2123 ----
  ; return 0; }
  EOF
! if { (eval echo configure:2122: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    ac_cv_type_signal=void
*************** EOF
*** 2047,2051 ****
  echo $ac_n "checking for struct timeval""... $ac_c" 1>&6
  cat > conftest.$ac_ext <<EOF
! #line 2050 "configure"
  #include "confdefs.h"
  #ifdef TIME_WITH_SYS_TIME
--- 2139,2143 ----
  echo $ac_n "checking for struct timeval""... $ac_c" 1>&6
  cat > conftest.$ac_ext <<EOF
! #line 2142 "configure"
  #include "confdefs.h"
  #ifdef TIME_WITH_SYS_TIME
*************** static struct timeval x; x.tv_sec = x.tv
*** 2064,2068 ****
  ; return 0; }
  EOF
! if eval $ac_compile; then
    rm -rf conftest*
    echo "$ac_t""yes" 1>&6
--- 2156,2160 ----
  ; return 0; }
  EOF
! if { (eval echo configure:2159: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    echo "$ac_t""yes" 1>&6
*************** else
*** 2075,2078 ****
--- 2167,2171 ----
    rm -rf conftest*
    echo "$ac_t""no" 1>&6
+    HAVE_TIMEVAL=no
  fi
  rm -f conftest*
*************** if eval "test \"`echo '$''{'ac_cv_struct
*** 2084,2088 ****
  else
    cat > conftest.$ac_ext <<EOF
! #line 2087 "configure"
  #include "confdefs.h"
  #include <sys/types.h>
--- 2177,2181 ----
  else
    cat > conftest.$ac_ext <<EOF
! #line 2180 "configure"
  #include "confdefs.h"
  #include <sys/types.h>
*************** struct tm *tp; tp->tm_sec;
*** 2093,2097 ****
  ; return 0; }
  EOF
! if eval $ac_compile; then
    rm -rf conftest*
    ac_cv_struct_tm=time.h
--- 2186,2190 ----
  ; return 0; }
  EOF
! if { (eval echo configure:2189: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    ac_cv_struct_tm=time.h
*************** if eval "test \"`echo '$''{'ac_cv_struct
*** 2117,2121 ****
  else
    cat > conftest.$ac_ext <<EOF
! #line 2120 "configure"
  #include "confdefs.h"
  #include <sys/types.h>
--- 2210,2214 ----
  else
    cat > conftest.$ac_ext <<EOF
! #line 2213 "configure"
  #include "confdefs.h"
  #include <sys/types.h>
*************** struct tm tm; tm.tm_zone;
*** 2126,2130 ****
  ; return 0; }
  EOF
! if eval $ac_compile; then
    rm -rf conftest*
    ac_cv_struct_tm_zone=yes
--- 2219,2223 ----
  ; return 0; }
  EOF
! if { (eval echo configure:2222: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    ac_cv_struct_tm_zone=yes
*************** if eval "test \"`echo '$''{'ac_cv_var_tz
*** 2149,2153 ****
  else
    cat > conftest.$ac_ext <<EOF
! #line 2152 "configure"
  #include "confdefs.h"
  #include <time.h>
--- 2242,2246 ----
  else
    cat > conftest.$ac_ext <<EOF
! #line 2245 "configure"
  #include "confdefs.h"
  #include <time.h>
*************** atoi(*tzname);
*** 2160,2164 ****
  ; return 0; }
  EOF
! if eval $ac_link; then
    rm -rf conftest*
    ac_cv_var_tzname=yes
--- 2253,2257 ----
  ; return 0; }
  EOF
! if { (eval echo configure:2256: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
    rm -rf conftest*
    ac_cv_var_tzname=yes
*************** if eval "test \"`echo '$''{'ac_cv_c_cons
*** 2186,2190 ****
  else
    cat > conftest.$ac_ext <<EOF
! #line 2189 "configure"
  #include "confdefs.h"
  
--- 2279,2283 ----
  else
    cat > conftest.$ac_ext <<EOF
! #line 2282 "configure"
  #include "confdefs.h"
  
*************** char **p;
*** 2199,2203 ****
  /* NEC SVR4.0.2 mips cc rejects this.  */
  struct point {int x, y;};
! static struct point const zero;
  /* AIX XL C 1.02.0.0 rejects this.
     It does not let you subtract one const X* pointer from another in an arm
--- 2292,2296 ----
  /* NEC SVR4.0.2 mips cc rejects this.  */
  struct point {int x, y;};
! static struct point const zero = {0,0};
  /* AIX XL C 1.02.0.0 rejects this.
     It does not let you subtract one const X* pointer from another in an arm
*************** ccp = (char const *const *) p;
*** 2236,2240 ****
  ; return 0; }
  EOF
! if eval $ac_compile; then
    rm -rf conftest*
    ac_cv_c_const=yes
--- 2329,2333 ----
  ; return 0; }
  EOF
! if { (eval echo configure:2332: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
    rm -rf conftest*
    ac_cv_c_const=yes
*************** if test "${with_x+set}" = set; then
*** 2334,2348 ****
  fi
  
  if test "x$with_x" = xno; then
!   no_x=yes
  else
    if test "x$x_includes" != xNONE && test "x$x_libraries" != xNONE; then
!     no_x=
    else
! if eval "test \"`echo '$''{'ac_cv_path_x'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    # One or both of the vars are not set, and there is no cached value.
! no_x=yes
  rm -fr conftestdir
  if mkdir conftestdir; then
--- 2427,2444 ----
  fi
  
+ # $have_x is `yes', `no', `disabled', or empty when we do not yet know.
  if test "x$with_x" = xno; then
!   # The user explicitly disabled X.
!   have_x=disabled
  else
    if test "x$x_includes" != xNONE && test "x$x_libraries" != xNONE; then
!     # Both variables are already set.
!     have_x=yes
    else
! if eval "test \"`echo '$''{'ac_cv_have_x'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    # One or both of the vars are not set, and there is no cached value.
! ac_x_includes=NO ac_x_libraries=NO
  rm -fr conftestdir
  if mkdir conftestdir; then
*************** acfindx:
*** 2354,2360 ****
  EOF
    if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then
-     no_x=
      # GNU make sometimes prints "make[1]: Entering...", which would confuse us.
!     eval `make acfindx 2>/dev/null | grep -v make`
      # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR.
      for ac_extension in a so sl; do
--- 2450,2455 ----
  EOF
    if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then
      # GNU make sometimes prints "make[1]: Entering...", which would confuse us.
!     eval `${MAKE-make} acfindx 2>/dev/null | grep -v make`
      # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR.
      for ac_extension in a so sl; do
*************** EOF
*** 2378,2399 ****
  fi
  
! if test "$no_x" = yes; then
! test -z "$x_direct_test_library" && x_direct_test_library=Xt
! test -z "$x_direct_test_function" && x_direct_test_function=XtMalloc
! test -z "$x_direct_test_include" && x_direct_test_include=X11/Intrinsic.h
  cat > conftest.$ac_ext <<EOF
! #line 2386 "configure"
  #include "confdefs.h"
  #include <$x_direct_test_include>
  EOF
! eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
  ac_err=`grep -v '^ *+' conftest.out`
  if test -z "$ac_err"; then
    rm -rf conftest*
!   no_x= ac_x_includes=
  else
    echo "$ac_err" >&5
    rm -rf conftest*
!     for ac_dir in               \
      /usr/X11R6/include        \
      /usr/X11R5/include        \
--- 2473,2498 ----
  fi
  
! if test "$ac_x_includes" = NO; then
!   # Guess where to find include files, by looking for this one X11 .h file.
!   test -z "$x_direct_test_include" && x_direct_test_include=X11/Intrinsic.h
! 
!   # First, try using that file with no special directory specified.
  cat > conftest.$ac_ext <<EOF
! #line 2482 "configure"
  #include "confdefs.h"
  #include <$x_direct_test_include>
  EOF
! ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:2487: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  ac_err=`grep -v '^ *+' conftest.out`
  if test -z "$ac_err"; then
    rm -rf conftest*
!   # We can compile using X headers with no special include directory.
! ac_x_includes=
  else
    echo "$ac_err" >&5
    rm -rf conftest*
!   # Look for the header file in a standard set of common directories.
!   for ac_dir in               \
      /usr/X11R6/include        \
      /usr/X11R5/include        \
*************** else
*** 2433,2437 ****
    do
      if test -r "$ac_dir/$x_direct_test_include"; then
!       no_x= ac_x_includes=$ac_dir
        break
      fi
--- 2532,2536 ----
    do
      if test -r "$ac_dir/$x_direct_test_include"; then
!       ac_x_includes=$ac_dir
        break
      fi
*************** else
*** 2439,2450 ****
  fi
  rm -f conftest*
  
! # Check for the libraries.
! # See if we find them without any special options.
! # Don't add to $LIBS permanently.
! ac_save_LIBS="$LIBS"
! LIBS="-l$x_direct_test_library $LIBS"
  cat > conftest.$ac_ext <<EOF
! #line 2449 "configure"
  #include "confdefs.h"
  
--- 2538,2555 ----
  fi
  rm -f conftest*
+ fi # $ac_x_includes = NO
+ 
+ if test "$ac_x_libraries" = NO; then
+   # Check for the libraries.
  
!   test -z "$x_direct_test_library" && x_direct_test_library=Xt
!   test -z "$x_direct_test_function" && x_direct_test_function=XtMalloc
! 
!   # See if we find them without any special options.
!   # Don't add to $LIBS permanently.
!   ac_save_LIBS="$LIBS"
!   LIBS="-l$x_direct_test_library $LIBS"
  cat > conftest.$ac_ext <<EOF
! #line 2554 "configure"
  #include "confdefs.h"
  
*************** ${x_direct_test_function}()
*** 2454,2460 ****
  ; return 0; }
  EOF
! if eval $ac_link; then
    rm -rf conftest*
!   LIBS="$ac_save_LIBS" no_x= ac_x_libraries=
  else
    rm -rf conftest*
--- 2559,2567 ----
  ; return 0; }
  EOF
! if { (eval echo configure:2562: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
    rm -rf conftest*
!   LIBS="$ac_save_LIBS"
! # We can link X programs with no special library path.
! ac_x_libraries=
  else
    rm -rf conftest*
*************** do
*** 2500,2504 ****
    for ac_extension in a so sl; do
      if test -r $ac_dir/lib${x_direct_test_library}.$ac_extension; then
!       no_x= ac_x_libraries=$ac_dir
        break 2
      fi
--- 2607,2611 ----
    for ac_extension in a so sl; do
      if test -r $ac_dir/lib${x_direct_test_library}.$ac_extension; then
!       ac_x_libraries=$ac_dir
        break 2
      fi
*************** fi
*** 2508,2528 ****
  rm -f conftest*
  
! fi
! if test "$no_x" = yes; then
!   ac_cv_path_x="no_x=yes"
! else
!   ac_cv_path_x="no_x= ac_x_includes=$ac_x_includes ac_x_libraries=$ac_x_libraries"
  fi
  fi
    fi
!   eval "$ac_cv_path_x"
  fi # $with_x != no
  
! if test "$no_x" = yes; then
!   echo "$ac_t""no" 1>&6
  else
    test "x$x_includes" = xNONE && x_includes=$ac_x_includes
    test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries
!   ac_cv_path_x="no_x= ac_x_includes=$x_includes ac_x_libraries=$x_libraries"
    echo "$ac_t""libraries $x_libraries, headers $x_includes" 1>&6
  fi
--- 2615,2643 ----
  rm -f conftest*
  
! fi # $ac_x_libraries = NO
! 
! if test "$ac_x_includes" = NO || test "$ac_x_libraries" = NO; then
!   # Didn't find X anywhere.  Cache the known absence of X.
!   ac_cv_have_x="have_x=no"
! else
!   # Record where we found X for the cache.
!   ac_cv_have_x="have_x=yes \
! 	        ac_x_includes=$ac_x_includes ac_x_libraries=$ac_x_libraries"
  fi
  fi
    fi
!   eval "$ac_cv_have_x"
  fi # $with_x != no
  
! if test "$have_x" != yes; then
!   echo "$ac_t""$have_x" 1>&6
!   no_x=yes
  else
+   # If each of the values was on the command line, it overrides each guess.
    test "x$x_includes" = xNONE && x_includes=$ac_x_includes
    test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries
!   # Update the cache value to reflect the command line values.
!   ac_cv_have_x="have_x=yes \
! 		ac_x_includes=$x_includes ac_x_libraries=$x_libraries"
    echo "$ac_t""libraries $x_libraries, headers $x_includes" 1>&6
  fi
*************** if test x"${x_includes}" = x; then
*** 2545,2549 ****
    bitmapdir=/usr/include/X11/bitmaps
  else
!   # accumulate include directories that have X11 bitmap sudirectories
    bmd_acc="dummyval"
    for bmd in `echo ${x_includes} | sed -e "s/:/ /g"`; do
--- 2660,2664 ----
    bitmapdir=/usr/include/X11/bitmaps
  else
!   # accumulate include directories that have X11 bitmap subdirectories
    bmd_acc="dummyval"
    for bmd in `echo ${x_includes} | sed -e "s/:/ /g"`; do
*************** case "${window_system}" in
*** 2564,2570 ****
      HAVE_X11=yes
      case "${with_x_toolkit}" in
!       athena | lucid ) USE_X_TOOLKIT=LUCID ;;	
!       motif ) USE_X_TOOLKIT=MOTIF ;;	
!       * ) USE_X_TOOLKIT=none ;;
      esac
    ;;
--- 2679,2686 ----
      HAVE_X11=yes
      case "${with_x_toolkit}" in
!       athena | lucid ) USE_X_TOOLKIT=LUCID ;;
!       motif ) USE_X_TOOLKIT=MOTIF ;;
!       no ) USE_X_TOOLKIT=none ;;
!       * ) USE_X_TOOLKIT=maybe ;;
      esac
    ;;
*************** case "${window_system}" in
*** 2575,2584 ****
    ;;
  esac
- X_TOOLKIT_TYPE=$USE_X_TOOLKIT
  
  ### If we're using X11, we should use the X menu package.
! HAVE_X_MENU=no
  case ${HAVE_X11} in
!   yes ) HAVE_X_MENU=yes ;;
  esac
  
--- 2691,2699 ----
    ;;
  esac
  
  ### If we're using X11, we should use the X menu package.
! HAVE_MENUS=no
  case ${HAVE_X11} in
!   yes ) HAVE_MENUS=yes ;;
  esac
  
*************** echo "checking the machine- and system-d
*** 2609,2613 ****
  ### The two are the same except on a few systems, where they are made
  ### different to work around various lossages.  For example,
! ### GCC 2.5 on Linux needs them to be different because it treats -g
  ### as implying static linking.
  
--- 2724,2728 ----
  ### The two are the same except on a few systems, where they are made
  ### different to work around various lossages.  For example,
! ### GCC 2.5 on Lignux needs them to be different because it treats -g
  ### as implying static linking.
  
*************** LIBS="$libsrc_libs $LIBS"
*** 2731,2735 ****
  
  echo $ac_n "checking for -ldnet""... $ac_c" 1>&6
! ac_lib_var=`echo dnet | tr './+' '__p'`
  if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 2846,2850 ----
  
  echo $ac_n "checking for -ldnet""... $ac_c" 1>&6
! ac_lib_var=`echo dnet'_'dnet_ntoa | tr './+\055' '__p_'`
  if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** else
*** 2738,2743 ****
  LIBS="-ldnet  $LIBS"
  cat > conftest.$ac_ext <<EOF
! #line 2741 "configure"
  #include "confdefs.h"
  
  int main() { return 0; }
--- 2853,2862 ----
  LIBS="-ldnet  $LIBS"
  cat > conftest.$ac_ext <<EOF
! #line 2856 "configure"
  #include "confdefs.h"
+ /* Override any gcc2 internal prototype to avoid an error.  */
+ /* We use char because int might match the return type of a gcc2
+     builtin and then its argument prototype would still apply.  */
+ char dnet_ntoa();
  
  int main() { return 0; }
*************** dnet_ntoa()
*** 2746,2750 ****
  ; return 0; }
  EOF
! if eval $ac_link; then
    rm -rf conftest*
    eval "ac_cv_lib_$ac_lib_var=yes"
--- 2865,2869 ----
  ; return 0; }
  EOF
! if { (eval echo configure:2868: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
    rm -rf conftest*
    eval "ac_cv_lib_$ac_lib_var=yes"
*************** fi
*** 2772,2776 ****
  
  echo $ac_n "checking for -lXbsd""... $ac_c" 1>&6
! ac_lib_var=`echo Xbsd | tr './+' '__p'`
  if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 2891,2895 ----
  
  echo $ac_n "checking for -lXbsd""... $ac_c" 1>&6
! ac_lib_var=`echo Xbsd'_'main | tr './+\055' '__p_'`
  if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** else
*** 2779,2783 ****
  LIBS="-lXbsd  $LIBS"
  cat > conftest.$ac_ext <<EOF
! #line 2782 "configure"
  #include "confdefs.h"
  
--- 2898,2902 ----
  LIBS="-lXbsd  $LIBS"
  cat > conftest.$ac_ext <<EOF
! #line 2901 "configure"
  #include "confdefs.h"
  
*************** main()
*** 2787,2791 ****
  ; return 0; }
  EOF
! if eval $ac_link; then
    rm -rf conftest*
    eval "ac_cv_lib_$ac_lib_var=yes"
--- 2906,2910 ----
  ; return 0; }
  EOF
! if { (eval echo configure:2909: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
    rm -rf conftest*
    eval "ac_cv_lib_$ac_lib_var=yes"
*************** fi
*** 2807,2811 ****
  
  echo $ac_n "checking for -lpthreads""... $ac_c" 1>&6
! ac_lib_var=`echo pthreads | tr './+' '__p'`
  if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 2926,2930 ----
  
  echo $ac_n "checking for -lpthreads""... $ac_c" 1>&6
! ac_lib_var=`echo pthreads'_'cma_open | tr './+\055' '__p_'`
  if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** else
*** 2814,2819 ****
  LIBS="-lpthreads  $LIBS"
  cat > conftest.$ac_ext <<EOF
! #line 2817 "configure"
  #include "confdefs.h"
  
  int main() { return 0; }
--- 2933,2942 ----
  LIBS="-lpthreads  $LIBS"
  cat > conftest.$ac_ext <<EOF
! #line 2936 "configure"
  #include "confdefs.h"
+ /* Override any gcc2 internal prototype to avoid an error.  */
+ /* We use char because int might match the return type of a gcc2
+     builtin and then its argument prototype would still apply.  */
+ char cma_open();
  
  int main() { return 0; }
*************** cma_open()
*** 2822,2826 ****
  ; return 0; }
  EOF
! if eval $ac_link; then
    rm -rf conftest*
    eval "ac_cv_lib_$ac_lib_var=yes"
--- 2945,2949 ----
  ; return 0; }
  EOF
! if { (eval echo configure:2948: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
    rm -rf conftest*
    eval "ac_cv_lib_$ac_lib_var=yes"
*************** echo "$ac_t""$HAVE_XFREE386" 1>&6
*** 2861,2871 ****
  if test "${HAVE_X11}" = "yes"; then
    DEFS="$C_SWITCH_X_SITE $DEFS"
!   LIBS="$LD_SWITCH_X_SITE $LIBX $LIBS"
    CFLAGS="$C_SWITCH_X_SITE $CFLAGS"
  
!   if test "${opsys}" = "linux"; then
      echo $ac_n "checking whether X on GNU/Linux needs -b to link""... $ac_c" 1>&6
      cat > conftest.$ac_ext <<EOF
! #line 2870 "configure"
  #include "confdefs.h"
  
--- 2984,3004 ----
  if test "${HAVE_X11}" = "yes"; then
    DEFS="$C_SWITCH_X_SITE $DEFS"
!   LDFLAGS="$LDFLAGS $LD_SWITCH_X_SITE"
!   LIBS="$LIBX $LIBS"
    CFLAGS="$C_SWITCH_X_SITE $CFLAGS"
  
!   # On Solaris, arrange for LD_RUN_PATH to point to the X libraries for tests.
!   # This is handled by LD_SWITCH_X_SITE_AUX during the real build,
!   # but it's more convenient here to set LD_RUN_PATH
!   # since this also works on hosts that don't understand LD_SWITCH_X_SITE_AUX.
!   if test "${x_libraries}" != NONE && test -n "${x_libraries}"; then
!     LD_RUN_PATH=$x_libraries${LD_RUN_PATH+:}$LD_RUN_PATH
!     export LD_RUN_PATH
!   fi
! 
!   if test "${opsys}" = "lignux"; then
      echo $ac_n "checking whether X on GNU/Linux needs -b to link""... $ac_c" 1>&6
      cat > conftest.$ac_ext <<EOF
! #line 3003 "configure"
  #include "confdefs.h"
  
*************** XOpenDisplay ("foo");
*** 2875,2879 ****
  ; return 0; }
  EOF
! if eval $ac_link; then
    rm -rf conftest*
    xlinux_first_failure=no
--- 3008,3012 ----
  ; return 0; }
  EOF
! if { (eval echo configure:3011: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
    rm -rf conftest*
    xlinux_first_failure=no
*************** rm -f conftest*
*** 2894,2898 ****
        LIBS="$LIBS -b i486-linuxaout"
        cat > conftest.$ac_ext <<EOF
! #line 2897 "configure"
  #include "confdefs.h"
  
--- 3027,3031 ----
        LIBS="$LIBS -b i486-linuxaout"
        cat > conftest.$ac_ext <<EOF
! #line 3030 "configure"
  #include "confdefs.h"
  
*************** XOpenDisplay ("foo");
*** 2902,2906 ****
  ; return 0; }
  EOF
! if eval $ac_link; then
    rm -rf conftest*
    xlinux_second_failure=no
--- 3035,3039 ----
  ; return 0; }
  EOF
! if { (eval echo configure:3038: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
    rm -rf conftest*
    xlinux_second_failure=no
*************** if eval "test \"`echo '$''{'ac_cv_func_$
*** 2935,2939 ****
  else
    cat > conftest.$ac_ext <<EOF
! #line 2938 "configure"
  #include "confdefs.h"
  /* System header to define __stub macros and hopefully few prototypes,
--- 3068,3072 ----
  else
    cat > conftest.$ac_ext <<EOF
! #line 3071 "configure"
  #include "confdefs.h"
  /* System header to define __stub macros and hopefully few prototypes,
*************** else
*** 2941,2944 ****
--- 3074,3079 ----
  #include <assert.h>
  /* Override any gcc2 internal prototype to avoid an error.  */
+ /* We use char because int might match the return type of a gcc2
+     builtin and then its argument prototype would still apply.  */
  char $ac_func();
  
*************** $ac_func();
*** 2957,2961 ****
  ; return 0; }
  EOF
! if eval $ac_link; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
--- 3092,3096 ----
  ; return 0; }
  EOF
! if { (eval echo configure:3095: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
*************** done
*** 2981,2988 ****
  fi
  
  if test "${USE_X_TOOLKIT}" != "none"; then
    echo $ac_n "checking X11 toolkit version""... $ac_c" 1>&6
    cat > conftest.$ac_ext <<EOF
! #line 2987 "configure"
  #include "confdefs.h"
  #include <X11/Intrinsic.h>
--- 3116,3185 ----
  fi
  
+ if test "${window_system}" = "x11"; then
+   echo $ac_n "checking X11 version 6""... $ac_c" 1>&6
+   cat > conftest.$ac_ext <<EOF
+ #line 3122 "configure"
+ #include "confdefs.h"
+ #include <X11/Xlib.h>
+ int main() { return 0; }
+ int t() {
+ #if XlibSpecificationRelease < 6
+ fail;
+ #endif
+ 
+ ; return 0; }
+ EOF
+ if { (eval echo configure:3133: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+   rm -rf conftest*
+   echo "$ac_t""6 or newer" 1>&6
+     cat >> confdefs.h <<\EOF
+ #define HAVE_X11R6 1
+ EOF
+ 
+ else
+   rm -rf conftest*
+   echo "$ac_t""before 6" 1>&6
+ fi
+ rm -f conftest*
+ 
+ fi
+ 
+ if test x"${USE_X_TOOLKIT}" = xmaybe; then
+   echo $ac_n "checking X11 version 5""... $ac_c" 1>&6
+   cat > conftest.$ac_ext <<EOF
+ #line 3151 "configure"
+ #include "confdefs.h"
+ #include <X11/Xlib.h>
+ int main() { return 0; }
+ int t() {
+ #if XlibSpecificationRelease < 5
+ fail;
+ #endif
+ 
+ ; return 0; }
+ EOF
+ if { (eval echo configure:3162: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+   rm -rf conftest*
+   echo "$ac_t""5 or newer; use toolkit by default" 1>&6
+     USE_X_TOOLKIT=LUCID
+     cat >> confdefs.h <<\EOF
+ #define HAVE_X11R5 1
+ EOF
+ 
+ else
+   rm -rf conftest*
+   echo "$ac_t""before 5; do not use toolkit by default" 1>&6
+     USE_X_TOOLKIT=none
+ fi
+ rm -f conftest*
+ 
+ fi
+ 
+ X_TOOLKIT_TYPE=$USE_X_TOOLKIT
+ 
  if test "${USE_X_TOOLKIT}" != "none"; then
    echo $ac_n "checking X11 toolkit version""... $ac_c" 1>&6
    cat > conftest.$ac_ext <<EOF
! #line 3184 "configure"
  #include "confdefs.h"
  #include <X11/Intrinsic.h>
*************** fail;
*** 2995,3001 ****
  ; return 0; }
  EOF
! if eval $ac_link; then
    rm -rf conftest*
!   echo "$ac_t""6" 1>&6
      cat >> confdefs.h <<\EOF
  #define HAVE_X11XTR6 1
--- 3192,3199 ----
  ; return 0; }
  EOF
! if { (eval echo configure:3195: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
    rm -rf conftest*
!   echo "$ac_t""6 or newer" 1>&6
!     HAVE_X11XTR6=yes
      cat >> confdefs.h <<\EOF
  #define HAVE_X11XTR6 1
*************** EOF
*** 3004,3011 ****
  else
    rm -rf conftest*
!   echo "$ac_t""not 6" 1>&6
  fi
  rm -f conftest*
  
  fi
  
--- 3202,3262 ----
  else
    rm -rf conftest*
!   echo "$ac_t""before 6" 1>&6
!     HAVE_X11XTR6=no
! fi
! rm -f conftest*
! 
! 
!   OLDLIBS="$LIBS"
!   if test x$HAVE_X11XTR6 = xyes; then
!     LIBS="-lXt -lSM -lICE $LIBS"
!   else
!     LIBS="-lXt $LIBS"
!   fi
!   echo $ac_n "checking for -lXmu""... $ac_c" 1>&6
! ac_lib_var=`echo Xmu'_'XmuConvertStandardSelection | tr './+\055' '__p_'`
! if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
!   echo $ac_n "(cached) $ac_c" 1>&6
! else
!   ac_save_LIBS="$LIBS"
! LIBS="-lXmu  $LIBS"
! cat > conftest.$ac_ext <<EOF
! #line 3225 "configure"
! #include "confdefs.h"
! /* Override any gcc2 internal prototype to avoid an error.  */
! /* We use char because int might match the return type of a gcc2
!     builtin and then its argument prototype would still apply.  */
! char XmuConvertStandardSelection();
! 
! int main() { return 0; }
! int t() {
! XmuConvertStandardSelection()
! ; return 0; }
! EOF
! if { (eval echo configure:3237: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
!   rm -rf conftest*
!   eval "ac_cv_lib_$ac_lib_var=yes"
! else
!   rm -rf conftest*
!   eval "ac_cv_lib_$ac_lib_var=no"
  fi
  rm -f conftest*
+ LIBS="$ac_save_LIBS"
+ 
+ fi
+ if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+   echo "$ac_t""yes" 1>&6
+     ac_tr_lib=HAVE_LIB`echo Xmu | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+   cat >> confdefs.h <<EOF
+ #define $ac_tr_lib 1
+ EOF
+ 
+   LIBS="-lXmu $LIBS"
+ 
+ else
+   echo "$ac_t""no" 1>&6
+ fi
  
+   LIBS="$OLDLIBS"
  fi
  
*************** fi
*** 3013,3017 ****
  echo $ac_n "checking whether netdb declares h_errno""... $ac_c" 1>&6
  cat > conftest.$ac_ext <<EOF
! #line 3016 "configure"
  #include "confdefs.h"
  #include <netdb.h>
--- 3264,3268 ----
  echo $ac_n "checking whether netdb declares h_errno""... $ac_c" 1>&6
  cat > conftest.$ac_ext <<EOF
! #line 3267 "configure"
  #include "confdefs.h"
  #include <netdb.h>
*************** return h_errno;
*** 3021,3025 ****
  ; return 0; }
  EOF
! if eval $ac_link; then
    rm -rf conftest*
    echo "$ac_t""yes" 1>&6
--- 3272,3276 ----
  ; return 0; }
  EOF
! if { (eval echo configure:3275: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
    rm -rf conftest*
    echo "$ac_t""yes" 1>&6
*************** if eval "test \"`echo '$''{'ac_cv_header
*** 3042,3046 ****
  else
    cat > conftest.$ac_ext <<EOF
! #line 3045 "configure"
  #include "confdefs.h"
  #include <alloca.h>
--- 3293,3297 ----
  else
    cat > conftest.$ac_ext <<EOF
! #line 3296 "configure"
  #include "confdefs.h"
  #include <alloca.h>
*************** char *p = alloca(2 * sizeof(int));
*** 3050,3054 ****
  ; return 0; }
  EOF
! if eval $ac_link; then
    rm -rf conftest*
    ac_cv_header_alloca_h=yes
--- 3301,3305 ----
  ; return 0; }
  EOF
! if { (eval echo configure:3304: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
    rm -rf conftest*
    ac_cv_header_alloca_h=yes
*************** if eval "test \"`echo '$''{'ac_cv_func_a
*** 3074,3078 ****
  else
    cat > conftest.$ac_ext <<EOF
! #line 3077 "configure"
  #include "confdefs.h"
  
--- 3325,3329 ----
  else
    cat > conftest.$ac_ext <<EOF
! #line 3328 "configure"
  #include "confdefs.h"
  
*************** char *p = (char *) alloca(1);
*** 3098,3102 ****
  ; return 0; }
  EOF
! if eval $ac_link; then
    rm -rf conftest*
    ac_cv_func_alloca=yes
--- 3349,3353 ----
  ; return 0; }
  EOF
! if { (eval echo configure:3352: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
    rm -rf conftest*
    ac_cv_func_alloca=yes
*************** if eval "test \"`echo '$''{'ac_cv_os_cra
*** 3133,3137 ****
  else
    cat > conftest.$ac_ext <<EOF
! #line 3136 "configure"
  #include "confdefs.h"
  #if defined(CRAY) && ! defined(CRAY2)
--- 3384,3388 ----
  else
    cat > conftest.$ac_ext <<EOF
! #line 3387 "configure"
  #include "confdefs.h"
  #if defined(CRAY) && ! defined(CRAY2)
*************** if eval "test \"`echo '$''{'ac_cv_func_$
*** 3162,3166 ****
  else
    cat > conftest.$ac_ext <<EOF
! #line 3165 "configure"
  #include "confdefs.h"
  /* System header to define __stub macros and hopefully few prototypes,
--- 3413,3417 ----
  else
    cat > conftest.$ac_ext <<EOF
! #line 3416 "configure"
  #include "confdefs.h"
  /* System header to define __stub macros and hopefully few prototypes,
*************** else
*** 3168,3171 ****
--- 3419,3424 ----
  #include <assert.h>
  /* Override any gcc2 internal prototype to avoid an error.  */
+ /* We use char because int might match the return type of a gcc2
+     builtin and then its argument prototype would still apply.  */
  char $ac_func();
  
*************** $ac_func();
*** 3184,3188 ****
  ; return 0; }
  EOF
! if eval $ac_link; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
--- 3437,3441 ----
  ; return 0; }
  EOF
! if { (eval echo configure:3440: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
*************** else
*** 3216,3220 ****
  else
  cat > conftest.$ac_ext <<EOF
! #line 3219 "configure"
  #include "confdefs.h"
  find_stack_direction ()
--- 3469,3473 ----
  else
  cat > conftest.$ac_ext <<EOF
! #line 3472 "configure"
  #include "confdefs.h"
  find_stack_direction ()
*************** main ()
*** 3235,3239 ****
  }
  EOF
! eval $ac_link
  if test -s conftest && (./conftest; exit) 2>/dev/null; then
    ac_cv_c_stack_direction=1
--- 3488,3492 ----
  }
  EOF
! { (eval echo configure:3491: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }
  if test -s conftest && (./conftest; exit) 2>/dev/null; then
    ac_cv_c_stack_direction=1
*************** fi
*** 3256,3260 ****
  # On HPUX 9.01, -lm does not contain logb, so check for sqrt.
  echo $ac_n "checking for -lm""... $ac_c" 1>&6
! ac_lib_var=`echo m | tr './+' '__p'`
  if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
--- 3509,3513 ----
  # On HPUX 9.01, -lm does not contain logb, so check for sqrt.
  echo $ac_n "checking for -lm""... $ac_c" 1>&6
! ac_lib_var=`echo m'_'sqrt | tr './+\055' '__p_'`
  if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
*************** else
*** 3263,3275 ****
  LIBS="-lm  $LIBS"
  cat > conftest.$ac_ext <<EOF
! #line 3266 "configure"
  #include "confdefs.h"
  
  int main() { return 0; }
  int t() {
! sqrt(0.0) + t()
  ; return 0; }
  EOF
! if eval $ac_link; then
    rm -rf conftest*
    eval "ac_cv_lib_$ac_lib_var=yes"
--- 3516,3532 ----
  LIBS="-lm  $LIBS"
  cat > conftest.$ac_ext <<EOF
! #line 3519 "configure"
  #include "confdefs.h"
+ /* Override any gcc2 internal prototype to avoid an error.  */
+ /* We use char because int might match the return type of a gcc2
+     builtin and then its argument prototype would still apply.  */
+ char sqrt();
  
  int main() { return 0; }
  int t() {
! sqrt()
  ; return 0; }
  EOF
! if { (eval echo configure:3531: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
    rm -rf conftest*
    eval "ac_cv_lib_$ac_lib_var=yes"
*************** else
*** 3295,3301 ****
  fi
  
  for ac_func in gettimeofday gethostname dup2 rename closedir mkdir rmdir \
  random lrand48 bcopy bcmp logb frexp fmod ftime res_init setsid \
! strerror fpathconf select mktime eaccess getpagesize tzset
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
--- 3552,3559 ----
  fi
  
+ 
  for ac_func in gettimeofday gethostname dup2 rename closedir mkdir rmdir \
  random lrand48 bcopy bcmp logb frexp fmod ftime res_init setsid \
! strerror fpathconf select mktime eaccess getpagesize tzset setlocale
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
*************** if eval "test \"`echo '$''{'ac_cv_func_$
*** 3304,3308 ****
  else
    cat > conftest.$ac_ext <<EOF
! #line 3307 "configure"
  #include "confdefs.h"
  /* System header to define __stub macros and hopefully few prototypes,
--- 3562,3566 ----
  else
    cat > conftest.$ac_ext <<EOF
! #line 3565 "configure"
  #include "confdefs.h"
  /* System header to define __stub macros and hopefully few prototypes,
*************** else
*** 3310,3313 ****
--- 3568,3573 ----
  #include <assert.h>
  /* Override any gcc2 internal prototype to avoid an error.  */
+ /* We use char because int might match the return type of a gcc2
+     builtin and then its argument prototype would still apply.  */
  char $ac_func();
  
*************** $ac_func();
*** 3326,3330 ****
  ; return 0; }
  EOF
! if eval $ac_link; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
--- 3586,3590 ----
  ; return 0; }
  EOF
! if { (eval echo configure:3589: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
*************** done
*** 3349,3357 ****
  
  
  echo $ac_n "checking whether localtime caches TZ""... $ac_c" 1>&6
  if eval "test \"`echo '$''{'emacs_cv_localtime_cache'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
!   if test $ac_cv_func_tzset = yes; then
  if test "$cross_compiling" = yes; then
    # If we have tzset, assume the worst when cross-compiling.
--- 3609,3666 ----
  
  
+ # Check this now, so that we will NOT find the above functions in ncurses.
+ # That is because we have not set up to link ncurses in lib-src.
+ # It's better to believe a function is not available
+ # than to expect to find it in ncurses.
+ echo $ac_n "checking for -lncurses""... $ac_c" 1>&6
+ ac_lib_var=`echo ncurses'_'tparm | tr './+\055' '__p_'`
+ if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+   echo $ac_n "(cached) $ac_c" 1>&6
+ else
+   ac_save_LIBS="$LIBS"
+ LIBS="-lncurses  $LIBS"
+ cat > conftest.$ac_ext <<EOF
+ #line 3624 "configure"
+ #include "confdefs.h"
+ /* Override any gcc2 internal prototype to avoid an error.  */
+ /* We use char because int might match the return type of a gcc2
+     builtin and then its argument prototype would still apply.  */
+ char tparm();
+ 
+ int main() { return 0; }
+ int t() {
+ tparm()
+ ; return 0; }
+ EOF
+ if { (eval echo configure:3636: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+   rm -rf conftest*
+   eval "ac_cv_lib_$ac_lib_var=yes"
+ else
+   rm -rf conftest*
+   eval "ac_cv_lib_$ac_lib_var=no"
+ fi
+ rm -f conftest*
+ LIBS="$ac_save_LIBS"
+ 
+ fi
+ if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+   echo "$ac_t""yes" 1>&6
+     ac_tr_lib=HAVE_LIB`echo ncurses | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+   cat >> confdefs.h <<EOF
+ #define $ac_tr_lib 1
+ EOF
+ 
+   LIBS="-lncurses $LIBS"
+ 
+ else
+   echo "$ac_t""no" 1>&6
+ fi
+ 
+ 
  echo $ac_n "checking whether localtime caches TZ""... $ac_c" 1>&6
  if eval "test \"`echo '$''{'emacs_cv_localtime_cache'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
!   if test x$ac_cv_func_tzset = xyes; then
  if test "$cross_compiling" = yes; then
    # If we have tzset, assume the worst when cross-compiling.
*************** emacs_cv_localtime_cache=yes
*** 3359,3363 ****
  else
  cat > conftest.$ac_ext <<EOF
! #line 3362 "configure"
  #include "confdefs.h"
  #include <time.h>
--- 3668,3672 ----
  else
  cat > conftest.$ac_ext <<EOF
! #line 3671 "configure"
  #include "confdefs.h"
  #include <time.h>
*************** cat > conftest.$ac_ext <<EOF
*** 3365,3381 ****
  # include <stdlib.h>
  #endif
  main()
  {
    time_t now = time ((time_t *) 0);
!   int hour;
    if (putenv ("TZ=GMT0") != 0)
      exit (1);
!   hour = localtime (&now)->tm_hour;
    if (putenv ("TZ=PST8") != 0)
      exit (1);
!   exit (localtime (&now)->tm_hour == hour);
  }
  EOF
! eval $ac_link
  if test -s conftest && (./conftest; exit) 2>/dev/null; then
    emacs_cv_localtime_cache=no
--- 3674,3705 ----
  # include <stdlib.h>
  #endif
+ extern char **environ;
+ unset_TZ ()
+ {
+   char **from, **to;
+   for (to = from = environ; (*to = *from); from++)
+     if (! (to[0][0] == 'T' && to[0][1] == 'Z' && to[0][2] == '='))
+       to++;
+ }
  main()
  {
    time_t now = time ((time_t *) 0);
!   int hour_GMT0, hour_unset;
    if (putenv ("TZ=GMT0") != 0)
      exit (1);
!   hour_GMT0 = localtime (&now)->tm_hour;
!   unset_TZ ();
!   hour_unset = localtime (&now)->tm_hour;
    if (putenv ("TZ=PST8") != 0)
      exit (1);
!   if (localtime (&now)->tm_hour == hour_GMT0)
!     exit (1);
!   unset_TZ ();
!   if (localtime (&now)->tm_hour != hour_unset)
!     exit (1);
!   exit (0);
  }
  EOF
! { (eval echo configure:3704: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }
  if test -s conftest && (./conftest; exit) 2>/dev/null; then
    emacs_cv_localtime_cache=no
*************** EOF
*** 3399,3406 ****
  fi
  
! if test $HAVE_TIMEVAL = yes; then
  echo $ac_n "checking whether gettimeofday can't accept two arguments""... $ac_c" 1>&6
  cat > conftest.$ac_ext <<EOF
! #line 3405 "configure"
  #include "confdefs.h"
  
--- 3723,3730 ----
  fi
  
! if test "x$HAVE_TIMEVAL" = xyes; then
  echo $ac_n "checking whether gettimeofday can't accept two arguments""... $ac_c" 1>&6
  cat > conftest.$ac_ext <<EOF
! #line 3729 "configure"
  #include "confdefs.h"
  
*************** int t() {
*** 3425,3429 ****
  ; return 0; }
  EOF
! if eval $ac_link; then
    rm -rf conftest*
    echo "$ac_t""no" 1>&6
--- 3749,3753 ----
  ; return 0; }
  EOF
! if { (eval echo configure:3752: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
    rm -rf conftest*
    echo "$ac_t""no" 1>&6
*************** if eval "test \"`echo '$''{'ac_cv_func_s
*** 3446,3450 ****
  else
    cat > conftest.$ac_ext <<EOF
! #line 3449 "configure"
  #include "confdefs.h"
  /* System header to define __stub macros and hopefully few prototypes,
--- 3770,3774 ----
  else
    cat > conftest.$ac_ext <<EOF
! #line 3773 "configure"
  #include "confdefs.h"
  /* System header to define __stub macros and hopefully few prototypes,
*************** else
*** 3452,3455 ****
--- 3776,3781 ----
  #include <assert.h>
  /* Override any gcc2 internal prototype to avoid an error.  */
+ /* We use char because int might match the return type of a gcc2
+     builtin and then its argument prototype would still apply.  */
  char socket();
  
*************** socket();
*** 3468,3472 ****
  ; return 0; }
  EOF
! if eval $ac_link; then
    rm -rf conftest*
    eval "ac_cv_func_socket=yes"
--- 3794,3798 ----
  ; return 0; }
  EOF
! if { (eval echo configure:3797: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
    rm -rf conftest*
    eval "ac_cv_func_socket=yes"
*************** if eval "test \"`echo '$''{'ac_cv_header
*** 3493,3501 ****
  else
    cat > conftest.$ac_ext <<EOF
! #line 3496 "configure"
  #include "confdefs.h"
  #include <netinet/in.h>
  EOF
! eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
  ac_err=`grep -v '^ *+' conftest.out`
  if test -z "$ac_err"; then
--- 3819,3828 ----
  else
    cat > conftest.$ac_ext <<EOF
! #line 3822 "configure"
  #include "confdefs.h"
  #include <netinet/in.h>
  EOF
! ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:3827: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  ac_err=`grep -v '^ *+' conftest.out`
  if test -z "$ac_err"; then
*************** if eval "test \"`echo '$''{'ac_cv_header
*** 3525,3533 ****
  else
    cat > conftest.$ac_ext <<EOF
! #line 3528 "configure"
  #include "confdefs.h"
  #include <arpa/inet.h>
  EOF
! eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
  ac_err=`grep -v '^ *+' conftest.out`
  if test -z "$ac_err"; then
--- 3852,3861 ----
  else
    cat > conftest.$ac_ext <<EOF
! #line 3855 "configure"
  #include "confdefs.h"
  #include <arpa/inet.h>
  EOF
! ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:3860: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  ac_err=`grep -v '^ *+' conftest.out`
  if test -z "$ac_err"; then
*************** EOF
*** 3664,3670 ****
  
  fi
! if test "${HAVE_X_MENU}" = "yes" ; then
    cat >> confdefs.h <<\EOF
! #define HAVE_X_MENU 1
  EOF
  
--- 3992,3998 ----
  
  fi
! if test "${HAVE_MENUS}" = "yes" ; then
    cat >> confdefs.h <<\EOF
! #define HAVE_MENUS 1
  EOF
  
*************** do
*** 3797,3801 ****
      exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
    -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
!     echo "$CONFIG_STATUS generated by autoconf version 2.5"
      exit 0 ;;
    -help | --help | --hel | --he | --h)
--- 4125,4129 ----
      exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
    -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
!     echo "$CONFIG_STATUS generated by autoconf version 2.10"
      exit 0 ;;
    -help | --help | --hel | --he | --h)
*************** ac_given_INSTALL="$INSTALL"
*** 3810,3817 ****
  trap 'rm -fr `echo "Makefile lib-src/Makefile.c:lib-src/Makefile.in oldXMenu/Makefile \
  	man/Makefile lwlib/Makefile src/Makefile.c:src/Makefile.in src/config.h:src/config.in" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
  
  # Protect against being on the right side of a sed subst in config.status.
! sed 's/%@/@@/; s/@%/@@/; s/%g$/@g/; /@g$/s/[\\\\&%]/\\\\&/g;
!  s/@@/%@/; s/@@/@%/; s/@g$/%g/' > conftest.subs <<\CEOF
  $ac_vpsub
  $extrasub
--- 4138,4147 ----
  trap 'rm -fr `echo "Makefile lib-src/Makefile.c:lib-src/Makefile.in oldXMenu/Makefile \
  	man/Makefile lwlib/Makefile src/Makefile.c:src/Makefile.in src/config.h:src/config.in" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+ EOF
+ cat >> $CONFIG_STATUS <<EOF
  
  # Protect against being on the right side of a sed subst in config.status.
! sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
!  s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
  $ac_vpsub
  $extrasub
*************** cat > conftest.hdr <<\EOF
*** 3976,3980 ****
  s/[\\&%]/\\&/g
  s%[\\$`]%\\&%g
! s%#define \([A-Za-z_][A-Za-z0-9_]*\) \(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp
  s%ac_d%ac_u%gp
  s%ac_u%ac_e%gp
--- 4306,4310 ----
  s/[\\&%]/\\&/g
  s%[\\$`]%\\&%g
! s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp
  s%ac_d%ac_u%gp
  s%ac_u%ac_e%gp
*************** cat >> $CONFIG_STATUS <<\EOF
*** 4024,4027 ****
--- 4354,4363 ----
      rm -f conftest.h
    else
+     # Remove last slash and all that follows it.  Not all systems have dirname.
+       ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+       if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+       # The file is in a subdirectory.
+       test ! -d "$ac_dir" && mkdir "$ac_dir"
+     fi
      rm -f $ac_file
      mv conftest.h $ac_file
diff -2rcpP --exclude=*.elc emacs-19.30/configure.in emacs-19.31/configure.in
*** emacs-19.30/configure.in	Wed Nov 15 16:50:09 1995
--- emacs-19.31/configure.in	Sat May 25 10:23:12 1996
***************
*** 1,12 ****
! dnl This is an autoconf script.
  dnl To rebuild the `configure' script from this, execute the command
  dnl 	autoconf
  dnl in the directory containing this script.
! AC_PREREQ(2.4.1)dnl
  AC_INIT(src/lisp.h)
  AC_CONFIG_HEADER(src/config.h:src/config.in)
  
  lispdir='${datadir}/emacs/${version}/lisp'
! locallisppath='${datadir}/emacs/site-lisp'
  lisppath='${locallisppath}:${lispdir}'
  etcdir='${datadir}/emacs/${version}/etc'
--- 1,32 ----
! dnl  Autoconf script for GNU Emacs
  dnl To rebuild the `configure' script from this, execute the command
  dnl 	autoconf
  dnl in the directory containing this script.
! dnl
! dnl  Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc.
! dnl
! dnl  This file is part of GNU Emacs.
! dnl
! dnl  GNU Emacs is free software; you can redistribute it and/or modify
! dnl  it under the terms of the GNU General Public License as published by
! dnl  the Free Software Foundation; either version 2, or (at your option)
! dnl  any later version.
! dnl
! dnl  GNU Emacs is distributed in the hope that it will be useful,
! dnl  but WITHOUT ANY WARRANTY; without even the implied warranty of
! dnl  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
! dnl  GNU General Public License for more details.
! dnl
! dnl  You should have received a copy of the GNU General Public License
! dnl  along with GNU Emacs; see the file COPYING.  If not, write to
! dnl  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
! 
! AC_PREREQ(2.8)dnl
  AC_INIT(src/lisp.h)
  AC_CONFIG_HEADER(src/config.h:src/config.in)
  
  lispdir='${datadir}/emacs/${version}/lisp'
! locallisppath='${datadir}/emacs/${version}/site-lisp:'\
! '${datadir}/emacs/site-lisp'
  lisppath='${locallisppath}:${lispdir}'
  etcdir='${datadir}/emacs/${version}/etc'
*************** case "${canonical}" in
*** 170,175 ****
    ;;
  
!   alpha-*-linux* )
!     machine=alpha opsys=linux
    ;;
  
--- 190,195 ----
    ;;
  
!   alpha-*-linux* | alpha-*-lignux* )
!     machine=alpha opsys=lignux
    ;;
  
*************** case "${canonical}" in
*** 178,182 ****
      machine=altos opsys=usg5-2
    ;;
!     
    ## Amdahl UTS
    580-amdahl-sysv* )
--- 198,202 ----
      machine=altos opsys=usg5-2
    ;;
! 
    ## Amdahl UTS
    580-amdahl-sysv* )
*************** case "${canonical}" in
*** 236,240 ****
    *-convex-bsd* | *-convex-convexos* )
      machine=convex opsys=bsd4-3
!     ## Prevents suprious white space in makefiles - d.m.cooke@larc.nasa.gov
      NON_GNU_CPP="cc -E -P"
    ;;
--- 256,260 ----
    *-convex-bsd* | *-convex-convexos* )
      machine=convex opsys=bsd4-3
!     ## Prevents spurious white space in makefiles - d.m.cooke@larc.nasa.gov
      NON_GNU_CPP="cc -E -P"
    ;;
*************** case "${canonical}" in
*** 286,290 ****
        then CC="gnucc -m68040"
        else CC="gnucc -m68881"
!       fi 
      else
        if test -z "`type gcc | grep 'not found'`"
--- 306,310 ----
        then CC="gnucc -m68040"
        else CC="gnucc -m68881"
!       fi
      else
        if test -z "`type gcc | grep 'not found'`"
*************** case "${canonical}" in
*** 344,347 ****
--- 364,368 ----
         [7].[0-9] ) machine=nh4000 opsys=cxux7 ;;
      esac
+     NON_GNU_CPP="/lib/cpp"
    ;;
    ## Harris ecx or gcx running CX/UX (Series 1200, Series 3000)
*************** case "${canonical}" in
*** 349,352 ****
--- 370,378 ----
      machine=nh3000 opsys=cxux
    ;;
+   ## Harris power pc NightHawk running Power UNIX (Series 6000)
+   powerpc-harris-powerunix )
+     machine=nh6000 opsys=powerunix
+     NON_GNU_CPP="cc -Xo -E -P"
+   ;;
  
    ## Honeywell XPS100
*************** case "${canonical}" in
*** 401,404 ****
--- 427,433 ----
      esac
    ;;
+   hppa-*-nextstep* )
+     machine=hp800 opsys=nextstep
+   ;;
  
    ## Orion machines
*************** case "${canonical}" in
*** 437,441 ****
    romp-ibm-bsd4.3* )
      machine=ibmrt opsys=bsd4-3
!   ;;	
    romp-ibm-bsd4.2* )
      machine=ibmrt opsys=bsd4-2
--- 466,470 ----
    romp-ibm-bsd4.3* )
      machine=ibmrt opsys=bsd4-3
!   ;;
    romp-ibm-bsd4.2* )
      machine=ibmrt opsys=bsd4-2
*************** case "${canonical}" in
*** 443,447 ****
    romp-ibm-aos4.3* )
      machine=ibmrt opsys=bsd4-3
!   ;;	
    romp-ibm-aos4.2* )
      machine=ibmrt opsys=bsd4-2
--- 472,476 ----
    romp-ibm-aos4.3* )
      machine=ibmrt opsys=bsd4-3
!   ;;
    romp-ibm-aos4.2* )
      machine=ibmrt opsys=bsd4-2
*************** case "${canonical}" in
*** 596,600 ****
  
    ## Siemens Nixdorf
!   mips-siemens-sysv* )
      machine=mips-siemens opsys=usg5-4
      NON_GNU_CC=/usr/ccs/bin/cc
--- 625,629 ----
  
    ## Siemens Nixdorf
!   mips-siemens-sysv* | mips-sni-sysv*)
      machine=mips-siemens opsys=usg5-4
      NON_GNU_CC=/usr/ccs/bin/cc
*************** case "${canonical}" in
*** 618,622 ****
    ;;
    mips-sgi-irix6* )
!     machine=iris4d opsys=irix6-0
    ;;
    mips-sgi-irix5.[01]* )
--- 647,651 ----
    ;;
    mips-sgi-irix6* )
!     machine=iris4d opsys=irix6-0  NON_GNU_CPP=/lib/cpp
    ;;
    mips-sgi-irix5.[01]* )
*************** case "${canonical}" in
*** 650,653 ****
--- 679,686 ----
  
    ## Suns
+   sparc-*-linux* | sparc-*-lignux* )
+     machine=sparc opsys=lignux
+   ;;
+ 
    *-sun-sunos* | *-sun-bsd* | *-sun-solaris* \
      | i[345]86-*-solaris2* | i[345]86-*-sunos5* | powerpc*-*-solaris2* \
*************** case "${canonical}" in
*** 671,675 ****
  		NON_GNU_CPP=/usr/lib/cpp
  		;;
!       *-sunos4* | *-sunos ) opsys=sunos4-1
  		NON_GCC_TEST_OPTIONS=-Bstatic
  		GCC_TEST_OPTIONS=-static
--- 704,715 ----
  		NON_GNU_CPP=/usr/lib/cpp
  		;;
!       *-sunos4.1.[3-9]*-noshare )
! 		opsys=sunos4-1-3
! 		NON_GNU_CPP=/usr/lib/cpp
! 		NON_GCC_TEST_OPTIONS=-Bstatic
! 		GCC_TEST_OPTIONS=-static
! 		;;
!       *-sunos4* | *-sunos )
! 		opsys=sunos4-1
  		NON_GCC_TEST_OPTIONS=-Bstatic
  		GCC_TEST_OPTIONS=-static
*************** case "${canonical}" in
*** 690,698 ****
  		;;
        *-sunos5* | *-solaris* )
! 		opsys=sol2
  		NON_GNU_CPP=/usr/ccs/lib/cpp
  		;;
        *			  ) opsys=bsd4-2   ;;
      esac
    ;;
    sparc-*-nextstep* )
--- 730,749 ----
  		;;
        *-sunos5* | *-solaris* )
! 		opsys=sol2-4
  		NON_GNU_CPP=/usr/ccs/lib/cpp
  		;;
        *			  ) opsys=bsd4-2   ;;
      esac
+     ## Watch out for a compiler that we know will not work.
+     case "${canonical}" in
+      *-solaris* | *-sunos5* )
+ 		if [ "x$CC" = x/usr/ucb/cc ]; then
+ 		  ## /usr/ucb/cc doesn't work;
+ 		  ## we should find some other compiler that does work.
+ 		  unset CC
+ 		fi
+ 		;;
+       *) ;;
+     esac
    ;;
    sparc-*-nextstep* )
*************** case "${canonical}" in
*** 738,742 ****
      machine=titan opsys=usg5-3
    ;;
!   
    ## Ustation E30 (SS5E)
    m68*-unisys-uniplus* )
--- 789,793 ----
      machine=titan opsys=usg5-3
    ;;
! 
    ## Ustation E30 (SS5E)
    m68*-unisys-uniplus* )
*************** case "${canonical}" in
*** 785,789 ****
        *-esix* )			opsys=esix ;;
        *-xenix* )		opsys=xenix ;;
!       *-linux* )		opsys=linux ;;
        *-sco3.2v4* )		opsys=sco4 ; NON_GNU_CPP=/lib/cpp  ;;
        *-bsd386* | *-bsdi1* )	opsys=bsd386 ;;
--- 836,840 ----
        *-esix* )			opsys=esix ;;
        *-xenix* )		opsys=xenix ;;
!       *-linux* | *-lignux* )	opsys=lignux ;;
        *-sco3.2v4* )		opsys=sco4 ; NON_GNU_CPP=/lib/cpp  ;;
        *-bsd386* | *-bsdi1* )	opsys=bsd386 ;;
*************** case "${canonical}" in
*** 796,802 ****
    ;;
  
!   ## Linux/68k
!   m68k-*-linux* )
!     machine=m68k opsys=linux
    ;;
  
--- 847,853 ----
    ;;
  
!   ## Lignux/68k
!   m68k-*-linux* | m68k-*-lignux* )
!     machine=m68k opsys=lignux
    ;;
  
*************** if test x"${opsys}" = x; then
*** 827,831 ****
      *-sysv4.[2-9]* | *-sysvr4.[2-9]* )
  	if [ x$NON_GNU_CPP = x ]; then
! 	  NON_GNU_CPP=/usr/ccs/lib/cpp
  	fi
  	opsys=usg5-4-2 ;;
--- 878,886 ----
      *-sysv4.[2-9]* | *-sysvr4.[2-9]* )
  	if [ x$NON_GNU_CPP = x ]; then
! 	  if [ -f /usr/ccs/lib/cpp ]; then
! 	    NON_GNU_CPP=/usr/ccs/lib/cpp
! 	  else
! 	    NON_GNU_CPP=/lib/cpp
! 	  fi
  	fi
  	opsys=usg5-4-2 ;;
*************** if test x$GCC = xyes && test "x$GCC_TEST
*** 889,898 ****
  then
    CC="$CC $GCC_TEST_OPTIONS"
! fi  
  
  if test x$GCC = x && test "x$NON_GCC_TEST_OPTIONS" != x
  then
    CC="$CC $NON_GCC_TEST_OPTIONS"
! fi  
  
  #### Some other nice autoconf tests.  If you add a test here which
--- 944,953 ----
  then
    CC="$CC $GCC_TEST_OPTIONS"
! fi
  
  if test x$GCC = x && test "x$NON_GCC_TEST_OPTIONS" != x
  then
    CC="$CC $NON_GCC_TEST_OPTIONS"
! fi
  
  #### Some other nice autoconf tests.  If you add a test here which
*************** AC_AIX
*** 910,914 ****
  
  dnl checks for header files
! AC_CHECK_HEADERS(sys/select.h sys/timeb.h sys/time.h unistd.h utime.h)
  AC_HEADER_STDC
  AC_HEADER_TIME
--- 965,969 ----
  
  dnl checks for header files
! AC_CHECK_HEADERS(sys/select.h sys/timeb.h sys/time.h unistd.h utime.h linux/version.h)
  AC_HEADER_STDC
  AC_HEADER_TIME
*************** AC_TRY_COMPILE([#ifdef TIME_WITH_SYS_TIM
*** 951,955 ****
     HAVE_TIMEVAL=yes
     AC_DEFINE(HAVE_TIMEVAL)],
!   AC_MSG_RESULT(no))
  
  dnl checks for structure members
--- 1006,1011 ----
     HAVE_TIMEVAL=yes
     AC_DEFINE(HAVE_TIMEVAL)],
!   [AC_MSG_RESULT(no)
!    HAVE_TIMEVAL=no])
  
  dnl checks for structure members
*************** if test x"${x_includes}" = x; then
*** 986,990 ****
    bitmapdir=/usr/include/X11/bitmaps
  else
!   # accumulate include directories that have X11 bitmap sudirectories
    bmd_acc="dummyval"
    for bmd in `echo ${x_includes} | sed -e "s/:/ /g"`; do
--- 1042,1046 ----
    bitmapdir=/usr/include/X11/bitmaps
  else
!   # accumulate include directories that have X11 bitmap subdirectories
    bmd_acc="dummyval"
    for bmd in `echo ${x_includes} | sed -e "s/:/ /g"`; do
*************** case "${window_system}" in
*** 1005,1012 ****
      HAVE_X11=yes
      case "${with_x_toolkit}" in
!       athena | lucid ) USE_X_TOOLKIT=LUCID ;;	
!       motif ) USE_X_TOOLKIT=MOTIF ;;	
! dnl      open-look ) USE_X_TOOLKIT=OPEN_LOOK ;;	
!       * ) USE_X_TOOLKIT=none ;;
      esac
    ;;
--- 1061,1071 ----
      HAVE_X11=yes
      case "${with_x_toolkit}" in
!       athena | lucid ) USE_X_TOOLKIT=LUCID ;;
!       motif ) USE_X_TOOLKIT=MOTIF ;;
! dnl      open-look ) USE_X_TOOLKIT=OPEN_LOOK ;;
!       no ) USE_X_TOOLKIT=none ;;
! dnl If user did not say whether to use a toolkit,
! dnl make this decision later: use the toolkit if we have X11R5 or newer.
!       * ) USE_X_TOOLKIT=maybe ;;
      esac
    ;;
*************** dnl      open-look ) USE_X_TOOLKIT=OPEN_
*** 1017,1026 ****
    ;;
  esac
- X_TOOLKIT_TYPE=$USE_X_TOOLKIT
  
  ### If we're using X11, we should use the X menu package.
! HAVE_X_MENU=no
  case ${HAVE_X11} in
!   yes ) HAVE_X_MENU=yes ;;
  esac
  
--- 1076,1084 ----
    ;;
  esac
  
  ### If we're using X11, we should use the X menu package.
! HAVE_MENUS=no
  case ${HAVE_X11} in
!   yes ) HAVE_MENUS=yes ;;
  esac
  
*************** AC_CHECKING([the machine- and system-dep
*** 1051,1055 ****
  ### The two are the same except on a few systems, where they are made
  ### different to work around various lossages.  For example,
! ### GCC 2.5 on Linux needs them to be different because it treats -g
  ### as implying static linking.
  
--- 1109,1113 ----
  ### The two are the same except on a few systems, where they are made
  ### different to work around various lossages.  For example,
! ### GCC 2.5 on Lignux needs them to be different because it treats -g
  ### as implying static linking.
  
*************** AC_MSG_RESULT($HAVE_XFREE386)
*** 1200,1207 ****
  if test "${HAVE_X11}" = "yes"; then
    DEFS="$C_SWITCH_X_SITE $DEFS"
!   LIBS="$LD_SWITCH_X_SITE $LIBX $LIBS"
    CFLAGS="$C_SWITCH_X_SITE $CFLAGS"
  
!   if test "${opsys}" = "linux"; then
      AC_MSG_CHECKING(whether X on GNU/Linux needs -b to link)
      AC_TRY_LINK([],
--- 1258,1275 ----
  if test "${HAVE_X11}" = "yes"; then
    DEFS="$C_SWITCH_X_SITE $DEFS"
!   LDFLAGS="$LDFLAGS $LD_SWITCH_X_SITE"
!   LIBS="$LIBX $LIBS"
    CFLAGS="$C_SWITCH_X_SITE $CFLAGS"
  
!   # On Solaris, arrange for LD_RUN_PATH to point to the X libraries for tests.
!   # This is handled by LD_SWITCH_X_SITE_AUX during the real build,
!   # but it's more convenient here to set LD_RUN_PATH
!   # since this also works on hosts that don't understand LD_SWITCH_X_SITE_AUX.
!   if test "${x_libraries}" != NONE && test -n "${x_libraries}"; then
!     LD_RUN_PATH=$x_libraries${LD_RUN_PATH+:}$LD_RUN_PATH
!     export LD_RUN_PATH
!   fi
! 
!   if test "${opsys}" = "lignux"; then
      AC_MSG_CHECKING(whether X on GNU/Linux needs -b to link)
      AC_TRY_LINK([],
*************** XScreenNumberOfScreen XSetWMProtocols)
*** 1242,1245 ****
--- 1310,1339 ----
  fi
  
+ if test "${window_system}" = "x11"; then
+   AC_MSG_CHECKING(X11 version 6)
+   AC_TRY_LINK([#include <X11/Xlib.h>],
+ [#if XlibSpecificationRelease < 6
+ fail;
+ #endif
+ ], [AC_MSG_RESULT(6 or newer)
+     AC_DEFINE(HAVE_X11R6)],
+    [AC_MSG_RESULT(before 6)])
+ fi
+ 
+ if test x"${USE_X_TOOLKIT}" = xmaybe; then
+   AC_MSG_CHECKING(X11 version 5)
+   AC_TRY_LINK([#include <X11/Xlib.h>],
+ [#if XlibSpecificationRelease < 5
+ fail;
+ #endif
+ ], [AC_MSG_RESULT(5 or newer; use toolkit by default)
+     USE_X_TOOLKIT=LUCID
+     AC_DEFINE(HAVE_X11R5)],
+    [AC_MSG_RESULT(before 5; do not use toolkit by default)
+     USE_X_TOOLKIT=none])
+ fi
+ 
+ X_TOOLKIT_TYPE=$USE_X_TOOLKIT
+ 
  if test "${USE_X_TOOLKIT}" != "none"; then
    AC_MSG_CHECKING(X11 toolkit version)
*************** if test "${USE_X_TOOLKIT}" != "none"; th
*** 1248,1254 ****
  fail;
  #endif
! ], [AC_MSG_RESULT(6)
      AC_DEFINE(HAVE_X11XTR6)],
!    [AC_MSG_RESULT(not 6)])
  fi
  
--- 1342,1361 ----
  fail;
  #endif
! ], [AC_MSG_RESULT(6 or newer)
!     HAVE_X11XTR6=yes
      AC_DEFINE(HAVE_X11XTR6)],
!    [AC_MSG_RESULT(before 6)
!     HAVE_X11XTR6=no])
! 
! dnl If using toolkit, check whether libXmu.a exists.
! dnl tranle@intellicorp.com says libXmu.a can need XtMalloc in libXt.a to link.
!   OLDLIBS="$LIBS"
!   if test x$HAVE_X11XTR6 = xyes; then
!     LIBS="-lXt -lSM -lICE $LIBS"
!   else
!     LIBS="-lXt $LIBS"
!   fi
!   AC_CHECK_LIB(Xmu, XmuConvertStandardSelection)
!   LIBS="$OLDLIBS"
  fi
  
*************** AC_FUNC_ALLOCA
*** 1265,1290 ****
  # fmod, logb, and frexp are found in -lm on most systems.
  # On HPUX 9.01, -lm does not contain logb, so check for sqrt.
! AC_CHECK_LIB(m, sqrt(0.0) + t)
  AC_CHECK_FUNCS(gettimeofday gethostname dup2 rename closedir mkdir rmdir \
  random lrand48 bcopy bcmp logb frexp fmod ftime res_init setsid \
! strerror fpathconf select mktime eaccess getpagesize tzset)
  
  AC_MSG_CHECKING(whether localtime caches TZ)
  AC_CACHE_VAL(emacs_cv_localtime_cache,
! [if test $ac_cv_func_tzset = yes; then
  AC_TRY_RUN([#include <time.h>
  #if STDC_HEADERS
  # include <stdlib.h>
  #endif
  main()
  {
    time_t now = time ((time_t *) 0);
!   int hour;
    if (putenv ("TZ=GMT0") != 0)
      exit (1);
!   hour = localtime (&now)->tm_hour;
    if (putenv ("TZ=PST8") != 0)
      exit (1);
!   exit (localtime (&now)->tm_hour == hour);
  }], emacs_cv_localtime_cache=no, emacs_cv_localtime_cache=yes,
  [# If we have tzset, assume the worst when cross-compiling.
--- 1372,1419 ----
  # fmod, logb, and frexp are found in -lm on most systems.
  # On HPUX 9.01, -lm does not contain logb, so check for sqrt.
! AC_CHECK_LIB(m, sqrt)
! 
  AC_CHECK_FUNCS(gettimeofday gethostname dup2 rename closedir mkdir rmdir \
  random lrand48 bcopy bcmp logb frexp fmod ftime res_init setsid \
! strerror fpathconf select mktime eaccess getpagesize tzset setlocale)
! 
! # Check this now, so that we will NOT find the above functions in ncurses.
! # That is because we have not set up to link ncurses in lib-src.
! # It's better to believe a function is not available
! # than to expect to find it in ncurses.
! AC_CHECK_LIB(ncurses, tparm)
  
  AC_MSG_CHECKING(whether localtime caches TZ)
  AC_CACHE_VAL(emacs_cv_localtime_cache,
! [if test x$ac_cv_func_tzset = xyes; then
  AC_TRY_RUN([#include <time.h>
  #if STDC_HEADERS
  # include <stdlib.h>
  #endif
+ extern char **environ;
+ unset_TZ ()
+ {
+   char **from, **to;
+   for (to = from = environ; (*to = *from); from++)
+     if (! (to[0][0] == 'T' && to[0][1] == 'Z' && to[0][2] == '='))
+       to++;
+ }
  main()
  {
    time_t now = time ((time_t *) 0);
!   int hour_GMT0, hour_unset;
    if (putenv ("TZ=GMT0") != 0)
      exit (1);
!   hour_GMT0 = localtime (&now)->tm_hour;
!   unset_TZ ();
!   hour_unset = localtime (&now)->tm_hour;
    if (putenv ("TZ=PST8") != 0)
      exit (1);
!   if (localtime (&now)->tm_hour == hour_GMT0)
!     exit (1);
!   unset_TZ ();
!   if (localtime (&now)->tm_hour != hour_unset)
!     exit (1);
!   exit (0);
  }], emacs_cv_localtime_cache=no, emacs_cv_localtime_cache=yes,
  [# If we have tzset, assume the worst when cross-compiling.
*************** if test $emacs_cv_localtime_cache = yes;
*** 1300,1304 ****
  fi
  
! if test $HAVE_TIMEVAL = yes; then
  AC_MSG_CHECKING(whether gettimeofday can't accept two arguments)
  AC_TRY_LINK([
--- 1429,1433 ----
  fi
  
! if test "x$HAVE_TIMEVAL" = xyes; then
  AC_MSG_CHECKING(whether gettimeofday can't accept two arguments)
  AC_TRY_LINK([
*************** if test "${HAVE_XFREE386}" = "yes" ; the
*** 1406,1411 ****
    AC_DEFINE(HAVE_XFREE386)
  fi
! if test "${HAVE_X_MENU}" = "yes" ; then
!   AC_DEFINE(HAVE_X_MENU)
  fi
  if test "${GNU_MALLOC}" = "yes" ; then
--- 1535,1540 ----
    AC_DEFINE(HAVE_XFREE386)
  fi
! if test "${HAVE_MENUS}" = "yes" ; then
!   AC_DEFINE(HAVE_MENUS)
  fi
  if test "${GNU_MALLOC}" = "yes" ; then
diff -2rcpP --exclude=*.elc emacs-19.30/etc/AIX.DUMP emacs-19.31/etc/AIX.DUMP
*** emacs-19.30/etc/AIX.DUMP	Thu Jul 22 03:54:09 1993
--- emacs-19.31/etc/AIX.DUMP	Thu Jan  4 14:53:54 1996
*************** has been modified as follows:
*** 165,169 ****
             AIX 3.1 version does not.  Therefore, repeated malloc calls are
             needed to exhaust this initial malloc space.  How do you know
!            when malloc has exhausted its free memroy? You don't!  So the
             code must repeatedly call malloc for each buffer size and
             detect when a new memory page has been allocated.  Once the new
--- 165,169 ----
             AIX 3.1 version does not.  Therefore, repeated malloc calls are
             needed to exhaust this initial malloc space.  How do you know
!            when malloc has exhausted its free memory?  You don't!  So the
             code must repeatedly call malloc for each buffer size and
             detect when a new memory page has been allocated.  Once the new
diff -2rcpP --exclude=*.elc emacs-19.30/etc/CENSORSHIP emacs-19.31/etc/CENSORSHIP
*** emacs-19.30/etc/CENSORSHIP	Wed Dec 31 19:00:00 1969
--- emacs-19.31/etc/CENSORSHIP	Thu May 23 15:18:56 1996
***************
*** 0 ****
--- 1,88 ----
+ 		Censoring my Software
+ 		   Richard Stallman
+ 			[From Datamation, 1 March 1996]
+ 
+ 
+ Last summer, a few clever legislators proposed a bill to "prohibit
+ pornography" on the Internet.  Last fall, right-wing Christians made
+ this cause their own.  Last week, President Clinton signed the bill,
+ and we lost the freedom of the press for the public library of the
+ future.  This week, I'm censoring GNU Emacs.
+ 
+ No, GNU Emacs does not contain pornography,   It is a software package,
+ an award-winning extensible and programmable text editor.  But the law
+ that was passed applies to far more than pornography.  It prohibits
+ "indecent" speech, which can include anything from famous poems, to
+ masterpieces hanging in the Louvre, to advice about safe sex...to
+ software.
+ 
+ Naturally, there was a lot of opposition to this bill.  Not only from
+ people who use the Internet, and people who appreciate erotica, but
+ from everyone who cares about freedom of the press.
+ 
+ But every time we tried to tell the public what was at stake, the
+ forces of censorship responded with a lie: they told the public that
+ the issue was simply pornography.  By embedding this lie as a
+ presupposition in their statements about the issue, they succeeded in
+ misinforming the public.  So here I am, censoring my software.
+ 
+ You see, Emacs contains a version of the famous "doctor program",
+ a.k.a. Eliza, originally developed by Professor Weizenbaum at MIT.
+ This is the program that imitates a Rogerian psychotherapist.  The
+ user talks to the program, and the program responds--by playing back
+ the user's own statements, and by recognizing a long list of
+ particular words.
+ 
+ The Emacs doctor program was set up to recognize many common curse
+ words, and respond with an appropriately cute message such as, "Would
+ you please watch your tongue?" or "Let's not be vulgar."  In order to
+ do this, it had to have a list of curse words.  That means the source
+ code for the program was indecent.
+ 
+ Because of the censorship law, I had to remove this feature.  (I
+ replaced it with a message announcing that the program has been
+ censored for your protection.)  The new version of the doctor doesn't
+ recognize the indecent words.  If you curse at it, it curses right
+ back to you--for lack of knowing better.
+ 
+ Now that people are facing the threat of two years in prison for
+ indecent network postings, it would be helpful if they could access
+ precise rules via the Internet for how to avoid imprisonment.
+ However, this is impossible.  The rules would have to mention the
+ forbidden words, so posting them on the Internet would be against the
+ rules.
+ 
+ Of course, I'm making an assumption about just what "indecent" means.
+ I have to do this, because nobody knows for sure.  The most obvious
+ possibile meaning is the meaning it has for television, so I'm using
+ that as a tentative assumption.  However, there is a good chance that
+ our courts will reject that interpretation of the law as
+ unconstitutional.
+ 
+ We can hope that the courts will recognize the Internet as a medium of
+ publication like books and magazines.  If they do, they will entirely
+ reject any law prohibiting "indecent" publications on the Internet.
+ 
+ What really worries me is that the courts might take a muddled
+ in-between escape route--by choosing another interpretation of
+ "indecent", one that permits the doctor program or a statement of the
+ decency rules, but prohibits some of the books that children can
+ browse through in the public library and the bookstore.  Over the
+ years, as the Internet replaces the public library and the bookstore,
+ some of our freedom of the press will be lost.
+ 
+ Just a few weeks ago, another country imposed censorship on the
+ Internet.  That was China.  We don't think well of China in this
+ country--its government doesn't respect basic freedoms.  But how well
+ does our government respect them?  And do you care enough to preserve
+ them here?
+ 
+ If you care, stay in touch with the Voters Telecommunications Watch.
+ Look in their Web site http://www.vtw.org/ for background information
+ and political action recommendations.  Censorship won in February, but
+ we can beat it in November.
+ 
+ 
+ Copyright 1996 Richard Stallman
+ Verbatim copying and distribution is permitted in any medium
+ provided this notice is preserved.
diff -2rcpP --exclude=*.elc emacs-19.30/etc/ChangeLog emacs-19.31/etc/ChangeLog
*** emacs-19.30/etc/ChangeLog	Fri Nov 24 23:42:04 1995
--- emacs-19.31/etc/ChangeLog	Sat May 25 15:30:35 1996
***************
*** 1,2 ****
--- 1,18 ----
+ Sat May 25 15:30:10 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
+ 
+ 	* Version 19.31 released.
+ 
+ Sat May 25 14:50:49 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
+ 
+ 	* TUTORIAL: Rephrase the first page to fit on a standard tty screen.
+ 
+ Fri May  3 16:56:54 1996  Richard Stallman  <rms@delasyd.gnu.ai.mit.edu>
+ 
+ 	* emacs.bash: Use >|.
+ 
+ Sat Jan 20 19:15:06 1996  Geoff Voelker  <voelker@cs.washington.edu>
+ 
+ 	* rgb.txt: New file.
+ 
  Fri Nov 24 23:41:58 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
diff -2rcpP --exclude=*.elc emacs-19.30/etc/FAQ emacs-19.31/etc/FAQ
*** emacs-19.30/etc/FAQ	Sun Jun 18 14:45:46 1995
--- emacs-19.31/etc/FAQ	Thu Apr 11 18:55:24 1996
*************** Finding/Getting Emacs and Related Packag
*** 1916,1953 ****
    Recent releases of GNU Emacs 19 should compile right out of the box on
    PCs with a 386 or better, running MS-DOS 3.0 or later. You will need the
!   following:
     
!   Compiler: djgpp version 1,11 maint 4 or later.  You can get the latest
!             version by grabbing everything in the following directory
!             (using anonymous ftp):
  
!             oak.oakland.edu:pub/msdos/djdpp  
  
!   Tar:  One DOS version of tar is available via anonymous ftp from
  
!         ftp.urc.tue.nl:pub/unixtools/dos 
  
!         However, not all DOS versions of tar work equally well, so you
!         might have to try others if this one gives you trouble.
  
    Utilities: chmod, make, mv, sed, rm.  
  
!              All of these utilities are available via anonymous ftp from
!              the site
  
!              ftp.iro.umontreal.ca:pub/Internet/gnuish
  
!              You should grab the files futil4ax.zoo (contains chmod.exe,
!              mv.exe, and rm.exe), sed106ax.zoo (contains sed.exe), and
!              gzip07ax.zoo (contains gzip.exe).
  
    The file etc/MSDOS contains some information on the differences between
    the Unix and MS-DOS versions of GNU Emacs.
  
!   If you would prefer not to compile Emacs by yourself, you can get
!   binaries for Emacs 19.24 via anonymous ftp from the following two sites:
  
!       ftp.demon.co.uk:pub/ibmpc/editors/emacs19.24
!       ftp.imada.ou.dk:pub/mirrors/msdos/emacs-19.24
  
    You might also be interested in Demacs, which runs under MS-DOS (*not*
--- 1916,1993 ----
    Recent releases of GNU Emacs 19 should compile right out of the box on
    PCs with a 386 or better, running MS-DOS 3.0 or later. You will need the
!   following to compile it:
     
!   Compiler: djgpp version 1.12 maint 1 or later.  Djgpp v2.0 or later is
!             recommended, since v1.x is being phased out--if you'll have any
!             djgpp-related problem for which there is no known solution, you
!             are on your own when you use djgpp v1.x.
  
!             You can get the latest release of either v1.x or v2.0 by
!             grabbing everything in the following directory (using anonymous
!             ftp):
  
!             ftp.coast.net:/SimTel/vendors/djgpp
  
!             There are a few directories under djgpp whose names begin with
!             `v1' or `v2'; get the contents of `v2' and `v2gnu' (for djgpp
!             v2) or `v1' and `v1gnu' (for djgpp v1).
  
!   GUnZip and Tar:
! 
!             The easiest way is to use `djtar' which comes with DJGPP v2.0,
!             because it can unzip .tar.gz archives on-the-fly (so you won't
!             need twice the required disk space while untarring the
!             archive).  You get `djtar' with the `v2/djdev200.zip' file from
!             the above FTP server.
! 
!             Another (slower) version of Tar which unzips automatically is
!             available by anonymous ftp on this site:
! 
!             ftp.kiae.su:msdos/arcers/tar320fp.zip
! 
!             Or you can unZip the archive with the DJGPP port of GZip (from
!             the above directory at ftp.coast.net look for v2/gzp124b.zip),
!             then unTar it with any of the Tar ports floating around.  A
!             DOS version of GNU tar is available via anonymous ftp from
! 
!             ftp.unipg.it:/pub/msdos/aspi/gtar-exe.zip
! 
!             Note that DOS ports of GNU Tar usually cannot unzip compressed
!             archives.
! 
!             Another version of Tar for DOS can be found at
! 
!             ftp.urc.tue.nl:pub/unixtools/dos 
! 
!             However, be warned that not all DOS versions of tar work
!             equally well, so you might have to try others if this one gives
!             you trouble.
  
    Utilities: chmod, make, mv, sed, rm.  
  
!             All of these utilities are available via anonymous ftp from
!             the site
! 
!             ftp.coast.net:/SimTel/vendors/gnu/gnuish/dos_only
  
!             You should grab the files fut312bx.zip (contains chmod.exe,
!             mv.exe, and rm.exe).
  
!             A port of GNU Sed is available in the djgpp archives in the
!             above directory on ftp.coast.net.  Look for a file named
!             v2/sed118b.zip or v1/sed118bn.zip.
  
    The file etc/MSDOS contains some information on the differences between
    the Unix and MS-DOS versions of GNU Emacs.
  
!   MS-DOS systems are notorious in the problems they present when installing
!   programs, due to a great variability in both hardware and software.  If
!   you have any unusual problems compiling or using Emacs, please consult
!   the latest version of the djgpp FAQ list, available as v2/faqNNNb.zip,
!   where `NNN' is the version number.  For v1, get the file v1/faq102.zip.
  
!   If you would prefer not to compile Emacs by yourself, you can get
!   binaries for Emacs via anonymous ftp from many sites; use your Archie
!   client to search for them.
  
    You might also be interested in Demacs, which runs under MS-DOS (*not*
*************** Finding/Getting Emacs and Related Packag
*** 1957,1962 ****
  
    Demacs was developed using an MS-DOS version of gcc called djgpp by
!   D. J. Delorie <dj@ctron.com> which can compile and run large programs
!   under MS-DOS, but not under MS Windows.  Demacs was derived from Nemacs
    rather than straight from GNU Emacs.  You can get the most recent version
    of Demacs via anonymous ftp from ftp.sigmath.osaka-u.ac.jp in
--- 1997,2002 ----
  
    Demacs was developed using an MS-DOS version of gcc called djgpp by
!   DJ Delorie <dj@delorie.com> which can compile and run large programs
!   under MS-DOS and under MS Windows.  Demacs was derived from Nemacs
    rather than straight from GNU Emacs.  You can get the most recent version
    of Demacs via anonymous ftp from ftp.sigmath.osaka-u.ac.jp in
*************** Finding/Getting Emacs and Related Packag
*** 1969,1973 ****
  84:  Where can I get Emacs for my PC running Microsoft Windows?
  
!   There are currently two ports of Emacs that runs under Microsoft Windows:
  
    * Oemacs 
--- 2009,2017 ----
  84:  Where can I get Emacs for my PC running Microsoft Windows?
  
!   * If you compile GNU Emacs with the tools listed above, it will run under
!   Microsoft Windows in a DOS box.
! 
!   There are currently two other ports of Emacs that runs under Microsoft
!   Windows:
  
    * Oemacs 
*************** Finding/Getting Emacs and Related Packag
*** 1980,1984 ****
      Anonymous ftp information:
  
!       /oak.oakland.edu:pub/msdos/oemacs/
  
    * The other uses a proprietary X Windows emulator and therefore
--- 2024,2028 ----
      Anonymous ftp information:
  
!       ftp.coast.net:SimTel/vendors/gnu/oemacs/
  
    * The other uses a proprietary X Windows emulator and therefore
diff -2rcpP --exclude=*.elc emacs-19.30/etc/FTP emacs-19.31/etc/FTP
*** emacs-19.30/etc/FTP	Mon Oct 30 12:30:57 1995
--- emacs-19.31/etc/FTP	Mon Apr 22 19:38:00 1996
*************** ftp.hawaii.edu:/mirrors/gnu, f.ms.uky.ed
*** 150,159 ****
  ftp.digex.net:/pub/gnu (Internet address 164.109.10.23, nightly full
  mirror, ran by mcguire@digex.net), wuarchive.wustl.edu:/systems/gnu,
- col.hp.com:/mirrors/gnu, ftp.cs.columbia.edu:/archives/gnu/prep,
  uiarchive.cso.uiuc.edu:/pub/gnu (Internet address 128.174.5.14,
  nightly full mirror, ran by ftpadmin@uiuc.edu),
! jaguar.utah.edu:/gnustuff, gatekeeper.dec.com:/pub/GNU,
! labrea.stanford.edu, archive.cis.ohio-state.edu, and
! ftp.uu.net:/archive/systems/gnu.
  
  And these foreign sites: ftp.cs.ubc.ca:/mirror2/gnu (Western Canada,
--- 150,158 ----
  ftp.digex.net:/pub/gnu (Internet address 164.109.10.23, nightly full
  mirror, ran by mcguire@digex.net), wuarchive.wustl.edu:/systems/gnu,
  uiarchive.cso.uiuc.edu:/pub/gnu (Internet address 128.174.5.14,
  nightly full mirror, ran by ftpadmin@uiuc.edu),
! ftp.cs.columbia.edu:/archives/gnu/prep, jaguar.utah.edu:/gnustuff,
! gatekeeper.dec.com:/pub/GNU, labrea.stanford.edu,
! archive.cis.ohio-state.edu, and ftp.uu.net:/archive/systems/gnu.
  
  And these foreign sites: ftp.cs.ubc.ca:/mirror2/gnu (Western Canada,
*************** lmjm@doc.ic.ac.uk is willing to distribu
*** 203,210 ****
  along with comp.sources.unix, comp.sources.x, X windows et al.  The
  archive, on src.doc.ic.ac.uk in directory /gnu, is available via ftp
! over the Internet (on 146.169.3.7), niftp over janet (000005102000),
! ftam over IXI and uucp.  Due to communication costs this service is
! only available within the UK.  Mail to info-server@doc.ic.ac.uk for
! details.  He can also write sun cartridge or exabyte tapes.
  
  UK sites with just anonymous FTP access are in the above list.
--- 202,210 ----
  along with comp.sources.unix, comp.sources.x, X windows et al.  The
  archive, on src.doc.ic.ac.uk in directory /gnu, is available via ftp
! over the Internet (on 146.169.3.7), ftam over IXI, HTTP, FSP, Gopher,
! ftpmail, NFS, Lanmanger over IP, telnet, and uucp.  Due to
! communication costs this service is only available within the UK.
! Mail to info-server@doc.ic.ac.uk for details.  He can also write sun
! cartridge or exabyte tapes.
  
  UK sites with just anonymous FTP access are in the above list.
diff -2rcpP --exclude=*.elc emacs-19.30/etc/GNU emacs-19.31/etc/GNU
*** emacs-19.30/etc/GNU	Wed Mar 16 12:47:21 1994
--- emacs-19.31/etc/GNU	Tue Apr 30 14:25:15 1996
*************** friends or over the net.  But it does su
*** 521,525 ****
     (4)  The Free Software Foundation raises most of its funds from a
  distribution service, although it is a charity rather than a company.
! If *no one* chooses to obtain copies by ordering the from the FSF, it
  will be unable to do its work.  But this does not mean that proprietary
  restrictions are justified to force every user to pay.  If a small
--- 521,525 ----
     (4)  The Free Software Foundation raises most of its funds from a
  distribution service, although it is a charity rather than a company.
! If *no one* chooses to obtain copies by ordering from the FSF, it
  will be unable to do its work.  But this does not mean that proprietary
  restrictions are justified to force every user to pay.  If a small
diff -2rcpP --exclude=*.elc emacs-19.30/etc/LINUX-GNU emacs-19.31/etc/LINUX-GNU
*** emacs-19.30/etc/LINUX-GNU	Wed Dec 31 19:00:00 1969
--- emacs-19.31/etc/LINUX-GNU	Sun May 19 18:50:49 1996
***************
*** 0 ****
--- 1,98 ----
+ 		     Linux and the GNU system
+ 
+ The GNU project started 12 years ago with the goal of developing a
+ complete free Unix-like operating system.  "Free" refers to freedom,
+ not price; it means you are free to run, copy, distribute, study,
+ change, and improve the software.
+ 
+ A Unix-like system consists of many different programs.  We found some
+ components already available as free software--for example, X Windows
+ and TeX.  We obtained other components by helping to convince their
+ developers to make them free--for example, the Berkeley network
+ utilities.  Other components we wrote specifically for GNU--for
+ example, GNU Emacs, the GNU C compiler, the GNU C library, Bash, and
+ Ghostscript.  The components in this last category are "GNU software".
+ The GNU system consists of all three categories together.
+ 
+ The GNU project is not just about developing and distributing free
+ software.  The heart of the GNU project is an idea: that software
+ should be free, and that the users' freedom is worth defending.  For
+ if people have freedom but do not value it, they will not keep it for
+ long.  In order to make freedom last, we have to teach people to value
+ it.
+ 
+ The GNU project's method is that free software and the idea of users'
+ freedom support each other.  We develop GNU software, and as people
+ encounter GNU programs or the GNU system and start to use them, they
+ also think about the GNU idea.  The software shows that the idea can
+ work in practice.  People who come to agree with the idea are likely
+ to write additional free software.  Thus, the software embodies the
+ idea, spreads the idea, and grows from the idea.
+ 
+ This method was working well--until someone combined the Linux kernel
+ with the GNU system (which still lacked a kernel), and called the
+ combination a "Linux system."
+ 
+ The Linux kernel is a free Unix-compatible kernel written by Linus
+ Torvalds.  It was not written specifically for the GNU project, but
+ the Linux kernel and the GNU system work together well.  In fact,
+ adding Linux to the GNU system brought the system to completion: it
+ made a free Unix-compatible operating system available for use.
+ 
+ But ironically, the practice of calling it a "Linux system" undermines
+ our method of communicating the GNU idea.  At first impression, a
+ "Linux system" sounds like something completely distinct from the "GNU
+ system."  And that is what most users think it is.
+ 
+ Most introductions to the "Linux system" acknowledge the role played
+ by the GNU software components.  But they don't say that the system as
+ a whole is more or less the same GNU system that the GNU project has
+ been compiling for a decade.  They don't say that the idea of a free
+ Unix-like system originates from the GNU project.  So most users don't
+ know these things.
+ 
+ This leads many of those users to identify themselves as a separate
+ community of "Linux users", distinct from the GNU user community.
+ They use all of the GNU software; in fact, they use almost all of the
+ GNU system; but they don't think of themselves as GNU users, and they
+ may not think about the GNU idea.
+ 
+ It leads to other problems as well--even hampering cooperation on
+ software maintenance.  Normally when users change a GNU program to
+ make it work better on a particular system, they send the change to
+ the maintainer of that program; then they work with the maintainer,
+ explaining the change, arguing for it and sometimes rewriting it, to
+ get it installed.
+ 
+ But people who think of themselves as "Linux users" are more likely to
+ release a forked "Linux-only" version of the GNU program, and consider
+ the job done.  We want each and every GNU program to work "out of the
+ box" on Linux-based systems; but if the users do not help, that goal
+ becomes much harder to achieve.
+ 
+ So how should the GNU project respond?  What should we do now to
+ spread the idea that freedom for computer users is important?
+ 
+ We should continue to talk about the freedom to share and change
+ software--and to teach other users to value these freedoms.  If we
+ enjoy having a free operating system, it makes sense for us to think
+ about preserving those freedoms for the long term.  If we enjoy having
+ a variety of free software, it makes sense for to think about
+ encouraging others to write additional free software, instead of
+ additional proprietary software.
+ 
+ We should not accept the splitting of the community in two.  Instead
+ we should spread the word that "Linux systems" are variant GNU
+ systems--that users of these systems are GNU users, and that they
+ ought to consider the GNU philosophy which brought these systems into
+ existence.
+ 
+ This article is one way of doing that.  Another way is to use the
+ terms "Linux-based GNU system" (or "GNU/Linux system" or "Lignux" for
+ short) to refer to the combination of the Linux kernel and the GNU
+ system.
+ 
+ Copyright 1996 Richard Stallman
+ Verbatim copying and redistribution is permitted
+ without royalty as long as this notice is preserved.
+ 
diff -2rcpP --exclude=*.elc emacs-19.30/etc/LNEWS emacs-19.31/etc/LNEWS
*** emacs-19.30/etc/LNEWS	Sat Mar 19 02:05:06 1994
--- emacs-19.31/etc/LNEWS	Tue Dec 12 20:33:52 1995
***************
*** 1,7 ****
! This is Info file LNEWS, produced by Makeinfo-1.54 from the input file
  news.texi.
  
! This file describes the new Lisp features of Emacs version 19 as first
! released to the public.  For Lisp changes in subsequent Emacs 19
  releases, see the file NEWS.
  
--- 1,7 ----
! This is Info file LNEWS, produced by Makeinfo-1.55 from the input file
  news.texi.
  
!    This file describes the new Lisp features of Emacs version 19 as
! first released to the public.  For Lisp changes in subsequent Emacs 19
  releases, see the file NEWS.
  
*************** New Features for Files
*** 806,811 ****
       `write-file-hooks'.
  
!    * The hook `after-save-hook' runs just after a buffer has been saved
!      in its visited file.
  
     * The new function `set-default-file-modes' sets the file protection
--- 806,811 ----
       `write-file-hooks'.
  
!    * The hook `after-save-buffer-hook' runs just after a buffer has been
!      saved in its visited file.
  
     * The new function `set-default-file-modes' sets the file protection
*************** ISO Latin 1
*** 1683,1688 ****
  character set, you can arrange to use that character set as follows:
  
!      (require 'disp-table)
!      (standard-display-8bit 0 255)
  
     If you are editing buffers written in the ISO Latin 1 character set
--- 1683,1687 ----
  character set, you can arrange to use that character set as follows:
  
!      (standard-display-european 1)
  
     If you are editing buffers written in the ISO Latin 1 character set
diff -2rcpP --exclude=*.elc emacs-19.30/etc/LPF emacs-19.31/etc/LPF
*** emacs-19.30/etc/LPF	Sun Oct  2 16:56:02 1994
--- emacs-19.31/etc/LPF	Thu Jan  4 14:53:56 1996
*************** Chris Hofstader can be reached at (617) 
*** 64,68 ****
  
  (Outside the US, please send a check in US dollars on a bank 
! having a US correspondant bank, to save us check cashing fees.)
  
  Your name:
--- 64,68 ----
  
  (Outside the US, please send a check in US dollars on a bank 
! having a US correspondent bank, to save us check cashing fees.)
  
  Your name:
diff -2rcpP --exclude=*.elc emacs-19.30/etc/MACHINES emacs-19.31/etc/MACHINES
*** emacs-19.30/etc/MACHINES	Wed Nov 15 01:23:10 1995
--- emacs-19.31/etc/MACHINES	Sun Apr 28 01:51:21 1996
*************** Alliant FX/2800 (i860-alliant-bsd)
*** 69,73 ****
    Known to work with 19.26 and OS version 2.2, compiler version 1.3.
  
! Alpha (DEC) running OSF/1 (alpha-dec-osf1, alpha-dec-linux)
  
    Patches merged in 19.29.  Note that the X11 libraries on GNU/Linux systems
--- 69,73 ----
    Known to work with 19.26 and OS version 2.2, compiler version 1.3.
  
! Alpha (DEC) running OSF/1 (alpha-dec-osf1, alpha-dec-lignux)
  
    Patches merged in 19.29.  Note that the X11 libraries on GNU/Linux systems
*************** Harris Night Hawk (m68k-harris-cxux or m
*** 341,344 ****
--- 341,348 ----
    libraries has not yet been done).
  
+ Harris Power PC (powerpc-harris-powerunix)
+ 
+   Patches have been merged in 19.31.
+ 
  Honeywell XPS100 (xps100-honeywell-sysv)
  
*************** HP 9000 series 500: not supported.
*** 389,393 ****
  
  HP 9000 series 700 or 800 (Spectrum) (hppa1.0-hp-hpux or hppa1.1-hp-hpux
! 				      or ...hpux9shr)
  
    19.26 is believed to work on HPUX 9 provided you compile with GCC.
--- 393,397 ----
  
  HP 9000 series 700 or 800 (Spectrum) (hppa1.0-hp-hpux or hppa1.1-hp-hpux
! 				      or ...hpux9shr, or ...-nextstep)
  
    19.26 is believed to work on HPUX 9 provided you compile with GCC.
*************** HP 9000 series 700 or 800 (Spectrum) (hp
*** 395,398 ****
--- 399,404 ----
    on HP 9000/700 series machines running HP/UX versions 8.07 and 9.01.
  
+   Support for NextSTEP was added in 19.31.
+ 
    Use hppa1.1 for the 700 series and hppa1.0 for the 800
    series machines.  (Emacs may not actually care which one you use.)
*************** Integrated Solutions `Optimum V' (m68k-i
*** 520,524 ****
  
  Intel 386 (i386-*-isc, 		i386-*-esix,	 i386-*-bsdi2,
! 	   i386-*-xenix,	i386-*-linux,    i386-*-freebsd,
  	   i386-*-sol2.4,	i386-intsys-sysv, i386-*-sysv3,
  	   i386-*-sysv4,	i386-*-sysv4.2,
--- 526,530 ----
  
  Intel 386 (i386-*-isc, 		i386-*-esix,	 i386-*-bsdi2,
! 	   i386-*-xenix,	i386-*-lignux,    i386-*-freebsd,
  	   i386-*-sol2.4,	i386-intsys-sysv, i386-*-sysv3,
  	   i386-*-sysv4,	i386-*-sysv4.2,
*************** Intel 386 (i386-*-isc, 		i386-*-esix,	 i
*** 536,540 ****
  	i386-unknown-isc3.0 as your configuration name.
    Use i386-*-esix for Esix; Emacs runs as of version 19.6.
!   Use i386-*-linux for GNU/Linux systems; Emacs runs as of version 19.26.
    Use i386-intsys-sysv for Integrated Solutions 386 machines.
    It may also be correct for Microport systems.
--- 542,546 ----
  	i386-unknown-isc3.0 as your configuration name.
    Use i386-*-esix for Esix; Emacs runs as of version 19.6.
!   Use i386-*-lignux for GNU/Linux systems; Emacs runs as of version 19.26.
    Use i386-intsys-sysv for Integrated Solutions 386 machines.
    It may also be correct for Microport systems.
*************** Intel 386 (i386-*-isc, 		i386-*-esix,	 i
*** 584,588 ****
    There is no problem if you compile with GCC.
      
!   Note that use on Linux with GCC 2.4 and the DLL 4.4 libraries
    requires the experimental "net 2" network patches (no relation to
    Berkeley Net 2).  There is a report that (some version of) Linux
--- 590,594 ----
    There is no problem if you compile with GCC.
      
!   Note that use of Linux with GCC 2.4 and the DLL 4.4 libraries
    requires the experimental "net 2" network patches (no relation to
    Berkeley Net 2).  There is a report that (some version of) Linux
*************** NCR Tower 32 (m68k-ncr-sysv2 or m68k-ncr
*** 736,739 ****
--- 742,751 ----
    under System V release 2.
  
+ NCR Intel system (i386-ncr-sysv4.2)
+ 
+   This system works in 19.31, but if you don't link it with GNU ld,
+   you may need to set LD_RUN_PATH at link time to specify where
+   to find the X libraries.
+ 
  NeXT (m68k-next-nextstep)
  
*************** Paragon OSF/1 (i860-intel-osf1)
*** 765,769 ****
  
    There is a bug in OSF/1 make which claims there is a syntax error
!   in the src/xmakefile.  You can sucessfully build emacs with:
  
          pmake MAKE=pmake
--- 777,781 ----
  
    There is a bug in OSF/1 make which claims there is a syntax error
!   in the src/xmakefile.  You can successfully build emacs with:
  
          pmake MAKE=pmake
*************** Sun 3, Sun 4 (sparc), Sun 386 (m68k-sun-
*** 896,900 ****
    used by default on SunOS 4.1.
    
!   A user reported unreproducible segmentation faults when using 19.29
    on Solaris 2.3 and 2.4 after compiling it with the Sun compiler.
    The problem went away when GCC 2.7.0 was used instead.  We do not know
--- 908,912 ----
    used by default on SunOS 4.1.
    
!   A user reported irreproducible segmentation faults when using 19.29
    on Solaris 2.3 and 2.4 after compiling it with the Sun compiler.
    The problem went away when GCC 2.7.0 was used instead.  We do not know
*************** Esix
*** 1097,1100 ****
--- 1109,1133 ----
    Window libraries that /usr/X386/lib appears *first* in the
    LD_LIBRARY_PATH.  Then define C_SWITCH_X_SYSTEM -I/usr/X386/include.
+ 
+ Lignux
+ 
+   Most of the complete systems which use the Linux kernel are close
+   enough to the GNU system that could be considered variants of the
+   GNU system.  We use the term "Lignux" to refer to this combination
+   of the Linux kernel with the GNU system: they are "Linux-based GNU
+   systems," or "Lignux" for short.
+ 
+   It is not coincidence that many of the other components used with
+   Linux--including GNU Emacs--were developed specifically for the GNU
+   project.  The GNU project was launched in 1984 to develop a free
+   complete Unix-like operating system.  To reach this goal, we had to
+   develop whatever system components were not available as freely
+   redistributable software from some other source.
+ 
+   The GNU project wants users of Lignux systems to be aware of how
+   these systems relate to the GNU project, because that will help
+   spread the GNU idea that software should be free--and thus encourage
+   people to write more free software.  See the file LINUX-GNU in this
+   directory for more explanation.
  
  Microport
diff -2rcpP --exclude=*.elc emacs-19.30/etc/MAILINGLISTS emacs-19.31/etc/MAILINGLISTS
*** emacs-19.30/etc/MAILINGLISTS	Tue Aug 15 16:57:28 1995
--- emacs-19.31/etc/MAILINGLISTS	Thu May 23 20:05:27 1996
***************
*** 1,3 ****
!      GNU Project Electronic Mailing Lists.  Last Updated 15 Aug 95
  
  	   Please report improvements to: gnu@prep.ai.mit.edu
--- 1,3 ----
!      GNU Project Electronic Mailing Lists.  Last Updated 4 Mar 96
  
  	   Please report improvements to: gnu@prep.ai.mit.edu
*************** have been sent to another list.
*** 207,213 ****
  See section '* General Information about info-* lists'.
  
! * gnu-misc-discuss-request@cis.ohio-state.edu to subscribe to gnu-misc-discuss
  ** gnUSENET newsgroup: gnu.misc.discuss
! ** Send contributions to: gnu-misc-discuss@cis.ohio-state.edu
  
  This list is for serious discussion of freed software, the GNU
--- 207,213 ----
  See section '* General Information about info-* lists'.
  
! * gnu-misc-discuss-request@prep.ai.mit.edu to subscribe to gnu-misc-discuss
  ** gnUSENET newsgroup: gnu.misc.discuss
! ** Send contributions to: gnu-misc-discuss@prep.ai.mit.edu
  
  This list is for serious discussion of freed software, the GNU
*************** Announcements of new releases of libg++ 
*** 586,591 ****
  bug-lib-g++.
  
! There are no other GNU mailing lists or gnUSENET newsgroups for the G++
! Library.
  
  See section '* General Information about bug-* lists and reporting
--- 586,591 ----
  bug-lib-g++.
  
! There are no other GNU mailing lists or gnUSENET newsgroups for GNU's
! G++ Library.
  
  See section '* General Information about bug-* lists and reporting
*************** See section '* General Information about
*** 624,627 ****
--- 624,680 ----
  program bugs'.
  
+ * bug-gmp-request@prep.ai.mit.edu to subscribe to bug-gmp
+ ** gnUSENET newsgroup: NONE PLANNED
+ ** gmp bug reports to: bug-gmp@prep.ai.mit.edu
+ 
+ This list distributes, to the active maintainers of gmp (the GNU
+ Multiple Precision Library), bug reports and fixes for, and suggestions
+ for improvements to gmp.  User discussion of gmp also occurs here.
+ 
+ There are no other GNU mailing lists or gnUSENET newsgroups for gmp .
+ 
+ See section '* General Information about bug-* lists and reporting
+ program bugs'.
+ 
+ * bug-pine-request@prep.ai.mit.edu to subscribe to bug-pine
+ ** gnUSENET newsgroup: NONE PLANNED
+ ** pine bug reports to: bug-pine@prep.ai.mit.edu
+ 
+ This list distributes, to the active maintainers of pine (the GNU
+ version of the pine mail reader), bug reports and fixes for, and suggestions
+ for improvements to pine.  User discussion of pine also occurs here.
+ 
+ There are no other GNU mailing lists or gnUSENET newsgroups for pine .
+ 
+ See section '* General Information about bug-* lists and reporting
+ program bugs'.
+ 
+ * bug-cfengine-request@prep.ai.mit.edu to subscribe to bug-cfengine
+ ** gnUSENET newsgroup: NONE PLANNED
+ ** cfengine bug reports to: bug-cfengine@prep.ai.mit.edu
+ 
+ This list distributes, to the active maintainers of cfengine (configure
+ BSD and System-5-like operating systems attached to a TCP/IP network),
+ bug reports and fixes for, and suggestions for improvements to cfengine.
+ User discussion of cfengine also occurs here.
+ 
+ There are no other GNU mailing lists or gnUSENET newsgroups for cfengine .
+ 
+ See section '* General Information about bug-* lists and reporting
+ program bugs'.
+ 
+ * bug-guile-request@prep.ai.mit.edu to subscribe to bug-guile
+ ** gnUSENET newsgroup: NONE PLANNED
+ ** GUILE BUG reports to: bug-guile@prep.ai.mit.edu
+ 
+ This list distributes, to the active maintainers of GUILE (GNU's
+ Ubiquitous Extension Language), bug reports and fixes for, and suggestions for
+ improvements to GUILE.  User discussion of GUILE also occurs here.
+ 
+ There are no other GNU mailing lists or gnUSENET newsgroups for GUILE .
+ 
+ See section '* General Information about bug-* lists and reporting
+ program bugs'.
+ 
  * bug-gnu-smalltalk-request@prep.ai.mit.edu to subscribe to bug-gnu-smalltalk
  ** gnUSENET newsgroup: gnu.smalltalk.bug
*************** English and Japanese are the official la
*** 766,772 ****
  quite different than gnews.
  
! * info-gnus-english-request@cis.ohio-state.edu  to subscribe
  ** gnUSENET newsgroup: gnu.emacs.gnus
! ** Send contributions to: info-gnus-english@cis.ohio-state.edu
  
  The list has the same charter as info-gnus.  The difference is that
--- 819,825 ----
  quite different than gnews.
  
! * info-gnus-english-request@prep.ai.mit.edu  to subscribe
  ** gnUSENET newsgroup: gnu.emacs.gnus
! ** Send contributions to: info-gnus-english@prep.ai.mit.edu
  
  The list has the same charter as info-gnus.  The difference is that
diff -2rcpP --exclude=*.elc emacs-19.30/etc/NEWS emacs-19.31/etc/NEWS
*** emacs-19.30/etc/NEWS	Sat Nov 25 01:00:25 1995
--- emacs-19.31/etc/NEWS	Wed May 15 10:51:58 1996
***************
*** 1,4 ****
! GNU Emacs NEWS -- history of user-visible changes.  24 Nov 1995
! Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc.
  See the end for copying conditions.
  
--- 1,4 ----
! GNU Emacs NEWS -- history of user-visible changes.  15 May 1996
! Copyright (C) 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
  See the end for copying conditions.
  
*************** Please send Emacs bug reports to bug-gnu
*** 6,9 ****
--- 6,498 ----
  For older news, see the file ONEWS.
  
+ * Editing Changes in Emacs 19.31
+ 
+ ** Freedom of the press restricted in the United States.
+ 
+ Emacs has been censored in accord with the Communications Decency Act.
+ This includes removing some features of the doctor program.  That law
+ was described by its supporters as a ban on pornography, but it bans
+ far more than that.  The Emacs distribution has never contained any
+ pornography, but parts of it were nonetheless prohibited.
+ 
+ For information on US government censorship of the Internet, and what
+ you can do to bring back freedom of the press, see the web site
+ `http://www.vtw.org/'.
+ 
+ ** A note about C mode indentation customization.
+ 
+ The old (Emacs 19.29) ways of specifying a C indentation style
+ do not normally work in the new implementation of C mode.
+ It has its own methods of customizing indentation, which are
+ much more powerful than the old C mode.  See the Editing Programs
+ chapter of the manual for details.
+ 
+ However, you can load the library cc-compat to make the old
+ customization variables take effect.
+ 
+ ** Marking with the mouse.
+ 
+ When you mark a region with the mouse, the region now remains
+ highlighted until the next input event, regardless of whether you are
+ using M-x transient-mark-mode.
+ 
+ ** Improved Windows NT/95 support.
+ 
+ *** Emacs now supports scroll bars on Windows NT and Windows 95.
+ 
+ *** Emacs now supports subprocesses on Windows 95.  (Subprocesses used
+ to work on NT only and not on 95.)
+ 
+ *** There are difficulties with subprocesses, though, due to problems
+ in Windows, beyond the control of Emacs.  They work fine as long as
+ you run Windows applications.  The problems arise when you run a DOS
+ application in a subprocesses.  Since current shells run as DOS
+ applications, these problems are significant.
+ 
+ If you run a DOS application in a subprocess, then the application is
+ likely to busy-wait, which means that your machine will be 100% busy.
+ However, if you don't mind the temporary heavy load, the subprocess
+ will work ok as long as you tell it to terminate before you start any
+ other DOS application as a subprocess.
+ 
+ Emacs is unable to terminate or interrupt a DOS subprocess.
+ You have to do this by providing input directly to the subprocess.
+ 
+ If you run two DOS applications at the same time in two separate
+ subprocesses, even if one of them is asynchronous, you will probably
+ have to reboot your machine--until then, it will remain 100% busy.
+ Windows simply does not cope when one Windows process tries to run two
+ separate DOS subprocesses.  Typing CTL-ALT-DEL and then choosing
+ Shutdown seems to work although it may take a few minutes.
+ 
+ ** M-x resize-minibuffer-mode.
+ 
+ This command, not previously mentioned in NEWS, toggles a mode in
+ which the minibuffer window expands to show as many lines as the
+ minibuffer contains.
+ 
+ ** `title' frame parameter and resource.
+ 
+ The `title' X resource now specifies just the frame title, nothing else.
+ It does not affect the name used for looking up other X resources.
+ It works by setting the new `title' frame paramaeter, which likewise
+ affects just the displayed title of the frame.
+ 
+ The `name' parameter continues to do what it used to do:
+ it specifies the frame name for looking up X resources,
+ and also serves as the default for the displayed title
+ when the `title' parameter is unspecified or nil.
+ 
+ ** Emacs now uses the X toolkit by default, if you have a new
+ enough version of X installed (X11R5 or newer).
+ 
+ ** When you compile Emacs with the Motif widget set, Motif handles the
+ F10 key by activating the menu bar.  To avoid confusion, the usual
+ Emacs binding of F10 is replaced with a no-op when using Motif.
+ 
+ If you want to be able to use F10 in Emacs, you can rebind the Motif
+ menubar to some other key which you don't use.  To do so, add
+ something like this to your X resources file.  This example rebinds
+ the Motif menu bar activation key to S-F12:
+ 
+    Emacs*defaultVirtualBindings:  osfMenuBar : Shift<Key>F12
+ 
+ ** In overwrite mode, DEL now inserts spaces in most cases
+ to replace the characters it "deletes".
+ 
+ ** The Rmail summary now shows the number of lines in each message.
+ 
+ ** Rmail has a new command M-x unforward-rmail-message, which extracts
+ a forwarded message from the message that forwarded it.  To use it,
+ select a message which contains a forwarded message and then type the command.
+ It inserts the forwarded message as a separate Rmail message
+ immediately after the selected one.
+ 
+ This command also undoes the textual modifications that are standardly
+ made, as part of forwarding, by Rmail and other mail reader programs.
+ 
+ ** Turning off saving of .saves-... files in your home directory.
+ 
+ Each Emacs session writes a file named .saves-... in your home
+ directory to record which files M-x recover-session should recover.
+ If you exit Emacs normally with C-x C-c, it deletes that file.  If
+ Emacs or the operating system crashes, the file remains for M-x
+ recover-session.
+ 
+ You can turn off the writing of these files by setting
+ auto-save-list-file-name to nil.  If you do this, M-x recover-session
+ will not work.
+ 
+ Some previous Emacs versions failed to delete these files even on
+ normal exit.  This is fixed now.  If you are thinking of turning off
+ this feature because of past experiences with versions that had this
+ bug, it would make sense to check whether you still want to do so
+ now that the bug is fixed.
+ 
+ ** Changes to Version Control (VC)
+ 
+ There is a new variable, vc-follow-symlinks.  It indicates what to do
+ when you visit a link to a file that is under version control.
+ Editing the file through the link bypasses the version control system,
+ which is dangerous and probably not what you want.
+ 
+ If this variable is t, VC follows the link and visits the real file,
+ telling you about it in the echo area.  If it is `ask' (the default),
+ VC asks for confirmation whether it should follow the link.  If nil,
+ the link is visited and a warning displayed.
+ 
+ ** iso-acc.el now lets you specify a choice of language.
+ Languages include "latin-1" (the default) and "latin-2" (which
+ is designed for entering ISO Latin-2 characters).
+ 
+ There are also choices for specific human languages such as french and
+ portuguese.  These are subsets of Latin-1, which differ in that they
+ enable only the accent characters needed for particular language.
+ The other accent characters, not needed for the chosen language,
+ remain normal.
+ 
+ ** Posting articles and sending mail now has M-TAB completion on various
+ header fields (Newsgroups, To, CC, ...).
+ 
+ Completion in the Newsgroups header depends on the list of groups
+ known to your news reader.  Completion in the Followup-To header
+ offers those groups which are in the Newsgroups header, since
+ Followup-To usually just holds one of those.
+ 
+ Completion in fields that hold mail addresses works based on the list
+ of local users plus your aliases.  Additionally, if your site provides
+ a mail directory or a specific host to use for any unrecognized user
+ name, you can arrange to query that host for completion also.  (See the
+ documentation of variables `mail-directory-process' and
+ `mail-directory-stream'.)
+ 
+ ** A greatly extended sgml-mode offers new features such as (to be configured)
+ skeletons with completing read for tags and attributes, typing named
+ characters including optionally all 8bit characters, making tags invisible
+ with optional alternate display text, skipping and deleting tag(pair)s
+ 
+ Note: since Emacs' syntax feature cannot limit the special meaning of ', " and
+ - to inside <>, for some texts the result, especially of font locking, may be
+ wrong (see `sgml-specials' if you get wrong results).
+ 
+ The derived html-mode configures this with tags and attributes more or
+ less HTML3ish.  It also offers optional quick keys like C-c 1 for
+ headline or C-c u for unordered list (see `html-quick-keys').  Edit /
+ Text Properties / Face or M-g combinations create tags as applicable.
+ Outline minor mode is supported and level 1 font-locking tries to
+ fontify tag contents (which only works when they fit on one line due
+ to a limitation in font-lock).
+ 
+ External viewing via browse-url can occur automatically upon saving.
+ 
+ ** M-x imenu-add-to-menubar now adds to the menu bar for the current
+ buffer only.  If you want to put an Imenu item in the menu bar for all
+ buffers that use a particular major mode, use the mode hook, as in
+ this example:
+ 
+     (add-hook 'emacs-lisp-mode-hook
+ 	      '(lambda () (imenu-add-to-menubar "Index")))
+ 
+ ** Changes in BibTeX mode.
+ 
+ *** Field names may now contain digits, hyphens, and underscores.
+ 
+ *** Font Lock mode is now supported.
+ 
+ *** bibtex-make-optional-field is no longer interactive.
+ 
+ *** If bibtex-maintain-sorted-entries is non-nil, inserting new
+ entries is now done with a faster algorithm.  However, inserting
+ will fail in this case if the buffer contains invalid entries or
+ isn't in sorted order, so you should finish each entry with C-c C-c
+ (bibtex-close-entry) after you have inserted or modified it.
+ The default value of bibtex-maintain-sorted-entries is nil.
+ 
+ *** Function `show-all' is no longer bound to a key, since C-u C-c C-q
+ does the same job.
+ 
+ *** Entries with quotes inside quote-delimited fields (as `author =
+ "Stefan Sch{\"o}f"') are now supported.
+ 
+ *** Case in field names doesn't matter anymore when searching for help
+ text.
+ 
+ ** Font Lock mode
+ 
+ *** Global Font Lock mode
+ 
+ Font Lock mode can be turned on globally, in buffers that support it, by the
+ new command global-font-lock-mode.  You can use the new variable
+ font-lock-global-modes to control which modes have Font Lock mode automagically
+ turned on.  By default, this variable is set so that Font Lock mode is turned
+ on globally where the buffer mode supports it.
+ 
+ For example, to automagically turn on Font Lock mode where supported, put:
+ 
+  (global-font-lock-mode t)
+ 
+ in your ~/.emacs.
+ 
+ *** Local Refontification
+ 
+ In Font Lock mode, editing a line automatically refontifies that line only.
+ However, if your change alters the syntactic context for following lines,
+ those lines remain incorrectly fontified.  To refontify them, use the new
+ command M-g M-g (font-lock-fontify-block).
+ 
+ In certain major modes, M-g M-g refontifies the entire current function.
+ (The variable font-lock-mark-block-function controls how to find the
+ current function.)  In other major modes, M-g M-g refontifies 16 lines
+ above and below point.
+ 
+ With a prefix argument N, M-g M-g refontifies N lines above and below point.
+ 
+ ** Follow mode
+ 
+ Follow mode is a new minor mode combining windows showing the same
+ buffer into one tall "virtual window".  The windows are typically two
+ side-by-side windows.  Follow mode makes them scroll together as if
+ they were a unit.  To use it, go to a frame with just one window,
+ split it into two side-by-side windows using C-x 3, and then type M-x
+ follow-mode.
+ 
+ M-x follow-mode turns off Follow mode if it is already enabled.
+ 
+ To display two side-by-side windows and activate Follow mode, use the
+ command M-x follow-delete-other-windows-and-split.
+ 
+ ** hide-show changes.
+ 
+ The hooks hs-hide-hooks and hs-show-hooks have been renamed
+ to hs-hide-hook and hs-show-hook. to follow the convention for
+ normal hooks.
+ 
+ ** Simula mode now has a menu containing the most important commands.
+ The new command simula-indent-exp is bound to C-M-q.
+ 
+ ** etags can now handle programs written in Erlang.  Files are
+ recognised by the extensions .erl and .hrl.  The tagged lines are
+ those that begin a function, record, or macro.
+ 
+ ** MSDOS Changes
+ 
+ *** It works now to compile Emacs with the version 2 of DJGPP.
+ Compilation with DJGPP version 1 also still works.
+ 
+ *** The documentation of DOS-specific aspects of Emacs was rewritten
+ and expanded; see the ``MS-DOS'' node in the on-line docs.
+ 
+ *** Emacs now uses ~ for backup file names, not .bak.
+ 
+ *** You can simulate mouse-3 on two-button mice by simultaneously
+ pressing both mouse buttons.
+ 
+ *** A number of packages and commands which previously failed or had
+ restricted functionality on MS-DOS, now work.  The most important ones
+ are: 
+ 
+ **** Printing (both with `M-x lpr-buffer' and with `ps-print' package)
+ now works.
+ 
+ **** `Ediff' works (in a single-frame mode).
+ 
+ **** `M-x display-time' can be used on MS-DOS (due to the new
+ implementation of Emacs timers, see below).
+ 
+ **** `Dired' supports Unix-style shell wildcards.
+ 
+ **** The `c-macro-expand' command now works as on other platforms.
+ 
+ **** `M-x recover-session' works.
+ 
+ **** `M-x list-colors-display' displays all the available colors.
+ 
+ **** The `TPU-EDT' package works.
+ 
+ * Lisp changes in Emacs 19.31.
+ 
+ ** The function using-unix-filesystems on Windows NT and Windows 95
+ tells Emacs to read and write files assuming that they reside on a
+ remote Unix filesystem.  No CR/LF translation is done on any files in
+ this case.  Invoking using-unix-filesystems with t actives this
+ behavior, and invoking it with any other value deactivates it.
+ 
+ ** Change in system-type and system-configuration values.
+ 
+ The value of system-type on a Linux-based GNU system is now `lignux',
+ not `linux'.  This means that some programs which use `system-type'
+ need to be changed.  The value of `system-configuration' will also
+ be different.
+ 
+ It is generally recommended to use `system-configuration' rather
+ than `system-type'.
+ 
+ See the file LINUX-GNU in this directory for more about this.
+ 
+ ** The functions shell-command and dired-call-process
+ now run file name handlers for default-directory, if it has them.
+ 
+ ** Undoing the deletion of text now restores the positions of markers
+ that pointed into or next to the deleted text.
+ 
+ ** Timers created with run-at-time now work internally to Emacs, and
+ no longer use a separate process.  Therefore, they now work more
+ reliably and can be used for shorter time delays.
+ 
+ The new function run-with-timer is a convenient way to set up a timer
+ to run a specified amount of time after the present.  A call looks
+ like this:
+ 
+   (run-with-timer SECS REPEAT FUNCTION ARGS...)
+ 
+ SECS says how many seconds should elapse before the timer happens.
+ It may be an integer or a floating point number.  When the timer
+ becomes ripe, the action is to call FUNCTION with arguments ARGS.
+ 
+ REPEAT gives the interval for repeating the timer (measured in
+ seconds).  It may be an integer or a floating point number.  nil or 0
+ means don't repeat at all--call FUNCTION just once.
+ 
+ *** with-timeout provides an easy way to do something but give
+ up if too much time passes.
+ 
+   (with-timeout (SECONDS TIMEOUT-FORMS...) BODY...)
+ 
+ This executes BODY, but gives up after SECONDS seconds.
+ If it gives up, it runs the TIMEOUT-FORMS and returns the value
+ of the last one of them.  Normally it returns the value of the last
+ form in BODY.
+ 
+ *** You can now arrange to call a function whenever Emacs is idle for
+ a certain length of time.  To do this, call run-with-idle-timer.  A
+ call looks like this:
+ 
+   (run-with-idle-timer SECS REPEAT FUNCTION ARGS...)
+ 
+ SECS says how many seconds of idleness should elapse before the timer
+ happens.  It may be an integer or a floating point number.  When the
+ timer becomes ripe, the action is to call FUNCTION with arguments
+ ARGS.
+ 
+ REPEAT, if non-nil, means this timer should be activated again each
+ time Emacs becomes idle.  If REPEAT is nil, the timer runs just once,
+ the first time Emacs is idle for SECS seconds.
+ 
+ *** post-command-idle-hook is now obsolete; you shouldn't use it at
+ all, because it interferes with the idle timer mechanism.  If your
+ programs use post-command-idle-hook, convert them to use idle timers
+ instead.
+ 
+ *** y-or-n-p-with-timeout lets you ask a question but give up if
+ there is no answer within a certain time.
+ 
+   (y-or-n-p-with-timeout PROMPT SECONDS DEFAULT-VALUE)
+ 
+ asks the question PROMPT (just like y-or-n-p).  If the user answers
+ within SECONDS seconds, it returns the answer that the user gave.
+ Otherwise it gives up after SECONDS seconds, and returns DEFAULT-VALUE.
+ 
+ ** Minor change to `encode-time': you can now pass more than seven
+ arguments.  If you do that, the first six arguments have the usual
+ meaning, the last argument is interpreted as the time zone, and the
+ arguments in between are ignored.
+ 
+ This means that it works to use the list returned by `decode-time' as
+ the list of arguments for `encode-time'.
+ 
+ ** The default value of load-path now includes the directory
+ /usr/local/share/emacs/VERSION/site-lisp In addition to
+ /usr/local/share/emacs/site-lisp.  You can use this new directory for
+ site-specific Lisp packages that belong with a particular Emacs
+ version.
+ 
+ It is not unusual for a Lisp package that works well in one Emacs
+ version to cause trouble in another.  Sometimes packages need updating
+ for incompatible changes; sometimes they look at internal data that
+ has changed; sometimes the package has been installed in Emacs itself
+ and the installed version should be used.  Whatever the reason for the
+ problem, this new feature makes it easier to solve.
+ 
+ ** When your program contains a fixed file name (like .completions or
+ .abbrev.defs), the file name usually needs to be different on operating
+ systems with limited file name syntax.
+ 
+ Now you can avoid ad-hoc conditionals by using the function
+ convert-standard-filename to convert the file name to a proper form
+ for each operating system.  Here is an example of use, from the file
+ completions.el:
+ 
+ (defvar save-completions-file-name
+         (convert-standard-filename "~/.completions")
+   "*The filename to save completions to.")
+ 
+ This sets the variable save-completions-file-name to a value that
+ depends on the operating system, because the definition of
+ convert-standard-filename depends on the operating system.  On
+ Unix-like systems, it returns the specified file name unchanged.  On
+ MS-DOS, it adapts the name to fit the limitations of that system.
+ 
+ ** The interactive spec N now returns the numeric prefix argument
+ rather than the raw prefix argument.  (It still reads a number using the
+ minibuffer if there is no prefix argument at all.)
+ 
+ ** When a process is deleted, this no longer disconnects the process
+ marker from its buffer position.
+ 
+ ** The variable garbage-collection-messages now controls whether
+ Emacs displays a message at the beginning and end of garbage collection.
+ The default is nil, meaning there are no messages.
+ 
+ ** The variable debug-ignored-errors specifies certain kinds of errors
+ that should not enter the debugger.  Its value is a list of error
+ condition symbols and/or regular expressions.  If the error has any
+ of the condition symbols listed, or if any of the regular expressions
+ matches the error message, then that error does not enter the debugger,
+ regardless of the value of debug-on-error.
+ 
+ This variable is initialized to match certain common but uninteresting
+ errors that happen often during editing.
+ 
+ ** The new function error-message-string converts an error datum
+ into its error message.  The error datum is what condition-case
+ puts into the variable, to describe the error that happened.
+ 
+ ** Anything that changes which buffer appears in a given window
+ now runs the window-scroll-functions for that window.
+ 
+ ** The new function get-buffer-window-list returns a list of windows displaying
+ a buffer.  The function is called with the buffer (a buffer object or a buffer
+ name) and two optional arguments specifying the minibuffer windows and frames
+ to search.  Therefore this function takes optional args like next-window etc.,
+ and not get-buffer-window.
+ 
+ ** buffer-substring now runs the hook buffer-access-fontify-functions,
+ calling each function with two arguments--the range of the buffer
+ being accessed.  buffer-substring-no-properties does not call them.
+ 
+ If you use this feature, you should set the variable
+ buffer-access-fontified-property to a non-nil symbol, which is a
+ property name.  Then, if all the characters in the buffer range have a
+ non-nil value for that property, the buffer-access-fontify-functions
+ are not called.  When called, these functions should put a non-nil
+ property on the text that they fontify, so that they won't get called
+ over and over for the same text.
+ 
+ ** Changes in lisp-mnt.el
+ 
+ *** The lisp-mnt package can now recognize file headers that are written
+ in the formats used by the `what' command and the RCS `ident' command:
+ 
+ ;; @(#) HEADER: text
+ ;; $HEADER: text $
+ 
+ in addition to the normal
+ 
+ ;; HEADER: text
+ 
+ *** The commands lm-verify and lm-synopsis are now interactive.  lm-verify
+ checks that the library file has proper sections and headers, and
+ lm-synopsis extracts first line "synopsis'"information.
+ 
  * Editing Changes in Emacs 19.30.
  
*************** You can turn the feature off by setting 
*** 32,36 ****
  ** The menu bar is now visible on text-only terminals.  To choose a
  command from the menu bar when you have no mouse, type M-`
! (Meta-Backquote) or F10.
  
  ** Whenever you invoke a minibuffer, it appears in the minibuffer
--- 521,526 ----
  ** The menu bar is now visible on text-only terminals.  To choose a
  command from the menu bar when you have no mouse, type M-`
! (Meta-Backquote) or F10.  To turn off menu bar display,
! do (menu-bar-mode -1).
  
  ** Whenever you invoke a minibuffer, it appears in the minibuffer
*************** version.  Code that relies heavily on Gn
*** 118,122 ****
  fail, though.
  
! *** Incompatabilities with the old GNUS.
  
  **** All interactive commands have kept their names, but many internal
--- 608,612 ----
  fail, though.
  
! *** Incompatibilities with the old GNUS.
  
  **** All interactive commands have kept their names, but many internal
*************** element < no longer exists, ' is a new e
*** 442,446 ****
  
  ** The autoinsert insert facility for prefilling empty files as soon
! as they are found has been extended to accomodate skeletons or calling
  functions.  See the function auto-insert.
  
--- 932,936 ----
  
  ** The autoinsert insert facility for prefilling empty files as soon
! as they are found has been extended to accommodate skeletons or calling
  functions.  See the function auto-insert.
  
*************** room for more); to overcome this limitat
*** 492,499 ****
      set SUSPEND=%COMSPEC% /E:2000
  
! ** The escape character can now be displayed (as a tiny left arrow)
! on X window frames.  Try this:
      (aset standard-display-table 27 (vector 27))
! after first creating a display table.
  
  ** The new command-line option --eval specifies an expression to evaluate
--- 982,990 ----
      set SUSPEND=%COMSPEC% /E:2000
  
! ** The escape character can now be displayed on X frames.  Try
! this:
      (aset standard-display-table 27 (vector 27))
! after first creating a display table (you can do that by loading
! the disp-table library).
  
  ** The new command-line option --eval specifies an expression to evaluate
*************** and use Mouse-3, Mouse-3 uses the positi
*** 823,827 ****
  even if it has scrolled off the screen (and point is no longer there).
  This makes it easier to select a region with the mouse which is bigger
! than a screenfull.
  
  Any editing of the buffer, and any cursor motion or scrolling for any
--- 1314,1318 ----
  even if it has scrolled off the screen (and point is no longer there).
  This makes it easier to select a region with the mouse which is bigger
! than a screenful.
  
  Any editing of the buffer, and any cursor motion or scrolling for any
*************** c-basic-offset respectively.
*** 1027,1031 ****
  
  *** New variable, c-recognize-knr-p, which controls whether K&R C
! contructs will be recognized.  Trying to recognize K&R constructs is a
  time hog so if you're programming strictly in ANSI C, set this
  variable to nil (it should already be nil in c++-mode).
--- 1518,1522 ----
  
  *** New variable, c-recognize-knr-p, which controls whether K&R C
! constructs will be recognized.  Trying to recognize K&R constructs is a
  time hog so if you're programming strictly in ANSI C, set this
  variable to nil (it should already be nil in c++-mode).
*************** the default host address for initializin
*** 1397,1418 ****
  It is used instead of the value of (system-name).
  
! Lisp-Level Changes in Emacs 19.29
  
! * Basic Lisp
  
! ** The range of integer values is now at least 2**28 on all machines.
  This means the maximum size of a buffer is at least 2**27-1,
  or 134,217,727.
  
! ** You can now use Common Lisp syntax for the backquote and comma
  macros.  Thus, you can now write `(x ,y z) instead of (` (x (, y) z)).
  
  The old syntax is still accepted.
  
! ** The new function rassoc is like assoc, except that it compares the
  key against the cdr of each alist element, where assoc would compare
  it against the car of each alist element.
  
! ** The new function unintern deletes a symbol from an obarray.  The
  first argument can be the symbol to delete, or a string giving its
  name.  The second argument specifies the obarray (nil means the
--- 1888,1909 ----
  It is used instead of the value of (system-name).
  
! * Lisp-Level Changes in Emacs 19.29
  
! ** Basic Lisp
  
! *** The range of integer values is now at least 2**28 on all machines.
  This means the maximum size of a buffer is at least 2**27-1,
  or 134,217,727.
  
! *** You can now use Common Lisp syntax for the backquote and comma
  macros.  Thus, you can now write `(x ,y z) instead of (` (x (, y) z)).
  
  The old syntax is still accepted.
  
! *** The new function rassoc is like assoc, except that it compares the
  key against the cdr of each alist element, where assoc would compare
  it against the car of each alist element.
  
! *** The new function unintern deletes a symbol from an obarray.  The
  first argument can be the symbol to delete, or a string giving its
  name.  The second argument specifies the obarray (nil means the
*************** in the obarray matching the specified st
*** 1423,1432 ****
  and returns nil.  If it does delete a symbol, it returns t.
  
! ** You can specify an alternative read function for use by load and
  eval-region by binding the variable load-read-function to some other
  function.  This function should accept one argument just like read.
  If load-read-function is nil, load and eval-region use ordinary read.
  
! ** The new function `type-of' takes any object as argument, and
  returns a symbol identifying the type of that object--one of `symbol',
  `integer', `float', `string', `cons', `vector', `marker', `overlay',
--- 1914,1923 ----
  and returns nil.  If it does delete a symbol, it returns t.
  
! *** You can specify an alternative read function for use by load and
  eval-region by binding the variable load-read-function to some other
  function.  This function should accept one argument just like read.
  If load-read-function is nil, load and eval-region use ordinary read.
  
! *** The new function `type-of' takes any object as argument, and
  returns a symbol identifying the type of that object--one of `symbol',
  `integer', `float', `string', `cons', `vector', `marker', `overlay',
*************** returns a symbol identifying the type of
*** 1434,1438 ****
  `window-configuration', `process'.
  
! ** When you use eval-after-load for a file that is already loaded, it
  executes the FORM right away.  As before, if the file is not yet
  loaded, it arranges to execute FORM if and when the file is loaded
--- 1925,1929 ----
  `window-configuration', `process'.
  
! *** When you use eval-after-load for a file that is already loaded, it
  executes the FORM right away.  As before, if the file is not yet
  loaded, it arranges to execute FORM if and when the file is loaded
*************** and if that file has been loaded, then r
*** 1441,1445 ****
  these two events, the specified form has been evaluated.
  
! ** The Lisp construct #@NUMBER now skips the next NUMBER characters,
  treating them as a comment.
  
--- 1932,1936 ----
  these two events, the specified form has been evaluated.
  
! *** The Lisp construct #@NUMBER now skips the next NUMBER characters,
  treating them as a comment.
  
*************** You would not want to use this in a file
*** 1447,1451 ****
  useful for commenting out parts of machine-generated files.
  
! ** Two new functions, `plist-get' and `plist-put',
  allow you to modify and retrieve values from lists formatted as property-lists.
  They work like `get' and `put', but operate on any list.
--- 1938,1942 ----
  useful for commenting out parts of machine-generated files.
  
! *** Two new functions, `plist-get' and `plist-put',
  allow you to modify and retrieve values from lists formatted as property-lists.
  They work like `get' and `put', but operate on any list.
*************** They work like `get' and `put', but oper
*** 1453,1457 ****
  back where you got it.
  
! ** The new function add-to-list is called with two elements,
  a variable that holds a list and a new element.
  It adds the element to the list unless it is already present.
--- 1944,1948 ----
  back where you got it.
  
! *** The new function add-to-list is called with two elements,
  a variable that holds a list and a new element.
  It adds the element to the list unless it is already present.
*************** It compares elements using `equal'.  Her
*** 1466,1470 ****
  foo => (c a b)
  
! * Changes in compilation.
  
  Functions and variables loaded from a byte-compiled file
--- 1957,1961 ----
  foo => (c a b)
  
! ** Changes in compilation.
  
  Functions and variables loaded from a byte-compiled file
*************** globally, or for one source file by addi
*** 1517,1523 ****
      -*-byte-compile-dynamic-docstrings: nil;-*-
  
! * Strings
  
! ** Do not pass integer arguments to `concat' (or `vconcat' or
  `append').  We are phasing out the old unrecommended support for
  integers as arguments to these functions, in preparation for treating
--- 2008,2014 ----
      -*-byte-compile-dynamic-docstrings: nil;-*-
  
! ** Strings
  
! *** Do not pass integer arguments to `concat' (or `vconcat' or
  `append').  We are phasing out the old unrecommended support for
  integers as arguments to these functions, in preparation for treating
*************** numbers in string form, use `number-to-s
*** 1526,1530 ****
  call to use `format' instead of `concat'.
  
! ** The new function match-string returns the string of text matched at
  the given parenthesized expression by the last regexp search, or nil
  if there was no match.  If the last match was by `string-match' on a
--- 2017,2021 ----
  call to use `format' instead of `concat'.
  
! *** The new function match-string returns the string of text matched at
  the given parenthesized expression by the last regexp search, or nil
  if there was no match.  If the last match was by `string-match' on a
*************** used in place of `buffer-substring' and 
*** 1535,1539 ****
     (match-string N)   or   (match-string N STRING)
  
! ** The function replace-match now accepts an optional fourth argument,
  STRING.  Use this after performing string-match on STRING, to replace
  the portion of STRING that was matched.  When used in this way,
--- 2026,2030 ----
     (match-string N)   or   (match-string N STRING)
  
! *** The function replace-match now accepts an optional fourth argument,
  STRING.  Use this after performing string-match on STRING, to replace
  the portion of STRING that was matched.  When used in this way,
*************** replace-match returns a newly created st
*** 1541,1561 ****
  STRING except for the matched portion.
  
! ** The new function buffer-substring-no-properties
  is like buffer-substring except that the string it returns
  has no text properties.
  
! ** The function `equal' now considers two strings to be different
  if they don't have the same text properties.
  
! * Completion
  
! ** all-completions now takes an optional fourth argument.
  If that argument is non-nil, completions that start with a space
  are ignored unless the initial string also starts with a space.
  (This used to happen unconditionally.)
  
! * Local Variables
  
! ** Local hook variables.
  
  There is now a clean way to give a hook variable a buffer-local value.
--- 2032,2052 ----
  STRING except for the matched portion.
  
! *** The new function buffer-substring-no-properties
  is like buffer-substring except that the string it returns
  has no text properties.
  
! *** The function `equal' now considers two strings to be different
  if they don't have the same text properties.
  
! ** Completion
  
! *** all-completions now takes an optional fourth argument.
  If that argument is non-nil, completions that start with a space
  are ignored unless the initial string also starts with a space.
  (This used to happen unconditionally.)
  
! ** Local Variables
  
! *** Local hook variables.
  
  There is now a clean way to give a hook variable a buffer-local value.
*************** Local hooks use t as an element of the (
*** 1573,1586 ****
  variable as a flag meaning to use the global value also.
  
! ** The new function local-variable-p tells you whether a particular
  variable is buffer-local in the current buffer or a specified buffer.
  
! * Editing Facilities
  
! ** The function copy-region-as-kill no longer sets this-command;
  as a result, a following kill command will not normally append
  to the text saved by copy-region-as-kill.
  
! ** Regular expression searching and matching no longer performs full
  Posix backtracking by default.  They now stop with the first match found
  instead of looking for the longest match--just as they did in Emacs 18.
--- 2064,2077 ----
  variable as a flag meaning to use the global value also.
  
! *** The new function local-variable-p tells you whether a particular
  variable is buffer-local in the current buffer or a specified buffer.
  
! ** Editing Facilities
  
! *** The function copy-region-as-kill no longer sets this-command;
  as a result, a following kill command will not normally append
  to the text saved by copy-region-as-kill.
  
! *** Regular expression searching and matching no longer performs full
  Posix backtracking by default.  They now stop with the first match found
  instead of looking for the longest match--just as they did in Emacs 18.
*************** these just like re-search-forward, re-se
*** 1593,1599 ****
  string-match.
  
! * Files
  
! ** The new variable `format-alist' defines file formats,
  which are ways of translating between the data in a file and things
  (text, text-properties, and possibly other information) in a buffer.
--- 2084,2090 ----
  string-match.
  
! ** Files
  
! *** The new variable `format-alist' defines file formats,
  which are ways of translating between the data in a file and things
  (text, text-properties, and possibly other information) in a buffer.
*************** the variable `auto-save-file-format' to 
*** 1635,1657 ****
  determine the format of all auto-save files.
  
! ** The new function file-ownership-preserved-p tells you whether
  deleting a file and recreating it would keep the file's owner
  unchanged.
  
! ** The new function file-regular-p returns t if a file
  is a "regular" file (not a directory, symlink, named pipe,
  terminal, or other I/O device).
  
! ** The new function file-name-sans-extension discards the extension
  of a file name.  You call it with a file name, and returns a string
  lacking the extension.
  
! ** The variable path-separator is a string which says which
  character separates directories in a search path.  It is ":"
  for Unix and GNU systems, ";" for MSDOG and Windows NT.
  
! * Commands and Key Sequences
  
! ** Key sequences consisting of C-c followed by {, }, <, >, : or ; are
  now reserved for major modes.  Sequences consisting of C-c followed by
  any other punctuation character are now meant for minor modes.  We don't
--- 2126,2148 ----
  determine the format of all auto-save files.
  
! *** The new function file-ownership-preserved-p tells you whether
  deleting a file and recreating it would keep the file's owner
  unchanged.
  
! *** The new function file-regular-p returns t if a file
  is a "regular" file (not a directory, symlink, named pipe,
  terminal, or other I/O device).
  
! *** The new function file-name-sans-extension discards the extension
  of a file name.  You call it with a file name, and returns a string
  lacking the extension.
  
! *** The variable path-separator is a string which says which
  character separates directories in a search path.  It is ":"
  for Unix and GNU systems, ";" for MSDOG and Windows NT.
  
! ** Commands and Key Sequences
  
! *** Key sequences consisting of C-c followed by {, }, <, >, : or ; are
  now reserved for major modes.  Sequences consisting of C-c followed by
  any other punctuation character are now meant for minor modes.  We don't
*************** plan to convert all existing major modes
*** 1659,1668 ****
  but we hope to keep them to a minimum.
  
! ** When the post-command-hook or the pre-command-hook gets an error, the error
  is silently ignored.  Emacs no longer sets the hook variable to nil when this
  happens.  Meanwhile, the hook functions can now alter the hook variable in
  a normal fashion; there is no need to do anything special.
  
! ** define-key, lookup-key, and various other functions for changing or
  looking up key bindings now let you write an event type with a list
  like (ctrl meta newline) or (meta ?d), as in XEmacs.  (ctrl meta newline)
--- 2150,2159 ----
  but we hope to keep them to a minimum.
  
! *** When the post-command-hook or the pre-command-hook gets an error, the error
  is silently ignored.  Emacs no longer sets the hook variable to nil when this
  happens.  Meanwhile, the hook functions can now alter the hook variable in
  a normal fashion; there is no need to do anything special.
  
! *** define-key, lookup-key, and various other functions for changing or
  looking up key bindings now let you write an event type with a list
  like (ctrl meta newline) or (meta ?d), as in XEmacs.  (ctrl meta newline)
*************** is equivalent to the event type symbol C
*** 1670,1677 ****
  is equivalent to the character ?\M-d.
  
! ** The function event-convert-list converts a list such as
  (meta ?d) into the corresponding event type (a symbol or integer).
  
! ** In an interactive spec, `k' means to read a key sequence.  In this
  key sequence, upper case characters and shifted function keys which
  have no bindings are converted to lower case if that makes them
--- 2161,2168 ----
  is equivalent to the character ?\M-d.
  
! *** The function event-convert-list converts a list such as
  (meta ?d) into the corresponding event type (a symbol or integer).
  
! *** In an interactive spec, `k' means to read a key sequence.  In this
  key sequence, upper case characters and shifted function keys which
  have no bindings are converted to lower case if that makes them
*************** not convert the last event.  `K' is usef
*** 1682,1686 ****
  to be given a binding.
  
! ** The variable overriding-local-map now has no effect on the menu bar
  display unless overriding-local-map-menu-flag is non-nil.  This is why
  incremental search no longer temporarily changes the menu bars.
--- 2173,2177 ----
  to be given a binding.
  
! *** The variable overriding-local-map now has no effect on the menu bar
  display unless overriding-local-map-menu-flag is non-nil.  This is why
  incremental search no longer temporarily changes the menu bars.
*************** programs that use overriding-local-map n
*** 1694,1701 ****
  any event such as menu-bar that they do not handle specially.
  
! ** The new variable `overriding-terminal-local-map' is like
  overriding-local-map, but is specific to a single terminal.
  
! ** delete-frame events.
  
  When you use the X window manager's "delete window" command, this now
--- 2185,2192 ----
  any event such as menu-bar that they do not handle specially.
  
! *** The new variable `overriding-terminal-local-map' is like
  overriding-local-map, but is specific to a single terminal.
  
! *** delete-frame events.
  
  When you use the X window manager's "delete window" command, this now
*************** Emacs when the last visible or iconified
*** 1705,1716 ****
  rebind the event to some other command if you wish.
  
! ** Two new types of events, iconify-frame and make-frame-visible,
  indicate that the user iconified or deiconified a frame with the
  window manager.  Since the window manager has already done the work,
  the default definition for both event types in Emacs is to do nothing.
  
! * Frames and X
  
! ** Certain Lisp variables are now local to an X terminal (in other
  words, all the screens of a single X server).  The value in effect, at
  any given time, is the one that belongs to the terminal of the
--- 2196,2207 ----
  rebind the event to some other command if you wish.
  
! *** Two new types of events, iconify-frame and make-frame-visible,
  indicate that the user iconified or deiconified a frame with the
  window manager.  Since the window manager has already done the work,
  the default definition for both event types in Emacs is to do nothing.
  
! ** Frames and X
  
! *** Certain Lisp variables are now local to an X terminal (in other
  words, all the screens of a single X server).  The value in effect, at
  any given time, is the one that belongs to the terminal of the
*************** last-kbd-macro.  There is no way for Lis
*** 1721,1725 ****
  The terminal-local variables cannot be buffer-local.
  
! ** When you create an X Window frame, for the `top' and `left' frame
  parameters, you can now use values of the form (+ N) or (- N), where N
  is an integer.  (+ N) means N pixels to the right of the left edge of
--- 2212,2216 ----
  The terminal-local variables cannot be buffer-local.
  
! *** When you create an X frame, for the `top' and `left' frame
  parameters, you can now use values of the form (+ N) or (- N), where N
  is an integer.  (+ N) means N pixels to the right of the left edge of
*************** The function x-parse-geometry can return
*** 1731,1755 ****
  for certain inputs.
  
! ** The variable menu-bar-file-menu has been renamed to
  menu-bar-files-menu to match the actual item that appears in the menu.
  (All the other such variable names do match.)
  
! ** The new function active-minibuffer-window returns the minibuffer window
  currently active, or nil if none is now active.
  
! ** In the functions next-window, previous-window, next-frame,
  previous-frame, get-buffer-window, get-lru-window, get-largest-window
  and delete-windows-on, if you specify 0 for the last argument,
  it means to consider all visible and iconified frames.
  
! ** When you set a frame's cursor type with modify-frame-parameters,
  you can now specify (bar . INTEGER) as the cursor type.  This stands
  for a bar cursor of width INTEGER.
  
! ** The new function facep returns t if its argument is a face name
  (or if it is a vector such as is used internally by the Lisp code
  to represent a face).
  
! ** Each frame can now have a buffer-predicate function,
  which is the `buffer-predicate' frame parameter.
  When `other-buffer' looks for an alternative buffer, it considers
--- 2222,2246 ----
  for certain inputs.
  
! *** The variable menu-bar-file-menu has been renamed to
  menu-bar-files-menu to match the actual item that appears in the menu.
  (All the other such variable names do match.)
  
! *** The new function active-minibuffer-window returns the minibuffer window
  currently active, or nil if none is now active.
  
! *** In the functions next-window, previous-window, next-frame,
  previous-frame, get-buffer-window, get-lru-window, get-largest-window
  and delete-windows-on, if you specify 0 for the last argument,
  it means to consider all visible and iconified frames.
  
! *** When you set a frame's cursor type with modify-frame-parameters,
  you can now specify (bar . INTEGER) as the cursor type.  This stands
  for a bar cursor of width INTEGER.
  
! *** The new function facep returns t if its argument is a face name
  (or if it is a vector such as is used internally by the Lisp code
  to represent a face).
  
! *** Each frame can now have a buffer-predicate function,
  which is the `buffer-predicate' frame parameter.
  When `other-buffer' looks for an alternative buffer, it considers
*************** only the buffers that fit the selected f
*** 1757,1761 ****
  has one).  This is useful for applications that make their own frames.
  
! ** When you create an X frame, you can now specify the frame parameter
  `display'.  This says which display to put the frame on.  The value
  should be a display name--a string of the form
--- 2248,2252 ----
  has one).  This is useful for applications that make their own frames.
  
! *** When you create an X frame, you can now specify the frame parameter
  `display'.  This says which display to put the frame on.  The value
  should be a display name--a string of the form
*************** x-display-list returns a list indicating
*** 1775,1797 ****
  connections to.  Its elements are display names (strings).
  
! ** The icon-type frame parameter may now be a file name.
  Then the contents of that file specify the icon bitmap to use
  for that frame.
  
! ** The title of an Emacs frame, displayed by most window managers, is
  set from frame-title-format or icon-title-format.  These have the same
  structure as mode-line-format.
  
! ** x-display-grayscale-p is a new function that returns non-nil if
  your X server can display shades of gray.  Currently it returns
  non-nil for color displays (because they can display shades of gray);
  we may change it in the next version to return nil for color displays.
  
! ** The frame parameter scroll-bar-width specifies the width of the
  scrollbar in pixels.
  
! * Buffers
  
! ** Creating a buffer with get-buffer-create does not obey
  default-major-mode.  That variable is now handled in a separate
  function, set-buffer-major-mode.  get-buffer-create and generate-new-buffer
--- 2266,2288 ----
  connections to.  Its elements are display names (strings).
  
! *** The icon-type frame parameter may now be a file name.
  Then the contents of that file specify the icon bitmap to use
  for that frame.
  
! *** The title of an Emacs frame, displayed by most window managers, is
  set from frame-title-format or icon-title-format.  These have the same
  structure as mode-line-format.
  
! *** x-display-grayscale-p is a new function that returns non-nil if
  your X server can display shades of gray.  Currently it returns
  non-nil for color displays (because they can display shades of gray);
  we may change it in the next version to return nil for color displays.
  
! *** The frame parameter scroll-bar-width specifies the width of the
  scrollbar in pixels.
  
! ** Buffers
  
! *** Creating a buffer with get-buffer-create does not obey
  default-major-mode.  That variable is now handled in a separate
  function, set-buffer-major-mode.  get-buffer-create and generate-new-buffer
*************** pop-to-buffer, and similar functions doe
*** 1802,1806 ****
  to select the default major mode specified with default-major-mode.
  
! ** You can now create an "indirect buffer".  An indirect buffer shares
  its text, including text properties, with another buffer (the "base
  buffer"), but has its own major mode, local variables, overlays, and
--- 2293,2297 ----
  to select the default major mode specified with default-major-mode.
  
! *** You can now create an "indirect buffer".  An indirect buffer shares
  its text, including text properties, with another buffer (the "base
  buffer"), but has its own major mode, local variables, overlays, and
*************** mode which let you display different par
*** 1825,1831 ****
  indirect buffers.
  
! * Subprocesses
  
! ** The functions call-process and call-process-region now allow
  you to direct error message output from the subprocess into a
  separate destination, instead of mixing it with ordinary output.
--- 2316,2322 ----
  indirect buffers.
  
! ** Subprocesses
  
! *** The functions call-process and call-process-region now allow
  you to direct error message output from the subprocess into a
  separate destination, instead of mixing it with ordinary output.
*************** buffer by sending it to a temporary file
*** 1845,1858 ****
  into a buffer.
  
! ** Comint mode changes:
  
! *** The variable comint-completion-addsuffix can also be a cons pair
  of the form (DIRSUFFIX . FILESUFFIX), where DIRSUFFIX and FILESUFFIX are
  strings added on unambiguous or exact completion of directories and file
  names, respectively.
  
! * Text properties
  
! ** You can now specify which values of the `invisible' property
  make text invisible in a given buffer.  The variable
  `buffer-invisibility-spec', which is always local in all buffers,
--- 2336,2349 ----
  into a buffer.
  
! *** Comint mode changes:
  
! **** The variable comint-completion-addsuffix can also be a cons pair
  of the form (DIRSUFFIX . FILESUFFIX), where DIRSUFFIX and FILESUFFIX are
  strings added on unambiguous or exact completion of directories and file
  names, respectively.
  
! ** Text properties
  
! *** You can now specify which values of the `invisible' property
  make text invisible in a given buffer.  The variable
  `buffer-invisibility-spec', which is always local in all buffers,
*************** a character invisible.
*** 1863,1867 ****
  
  If its value is a list, then a character is invisible if its
! `invisible' propery value appears as a member of the list, or if it
  appears as the car of a member of the list.
  
--- 2354,2358 ----
  
  If its value is a list, then a character is invisible if its
! `invisible' property value appears as a member of the list, or if it
  appears as the car of a member of the list.
  
*************** element of the list against `buffer-invi
*** 1877,1884 ****
  matches, the character is invisible.
  
! ** The command `list-text-properties-at' shows what text properties
  are in effect at point.
  
! ** Frame objects now exist in Emacs even on systems that don't support
  X Windows.  You can create multiple frames, and switch between them
  using select-frame.  The selected frame is actually displayed on your
--- 2368,2375 ----
  matches, the character is invisible.
  
! *** The command `list-text-properties-at' shows what text properties
  are in effect at point.
  
! *** Frame objects now exist in Emacs even on systems that don't support
  X Windows.  You can create multiple frames, and switch between them
  using select-frame.  The selected frame is actually displayed on your
*************** Switching frames on ASCII terminals is t
*** 1889,1893 ****
  equivalent to switching between different window configurations.
  
! ** The new variable window-size-change-functions holds a list of
  functions to be called if window sizes change (or if windows are
  created or deleted).  The functions are called once for each frame on
--- 2380,2384 ----
  equivalent to switching between different window configurations.
  
! *** The new variable window-size-change-functions holds a list of
  functions to be called if window sizes change (or if windows are
  created or deleted).  The functions are called once for each frame on
*************** which changes have occurred, with the fr
*** 1895,1899 ****
  This takes place shortly before redisplay.
  
! ** The modification hook functions of overlays now work differently.
  They are called both before and after each change.  This makes it
  possible for the functions to determine exactly what the change was.
--- 2386,2390 ----
  This takes place shortly before redisplay.
  
! *** The modification hook functions of overlays now work differently.
  They are called both before and after each change.  This makes it
  possible for the functions to determine exactly what the change was.
*************** are the same arguments that the after-ch
*** 1919,1956 ****
  This means the function must accept either four or five arguments.
  
! ** You can set defaults for text-properties with the new variable
  `default-text-properties'.  Its value is a property list; the values
  specified there are used whenever a character (or its category) does
  not specify a value.
  
! ** The `face' property of a character or an overlay can now be a list
  of face names.  Formerly it had to be just one face name.
  
! ** Changes in handling the `intangible' text property.
  
! *** If inhibit-point-motion-hooks is non-nil, then `intangible' properties
  are ignored.
  
! *** Moving to just before a stretch of intangible text
  is no longer special in any way.  Point stays at that place.
  
! *** When you move point backwards into the midst of intangible text,
  point moves back to the beginning of that text.  (It used to move
  forward to the end of that text, which was not very useful.)
  
! *** When moving across intangible text, Emacs stops wherever the
  property value changes.  So if you have two stretches of intangible
  text, with different non-nil intangible properties, it is possible to
  place point between them.
  
! * Overlays
  
! ** Overlay changes.
  
! *** The new function previous-overlay-change returns the position of
  the previous overlay start or end, before a specified position.  This
  is the backwards-moving counterpart of next-overlay-change.
  
! *** overlay-get now supports category properties on an overlay
  the same way get-text-property supports them as text properties.
  
--- 2410,2447 ----
  This means the function must accept either four or five arguments.
  
! *** You can set defaults for text-properties with the new variable
  `default-text-properties'.  Its value is a property list; the values
  specified there are used whenever a character (or its category) does
  not specify a value.
  
! *** The `face' property of a character or an overlay can now be a list
  of face names.  Formerly it had to be just one face name.
  
! *** Changes in handling the `intangible' text property.
  
! **** If inhibit-point-motion-hooks is non-nil, then `intangible' properties
  are ignored.
  
! **** Moving to just before a stretch of intangible text
  is no longer special in any way.  Point stays at that place.
  
! **** When you move point backwards into the midst of intangible text,
  point moves back to the beginning of that text.  (It used to move
  forward to the end of that text, which was not very useful.)
  
! **** When moving across intangible text, Emacs stops wherever the
  property value changes.  So if you have two stretches of intangible
  text, with different non-nil intangible properties, it is possible to
  place point between them.
  
! ** Overlays
  
! *** Overlay changes.
  
! **** The new function previous-overlay-change returns the position of
  the previous overlay start or end, before a specified position.  This
  is the backwards-moving counterpart of next-overlay-change.
  
! **** overlay-get now supports category properties on an overlay
  the same way get-text-property supports them as text properties.
  
*************** ask for, but it does have a `category' p
*** 1959,1971 ****
  then that symbol's PROP property is used.
  
! *** If an overlay has a non-nil `evaporate' property, it will be
  deleted if it ever becomes empty (i.e., when it spans no characters).
  
! *** If an overlay has a `before-string' and/or `after-string' property,
  these strings are displayed at the overlay's endpoints.
  
! * Filling
  
! ** The new variable fill-paragraph-function provides a way for major
  modes to override the filling of paragraphs.  If this is non-nil,
  fill-paragraph calls it as a function, passing along its sole
--- 2450,2462 ----
  then that symbol's PROP property is used.
  
! **** If an overlay has a non-nil `evaporate' property, it will be
  deleted if it ever becomes empty (i.e., when it spans no characters).
  
! **** If an overlay has a `before-string' and/or `after-string' property,
  these strings are displayed at the overlay's endpoints.
  
! ** Filling
  
! *** The new variable fill-paragraph-function provides a way for major
  modes to override the filling of paragraphs.  If this is non-nil,
  fill-paragraph calls it as a function, passing along its sole
*************** The usual use of this feature is to fill
*** 1976,2002 ****
  language modes.
  
! ** Text filling and justification changes:
  
! *** The new variable use-hard-newlines can be used to make a
  distinction between "hard" and "soft" newlines; the fill functions
  will then never remove a newline that was manually inserted.  Hard
  newlines are marked with a non-nil `hard' text-property.
  
! *** The fill-column and left-margin can now be modified by text-properties.
  Most lisp programs should use the new functions (current-fill-column) and
  (current-left-margin), which return the proper values to use for the
  current line.
  
! *** There are new functions for dealing with margins: 
  
! **** Set-left-margin and set-right-margin (set the value for a region
  and re-fill).  These functions take three arguments: two to specify
  a region, and the desired margin value.
  
! **** Increase-left-margin, decrease-left-margin, increase-right-margin, and
  decrease-right-margin (change settings relative to current values, and
  re-fill).
  
! **** move-to-left-margin moves point there, optionally adding
  indentation or changing tabs to spaces in order to make that possible.
  beginning-of-line-text also moves past the fill-prefix and any
--- 2467,2493 ----
  language modes.
  
! *** Text filling and justification changes:
  
! **** The new variable use-hard-newlines can be used to make a
  distinction between "hard" and "soft" newlines; the fill functions
  will then never remove a newline that was manually inserted.  Hard
  newlines are marked with a non-nil `hard' text-property.
  
! **** The fill-column and left-margin can now be modified by text-properties.
  Most lisp programs should use the new functions (current-fill-column) and
  (current-left-margin), which return the proper values to use for the
  current line.
  
! **** There are new functions for dealing with margins: 
  
! ***** Set-left-margin and set-right-margin (set the value for a region
  and re-fill).  These functions take three arguments: two to specify
  a region, and the desired margin value.
  
! ***** Increase-left-margin, decrease-left-margin, increase-right-margin, and
  decrease-right-margin (change settings relative to current values, and
  re-fill).
  
! ***** move-to-left-margin moves point there, optionally adding
  indentation or changing tabs to spaces in order to make that possible.
  beginning-of-line-text also moves past the fill-prefix and any
*************** indentation added to center or right-jus
*** 2004,2011 ****
  of the text that the user actually typed.
  
! **** delete-to-left-margin removes any left-margin indentation, but
  does not change the property.
  
! *** The paragraph-movement functions look for the paragraph-start and
  paragraph-separate regexps at the current left margin, not at the
  beginning of the line.  This means that those regexps should NOT use ^
--- 2495,2502 ----
  of the text that the user actually typed.
  
! ***** delete-to-left-margin removes any left-margin indentation, but
  does not change the property.
  
! **** The paragraph-movement functions look for the paragraph-start and
  paragraph-separate regexps at the current left margin, not at the
  beginning of the line.  This means that those regexps should NOT use ^
*************** to anchor the search.  However, for back
*** 2013,2042 ****
  the beginning of the regexp will be ignored, so most packages won't break.
  
! *** justify-current-line is now capable of doing left, center, or
  right justification as well as full justification.
  
! *** The fill functions can do any kind of justification based on the new
  `justification' text-property and `default-justification' variable,
  or arguments to the functions.  They also have a new option which
  defeats the normal removal of extra whitespace.
  
! *** The new function `current-justification' returns the kind of
  justification used for the current line.  The new function
  `set-justification' can be used to change it, including re-justifying
  the text of the region according to the new value.
  
! *** Filling and auto-fill are disabled if justification is `none'.
  
! *** The auto-fill-function is now called regardless of whether 
  the fill-column has been exceeded; the function can determine on its
  own whether filling (or justification) is necessary.
  
! * Processes
  
! ** process-tty-name is a new function that returns the name of the
  terminal that the process itself reads and writes on (not the name of
  the pty that Emacs uses to talk with that terminal).
  
! ** Errors in process filters and sentinels are now normally caught
  automatically, so that they don't abort other Lisp programs.
  
--- 2504,2533 ----
  the beginning of the regexp will be ignored, so most packages won't break.
  
! **** justify-current-line is now capable of doing left, center, or
  right justification as well as full justification.
  
! **** The fill functions can do any kind of justification based on the new
  `justification' text-property and `default-justification' variable,
  or arguments to the functions.  They also have a new option which
  defeats the normal removal of extra whitespace.
  
! **** The new function `current-justification' returns the kind of
  justification used for the current line.  The new function
  `set-justification' can be used to change it, including re-justifying
  the text of the region according to the new value.
  
! **** Filling and auto-fill are disabled if justification is `none'.
  
! **** The auto-fill-function is now called regardless of whether 
  the fill-column has been exceeded; the function can determine on its
  own whether filling (or justification) is necessary.
  
! ** Processes
  
! *** process-tty-name is a new function that returns the name of the
  terminal that the process itself reads and writes on (not the name of
  the pty that Emacs uses to talk with that terminal).
  
! *** Errors in process filters and sentinels are now normally caught
  automatically, so that they don't abort other Lisp programs.
  
*************** filters and sentinels are not caught.  A
*** 2045,2056 ****
  the debugger, under the control of debug-on-error.
  
! ** Emacs now preserves the match data around the execution of process
  filters and sentinels.  You can use search and match functions freely
  in filters and sentinels without explicitly bothering to save the
  match data.
  
! * Display
  
! ** The variable message-log-max controls how messages are logged in the
  "*Messages*" buffer.  An integer value means to keep that many lines;
  t means to log with no limit; nil means disable message logging.  Lisp
--- 2536,2547 ----
  the debugger, under the control of debug-on-error.
  
! *** Emacs now preserves the match data around the execution of process
  filters and sentinels.  You can use search and match functions freely
  in filters and sentinels without explicitly bothering to save the
  match data.
  
! ** Display
  
! *** The variable message-log-max controls how messages are logged in the
  "*Messages*" buffer.  An integer value means to keep that many lines;
  t means to log with no limit; nil means disable message logging.  Lisp
*************** code that calls `message' excessively (e
*** 2058,2062 ****
  bind this variable to nil.
  
! ** Display tables now have a new element, at index 261, specifying the
  glyph to use for the separator between two side-by-side windows.  By
  default, this is the vertical bar character `|'.  Probably the only
--- 2549,2553 ----
  bind this variable to nil.
  
! *** Display tables now have a new element, at index 261, specifying the
  glyph to use for the separator between two side-by-side windows.  By
  default, this is the vertical bar character `|'.  Probably the only
*************** less visual separation between two side-
*** 2065,2076 ****
  related information.
  
! ** The new mode-line-format spec %c displays the current column number.
  
! ** The new variable blink-matching-delay specifies how long to keep
  the cursor at the matching open-paren, after you insert a close-paren.
  This is useful mainly on systems which can wait for a fraction of a
  second--you can then specify fractional values such as 0.5.
  
! ** Faster processing of buffers with long lines
  
  The new variable cache-long-line-scans determines whether Emacs
--- 2556,2567 ----
  related information.
  
! *** The new mode-line-format spec %c displays the current column number.
  
! *** The new variable blink-matching-delay specifies how long to keep
  the cursor at the matching open-paren, after you insert a close-paren.
  This is useful mainly on systems which can wait for a fraction of a
  second--you can then specify fractional values such as 0.5.
  
! *** Faster processing of buffers with long lines
  
  The new variable cache-long-line-scans determines whether Emacs
*************** the cache should not affect the behavior
*** 2103,2113 ****
  it should only affect their performance.
  
! * System Interface
  
! ** The function user-login-name now accepts an optional
  argument uid.  If the argument is non-nil, user-login-name
  returns the login name for that user id.
  
! ** system-name, user-name, user-full-name and user-real-name are now
  variables as well as functions.  The variables hold the same values
  that the functions would return.  The new variable multiple-frames
--- 2594,2604 ----
  it should only affect their performance.
  
! ** System Interface
  
! *** The function user-login-name now accepts an optional
  argument uid.  If the argument is non-nil, user-login-name
  returns the login name for that user id.
  
! *** system-name, user-name, user-full-name and user-real-name are now
  variables as well as functions.  The variables hold the same values
  that the functions would return.  The new variable multiple-frames
*************** variables may be useful in constructing 
*** 2116,2132 ****
  or icon-title-format.
  
! ** Changes in time-conversion functions.
  
! *** The new function format-time-string takes a format string and a
  time value.  It converts the time to a string, according to the format
  specified.  You can specify what kind of conversion to use with
  %-specifications.
  
! *** The new function decode-time converts a time value into a list of
  specific items of information: the year, month, day of week, day of
  month, hour, minute and second.  (A time value is a list of two or
  three integers.)
  
! *** The new function encode-time converts specific items of time
  information--the second, minute, hour, day, month, year, and time
  zone--into a time value.
--- 2607,2623 ----
  or icon-title-format.
  
! *** Changes in time-conversion functions.
  
! **** The new function format-time-string takes a format string and a
  time value.  It converts the time to a string, according to the format
  specified.  You can specify what kind of conversion to use with
  %-specifications.
  
! **** The new function decode-time converts a time value into a list of
  specific items of information: the year, month, day of week, day of
  month, hour, minute and second.  (A time value is a list of two or
  three integers.)
  
! **** The new function encode-time converts specific items of time
  information--the second, minute, hour, day, month, year, and time
  zone--into a time value.
*************** exit the minibuffer.
*** 2852,2856 ****
  when the mouse is over text that has a mouse-face property.
  
! ** The new variable interpreter-mode-alist specifes major modes to use
  for shell scripts that specify a command interpreter.  Its elements
  look like (INTERPRETER . MODE); for example, ("perl" . perl-mode) is
--- 3343,3347 ----
  when the mouse is over text that has a mouse-face property.
  
! ** The new variable interpreter-mode-alist specifies major modes to use
  for shell scripts that specify a command interpreter.  Its elements
  look like (INTERPRETER . MODE); for example, ("perl" . perl-mode) is
*************** to let it know that the size has changed
*** 3084,3088 ****
  displays the percentage of the buffer text that is above the *bottom*
  of the window (which includes the text visible, in the window as well
! as the text above the top).  It dispays `Top' as well as the
  percentage if the top of the buffer is visible on screen.
  
--- 3575,3579 ----
  displays the percentage of the buffer text that is above the *bottom*
  of the window (which includes the text visible, in the window as well
! as the text above the top).  It displays `Top' as well as the
  percentage if the top of the buffer is visible on screen.
  
*************** buffer is read-only has no effect on %+.
*** 3093,3098 ****
  ** The new functions ffloor, fceiling, fround and ftruncate take a
  floating point argument and return a floating point result whose value
! is a nearby integer.  ffloor returns the nearest integer below; fceil,
! the nearest integer above; ftrucate, the nearest integer in the
  direction towards zero; fround, the nearest integer.
  
--- 3584,3589 ----
  ** The new functions ffloor, fceiling, fround and ftruncate take a
  floating point argument and return a floating point result whose value
! is a nearby integer.  ffloor returns the nearest integer below; fceiling,
! the nearest integer above; ftruncate, the nearest integer in the
  direction towards zero; fround, the nearest integer.
  
*************** menu in the menu bar.
*** 3307,3311 ****
  way to type certain non-ASCII characters.  It makes the characters `,
  ', ", ^, ~ and / serve as modifiers for the following letter.  ` and '
! add accents, " adds an umlaut or diaresis, ^ adds a circumflex, ~
  adds a tilde, and / adds a slash to the following letter.
  
--- 3798,3802 ----
  way to type certain non-ASCII characters.  It makes the characters `,
  ', ", ^, ~ and / serve as modifiers for the following letter.  ` and '
! add accents, " adds an umlaut or dieresis, ^ adds a circumflex, ~
  adds a tilde, and / adds a slash to the following letter.
  
*************** A few special combinations:
*** 3324,3329 ****
  ~c => c with cedilla
  ~d => d with stroke
! ~< => left guillemet
! ~> => right guillemet
  
  ** iso-transl.el is a new library that replaces iso-insert.el.
--- 3815,3820 ----
  ~c => c with cedilla
  ~d => d with stroke
! ~< => left guillemot
! ~> => right guillemot
  
  ** iso-transl.el is a new library that replaces iso-insert.el.
*************** There is now a hook, comint-output-filte
*** 3640,3644 ****
  output filter, comint-output-filter.  This is useful for scrolling (see
  below), but also things like processing output for specific text, output
! hilighting, etc.
  
  So that such output processing may be done efficiently, there is a new
--- 4131,4135 ----
  output filter, comint-output-filter.  This is useful for scrolling (see
  below), but also things like processing output for specific text, output
! highlighting, etc.
  
  So that such output processing may be done efficiently, there is a new
*************** to a non-nil value.
*** 3793,3797 ****
  ** Inserting a string with no text properties into the buffer normally
  inherits the properties of the preceding character.  You can now
! control this inheritence by setting the front-sticky and
  rear-nonsticky properties of a character.
  
--- 4284,4288 ----
  ** Inserting a string with no text properties into the buffer normally
  inherits the properties of the preceding character.  You can now
! control this inheritance by setting the front-sticky and
  rear-nonsticky properties of a character.
  
*************** presence or absence of the singleton lis
*** 4138,4142 ****
  should prefix the event with its place symbol.
  
! Normally, `read-key-sequence' prefixes mouse events occuring over
  non-textual areas with their PLACE-SYMBOLs, to select the sub-keymap
  appropriate for the event; for example, clicking on the mode line
--- 4629,4633 ----
  should prefix the event with its place symbol.
  
! Normally, `read-key-sequence' prefixes mouse events occurring over
  non-textual areas with their PLACE-SYMBOLs, to select the sub-keymap
  appropriate for the event; for example, clicking on the mode line
*************** files, like executables and utility prog
*** 4331,4335 ****
  EXECDIR/bin should be a directory that is normally in users' PATHs.
  
! ** When running under X Windows, the new lisp function `x-list-fonts'
  allows code to find out which fonts are available from the X server.
  The first argument PATTERN is a string, perhaps with wildcard characters;
--- 4822,4826 ----
  EXECDIR/bin should be a directory that is normally in users' PATHs.
  
! ** When running under X, the new lisp function `x-list-fonts'
  allows code to find out which fonts are available from the X server.
  The first argument PATTERN is a string, perhaps with wildcard characters;
*************** buffer.
*** 5079,5083 ****
  To start using version control for a file, use the command C-x v v.
  This works like C-x C-q (performing the next logical version-control
! operation needed to change the file's writeability) but it will also
  perform initial checkin on an unregistered file.
  
--- 5570,5574 ----
  To start using version control for a file, use the command C-x v v.
  This works like C-x C-q (performing the next logical version-control
! operation needed to change the file's writability) but it will also
  perform initial checkin on an unregistered file.
  
diff -2rcpP --exclude=*.elc emacs-19.30/etc/ORDERS emacs-19.31/etc/ORDERS
*** emacs-19.30/etc/ORDERS	Sat Jun 17 17:07:26 1995
--- emacs-19.31/etc/ORDERS	Tue May 21 21:25:51 1996
***************
*** 1,24 ****
  The actual order form follows the descriptions of media contents.
  
! Most of this file is excerpted from the draft of the June 1995 GNU's Bulletin.
! The Order Form itself is accurate, but the information in the other articles
! is not completely updated.  You can ask gnu@prep.ai.mit.edu for the complete
! June, 1995 Order From to get up-to-date information.
  
  Please send suggestions for improvements to gnu@prep.ai.mit.edu or the postal
  address at the end of the order form.  Thank You.
  
! ---------------------------------------------------------------------
  
  
! FSF Order Form with Descriptions		preliminary, June 1995
  
  
  
! Free Software Foundation, Inc.	      Telephone: +1-617-542-5942
! 59 Temple Place - Suite 330	      Fax: (including Japan) +1-617-542-2652
! Boston, MA  02111-1307		      Free Dial Fax (in Japan):
! USA						      0031-13-2473 (KDD)
! Electronic mail: `gnu@prep.ai.mit.edu'		      0066-3382-0158 (IDC)
  
  
--- 1,23 ----
  The actual order form follows the descriptions of media contents.
  
! Most of this file is excerpted from the January 1996 GNU's Bulletin.
  
  Please send suggestions for improvements to gnu@prep.ai.mit.edu or the postal
  address at the end of the order form.  Thank You.
  
! -----------------------------------------------------------------------------
  
  
! FSF Order Form with Descriptions			January, 1996
  
  
  
! Free Software Foundation, Inc.		Telephone: +1-617-542-5942
! 59 Temple Place - Suite 330		Fax: (including Japan) +1-617-542-2652
! Boston, MA   02111-1307	  USA		Electronic mail: `gnu@prep.ai.mit.edu'
! 
! 
! -----------------------------------------------------------------------------
! 
  
  
*************** ask gnu@prep.ai.mit.edu for the complete
*** 28,31 ****
--- 27,31 ----
  
  
+ 
  Table of Contents
  -----------------
*************** Table of Contents
*** 35,47 ****
  	Free Software Redistributors Donate
  	Help from Free Software Companies
! 	(not included) Major Changes in GNU Software and Documentation (not
! 		included as it was not done when this file was assembled).
  	GNU Documentation
! 	GNU Software		(not completely up to date)
! 	Program/Package Cross Reference	 (not completely up to date)
  	Tapes
! 	   Languages Tape	(version numbers not completely up to date)
! 	   Lisps and Emacs Tape (version numbers not completely up to date)
! 	   Utilities Tape	(version numbers not completely up to date)
  	   Scheme Tape
  	   X11 Tapes
--- 35,47 ----
  	Free Software Redistributors Donate
  	Help from Free Software Companies
! 	Major Changes in GNU Software and Documentation
! 	The Deluxe Distribution
  	GNU Documentation
! 	GNU Software
! 	Program/Package Cross Reference
  	Tapes
! 	   Languages Tape
! 	   Lisps and Emacs Tape
! 	   Utilities Tape
  	   Scheme Tape
  	   X11 Tapes
*************** Table of Contents
*** 50,72 ****
  	CD-ROMs
  	   Pricing of the GNU CD-ROMs
! 	   MS-DOS CD-ROM
! 	   Debian GNU/Linux CD-ROM
! 	   Compiler Tools Binaries CD-ROM
  	   Source Code CD-ROMs
! 	      June 1995 Source Code CD-ROM (version numbers not completely up
! 					    to date)
  	      May 1994 Source Code CD-ROM
  	      November 1993 Source Code CD-ROM
  	MS-DOS Diskettes
! 	   DJGPP Diskettes	(version numbers not completely up to date)
! 	   Emacs Diskettes	(version numbers not completely up to date)
! 	   Selected Utilities Diskettes	   (not completely up to date)
  	   Windows Diskette
  	Tape & CD-ROM Subscription Service
- 	The Deluxe Distribution
  	FSF T-shirt
  	Free Software Foundation Order Form
  
  
  
  Donations Translate Into Free Software
--- 50,76 ----
  	CD-ROMs
  	   Pricing of the GNU CD-ROMs
! 	   December 1995 Compiler Tools Binaries CD-ROM
! 	   December 1994 Compiler Tools Binaries CD-ROM
! 	   December 1993 Compiler Tools Binaries CD-ROM
  	   Source Code CD-ROMs
! 	      December 1995 Source Code CD-ROMs
! 	      June 1995 Source Code CD-ROM
  	      May 1994 Source Code CD-ROM
  	      November 1993 Source Code CD-ROM
+ 	   MS-DOS Book with CD-ROM
+ 	   Debian GNU/Linux Book with CD-ROM
  	MS-DOS Diskettes
! 	   DJGPP Diskettes
! 	   Emacs Diskettes
! 	   Selected Utilities Diskettes
  	   Windows Diskette
  	Tape & CD-ROM Subscription Service
  	FSF T-shirt
  	Free Software Foundation Order Form
  
  
+ -----------------------------------------------------------------------------
+ 
+ 
  
  Donations Translate Into Free Software
*************** may wish to help us make sure there is m
*** 79,94 ****
  Your donation to us is tax-deductible in the United States.  We gladly accept
  *any* currency, although the U.S. dollar is the most convenient.
! m{No Value For "ergegrafkludge"} If your employer has a matching gifts
! program for charitable donations, please arrange to: add the FSF to the list
! of organizations for your employer's matching gifts program; and have your
! donation matched (note *Note Cygnus Matches Donations!::), if you do not
! know, please ask your personnel department.   Circle amount you are donating,
! cut out this form, and send it with your donation to:
! 	Free Software Foundation
! 	59 Temple Place -- Suite 330
  	Boston, MA  02111-1307
  	USA
  
! 	$500	 $250	  $100	   $50	   other $________
  
  	Other currency:________
--- 83,103 ----
  Your donation to us is tax-deductible in the United States.  We gladly accept
  *any* currency, although the U.S. dollar is the most convenient.
! 
! If your employer has a matching gifts program for charitable donations,
! please arrange to: add the FSF to the list of organizations for your
! employer's matching gifts program; and have your donation matched (note *Note
! Cygnus Matches Donations!::).  If you do not know, please ask your personnel
! department.
! 
! Circle amount you are donating, cut out this form, and send it with your
! donation to:
! 
! 	Free Software Foundation, Inc.
! 	59 Temple Place - Suite 330
  	Boston, MA  02111-1307
  	USA
  
! 
! 	$500	 $250	  $100	   $50	   Other $________
  
  	Other currency:________
*************** cut out this form, and send it with your
*** 96,103 ****
  
  You can charge a donation to any of Carte Blanche, Diner's Club, JCB,
! Mastercard, Visa, or American Express.	Charges may also be faxed to
! +1-617-492-9057.  Individuals in Japan who are unable to place international
! calls may use the "free dial" numbers: 0031-13-2473 (KDD) and
! 0066-3382-0158 (IDC).
  
  	Card type: __________________  Expiration Date: _____________
--- 105,110 ----
  
  You can charge a donation to any of Carte Blanche, Diner's Club, JCB,
! MasterCard, Visa, or American Express.	Charges may also be faxed to
! +1-617-542-2652.
  
  	Card type: __________________  Expiration Date: _____________
*************** Cygnus Matches Donations!
*** 121,126 ****
  
  To encourage cash donations to the Free Software Foundation, Cygnus Support
! will continue to contribute corporate funds to FSF to accompany gifts by its
! employees, and by its customers and their employees.
  
  Donations payable to the Free Software Foundation should be sent by eligible
--- 128,133 ----
  
  To encourage cash donations to the Free Software Foundation, Cygnus Support
! will continue to contribute corporate funds to the FSF to accompany gifts by
! its employees, and by its customers and their employees.
  
  Donations payable to the Free Software Foundation should be sent by eligible
*************** the FSF each quarter.  The FSF will prov
*** 129,132 ****
--- 136,140 ----
  recognize the contribution (which is tax-deductible on U.S.  tax returns).
  For more information, please contact Cygnus:
+ 
  	Cygnus Support
  	1937 Landings Drive
*************** Free Software Redistributors Donate
*** 146,163 ****
  ***********************************
  
! by Richard Stallman
  
! The Sun Users Group Deutschland and ASCII Corporation (Japan) have added
! donations to the FSF to the price of their next CD-ROM of GNU software.
! Potential purchasers will know precisely how much of the price is for the FSF
! and how much is for the redistributor.
! 
! Austin Code Works, a redistributor of free software, is supporting free
! software development by giving the FSF 20% of the selling price for the GNU
! software packages they produce and sell.  The producers of the SNOW 2.1 CD
! added the words "Includes $5 donation to the FSF" to the front of their CD.
! Walnut Creek CDROM and Info Magic, two more free software redistributors, are
! also giving us a percentage of their selling price.  CQ Publishing made a
! large donation from the sales of their book about GAWK in Japanese.
  
  In the long run, the success of free software depends on how much new free
--- 154,176 ----
  ***********************************
  
! The SNOW 2.1 CD producers added the words "Includes $5 donation to the FSF"
! to the front of their CD.  Potential buyers will know just how much of the
! price is for the FSF & how much is for the redistributor.
! 
! The Sun Users Group Deutschland & ASCII Corporation (Japan) have added
! donations to the FSF to the price of their next GNU software CD-ROMs.
! 
! Austin Code Works, a free software redistributor, supports free software
! development by giving the FSF 20% of the selling price for the GNU software
! CDs they produce & sell.
  
! Walnut Creek CDROM & Info Magic, free software redistributors, are also
! giving us part of their selling price.
! 
! TOHDO-SHA is donating 400 yen to the FSF for each copy of `The GNU Emacs Lisp
! Reference Manual, Japanese Edition' sold at bookstores in Japan.
! 
! CQ Publishing made a large donation from the sales of their GAWK book in
! Japanese.
  
  In the long run, the success of free software depends on how much new free
*************** have made use of the opportunity.  Many 
*** 167,171 ****
  
  You can help promote free software development by convincing for-a-fee
! redistributors to contribute--either by doing development themselves, or by
  donating to development organizations (the FSF and others).
  
--- 180,184 ----
  
  You can help promote free software development by convincing for-a-fee
! redistributors to contribute--either by doing development themselves or by
  donating to development organizations (the FSF and others).
  
*************** contributes very little; maintaining a p
*** 189,193 ****
  contributes much.  Easy new ports contribute little, since someone else would
  surely do them; difficult ports such as adding a new CPU to the GNU compiler
! contribute more; major new features and programs contribute the most.
  
  By establishing the idea that supporting further development is "the proper
--- 202,206 ----
  contributes much.  Easy new ports contribute little, since someone else would
  surely do them; difficult ports such as adding a new CPU to the GNU compiler
! or Mach contribute more; major new features and programs contribute the most.
  
  By establishing the idea that supporting further development is "the proper
*************** factor, you can help encourage those who
*** 207,216 ****
  contribute to its growth.
  
! These free software support companies regularly donate a part of their income
! to the Free Software Foundation to support the development of new GNU
! programs.  Listing them here is our way of thanking them.  Wingnut has made a
! pledge to donate 10% of their income to the FSF, and has also purchased
! several Deluxe Distribution packages in Japan.	(Wingnut is SRA's special GNU
! support group).	 Also see *Note Cygnus Matches Donations!::.
  
  	Wingnut Project
--- 220,228 ----
  contribute to its growth.
  
! Wingnut (SRA's special GNU support group) regularly donates a part of its
! income to the FSF to support the development of new GNU programs.  Listing
! them here is our way of thanking them.	Wingnut has made a pledge to donate
! 10% of their income to the FSF, and has purchased several Deluxe Distribution
! packages in Japan.  Also see *Note Cygnus Matches Donations!::.
  
  	Wingnut Project
*************** support group).	 Also see *Note Cygnus M
*** 222,225 ****
--- 234,376 ----
  	Fax:	(+81-3)3942-5174
  	E-mail: `info-wingnut@sra.co.jp'
+ 	WWW: `http://www.sra.co.jp/public/sra/product/wingnut/'
+ 
+ 
+ 
+ Major Changes in GNU Software and Documentation
+ ***********************************************
+ 
+    * A New FSF T-shirt!	  (*Note FSF T-shirt::)
+ 
+      We have a new T-shirt.  This design was inspired by the cover of the
+      `GNU Emacs Lisp Reference Manual'.
+ 
+    * GNU Emacs 19.30   (*Note GNU Software::)
+ 
+      We have just released Emacs 19.30.	 New features include support for menu
+      bars on text-only terminals, a total rewrite of GNUS, multiple frames on
+      Windows NT and Windows 95, & many others.
+ 
+    * New Programs on the Tapes	 (*Note GNU Software::)
+ 
+      `gettext' is now on the *Note Languages Tape::.  Termutils & Midnight
+      Commander have been added to the *Note Utilities Tape::.  CLX has been
+      added to the *Note Lisps/Emacs Tape::.  Newer versions of many of our
+      programs & manuals have been placed on all the media we distribute.
+ 
+    * New Source Code CD!
+ 
+      We have just released the December 1995 Source Code CD-ROMs (Edition 7).
+      Due to increasing amounts of GNU Software, the Source Code CD is now a
+      two disc set--the price remains unchanged!	 The new programs included
+      are: apache, CLX, Elisp archive, `ffcall', `gettext', GN, Gnans,
+      `gnuserv', Hyperbole, Midnight Commander, Oaklisp, SIPP, SNePS, Spinner,
+      W3, and `xgrabsc'.	 *Note GNU Software::, for more information about
+      these packages.  Also on the CD-ROMs are full distributions of MIT X11R6
+      (both our Required & Optional distributions), MIT Scheme 7.3, Emacs
+      19.30, GCC 2.7.1, and current versions of all other GNU Software.	For
+      more information, see *Note December 1995 Source Code CD-ROMs::.
+ 
+    * New Compiler Tools CD-ROM
+ 
+      We have a new edition of the Compiler Tools Binaries CD-ROM with updated
+      versions of much of its software.	It contains executables of the GNU
+      compiler tools for some systems that don't normally come with a
+      compiler.	This allows users of those systems to compile their own
+      software without having to buy a proprietary compiler.
+ 
+      We hope to include more systems with each update of this CD-ROM.  If you
+      can help build binaries for new systems or have one to suggest, please
+      contact us at either address on page 1.  For more information, see *Note
+      Compiler Tools Binaries CD-ROM::.
+ 
+    * New/Updated Manuals since Last Bulletin   (*Note Documentation::)
+ 
+      We have a new manual: `The GNU Emacs Lisp Reference Manual, Japanese
+      Edition' - the FSF would like to thank the team of over 30 Japanese who
+      did the translation.  These new editions include bug fixes and
+      additional information: `The GNU Emacs Lisp Reference Manual', `GNU
+      Make', `Bison', `Programming in Emacs Lisp: An Introduction', and `The
+      Termcap Manual'.
+ 
+    * Older FSF CD-ROMs Available at a Reduced Price
+ 
+      While supplies last, older versions of our CD-ROMs are available at a
+      reduced price.  Note that the newest version has bug fixes and
+      improvements that the older versions do not.  See the *note Free
+      Software Foundation Order Form::..
+ 
+    * GNU Software Works on MS-DOS   (Also *note GNU Software::.)
+ 
+      GNU Emacs 19 and many other GNU programs have been ported to MS-DOS for
+      i386/i486/Pentium machines.  We ship binaries & sources on the *Note
+      DJGPP Diskettes::; *Note Emacs Diskettes::; *Note Selected Utilities
+      Diskettes::; & the *Note Compiler Tools Binaries CD-ROM::.	 We will ship
+      binaries & sources on the *Note MS-DOS Book with CD-ROM::, when it is
+      available.
+ 
+    * The FSF Takes Credit Cards
+ 
+      We take these credit cards: Carte Blanche, Diner's Club, MasterCard, JCB,
+      Visa, and American Express.  Please note that we are charged about 5% of
+      an order's total amount in credit card processing fees.  Please consider
+      paying by check instead or adding on a 5% donation to make up the
+      difference.
+ 
+ 
+ 
+ The Deluxe Distribution
+ ***********************
+ 
+ The Free Software Foundation has been asked repeatedly to create a package
+ that provides executables for all of our software.  Normally we offer only
+ sources.  In addition to providing binaries with the source code, the Deluxe
+ Distribution includes a complete set of our printed manuals and reference
+ cards.
+ 
+ The FSF Deluxe Distribution contains the binaries and sources to hundreds of
+ different programs including GNU Emacs, the GNU C Compiler, the GNU Debugger,
+ the complete X Window System, and all the GNU utilities.
+ 
+ We will make a Deluxe Distribution for most machines/operating systems.	 We
+ may be able to send someone to your office to do the compilation, if we can't
+ find a suitable machine close to us.  However, we can only compile the
+ programs that already support your chosen machine/system - porting is a
+ separate matter (to commission a port, consult the GNU Service Directory;
+ details in *Note Free Software Support::).  Compiling all these programs
+ takes time; a Deluxe Distribution for an unusual machine will take longer to
+ produce than one for a common machine.	Please contact the FSF Office with
+ any questions.
+ 
+ We supply the software in one of these tape formats in Unix `tar' format:
+ 1600 or 6250bpi 1/2in reel, Sun DC300XLP 1/4in cartridge - QIC24, IBM RS/6000
+ 1/4in c.t. - QIC 150, Exabyte 8mm c.t., or DAT 4mm c.t.	 If your computer
+ cannot read any of these, please contact us to see if we can handle your
+ format.
+ 
+ The manuals included are one each of the `Bison', `Calc', `GAWK', `GNU C
+ Compiler', `GNU C Library', `GDB', `Flex', `GNU Emacs Lisp Reference',
+ `Programming in Emacs Lisp: An Introduction', `Make', `Texinfo', & `Termcap'
+ manuals; six copies of the `GNU Emacs' manual; and a packet of ten reference
+ cards each for Emacs, Bison, Calc, Flex, & GDB.
+ 
+ Every Deluxe Distribution also has a copy of the latest editions of our
+ CD-ROMs that have sources of our software & compiler tool binaries for some
+ systems.  The MS-DOS CD is in ISO 9660 format.	The other CDs are in ISO 9660
+ format with Rock Ridge extensions.
+ 
+ The price of the Deluxe Distribution is $5000 (shipping included).  These
+ sales provide enormous financial assistance to help the FSF develop more free
+ software.  To order, please fill out the "Deluxe Distribution" section on the
+ *note Free Software Foundation Order Form::.  and send it to:
+ 
+ 	Free Software Foundation, Inc.
+ 	59 Temple Place - Suite 330
+ 	Boston, MA   02111-1307
+ 	USA
+ 
+ 	Telephone: +1-617-542-5942
+ 	Fax (including Japan): +1-617-542-2652
+ 	Electronic mail: gnu@prep.ai.mit.edu
  
  
*************** GNU Documentation
*** 228,282 ****
  *****************
  
! GNU is dedicated to having quality, easy-to-use online and printed
  documentation.	GNU manuals are intended to explain underlying concepts,
! describe how to use all the features of each program, and give examples of
  command use.  GNU manuals are distributed as Texinfo source files, which
! yield both typeset hardcopy via the TeX document formatting system, and online
  hypertext display via the menu-driven Info system.  Source for these manuals
! comes with our software; here we list the manuals that we publish as printed
! books as well; see the *note Free Software Foundation Order Form::..
  
  Most GNU manuals are bound as soft cover books with "lay-flat" bindings.
  This allows you to open them so they lie flat on a table without creasing the
! binding.  These books have an inner cloth spine and an outer cardboard cover
! that will not break or crease as an ordinary paperback will.  Currently, the
! `GDB', `Emacs', `Emacs Lisp Reference', `GAWK', `Make', `Bison', and `Texinfo'
! manuals have this binding.  The other GNU manuals also lie flat when opened,
! using a GBC or Wire-O binding.	All of our manuals are 7in by 9.25in except
! the 8.5in by 11in `Calc' manual.
  
  The edition number of the manual and version number of the program listed
  after each manual's name were current at the time this Bulletin was published.
  
! `Debugging with GDB' (Edition 4.12 for Version 4.14) tells how to use the GNU
! Debugger, run your program under debugger control, examine and alter data,
! modify a program's flow of control, and use GDB through GNU Emacs.
  
! The `Emacs Manual' (11th Edition for Version 19.29) describes editing with
  GNU Emacs.  It explains advanced features, including outline mode and regular
! expression search; how to use special modes for programming in languages like
! C++ and TeX; how to use the `tags' utility; how to compile and correct code;
! how to make your own keybindings; and other elementary customizations.
! 
! `Programming in Emacs Lisp, An Introduction' (Edition 1.03 for Version 19.29)
! is an elementary introduction to programming in Emacs Lisp.  It is written
! for people who are not necessarily interested in programming, but who do want
! to customize or extend their computing environment.   It tells how to write
! programs that find files; switchbuffers; use searches, conditionals, loops,
! and recursion; how to write Emacs initialization files; and how to run the
! Emacs Lisp debuggers.  If you read the text in GNU Emacs under Info mode, you
! can run the sample programs directly.
! 
! The `GNU Emacs Lisp Reference Manual' (Edition 2.4 for Version 19.29) covers
! this programming language in depth, including data types, control structures,
! functions, macros, syntax tables, searching/matching, modes, windows,
! keymaps, byte compilation, and the operating system interface.
  
! The `GAWK Manual' (Edition 0.16 for Version 2.16) tells how to use the GNU
  implementation of `awk'.  It is written for those who have never used `awk'
  and describes the features of this powerful string and record manipulation
  language.
  
! The `Make Manual' (Edition 0.46 for Version 3.72) describes GNU `make', a
  program used to rebuild parts of other programs.  The manual tells how to
  write "makefiles", which specify how a program is to be compiled and how its
--- 379,432 ----
  *****************
  
! GNU is dedicated to having quality, easy-to-use online & printed
  documentation.	GNU manuals are intended to explain underlying concepts,
! describe how to use all the features of each program, & give examples of
  command use.  GNU manuals are distributed as Texinfo source files, which
! yield both typeset hardcopy via the TeX document formatting system and online
  hypertext display via the menu-driven Info system.  Source for these manuals
! comes with our software; here are the manuals that we publish as printed
! books.	See the *note Free Software Foundation Order Form::., to order them.
  
  Most GNU manuals are bound as soft cover books with "lay-flat" bindings.
  This allows you to open them so they lie flat on a table without creasing the
! binding.  They have an inner cloth spine and an outer cardboard cover that
! will not break or crease as an ordinary paperback will.	 Currently, the
! `GDB', `Emacs', `Emacs Lisp Reference', `Programming in Emacs Lisp: An
! Introduction', `GAWK', `Make', `Bison', & `Texinfo' manuals have this
! binding.  The other GNU manuals also lie flat when opened, using a GBC or
! Wire-O binding.	 All our manuals are 7in by 9.25in except the 8.5in by 11in
! `Calc' manual.
  
  The edition number of the manual and version number of the program listed
  after each manual's name were current at the time this Bulletin was published.
  
! `Debugging with GDB' (Edition 4.12 for Version 4.14) tells how to run your
! program under GNU Debugger control, examine and alter data, modify a
! program's flow of control, and use GDB through GNU Emacs.
  
! The `GNU Emacs Manual' (11th Edition for Version 19.29) describes editing with
  GNU Emacs.  It explains advanced features, including outline mode and regular
! expression search; how to use special programming modes to write languages
! like C++ and TeX; how to use the `tags' utility; how to compile and correct
! code; how to make your own keybindings; and other elementary customizations.
! 
! `Programming in Emacs Lisp: An Introduction' (Edition 1.04) is for people who
! are not necessarily interested in programming, but who do want to customize
! or extend their computing environment.	If you read it in Emacs under Info
! mode, you can run the sample programs directly.
! 
! `The GNU Emacs Lisp Reference Manual' (Edition 2.4 for Version 19.29) and
! `The GNU Emacs Lisp Reference, Japanese Edition' (Japanese DRAFT Revision
! 1.0, from English Edition 2.4 for Version 19.29) covers this programming
! language in depth, including data types, control structures, functions,
! macros, syntax tables, searching/matching, modes, windows, keymaps, byte
! compilation, and the operating system interface.
  
! `The GAWK Manual' (Edition 0.16 for Version 2.16) tells how to use the GNU
  implementation of `awk'.  It is written for those who have never used `awk'
  and describes the features of this powerful string and record manipulation
  language.
  
! The `Make Manual' (Edition 0.49 for Version 3.74) describes GNU `make', a
  program used to rebuild parts of other programs.  The manual tells how to
  write "makefiles", which specify how a program is to be compiled and how its
*************** files depend on each other.  Included ar
*** 284,293 ****
  users and a section about automatically generated dependencies.
  
! The `Flex Manual' (Edition 1.03 for Version 2.3.7) teaches you to write a
  lexical scanner definition for the `flex' program to create a C++ or C-coded
  scanner that recognizes the patterns defined.  You need no prior knowledge of
  scanners.
  
! The `Bison Manual' (December 1993 Edition for Version 1.23) teaches you how
  to write context-free grammars for the Bison program that convert into
  C-coded parsers.  You need no prior knowledge of parser generators.
--- 434,443 ----
  users and a section about automatically generated dependencies.
  
! The `Flex' manual (Edition 1.03 for Version 2.3.7) teaches you to write a
  lexical scanner definition for the `flex' program to create a C++ or C-coded
  scanner that recognizes the patterns defined.  You need no prior knowledge of
  scanners.
  
! The `Bison' manual (December 1993 Edition for Version 1.23) teaches you how
  to write context-free grammars for the Bison program that convert into
  C-coded parsers.  You need no prior knowledge of parser generators.
*************** to run, install, and port the GNU C Comp
*** 297,309 ****
  features and incompatibilities of GCC, but people not familiar with C will
  still need a good reference on the C programming language.  It also covers
! G++.
  
! The `Texinfo Manual' (Edition 2.20 for Version 3) explains the markup
! language used to generate both the online Info documentation and typeset
! hardcopies.  It tells you how to make tables, lists, chapters, nodes,
! indexes, cross references, how to use Texinfo mode in GNU Emacs, and how to
! catch mistakes.	 This second edition describes over 50 new commands.
  
! The `Termcap Manual' (2nd Edition for Version 1.2), often described as "twice
  as much as you ever wanted to know about termcap," details the format of the
  termcap database, the definitions of terminal capabilities, and the process
--- 447,460 ----
  features and incompatibilities of GCC, but people not familiar with C will
  still need a good reference on the C programming language.  It also covers
! G++.  We are doing limited copier runs of this manual until it becomes more
! stable.
  
! The `Texinfo' manual (Edition 2.21 for Version 3) explains the markup
! language that produces our online Info documentation & typeset hardcopies.
! It tells you how to make tables, lists, chapters, nodes, indexes, cross
! references, & how to catch mistakes.  This second edition describes over 50
! new commands.
  
! `The Termcap Manual' (2nd Edition for Version 1.2), often described as "twice
  as much as you ever wanted to know about termcap," details the format of the
  termcap database, the definitions of terminal capabilities, and the process
*************** programmers.
*** 312,319 ****
  
  The `C Library Reference Manual' (Edition 0.06 for Version 1.09) describes
! most of the facilities of the GNU C library, including both what Unix calls
! "library functions" and "system calls."	 We are doing limited copier runs of
! this manual until it becomes more stable.  Please send corrections and
! improvements to `bug-glibc-manual@prep.ai.mit.edu'.
  
  The `Emacs Calc Manual' (Edition 2.02 for Version 2.02) is both a tutorial
--- 463,469 ----
  
  The `C Library Reference Manual' (Edition 0.06 for Version 1.09) describes
! the library's facilities, including both what Unix calls "library functions"
! & "system calls."  We are doing small copier runs of this manual until it
! becomes more stable.  Please send fixes to `bug-glibc-manual@prep.ai.mit.edu'.
  
  The `Emacs Calc Manual' (Edition 2.02 for Version 2.02) is both a tutorial
*************** Calc.
*** 324,332 ****
  
  
! GNU Software - (NOT COMPLETELY UP TO DATE)
  ************
  
  All our software is available via FTP; see *Note How to Get GNU Software::.
! In addition, we offer software on various media and printed documentation:
  
     * *Note CD-ROMs::.
--- 474,482 ----
  
  
! GNU Software
  ************
  
  All our software is available via FTP; see *Note How to Get GNU Software::.
! We also offer software on various media and printed documentation:
  
     * *Note CD-ROMs::.
*************** In addition, we offer software on variou
*** 338,348 ****
     * *Note Documentation::, which includes manuals and reference cards.
  
! We welcome all bug reports sent to the appropriate electronic mailing list
! (*note Free Software Support::.).
! 
! In the articles describing the contents of each medium, the version number
  listed after each program name was current when we published this Bulletin.
! When you order a distribution tape, diskette or newer CD-ROM, some of the
! programs may be newer, and therefore the version number higher.
  
  Key to cross reference:
--- 488,534 ----
     * *Note Documentation::, which includes manuals and reference cards.
  
! In these articles describing the contents of each medium, the version number
  listed after each program name was current when we published this Bulletin.
! When you order a distribution tape, diskette, or newer CD-ROM, some of the
! programs may be newer and therefore the version number higher.	See the *note
! Free Software Foundation Order Form::., for ordering information.
! 
! Some of the contents of our tape and FTP distributions are compressed.	We
! have software on our tapes and FTP sites to uncompress these files.  Due to
! patent troubles with `compress', we use another compression program, `gzip'.
! (Such prohibitions on software development are fought by the League for
! Programming Freedom; *note What Is the LPF::., for details.)
! 
! GNU `make' is on several of our tapes because some system vendors supply no
! `make' utility at all and some native `make' programs lack the `VPATH'
! feature essential for using the GNU configure system to its full extent.  The
! GNU `make' sources have a shell script to build `make' itself on such systems.
! 
! We welcome all bug reports and enhancements sent to the appropriate
! electronic mailing list (*note Free Software Support::.).
! 
! 
! 
! Configuring GNU Software
! ------------------------
! 
! We are using, Autoconf, a uniform scheme for configuring GNU software
! packages in order to compile them (see "Autoconf" below, in this article).
! The goal is to have all GNU software support the same alternatives for naming
! machine and system types.
! 
! Ultimately, it will be possible to configure and build the entire system all
! at once, eliminating the need to configure each individual package separately.
! 
! You can also specify both the host and target system to build
! cross-compilation tools.  Most GNU programs now use Autoconf-generated
! configure scripts.
! 
! 
! 
! GNU Software currently available
! --------------------------------
! 
! For future programs and features, see *Note Forthcoming GNUs::.
  
  Key to cross reference:
*************** Key to cross reference:
*** 350,367 ****
  
      BinCD
! 	  Binaries CD-ROM
  
!     DjgppD
  	  Djgpp Diskettes
  
!     DosCD
! 	  MS-DOS CD-ROM
  
      EmcsD
  	  Emacs Diskettes
  
-     LspEmcT
- 	  Lisps/Emacs Tape
- 
      LangT
  	  Languages Tape
--- 536,550 ----
  
      BinCD
! 	  December 1994 Binaries CD-ROM
  
!     DjgpD
  	  Djgpp Diskettes
  
!     DosBC
! 	  MS-DOS Book with CD-ROM
  
      EmcsD
  	  Emacs Diskettes
  
      LangT
  	  Languages Tape
*************** Key to cross reference:
*** 370,378 ****
  	  4.4BSD-Lite Tape
  
      SchmT
  	  Scheme Tape
  
      SrcCD
! 	  Source CD-ROM
  
      UtilD
--- 553,564 ----
  	  4.4BSD-Lite Tape
  
+     LspEmcT
+ 	  Lisps/Emacs Tape
+ 
      SchmT
  	  Scheme Tape
  
      SrcCD
! 	  December 1995 Source CD-ROMs
  
      UtilD
*************** Key to cross reference:
*** 382,386 ****
  	  Utilities Tape
  
!     VMSCompT
  	  VMS Compiler Tape
  
--- 568,572 ----
  	  Utilities Tape
  
!     VMSCmpT
  	  VMS Compiler Tape
  
*************** Key to cross reference:
*** 397,426 ****
  	  X11 Required Tape
  
  
! 
! Configuring GNU Software:
! 
! We are using a uniform scheme for configuring GNU software packages in order
! to compile them.  It uses the `Autoconf' program (see item below).  The goal
! is to have all GNU software support the same alternatives for naming machine
! and system types.   When the GNU system is complete it will be possible to
! configure and build the entire system at once, eliminating the need to
! separately configure each individual package.	The configuration scheme lets
! you specify both the host and target system to build cross-compilation tools.
! 
! 
! 
! GNU software currently available:
! 
! (For new features and coming programs, see *Note Forthcoming GNUs::.)
! 
!    * `acm'	   (SrcCD, UtilT)
  
       `acm' is a LAN-oriented, multiplayer aerial combat simulation that runs
       under the X Window System.	 Players engage in air to air combat against
       one another using heat seeking missiles and cannons.  We are working on
!      more accurate simulation of real airplane flight characteristics.
  
!    * Autoconf	      (SrcCD, UtilT)
  
       Autoconf produces shell scripts which automatically configure source code
--- 583,607 ----
  	  X11 Required Tape
  
+ [FSFman] shows that we sell a manual for that package.	[FSFrc] shows we sell
+ a reference card for that package.  To order them, see the *note Free
+ Software Foundation Order Form::..  *Note Documentation::, for more
+ information on the manuals.  Source code for each manual or reference card is
+ included with each package.
  
!    * `acm'   (SrcCD, UtilT)
  
       `acm' is a LAN-oriented, multiplayer aerial combat simulation that runs
       under the X Window System.	 Players engage in air to air combat against
       one another using heat seeking missiles and cannons.  We are working on
!      a more accurate simulation of real airplane flight characteristics.
! 
!    * apache   (SrcCD)
! 
!      Apache is an HTTP server designed as a plug-in replacement for version
!      1.3 or 1.4 of the NCSA server.  It fixes numerous bugs in the NCSA
!      server and includes many frequently requested new features, and has an
!      API which allows it to be extended to meet users' needs more easily.
  
!    * Autoconf	(SrcCD, UtilT)
  
       Autoconf produces shell scripts which automatically configure source code
*************** GNU software currently available:
*** 432,449 ****
       generates do not.
  
!      Most GNU programs now use Autoconf-generated configure scripts.
  
!    * BASH	  (SrcCD, UtilT)
  
!      The GNU shell, BASH (Bourne Again SHell), is compatible with the Unix
!      `sh' and offers many extensions found in `csh' and `ksh'.	BASH has job
!      control, `csh'-style command history, and command-line editing (with
!      Emacs and `vi' modes built-in, and the ability to rebind keys) via the
!      readline library.	BASH conforms to the POSIX 1003.2 shell specification.
! 
!    * `bc'	  (DjgppD, DosCD, SrcCD, UtilT)
  
       `bc' is an interactive algebraic language with arbitrary precision
!      numbers.  GNU `bc' follows the POSIX.2-1992 standard, with several
       extensions including multi-character variable names, an `else'
       statement, and full Boolean expressions.  The RPN calculator `dc' is now
--- 613,628 ----
       generates do not.
  
!    * BASH   (SrcCD, UtilT)
  
!      GNU's shell, BASH (Bourne Again SHell), is compatible with the Unix `sh'
!      and offers many extensions found in `csh' and `ksh'.  BASH has job
!      control, `csh'-style command history, command-line editing (with Emacs
!      and `vi' modes built-in, and the ability to rebind keys) via the
!      `readline' library.  BASH conforms to the POSIX 1003.2-1992 standard.
  
!    * `bc'   (DosBC, SrcCD, UtilT)
  
       `bc' is an interactive algebraic language with arbitrary precision
!      numbers.  GNU `bc' follows the POSIX 1003.2-1992 standard, with several
       extensions including multi-character variable names, an `else'
       statement, and full Boolean expressions.  The RPN calculator `dc' is now
*************** GNU software currently available:
*** 451,455 ****
       as a `dc' preprocessor.
  
!    * BFD	 (BinCD, DjggpD, DosCD, LangT, SrcCD)
  
       The Binary File Descriptor library allows a program which operates on
--- 630,634 ----
       as a `dc' preprocessor.
  
!    * BFD   (BinCD, DjgpD, DosBC, LangT, SrcCD)
  
       The Binary File Descriptor library allows a program which operates on
*************** GNU software currently available:
*** 458,482 ****
       know the details of a particular format.  One result is that all
       programs using BFD will support formats such as a.out, COFF, and ELF.
!      BFD comes with source for Texinfo documentation (not yet published on
!      paper).   Presently BFD is not distributed separately; it is included
!      with packages that use it.
  
!    * Binutils	      (BinCD, DjgppD, DosCD, LangT, SrcCD)
  
!      Binutils includes the programs: `ar', `c++filt', `demangle', `gas',
       `gprof', `ld', `nlmconv', `nm', `objcopy', `objdump', `ranlib', `size',
!      `strings', and `strip'.
  
!      Binutils Version 2 uses the BFD library.  The GNU linker `ld' emits
       source-line numbered error messages for multiply-defined symbols and
!      undefined references.  It interprets a superset of the AT&T Linker
!      Command Language, which gives general control over where segments are
!      placed in memory.	`nlmconv' converts object files into Novell NetWare
!      Loadable Modules.	`objdump' can disassemble code for a29k, ALPHA,
!      H8/300, H8/500, HP-PA, i386, i960, m68k, m88k, MIPS, SH, SPARC, & Z8000
!      processors, and can display other data (e.g., symbols & relocations)
!      from any file format understood by BFD.
  
!    * Bison	   (BinCD, DjgppD, DosCD, LangT, SrcCD, VMSCompT)
  
       Bison is an upwardly compatible replacement for the parser generator
--- 637,666 ----
       know the details of a particular format.  One result is that all
       programs using BFD will support formats such as a.out, COFF, and ELF.
!      BFD comes with Texinfo source for a manual (not yet published on paper).
! 
!      At present, BFD is not distributed separately; it is included with
!      packages that use it.
  
!    * Binutils	(BinCD, DjgpD, DosBC, LangT, SrcCD; `gas' only on VMSCmpT)
  
!      Binutils includes these programs: `ar', `c++filt', `demangle', `gas',
       `gprof', `ld', `nlmconv', `nm', `objcopy', `objdump', `ranlib', `size',
!      `strings', & `strip'.
  
!      Binutils version 2 uses the BFD library.  The GNU assembler, `gas',
!      supports the a29k, Alpha, H8/300, H8/500, HP-PA, i386, i960, m68k, m88k,
!      MIPS, NS32K, SH, SPARC, Tahoe, Vax and Z8000 CPUs, and attempts to be
!      compatible with many other assemblers for UNIX and embedded systems.  It
!      can produce mixed C-and-assembly listings, and includes a macro facility
!      similar to that in some other assemblers.	GNU's linker `ld' emits
       source-line numbered error messages for multiply-defined symbols and
!      undefined references, and interprets a superset of AT&T's Linker Command
!      Language, which gives control over where segments are placed in memory.
!      `nlmconv' converts object files into Novell NetWare Loadable Modules.
!      `objdump' can disassemble code for most of the CPUs listed above, and
!      can display other data (e.g., symbols and relocations) from any file
!      format read by BFD.
  
!    * Bison   (BinCD,DjgpD,DosBC,LangT,SrcCD,VMSCmpT)[FSFman,FSFrc]
  
       Bison is an upwardly compatible replacement for the parser generator
*************** GNU software currently available:
*** 484,492 ****
       included.	*Note Documentation::.
  
!      We recently decided to change the policy for using the parsers that
!      Bison generates.  It is now permitted to use Bison-generated parsers in
!      non-free programs.	 *Note GNUs Flashes::.
  
!    * GNU C Library	   (BinCD, LangT, SrcCD)
  
       The GNU C library supports ANSI C-1989, POSIX 1003.1-1990 and most of the
--- 668,675 ----
       included.	*Note Documentation::.
  
!      A recent policy change allows non-free programs to use Bison-generated
!      parsers.  *Note Conditions for Using Bison::.
  
!    * C Library	 (BinCD, LangT, SrcCD) [FSFman]
  
       The GNU C library supports ANSI C-1989, POSIX 1003.1-1990 and most of the
*************** GNU software currently available:
*** 494,499 ****
       and includes many System V functions, plus GNU extensions.
  
!      The C Library will perform many functions of the Unix system calls in
!      the Hurd.	Mike Haertel has written a fast `malloc' which wastes less
       memory than the old GNU version.  The GNU regular-expression functions
       (`regex' and `rx') now nearly conform to the POSIX 1003.2 standard.
--- 677,682 ----
       and includes many System V functions, plus GNU extensions.
  
!      The C Library performs many functions of the Unix system calls in the
!      GNU/Hurd.	Mike Haertel has written a fast `malloc' which wastes less
       memory than the old GNU version.  The GNU regular-expression functions
       (`regex' and `rx') now nearly conform to the POSIX 1003.2 standard.
*************** GNU software currently available:
*** 510,530 ****
       The C Library runs on Sun-3 (SunOS 4.1), Sun-4 (SunOS 4.1 or Solaris 2),
       HP 9000/300 (4.3BSD), SONY News 800 (NewsOS 3 or 4), MIPS DECstation
!      (Ultrix 4), DEC Alpha (OSF/1), i386/i486 (System V, SVR4, BSD, SCO 3.2 &
!      SCO ODT 2.0), Sequent Symmetry i386 (Dynix 3) & SGI (Irix 4).  Texinfo
!      source for the `GNU C Library Reference Manual' is included (*note
!      Documentation::.); the manual is now being updated.
  
!    * GNU C++ Library	     (BinCD, DjgppD, DosCD, LangT, SrcCD)
  
       The GNU C++ library (libg++) contains an extensive collection of C++
!      `forest' classes, an IOStream library for input/output routines, and
       support tools for use with G++.  Supported classes include: Obstacks,
       multiple-precision Integers and Rationals, Complex numbers, arbitrary
!      length Strings, BitSets and BitStrings.   Version 2.6.2 includes the
!      initial release of the libstdc++ library.	This implements library
!      facilities defined by the forthcoming ANSI/ISO C++ standard, including
!      the Standard Template Library.
  
!    * Calc	  (LspEmcT, SrcCD)
  
       Calc (written by Dave Gillespie in Emacs Lisp) is an extensible, advanced
--- 693,714 ----
       The C Library runs on Sun-3 (SunOS 4.1), Sun-4 (SunOS 4.1 or Solaris 2),
       HP 9000/300 (4.3BSD), SONY News 800 (NewsOS 3 or 4), MIPS DECstation
!      (Ultrix 4), DEC Alpha (OSF/1), i386/i486/Pentium (System V, SVR4, BSD,
!      SCO 3.2, & SCO ODT 2.0), Sequent Symmetry i386 (Dynix 3), & SGI (Irix
!      4).  *Note Forthcoming GNUs::.  Texinfo source for the
!      `GNU C Library Reference Manual' is included (*note Documentation::..
  
!    * C++ Library   (BinCD, DjgpD, DosBC, LangT, SrcCD)
  
       The GNU C++ library (libg++) contains an extensive collection of C++
!      "forest" classes, an IOStream library for input/output routines, and
       support tools for use with G++.  Supported classes include: Obstacks,
       multiple-precision Integers and Rationals, Complex numbers, arbitrary
!      length Strings, BitSets, and BitStrings.
  
!      The distribution also includes the libstdc++ library.  This implements
!      library facilities defined by the forthcoming ANSI/ISO C++ standard,
!      including a port of the Standard Template Library.
! 
!    * Calc   (DosBC, LspEmcT, SrcCD) [FSFman, FSFrc]
  
       Calc (written by Dave Gillespie in Emacs Lisp) is an extensible, advanced
*************** GNU software currently available:
*** 532,558 ****
       can use Calc just as a simple four-function calculator, but it has many
       more features including: choice of algebraic or RPN (stack-based) entry;
!      logarithmic, trigonometric & financial functions; arbitrary precision;
       complex numbers; vectors; matrices; dates; times; infinities; sets;
       algebraic simplification; differentiation & integration.  It outputs to
!      `gnuplot' & comes with source for a reference card & a Manual.  *Note
!      Documentation::.
  
!    * GNU Chess	       (SrcCD, UtilT, WdwsD)
  
!      GNU Chess lets the computer play a full game of chess with you.  It runs
!      on most platforms & has dumb terminal, "curses" & X terminal interfaces.
!      The X terminal interface is based on the `xboard' program.
!      m{No Value For "ergegrafkludge"} GNU Chess implements many specialized
!      features including the null move heuristic, a hash table with aging, the
!      history heuristic (another form of the earlier killer heuristic),
!      caching of static evaluations, & a database which lets it play the first
!      several moves of the game quickly.	  Recent improvements include better
!      heuristics, faster evaluation, thinking on opponent's time, a perfect
!      King and Pawn vs King endgame routine, Swedish & German language
!      support, support for more book formats, a rudimentary Bobby Fischer
!      clock, & bug fixes.   It is primarily supported by Stuart Cracraft, Chua
!      Kong Sian, & Tim Mann on behalf of the FSF.
  
!    * CLISP	   (LspEmcT, SrcCD)
  
       CLISP is a Common Lisp implementation by Bruno Haible and Michael Stoll.
--- 716,753 ----
       can use Calc just as a simple four-function calculator, but it has many
       more features including: choice of algebraic or RPN (stack-based) entry;
!      logarithmic, trigonometric, & financial functions; arbitrary precision;
       complex numbers; vectors; matrices; dates; times; infinities; sets;
       algebraic simplification; differentiation & integration.  It outputs to
!      `gnuplot', & comes with source for a manual & reference card (*note
!      Documentation::.).
  
!    * `cfengine'	  (SrcCD, UtilT)
  
!      `cfengine' is used for maintaining site-wide configuration of a
!      heterogeneous Unix network using a simple high level language.  Its
!      appearance is similar to `rdist', but also allows many more operations
!      to be performed automatically.  See Mark Burgess, "A Site Configuration
!      Engine", `Computing Systems', Vol. 8, No. 3 (ask `office@usenix.org' how
!      to get a copy).
  
!    * Chess   (SrcCD, UtilT, WdwsD)
! 
!      GNU Chess enables most modern computers to play a full game of chess.  It
!      supports a plain terminal interface, a curses interface, and a spiffy X
!      Window interface via `xboard'.
! 
!      Improvements this past year include fixes to the game analyzer, book, &
!      hash table; smartening up draw and mate; improved thinking on opponent's
!      time; Autoconf installation; a makefile for Windows NT compilation;
!      forward pruning; unlimited quiescence captures; improved evaluation;
!      improved null & time control logic; & repetition-detection.
! 
!      GNU Chess was originated by Stuart Cracraft.  Improvements & rewrites are
!      from John Stanback, Cha Kong Sian, Mike McGann, and many others.
! 
!      Send bugs to `bug-gnu-chess@prep.ai.mit.edu' & general comments to
!      `info-gnu-chess@prep.ai.mit.edu'.
! 
!    * CLISP   (LspEmcT, SrcCD)
  
       CLISP is a Common Lisp implementation by Bruno Haible and Michael Stoll.
*************** GNU software currently available:
*** 560,647 ****
       edition)' and the ANSI Common Lisp standard.  CLISP includes an
       interpreter, a byte-compiler, a large subset of CLOS, a foreign language
!      interface and, for some machines, a screen editor.	 The user interface
!      language (English, German, French) is chooseable at run time.  Major
       packages that run in CLISP include CLX & Garnet.  CLISP needs only 2 MB
       of memory & runs on many microcomputers (including MS-DOS systems, OS/2,
!      the Atari ST, Amiga 500-4000, Acorn RISC PC) & Unix-like systems
!      (GNU/Linux, Sun4, SVR4, SGI, HP-UX, DEC Alpha, NeXTstep & others).
  
!    * GNU Common Lisp	     (LspEmcT, SrcCD)
  
!      GNU Common Lisp (GCL) has a compiler and interpreter for Common Lisp.  It
!      used to be known as Kyoto Common Lisp.  It is very portable and extremely
!      efficient on a wide class of applications.	 It compares favorably in
!      performance with commercial Lisps on several large theorem-prover and
!      symbolic algebra systems.	It supports the CLtL1 specification but is
!      moving towards the proposed ANSI definition.   GCL compiles to C and
!      then uses the native optimizing C compilers (e.g., GCC).  A function
!      with a fixed number of args and one value turns into a C function of the
!      same number of args, returning one value, so GCL is maximally efficient
!      on such calls.  It has a conservative garbage collector which allows
!      great freedom for the C compiler to put Lisp values in arbitrary
!      registers.	 It has a source level Lisp debugger for interpreted code,
!      with display of source code in an Emacs window.  Ita profiling tools
!      (based on the C profiling tools) count function calls and the time spent
!      in each function.	CLX works with GCL.
! 
!      There is now a builtin interface with the TK widget system.  It runs in
!      a separate process so that users may monitor progress on lisp
!      computations, or interact with running computations via a windowing
!      interface.
! 
!      There is also an Xlib interface via C (xgcl-2).  PCL runs with GCL (see
!      PCL item later in this article).  *Note Forthcoming GNUs::, for plans for
!      about GCL, or for recent developments.   GCL version 2.0 is released
!      under the GNU Library General Public License.
! 
!    * `cpio'	    (DjgppD, DosCD, SrcCD, UtilD, UtilT)
! 
!      `cpio' is an alternative archive program with all the features of SVR4
!      `cpio', including support for the final POSIX 1003.1 `ustar' standard.
!      `mt', a program to position magnetic tapes, is included with `cpio'.
! 
!    * CVS	 (SrcCD, UtilT)
! 
!      CVS, the Concurrent Version System, manages software revision and release
!      control in a multi-developer, multi-directory, multi-group environment.
!      It works best in conjunction with RCS versions 4 and above, but will
!      parse older RCS formats with the loss of CVS's fancier features.  See
!      Berliner, Brian, "CVS-II: Parallelizing Software Development,"
!      `Proceedings of the Winter 1990 USENIX Association Conference'.  To find
!      out how to get a copy of this report, contact `office@usenix.org'.
! 
!    * DejaGnu	     (LangT, SrcCD)
! 
!      DejaGnu is a framework for testing other programs that provides a single
!      front end for all tests.  The framework's flexibility and consistency
!      makes it easy to write tests for any program.  DejaGnu comes with
!      `expect', which runs scripts to conduct dialogs with programs.
  
!    * Diffutils	       (DjgppD, DosCD, SrcCD, UtilD, UtilT)
  
       GNU `diff' compares files showing line-by-line changes in several
       flexible formats.	It is much faster than traditional Unix versions.  The
!      Diffutils package contains `diff', `diff3', `sdiff', and `cmp'.
  
!      Recent Diffutils improvements include more consistent handling of
!      character sets, and a new `diff' option to do all input/output in
!      binary; this is useful on some non-Posix hosts.
! 
!      Plans for the Diffutils package include support for internationalization
!      (e.g., error messages in Chinese), and for some non-Unix PC environments.
! 
!    * DJGPP	   (BinCD, DjgppD, DosCD)
! 
!      DJ Delorie has ported GCC/G++ 2.6.0 (see the GCC item in this section)
!      to the i386 MS-DOS platform.  The DJGPP package also contains a 32-bit
!      80386 DOS extender with symbolic debugger; development libraries; and
!      ports of Bison, `flex', GAS, and the GNU Binutils.	 Full source code is
!      provided.	It requires at least 5MB of hard disk space to install and
!      512K of RAM to use.  It supports SVGA (up to 1024x768), XMS & VDISK
!      memory allocation, `himem.sys', VCPI (e.g., QEMM, DESQview, & 386MAX),
!      and DPMI (e.g., Windows 3.x, OS/2, QEMM, & QDPMI).	  Ask
!      `djgpp-request@sun.soe.clarkson.edu' to join a DJGPP users mailing list.
  
!    * `dld'	   (LangT, SrcCD)
  
       `dld' is a dynamic linker written by W. Wilson Ho.	 Linking your program
--- 755,851 ----
       edition)' and the ANSI Common Lisp standard.  CLISP includes an
       interpreter, a byte-compiler, a large subset of CLOS, a foreign language
!      interface, and, for some machines, a screen editor.  The user interface
!      language (English, German, French) is choosable at run time.  Major
       packages that run in CLISP include CLX & Garnet.  CLISP needs only 2 MB
       of memory & runs on many microcomputers (including MS-DOS systems, OS/2,
!      Windows NT, Amiga 500-4000, Acorn RISC PC) & Unix-like systems
!      (GNU/Linux, Sun4, SVR4, SGI, HP-UX, DEC Alpha, NeXTStep, & others).
! 
!    * Common Lisp   **Note Forthcoming GNUs::*	(LspEmcT, SrcCD)
! 
!      GNU Common Lisp (GCL, formerly known as Kyoto Common Lisp) is a compiler
!      & interpreter for Common Lisp.  GCL is very portable & extremely
!      efficient on a wide class of applications, & compares favorably in
!      performance with commercial Lisps on several large theorem-prover &
!      symbolic algebra systems.	GCL supports the CLtL1 specification but is
!      moving towards the proposed ANSI standard.
! 
!      GCL compiles to C & then uses the native optimizing C compiler (e.g.,
!      GCC).  A function with a fixed number of args & one value turns into a C
!      function of the same number of args, returning one value--so GCL is
!      maximally efficient on such calls.	 Its conservative garbage collector
!      gives great freedom to the C compiler to put Lisp values in registers.
!      It has a source level Lisp debugger for interpreted code & displays
!      source code in an Emacs window.  Its profiler (based on the C profiling
!      tools) counts function calls & the time spent in each function.
! 
!      There is now a built-in interface to the Tk widget system.	 It runs in a
!      separate process, so users may monitor progress on Lisp computations or
!      interact with running computations via a windowing interface.
! 
!      There is also an Xlib interface via C (xgcl-2).   CLX runs with GCL, as
!      does PCL (see "PCL" later in this article).  *Note Forthcoming GNUs::,
!      for plans regarding GCL or for recent developments.
! 
!      GCL version 2.2 is released under the GNU Library General Public License.
! 
!    * CLX   (LspEmcT, SrcCD)
! 
!      CLX is an X Window interface library for GCL.
! 
!    * `cpio'   (DosBC, SrcCD, UtilD, UtilT)
! 
!      `cpio' is an archive program with all the features of SVR4 `cpio',
!      including support for the final POSIX 1003.1 `ustar' standard.  `mt', a
!      program to position magnetic tapes, is included with `cpio'.
! 
!    * CVS   (SrcCD, UtilT)
  
!      CVS, the Concurrent Version System, manages software revision & release
!      control at a multi-developer, multi-directory, multi-group site.  It
!      works best with RCS versions 4 and above, but will parse older RCS
!      formats, losing some of CVS's fancier features.  (See Berliner, Brian,
!      "CVS-II: Parallelizing Software Development," `Proceedings of the Winter
!      1990 USENIX Association Conference'; ask `office@usenix.org' how to get
!      a copy.)
  
!    * DejaGnu   (LangT, SrcCD)
  
!      DejaGnu is a framework to test programs with a single front end for all
!      tests.  The framework's flexibility & consistency makes it easy to write
!      tests.
! 
!      DejaGnu comes with `expect', which runs scripts to conduct dialogs with
!      programs.
! 
!    * Diffutils	 (DjgpD, DosBC, SrcCD, UtilT)
  
       GNU `diff' compares files showing line-by-line changes in several
       flexible formats.	It is much faster than traditional Unix versions.  The
!      Diffutils package contains `diff', `diff3', `sdiff', & `cmp'.  Recent
!      improvements include more consistent handling of character sets and a
!      new `diff' option to do all input/output in binary; this is useful on
!      some non-POSIX hosts.  Plans for the Diffutils package include support
!      for internationalization (e.g., error messages in Chinese) and for some
!      non-Unix PC environments.
! 
!    * DJGPP   (BinCD, DjgpD, DosBC)
! 
!      DJ Delorie has ported GCC/G++ (see "GCC" in this article) to i386s
!      running MS-DOS.  DJGPP has a 32-bit i386 DOS extender with a symbolic
!      debugger; development libraries; & ports of Bison, `flex', & Binutils.
!      Full source code is provided.  It needs at least 5MB of hard disk space
!      to install & 512K of RAM to use.  It supports SVGA (up to 1024x768), XMS
!      & VDISK memory allocation, `himem.sys', VCPI (e.g., QEMM, DESQview, &
!      386MAX), & DPMI (e.g., Windows 3.x, OS/2, QEMM, & QDPMI).
! 
!      The FSF offers it on the *Note Compiler Tools Binaries CD-ROM::, and on
!      the *Note DJGPP Diskettes::.  FTP from `oak.oakland.edu' in
!      `/simtel/vendors/djgpp/' (or another SimTel mirror site).
  
!      To join a DJGPP users mailing list, ask
!      `djgpp-request@sun.soe.clarkson.edu'.
  
!    * `dld'   (LangT, SrcCD)
  
       `dld' is a dynamic linker written by W. Wilson Ho.	 Linking your program
*************** GNU software currently available:
*** 650,777 ****
       3.4 & 4.0), SPARC (SunOS 4.0), Sequent Symmetry (Dynix), & Atari ST.
  
!    * `doschk'	      (DjgppD, DosCD, SrcCD, UtilT)
  
!      This program is intended as a utility to help software developers ensure
!      that their source file names are distinguishable on System V platforms
!      with 14-character filenames and on MS-DOS with 8+3 character filenames.
  
!    * `ecc'	   (SrcCD, UtilT)
  
       `ecc' is a Reed-Solomon error correction checking program, which can
       correct three byte errors in a block of 255 bytes and detect more severe
!      errors.  Contact `paulf@Stanford.EDU' for more information.
  
!    * `ed'	  (SrcCD, UtilT)
  
!      Ed is the standard text editor.
  
!    * Elib	  (LspEmcT, SrcCD)
  
       Elib is a small library of Emacs Lisp functions, including routines for
       using AVL trees and doubly-linked lists.
  
!    * GNU Emacs
  
       In 1975, Richard Stallman developed the first Emacs, an extensible,
!      customizable real-time display editor and computing environment.  GNU
!      Emacs is his second implementation.  It offers true Lisp--smoothly
!      integrated into the editor--for writing extensions, and provides an
!      interface to the X Window System.	It also runs on MS-DOS and Windows
!      NT.  In addition to its powerful native command set, Emacs has
!      extensions which emulate the editors vi and EDT (DEC's VMS editor).
!      Emacs has many other features which make it a full computing support
!      environment.  Our long term plan is now to move it in the direction of a
!      WYSIWYG word processor and make it easy for beginners to use.  Source
!      for the `GNU Emacs Manual', `Programming in Emacs Lisp, An
!      Introduction', the `GNU Emacs Lisp Reference Manual', and a reference
!      card come with the software.  *Note Documentation::.
! 
!    * GNU Emacs 18	  (EmcsD, LspEmcT, SrcCD, VMSEmcsT)
! 
!      GNU Emacs 18.59 is the last release of version 18 from the FSF.  We are
!      no longer maintaining it.	It runs on many Unix systems.  In hardware
!      order: Alliant FX/80 & FX/2800, Altos 3068, Amdahl (UTS), Apollo, AT&T
!      (3Bs & 7300 PC), DG Aviion, Bull DPX/2 (2nn & 3nn) CCI 5/32 & 6/32,
!      Celerity, Convex, Digital (DECstation 3100 & 5000 (PMAXes), Mips, VAX
!      (BSD, SysV & VMS)), Motorola Delta 147 & 187, Dual, Elxsi 6400, Encore
!      (DPC, APC & XPC), Gould, HP (9000 series 200, 300, 700 & 800, but not
!      500), HLH Orion (original & 1/05), IBM (RS/6000 (AIX), RT/PC (4.2 & AIX)
!      & PS/2 (AIX (386 only))), ISI (Optimum V, 80386), Intel 860 & 80386
!      (BSD, Esix, SVR3, SVR4, SCO, ISC, IX, AIX & others), Iris (2500, 2500
!      Turbo & 4D), Masscomp, MIPS, National Semiconductor 32000, NeXT (Mach),
!      NCR Tower 32 (SVR2 & SVR3), Nixdorf Targon 31, Nu (TI & LMI), pfa50,
!      Plexus, Prime EXL, Pyramid (original & MIPS), Sequent (Balance &
!      Symmetry), SONY News (m68k & MIPS), Stride (system release 2), all Suns
!      including 386i (all SunOS & some Solaris vers.), Tadpole, Tahoe, Tandem
!      Integrity S2, Tektronix (16000 & 4300), Triton 88, Ustation E30 (SS5E),
!      Whitechapel (MG1) & Wicat.
! 
!      In operating system order: AIX (RS/6000, RT/PC, 386-PS/2), BSD (vers.
!      4.1, 4.2, 4.3), DomainOS, Esix (386), HP-UX (HP 9000 series 200, 300,
!      700, 800 but not 500), ISC (386), IX (386), Mach, Microport, NewsOS
!      (Sony m68k & MIPS) SCO (386), SVR0 (Vax, AT&T 3Bs), SVR2, SVR3, SVR4,
!      Solaris 2.0, SunOS, UTS (Amdahl), Ultrix (vers. 3.0, 4,1), Uniplus 5.2
!      (Dual machines), VMS (vers. 4.0, 4.2, 4.4, 5.5) & Xenix (386).
! 
!    * GNU Emacs 19	  (DosCD, EmacsD, LspEmcT, SrcCD)
! 
!      Emacs 19 works with character-only terminals as well as with the X
!      Window System (with or without the X toolkit); New features in Emacs 19
!      include: multiple X windows ("frames" to Emacs), with either a separate
!      X window for the minibuffer or a minibuffer attached to each X window;
!      property lists associated with regions of text in a buffer; multiple
!      fonts and colors defined by those properties; simplified and improved
!      processing of function keys, mouse clicks and mouse movement; X
!      selection processing, including clipboard selections; hooks to be run if
!      point or mouse moves outside a certain range; menu bars and popup menus
!      defined by keymaps; scrollbars; before and after change hooks;
!      source-level debugging of Emacs Lisp programs; European character sets
!      support; floating point numbers; improved buffer allocation, including
!      returning storage to the system when a buffer is killed; interfacing
!      with the X resource manager; GNU configuration scheme support; good RCS
!      support; & many updated libraries.
! 
!      Recent features include support for Motif widgets as well as the Athena
!      widgets, displaying multiple views of an outline at the same time,
!      version control support for CVS and for multiple branches, ability to
!      open frames on more than one X display from a single Emacs job,
!      operation on MS-DOS and MS Windows, commands to edit text properties,
!      text properties for formatting text, the ability to save text properties
!      in files, & GNU-standard long named command line options.
! 
!      Emacs 19.29 is believed to work on, in hardware order: Acorn Risc
!      machine (RISCiX); Alliant FX/2800 (BSD); Alpha (OSF/1); Apollo
!      (DomainOS); Bull DPX/2 2nn & 3nn (SysV.3) & sps7 (SysV.2); Clipper;
!      Convex (BSD); Cubix QBx (SysV); Data General Aviion (DGUX); DEC MIPS
!      (Ultrix 4.2 & OSF/1, not VMS); Elxsi 6400 (SysV); Gould Power Node & NP1
!      (4.2 & 4.3BSD); Harris Night Hawk 1200 and 3000, 4000 and 5000 (cxux);
!      Honeywell XPS100 (SysV); HP 9000 series 200, 300, 700, 800 (but not 500)
!      (4.3BSD or HP-UX 7, 8, 9); Intel i386, i486 and Pentium (386BSD, AIX,
!      BSDI/386, FreeBSD, Esix, GNU/Linux, ISC, MS-DOS (*note MS-DOS
!      Diskettes::. & *Note MS-DOS CD-ROM::),  NetBSD, SCO3.2v4, SysV, Xenix,
!      WindowsNT); IBM RS6000 (AIX 3.2); IBM RT/PC (AIX or BSD); Motorola Delta
!      147 & 187 (SysV.3, SysV.4, & m88kbcs); National Semiconductor 32K
!      (Genix); NeXT (BSD or Mach 2 w/ NeXTStep 3.0); Paragon (OSF/1); Prime
!      EXL (SysV); Pyramid (BSD); Sequent Symmetry (BSD, ptx); Siemens RM400
!      and RM600 (SysV); SGI Iris 4D (Irix 4.x & 5.x); Sony News/RISC (NewsOS);
!      Stardent i860 (SysV); Sun 3 & 4, SPARC 1, 1+, 2, 10 & Classic (SunOS
!      4.0, 4.1, Solaris 2.0-2.3); Tadpole 68k (SysV); Tektronix XD88 (SysV.3)
!      & 4300 (BSD); & Titan P2 & P3 (SysV).
! 
!      In operating system order: AIX (i386, RS6000, RT/PC); 4.1, 4.2, 4.3BSD
!      (i386, i860, Convex, Gould Power Node & NP1, HP9000 series 300, NeXT,
!      Pyramid, Symmetry, Tektronix 4300, RT/PC); DG/UX (Aviion);
!      DomainOS(Apollo); Esix (i386); FreeBSD (i386); Genix (ns32k); GNU/Linux
!      (i386); HP-UX 7, 8, 9 (HP 9000 series 200, 300, 700, 800, but not 500);
!      Irix 4 & 5 (Iris 4D); ISC (i386); Mach 2 & 3 (i386, NeXT); MS-DOS (*note
!      MS-DOS Diskettes::. & *Note MS-DOS CD-ROM::); NetBSD (i386, HP9000
!      series 300); OSF/1 (Alpha, Paragon); RISCiX (Acorn); SCO 3.2v4 (i386);
!      SysV (Cubix QBx, Elxsi 6400, Honeywell XPS100, Intel i386, Prime EXL,
!      Siemens RM400 and RM600, Stardent, Tadpole 68k, Titan P2 & P3); SysV.2
!      (Bull sps7); SysV.3 (Bull DPX/2 2nn & 3nn, Motorola Delta 147 & 187,
!      Tektronix XD88); SysV.4 (Motorola Delta 147 & 187, Stardent i860);
!      Solaris 2 (SPARC 1, 1+, 2, 10, Classic); SunOS 4.0, 4.1 (Sun 3 & 4,
!      SPARC 1, 1+, 2, 10 & Classic); Ultrix 4.2 (DEC MIPS); Windows NT; &
!      Xenix (i386).
  
       Other configurations supported by Emacs 18 should work with few changes
--- 854,956 ----
       3.4 & 4.0), SPARC (SunOS 4.0), Sequent Symmetry (Dynix), & Atari ST.
  
!    * `doschk'	(DosBC, SrcCD, UtilT)
  
!      This program is a utility to help software developers ensure that their
!      source file names are distinguishable on System V platforms with
!      14-character filenames and on MS-DOS systems with 8+3 character
!      filenames.
  
!    * `ecc'   (LangT, SrcCD)
  
       `ecc' is a Reed-Solomon error correction checking program, which can
       correct three byte errors in a block of 255 bytes and detect more severe
!      errors.  Contact `paulf@stanford.edu' for more information.
  
!    * `ed'   (SrcCD, UtilT)
  
!      `ed' is the standard text editor.	It is line-oriented and can be used
!      interactively or in scripts.
  
!    * Elib   (DosBC, LspEmcT, SrcCD)
  
       Elib is a small library of Emacs Lisp functions, including routines for
       using AVL trees and doubly-linked lists.
  
!    * Elisp archive   (SrcCD)
! 
!      This is a snapshot of Ohio State's GNU Emacs Lisp FTP Archive.  FTP it
!      from `archive.cis.ohio-state.edu' in `/pub/gnu/emacs/elisp-archive'.
! 
!    * Emacs   **Note Forthcoming GNUs:: for future plans.*
  
       In 1975, Richard Stallman developed the first Emacs, an extensible,
!      customizable real-time display editor & computing environment.  GNU Emacs
!      is his second implementation.  It offers true Lisp--smoothly integrated
!      into the editor--for writing extensions & provides an interface to the X
!      Window System.  It runs on Unix, MS-DOS, & Windows NT.  In addition to
!      its powerful native command set, Emacs has extensions which emulate the
!      editors vi & EDT (Digital's VMS editor).  Emacs has many other features
!      which make it a full computing support environment.  Source for the `GNU
!      Emacs Manual' & a reference card comes with the software.	Sources for
!      the `GNU Emacs Lisp Reference Manual' & `Programming in Emacs Lisp: An
!      Introduction' are distributed in separate packages.  *Note
!      Documentation::.
! 
!    * Emacs 18	(LspEmcT, SrcCD, VMSEmcsT) [FSFrc]
! 
!      Emacs 18.59 is the last release of version 18 from the FSF.  We no longer
!      maintain it.  It supports these Unix systems that Emacs 19 doesn't
!      support (please help port Emacs 19 to these systems): Alliant FX/80,
!      Altos 3068, Amdahl (UTS), AT&T (3Bs & 7300 PC), CCI 5/32 & 6/32,
!      Celerity, Digital (VAX VMS), Dual, Encore (APC, DPC, & XPC), HLH Orion
!      (original & 1/05), ISI (Optimum V, 80386), Masscomp, NCR Tower 32 (SVR2
!      & SVR3), Nixdorf Targon 31, Nu (TI & LMI), pfa50, Plexus, Prime EXL,
!      Stride (system rel. 2), Tahoe, Tandem Integrity S2, Tektronix 16000,
!      Triton 88, Ustation E30 (SS5E), Whitechapel (MG1), & Wicat.
! 
!    * Emacs 19	(DosBC, EmcsD, LspEmcT, SrcCD) [FSFman(s), FSFrc]
! 
!      Emacs 19 works with character-only terminals & with the X Window System
!      (with or without an X toolkit).  New features in Emacs 19 include:
!      multiple X windows ("frames" to Emacs), with a separate X window for the
!      minibuffer or a minibuffer attached to each X window; property lists
!      associated with regions of text in a buffer; multiple fonts & colors
!      defined by those properties; simplified/improved processing of function
!      keys, mouse clicks, and mouse movement; X selection processing,
!      including clipboard selections; hooks to be run if the point or mouse
!      moves outside a certain range; menu bars and popup menus defined by
!      keymaps; scrollbars; before- and after-change hooks; a source-level
!      debugger for Emacs Lisp programs; floating point numbers; improved
!      buffer allocation, including returning storage to the system when a
!      buffer is killed; interfacing with the X resource manager; many updated
!      libraries; integrated support for version control systems (RCS, CVS, &
!      SCCS); Autoconf based configuration; and support for European character
!      sets.
! 
!      Recent features include the ability to open frames on more than one X
!      display from a single Emacs job, operation on MS-DOS, MS Windows, and
!      Windows NT, displaying multiple views of an outline at the same time,
!      support for the Athena & Motif widgets, version control support for CVS
!      and for multiple branches, text properties for formatting text, commands
!      to edit text properties and save them in files, and GNU-standard
!      long-named command line options.
! 
!      Emacs 19.30 works on: Acorn RISC (RISCiX); Alliant FX/2800 (BSD); Alpha
!      (OSF/1); Apollo (DomainOS); Bull DPX/2 2nn & 3nn (SysV.3) & sps7
!      (SysV.2); Clipper; Convex (BSD); Cubix QBx (SysV); Data General Aviion
!      (DGUX); DEC MIPS (Ultrix 4.2, OSF/1, not VMS); Elxsi 6400 (SysV); Gould
!      Power Node & NP1 (4.2 & 4.3BSD); Harris Night Hawk 1200, 3000, 4000 &
!      5000 (cxux); Honeywell XPS100 (SysV); HP 9000 series 200, 300, 700, 800
!      (but not 500) (4.3BSD; HP-UX 7, 8, 9); Intel i386/i486/Pentium
!      (GNU/Linux, 386BSD, AIX, BSDI/386, FreeBSD, Esix, ISC, MS-DOS (*note
!      MS-DOS Diskettes::., & *Note MS-DOS Book with CD-ROM::), NetBSD,
!      SCO3.2v4, Solaris, SysV, Xenix, WindowsNT); IBM RS/6000 (AIX 3.2) &
!      RT/PC (AIX, BSD); Motorola Delta 147 & 187 (SysV.3, SysV.4, m88kbcs);
!      National Semiconductor 32K (Genix); NeXT (BSD, Mach 2 w/ NeXTStep 3.0);
!      Paragon (OSF/1); Prime EXL (SysV); Pyramid (BSD); Sequent Symmetry (BSD,
!      ptx); Siemens RM400 & RM600 (SysV); SGI Iris 4D (Irix 4.x & 5.x); Sony
!      News/RISC (NewsOS); Stardent i860 (SysV); Sun 3 & 4, SPARC 1, 1+, 2, 10,
!      Classic (SunOS 4.0, 4.1, Solaris 2.0-2.3); Tadpole 68k (SysV); Tektronix
!      XD88 (SysV.3) & 4300 (BSD); & Titan P2 & P3 (SysV).
  
       Other configurations supported by Emacs 18 should work with few changes
*************** GNU software currently available:
*** 779,866 ****
       systems, we will augment the list.	 Also see *Note Forthcoming GNUs::.
  
!    * `es'	  (SrcCD, UtilT)
  
!      `es' is an extensible shell based on `rc' with first class functions,
!      lexical scope, exceptions, and rich return values (i.e., functions can
       return values other than just numbers).  `es''s extensibility comes from
!      the ability to modify and extend the shell's builtin services, such as
       path searching and redirection.  Like `rc', it is great for both
!      interactive use and for scripting, particularly since its quoting rules
!      are much less baroque than the C or Bourne shells.
  
!    * `f2c'	   (LangT, SrcCD)
  
!      `f2c' converts Fortran-77 source files into C or C++, which can be
!      compiled with GCC.	 You can get bug fixes by FTP from site
!      `netlib.att.com' or by email from `netlib@research.att.com'.  The fixes
!      are summarized in the file `/netlib/f2c/changes.Z'.  *Note Forthcoming
!      GNUs::, for information about GNU Fortran.
  
!    * Fileutils	       (DjgppD, DosCD, SrcCD, UtilD, UtilT)
  
!      The fileutils work on files: `chgrp', `chmod', `chown', `cp', `dd', `df',
       `dir', `du', `install', `ln', `ls', `mkdir', `mkfifo', `mknod', `mv',
!      `mvdir', `rm', `rmdir', `sync', `touch', & `vdir'.	 Only some of these
!      are on the *Note Selected Utilities Diskettes::.
  
!    * Findutils	       (DjgppD, DosCD, SrcCD, UtilD, UtilT)
  
       `find' is frequently used both interactively and in shell scripts to
       find files which match certain criteria and perform arbitrary operations
!      on them.  Also included are `xargs', which applies a command to a list
!      of files, and `locate', which scans a database for file names that match
!      a pattern.
  
!    * Finger	    (SrcCD, UtilT)
  
       GNU Finger has more features than other finger programs.  For sites with
!      many hosts, a single host may be designated as the finger "server" host,
       and other hosts at that site configured as finger "clients".  The server
!      host collects information about who is logged in to the clients.  To
!      finger a user at a GNU Finger site, a query to any its client hosts gets
!      useful information.  GNU Finger supports many customization features,
!      including user output filters, and site programmable output for special
!      target names.
  
!    * `flex'	    (DjgppD, DosCD, LangT, SrcCD, UtilD)
  
       `flex' is a replacement for the `lex' scanner generator.  `flex' was
       written by Vern Paxson of the Lawrence Berkeley Laboratory and generates
!      far more efficient scanners than `lex' does.  Source for the `Flex
!      Manual' and reference card are included.  *Note Documentation::.
! 
!    * FlexFAX	     (UtilT)
  
!      FlexFAX is now called HylaFAX.  For more information, *Note GNU
!      Software::.
  
!    * Fontutils	       (SrcCD, UtilT)
  
!      The fontutils create fonts for use with Ghostscript or TeX, starting
!      with a scanned type image and converting the bitmaps to outlines.	They
!      also contain general conversion programs and other utilities.
  
!      Fontutils programs include: `bpltobzr', `bzrto', `charspace',
!      `fontconvert', `gsrenderfont', `imageto', `imgrotate', `limn', and
!      `xbfe'.
  
!    * GAWK	  (DjgppD, DosCD, LangT, SrcCD)
  
       GAWK is upwardly compatible with the latest POSIX specification of
       `awk'.  It also provides several useful extensions not found in other
       `awk' implementations.  Texinfo source for the `GAWK Manual' comes with
!      the software.  *Note Documentation::.
  
!    * GCC	 (BinCD, DjgppD, DosCD, LangT, SrcCD, VMSCompT)
  
!      Version 2 of the GNU C Compiler supports multiple languages; the source
!      file name suffix or a compiler option selects the language.  The GNU C
!      Compiler distribution includes support for C, C++ and Objective-C.
!      Support for Objective-C was donated by NeXT.  The runtime support needed
!      to run Objective-C programs is now distributed with GCC (this does not
!      include any Objective-C classes aside from `object').  As much as
!      possible, G++ is kept compatible with the evolving draft ANSI standard,
!      but not with `cfront' (AT&T's compiler), which has been diverging from
!      ANSI.
  
       The GNU C Compiler is a fairly portable optimizing compiler which
--- 958,1050 ----
       systems, we will augment the list.	 Also see *Note Forthcoming GNUs::.
  
!    * `es'   (SrcCD, UtilT)
  
!      `es' is an extensible shell (based on `rc') with first class functions,
!      lexical scope, exceptions and rich return values (i.e., functions can
       return values other than just numbers).  `es''s extensibility comes from
!      the ability to modify and extend the shell's built-in services, such as
       path searching and redirection.  Like `rc', it is great for both
!      interactive use and scripting, particularly since its quoting rules are
!      much less baroque than the C and Bourne shells.
! 
!    * `f2c'   (LangT, SrcCD)
  
!      `f2c' converts Fortran-77 source into C or C++, which can be compiled
!      with GCC or G++.  Get bug fixes by FTP from site `netlib.att.com' or by
!      email from `netlib@research.att.com'.  See the file
!      `/netlib/f2c/readme.Z' for a summary.  Also see the GNU Fortran item
!      later in this article, and in *Note Forthcoming GNUs::.
  
!    * `ffcall'	(SrcCD)
  
!      `ffcall' is a C library for implementing foreign function calls in
!      embedded interpreters by Bill Triggs and Bruno Haible.  It allows C
!      functions with arbitrary argument lists and return types to be called or
!      emulated (callbacks).
  
!    * Fileutils	 (DosBC, SrcCD, UtilT)
! 
!      The Fileutils work on files: `chgrp', `chmod', `chown', `cp', `dd', `df',
       `dir', `du', `install', `ln', `ls', `mkdir', `mkfifo', `mknod', `mv',
!      `rm', `rmdir', `sync', `touch', & `vdir'.
  
!    * Findutils	 (DosBC, SrcCD, UtilT)
  
       `find' is frequently used both interactively and in shell scripts to
       find files which match certain criteria and perform arbitrary operations
!      on them.  Also included are `locate', which scans a database for file
!      names that match a pattern, and `xargs', which applies a command to a
!      list of files.
  
!    * Finger   (SrcCD, UtilT)
  
       GNU Finger has more features than other finger programs.  For sites with
!      many hosts, a single host may be designated as the finger "server" host
       and other hosts at that site configured as finger "clients".  The server
!      host collects information about who is logged in on the clients.  To
!      finger a user at a GNU Finger site, a query to any of its client hosts
!      gets useful information.  GNU Finger supports many customization
!      features, including user output filters and site programmable output for
!      special target names.
  
!    * `flex'   (BinCD, DjgpD, DosBC, LangT, SrcCD, UtilD) [FSFman, FSFrc]
  
       `flex' is a replacement for the `lex' scanner generator.  `flex' was
       written by Vern Paxson of the Lawrence Berkeley Laboratory and generates
!      far more efficient scanners than `lex' does.  Sources for the `Flex
!      Manual' and reference card are included (*note Documentation::.).
  
!    * Fortran (`g77')   **Note Forthcoming GNUs::*   (LangT, SrcCD)
  
!      GNU Fortran (`g77'), developed by Craig Burley, is available for public
!      beta testing on the Internet.  For now, `g77' produces code that is
!      mostly object-compatible with `f2c' & uses the same run-time library
!      (`libf2c').
  
!    * Fontutils	 (SrcCD, UtilT)
  
!      The Fontutils convert between font formats, create fonts for use with
!      Ghostscript or TeX (starting with a scanned type image & converting the
!      bitmaps to outlines), et al.  It includes: `bpltobzr', `bzrto',
!      `charspace', `fontconvert', `gsrenderfont', `imageto', `imgrotate',
!      `limn', & `xbfe'.
  
!    * GAWK   (DosBC, LangT, SrcCD) [FSFman]
  
       GAWK is upwardly compatible with the latest POSIX specification of
       `awk'.  It also provides several useful extensions not found in other
       `awk' implementations.  Texinfo source for the `GAWK Manual' comes with
!      the software  (*note Documentation::.).
  
!    * GCC   (BinCD, DjgpD, DosBC, LangT, SrcCD, VMSCmpT) [FSFman]
  
!      Version 2 of the GNU C Compiler supports the languages C, C++, and
!      Objective-C; the source file name suffix or a compiler option selects
!      the language.  Objective-C support was donated by NeXT.  The runtime
!      support needed to run Objective-C programs is now distributed with GCC
!      (this does not include any Objective-C classes aside from `object', but
!      see "GNUStep" in *Note Forthcoming GNUs::).  As much as possible, G++ is
!      kept compatible with the evolving draft ANSI standard, but not with
!      `cfront' (AT&T's compiler), which has been diverging from ANSI.
  
       The GNU C Compiler is a fairly portable optimizing compiler which
*************** GNU software currently available:
*** 876,882 ****
       scheduling or delay slots), a feature for assigning attributes to
       instructions, and many local optimizations that are automatically
!      deduced from the machine description.  Position-independent code is
!      supported on the 68k, i386, i486, Pentium, Hitachi Slt, Hitachi H8/300,
!      Clipper, 88k, SPARC & SPARClite.
  
       GCC can open-code most arithmetic on 64-bit values (type `long long
--- 1060,1064 ----
       scheduling or delay slots), a feature for assigning attributes to
       instructions, and many local optimizations that are automatically
!      deduced from the machine description.
  
       GCC can open-code most arithmetic on 64-bit values (type `long long
*************** GNU software currently available:
*** 884,919 ****
       68k; other machines will follow.
  
!      GCC supports full ANSI C, traditional C & GNU C extensions (including:
!      nested functions support, nonlocal gotos & taking the address of a
       label).
  
!      GCC can generate a.out, COFF, ELF & OSF-Rose files when used with a
       suitable assembler.  It can produce debugging information in these
!      formats: BSD stabs, COFF, ECOFF, ECOFF with stabs & DWARF.
  
!      GCC generates code for many CPUs, including: a29k, Alpha, ARM, AT&T
!      DSP1610, Convex cN, Clipper, Elxsi, Fujitsu Gmicro, H8/300, HP-PA (1.0
!      and 1.1) i370, i386, i486, Pentium, i860, i960, m68k, m68020, m68030,
!      m68040, m88k, MIL-STD-1750a, MIPS, ns32k, PDP-11, Pyramid, ROMP, RS6000,
!      SH, SPARC, SPARClite, VAX, & we32k.
! 
!      Operating systems supported include: AIX, ACIS, AOS, BSD, Clix, Ctix,
!      DG/UX, Dynix, Genix, GNU, HP-UX, ISC, Irix, GNU/Linux, Luna, LynxOS,
!      Mach, Minix, NetBSD, NewsOS, OSF, OSF-Rose, RISCOS, SCO, Solaris 2,
!      SunOS 4, SysV, Ultrix, Unos, VMS & Windows/NT.
  
       Using the configuration scheme for GCC, building a cross-compiler is as
       easy as building a native compiler.
  
!      We no longer maintain version 1 of GCC, G++, or libg++.
  
       Texinfo source for the `Using and Porting GNU CC' manual, is included
!      with GCC.	 *Note Forthcoming GNUs::, for plans for later releases of
!      GCC.
  
!    * GDB	 (BinCD, DjgppD, DosCD, LangT, SrcCD)
  
!      GDB, the GNU DeBugger, is a source-level debugger which supports C, C++,
!      and Fortran.
  
       GDB can debug both C and C++ programs, and will work with executables
--- 1066,1103 ----
       68k; other machines will follow.
  
!      GCC supports full ANSI C, traditional C, & GNU C extensions (including:
!      nested functions support, nonlocal gotos, & taking the address of a
       label).
  
!      GCC can generate a.out, COFF, ELF, & OSF-Rose files when used with a
       suitable assembler.  It can produce debugging information in these
!      formats: BSD stabs, COFF, ECOFF, ECOFF with stabs, & DWARF.
  
!      GCC generates code for many CPUs, including the a29k, Alpha  ARM  AT&T
!      DSP1610 Clipper Convex cN Elxsi Fujitsu Gmicro i370, i860, i960,
!      MIL-STD-1750a, MIPS, ns32k, PDP-11, Pyramid, ROMP, RS/6000, SH, SPUR,
!      Tahoe, VAX, & we32k.  Position-independent code is generated for the
!      Clipper, Hitachi H8/300, HP-PA (1.0 & 1.1), i386/i486/Pentium, m68k,
!      m88k, SPARC, & SPARClite.
! 
!      Operating systems supported include: GNU/Hurd, GNU/Linux, ACIS, AIX, AOS,
!      BSD, Clix, Concentrix, Ctix, DG/UX, Dynix, FreeBSD, Genix, HP-UX, Irix,
!      ISC, Luna, LynxOS, Minix, NetBSD, NewsOS, NeXTStep, OS/2, OSF, OSF-Rose,
!      RISCOS, SCO, Solaris 2, SunOS 4, System/370, SysV, Ultrix, Unos, VMS, &
!      Windows/NT.
  
       Using the configuration scheme for GCC, building a cross-compiler is as
       easy as building a native compiler.
  
!      Version 1 of GCC, G++, & libg++ are no longer maintained.
  
       Texinfo source for the `Using and Porting GNU CC' manual, is included
!      with GCC (*note Documentation::.).
  
!      *Note Forthcoming GNUs::, for plans for later releases of GCC.
  
!    * GDB   (BinCD, DjgpD, DosBC, LangT, SrcCD) [FSFman, FSFrc]
! 
!      GDB, the GNU DeBugger, is a source-level debugger for C, C++, & Fortran.
  
       GDB can debug both C and C++ programs, and will work with executables
*************** GNU software currently available:
*** 921,928 ****
       some limitations if you do not use GCC.
  
!      GDB has a command line user interface; GNU Emacs comes with a GDB mode,
!      and `xxgdb' provides an X interface (but it is not distributed or
!      maintained by the FSF; FTP it from `ftp.x.org' in the
!      `/contrib/utilities' directory).
  
       Executable files and symbol tables are read via the BFD library, which
--- 1105,1112 ----
       some limitations if you do not use GCC.
  
!      GDB has a command line user interface, and Emacs has a GDB mode.  Two X
!      interfaces (not distributed or maintained by the FSF) are: `gdbtk' (FTP
!      it from `ftp.cygnus.com' in directory `/pub/gdb'); and `xxgdb' (FTP it
!      from `ftp.x.org' in directory `/contrib/utilities').
  
       Executable files and symbol tables are read via the BFD library, which
*************** GNU software currently available:
*** 932,967 ****
       (breakpoints triggered when the value of an expression changes).
  
!      GDB defines a standard interface for simulators, and the included
!      simulator library includes simulators for the Zilog Z8001/2, Hitachi
!      H8/300, H8/500 & Super-H.
  
       GDB can perform cross-debugging.  To say that GDB "targets" a platform
!      means that it can perform native or cross-debugging for it.  To say that
!      GDB can "host" a given platform means that it can be built on it, but
!      cannot necessarily debug native programs.	GDB can:
  
  	* "target" & "host": Amiga 3000 (Amix), DEC Alpha (OSF/1), DECstation
! 	  3100 & 5000 (Ultrix), HP 9000/300 (BSD, HP-UX), HP 9000/700 (HP-UX),
! 	  i386 (BSD, FreeBSD, GNU/Linux, LynxOS, NetBSD, SCO), IBM RS/6000
! 	  (AIX, LynxOS), Motorola Delta m88k (System V, CX/UX), PC532
! 	  (NetBSD), Motorola m68k MVME-167 (LynxOS), NCR 3000 (SVR4), SGI
! 	  (Irix V3, V4, V5), SONY News (NewsOS 3.x), SPARC (SunOS 4.1,
! 	  Solaris, NetBSD, LynxOS) Sun-3 (SunOS 4.1), & Ultracomputer (a29k
! 	  running Sym1).
  
  	* "target", but not "host": AMD 29000 (COFF & a.out), Hitachi H8/300,
! 	  Hitachi SH, i386 (a.out, COFF, OS/9000) i960 (Nindy, VxWorks),
! 	  m68k/m68332 (a.out, COFF, VxWorks), MIPS (IDT ecoff, ELF), Fujitsu
  	  SPARClite (a.out, COFF), & Z8000.
  
! 	* "host", but not "target": IBM RT/PC (AIX), and HP/Apollo 68k (BSD).
  
!      GDB can use the symbol tables emitted by the vendor-supplied compilers of
!      most MIPS-based machines, including DEC.  (These tables are in a format
!      which almost nobody else uses.)  Source for the manual
!      `Debugging with GDB' and a reference card are included.  *Note
!      Documentation::.
  
!    * `gdbm'	    (LangT, SrcCD, UtilD)
  
       `gdbm' is the GNU replacement for the traditional `dbm' and `ndbm'
--- 1116,1151 ----
       (breakpoints triggered when the value of an expression changes).
  
!      GDB uses a standard remote interface to a simulator library which (so
!      far) has simulators for the Hitachi H8/300, H8/500, Super-H, & Zilog
!      Z8001/2.
  
       GDB can perform cross-debugging.  To say that GDB "targets" a platform
!      means it can perform native or cross-debugging for it.  To say that GDB
!      can "host" a given platform means that it can be built on it, but cannot
!      necessarily debug native programs.
! 
!      GDB can:
  
  	* "target" & "host": Amiga 3000 (Amix), DEC Alpha (OSF/1), DECstation
! 	  3100 & 5000 (Ultrix), HP 9000/300 (BSD, HP-UX), HP 9000/700 (HP-UX
! 	  9, 10), i386 (GNU/Hurd, GNU/Linux, BSD, FreeBSD, LynxOS, NetBSD,
! 	  SCO), IBM RS/6000 (AIX, LynxOS), Motorola Delta m88k (System V,
! 	  CX/UX), PC532 (NetBSD), Motorola m68k MVME-167 (LynxOS), NCR 3000
! 	  (SVR4), SGI (Irix V3, V4, V5), SONY News (NewsOS 3.x), SPARC
! 	  (LynxOS, NetBSD, Solaris, & SunOS 4.1 ) Sun-3 (SunOS 4.1), &
! 	  Ultracomputer (a29k running Sym1).
  
  	* "target", but not "host": AMD 29000 (COFF & a.out), Hitachi H8/300,
! 	  Hitachi SH, i386 (a.out, COFF, OS/9000), i960 (Nindy, VxWorks),
! 	  m68k/m68332 (a.out, COFF, VxWorks), MIPS (ELF, IDT ecoff), Fujitsu
  	  SPARClite (a.out, COFF), & Z8000.
  
! 	* "host", but not "target": IBM RT/PC (AIX), HP/Apollo 68k (BSD), &
! 	  Apple Macintosh (MacOS).
  
!      Sources for the manual, `Debugging with GDB', and a reference card are
!      included (*note Documentation::.).
  
!    * `gdbm'   (LangT, SrcCD, UtilD)
  
       `gdbm' is the GNU replacement for the traditional `dbm' and `ndbm'
*************** GNU software currently available:
*** 970,1016 ****
       counterparts).
  
!    * Ghostscript	 (DjgppD, DosCD, SrcCD, UtilT)
  
!      GNU Ghostscript is the GNU release of Ghostscript, which is an
!      interpreter for the Postscript graphics language (*note Forthcoming
!      GNUs::., for news on future plans).
  
       The current version of GNU Ghostscript is 2.6.2.  Features include the
       ability to use the fonts provided by the platform on which Ghostscript
!      runs (X Window System and Microsoft Windows), resulting in much
       better-looking screen displays; improved text file printing (like
       `enscript'); a utility to extract the text from a Postscript language
!      document; a much more reliable (and faster) Microsoft Windows
!      implementation; support for Microsoft C/C++ 7.0; drivers for many new
!      printers, including the SPARCprinter, and for TIFF/F (fax) file format;
!      many more Postscript Level 2 facilities, including most of the color
!      space facilities (but not patterns), and the ability to switch between
!      Level 1 and Level 2 dynamically.  Version 2.6.2 adds a LaserJet 4 driver
!      and several important bug fixes to version 2.6.1.
  
       Ghostscript executes commands in the Postscript language by writing
!      directly to a printer, drawing on an X window, or writing to a file for
!      later printing (or to a bitmap file that you can manipulate with other
!      graphics programs).
  
       Ghostscript includes a C-callable graphics library (for client programs
       that do not want to deal with the Postscript language).  It also supports
!      IBM PCs and compatibles with EGA, VGA, or SuperVGA graphics (but please
!      do *not* ask the FSF staff any questions about this; we do not use PCs).
  
!    * Ghostview	       (SrcCD, UtilT)
  
!      Tim Theisen, `ghostview@cs.wisc.edu', has created Ghostview, a previewer
!      for multi-page files with an X11 user interface.  Ghostview and
!      Ghostscript function as two cooperating programs; Ghostview creates a
!      viewing window and Ghostscript draws in it.
  
!    * `gmp'	   (LangT, SrcCD)
  
!      GNU mp is a library for arbitrary precision arithmetic on signed integers
!      and rational numbers.  It has a rich set of functions with a regular
!      interface.
  
!    * GNATS	   (SrcCD, UtilT)
  
       GNATS (GNats: A Tracking System, not to be confused with GNAT, The GNU
--- 1154,1229 ----
       counterparts).
  
!    * `gettext'	 (LangT, SrcCD)
! 
!      The GNU `gettext' tool set contains everything maintainers need to
!      internationalize a package for messages, tools that help translators
!      localize messages to their native language, once a package has been
!      internationalized.	 *Note Help the GNU Translation Project::.
  
!    * Ghostscript   (DosBC, SrcCD, UtilT)
! 
!      The GNU release of Ghostscript is an interpreter for the Postscript
!      graphics language (*note Forthcoming GNUs::., for future plans).
  
       The current version of GNU Ghostscript is 2.6.2.  Features include the
       ability to use the fonts provided by the platform on which Ghostscript
!      runs (X Window System & Microsoft (MS) Windows), resulting in much
       better-looking screen displays; improved text file printing (like
       `enscript'); a utility to extract the text from a Postscript language
!      document; a much more reliable (and faster) MS Windows implementation;
!      support for MS C/C++ 7.0; drivers for many new printers ( e.g. the
!      SPARCprinter), & for TIFF/F (Fax) file format; many more Postscript Level
!      2 facilities, including most of the color space facilities (but not
!      patterns); & the ability to switch between Level 1 & Level 2
!      dynamically.  Version 2.6.2 adds a LaserJet 4 driver & several important
!      bug fixes to version 2.6.1.
  
       Ghostscript executes commands in the Postscript language by writing
!      directly to a printer, drawing on an X window, or writing to files for
!      printing later or manipulating with other graphics programs.
  
       Ghostscript includes a C-callable graphics library (for client programs
       that do not want to deal with the Postscript language).  It also supports
!      i386/i486/Pentiums running MS-DOS with EGA, VGA or SuperVGA graphics (but
!      please do *not* ask the FSF staff any questions about this; we do not
!      use MS-DOS).
! 
!    * Ghostview	 (DosBC, SrcCD, UtilT)
  
!      Tim Theisen, `ghostview@cs.wisc.edu', created Ghostview, a previewer for
!      multi-page files with an X Window interface.  Ghostview & Ghostscript
!      work together; Ghostview creates a viewing window & Ghostscript draws in
!      it.
  
!    * GIT   (SrcCD, UtilT)
  
!      GIT is a set of interactive tools: an extensible file system browser, an
!      ASCII/hex file viewer, a process viewer/killer, & other related
!      utilities & shell scripts.	 It can be used to increase the speed &
!      efficiency of many daily tasks, such as copying & moving files &
!      directories, invoking editors, compressing/uncompressing files, creating
!      & expanding archives, compiling programs, sending mail, etc.  It looks
!      nice, has colors (if the standard ANSI color sequences are supported), &
!      is user-friendly.
  
!    * `gmp'    **Note Forthcoming GNUs::*   (LangT, SrcCD)
  
!      GNU `mp' is a library for arbitrary precision arithmetic on signed
!      integers and rational numbers.  It has a rich set of functions with a
!      regular interface.
! 
!    * GN	  (SrcCD)
! 
!      GN is a gopher/HTTP server.  It recognizes whether the request came from
!      an HTTP (World Wide Web) or gopher client and responds accordingly.
! 
!    * Gnans    (SrcCD)
! 
!      Gnans is a program (and language) for the numerical study of
!      deterministic and stochastic dynamical systems.  The dynamical systems
!      may evolve in continuous or discrete time.	 Gnans has graphical &
!      command line interfaces.
! 
!    * GNATS   (SrcCD, UtilT)
  
       GNATS (GNats: A Tracking System, not to be confused with GNAT, The GNU
*************** GNU software currently available:
*** 1019,1074 ****
       negotiates their resolution by electronic mail.  Although it has been
       used primarily as a software bug-tracking system so far, it is
!      sufficiently generalized so that it could be used for handling system
!      administration issues, project management or any number of other
       applications.
  
!    * `gnuplot'	       (SrcCD, UtilT, WdwsD)
  
       `gnuplot' is an interactive program for plotting mathematical
!      expressions and data.  It handles both curves (2 dimensions) and surfaces
!      (3 dimensions).  Curiously, the program was neither written nor named for
!      the GNU Project; the name is a coincidence.  Various GNU programs use
!      `gnuplot' to produce graphical output.
  
!    * GnuGo	   (SrcCD, UtilT)
  
!      GnuGo plays the game of Go (Wei-Chi); it is not yet very sophisticated.
  
!    * `gperf'	     (LangT, SrcCD)
  
!      `gperf' generates perfect hash tables.  There are two implementations of
!      `gperf', written in C and C++.  Both produce hash functions in either C
!      or C++.
  
!    * GNU Graphics	  (SrcCD, UtilT)
  
!      GNU Graphics is a system which produces x-y plots from ASCII or binary
!      data.  It supports output in Postscript, Tektronix 4010 compatible and
!      Unix device-independent "plot" formats as well as a previewer for the X
!      Window System.  Features include a `spline' interpolation program;
!      examples of shell scripts using `graph' and `plot'; and a statistics
!      toolkit; and output in TekniCAD TDA and ln03 file formats.	 Email bugs or
!      questions to Rich Murphey, `Rich@lamprey.utmb.edu'.
  
!    * grep	  (DjgppD, DosCD, SrcCD, UtilD, UtilT)
  
!      This package has GNU `grep', `egrep', and `fgrep' which find lines that
!      match inputed patterns.  They are much faster than the traditional Unix
       versions.
  
!    * Groff	   (DjgppD, DosCD, SrcCD, UtilT)
  
!      Groff is a document formatting system based on an implementation of
!      device-independent troff, which also includes implementations of `eqn',
!      `nroff', `pic', `refer', `tbl', `troff', and the `man', `ms', and `mm'
!      macros, as well as drivers for Postscript, TeX `dvi' format, and
!      typewriter-like devices.
! 
!      Groff's `mm' macro package is almost compatible with the DWB `mm' macros
!      and has several extensions.  Also included is a modified version of the
!      Berkeley `me' macros and an enhanced version of the X11 `xditview'
!      previewer.	 Written in C++, these programs can be compiled with GNU C++
!      Version 2.5 or later.  A driver for the LaserJet 4 series of printers is
!      currently in test.
  
       Groff users are encouraged to contribute enhancements.  Most needed are
--- 1232,1290 ----
       negotiates their resolution by electronic mail.  Although it has been
       used primarily as a software bug-tracking system so far, it is
!      sufficiently generalized that it could be used for handling system
!      administration issues, project management, or any number of other
       applications.
  
!    * `gnuplot'	 (SrcCD, UtilT, WdwsD)
  
       `gnuplot' is an interactive program for plotting mathematical
!      expressions and data.  It plots both curves (2 dimensions) & surfaces (3
!      dimensions).  Curiously, it was neither written nor named for the GNU
!      Project; the name is a coincidence.  Various GNU programs use `gnuplot'.
! 
!    * `gnuserv'	 (LspEmcT, SrcCD)
  
!      `gnuserv' is a enhanced version of Emacs' `emacsclient' program.  It
!      lets the user direct a running Emacs to edit files or evaluate arbitrary
!      Emacs Lisp constructs from another process.
  
!    * GnuGo   (SrcCD, UtilT)
  
!      GnuGo plays the game of Go (Wei-Chi); version 1.2 was released with minor
!      changes for portability,  but it is not yet very sophisticated.
  
!    * `gperf'   (LangT, SrcCD)
  
!      `gperf' generates perfect hash tables.  The C version is in package
!      cperf.  The C++ version is in libg++.  Both produce hash functions in
!      either C or C++.
  
!    * Graphics	(SrcCD, UtilT)
  
!      GNU Graphics produces x-y plots from ASCII or binary data.	 It outputs
!      in Postscript, Tektronix 4010 compatible, and Unix device-independent
!      "plot" formats.  It has a previewer for the X Window System.  Features
!      include a `spline' interpolation program; examples of shell scripts
!      using `graph' and `plot'; a statistics toolkit; and output in TekniCAD
!      TDA and ln03 file formats.	 Email bugs or queries to Rich Murphey,
!      `Rich@lamprey.utmb.edu'.
  
!    * grep   (DosBC, SrcCD, UtilT)
! 
!      This package has GNU `grep', `egrep', and `fgrep', which find lines that
!      match entered patterns.  They are much faster than the traditional Unix
       versions.
  
!    * Groff   (DjgpD, DosBC, SrcCD, UtilT)
  
!      Groff is a document formatting system based on a device-independent
!      version of `troff' & includes: `eqn', `nroff', `pic', `refer', `tbl',
!      `troff'; the `man', `ms', & `mm' macros; & drivers for Postscript, TeX
!      `dvi' format, and typewriter-like devices.	 Groff's `mm' macro package
!      is almost compatible with the DWB `mm' macros with several extensions.
!      Also included is a modified version of the Berkeley `me' macros and an
!      enhanced version of the X11 `xditview' previewer.	A driver for the
!      LaserJet 4 series of printers is currently in test.  Written in C++,
!      these programs can be compiled with GNU C++ Version 2.5 or later.
  
       Groff users are encouraged to contribute enhancements.  Most needed are
*************** GNU software currently available:
*** 1076,1229 ****
       for typesetting graphs), a page-makeup postprocessor similar to `pm'
       (see `Computing Systems', Vol. 2, No. 2; ask `office@usenix.org' how to
!      get a copy) and an ASCII output class for `pic' so that `pic' can be
!      integrated with Texinfo.  Questions and bug reports from users who have
!      read the documentation provided with groff can be sent to
       `bug-groff@prep.ai.mit.edu'.
  
!    * `gzip'	    (DjgppD, DosCD, LangT, LspEmcT, SrcCD, UtilT)
  
!      Some of the contents of our tape and FTP distributions are compressed.
!      We have software on our tapes and FTP sites to uncompress these files.
!      Due to patent troubles with `compress', we use another compression
!      program, `gzip'.  (Such prohibitions on software development are fought
!      by the League for Programming Freedom, *note What Is the LPF::., for
!      details.) `gzip' can expand LZW-compressed files but uses another,
!      unpatented algorithm for compression which generally produces better
!      results.  It also expands files compressed with System V's `pack'
!      program.
  
!    * `hello'	     (DjgppD, DosCD, SrcCD, UtilT)
  
       The GNU `hello' program produces a familiar, friendly greeting.  It
       allows non-programmers to use a classic computer science tool which would
       otherwise be unavailable to them.	Because it is protected by the GNU
!      General Public License, users are free to share and change it.
  
       Like any truly useful program, `hello' contains a built-in mail reader.
  
!    * `hp2xx'	     (SrcCD, UtilT)
  
       GNU `hp2xx' reads HP-GL files, decomposes all drawing commands into
       elementary vectors, and converts them into a variety of vector and raster
       output formats.  It is also an HP-GL previewer.  Currently supported
!      vector formats include encapsulated Postscript, Uniplex RGIP, Metafont
!      and various special TeX-related formats, and simplified HP-GL (line
!      drawing only) for imports.	 Raster formats supported include IMG, PBM,
!      PCX, & HP-PCL (including Deskjet & DJ5xxC support).  Previewers work
!      under X11 (Unix), OS/2 (PM & full screen), MS-DOS (SVGA, VGA, & HGC).
! 
!    * HylaFAX	     (UtilT)
! 
!      HylaFAX is a facsimile system for Unix systems.  It supports sending,
!      receiving, and polled retrieval of facsimile, as well as transparent
!      shared data use of the modem.   Information is also available on the
!      World Wide Web at URL: `http://www.vix.com/hylafax/'.
! 
!    * `indent'	      (DjgppD, DosCD, SrcCD, UtilD, UtilT)
! 
!      GNU `indent' is a revision of the BSD version.  By default, it formats C
!      source according to the GNU coding standards.  The BSD default, K&R and
!      other formats are available as options.  It is also possible to define
!      your own format.  GNU `indent' is more robust and provides more
!      functionality than other versions, e.g., it handles C++ comments.
! 
!    * Ispell	    (DjgppD, DosCD, SrcCD, UtilT)
! 
!      Ispell is an interactive spell checker that suggests "near misses" as
!      replacements for unrecognized words.  System & user-maintained
!      dictionaries for multiple languages can be used.  Standalone & GNU Emacs
!      interfaces are available.	 Previously, the GNU Project had its own
!      version of ispell ("Ispell 4.0"), but has dropped it for a parallel
!      branch that has had more development ("Ispell 3.1").  (Version 3 was an
!      earlier release from the original Ispell author, but others have since
!      made it more sophisticated.)
  
!    * JACAL	   *Not available from the FSF*
  
       JACAL is a symbolic mathematics system for the manipulation and
!      simplification of equations and single and multiple-valued algebraic
!      expressions constructed of numbers, variables, radicals, differential
!      operators, and algebraic and holonomic functions.	Vectors, matrices,
!      and tensors of these objects are also supported.
! 
!      JACAL was written in Scheme by Aubrey Jaffer.  It comes with SCM, an IEEE
!      P1178 and R4RS compliant version of Scheme written in C.  SCM runs on
!      Amiga, Atari-ST, MS-DOS, OS/2, NOS/VE, Unicos, VMS, Unix, and similar
!      systems.  SLIB is a portable Scheme library used by JACAL.
!      m{No Value For "ergegrafkludge"} The FSF is not distributing JACAL on
!      any media.	 To receive an IBM PC floppy disk with the source and
!      executable files, send $99.00 to:
! 	     Aubrey Jaffer
! 	     84 Pleasant Street
! 	     Wakefield, MA   01880-1846
! 	     USA
  
!    * `less'	    (SrcCD, UtilD, UtilT)
  
!      `less' is a display paginator similar to `more' and `pg' but with
       various features (such as the ability to scroll backwards) that most
       pagers lack.
  
!    * `m4'	  (DjgppD, DosCD, SrcCD, UtilD, UtilT)
  
       GNU `m4' is an implementation of the traditional Unix macro processor.
!      It is mostly SVR4 compatible, although it has some extensions (for
!      example, handling more than 9 positional parameters to macros).  `m4'
!      also has built-in functions for including files, running shell commands,
!      doing arithmetic, etc.
  
!    * `make'	    (BinCD, DjgppD, DosCD, LangT, LspEmcT, SrcCD, UtilD,
!      UtilT)
  
       GNU `make' supports POSIX 1003.2 and has all but a few obscure features
!      of the BSD and System V versions of `make', as well as many of our own
!      extensions.  GNU extensions include long options, parallel compilation,
!      flexible implicit pattern rules, conditional execution and powerful text
!      manipulation functions.  Texinfo source for the `Make Manual' comes with
!      the program.  *Note Documentation::.
! 
!      GNU `make' is on several of our tapes because some system vendors supply
!      no `make' utility at all, and some native `make' programs lack the
!      `VPATH' feature essential for using the GNU configure system to its full
!      extent.  The GNU `make' sources have a shell script to build `make'
!      itself on such systems.
  
!      MS-DOS binaries for `make' are available with the DJGPP distribution.
! 
!    * MandelSpawn	 (SrcCD, UtilT)
  
       A parallel Mandelbrot generation program for the X Window System.
  
!    * mtools	    (SrcCD, UtilT)
  
       mtools is a set of public domain programs to allow Unix systems to read,
!      write and manipulate files on an MS-DOS file system (usually a diskette).
  
!    * MULE	  (EmcsD, DosCD, SrcCD)
  
!      MULE is a MULtilingual Enhancement to GNU Emacs.  It can handle many
!      character sets at once including Japanese, Chinese, Korean, Vietnamese,
!      Thai, Greek, the ISO Latin-1 through Latin-8 character sets, Ukrainian,
!      Arabic, Hebrew, Russian, and other Cyrillic alphabets.  A text buffer in
!      MULE can contain a mixture of characters from these languages.  To input
!      any of these characters, you can use various input methods provided by
!      MULE itself.  In addition, if you use MULE under some terminal emulators
!      (kterm, cxterm, or exterm), you can use its input methods.	 MULE is
!      being merged into GNU Emacs.  *Note GNU and Other Free Software in
!      Japan::, for more information about MULE.
! 
!    * NetHack	     (SrcCD, UtilT)
! 
!      NetHack is a display-oriented adventure game similar to Rogue.  Both
!      ASCII and X displays are supported.
! 
!    * NIH Class Library	       (LangT, SrcCD)
! 
!      The NIH Class Library (formerly known as "OOPS", Object-Oriented Program
!      Support) is a portable collection of C++ classes, similar to those in
!      Smalltalk-80, which has been developed by Keith Gorlen of the National
!      Institutes of Health (NIH), using the C++ programming language.
  
!    * `nvi'	   (SrcCD, UtilT)
  
       `nvi' is a free implementation of the `vi'/`ex' Unix editor.  It has
--- 1292,1466 ----
       for typesetting graphs), a page-makeup postprocessor similar to `pm'
       (see `Computing Systems', Vol. 2, No. 2; ask `office@usenix.org' how to
!      get a copy), and an ASCII output class for `pic' to integrate `pic' with
!      Texinfo.  Questions and bug reports from users who have read the
!      documentation provided with Groff can be sent to
       `bug-groff@prep.ai.mit.edu'.
  
!    * `gzip'   (DjgpD, DosBC, LangT, LspEmcT, SrcCD, UtilT)
  
!      `gzip' can expand LZW-compressed files but uses another, unpatented
!      algorithm for compression which generally produces better results.	 It
!      also expands files compressed with System V's `pack' program.
  
!    * `hello'   (DosBC, SrcCD, UtilT)
  
       The GNU `hello' program produces a familiar, friendly greeting.  It
       allows non-programmers to use a classic computer science tool which would
       otherwise be unavailable to them.	Because it is protected by the GNU
!      General Public License, users are free to share and change it.  `hello'
!      is also a good example of a program that meets the GNU coding standards.
  
       Like any truly useful program, `hello' contains a built-in mail reader.
  
!    * `hp2xx'   (SrcCD, UtilT)
  
       GNU `hp2xx' reads HP-GL files, decomposes all drawing commands into
       elementary vectors, and converts them into a variety of vector and raster
       output formats.  It is also an HP-GL previewer.  Currently supported
!      vector formats include encapsulated Postscript, Uniplex RGIP, Metafont,
!      various special TeX-related formats, and simplified HP-GL (line drawing
!      only) for imports.	 Raster formats supported include IMG, PBM, PCX, &
!      HP-PCL (including Deskjet & DJ5xxC support).  Previewers work under X11
!      (Unix), OS/2 (PM & full screen), & MS-DOS (SVGA, VGA, & HGC).
! 
!    * HylaFAX   (SrcCD, UtilT)
! 
!      HylaFAX (once named FlexFAX) is a facsimile system for Unix systems.  It
!      supports sending, receiving, & polled retrieval of facsimile, as well as
!      transparent shared data use of the modem.
! 
!      Details are available on the World Wide Web at:
!      `http://www.vix.com/hylafax/'.
! 
!    * Hyperbole	 (LspEmcT, SrcCD)
! 
!      Hyperbole, written by Bob Weiner in Emacs Lisp, is an open, efficient,
!      programmable information management & hypertext system, intended for
!      everyday work on any platform supported by Emacs.
! 
!    * `indent'	(DosBC, LangT, SrcCD, UtilD)
! 
!      GNU `indent' formats C source code into the GNU indentation style.	 It
!      also has options to output BSD, K&R, or your own special style.  GNU
!      `indent' is more robust & provides more functionality than other such
!      programs, including handling C++ comments.	 It runs on a number of
!      systems, including DOS & VMS.
! 
!      The next version will also format C++ source code.
! 
!    * Ispell   (DosBC, SrcCD, UtilT)
  
!      Ispell is an interactive spell checker that suggests "near misses" to
!      replace unrecognized words.  System & user-maintained dictionaries for
!      multiple languages can be used.  Standalone & Emacs interfaces are
!      available.
! 
!      Previously, the FSF had its own version of Ispell ("Ispell 4.0"), but
!      has dropped it for a parallel branch that has had more development
!      ("Ispell 3.1").  (Ispell 3 was an earlier release by the original Ispell
!      author, but others have since made it more sophisticated.)
! 
!    * JACAL   *Not available from the FSF except by FTP*
  
       JACAL is a symbolic mathematics system for the manipulation and
!      simplification of algebraic equations and expressions.  New in JACAL is
!      multivariate factoring from Michael Thomas `(mjt@octavia.anu.edu.au)'.
!      See JACAL's documentation at `http://www-swiss.ai.mit.edu/~jaffer/'.
! 
!      JACAL is written in Scheme using the SLIB portable Scheme Library.	 It
!      comes with SCM, an IEEE P1178 & R4RS compliant version of Scheme written
!      in C.  SCM runs on Amiga, Atari-ST, MS-DOS, OS/2, NOS/VE, Unicos, VMS,
!      Unix, & similar systems.
! 
!      The FSF is not distributing JACAL on any physical media.  To get an IBM
!      PC floppy disk with the freely redistributable source & executable
!      files, send $99.00 to:
! 
! 	  Aubrey Jaffer
! 	  84 Pleasant Street
! 	  Wakefield, MA	  01880-1846
! 	  USA
  
!    * `less'   (DosBC, SrcCD, UtilD, UtilT)
  
!      `less' is a display paginator similar to `more' and `pg', but with
       various features (such as the ability to scroll backwards) that most
       pagers lack.
  
!    * `m4'   (DosBC, SrcCD, UtilD, UtilT)
  
       GNU `m4' is an implementation of the traditional Unix macro processor.
!      It is mostly SVR4 compatible, although it has some extensions (e.g.,
!      handling more than 9 positional parameters to macros).  `m4' also has
!      built-in functions for including files, running shell commands, doing
!      arithmetic, etc.
  
!    * `make' (BinCD,DjgpD,DosBC,LangT,LspEmcT,SrcCD,UtilD,UtilT)[FSFman]
  
       GNU `make' supports POSIX 1003.2 and has all but a few obscure features
!      of the BSD and System V versions of `make'.  GNU extensions include long
!      options, parallel compilation, flexible implicit pattern rules,
!      conditional execution, & powerful text manipulation functions.  Texinfo
!      source for the `Make Manual' comes with the program (*note
!      Documentation::.).
  
!    * MandelSpawn   (SrcCD, UtilT)
  
       A parallel Mandelbrot generation program for the X Window System.
  
!    * Midnight Commander (`mc')	 (SrcCD, UtilT)
! 
!      The Midnight Commander is a user friendly and colorful Unix file manager
!      and shell, useful to novice and guru alike.  It has a built-in virtual
!      file system that allows the user to manipulate files inside tar files
!      (both regular and compressed) or files on remote machines using the FTP
!      protocol.
! 
!    * `mkisofs'	 (SrcCD, UtilT)
! 
!      `mkisofs' is a pre-mastering program to generate an ISO 9660 file system.
!      It takes a snapshot of a directory tree, and makes a binary image which
!      corresponds to an ISO 9660 file system when written to a block device.
! 
!      It can also generate the System Use Sharing Protocol records of the Rock
!      Ridge Interchange Protocol (used to further describe the files in an ISO
!      9660 file system to a Unix host; it provides information such as longer
!      filenames, uid/gid, permissions, and device nodes).
! 
!      Also included is `cdwrite', which can take an image from `mkisofs' and
!      write it to a Phillips CD recorder system attached to a GNU/Linux system.
! 
!    * mtools   (SrcCD, UtilT)
  
       mtools is a set of public domain programs to allow Unix systems to read,
!      write, and manipulate files on an MS-DOS file system (usually a
!      diskette).
! 
!    * MULE   (DosBC, EmcsD, LspEmcT, SrcCD)
! 
!      MULE is a MULtilingual Enhancement to GNU Emacs.  MULE text buffers can
!      contain a mix of characters from many languages including: Japanese,
!      Chinese, Korean, Vietnamese, Thai, modern European languages (including
!      Greek & Russian), Arabic, & Hebrew.  MULE also provides input methods
!      for all of them.  MULE is being merged into GNU Emacs.  *Note GNU &
!      Other Free Software in Japan::, for more information about MULE.
! 
!    * `ncurses'	 (LangT, SrcCD)
  
!      `ncurses' is an implementation of the Unix `curses' library for
!      developing screen based programs that are terminal independent.
  
!    * NetHack   (SrcCD, UtilT)
  
!      NetHack is a Rogue-like adventure game supporting character & X displays.
! 
!    * NIH Class Library	 (LangT, SrcCD)
! 
!      The NIH Class Library (once known as "OOPS", Object-Oriented Program
!      Support) is a portable collection of C++ classes (similar to those in
!      Smalltalk-80) written in C++ by Keith Gorlen of the National Institutes
!      of Health (NIH).
! 
!    * `nvi'   (SrcCD, UtilT)
  
       `nvi' is a free implementation of the `vi'/`ex' Unix editor.  It has
*************** GNU software currently available:
*** 1231,1277 ****
       & the `lisp' option, which will be added.	Enhancements over `vi'/`ex'
       include split screens with multiple buffers, handling 8-bit data,
!      infinite file & line lengths, tag stacks, infinite undo & extended
       regular expressions.  It runs under GNU/Linux, BSD, NetBSD, FreeBSD,
!      BSDI, AIX, HP-UX, DGUX, IRIX, PSF, PTX, Solaris, SunOS, Ultrix, Unixware
!      & should port easily to many other systems.
  
!    * GNU Objective-C Library	     (LangT, SrcCD)
  
!      The GNU Objective-C Class Library (`libobjects') is a library of
!      general-purpose, non-graphical Objective-C objects written by Andrew
!      McCallum and other volunteers.  It includes collection classes for
!      maintaining groups of objects and C types, streams for I/O to various
!      destinations, coders for formatting objects and C types to streams, ports
!      for network packet transmission, distributed objects (remote object
!      messaging), string classes, pseudo-random number generators, and time
!      handling facilities.  The package will also include the foundation
!      classes for the GNUStep project; over 50 of these classes have already
!      been implemented.	The library is known to work on i386, i486, Pentium,
!      m68k, SPARC, MIPS, & RS6000.  Send queries and bug reports to
       `mccallum@gnu.ai.mit.edu'.
  
!    * `OBST'	    (LangT, SrcCD)
  
!      `OBST' is a persistent object management system with bindings to C++.
!      `OBST' supports incremental loading of methods.  Its graphical tools
       require the X Window System.  It features a hands-on tutorial including
!      sample programs.  It compiles with g++ and should install easily on most
!      Unix platforms.
  
!    * Octave	    (LangT, SrcCD)
  
!      Octave is a high-level language similar to MATLAB that is primarily
!      intended for numerical computations.  It provides a convenient command
!      line interface for solving linear and nonlinear problems numerically.
!      m{No Value For "ergegrafkludge"} Octave does arithmetic for real and
!      complex scalars and matrices, solves sets of nonlinear algebraic
!      equations, integrates systems of ordinary differential and
!      differential-algebraic equations, and integrates functions over finite
!      and infinite intervals.  Two- and three-dimensional plotting is
!      available using `gnuplot'.	  Send queries and bug reports to:
!      `bug-octave@che.utexas.edu'.   Source is included for a 220+ page
!      Texinfo manual, which is not yet published by the FSF.
  
!    * Oleo	  (SrcCD, UtilT)
  
       Oleo is a spreadsheet program (better for you than the more expensive
--- 1468,1521 ----
       & the `lisp' option, which will be added.	Enhancements over `vi'/`ex'
       include split screens with multiple buffers, handling 8-bit data,
!      infinite file & line lengths, tag stacks, infinite undo, & extended
       regular expressions.  It runs under GNU/Linux, BSD, NetBSD, FreeBSD,
!      BSDI, AIX, HP-UX, DGUX, IRIX, PSF, PTX, Solaris, SunOS, Ultrix, and
!      Unixware, & should port easily to other systems.
! 
!    * Oaklisp	(SrcCD)
  
!      Oaklisp is a fast, portable, object-oriented Scheme with first class
!      types.
  
!    * Objective-C Library   **Note Forthcoming GNUs::*	(LangT, SrcCD)
! 
!      Our Objective-C Class Library (`libobjects') has general-purpose,
!      non-graphical Objective-C objects written by Andrew McCallum & other
!      volunteers.  It includes collection classes for using groups of objects
!      & C types, I/O streams, coders for formatting objects & C types to
!      streams, ports for network packet transmission, distributed objects
!      (remote object messaging), string classes, exceptions, pseudo-random
!      number generators, & time handling facilities.  It also includes the
!      foundation classes for the GNUStep project; over 70 of them have already
!      been implemented.	The library is known to work on i386/i486/Pentiums,
!      m68k, SPARC, MIPS, HPPA, & RS/6000.  Send queries & bug reports to
       `mccallum@gnu.ai.mit.edu'.
  
!    * OBST   (LangT, SrcCD)
  
!      OBST is a persistent object management system with bindings to C++.
!      OBST supports incremental loading of methods.  Its graphical tools
       require the X Window System.  It features a hands-on tutorial including
!      sample programs.  It compiles with G++, and should install easily on
!      most Unix platforms.
  
!    * Octave   (LangT, SrcCD)
  
!      Octave is a high-level language similar to MATLAB, primarily intended
!      for numerical computations.  It has a convenient command line interface
!      for solving linear & nonlinear problems numerically.
  
!      Octave does arithmetic for real and complex scalars and matrices, solves
!      sets of nonlinear algebraic equations, integrates systems of ordinary
!      differential & differential-algebraic equations, and integrates
!      functions over finite & infinite intervals.  Two- & three-dimensional
!      plotting is available using `gnuplot'.
! 
!      Send queries and bug reports to: `bug-octave@bevo.che.wisc.edu'.
! 
!      Texinfo source is included for a 220+ page Octave manual, not yet
!      published by the FSF.
! 
!    * Oleo   (SrcCD, UtilT)
  
       Oleo is a spreadsheet program (better for you than the more expensive
*************** GNU software currently available:
*** 1279,1293 ****
       terminals, and can output Embedded Postscript renditions of spreadsheets.
       Keybindings should be familiar to Emacs users and are configurable.
!      Under X and in Postscript output, Oleo supports multiple, variable width
!      fonts.   *Note Forthcoming GNUs::, for the plans for later releases of
!      Oleo.
  
!    * `p2c'	   (LangT, SrcCD)
  
!      `p2c' is a Pascal-to-C translator written by Dave Gillespie.  It
!      recognizes many Pascal dialects including Turbo, HP, VAX, and ISO, and
!      produces readable, maintainable, portable C.
  
!    * `patch'	     (DjgppD, DosCD, SrcCD, UtilT)
  
       `patch' is our version of Larry Wall's program to take `diff''s output
--- 1523,1536 ----
       terminals, and can output Embedded Postscript renditions of spreadsheets.
       Keybindings should be familiar to Emacs users and are configurable.
!      Oleo supports multiple variable-width fonts when used under the X Window
!      System or outputting to Postscript devices.
  
!    * `p2c'   (LangT, SrcCD)
  
!      `p2c' is Dave Gillespie's Pascal-to-C translator.	It inputs many
!      different dialects (HP, ISO, Turbo, VAX, et al.) and generates readable,
!      maintainable, portable C.
  
!    * `patch'   (DosBC, SrcCD, UtilT)
  
       `patch' is our version of Larry Wall's program to take `diff''s output
*************** GNU software currently available:
*** 1295,1317 ****
       version.
  
!    * PCL	 (LspEmcT, SrcCD)
  
       PCL is a free implementation of a large subset of CLOS, the Common Lisp
       Object System.  It runs under both GCL and CLISP, mentioned above.
  
!    * `perl'	    (LangT, SrcCD)
  
       Larry Wall's `perl' combines the features and capabilities of `sed',
!      `awk', `sh' and C, as well as interfaces to the Unix system calls and
!      many C library routines.
  
!    * `ptx'	   (SrcCD, UtilD, UtilT)
  
       GNU `ptx' is our version of the traditional permuted index generator.
       It handles multiple input files at once, produces TeX compatible output,
!      & outputs readable "KWIC" (KeyWords In Context) indexes.	It does not
!      yet handle input files that do not fit in memory all at once.
  
!    * `rc'	  (SrcCD, UtilT)
  
       `rc' is a shell that features a C-like syntax (much more so than `csh')
--- 1538,1567 ----
       version.
  
!    * PCL   (LspEmcT, SrcCD)
  
       PCL is a free implementation of a large subset of CLOS, the Common Lisp
       Object System.  It runs under both GCL and CLISP, mentioned above.
  
!    * `perl'   (DosBC, LangT, SrcCD)
  
       Larry Wall's `perl' combines the features and capabilities of `sed',
!      `awk', `sh', and C.  It also provides interfaces to the Unix system
!      calls and many C library routines.
  
!    * `pine'   (SrcCD, UtilT)
! 
!      `pine' is a friendly menu-driven electronic mail manager and user
!      interface .
! 
!    * `ptx'    **Note Forthcoming GNUs::*   (SrcCD, UtilD, UtilT)
  
       GNU `ptx' is our version of the traditional permuted index generator.
       It handles multiple input files at once, produces TeX compatible output,
!      and generates readable "KWIC" (KeyWords In Context) indexes without
!      using `nroff'.
  
!      It does not yet handle input files that do not fit in memory all at once.
! 
!    * `rc'   (SrcCD, UtilT)
  
       `rc' is a shell that features a C-like syntax (much more so than `csh')
*************** GNU software currently available:
*** 1320,1519 ****
       scripts.  It inspired the shell `es'.
  
!    * RCS	 (SrcCD, UtilD, UtilT)
  
       RCS, the Revision Control System, is used for version control &
!      management of software projects.  When used with GNU `diff', RCS can
!      handle binary files (executables, object files, 8-bit data, etc).	Also
!      see the item about CVS in this section.
  
!    * `recode'	      (SrcCD, UtilT)
  
       GNU `recode' converts files between character sets and usages.  When
!      exact transliterations are not possible, it may get rid of the offending
       characters or fall back on approximations.	 This program recognizes or
!      produces nearly 150 different character sets and is able to
!      transliterate files between almost any pair.  Most RFC 1345 character
!      sets are supported.
  
!    * regex	   (LangT, SrcCD)
  
       The GNU regular expression library supports POSIX.2, except for
       internationalization features.  It is included in many GNU programs which
!      do regular expression matching and available separately.  An alternative
!      regular expression package, `rx', comes with `sed'; it has the potential
!      to be faster than `regex' in most cases, but still needs work.
  
!    * Scheme	    (SchmT, SrcCD)
  
!      For information about Scheme, see *Note Scheme Tape::.
  
!    * `screen'	      (SrcCD, UtilT)
  
       `screen' is a terminal multiplexer that runs several separate "screens"
       (ttys) on a single character-based terminal.  Each virtual terminal
!      emulates a DEC VT100 plus several ISO 6429 (ECMA 48, ANSI X3.64) and ISO
!      2022 functions.  Arbitrary keyboard input translation is also supported.
!      `screen' sessions can be detached and resumed later on a different
!      terminal type.  Output in detached sessions is saved for later viewing.
  
!    * `sed'	   (DjgppD, DosCD, SrcCD, UtilD, UtilT)
  
!      `sed' is a stream-oriented version of `ed'.  GNU `sed' comes with the
!      `rx' library, a faster version of `regex' (*note Forthcoming GNUs::.).
  
!    * Sharutils	       (SrcCD, UtilT)
  
       `shar' makes so-called shell archives out of many files, preparing them
!      for transmission by electronic mail services, while `unshar' helps
!      unpack these shell archives after reception.  `uuencode' prepares a file
!      for transmission over an electronic channel which ignores or otherwise
!      mangles the high order bit of bytes, while `uudecode' does the converse
!      transformation.
! 
!    * Shellutils		(DjgppD, DosCD, SrcCD, UtilT)
! 
!      Use shellutils interactively or in shell scripts: `basename', `date',
!      `dirname', `echo', `env', `expr', `false', `groups', `hostname', `id',
!      `logname', `nice', `nohup', `pathchk', `printenv', `printf', `pwd',
!      `sleep', `stty', `su', `tee', `test', `true', `tty', `uname', `users',
!      `who', `whoami', and `yes'.
  
!    * GNU Shogi	       (SrcCD, UtilT)
  
       Shogi is a Japanese game similar to Chess; a major difference is that
!      captured pieces can be returned into play.	  GNU Shogi is a variant of
!      GNU Chess; GNU Shogi implements the same features as GNU Chess and uses
       similar heuristics.  As a new feature, sequences of partial board
!      patterns can be introduced in order to help the program play toward
!      specific opening patterns.	 There are both character and X display
!      interfaces.   GNU Shogi is primarily supported by Matthias Mutz on
!      behalf of the FSF.
  
!    * Smalltalk	       (LangT, SrcCD)
  
       GNU Smalltalk is an interpreted object-oriented programming language
!      system written in highly portable C.  It has been successfully ported to
!      many Unix and some other platforms, including DOS (but these non-Unix
!      ports are not available from the FSF).  Current features include a
!      binary image save capability, the ability to invoke user-written C code
!      and pass parameters to it, a GNU Emacs editing mode, a version of the X
!      protocol invocable from Smalltalk, optional byte-code compilation
!      tracing and byte-code execution tracing, and automatically loaded
!      per-user initialization files.  It implements all of the classes and
!      protocol in the Smalltalk-80 book "Smalltalk-80: The Language", except
!      for the graphic user interface (`GUI') related classes.
  
!      *Note Forthcoming GNUs::, for plans for later releases of Smalltalk.
  
!    * Superopt	      (LangT, SrcCD)
  
       Superopt is a function sequence generator that uses an exhaustive
       generate-and-test approach to find the shortest instruction sequence for
       a given function.	You provide a function as input, a CPU to generate
!      code for, and how many instructions you can accept.  Its application in
!      GCC is described in the `ACM SIGPLAN PLDI'92' proceedings.	 Superopt
!      supports: SPARC, m68k, m68020, m88k, IBM RS/6000, AMD 29000, Intel
!      80x86, Pyramid, DEC Alpha, & HP-PA.
! 
!    * `tar'	   (SrcCD, UtilT)
! 
!      GNU `tar' includes multivolume support, the ability to archive sparse
!      files, automatic archive compression/decompression, remote archives and
!      special features that allow `tar' to be used for incremental and full
!      backups.  Unfortunately, GNU `tar' implements an early draft of the
!      POSIX 1003.1 `ustar' standard which is different from the final
!      standard.	Adding support for the new changes in a backward-compatible
!      fashion is not trivial.
  
!    * Termcap Library	     (SrcCD, UtilT)
  
       The GNU Termcap library is a drop-in replacement for `libtermcap.a' on
       any system.  It does not place an arbitrary limit on the size of Termcap
       entries, unlike most other Termcap libraries.  Included is source for the
!      `Termcap Manual' in Texinfo format.  *Note Documentation::.
  
!    * TeX	 (SrcCD)
  
       TeX is a document formatting system that handles complicated
       typesetting, including mathematics.  It is GNU's standard text formatter.
  
!      You can obtain TeX from the University of Washington, which maintains and
!      supports a tape distribution of TeX for Unix systems.  The core material
!      consists of Karl Berry's `web2c' TeX package, the sources for which are
!      available via anonymous ftp; retrieval instructions are in
!      `pub/tex/unixtex.ftp' on `ftp.cs.umb.edu'.	 If you receive any
!      installation support from the University of Washington, please consider
!      sending them a donation.
  
       To order a full distribution written in `tar' on either a 1/4inch
       4-track QIC-24 cartridge or a 4mm DAT cartridge, send $210.00 to:
  
! 	     Pierre A. MacKay
! 	     Department of Classics
! 	     DH-10, Denny Hall 218
! 	     University of Washington
! 	     Seattle, WA   98195
! 	     USA
! 
! 	     Electronic-Mail: `mackay@cs.washington.edu'
! 	     Telephone: +1-206-543-2268
! 
!      Please make checks payable to the University of Washington.  Do not
!      specify any other payee.  That causes accounting difficulties.  Checks
!      must be in U.S. dollars, drawn on a U.S. bank.  Prepaid orders are the
!      only orders that can now be handled.  Overseas sites: please add to the
!      base cost $20.00 for shipment via air parcel post, or $30.00 for
!      shipment via courier.  Please check with the above for current prices
!      and formats.
! 
!    * Texinfo	     (DjgppD, DosCD, LangT, LspEmcT, SrcCD, UtilD, UtilT)
! 
!      Texinfo is a set of utilities which generate both printed manuals and
!      online hypertext documentation (called "Info").  There are also programs
!      for reading online Info documents.	 Version 3 has both GNU Emacs Lisp
!      and standalone programs written in C or shell script.  Texinfo mode for
!      GNU Emacs enables easy editing and updating of Texinfo files.  Programs
!      provided include `makeinfo', `info', `texi2dvi', `texindex', `tex2patch',
!      and `fixfonts'.  Source for the `Texinfo Manual' is included.  *Note
!      Documentation::.
  
!    * Textutils	       (DjgppD, DosCD, SrcCD, UtilT)
  
       The Textutils programs manipulate textual data.  They include: `cat',
       `cksum', `comm', `csplit', `cut', `expand', `fmt', `fold', `head',
!      `join', `nl', `od', `paste', `pr', `sort', `split', `sum', `tac', `tail',
!      `tr', `unexpand', `uniq', and `wc'.
  
!    * Tile Forth		(LangT, SrcCD)
  
       Tile Forth is a 32-bit implementation of the Forth-83 standard written
!      in C, allowing it to be easily ported to new systems, and extended with
!      "any" C-function (graphics, windowing, etc).   Many Forth libraries with
!      full documentation are available including ones for top-down parsing,
!      multi-threads, and object oriented programming.
! 
!    * `time'	    (SrcCD, UtilT)
! 
!      `time' is used to report statistics (usually from a shell) about the
!      amount of user, system and real time used by a process.  On some systems
!      it also reports memory usage, page faults, and other statistics.
  
!    * `tput'	    (SrcCD, UtilT)
  
!      `tput' is a portable way for shell scripts to use special terminal
!      capabilities.  Our `tput' uses the Termcap database, instead of Terminfo
!      as most others do.
  
!    * UUCP	  (SrcCD, UtilT)
  
!      This version of UUCP was written by Ian Lance Taylor, and is GNU's
!      standard UUCP system.  It supports the `f', `g' and `v' (in all window
!      and packet sizes), `G', `t', `e', Zmodem and two new bidirectional (`i'
!      and `j') protocols.  If you have a Berkeley sockets library, it can make
!      TCP connections.  If you have TLI libraries, it can make TLI
!      connections.  Source is included for a Texinfo manual, which is not yet
!      published by the FSF.
  
!    * `wdiff'	     (DjgppD, DosCD, SrcCD, UtilT)
  
       `wdiff' is a front-end to GNU `diff'.  It compares two files, finding
--- 1570,1805 ----
       scripts.  It inspired the shell `es'.
  
!    * RCS   (SrcCD, UtilD, UtilT)
  
       RCS, the Revision Control System, is used for version control &
!      management of software projects.  Used with GNU `diff', RCS can handle
!      binary files (executables, object files, 8-bit data, etc).	 RCS now
!      conforms to GNU configuration standards and to POSIX 1003.1b-1993.	 Also
!      see the CVS item above.
  
!    * `recode'	 **Note Forthcoming GNUs::*   (SrcCD, UtilT)
  
       GNU `recode' converts files between character sets and usages.  When
!      exact transliterations are not possible, it may delete the offending
       characters or fall back on approximations.	 This program recognizes or
!      outputs nearly 150 different character sets and is able to transliterate
!      files between almost any pair.  Most RFC 1345 character sets are
!      supported.
  
!    * `regex'   (LangT, SrcCD)
  
       The GNU regular expression library supports POSIX.2, except for
       internationalization features.  It is included in many GNU programs which
!      do regular expression matching & is available separately.	An alternate
!      regular expression package, `rx', is faster than `regex' in most cases &
!      will replace `regex' over time.
! 
!    * `rx'   (LangT, SrcCD)
  
!      Tom Lord has written `rx', a new regular expression library which is
!      faster than the older GNU `regex' library.	 It is now being distributed
!      with `sed' and `tar'.  `rx' will be used in the next releases of `m4'
!      and `ptx'.
  
!    * SAOimage	(SrcCD, UtilT)
  
!      SAOimage is an X-based astronomical image viewer.	It reads data images
!      and displays them with a pseudocolor colormap.  There is full interactive
!      control of the colormap, reading, and writing of colormaps, etc.
! 
!    * Scheme   *For more information, see *Note Scheme Tape::*	(SrcCD, SchmT)
! 
!    * `screen'	(SrcCD, UtilT)
  
       `screen' is a terminal multiplexer that runs several separate "screens"
       (ttys) on a single character-based terminal.  Each virtual terminal
!      emulates a DEC VT100 plus several ISO 2022 and ISO 6429 (ECMA 48, ANSI
!      X3.64) functions, including color.	 Arbitrary keyboard input translation
!      is also supported.	 `screen' sessions can be detached and resumed later
!      on a different terminal type.  Output in detached sessions is saved for
!      later viewing.
  
!    * `sed'   (DjgpD, DosBC, SrcCD, UtilD, UtilT)
  
!      `sed' is a stream-oriented version of `ed'.  It comes with the `rx'
!      library.
  
!    * Sharutils	 (SrcCD, UtilT)
  
       `shar' makes so-called shell archives out of many files, preparing them
!      for transmission by electronic mail services; `unshar' helps unpack
!      these shell archives after reception.  `uuencode' and `uudecode' are
!      POSIX compliant implementations of a pair of programs to transform files
!      into a format that can be safely transmitted across a 7-bit ASCII link.
! 
!    * Shellutils	  (DosBC, SrcCD, UtilT)
! 
!      They are: `basename', `date', `dirname', `echo', `env', `expr', `false',
!      `groups', `hostname', `id', `logname', `nice', `nohup', `pathchk',
!      `printenv', `printf', `pwd', `sleep', `stty', `su', `tee', `test',
!      `true', `tty', `uname', `users', `who', `whoami', & `yes'.
  
!    * Shogi   (SrcCD, UtilT)
  
       Shogi is a Japanese game similar to Chess; a major difference is that
!      captured pieces can be returned into play.
! 
!      GNU Shogi is a variant of GNU Chess; it implements the same features &
       similar heuristics.  As a new feature, sequences of partial board
!      patterns can be introduced to help the program play toward specific
!      opening patterns.	It has both character and X display interfaces.
! 
!      It is primarily supported by Matthias Mutz on behalf of the FSF.
  
!    * SIPP    (SrcCD)
! 
!      SIPP is a library for creating photorealistic renderings of 3D scenes.
!      A scene is built up of objects which can be transformed with rotation,
!      translation, and scaling.	The objects form hierarchies where each object
!      can have arbitrarily many subobjects and subsurfaces.  A surface is a
!      number of connected polygons which are rendered with either Phong,
!      Gouraud, or flat shading.	The library supports programmable shaders and
!      texture mapping with textures in up to 3 dimensions and automatic
!      interpolation of texture coordinates.  A scene can be illuminated by an
!      arbitrary number of light sources.	 The lights from some of them are
!      capable of casting shadows of objects.
! 
!    * Smalltalk	 *Also see *Note Forthcoming GNUs::*   (LangT,SrcCD)
  
       GNU Smalltalk is an interpreted object-oriented programming language
!      system written in highly portable C.  It has been ported to many Unix,
!      DOS, & other OSes.	 Features include a binary image save capability, the
!      ability to call user-written C code with parameters, an Emacs editing
!      mode, a version of the X protocol invocable from Smalltalk, optional
!      byte-code compilation and/or execution tracing, & automatically loaded
!      per-user initialization files.  It implements all of the classes &
!      protocol in the book "Smalltalk-80: The Language", except for the
!      graphic user interface (GUI) related classes.
! 
!    * SNePS    (SrcCD)
! 
!      SNePS is the Semantic Network Processing System.  It is an
!      implementation of a fully intensional theory of propositional knowledge
!      representation and reasoning.  SNePS runs under CLISP or GCL.
  
!    * Spinner   (SrcCD)
  
!      Spinner is a modularized, object oriented, non-forking World Wide Web
!      server with high performance and throughput.
! 
!    * Superopt	(LangT, SrcCD)
  
       Superopt is a function sequence generator that uses an exhaustive
       generate-and-test approach to find the shortest instruction sequence for
       a given function.	You provide a function as input, a CPU to generate
!      code for, and how many instructions you want.  Its use in GCC is
!      described in the `ACM SIGPLAN PLDI'92 Proceedings'.  It supports: SPARC,
!      m68k, m68020, m88k, IBM POWER and PowerPC, AMD 29k, Intel x86 and 960,
!      Pyramid, DEC Alpha, Hitachi SH, & HP-PA.
! 
!    * `tar'   (DosBC, SrcCD, UtilT)
! 
!      GNU `tar' includes multi-volume support, the ability to archive sparse
!      files, compression/decompression, remote archives, and special features
!      that allow `tar' to be used for incremental and full backups.  GNU `tar'
!      uses an early draft of the POSIX 1003.1 `ustar' format which is
!      different from the final version.	This will be corrected in the future.
  
!    * Termcap Library   (SrcCD, UtilT) [FSFman]
  
       The GNU Termcap library is a drop-in replacement for `libtermcap.a' on
       any system.  It does not place an arbitrary limit on the size of Termcap
       entries, unlike most other Termcap libraries.  Included is source for the
!      `Termcap Manual' in Texinfo format (*note Documentation::.).
! 
!    * Termutils	 (SrcCD, UtilT)
  
!      The Termutils package contains programs for controlling terminals.
!      `tput' is a portable way for shell scripts to use special terminal
!      capabilities.  `tabs' is a program to set hardware terminal tab settings.
! 
!    * TeX   (DosBC, SrcCD)
  
       TeX is a document formatting system that handles complicated
       typesetting, including mathematics.  It is GNU's standard text formatter.
  
!      The University of Washington maintains & supports a tape distribution of
!      TeX for Unix systems.  The core material is Karl Berry's `web2c' TeX
!      package.  Sources are available via anonymous ftp; retrieval
!      instructions are in `/pub/tex/unixtex.ftp' on `ftp.cs.umb.edu'.  If you
!      receive any installation support from the University of Washington,
!      consider sending them a donation.
  
       To order a full distribution written in `tar' on either a 1/4inch
       4-track QIC-24 cartridge or a 4mm DAT cartridge, send $210.00 to:
  
! 	  Pierre A. MacKay
! 	  Department of Classics
! 	  DH-10, Denny Hall 218
! 	  University of Washington
! 	  Seattle, WA	98195
! 	  USA
! 
! 	  Electronic-Mail: `mackay@cs.washington.edu'
! 	  Telephone: +1-206-543-2268
! 
!      Please make checks payable to: `University of Washington'.	 Do not
!      specify any other payee.  That causes accounting problems.	 Checks must
!      be in U.S. dollars, drawn on a U.S. bank.	Only prepaid orders can be
!      handled.  Overseas sites: please add to the base cost $20.00 to ship via
!      air parcel post or $30.00 to ship via courier.  Please check with the
!      above for current prices & formats.
! 
!    * Texinfo   (DjgpD,DosBC,LangT,LspEmcT,SrcCD,UtilD,UtilT)[FSFman]
! 
!      Texinfo is a set of utilities (`makeinfo', `info', `texi2dvi',
!      `texindex', `tex2patch', & `fixfonts') which generate both printed
!      manuals & online hypertext documentation (called "Info"), & can read
!      online Info documents.  Version 3 has both Emacs Lisp & standalone
!      programs written in C or shell script.  Texinfo mode for Emacs enables
!      easy editing & updating of Texinfo files.	Source for the `Texinfo
!      Manual' is included (*note Documentation::.).
  
!    * Textutils	 (DosBC, SrcCD, UtilT)
  
       The Textutils programs manipulate textual data.  They include: `cat',
       `cksum', `comm', `csplit', `cut', `expand', `fmt', `fold', `head',
!      `join', `md5sum', `nl', `od', `paste', `pr', `sort', `split', `sum',
!      `tac', `tail', `tr', `unexpand', `uniq', and `wc'.
  
!    * Tile Forth	  (LangT, SrcCD)
  
       Tile Forth is a 32-bit implementation of the Forth-83 standard written
!      in C, allowing it to be easily ported to new systems and extended with
!      any C-function (graphics, windowing, etc).
  
!      Many documented Forth libraries are available, including ones for
!      top-down parsing, multi-threads, & object oriented programming.
  
!    * `time'   (SrcCD, UtilT)
  
!      `time' reports (usually from a shell) the user, system, & real time used
!      by a process.  On some systems it also reports memory usage, page
!      faults, etc.
  
!    * `ucblogo'	 (LangT, SrcCD)
! 
!      `ucblogo' implements the classic teaching language, Logo.
! 
!    * UUCP   (SrcCD, UtilT)
! 
!      GNU's UUCP system (written by Ian Lance Taylor) supports the `f', `g',
!      `v' (all window & packet sizes), `G', `t', `e', Zmodem, & two new
!      bidirectional (`i' & `j') protocols.  With a BSD sockets library, it can
!      make TCP connections.  With TLI libraries, it can make TLI connections.
!      Source is included for a manual (not yet published by the FSF).
  
!    * W3	  (LspEmcT, SrcCD)
! 
!      W3 (written by William Perry in Emacs Lisp) is an extensible, advanced
!      World Wide Web browser that runs as part of GNU Emacs.  It understands
!      many protocols: FTP, gopher, HTML, SMTP, Telnet, WAIS, et al.
! 
!    * `wdiff'   (DosBC, SrcCD, UtilT)
  
       `wdiff' is a front-end to GNU `diff'.  It compares two files, finding
*************** GNU software currently available:
*** 1523,1540 ****
       have been refilled.
  
!    * `Ygl'	   (SrcCD, UtilT)
  
!      `Ygl' emulates SGI's GL (Graphics Language) library under X11.  It runs
!      under GNU/Linux with XFree, AIX 3.2, ConvexOS, HP-UX 7.0/8.0/9.0, SunOS
!      and many others.
  
  
  
! Program/Package Cross Reference - (NOT COMPLETELY UP TO DATE)
  *******************************
  
! Here is a list of what package each GNU program or library is in.  You can
! anonymously FTP a full list in the file `/pub/gnu/ProgramIndex' from a GNU
! FTP host (*note How to Get GNU Software::. for a list).
  
  	* a2p perl
--- 1809,1847 ----
       have been refilled.
  
!    * X11   *For details, see *Note X11 Tapes::*	  (SrcCD, X11OptT, X11ReqT)
! 
!    * `xboard', `xshogi'	  (SrcCD, UtilT)
! 
!      `xboard' is an X Window interface to GNU Chess.  `xshogi' is an X Window
!      interface to GNU Shogi.  They use the R4 Athena widgets and Xt
!      Intrinsics to provide an interactive referee for managing a game between
!      a user & a computer opponent, or between two computers.  You can also use
!      `xboard' without GNU Chess to play through games in files or to play
!      through games manually (force mode); in this case, moves aren't
!      validated.
  
!    * `xgrabsc'	 (SrcCD)
  
+      `xgrabsc' is a screen capture program similar to `xwd' but providing
+      more ways of selecting the part of the screen to capture and different
+      types of output: Postscript, color Postscript, xwd, bitmap, pixmap, and
+      puzzle.
  
+    * `Ygl'   (SrcCD, UtilT)
  
!      `Ygl' emulates a subset of SGI's GL (Graphics Language) library under
!      X11 on GNU/Linux with XFree, AIX 3.2, ConvexOS, HP-UX, SunOS, et al.  It
!      has most two-dimensional graphics routines, the queue device & query
!      routines, double buffering, RGB mode with dithering, FORTRAN bindings,
!      at al.
! 
! 
! 
! Program/Package Cross Reference
  *******************************
  
! Here is a list of what package each GNU program or library is in.  You can FTP
! the current list in the file `/pub/gnu/ProgramIndex' from a GNU FTP host
! (listed in *Note How to Get GNU Software::).
  
  	* a2p perl
*************** FTP host (*note How to Get GNU Software:
*** 1542,1545 ****
--- 1849,1853 ----
  	* ac bsd44
  	* accton bsd44
+ 	* ackpfd phttpd
  	* acl bsd44
  	* acm acm
*************** FTP host (*note How to Get GNU Software:
*** 1588,1592 ****
  	* bpltobzr Fontutils
  	* bugfiler bsd44
! 	* build ispell
  	* bzrto Fontutils
  
--- 1896,1900 ----
  	* bpltobzr Fontutils
  	* bugfiler bsd44
! 	* buildhash Ispell
  	* bzrto Fontutils
  
*************** FTP host (*note How to Get GNU Software:
*** 1595,1599 ****
  	* c2ph perl
  	* ca100 xopt
! 	* caeser bsd44
  	* cal bsd44
  	* calendar bsd44
--- 1903,1907 ----
  	* c2ph perl
  	* ca100 xopt
! 	* caesar bsd44
  	* cal bsd44
  	* calendar bsd44
*************** FTP host (*note How to Get GNU Software:
*** 1606,1609 ****
--- 1914,1920 ----
  	* cc1plus GCC
  	* cccp GCC
+ 	* cdwrite mkisofs
+ 	* cfengine cfengine
+ 	* cgi Spinner
  	* charspace Fontutils
  	* checknr bsd44
*************** FTP host (*note How to Get GNU Software:
*** 1618,1621 ****
--- 1929,1933 ----
  	* ci RCS
  	* cksum Textutils
+ 	* cktyps g77
  	* clisp CLISP
  	* clri bsd44
*************** FTP host (*note How to Get GNU Software:
*** 1655,1658 ****
--- 1967,1971 ----
  	* dc bc
  	* dd Fileutils
+ 	* ddd DDD
  	* delatex TeX
  	* demangle Binutils
*************** FTP host (*note How to Get GNU Software:
*** 1660,1663 ****
--- 1973,1977 ----
  	* detex TeX
  	* df Fileutils
+ 	* dhtppd phttpd
  	* diff Diffutils
  	* diff3 Diffutils
*************** FTP host (*note How to Get GNU Software:
*** 1676,1679 ****
--- 1990,1994 ----
  	* du Fileutils
  	* dump bsd44
+ 	* dump mkisofs
  	* dumpfs bsd44
  	* dvi2tty TeX
*************** FTP host (*note How to Get GNU Software:
*** 1725,1734 ****
  	* fc f2c
  	* fdraw xopt
  	* fgrep grep
  	* file bsd44
  	* find Findutils
  	* find2perl perl
! 	* finger finger
! 	* fingerd finger
  	* fish bsd44
  	* fixfonts Texinfo
--- 2040,2050 ----
  	* fc f2c
  	* fdraw xopt
+ 	* ffe g77
  	* fgrep grep
  	* file bsd44
  	* find Findutils
  	* find2perl perl
! 	* finger Finger
! 	* fingerd Finger
  	* fish bsd44
  	* fixfonts Texinfo
*************** FTP host (*note How to Get GNU Software:
*** 1736,1739 ****
--- 2052,2056 ----
  	* fixincludes GCC
  	* flex flex
+ 	* flex++ flex
  	* fmt bsd44
  	* fold Textutils
*************** FTP host (*note How to Get GNU Software:
*** 1745,1750 ****
  	* fortune bsd44
  	* fpr bsd44
! 	* freq ispell
! 	* freqtbl ispell
  	* from bsd44
  	* fsck bsd44
--- 2062,2067 ----
  	* fortune bsd44
  	* fpr bsd44
! 	* freq Ispell
! 	* freqtbl Ispell
  	* from bsd44
  	* fsck bsd44
*************** FTP host (*note How to Get GNU Software:
*** 1756,1764 ****
  	* g++ GCC
  	* gas Binutils
! 	* gawk Gawk
  	* gcc GCC
  	* gcore bsd44
  	* gdb GDB
  	* genclass libg++
  	* getty bsd44
  	* gftodvi TeX
--- 2073,2082 ----
  	* g++ GCC
  	* gas Binutils
! 	* gawk GAWK
  	* gcc GCC
  	* gcore bsd44
  	* gdb GDB
  	* genclass libg++
+ 	* gettext gettext
  	* getty bsd44
  	* gftodvi TeX
*************** FTP host (*note How to Get GNU Software:
*** 1766,1769 ****
--- 2084,2101 ----
  	* gftype TeX
  	* ghostview Ghostview
+ 	* git GIT
+ 	* gitaction GIT
+ 	* gitcmp GIT
+ 	* gitkeys GIT
+ 	* gitmatch GIT
+ 	* gitmount GIT
+ 	* gitps GIT
+ 	* gitredir GIT
+ 	* gitrgrep GIT
+ 	* gitview GIT
+ 	* gitwipe GIT
+ 	* gn GN
+ 	* gnans Gnans
+ 	* gnanslator Gnans
  	* gnats GNATS
  	* gnuchess Chess
*************** FTP host (*note How to Get GNU Software:
*** 1772,1778 ****
--- 2104,2113 ----
  	* gnuchessr Chess
  	* gnuchessx Chess
+ 	* gnuclient gnuserv
+ 	* gnudoit gnuserv
  	* gnupdisp Shogi
  	* gnuplot gnuplot
  	* gnuplot_x11 gnuplot
+ 	* gnuserv gnuserv
  	* gnushogi Shogi
  	* gnushogir Shogi
*************** FTP host (*note How to Get GNU Software:
*** 1781,1785 ****
  	* gpc xopt
  	* gpc xreq
! 	* gperf gperf
  	* gperf libg++
  	* gprof Binutils
--- 2116,2120 ----
  	* gpc xopt
  	* gpc xreq
! 	* gperf cperf
  	* gperf libg++
  	* gprof Binutils
*************** FTP host (*note How to Get GNU Software:
*** 1814,1817 ****
--- 2149,2155 ----
  	* hp2xx hp2xx
  	* hterm xopt
+ 	* htmlencode phttpd
+ 	* httpd apache
+ 	* httpdecode phttpd
  
  	* i18nOlwmV2 xopt
*************** FTP host (*note How to Get GNU Software:
*** 1837,1841 ****
  	* install Fileutils
  	* iostat bsd44
! 	* ispell ispell
  	* ixterm xopt
  	* ixx xopt
--- 2175,2181 ----
  	* install Fileutils
  	* iostat bsd44
! 	* isodiag mkisofs
! 	* isodump mkisofs
! 	* ispell Ispell
  	* ixterm xopt
  	* ixx xopt
*************** FTP host (*note How to Get GNU Software:
*** 1870,1875 ****
  	* less less
  	* lesskey less
  	* libbfd.a Binutils
- 	* libbfd.a GAS
  	* libbfd.a GDB
  	* libbzr.a Fontutils
--- 2210,2215 ----
  	* less less
  	* lesskey less
+ 	* libavcall.a ffcall
  	* libbfd.a Binutils
  	* libbfd.a GDB
  	* libbzr.a Fontutils
*************** FTP host (*note How to Get GNU Software:
*** 1877,1894 ****
  	* libcompat.a bsd44
  	* libcurses.a bsd44
! 	* libcurses.a nvi
  	* libedit.a bsd44
  	* libF77.a f2c
  	* libg++.a libg++
  	* libgdbm.a gdbm
  	* libgf.a Fontutils
  	* libgmp.a gmp
  	* libI77.a f2c
  	* libkvm.a bsd44
  	* libm.a bsd44
  	* libnihcl.a NIHCL
  	* libnihclmi.a NIHCL
  	* libnihclvec.a NIHCL
  	* libnls.a xreq
  	* liboctave.a Octave
  	* liboldX.a xreq
--- 2217,2240 ----
  	* libcompat.a bsd44
  	* libcurses.a bsd44
! 	* libcurses.a ncurses
! 	* libdcurses.a ncurses
  	* libedit.a bsd44
  	* libF77.a f2c
+ 	* libF77.a g77
  	* libg++.a libg++
  	* libgdbm.a gdbm
  	* libgf.a Fontutils
  	* libgmp.a gmp
+ 	* libgnanslib Gnans
  	* libI77.a f2c
+ 	* libI77.a g77
  	* libkvm.a bsd44
  	* libm.a bsd44
+ 	* libncurses.a ncurses
  	* libnihcl.a NIHCL
  	* libnihclmi.a NIHCL
  	* libnihclvec.a NIHCL
  	* libnls.a xreq
+ 	* libobjects.a libobjects
  	* liboctave.a Octave
  	* liboldX.a xreq
*************** FTP host (*note How to Get GNU Software:
*** 1898,1901 ****
--- 2244,2248 ----
  	* libresolv.a bsd44
  	* librpc.a bsd44
+ 	* libsipp.a SIPP
  	* libtcl.a DejaGnu
  	* libtelnet.a bsd44
*************** FTP host (*note How to Get GNU Software:
*** 1904,1907 ****
--- 2251,2255 ----
  	* libtfm.a Fontutils
  	* libutil.a bsd44
+ 	* libvacall.a ffcall
  	* libWc.a xopt
  	* libwidgets.a Fontutils
*************** FTP host (*note How to Get GNU Software:
*** 1930,1937 ****
  	* locate Findutils
  	* lock bsd44
  	* logger bsd44
  	* login bsd44
  	* logname Shellutils
! 	* look ispell
  	* lookbib Groff
  	* lorder bsd44
--- 2278,2286 ----
  	* locate Findutils
  	* lock bsd44
+ 	* logcvt-ip2n phttpd
  	* logger bsd44
  	* login bsd44
  	* logname Shellutils
! 	* logo ucblogo
  	* lookbib Groff
  	* lorder bsd44
*************** FTP host (*note How to Get GNU Software:
*** 1941,1945 ****
  	* m4 m4
  	* mail bsd44
! 	* make Make
  	* make-docfile Emacs
  	* make-path Emacs
--- 2290,2296 ----
  	* m4 m4
  	* mail bsd44
! 	* mail-files Sharutils
! 	* mailshar Sharutils
! 	* make make
  	* make-docfile Emacs
  	* make-path Emacs
*************** FTP host (*note How to Get GNU Software:
*** 1953,1958 ****
--- 2304,2311 ----
  	* maze xreq
  	* mazewar xopt
+ 	* mc mc
  	* mcd mtools
  	* mcopy mtools
+ 	* mcserv mc
  	* mdel mtools
  	* mdir mtools
*************** FTP host (*note How to Get GNU Software:
*** 1966,1972 ****
--- 2319,2327 ----
  	* mh bsd44
  	* mille bsd44
+ 	* mkcache GN
  	* mkdep bsd44
  	* mkdir Fileutils
  	* mkfifo Fileutils
+ 	* mkisofs mkisofs
  	* mklocale bsd44
  	* mkmanifest mtools
*************** FTP host (*note How to Get GNU Software:
*** 1989,1993 ****
--- 2344,2353 ----
  	* mren mtools
  	* ms-macros Groff
+ 	* msgcmp gettext
+ 	* msgfmt gettext
+ 	* msgmerge gettext
  	* msgs bsd44
+ 	* msgunfmt gettext
+ 	* mst Smalltalk
  	* mt cpio
  	* mterm xopt
*************** FTP host (*note How to Get GNU Software:
*** 2000,2004 ****
  	* mwrite mtools
  
! 	* nethack Nethack
  	* netstat bsd44
  	* newfs bsd44
--- 2360,2364 ----
  	* mwrite mtools
  
! 	* nethack NetHack
  	* netstat bsd44
  	* newfs bsd44
*************** FTP host (*note How to Get GNU Software:
*** 2056,2061 ****
--- 2416,2424 ----
  	* pfbtops Groff
  	* phantasia bsd44
+ 	* phttpd phttpd
  	* pic Groff
+ 	* pico pine
  	* pig bsd44
+ 	* pine pine
  	* ping bsd44
  	* pixedit xopt
*************** FTP host (*note How to Get GNU Software:
*** 2081,2084 ****
--- 2444,2448 ----
  	* printf Shellutils
  	* protoize GCC
+ 	* proxygarb Spinner
  	* ps bsd44
  	* ps2ascii Ghostscript
*************** FTP host (*note How to Get GNU Software:
*** 2088,2091 ****
--- 2452,2456 ----
  	* pstat bsd44
  	* psycho xopt
+ 	* ptester phttpd
  	* ptx ptx
  	* pubdic+ xopt
*************** FTP host (*note How to Get GNU Software:
*** 2118,2122 ****
--- 2483,2489 ----
  	* recode recode
  	* recvstats HylaFAX
+ 	* red ed
  	* refer Groff
+ 	* remsync Sharutils
  	* renice bsd44
  	* repquota bsd44
*************** FTP host (*note How to Get GNU Software:
*** 2148,2151 ****
--- 2515,2519 ----
  	* s2p perl
  	* sail bsd44
+ 	* saoimage SAOimage
  	* savecore bsd44
  	* sc bsd44
*************** FTP host (*note How to Get GNU Software:
*** 2163,2166 ****
--- 2531,2535 ----
  	* sendmail bsd44
  	* sgi2fax HylaFAX
+ 	* sgn GN
  	* sh bsd44
  	* shar Sharutils
*************** FTP host (*note How to Get GNU Software:
*** 2197,2200 ****
--- 2566,2570 ----
  	* systat bsd44
  
+ 	* tabs Termutils
  	* tac Textutils
  	* tail Textutils
*************** FTP host (*note How to Get GNU Software:
*** 2236,2240 ****
  	* tn3270 bsd44
  	* touch Fileutils
! 	* tput tput
  	* tr Textutils
  	* traceroute bsd44
--- 2606,2610 ----
  	* tn3270 bsd44
  	* touch Fileutils
! 	* tput Termutils
  	* tr Textutils
  	* traceroute bsd44
*************** FTP host (*note How to Get GNU Software:
*** 2250,2258 ****
--- 2620,2631 ----
  	* tsort bsd44
  	* tty Shellutils
+ 	* ttygnans Gnans
  	* tunefs bsd44
+ 	* tupdate gettext
  	* tvtwm xopt
  	* twm xreq
  
  	* ul bsd44
+ 	* ulpc Spinner
  	* umount bsd44
  	* uname Shellutils
*************** FTP host (*note How to Get GNU Software:
*** 2260,2263 ****
--- 2633,2637 ----
  	* unexpand Textutils
  	* unifdef bsd44
+ 	* unify wdiff
  	* uniq Textutils
  	* unprotoize GCC
*************** FTP host (*note How to Get GNU Software:
*** 2304,2307 ****
--- 2678,2682 ----
  
  	* w bsd44
+ 	* waisgn GN
  	* wakeup Emacs
  	* wall bsd44
*************** FTP host (*note How to Get GNU Software:
*** 2385,2388 ****
--- 2760,2764 ----
  	* xgc xopt
  	* xgc xreq
+ 	* xgettext gettext
  	* xhearts xopt
  	* xhelp xopt
*************** Tapes
*** 2476,2578 ****
  We offer Unix source code on tapes in `tar' format on these media:
  
!    * 4mm DAT cartridges
  
!    * 8mm Exabyte cartridges
  
!    * Sun DC300XLP QIC-24 1/4in cartridges (readable on some other systems)
  
!    * Hewlett-Packard 16-track DC600HC 1/4in cartridges
  
!    * IBM RS/6000 QIC-150 1/4in cartridges (readable on some other systems)
  
!    * 1600bpi 9-track 1/2in reel tape
  
! The contents of the reel and various cartridge tapes for Unix systems are the
! same (except for the RS/6000 Emacs tape, which also has executables for
! Emacs); only the media are different.  For pricing information, see the *note
! Free Software Foundation Order Form::..	 Source code for the manuals and
! reference cards is included (*note Documentation::.).
  
! Some of the files on the tapes may be compressed with `gzip' to make them
! fit.  Refer to the top-level `README' file at the beginning of each tape for
! instructions on uncompressing them.  `uncompress' and `unpack' *do not work*!
  
  
  
! Languages Tape - (VERSION NUMBERS NOT COMPLETELY UP TO DATE)
  --------------
  
! This tape contains programming tools: compilers, interpreters, and related
! programs (parsers, conversion programs, debuggers, etc.).
  
! 	* Binutils 2.5.2
! 	* Bison 1.22
  	* C Library 1.09
  	* DejaGnu 1.2
  	* dld 3.2.3
  	* ecc 1.2.1
! 	* f2c 1994.11.03
! 	* flex 2.4.7
! 	* Gawk 2.15.5
! 	* GCC/G++/Objective-C 2.7.0
! 	* GDB 4.13
  	* gdbm 1.7.3
  	* gmp 1.3.2
- 	* gperf 2.1a
  	* gzip 1.2.4
  	* indent 1.9.1
! 	* libg++ 2.6.1
! 	* libobjects 0.1.0
! 	* Make 3.72.1
! 	* NIHCL 3.0
! 	* OBST 3.4
! 	* Octave 1.0
  	* p2c 1.20
  	* perl 4.036
! 	* perl 5.000
  	* regex 0.12
  	* rx 0.05
  	* Smalltalk 1.1.1
! 	* Superopt 2.3
! 	* Texinfo 3.1
  	* Tile Forth 2.1
  
  
  
! Lisps and Emacs Tape - (VERSION NUMBERS NOT COMPLETELY UP TO DATE)
! --------------------
  
  This tape has Common Lisp systems and libraries, GNU Emacs, assorted
! extensions that work with GNU Emacs, and a few other important utilities.
  
  	* Calc 2.02c
! 	* CLISP 1994.10.26
! 	* Common Lisp 1.1
! 	* elib 0.06
  	* Emacs 18.59
! 	* Emacs 19.29
! 	* GNU Emacs Lisp Reference Manaul, Ed. 2.3
  	* gzip 1.2.4
! 	* Make 3.72.1
! 	* MULE 2.1
! 	* PCL 1993.03.18
! 	* Texinfo 3.1
  
  
  
! Utilities Tape - (VERSION NUMBERS NOT COMPLETELY UP TO DATE)
  --------------
  
  This tape consists mostly of smaller utilities and miscellaneous applications.
  
! 	* acm 4.6
! 	* Autoconf 1.11
! 	* Autoconf 2.1
! 	* BASH 1.14.2
  	* bc 1.03
! 	* Chess 4.0.73
  	* cpio 2.3
! 	* CVS 1.3
! 	* dc 0.2
  	* Diffutils 2.7
  	* doschk 1.1
--- 2852,2965 ----
  We offer Unix source code on tapes in `tar' format on these media:
  
!    * 4mm DAT cartridge tape.
  
!    * 8mm Exabyte cartridge tape.
  
!    * Sun DC300XLP QIC-24 1/4in cartridge (readable on some other systems).
  
!    * Hewlett-Packard 16-track DC600HC 1/4in cartridge tape.
  
!    * IBM RS/6000 QIC-150 1/4in cartridge (readable on some other systems).
  
!    * 1600bpi 9-track 1/2in reel tape.
  
! The contents of the various tapes for Unix systems are the same; only the
! media are different.  For prices, see the *note Free Software Foundation
! Order Form::..	Source code for the manuals & reference cards is included
! (*note Documentation::.).
  
! Some of the files on the tapes are compressed with `gzip' to allow more files
! on each tape.  Refer to the top-level `README' file at the beginning of each
! tape for instructions on uncompressing them.  `uncompress' and `unpack' *do
! not work*!
  
  
  
! Languages Tape
  --------------
  
! This tape contains programming tools: compilers, interpreters and, related
! programs (parsers, translators, debuggers, linkers, etc.).
  
! 	* Binutils 2.6
! 	* Bison 1.24
  	* C Library 1.09
+ 	* cperf 2.1a
  	* DejaGnu 1.2
  	* dld 3.2.3
  	* ecc 1.2.1
! 	* f2c 1995.02.24
! 	* flex 2.5.2
! 	* g77 0.5.17
! 	* GAWK 2.15.6
! 	* GCC/G++/Objective-C 2.7.2
! 	* GDB 4.15.1
  	* gdbm 1.7.3
+ 	* gettext 0.10
  	* gmp 1.3.2
  	* gzip 1.2.4
  	* indent 1.9.1
! 	* libg++ 2.7.1
! 	* libobjects 0.1.3
! 	* make 3.74
! 	* ncurses 1.9.4
! 	* NIHCL 3.1.4
! 	* OBST 3.4.3
! 	* Octave 1.1.1
  	* p2c 1.20
  	* perl 4.036
! 	* perl 5.001
  	* regex 0.12
  	* rx 0.05
  	* Smalltalk 1.1.1
! 	* Superopt 2.5
! 	* Texinfo 3.6
  	* Tile Forth 2.1
+ 	* ucblogo 3.3
  
  
  
! Lisps/Emacs Tape
! ----------------
  
  This tape has Common Lisp systems and libraries, GNU Emacs, assorted
! extensions that work with Emacs, manuals, & a few other important utilities.
  
  	* Calc 2.02c
! 	* CLISP 1995.12.04
! 	* CLX 5.02
! 	* Common Lisp 2.2
! 	* Elib 0.06
  	* Emacs 18.59
! 	* Emacs 19.28
! 	* Emacs 19.30
! 	* GNU Emacs Lisp Reference Manual Ed. 1.03 for Version 18
! 	* GNU Emacs Lisp Reference Manual Ed. 2.4 for Version 19.29
! 	* gnuserv 2.1alpha
  	* gzip 1.2.4
! 	* Hyperbole 4.01
! 	* make 3.74
! 	* MULE 2.3
! 	* PCL 2.2
! 	* Programming in Emacs Lisp: An Introduction Ed. 1.04
! 	* Texinfo 3.6
! 	* W3 2.2.25
  
  
  
! Utilities Tape
  --------------
  
  This tape consists mostly of smaller utilities and miscellaneous applications.
  
! 	* acm 4.7
! 	* Autoconf 2.7
! 	* BASH 1.14.5
  	* bc 1.03
! 	* cfengine 1.2.14
! 	* cfengine 1.2.22
! 	* Chess 4.0.pl75
  	* cpio 2.3
! 	* CVS 1.6
  	* Diffutils 2.7
  	* doschk 1.1
*************** This tape consists mostly of smaller uti
*** 2581,2630 ****
  	* Fileutils 3.12
  	* Findutils 4.1
! 	* finger 1.37
! 	* HylaFAX 2.2.2.1
  	* Fontutils 0.6
! 	* Ghostscript 2.6.1
  	* Ghostview 1.5
  	* GNATS 3.2
! 	* GnuGo 1.1
  	* gnuplot 3.5
  	* Graphics 0.17
  	* grep 2.0
! 	* Groff 1.09
  	* gzip 1.2.4
  	* hello 1.3
  	* hp2xx 3.1.4
! 	* ispell 3.1.13
! 	* m4 1.3
! 	* Make 3.72.1
! 	* mkisofs 1.01
  	* mm 1.07
  	* mtools 2.0.7
! 	* Nethack 3.1.3
  	* nvi 1.34
  	* Oleo 1.6
  	* patch 2.1
  	* ptx 0.4
  	* rc 1.4
! 	* RCS 5.6.0.1
  	* recode 3.4
! 	* saoimage 1.08
! 	* screen 3.5.2
! 	* screen 3.6.0
! 	* sed 1.18 & 2.05
! 	* Sharutils 4.1
  	* Shellutils 1.12
! 	* Shogi 1.2.02
! 	* tar 1.11.2
! 	* Termcap 1.2
! 	* Texinfo 3.1
! 	* Textutils 1.11
  	* time 1.6
! 	* tput 1.0
! 	* UUCP 1.05
! 	* wdiff 0.04
! 	* xboard 3.1.1
! 	* xshogi 1.2.02
! 	* Ygl 2.9
  
  
--- 2968,3023 ----
  	* Fileutils 3.12
  	* Findutils 4.1
! 	* Finger 1.37
  	* Fontutils 0.6
! 	* Ghostscript 2.6.2
  	* Ghostview 1.5
+ 	* Ghostview for Windows 1.0
+ 	* GIT 4.3.6
  	* GNATS 3.2
! 	* GnuGo 1.2
  	* gnuplot 3.5
  	* Graphics 0.17
  	* grep 2.0
! 	* Groff 1.10
  	* gzip 1.2.4
  	* hello 1.3
  	* hp2xx 3.1.4
! 	* HylaFAX 3.0.0
! 	* Ispell 3.1.20
! 	* less 2.9.0
! 	* m4 1.4
! 	* make 3.74
! 	* MandelSpawn 0.07
! 	* mc 3.0
! 	* mkisofs 1.04
  	* mm 1.07
  	* mtools 2.0.7
! 	* NetHack 3.1.3
  	* nvi 1.34
  	* Oleo 1.6
  	* patch 2.1
+ 	* pine 3.91
  	* ptx 0.4
  	* rc 1.4
! 	* RCS 5.7
! 	* readline 2.0
  	* recode 3.4
! 	* SAOimage 1.16
! 	* screen 3.7.1
! 	* sed 2.05
! 	* Sharutils 4.2
  	* Shellutils 1.12
! 	* Shogi 1.2.3
! 	* tar 1.11.8
! 	* Termcap 1.3
! 	* Termutils 2.0
! 	* Texinfo 3.6
! 	* Textutils 1.13
  	* time 1.6
! 	* UUCP 1.06.1
! 	* wdiff 0.5
! 	* xboard 3.4.pl0
! 	* xshogi 1.2.03
! 	* Ygl 3.0.3
  
  
*************** Scheme Tape
*** 2634,2659 ****
  
  Scheme is a simplified, lexically-scoped dialect of Lisp.  It was designed at
! MIT and other universities to teach students the art of programming, and to
  research new parallel programming constructs and compilation techniques.
  
! This tape now contains MIT Scheme 7.3, which conforms to the "Revised^4
! Report On the Algorithmic Language Scheme" (MIT AI Lab Memo 848b), for which
! TeX source is included.	 It is written partly in C, but is presently hard to
! bootstrap.  Binaries that can be used to bootstrap Scheme are available for:
! 
!    * HP 9000 series 300, 400, 700 & 800 running HP-UX 7.0 or 8.0
! 
!    * NeXT running NeXT OS 1.0 or 2.0
! 
!    * Sun-3 or Sun-4 running SunOS 4.1
! 
!    * DECstation 3100/5100 running Ultrix 4.0
! 
!    * Sony NeWS-3250 running NEWS OS 5.01
! 
!    * Vax running 4.3BSD
! 
! If your system is not on this list and you don't enjoy the bootstrap
! challenge, see the JACAL item in *Note GNU Software::.
  
  
--- 3027,3042 ----
  
  Scheme is a simplified, lexically-scoped dialect of Lisp.  It was designed at
! MIT and other universities to teach students the art of programming and to
  research new parallel programming constructs and compilation techniques.
  
! This tape now has MIT Scheme 7.3, which conforms to the "Revised^4 Report On
! the Algorithmic Language Scheme" (MIT AI Lab Memo 848b), for which TeX source
! is included.  It is written partly in C, but is presently hard to bootstrap.
! Binaries that can be used to bootstrap it exist for: HP 9000 series 300, 400,
! 700, & 800 (running HP-UX 9.0), NeXT (NeXT OS 2 or 3.2), DEC Alpha (OSF/1),
! IBM RS/6000 (AIX), Sun-3 or Sun-4 (SunOS 4.1), DECstation 3100/5100 (Ultrix
! 4.0), Sony NeWS-3250 (NEWS OS 5.01), & Intel i386 (MS-DOS, Windows 3.1 or NT).
! If your system is not on this list & you don't enjoy the bootstrap challenge,
! see "JACAL" in *Note GNU Software::.
  
  
*************** X11 Tapes
*** 2663,2671 ****
  
  The two X11 tapes contain Version 11, Release 6 of the X Window System.	 The
! first tape contains all of the core software, documentation and some
! contributed clients.  We call this the "required" X tape since it is
! necessary for running X or running GNU Emacs under X.  The second, "optional"
! tape contains contributed libraries and other toolkits, the Andrew User
! Interface System, games, and other programs.
  
  The X11 Required tape also contains all fixes and patches released to date.
--- 3046,3053 ----
  
  The two X11 tapes contain Version 11, Release 6 of the X Window System.	 The
! first tape has all of the core software, documentation, & some contributed
! clients.  We call this the "required" X tape since it is necessary for
! running X or Emacs under X.  The second, "optional" tape has contributed
! libraries & toolkits, the Andrew User Interface System, games, etc.
  
  The X11 Required tape also contains all fixes and patches released to date.
*************** We update this tape as new fixes and pat
*** 2673,2678 ****
  both tapes.  *Note Tape & CD-ROM Subscription Service::.
  
! We will distribute X11R5 on tape until X11R6 is stable, and on the *Note
! November 1993 Source Code CD-ROM::, while supplies last.
  
  
--- 3055,3060 ----
  both tapes.  *Note Tape & CD-ROM Subscription Service::.
  
! While supplies last, we will distribute X11R5 on the *Note November 1993
! Source Code CD-ROM::.
  
  
*************** VMS Emacs and VMS Compiler Tapes
*** 2693,2697 ****
  We offer two VMS tapes.	 One has just GNU Emacs 18.59 (none of the other
  software on the *Note Lisps/Emacs Tape::, is included).	 The other has GCC
! 2.3.3, Bison 1.19 (to compile GCC), GAS 1.38 (to assemble GCC's output) and
  some library and include files (none of the other software on the *Note
  Languages Tape::, is included).	 We are not aware of a GDB port for VMS.
--- 3075,3079 ----
  We offer two VMS tapes.	 One has just GNU Emacs 18.59 (none of the other
  software on the *Note Lisps/Emacs Tape::, is included).	 The other has GCC
! 2.3.3, Bison 1.19 (to compile GCC), `gas' 1.38 (to assemble GCC's output), and
  some library and include files (none of the other software on the *Note
  Languages Tape::, is included).	 We are not aware of a GDB port for VMS.
*************** CD-ROMs
*** 2708,2728 ****
  We offer these CD-ROMs:
  
!    * *Note MS-DOS CD-ROM::, expected in September 1995.
  
!    * *Note Debian GNU/Linux CD-ROM::, expected in late fall 1995.
  
!    * *Note Compiler Tools Binaries CD-ROM::.
  
!    * *Note June 1995 Source Code CD-ROM::.
  
!    * *Note May 1994 Source Code CD-ROM::.
  
!    * *Note November 1993 Source Code CD-ROM::.
  
  Our CD-ROMs are in ISO 9660 format & can be mounted as a read-only file
! system on most computers.  If your driver supports it you can mount each
! CD-ROM with "Rock Ridge" extensions (the MS-DOS CD-ROM is only in ISO 9660
! format) & it will look just like an ordinary Unix file system, rather than
! one full of truncated & otherwise mangled names that fit vanilla ISO 9660.
  
  You can build most of the software without copying the sources off the CD.
--- 3090,3110 ----
  We offer these CD-ROMs:
  
!    * Several editions of our *Note Source Code CD-ROMs::.
  
!    * *Note December 1995 Compiler Tools Binaries CD-ROM::.
  
!    * *Note December 1994 Compiler Tools Binaries CD-ROM::.
  
!    * *Note December 1993 Compiler Tools Binaries CD-ROM::.
  
!    * *Note MS-DOS Book with CD-ROM::.
  
!    * *Note Debian GNU/Linux Book with CD-ROM::.
  
  Our CD-ROMs are in ISO 9660 format & can be mounted as a read-only file
! system on most computers.  If your driver supports it you can mount each CD
! with "Rock Ridge" extensions (the MS-DOS CD-ROM is only in ISO 9660 format),
! & it will look just like an ordinary Unix file system, rather than one full
! of truncated & otherwise mangled names that fit vanilla ISO 9660.
  
  You can build most of the software without copying the sources off the CD.
*************** Pricing of the GNU CD-ROMs
*** 2735,2758 ****
  --------------------------
  
! If a business or organization is ultimately paying, the June 1995 Source CD
! costs $240.  It costs $60 if you, an individual, are paying out of your own
! pocket.	 The December 1994 Compiler Tools Binaries CD-ROM costs $220 for a
! business or organization, and $55 for an individual.
  
  
  
  What do the individual and company prices mean?
  
! The software on our disk is free; anyone can copy it and anyone can run it.
  What we charge for is the physical disk and the service of distribution.
  
  We charge two different prices depending on who is buying.  When a company or
! other organization buys the June 1995 Source CD-ROM, we charge $240.  When an
! individual buys the same disk, we charge just $60.
! 
! This distinction is not a matter of who is allowed to use the software.	 In
! either case, once you have a copy, you can distribute as many copies as you
! wish, and there's no restriction on who can have or run them.  The price
! distinction is entirely a matter of what kind of entity pays for the CD.
  
  You, the reader, are certainly an individual, not a company.  If you are
--- 3117,3140 ----
  --------------------------
  
! If a business or organization is ultimately paying, the December 1995 Source
! CDs costs $240.	 It costs $60 if you, an individual, are paying out of your
! own pocket.  The December 1995 Compiler Tools Binaries CD-ROM costs $220 for
! a business or organization, and $55 for an individual.
  
  
  
  What do the individual and company prices mean?
+ ...............................................
  
! The software on our disks is free; anyone can copy it and anyone can run it.
  What we charge for is the physical disk and the service of distribution.
  
  We charge two different prices depending on who is buying.  When a company or
! other organization buys the December 1995 Source CD-ROMs, we charge $240.
! When an individual buys the same CD-ROM, we charge just $60.  This
! distinction is not a matter of who is allowed to use the software.  In either
! case, once you have a copy, you can distribute as many copies as you wish and
! there's no restriction on who can have or run them.  The price distinction is
! entirely a matter of what kind of entity pays for the CD.
  
  You, the reader, are certainly an individual, not a company.  If you are
*************** for the company; so please pay the compa
*** 2762,2776 ****
  We won't try to check up on you--we use the honor system--so please cooperate.
  
! Buying CDs at the company price is very helpful for GNU; just 140 Source CDs
! at that price supports an FSF programmer or tech writer for a year.
  
  
  
  Why is there an individual price?
  
  In the past, our distribution tapes have been ordered mainly by companies.
  The CD at the price of $240 provides them with all of our software for a much
  lower price than they would previously have paid for six different tapes.  To
! lower the price more would cut into the FSF's funds very badly, and decrease
  the software development we can do.
  
--- 3144,3160 ----
  We won't try to check up on you--we use the honor system--so please cooperate.
  
! Buying CDs at the company price is very helpful for GNU; just
! 140 Source CDs at that price support an FSF programmer or tech writer for a
! year.
  
  
  
  Why is there an individual price?
+ .................................
  
  In the past, our distribution tapes have been ordered mainly by companies.
  The CD at the price of $240 provides them with all of our software for a much
  lower price than they would previously have paid for six different tapes.  To
! lower the price more would cut into the FSF's funds very badly and decrease
  the software development we can do.
  
*************** price of $60.
*** 2782,2785 ****
--- 3166,3170 ----
  
  Is there a maximum price?
+ .........................
  
  Our stated prices are minimum prices.  Feel free to pay a higher price if you
*************** the U.S.) to the Free Software Foundatio
*** 2790,2823 ****
  
  
! MS-DOS CD-ROM
! -------------
! 
! We expect to release our first CD-ROM for MS-DOS in September, 1995.  Contact
! either address on page 1 for more information at that time.   The MS-DOS CD
! will be packaged inside a book describing its contents.	 It will have all the
! sources and executables on the MS-DOS Diskettes.  For details and version
! numbers, *note MS-DOS Diskettes::..
  
  
  
! Debian GNU/Linux CD-ROM
! -----------------------
  
! The FSF expects to ship a CD-ROM with Debian GNU/Linux on it in the late fall
! 1995.  This CD will be packaged inside a book describing its contents.
! m{No Value For "ergegrafkludge"} Debian GNU/Linux is a complete operating
! system for x86 machines, available in both source code and binary form.	 It
! is a GNU/Linux system--that is to say, a variant GNU system which uses Linux
! as the kernel.	(All the systems now available which use the Linux kernel are
! GNU/Linux systems.)
  
! Debian is being developed by Ian Murdock and the Debian Association in
! conjunction with the Free Software Foundation.	We are distributing it as an
! interim measure until the GNU kernel (the Hurd) is ready for users.
  
! Debian GNU/Linux is available for FTP at `ftp.cps.cmich.edu' in file
! `/pub/debian'.	For more information about the Debian Project and how to get
! involved, see `/pub/gnu/GNUinfo/DEBIAN' on a GNU FTP host (*note How to Get
! GNU Software::. for a list).
  
  
--- 3175,3213 ----
  
  
! December 1995 Compiler Tools Binaries CD-ROM
! --------------------------------------------
  
+ We now have the third edition of our CD-ROM that has binaries and complete
+ sources for GNU compiler tools for some systems which lack a compiler.	This
+ enables the people who use these systems to compile GNU and other free
+ software without having to buy a proprietary compiler.	You can also use
+ these GNU tools to compile your own C/C++/Objective-C programs.	 Older
+ editions of this CD are available while supplies last at a reduced price; see
+ the *note Free Software Foundation Order Form::..
  
+ We hope to have more systems on each update of this CD.	 If you can help
+ build binaries for new systems (especially those that don't come with a C
+ compiler), or have one to suggest, please contact us at the addresses on page
+ 1.
  
! These packages:
  
! 	* DJGPP 1.12m4 from GCC 2.6.3
! 	* GCC/G++/Objective-C 2.7.1
! 	* GNU C Library 1.09
! 	* GDB 4.15.1
! 	* Binutils 2.6
! 	* Bison 1.24
! 	* Emacs 19.29 (MS-DOS only)
! 	* Flex 2.5.2
! 	* Make 3.74
! 	* libg++ 2.7.1
  
! On these platforms:
  
! 	* `i386-msdos'
! 	* `hppa1.0-hp-hpux9'
! 	* `sparc-sun-solaris2'
! 	* `sparc-sun-sunos4.1'
  
  
*************** December 1994 Compiler Tools Binaries CD
*** 2826,2859 ****
  --------------------------------------------
  
! We are now offering a CD-ROM that contains executables for GNU compiler tools
! for some systems which lack a compiler.	 This enables the people who use
! these systems to compile GNU and other free software without having to buy a
! proprietary compiler.  You can also use the GNU compilation system to compile
! your own C/C++/Objective-C programs.
  
  We hope to have more systems on each update of this CD.	 If you can help
  build binaries for new systems (especially those that don't come with a C
! compiler), or have one to suggest, please contact us at the addresses on page
! 1.
  
  These packages:
  
! 	*DJGPP 1.12.m2 from GCC 2.6.0
! 	*GCC/G++/Objective-C 2.6.2
! 	*GNU C Library 1.09
! 	*GDB 4.13
! 	*Binutils 2.5.2
! 	*Bison 1.22
! 	*Emacs 19.26 (MS-DOS only)
! 	*Flex 2.4.7
! 	*Make 3.72.1
! 	*libg++ 2.6.1
  
  On these platforms:
  
! 	*`i386-msdos'
! 	*`hppa1.1-hp-hpux9'
! 	*`sparc-sun-solaris2'
! 	*`sparc-sun-sunos4.1'
  
  
--- 3216,3300 ----
  --------------------------------------------
  
! We still have the 2nd edition of our CD-ROM that contains executables for GNU
! compiler tools for some systems which lack a compiler.	This enables the
! people who use these systems to compile GNU and other free software without
! having to buy a proprietary compiler.  You can also use the GNU compilation
! system to compile your own C/C++/Objective-C programs.
  
  We hope to have more systems on each update of this CD.	 If you can help
  build binaries for new systems (especially those that don't come with a C
! compiler), or have one to suggest, please contact us at the addresses on
! page 1.
  
  These packages:
  
! 	* DJGPP 1.12.m2 from GCC 2.6.0
! 	* GCC/G++/Objective-C 2.6.2
! 	* GNU C Library 1.09
! 	* GDB 4.13
! 	* Binutils 2.5.2
! 	* Bison 1.22
! 	* Emacs 19.26 (MS-DOS only)
! 	* Flex 2.4.7
! 	* Make 3.72.1
! 	* libg++ 2.6.1
  
  On these platforms:
  
! 	* `i386-msdos'
! 	* `hppa1.1-hp-hpux9'
! 	* `sparc-sun-solaris2'
! 	* `sparc-sun-sunos4.1'
! 
! 
! 
! December 1993 Compiler Tools Binaries CD-ROM
! ---------------------------------------------
! 
! We still have the 1st edition of our CD-ROM that contains executables for GNU
! compiler tools for some systems which lack a compiler.	This will allow users
! of those systems to compile GNU and other free software without having to buy
! a proprietary compiler.
! 
! The CD-ROM is in ISO 9660 format and can be mounted as a read-only file
! system on most operating systems.  If your driver supports it you can mount
! the CD-ROM with "Rock Ridge" extensions and it will look just like an
! ordinary Unix file system, rather than one full of truncated and otherwise
! mangled names that fit the vanilla ISO 9660 specifications.
! 
! We hope to have more systems included with each update of this CD-ROM.	If
! you can help build binaries for new systems (especially for systems that
! don't come with a C compiler), or have a system to suggest, please contact us
! at either address on the front cover.
! 
! These programs:
! 
!    * DJGPP 1.11.m1
! 
!    * GCC/G++/Objective C 2.5.7
! 
!    * GDB 4.11
! 
!    * GAS 2.2
! 
!    * Binutils 2.3
! 
!    * Bison 1.22
! 
!    * Flex 2.4.5
! 
!    * Make 3.70
! 
!    * libg++ 2.5.3
! 
! For these platforms:
! 
!    * `i386-msdos'
! 
!    * `hppa1.1-hp-hpux9'
! 
!    * `sparc-sun-solaris2'
! 
!    * `sparc-sun-sunos4.1'
  
  
*************** Source Code CD-ROMs
*** 2862,2883 ****
  -------------------
  
! We have several versions of our Source Code CD-ROMs available:
  
     * *Note June 1995 Source Code CD-ROM::.
  
!    * *Note May 1994 Source Code CD-ROM::.
  
     * *Note November 1993 Source Code CD-ROM::.
  
! The older Source Code CDs will be available while supplies last at a reduced
! price; see the *note Free Software Foundation Order Form::..
  
! All of the Source Code CDs also contain Texinfo source for the GNU manuals
! listed in *Note Documentation::.
  
  The VMS tapes' contents are *not* included.  Many programs that are only on
! MS-DOS diskettes and not on the tapes are also *not* included.	The contents
! of the MIT Scheme & X11 Optional tapes are *not* on the November 1993 & May
! 1994 Source CDs.  *Note Tapes:: & *Note MS-DOS Diskettes::.
  
  There are no precompiled programs on these Source CDs.	You will need a C
--- 3303,3332 ----
  -------------------
  
! We have several versions of our Source Code CD-ROMs available, including:
! 
!    * *Note December 1995 Source Code CD-ROMs::, the newest release, has
!      programs, bug fixes, & improvements not on the other CDs.
  
     * *Note June 1995 Source Code CD-ROM::.
  
!    * *Note May 1994 Source Code CD-ROM::..
  
     * *Note November 1993 Source Code CD-ROM::.
  
!    * May 1993 Source Code CD-ROM, see the *note Free Software Foundation
!      Order Form::..
! 
!    * October 1992 Source Code CD-ROM, see the *note Free Software Foundation
!      Order Form::..
  
! The older Source CDs are available while supplies last at a reduced price
! (please note that the December 1994 Source CD is permanently out of stock).
! All the Source CDs have Texinfo source for the GNU manuals listed in *Note
! Documentation::.
  
  The VMS tapes' contents are *not* included.  Many programs that are only on
! MS-DOS diskettes & not on the tapes are also *not* included.  The MIT Scheme
! & X11 Optional tapes' contents are *not* on the older Source CDs.  *Note
! Tapes:: & *Note MS-DOS Diskettes::.
  
  There are no precompiled programs on these Source CDs.	You will need a C
*************** binaries for some systems on the *Note C
*** 2888,2992 ****
  
  
! June 1995 Source Code CD-ROM - (VERSION NUMBERS NOT COMPLETELY UP TO DATE)
  ............................
  
! We now have the sixth edition of our Source CD.	 This CD has Edition X.X for
! version 19 of the `GNU Emacs Lisp Reference Manual' & some additional
! software; not all FSF distributed software is included (*note Source Code
! CD-ROMs::.).  It contains the following packages:
!      *XXXXX UPDATE THIS LIST XXXXX*
! 	*acm 4.5
! 	*Autoconf 1.10
! 	*BASH 1.13.5
! 	*bc 1.02
! 	*Binutils 2.3
! 	*Bison 1.22
! 	*C Library 1.08
! 	*Calc 2.02c
! 	*Chess 4.0.69
! 	*CLISP 1994.01.08
! 	*Common Lisp 1.0
! 	*cpio 2.3
! 	*CVS 1.3
! 	*dc 0.2
! 	*DejaGnu 1.2
! 	*Diffutils 2.6
! 	*dld 3.2.3
! 	*doschk 1.1
! 	*ecc 1.2.1
! 	*ed 0.1
! 	*elib 0.06
! 	*Emacs 18.59
! 	*Emacs 19.23
! 	*es 0.84
! 	*f2c 1994.04.14
! 	*Fileutils 3.9
! 	*find 3.8
! 	*finger 1.37
! 	*flex 2.4.6
! 	*Fontutils 0.6
! 	*GAS 1.36.utah
! 	*GAS 2.2
! 	*Gawk 2.15.4
! 	*GCC 2.5.8
! 	*GDB 4.12
! 	*gdbm 1.7.1
! 	*Ghostscript 2.6.1
! 	*Ghostview 1.5
! 	*Ghostview for Windows 1.0
! 	*gmp 1.3.2
! 	*GNATS 3.2
! 	*GnuGo 1.1
! 	*gnuplot 3.5
! 	*gperf 2.1a
! 	*Graphics 0.17
! 	*grep 2.0
! 	*Groff 1.09
! 	*gzip 1.2.4
! 	*hello 1.3
! 	*hp2xx 3.1.4
! 	*indent 1.9.1
! 	*ispell 4.0
! 	*libg++ 2.5.3
! 	*m4 1.1
! 	*Make 3.71
! 	*MandelSpawn 0.07
! 	*mtools 2.0.7
! 	*MULE 1.0
! 	*NetFax 3.2.1
! 	*Nethack 3.1.3
! 	*NIHCL 3.0
! 	*nvi 1.11
! 	*Octave 1.0
! 	*Oleo 1.5
! 	*p2c 1.20
! 	*patch 2.1
! 	*PCL 1993.03.18
! 	*perl 4.036
! 	*ptx 0.3
! 	*rc 1.4
! 	*RCS 5.6.0.1
! 	*recode 3.3
! 	*regex 0.12
! 	*screen 3.5.2
! 	*sed 2.05
! 	*shellutils 1.9.4
! 	*Shogi 1.1.02
! 	*Smalltalk 1.1.1
! 	*Superopt 2.3
! 	*tar 1.11.2
! 	*Termcap 1.2
! 	*TeX 3.1
! 	*Texinfo 3.1
! 	*Textutils 1.9.1
! 	*Tile Forth 2.1
! 	*time 1.6
! 	*tput 1.0
! 	*UUCP 1.05
! 	*uuencode 1.0
! 	*wdiff 0.04
! 	*X11R6
! 	*xboard 3.0.9
! 	*xshogi 1.2.02
  
  
--- 3337,3594 ----
  
  
! December 1995 Source Code CD-ROMs
! .................................
! 
! The 7th edition of our Source CD is out!  Due to increasing amounts of GNU
! Software, the Source Code CD is now a two disc set--the price remains
! unchanged!  It contains these packages, & some manuals that are not part of
! packages:
! 
! 	* acm 4.7
! 	* apache 0.8.8
! 	* Autoconf 2.7
! 	* BASH 1.14.5
! 	* bc 1.03
! 	* Binutils 2.5.2
! 	* Binutils 2.6
! 	* Bison 1.24
! 	* C Library 1.09
! 	* Calc 2.02c
! 	* cfengine 1.2.21
! 	* Chess 4.0.pl75
! 	* CLISP 1995.08.12
! 	* Common Lisp 2.2
! 	* cperf 2.1a
! 	* cpio 2.3
! 	* CVS 1.6
! 	* DDD 1.3b
! 	* DejaGnu 1.2.9
! 	* Diffutils 2.7
! 	* dld 3.2.3
! 	* doschk 1.1
! 	* ecc 1.2.1
! 	* ed 0.2
! 	* Elib 0.07
! 	* Elisp archive
! 	* Emacs 18.59
! 	* Emacs 19.28
! 	* Emacs 19.29
! 	* Emacs 19.30
! 	* es 0.84
! 	* f2c 1995.11.18
! 	* ffcall 1.0
! 	* Fileutils 3.12
! 	* Findutils 4.1
! 	* Finger 1.37
! 	* flex 2.5.2
! 	* Fontutils 0.6
! 	* g77 0.5.17
! 	* GAWK 2.15.6
! 	* GCC/G++/Objective C 2.7.1
! 	* GDB 4.15.1
! 	* gdbm 1.7.3
! 	* gettext 0.9a
! 	* Ghostscript 2.6.2
! 	* Ghostview 1.5
! 	* Ghostview for Windows 1.0
! 	* GIT 4.3.7
! 	* gmp 1.3.2
! 	* GN 2.23
! 	* Gnans 1.5
! 	* GNATS 3.2
! 	* GNU Emacs Lisp Reference Manual, Ed. 1.03 for Version 18.59
! 	* GNU Emacs Lisp Reference Manual, Ed. 2.4 for Version 19.29
! 	* GnuGo 1.2
! 	* gnuplot 3.5
! 	* gnuserv 2.1alpha
! 	* Graphics 0.17
! 	* grep 2.0
! 	* Groff 1.09
! 	* gzip 1.2.4
! 	* hello 1.3
! 	* hp2xx 3.1.4
! 	* HylaFAX v3.0pl0
! 	* Hyperbole 4.01
! 	* indent 1.9.1
! 	* Ispell 3.1.20
! 	* less 290
! 	* libg++ 2.7.1
! 	* libobjects 0.1.3
! 	* m4 1.4
! 	* make 3.74
! 	* mc 3.0
! 	* MIT Scheme 7.3
! 	* mkisofs 1.04GNU
! 	* mtools 2.0.7
! 	* MULE 2.3
! 	* ncurses 1.9.7a
! 	* NetHack 3.1.3
! 	* NIHCL 3.1.4
! 	* nvi 1.34
! 	* Oaklisp 93.07.23
! 	* OBST 3.4.3
! 	* Octave 1.1.1
! 	* Oleo 1.6
! 	* p2c 1.20
! 	* patch 2.1
! 	* perl 4.036
! 	* perl 5.001
! 	* phttpd 0.99.68
! 	* pine 3.91
! 	* Programming in Emacs Lisp: An Introduction, Ed. 1.04
! 	* ptx 0.4
! 	* rc 1.4
! 	* RCS 5.7
! 	* recode 3.4
! 	* regex 0.12
! 	* rx 0.05
! 	* SAOimage 1.08
! 	* screen 3.7.1
! 	* sed 2.05
! 	* Sharutils 4.1
! 	* Shellutils 1.12
! 	* Shogi 1.2p03
! 	* SIPP 3.1
! 	* Smalltalk 1.1.1
! 	* SNePS 2.3.1
! 	* Spinner 1.0b11
! 	* Superopt 2.5
! 	* tar 1.11.8
! 	* Termcap 1.3
! 	* TeX 3.145
! 	* Texinfo 3.6
! 	* Textutils 1.13
! 	* Tile Forth 2.1
! 	* time 1.6
! 	* tput 1.0
! 	* ucblogo 3.3
! 	* UUCP 1.06.1
! 	* W3 2.2.25
! 	* wdiff 0.5
! 	* X11R6
! 	* xboard 3.3.pl3
! 	* xgrabsc 2.41
! 	* xshogi 1.2p03
! 	* Ygl 3.0.2
! 
! 
! 
! June 1995 Source Code CD-ROM
  ............................
  
! We still have the 6th edition of our Source CD at a reduced price while
! supplies last.	Not all FSF distributed software is included (*note Source
! Code CD-ROMs::.).  It contains these packages, and some manuals that are not
! part of packages:
! 
! 	* acm 4.7
! 	* Autoconf 2.4
! 	* BASH 1.14.5
! 	* bc 1.03
! 	* Binutils 2.5.2
! 	* Bison 1.24
! 	* C Library 1.09
! 	* Calc 2.02c
! 	* cfengine 1.0.4
! 	* Chess 4.0.pl74
! 	* CLISP 1995.04.25
! 	* Common Lisp 2.1
! 	* cperf 2.1a
! 	* cpio 2.3
! 	* CVS 1.3
! 	* DejaGnu 1.2
! 	* Diffutils 2.7
! 	* dld 3.2.3
! 	* doschk 1.1
! 	* ecc 1.2.1
! 	* ed 0.2
! 	* elib 0.06
! 	* Emacs 18.59
! 	* Emacs 19.28
! 	* Emacs 19.29
! 	* GNU Emacs Lisp Reference Manual Ed. 1.03 for Version 18
! 	* GNU Emacs Lisp Reference Manual Ed. 2.4 for Version 19.29
! 	* es 0.84
! 	* f2c 1995.02.24
! 	* Fileutils 3.12
! 	* Findutils 4.1
! 	* Finger 1.37
! 	* flex 2.5.2
! 	* Fontutils 0.6
! 	* g77 0.5.15
! 	* GAWK 2.15.6
! 	* GCC/G++/Objective C 2.6.3
! 	* GCC/G++/Objective C 2.7.0
! 	* GDB 4.14
! 	* gdbm 1.7.3
! 	* Ghostscript 2.6.2
! 	* Ghostview 1.5
! 	* Ghostview for Windows 1.0
! 	* GIT 4.3.6
! 	* gmp 1.3.2
! 	* GNATS 3.2
! 	* GnuGo 1.1
! 	* gnuplot 3.5
! 	* Graphics 0.17
! 	* grep 2.0
! 	* Groff 1.09
! 	* gzip 1.2.4
! 	* hello 1.3
! 	* hp2xx 3.1.4
! 	* HylaFAX 3.0.pl0
! 	* indent 1.9.1
! 	* Ispell 3.1.18
! 	* less 2.90
! 	* libg++ 2.6.2
! 	* libg++ 2.7.0
! 	* libobjects 0.1.3
! 	* m4 1.4
! 	* make 3.74
! 	* MandelSpawn 0.07
! 	* mkisofs 1.03GNU
! 	* mtools 2.0.7
! 	* MULE 2.2
! 	* ncurses 1.9.1
! 	* NetHack 3.1.3
! 	* NIHCL 3.1.4
! 	* nvi 1.34
! 	* OBST 3.4.3
! 	* Octave 1.1.1
! 	* Oleo 1.6
! 	* p2c 1.20
! 	* patch 2.1
! 	* PCL 2.1
! 	* perl 4.036
! 	* perl 5.001
! 	* pine 3.91
! 	* Programming in Emacs Lisp: An Introduction Ed. 1.03 for Version 19
! 	* ptx 0.4
! 	* rc 1.4
! 	* RCS 5.7
! 	* recode 3.4
! 	* regex 0.12
! 	* rx 0.05
! 	* screen 3.6.2
! 	* sed 2.05
! 	* Sharutils 4.1
! 	* Shellutils 1.12
! 	* Shogi 1.2p03
! 	* Smalltalk 1.1.1
! 	* Superopt 2.5
! 	* tar 1.11.8
! 	* Termcap 1.2
! 	* TeX 3.1415
! 	* Texinfo 3.6
! 	* Textutils 1.12
! 	* Tile Forth 2.1
! 	* time 1.6
! 	* tput 1.0
! 	* ucblogo
! 	* UUCP 1.05
! 	* wdiff 0.5
! 	* X11R6
! 	* xboard 3.2.pl2
! 	* xshogi 1.2p03
! 	* Ygl 2.9.5
  
  
*************** May 1994 Source Code CD-ROM
*** 2995,3095 ****
  ...........................
  
! We still have the fourth edition of our Source CD, at a reduced price.	This
  CD has Edition 2.3 for version 19 of the `GNU Emacs Lisp Reference Manual' &
! some additional software; not all FSF distributed software is included (*note
! Source Code CD-ROMs::.).  It contains these packages:
! 	*acm 4.5
! 	*Autoconf 1.10
! 	*BASH 1.13.5
! 	*bc 1.02
! 	*Binutils 2.3
! 	*Bison 1.22
! 	*C Library 1.08
! 	*Calc 2.02c
! 	*Chess 4.0.69
! 	*CLISP 1994.01.08
! 	*Common Lisp 1.0
! 	*cpio 2.3
! 	*CVS 1.3
! 	*dc 0.2
! 	*DejaGnu 1.2
! 	*Diffutils 2.6
! 	*dld 3.2.3
! 	*doschk 1.1
! 	*ecc 1.2.1
! 	*ed 0.1
! 	*elib 0.06
! 	*Emacs 18.59
! 	*Emacs 19.23
! 	*es 0.84
! 	*f2c 1994.04.14
! 	*Fileutils 3.9
! 	*find 3.8
! 	*finger 1.37
! 	*flex 2.4.6
! 	*Fontutils 0.6
! 	*GAS 1.36.utah
! 	*GAS 2.2
! 	*Gawk 2.15.4
! 	*GCC 2.5.8
! 	*GDB 4.12
! 	*gdbm 1.7.1
! 	*Ghostscript 2.6.1
! 	*Ghostview 1.5
! 	*Ghostview for Windows 1.0
! 	*gmp 1.3.2
! 	*GNATS 3.2
! 	*GnuGo 1.1
! 	*gnuplot 3.5
! 	*gperf 2.1a
! 	*Graphics 0.17
! 	*grep 2.0
! 	*Groff 1.09
! 	*gzip 1.2.4
! 	*hello 1.3
! 	*hp2xx 3.1.4
! 	*indent 1.9.1
! 	*ispell 4.0
! 	*libg++ 2.5.3
! 	*m4 1.1
! 	*Make 3.71
! 	*MandelSpawn 0.07
! 	*mtools 2.0.7
! 	*MULE 1.0
! 	*NetFax 3.2.1
! 	*Nethack 3.1.3
! 	*NIHCL 3.0
! 	*nvi 1.11
! 	*Octave 1.0
! 	*Oleo 1.5
! 	*p2c 1.20
! 	*patch 2.1
! 	*PCL 1993.03.18
! 	*perl 4.036
! 	*ptx 0.3
! 	*rc 1.4
! 	*RCS 5.6.0.1
! 	*recode 3.3
! 	*regex 0.12
! 	*screen 3.5.2
! 	*sed 2.05
! 	*shellutils 1.9.4
! 	*Shogi 1.1.02
! 	*Smalltalk 1.1.1
! 	*Superopt 2.3
! 	*tar 1.11.2
! 	*Termcap 1.2
! 	*TeX 3.1
! 	*Texinfo 3.1
! 	*Textutils 1.9.1
! 	*Tile Forth 2.1
! 	*time 1.6
! 	*tput 1.0
! 	*UUCP 1.05
! 	*uuencode 1.0
! 	*wdiff 0.04
! 	*X11R6
! 	*xboard 3.0.9
! 	*xshogi 1.2.02
  
  
--- 3597,3697 ----
  ...........................
  
! We still have the 4th edition of our Source CD, at a reduced price.	This
  CD has Edition 2.3 for version 19 of the `GNU Emacs Lisp Reference Manual' &
! some additional software; not all FSF distributed software is included (see
! ``Source Code CD-ROMs'').  It contains the following packages:
! 	* acm 4.5
! 	* Autoconf 1.10
! 	* BASH 1.13.5
! 	* bc 1.02
! 	* Binutils 2.3
! 	* Bison 1.22
! 	* C Library 1.08
! 	* Calc 2.02c
! 	* Chess 4.0.69
! 	* CLISP 1994.01.08
! 	* Common Lisp 1.0
! 	* cpio 2.3
! 	* CVS 1.3
! 	* dc 0.2
! 	* DejaGnu 1.2
! 	* Diffutils 2.6
! 	* dld 3.2.3
! 	* doschk 1.1
! 	* ecc 1.2.1
! 	* ed 0.1
! 	* elib 0.06
! 	* Emacs 18.59
! 	* Emacs 19.23
! 	* es 0.84
! 	* f2c 1994.04.14
! 	* Fileutils 3.9
! 	* find 3.8
! 	* finger 1.37
! 	* flex 2.4.6
! 	* Fontutils 0.6
! 	* GAS 1.36.utah
! 	* GAS 2.2
! 	* Gawk 2.15.4
! 	* GCC 2.5.8
! 	* GDB 4.12
! 	* gdbm 1.7.1
! 	* Ghostscript 2.6.1
! 	* Ghostview 1.5
! 	* Ghostview for Windows 1.0
! 	* gmp 1.3.2
! 	* GNATS 3.2
! 	* GnuGo 1.1
! 	* gnuplot 3.5
! 	* gperf 2.1a
! 	* Graphics 0.17
! 	* grep 2.0
! 	* Groff 1.09
! 	* gzip 1.2.4
! 	* hello 1.3
! 	* hp2xx 3.1.4
! 	* indent 1.9.1
! 	* ispell 4.0
! 	* libg++ 2.5.3
! 	* m4 1.1
! 	* Make 3.71
! 	* MandelSpawn 0.07
! 	* mtools 2.0.7
! 	* MULE 1.0
! 	* NetFax 3.2.1
! 	* Nethack 3.1.3
! 	* NIHCL 3.0
! 	* nvi 1.11
! 	* Octave 1.0
! 	* Oleo 1.5
! 	* p2c 1.20
! 	* patch 2.1
! 	* PCL 1993.03.18
! 	* perl 4.036
! 	* ptx 0.3
! 	* rc 1.4
! 	* RCS 5.6.0.1
! 	* recode 3.3
! 	* regex 0.12
! 	* screen 3.5.2
! 	* sed 2.05
! 	* shellutils 1.9.4
! 	* Shogi 1.1.02
! 	* Smalltalk 1.1.1
! 	* Superopt 2.3
! 	* tar 1.11.2
! 	* Termcap 1.2
! 	* TeX 3.1
! 	* Texinfo 3.1
! 	* Textutils 1.9.1
! 	* Tile Forth 2.1
! 	* time 1.6
! 	* tput 1.0
! 	* UUCP 1.05
! 	* uuencode 1.0
! 	* wdiff 0.04
! 	* X11R6
! 	* xboard 3.0.9
! 	* xshogi 1.2.02
  
  
*************** November 1993 Source Code CD-ROM
*** 3098,3197 ****
  ................................
  
! We still have the third edition of our Source CD, at a reduced price.  It
! contains X11R5, as we feel that people should have a choice between X11R5 and
! X11R6 until the latter is stable.  This CD has Edition 2.2 for version 19 of
! the `GNU Emacs Lisp Reference Manual' & some additional software; not all FSF
! distributed software is included (*note Source Code CD-ROMs::.).  It contains
! the following packages:
! 	*acm 3.1
! 	*Autoconf 1.7
! 	*BASH 1.13.4
! 	*bc 1.02
! 	*Binutils 1.9 2.3
! 	*Bison 1.22
! 	*C Library 1.06.7
! 	*Calc 2.02b
! 	*Chess 4.0p62
! 	*CLISP 93.11.08
! 	*cpio 2.3
! 	*CVS 1.3
! 	*dc 0.2
! 	*DejaGnu 1.0.1
! 	*Diffutils 2.6
! 	*dld 3.2.3
! 	*doschk 1.1
! 	*ecc 1.2.1
! 	*elib 0.06
! 	*Emacs 18.59
! 	*Emacs 19.21
! 	*es 0.84
! 	*f2c 1993.04.28
! 	*Fileutils 3.9
! 	*find 3.8
! 	*finger 1.37
! 	*flex 2.3.8
! 	*Fontutils 0.6
! 	*GAS 1.36.utah
! 	*GAS 1.38.1
! 	*GAS 2.2
! 	*Gawk 2.15.3
! 	*GCC 2.5.4
! 	*GDB 4.11
! 	*gdbm 1.7.1
! 	*Ghostscript 2.6.1
! 	*Ghostview 1.5
! 	*Ghostview for Windows 1.0
! 	*gmp 1.3.2
! 	*GNATS 3.01
! 	*GnuGo 1.1
! 	*gnuplot 3.5
! 	*gperf 2.1a
! 	*Graphics 0.17
! 	*grep 2.0
! 	*Groff 1.08
! 	*gzip 1.2.4
! 	*hello 1.3
! 	*hp2xx 3.1.3a
! 	*indent 1.8
! 	*Ispell 4.0
! 	*less 177
! 	*libg++ 2.5.1
! 	*m4 1.1
! 	*Make 3.69.1
! 	*MandelSpawn 0.06
! 	*mtools 2.0.7
! 	*MULE 1.0
! 	*NetFax 3.2.1
! 	*Nethack 3.1.3
! 	*NIHCL 3.0
! 	*Oleo 1.5
! 	*p2c 1.20
! 	*patch 2.1
! 	*PCL 93.03.18
! 	*perl 4.036
! 	*ptx 0.3
! 	*rc 1.4
! 	*RCS 5.6.0.1
! 	*recode 3.2.4
! 	*regex 0.12
! 	*screen 3.5.2
! 	*sed 1.18 2.03
! 	*Shellutils 1.9.1
! 	*Shogi 1.1p02
! 	*Smalltalk 1.1.1
! 	*Superopt 2.3
! 	*tar 1.11.2
! 	*Termcap 1.2
! 	*TeX 3.1
! 	*Texinfo 3.1
! 	*Tile Forth 2.1
! 	*time 1.6
! 	*time 1.6
! 	*tput 1.0
! 	*UUCP 1.04
! 	*uuencode 1.0
! 	*wdiff 0.04
! 	*X11R5
  
  
  
--- 3700,3837 ----
  ................................
  
! We still have the 3rd edition of our Source CD, at a reduced price, while
! supplies last.	It was the last Source Code CD to contain X11R5.  This CD has
! Edition 2.2 for version 19 of the `GNU Emacs Lisp Reference Manual' & some
! additional software; not all FSF distributed software is included (*note
! Source Code CD-ROMs::.).  It contains these packages:
! 
! 	* acm 3.1
! 	* Autoconf 1.7
! 	* BASH 1.13.4
! 	* bc 1.02
! 	* Binutils 1.9 2.3
! 	* Bison 1.22
! 	* C Library 1.06.7
! 	* Calc 2.02b
! 	* Chess 4.0p62
! 	* CLISP 93.11.08
! 	* cpio 2.3
! 	* CVS 1.3
! 	* dc 0.2
! 	* DejaGnu 1.0.1
! 	* Diffutils 2.6
! 	* dld 3.2.3
! 	* doschk 1.1
! 	* ecc 1.2.1
! 	* elib 0.06
! 	* Emacs 18.59
! 	* Emacs 19.21
! 	* es 0.84
! 	* f2c 1993.04.28
! 	* Fileutils 3.9
! 	* find 3.8
! 	* Finger 1.37
! 	* flex 2.3.8
! 	* Fontutils 0.6
! 	* GAS 1.36.utah
! 	* GAS 1.38.1
! 	* GAS 2.2
! 	* GAWK 2.15.3
! 	* GCC/G++/Objective C 2.5.4
! 	* GDB 4.11
! 	* gdbm 1.7.1
! 	* Ghostscript 2.6.1
! 	* Ghostview 1.5
! 	* Ghostview for Windows 1.0
! 	* gmp 1.3.2
! 	* GNATS 3.01
! 	* GnuGo 1.1
! 	* gnuplot 3.5
! 	* cperf 2.1a
! 	* Graphics 0.17
! 	* grep 2.0
! 	* Groff 1.08
! 	* gzip 1.2.4
! 	* hello 1.3
! 	* hp2xx 3.1.3a
! 	* indent 1.8
! 	* Ispell 4.0
! 	* less 177
! 	* libg++ 2.5.1
! 	* m4 1.1
! 	* make 3.69.1
! 	* MandelSpawn 0.06
! 	* mtools 2.0.7
! 	* MULE 1.0
! 	* NetFax 3.2.1
! 	* NetHack 3.1.3
! 	* NIHCL 3.0
! 	* Oleo 1.5
! 	* p2c 1.20
! 	* patch 2.1
! 	* PCL 93.03.18
! 	* perl 4.036
! 	* ptx 0.3
! 	* rc 1.4
! 	* RCS 5.6.0.1
! 	* recode 3.2.4
! 	* regex 0.12
! 	* screen 3.5.2
! 	* sed 1.18 2.03
! 	* Shellutils 1.9.1
! 	* Shogi 1.1p02
! 	* Smalltalk 1.1.1
! 	* Superopt 2.3
! 	* tar 1.11.2
! 	* Termcap 1.2
! 	* TeX 3.1
! 	* Texinfo 3.1
! 	* Tile Forth 2.1
! 	* time 1.6
! 	* time 1.6
! 	* tput 1.0
! 	* UUCP 1.04
! 	* uuencode 1.0
! 	* wdiff 0.04
! 	* X11R5
! 
! 
! 
! MS-DOS Book with CD-ROM
! -----------------------
! 
! We are working on our first book describing GNU Software for MS-DOS, but we
! do not know when it will be finished.  It will include a CD-ROM with all the
! sources & binaries on the MS-DOS Diskettes and more.
! 
! Please do NOT contact us about this book until we announce it on our mailing
! lists (to subscribe, ask `info-gnu-request@prep.ai.mit.edu'), because it just
! slows us down.
! 
! 
! 
! Debian GNU/Linux Book with CD-ROM
! ---------------------------------
! 
! We are working on our first book describing Debian GNU/Linux but we do not
! know when it will be finished.	Please do NOT contact us about this book
! until we announce it on our mailing lists (ask
! `info-gnu-request@prep.ai.mit.edu' to subscribe), because it just slows us
! down.
! 
! A CD will be inside the book with sources & binaries for Debian GNU/Linux,
! which is a complete operating system for i386/i486/Pentium.  It is a
! GNU/Linux system--that is to say, a variant GNU system which uses Linux as
! the kernel.  (All the systems now available that use the Linux kernel are
! GNU/Linux systems, see item "Linux" in *Note Free Software for
! Microcomputers::.)
! 
! Debian is being developed by Ian Murdock and the Debian Association in
! conjunction with the Free Software Foundation.	We are distributing it as an
! interim measure until the GNU kernel (the Hurd) is ready for users.
  
+ For details on Debian & how to help, see URL: `http://www.debian.org/' or
+ FTP, `/pub/gnu/GNUinfo/DEBIAN' from a GNU FTP host (*note How to Get GNU
+ Software::.).  FTP Debian under `/debian' from `ftp.debian.org'.
  
  
*************** MS-DOS Diskettes
*** 3201,3209 ****
  
  The FSF distributes some of the GNU software ported to MS-DOS, on 3.5inch
! 1.44MB diskettes. These disks have both sources and executables.
  
  
  
! DJGPP Diskettes - (VERSION NUMBERS NOT COMPLETELY UP TO DATE)
  ---------------
  
--- 3841,3849 ----
  
  The FSF distributes some of the GNU software ported to MS-DOS, on 3.5inch
! 1.44MB diskettes.  These disks have both sources and executables.
  
  
  
! DJGPP Diskettes
  ---------------
  
*************** We offer DJGPP on 30 diskettes.	 For fur
*** 3211,3266 ****
  Software::.  The DJGPP diskettes contain the following:
  
! 	* bc 1.03
! 	* Binutils 2.4
  	* Bison 1.22
- 	* cpio 2.3
  	* Diffutils 2.6
! 	* doschk 1.1
! 	* Fileutils 3.9
! 	* Findutils 3.8
! 	* GAS 2.4
! 	* Gawk 2.15.5
! 	* GCC 2.6.0
  	* GDB 4.12
- 	* Ghostscript 2.6.1
- 	* Ghostview for Windows 1.0
  	* Groff 1.09
  	* gzip 1.24
! 	* hello 1.3
! 	* indent 1.9
! 	* ispell 4.0
! 	* m4 1.2
! 	* Make 3.71
  	* patch 2.1
  	* sed 1.18
- 	* shellutils 1.9
  	* Texinfo 3.1
- 	* texutils 1.9
- 	* wdiff 0.04
  
  
  
! Emacs Diskettes - (VERSION NUMBERS NOT COMPLETELY UP TO DATE)
  ---------------
  
  Two versions of GNU Emacs are included on the Emacs diskettes we distribute:
  GNU Emacs version 19.29 handles 8-bit character sets; the other, MULE version
! 2.1, handles 16-bit character sets including Kanji.
  
  
  
! Selected Utilities Diskettes - (NOT COMPLETELY UP TO DATE)
  ----------------------------
  
! The GNUish MS-DOS Project ported GNU software to PC compatibles.  Though the
! GNUish Project is no longer active, users still ask for these ports that were
! done several years ago.	 You can anonymous FTP files
! `/pub/gnu/MicrosPorts/MSDOS*' from `prep.ai.mit.edu' to find out how to
! access these ports over the Internet.  We offer these programs on five
! diskettes.  In general, this software will run on 8086 and 80286-based 16-bit
! machines; an 80386 is not required.  Some of these utilities are necessarily
! missing features.   Included are: `cpio', `diff', `find', `flex', `gdbm',
! `grep', `indent', `less', `m4', `make', `ptx', RCS, `sed', `shar', `sort', &
! Texinfo.
  
  
--- 3851,3891 ----
  Software::.  The DJGPP diskettes contain the following:
  
! 	* Binutils 2.5.2
  	* Bison 1.22
  	* Diffutils 2.6
! 	* DJGPP 1.12m4
! 	* flex 2.4.7
! 	* GCC/G++ 2.6.3
  	* GDB 4.12
  	* Groff 1.09
  	* gzip 1.24
! 	* libg++ 2.6.2
! 	* make 3.71
  	* patch 2.1
  	* sed 1.18
  	* Texinfo 3.1
  
  
  
! Emacs Diskettes
  ---------------
  
  Two versions of GNU Emacs are included on the Emacs diskettes we distribute:
  GNU Emacs version 19.29 handles 8-bit character sets; the other, MULE version
! 2.2, handles 16-bit character sets including Kanji.
  
  
  
! Selected Utilities Diskettes
  ----------------------------
  
! The GNUish MS-DOS Project ported GNU software to PC compatibles.  Though
! GNUish is no longer active, users still ask for these ports done some years
! ago.  We offer these ports on five diskettes.  In general, the ports run on
! 8086/80286-based 16-bit machines; an 80386 is not required.  Some are
! necessarily missing features.
! 
! Included are: `cpio', `diff', `find', `flex', `gdbm', `grep', `indent',
! `less', `m4', `make', `ptx', RCS, `sed', `shar', `sort', & Texinfo.
  
  
*************** current with the latest GNU developments
*** 3280,3291 ****
  three tapes or CD-ROMs (plus shipping in some cases), we will ship you four
  new versions of the tape of your choice or the Source Code CD-ROM.  The tapes
! are sent each quarter; the CD-ROMs are sent as they are issued (which is
! between two and four times a year.)
  
! Regularly, we will send you a new version of an Lisps/Emacs, Languages,
! Utilities, or X Window System (X11R6) Required tape or the Source CD-ROM.
  The MIT Scheme and X Window System Optional tapes are not changed often
  enough to warrant quarterly updates.  We do not yet know if we will be
! offering subscriptions to the Compiler Tools Binaries or our new CD-ROMs.
  
  Since Emacs 19 is on the Lisps/Emacs Tape and the Source CD-ROM, a
--- 3905,3917 ----
  three tapes or CD-ROMs (plus shipping in some cases), we will ship you four
  new versions of the tape of your choice or the Source Code CD-ROM.  The tapes
! are sent each quarter; the CD-ROMs are sent as they are issued (currently
! twice a year, but we hope to make it more frequent).
  
! Regularly, we will send you a new version of a Lisps/Emacs, Languages,
! Utilities, or X Window System (X11R6) Required tape, or the Source CD-ROM.
  The MIT Scheme and X Window System Optional tapes are not changed often
  enough to warrant quarterly updates.  We do not yet know if we will be
! offering subscriptions to the Compiler Tools Binaries or our new Books with
! CD-ROM.
  
  Since Emacs 19 is on the Lisps/Emacs Tape and the Source CD-ROM, a
*************** evolves.
*** 3295,3387 ****
  A subscription is an easy way to keep up with the regular bug fixes to the X
  Window System.	We update the X11R6 Required tape as fixes and patches are
! issued throughout the year.  Each new edition of the *Note Source Code
! CD-ROMs::, also has updated sources for the X Window System.
  
  Please note: In two cases, you must pay 4 times the normal shipping required
  for a single order when you pay for each subscription.	If you're in Alaska,
  Hawaii, or Puerto Rico you must add $20.00 for shipping for each
! subscription.  If you're outside of U.S., Canada, and Puerto Rico, you have
! to add $80.00 for each subscription.  See "Unix and VMS Software" & "Shipping
  Instructions" on the *note Free Software Foundation Order Form::..
  
  
  
- The Deluxe Distribution
- ***********************
- 
- The Free Software Foundation has been asked repeatedly to create a package
- that provides executables for all of our software.  Normally we offer only
- sources.  In addition to providing binaries with the source code, the Deluxe
- Distribution includes a complete set of our printed manuals and reference
- cards.
- 
- The FSF Deluxe Distribution contains the binaries and sources to hundreds of
- different programs including GNU Emacs, the GNU C Compiler, the GNU Debugger,
- the complete X Window System, and all the GNU utilities.
- 
- We will make a Deluxe Distribution for any machine, with any operating
- system.	 We will send someone to your office to do the compilation, if we
- can't find a suitable machine close to us!  However, we can only compile the
- programs that already support your chosen machine and system  - porting is a
- separate matter (if you wish to commission a port, see the GNU Service
- Directory, details in *Note Free Software Support::).  Compiling all these
- programs take time; a Deluxe Distribution for an unusual machine will take
- longer to produce then one for a common machine.  Please contact the FSF
- office if you have any questions.
- 
- We supply the software in one of these tape formats in Unix `tar' format:
- 1600 or 6250bpi 1/2in reel, Sun DC300XLP 1/4in cartridge - QIC24,
- Hewlett-Packard 16-track DC600HC 1/4in cartridge, IBM RS/6000 1/4in cartridge
- - QIC 150, Exabyte 8mm cartridge, or DAT 4mm cartridge.	 If your computer
- cannot read any of these, please contact us to see if we can handle your
- format.
- 
- The manuals included are one each of the `Bison', `Calc', `Gawk', `GNU C
- Compiler', `GNU C Library', `GDB', `Flex', `GNU Emacs Lisp Reference',
- `Programming in Emacs Lisp: An Introduction', `Make', `Texinfo', & `Termcap'
- manuals; six copies of the `GNU Emacs' manual; and a packet of ten reference
- cards each for GNU Emacs, Bison, Calc, Flex, & GDB.   Every Deluxe
- Distribution also includes a copy of the latest editions of our CD-ROMs
- (including the MS-DOS CD & the Debian GNU/Linux CD when they are available)
- that contain sources of our software & compiler tool binaries for some
- systems.  The MS-DOS CD is in ISO 9660 format.	The other CDs are in ISO 9660
- format with Rock Ridge extensions.
- 
- The price of the Deluxe Distribution is $5000 (shipping included).  These
- sales provide enormous financial assistance to help the FSF develop more free
- software.  To order, please fill out the "Deluxe Distribution" section on the
- *note Free Software Foundation Order Form::.  and send it to:
- 
- 	Free Software Foundation, Inc.
- 	59 Temple Place -- Suite 330
- 	Boston, MA   02111--1307
- 	USA
- 
- 	Telephone: +1-617-542-5942
- 	Fax (including Japan):	     +1-617-542-2652
- 	Free Dial Fax (in Japan):
- 		   0031-13-2473 (KDD)
- 		   0066-3382-0158 (IDC)
- 	Electronic mail: gnu@prep.ai.mit.edu
- 
- 
- 
  FSF T-shirt
  ***********
  
! Our latest T-shirt has artwork by Berkeley, CA artist Etienne Suvasa.  The
! front has the ever-popular picture of GNArnold from the `Flex Manual', while
! the back has the Preamble to the GNU General Public License.
  
! They are available in two colors, Natural & Black.  Natural is an off-white,
  unbleached, undyed, environment-friendly cotton, printed with black ink, & is
  great for tye-dyeing or displaying as is.  Black is printed with white ink &
! is perfect for late night hacking.  All shirts are thick 100% cotton, & are
! available in sizes M, L, XL & XXL.  This shirt makes a great gift for your
! favorite hacker!
! 
! The previous version of the T-shirt will be available while supplies last,
! but please contact the FSF to see if we have what you would like before
! ordering.
  
  
--- 3921,3952 ----
  A subscription is an easy way to keep up with the regular bug fixes to the X
  Window System.	We update the X11R6 Required tape as fixes and patches are
! issued throughout the year.  Each edition of the *Note Source Code CD-ROMs::,
! also has updated sources for the required part of the X Window System.
  
  Please note: In two cases, you must pay 4 times the normal shipping required
  for a single order when you pay for each subscription.	If you're in Alaska,
  Hawaii, or Puerto Rico you must add $20.00 for shipping for each
! subscription.  If you're outside of U.S., Canada, and Puerto Rico, you must
! add $80.00 for each subscription.  See "Unix and VMS Software" and "Shipping
  Instructions" on the *note Free Software Foundation Order Form::..
  
  
  
  FSF T-shirt
  ***********
  
! There is a GNU & improved T-shirt.  The front has the GNU Emacs Lisp code
! `(USE 'GNU)' with "`()'" being the dancing parentheses from the cover of our
! `GNU Emacs Lisp Reference Manual' (drawn by Berkeley, CA artist Etienne
! Suvasa).  The back of the shirt is still imprinted with the Preamble to the
! GNU General Public License.
  
! These shirts come in two colors, Natural & Black.  Natural is an off-white,
  unbleached, undyed, environment-friendly cotton, printed with black ink, & is
  great for tye-dyeing or displaying as is.  Black is printed with white ink &
! is perfect for late night hacking.  All shirts are thick 100% cotton, & come
! in sizes M, L, XL, & XXL.  GNU shirts often create spontaneous friendships at
! technical conferences and on major university campuses!	 (They also make
! great gifts!)
  
  
*************** weeks for delivery (though it won't usua
*** 3398,3402 ****
  
  
!      PRICE AND CONTENTS MAY CHANGE WITHOUT NOTICE AFTER January 31, 1996.
  
  
--- 3963,3967 ----
  
  
!      PRICE AND CONTENTS MAY CHANGE WITHOUT NOTICE AFTER June 30, 1996.
  
  
*************** These tapes in the formats indicated (*n
*** 3418,3434 ****
      (c.t. = cartridge tape)
  
! Lisps/Emacs	$200	  $210	    $230      $215 (3)	$205	 $225
  Languages	$200	  $210	    $230      $215	$205	 $225
  Utilities	$200	  $210	    $230      $215	$205	 $225
  4.4BSD-Lite	$200	  $210	    $230      $215	$205	 $225
  Scheme		$200	  $210	    $230      $215	$205	 $225
! X11R5-Required	$200	  $210	    $230      $215	$205	 $225
! X11R5-Optional	$200	  $210	    $230      $215	$205	 $225
  X11R6-Required	$200	  $210	    $230      $215	$205	 $225
  X11R6-Optional	$200	  $210	    $230      $215	$205	 $225
  
  	 (1) Sun tapes can be read on some other Unix systems.
  	 (2) IBM RS/6000 tapes can be read on some other Unix systems.
- 	 (3) The IBM Emacs tape also has binaries for GNU Emacs.
  
  
--- 3983,4002 ----
      (c.t. = cartridge tape)
  
! Lisps/Emacs	$200	  $210	    $230      $215	$205	 $225
! 
  Languages	$200	  $210	    $230      $215	$205	 $225
+ 
  Utilities	$200	  $210	    $230      $215	$205	 $225
+ 
  4.4BSD-Lite	$200	  $210	    $230      $215	$205	 $225
+ 
  Scheme		$200	  $210	    $230      $215	$205	 $225
! 
  X11R6-Required	$200	  $210	    $230      $215	$205	 $225
+ 
  X11R6-Optional	$200	  $210	    $230      $215	$205	 $225
  
  	 (1) Sun tapes can be read on some other Unix systems.
  	 (2) IBM RS/6000 tapes can be read on some other Unix systems.
  
  
*************** Subscriptions, 4 updates for one year (*
*** 3436,3441 ****
--- 4004,4012 ----
  
  Emacs		$600	  $630	    $690      $645	$615	 $675
+ 
  Languages	$600	  $630	    $690      $645	$615	 $675
+ 
  Utilities	$600	  $630	    $690      $645	$615	 $675
+ 
  X11R6-Required	$600	  $630	    $690      $645	$615	 $675
  
*************** ____ @ $195  = $ ______	  VMS Compiler, 
*** 3452,3457 ****
  
  
! FSF Deluxe Distribution (*note Deluxe Distribution::.):
! ......................................................
  
  
--- 4023,4030 ----
  
  
! FSF Deluxe Distribution
! .......................
! (Please call with any questions.  *note Deluxe Distribution::. for machine,
! operating system, and media types.):
  
  
*************** Operating system: ______________________
*** 3464,3467 ****
--- 4037,4042 ----
  Media type: __________________________________________________________________
  
+ Version of X Windows System to build: _______________________________________
+ 
  
  
*************** CD-ROMs, in ISO 9660 format (*note CD-RO
*** 3470,3474 ****
  
  
! GNU Source Code CD-ROM, Version 6 with X11R6 (*note June 1995 Source Code CD-ROM::.):
  
  ____ @ $240  = $ ______	  for corporations and other organizations.
--- 4045,4049 ----
  
  
! GNU Source Code CD-ROMs, Version 7 with X11R6 (*note December 1995 Source Code CD-ROMs::.):
  
  ____ @ $240  = $ ______	  for corporations and other organizations.
*************** ____ @ $ 60  = $ ______	  for individual
*** 3477,3497 ****
  
  
- 
- GNU Compiler Tools Binaries CD-ROM, Version 2, December 1994 Edition
- (*note Compiler Tools Binaries CD-ROM::.):
- 
- ____ @ $220  = $ ______	  for corporations and other organizations.
- 
- ____ @	$55  = $ ______	  for individuals.
- 
- 
- 
- Debian GNU/Linux Book with CD-ROM - expected late fall 1995 (*note Debian GNU/Linux CD-ROM::.):
- 
- ____ @ $200  = $ ______	  for corporations and other organizations.
- 
- ____ @	$50  = $ ______	  for individuals.
- 
- 
  Subscriptions, next 4 updates, of the Source Code CD-ROM, in ISO 9660 format
  (*note Tape & CD-ROM Subscription Service::.):
--- 4052,4055 ----
*************** ____ @ $180  = $ ______	  for individual
*** 3502,3516 ****
  
  
  
! MS-DOS Software
! ---------------
! 
! MS-DOS Book with CD-ROM - expected September 1995 (*note MS-DOS CD-ROM::.):
  
! ____ @ $180  = $ ______	  for corporations and other organizations.
  
- ____ @	$45  = $ ______	  for individuals.
  
  
  
  The following sources and executables for MS-DOS, on 3.5" 1.44MB diskettes
--- 4060,4074 ----
  
  
+ GNU Compiler Tools Binaries CD-ROM, Version 3, December 1995 Edition
+ (*note Compiler Tools Binaries CD-ROM::.):
  
! ____ @ $220  = $ ______	  for corporations and other organizations.
  
! ____ @	$55  = $ ______	  for individuals.
  
  
  
+ MS-DOS Software
+ ---------------
  
  The following sources and executables for MS-DOS, on 3.5" 1.44MB diskettes
*************** The following sources and executables fo
*** 3519,3527 ****
  ____ @ $ 90  = $ ______	  Emacs diskettes, GNU Emacs, for 80386 and up.
  
! ____ @ $ 80  = $ ______	  DJGPP diskettes, GCC version 2, for 80386 and up
! 			   (also on the *note Compiler Tools Binaries CD-ROM::. and *note MS-DOS CD-ROM::..)
  ____ @ $ 85  = $ ______	  Selected Utilities diskettes, 8086 and up.
  
! ____ @ $ 40  = $ ______	  Windows diskette, GNU Chess and gnuplot for
  			   Microsoft Windows.
  
--- 4077,4087 ----
  ____ @ $ 90  = $ ______	  Emacs diskettes, GNU Emacs, for 80386 and up.
  
! ____ @ $ 80  = $ ______	  DJGPP diskettes, GCC version 2, and other tools
! 			   for 80386 and up (also on the
! 			   *note Compiler Tools Binaries CD-ROM::.).
! 
  ____ @ $ 85  = $ ______	  Selected Utilities diskettes, 8086 and up.
  
! ____ @ $ 40  = $ ______	  Windows diskette: GNU Chess and gnuplot for
  			   Microsoft Windows.
  
*************** Manuals
*** 3530,3537 ****
  -------
  
! These manuals (*note Documentation::.).	 Please call for bulk purchase
! discounts.
! 
! ____ @ $300  = $ ______	  One copy each of the following 13 manuals.
  
  ____ @ $ 25  = $ ______	  GNU Emacs version manual, with a reference card.
--- 4090,4095 ----
  -------
  
! These manuals (*note Documentation::.).	 The latest version of each manual
! will be shipped.  Please call if you want a specific version.
  
  ____ @ $ 25  = $ ______	  GNU Emacs version manual, with a reference card.
*************** ____ @ $ 25  = $ ______	  GNU Emacs vers
*** 3539,3542 ****
--- 4097,4102 ----
  ____ @ $ 50  = $ ______	  GNU Emacs Lisp Reference manual, in two volumes.
  
+ ____ @ $ 60  = $ ______	  GNU Emacs Lisp Reference, Japanese Edition.
+ 
  ____ @ $ 50  = $ ______	  Using and Porting GNU CC.
  
*************** ____ @ $ 50  = $ ______	  GNU C Library 
*** 3545,3553 ****
  ____ @ $ 50  = $ ______	  GNU Emacs Calc manual, with a reference card.
  
! ____ @ $ 20  = $ ______	  Programming in Emacs Lisp, An Introduction
  
  ____ @ $ 20  = $ ______	  Debugging with GDB, with a reference card.
  
! ____ @ $ 20  = $ ______	  Gawk manual.
  
  ____ @ $ 20  = $ ______	  Make manual.
--- 4105,4113 ----
  ____ @ $ 50  = $ ______	  GNU Emacs Calc manual, with a reference card.
  
! ____ @ $ 20  = $ ______	  Programming in Emacs Lisp: An Introduction.
  
  ____ @ $ 20  = $ ______	  Debugging with GDB, with a reference card.
  
! ____ @ $ 25  = $ ______	  GAWK manual.
  
  ____ @ $ 20  = $ ______	  Make manual.
*************** ____ @ $  5  = $ ______	  GNU Emacs vers
*** 3604,3607 ****
--- 4164,4168 ----
  			   of ten.
  
+ 
  Please fill in the number of each older CD-ROM you order:
  
*************** Please fill in the number of each older 
*** 3612,3618 ****
--- 4173,4187 ----
  
  GNU Compiler Tools Binaries CD-ROM
+ 	December 1994 Edition (Version 2)	____________	____________
+ 
+ GNU Compiler Tools Binaries CD-ROM
  	December 1993 Edition (Version 1)	____________	____________
  
  
+ Please note that the December 1994 Source CD is permanently out of stock.
+ 
+ GNU Source Code CD-ROM
+ 	June 1995 edition with X11R6		____________	____________
+ 
  GNU Source Code CD-ROM
  	May 1994 edition with X11R6		____________	____________
*************** ____ @ $ 20  = $ ______	  for individual
*** 3640,3661 ****
  
  
  Tax and Shipping Costs
  ----------------------
  
! 	     + $ ______	  In Massachusetts: add 5% sales tax, or give tax
! 			  exempt number.
! 	     + $ ______	  In Alaska, Hawaii, or Puerto Rico for shipping:
! 			  for GNU Emacs Lisp Reference and GNU Emacs Calc
! 			  manuals, add $5 *each*.  For *each* tape or
! 			  CD-ROM subscription, add $20.	 For all other
! 			  items, add $5 base charge, then $1 per item except
! 			  reference cards; i.e.,
! 			  shipping for all other items = $5 + ($1 * i).
! 	     + $ ______	  Outside of U.S., Canada, and Puerto Rico for
! 			  shipping:  Add $20 base charge; then add $80 more
! 			  for *each* tape or CD-ROM subscription; and then
! 			  add $10 more for *each* manual in the order;
! 			  i.e., shipping for all other items
! 					     = $20 + ($80 * s) + ($10 * m).
  	     + $ ______	  Optional (tax-deductible in the U.S.) donation.
  		 ------	  We suggest 5% if paying by credit card.
--- 4209,4240 ----
  
  
+ 
  Tax and Shipping Costs
  ----------------------
  
! 	     + $ ______	  For addresses in Massachusetts: add 5% sales tax
! 			  or give tax exempt number.  There is no sales tax
! 			  on T-shirts.
! 	     + $ ______	  Shipping fee for addresses in Alaska, Hawaii, or
! 			  Puerto Rico:
! 			    $  5.00 base charge;
! 			  + $  5.00 for *each* Emacs Calc or Emacs Lisp
! 			    Reference manual ($ 5.00 * #ofMans);
! 			  + $ 20.00 for *each* tape subscription or CD
! 			    subscription ($20.00 * #ofSubs);
! 			  + $  1.00 for *each* item other then the above
! 			    (shipping for all other items =
! 						     $ 1.00 * #ofOtherItems).
! 	     + $ ______	  Shipping fee for most Foreign Destinations: (Please
! 			  do *not* use this formula for addresses in China,
! 			  Guam, Indonesia, Israel, Malaysia, New Zealand,
! 			  Philippines, and Thailand.  Please fax,
! 			  or call for an exact shipping quote.)
! 			    $ 20.00 base charge for orders to other
! 			      addresses outside of U.S., Canada, & Puerto Rico:
! 			  + $ 80.00 for *each* tape subscription or CD
! 			    subscription ($ 80.00 * #ofSubs);
! 			  + $ 10.00 for *each* of the other items in the
! 			    order ($ 10.00 * #ofItems).
  	     + $ ______	  Optional (tax-deductible in the U.S.) donation.
  		 ------	  We suggest 5% if paying by credit card.
*************** Zip Code/Postal Code/Country: __________
*** 3684,3693 ****
  
  Telephone number in case of a problem with your order.
! For international orders, please include a FAX number. _______________________
  
  
  ------------------------------------------------------------------------------
  |									     |
! |  Orders filled only upon receipt of check, money order or credit card	     |
  |  order in U.S. dollars.  Unpaid orders will be returned to the sender.     |
  |  We do not have the staff to handle the billing of unpaid orders.  Please  |
--- 4263,4272 ----
  
  Telephone number in case of a problem with your order.
! For international orders, please include a Fax number. _______________________
  
  
  ------------------------------------------------------------------------------
  |									     |
! |  Orders filled only upon receipt of check, money order, or credit card     |
  |  order in U.S. dollars.  Unpaid orders will be returned to the sender.     |
  |  We do not have the staff to handle the billing of unpaid orders.  Please  |
*************** For international orders, please include
*** 3697,3700 ****
--- 4276,4280 ----
  
  
+ 
  For orders from outside the U.S.:
  ---------------------------------
*************** refuse to pay the charges, the shipper w
*** 3711,3723 ****
  
  
  For Credit Card Orders:
  -----------------------
  
  The Free Software Foundation takes these credit cards: Carte Blanche,
! Diner's Club, JCB, Mastercard, Visa, or American Express.  Please note that
  we are charged about 5% of an order's total amount in credit card
! processing fees.  Please consider paying by check instead, or adding on a
! 5% donation to make up the difference.	To place a credit card order,
! please give us this information:
  
  
--- 4291,4304 ----
  
  
+ 
  For Credit Card Orders:
  -----------------------
  
  The Free Software Foundation takes these credit cards: Carte Blanche,
! Diner's Club, JCB, MasterCard, Visa, or American Express.  Please note that
  we are charged about 5% of an order's total amount in credit card
! processing fees.  Please consider paying by check instead, or adding on a 5%
! donation to make up the difference.  To place a credit card order, please
! give us this information:
  
  
*************** Cardholder's Signature: ________________
*** 3734,3738 ****
  ------------------------------------------------------------------------------
  |									     |
! |     If you wish to pay by wire transfer, or you are a reseller, please     |
  |     call or write us for details.					     |
  |									     |
--- 4315,4319 ----
  ------------------------------------------------------------------------------
  |									     |
! |     If you wish to pay by wire transfer or you are a reseller, please	     |
  |     call or write us for details.					     |
  |									     |
*************** Cardholder's Signature: ________________
*** 3743,3755 ****
  					59 Temple Place -- Suite 330
  					Boston, MA   02111
! 					+1-617-542-5942
! 					FAX (including Japan): +1-617-542-2652
! 					Free Dial FAX numbers in Japan:
! PRICES AND CONTENTS MAY CHANGE				0031-13-2473 (KDD)
! WITHOUT NOTICE AFTER January 31, 1996.			0066-3382-0158 (IDC)
  
! Version: June 1995 ASCII Bull to June 1995 Src CD/GNU 19.29/GCC 2.7.0
  
- ---------------------------------------------------------------------
  local variables:
  mode: text
--- 4324,4334 ----
  					59 Temple Place -- Suite 330
  					Boston, MA   02111
! PRICES AND CONTENTS MAY CHANGE		+1-617-542-5942
! WITHOUT NOTICE AFTER June 30, 1996.	Fax (including Japan): +1-617-542-2652
! 
! Version: January 1996 ASCII etc/ORDERS
  
! -----------------------------------------------------------------------------
  
  local variables:
  mode: text
diff -2rcpP --exclude=*.elc emacs-19.30/etc/ORDERS.JAPAN emacs-19.31/etc/ORDERS.JAPAN
*** emacs-19.30/etc/ORDERS.JAPAN	Mon Nov 20 14:18:24 1995
--- emacs-19.31/etc/ORDERS.JAPAN	Sat Mar 16 15:24:18 1996
***************
*** 1,102 ****
! 			  GNU ORDER FORM FOR JAPAN
  
!   Item					       Unit Price Quantity Item Price
    ----------------------------------------     ---------- -------- ----------
  * indicates New or Substantially Updated items.
  
! * Compiler Tools Binaries CD-ROM edition 2, if a  Y32,000 ________ __________
!   corporation or other organization is ultimately
!   paying.
! 
! * Compiler Tools Binaries CD-ROM edition 2, if an  Y8,000 ________ __________
!   individual is ultimately paying.
! 
! * Source Code CD-ROM edition 6, with X11R6, if a  Y40,000 ________ __________
!   corporation or other organization is ultimately
!   paying.
! 
! * Source Code CD-ROM edition 6, with X11R6, if	  Y10,000 ________ __________
!   an individual is ultimately paying.
! 
!   Source Code CD-ROM edition 3, with X11R5, if a  Y40,000 ________ __________
!   corporation or other organization is ultimately
!   paying (while supplies last).
! 
!   Source Code CD-ROM edition 3, with X11R5, if	  Y10,000 ________ __________
!   an individual is ultimately paying (while
!   supplies last).
  
!   Subscription to next four editions of the	 Y125,000 ________ __________
!   Source Code CD-ROMs.	(There is no subscription
    yet to the Compiler Tools Binaries CD-ROM.)
  
! * Source Code on Tape				  Y30,000 ________ __________
    (per tape; see the next page for more details.)
  
! * Emacs manual, with reference card		   Y3,700 ________ __________
!   (Eleventh Edition for version 19.29)
  
! * Programming in Emacs Lisp, An Introduction	   Y3,100 ________ __________
!   (Edition 1.03)
  
! * Emacs Lisp Reference manual, in two volumes	   Y7,100 ________ __________
!   (Edition 2.4 for version 19.29)
  
!   Emacs Calc manual, with reference card	   Y7,400 ________ __________
!   (Edition 2.02 for version 2.02)
  
! * Using and Porting GNU CC manual		   Y7,100 ________ __________
!   (September 1994 Edition for version 2.6)
  
! * GNU C Library Reference manual		   Y7,400 ________ __________
!   (Edition 0.06 for version 1.09)
  
! * Debugging with GDB manual, with reference card   Y3,100 ________ __________
!   (Edition 4.12 for version 4.14)
  
! * Texinfo manual (Edition 2.21 for version 3)	   Y2,800 ________ __________
  
!   Termcap manual (Second edition for version 1.2)  Y2,100 ________ __________
  
!   Bison manual, with reference card		   Y2,100 ________ __________
    (December 1993 Edition for Version 1.23)
  
!   Gawk manual (Edition 0.16 for version 2.16)	   Y2,800 ________ __________
  
!   Make manual (Edition 0.46 for version 3.72)	   Y2,800 ________ __________
  
!   Flex manual, with reference card		   Y2,100 ________ __________
!   (Edition 1.03 for version 2.3.7)
  
!   Packet of ten Emacs 19 reference cards	   Y1,500 ________ __________
  
!   Packet of ten Emacs 18 reference cards	   Y1,500 ________ __________
    (while supplies last)
  
!   Packet of ten GDB reference cards		   Y1,500 ________ __________
  
!   Packet of ten Emacs Calc reference cards	   Y1,500 ________ __________
  
!   Packet of ten Bison reference cards		   Y1,500 ________ __________
  
!   Packet of ten Flex reference cards		   Y1,500 ________ __________
  
!   FSF T-shirt (size M)				   Y5,000 ________ __________
    Color:  Natural or Black  (circle)
  
!   FSF T-shirt (size L)				   Y5,000 ________ __________
    Color:  Natural or Black  (circle)
  
!   FSF T-shirt (size XL)				   Y5,000 ________ __________
    Color:  Natural or Black  (circle)
  
!   FSF T-shirt (size XXL)			   Y5,000 ________ __________
    Color:  Natural or Black  (circle)
  
!   Shipping							       Y1,500
  
!   Optional donation--help the FSF write more free software!	   __________
  
! 							     Total __________
  
  The following is your shipping label.  Please write clearly using Romaji.
--- 1,110 ----
!                           GNU ORDER FORM FOR JAPAN
  
! Prices and contents may change without notice after June 30, 1996.
! 
!   Item                                         Unit Price Quantity Item Price
    ----------------------------------------     ---------- -------- ----------
  * indicates New or Substantially Updated items.
  
! * Compiler Tools Binaries CD-ROM December '95     Y32,000 ________ __________
!   Edition, Version 3, if a corporation or other
!   organization is ultimately paying.
! 
! * Compiler Tools Binaries CD-ROM December '95      Y8,000 ________ __________
!   Edition, Version 3, if an individual is
!   ultimately paying.
! 
! * Source Code CD-ROM December '95 Edition,        Y40,000 ________ __________
!   Version 7, with X11R6, if a corporation or
!   other organization is ultimately paying.
! 
! * Source Code CD-ROM December '95 Edition,        Y10,000 ________ __________
!   Version 7, with X11R6, if an individual is
!   ultimately paying.
! 
!   Source Code CD-ROM November '93 Edition,       Y40,000 ________ __________
!   Version 3, with X11R5, if a corporation or other
!   organization is ultimately paying (while supplies last).
! 
!   Source Code CD-ROM November '93 Edition,       Y10,000 ________ __________
!   Version 3, with X11R5, if an individual is
!   ultimately paying (while supplies last).
  
!   Subscription to next four editions of the      Y125,000 ________ __________
!   Source Code CD-ROMs.  (There is no subscription
    yet to the Compiler Tools Binaries CD-ROM.)
  
! * Source Code on Tape                             Y30,000 ________ __________
    (per tape; see the next page for more details.)
  
!   Emacs manual, with reference card                Y3,700 ________ __________
!   (Eleventh Edition for Version 19.29)
! 
! * Programming in Emacs Lisp, An Introduction       Y3,100 ________ __________
!   (Edition 1.04)
  
! * Emacs Lisp Reference manual, in two volumes      Y7,100 ________ __________
!   (Edition 2.4 for Version 19.29)
  
! * Emacs Lisp Reference, Japanese Edition manual    Y8,000 ________ __________
!   (Japanese DRAFT Revision 1.0, Dec 1995,
!   from English Edition 2.4 for Version 19.29)
  
!   Emacs Calc manual, with reference card           Y7,400 ________ __________
!   (Edition 2.02 for Version 2.02)
  
!   Using and Porting GNU CC manual                  Y7,100 ________ __________
!   (September 1994 Edition for Version 2.6)
  
!   GNU C Library Reference manual                   Y7,400 ________ __________
!   (Edition 0.06 for Version 1.09)
  
!   Debugging with GDB manual, with reference card   Y3,100 ________ __________
!   (Edition 4.12 for Version 4.14)
  
!   Texinfo manual (Edition 2.21 for Version 3)      Y2,800 ________ __________
  
!   Termcap manual (Second Edition for Version 1.2)  Y2,100 ________ __________
  
!   Bison manual, with reference card                Y2,100 ________ __________
    (December 1993 Edition for Version 1.23)
  
! * Gawk manual (Edition 1.0 for Version 3.0)        Y3,700 ________ __________
  
! * Make manual (Edition 0.49 for Version 3.74)      Y2,800 ________ __________
  
!   Flex manual, with reference card                 Y2,100 ________ __________
!   (Edition 1.03 for Version 2.3.7)
  
!   Packet of ten Emacs 19 reference cards           Y1,500 ________ __________
  
!   Packet of ten Emacs 18 reference cards           Y1,500 ________ __________
    (while supplies last)
  
!   Packet of ten GDB reference cards                Y1,500 ________ __________
  
!   Packet of ten Emacs Calc reference cards         Y1,500 ________ __________
  
!   Packet of ten Bison reference cards              Y1,500 ________ __________
  
!   Packet of ten Flex reference cards               Y1,500 ________ __________
  
!   FSF T-shirt (size M)                             Y5,000 ________ __________
    Color:  Natural or Black  (circle)
  
!   FSF T-shirt (size L)                             Y5,000 ________ __________
    Color:  Natural or Black  (circle)
  
!   FSF T-shirt (size XL)                            Y5,000 ________ __________
    Color:  Natural or Black  (circle)
  
!   FSF T-shirt (size XXL)                           Y5,000 ________ __________
    Color:  Natural or Black  (circle)
  
!   Shipping                                                             Y1,500
  
!   Optional donation--help the FSF write more free software!        __________
  
!                                                              Total __________
  
  The following is your shipping label.  Please write clearly using Romaji.
*************** with your order.
*** 124,148 ****
    ____ I am interested in working as a volunteer for the FSF.
  
!   Version: June 1995 ASCII etc/ORDERS.JAPAN
  
!   Prices and contents may change without notice after January 31, 1996.
  
!  Free Software Foundation		Toll-free FAX  0031-13-2473 (KDD)
!  59 Temple Place - Suite 330			       0066-3382-0158 (IDC)
!  Boston, MA  02111-1307
!  U.S.A.				   Help FSF save money FAX 001-1-617-542-2652
  
  
! 		  GNU ORDER FORM ADDITIONAL INSTRUCTIONS
  
! Within Japan, you may fax your order toll-free to 0031-13-2473 (KDD) or to
! 0066-3382-0158 (IDC).  If you are able to pay for international direct dial,
! please fax your order directly to 001-1-617-542-2652.  This will save the FSF
! the toll charges.  Inquires may be made to gnu@prep.ai.mit.edu.	 Orders may
! also be sent by ordinary mail to:
  
      Free Software Foundation
      59 Temple Place - Suite 330
!     Boston, MA	02111-1307
      U.S.A.
  
--- 132,154 ----
    ____ I am interested in working as a volunteer for the FSF.
  
! Prices and contents may change without notice after June 30, 1996.
  
!   Version: January 1996 ASCII etc/ORDERS.JAPAN
  
!  Free Software Foundation                FAX     001-1-617-542-2652
!  59 Temple Place - Suite 330             Voice   001-1-617-542-5942
!  Boston, MA  02111-1307                  E-mail  gnu@prep.ai.mit.edu
!  U.S.A.
  
  
!                   GNU ORDER FORM ADDITIONAL INSTRUCTIONS
  
! You can fax your order directly to 001-1-617-542-2652.  Inquires may
! be made to gnu@prep.ai.mit.edu.  Orders may also be sent by ordinary
! mail to:
  
      Free Software Foundation
      59 Temple Place - Suite 330
!     Boston, MA  02111-1307
      U.S.A.
  
*************** number, and your signature.  Bank transf
*** 153,173 ****
  following account:
  
!     Bank:	      Sanwa Bank
!     Branch:	      Azabu Branch (#620)
      Account name:     Free Software Foundation
      Account number:   3683216
  
! Prices and contents may change without notice after January 31, 1996.  All
  software and publications are distributed with permission to copy and to
  redistribute.  Texinfo source for each manual is on the Source Code CD-ROM
! and/or on the appropriate tape.
  
  The minimum order amount (before postage) is Y5,000.  The FSF regrets that it
! cannot fill orders for smaller amounts.	 Please contact the FSF directly by
  telephone at 001-1-617-542-5942 or by fax at 001-1-617-542-2652 prior to
  placing any orders for greater than Y500,000.
  
  The FSF offers a deluxe package to Japanese corporations which consists of
! source code in your preferred format, a complete set of custom binaries for
  your preferred architecture and operating system, and a complete documentation
  set with reference cards.  Purchasers of the corporate deluxe package will
--- 159,180 ----
  following account:
  
!     Bank:             Sanwa Bank
!     Branch:           Azabu Branch (#620)
      Account name:     Free Software Foundation
      Account number:   3683216
  
! Prices and contents may change without notice after June 30, 1996.  All
  software and publications are distributed with permission to copy and to
  redistribute.  Texinfo source for each manual is on the Source Code CD-ROM
! and/or on the appropriate tape.  We will ship the latest version of each
! manual, unless you instruct us otherwise.
  
  The minimum order amount (before postage) is Y5,000.  The FSF regrets that it
! cannot fill orders for smaller amounts.  Please contact the FSF directly by
  telephone at 001-1-617-542-5942 or by fax at 001-1-617-542-2652 prior to
  placing any orders for greater than Y500,000.
  
  The FSF offers a deluxe package to Japanese corporations which consists of
! source code in your preferred format, a set of custom binaries for
  your preferred architecture and operating system, and a complete documentation
  set with reference cards.  Purchasers of the corporate deluxe package will
*************** Stallman in Japan.  The price for the co
*** 176,180 ****
  For more information, contact the FSF directly.
  
! Software may also be ordered on magnetic tape.	The following tape titles are
  available:
    * Lisps/Emacs
--- 183,187 ----
  For more information, contact the FSF directly.
  
! Software may also be ordered on magnetic tape.  The following tape titles are
  available:
    * Lisps/Emacs
*************** The following tape formats are available
*** 202,206 ****
  
      IBM RS/6000 Unix tar QIC-150 DC600A 1/4" cartridge tape
-     (includes binaries for Emacs)
      (may also be read on other systems)
  
--- 209,212 ----
*************** Please indicate your desired tape titles
*** 211,215 ****
  paper and fax that along with your order.  If you need information regarding
  which programs are on which tapes, please consult the Japanese edition of the
! June 1995 GNU Bulletin.	 If you do not have a copy of the Japanese edition
  of the GNU Bulletin, please contact the FSF.
  
--- 217,221 ----
  paper and fax that along with your order.  If you need information regarding
  which programs are on which tapes, please consult the Japanese edition of the
! January 1996 GNU Bulletin.  If you do not have a copy of the Japanese edition
  of the GNU Bulletin, please contact the FSF.
  
*************** speaking engagements.
*** 222,233 ****
  All sales are final.
  
! Prices and contents may change without notice after January 31, 1996.
  
! 		       Please do not fax this page.
  
! 			  For use in Japan only.
  
! 			 Free Software Foundation
! 			59 Temple Place - Suite 330
! 			  Boston, MA  02111-1307
! 				  U.S.A.
--- 228,239 ----
  All sales are final.
  
! Prices and contents may change without notice after June 30, 1996.
  
!                        Please do not fax this page.
  
!                           For use in Japan only.
  
!                          Free Software Foundation
!                         59 Temple Place - Suite 330
!                           Boston, MA  02111-1307
!                                   U.S.A.
diff -2rcpP --exclude=*.elc emacs-19.30/etc/OTHER.EMACSES emacs-19.31/etc/OTHER.EMACSES
*** emacs-19.30/etc/OTHER.EMACSES	Thu Mar 18 18:30:08 1993
--- emacs-19.31/etc/OTHER.EMACSES	Thu Jan  4 14:54:26 1996
*************** is an ordinary command (which is defined
*** 162,166 ****
  type C-g while Lisp code is executing, it sets a flag which
  causes a special signal, nearly the same as an error, to
! happen atthe next safe place in Lisp execution.  This usually
  has the effect of aborting the current command in a safe way.
  
--- 162,166 ----
  type C-g while Lisp code is executing, it sets a flag which
  causes a special signal, nearly the same as an error, to
! happen at the next safe place in Lisp execution.  This usually
  has the effect of aborting the current command in a safe way.
  
diff -2rcpP --exclude=*.elc emacs-19.30/etc/SERVICE emacs-19.31/etc/SERVICE
*** emacs-19.30/etc/SERVICE	Sun Nov 19 19:07:19 1995
--- emacs-19.31/etc/SERVICE	Sun Mar 10 07:42:09 1996
*************** configurations.
*** 230,233 ****
--- 230,257 ----
  Updated: 2Feb95
  
+ Edgar Der-Danieliantz	<EDD@AIC.NET> <edd@ns.aic.net> <edd@arminco.com>
+ P.O. Box 10			
+ Yerevan 375009 AM	
+ ARMENIA
+  
+ Support for GCC (C & Objective C), X Window System, 
+ World Wide Web, x86-based embedded systems, logic programming, etc.
+  
+ Via Internet (mail, talk, irc, etc.)
+  
+ Experience:
+    OS's: 4.3 & 4.4 BSD, SVR3.2 & 4.2, FreeBSD, Linux,
+       NetBSD, SCO, Solaris, SunOS, Ultrix, NEXTSTEP, UnixWare.
+    Languages: C, C++, Objective C, Pascal, Tcl/Tk, Perl,
+       Bourne Shell, PostScript, HTML, Prolog.
+    Platforms: Intel, SPARC, Mac, VAX, NeXT.
+  
+ Rates: Depending on type of work, appx $20/hour. Contact for more information.
+    Negotiable for individuals and non-profit organizations.
+    FREE for individuals who can't pay. Your 'Thanks!' just enough! :-)
+    Payment by international wire transfer.
+ 
+ Entered: 6Mar96
+ 
  Free Software Association of Germany
  Michaela Merz
*************** short-term, or that are very interesting
*** 553,556 ****
--- 577,605 ----
  
  Updated: 21Jan95
+ 
+ Erik Naggum		<erik@naggum.no>
+ P.O. Box 1570 Vika	http://www.naggum.no
+ 0118 OSLO		phone: +47 2295 0313
+ NORWAY			NIC handle: EN9
+ 
+ Have extensive experience with Unix and C (since 1983), Internet protocols
+ (1987), International Standards for character sets (1988), SGML (1990),
+ ANSI Common Lisp (1994); Emacs user and programmer from 1984 to 1987
+ (TOPS-20) and 1991 to present (Unix).  Have worked on GNU Emacs development
+ since early 1994, both in Emacs Lisp and C.  Have been tracking development
+ code for Emacs since mid-1995, and know new versions intimately.
+ 
+ Services offered: installation, support, customization, and development of
+ new packages, plus courses and seminars from basic usage through Emacs Lisp
+ programming to writing extensions in C.  General aid with all GNU software.
+ 
+ Rates depend on duration of work: From $6/minute for <= 1 hour, to $500/day
+ for >= 1 month.  Service agreements are encouraged.  Cover Scandinavia for
+ on-site work.  Remote debugging and help by mail available for smaller
+ fees, without limits to distance.
+ 
+ Please call only about actual work, I prefer mail for all other questions.
+ 
+ I accept VISA and Mastercard, preferred for remote jobs and small amounts.
  
  Wolfgang S. Rupprecht		<wolfgang@wsrcc.com>
diff -2rcpP --exclude=*.elc emacs-19.30/etc/TUTORIAL emacs-19.31/etc/TUTORIAL
*** emacs-19.30/etc/TUTORIAL	Thu Oct 26 02:36:10 1995
--- emacs-19.31/etc/TUTORIAL	Sat May 25 19:10:31 1996
***************
*** 1,17 ****
  Copyright (c) 1985 Free Software Foundation, Inc;  See end for conditions.
- 
  You are looking at the Emacs tutorial.
  
! Emacs commands generally involve the CONTROL key (sometimes labelled
! CTRL or CTL) or the META key (sometimes labelled EDIT or ALT).  Rather than
! write out META or CONTROL each time we want you to prefix a character,
! we'll use the following abbreviations:
  
   C-<chr>  means hold the CONTROL key while typing the character <chr>
  	  Thus, C-f would be: hold the CONTROL key and type f.
   M-<chr>  means hold the META or EDIT or ALT key down while typing <chr>.
! 	  If there is no META key or equivalent, type <ESC>, release it,
! 	  then type the character <chr>.  "<ESC>" stands for the
! 	  key labelled "ESC".
  
  Important note: to end the Emacs session, type C-x C-c.  (Two characters.)
--- 1,14 ----
  Copyright (c) 1985 Free Software Foundation, Inc;  See end for conditions.
  You are looking at the Emacs tutorial.
  
! Emacs commands generally involve the CONTROL key (sometimes labeled
! CTRL or CTL) or the META key (sometimes labeled EDIT or ALT).  Rather than
! write that in full each time, we'll use the following abbreviations:
  
   C-<chr>  means hold the CONTROL key while typing the character <chr>
  	  Thus, C-f would be: hold the CONTROL key and type f.
   M-<chr>  means hold the META or EDIT or ALT key down while typing <chr>.
! 	  If there is no META, EDIT or ALT key, instead press and release the
! 	  ESC key and then type <chr>.  We write <ESC> for the ESC key.
  
  Important note: to end the Emacs session, type C-x C-c.  (Two characters.)
diff -2rcpP --exclude=*.elc emacs-19.30/etc/WHY-FREE emacs-19.31/etc/WHY-FREE
*** emacs-19.30/etc/WHY-FREE	Wed Dec 31 19:00:00 1969
--- emacs-19.31/etc/WHY-FREE	Fri Feb 23 00:47:31 1996
***************
*** 0 ****
--- 1,244 ----
+ 		   Why Software Should Not Have Owners 
+ 
+ 			  by Richard Stallman
+ 
+ Digital information technology's contributes to the world by making it
+ easier to copy and modify information.  Computers promise to make this
+ easier for all of us.
+ 
+ Not everyone wants it to be easier.  The system of copyright gives
+ software programs "owners", most of whom aim to withhold software's
+ potential benefit from the rest of the public.  They would like to be
+ the only ones who can copy and modify the software that we use.
+ 
+ The copyright system grew up with printing--a technology for mass
+ production copying.  Copyright fit in well with this technology
+ because it restricted only the mass producers of copies.  It did not
+ take freedom away from readers of books.  An ordinary reader, who did
+ not own a printing press, could copy books only with pen and ink, and
+ few readers were sued for that.
+ 
+ Digital technology is more flexible than the printing press: when
+ information has digital form, you can easily copy it to share it with
+ others.  This very flexibility makes a bad fit with a system like
+ copyright.  That's the reason for the increasingly nasty and draconian
+ measures now used to enforce software copyright.  Consider these four
+ practices of the Software Publishers Association (SPA):
+ 
+ * Massive propaganda saying it is wrong to disobey the owners
+ to help your friend.
+ 
+ * Solicitation for stool pigeons to inform on their coworkers and
+ colleagues.
+ 
+ * Raids (with police help) on offices and schools, in which people are
+ told they must prove they are innocent of illegal copying.
+ 
+ * Prosecution (by the US government, at the SPA's request) of people
+ such as MIT's David LaMacchia, not for copying software (he is not
+ accused of copying any), but merely for leaving copying facilities
+ unguarded and failing to censor their use.
+ 
+ All four practices resemble those used in the former Soviet Union,
+ where every copying machine had a guard to prevent forbidden copying,
+ and where individuals had to copy information secretly and pass it
+ from hand to hand as "samizdat".  There is of course a difference: the
+ motive for information control in the Soviet Union was political; in
+ the US the motive is profit.  But it is the actions that affect us,
+ not the motive.  Any attempt to block the sharing of information, no
+ matter why, leads to the same methods and the same harshness.
+ 
+ Owners make several kinds of arguments for giving them the power
+ to control how we use information:
+ 
+ * Name calling.
+ 
+ Owners use smear words such as "piracy" and "theft", as well as expert
+ terminology such as "intellectual property" and "damage", to suggest a
+ certain line of thinking to the public--a simplistic analogy between
+ programs and physical objects.
+ 
+ Our ideas and intuitions about property for material objects are about
+ whether it is right to *take an object away* from someone else.  They
+ don't directly apply to *making a copy* of something.  But the owners
+ ask us to apply them anyway.
+ 
+ * Exaggeration.
+ 
+ Owners say that they suffer "harm" or "economic loss" when users copy
+ programs themselves.  But the copying has no direct effect on the
+ owner, and it harms no one.  The owner can lose only if the person who
+ made the copy would otherwise have paid for one from the owner.
+ 
+ A little thought shows that most such people would not have bought
+ copies.  Yet the owners compute their "losses" as if each and every
+ one would have bought a copy.  That is exaggeration--to put it kindly.
+ 
+ * The law.
+ 
+ Owners often describe the current state of the law, and the harsh
+ penalties they can threaten us with.  Implicit in this approach is the
+ suggestion that today's law reflects an unquestionable view of
+ morality--yet at the same time, we are urged to regard these penalties
+ as facts of nature that can't be blamed on anyone.
+ 
+ This line of persuasion isn't designed to stand up to critical
+ thinking; it's intended to reinforce a habitual mental pathway.
+ 
+ It's elemental that laws don't decide right and wrong.  Every American
+ should know that, forty years ago, it was against the law in many
+ states for a black person to sit in the front of a bus; but only
+ racists would say sitting there was wrong.
+ 
+ * Natural rights.
+ 
+ Authors often claim a special connection with programs they have
+ written, and go on to assert that, as a result, their desires and
+ interests concerning the program simply outweigh those of anyone
+ else--or even those of the whole rest of the world.  (Typically
+ companies, not authors, hold the copyrights on software, but we are
+ expected to ignore this discrepancy.)
+ 
+ To those who propose this as an ethical axiom--the author is more
+ important than you--I can only say that I, a notable software author
+ myself, call it bunk.
+ 
+ But people in general are only likely to feel any sympathy with the
+ natural rights claims for two reasons.
+ 
+ One reason is an overstretched analogy with material objects.  When I
+ cook spaghetti, I do object if someone else takes it and stops me from
+ eating it.  In this case, that person and I have the same material
+ interests at stake, and it's a zero-sum game.  The smallest
+ distinction between us is enough to tip the ethical balance.
+ 
+ But whether you run or change a program I wrote affects you directly
+ and me only indirectly.  Whether you give a copy to your friend
+ affects you and your friend much more than it affects me.  I shouldn't
+ have the power to tell you not to do these things.  No one should.
+ 
+ The second reason is that people have been told that natural rights
+ for authors is the accepted and unquestioned tradition of our society.
+ 
+ As a matter of history, the opposite is true.  The idea of natural
+ rights of authors was proposed and decisively rejected when the US
+ Constitution was drawn up.  That's why the Constitution only *permits*
+ a system of copyright and does not *require* one; that's why it says
+ that copyright must be temporary.  It also states that the purpose of
+ copyright is to promote progress--not to reward authors.  Copyright
+ does reward authors somewhat, and publishers more, but that is
+ intended as a means of modifying their behavior.
+ 
+ The real established tradition of our society is that copyright cuts
+ into the natural rights of the public--and that this can only be
+ justified for the public's sake.
+ 
+ * Economics.
+ 
+ The final argument made for having owners of software is that this
+ leads to production of more software.
+ 
+ Unlike the others, this argument at least takes a legitimate approach
+ to the subject.  It is based on a valid goal--satisfying the users of
+ software.  And it is empirically clear that people will produce more of
+ something if they are well paid for doing so.
+ 
+ But the economic argument has a flaw: it is based on the assumption
+ that the difference is only a matter of how much money we have to pay.
+ It assumes that "production of software" is what we want, whether the
+ software has owners or not.
+ 
+ People readily accept this assumption because it accords with our
+ experiences with material objects.  Consider a sandwich, for instance.
+ You might well be able to get an equivalent sandwich either free or
+ for a price.  If so, the amount you pay is the only difference.
+ Whether or not you have to buy it, the sandwich has the same taste,
+ the same nutritional value, and in either case you can only eat it
+ once.  Whether you get the sandwich from an owner or not cannot
+ directly affect anything but the amount of money you have afterwards.
+ 
+ This is true for any kind of material object--whether or not it has an
+ owner does not directly affect what it *is*, or what you can do with
+ it if you acquire it.
+ 
+ But if a program has an owner, this very much affects what it is, and
+ what you can do with a copy if you buy one.  The difference is not
+ just a matter of money.  The system of owners of software encourages
+ software owners to produce something--but not what society really
+ needs.  And it causes intangible ethical pollution that affects us
+ all.
+ 
+ What does society need?  It needs information that is truly available
+ to its citizens--for example, programs that people can read, fix,
+ adapt, and improve, not just operate.  But what software owners
+ typically deliver is a black box that we can't study or change.
+ 
+ Society also needs freedom.  When a program has an owner, the users
+ lose freedom to control part of their own lives.
+ 
+ And above all society needs to encourage the spirit of voluntary
+ cooperation in its citizens.  When software owners tell us that
+ helping our neighbors in a natural way is "piracy", they pollute our
+ society's civic spirit.
+ 
+ This is why we say that free software is a matter of freedom, not
+ price.
+ 
+ The economic argument for owners is erroneous, but the economic issue
+ is real.  Some people write useful software for the pleasure of
+ writing it or for admiration and love; but if we want more software
+ than those people write, we need to raise funds.
+ 
+ For ten years now, free software developers have tried various methods
+ of finding funds, with some success.  There's no need to make anyone
+ rich; the median US family income, around $35k, proves to be enough
+ incentive for many jobs that are less satisfying than programming.
+ 
+ For years, until a fellowship made it unnecessary, I made a living
+ from custom enhancements of the free software I had written.  Each
+ enhancement was added to the standard released version and thus
+ eventually became available to the general public.  Clients paid me so
+ that I would work on the enhancements they wanted, rather than on the
+ features I would otherwise have considered highest priority.
+ 
+ The Free Software Foundation, a tax-exempt charity for free software
+ development, raises funds by selling CD-ROMs, tapes and manuals (all
+ of which users are free to copy and change), as well as from
+ donations.  It now has a staff of five programmers, plus three
+ employees who handle mail orders.
+ 
+ Some free software developers make money by selling support services.
+ Cygnus Support, with around 50 employees, estimates that about 15 per
+ cent of its staff activity is free software development--a respectable
+ percentage for a software company.
+ 
+ Companies including Intel, Motorola, Texas Instruments and Analog
+ Devices have combined to fund the continued development of the free
+ GNU compiler for the language C.  Meanwhile, the GNU compiler for the
+ Ada language is being funded by the US Air Force, which believes this
+ is the most cost-effective way to get a high quality compiler.
+ 
+ All these examples are small; the free software movement is still
+ small, and still young.  But the example of listener-supported radio
+ in this country shows it's possible to support a large activity
+ without forcing each user to pay.
+ 
+ As a computer user today, you may find yourself using a proprietary
+ program.  If your friend asks to make a copy, it would be wrong to
+ refuse.  Cooperation is more important than copyright.  But
+ underground, closet cooperation does not make for a good society.  A
+ person should aspire to live an upright life openly with pride, and
+ this means saying "No" to proprietary software.
+ 
+ You deserve to be able to cooperate openly and freely with other
+ people who use software.  You deserve to be able to learn how the
+ software works, and to teach your students with it.  You deserve to be
+ able to hire your favorite programmer to fix it when it breaks.
+ 
+ You deserve free software.
+ 
+ 
+ Copyright 1994 Richard Stallman
+ Verbatim copying and redistribution is permitted
+ without royalty as long as this notice is preserved;
+ alteration is not permitted.
diff -2rcpP --exclude=*.elc emacs-19.30/etc/copying.paper emacs-19.31/etc/copying.paper
*** emacs-19.30/etc/copying.paper	Sat Nov 13 21:57:20 1993
--- emacs-19.31/etc/copying.paper	Thu Jan  4 14:54:41 1996
*************** or may forego use of the program.  When 
*** 224,228 ****
  zero-sum transfer of wealth between two parties.  But each time someone
  chooses to forego use of the program, this harms that person without
! benefitting anyone.  The sum of negative numbers and zeros must be
  negative.
  
--- 224,228 ----
  zero-sum transfer of wealth between two parties.  But each time someone
  chooses to forego use of the program, this harms that person without
! benefiting anyone.  The sum of negative numbers and zeros must be
  negative.
  
diff -2rcpP --exclude=*.elc emacs-19.30/etc/edt-user.doc emacs-19.31/etc/edt-user.doc
*** emacs-19.30/etc/edt-user.doc	Fri Apr 14 13:00:44 1995
--- emacs-19.31/etc/edt-user.doc	Thu Jan  4 14:54:45 1996
*************** VI.   SOME HIGHLIGHTS IN THIS EDT EMULAT
*** 357,363 ****
      edt-user.el customization files.
  
! 14. TPU/EVE's Retangular Cut and Paste functions (originally from the EVE-Plus
      package) are supported.  But unlike the TPU/EVE versions, these here
!     support both insert and overwrite modes.  The seven retangular functions
      are bound to F7, F8, GOLD-F8, F9, GOLD-F9, F10, and GOLD-F10 in the
      default EDT mode.
--- 357,363 ----
      edt-user.el customization files.
  
! 14. TPU/EVE's Rectangular Cut and Paste functions (originally from the EVE-Plus
      package) are supported.  But unlike the TPU/EVE versions, these here
!     support both insert and overwrite modes.  The seven rectangular functions
      are bound to F7, F8, GOLD-F8, F9, GOLD-F9, F10, and GOLD-F10 in the
      default EDT mode.
diff -2rcpP --exclude=*.elc emacs-19.30/etc/emacs.1 emacs-19.31/etc/emacs.1
*** emacs-19.30/etc/emacs.1	Mon Jul 11 16:30:49 1994
--- emacs-19.31/etc/emacs.1	Mon Apr 22 14:48:40 1996
***************
*** 1,3 ****
! .TH EMACS 1 "1994 April 19"
  .UC 4
  .SH NAME
--- 1,3 ----
! .TH EMACS 1 "1995 December 7"
  .UC 4
  .SH NAME
*************** as a batch editor:
*** 113,117 ****
  .TP 8
  .BI \-batch
! Edit in batch mode.  The editor will send messages to stdout.  This
  option must be the first in the argument list.  You must use -l and -f
  options to specify files to execute and functions to call.
--- 113,117 ----
  .TP 8
  .BI \-batch
! Edit in batch mode.  The editor will send messages to stderr.  This
  option must be the first in the argument list.  You must use -l and -f
  options to specify files to execute and functions to call.
*************** so that you can continue using your orig
*** 137,149 ****
  can be started with the following X switches:
  .TP 8
- .BI \-rn " name"
- Specifies the program name which should be used when looking up
- defaults in the user's X resources.  This must be the first option
- specified in the command line.
- .TP 8
  .BI \-name " name"
! Specifies the name which should be assigned to the
  .I Emacs
! window.
  .TP 8
  .B \-r
--- 137,147 ----
  can be started with the following X switches:
  .TP 8
  .BI \-name " name"
! Specifies the name which should be assigned to the initial
  .I Emacs
! window.  This controls looking up X resources as well as the window title.
! .TP 8
! .BI \-title " name"
! Specifies the title for the initial X window.
  .TP 8
  .B \-r
*************** is documented here, but the complete tex
*** 400,427 ****
  manual is included in a convenient tree structured form.
  
! /usr/local/lib/emacs/$VERSION/src - C source files and object files
  
! /usr/local/lib/emacs/$VERSION/lisp - Lisp source files and compiled files
  that define most editing commands.  Some are preloaded;
  others are autoloaded from this directory when used.
    
! /usr/local/lib/emacs/$VERSION/etc - various programs that are used with
  GNU Emacs, and some files of information.
  
! /usr/local/lib/emacs/$VERSION/etc/DOC.* - contains the documentation
  strings for the Lisp primitives and preloaded Lisp functions
  of GNU Emacs.  They are stored here to reduce the size of
  Emacs proper.
  
! /usr/local/lib/emacs/$VERSION/etc/DIFF discusses GNU Emacs vs. Twenex
! Emacs;
  .br
! /usr/local/lib/emacs/$VERSION/etc/CCADIFF discusses GNU Emacs vs. CCA
! Emacs;
! .br
! /usr/local/lib/emacs/$VERSION/etc/GOSDIFF discusses GNU Emacs
! vs. Gosling Emacs.
! .br
! /usr/local/lib/emacs/$VERSION/etc/SERVICE lists people offering
  various services to assist users of GNU Emacs, including education,
  troubleshooting, porting and customization.
--- 398,419 ----
  manual is included in a convenient tree structured form.
  
! /usr/local/share/emacs/$VERSION/src - C source files and object files
  
! /usr/local/share/emacs/$VERSION/lisp - Lisp source files and compiled files
  that define most editing commands.  Some are preloaded;
  others are autoloaded from this directory when used.
    
! /usr/local/share/emacs/$VERSION/etc - various programs that are used with
  GNU Emacs, and some files of information.
  
! /usr/local/share/emacs/$VERSION/etc/DOC.* - contains the documentation
  strings for the Lisp primitives and preloaded Lisp functions
  of GNU Emacs.  They are stored here to reduce the size of
  Emacs proper.
  
! /usr/local/share/emacs/$VERSION/etc/OTHER.EMACSES discusses GNU Emacs
! vs. other versions of Emacs.
  .br
! /usr/local/share/emacs/$VERSION/etc/SERVICE lists people offering
  various services to assist users of GNU Emacs, including education,
  troubleshooting, porting and customization.
*************** programs in the Emacs Lisp extension lan
*** 431,441 ****
  documented.
  
! /usr/local/lib/emacs/lock - holds lock files that are made for all
  files being modified in Emacs, to prevent simultaneous modification
  of one file by two users.
- 
- /usr/local/lib/emacs/$VERSION/$ARCHITECTURE/cpp - the GNU cpp, needed
- for building Emacs on certain versions of Unix where the standard cpp
- cannot handle long names for macros.
  
  .\" START DELETING HERE IF YOU'RE NOT USING X
--- 423,429 ----
  documented.
  
! /usr/local/com/emacs/lock - holds lock files that are made for all
  files being modified in Emacs, to prevent simultaneous modification
  of one file by two users.
  
  .\" START DELETING HERE IF YOU'RE NOT USING X
diff -2rcpP --exclude=*.elc emacs-19.30/etc/emacs.bash emacs-19.31/etc/emacs.bash
*** emacs-19.30/etc/emacs.bash	Sat May  1 09:25:30 1993
--- emacs-19.31/etc/emacs.bash	Fri May  3 16:56:39 1996
*************** function edit ()
*** 36,40 ****
   else   
      if jobs %emacs 2> /dev/null ; then
!        echo "$(pwd)" "$@" > ${HOME}/.emacs_args && fg %emacs
      else
         emacs "$@"
--- 36,40 ----
   else   
      if jobs %emacs 2> /dev/null ; then
!        echo "$(pwd)" "$@" >| ${HOME}/.emacs_args && fg %emacs
      else
         emacs "$@"
diff -2rcpP --exclude=*.elc emacs-19.30/etc/emacstool.1 emacs-19.31/etc/emacstool.1
*** emacs-19.30/etc/emacstool.1	Wed Jun  9 06:55:47 1993
--- emacs-19.31/etc/emacstool.1	Thu Jan  4 14:54:47 1996
*************** the tty subwindow, which is typically GN
*** 18,22 ****
  allows GNU Emacs users to make full use of the mouse and function keys.
  GNU Emacs can be loaded with functions to interpret the mouse and
! function-key events to make a truely fine screen oriented editor for
  the Sun Workstation.
  .PP
--- 18,22 ----
  allows GNU Emacs users to make full use of the mouse and function keys.
  GNU Emacs can be loaded with functions to interpret the mouse and
! function-key events to make a truly fine screen oriented editor for
  the Sun Workstation.
  .PP
diff -2rcpP --exclude=*.elc emacs-19.30/etc/enriched.doc emacs-19.31/etc/enriched.doc
*** emacs-19.30/etc/enriched.doc	Fri Apr  7 15:51:18 1995
--- emacs-19.31/etc/enriched.doc	Thu Jan  4 14:54:52 1996
*************** face, which is the same as the `italic' 
*** 169,173 ****
  </indent></bold></x-color></x-bg-color><indent>
  
! Enriched-mode docuemnts are saved in an extended version of a
  format called <italic>text/enriched</italic>, which is defined as part of the MIME
  standard.  This means that your documents are transportable (even
--- 169,173 ----
  </indent></bold></x-color></x-bg-color><indent>
  
! Enriched-mode documents are saved in an extended version of a
  format called <italic>text/enriched</italic>, which is defined as part of the MIME
  standard.  This means that your documents are transportable (even
diff -2rcpP --exclude=*.elc emacs-19.30/etc/etags.1 emacs-19.31/etc/etags.1
*** emacs-19.30/etc/etags.1	Thu Jun 22 16:56:48 1995
--- emacs-19.31/etc/etags.1	Mon Apr 22 11:54:18 1996
*************** etags, ctags \- generate tag file for Em
*** 35,39 ****
  .SH DESCRIPTION
  The `\|\fBetags\fP\|' program is used to create a tag table file, in a format
! understood by 
  .BR emacs ( 1 )\c
  \&; the `\|\fBctags\fP\|' program is used to create a similar table in a
--- 35,39 ----
  .SH DESCRIPTION
  The `\|\fBetags\fP\|' program is used to create a tag table file, in a format
! understood by
  .BR emacs ( 1 )\c
  \&; the `\|\fBctags\fP\|' program is used to create a similar table in a
*************** format understood by
*** 41,49 ****
  .BR vi ( 1 )\c
  \&.  Both forms of the program understand
! the syntax of C, C++, Fortran, Pascal, LaTeX, Scheme, Emacs Lisp/Common Lisp
! and most assembler\-like syntaxes. 
  Both forms read the files specified on the command line, and write a tag
  table (defaults: `\|TAGS\|' for \fBetags\fP, `\|tags\|' for
! \fBctags\fP) in the current working directory. 
  The programs recognize the language used in an input file based on its
  file name and contents.  The --language switch can be used to force
--- 41,53 ----
  .BR vi ( 1 )\c
  \&.  Both forms of the program understand
! the syntax of C, C++, Fortran, Pascal, LaTeX, Scheme,
! Emacs Lisp/Common Lisp, Erlang, Prolog and most assembler\-like syntaxes.
  Both forms read the files specified on the command line, and write a tag
  table (defaults: `\|TAGS\|' for \fBetags\fP, `\|tags\|' for
! \fBctags\fP) in the current working directory.
! Files specified with relative file names will be recorded in the tag
! table with file names relative to the directory where the tag table
! resides.  Files specified with absolute file names will be recorded
! with absolute file names.
  The programs recognize the language used in an input file based on its
  file name and contents.  The --language switch can be used to force
*************** parsing based on language.  May be freel
*** 103,107 ****
  and the \fB\-R\fP option.  The regexps are cumulative, i.e. each
  option will add to the previous ones.  The regexps are of the form:
! .br 
  
  		\fB/\fP\fItagregexp\fP[\fB/\fP\fInameregexp\fP]\fB/\fP
--- 107,111 ----
  and the \fB\-R\fP option.  The regexps are cumulative, i.e. each
  option will add to the previous ones.  The regexps are of the form:
! .br
  
  		\fB/\fP\fItagregexp\fP[\fB/\fP\fInameregexp\fP]\fB/\fP
*************** It should not match useless characters. 
*** 112,116 ****
  such that more characters than needed are unavoidably matched by
  \fItagregexp\fP, it may be useful to add a \fInameregexp\fP, to
! narrow down the tag scope.
  .br
  Here are some examples.  All the regexps are quoted to protect them
--- 116,121 ----
  such that more characters than needed are unavoidably matched by
  \fItagregexp\fP, it may be useful to add a \fInameregexp\fP, to
! narrow down the tag scope.  \fBctags\fP ignores regexps without a
! \fInameregexp\fP. 
  .br
  Here are some examples.  All the regexps are quoted to protect them
*************** emacs \fBetags\fP is shipped with).
*** 195,199 ****
  .SH "SEE ALSO"
  `\|\fBemacs\fP\|' entry in \fBinfo\fP; \fIGNU Emacs Manual\fP, Richard
! Stallman. 
  .br
  .BR cxref ( 1 ),
--- 200,204 ----
  .SH "SEE ALSO"
  `\|\fBemacs\fP\|' entry in \fBinfo\fP; \fIGNU Emacs Manual\fP, Richard
! Stallman.
  .br
  .BR cxref ( 1 ),
diff -2rcpP --exclude=*.elc emacs-19.30/etc/future-bug emacs-19.31/etc/future-bug
*** emacs-19.30/etc/future-bug	Wed Dec 31 19:00:00 1969
--- emacs-19.31/etc/future-bug	Mon Apr 15 23:26:42 1996
***************
*** 0 ****
--- 1,37 ----
+ Date: Tue, 23 Feb 1999 21:03:50 -0600
+ From: Karl Fogel <kfogel@floss.cyclic.com>
+ To: bug-gnu-emacs@prep.ai.mit.edu
+ Subject: M-x search-backward-in-time broken...
+ X-Windows: you'll envy the dead.
+ 
+ In GNU Emacs 22.70.4 (i586-unknown-linuxoldld, X toolkit) of Sat Feb  20 1999 on floss
+ configured using `configure  --with-x-toolkit=yes'
+ 
+         The `search-backward-in-time' function appears to be broken in
+ Emacs 22.70.  
+ 
+         Unfortunately, I can never seem to start the debugger early
+ enough to catch the error as it happens.  However I have traced the
+ problem through source by eye, and it looks like `time-forward' can't
+ handle negative arguments anymore.  This is consistent with other
+ symptoms: for example, `undo' (which since 22.25 has worked by passing
+ a negative arg to `time-forward') is also broken.  However, `do' still
+ works -- it seems that `time-forward' continues to handle positive
+ arguments just fine.
+ 
+         No one here-and-now can figure out how to fix the problem,
+ because the code for `time-forward' is so hairy.  We're using M-x
+ report-future-emacs-bug to request that you folks include more
+ comments when you write it (sometime in 1998 as I recall).
+ 
+         Thanks!
+ 
+ -Karl Fogel   <kfogel@red-bean.com>
+ 
+ 
+ P.S. You'll be pleased to know that since (time-forward N) still works
+      for N >= 0, we've used it to pre-emptively update configure.in.
+      Emacs now configures and builds on every platform that will ever
+      be made.  It wasn't easy, but at least that's one problem out of
+      the way for good.  If you'd like the patch, just ask.
+ 
diff -2rcpP --exclude=*.elc emacs-19.30/etc/gnus-tut.txt emacs-19.31/etc/gnus-tut.txt
*** emacs-19.30/etc/gnus-tut.txt	Sat Nov  4 02:59:55 1995
--- emacs-19.31/etc/gnus-tut.txt	Thu Jan  4 14:54:56 1996
*************** with a shotgun.
*** 125,129 ****
  nnmbox uses a Unix mail box to store mail. Nice, but slow.
  
! nnmh uses mh-e folders, which is also a one-file-one-mail thingie, but
  slower than nnml. (It doesn't support NOV files.)
  
--- 125,129 ----
  nnmbox uses a Unix mail box to store mail. Nice, but slow.
  
! nnmh uses mh-e folders, which is also a one-file-one-mail thingy, but
  slower than nnml. (It doesn't support NOV files.)
  
*************** remove all hihit code from all the Gnus 
*** 192,196 ****
  `gnus-summary-article-hook').  (Well, at the very least the first
  two.)  Gnus provides various integrated functions for highlighting,
! which are both faster and more accurated.
  
  There is absolutely no chance, whatsoever, of getting Gnus to work
--- 192,196 ----
  `gnus-summary-article-hook').  (Well, at the very least the first
  two.)  Gnus provides various integrated functions for highlighting,
! which are both faster and more accurate.
  
  There is absolutely no chance, whatsoever, of getting Gnus to work
*************** Message-ID: <lars-doc7@eyesore.no>
*** 205,209 ****
  
  If you want to report a bug, please type `M-x gnus-bug'. This will
! give me a precice overview of your Gnus and Emacs version numbers,
  along with a look at all Gnus variables you have changed.
  
--- 205,209 ----
  
  If you want to report a bug, please type `M-x gnus-bug'. This will
! give me a precise overview of your Gnus and Emacs version numbers,
  along with a look at all Gnus variables you have changed.
  
diff -2rcpP --exclude=*.elc emacs-19.30/etc/ledit.l emacs-19.31/etc/ledit.l
*** emacs-19.30/etc/ledit.l	Wed Apr 17 19:47:24 1985
--- emacs-19.31/etc/ledit.l	Thu Jan  4 14:54:58 1996
***************
*** 57,61 ****
  ;;; LEDIT-OUTPUT
  ;;; Egad, what a mess!  Doesn't work for XEMACS yet.
! ;;; Here's an example from Moclisp:
  ;;; -> (defun bar (nothing) (bar nothing))
  ;;; bar
--- 57,61 ----
  ;;; LEDIT-OUTPUT
  ;;; Egad, what a mess!  Doesn't work for XEMACS yet.
! ;;; Here's an example from Mocklisp:
  ;;; -> (defun bar (nothing) (bar nothing))
  ;;; bar
diff -2rcpP --exclude=*.elc emacs-19.30/etc/news.texi emacs-19.31/etc/news.texi
*** emacs-19.30/etc/news.texi	Sat Mar 19 02:05:00 1994
--- emacs-19.31/etc/news.texi	Thu Jan  4 14:55:11 1996
*************** There are new escape sequences for use i
*** 43,49 ****
  constants.  The escape sequence @samp{\a} is equivalent to @samp{\C-g},
  the @sc{ASCII} @sc{BEL} character (code 7).  The escape sequence
! @samp{\x} followed by a hexidecimal number represents the character
  whose @sc{ASCII} code is that number.  There is no limit on the number
! of digits in the hexidecimal value.
  
  @item
--- 43,49 ----
  constants.  The escape sequence @samp{\a} is equivalent to @samp{\C-g},
  the @sc{ASCII} @sc{BEL} character (code 7).  The escape sequence
! @samp{\x} followed by a hexadecimal number represents the character
  whose @sc{ASCII} code is that number.  There is no limit on the number
! of digits in the hexadecimal value.
  
  @item
*************** set, you can arrange to use that charact
*** 1864,1869 ****
  
  @example
! (require 'disp-table)
! (standard-display-8bit 0 255)
  @end example
  
--- 1864,1868 ----
  
  @example
! (standard-display-european 1)
  @end example
  
*************** including the letter @samp{p} in the syn
*** 3045,3049 ****
  
  These characters are treated as whitespace when they appear between
! expressions.  When they appear withing an expression, they are handled
  according to their usual syntax codes.
  
--- 3044,3048 ----
  
  These characters are treated as whitespace when they appear between
! expressions.  When they appear within an expression, they are handled
  according to their usual syntax codes.
  
*************** currently being displayed in windows may
*** 3190,3194 ****
  other buffers not visible.  Normally, @code{other-buffer} returns a
  currently visible buffer only as a last resort, if there are no suitable
! nonvisible buffers.
  
  @item
--- 3189,3193 ----
  other buffers not visible.  Normally, @code{other-buffer} returns a
  currently visible buffer only as a last resort, if there are no suitable
! invisible buffers.
  
  @item
diff -2rcpP --exclude=*.elc emacs-19.30/etc/refcard.ps emacs-19.31/etc/refcard.ps
*** emacs-19.30/etc/refcard.ps	Wed Jun  9 14:06:57 1993
--- emacs-19.31/etc/refcard.ps	Thu Mar 21 22:35:11 1996
***************
*** 1,1624 ****
  %!PS-Adobe-2.0
! %%Creator: dvipsk 5.512a Copyright 1986, 1993 Radical Eye Software
  %%Title: refcard.dvi
  %%Pages: 6
  %%PageOrder: Ascend
! %%BoundingBox: 0 0 612 792
  %%EndComments
! %DVIPSCommandLine: dvips -r0 -s -F -Z -D 1016 -o refcard.ps refcard.dvi
! %DVIPSSource:  TeX output 1993.06.09:1802
! /SafetyEnclosure save def
  %%BeginProcSet: texc.pro
! /TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N /X{S N}
! B /TR{translate}N /isls false N /vsize 11 72 mul N /@rigin{isls{[0 -1 1 0 0 0]
! concat}if 72 Resolution div 72 VResolution div neg scale isls{Resolution hsize
! -72 div mul 0 TR}if Resolution VResolution vsize -72 div 1 add mul TR matrix
! currentmatrix dup dup 4 get round 4 exch put dup dup 5 get round 5 exch put
! setmatrix}N /@landscape{/isls true N}B /@manualfeed{statusdict /manualfeed
! true put}B /@copies{/#copies X}B /FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N
! /IE 0 N /ctr 0 N /df-tail{/nn 8 dict N nn begin /FontType 3 N /FontMatrix
! fntrx N /FontBBox FBB N string /base X array /BitMaps X /BuildChar{
! CharBuilder}N /Encoding IE N end dup{/foo setfont}2 array copy cvx N load 0 nn
! put /ctr 0 N[}B /df{/sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0
! 0 sf neg 0 0]N df-tail}B /E{pop nn dup definefont setfont}B /ch-width{ch-data
! dup length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{128
! ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub get 127
! sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data dup type
! /stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N /rc 0 N /gp 0 N
! /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup /base get 2 index get
! S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx 0 ch-xoff ch-yoff ch-height
! sub ch-xoff ch-width add ch-yoff setcachedevice ch-width ch-height true[1 0 0
! -1 -.1 ch-xoff sub ch-yoff .1 add]/id ch-image N /rw ch-width 7 add 8 idiv
! string N /rc 0 N /gp 0 N /cp 0 N{rc 0 ne{rc 1 sub /rc X rw}{G}ifelse}
! imagemask restore}B /G{{id gp get /gp gp 1 add N dup 18 mod S 18 idiv pl S get
! exec}loop}B /adv{cp add /cp X}B /chg{rw cp id gp 4 index getinterval
! putinterval dup gp add /gp X adv}B /nd{/cp 0 N rw exit}B /lsh{rw cp 2 copy get
! dup 0 eq{pop 1}{dup 255 eq{pop 254}{dup dup add 255 and S 1 and or}ifelse}
! ifelse put 1 adv}B /rsh{rw cp 2 copy get dup 0 eq{pop 128}{dup 255 eq{pop 127}
! {dup 2 idiv S 128 and or}ifelse}ifelse put 1 adv}B /clr{rw cp 2 index string
! putinterval adv}B /set{rw cp fillstr 0 4 index getinterval putinterval adv}B
! /fillstr 18 string 0 1 17{2 copy 255 put pop}for N /pl[{adv 1 chg}{adv 1 chg
! nd}{1 add chg}{1 add chg nd}{adv lsh}{adv lsh nd}{adv rsh}{adv rsh nd}{1 add
! adv}{/rc X nd}{1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]dup{
! bind pop}forall N /D{/cc X dup type /stringtype ne{]}if nn /base get cc ctr
! put nn /BitMaps get S ctr S sf 1 ne{dup dup length 1 sub dup 2 index S get sf
! div put}if put /ctr ctr 1 add N}B /I{cc 1 add D}B /bop{userdict /bop-hook
! known{bop-hook}if /SI save N @rigin 0 0 moveto /V matrix currentmatrix dup 1
! get dup mul exch 0 get dup mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N
! /eop{SI restore showpage userdict /eop-hook known{eop-hook}if}N /@start{
! userdict /start-hook known{start-hook}if pop /VResolution X /Resolution X 1000
! div /DVImag X /IE 256 array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}
! for 65781.76 div /vsize X 65781.76 div /hsize X}N /p{show}N /RMat[1 0 0 -1 0 0
! ]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X /rulex X V}B /V{}B /RV
! statusdict begin /product where{pop product dup length 7 ge{0 7 getinterval
! dup(Display)eq exch 0 4 getinterval(NeXT)eq or}{pop false}ifelse}{false}
! ifelse end{{gsave TR -.1 -.1 TR 1 1 scale rulex ruley false RMat{BDot}
! imagemask grestore}}{{gsave TR -.1 -.1 TR rulex ruley scale 1 1 false RMat{
! BDot}imagemask grestore}}ifelse B /QV{gsave transform round exch round exch
! itransform moveto rulex 0 rlineto 0 ruley neg rlineto rulex neg 0 rlineto fill
! grestore}B /a{moveto}B /delta 0 N /tail{dup /delta X 0 rmoveto}B /M{S p delta
! add tail}B /b{S p tail}B /c{-4 M}B /d{-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{
! 1 M}B /i{2 M}B /j{3 M}B /k{4 M}B /w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p
! -2 w}B /o{p -1 w}B /q{p 1 w}B /r{p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}
! B /y{3 2 roll p a}B /bos{/SS save N}B /eos{SS restore}B end
  %%EndProcSet
! TeXDict begin 40258431 52099146 1000 1016 1016 (refcard.dvi)
! @start /Fa 1 59 df<EA07C0EA1FF0EA3FF8EA7FFCA2EAFFFEA5EA7FFCA2EA3FF8EA1FF0EA07
! C00F0F748E27>58 D E /Fb 19 122 df<003FB612E05AA2B7FCA216C0A26C1580230874A132>
! 45 D<ED0FF0ED7FFE4AB513F0913A07FC1F81F8913A1FF007C3FC91393FC003E791387F80014A
! C712FF49485D4948147F495A010F153F49485D495A137F5C01FF5E485BA24890C8127F605A5B00
! 0F16FF60485AA25E003F94C7FC5BA25E007F5E5BA216075F5B12FF160F4D136019F05B161FEFF0
! 01007F18E0A2043F1303047F14C017E0003F15FF4B14076D491580001F03DF130FDB079F14006C
! 6CEB1F1F0007DA3E0F131E6C6C017C143E3C01FC01F807F03C3C00FE0FF003F8F8903B7FFFC001
! FFF0011F90C75BD907FCEC3FC03C3F71BD48>97 D<EC07E0EB1FFF0003B5FCA35DEA00031300A2
! 5DA25BA292C9FCA35B5CA313075CA3130F5CA3131F5CA3133F5CA3017FEB0FF09138C07FFE02C1
! B5FC9139C3F83FC0903AFFCFC00FE04AC66C7E14BE02FC6D7E4849805C4A6D7E5C48498091C7FC
! A25B000717805BA3120F5BA25E121F5BA25E003F17005BA25E007F5E5BA2161F5F485A5F163FA2
! 5F167F90C85B16FF5F6C5E5D94C7FC6D495A4B5A003F5D150F001F4A5A6D495A000F4A5A6D49C8
! FC0007495A3903F007FC3901FC1FF06CB55A013F90C9FCEB0FF8316370E141>I<ED03FF033F13
! E092B512F80203EB01FC91390FF8003EDA1FE07FDA7FC0EB0F804A4813074948C713C04948141F
! 4948147F010F15FF49485B495A495A13FF4849158018004890C85A48167C4992C7FC120F5B121F
! A2485AA3127F5BA312FF5BA45BA75BEF0180EF03C06D1507007FEE0F80EF1F00173E003F167E6D
! 5D001FED01F0000FED07E06D4A5A6C6CEC3F806C6C02FEC7FC6C6CEB07FC3A007F807FF06DB512
! 80010F49C8FC010113C0323F70BD41>I<193F95B5FC171FA319FEEF001F1807A219FCA2180FA2
! 19F8A2181FA219F0A2183FA219E0A2187FA219C0A218FFA21980A25FA21900A25FED0FF0DB7FFE
! 5B4AB5FC913907FC1F8791391FF007C7913A3FC003E7FC91387F80014AC712FF495A49486E5A49
! 5A010F153F495A49485D137F5C13FF48495DA24890C8127FA2485F5B000F16FFA248485EA25E12
! 3F4993C7FCA25E127F495DA21607A2495D12FF160F19604D13F05B161F1801007F04F013E0A204
! 3F1303047F14C017E0003F15FF4B14076D491580001F03DF130FDB079F14006C6CEB1F1F0007DA
! 3E0F131E6C6C017C143E3C01FC01F807F03C3C00FE0FF003F8F8903B7FFFC001FFF0011F90C75B
! D907FCEC3FC0406371E148>I<ED03FF033F13C04AB512F00207EB03F891391FF8007CDA3FE07F
! DAFF807F4990C7FC4948EC0F80495A495A495A495A137F495A4849141F18004890C8FC485E4915
! 7E000F5E4C5A4848EC07F0EE1FE0003FEDFFC049010F90C7FC01F9B512FC48B612E04BC8FC0280
! C9FC01F0CAFCA3485AA55BA6127FEF0180EF03C01707003FEE0F80EF1F006D153E001F167E5F6C
! 6CEC01F0EE07E06C6C4A5A0003ED3F806C6C02FEC7FC6C6CEB07FC90397F807FF0011FB5128001
! 0749C8FC010113C0323F70BD41>I<EE1FE0EEFFFC03039038FE01E0923A0FF83F03F0923A3FE0
! 0F87F892397F8003CFDBFF0013EF4A48EB01FF4A5A4A486D13F04A5A021F157F4A5A4A4815E014
! FF5D5B4990C813C0A2494815FFA2010F17805C011F5DA249481600A25F137F4A5DA2170713FF4A
! 5DA2170FA24A5DA2171FA2605C173FA260177FA2017F15FF4C5B80013F5C5E011F4A5B6E5B010F
! 5C6D6C13FD902703F803F190C7FC903901FE0FE16DB51283023F1303DA0FF85B91C7FC1607A25F
! A2160FA25FA2161F5FA2163FD80F805D486C147F486C5D486C4A5A5D484892C8FC4B5A4B5A49EB
! 1FF049495A6CC7B45A263FE00790C9FC6CB512FC000714E0C66C90CAFC3D5A78BD41>103
! D<153F91B5FC131FA35DEB001F1407A25DA2140FA25DA2141FA25DA2143FA25DA2147FA25DA214
! FFA25DA25BA292CAFCA25BEE1FF84A90B5FC030314C0010790390FF03FE092391F800FF0913AFC
! 7E0007F815F890260FFDF06D7EECFFE05D4B804990C7FC5CA25C495AA25CA249481407605CA201
! FF150F605CA248161F6091C8FC173F485FA25B177F00075F17FF495EA2000F5DF0000649170F5E
! 001F4C131F191E4914075F003F183C160F494B137C1978127F4D13F05BF001E000FF1703040714
! C049EE07800403EB1F00933801F87E90C9B45A48705A003CEE1FC0406375E148>I<151FED7F80
! EDFFC05CA4168016006E5A157C92C7FCB3A2EB03F8EB0FFEEB3FFF90387E1F809038F80FC0D801
! F07FEA03E001C07FEA0780120F13005A001E131FA25A143F007C5C1278147F5D00F813FF485C12
! 70C65A92C7FCA25B5CA213075C130F5CA2131F5CA2133F5C137F9138C00180ED03C013FFEC8007
! 16805A1400ED0F005A495B151EA2495BA25D15F800015C4A5A0000EB07C090387E1F806DB4C7FC
! 6D5AEB07F0225E74DC2B>I<15FCEB03FF137FA315F8EB007F141FA215F0A2143FA215E0A2147F
! A215C0A214FFA21580A25BA21500A25BA25CA21307A25CA2130FA25CA2131FA25CA2133FA25CA2
! 137FA25CA213FFA25CA25AA291C7FCA25AA25BA21207A25BA2120FA25BA2121FA25BA2123FEC01
! 809038E003C0A2127F140701C01380A2140F00FF14001380A25C141E007F133E143CA2003F5B14
! F86C6C5A380FE3E06CB45A6C5BC690C7FC1E6373E124>108 D<D91FC0DA7FE0EC07FED97FF090
! 2603FFFC91383FFFC0496C010F01FF91B512F02601F0FCD93FC0903A8003FC0FF82603E07E903D
! 7E003FC007E003FC2807C07F01F8903B1FE01F8001FE0180D983E0ED3E00000FDA87C06D6C486D
! 7E9027003F8F805D48D97FDFC7EBF1F0001E02FEDBFBE0814B5E003E4AEDFF80123C4B93C8FC4A
! 485D127C00784A5DA200F84A4A485C484899C7FC92C85B12700000053F5D49634A5EA2067F1507
! 0107634A5E1C0F06FF5E130F4A5E1C1F4D5F011F1A3F4A93C85BA24D167F013F9838C001804A4B
! EF03C01CFF0507EF8007017F1D804A4B5C1D00050FF00F0001FF614A4B4B5B1E1E171F48515B91
! C85B66053F18F84808015C494C4C5A0900EB07C099387E1F80494C6FB4C7FC494C6F5AC648030F
! C9EA07F06A3F74BD73>I<D91FC0EC7FE0D97FF0903803FFFC496C010F13FF2601F0FCD93FC07F
! 2603E07E90397E003FC02807C07F01F86D7E0180EB83E0000FDA87C06D7E9039003F8F8048D97F
! DFC7FC001E02FE815D003E5C123C5D4A5A127C00785CA200F84A141F48485F92C8FC1270000017
! 3F495F5CA2187F01075F5C18FF61130F5C5F96C7FC011F5D4A5DA21707013F4C13184A173C170F
! 4E137C017F18784A141F601AF001FF153F4AEDE0011AE0A2489438C003C091C8FCF10780190F48
! 041F140049171E050F137C943807E1F8496FB45A496F5BC6486F6CC7FC463F74BD4F>I<ED03FF
! 033F13E092B512F80203EB03FE91390FF800FFDA1FE0EB3F80DA7FC0EB1FC04AC713E04948EC0F
! F0495A4948EC07F8130F494815FC495A4948EC03FE13FF485BA24890C8FC4817FF5B120F495D12
! 1FA2485AA2EF0FFE127F5BA2171F00FF17FC5BA2173F18F85BEF7FF0A218E017FF18C0A2494A13
! 80A24C13006D4A5A007F5E4C5A161F003F5E6D4A5A001F4B5A000F4B5A6D4948C7FC6C6CEB07FC
! 6C6C495A6C6CEB3FE03A007F81FF806DB448C8FC010F13F801011380383F70BD48>I<DA07F0EC
! 7F80DA1FFC903803FFF04A6C010F7FDA7C3F90381FC1FE913BF81F807E007FD901F0D9C0F8EB3F
! 8002E0EBE1F00103DAE3E0EB1FC09127C00FE7C014E0010749B45A028091C7EA0FF05E010F4A15
! F802005BA24B5A494A15FC131EA2013E137F133C5E131C90C700FF151FA25EA24A163F1AF893C8
! FCA24A167F1AF05DA2020716FF1AE05D1AC0020F5DA24B168060021F1700604B5D61023F150F61
! 4E5A4E5A4A6C5D187F4E5A6F4990C7FC02FF4A5A03DEEB07F8038F495A9338803FE049903987E0
! FF800383B5C8FC030013F8EE3FC04991CAFCA25CA21307A25CA2130FA25CA2131FA25CA2133FA2
! 5CA2137F3801FFF8007FEBFFF8B67E5DA246597EBD48>I<D91FC0EB03FFD97FF0011F13E0496C
! 017F13F82601F0FC9038FE03FC3C03E07E01F0007E3A07C07F03E001809039878001FF000F9138
! 8F00039026003F9E5B48EB7FFE001E5C5D003E4A14FE003C17FC4BEB03F802FFEC01F0007C4A90
! C7FC12785D12F8485A92C9FC127012005B5CA313075CA3130F5CA3131F5CA3133F5CA3137F5CA3
! 13FF5CA35A91CAFCA35A5BA35B5BC65A383F74BD3B>114 D<ED1FF892B5FC020314C091390FF8
! 0FE091391FC001F04AC712F8027E147C4A143C4948141E13034A147E0107EC01FEA249481303A3
! 011F15FCEE01F8EE00F06E1400A28014FEECFFC015FE6DEBFFC016F06D80826D806D806D158002
! 3F14C0140FEC007F030713E0150181167F163FA2D80780141FEA1FE0487E17C0127FA2163F4848
! 1580A249EC7F0090C8FC007815FE5E007C4A5A003C4A5A6C4A5AD81F80EB1FC0D80FE0EB7F8027
! 03FC03FFC7FC6CB512FC6C6C13E0010F90C8FC2F3F75BD39>I<15F0EC03F84A7EA2140FA25DA2
! 141FA25DA2143FA25DA2147FA25DA214FFA25DA25BA2B712FC16FEA216FC260003FEC7FCA21307
! A25CA2130FA25CA2131FA25CA2133FA25CA2137FA25CA213FFA25CA25AA291C8FCA25AA25BA212
! 0716604914F0A2000F140116E049130316C01507001F158049130F16005D151E000F5C157C5D00
! 07495A4A5A6C6C485A3901FC3F802600FFFEC7FC6D5AEB1FE0275872D62F>I<EB03F8D90FFEED
! 03C0D93FFFED07F090267E1F80140F9026F80FC0141FD801F07FEA03E001C06D143FEA0780000F
! 60130048177F001E131F615A023F15FF007C5C007860147F4B5B00F813FF484A92C7FC1270C648
! 5D92C7FC605B4A1407A201075E5C170F130F4A5DA2171F131F4A5DA2173F013FEF01804A9238E0
! 03C0A2177F190706C01380A24A160F05FF14001880A24C5C6E49141E011F173E4C143C010FEC0F
! 7F6ED91E3F5B0107027C14F86D6C496C6C5A903C01FE07F00FE3E06DB5486CB45A023FD980035B
! DA07FCC790C7FC423F74BD4B>I<EB03F8D90FFEED03C0D93FFFED07F090267E1F80140F9026F8
! 0FC0141FD801F07FEA03E001C06D143FD8078017E0120F130048177F001E011F16C0A25A023F15
! FF007C4A15801278147F4B5B00F801FF1600485C1270C6485D92C75BA25B4A14076013075C170F
! 010F5E5CA2171F011F5E5CA2173F013F5E5CA2177F60A34A14FF60A35E6E4990C7FC131F5E010F
! 5C6E495A0107147F6D6C13FB903901FE07F76DB5EAE7FC023F1387913807FC0791C7120F5FA34C
! 5AA24C5AEA03F0486C4A5A120F486C4A5AA24B90C8FC48485C4B5A49495A5B49495A001EC7485A
! 4B5A001F4AC9FC390F8001FE3907C007FC3903F01FF06CB512C06C91CAFCEB1FF03C5A74BD44>
! 121 D E /Fc 1 14 df<EF7FFE040FB512F093B7FC030316C0031F16F8037FD9C00313FE912601
! FFF8C7381FFF804A018002017FDA0FFEC9EA7FF0DA1FF0EE0FF8DA7FC0EE03FE4A48707E4948CB
! 6C7E4948727ED907F0F00FE04948727E4948727E4948727E49CD7E017E1A7E49864848F21F80A2
! 4848F20FC0491A0700071CE04848F203F0A2491A01001F1CF890CFFC481CFC003E1C7CA2007E1C
! 7E007C1C3EA400FC1C3F481C1FAB6C1C3F007C1C3EA4007E1C7E003E1C7CA2003F1CFC6C1CF86D
! 1A01000F1CF06D1A03A26C6CF207E000031CC06D1A0F6C6CF21F80A26C6CF23F00017E1A7E017F
! 1AFE6D6C4E5A6D6C4E5A6D6C4E5A6D6C4E5AD903FCF03FC06D6C4E5A6D6C6C4C48C7FC6E6C4C5A
! DA1FF0EE0FF8DA0FFEEE7FF0912603FF80913801FFC06E01F8021F5B912A007FFFC003FFFEC8FC
! 031F90B612F8030316C0030093C9FC040F14F09326007FFECAFC605B78C570>13
! D E /Fd 45 122 df<121FEA3F80EA7FC0EAFFE0A313F0A2127F123FEA1F701200A413F013E0A2
! 1201A213C0120313801207EA0F00121E123E5A127812300C1E768A20>44
! D<B612F0A71C077E9726>I<121FEA3F80EA7FC0EAFFE0A5EA7FC0EA3F80EA1F000B0B768A20>I<
! EC3FE0903803FFFE010F6D7E90391FE03FC090397F800FF09039FE0003F848486D7E48486D7E49
! 147E0007157F4848EC3F80A24848EC1FC0A3003F16E0A34848EC0FF0A600FF16F8B3A2007F16F0
! A46D141F003F16E0A3001F16C0A26D143F000F1680A26C6CEC7F000003157E6D14FE6C6C495A6C
! 6C495A90397F800FF090391FE03FC06DB55A010349C7FC9038003FE02D437BC038>48
! D<143C147C14FC1303130F13FFB5FCA213F313031200B3B3AD497E497EB712E0A4234175C038>
! I<903801FFC0010F13F8013F13FF90B612C02601FC037F3A03E0007FF8D80F80EB1FFC90C76C7E
! 001E6E7E488000386E1380127800706E13C0127EB47E6DEC7FE0A66C5A001EC8FCC9FCEEFFC0A3
! 4B1380A24B13005E4B5A150F5E4B5AED3FC04B5A4BC7FC4A5A4A5AEC07F04A5A4A5A4AC8FC147E
! 5C495A494814E0EB07C0495A49C7EA01C0133E5B5B48481403EA03C04848EC078048B7FC5A5A5A
! B8FC1700A32B417AC038>I<ECFFC0010F13FC013F13FFD9FF0013C0D801F8EB3FE0D803E06D7E
! D807806D7E48C76C7E6D80D81FE013036D80A27FA25BA26C5AEA0380C8485AA25E150F5E4B5AA2
! 4B5AED7F804BC7FCEC07FC903807FFF015C015FC90C7B4FCED3FC0ED1FF06F7E6F7E6F7E826F13
! 80A217C08117E0A3121EEA7F80A2487EA317C05D5B007EC7148000785C007C16006C4A5A6C4A5A
! 6C6C495AD807F0495AD803FEEBFFE0C6B61280013F49C7FC010F13F8010013C02B437AC038>I<
! 0003150C01E0147C01FFEB0FFC91B55A5E5E5E93C7FC5D15F815C0D987FEC8FC0180C9FCACEC3F
! E0903881FFFC018713FF90399FE03FC09039BF000FE001FCEB07F801F06D7E491301496D7E826C
! 4880C91380A217C0163FA217E0A5123EEA7F8012FFA317C0167F90C8FC00FC168012700078EDFF
! 007E4B5A6C4A5AD81F80495A6C6C495AD807F0495AD801FEEBFFC06CB6C7FC013F13FC010F13F0
! 010113802B437AC038>53 D<4AB4FC020F13E0027F13F84948C67ED903F8133ED90FE0130F495A
! 4948EB3F8049C7127F01FE14FF12015B485A0007ED7F00163E484891C7FCA2485AA2123FA3485A
! A2EC3FF8ECFFFED8FFC16D7E9039C3C01FE09039C7000FF001CE6D7E01DC6D7E6F7E13F8496D7E
! 1780A249EC7FC0A317E05BA3127FA66C7EA217C0121FA2000FEDFF807F000716006D495A12036D
! 495A6C6C495A6C6C495A90397FC03FE0011FB512806D91C7FC010313FC9038007FC02B437AC038
! >I<121C121EEA1FC090B712F8A35A17F017E017C0A2003CC8EA078048ED0F00161E0070151C16
! 3C5E5E485D15014B5AC8485A4BC7FC150E151E5D5DA25DA24A5A14035D1407A24A5AA2141FA292
! C8FC5CA25CA35CA25CA21301A61303AB6D5A6D5A2D4479C138>I<EC7FC0903803FFF8010F13FE
! 90393FC07F8090397F001FC0D801FE6D7E48486D7E48486D7E485A6F7E484880003F140082485A
! A2178012FF167F17C0A517E0A416FF127FA36C6C5BA2121F6C6C5BED077F6C7E6C6C130E6C6C13
! 1C6C6C137890263FFFF013C0010F13E00103138090C8FCA2EEFF80A31700A25D5EEA0F80486C49
! 5A486C5C15074B5A5E49495A49495A001EC748C7FC001FEB01FE390FE007FC6CB512F000015C6C
! 6C90C8FCEB0FF82B437AC038>57 D<1618163C167EA316FFA24B7FA34B7FA39238073FE0A2030F
! 7FED0E1FA24B6C7EA2033C7FED3807A203707F160303F07F4B7EA20201814B7EA24A486D7EA202
! 078192C7123FA2020E6E7EA2021E81021C140FA24A811707027881027FB6FCA291B8FCA202E0C7
! 120149486E7FA20103834A157FA249C96C7EA24983010E161FA24983180F013C831807137E48B4
! 4C7E000F01C092381FFF80B500F80207B6FCA448467BC553>65 D<922601FFC0EB0180031F01FC
! 130392B613070207EDC00F021F9038C00FF0913B3FFC0001F81FDAFFE09038007E3F01030180EC
! 1F7F4948C8EA0FFF4948814948814948814948814948167F485B4890CA123F191F485A000F180F
! 5B121F491707123FA2491703127FA396C7FC485AAD6C7EA2F10380A2123F7FA2001F18076D1800
! 120F7F0007606C6C170E191E6C6D161C6C6D163C6D6C5E6D6C5E6D6C15016D6C4B5A6D6C4B5A6D
! 6C6C4A5A010001E0023FC7FCDA3FFC14FC913A1FFFC00FF8020790B512E002001580031F01FCC8
! FC030113E0414779C450>67 D<BA12E0A4C601F0C700037FD93FE0EC003F180F18071803180118
! 00A21978A31938A405E07FA496C7FCA21601A216031607163F91B6FCA49138E0003F1607160316
! 01A21600A2F10380A3F1070094C7FCA461A2190E191EA3193E197E197C19FC18011807181FD9FF
! F0EC01FFBAFC61A341437AC24C>69 D<BA1280A4C601F0C7000F13C0D93FE01400183F181F180F
! 18071803A2F001E0A31800A41970EE01C0A31900A31603A21607160F163F91B6FCA49138E0003F
! 160F16071603A21601A693C9FCAF80EBFFF8B7FCA43C437AC249>I<922601FFC0497E031F01FC
! 130392B613070207EDC00F021F9038C00FF0913B3FFC0001F81FDAFFE09038007E3F01030180EC
! 1F7F4948C8EA0FFF4948814948814948814948814948167F485B4890CA123F191F485A000F180F
! 5B121F491707123FA2491703127FA396C8FC485AAC053FB612806C7EA3DD0003EBC000003F715B
! 6D82A2121F7F120F7F12076C7E807E6C7F6D7E6D7E6D6C5D6D7E6DB45D6D6DEC07BF010001F0EC
! 1F1FDA3FFCEC7E0F913B1FFFE003FC07020790B5EAF0030200EDC001031F91C9FC030113F04947
! 79C457>I<B612FEA439007FFC00EB1FF0B3B3B3A3EB7FFCB612FEA41F437BC229>73
! D<B500E00507B5FC6E5F6E5FA2C61B00D93BFCEF3BFCA2D939FE1773A2D938FF17E3A36E6CED01
! C3A26E6CED0383A26E6CED0703A36E6C150EA26E6C151CA36E6C1538A26E6C1570A26E6C15E0A3
! 6F6CEB01C0A26F6CEB0380A26F6CEB0700A36F6C130EA26F6C5BA26F6C5BA36F6C5BA26F6C5BA2
! 93387F81C0A393383FC380A2DC1FE7C7FCA2EE0FFEA3017C6E5AA201FE6E5A2607FFC0EF0FFFB5
! 00FE6D48010FB6FCA3705A58437AC265>77 D<B500E04AB512FC80A28026003FFCDA000F138095
! 3801FC006E6F5AEB3BFF01396D15701338816E7E6E7EA26E7E6E7E6E7EA26E7E6E7F80826F7E6F
! 7E151F826F7E6F7EA26F7E6F7F6F7FA2707E707E161F83707E707E1603837013807013C0A2EF7F
! E0EF3FF0EF1FF8A2EF0FFCEF07FE170318FF7113F083187FA2183F181FA2017C160F180701FE16
! 033807FFC0B500FE150118001970A246437AC253>I<B812E017FE717E18E0C601F0C713F8D93F
! E0EC0FFEEF03FF7113807113C0F07FE0183F19F019F8181FA219FCA719F8A2183F19F0F07FE0A2
! F0FFC04D138005071300EF1FFCEFFFF891B712E095C7FC17F802E0CAFCB3A8EBFFF8B612F8A43E
! 437AC24C>80 D<DAFFC01330010701F81370013F01FF13F04914C03A01FF003FE1D803F8EB07F3
! 4848EB00FFD80FC0147F4848143F161F48C8120F007E15071603127C00FC1501A21600A36C1670
! A37E6C6C15007F7F6C7E13FC381FFFC06C13FC6CEBFFE06C14FE6CECFFC06C15F0013F14FC010F
! 14FF01031580D9001F14C0020114E0EC000F030013F0EE3FF8161FEE07FCA21603EE01FE160012
! E0A2177EA37EA36C167C17FC7EEE01F87E6CED03F001C0EC07E06D140F01F8EC1FC0D8FCFFEC7F
! 803BF87FF001FE00D8F01FB55A010714F048C614C048D90FFEC7FC2F4779C43E>83
! D<B600F849B512FCA4C601F8C8000F1380D93FE0923801FC00725AA21970B3B3A519F06D6C5EA2
! 1801010F5F6E150313076E4B5A13036D6C4BC7FC6D6C151E6F5C6E6C14F8DA1FE0EB03F0DA0FF8
! EB0FE0913A07FF807FC0020190B55A6E6C49C8FC031F13F8030113C046457AC253>85
! D<EB0FFE90B512E0000314F83907F003FE390FC000FF486C6D7E6D6D7E6F7E82150FA26C486D7E
! EA0380C8FCA5EC01FF147F903807FFF790383FF807EBFFC03803FE00485AEA0FF0485A485A127F
! 5B00FF160E90C7FCA3150FA26D131F007F141B6D133B6C6C903871FC1C3B1FF001E1FE3C3B0FFC
! 07C0FFF80003B5C613F0C601FCEB7FE0D91FF0EB1F802F2D7AAB38>97 D<EA01FE12FFA4120712
! 031201B2ED7FC0913803FFF8020F13FE91393F00FF8002F8EB1FE06D486D7E02C06D7E4A6D7E91
! C76C7E5B707E1880177FA218C0173FA218E0AA18C0177FA21880A2EFFF00A26D4A5A6E495A5F6E
! 495AD9F9F0EB1FE0D9F0F8495A91263F01FFC7FC496CB45AD9C00713F0C8138033457BC33E>I<
! EC3FFC49B512C0010714F090391FE003F890397F8000FC9039FE0001FE48481303485A1207485A
! 121F49EB01FC003FEC0070491400127FA35B12FFAA6C7EA3123F6D1407121F6D140F000F150E6C
! 6C141E6D143C6C6C1478C66C14F890397FC001F090393FF00FC0010FB512800101EBFC00903800
! 3FE0282D7BAB32>I<EE0FF0ED07FFA4ED003F161F160FB2EC3FE0903801FFFC010F13FF90393F
! F00FCF90397F8003EF49C712FFD801FC147F4848143F0007151F4848140F485AA2485AA2127FA2
! 5B12FFAA127FA27F123FA27F121F6C6C141F163F6C6C147F6C6C4A7E6C6C903801EFFC6C6C9039
! 07CFFFE090393FE01F8F90390FFFFE0F010313F89026007FC0EBF00033457BC33E>I<EC7FE090
! 3803FFFC010F13FF90393FE07FC090397F800FE09039FE0007F048486D7E48486D7E4848130000
! 0F81485A167F485AA2007F8117805B12FFA290B7FCA30180C9FCA5127F7FA3123F6DEC0380121F
! 000F15076D15006C6C5C6C6C141E6C6C5C6C6C147C90397FC001F090391FF00FE00107B55A0101
! 91C7FC9038003FF8292D7CAB32>I<EC03F8EC1FFF027F1380903901FE0FC0903903FC1FE09038
! 07F83FEB0FF0EB1FE0A2EB3FC0ED1FC0017FEB07004AC7FCAFB612F0A426007F80C7FCB3AFEBFF
! E0003FEBFFC0A423457CC423>I<EE01F89139FF800FFE0107EBF03F011F9038FC7E3F90393F80
! FFF09039FF007FC04848133F49011F130C484890380FE000000781491307A2000F81A700075DA2
! 6D130F00035D6C6C495A6D133F6C6C495ADA80FEC7FC3901DFFFFC01C713F0D80380138091C9FC
! A27FA27FA213F890B6FC6C15F016FE6CEDFF806D15C017F048B7FCD807F0C713F8D81FC0EC0FFC
! 4848140348C81201007EED00FE12FE48167EA46C16FE007E16FC007F15016C6CEC03F86C6CEC07
! F0D80FF0EC1FE0D803FCEC7F803B00FFC007FE00013FB512F8010F14E09026007FFCC7FC30417C
! AB38>I<EA01FE12FFA4120712031201B2ED3FE0913801FFFC02077F91391F80FF8091393C007F
! C04A133F4A6D7E5C6D48804A130FA291C7FCA35BB3A6486C4A7EB5D8FC07B512E0A433447AC33E
! >I<EA01F0487E487E487EA56C5A6C5A6C5AC8FCADEA01FE12FFA4120712031201B3AD487EB512
! FCA416437BC21F>I<EA01FE12FFA4120712031201B3923803FFFEA46F13E094C7FC16FC5EED03
! E04B5A4BC8FC153E5D5DEC03E01407140F4A7EEC7FF84A7E9038FFF3FE14C3EC81FF02007F496D
! 7E49133F826F7E6F7E6F7E1503826F7E6F7F707E8383486C15FCB5D8F803B512C0A432447BC33B
! >107 D<EA01FE12FFA4120712031201B3B3B3A2487EB512FCA416447BC31F>I<D801FCD93FE0EC
! FF8000FF902601FFFC010713F0020701FF011F13FCDA0F809039C03E03FF91293C003FE0F0007F
! 00074990261FE1E0137F00034990260FF3C06D7E0001495DD9FDC002FFC77F4A6D48141F13FF91
! C75BA3495DB3A6486C4A6C4A7EB5D8FC03B5D8F00FB512C0A4522B7AAA5D>I<D801FCEB3FE000
! FF903801FFFC02077F91391F80FF8091393C007FC0000749133F0003496D7E00015BD9FDC0804A
! 130F13FF91C7FCA35BB3A6486C4A7EB5D8FC07B512E0A4332B7AAA3E>I<EC1FF049B5FC010714
! C090391FF01FF090393F8003F801FEC712FE4848147F4848EC3F804848EC1FC049140F000F16E0
! 4848EC07F0A2003F16F8A24848EC03FCA400FF16FEA9007F16FCA26D1407003F16F8A2001F16F0
! 6D140F000F16E06C6CEC1FC06C6CEC3F806C6CEC7F006C6C14FE90397F8003FC90391FF01FF001
! 07B512C0010191C7FC9038003FF82F2D7CAB38>I<D801FEEB7FC000FF903803FFF8020F13FE91
! 393F00FF8002F8EB3FE02603FFF06D7E6C01C06D7E4A6D7E91C76C7E49140183701380A3EF7FC0
! A3EF3FE0AAEF7FC0A3EFFF80A24C1300A26D4A5A6E5C4C5A6E495A02F0495A496CEB7FC091263F
! 01FFC7FC6EB45A020713F00200138092C9FCAD487EB512FCA4333E7BAA3E>I<3901FC01F800FF
! EB07FE91381FFF80EC3E3F9138787FC000071370000313E01201EBFDC09138803F8001FFEB0E00
! 92C7FC91C8FCA35BB3A5486C7EB6FCA4222B7BAA2C>114 D<90381FFC0390B5128F000314FF38
! 0FF007381F800048C7123F007E80A2007C8012FC81A27E7E6D90C7FC13E0EA7FFCEBFFF06C13FF
! 6C14C06C14F06C800001806C6C7F010F7FD9007F13801403020013C000E0147F153F151F7E150F
! 7EA26C1580151F7E6CEC3F006D133E6D13FE39F9F803F800F0B55AD8E03F13C026C007FCC7FC22
! 2D7BAB2D>I<EB0380A61307A3130FA3131FA2133F137F13FF5A5A001FEBFFFEB6FCA326007F80
! C7FCB3A2ED0380AA90383FC00716005D90381FE00E90380FF01E6E5A903803FFF801005BEC3FC0
! 213E7DBC2C>I<D801FEEC0FF000FFEC07FFA40007EC003F0003151F0001150FB3A6161FA3163F
! 167F12006DECEFF86D903801CFFC913A80038FFFE090391FE01F0F90380FFFFE010313F8902600
! 7FE0EBF000332C7AAA3E>I<B500F890380FFFF0A4000301C0010313006C49EB01FC6C6F5A5F01
! 7F5D6E1301013F5D6E1303011F5D80010F4AC7FCA26E5B0107140E6E131E0103141C6E133C0101
! 1438806D5CA26E6C5AA215C1023F5B15E3021F5B15F3DA0FF7C8FCA2EC07FEA36E5AA26E5AA26E
! 5AA2342B7DA93B>I<B527F80FFFFE90B51280A40007902780007FE090381FFC00000190C76C48
! EB0FF0735A6C031F6E5A043F5D6E6E1307017F95C7FC4C7E6D6C0177140EA2EEE3F86D6C5E1501
! 02F0D9C1FC133C010F173892380380FED907F85E150702FCD9007F13F001035F4B1480DAFE0EEB
! 3F8101015F4BEB1FC1D900FFEDC380153C03B8EB0FE7027F93C8FC03F0EB07F7023F15FEA24B13
! 03021F5DA24B1301020F5D4B130002075D92C81270492B7DA950>I<B500F890387FFFC0A40001
! 01E090383FFC006C6C48EB1FE0013F15806D6C013EC7FC6E133C6D6C5B6D6C5B6D7E0101495A6D
! 6C485AED8780DA7FCFC8FCEC3FFE6E5A6E5A14076E7E81814A7F4A6C7EEC1E3F4A6C7E02787F4A
! 6C7E6F7E49486C7E49486C7E49487E49C76C7E4981017F6E7E484881000FED7FFCB500C090B512
! F0A4342A7DA93B>I<B500F890380FFFF0A4000301C0010313006C49EB01FC6C5E017F6E5A4C5A
! 80013F5D6E1303011F5D6E1307010F92C7FC800107140E8001035CA26E133C010114386E13786D
! 1470ED80F0027F5B15C1023F5B15E191381FE380A2DA0FF7C8FCA215FF6E5AA26E5AA26E5AA26E
! 5AA25DA214015D14035D140792C9FC003C5B007E130EB4131E141C143C5C485B387C01E0383E07
! C06CB45A6C90CAFCEA03F8343E7DA93B>I E /Fe 25 122 df<94B5913803FFE0043F02E0017F
! 13FC0303B6D8FC03B6FC031FDBFE0F1580037FDBFFBF15E04AB5D8C00790B5008013F0020701FC
! C7ECFC034A01E049DAF00713F8023F494914E04A90C7484A4813FC4A48178049495C4B17005B49
! 495EA25D494E6D13F84B6E6F13F07613E0726F13C072EE1E007293C7FCAFBD12FEA7D8000F01E0
! C849C9FCB3B3AC003FB6D8F803B712E0A766637DE25E>11 D<4AB5FC027F14F049B612FE0107ED
! FFC0011F16F049D9801F7F9027FFF0000313FE02FC01007F486D6E7F717F486D6E7FA2717F8583
! A285836C5B6C5B6D5A6D5AEB0FC090C9FCA4047FB5FC033FB6FC0203B7FC143F49B612830107EC
! E003011FEBFE00017F13F090B512C0000391C7FC4813FC485B485B485BA2485B5CB5FCA291C8FC
! A35FA26E5CA26C5E6E5C6E027E7F6C6D02FEEBFFC06C6D4948ECFF806C01FE902607F87F14C06C
! 9039FFC07FF0000191B5EAC03F6C6C4B7E011F9138FE0007010302F801001480D9001F018091C8
! FC4A417CBF4F>97 D<903807FF80B6FCA7C6FC7F7FB3A7933801FFF0041FEBFF8093B612F00383
! 15FC038F15FF039F010080DBFFF0011F13E004C001077F93C76C13FC03FC6E7F4B6E7F4B814B6F
! 13801BC04B6F13E0A21BF0851BF8A31BFC85A31BFEAE1BFCA3611BF8A21BF0611BE0A24F13C081
! 6F4B13806F92B51200626F4A5B03FF4A5B4A6D010F5B9126FC7FE0013F13C09127F81FFC01B55A
! 4A6CB648C7FCDAE00315F84AC615E04A013F49C8FC90C8000313E04F637BE15A>I<92380FFFF0
! 4AB67E020F15E0023F15F891B712FE010382499026FE003F13C0011F01F0130F4901C04913E049
! 5B90B5C74813F0485B485B5A5C5A5C5A7113E048496E13C071138071130048EE00FC95C7FC5CA2
! B5FCAE6C7FA47E8019F86CEF01FC6E15037E6C6DED07F8806CEF0FF06C6D151F6C6EEC3FE06D6D
! EC7FC06D01F014FF6D01FC010313806D903AFFC03FFE00010391B55A01005E023F15E0020F1580
! 020102FCC7FCDA000F13C03E417BBF48>I<F17FF8050FB5FCA7EF000F8484B3A792380FFFC04A
! B512F8020F14FF023F15C391B712F301039138007FFB4901F8010FB5FC011F01E0130349018013
! 004990C87E4948814883484981484981A2485B5AA25C5AA25A5CA3B5FCAE7EA3807EA37E807E60
! 6C7F6C5F6C6D5D6E5D6C6D92B57E013F6D49806D6D0107ECFFFE6D01F0131F01039039FE01FFE7
! 6D90B612C76D6C1507021F14FC020314F0DA001F0100ECC0004F637BE15A>I<92380FFFC04AB5
! 12FC020FECFF80023F15E091B712F80103D9FE0113FE010F9039F0003FFF4901C0010F7F49496D
! 7F4990C76C7F49486E7F484980484982187F48498248173F85485BA248717EA3485B1A80A284B5
! FCA291B9FCA41A0002C0CBFCA57EA380A27EA27E6E161F6CF03F80A26C6D167F1A006C6D5E6C6D
! 4B5A6C6D15036D6D4A5A6D6D4A5A6D01F0EC3FF06D01FCECFFE06D9026FFC00F5B010191B65A6D
! 6C4BC7FC021F15F8020715E0020092C8FC030713F041417CBF4A>I<EE3FFC0307B57E033F14E0
! 92B67E020315FC4A9038F81FFE021FEBC07F4A0100B5FC4A5A4A484814804913F8A24913F0A249
! 13E0A25B4B6C1400715A715A715AEF03C094C8FCAFB812C0A7D8000F01E0C9FCB3B3AC003FB612
! FEA739637BE231>I<DBFFFEEC0FF8020FD9FFE0EBFFFC027FDAFC0313FF49B7000F1480010793
! B612C049D9F01F14F349D980031403017F496CEBFC0749486D13FE4A027F7F4817FF48496E0183
! 13800780130048F0C07C4A6E91C7FCA24884AA6C60A26E5C6C60A26C6D4A90C8FC6C5F6E14FF6D
! 6C495B011F6D4813F0DBF01F5B4990B65A4993C9FCD97E7F14FCD9FC0F14E0020049CAFC000191
! CCFCA57F7FA28014F091B77E18FE6CEFFFC019F019FC6D17FF6D841AE06D847F017F8448BA7E5A
! 000F01E0C70001804890C9120F484816014848706C7E498300FF84A24983A46D5FA26C6C4D5AA2
! 6C6C4D5A6D17FF6C6D4B5B6C01E003075B000301F8031F13C06C01FF92B55A6C6C01F8011F49C7
! FC6D90B75A010717E0010094C8FC021F15F8DA007F49C9FC4A5C7CBE51>I<903807FF80B6FCA7
! C6FC7F7FB3A7EF1FFF4CB512F0040714FC041F14FF4C819326FFE03F13E00381EB000FDB83F86D
! 7FDB87F081DB8FC07FDB9F808103BFC7FC15BE03FE6E7F5D5DA25DA25DA35DB3B0B7D8F007B712
! 80A751627AE15A>I<EB07E0EB3FFC497E90B5FC48804880A34880A66C5CA36C5C6C91C7FC6D5A
! 6D5AEB07E090C9FCAE903807FF80007FB5FCA7C6FC7F7FB3B3AAB712C0A722637AE22C>I<9038
! 07FF80B6FCA7C6FC7F7FB3A80507B61280A7DD007F90C7FCF03FF84E5A943801FFC04D5B4D90C8
! FC4D5AEF3FF84D5A4D5A4C5B040790C9FC4C5A4C5A4C5AEEFFE015811583038F7F039F7F03BF7F
! 92B57EA283844B804B7EDBF03F7F03E0804B6C7F4B6C7F4B7E84707F708082717F85717F717F83
! 85717F717F8386718086B7D8C00FECFFF0A74C627BE155>107 D<903807FF80B6FCA7C6FC7F7F
! B3B3B3B3A9B712E0A723627AE12C>I<D90FFFDA1FFFEEFFF8B649B500F0020FEBFF80040702FC
! 023F14E0041F02FF91B612F84C6F48819326FFE03FD9E007010113FF4BD9000F91390FF8007FDB
! 03F86D9026F01FC06D7FC64A486F4848816DD90FC06D027EC77E6D49486F48824BC7ECFDF8033E
! 5F037E6E01FF6F7F037C5F4B5FA24B5FA24B94C8FCA34B5EB3B0B7D8F007B7D8803FB612FCA77E
! 3F7ABE87>I<D90FFFEC1FFFB649B512F0040714FC041F14FF4C819326FFE03F13E04BEB000FDB
! 03F86D7FC64A48816DD90FC07F6D4948814BC7FC153E037E6E7F157C5DA25DA25DA35DB3B0B7D8
! F007B71280A7513F7ABE5A>I<923807FFE092B6FC020715E0023F15FC91B8FC4949C66C7F0107
! 01F0010F13E04901C001037F49496D7FD97FFEC8EA7FFE49486F7EA248496F138048496F13C048
! 19E0A248496F13F0A24819F8A248496F13FCA34819FEA4B518FFAC6C19FEA56C6D4B13FCA26C19
! F8A26C6D4B13F0A26C19E06E5D6C19C06C6D4B13806C6D4B13006D6C4B5A6D01C001035B6D01F0
! 010F5B6D01FE017F5B010390B712C0010094C7FC023F15FC020F15F0020092C8FC030713E04841
! 7CBF51>I<902607FF80EBFFF8B6011FEBFF80047F14F00383B612FC038715FF039F16C09226BF
! FE01809227FFF0003F13F8C60380010F7F6D91C76C7F6D01FC6E7F4B6E14804B804B17C04B6F13
! E0A27313F0A27313F8A37313FCA47313FEAD611BFCA44F13F8A21BF0611BE0611BC06F92B5FC6F
! 17804E14006F4A5B6F4A5B03FF4A5B70495B04E0017F13C09226DFFC03B55A03CFB648C7FC03C3
! 15F803C015E0043F49C8FC040313E093CBFCB3B712F0A74F5A7BBE5A>I<DB1FFFEC03F04AB500
! E01307020F02F8130F027F14FE91B7EA801F0103EEC03F010F028013E049903AFC001FF07F4901
! F0EB07F84901C0903803FCFF90B5486DB5FC4891C8FC5A4849814A815A484981A2484981A34849
! 81A4B5FC5CAD6C7FA47E80A26C5F806C5F806C5F6C6D5D95B5FC6C6D5C6C6E5B6D6D5B011F6D5B
! 6D01F8EB3FEF6D9039FE01FFCF010190B6128F6D6CECFE0F021F14F8020314E09139001FFE0092
! C8FCB3053FB612FCA74E5A7BBE55>I<D90FFFEB07FEB690381FFFC0047F13F04BB57E4B809239
! 07FC3FFE92390FF07FFFED1FC0C64BB512806D495A6D137EA25D5DA24B6D1300A2715A4BEB0FF8
! EF03E094C8FC5DA55DB3ACB712F8A7393F7BBE43>I<91393FFF80070107B538F81F80011FECFF
! 7F017F15FF3901FFF0014890C7121FD807FC1407484880484880484880A24848157FA300FF163F
! 7FA27F6DED1F0001FE92C7FC6D7E14F0ECFFC06C14FF16F016FE6C6F7E6C16E06C826C16FC6C82
! 6C826C6C16806D16C01307010116E0D9001F15F0EC007F1501DB003F13F81607007C150100FE81
! 177F7E173FA26D151FA27F18F07F173F6D16E06D157F6D16C06D15FF6D4A138002E0010F130002
! FCEB7FFC01DFB65A010F15E0D8FE035D48C66C49C7FC0070010F13E035417BBF40>I<EC0FE0A7
! 141FA5143FA3147FA214FFA25BA25B5B5B5B5B5B48B712FE120FB8FCA5D8001F01E0C8FCB3ACEF
! 1FC0AC173F6F14807F177F6D6D14005F6D6D485AEDFF076DECFFFC6D6C5C6E14E0020F5C020391
! C7FC9138003FFC325A7DD83F>I<902607FFC0ED3FFEB60207B5FCA7C6EE00076D826D82B3B060
! A460A260A26D5E6F5C6D047E7F4E806D6D0101EDFF806D6DEB07F86D01FFEB3FE06D91B55A023F
! 5D6E4A5A020314F8DA001F01C002F0C7FC51407ABE5A>I<B76C010FB512F0A7C66C01C0C8383F
! F000735A6D6D4B5AA26D6D4B5AA26D6D93C7FC616D5F6F14016D5F6F14036D5F6F1407A26D6E49
! 5AA26E6D495AA26E6D5C183F6E5E70137F6E93C8FC705B6E5DEEFC01A26E6D485AA26E6D485AA2
! 6EEC87F0178F6F5C17DF6F5C17FF6F5CA36F91C9FCA26F5BA26F5BA26F5BA26F5BA2705AA2705A
! 705A4C3E7CBD55>I<B7D8807FB500FE0107B512FCA7C66C01C0C76C48C8381FFC006D706CED07
! F0A26F6E6D140F6D646F191F6D725D606F70143F6D4C5F6F197F6D7292C7FC95B55D6F826D4B5F
! 6F18016D04FC6D5C050316030480496C7E6E02075F04C017076E4B6C6C5C050F160F04E0496C13
! 806E021F5F04F0171F6E4B6C01C05B053F163F04F8496C13E06E027F5F04FC177F6E4B6C01F090
! C8FC4D5E70486D7F6E01FF5F1BF96E4A6DEBFDFC1BFF4D806F604D806F60A24D806F604D806F60
! A24D806F6094C87E6F95C9FCA26F486F5A6F486F5A6E3E7DBD75>I<007FB66C90B612E0A7D800
! 1F01F0C7000FEB80006D6DDA07FCC7FC6D6D4A5A6D6D4A5A6D6D4A5A6D167F70495A6E6D485B6E
! 01E091C8FC6E6D485A6E6D485A6E4A5A70485A6EEBFE3F6E6D485A6E4A5A6F5C6F91C9FC5F6F5B
! 6F5B6F7F6F7F81836F804B804B804B805D4B80DB3FF77F04E37FDB7FC17FDBFF80804A497E4A48
! 814A486D7F020F6E7F4A486D7F4B6D7F4A487F4A48814A486D7F4990C88049486F7F0107707FD9
! 1FFF81B600F00103B612FCA74E3E7DBD55>I<007FB600C00107B512F8A7D8003F01E0C8381FF8
! 00735A6D6D4B5AA26D6D4B5AA26D6D5E197F6D95C7FC6F5D6D5F6F14016D5F701303A26E6D495A
! A26E6D495AA26E6D5C181F6E5E70133F6E5E70137F6E93C8FC705BA26E6D485AA26EEC83FCA26F
! EBC3F817C76F5C17EF6F5C17FF6F5CA36F5CA26F91C9FCA26F5BA26F5BA2705AA2705AA3705AA2
! 4C5AA25F167F94CAFCD807F05CD81FFC5C486C1301486C5C1503B512804B5AA24B5A4B5AA24B5A
! 6C49485A4BCBFC6C48485A9038D807FC391FF03FF86CB55A6C5C6C1480C649CCFCEB1FE04D5A7D
! BD55>I E /Ff 72 126 df<EA0FC0EA1FE0EA3FF0EA7FF8EAFFFCB3A2EA7FF8B3AFEA3FF0A2EA
! 1FE0C7FCADEA0780EA1FE0EA3FF0EA7FF8A2EAFFFCA4EA7FF8A2EA3FF0EA1FE0EA07800E5762D6
! 4A>33 D<D80F80EB03E0D83FC0EB07F8486CEB0FFC6D131F00FF15FEA9007F15FCA849130FAC00
! 3F15F8A54913076C48EB03F00006C812C027296FD64A>I<DA03C0EB03C0DA0FF0EB0FF0A24A6C
! 497EA7023F143FA24B5CA9027F147F000FB912E0003F18F84818FCBA12FEA56C18FC6C18F8D800
! 01D9C001EBC000A203805CA8495CA2030091C7FCA8495CA2003FB912F84818FCBA12FEA56C18FC
! 6C18F8000F18E029001FFC001FFCC7FC4A5CA9013F143FA24A5CA76D486D5AA2D90780EB07803F
! 567BD54A>I<153E157F4B7EA9020313F0023F13FF91B612E0010715F84915FE013F814916C090
! B87E4883484913BF4801F001837F48018001807F4849143F01FC6F7E4848150F496F7E485A8349
! 178000FF82495D5FA56D6F1300715A6C6C6F5A95C7FC7F6C7E13FE6C7E14C06C13F86C90B5FC7E
! 6C15E06C15FC6DECFF80011F15E06D15F8010315FED9007F80020F810200818404BF7F04877F16
! 819338807FFC173FEF0FFEA2717E83EA1F80486C6F1380487E83487EA45BA25F007F18005F7F4D
! 5A6C6C150F6D4B5A6C6C153F6D4B5A6C6D903881FFF002F013876C01FE90B55A6C90B75A6C5F6C
! 94C7FC6D15FC011F5D010715E001011580D9003F01FCC8FC020313C002005BA96FC9FC153E396E
! 78E14A>I<017E167848B46C15FE486D1401486D4A7E487F486D5CA2486D5D170F13E7267FC3FE
! 4A5AA201815E00FF6D143FA201005E177FA24D5AA2605EA201814A5BA2007F4992C7FC01C35CA2
! 263FE7FC495A13FF5F6C49131FA26C49495A6C5B6C495C6C49137FD8007EC7FC90C85B16FFA24B
! 5BA25F5DA24B90C8FCA25E150FA24B5AA25E153FA25E157FA24B5AA25E5CA24A5BA293C9FC5CA2
! 4A5AA25D021F15FCEF03FF4B491380023F4A13C04D13E04A484913F0A24B4913F814FF18CF4949
! 9038FF87FCA24B1403494A14FEA2490100EBFE01A25C130FA2495AA25C013FEDFF03A24A6D14FC
! 017F1687A2494891387FCFF818FF5C487013F0A24A6E13E07113C06C90C86C13806D6F1300013C
! ED00FC3F6E7BE14A>I<137EEBFF804813C04813E04813F014F8A214FCA37E6C13FE7E137F1303
! A7130714FCA2130FA2EB1FF8A2EB3FF0A2137FEBFFE04813C05A000F1380481300485A485A485A
! 5B6C5A5B6C5A001EC7FC172C67D54A>39 D<ED03E0ED0FF0ED1FF8153F15FF5C4A13F04A13E04A
! 13804A13004A5AEC7FF84A5A495B495B495B92C7FC495A131F495A5C495AA2495A485BA2485BA2
! 91C8FC5A5B120F5BA2121F5BA2123F5BA3127F5BA5485AB06C7EA57F123FA37F121FA27F120FA2
! 7F12077F7E80A26C7FA26C7F6D7EA26D7E806D7E130F6D7E816D7F6D7F6D7F6E7EEC3FFE6E7E6E
! 13806E13E06E13F06E13F880153F151FED0FF0ED03E0256E68E14A>I<123EEA7F80487E7F13F8
! 7F6C7E6C7E000F7F6C7F6C7FC67F6D7E6D7E6D7E6D7E7F6D7F816D7F7F6E7EA26E7E6E7EA26E7E
! A214078180168080A216C080A216E0157FA316F0153FA5ED1FF8B0ED3FF0A5157F16E0A315FF16
! C0A25C1680A25C16005C5D140FA24A5AA24A5A4A5AA24A5A5B495B5D4990C7FC5B495A495A495A
! 495A00035B485B485B003F90C8FC485A485A5B13E05B6C5A003EC9FC256E74E14A>I<157C15FE
! 4A7EAB001E17F0D87F80ED03FC01C01507D8FFF0ED1FFE01FC157F01FE15FF267FFF81010313FC
! 02E1130F001F01F14913F0000701FD017F13C06C90B71280C6EEFE00013F15F8010F15E0010315
! 8001004AC7FC6E5B021F13F0027F13FC91B57E01036E7E010F15E0013F15F890B712FE0003EEFF
! 804801FD6D13C0001F01F1011F13F0007F01E16D13FC0281130326FFFE01010013FE01FC157F01
! F0151FD87FC0ED07FC01801503D81E00ED00F0C71600AB6E5A157C373D77C84A>I<ED03C0ED0F
! F0A24B7EB3A6001FB912F0007F18FCA2BA12FEA46C18FCA2001F18F0C8D81FF8C8FCB3A66F5AA2
! ED03C03F407BCA4A>I<137E3801FFC04813E04813F04813F814FC5A14FEA314FFA27EA27E7E7E
! 6C7E130314FEA21307A2EB0FFC131FEB3FF8137FEBFFF0000313E0121F4813C0481380B512005B
! EA7FF85BEA3FC0001EC7FC182667914A>I<001FB812FC007F17FFA2BA1280A46C1800A2001F17
! FC390A78AF4A>I<EA03F0EA0FFC487E487E481380A2B512C0A66C1380A26C13006C5A6C5AEA03
! F0121264914A>I<183C187F604D1380A25FA24D1300A24D5AA24D5AA260173FA24D5AA24D5AA2
! 4C5BA24C5BA24C90C7FCA24C5AA24C5AA25F163FA24C5AA24C5AA24B5BA24B5BA24B90C8FCA24B
! 5AA24B5AA25E153FA24B5AA24B5AA24A5BA24A5BA24A90C9FCA24A5AA25D141FA24A5AA24A5AA2
! 4A5AA2495BA2495BA24990CAFCA2495AA25C131FA2495AA2495AA2495AA2485BA2485BA24890CB
! FCA2485AA25B121FA2485AA2485AA2485AA25BA26C5AA2001ECCFC396E78E14A>I<ED7FC09138
! 03FFF8020F13FE023F6D7E4A8049B612F0498149814981499038C07FFF49D9001F7F02FC130749
! 486D7F49486D7F4A7F48496E7E48496E7E91C8121F488349150FA248486F7EA248486F7EA34848
! 6F1380A34981007F18C0A549167F00FF18E0AF6D16FF007F18C0A56D5D003F1880A26D5DA2001F
! 18006D5DA2000F5F6D150F00075F6D151FA26C6D4A5A6E147F6C5F6C6D4A5A6E5B6D6C495B6D6C
! 495B02FF131F6DD9C07F90C7FC6D90B55A6D5D6D5D6D5D6D6C14C06E5C020F49C8FC020313F891
! 38007FC03B5879D64A>I<EC01E04A7E4A7E140FA2141FA2143FA2147F14FF5B5B5B5B133F90B5
! FC123F5AB6FC14DF149F141F13FCEA7FF0EA3F80C7FCB3B3B0001FB712F84816FC4816FEA56C16
! FC6C16F82F5771D64A>I<913803FFC0023F13FC49B67E010715F0011F15FC498190B87E488348
! 8348D9FC008002E0010F7F48018001017F4890C87F01FC153F003F707E498148486F138083496F
! 13C012FF837F19E0187FA36C5AA26C5A0006CAFCCBFCA2F0FFC0A35F19805FA24D13005F60171F
! 4D5A4D5AA24D5A4C5B4C5B4C5B041F90C7FC4C5A4C5A4C5A4B5B4B5B030F5B4B5B4B90C8FC4B5A
! 4B5A020313F04A5B4A5B4A5B4A48C9FCECFFFC495B495B495B491380013F90C8EA1F804948ED3F
! C04948ED7FE0485B4813E0000F5B485B4890B8FC5ABAFCA56C18C06C18803B5779D64A>I<9138
! 01FFF8023FEBFF8049B612F0010715FC011F15FF017F8290B87E48838448DA000F7F4801F00101
! 7F02C06D6C7E91C8121F48486F7E6D8183198083A26C5A6C5A6C5AEA006090C95A1900A25FA24D
! 5A171F60173FEFFFF804035B160F0303B55A0207B65A4A5D4A92C7FC17FC838318C06E816E8191
! C7000F7F04017F706C7EEF1FFF050713807113C0837113E0A2F07FF0A2183F19F8181FA3120FEA
! 3FC0487EA2487E183F19F0187FA249EEFFE0127F6D4B13C06D5D6C6C4B138001FF151F6C01C002
! 7F130002F049485A6C9026FF800F5B6C91B65A6C5F6C5F6C6C5E011F93C7FC010715FC010115F0
! D9001F1480020101F8C8FC3D587AD64A>I<EE3FFC4C7E93B5FCA25D5DA24B5A150F5E4B5AA24B
! 5A4B5AA24B5A5C5E4A5B5C5D4A5AA24A5A4A5AA24A5A14FF5D495B5B92C7FC495A130F5C495AA2
! 495A495AA2495A5A5C4890C8FC5A5B485AA2485A485AA2485A12FF90B912FE851A80A56C19006C
! 60CA90C8FCB0030FB612F04B814B81A56F5D6F5D41577CD64A>I<1818187E4DB4FC4D1380170F
! 5F177F94B5FC040314004C5B041F13F84C5B93B512C04B5C030749C7FC031F5B4B13F092B55A4A
! 1480020791C8FC4A13FC023F5B4A13E049B512804991C9FC010F13FC013F5B4913E048B55A4891
! CAFC000F5B4813F8007F5B14C0B5CBFC5BA27F6C13C014F0001F7F6C13FE00037F6C14C06C6C7F
! 6D13F8010F7F010313FF6D806D6C13E06E13F8020F7F6E13FF0201806E14E0033F7F6F13FC0307
! 7F03016D7E6F80043F13F0707F040713FE707F0400148083171F831703711300EF007E18183948
! 78CE4A>60 D<120C123FEA7FC0487E13F87F13FF806C13E06C7F000F13FC6C7F00016D7E6C8001
! 3F13F06D13FC01077F6D6D7E0100806E13F0021F7F6E13FE02037F020014C06F7F031F13F86F13
! FE03037F6F14C06F6C7F7013F8040F7F7013FF1601706C138083A25F4CB5120016074C13FC043F
! 5B4C13E04BB55A4B91C7FC030F5B4B13F8037F13E092B55A020391C8FC020F5B4A13F8027F5B91
! B512C001035C4949C9FC011F5B4913F090B512C0485C000749CAFC485B003F13F0485BB5128091
! CBFC13FC5B13E06C5A6CCCFC120C394878CE4A>62 D<91383FFFE00103B512FE011FECFFE0017F
! 15F848B712FE48824817C04817E04817F0489038F0007F91C7000313F8D87FFC020013FC49153F
! 01E0151F00FFEE0FFE6D1507A56C48150F6C48ED1FFC6C48153FCA12FF040313F84C13F0161F4C
! 13E093B512C04B14004B5B4B13F84B13E04B5B4B90C7FC4B5A4B5A5E4A5B4A5B5EA24A5B93C8FC
! 5C5DAC5DA26E5A91CAFCADEC01E0EC07F84A7E4A7EA24A7EA46E5AA26E5A6E5AEC01E0375777D6
! 4A>I<4BB47E031F13F092B512FC020314FF020F814A15E0027F8191B77E5B4902007F4901F0EB
! 1FFE4901C0130F4990C7EA03FF494880D97FF816804A804948903907F87FC04849EB3FFF4A4913
! BF484948B612E0495B00075C495B48484915F0A2484890383FFC0F92387FF003494A7E003F4A48
! 7E4C137F494816F8007F92C7123FA2494848141FA24B140F12FF140713004B1407AA6F140F1380
! 020316F0127F6F141FA26D6C6CEC3FE0A2003F6F137F6D6C16C07013FF001F6E6C4813806D6E5A
! 92263FFC0F13006C6C6DB55AA26C6C6D5C6D6D5C00036E5C6D6D5C6C6D6C6C13806E6D90C7FC6C
! 6DEB07F86D6C90C7EA0FE06EED1FF0D93FFEED3FF86D6C157F6D01C0EB01FF6D01F013076D01FF
! 017F13F06D91B612E06D17C06E1680021FEDFE006E5D020315F002001580031F01FCC7FC030113
! C03D587AD64A>I<ED0FF8ED3FFEA24B7EA492B57EA44A6D7EA44A80EDFE3FA4020780A2EDFC1F
! A2020F80A3EDF80FA2021F80A3EDF007023F80A44A486C7EA54A486C7FA449824B7EA44990C76C
! 7EA44990B67EA44982A5D91FFCC7EA1FFC4A140FA3013F824A1407A3017F82A24A80A301FF8300
! 3F01FF027F13FE486E90B6FCB66C481580A56C4A6C15006C91C76C5B41577CD64A>I<003FB712
! E04816FCEFFF80B97E18F0846C83846C8326003FF0C7003F1380050F13C017037113E083F07FF0
! A2183FA219F8181FA7F03FF0A2187F19E018FF4D13C05F4D13804D1300EF3FFE933803FFFC91B7
! 5A6018C095C7FC18C018F018FC848402F0C7000F1380050313C0050013E0F07FF0F03FF8181F19
! FC180F19FE1807A3F003FFA86019FE180FA2181FF03FFC187FF0FFF85F050713F0053F13E0003F
! B9FC4818C01980BA120018FC606C17E018806C04FCC7FC40567DD54A>I<DB0FFCEB03E0923A7F
! FFC007F00203B500F813F8020FECFE0F023F14FF4A15DF91B8FC5B5B49EBFC03499038E0007F49
! 01807F4990C7120FD97FFC804948804A80485B4A8048177F5C4890C9123FA2485A181F485AA25B
! 123F49EE0FF0F007E095C7FC127F5BA412FF5BAE7F127FA47F123FA2F007E06DEE0FF0001FEF1F
! F87FA26C7EA26C7E183F6C6D16F0806C177F6EEDFFE06C7F6E5C6D6C4A13C06DB44A13806D6D13
! 1F6D01E0017F13006D9039FC03FFFE6D90B65A6D5E6D5E6E5D6E1580020F4AC7FC020314F8DA00
! 7F13C0DB0FFEC8FC3D587AD64A>I<003FB7FC4816F0B812FC17FF848418F06C836C8328007FE0
! 00077F1600EF3FFF717F717F1703717FA2717F727E183FA2727EA2727EA2180785A284A21A8084
! A57213C0AF601A80A4601A00A260A261180FA24E5A183F61187F4E5AA24D5B5F4D5B051F5B5F94
! B5C7FC04075B003FB85A485FB95A60188095C8FC17FC6C16F06C93C9FC42567ED54A>I<003FB9
! 12FC4884BBFCA57E7E26003FF0C81203AB725A725A96C7FCA717FC4C7E4C7EA691B7FCA99138F0
! 0003A6705A705A94C9FCA8F11F80F13FC0F17FE0AD003FBAFC5ABBFCA56C19C06C198043567DD5
! 4A>I<DB3FF0133E912601FFFE137F020FD9FFC013804AECF0FF027F8091B612FD4992B5FC5B5B
! 49EBF01F49EBC00349EB0001D97FFC6D7E4A80495A4849804A805A4A804890C8FC83485AA24848
! 81A25B123FA2496F1300187E007F94C7FC5BA512FF5BAB0407B512FC4C14FE5E6D17FF127FA219
! FE827014FC6DDA00011380123F5FA27F121F7F5F6C7EA26C7E5F6C7F6E5C7E6E5C6C6D5C6D7E6E
! 91B5FC6DB45B6DEB80076DEBF01F6D90B7FC7F6D15FD6D15F96E14F1021F14E16E028013000201
! 9038FE007E9126003FF090C7FC40587BD64A>71 D<003FB67E4881B7FC82A35E7E6C5D26001FF8
! CAFCB3B3B119FCF001FEF003FFAD003FBAFC5ABBFCA56C18FE6C18FC40567CD54A>76
! D<263FFF8092383FFF804801E092B512C0B56C4A14E0A36E5CA26C19C06C6D4A14800001F0F000
! 01FE16EF6E140FA3027FEC1FCFA36F133F023F158FA26F137FA2021F150F6F13FFA2020F14FEA2
! EDF001A2020714FCEDF803A2020314F8EDFC07A2020114F0A2EDFE0F020014E0A2EDFF1FA2037F
! 13C0A216BF033F1380A216FF6F1300A36F5AA36F5A6F5A6F5A92C8FCB3A2263FFFF04AB5128048
! 6D4A14C0B56C4A14E0A56C496E14C06C496E148043567DD54A>I<263FFFE091387FFFFE4801F8
! 91B6FCB56C491580A280A36C6D6D15006C705BC66C030090C7FCECBF80A2EC9FC0A381148FA281
! 1487A2811483A281148181A2148081A28182A2153F82A2151F82A2150F82A26F7EA2150382A215
! 0182A2150082A28283A2163F83A2161F83160FA2831607A2831603A2831601A3707EA2177F003F
! B5FC4880B66C7FA383A26C4A6D5A6C91C7EA03FC41567CD54A>I<003FB712E04816FEB97E18E0
! 18F884846C836C188026003FF0C714C0051F13E0050713F017017113F8187FF03FFC181FF00FFE
! A21807A219FF84A86019FEA2180FA2F01FFC183FF07FF818FF4D13F01707051F13E094B512C091
! B81280190060606018E018804DC7FC17E002F0CAFCB3A7003FB512F04880B67EA56C5C6C5C4056
! 7DD54A>80 D<003FB612F04815FFB812E017F88317FF846C836C8328007FE0003F7F04077F1601
! 706C7E173F717E170F717EA2838583A75F96C7FC5FA24D5A171F4D5A177F4C485A1607043F5B91
! B75A606095C8FC17FCA28383849126E0003F7F1607707F1600717EA2173F84171FADF103F0F107
! F8F10FFCA4EF0FFCA29538FE1FF8003FB500C014FF486E6D13FFB66C16F0831AE0837114C06C4A
! 6E13806C4A91381FFE00CBEA03F846577DD54A>82 D<DA0FFF14F8027F9038F001FC0103B500FE
! 7F010FECFF83013F15E34915FB90B8FC5A5A48EBFC01489038E0001F480180130749C77E484814
! 0049157F485A173F49151F12FF49150FA41707A37F007F705A6D6F5A94C8FC7F6C7E7F6C6C7E6C
! 13E014FC6CEBFFE06C14FE6CECFFE06C15FF6D15E0011F15F86D15FE0101816D6C15C0020781DA
! 003F80030380DB003F7F04037FEE007F717E170F7113808319C0838319E0123F486C167F487EA6
! 7FF0FFC0A26D5DA26D4B13806D5D6D17006D6C141F02E04A5A02FCECFFFC9138FFC00792B65A60
! 6001BF1680018F93C7FC01835DD9007F14F86C010F14C0003E9026007FFCC8FC3B5879D64A>I<
! 003FB912FE4884BB1280A7903BC0000FFC0001AB6C487013006CC7167EC893C7FCB3B3B3027FB6
! 7E91B77E4982A56D5E6E5D41567CD54A>I<263FFFF092387FFFE0486D92B512F0B56C4A14F8A5
! 6C496E14F06C496F13E0D807F8CA1300A46D5E000360A76C6C4C5AA86C6C4C5AA5ED01FCED07FF
! 6D4901805B0280150FA24B13C0A5013F90263FDFE05B02C0151FA2168FA2037F13F0A3011F5F02
! E00107133F03FF13F8A4EDFE03D90FE102FC5BA3EDFC0102F1157FA202F314FEA20107D9F80091
! C7FCA54B137EA2D903F7EC7F7EA202FF15FE4B133FA44B131F6D5EA36D496D5A027EC7EA03F045
! 577ED54A>87 D<003FB612F04815F8B712FCA516F816F001C0C8FCB3B3B3B3B3A290B612F016F8
! 16FCA56C15F86C15F0266E62E14A>91 D<121EEA7F80A2487EA27FA26C7EA26C7EA26C7EA2120F
! 7FA26C7EA26C7FA26C7FA26C7FA26D7EA26D7EA26D7EA2130F80A26D7EA26D7FA26D7FA26D7FA2
! 6E7EA26E7EA26E7EA2140F81A26E7EA26E7FA26E7FA26E7FA26F7EA26F7EA2151F82A26F7EA26F
! 7EA26F7FA26F7FA26F7FA2707EA2707EA2161F83A2707EA2707EA2707FA2707FA2707FA2717EA2
! 717EA2171F84A2717EA2717EA2711380A283A271130084183C396E78E14A>I<003FB612F04815
! F8B712FCA57E7EC8120FB3B3B3B3B3A2003FB6FC5AB7FCA56C15F86C15F0266E7BE14A>I<EC07
! 80EC1FC0EC7FF0903801FFFC010713FF011F14C0017F14F048B612FC000715FF001F16C04801FD
! 14E048D9F07F13F0B5D8C01F13F84A7E9038FE000301F8130001E0143F6C48EC1FF06CC8EA07E0
! 001CED01C02D1472D54A>I<001FB812FC007F17FFA2BA1280A46C1800A2001F17FC390A787C4A>
! I<14F0EB03F8EB07FC130FEB1FFE133FEB7FFCEBFFF84813F04813E04813801400485A485A5BA2
! 485AA2485AA25BA212FF5BA713FC7F7F6C138014C0A37EA27E6C13806C13006C5AC65A172C66DF
! 4A>I<903801FFFE011FEBFFE0017F14F890B612FE486F7E48824882834882DA80037F91C76C7E
! 707E160F6C486E7F826C486E7FEA00F090C9FC84177FA593B5FC157F020FB6FC147F0103B7FC13
! 0F133F90B8FC48EDFC7F48ECF0004849C7FC4813F04813C04890C8FCEA7FFC5B5B485A5BA66D15
! FF6C6C5CA26D1407D83FFE141F6D027F13F86CD9E007B612FE6C90B9FC6C19807E6C16DF6C160F
! 6DECFC07011FDAF00314000107913980003FFE9026007FF8CAFC414078BE4A>I<383FFFF0487F
! B57EA57E7EEA000FAFEE1FF893B5FC030714E0031F14F8037F8092B67E02FD8191B87E85DCE01F
! 7FDC00077F03FC01017F4B6D6C7E03E0143F4B6E7E180F4B8192C87E7213805C844A17C084A31A
! E0197FAB19FF1AC08060A26E1780604E1300816F5C4E5A6F143F6F4A5A6F4A5A6F130303FF495B
! DCC03F5B93B65A6102FD93C7FC02FC5D6F14F8031F5C6D486C14C0902603F00149C8FC90C8EA3F
! F043577FD54A>I<92387FFFC00203B512FC021F14FF027F158049B712C04916E0010F16F05B49
! 16F849EBC0004948C7127F4813F8485B02C0EC3FF0485B4890C8EA1FE0EF0780484892C7FC5B5B
! 123F5BA2127F5BA212FF5BAA7F127FA37F123F7FEF01F86C6CED03FC6DED07FE6C7E170F6C13C0
! 6EEC1FFC6C6D143F6C01FCEC7FF86C01FFEB01FF6DD9F00F13F06D90B612E06D16C06D16806D16
! 0001015D6D6C5C021F14F0020714809126007FF8C7FC374076BE4A>I<93381FFFF84C7F4C7FA5
! 8282EE0007AF913801FF80020F13F8027F13FE49B612874915C7010F15F74915FF5B5B90B5EA80
! 7F489038FC000F4849130302E07F48497F4849147F91C8123F485A49151F170F485A5B007F1607
! A25BA212FF5BAB7F127F170FA27F003F161F7F173F6C7E6D157F000F16FF6D5C6C7F6E13076C01
! F05B6C01FC133F6C01FF90B712806D90B812C06D03F714E06D15E76D15C76D15870101ECFE076D
! 4A6C14C0021FD9E0011480020390CAFC43577BD54A>I<EDFFE0020713FE023FEBFFC091B612F0
! 0103814915FE49814982498249D9C03F7F9039FFFE00074801F801017F4801E06D7F4849147F4A
! 6E7E4890C8121F49150F4848821707485A844981127F5B19808312FF90B9FCA719006001C0CBFC
! 7F127FA27FA26C7EA26C6C167E18FF6D4B13806C7E6C6D5C806C01F04A13006C6D5C02FEEC3FFE
! 6C6D6C137F6D9039F803FFFC6D90B65A6D5E01075E6D5E6D5E6D6C4AC7FC021F14F8020314C091
! 26003FFCC8FC394078BE4A>I<933803FF80043F13F093B512FC0303804B80151F4B15805D92B7
! FCEEFC074A13F04AD9C00313004C6C5A715A4A90C712304B91C7FCAB003FB812F04883B97EA56C
! 5F6C5FC7D807FEC9FCB3B3A7001FB87E48834883A56C5F6C5F39577BD64A>I<4AB46CEB1FF802
! 0F01F090B5FC023FD9FC07148091B6001F14C0010392B6FC4918E05B5B5B4901819138F07FC091
! 26FC003F130049486DEC3F8002E00107EC040048496D6DC7FCA248496D7FA291C8FC488349157F
! A86D15FF6C5F6E5BA26C6D495BA26C6D4990C8FC02F8131F6D6C495A9138FF81FF92B55A5F90B7
! 5A5F485E94C9FCD9FE3F13FC020F13F00201138091CCFCA37F7E8014E46DB612E017FF6D16F049
! 16FC90B9FC48844818E04884480180C7003F7F4848C8120101F89238003FFC4848EE0FFE491607
! 4848707E84498200FF198090CB127FA66D17FF007F19006D5E6D5E6C6C4C5A01FC161F6CB4EE7F
! FC6C01C04A485A02F8140F6C9026FFC001B55A6C91B75AC618806D94C7FC6D5E010F16F8010316
! E0D9007F92C8FC020F14F8DA007F90C9FC435F7CBD4A>I<383FFFF0487FB57EA57E7EEA000FAF
! EE1FFC93B57E030714E0031F804B804B8002FDB67E91B8FC85EEE01FEE80034B486C7F15F84B7F
! 4B815D4B147FA292C8FCA25CA35CB3AC003FB6017FB512F8486FB612FCB700C115FEA56C038015
! FC6C4B6C14F847567FD54A>I<15F0EC03FC4A7E4A7EA24A7FA46E90C8FCA26E5A6E5AEC00F092
! C9FCAC001FB512FE4880825AA37EA27EC71201B3B3A7003FB812E04817F018F8B9FCA37E18F06C
! 17E0355775D64A>I<160FEE3FC0EE7FE0EEFFF0A24B13F8A46F13F0A2EE7FE0EE3FC0EE0F0093
! C7FCAC0107B612E04915F04915F8A57F7F90C8121FB3B3B3A9163F17F0A2167F000F16E0D83FC0
! 14FF487E4B13C0486C5B4B1380031F13006D137F90B65A6C5D5E5E6C5D6C1580000792C7FC0001
! 14F8D8001F13C02D7779D64A>I<383FFFE0487F80B5FCA37EA27EEA0007B0043FB6FC4C1580A2
! 93B712C0A3701580A27015009326001FFCC7FC4D5A4D5A4C485A4C5B4C5B4C90C8FC4C5A4C5A4C
! 5AEEFFE04B5B4B5B4B90C9FC4B5A4B5A153F4B7E92B5FC02F98014FB91B67E4B6C7E4B6C7E15F8
! 4B6C7E4B6C7E4B6C7E15804B6C7E4A6D7F4A6D7F5C717E717E717EA2717E717E717EA2717F717F
! 003FB6013FEBFFE0486F4814F0A2B76CB612F8A36C4B6C14F0A26C4B6C14E045567ED54A>I<00
! 3FB6FC4881B77EA57E7EC8FCB3B3B3AE003FB9FC481880BA12C0A56C18806C18003A5678D54A>
! I<037FEC1FC0283FFC03FFE0EBFFF8267FFE0FD9F0037FB5003FD9F80F7F4A6D487F91B56C4880
! 70488094B6FC7E6C02819138E07FE0C649C6EC803F4A15004A6D48131F4A4A804A6D48130FA24A
! 5CA24A5CA491C75BB3AD003FD9FC07B548B512C0486D48028314E0B603C314F04B14C7A36F14C3
! 6C01FE038314E06C496C020114C04C3E81BD4A>I<EE1FFC263FFFF090B57E48D9F80714E0B5D8
! FC1F804B804B8002FDB67E91B8FC6C846CEDE01FD8000FEC80034B486C7F15F84B7F4B815D4B14
! 7FA292C8FCA25CA35CB3AC003FB6017FB512F8486FB612FCB700C115FEA56C038015FC6C4B6C14
! F8473E7FBD4A>I<EDFF80020F13F8023F13FE91B67E010315E04981011F15FC4981498190B500
! 80809138FC001F4801F001077F48496D7F48018001007F91C8127F48486F7EA248486F7E49150F
! 003F83491507A248486F7EA448486F1380AB6D5D007F1800A36D5DA26C6C4B5AA26C6C4B5AA26D
! 153F6C6C4B5A6E14FF6C6D495B6C6D495B6E5B6C01FC011F5B6CD9FF80B55A6D90B6C7FC6D5D6D
! 5D6D5D010315E06D5D6D6C91C8FC020F13F8020113C0394078BE4A>I<EE1FF8263FFFF090B5FC
! 48D9F80714E0B5D8FC1F14F8037F8092B67E02FD8191B87E6C846CDBE01F7FD8000FDA00077F03
! FC01017F4B6D6C7E03E0143F4B6E7E180F4B8192C87E7213805C844A17C084A31AE0197FAB19FF
! 1AC08060A26E1780604E1300816F5C4E5A6F143F6F4A5A6F4A5A6F130303FF495BDCC03F5B93B6
! 5A6102FD93C7FC02FC5D6F14F8031F5C6F14C0030149C8FC9238003FF093CAFCB3A3003FB6FC48
! 81B77EA56C5D6C92CAFC435D7FBD4A>I<DB7FE0133F912607FFFC497E021F9039FF80FFC091B6
! 12E04981010781498149814992B5FC49EBE01F90B5EA00034801FC7F4801F06D7E4801C0804A80
! 4890C8FC4981001F825B484881A24981127F5B83A212FF5BA97FA2127F5F7F123F6D5DA26C6C5D
! 5F7F6C6C5D6E5C6C6D5C6C6D91B5FC6C01F8130302FE130F6C9038FFC03F6D90B7FC6D5D6D5D01
! 075D6D15E001005D023F1400020F13F8020013C092C8FCB3A30407B612F84C15FCA24C15FEA370
! 15FCA27015F8475D7BBD4A>I<EF07FF003FB56C017F13E0486E48B512F8B6D8E00714FC041F14
! FE167F93B7FC15E16C14E36C02E7EBFC0FC7D87FEF13E092B5380007FE5E04F8EB03FC4CEB00F0
! 4C14005E5E93C9FCA25D5DA25DA35DA45DB3A5003FB712FC4882B9FCA56C5E6C5E403E7CBD4A>
! I<DA3FFF137C0103B5EAF0FE011FECFCFF017F91B5FC48B8FC5A5A5A5A48EBE00149C77ED87FF8
! 141F01E080484880A24980A47F705AD87FF06E5A6D92C7FCEA3FFEEBFFE06CEBFF806C14FE6CEC
! FFE06C15FEC66F7E6D15E0010F81010115FCD9001F80DA007F7F03011480ED001F040713C00401
! 13E0003F81486C157F486CED3FF0A2171F7FA27FA26D153F18E06D157F6D15FF6D6C010313C06E
! 130F02F890B5128091B7FC18005F5F01BF15F0018F5D010315806CC602FCC7FC003E010F13C034
! 4075BE4A>I<EC1F804A7E4A7EAF003FB812F84883B97EA56C5F6C5FC7D87FE0C9FCB3AB183FF0
! 7F80F0FFC0A65F6F1580023F5C816F010F13006E6C5B9239FF807FFE6E90B55AA26E5D6E5D6E15
! C06E5D033F49C7FC030F13F8030113803A4F7CCD4A>I<263FFFF049B57E486D4980B56C4980A5
! 6C816C81D8000F91C7127FB3B118FFA25F5FA26E140F6D6C5C6F137FDBF003B612F86D90B812FC
! 1AFE7F7F6E816E14FC020FDAF03F13FC0203DA801F13F89126007FFCC9FC473E7FBC4A>I<003F
! B500C0017FB51280486E90B612C06F5AB617E0A36C19C04B7E6C4A6D148026003FE0C8EB800001
! 1F94C7FC6E5CA2010F5E6E1403A201075E6E1407A201035E6E140FA201015E6E141FA26D5E6F13
! 3FA2027F5D6F137FA2023F5D6F13FFA2021F92C8FC6F5AA2020F5CEDF803A202075CEDFC07A202
! 035CEDFE0FA202015CEDFF1FA26E5C16BFA2037F5B16FFA26F5BA36F90C9FC6F5A6F5A433D7DBC
! 4A>I<003FB500C0011FB512E0486E4914F06F5BB617F8A36C19F04B7F6C4A6D14E0C690C93807
! F800A580017F4C5AA56E151F013F5FA316FCED03FF6E48EB803F011F5FA24B13C0A36D6C485DEF
! E07F16DF16CF033F13F0A2010794C7FCDAF87F5C83168F168715FF01035E6E14FC160317FD14FD
! A20101D9FE015B02FF14FFA24B7EA26D5EA24B137FA26E486D5ADA3FC0EB0FE0453D7EBC4A>I<
! 001FB5D8E007B512F8486E4880484B8015F8A315F06C6F5C6C4A6C5C260007FCC7D83FE0C7FC6E
! 4A5A6D6C14FF6D6D485B6D93C8FC6E6C485AEDE007DA3FF05B021F495A6E6C485AEDFC3F02075C
! 6E6C485A6EB55A8094C9FC6F5A6F5A151F5E6F5A4B7E82153F4B7E92B5FC83913801FE7F4A486C
! 7E02076D7E03F87F4A486C7E021F1307DA3FE07F4B6C7E027F6D7E4A487E4990C77F717E49486E
! 7E494881010F151F4A6E7E003FB5D8C001B512FE486E4880B649158015F0A315E06C6F15006C4A
! 6C5C413D7CBC4A>I<003FB500C090B6FC486E481580B65B03F016C0A303E016806C816C4A6C15
! 0026003FE0C7000190C7FC60131F6E1403010F5EA26E140701075E80170F01035E800101151F6E
! 5DA26D153F6F5C147F177F6F5C143F6F13FF021F92C8FCA26F5A020F5CA2EDF80302075CA29138
! 03FC075F15FE14014C5AEC00FFA24C5AED7F9FA25FED3FBF16FF6F5BA36F90C9FCA2815EA21503
! 5E1507A25E150FA25E151FA25E153FA25E157F486C5CD80FF013FF487E4A90CAFC486C5A5D1407
! EC1FFCEC7FF890B5FC6C5C5D6C5C6C5C92CBFC000113FC6C5BEB1FC0425D7CBC4A>I<000FB912
! E04818F04818F8A619F001F0C8000713E04D13C04D13804D13004D5A4D5A4C5B6C484A5B6C484A
! 5BC9485B4C5B4C90C7FC4C5A4C5A4B5B4B13E04B5B4B5B4B90C8FC4B5A4B5A4B5A4A5B4A5B4A5B
! 4A5B4A90C9FC4A5AECFFFC495B495B495B4949EC07E04949EC0FF04990C8EA1FF8495A495A485B
! 485B485B485B485B4890C9FC4890B8FCBAFCA66C18F06C18E03D3D7BBC4A>I<EF1FFE0403B5FC
! 041F1480167F4BB6FC5D150F4B1500604B01F8C7FC4B90C8FC16FC16F04B5A5EB3AC5CA24A5B14
! 0F023F90C9FC49B5FC001FB55A007F5CB65A5D5DA281816C80001F80D800017FEB003F020F7F14
! 036E7FA280B3AC826F7E16FC16FF6F13F86FEBFFFE846F15801503816F7E161F04031400933800
! 1FFE396E78E14A>I<121EEA7F80A2EAFFC0B3B3B3B3B3AEEA7F80A2EA1E000A6E60E14A>I<EA3F
! FC387FFFF0B512FE6E7E15E08115FC6C807ED800077FD9003F7F140F14036E7F80B3AC82A26F7E
! 16FC6FB4FC17E06FEBFFFC6F14FF6F15808181A25D5D4B15004B14FC4B01E0C7FC94C8FCED7FFC
! 16F04B5AA25EB3AC5C4A5B140F143F0107B5C9FC003FB55A5AB65A15F05D15804ACAFC6C13F0D8
! 3FFCCBFC396E78E14A>I E /Fg 42 123 df[<96263FFFFC93387FFF80063FB600C0021FB512F8
! 0507B700F891B612FE053F04FF01076F7E4CB9D8C03F82040F72B812F0043F06F98393B626F800
! 1F90B6D8F8037F030392C70001DCC0077F4B02F86E6C4AC65A031F02C092B648497F4B91C84803
! F016804B494B4B5B92B500F84B5D4A4A4B4B4914C04A5C4A4A4B92C7FC4A5C94C95D5C4A4961A2
! 4A49761480A2754A6E140091B5775B4C70715B7B5B75715B759438007FC07595C8FCB3A4C212FC
! AAC702FCCA02FCCBFCB3B3B3B0003FB800F0013FB9FCA99126E0001F9438E00007>146
! 142 123 269 136 11 D[<F31FF0517E517E517EA2507FA25080A35080A25080A35080A25080A3
! 5080A297B67EA34F81A24F82A34F82A24F82A24F82A3DF3FFD81A2DF7FF9811AF8A24F486C80A2
! 4E01E081871AC04E6E81A24E496C81A21A004E6E81A24E486D81A24E488387A24E486D81A24E48
! 8388A24D496E80A24D498488614D7081A24D90C86C81A260051F7081A24D486F81A260057F7081
! A24D487080A24C498589A24C497081A24C498689A24C90CA6C81A24C90BC7EA34C88A24C88A393
! BE7EA24B01E0CB003F80A25F4B7481A24B497281A24B90CC828AA24B487381A24B48898A5E037F
! 7481A24B487480A25E4A7680A24A497481A25E4A76815C49B500FE7481B900E0043FBA12FEA991
! C76C09C0C77E>159 141 120 268 176 65 D[<BF7E1EFF1FF01FFEF7FFC020F820FE7A7E8D21
! F0C700030380C9000F810B0181776C14FF0C1F8178810C03818A78818E8B79808E8B8E8BA22380
! A28BA223C0AA2380A267A22300A2555CA2555CA2555C6A9CB65A66545D545D544AC7FC545C545C
! 9BB612E00B0315800B1F92C8FC9AB612F895BB12E09DC9FC1FF81FE01FFF20F020FE0680C90007
! ECFFC0E3007F14F00C0F14FC0C0380786E7E7815E00D3F8079808E7980798023807915C08B23E0
! 23F08B23F8A27A14FCA323FE8CA323FFAB23FE68A39DB612FCA35515F8A25515F0A25515E06755
! 15C05515805515009CB7FC545D0C075D0C1F5D9BB75A0B0F16C0C35A57C7FC6921F021C09EC8FC
! 20F820C00DF8C9FC54CAFC>144 139 120 266 166 I[<0803B500C0EE01F00703B600FEEE03F8
! 077FDBFFE015070607B800FC150F063FDDFF80143F4DBA00E0147F050F07F814FF053F07FE5B94
! BC6C5A0407755A4C9326F8000FECF00F043F4BC86C6D5A93B700E0030FEBFE7F03034BC9000190
! B6FC4B03F8707E4B03C0171F033F92CB12074B02FC8492B648844A03E0727E02074B854A92CD7E
! 4A4A864A4A864A4A864D8691B64886494B875B494B8794CF7E495C498B5E498B495C8D90B65A8D
! 5A5E488CA2485D227FA2485DA2223F5AA293D1FC5AFA1FF09FC7FCA25AA35DA3B6FCB37EA381A3
! 7EA46CF90FF070F51FF8A27EA2827EA36C6F1D3F23F07E826C217F23E06D8022FF6D6E1EC06D67
! 826D6E5213807F715113006D816D555A6D6F1B1F6E6E515A71515A6E6E1BFF6E6E505B6E6E505B
! 6E03C04F5B02016F4F5B6E03F8073F90C7FC6F6E4F5A6F02FF4E485A030F03C005075B6F03F805
! 1F5B6F03FF057F5B030004E00303B51280043F03FE033F91C8FC040FDBFFF80107B55A7093B812
! F804001BE0053F1A80050F4FC9FC050119F8DD003F18E0060795CAFCDE007F16F8070393CBFCDF
! 000314C0>141 143 115 268 168 I[<BFFC1EFEF6FFE01FFEF7FFC020F020FE7A7E21E021F8C7
! 000303C0C8000182E2000715FFE3007F15C00C1F810C03810C0015FC0D3F800D0F8079810D0181
! 79817A807A807A808C7A808F7A818C7A81A27B80A17E8DA17E8DA17EA27B80A37B80A2A11380A3
! 7B15C0A4A113E0A38DA113F0A7A113F8B3A113F0A6A113E0A269A3A113C0A3A1138069A2A11300
! A269A15AA2575CA2A15A69A15A69A15A9EB6FC565DA15A685692C7FC565C6B565C689DB65A555D
! 555D0D0F5D554AC8FC0D7F5C54B65A0C0F5D0C7F15C00B07B75A52B748C9FCC212F86921C056CA
! FC20F820C055CBFC1FF054CCFC9BCDFC>157 139 120 266 179 I[<C212F8A48DA6C7000303E0
! C9123F1D000C0F801E031E001F3F1F0F8B8B8B797F8CA28C8CA28CA28C8EA28CA38CA3E23FF082
! A28CA67B7EA21C7FA29EC8FCA21CFFA263A26363631B3F98B5FC1A0F95B8FCAA9538E0000F1A00
! 1B3F1B0F878787A287A21C7FFAFFC0A30A3F4C1380A6571300A499CAFC69A26AA2210FA3211F6A
! A2213FA2217FA2575AA26868A268565B6868689DB5FC1F030D0F5C679CB6FC1E071E7F0B1FB7FC
! C3FC6AA66AA3>138 138 120 265 153 I[<C21280A421C0A6C7000303E0C81201F400070B0015
! E01E1F1E071E018A8B8B8B7913F08B8BA28BA28BA2207F21F8203FA4201FA321FCA2200FF4FFC0
! A5F807FEA49DC7FC63A463A363636363630803B5FC1A1F95B8FCAA9538E0001F1A03F2007F8787
! 878787A387A487AA99CBFCB3ACBC12FCA992C8123F>127 138 120 265
! 146 I[<0803B500C0EE01F00703B600FE4C7E077FDBFFE015070607B800FC150F063FDDFF8014
! 3F4DBA00E0147F050F07F814FF053F07FE5B94BC6C5A0407755A4C9326F8000FECF00F043F4BC8
! 6C6D5A93B700E0030FEBFE7F03034BC9000190B6FC4B03F8707E4B03C0171F033F92CB12074B02
! FC8492B648844A03E0727E02074B854A92CD7E4A4A864A4A864A4A864D8691B64886494B875B49
! 4B8794CF7E495C498B5E498B495C8D90B65A8D5A5E488CA2485D227FA2485DA2223F5AA293D1FC
! 5A7C5A9FC9FCA25AA35DA3B6FCB37EA36F061FB692387FFFF89DB8FCA27EA46C81A36C98C903F8
! C7FCA2827EA36C81A27E827E827FA26D806D80A26D807F836D816D816D8180836E806E14FF6E6F
! 606E81020103F0606E816F02FE606F6E6C5F030F03E05F6F03F8177F6F03FF4CB7FC030004F003
! 0713FD043F03FF033F13F8040F04FC0107B5487E7093B8EAE01F0400517E053FF20003050F4F13
! 00050107F8143FDD003F06E0140F060795C81203DE007F04F8ED00F00703048093C8FCDF000302
! E0CDFC>157 143 115 268 183 I[<B6037FB56C010FB500F00207B512F892B994B9FCA9C70003
! 03E0CC003F4AC8FCB3B3B095BEFCAA06E0CC123FB3B3B3A3BC6C010FBB12F8A992C86C07F0C712
! 07>165 139 120 266 182 I[<B66C023FB512E092B9FCA9C7000103F0C8FCB3B3B3B3B3B3ABBC
! 12E0A90380C7123F>75 139 122 266 88 I[<B6037FB56C0307B500C0EB1FFF92B996B7FCA9C7
! 000303E0CC00030380C7FCE6001F01F0C8FC23C0575B9EB5C9FC565B565B565B5613E0565B0E7F
! 5B9DB5CAFC555B555B5513F0555B0D3F5B555B9CB5CBFC5413FC545B0C0F5B545B545B545B5448
! CCFC535B0B075B535B535B535B5390CDFC535A0A035B525B525B525B5213805290CEFC51485A51
! 5B515B5113E0515B1B7F98B57E50805080625080083F80508097B7FC4F824F824F82191F4F824F
! 8296B87E18E106E301F98106EF01F08195B5486C811AC0E0003F814F6D814F6D81614F6D814F6D
! 8107806D8196C7FC4E6E814E6F814E6F81604E6F8176817681A2768176817681A2778177817781
! A2778177817781A2778177817881A2788178818A8E788178818A8E78817981A2798179817981A2
! 798179817981A279817A810D03B712E0BC6C023FBA12E0A992C86C08E0C7FC>163
! 139 120 266 182 75 D[<B6033FB512FC92B9FCA9C7000303E0CEFCB3B3B3B39C3801FF80A467
! 2100A667A368A21F0FA31F1FA31F3F68A21F7FA21FFFA26666A266545B6666669BB5FC65651D0F
! 1D3F9AB65A1C031C1F0903B7FCC1FCA568A5>121 139 120 266 140 I[<B900E00C7FB812F006
! F853B9FCA272657265A37265A27364C70003A101FCC8FC73F43FEFA204BF6EF47FCFA3049F6EF4
! FF8FA2048F6E51130FA204876EF303FEA204836EF307FCA304816EF30FF8A204806FF21FF0A271
! 6EF23FE0A2716EF27FC0A3716EF2FF80A2716E4F1300A2716E4F5AA2716E4F5AA3716E4F5AA271
! 6F4E5AA2726E4E5AA2726E4E5AA3726E4E5AA2726E4D90C7FCA2726E4D5AA2726E4D5AA3726E4D
! 5AA2726F4C5AA2736E4C5AA2736E4C5AA2736E4C5AA3736E4B90C8FCA2736E4B5AA2736E4B5AA2
! 736E4B5AA3736F4A5AA2746E4A5AA2746E4A5AA2746E4A5AA3746E4990C9FCA2746E495AA2746E
! 495AA2746E495AA3746F485AA2756E485AA2756E485AA2756E485AA37502F990CAFCA275ECFFFE
! A2755DA2755DA3755DA2765CA2765CA2765CA37691CBFCA2027F01FC715BB900FE0903BB12F076
! 5BA2765BA3765B775AA29126C00007DE1F8006F8C71207>204 139 120
! 266 221 I[<97B512F0077FECFFE0060FB8FC067F17E00507B912FE051F727E94BB12F004031A
! FC040FDBF00015FF043F4AC7000715C093B600F0020015F04B0380031F8003074AC9000714FE4B
! 02F8040180033F4A7015C04B02C0053F8092B64871804A92CB6C80020702FC060314FE4A4A7280
! 4A4A72814A4A7380A24A4A738091B64873804992CD6C80498C494A7480A2494A7480494A7481A2
! 498D4C86498D4C8790B68B4C87488EA2488E4C87488EA293CF7E488EA3482380A24B884823C0A5
! 4823E0A24B88A5B621F0B36C23E0A46F64A26C23C0A56C23806F64A26C2300A36C6F515CA36C6A
! 70636C6AA26C6F515CA26D697098B6FC6DDE07FE617092267FFFC05C6D4DB500F8606D6E02076E
! 4A92C7FC4F14FF6D6E4A6F495C6D4D6F5E6D6E91267FFC036D495C719028FFE0007FF05B6D6F02
! 80D91FF8495C6E4B90C76C6C5E6E02E0496E6C495C6E6E48486E6C90B65A6E02F8704992C8FC6E
! 02FC4904835C6E02FE7001C75C6EDAFF8394B65A6E6C02C37015E06F02E3626FDAFBFC6F5D0307
! 02FF4FC9FC6F6F6003006F4B14F0043F03C00107B612C0040F03F0017F92CAFC040392B812FC04
! 001AF0053F07C01640050773ED01F0050073ED03F8060F84DE007F15E70700DAF0037F97C86E15
! 078B0EC0140F7A143F7702F814FF0EFE131F9DB7FCA112F089A47817E0A38AA112C0A2781780A3
! 781700A2785E6B8A785E6B8A795D795D795D794AC7FC795C0D0114F0796C13C0E60FFEC8FC>
! 149 180 115 268 175 81 D[<BD12FEF4FFFEF5FFF01EFF1FE01FFC1FFF20E020F88CC7000303
! C0C8003F15FF0A0016C00B0F810B03810B0015FC0C3F807880788178818A78818E8A8E8E8B8EA3
! 7980A48FAAA0C9FCA36A67A26AA29CB65A6AA2545D545D6A5492CAFC545C545C0C7F5C9BB612E0
! 0B075D0B1F92CBFC52B612FC0A3F15F095BB12C055CCFC1FF01F809CCDFC1FC01FF806C0C70001
! 15FEE1003F800A0715C076810A0081778077807780778077818D898D898D898DA37880A78DA98D
! A7A1EB03C07CEC0FF0A1EB1FF8A38A8EA278183F7C15F08AA1137F786F15E0786F14FFBC1DC078
! 6F5B786F491380799126FF800F13000D1FEDE03F7992B55A0D035F0D0017F00E1F5E92C8080316
! 80D4001F4AC7FCE7003F13F0>165 141 120 266 175 I[<93260FFFF8163E4BB600E0157F031F
! 03FE5D037FDBFFC05B4AB800F05B020F05FE5B4A716C5A027F725A91BAEAF03F01039126FE000F
! 6E5A4902C0D9003F01FEB5FC4991C8000790B6FC4901FC15004901F0163F4949160F90B5481603
! 4B824891CB7E4849848748498487484984A2488687485B88A24887A288A288B57EA38880A2806E
! 85A2818115F06F725A6C6E95C8FC15FF16E016FC6CEDFFE017FEEFFFF06CEFFF8019F8F1FFC06C
! 19FCF2FF806C1AE06C1AF81BFE6C747E6C1BE0886D866D1AFE6D866D876D876D876D876D7E6E86
! 020F866E8614016E6C85151F03031A80DB003F19C01601EE001F050018E01807DE007F16F01903
! F1003F080F15F81A031A008787090F14FCA287D83F8085486C8512FF87A288A46D86A21EF8A27F
! A36D1CF0A27F5213E07FA26D1CC06E96B5FC6E1B806E606E1B006E6002FE4E5B6E6203C05F03F0
! 4D5B03FC057F5BDBFF8093B55A04F803035CDCFF80021F5C6E02FF49B6C7FC496C92B75AD9FC0F
! 61D9F80319F049C66149013F18804901074DC8FC49010017F890C8001F16C04803004BC9FC007C
! 04011480>102 143 115 268 129 I[<000FC312F8A6488EA404E0C7003F4AC7120303FCC8F000
! 1F03E01C0392C9F1007F4A8A02F81E0F4A8A4A8A4849787F4A8A91CA1B7FA249203FA249201FA3
! 49200FA3492007007F8EA4498CA848487A1380A6CC98C8FCB3B3B3B3A6031FBD12FCA90780C8FC
! >145 137 120 264 162 I[<B500F0023FB500C00107B56C49B6030FB5EC7FFC91B994B995B6FC
! A9C7003F4ACB000103F8CC003FEC800071A126007FF0C7FCA26E6F716F63A119FF6E7666727561
! A26E6F726E63A1608B6E6F764E90C8FCA26E766F6172230FA26E6F726F61A1181F8B6F6E4E6F4E
! 5AA26F7961724E1C7FA26F6F4D6F61A118FF6F7961734D63A26F6F4D6F61A15FA26F6F94B86C4C
! 90C9FCA26F0ACF6F5F734C1C0FA26F6F4C01876F5FA1171F70090363734C71163FA2706E4D6C6F
! 5F0C0F1C7F557E706F031F714C5AA270506D6E5F74033F63A2706F4B486D6E5FA15E557F706F03
! FF724A90CAFCA270506D6F5D744A1C0FA2706F4A496D6F5DA1161F7196C76C6F5D744A1C3FA271
! 6E4A486E6F5DA1167F5480716F011F734A5AA2714E6F6E5D75013F63A2716F49486F6E5DA15D54
! 81716F01FF744890CBFCA2716F4A6F03C05B521C0F5481716F4875485AA27294C96C03F05B7548
! 1C3FA2726E48487003F85BA1157F538272039F75485AA2724C716E5B0AFF98B5FCA2724C715EA2
! 724C7193CCFCA3724C715DA253837268A27392CB6C5DA3734A725DA252847367A2734A735CA252
! 857367A2734A7391CDFCA3734A735BA252857366A27490CD6C5BA37448745BA27448745BE007F0
! F33F80>230 140 123 266 241 87 D<93387FFFFE031FB612F84AB8FC020F17E0023F17F84A17
! FF49BA7E499126F0003F14E04901FCC700078049040114FC496D6E6C7F6F6F7F497180706E8073
! 804980738088858885A2886D5C866D91C9806D5B6D5B6D5B6D5B9038007FC091CBFCA796B7FC05
! 07B8FC0403B9FC167F0303BAFC153F4ABBFC0207EE007F023F15C091B600FCC7FC010315E04992
! C8FC011F14FC4914F04914C090B65A484AC9FC485C485C485CA2485C485CA25A5DA2B6FC92CAFC
! A497B6FCA361816C60A26C6E5D6FED0FEF6C061F816FDB3FCF14E06C6EDB7F8F14FC6C02FE9126
! 01FF0F91B512806C6E02077F6C03C0D91FFE17C06C923AFC01FFF803013F91B612F0010F4D7E01
! 03943880007F01004CC77E021F03F802071580020103E0EC007FDA000349CDFC6A5D7ADB71>97
! D[<ED1FF0017FB5FCB7FCAAEA003F1307A27FB3B196387FFF80060FB512FC067FECFFC00503B7
! 12F8050F16FE053F707E94B912E004F1DAC00F14F804F701FCC78093B500E0023F13FF95C8000F
! 804D6F8005F86F804D03008005C0844D707F94CA6C7F4C717F4C86884C868B888BA28B888BA38B
! A2888BA52080AF2000A56764A367A2676467A2676467647062704D91C7FC7061647193B55A7160
! 714B5C05F803075CDCBFFC4B1480DC1FFF033F91C8FC4B6C01C04A5BDBFC0301F00103B512F870
! 01FF013F5C4B6C91B712C04B013F94C9FC4B010F16FC4B010316E04B010093CAFC92C8001F14F8
! 90CA000149CBFC>113 142 121 268 129 I<94387FFFF8041FB612E093B712FE0307EEFFC003
! 3F17F092B97E020318FE4A84021F9126F8001F14804A02C0010014C091B548C74814E0494A5C49
! 02F017F0494A5C495C494A4A14F84991C8FCA2495B90B55A5AA2485C7314F0485C7314E0487214
! C0731480484A701300745AF20FF84896C8FCA3485CA5B6FCB07EA281A37EA36C80A36CF201FE6F
! EF03FF7EA26C6E5F6C1BFE6F170F6C1BFC6F171F6D6EEE3FF87F6D6EEE7FF06D6EEEFFE06D6E15
! 036D02FC4B13C06D6E031F13806D6E6C027F13006E02F049485A021F02FF013F5B6E92B612F002
! 036002001880033F4CC7FC030716F8030016C0041F4AC8FCDC007F13C0585D78DB67>I[<F53FE0
! 98B6FC4FB7FCAA96C77E1B0FA287B3B194383FFFC0040FB512FE047FECFFC00303B712F0031F16
! FC037F16FF4AB912C702074AC66C13E74A02E0010790B6FC023F91C8FC4A49153F49B500F8150F
! 494A814902C081494A150049854991CA7E5D498590B54883485CA25A5D5AA25A5D5AA25AA35D5A
! A5B6FCAF7EA57E81A27EA37E817EA27E816C626C626F5F7F6D6D94B6FC6D6D5E6D6E5D6D060F81
! 6D02E05D6D6E4B15FE6D6E92B912806E01FE1403021F6D6C011F13CF6EDAF801B5128F020391B6
! EAFE0F020017FC033F16F0030F16C00301EDFE00DB001F14F0040091C74AC8FC>113
! 142 120 268 129 I<94383FFFE0040FB6FC93B712F0030716FE033F707E92B912E0020318F802
! 0FDAFC01804A9126C0001F13FF027F91C700078091B500FC020180494A6E804902E06F7F494A6F
! 7F494A6F7F4991C97E49727F4949844B8290B51A8048854B19C04885484A19E0A248861DF0485C
! A27513F85AA3485CA21DFCA287B6FCA392BBFCA51DF8A203C0CDFCA67EA381A27EA37EA2817EF4
! 07F86C80F40FFC7E6C6E181FA26C6EF03FF86D1A7F6F19F06D6E17FF6D6E4C13E06D6E4C13C06D
! 6E040F13806D6E5E6D02FE047F13006D6E6C4A485A6E02E002075B021F02F8023F5B6E9126FFC0
! 07B512E0020392B75A020096C7FC033F5F030F17F8030117C0DB003F4BC8FC040315E0DC000F01
! FCC9FC5E5D7ADB6B>I[<F07FFF051FB512F04CB612FC040715FF043F16C093B87E0303834BDAF8
! 077F031FDA800F7F4B4948487F4B01F85B92B548814A4A5B4A5C4A4A90B61280A24A91C7FC5C5E
! 5C5E5C731400A24C6E5B91B56F5B735B735B735B0700138097C8FCB3A4BA12F8AAC702FCCBFCB3
! B3B3B0003FB9FCA99138E00007>81 142 121 269 71 I<52B47E93260FFFFC031F13F04BB600
! E0027F7F031F03FE0103B57E92B8D8C00F800203DDF01F80020FDDFC7F1580023F94B6123F4ADA
! 003FDBF07F13C091B500F801071580010302E00101ECFE004902806D6C01F890B5FC4991C86C6D
! 7F49496F7FA249496F6D158049747E4B6F6F130090B5736C5AF507F8489838E000E04B6F93C7FC
! 4887A34887AB6C63A36C636F5D6C63A26D626F5D6D97C9FC6D6D4B5BA26D6D4B5B6D6E4A5B6D02
! E049B55A010002F8010714C04902FF013F5C4992B7CAFC4918FC02F317F0D90FF017C0DAE01F4B
! CBFC011F010115E0DB000F01FCCCFC013F91CFFCA3137FA480A28080A214FF8115F092B812F06D
! F0FFE01BFEF3FFC06D1AF81CFE6D747E1DE06D87896D876D876D876E8791BD7E010788131F017F
! 8890BEFC000302E0C9003F814891CB7E4801FC18074A0601804849727E4849191F4A85488988B5
! 5A88A66E616C65A26E616C656E616C6D4F5B6C6D4F5B6E96B5FC6C6D4E5C6C02C005075C6C02F0
! 051F91C7FC6C6C01FC057F13FC6DD9FF800303B55A010F02F0031F14E06DDAFFC00107B65A0101
! 92B9C8FC6D6C19FC020F19E0020196C9FCDA003F17F8030194CAFCDB000192CBFC6A857ADB74>
! I[<ED1FF0017FB5FCB7FCAAEA003F1307A27FB3B1963803FFFC073FEBFFE04EB612F8060715FE
! 061F6F7E067F16E095B87E0503D9FC03804DD9C000804D48C76C7FDD1FF880DD3FE06E7F4D4883
! 4D5ADCF1FEC86C80EEF3FC5FDCF7F08416FF4D815F8A5F94C9FCA35EA25EA55EB3B3ACB9D8E001
! B912C0A9912680003F94C77E>114 141 119 268 129 I[<EC1FC0ECFFF8010313FE497F498049
! 8049804980A290B67EA24881A96C5DA26D5CA26D5C6D5C6D5C6D91C8FC6D5B010013F8EC1FC091
! CAFCB3A2ED1FF0017FB5FC007FB6FCAAEA003F1307A27FB3B3B3ACB91280A9913880007F>49
! 142 119 269 65 I[<ED1FF0017FB5FCB7FCAAEA003F1307A27FB3B297263FFFF0EB7FC099B6FC
! A908014AC7FC746C13C098B55A5091C8FC5013FC505B081F5B505B50138097B5C9FC07035B4F5B
! 4F13F04F5B077F5B96B5CAFC4E5B4E5B060F5B4E13E04E5B95B55A4D91CBFC4D13FC4D7F171F4D
! 7F4D8094B67E04F38116F793B77E868686A28605F98105E0814D7E4D6C8005008104FC6D804C6D
! 804C7F4C6D80877281728185738088738073808573808873817381867480897480748086748089
! 748174815015F0B96C017FEDFFFEA991C76C9438E0003F>111 141 121
! 268 123 107 D[<ED1FF0017FB5FCB7FCAAEA003F1307A27FB3B3B3B3B3B3A8B912C0A9913880
! 007F>50 141 119 268 65 I<DB3FE0912601FFFC943801FFFC017FB5033FD9FFE0043FEBFFE0
! B74AB600FC4BB612FC060703FF030715FF061F04C0021F16C0067F04F0027F16F095B86C91B87E
! 0503D9FE016E0103D9FE01804D9026C0007F6D499026C0007F7F4D90C76C6D4990C76C7FDD1FF8
! 6EDB1FF8804D486E6E48486E80D8003FDB7FC09426C07FC08301074B484E5A04E190C86C02E190
! C86C806DDAE3FCF0E3FC4D6104E707F785DCEFF0F0FFF04D6F4B81DCFFC061A1804D6194C993C9
! FCA34C61A24C61A54C61B3B3ACB900E090B900E090B912E0A9912680003F942680003F94388000
! 3FB35B77DAC2>I<DB3FE0913803FFFC017FB5033FEBFFE0B74AB612F8060715FE061F6F7E067F
! 16E095B87E0503D9FC03804DD9C000804D48C76C7FDD1FF880DD3FE06E7FD8003F4B488301074B
! 5ADCE1FEC86C806DECE3FC5FDCE7F08416EF4D81EEFFC08A5F94C9FCA35EA25EA55EB3B3ACB9D8
! E001B912C0A9912680003F94C77E725B77DA81>I<94381FFFF00407B612C0047F15FC0303B87E
! 031F17F0037F17FC4ABAFC02079126FC007F14C04A02C0010780023F49C814F84A01F8033F7F91
! B5486F7F494A6F7F4902800303804991C96C804987494970804949717F498790B548717FA2484A
! 717FA2481D80484A7114C0A2481DE0A3481DF0A24B83481DF8A3481DFCA5B61BFEAF6C1DFCA56C
! 1DF86F5FA26C1DF0A36C1DE06F5F6C1DC0A26C1D806F5F6C1D006C6E4D5BA26D6D94B55A6D6D4C
! 5C6D6E4B5C6D6E4B5C6D6E4B5C6D6E4B5C6D02FC037F91C7FC6D6E92B55A023FD9FFC0010714F8
! 6E02FC017F5C020791B812C0020196C8FC6E6C17FC031F17F0030717C0DB007F03FCC9FC040715
! C0DC001F01F0CAFC675D7ADB74>I<DB1FF091383FFFC0017FB50207B512FEB7023FECFFE04DB7
! 12F8050716FF051F17C0057F17F004F1B97E04F3DAC01F14FE93B526F800018006E06D6C8095C8
! 6C14E0D8001F03FC030F8001074B6F806D03E06F804D6F805F94CA804C71804C864C838B888B88
! 8BA27680A38B88A28BA4882080AF2000A264A367A36467A2676467A2525CA2525CA2704D5C7097
! C7FC99B55A705E714B5C7160714B5C05F84B5C71033F5C05FF4B91C8FC06C049B55A06F0010714
! F804F901FF017F5C04F891B712C0053F94C9FC050F16FC050316E0050093CAFC061F14F8060149
! CBFC95CEFCB3AAB912E0A9913880003F718279DA81>I<DB7FC0903801FFC090B6021F13F8B702
! 7F13FF4DB612C04D814D81051F814D01077F94267FF00F7FDEC01F7FEFFF8004C149481480D800
! 3FECC3FC01074D14C0EEC7F86D5DEECFE0A2EEDFC0A2EEFF8073148094C7FC7314004C6E5B735B
! 735B735B4C9138007FC097C8FCA35EA65EB3B3A7B912FCA9913880001F525B79DA60>114
! D<92261FFFF8EB01F00207B638C007F8023FEDF81F91B7EAFE7F010393B5FC130F013F9038F800
! 1F4990C71201D9FFF8EC003F4801E081484915074849814890C97E4982121F197F485A193F127F
! A2191F12FF7FA27F80806E705A02F893C8FC14FF15E06C14FEEDFFF8EEFFE06C16FF18F018FC6C
! EFFF806C18E0856C18FC6C846C727E6C856D84011F846D841303010084023F83140F020183DA00
! 1F1780ED007F1601DC000F15C01700181F060714E0D83F801601486C8200FF84856D83A285A26D
! 83A26D19C0A37F6D1980617F6E1800616E5F6E163F6E4C5A02FC4C5A6E4B5B6E6C02075B03F002
! 3F5B03FF0107B55A93B7C7FCD9FC7F16FCD9F03F16F0D9E00F16C0D9800193C8FC90C7003F14F8
! 007C020349C9FC4B5D78DB5C>I[<ED03FFA85DA65DA35DA35DA35DA292B5FCA25CA25C5C5CA25C
! 5C5C91B6FC13035B011F92B612F8137F0007BAFCBBFCA7C76C91CAFCB3B3A8963801FF80B14F13
! 008083A26E4C5A836E4C5AA26E6E495A6E6E133F71495A6E9139FF03FFE06E92B55A6F5E031F93
! C7FC6F5D03035DDB007F14F0040F14C09326007FFEC8FC>73 130 124 256
! 91 I<DB0FF8F01FF0017FB594B6FCB74BB7FCAAD8003F94C77E0107190FA26D85B3B3AD63A463
! A363A26D61A298B6FC6D60705D6EDD07FB80F20FF36E6D031F15FFE03FE3EDFFC06E6DEDFFC36E
! 02C0010313836E02FC013F13036E91B612FE020017F8033F16F0030F16C003031600DB003F14FC
! 040102C093C8FC725C77DA81>I<D8FFFE49B5923A07FFC007FF90B894B6FCA9D8000302FCCA00
! 0FEBFC000A0113C06D6E4D5BA36D6E4D90C7FCA26E6E4C5AA26E6E4C5AA26E6E4C5AA26E6E4C5A
! A2836E4F5AA26E6E4B5BA26E6E4B5BA26E6E4B90C8FCA26F6E4A5AA26F6E4A5AA36F6E4A5AA26F
! 6E4A5AA26F6E4A5AA26F6E495BA26F6E495BA2846F4C90C9FCA2706E485AA2706E485AA2706E48
! 5AA2706E485AA2706E485AA37002FD5BA27091B55AA27093CAFCA2715CA2715CA3715CA2715CA2
! 715CA2715CA2715CA27191CBFCA3725AA2725AF00FF0705B7BD97B>I<D8FFFC902603FFFED97F
! FC90260FFFF0DA3FFEEB1FF890B792B793B6FCA9D8000F02F0C800070280C9003FEBF0006D726E
! 04071380709CC7FC74806D565A826D726E5F701D1F757F6D565A826E95B56C5F711C7F775F6E4D
! 19FF836E4D6E5F71636E755E5060836E4D6F93C8FC71636E06FD6E5D081F180F836EDD3FF86E5D
! 711B1F6E4E6C6D5D087F183F836F4C486C6D5D721A7F6F4D6C6D5D4F19FF18C06F4B496C6D495B
! 18E06F4D6C02805C724860A26F4B486D6E4890C9FC18F86F4C6D02E05BDEFC1F180FA26F4B486D
! 6E485A18FE6F4C6E01F85BDEFF7F183FA2704A486E6D485AA2704B6E01FE5B20FFA2704B6E90B5
! 5AA27092C86C5DA3704A6F92CAFCA2704A6F5CA3704A6F5CA2704A705BA37149705BA27149705B
! A37149705BA27190CA6C5B71487190CBFC7148715A9D5B7BD9A8>I<D87FFF49B5912603FFF0EB
! 3FFC91B793B6FCA9C76C0280DA001F91C8FC71030313F06E4E13C06E6E5D6E6E4B5B6E6E4B90C9
! FC6E6E5E6E6E4B5A515A6E6E4A5B6F6E495B6F6E495B6F6E5B6F6E495B724990CAFC6F5F6F6E49
! 5A6F6E495A6F6E485B7002835B19C77002CF5B7091B55A7093CBFC705D705D62705D705D83715C
! 718086837180718071804D804D815F874D814D814D81DDFFFB804C01F3804C13F14C01E0804C49
! 6C804E6C804C496C804C48824C487F4C486D804B6F804B496D804B496D804D834B49804B90C86C
! 804B486F804B486F804B486F804A864A49814A496F804C6F804A4970804A90CA6C800103B500E0
! 7080B8031FB812C0A99026F0003F9538F0000F725A7CD97B>I<D8FFFE49B5923A07FFC007FF90
! B894B6FCA9D8000302FCCA000FEBFC000A0113C06D6E4D5BA2705F6D99C7FC836E4F5AA26E6E4C
! 5AA26E6E4C5AA26E6E4C5AA26E6E4C5AA26E6E4B5BA2836E4E5BA26E6E4B90C8FCA26F6E4A5AA2
! 6F6E4A5AA26F6E4A5AA26F6E4A5AA2846F4D5A846F4C5BA26F6E495BA26F6E4990C9FCA2706E48
! 5AA2706E485AA2F1E03F705E19F0704B5AA2706E485AA27002FD5BA27091B55AA27093CAFCA271
! 5CA3715CA2715CA2715CA2715CA2715CA2715CA37191CBFCA2725AA2725AA261A24E5AA24E5AA2
! 4D5BA34D5B137C2603FF804A90CCFC000F13E0486D4A5A487F4D5A487F4D5AB57E4D5AA24D5A4C
! 5B5E604A4990CDFC6C4B5A161F4AEB7FFC6C49495A6CD9E0035B9026FEC00F5BD80FFF017F1380
! 6C90B6CEFC6C5D6C15F86C6C14E06D1480010701FCCFFC010013C070827BD97B>I<0003BC12F0
! 1CF81CFCA41CF80480C7123F03F0C84814F04802C092B612E092C915C002FC5D4A4B15804A4B15
! 004A60604A4B5C4A4B5C4E5CA291C9B65A4D5D4D5D5B4D92C7FC4D5C000F4C5CA24D5C494B5C94
! B65A625E4C5D4C92C8FCC95D5E4C5C4C5C4C5CA293B65A4B5D4B5DA24B92C9FC4B5C4B5CA24B4A
! EC0FFC4B5C92B65A605C4A4BEC1FF84A92C8FC5F5C4A5C4A5C4A5C1B3F91B65A495D494B16F01B
! 7F4992C9FC495C494A16FFA2494A5D495C90B6485D62484B5D484B4B13E04892C95A4B5E484EB5
! FC484A1507484A153F4B0207B6FC4891BAFCBDFCA21CC0A37E7E565A7AD967>I
! E /Fh 61 124 df<DC1FFFEC1FF80303B500F0EBFFFE031FDAFC07EBFF80923D7FFC01FF0FFC1F
! C0913E01FFC0003FBFE00FE04A90C73A0FFFC01FF0DA0FFC4AEB803F4A484A9038007FF84A484A
! 5A4A4814FF4A485D495B92C8FC494DEB3FF04948037FEC1FE0F30780724890C7FC495AB3A3BC12
! E0A426000FFCC8D83FF0C8FCB3B3AE85496C157F90267FFF8049B5FC007FB60081B712C0A45563
! 7DE252>11 D<EE3FFC0303B512C0031F14F092397FF807F8913A01FFC000FC020790C7123EDA0F
! FC804A486E7EDA3FE0EC7FC04A4814FF02FF4A7F49495B4990C7FCA2495AA349486E5B715B72C7
! FC181C95C8FCB0F07FE0BAFCA426000FFCC71207170183187FB3B3AC496C4B7E90267FFF800103
! 13FC007FB60083B612FCA446637DE24E>I<D80FE0EB01FC486C497E486C497E486C491380486C
! 4913C0A26D15E0A3028014F0A26C80D83FFB6D1370D81FF3EB03FED80FE3EB01FCD8000390C7FC
! A5010715F091C812E0A3491401010E15C0A2011E1403011C1580013C14070138150001785C0170
! 140E01F0141E48485C48485C491470000715F048C7485A001E4A5A484A5A00186EC7FC2C2A7BE1
! 46>34 D<EA0FE0487E487E487E487EA27FA31480A27EEA3FFBEA1FF3EA0FE3EA0003A513071400
! A35B130EA2131E131C133C13381378137013F0485A485A5B120748C7FC121E5A1218112A74E127
! >39 D<ED03801507150FED1E005D157C5D4A5A4A5A4A5A4A5A141F4AC7FC147EA25C495AA2495A
! 13075C130F495AA2495AA249C8FCA213FEA3485AA212035BA21207A25B120FA3485AA4123F5BA4
! 127FA25BA612FFB3A4127FA67FA2123FA47F121FA46C7EA312077FA21203A27F1201A26C7EA313
! 7FA26D7EA26D7EA26D7E13078013036D7EA26D7E147EA2806E7E140F6E7E6E7E6E7E6E7E157C15
! 3C81ED0F8015071503218C73E837>I<126012F012787E7E121F6C7E6C7E6C7E6C7E6C7E7F137E
! 7FA26D7E6D7EA26D7E801303806D7EA26D7EA2147FA26E7EA36E7EA281140FA281A2140781A36E
! 7EA4811401A481A280A61680B3A41600A65CA25DA414035DA44A5AA35D140FA25DA2141F5DA24A
! 5AA34AC7FCA214FEA2495AA2495A5C13075C495AA2495A49C8FCA2137E5B5B485A485A485A485A
! 48C9FC121E5A5A5A1260218C78E837>I<EA0FE0487E487E487E487EA27FA31480A27EEA3FFBEA
! 1FF3EA0FE3EA0003A513071400A35B130EA2131E131C133C13381378137013F0485A485A5B1207
! 48C7FC121E5A1218112A748E27>44 D<B712F0A824087EA22F>I<EA07C0EA1FF0EA3FF8EA7FFC
! A2EAFFFEA5EA7FFCA2EA3FF8EA1FF0EA07C00F0F748E27>I<157815F814011403140F143F14FF
! 130790B5FCB6FC143F13F81300C7FCB3B3B3B34A7E4A7E0107EBFFC0B812FEA42F5D74DC46>49
! D<EC0FFF027F13F00103B512FE010F6E7E90261FF00713E090263F80017F017EC7EA7FFC01F8EC
! 1FFE48486E7E48486E138048486E13C0485A48C86C13E0001E17F0003E81003C17F8177F007C17
! FCEA7F8013E0486C153F6D16FE7FA66C5AA26C5A6C5ACA13FC177FA218F817FFA218F05E18E05E
! 18C018805E4C13005F4C5A5F4C5A4C5A5F4C5A4B90C7FC4B5A5E4B5A4B5A4B5A4B5A4B5A93C8FC
! 15FE4A5A4A5A4A5A4A5A4A5A4B141E4AC8FC147E4A153C495A495A495A5C4948157C49C9127813
! 3E5B4916F84848150148B8FCA24817F05A5A5A5AB9FC18E0A3375D79DC46>I<913803FFC0023F
! 13FC49B67E902607FE0113E0903A0FE0007FF0D93F80EB1FFC017EC76C7E496E7ED801F06E7F49
! 8200036F7FEA07FC6D826D80486D8180A66C5BA26C90C8FCD800FC5E90C85AA260A24C5BA2604C
! 90C7FCA24C5A5F4C5A4C5AEE7FC04C5ADB03FEC8FCEDFFFC027F13E016FCEEFF80DA000113E06F
! 6C7EEE1FFC707E707E707F707F707F84717EA284717EA38483A21980A3EA0FE0487E487E487E48
! 7EA31900A25F5B606C5A494B5A13C0003EC95B4D5A7E6C6C4A5B6C6C4A5BD803F05ED801FC4A90
! C7FC6CB4EC1FFED97FC0495A903A1FFE01FFF06DB612C0010392C8FCD9007F13FC020713C0395F
! 7ADC46>I<171E173E177EA217FE1601A216031607A2160F161FA2163FA2167F16F7A2ED01E7ED
! 03C7A2ED0787ED0F07A2151E153CA2157815F0A2EC01E0140315C0EC0780140F1500141EA25C5C
! A25C495AA2495A495AA249C7FC131EA25B5BA25B12015B485AA2485A48C8FCA2121E5AA25A5ABA
! 12F8A4C9D80FFEC7FCB14C7EA293B512E00203B712F8A43D5E7CDD46>I<01C0ED01C0D801F015
! 0701FE153FD9FFC0903801FF8002FE011F130091B65A5F5F5F5F5F5F4CC7FC16F801E714E001E0
! 49C8FC91CAFCB3913801FFC0020F13F8027F13FF9026E1FF007FD9E3F8EB3FE0D9E7C0EB0FF001
! EFC76C7E01FE6E7E4981496E7E496E13804916C06C48157F90C913E0A2EF3FF0A218F8A218FC17
! 1FA318FEA5EA0FC0EA3FE0487E7F12FF7FA318FC5B173F4916F86C5A90C9FC007CEE7FF0A2003C
! 17E0003E16FF6C17C04C13806C7E6C6C4A13006D4A5A6C6C4A5A6C6C4A5AD800FEEC7FF0903A7F
! 8001FFC090261FF8075B6DB548C7FC010314F8010014E0DA0FFEC8FC375F79DC46>I<923801FF
! C0031F13F8037F13FE913901FF80FF913A07FC001F80DA1FF0EB07C0DA3FC06D7E4A486D7E4AC8
! FC4948EC01784948EC0FF849484A7E4948143F011F157F495A495AA2495A5A715A4890C86C5A71
! 5A4893C8FC5B120FA3485AA3123FA3485AED7FE0913803FFFE4A6D7E91391FC07FE091393E001F
! F000FF49EB07F802F06D7E4A6D7E01F96E7ED9FBC0814A6E7E01FF6F7E91C87F8449151F84A284
! 5B717EA4491780A2127FA7123FA27FA3001F1800A3120F4D5A7F12076012036D4B5A6C5F806C4C
! 5A6D6C4A5A013F5E6D6C4990C7FC6E495A6D6C495AD903FEEB1FF86D6C6CB45A6D90B512C0023F
! 91C8FC020F13FC020113E0395F7ADC46>I<913801FFC0021F13F8027F13FF902601FF807F903A
! 03FE003FE0D90FF8EB0FF049486D7E49486D7E49486D7E4948804890C87F48167F49821207000F
! 707E5B001F83003F161F845B007F83A400FF83A2170FA284A71980A2127F5FA3123F7F5F121FA2
! 000F5E6C7EA2000393B5FC6C6C15EF6C6D1301017FEC03CF6D6C148F6D6C13076D6CEB1F0FD907
! FC013E1400903903FF01FC0100EBFFF0023F13E00203130091C8FC4D5AA460A34D5AA260A2D803
! F84B5A487E486C5E486C15FF605E95C7FC4C5AA2494A5A494A5A6C484A5A01C05D00074B5A6DEC
! FF806C6C4990C8FCD801FCEB07FE3A00FFC03FF86DB55A011F14C0010749C9FC9038007FF0395F
! 7ADC46>57 D<EA07C0EA1FF0EA3FF8EA7FFCA2EAFFFEA5EA7FFCA2EA3FF8EA1FF0EA07C0C7FCB3
! ADEA07C0EA1FF0EA3FF8EA7FFCA2EAFFFEA5EA7FFCA2EA3FF8EA1FF0EA07C00F3D74BC27>I<EA
! 07C0EA1FF0EA3FF8EA7FFCA2EAFFFEA5EA7FFCA2EA3FF8EA1FF0EA07C0C7FCB3ADEA0FC0EA1FF0
! EA3FF8127FEAFFFCA313FEA4127F123F121FEA0FEEEA000EA5131E131CA4133C1338A213781370
! 13F013E0120113C0120313801207EA0F00121E121C123C12180F5874BC27>I<EF07804D7EA34D
! 7EA34D7EA34D7EA34D7EA24C7FA34C7F17CFA20407801787A2040F801703A2041F80EE1E01A204
! 3E80EE3C00A24C80187FA24C6D7EA20301814C131FA20303814C7FA20307824C7FA2030F8293C7
! 7EA24B82031E80A2033E82033C80A24B82197FA24B6F7EA34A486F7E92B8FC4A83A3DA07C0C800
! 0F7F4B81A2020F8492C97EA24A84021E82A2023E84023C82A24A841A7FA24A717EA34948717EA2
! 010385861307496C85131F496C4D7FD9FFFE4D7F00076D6C4BB512F8B600FC92B712FCA45E637B
! E269>65 D<BA7E19F819FF1AE0D8003F01F0C7000713F80107499138007FFC4BED1FFF6D05077F
! 070113E0736C7E747E747E747E747E747F747F8688757E757EA2757EA2757EA288871D80A27513
! C0A31DE0A3871DF0A51DF8AF1DF0A51DE0A263A21DC0A3511380A21D0063641B1F64A2515A515A
! A2515A505B505B99C7FC505A505AF23FF8505A4F485A4F5B49050F90C8FC6FED7FFE013F6D9138
! 07FFF8BB12E097C9FC19F819805D607BDF6B>68 D<BC12FCA4D8003F01F0C8001F7F0107491500
! 4B163F6D180F1A031A011A00A21B7F87A287A3871C80A31B07A5F303C0F003C0A398C7FCA51807
! A3180F181F183F187FEF07FF92B7FCA49238C00007EF007F183F181F180F1807A31803A41C3CA3
! 1C7895C9FCA41CF81CF0A41B01A21CE01B03A31B07A2F30FC01B1FA21B3F1B7F1BFF5013801A07
! 49181F6F93B5FC013F6D151FBDFC1C00A356607BDF60>I<BC12F0A4D8003F01F0C86C13F80107
! 4915034BED007F6D183F1A0F1A071A031A011BFC1A00A21B7CA31B3C1B3EA31B1EA51B0FA3F007
! 801B00A7180FA3181F183F187F18FF170792B7FCA49238C000071700187F183F181F180FA31807
! A895C9FCB3A5497F81013F13FEB812F0A450607BDF5C>I<DD7FFC1570040FB500C014F0047F14
! F80303B600FE1301030F903AF003FF8003033F90C7EA3FC0DBFFF891380FF0074A01E0913803F8
! 0F02070180913800FC1F4A48C9123E4A48EE1F3F4A48EE0FFFDAFFE0824949824949824990CBFC
! 5B4A187F4948183F133F4948181F4A180F13FF485B1B07485B1B035A5C481A01A24890CCFCA21B
! 005A5BA2127F99C7FCA35B12FFB0127F6D0403B712FCA4003F94C7001FEBFE00080313F86D725B
! 6C85A36C7FA27E807EA26C7FA26C7F137F806D7E131F6D7E806D6D5E7F6D7F6D01F05EDA3FF85E
! 6E7E6EB4EE1F9F6E6DED3F0F020101E0EDFE076E01F8EC03FCDB3FFF91380FF803030F903AF001
! FFE001030390B6EA8000DB007F4AC71270040F02F091C7FC9326007FFECAFC5E6478E16E>I<B8
! 0103B712FCA4D8003F01FCC9ECF000010701E0041F1380A26D497090C7FCB3B392BAFCA403C0C9
! 120FB3B3A5496D4C7FA2013F01FC93B512F0B80103B712FCA45E607BDF69>I<B812C0A4D8001F
! 49C7FC010313F0A26D5BB3B3B3B3AA497FA2011F13FEB812C0A42A607CDF33>I<B812F0A4D800
! 3F49CBFC010713F05D6D5BB3B3B11BF0A41A011BE0A61A03A31BC01A07A31A0FA21A1FA21A3FF2
! 7F801AFF616161191F49177F6F4AB5FC013F6D141FBC1200A44C607BDF58>76
! D<B600C0077FB512F06F96B6FCA3D8003F6D4EECC000010752C7FCA2902603DFF8953803DFFCA2
! DACFFCF0079FA3DAC7FEF00F1FA2DAC3FF181EA302C16D173CA302C06D1778A26F6C17F0A36F6C
! EE01E0A36F6CEE03C0A26F6CEE0780A36F6CEE0F00A36F6C161EA26F6D5DA36F6D5DA2706C5DA3
! 706C4A5AA3706C4A5AA2706C4A5AA3706C4AC7FCA3706C141EA2706D5BA3706D5BA2716C5BA371
! 6C485AA3716C485AA2716C485AA3716C48C8FCA3943803FF1EA27113BCA37113F8A2725A497EA2
! 496C6F5A496C507EEB7FFE0003B500C06E484AB512C0B70507B712F0725AA272C7FC74607ADF81
! >I<B600C00303B612FC81A281D8001F6DDB000F14000103060113F86F9338007FE06F715A755A
! ECDFFF02CF6D70C7FCA202C77F02C37FA202C17F02C07FA26F7E6F7EA26F7E6F7FA26F7F6F7FA2
! 6F7F6F7FA2707E707EA2707E707FA2707F707FA2707F707FA2717E717EA2717E717FA2717F717F
! A2717F717FA2727E727EA2727E721380A27213C07213E0A27213F07213F8A2F17FFCF13FFEA2F1
! 1FFF73138FA27313CF7313EFA27313FF85A28686A28686A28686497E86496C83497ED97FFE8400
! 03B500C083B7FC8787A25E607BDF69>I<EFFFF0041FEBFF8093B612F003079038801FFE923B1F
! F80001FF80DB7FE09038007FE0912601FF80EC1FF84A48C8EA07FCDA0FFC6FB4FC4A486F7FDA3F
! E06F6C7E4A48707E4A48707E49854990CA6C7E4948717E4948717E011F864948717F4A83017F86
! 4948727EA24849727EA248874849727EA34890CC6C7EA2481C80A24985003F1CC0A4007F1CE049
! 85A400FF1CF0AF6C6C4F13E0A5003F1CC0A26D61A26C1C80A26C6D4E1300A36C6D4E5AA26C636E
! 187F6C636E18FF6C636D6C4D5BA26D6C4D5B6D6C4D5B010F97C7FC6D6C4D5A6D6D4C5A6F163F6D
! 6D4C5A6D6C6CEEFFE06E6C4B5B6E6C4B5B6EB4030F90C8FC02036DEC1FFC6E01E0EC7FF8912600
! 7FFC903803FFE092271FFF801F1380030790B548C9FC030015F0041F1480040001F0CAFC5C6478
! E16D>I<001FBDFCA49126E0000301FCC7FC4848C76C49020F138001F86E49140301E01900491A
! 7F491A3F1C1F90C9FC003E1B0FA3003C1B07007C1CC0A300781B03A748F301E0A5CA94C7FCB3B3
! B3A34C7F4C7F043FEBFFC0020FB9FCA45B5F7BDE66>84 D<B80203B612FCA4D8003F01FCC9000F
! 1400010701E0040113F89738007FE06D49715A755AA275C7FCB3B3B3A66D191E81A36D193E1B3C
! 81027F187C1B786E6C17F863021F17016E6C4C5A636E6C16076E6C4C5A6E6D4BC8FC6E173EDB7F
! E05D6F6C4A5A6F6C4A5ADB0FFEEC0FE0922603FF80EB7FC06F9026F803FFC9FC6F6CB55A040F14
! F8040314C09326001FFECAFC5E627BDF69>I<B700F80307B612C0A4C602FCCA6CEBF800011F01
! E0050F13C06D497190C7FC755A6D735A647F6F607F646F17036D62A26F1707027F6181023F4EC8
! FCA26F5F021F181EA26F173E6E183C826E60A27016F86E60A27015016E60826E4D5AA270150703
! 7F5F821A0F033F94C9FC705D031F161EA270153E6F163C836F5EA27114F86F5EA27113016F5E83
! 6F4B5AA2711307047F5DA271130F043F92CAFC83041F141EA271133E70143CA2F0807C70147818
! C0705CA218E1705C18F118F3705C18FF715BA37190CBFCA2715AA3715AA3715AA2715AA3715A62
! 627DDF69>I<003FB7021FB612F0A4D8001F02F0020302FCC7FC010302C0020014C0010091C9D8
! 3FFEC8FC4B705A027F18F0023F606E6C705A705E6E4DC9FC6E7F70153E6E5F6E7F705D6E4C5A6F
! 7E704A5A033F4B5A6F7E71495A6F4BCAFC836F6D133E6F5D836F6D5B6F4A5A17FC706C485A043F
! 495A05FF5B70130F70019FCBFC18DE7013FE705B60828284177F717E848385855F4D7F057B7F17
! F9DC01F07F4D7F0403137F4C486C7E05807F040F7FDC1F0080041E6D7F043E7F4C8104786D7F04
! F87F4B48814C7F03036F7E4B48814C143F030F6F7E4BC880031E81033E6F7F4B8303788103F86F
! 7F4A48834B810203717E4A48834B163F020F717E021F85023F83027F717F02FF85497F01074E7F
! 013F01F0043F13FC0003B500FC93B67EB76C020FEDFFC0A462607DDF69>88
! D<010CEC0180011EEC03C049EC078049EC0F0049141E49141C0001153C48485C48485C90C85A48
! 1401000E5D001E1403001C5D003C1407003892C7FCA200785C0070140EA300F0141E48141CA5D8
! E3F8147FD8E7FCECFF80D8EFFE011D13C0B5011F13E0028014F0A26C80A36C80A26C496C13E06C
! 486D13C06C486D13806C48EC7F002C2A6CE146>92 D<EC1FFC49B512C0010F14F090391FF00FFC
! 90397F0003FE01FC903800FF80D801F06E7E48486E7E01F881D807FE6E7E6D140F48826E130783
! A3707E6C90C7FCA26C5AEA00F890C8FCA54BB5FC92B6FC140F027F13E3903903FFF803010F1380
! 90381FFE00EB7FF8EBFFE0485B4890C7FC5A485A485A485AA2485A193CA212FF5BA25EA35E7F00
! 7F5D161D6C6C023CEB80785E6C6C5C6C6C903A01E07FC0F03D03FF8007C03FF3E06C9026F03F80
! EBFFC06C6CB5486C1380010F01FC01071300010001E0EB01FC3E407ABE46>97
! D<14F8EA07FFB5FCA41201EA007F133F131FB3A9EE7FF00303B5FC030F14C092393FC03FF09239
! 7E000FFC03F8EB03FEDAFBF0EB00FFDAFFC06E7E4BEC3FE092C8121F4A82727E4A82727E5C727E
! 1A80A2841AC0A21AE0A284A21AF0AC1AE0A3601AC0A31A80601A00A24E5A6E5E180F6E4B5A616E
! 4B5ADAEF804A5ADAE7C04A5ADAC3E04990C7FCDAC1F8EB07FCDA80FCEB1FF8913A003F80FFE06F
! B51280011E010749C8FC90C813E044637CE14E>I<EDFFF0020F13FF023F14C09139FFC03FF001
! 0390380003FCD907FCEB007E494880D91FE0EC0F80013F153F4948ECFFC049485B4817E04890C7
! 5A5B1207120F5B001F6F13C0A248486E1380EF3E0094C7FC127FA25BA212FFAD127F7FA3123FA2
! 6C6C16F0A36C6C1501000717E06D15036C17C06C6D14076C17806E140F6D6CEC1F006D6C143ED9
! 0FF85C6D6C495A6DB4EB07F001009038C03FC0023FB55A020F01FCC7FC020013E034407BBE3E>
! I<F00F80EF7FFF040FB5FCA4EE001F17078383B3A9ED7FF0913807FFFE021FEBFF8191397FF01F
! E1903A01FF8003F14948C712F9D90FF8147D4948143F49488049488049488048824890C8FC4981
! 1207485AA2121F5B123FA3127F5BA312FFAC127FA27FA2123FA2121F7FA2120F6C7E5F6C6C5D7E
! 6C6D5C017F5D6E5CD91FE0027D7F6D6C02F97FD907FCD901F113F86DB4D90FE1EBFFF001009038
! C07FC1023FB51201020F13FC020001E0EC800044637BE14E>I<913801FFC0020F13FC027F13FF
! 902601FF8113C0903A03FE003FE0D907F8EB0FF0D91FF06D7E49486D7E49486D7E4948804890C8
! 1380A24848ED7FC012074916E0000F163F121F4916F0A2003F161FA2127F18F85BA312FFA290B8
! FCA301F0CAFCA7127FA37F123FA3001F17787F120F18F86C6C16F0000316016D16E06C16036C6D
! EC07C06D6C15806D6C140F6D6CEC1F006D6C147E6D6C5CD901FFEB03F06D9038E03FE0023FB512
! 80020749C7FC9138007FF035407CBE3E>I<ED0FFCED7FFF4AB512C0913903FE0FE091390FF807
! F091391FF00FF891383FE01F91397FC03FFCECFF805B15005B5C0107EC1FF8EE0FF0EE03C04948
! 90C7FCB3A4B712F0A426000FFCC8FCB3B3AE80131F90387FFFC0007FB612F0A42E637CE22B>I<
! F01FE0DA07FFECFFF0023FD9E00313F891B539F80FF0FC0103903A07FE1F81FE903B0FF800FFBE
! 01494890387FF803494890383FF0014948131F494890390FF800FC19784890C76C6C13004882A2
! 48824980A2000F83A9000794C7FCA26D5C6C5EA26C5E6C6D495AA26D6C495A6D6C495A6E495A49
! 6C495A902773FF07FEC8FC01F0EBFFF8023F13E02601E00790C9FC91CBFCA21203A47FA27F1201
! 13FE6D7E6C90B67E17FC6DEDFF806D16E06D16F86D824982017F824848C81480D803FC030713C0
! D807F0030113E04848ED007F4848EE1FF04848160F127F90CAEA07F8A200FE1703A66C17076C18
! F06D160F003F18E06C6CEE1FC06D163F6C6CEE7F80D803FC923801FE006C6C4B5A2600FFC0EC1F
! F8D93FF0EC7FE0903B0FFF800FFF80010390B548C7FCD9003F14E0020101FCC8FC3F5C7CBE46>
! I<14F8EA07FFB5FCA41201EA007F133F131FB3A9EE1FFC93B57E030314E092390FF03FF092391F
! 800FF892393E0007FC03786D7E4B80DAF9E07FDAFBC0815D14FF92C8FC855CA25CA45CB3B2496C
! 4A7F90B5020713F8B70007B612F8A445627BE14E>I<131FEB7FC0497E487FA2487FA56C5BA26C
! 5B6D5A011FC7FC90C8FCB214F8EA03FF127FA41201EA003FA2131FB3B3AB497E90B5FCB612FEA4
! 1F5F7CDE27>I<153EEDFF804A13C04A13E0A24A13F0A56E13E0A26E13C06E1380ED3E0092C7FC
! B2ED03F0EC1FFF0103B5FCA4EB00031400157F153FB3B3B3AAEA1FC0486C14E0486C137F487EA2
! 16C015FF168016006C48485A13E06C48485A6C48485A390FF01FE06CB55A000191C7FC38001FF8
! 247B86DE2B>I<14F8EA07FFB5FCA41201EA007F133F131FB3AA0407B6FCA4040014E07190C7FC
! EF3FFC18F06018804DC8FC177E5F4C5A4C5AEE07C04C5A4CC9FC167E5E4B5A4B5A1507150F4B7E
! 4B7E157F4B7E9138F9F7FFECFBE7DAFFC37F03817F15014A6C7F4A6D7E5C4A6D7E707EA2707E70
! 7EA2707F707FA2707F717EA2717E717EA2717E848585496C82D9FFFE023F13F8B6D8FE01B612E0
! A443627CE14A>I<14F8EA07FFB5FCA41201EA007F133F131FB3B3B3B3AB497E90B5FCB7FCA420
! 627CE127>I<D901F0D91FFCED7FF0D807FF91B500C00103B5FCB5010302F0010F14C0922707F0
! 1FF890391FC07FE092271F8007FC90397E001FF092273E0003FE01F86D7E00014A6D6C48486D7E
! D8007F01F0DB83C08090263FF1E06DD987801303011F4903C7C77F02F316CFDAF78015DE92C8D8
! 7FDC8002FF04FC824A5EA24A5EA44A5EB3B2496C4B6C4A7F90B5020301FC020F13F0B70003B6D8
! FC0FB612F0A46C3E7BBD75>I<D901F0EB1FFCD807FF91B57EB5010314E092390FF03FF092391F
! 800FF892393E0007FC000102786D7ED8007F498090263FF1E07F90261FF3C0815D14F792C8FC02
! FF825CA25CA45CB3B2496C4A7F90B5020713F8B70007B612F8A4453E7BBD4E>I<ED7FF00207B5
! FC021F14C091397FC01FF0903A01FF0007FCD903FCEB01FED90FF09038007F8049486E7E49486E
! 7E49486E7E49C86C7E488349150300038348486F7EA248486F1380A2001F18C0A2003F18E04916
! 7FA2007F18F0A400FF18F8AC007F18F0A36D16FF003F18E0A2001F18C0A26C6C4B1380A2000718
! 006D5D00035F6C6C4B5A6C6D4A5A017F5E6D6C4A5A6D6C4A5A6D6C4A5AD907FC4948C7FCD901FF
! EB07FC6D9038C01FF8021FB512C0020791C8FC9138007FF03D407CBE46>I<02F8EB7FF0D807FF
! 0103B5FCB5010F14C092393FC07FF092397E000FFC03F8EB03FEC6D9FBF06D7E90263FFFC06D7F
! 6D49EC7FE092C8123F4A82727E4A82727E5C727E1A8084A21AC0841AE0A47213F0AC1AE060A31A
! C060A21A80601A00A24E5A6E5E181F6E4B5A616E4B5A6F4A5A6F495BDAFBE04990C7FCDAF9F8EB
! 07FCDAF8FCEB1FF892393F80FFE06FB51280030749C8FC030013E093CAFCB3A2497E90B5FCB7FC
! A444597CBD4E>I<DB7FF0EB0780912607FFFC130F021F13FF913A7FF01FC01F903A01FF8007E0
! 903A03FE0001F0D90FFC903800F83F4948147C4948EC3E7F4948141E4948EC0FFF5A48498091C8
! FC4882485AA2001F825B123FA25B127FA35B12FFAC6C7EA4123F7F121FA27F000F5E6C7E5F6C7F
! 6C5E6C7F017F5D6E143DD91FF0147D6D6C14F96D6CEB03F16DB4EB0FC101009038E07F81023FB5
! 1201020F13FC020013C092C7FCB3A24D7F050F13F0040FB612F0A444597BBD4A>I<D901F013FF
! D807FF010713C0B54913F092381F83F892383C07FCED780F00019138F01FFE39007FF1E0013F13
! C0EB1FF3ECF7809238000FFCA202FFEB07F84AEB01E093C7FCA25CA55CB3AF80133F90B57EB712
! E0A42F3E7CBD37>I<903A01FFE00380011FEBFC07017FEBFF0F3A01FF803FDF3A03F80007FFD8
! 07E0130148487F4848147F48C8123FA248151F127E160F12FEA216077EA27FA213E06D91C7FCEA
! 7FFCEBFF806C13FCECFFE06C14FE6C6E7E6C15E06C816C816C6C80011F80010780D9007F148002
! 0314C0EC001F030713E015010070EC007F00F0ED3FF0161F7E160FA216077EA37E17E07E160F6D
! 15C0A26DEC1F806DEC3F006D147E486C5CD8FC7EEB03F83AF83FC01FF0010FB512C0D8F00391C7
! FC39E0007FF02C407BBE37>I<143CA6147CA514FCA31301A21303A21307130FA2131F133F13FF
! 1203000F90B61280B8FCA326000FFCC8FCB3AEEE01E0AD010714036E14C0A213036EEB07807F92
! 38800F007F91387FC01E91383FF07C91380FFFF802035B9138007FC02B577DD537>I<02F8ED07
! C0D807FFED3FFFB50207B5FCA40001ED000FD8007F1503013F81011F81B3B15FA45FA2130F5FA2
! 6D6C5C171E01034B7F6E4A7F6D6C02F813FC6D90268003F0EBFFF891397FF00FC0021FB55A0207
! 495A9126007FF8ECC000453F7BBD4E>I<B600F8010FB512E0A4000391C700011400C601FC9138
! 007FF86D48ED3FE0013F5F725A131F6E93C7FC130F181E6E153E0107163C806D5EA26F14F86D5E
! A26D6D495AA26F1303027F5DA26F1307023F5D6F130F021F92C8FCA26F5B020F141E6F133E0207
! 143CA26F137C6E1478A26E6D5AA216C16E5CA292387FE3C0A216F7033F5BA216FF6F90C9FCA26F
! 5AA36F5AA26F5AA36F5A6F5A433E7DBC4A>I<B6D8F03FB500F890B512FEA4000349C791C7001F
! 13F0C601F8DA3FFC020713C06D48021F6F130071486E5A64013F1900716C5D6D7E647214016D6C
! 61170F6E6F1403010762051E7F6E18076D033E5E94383C7FC06F170F6D037C93C7FC9438783FE0
! 6F5F6D03F8151E4D6C7E6F173E027F0101163C4D6C7EDA3FF05F16034D6C7EDA1FF85F16079439
! 8003FE01DA0FFC5F93380F0001F1FF03DA07FE5F041E7F03FF16876E604CEC7FC704BC15CF6E01
! FC93C8FC4CEC3FEF1AFF6E5F4C141FA2037F5E4C140F033F5EA24C1407031F5EA24C1403030F5E
! 93C812015F3E7DBC66>I<B600F8017FB512E0A4C602E0010FEBFC00013F01806D13E06D90C714
! 806D6F48C7FC6D5E6D6D5C6D5E6D6D495A6F5C6E6C495A023F4AC8FC6F133E6E7E020F5C6E6C5B
! 6F485A6E13816EEB83E06EEBC7C0EEEF806FB4C9FC816F5A5E6F7E15076F7E834B7F5D834B6C7E
! 92383E3FF8ED7C1F707E03F87F4A486C7E4A487E707FDA07C0804A486C7F4AC7127F4A6E7E023E
! 814A6E7E4A140F01018201036F7E01076F7F131F013F83D9FFFC4A13F0000F6D021F13FCB66C01
! 7FEBFFFCA4463D7EBC4A>I<B600F8010FB512E0A4000391C70001EBFE00C601FC9138007FF86D
! 48ED3FE0013F5F725A131F6E93C7FC010F161E183E6D6C153CA26E157C6D1678A26F14F86D5E6F
! 13016D5EA26F1303027F5D6F1307023F5DA26F130F021F92C8FC6F5B020F141EA26F133E020714
! 3C6F137C6E1478A2EE80F86E5C16C16E5CA216E3037F5B16F7033F5BA216FF6F90C9FCA26F5AA3
! 6F5AA26F5AA36F5AA25EA215035EA24B5AA2150F93CAFCA2151EEA1F80486C133E486C133C486C
! 137C157815F85D14014A5AD87FE05B49485A6CC648CBFC143E381FC0FC3807FFF86C13E0C66CCC
! FC43597DBC4A>I<000FB812E0A39126C0000113C001FCC75A01F04A138048481600494A5A4914
! 1F5F90C8485A167F5F001E4B5A5D4B5B5F003E4A90C7FC003C5C5E4B5A153F4B5AC85B4B5A5C5E
! 4A5B5C4A90C8FC5D141F4A5A5D4A5A02FFEC01E05D495B5B495B92C7FC4948EC03C0131F5C495A
! 137F495A4A1407485B5A4A140F4890C8FC48161F49153F4848ED7F80003F16FF4848140349143F
! B9FCA3333D7CBC3E>I<BB12F8A3450380A646>I E /Fi 15 116 df[<0A07B500E0183F0907B7
! 6C5F50B800F8933801FF80083F05FF5E4FBA00E05D071F07FC5D96BC5D060709C05C061F09F05C
! 95BD00FC91B5FC05030AFF1303050F9426F80007EDC007053F04FCC8003F6E5A94B800800303EC
! F81F4C04FCCA6C6D5A040704E0051F6D5A4C93CB000790B7FC043F03FC18014C03F0727E4BB700
! C0854B93CD120F4B4B864B03F886033F4B1A004B4B8792B70080874A93CF7E4A4B884A4B884A4B
! 884E884A5D4A4B884A8D91B7488995D1FC498E494B8A5F498E495DA17E495D498EA2494B8AA290
! B75AA17F5A5FA17F5A94D3FC48A17EA35A5EA17F5AA34C7A13005AA190C8FCA35AA45EA3B7FCB3
! A37EA382A47EA47E82A149B4FCA26CA1481380A2827EA36C82A15B7EA11500837EA15B6D81A15C
! 6D6F1F1FA27F6D6F555AA26D6F1F7F6DA15A711FFF6D6F686D6A72676E6F656E6F535B6E575B6E
! 6F65729CC7FC6E6F535A6E6F1D7F6E6F535A6E7009035B6F03E0515B6F6F515B030F6F515B6F03
! FE097F5B6F6F6C97B5C8FC6F7007035B6F6C03F0070F5B7003FC073F5B040F03FF96B55A7004E0
! 05035C040104FC051F148070DCFFC093B6C9FC053F04FC030F14FC050FDCFFF80103B65A050394
! B912E005001D80061F51CAFC06071BF806001BE0071F97CBFC070119F8DF003F18C008014DCCFC
! E0000716C0E1000702E0CDFC>169 171 112 296 202 67 D[<C512FCA4A17EA7C8003F03F0CA
! 120FE5001F812001F8003F210F210321008E221F8E7C808E8E8EA28F8FA27D7FA28FA28FA28FA2
! A17FA28FA38FA4E41FFC83A1127FA7A16C7EA31E3FA1C8FCA31E7FA31EFFA265656565651D7F0A
! 03B5FC1C3F96B9FCAB07F0C7123F1C03F4007F1D1F8989898989A21E7FA31E3FA2A1EB3FF8A21E
! 1FA1EB7FF0A6A1EBFFE0A49BCCFCA15AA114C0A3A15AA3A11480A15AA3A15AA2A1481300A3A15A
! A2A15AA15BA112FFA26B6BA2595B6B6B6B6BA0B5FC585C22076A223F9FB6FC21030F1F5D9EB7FC
! 201F0D0FB8FCC5B4FCA2A15BA6A15BA3>165 166 118 293 184 69 D[<0A03B500E0F01F8009
! 07B76C173F50B800FCEFFFC0081FDDFF805D4FBA00F05D070F07FE5D077F736C5C0603BC00E05C
! 061F09F85C067F09FE5C4DBE6C48B5FC050F9426F800036F5A4D04FCC8001FECF007057F04C003
! 016E5A4CB700FCCA6CEBFE1F040704E0050F6D5A4C0480050391B6FC043F03FCCCFC4C03F08593
! B700C0191F03034C854B4BCD12034B4B864B03F0864B4B1B3F92B748874A93CF7E4A4B884E884A
! 4B884A4B884A5D4A8D4A4B8991B7488995D1FC498E494B8AA2494B8A495DA17E495DA17E5B494B
! 8BA290B75AA17F5A5FA17F5AA24893D37EA35A5EA17F5AA34C7A5B5AA190CAFCA35AA45EA3B7FC
! B3A37EA382A20C07B500FE94380FFFF89EBBFC7EA46C81A47E9BCA04C0C7FC827EA36C82A27E83
! A27E837FA26D817F837F837F6D81A26D816D82A26E816E816E816E816E816E81846E70626E8203
! 3F816F03F8626F816F03FF626F7061030004E0617003F8617003FE96B8FC040FDBFFC05F7004F0
! 1707040104FE051F5B706CDBFFE0047F497E051F04FF0307B5487E7105FE91B6487E050194B9EA
! E007716CF4C001061F99C7FC060309FC143FDE007F08F0140F070F08C0140307014FC9FCDF001F
! 06F0EE3F80080106801607E0000704F0CEFCE1000302F8CFFC>189 171
! 112 296 220 71 D[<BA00F0972603FFFC923803FFFC7399B9FC858585868686A28686C8003F70
! 96C7000303FCC7FC74E1000749C8FC740A0113F8A16D5B87878787878716FD04FC827181887182
! 718271828371827182887182728284728272828972827282728284738173828A73827382857382
! 73828A73827482748286748274828B7482748274828775828C75827582758287758275828C7682
! 7682768288768276828D7682768289778277828E77827782778289778278818F788278828A7882
! 78828F7882788279828B79827982A17E7982798279828B7A817A82A17F7A827A828C7A827A82A1
! 7F7A93B5FC8D8D8D8D8DA28D8D8D8E8EA28E8E8E8E8E8EA28F8F8F8F8FA28F8F8FA17EA17EA17E
! A2A17EA17EA17E4B6C8B4AB56C8A91B78BBBFCA17FA17FA17FA17FA17FA2A17FA17FA16E5A91C9
! 7A5A>198 167 118 294 219 78 D[<BF12FE9BB5FC20FCF8FFC021FCF9FF8022F022FC22FF23
! E08FC8003F03E0C96C16FC0C0016FF0D0F16C00D0182796C810E1F15FC0E07817A817A827A827B
! 817B818DA17F7B81A27B81A17FA27B82A2A180A37B82A4A180ABA15CA4A15C69A2A15CA2A191CA
! FC69A15BA2575DA15B575DA2575D575D9EB75A5693CBFC5615FC0E0F5D565D0E7F15C00D03B75A
! 0D1F4BCCFC54B712F80C7F16E096BD128058CDFC22F022C00FFCCEFC21F021FCF9FF8022E007E0
! C8000382E3001F15FC0C0715FF0C0182786C817915F079817981798179818B79827A81A27A81A2
! 7A81A27A81A3A17E8CA2A17EA6A17EA7A17FA7A17FA6A1EF03E0A16DED0FF8A2A1EF1FFC8CA2A1
! 7FA28CA16D153FA118F88CA16D157F7B1AF0A16D15FF7B817B4E13E07B705BBD00F8754913C00F
! 03705B7B04F8013F13807BDCFE01B51200103F92B65A7C60100760100160E8003F17C011075F02
! F8CA09004CC7FCD7000715F0A1D800031480>198 169 118 294 210 82
! D[<B500F894267FFFFC94267FFF8092383FFFC091BB97B9FCAAC8003F03F0CF6C03C0C7FCA100
! 0002E0C8FCA1013F1380A16D90C9FCB3B3B3B3B3AF6F575AA385A26F217FA15CA281A1495A8581
! A1485B817364A15C6F6873525B8270555B7463706F9ACAFCA15A706F515A706F6270545B706F50
! 5B74505B706F62716E087F5B716F96B55A7103E006035C05076F060F91CBFC7103FC063F5B7103
! FF95B55A716C03C0040314F07203F8043F5C060FDBFF800203B65A7204FC49B7CCFC060193B95A
! 726C1BF8071F1BE007071B80070050CDFC083F19F8080719C0E0007F4DCEFC090717F0E1003F4B
! CFFCE2003F91D0FC>194 169 118 294 215 85 D<94B67E93B712FE030FEEFFE0037F17FE0203
! BA12C0020F19F0023F19FC4A19FF91BC12C0499226C0001F15F04902E0C7000181496E6E6C8070
! 031F80496E6F8049060381706F817481496E858775808A878A878AA275816D5CA26D5C75816D5C
! 6D5C6D5C6D5C023F90CAFCEC07F891CCFCA81B0F071FB8FC061FB9FC0507BAFC94BBFC160F93BC
! FC1507033F17C392B8EA80030207EEE000021F4BC7FC027F15F091B7128001034BC8FC4915F001
! 1F15C0495D494AC9FC90B65A485D4815E05E5A485D4892CAFC5D5A5D5AA25DA2B6FC5DA363A463
! 81637E6F5F636C6E18BF6F17FF6C0703133F6C6F4B8204E0DB0FFE816C6FDB3FFC15FC6C6F4B48
! 6CECFFC06C03FE912603FFF0EEFFF86C6F6C010F01E017FC6DDBF801B5486C16FE011F92B71280
! 6D4F7E010306FC7F01004E1300021F05E08002030580141FDA007F03FCC8000315FC030703E0DB
! 001F14F8DB000701FCCEFC7F6F78ED88>97 D<061FB57E050FB77E94B812F8040717FF043F18E0
! 93BA12F8030719FE031F854B8692BC7E02034BC76C804A03E00207804A03805C023F4AC848804A
! 02F88491B6485D495D4903804B804992C9FCA2495C495C495CA2495C90B6FC5E48745C5A4C705C
! 5A755C484B705C755C755C48746C48C7FC93CBEA0FF099C9FC5AA45A5DA4B6FCB27E81A47EA382
! 7EA36C81A26CF5FF80826C5213C0A26C6F60A26C6F4E13807F704E13006D806D515A70183F6D6F
! 4D5A6D6F4D5A6D6F5E6D03F84C5B6D6F040F5B6E02FF4C5B6E03C0157F6E03F04AB55A020703FC
! 020F49C7FC6E9226FFE001B55A020093B75A6F61031F19C003076103014EC8FCDB003F17F00407
! 17C004004CC9FC050F15E0DD001F01F8CAFC6A6F77ED7C>99 D[<F707FF52B7FC090FB8FCAB98
! C7FC1D1F89A289B3B3A795380FFFF80507B612C0057F15F80407B8FC041F17E093B912F8030318
! FE030F18FF033F19C792B7D8800714E74A03F8C7003F90B7FC020703C0140F4A92C81203023F02
! FC15004A4A163F91B600E0160F494B82494B824992CA7E494A834C84494A844987494A84A290B6
! 5A5A5E5AA2485DA25AA293CCFC5AA25AA4485CA5B6FCB27EA57E81A37EA37E827EA36C81A27E6C
! 6F60656D806D637095B7FC6D626D6E5F6D6E5F6D6E5F71163F6D6F4C826D6C6E4BB8FC6E02F84B
! 836E6E030F17F86E02FF037F01EF92B512806E03E049B512CF020103FE013F148F6E6C91B7EAFE
! 0F6F18FC030F18F0030318C0DB007F1700040F16F8040116C0DC001F4AC7FCDD007F01C005C0C8
! FC>137 170 119 296 155 I<95383FFFF8050FB612E094B712FE0407EEFFC0043F17F04BB912
! FE0307727E031F85037F19F092B626FC007F80020303C0010714FE4A92C7000180021F02FC6E6C
! 804A02F0031F804A4A6F8091B6486F80494B6F804992C97E494A7080494A717F5B494A717F4C71
! 14805B90B6487114C0A2485D7614E05A4C1AF04887A25A93CB15F8885AA21FFC5AA24B84A25A1F
! FEA4B6FCA292BDFCA61FFC1FF84BCFFCA67EA5817EA37EA36C81A36CF503F870F107FC6CF50FFE
! A26C811E1F6C816DF43FFC70197F6D1DF86D6E19FF704E13F06D6E606D6F4D13E06D6F4D13C06D
! 6F5F6D6F057F13806E6E94B512006E02FE04035B6E6E6C030F5B020703E0037F5B6E03FC0207B5
! 5A0200DBFFE090B65A6F92B81280031F97C7FC030719FC030119F06F6C18C0040F95C8FC040117
! F8DC003F16C0050103FCC9FCDD000791CAFC6F6F78ED80>I[<96381FFFF0060FB6FC95B712C005
! 0716F8053F8294B9FC04031880040F18C0043F18E093B6D8FE0114F04BDBE00314F84BED80074B
! DAFE0015FC4B4A5B4B02F04914FE4B5C4B4A16FF92B6485BA24A92C7FC5C5F5C5F5CA24A4A6E14
! FEA27414FCA24A4A6E14F87414F07414E07414C0093F1300F30FFC98C8FCB3A8BCFCABC7003F02
! F8CBFCB3B3B3B3AE007FBA12C0AA91C97E>96 170 118 297 85 I<DCFFC092260FFFFC96387F
! FFE0011FB693B600F00507B67EB8030703FE053F15F0083FDBFFC04BB712FE97B800F00307707E
! 070371031F83070F05FE037F17F0073F714AB97E4F7249844EB5D8F0076F010FDA803F804E9026
! FE00016F499026F0000F804E01F06D6C6E4901800103814E01C06E6E4948C76C81D8000F4C90C8
! EFFFF80101DC3FFC6F6E4801E06E816D4C484F5BDEFFE06F6E4890C96C806E4C6205C149724848
! 8505C390C96C4B4882DDC7FE505A4EE0BFE085DDCFF8F2FFC04E6305DF7187DDFFE098CAFC4E50
! 86A24E62A295CA5EA24D63A34D63A54D63B3B3B3A4BA00FC0107BA00E0013FBAFCAA49C8000105
! F0C8000F0580C87ED86D75ECE9>109 D<DCFFC092380FFFF8011FB64BB612E0B8030F15FC083F
! EDFF804FB812E0070717F84F83073F834F834EB5D8E00F814E9026FE0003814E01F00100814E01
! C06E80D8000F4C90C87E0101DC3FFC846D4C5ADEFFE06F806E02C15B4F8405C390C97EEFC7FE4E
! 85EFCFF8EFDFF04E8217FF4E86A260A295CAFCA25FA35FA55FB3B3B3A4BA00FC010FBA12C0AA49
! C8000105E0C8121F8A6D75EC9B>I<4BB46CEC3FFE013FB64AB512E0B8020F14FC073F14FF96B7
! 12C04E824E16F84E824E824EEBE07F4E0100B6FC95267FFC011580F0FFF0D8000F4D4815C00101
! 038113C06D0383494815E019006EEC87FE60EF8FF8A2EF9FF06017BF607415C017FF4E6D1580A2
! 95C81500755B755B4D6F5B090713E0090090C7FC4D93C8FCA55FA75FB3B3AFBB7EAA49C9FC636D
! 78EC73>114 D<93263FFFFCEC07E0031FB600F0131F92B700FEEB7FF002079338FFC1FF023F94
! B5FC91BBFC1303130F499138E0000F4901FCC87E4901E0150F90B5008015034849CAFC48498348
! 01F0171F86484983484983A248855CA24885A31B7FB57EA28080806E725A806E6C94C8FC15E015
! FCEDFF8016FC6CEDFFF0EFFFC018FE6CEFFFF019FE6CF0FFC01AF86C19FE6C737E876C1AF06C86
! 6C866D19FF6D866D866D860103867F6D6C85021F851407020085031F841501DB000F1880EE003F
! 1701DD000716C0F0007F190F070115E0737ED83FC084007F190F486C84866D8486A2877FA26D85
! A26D1BC0A27FA26E1A8063806E1A006E95B5FC6E616E5F6E4D5B6E4D5B03C05E6F4C5B03F8047F
! 5B03FE4BB55ADBFFC0020F5C04FE49B6C7FC93B85A1BF8020F60496C18C0D9F80195C8FC9026F0
! 003F16F801C0010716C06C4801004BC9FC007EC8000791CAFC5B6F77ED6E>I
  E end
  %%EndProlog
  %%BeginSetup
! %%Feature: *Resolution 1016dpi
  TeXDict begin
  
  %%EndSetup
  %%Page: 1 1
! 1 0 bop 268 -542 a Fi(GNU)92 b(Emacs)h(Reference)g(Card)1561
! -313 y Fh(\(for)46 b(v)l(ersion)j(19\))0 110 y Fg(Starting)77
! b(Emacs)0 454 y Fh(T)-12 b(o)47 b(en)l(ter)h(GNU)g(Emacs)g(19,)f(just)g(t)l
! (yp)t(e)h(its)f(name:)63 b Ff(emacs)0 681 y Fh(T)-12 b(o)47
! b(read)h(in)f(a)g(\014le)g(to)g(edit,)g(see)i(Files,)e(b)t(elo)l(w.)0
! 1083 y Fg(Lea)-6 b(ving)77 b(Emacs)0 1427 y Fh(susp)t(end)49
! b(Emacs)e(\(or)g(iconify)h(it)f(under)h(X\))684 b Ff(C-z)0
! 1596 y Fh(exit)47 b(Emacs)h(p)t(ermanen)l(tly)1555 b Ff(C-x)73
! b(C-c)0 1998 y Fg(Files)0 2341 y Fe(read)46 b Fh(a)h(\014le)h(in)l(to)f
! (Emacs)1663 b Ff(C-x)73 b(C-f)0 2510 y Fe(sa)l(v)l(e)46 b Fh(a)h(\014le)g
! (bac)l(k)h(to)f(disk)1619 b Ff(C-x)73 b(C-s)0 2679 y Fh(sa)l(v)l(e)48
! b Fe(all)h Fh(\014les)2297 b Ff(C-x)73 b(s)0 2848 y Fe(insert)47
! b Fh(con)l(ten)l(ts)h(of)f(another)h(\014le)g(in)l(to)f(this)g(bu\013er)227
! b Ff(C-x)73 b(i)0 3016 y Fh(replace)49 b(this)e(\014le)g(with)g(the)g(\014le)
! g(y)l(ou)h(really)g(w)l(an)l(t)332 b Ff(C-x)73 b(C-v)0 3185
! y Fh(write)47 b(bu\013er)g(to)g(a)g(sp)t(eci\014ed)i(\014le)1251
! b Ff(C-x)73 b(C-w)0 3587 y Fg(Getting)k(Help)0 3931 y Fh(The)47
! b(Help)h(system)g(is)f(simple.)64 b(T)l(yp)t(e)47 b Ff(C-h)g
! Fh(and)g(follo)l(w)g(the)g(directions.)64 b(If)0 4099 y(y)l(ou)48
! b(are)f(a)g(\014rst-time)h(user,)g(t)l(yp)t(e)f Ff(C-h)73 b(t)47
! b Fh(for)g(a)g Fe(tutorial)p Fh(.)0 4327 y(remo)l(v)l(e)i(Help)f(windo)l(w)
! 1770 b Ff(C-x)73 b(1)0 4496 y Fh(scroll)48 b(Help)g(windo)l(w)1883
! b Ff(ESC)73 b(C-v)0 4723 y Fh(aprop)t(os:)64 b(sho)l(w)47 b(commands)i(matc)l
! (hing)f(a)g(string)338 b Ff(C-h)73 b(a)0 4892 y Fh(sho)l(w)47
! b(the)g(function)h(a)f(k)l(ey)h(runs)1270 b Ff(C-h)73 b(c)0
! 5061 y Fh(describ)t(e)49 b(a)e(function)1884 b Ff(C-h)73 b(f)0
! 5229 y Fh(get)47 b(mo)t(de-sp)t(eci\014c)j(information)1232
! b Ff(C-h)73 b(m)0 5632 y Fg(Error)78 b(Reco)-6 b(v)g(ery)0
! 5975 y Fe(ab)t(ort)46 b Fh(partially)i(t)l(yp)t(ed)f(or)g(executing)i
! (command)264 b Ff(C-g)0 6144 y Fe(reco)l(v)l(er)45 b Fh(a)i(\014le)h(lost)f
! (b)l(y)g(a)h(system)g(crash)487 b Ff(M-x)73 b(recover-file)0
! 6313 y Fe(undo)46 b Fh(an)h(un)l(w)l(an)l(ted)h(c)l(hange)1403
! b Ff(C-x)73 b(u)h Fh(or)g Ff(C-_)0 6481 y Fh(restore)48 b(a)g(bu\013er)f(to)g
! (its)g(original)h(con)l(ten)l(ts)388 b Ff(M-x)73 b(revert-buffer)0
! 6650 y Fh(redra)l(w)47 b(garbaged)i(screen)1607 b Ff(C-l)0
! 7052 y Fg(Incremen)-6 b(tal)77 b(Searc)-6 b(h)0 7396 y Fh(searc)l(h)49
! b(forw)l(ard)2152 b Ff(C-s)0 7564 y Fh(searc)l(h)49 b(bac)l(kw)l(ard)2040
! b Ff(C-r)0 7733 y Fh(regular)48 b(expression)i(searc)l(h)1515
! b Ff(C-M-s)0 7902 y Fh(rev)l(erse)49 b(regular)f(expression)i(searc)l(h)1045
! b Ff(C-M-r)0 8129 y Fh(select)48 b(previous)h(searc)l(h)g(string)1326
! b Ff(M-p)0 8298 y Fh(select)48 b(next)g(later)f(searc)l(h)i(string)1241
! b Ff(M-n)0 8467 y Fh(exit)47 b(incremen)l(tal)i(searc)l(h)1631
! b Ff(RET)0 8636 y Fh(undo)47 b(e\013ect)h(of)g(last)f(c)l(haracter)1334
! b Ff(DEL)0 8804 y Fh(ab)t(ort)47 b(curren)l(t)h(searc)l(h)1802
! b Ff(C-g)0 9032 y Fh(Use)58 b Ff(C-s)e Fh(or)h Ff(C-r)f Fh(again)i(to)f(rep)t
! (eat)h(the)f(searc)l(h)h(in)f(either)h(direction.)93 b(If)0
! 9200 y(Emacs)48 b(is)f(still)g(searc)l(hing,)j Ff(C-g)c Fh(cancels)j(only)f
! (the)f(part)g(not)g(done.)436 9427 y Fd(c)405 9430 y Fc(\015)38
! b Fd(1993)g(F)-9 b(ree)38 b(Soft)m(w)m(are)g(F)-9 b(oundation,)38
! b(Inc.)50 b(P)m(ermissions)37 b(on)h(bac)m(k.)50 b(v2.0)6534
! 9589 y Fh(1)p eop
  %%Page: 2 2
! 2 1 bop 0 -571 a Fg(Motion)0 -220 y Fe(en)l(tit)l(y)54 b(to)f(mo)l(v)l(e)g(o)
! l(v)l(er)1189 b(bac)l(kw)l(ard)138 b(forw)l(ard)0 -52 y Fh(c)l(haracter)2005
! b Ff(C-b)587 b(C-f)0 117 y Fh(w)l(ord)2269 b Ff(M-b)587 b(M-f)0
! 286 y Fh(line)2352 b Ff(C-p)587 b(C-n)0 454 y Fh(go)47 b(to)g(line)h(b)t
! (eginning)g(\(or)f(end\))801 b Ff(C-a)587 b(C-e)0 623 y Fh(sen)l(tence)2060
! b Ff(M-a)587 b(M-e)0 792 y Fh(paragraph)1946 b Ff(M-{)587 b(M-})0
! 961 y Fh(page)2290 b Ff(C-x)74 b([)439 b(C-x)74 b(])0 1129
! y Fh(sexp)2301 b Ff(C-M-b)439 b(C-M-f)0 1298 y Fh(function)2067
! b Ff(C-M-a)439 b(C-M-e)0 1467 y Fh(go)47 b(to)g(bu\013er)h(b)t(eginning)g
! (\(or)f(end\))664 b Ff(M-<)587 b(M->)0 1696 y Fh(scroll)48
! b(to)f(next)g(screen)1818 b Ff(C-v)0 1865 y Fh(scroll)48 b(to)f(previous)i
! (screen)1574 b Ff(M-v)0 2033 y Fh(scroll)48 b(left)2481 b Ff(C-x)73
! b(<)0 2202 y Fh(scroll)48 b(righ)l(t)2387 b Ff(C-x)73 b(>)0
! 2371 y Fh(scroll)48 b(curren)l(t)g(line)g(to)f(cen)l(ter)h(of)f(screen)801
! b Ff(C-u)73 b(C-l)0 2782 y Fg(Killing)k(and)i(Deleting)0 3132
! y Fe(en)l(tit)l(y)54 b(to)f(kill)1691 b(bac)l(kw)l(ard)138
! b(forw)l(ard)0 3301 y Fh(c)l(haracter)49 b(\(delete,)f(not)f(kill\))960
! b Ff(DEL)587 b(C-d)0 3469 y Fh(w)l(ord)2269 b Ff(M-DEL)439
! b(M-d)0 3638 y Fh(line)48 b(\(to)e(end)i(of)11 b(\))1633 b
! Ff(M-0)74 b(C-k)291 b(C-k)0 3807 y Fh(sen)l(tence)2060 b Ff(C-x)74
! b(DEL)291 b(M-k)0 3975 y Fh(sexp)2301 b Ff(M--)74 b(C-M-k)143
! b(C-M-k)0 4205 y Fh(kill)47 b Fe(region)2373 b Ff(C-w)0 4373
! y Fh(cop)l(y)48 b(region)g(to)f(kill)g(ring)1646 b Ff(M-w)0
! 4542 y Fh(kill)47 b(through)h(next)f(o)t(ccurrence)j(of)d Fb(char)834
! b Ff(M-z)73 b Fb(char)0 4771 y Fh(y)l(ank)48 b(bac)l(k)g(last)f(thing)g
! (killed)1416 b Ff(C-y)0 4940 y Fh(replace)49 b(last)e(y)l(ank)h(with)e
! (previous)j(kill)894 b Ff(M-y)0 5368 y Fg(Marking)0 5718 y
! Fh(set)47 b(mark)h(here)2208 b Ff(C-@)73 b Fh(or)h Ff(C-SPC)0
! 5887 y Fh(exc)l(hange)49 b(p)t(oin)l(t)e(and)h(mark)1490 b
! Ff(C-x)73 b(C-x)0 6116 y Fh(set)47 b(mark)h Fb(ar)-7 b(g)59
! b Fe(w)l(ords)45 b Fh(a)l(w)l(a)l(y)1453 b Ff(M-@)0 6285 y
! Fh(mark)48 b Fe(paragraph)1962 b Ff(M-h)0 6454 y Fh(mark)48
! b Fe(page)2360 b Ff(C-x)73 b(C-p)0 6622 y Fh(mark)48 b Fe(sexp)2371
! b Ff(C-M-@)0 6791 y Fh(mark)48 b Fe(function)2105 b Ff(C-M-h)0
! 6960 y Fh(mark)48 b(en)l(tire)f Fe(bu\013er)1875 b Ff(C-x)73
! b(h)0 7370 y Fg(Query)k(Replace)0 7721 y Fh(in)l(teractiv)l(ely)49
! b(replace)g(a)e(text)g(string)1004 b Ff(M-\045)0 7889 y Fh(using)48
! b(regular)g(expressions)765 b Ff(M-x)73 b(query-replace-regexp)0
! 8119 y Fh(V)-12 b(alid)48 b(resp)t(onses)i(in)d(query-replace)i(mo)t(de)f
! (are)0 8348 y Fe(replace)f Fh(this)g(one,)h(go)f(on)g(to)g(next)1107
! b Ff(SPC)0 8517 y Fh(replace)49 b(this)e(one,)h(don't)f(mo)l(v)l(e)1318
! b Ff(,)0 8685 y Fe(skip)48 b Fh(to)f(next)g(without)f(replacing)1153
! b Ff(DEL)0 8854 y Fh(replace)49 b(all)e(remaining)i(matc)l(hes)1224
! b Ff(!)0 9023 y Fe(bac)l(k)53 b(up)46 b Fh(to)h(the)g(previous)i(matc)l(h)
! 1095 b Ff(^)0 9191 y Fe(exit)48 b Fh(query-replace)1916 b Ff(ESC)0
! 9360 y Fh(en)l(ter)48 b(recursiv)l(e)h(edit)e(\()p Ff(C-M-c)f
! Fh(to)h(exit\))896 b Ff(C-r)6534 9589 y Fh(2)p eop
  %%Page: 3 3
! 3 2 bop 0 -571 a Fg(Multiple)77 b(Windo)-6 b(ws)0 -297 y Fh(delete)48
! b(all)f(other)h(windo)l(ws)1559 b Ff(C-x)73 b(1)0 -128 y Fh(delete)48
! b(this)f(windo)l(w)1903 b Ff(C-x)73 b(0)0 40 y Fh(split)47
! b(windo)l(w)g(in)g(t)l(w)l(o)f(v)l(ertically)1229 b Ff(C-x)73
! b(2)0 209 y Fh(split)47 b(windo)l(w)g(in)g(t)l(w)l(o)f(horizon)l(tally)1069
! b Ff(C-x)73 b(3)0 419 y Fh(scroll)48 b(other)g(windo)l(w)1847
! b Ff(C-M-v)0 588 y Fh(switc)l(h)47 b(cursor)i(to)d(another)i(windo)l(w)1038
! b Ff(C-x)73 b(o)0 798 y Fh(shrink)48 b(windo)l(w)e(shorter)1385
! b Ff(M-x)73 b(shrink-window)0 966 y Fh(gro)l(w)47 b(windo)l(w)g(taller)1876
! b Ff(C-x)73 b(^)0 1135 y Fh(shrink)48 b(windo)l(w)e(narro)l(w)l(er)1571
! b Ff(C-x)73 b({)0 1304 y Fh(gro)l(w)47 b(windo)l(w)g(wider)1860
! b Ff(C-x)73 b(})0 1514 y Fh(select)48 b(bu\013er)g(in)f(other)h(windo)l(w)
! 1265 b Ff(C-x)73 b(4)h(b)0 1683 y Fh(displa)l(y)48 b(bu\013er)g(in)f(other)g
! (windo)l(w)1172 b Ff(C-x)73 b(4)h(C-o)0 1851 y Fh(\014nd)47
! b(\014le)h(in)f(other)g(windo)l(w)1544 b Ff(C-x)73 b(4)h(f)0
! 2020 y Fh(\014nd)47 b(\014le)h(read-only)g(in)f(other)g(windo)l(w)923
! b Ff(C-x)73 b(4)h(r)0 2189 y Fh(run)47 b(Dired)h(in)f(other)h(windo)l(w)1404
! b Ff(C-x)73 b(4)h(d)0 2357 y Fh(\014nd)47 b(tag)g(in)g(other)h(windo)l(w)1528
! b Ff(C-x)73 b(4)h(.)0 2672 y Fg(F)-19 b(ormatting)0 2946 y
! Fh(inden)l(t)47 b(curren)l(t)h Fe(line)h Fh(\(mo)t(de-dep)t(enden)l(t\))706
! b Ff(TAB)0 3115 y Fh(inden)l(t)47 b Fe(region)g Fh(\(mo)t(de-dep)t(enden)l
! (t\))1012 b Ff(C-M-\\)0 3283 y Fh(inden)l(t)47 b Fe(sexp)g
! Fh(\(mo)t(de-dep)t(enden)l(t\))1136 b Ff(C-M-q)0 3452 y Fh(inden)l(t)47
! b(region)i(rigidly)e Fb(ar)-7 b(g)59 b Fh(columns)1004 b Ff(C-x)73
! b(TAB)0 3662 y Fh(insert)48 b(newline)f(after)h(p)t(oin)l(t)1496
! b Ff(C-o)0 3831 y Fh(mo)l(v)l(e)48 b(rest)g(of)f(line)g(v)l(ertically)i(do)l
! (wn)1047 b Ff(C-M-o)0 3999 y Fh(delete)48 b(blank)g(lines)g(around)g(p)t(oin)
! l(t)1137 b Ff(C-x)73 b(C-o)0 4168 y Fh(join)47 b(line)h(with)e(previous)j
! (\(with)d(arg,)h(next\))645 b Ff(M-^)0 4337 y Fh(delete)48
! b(all)f(white)g(space)i(around)f(p)t(oin)l(t)891 b Ff(M-\\)0
! 4505 y Fh(put)47 b(exactly)h(one)g(space)g(at)f(p)t(oin)l(t)1181
! b Ff(M-SPC)0 4715 y Fh(\014ll)47 b(paragraph)2221 b Ff(M-q)0
! 4884 y Fh(set)47 b(\014ll)h(column)2181 b Ff(C-x)73 b(f)0 5053
! y Fh(set)47 b(pre\014x)h(eac)l(h)h(line)e(starts)h(with)1185
! b Ff(C-x)73 b(.)0 5368 y Fg(Case)k(Change)0 5641 y Fh(upp)t(ercase)49
! b(w)l(ord)2094 b Ff(M-u)0 5810 y Fh(lo)l(w)l(ercase)49 b(w)l(ord)2129
! b Ff(M-l)0 5979 y Fh(capitalize)49 b(w)l(ord)2122 b Ff(M-c)0
! 6189 y Fh(upp)t(ercase)49 b(region)2021 b Ff(C-x)73 b(C-u)0
! 6357 y Fh(lo)l(w)l(ercase)49 b(region)2056 b Ff(C-x)73 b(C-l)0
! 6526 y Fh(capitalize)49 b(region)1515 b Ff(M-x)73 b(capitalize-region)0
! 6858 y Fg(The)78 b(Minibu\013er)0 7132 y Fh(The)47 b(follo)l(wing)h(k)l(eys)g
! (are)g(de\014ned)g(in)f(the)g(minibu\013er.)0 7342 y(complete)i(as)e(m)l(uc)l
! (h)h(as)g(p)t(ossible)1254 b Ff(TAB)0 7510 y Fh(complete)49
! b(up)e(to)f(one)i(w)l(ord)1521 b Ff(SPC)0 7679 y Fh(complete)49
! b(and)e(execute)1726 b Ff(RET)0 7848 y Fh(sho)l(w)47 b(p)t(ossible)i
! (completions)1446 b Ff(?)0 8017 y Fh(fetc)l(h)48 b(previous)g(minibu\013er)g
! (input)1141 b Ff(M-p)0 8185 y Fh(fetc)l(h)48 b(next)f(later)g(minibu\013er)h
! (input)1056 b Ff(M-n)0 8354 y Fh(regexp)48 b(searc)l(h)h(bac)l(kw)l(ard)f
! (through)g(history)585 b Ff(M-r)0 8523 y Fh(regexp)48 b(searc)l(h)h(forw)l
! (ard)f(through)f(history)698 b Ff(M-s)0 8691 y Fh(ab)t(ort)47
! b(command)2077 b Ff(C-g)0 8901 y Fh(T)l(yp)t(e)43 b Ff(C-x)73
! b(ESC)g(ESC)42 b Fh(to)g(edit)h(and)f(rep)t(eat)i(the)e(last)h(command)h
! (that)e(used)0 9070 y(the)47 b(minibu\013er.)64 b(The)47 b(follo)l(wing)g(k)l
! (eys)i(are)e(then)h(de\014ned.)0 9280 y(previous)h(minibu\013er)f(command)
! 1220 b Ff(M-p)0 9449 y Fh(next)47 b(minibu\013er)h(command)1464
! b Ff(M-n)6534 9589 y Fh(3)p eop
  %%Page: 4 4
! 4 3 bop 268 -542 a Fi(GNU)92 b(Emacs)h(Reference)g(Card)0 -71
! y Fg(Bu\013ers)0 279 y Fh(select)48 b(another)g(bu\013er)1794
! b Ff(C-x)73 b(b)0 448 y Fh(list)47 b(all)g(bu\013ers)2208 b
! Ff(C-x)73 b(C-b)0 617 y Fh(kill)47 b(a)g(bu\013er)2338 b Ff(C-x)73
! b(k)0 1027 y Fg(T)-19 b(ransp)6 b(osing)0 1378 y Fh(transp)t(ose)49
! b Fe(c)l(haracters)1694 b Ff(C-t)0 1546 y Fh(transp)t(ose)49
! b Fe(w)l(ords)2002 b Ff(M-t)0 1715 y Fh(transp)t(ose)49 b Fe(lines)2101
! b Ff(C-x)73 b(C-t)0 1884 y Fh(transp)t(ose)49 b Fe(sexps)2040
! b Ff(C-M-t)0 2295 y Fg(Sp)6 b(elling)78 b(Chec)-6 b(k)0 2645
! y Fh(c)l(hec)l(k)49 b(sp)t(elling)f(of)f(curren)l(t)h(w)l(ord)1207
! b Ff(M-$)0 2814 y Fh(c)l(hec)l(k)49 b(sp)t(elling)f(of)f(all)h(w)l(ords)f(in)
! g(region)565 b Ff(M-x)73 b(ispell-region)0 2982 y Fh(c)l(hec)l(k)49
! b(sp)t(elling)f(of)f(en)l(tire)h(bu\013er)952 b Ff(M-x)73 b(ispell-buffer)0
! 3409 y Fg(T)-19 b(ags)0 3759 y Fh(\014nd)47 b(a)g(tag)g(\(a)g(de\014nition\))
! 1604 b Ff(M-.)0 3928 y Fh(\014nd)47 b(next)g(o)t(ccurrence)j(of)d(tag)1396
! b Ff(C-u)73 b(M-.)0 4096 y Fh(sp)t(ecify)48 b(a)g(new)f(tags)g(\014le)1240
! b Ff(M-x)73 b(visit-tags-table)0 4325 y Fh(regexp)48 b(searc)l(h)h(on)f(all)f
! (\014les)h(in)f(tags)g(table)439 b Ff(M-x)73 b(tags-search)0
! 4494 y Fh(run)47 b(query-replace)j(on)d(all)g(the)g(\014les)448
! b Ff(M-x)73 b(tags-query-replace)0 4663 y Fh(con)l(tin)l(ue)48
! b(last)g(tags)f(searc)l(h)i(or)e(query-replace)505 b Ff(M-,)0
! 5074 y Fg(Shells)0 5424 y Fh(execute)49 b(a)e(shell)h(command)1514
! b Ff(M-!)0 5593 y Fh(run)47 b(a)g(shell)h(command)h(on)e(the)g(region)900
! b Ff(M-|)0 5761 y Fh(\014lter)47 b(region)h(through)g(a)f(shell)h(command)728
! b Ff(C-u)73 b(M-|)0 5930 y Fh(start)47 b(a)g(shell)h(in)f(windo)l(w)g
! Ff(*shell*)784 b(M-x)73 b(shell)0 6341 y Fg(Rectangles)0 6691
! y Fh(cop)l(y)48 b(rectangle)h(to)e(register)1493 b Ff(C-x)73
! b(r)h(r)0 6860 y Fh(kill)47 b(rectangle)2257 b Ff(C-x)73 b(r)h(k)0
! 7029 y Fh(y)l(ank)48 b(rectangle)2155 b Ff(C-x)73 b(r)h(y)0
! 7197 y Fh(op)t(en)48 b(rectangle,)h(shifting)e(text)g(righ)l(t)977
! b Ff(C-x)73 b(r)h(o)0 7366 y Fh(blank)48 b(out)f(rectangle)1472
! b Ff(M-x)73 b(clear-rectangle)0 7535 y Fh(pre\014x)48 b(eac)l(h)g(line)g
! (with)e(a)h(string)822 b Ff(M-x)73 b(string-rectangle)0 7963
! y Fg(Abbrevs)0 8313 y Fh(add)47 b(global)h(abbrev)1944 b Ff(C-x)73
! b(a)h(g)0 8482 y Fh(add)47 b(mo)t(de-lo)t(cal)i(abbrev)1647
! b Ff(C-x)73 b(a)h(l)0 8650 y Fh(add)47 b(global)h(expansion)h(for)e(this)h
! (abbrev)801 b Ff(C-x)73 b(a)h(i)f(g)0 8819 y Fh(add)47 b(mo)t(de-lo)t(cal)i
! (expansion)g(for)e(this)g(abbrev)505 b Ff(C-x)73 b(a)h(i)f(l)0
! 8988 y Fh(explicitly)48 b(expand)g(abbrev)1534 b Ff(C-x)73
! b(a)h(e)0 9217 y Fh(expand)48 b(previous)h(w)l(ord)e(dynamically)912
! b Ff(M-/)6534 9589 y Fh(4)p eop
  %%Page: 5 5
! 5 4 bop 0 -571 a Fg(Regular)77 b(Expressions)0 -220 y Fh(an)l(y)48
! b(single)g(c)l(haracter)h(except)f(a)f(newline)759 b Ff(.)147
! b Fh(\(dot\))0 -52 y(zero)48 b(or)f(more)h(rep)t(eats)1786
! b Ff(*)0 117 y Fh(one)48 b(or)f(more)h(rep)t(eats)1825 b Ff(+)0
! 286 y Fh(zero)48 b(or)f(one)h(rep)t(eat)1935 b Ff(?)0 454 y
! Fh(an)l(y)48 b(c)l(haracter)g(in)f(the)h(set)1590 b Ff([)74
! b Fa(:)23 b(:)g(:)74 b Ff(])0 623 y Fh(an)l(y)48 b(c)l(haracter)g(not)f(in)g
! (the)g(set)1341 b Ff([^)73 b Fa(:)23 b(:)g(:)75 b Ff(])0 792
! y Fh(b)t(eginning)48 b(of)f(line)2026 b Ff(^)0 961 y Fh(end)48
! b(of)f(line)2404 b Ff($)0 1129 y Fh(quote)48 b(a)f(sp)t(ecial)h(c)l(haracter)
! h Fb(c)1408 b Ff(\\)p Fb(c)0 1298 y Fh(alternativ)l(e)48 b(\(\\or"\))1970
! b Ff(\\|)0 1467 y Fh(grouping)2510 b Ff(\\\()73 b Fa(:)23 b(:)g(:)75
! b Ff(\\\))0 1635 y Fb(n)11 b Fh(th)46 b(group)2428 b Ff(\\)p
! Fb(n)0 1804 y Fh(b)t(eginning)48 b(of)f(bu\013er)1889 b Ff(\\`)0
! 1973 y Fh(end)48 b(of)f(bu\013er)2267 b Ff(\\')0 2141 y Fh(w)l(ord)47
! b(break)2361 b Ff(\\b)0 2310 y Fh(not)47 b(b)t(eginning)h(or)f(end)h(of)f(w)l
! (ord)1255 b Ff(\\B)0 2479 y Fh(b)t(eginning)48 b(of)f(w)l(ord)1943
! b Ff(\\<)0 2648 y Fh(end)48 b(of)f(w)l(ord)2321 b Ff(\\>)0
! 2816 y Fh(an)l(y)48 b(w)l(ord-syn)l(tax)f(c)l(haracter)1420
! b Ff(\\w)0 2985 y Fh(an)l(y)48 b(non-w)l(ord-syn)l(tax)g(c)l(haracter)1146
! b Ff(\\W)0 3154 y Fh(c)l(haracter)49 b(with)d(syn)l(tax)i Fb(c)1599
! b Ff(\\s)p Fb(c)0 3322 y Fh(c)l(haracter)49 b(with)d(syn)l(tax)i(not)f
! Fb(c)1349 b Ff(\\S)p Fb(c)0 3733 y Fg(Registers)0 4083 y Fh(sa)l(v)l(e)48
! b(region)h(in)e(register)1707 b Ff(C-x)73 b(r)h(s)0 4252 y
! Fh(insert)48 b(register)g(con)l(ten)l(ts)g(in)l(to)f(bu\013er)960
! b Ff(C-x)73 b(r)h(i)0 4481 y Fh(sa)l(v)l(e)48 b(v)-8 b(alue)49
! b(of)e(p)t(oin)l(t)g(in)g(register)1239 b Ff(C-x)73 b(r)h(SPC)0
! 4650 y Fh(jump)47 b(to)g(p)t(oin)l(t)g(sa)l(v)l(ed)i(in)e(register)1149
! b Ff(C-x)73 b(r)h(j)0 5078 y Fg(Info)0 5428 y Fh(en)l(ter)48
! b(the)f(Info)g(do)t(cumen)l(tation)i(reader)818 b Ff(C-h)73
! b(i)0 5658 y Fh(Mo)l(ving)48 b(within)e(a)h(no)t(de:)141 5887
! y(scroll)h(forw)l(ard)2070 b Ff(SPC)141 6056 y Fh(scroll)48
! b(rev)l(erse)2118 b Ff(DEL)141 6224 y Fh(b)t(eginning)48 b(of)f(no)t(de)1811
! b Ff(.)147 b Fh(\(dot\))0 6454 y(Mo)l(ving)48 b(b)t(et)l(w)l(een)g(no)t(des:)
! 141 6683 y Fe(next)f Fh(no)t(de)2256 b Ff(n)141 6851 y Fe(previous)47
! b Fh(no)t(de)1973 b Ff(p)141 7020 y Fh(mo)l(v)l(e)48 b Fe(up)2364
! b Ff(u)141 7189 y Fh(select)48 b(men)l(u)g(item)f(b)l(y)g(name)1303
! b Ff(m)141 7358 y Fh(select)48 b Fb(n)11 b Fh(th)47 b(men)l(u)g(item)h(b)l(y)
! f(n)l(um)l(b)t(er)h(\(1{5\))528 b Fb(n)141 7526 y Fh(follo)l(w)47
! b(cross)h(reference)i(\(return)d(with)f Ff(l)p Fh(\))631 b
! Ff(f)141 7695 y Fh(return)47 b(to)g(last)g(no)t(de)h(y)l(ou)f(sa)l(w)1211
! b Ff(l)141 7864 y Fh(return)47 b(to)g(directory)h(no)t(de)1415
! b Ff(d)141 8032 y Fh(go)47 b(to)g(an)l(y)g(no)t(de)h(b)l(y)f(name)1421
! b Ff(g)0 8262 y Fh(Other:)141 8491 y(run)47 b(Info)g Fe(tutorial)1829
! b Ff(h)141 8659 y Fh(list)47 b(Info)g(commands)1736 b Ff(?)141
! 8828 y Fe(quit)47 b Fh(Info)2336 b Ff(q)141 8997 y Fh(searc)l(h)48
! b(no)t(des)h(for)e(regexp)1469 b Ff(s)6534 9589 y Fh(5)p eop
  %%Page: 6 6
! 6 5 bop 0 -571 a Fg(Keyb)6 b(oard)79 b(Macros)0 -220 y Fe(start)46
! b Fh(de\014ning)i(a)f(k)l(eyb)t(oard)h(macro)1035 b Ff(C-x)73
! b(\()0 -52 y Fe(end)47 b Fh(k)l(eyb)t(oard)h(macro)g(de\014nition)1139
! b Ff(C-x)73 b(\))0 117 y Fe(execute)47 b Fh(last-de\014ned)i(k)l(eyb)t(oard)f
! (macro)735 b Ff(C-x)73 b(e)0 286 y Fh(app)t(end)48 b(to)f(last)g(k)l(eyb)t
! (oard)i(macro)1130 b Ff(C-u)73 b(C-x)g(\()0 454 y Fh(name)48
! b(last)f(k)l(eyb)t(oard)i(macro)741 b Ff(M-x)74 b(name-last-kbd-macro)0
! 623 y Fh(insert)48 b(Lisp)f(de\014nition)h(in)f(bu\013er)745
! b Ff(M-x)73 b(insert-kbd-macro)0 1034 y Fg(Commands)79 b(Dealing)e(with)g
! (Emacs)h(Lisp)0 1384 y Fh(ev)-8 b(al)48 b Fe(sexp)f Fh(b)t(efore)h(p)t(oin)l
! (t)1661 b Ff(C-x)73 b(C-e)0 1553 y Fh(ev)-8 b(al)48 b(curren)l(t)g
! Fe(defun)1881 b Ff(C-M-x)0 1722 y Fh(ev)-8 b(al)48 b Fe(region)2031
! b Ff(M-x)73 b(eval-region)0 1890 y Fh(ev)-8 b(al)48 b(en)l(tire)g
! Fe(bu\013er)1271 b Ff(M-x)74 b(eval-current-buffer)0 2059 y
! Fh(read)48 b(and)f(ev)-8 b(al)48 b(minibu\013er)1549 b Ff(M-ESC)0
! 2228 y Fh(re-execute)49 b(last)e(minibu\013er)h(command)846
! b Ff(C-x)73 b(ESC)g(ESC)0 2396 y Fh(read)48 b(and)f(ev)-8 b(al)48
! b(Emacs)g(Lisp)f(\014le)948 b Ff(M-x)73 b(load-file)0 2565
! y Fh(load)48 b(from)f(standard)h(system)g(directory)513 b Ff(M-x)73
! b(load-library)0 2993 y Fg(Simple)k(Customization)0 3343 y
! Fh(Here)37 b(are)f(some)h(examples)g(of)f(binding)g(global)g(k)l(eys)h(in)f
! (Emacs)g(Lisp.)59 b(Note)0 3512 y(that)47 b(y)l(ou)g(cannot)h(sa)l(y)g
! Ff("\\M-#")p Fh(;)e(y)l(ou)h(m)l(ust)g(sa)l(y)h Ff("\\e#")p
! Fh(.)0 3741 y Ff(\(global-set-key)71 b("\\C-cg")h('goto-line\))0
! 3910 y(\(global-set-key)f("\\C-x\\C-k")h('kill-region\))0 4079
! y(\(global-set-key)f("\\e#")i('query-replace-regexp\))0 4308
! y Fh(An)47 b(example)i(of)e(setting)h(a)f(v)-8 b(ariable)48
! b(in)f(Emacs)h(Lisp:)0 4537 y Ff(\(setq)73 b(backup-by-copying-when-linked)68
! b(t\))0 4965 y Fg(W)-19 b(riting)76 b(Commands)0 5316 y Ff(\(defun)d
! Fb(c)-7 b(ommand-name)83 b Ff(\()p Fb(ar)-7 b(gs)12 b Ff(\))148
! 5484 y(")p Fb(do)-7 b(cumentation)11 b Ff(")148 5653 y(\(interactive)71
! b(")p Fb(template)11 b Ff("\))148 5822 y Fb(b)-7 b(o)g(dy)12
! b Ff(\))0 6051 y Fh(An)47 b(example:)0 6280 y Ff(\(defun)73
! b(this-line-to-top-of-window)68 b(\(line\))148 6449 y("Reposition)j(line)i
! (point)g(is)h(on)f(to)g(top)h(of)f(window.)0 6618 y(With)g(ARG,)g(put)g
! (point)g(on)h(line)f(ARG.)0 6786 y(Negative)f(counts)h(from)g(bottom.")148
! 6955 y(\(interactive)e("P"\))148 7124 y(\(recenter)h(\(if)h(\(null)g(line\))
! 1181 7292 y(0)1033 7461 y(\(prefix-numeric-value)d(line\)\)\)\))0
! 7690 y Fh(The)39 b(argumen)l(t)h(to)e Ff(interactive)f Fh(is)i(a)g(string)g
! (sp)t(ecifying)i(ho)l(w)e(to)g(get)g(the)0 7859 y(argumen)l(ts)59
! b(when)e(the)g(function)g(is)h(called)g(in)l(teractiv)l(ely)-12
! b(.)95 b(T)l(yp)t(e)57 b Ff(C-h)73 b(f)0 8028 y(interactive)45
! b Fh(for)i(more)h(information.)805 8407 y Fd(Cop)m(yrigh)m(t)1364
! 8404 y(c)1332 8407 y Fc(\015)38 b Fd(1993)g(F)-9 b(ree)38 b(Soft)m(w)m(are)g
! (F)-9 b(oundation,)38 b(Inc.)958 8542 y(designed)h(b)m(y)f(Stephen)g(Gildea,)
! i(Ma)m(y)e(1993)g(v2.0)951 8677 y(for)g(GNU)g(Emacs)e(v)m(ersion)j(19)f(on)g
! (Unix)h(systems)0 8872 y(P)m(ermission)c(is)g(gran)m(ted)g(to)g(mak)m(e)f
! (and)h(distribute)h(copies)g(of)f(this)g(card)g(pro)m(vided)h(the)f(cop)m(y-)
! 0 9007 y(righ)m(t)k(notice)f(and)h(this)f(p)s(ermission)g(notice)h(are)e
! (preserv)m(ed)h(on)g(all)i(copies.)0 9203 y(F)-9 b(or)35 b(copies)h(of)f(the)
! g(GNU)g(Emacs)f(man)m(ual,)i(write)h(to)e(the)g(F)-9 b(ree)35
! b(Soft)m(w)m(are)g(F)-9 b(oundation,)37 b(Inc.,)0 9338 y(675)h(Massac)m(h)m
! (usetts)e(Av)m(e,)i(Cam)m(bridge)g(MA)g(02139.)6534 9589 y
! Fh(6)p eop
  %%Trailer
  end
  userdict /end-hook known{end-hook}if
- SafetyEnclosure restore
  %%EOF
--- 1,827 ----
  %!PS-Adobe-2.0
! %%Creator: dvipsk 5.58f Copyright 1986, 1994 Radical Eye Software
  %%Title: refcard.dvi
  %%Pages: 6
  %%PageOrder: Ascend
! %%BoundingBox: 0 0 596 842
  %%EndComments
! %DVIPSCommandLine: dvips refcard.dvi
! %DVIPSParameters: dpi=300, compressed, comments removed
! %DVIPSSource:  TeX output 1996.03.21:2231
  %%BeginProcSet: texc.pro
! /TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N
! /X{S N}B /TR{translate}N /isls false N /vsize 11 72 mul N /hsize 8.5 72
! mul N /landplus90{false}def /@rigin{isls{[0 landplus90{1 -1}{-1 1}
! ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale
! isls{landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div
! hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul
! TR[matrix currentmatrix{dup dup round sub abs 0.00001 lt{round}if}
! forall round exch round exch]setmatrix}N /@landscape{/isls true N}B
! /@manualfeed{statusdict /manualfeed true put}B /@copies{/#copies X}B
! /FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{
! /nn 8 dict N nn begin /FontType 3 N /FontMatrix fntrx N /FontBBox FBB N
! string /base X array /BitMaps X /BuildChar{CharBuilder}N /Encoding IE N
! end dup{/foo setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /df{
! /sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0]
! N df-tail}B /E{pop nn dup definefont setfont}B /ch-width{ch-data dup
! length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{
! 128 ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub
! get 127 sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data
! dup type /stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N
! /rc 0 N /gp 0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup
! /base get 2 index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx
! 0 ch-xoff ch-yoff ch-height sub ch-xoff ch-width add ch-yoff
! setcachedevice ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff
! .1 sub]/id ch-image N /rw ch-width 7 add 8 idiv string N /rc 0 N /gp 0 N
! /cp 0 N{rc 0 ne{rc 1 sub /rc X rw}{G}ifelse}imagemask restore}B /G{{id
! gp get /gp gp 1 add N dup 18 mod S 18 idiv pl S get exec}loop}B /adv{cp
! add /cp X}B /chg{rw cp id gp 4 index getinterval putinterval dup gp add
! /gp X adv}B /nd{/cp 0 N rw exit}B /lsh{rw cp 2 copy get dup 0 eq{pop 1}{
! dup 255 eq{pop 254}{dup dup add 255 and S 1 and or}ifelse}ifelse put 1
! adv}B /rsh{rw cp 2 copy get dup 0 eq{pop 128}{dup 255 eq{pop 127}{dup 2
! idiv S 128 and or}ifelse}ifelse put 1 adv}B /clr{rw cp 2 index string
! putinterval adv}B /set{rw cp fillstr 0 4 index getinterval putinterval
! adv}B /fillstr 18 string 0 1 17{2 copy 255 put pop}for N /pl[{adv 1 chg}
! {adv 1 chg nd}{1 add chg}{1 add chg nd}{adv lsh}{adv lsh nd}{adv rsh}{
! adv rsh nd}{1 add adv}{/rc X nd}{1 add set}{1 add clr}{adv 2 chg}{adv 2
! chg nd}{pop nd}]dup{bind pop}forall N /D{/cc X dup type /stringtype ne{]
! }if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup
! length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}B /I{
! cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin
! 0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul
! add .99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore userdict
! /eop-hook known{eop-hook}if showpage}N /@start{userdict /start-hook
! known{start-hook}if pop /VResolution X /Resolution X 1000 div /DVImag X
! /IE 256 array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}for
! 65781.76 div /vsize X 65781.76 div /hsize X}N /p{show}N /RMat[1 0 0 -1 0
! 0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X /rulex X V}B /V
! {}B /RV statusdict begin /product where{pop product dup length 7 ge{0 7
! getinterval dup(Display)eq exch 0 4 getinterval(NeXT)eq or}{pop false}
! ifelse}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale rulex ruley false
! RMat{BDot}imagemask grestore}}{{gsave TR -.1 .1 TR rulex ruley scale 1 1
! false RMat{BDot}imagemask grestore}}ifelse B /QV{gsave newpath transform
! round exch round exch itransform moveto rulex 0 rlineto 0 ruley neg
! rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N /tail
! {dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{S p tail}B /c{-4 M}
! B /d{-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{3 M}B /k{
! 4 M}B /w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w}B /q{
! p 1 w}B /r{p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{3 2 roll p
! a}B /bos{/SS save N}B /eos{SS restore}B end
  %%EndProcSet
! TeXDict begin 39158280 55380996 1000 300 300 (refcard.dvi)
! @start /Fa 1 59 df<126012F0A2126004047C830C>58 D E /Fb
! 19 122 df<EAFFC0A30A037D890F>45 D<EA01E3EA0717EA0C0F1218EA380E12301270A2
! EAE01CA41339A3EA6079EA319AEA1E0C10127C9115>97 D<123F1207A2120EA45AA4EA39
! E0EA3A18EA3C0C12381270130EA3EAE01CA31318133813301360EA60C0EA3180EA1E000F
! 1D7C9C13>I<13F8EA0304120EEA1C0EEA181CEA30001270A25AA51304EA60081310EA30
! 60EA0F800F127C9113>I<EB07E01300A2EB01C0A4EB0380A43801E700EA0717EA0C0F12
! 18EA380E12301270A2485AA41339A3EA6079EA319AEA1E0C131D7C9C15>I<13F8EA0704
! 120CEA1802EA38041230EA7008EA7FF0EAE000A5EA60041308EA30101360EA0F800F127C
! 9113>I<EB78C0EA01C5EA03031206000E1380120C121CA238380700A4130EA3EA181EEA
! 0C7CEA079CEA001CA25BA2EAC030EAE070EAC1C0007FC7FC121A7E9113>103
! D<EA0FC01201A2485AA448C7FCA4EA0E3E13C3380F0380120E121E121CA338380700A313
! 0E00701340A2131C1480EAE00C38600700121D7E9C15>I<EA01801203EA0100C7FCA712
! 1C12261247A2128EA2120E5AA35AA21271A31272A2123C091C7C9B0D>I<EA1F801203A2
! EA0700A4120EA45AA45AA45AA412E2A312E412641238091D7D9C0B>108
! D<391C1E078039266318C0394683A0E0384703C0008E1380A2120EA2391C0701C0A3EC03
! 80D8380E1388A2EC0708151039701C032039300C01C01D127C9122>I<EA383EEA4CC338
! 4D0380124E129E129C121CA238380700A3130E00701340A2131C1480EAE00C3860070012
! 127C9117>I<13F8EA030CEA0E06487E1218123000701380A238E00700A3130EA25BEA60
! 185BEA30E0EA0F8011127C9115>I<380387803804C860EBD03013E0EA09C014381201A2
! 38038070A31460380700E014C0EB0180EB8300EA0E86137890C7FCA25AA45AB4FC151A80
! 9115>I<EA1C3CEA2642EA4687EA4707EA8E061300120EA25AA45AA45A123010127C9112>
! 114 D<EA01F0EA0608120C131CEA1818EA1C00121F13C0EA0FF01207EA00781338EA6030
! 12E012C0EA8060EA60C0EA1F000E127D9111>I<12035AA3120EA4EAFFE0EA1C00A35AA4
! 5AA4EAE080A2EAE100A2126612380B1A7C990E>I<381C0180EA2E03124EA2388E0700A2
! 121CA2EA380EA438301C80A3EA383C38184D00EA0F8611127C9116>I<381C0180EA2E03
! 124EA2388E0700A2121CA2EA380EA4EA301CA3EA383CEA1878EA0FB8EA003813301370EA
! E0605BEA81800043C7FC123C111A7C9114>121 D E /Fc 1 14 df<EB3F803801FFF038
! 07C07C380E000E487F48EB038000301301007014C00060130000E014E0481460A66C14E0
! 006014C00070130100301480003813036CEB07006C130E3807C07C3801FFF038003F801B
! 1A7E9321>13 D E /Fd 47 122 df<124012E012601220A31240A2128003097D8209>44
! D<12FFA2080280860B>I<124012E0124003037D8209>I<120FEA30C0EA6060A2EA4020EA
! C030A9EA4020EA6060A2EA30C0EA0F000C137E9211>48 D<120C121C12EC120CAFEAFFC0
! 0A137D9211>I<121FEA60C01360EAF07013301260EA0070A2136013C012011380EA0200
! 5AEA08101210EA2020EA7FE012FF0C137E9211>I<EA0FC0EA3070EA7038A31200133013
! E0EA0FC0EA007013381318131C126012F01318EAE038EA6070EA1FC00E137F9211>I<EA
! 6060EA7FC01380EA44001240A3124FEA70C0EA40E0EA00601370A212E0A21360EA40E0EA
! 21C0EA1F000C137E9211>53 D<EA07C0EA0C20EA10701220EA6000A25A12CFEAD0C0EAE0
! 60EAC0201330A31240EA6020EA2060EA10C0EA0F000C137E9211>I<1240EA7FFC13F8EA
! 4010EA80301320EA00401380EA0100A25A12021206A2120EA512040E147E9311>I<120F
! EA3080EA6040EA4060EAC0201330A31240EA6070EA30B0EA0F30120013201360EAE04013
! 80EA4100123E0C137E9211>57 D<1330A21378A3139CA2EA019E130EA2EA0207A2000613
! 80EA07FFEA0403380801C0A2001813E0EA380038FE07FC16147F9319>65
! D<EAFFFCEA1C07EB0380EB01C0A4EB0380EB0700EA1FFE381C0380EB01C0EB00E0A5EB01
! C0EB038038FFFE0013147F9317>I<EBFC2038070360380C00E04813605A007013201260
! 00E01300A600601320127012306C13406C138038070300EA00FC13147E9318>I<B51280
! EA1C031300A21440A2130814001318EA1FF8EA1C18130814201300A21460144014C01301
! B5FC13147F9316>69 D<B51280EA1C031300A21440A2130814001318EA1FF8EA1C181308
! A290C7FCA6EAFFC012147F9315>I<EBFC2038070360380C00E04813605A007013201260
! 00E01300A4EB0FF8EB00E01260127012307E7E380703603800FC2015147E931A>I<EAFF
! 80EA1C00B2EAFF8009147F930C>73 D<00FEEB0FE0001E140000171317A338138027A238
! 11C047A23810E087A3EB7107A2133AA2131CA2123839FE083FE01B147F931E>77
! D<38FC01FC381E00700017132013801213EA11C0EA10E01370A21338131C130E130F1307
! EB03A0EB01E01300A20038136000FE132016147F9319>I<EAFFFCEA1C07EB0380EB01C0
! A5EB0380EB0700EA1FFC001CC7FCA8B47E12147F9316>80 D<EA1F10EA30F0EA603012C0
! 1310A2EAE0001270127FEA3FC0EA0FE0EA00F0133813181280A3EAC030EAF060EA8FC00D
! 147E9312>83 D<387FFFF03860703000401310A200801308A300001300ACEA07FF15147F
! 9318>I<38FF81FC381C00701420AD120C000E13400006138038038300EA00FC16147F93
! 19>I<127FEAE1C0EAE040EA40601200EA07E0EA3860126012C01364A2EA61E4EA3E380E
! 0D7E8C11>97 D<12F01230A6EA33E0EA3430EA3808EA300C1306A5130CEA3808EA3430EA
! 23E00F147F9312>I<EA0FE0EA18701220EA6020EAC000A51260EA2010EA1820EA0FC00C
! 0D7F8C0F>I<13781318A6EA0F98EA1878EA2038EA601812C0A51260EA2038EA1858EA0F
! 9E0F147F9312>I<EA0F80EA1040EA2020EA6030EAC010EAFFF0EAC000A31260EA2010EA
! 1820EA0FC00C0D7F8C0F>I<EA03C0EA0CE0121813401300A3B4FC1218AB127F0B148093
! 0A>I<EA0F3CEA30E6EA2040EA6060A3EA2040EA30C0EA2F001260A2EA3FE013F0EA6018
! EAC00CA3EA6018EA3030EA0FC00F147F8C11>I<12F01230A6EA33E0EA3430EA38181230
! A9EAFC7E0F147F9312>I<1220127012201200A512F01230AB12FC06157F9409>I<12F012
! 30A6137C133013601380EA31001233EA3F801231EA30C0136013701330EAFC7C0E147F93
! 11>107 D<12F01230B212FC06147F9309>I<38F3E1F03834321838381C0CEA3018A938FC
! 7E3F180D7F8C1B>I<EAF3E0EA3430EA38181230A9EAFC7E0F0D7F8C12>I<EA0FC0EA1860
! EA2010EA6018EAC00CA5EA6018A2EA3870EA0FC00E0D7F8C11>I<EAF3E0EA3430EA3808
! EA300C1306A5130CEA3808EA3430EA33E0EA3000A512FC0F137F8C12>I<EAF3C0EA34E0
! 1238EA30401300A812FE0B0D7F8C0D>114 D<EA3E80126112C0A2EAE000127EEA3F80EA
! 03C01280A212C0EAE180EA9F000A0D7F8C0D>I<1210A312301270EAFF80EA3000A71380
! A3EA1100120E09127F910D>I<EAF078EA3018A91338EA1858EA0F9E0F0D7F8C12>I<EAF8
! 3CEA30181310EA3830EA1820A2EA0C40A2EA0680A3EA0300A20E0D7F8C11>I<38F87CF8
! 3870703038305820A238188840138CA2380D04801306A238060300A3150D7F8C18>I<EA
! F87CEA3030EA1860EA0C401380EA07007EEA0780EA0CC0EA08601210EA3030EAF07C0E0D
! 7F8C11>I<EAF83CEA30181310EA3830EA1820A2EA0C40A2EA0680A3EA0300A21202A212
! E4A212E812700E137F8C11>I E /Fe 25 122 df<90383FE3F83901F03F1C3903C03E3E
! 0007137CEA0F80151C1500A5B612C0A2390F807C00AE397FE1FF80A21F1D809C1C>11
! D<EA0FF8EA1C1E383E0F80130714C0121C1200137FEA07E7EA1F07123C127C12F8A3EA78
! 0B383E13F8EA0FE115127F9117>97 D<B4FCA2121FA9EB3F80EBE1E0EB8070EB0078143C
! A2143EA6143CA21478EB8070381EC1E0381C3F00171D7F9C1B>I<EA03FCEA0E0EEA1C1F
! 123C1278130E00F8C7FCA61278EB0180123C381C0300EA0E0EEA03F811127E9115>I<EB
! 0FF0A21301A9EA01F9EA0F07EA1C03EA3C011278A212F8A61278A2123CEA1C03380F0FFE
! EA03F9171D7E9C1B>I<EA03FCEA0F07381C0380383C01C0127814E012F8A2B5FC00F8C7
! FCA3127814607E6C13C0380F03803801FC0013127F9116>I<137F3801E3803803C7C0EA
! 0787120FEB8380EB8000A5EAFFF8A2EA0F80AEEA7FF0A2121D809C0F>I<3803F0F0380E
! 1F38EA3C0F3838073000781380A400381300EA3C0FEA1E1CEA33F00030C7FCA3EA3FFF14
! C06C13E014F0387801F838F00078A300701370007813F0381E03C03807FF00151B7F9118
! >I<B4FCA2121FA9EB0FC0EB31E0EB40F0EB80F8A21300AB38FFE7FFA2181D7F9C1B>I<12
! 1E123FA4121EC7FCA6127FA2121FAEEAFFC0A20A1E7F9D0E>I<B4FCA2121FA9EB03FCA2
! EB01C0EB0300130E5B5B137813FC13BE131F7F1480EB07C0EB03E0130138FFE7FEA2171D
! 7F9C19>107 D<B4FCA2121FB3A7EAFFE0A20B1D7F9C0E>I<39FF0FC07E903831E18F3A1F
! 40F20780D980FC13C0A2EB00F8AB3AFFE7FF3FF8A225127F9128>I<38FF0FC0EB31E038
! 1F40F0EB80F8A21300AB38FFE7FFA218127F911B>I<EA01FC380F0780381C01C0003C13
! E0387800F0A200F813F8A6007813F0A2383C01E0381E03C0380F07803801FC0015127F91
! 18>I<38FF3F80EBE1E0381F80F0EB0078147C143C143EA6143C147C1478EB80F0EBC1E0
! EB3F0090C7FCA6EAFFE0A2171A7F911B>I<3803F060380F0CE0EA1E07EA3C03127C1278
! 12F8A61278127C123CEA1C07EA0E0FEA03F3EA0003A6EB1FFCA2161A7E9119>I<EAFE3E
! 1347381E8F80A3381F070090C7FCAAEAFFE0A211127F9114>I<EA1FD8EA3078EA601812
! E0A2EAF000EAFF80EA7FE013F0EA1FF8EA07FCEA007CEAC01CA212E01318EAF830EACFC0
! 0E127E9113>I<1203A45AA25AA2EA3FFC12FFEA1F00A9130CA4EA0F08EA0798EA03F00E
! 1A7F9913>I<38FF07F8A2EA1F00AC1301120F380786FFEA01F818127F911B>I<38FFC1FC
! A2381F00601380000F13C0A23807C180A23803E300A213F7EA01F613FE6C5AA21378A213
! 3016127F9119>I<39FF8FF8FEA2391F03E030A3390F87F06013869038C6F8E03907CC78
! C0A23903FC7D80EBF83D143F3901F01F00A20000131EEBE00EA21F127F9122>I<38FFC7
! FCA2381F81C0380F83803807C700EA03EEEA01FC5B1200137C13FEEA01DF38039F80EA07
! 0F380607C0380C03E038FF07FCA216127F9119>I<38FFC1FCA2381F00601380000F13C0
! A23807C180A23803E300A213F7EA01F613FE6C5AA21378A21330A25B1270EAF8E05BEAF9
! 800073C7FC123E161A7F9119>I E /Ff 75 126 df<126012F0AF12601200A4126012F0
! A212600419779816>33 D<EA6030EAF078A8EAE038A30D0C7C9916>I<EA0387A6387FFF
! C0B512E0A238070E00A3EA0F1EEA0E1CA3B512E0A26C13C0381C3800A613197F9816>I<
! 13C01201A3EA07F0EA1FFC48B4FCEA7DCF38F1C78012E1A338F1C300EA79C0127FEA1FF0
! EA07FCEA01FE13CFEBC780EAF1C3A3EAE1C712F13879DF00EA3FFE6C5AEA07E0EA01C0A2
! 120011207E9C16>I<38380180EA7C03EAFE07140012EE5B130E131EEAFE1C133CEA7C38
! 1238EA0078137013F05BA212015B12035BEB8380380787C0EB0FE0EA0F0E120E121E121C
! A2EA3C0F383807C03818038013207F9C16>I<12301278127C123C121CA3123C12381278
! 12F012E012C0060D789816>39 D<13E01201EA07C013005A121E5A123812781270A312F0
! 5AA77E1270A312781238123C7E7E7E13C0EA01E012000B217A9C16>I<12E07E127C121C
! 121E7EEA0780120313C01201A313E01200A7120113C0A3120313801207EA0F00121E121C
! 127C12F05A0B217C9C16>I<EA0380A4EAE38EEAF39EEAFFFEEA3FF8EA0FE0A2EA3FF8EA
! FFFEEAF39EEAE38EEA0380A40F127D9516>I<13E0A8B512E0A33800E000A813137F9516>
! I<1238127C127EA2123E120E121E123C127C12F81260070B798416>I<B51280A311037E
! 8D16>I<127012F8A312700505788416>I<EB01801303130714005B130E131E131C133C13
! 381378137013F05B12015BA212035B120790C7FC5A120E121E121C123C12381278127012
! F05AA211207E9C16>I<EA03E0EA0FF8487EEA1E3CEA380EEA780FEA7007A238E00380A8
! EAF00700701300A2EA780FEA3C1E6C5AEA1FFC6C5AEA03E011197E9816>I<12035A5AA2
! 5AB4FCA212F71207AEEAFFF8A30D197B9816>I<EA07E0EA1FF8EA7FFEEA783FEAF00FEB
! 07801303A21200A2130714005B131E5B5B5BEA03E0EA078048C7FC381E0380123CEA7FFF
! B5FC7E11197E9816>I<EA07E0EA1FFCEA7FFEEA781F7F7F12005BA2133EEA07FC5B7FEA
! 001E130714801303A212F013071400EAF81FEA7FFE6C5AEA07E011197E9816>I<137C13
! FC13DC1201EA039CA2EA071C120F120E121E123C1238127812F0B512E0A338001C00A538
! 01FFC0A313197F9816>I<EA3FFE127FA20070C7FCA7EA77F0EA7FFC7FEA7C0FEA300700
! 0013801303126012F01307EB0F006C5AEA7FFEEA1FF8EA07E011197E9816>I<127012F8
! A312701200A8127012F8A312700512789116>58 D<EB03801307131FEB3E0013FCEA03F0
! 485AEA1F80003EC7FC12FC12F012FC123E6C7EEA07E06C7EEA00FC133EEB1F8013071303
! 11157E9616>60 D<12E07E12FC123E6C7EEA07E06C7EEA00FC133EEB1F801307131FEB3E
! 0013FCEA03F0485AEA1F80003EC7FC12FC12F05A11157E9616>62
! D<EA0FF0EA3FFE487E38F00F801303A2EA600738001F00137E13F85B485A5BA45BC8FCA4
! 487E487EA26C5A11197E9816>I<13F8EA03FEEA0FFF381F0F80EA3E3FEA3CFF007913C0
! EA73C7EAF38312E71301A5138300F31380EA73C73879FF006C5AEA3E38381F03C0EA0FFF
! 00031300EA00FC12197E9816>I<13E0487EA213B0A2EA03B8A31318EA071CA5EA0E0EA2
! EA0FFEA2487EEA1C07A3387E0FC038FF1FE0387E0FC013197F9816>I<EA7FF8EAFFFE6C
! 7EEA1C0714801303A4EB0700EA1FFF5BA2EA1C1FEB038014C01301A41303EB0780EA7FFF
! B51200EA7FFC12197F9816>I<3801F180EA07FF5AEA1F0FEA3C0712781303127000F0C7
! FC5AA77E387003801278A2EA3C07381F0F00EA0FFE6C5AEA01F011197E9816>I<EA7FF8
! EAFFFE6C7EEA1C0FEB0780EB03C01301A214E01300A8EB01C0A21303EB0780130F387FFF
! 00485AEA7FF81319809816>I<387FFFC0B5FC7EEA1C01A490C7FCA2131CA2EA1FFCA3EA
! 1C1CA290C7FC14E0A5EA7FFFB5FC7E13197F9816>I<387FFFE0B5FC7EEA1C00A41400A2
! 131CA2EA1FFCA3EA1C1CA290C7FCA6EA7F80487E6C5A13197F9816>I<3801F180EA07FF
! 5AEA1F0FEA3C0712781303127000F0C7FC5AA4EB1FC014E014C038F003801270EA7807A2
! EA3C0FEA1E1FEA0FFFEA07FBEA01F313197F9816>I<B47E7F5B001CC7FCAE144014E0A4
! B5FCA313197F9816>76 D<38FC07E0EAFE0FA2383A0B80EA3B1BA513BBEA39B3A413F3EA
! 38E3A21303A538FE0FE0A313197F9816>I<387E07F038FF0FF8387F07F0381D81C0A313
! C1121C13E1A213611371A313311339A21319131D130DA3EA7F07EAFF87EA7F0315198098
! 16>I<EA7FF8EAFFFE6C7E381C0F80130314C01301A313031480130F381FFF005B13F800
! 1CC7FCA7127F487E6CC7FC12197F9816>80 D<EA7FF0EAFFFC6C7EEA1C0FEB07801303A4
! 1307EB0F00EA1FFE5B7FEA1C1F1307A414101438A2007F13F838FF83F0387F01E0151980
! 9816>82 D<EA07E3EA1FFF127FEA781F487E487EA290C7FC7E1278EA7F80EA1FF0EA07FC
! C67E130FEB07801303A212E0A2EAF00738F80F00EAFFFE5BEAC7F011197E9816>I<387F
! FFE0B5FCA2EAE0E0A400001300AFEA07FC487E6C5A13197F9816>I<387E03F038FF07F8
! 387E03F0383800E0A4381C01C0A3137113F9A213D9A2000C1380A3EA0DDD138DA338078F
! 00A213071519809816>87 D<EAFFF0A3EAE000B3A8EAFFF0A30C20789C16>91
! D<12E0A27E127012781238123C121C121E120E120F7E7F12037F1201A27F12007F137013
! 781338133C131C131E130E130F7F14801303130111207E9C16>I<EAFFF0A3EA0070B3A8
! EAFFF0A30C207F9C16>I<1207EA1FC0EA7FF0EAFDF8EAF078EA40100D067C9816>I<B512
! 80A311037E7E16>I<120C121C123C1278127012F012E0A312F012F812781230060D789B
! 16>I<EA1FE0EA7FF87FEA783EEA301EEA000EA2EA03FE121FEA7E0E12F012E0A2EAF01E
! EAF83E387FFFE0EA3FE7EA0F8313127E9116>I<12FCA3121CA4137CEA1DFF001F1380EB
! 07C0EA1E03381C01E0A21300A41301001E13C01303381F078013FF381DFE00EA0C781319
! 7F9816>I<EA03F8EA0FFE121FEA3C1EEA780CEA700012F05AA47EEA70071278EA3E0FEA
! 1FFEEA0FFCEA03F010127D9116>I<133FA31307A4EA03C7EA0FF7EA3FFFEA3C1F487EEA
! 700712F012E0A412F05BEA781FEA7C3F383FFFE0EA1FF7EA07C713197F9816>I<EA03F0
! EA0FFC487EEA3E1FEA780700701380EAF003B5FCA300E0C7FC7E387003801278EA3E0F38
! 1FFF006C5AEA03F811127E9116>I<131FEBFF805AEA03C7EB83001380A2EA7FFFB5FCA2
! EA0380ACEA7FFC487E6C5A11197F9816>I<3803E3C0380FFFE05A381E3CC0383C1E00EA
! 380EA3EA3C1E6C5AEA1FFC5BEA3BE00038C7FCA2EA1FFC13FF4813C0EA780338F001E0EA
! E000A3EAF001387C07C0383FFF80380FFE00EA03F8131C7F9116>I<12FCA3121CA41378
! EA1DFEEA1FFF130FEA1E07A2121CA938FF8FE0139F138F13197F9816>I<1203EA0780A2
! EA0300C7FCA4EAFF80A31203ACEAFFFC13FE13FC0F1A7C9916>I<13301378A213301300
! A4EA0FF8121F120FEA0038B3EA6078EAF0F0EAFFE0EA7FC0EA3F800D237E9916>I<127E
! 12FE127E120EA4EB7FE0A3EB0F00131E5B5B5BEA0FF8A213BC131EEA0E0E130FEB078038
! 7F87F0EAFFCFEA7F871419809816>I<EA7FC012FF127F1201B3EA7FFFB512806C130011
! 197E9816>I<38F9C38038FFEFC0EBFFE0EA3E7CEA3C78EA3870AA38FE7CF8A315128091
! 16>I<EAFC78EAFDFEB5FCEA1F0FEA1E07A2121CA938FF8FE0139F138F13127F9116>I<EA
! 03E0EA0FF8487EEA3C1E487EEA700738E00380A5EAF00700701300EA780FEA3C1EEA1FFC
! 6C5AEA03E011127E9116>I<EAFC7CEAFDFFB51280381F07C0EA1E03381C01E0A21300A4
! 1301001E13C01303381F078013FF381DFE00EA1C7890C7FCA6B47EA3131B7F9116>I<38
! 03E380EA0FFBEA1FFFEA3E1FEA780FEA7007EAF00312E0A412F0EA7007EA780FEA3C1FEA
! 3FFFEA0FFBEA03E3EA0003A6EB1FF0EB3FF8EB1FF0151B7F9116>I<387F0FC038FF3FE0
! EA7F7F3807F040EBE0005B5BA290C7FCA7EA7FFC12FF127F13127F9116>I<EA0FECEA3F
! FC127FEAF03CEAE01CA2EAF000EA7F80EA1FF0EA07FCEA003EEAE00EA212F0EAF81EEAFF
! FC13F8EAC7E00F127D9116>I<12035AA4EA7FFFB5FCA20007C7FCA75BEB0380A2130713
! 873803FF005BEA00F811177F9616>I<EAFC3FA3EA1C07AA5BEA1E1F381FFFE07EEA07C7
! 13127F9116>I<387F1FC038FF9FE0387F1FC0381C0700A2EA0E0EA36C5AA4EA03B8A3EA
! 01F0A26C5A13127F9116>I<38FF1FE0A338380380A4EA39F3A20019130013B3A3EA1DB7
! 1317EA1F1FEA0F1EEA0E0E13127F9116>I<387F1FC0133F131F380F1E006C5AEA03B813
! F012016C5A12017FEA03B8EA073C131CEA0E0E387F1FC038FF3FE0387F1FC013127F9116
! >I<387F1FC038FF9FE0387F1FC0381C0700120E130EA212075BA2EA039CA21398EA01B8
! A2EA00F0A35BA3485A1279127BEA7F8090C7FC123C131B7F9116>I<383FFFC05AA23870
! 0780EB0F00131EC65A13F8485A485A485A48C7FC381E01C0123C1278B5FCA312127F9116
! >I<EB1F80137FEA01FFEBE0005BA91203EA7F8048C7FCA26C7EEA03C01201A97FEBFF80
! EA007F131F11207E9C16>I<12E0B3AE0320779C16>I<12FCB4FC13C012031201A97F6CB4
! FCEB7F80A2EBFF00EA01E05BA9120312FF90C7FC12FC11207E9C16>I
! E /Fg 42 123 df<903901FF81FE011F9038EFFF80903A7F80FF87C0D9FE00EB0FE03903
! FC01FE13F8D807F013FCEE07C093C7FCA7B712F8A32707F001FCC7FCB3A33A7FFF1FFFE0
! A32B2A7FA928>11 D<EC03804A7EA24A7EA34A7EA24A7EA3EC73FCA2ECF3FE14E101017F
! 14C0A2010380EC807F010780EC003FA2010E6D7EA2011E80011C130F011FB5FC4980A290
! 39780007FC0170130301F080491301A2000181497F00031680D8FFFE011F13FEA32F297E
! A834>65 D<B612FCEDFF80823A03F8001FF06F7E6F7E1503A2821501A315035EA24B5A4B
! 5A4B5AEDFFC090B548C7FCEDFFE09039F80007F0ED03FC6F7EA26F7EA21780A617005D4B
! 5A4B5AED1FF8B75A16C04BC7FC29297DA831>I<91393FF00180903903FFFE07010FEBFF
! 8F90393FF007FF9038FF80014848C7127FD807FC143F49141F4848140F485A003F15075B
! 007F1503A3484891C7FCAB6C7EEE0380A2123F7F001F15076C6C15006C6C5C6D141ED801
! FE5C6C6C6C13F890393FF007F0010FB512C0010391C7FC9038003FF829297CA832>I<B6
! 12F8EDFF8016E03A03FC001FF8ED07FCED01FE6F7EEE7F80EE3FC0161F17E0A2EE0FF0A4
! 17F8AA17F0A3EE1FE0A217C0163FEE7F801700ED01FE4B5AED1FF8B712E0168003FCC7FC
! 2D297DA835>I<B712F0A33903FC000FED03F81501150016781638A3EDE03C161CA30201
! 1300A2140790B5FCA3EBFC071401A202001307A3160E1500A2161EA2161C163C167C16FC
! 1501150FB712F8A328297EA82D>I<B712E0A33903FC001FED07F01501A215001670A316
! 78EDE038A316001401A2140790B5FCA3EBFC071401A21400A492C7FCA9B512FCA325297E
! A82B>I<91393FF00180903903FFFE07010FEBFF8F90393FF007FF9038FF80014848C712
! 7FD807FC143F49141F4848140F485A003F15075B007F1503A3484891C7FCA992387FFFFC
! A26C7E9238007F80A26C7EA26C7E120F6C7E7FD801FE14FF6C6C7E90383FF003010FB512
! DF010314079039003FF8012E297CA836>I<B539F01FFFFEA3D803FCC7EA7F80AF90B7FC
! A301FCC7127FB1B539F01FFFFEA32F297DA836>I<B512FCA33801FE00B3B1B512FCA316
! 297EA81A>I<B539F001FFFCA3D803FCC7EA1F00163E16785EED03E04B5A4B5A4BC7FC15
! 3E15785DEC03E04A5A140F4A7E143F4A7E4A7E9038FFE7FC14C7EC83FEEC01FFD9FC007F
! A26F7E6F7E6F7EA26F7E6F7E6F7EA26F7E6F1380EE7FC0B539F00FFFFEA32F297DA836>
! 75 D<B512FCA3D803FCC8FCB3A316E0A4150116C0A21503A21507A2150F153FEDFF80B7
! FCA323297EA829>I<D8FFFE92381FFFC0A26D5D0003EFF000A2D9BF801477A2D99FC014
! E7A2D98FE0EB01C7A2D987F0EB0387A3D983F8EB0707A2D981FC130EA2D980FE131CA26E
! 133880A291383F8070A291381FC0E0A291380FE1C0A3913807F380A2913803FF00A26E5A
! A26E5AA2D8FFFE4AB512C01578A23A297DA841>I<ECFFE0010713FC90393FC07F809039
! 7F001FC0D801FCEB07F048486D7E48486D7E000F8148486D7EA24848EC7F80A2007F16C0
! A249143FA200FF16E0AA007F16C0A26D147F003F1680A26C6CECFF00141F3A0FF07FC1FE
! 00079038E0E1FC3A03F8C073F8D801FCEB77F0D800FFEB3FE090393FE07F8090260FFFFE
! C7FC01001560EC001F17E016C1ED0FFFA217C0A28117806F13006F5AED00782B357CA834
! >81 D<B612E015FE6F7E3A03FC007FE0ED0FF06F7E82150382A65E4B5AA2ED1FE0ED7FC0
! 90B500FEC7FC15F89038FC01FCEC007F6F7E82151F82A482A4170716F8150FEEFC0FB539
! F007FE1E923801FFFC9238003FF030297DA834>I<90387F80603903FFF0E0000F13FF38
! 1F807F383F001F007E13071403127C00FC1301A214007EA26C140013C0EA7FFEEBFFE06C
! 13FC14FF6C1480000714C06C14E0C66C13F01307EB007FEC0FF81407140312E01401A37E
! 15F06C13036C14E0B413079038E01FC090B5120000E15B38C01FF01D297CA826>I<007F
! B712C0A39039803FC03FD87E00140700781503A20070150100F016E0A2481500A5C71500
! B3A4017FB512E0A32B287EA730>I<B53CE07FFFF007FFF0A32803FC0001FEC7EA1C00A2
! 6C6C6E5C81A26C6C6F5BA26E486D13F0017F5FA26D6C486D485A169FA2903C1FE0070FF0
! 0380A2DAF00FEBF807010FD90E0791C7FCA2902607F81EEBFC0EED1C0302FC151E010390
! 393801FE1CA2DAFE78EBFF3C0101D970001338A26D6C48EB7FF0A36E486D5AA36E486D5A
! A26EC76C5AA3020E6EC8FC44297FA847>87 D<3803FF80000F13F0381F01FC383F80FE14
! 7FA2EC3F80EA1F00C7FCA3EB0FFF90B5FC3807FC3FEA1FE0EA3F80127F130012FEA3147F
! 7E6CEBFFC0393F83DFFC380FFF8F3801FC031E1B7E9A21>97 D<EAFFE0A3120FACEBE1FE
! 9038E7FF809038FE07E09038F803F8496C7E496C7EA281811680A916005D5D7F4A5A6D48
! 5A90389E0FE090380FFF80260E01FCC7FC212A7EA926>I<EB3FF8EBFFFE3803F01F390F
! E03F80EA1FC0EA3F80A2007FEB1F0090C8FC5AA97E7F003FEB01C013C0001F1303390FE0
! 07803903F01F003800FFFCEB3FE01A1B7E9A1F>I<EC3FF8A31403ACEB1FE3EBFFFB3803
! F83F380FE00F381FC007383F8003A2127F13005AA97E1380123F1407381FC00F380FE01F
! 3A03F03FFF803800FFF3EB3FC3212A7EA926>I<EB3FE03801FFF83803F07E380FE03F39
! 1FC01F80393F800FC0A2EA7F00EC07E05AA390B5FCA290C8FCA47E7F003F14E01401D81F
! C013C0380FE0033903F81F803900FFFE00EB1FF01B1B7E9A20>I<EB07F0EB3FFCEBFE3E
! 3801FC7FEA03F8A2EA07F0143E1400A7B512C0A33807F000B3A3387FFF80A3182A7EA915
! >I<9038FF81F00003EBE7FC390FC1FE7C381F80FC003F13FE9038007E1048EB7F00A66C
! 137EEB80FE001F5B380FC1F8381FFFE0001813800038C8FC123CA2123E383FFFF814FF6C
! 14C06C14E06C14F0121F397E0007F8007C13015A1400A36C1301007EEB03F06CEB07E039
! 0FC01F803903FFFE0038007FF01E287E9A22>I<EAFFE0A3120FAC147F9038E1FFC09038
! E787E09038EE07F09038FC03F813F813F0A313E0AF3AFFFE3FFF80A3212A7DA926>I<12
! 07EA1FC0EA3FE0A5EA1FC0EA0700C7FCA7EAFFE0A3120FB3A3EAFFFEA30F2B7DAA14>I<
! EAFFE0A3120FACEC1FFCA3EC07C0EC0F80EC1E00147C5CEBE1F0EBE3E0EBE7C0EBEFE0EB
! FFF0A280EBF3FCEBE1FE13C080EC7F80143F15C0EC1FE0EC0FF039FFFC3FFEA31F2A7EA9
! 24>107 D<EAFFE0A3120FB3B2EAFFFEA30F2A7DA914>I<3BFFC07F800FF0903AC1FFE03F
! FC903AC783F0F07E3B0FCE03F9C07F903ADC01FB803F01F8D9FF00138001F05BA301E05B
! AF3CFFFE1FFFC3FFF8A3351B7D9A3A>I<38FFC07F9038C1FFC09038C787E0390FCE07F0
! 9038DC03F813F813F0A313E0AF3AFFFE3FFF80A3211B7D9A26>I<EB3FE03801FFFC3803
! F07E390FC01F80391F800FC0003F14E0EB00074814F0A34814F8A86C14F0A2393F800FE0
! A2001F14C0390FC01F803907F07F003801FFFC38003FE01D1B7E9A22>I<38FFE1FE9038
! E7FF809038FE07E0390FF803F8496C7E01E07F140081A2ED7F80A9EDFF00A25DEBF0014A
! 5A01F85B9038FE0FE09038EFFF80D9E1FCC7FC01E0C8FCA9EAFFFEA321277E9A26>I<38
! FFC1F0EBC7FCEBCE3E380FDC7F13D813F813F0143E14005BAFB5FCA3181B7E9A1C>114
! D<3803FE30380FFFF0EA3E03EA7800127000F01370A27E00FE1300EAFFE013FE387FFFC0
! 6C13E06C13F0000713F8C613FC1307EAE000147C6C133CA27E14787E38FF01F038F7FFC0
! 00C11300161B7E9A1B>I<1370A413F0A312011203A21207381FFFF0B5FCA23807F000AD
! 1438A73803F870000113F03800FFE0EB1F8015267FA51B>I<39FFE03FF8A3000F1303B1
! 1407A2140F0007131F3A03F03BFF803801FFF338003FC3211B7D9A26>I<3AFFFE03FF80
! A33A0FF0007800000714706D13F000035CEBFC0100015CA26C6C485AA2EBFF07017F90C7
! FC148FEB3F8E14CEEB1FDCA2EB0FF8A36D5AA26D5AA26D5A211B7F9A24>I<3BFFFC3FFC
! 0FFEA33B0FE007E000E03B07F003F001C0A29039F807F80300031680A23B01FC0EFC0700
! A291381EFE0F3A00FE1C7E0EA29039FF383F1E017F141C147890393FF01FB8A29138E00F
! F8011F5CA26D486C5AA36D486C5AA22F1B7F9A32>I<39FFFC0FFFA33907F003C0D803F8
! 5B3801FC076C6C48C7FCEBFF1E6D5AEB3FF86D5AA2130F130780497E497E131EEB3C7F49
! 6C7E496C7ED801E07F3803C00F6E7E3AFFF01FFF80A3211B7F9A24>I<3AFFFE03FF80A3
! 3A0FF0007800000714706D13F000035CEBFC0100015CA26C6C485AA2EBFF07017F90C7FC
! 148FEB3F8E14CEEB1FDCA2EB0FF8A36D5AA26D5AA26D5AA2495AA2EA3807007C90C8FCEA
! FE0F130E5B133CEA7C78EA3FE0EA0F8021277F9A24>I<003FB51280A21300003C140038
! 3801FE387803FC130700705B495A495A1200495A495A13FF91C7FC3901FE0380EA03FCA2
! EA07F8380FF007121F01E0130048485A48485A00FF137F90B5FCA2191B7E9A1F>I
! E /Fh 62 124 df<EB7E1F3901C1B180390303E3C0000713C3000EEBC180903801C000A6
! B512FC380E01C0B0387F87FC1A1D809C18>11 D<137E3801C180EA0301380703C0120EEB
! 018090C7FCA5B512C0EA0E01B0387F87F8151D809C17>I<EA6060EAF0F0EAF8F8EA6868
! EA0808A3EA1010A2EA2020EA4040EA80800D0C7F9C15>34 D<126012F012F812681208A3
! 1210A2122012401280050C7C9C0C>39 D<1380EA0100120212065AA25AA25AA35AA412E0
! AC1260A47EA37EA27EA27E12027EEA0080092A7C9E10>I<7E12407E12307EA27EA27EA3
! 7EA41380AC1300A41206A35AA25AA25A12205A5A092A7E9E10>I<126012F0A212701210
! A41220A212401280040C7C830C>44 D<EAFFE0A20B0280890E>I<126012F0A212600404
! 7C830C>I<1303A213071306A2130E130C131C1318A213381330A213701360A213E013C0
! A21201138012031300A25A1206A2120E120CA2121C1218A21238123012701260A212E05A
! A210297E9E15>I<5A1207123F12C71207B3A5EAFFF80D1C7C9B15>49
! D<EA07C0EA1830EA201CEA400C130EEAF00F12F81307A21270EA000F130EA2131CA21338
! 1370136013C0EA0180EA0300EA0601120C1218EA1002EA3FFE127F12FF101C7E9B15>I<
! EA07E0EA1830EA201CA2EA781E130E131E1238EA001CA2131813301360EA07C0EA003013
! 1CA2130E130FA2127012F8A3EAF00EEA401C1220EA1830EA07C0101D7E9B15>I<130CA2
! 131C133CA2135C13DC139CEA011C120312021204120C1208121012301220124012C0B512
! C038001C00A73801FFC0121C7F9B15>I<EA300CEA3FF813F013C0EA2000A6EA23E0EA2C
! 30EA3018131CEA200E1200130FA3126012F0A3EA800EEA401E131CEA2038EA1870EA07C0
! 101D7E9B15>I<13F0EA030CEA0404EA0C0EEA181E1230130CEA7000A21260EAE3E0EAE4
! 30EAE818EAF00C130EEAE0061307A51260A2EA7006EA300E130CEA1818EA0C30EA03E010
! 1D7E9B15>I<EA03C0EA0C30EA1818EA300C1270EA600EEAE006A21307A51260EA700F12
! 30EA1817EA0C27EA07C7EA0006A2130EEA300C127813181270EA2030EA10C0EA0F80101D
! 7E9B15>57 D<126012F0A212601200AA126012F0A2126004127C910C>I<1306A3130FA3
! EB1780A2EB37C01323A2EB43E01341A2EB80F0A338010078A2EBFFF83802003CA3487FA2
! 000C131F80001E5BB4EBFFF01C1D7F9C1F>65 D<B512C0380F00F0143C140E80A2EC0380
! 15C01401A215E0A815C0A21403158014071500140E5C1470B512C01B1C7E9B20>68
! D<B512FC380F003C140C1404A214061402A213011400A35B13FF13037FA3140113001402
! A31406A2140C143CB512FC181C7E9B1C>I<B512F8380F007814181408A2140C1404A213
! 011400A35B13FF13037FA490C7FCA8EAFFF8161C7E9B1B>I<90381F8080EBE061380180
! 1938070007000E13035A14015A00781300A2127000F01400A6ECFFF0EC0F800070130712
! 78A212387EA27E6C130B380180113800E06090381F80001C1E7E9C21>I<39FFF0FFF039
! 0F000F00AC90B5FCEB000FAD39FFF0FFF01C1C7F9B1F>I<EAFFF0EA0F00B3A8EAFFF00C
! 1C7F9B0F>I<EAFFF8EA0F8090C7FCB01408A31418A2141014301470EB01F0B5FC151C7E
! 9B1A>76 D<B46CEBFF80000FECF800A2390BC00178A33809E002A23808F004A3EB7808A3
! EB3C10A3EB1E20A3EB0F40A2EB0780A3EB0300121C3AFF8307FF80211C7E9B26>I<B4EB
! 1FF0390F8003809038C00100120BEA09E0EA08F0A21378133C133E131E130F14811307EB
! 03C1EB01E114F113001479147D143D141FA2808080121CB46C7E1C1C7F9B1F>I<EB3F80
! EBE0E03803803848487E000E7F487F003C148000381303007814C0A20070130100F014E0
! A8007014C000781303A200381480003C1307001C14006C130E6C5B6C6C5A3800E0E0EB3F
! 801B1E7E9C20>I<007FB512C038700F010060130000401440A200C014201280A3000014
! 00B1497E3803FFFC1B1C7F9B1E>84 D<39FFF01FF0390F000380EC0100B3A26C13021380
! 00035BEA01C03800E018EB7060EB0F801C1D7F9B1F>I<39FFE00FF0391F0003C0EC0180
! 6C1400A238078002A213C000035BA2EBE00C00011308A26C6C5AA213F8EB7820A26D5AA3
! 6D5AA2131F6DC7FCA21306A31C1D7F9B1F>I<3AFFE1FFC0FF3A1F003E003C001E013C13
! 186C6D1310A32607801F1320A33A03C0278040A33A01E043C080A33A00F081E100A39038
! F900F3017913F2A2017E137E013E137CA2013C133C011C1338A20118131801081310281D
! 7F9B2B>I<39FFF07FC0390FC01E003807800CEBC00800035B6C6C5A13F000005BEB7880
! 137C013DC7FC133E7F7F80A2EB13C0EB23E01321EB40F0497E14783801007C00027F141E
! 0006131F001F148039FF807FF01C1C7F9B1F>I<EA0808EA1010EA2020EA4040A2EA8080
! A3EAB0B0EAF8F8EA7878EA30300D0C7A9C15>92 D<EA1FC0EA3070EA78387F12301200A2
! EA01FCEA0F1C12381270126000E01340A3EA603C38304E80381F870012127E9115>97
! D<12FC121CAA137CEA1D87381E0180381C00C014E014601470A6146014E014C0381E0180
! 38190700EA10FC141D7F9C17>I<EA03F8EA0C0CEA181E1230EA700CEA600012E0A61260
! EA70021230EA1804EA0C18EA03E00F127F9112>I<EB1F801303AAEA03F3EA0E0BEA1807
! EA30031270126012E0A6126012701230EA1807EA0E1B3803E3F0141D7F9C17>I<EA07E0
! EA0C30EA1818EA300CEA700EEA600612E0EAFFFEEAE000A41260EA70021230EA1804EA0C
! 18EA03E00F127F9112>I<13F8EA018CEA071E1206EA0E0C1300A6EAFFE0EA0E00B0EA7F
! E00F1D809C0D>I<EB03803807C4C0EA1C783838388038301800EA701CA4EA3018EA3838
! 6C5AEA27C00020C7FCA21230EA3FF86CB4FC1480EA2003386001C0EAC000A33860018038
! 300300EA1C0EEA07F8121C7F9215>I<12FC121CAA137C1387EA1D03001E1380121CAD38
! FF9FF0141D7F9C17>I<1218123CA21218C7FCA712FC121CB0EAFF80091D7F9C0C>I<13C0
! EA01E0A2EA00C01300A7EA07E01200B3A21260EAF0C012F1EA6180EA3E000B25839C0D>
! I<12FC121CAAEB0FE0EB0780EB06005B13105B5B13E0121DEA1E70EA1C781338133C131C
! 7F130F148038FF9FE0131D7F9C16>I<12FC121CB3A9EAFF80091D7F9C0C>I<39FC7E07E0
! 391C838838391D019018001EEBE01C001C13C0AD3AFF8FF8FF8021127F9124>I<EAFC7C
! EA1C87EA1D03001E1380121CAD38FF9FF014127F9117>I<EA03F0EA0E1CEA1806487E00
! 701380EA600100E013C0A600601380EA700300301300EA1806EA0E1CEA03F012127F9115
! >I<EAFC7CEA1D87381E0180001C13C0EB00E0A21470A614E0A2EB01C0001E1380381D07
! 00EA1CFC90C7FCA7B47E141A7F9117>I<3803E080EA0E19EA1805EA3807EA7003A212E0
! A61270A2EA38071218EA0E1BEA03E3EA0003A7EB1FF0141A7F9116>I<EAFCE0EA1D38EA
! 1E78A2EA1C301300ACEAFFC00D127F9110>I<EA1F90EA2070EA4030EAC010A212E0EAF8
! 00EA7F80EA3FE0EA0FF0EA00F8EA8038131812C0A2EAE010EAD060EA8FC00D127F9110>
! I<1204A4120CA2121C123CEAFFE0EA1C00A91310A5120CEA0E20EA03C00C1A7F9910>I<
! 38FC1F80EA1C03AD1307120CEA0E1B3803E3F014127F9117>I<38FF07E0383C0380381C
! 0100A2EA0E02A2EA0F06EA0704A2EA0388A213C8EA01D0A2EA00E0A3134013127F9116>
! I<39FF3FC7E0393C0703C0001CEB01801500130B000E1382A21311000713C4A213203803
! A0E8A2EBC06800011370A2EB8030000013201B127F911E>I<38FF0FE0381E0700EA1C06
! EA0E046C5AEA039013B0EA01E012007F12011338EA021C1204EA0C0E487E003C138038FE
! 1FF014127F9116>I<38FF07E0383C0380381C0100A2EA0E02A2EA0F06EA0704A2EA0388
! A213C8EA01D0A2EA00E0A31340A25BA212F000F1C7FC12F312661238131A7F9116>I<EA
! 7FFCEA70381260EA407013F013E0EA41C012031380EA0700EA0F04120E121CEA3C0CEA38
! 0812701338EAFFF80E127F9112>I<B512F01401808B15>I E /Fi
! 15 116 df<913A03FF800380023FEBF00749B5EAFC0F01079038007F1FD91FF8EB0FFFD9
! 7FE0130349487F4890C8FC4848157F0007163F4848151F485A170F123F5B1707127FA249
! 92C7FC12FFAB127F7FEF0380123FA27F001F160718006C6C5D6C6C150E6C6C151E6C5E6C
! 01C05C6D6C495AD91FF8495AD907FFEB3F800101D9FFFEC7FCD9003F13F8020313803131
! 7BB03C>67 D<B812F0A3C69038C0003FEE07F816031600A21778A21738A383ED0380A394
! C7FC1507A2150F153F91B5FCA3ECC03F150F1507A21503EF0380A392C7EA0700A45FA217
! 1EA2173E177E17FE1603161FB85AA331317EB036>69 D<913A03FF800380023FEBF00749
! B5EAFC0F01079038007F1FD91FF8EB0FFFD97FE0130349487F4890C8FC4848157F000716
! 3F4848151F485A170F123F5B1707127FA24992C7FC12FFA90307B512FEA2127F6DD90001
! 1380A2123FA27F121F7F120F6C7E6C7E6C7F6C6D5B6D7ED91FF85B903907FF803F010190
! 38FFFE1FD9003FEBF8070203EBC00137317BB041>71 D<B500C091387FFFF08080C66D91
! 3800F8006E157080EBEFFF01E77F13E301E17F01E07F816E7E6E7E6E7E6E7E6E7F806E7F
! 6E7F826F7E6F7E6F7E6F7E6F13806F13C0816F13E0EE7FF017F8EE3FFCEE1FFEEE0FFF70
! 13F0828282177FA2173F171F170F17071703486C1501B500E014001870A23C317EB041>
! 78 D<B712C016FCEEFF80C6D9C00113E09238003FF0EE0FFC160783707EA284A695C7FC
! A24C5A5F160FEE3FF04BB45A91B6128004FCC8FC829139C007FF8003007F707E163F8370
! 7EA583A4194019E083040F130105FF13C0701387B6D8C003EBFF8004001400EF1FFC3B31
! 7EB03E>82 D<B6D8C003B512C0A3C601C0C73807E000715AB3AE1707017F5E80013F150F
! 95C7FC6D6C141E6D6C143E6D6C14FC6DB4EB03F801009038E01FE06EB55A020F91C8FC02
! 0013F03A317EB03F>85 D<EB7FF80003B5FC000F14C0391FE01FF09038F007F88114036E
! 7EEA0FE0EA07C0EA0100C7FCA2EB01FF133F3801FFF13807FE01EA1FF0EA3FE0EA7FC013
! 8012FF1300A3EB80031407387FC00F393FF03EFF3A1FFFF87FF80007EBF03FC6EB801F25
! 207E9F28>97 D<EB07FF017F13E048B512F83903FC03FC3807F807EA0FF0EA1FE0EA3FC0
! EC03F8007FEB01F0903880004000FF1400AA6C7EA2003F140E7F001F141E6C6C133C6C6C
! 13783903FF01F06CEBFFE06C6C1380903807FC001F207D9F25>99
! D<ED07E0EC03FFA3EC003F151FADEB0FF8EB7FFF48B512DF3903FE03FF380FF80049137F
! 4848133F4848131FA2127F5B12FFAA127F7FA2003F143F6C6C137F15FF6C6C5A3A07FC07
! DFF00001B5EA9FFF39007FFE1FEB0FF028327DB12E>I<EB0FFE90387FFFC048B57E3903
! FE0FF03907F801F848486C7E48487F4848137FA2007F80491480A212FFA290B6FCA30180
! C8FCA3127FA27F003FEC03807F001F14076C6CEB0F006C6C133E3903FF01FCC6EBFFF801
! 3F13E0010790C7FC21207E9F26>I<14FF010713C0011F13F0EB7FC79038FF0FF85A13FE
! 120313FCEC07F0EC01C091C7FCA7B512FCA3D803FCC7FCB3A8387FFFF0A31D327EB119>
! I<2703F007F8EB0FF000FFD93FFFEB7FFE4A6DB5FC903CF1F03FC3E07F803D0FF3C01FE7
! 803FC02607F780EBEF009126000FFEEB1FE001FE5C495CA2495CB3B500C1B50083B5FCA3
! 40207D9F45>109 D<3903F007F800FFEB3FFF4A7F9039F1F03FC03A0FF3C01FE03807F7
! 804A6C7E13FE5BA25BB3B500C1B51280A329207D9F2E>I<3803F03F00FFEBFFC001F113
! F0EBF3C7390FF78FF80007130F13FEA29038FC07F0EC03E0EC008015005BB1B512E0A31D
! 207E9F22>114 D<EBFF87000713EF001F13FF48C67E007C131F805A807EA2B490C7FC13
! F8387FFFC014F06C13FC6C7F00077F00011480EA001F010013C0141F00E0130FA26C1307
! A27E6CEB0F806C131F39FF803F00EBFFFE00F313F838E07FC01A207D9F21>I
  E end
  %%EndProlog
  %%BeginSetup
! %%Feature: *Resolution 300dpi
  TeXDict begin
+ %%PaperSize: a4
  
  %%EndSetup
  %%Page: 1 1
! 1 0 bop 79 -160 a Fi(GNU)27 b(Emacs)g(Reference)f(Card)461
! -92 y Fh(\(for)14 b(v)o(ersion)g(19\))0 28 y Fg(Starting)23
! b(Emacs)0 125 y Fh(T)m(o)13 b(en)o(ter)i(GNU)f(Emacs)f(19,)g(just)h(t)o
! (yp)q(e)g(its)g(name:)j Ff(emacs)0 192 y Fh(T)m(o)c(read)h(in)g(a)f
! (\014le)h(to)g(edit,)g(see)h(Files,)e(b)q(elo)o(w.)0
! 306 y Fg(Lea)n(ving)23 b(Emacs)0 403 y Fh(susp)q(end)15
! b(Emacs)f(\(or)g(iconify)e(it)i(under)h(X\))202 b Ff(C-z)0
! 453 y Fh(exit)14 b(Emacs)f(p)q(ermanen)o(tly)458 b Ff(C-x)21
! b(C-c)0 567 y Fg(Files)0 665 y Fe(read)13 b Fh(a)h(\014le)g(in)o(to)f
! (Emacs)490 b Ff(C-x)21 b(C-f)0 715 y Fe(sa)o(v)o(e)13
! b Fh(a)h(\014le)g(bac)o(k)g(to)f(disk)478 b Ff(C-x)21
! b(C-s)0 764 y Fh(sa)o(v)o(e)14 b Fe(all)f Fh(\014les)678
! b Ff(C-x)21 b(s)0 814 y Fe(insert)12 b Fh(con)o(ten)o(ts)j(of)e
! (another)h(\014le)g(in)o(to)f(this)h(bu\013er)68 b Ff(C-x)21
! b(i)0 864 y Fh(replace)15 b(this)f(\014le)g(with)f(the)i(\014le)f(y)o
! (ou)f(really)g(w)o(an)o(t)98 b Ff(C-x)21 b(C-v)0 914
! y Fh(write)14 b(bu\013er)h(to)f(a)f(sp)q(eci\014ed)j(\014le)369
! b Ff(C-x)21 b(C-w)0 964 y Fh(v)o(ersion)14 b(con)o(trol)g(c)o(hec)o
! (kin/c)o(hec)o(k)o(out)310 b Ff(C-x)21 b(C-q)0 1084 y
! Fg(Getting)h(Help)0 1182 y Fh(The)14 b(Help)f(system)g(is)g(simple.)j
! (T)o(yp)q(e)d Ff(C-h)g Fh(\(or)g Ff(F1)p Fh(\))g(and)g(follo)o(w)e(the)
! i(direc-)0 1231 y(tions.)18 b(If)13 b(y)o(ou)h(are)g(a)g(\014rst-time)f
! (user,)h(t)o(yp)q(e)h Ff(C-h)21 b(t)14 b Fh(for)f(a)h
! Fe(tutorial)p Fh(.)0 1298 y(remo)o(v)o(e)f(Help)h(windo)o(w)522
! b Ff(C-x)21 b(1)0 1347 y Fh(scroll)14 b(Help)g(windo)o(w)555
! b Ff(C-M-v)0 1414 y Fh(aprop)q(os:)18 b(sho)o(w)c(commands)d(matc)o
! (hing)i(a)g(string)100 b Ff(C-h)21 b(a)0 1463 y Fh(sho)o(w)14
! b(the)g(function)g(a)g(k)o(ey)f(runs)376 b Ff(C-h)21
! b(c)0 1513 y Fh(describ)q(e)16 b(a)d(function)556 b Ff(C-h)21
! b(f)0 1563 y Fh(get)14 b(mo)q(de-sp)q(eci\014c)g(information)361
! b Ff(C-h)21 b(m)0 1677 y Fg(Error)j(Reco)n(v)n(ery)0
! 1775 y Fe(ab)q(ort)13 b Fh(partially)f(t)o(yp)q(ed)j(or)f(executing)g
! (command)75 b Ff(C-g)0 1825 y Fe(reco)o(v)o(er)13 b Fh(a)g(\014le)h
! (lost)g(b)o(y)f(a)h(system)g(crash)144 b Ff(M-x)21 b(recover-file)0
! 1874 y Fe(undo)12 b Fh(an)i(un)o(w)o(an)o(ted)g(c)o(hange)414
! b Ff(C-x)21 b(u)h Fh(or)g Ff(C-_)0 1924 y Fh(restore)16
! b(a)d(bu\013er)i(to)f(its)g(original)e(con)o(ten)o(ts)115
! b Ff(M-x)21 b(revert-buffer)0 1974 y Fh(redra)o(w)14
! b(garbaged)g(screen)476 b Ff(C-l)0 2088 y Fg(Incremen)n(tal)21
! b(Searc)n(h)0 2186 y Fh(searc)o(h)15 b(forw)o(ard)635
! b Ff(C-s)0 2236 y Fh(searc)o(h)15 b(bac)o(kw)o(ard)602
! b Ff(C-r)0 2285 y Fh(regular)14 b(expression)h(searc)o(h)448
! b Ff(C-M-s)0 2335 y Fh(rev)o(erse)16 b(regular)e(expression)h(searc)o
! (h)309 b Ff(C-M-r)0 2401 y Fh(select)15 b(previous)f(searc)o(h)i
! (string)391 b Ff(M-p)0 2451 y Fh(select)15 b(next)g(later)f(searc)o(h)h
! (string)366 b Ff(M-n)0 2501 y Fh(exit)14 b(incremen)o(tal)f(searc)o(h)
! 482 b Ff(RET)0 2551 y Fh(undo)14 b(e\013ect)h(of)f(last)f(c)o(haracter)
! 395 b Ff(DEL)0 2601 y Fh(ab)q(ort)14 b(curren)o(t)h(searc)o(h)533
! b Ff(C-g)0 2667 y Fh(Use)18 b Ff(C-s)e Fh(or)h Ff(C-r)f
! Fh(again)f(to)i(rep)q(eat)h(the)f(searc)o(h)h(in)f(either)g(direction.)
! 27 b(If)0 2717 y(Emacs)13 b(is)h(still)f(searc)o(hing,)h
! Ff(C-g)f Fh(cancels)i(only)e(the)i(part)f(not)f(done.)129
! 2783 y Fd(c)120 2784 y Fc(\015)e Fd(1996)e(F)m(ree)j(Soft)o(w)o(are)e
! (F)m(oundation,)j(Inc.)i(P)o(ermissions)e(on)e(bac)o(k.)k(v2.1)1929
! 2832 y Fh(1)p eop
  %%Page: 2 2
! 2 1 bop 0 -168 a Fg(Motion)0 -65 y Fe(en)o(tit)o(y)13
! b(to)j(mo)o(v)o(e)f(o)o(v)o(er)350 b(bac)o(kw)o(ard)41
! b(forw)o(ard)0 -15 y Fh(c)o(haracter)593 b Ff(C-b)173
! b(C-f)0 35 y Fh(w)o(ord)670 b Ff(M-b)173 b(M-f)0 84 y
! Fh(line)694 b Ff(C-p)173 b(C-n)0 134 y Fh(go)13 b(to)h(line)f(b)q
! (eginning)h(\(or)g(end\))237 b Ff(C-a)173 b(C-e)0 184
! y Fh(sen)o(tence)610 b Ff(M-a)173 b(M-e)0 234 y Fh(paragraph)574
! b Ff(M-{)173 b(M-})0 284 y Fh(page)676 b Ff(C-x)21 b([)130
! b(C-x)21 b(])0 333 y Fh(sexp)680 b Ff(C-M-b)129 b(C-M-f)0
! 383 y Fh(function)610 b Ff(C-M-a)129 b(C-M-e)0 433 y
! Fh(go)13 b(to)h(bu\013er)h(b)q(eginning)e(\(or)h(end\))197
! b Ff(M-<)173 b(M->)0 501 y Fh(scroll)14 b(to)f(next)i(screen)538
! b Ff(C-v)0 551 y Fh(scroll)14 b(to)f(previous)i(screen)466
! b Ff(M-v)0 600 y Fh(scroll)14 b(left)732 b Ff(C-x)21
! b(<)0 650 y Fh(scroll)14 b(righ)o(t)704 b Ff(C-x)21 b(>)0
! 700 y Fh(scroll)14 b(curren)o(t)h(line)f(to)f(cen)o(ter)j(of)d(screen)
! 238 b Ff(C-u)21 b(C-l)0 821 y Fg(Killi)o(ng)g(and)i(Deleting)0
! 925 y Fe(en)o(tit)o(y)13 b(to)j(kill)496 b(bac)o(kw)o(ard)41
! b(forw)o(ard)0 975 y Fh(c)o(haracter)15 b(\(delete,)g(not)f(kill\))282
! b Ff(DEL)173 b(C-d)0 1024 y Fh(w)o(ord)670 b Ff(M-DEL)129
! b(M-d)0 1074 y Fh(line)13 b(\(to)h(end)h(of)s(\))482
! b Ff(M-0)21 b(C-k)86 b(C-k)0 1124 y Fh(sen)o(tence)610
! b Ff(C-x)21 b(DEL)86 b(M-k)0 1174 y Fh(sexp)680 b Ff(M--)21
! b(C-M-k)42 b(C-M-k)0 1242 y Fh(kill)12 b Fe(region)699
! b Ff(C-w)0 1291 y Fh(cop)o(y)14 b(region)g(to)f(kill)g(ring)485
! b Ff(M-w)0 1341 y Fh(kill)12 b(through)i(next)h(o)q(ccurrence)h(of)e
! Fb(char)246 b Ff(M-z)21 b Fb(char)0 1409 y Fh(y)o(ank)13
! b(bac)o(k)h(last)g(thing)f(killed)417 b Ff(C-y)0 1459
! y Fh(replace)15 b(last)e(y)o(ank)h(with)f(previous)i(kill)262
! b Ff(M-y)0 1585 y Fg(Marking)0 1688 y Fh(set)15 b(mark)d(here)653
! b Ff(C-@)21 b Fh(or)h Ff(C-SPC)0 1738 y Fh(exc)o(hange)15
! b(p)q(oin)o(t)e(and)h(mark)438 b Ff(C-x)21 b(C-x)0 1806
! y Fh(set)15 b(mark)d Fb(ar)n(g)17 b Fe(w)o(ords)c Fh(a)o(w)o(a)o(y)428
! b Ff(M-@)0 1856 y Fh(mark)12 b Fe(paragraph)579 b Ff(M-h)0
! 1906 y Fh(mark)12 b Fe(page)697 b Ff(C-x)21 b(C-p)0 1955
! y Fh(mark)12 b Fe(sexp)700 b Ff(C-M-@)0 2005 y Fh(mark)12
! b Fe(function)619 b Ff(C-M-h)0 2055 y Fh(mark)12 b(en)o(tire)j
! Fe(bu\013er)552 b Ff(C-x)21 b(h)0 2176 y Fg(Query)i(Replace)0
! 2280 y Fh(in)o(teractiv)o(ely)14 b(replace)g(a)g(text)h(string)296
! b Ff(M-\045)0 2330 y Fh(using)14 b(regular)g(expressions)226
! b Ff(M-x)21 b(query-replace-rege)o(xp)0 2397 y Fh(V)m(alid)12
! b(resp)q(onses)17 b(in)c(query-replace)i(mo)q(de)e(are)0
! 2465 y Fe(replace)f Fh(this)i(one,)g(go)f(on)h(to)g(next)327
! b Ff(SPC)0 2515 y Fh(replace)15 b(this)f(one,)f(don't)h(mo)o(v)o(e)387
! b Ff(,)0 2565 y Fe(skip)13 b Fh(to)g(next)i(without)e(replacing)340
! b Ff(DEL)0 2614 y Fh(replace)15 b(all)d(remaining)g(matc)o(hes)361
! b Ff(!)0 2664 y Fe(bac)o(k)16 b(up)d Fh(to)g(the)i(previous)f(matc)o(h)
! 322 b Ff(^)0 2714 y Fe(exit)13 b Fh(query-replace)566
! b Ff(RET)0 2764 y Fh(en)o(ter)15 b(recursiv)o(e)g(edit)f(\()p
! Ff(C-M-c)f Fh(to)h(exit\))265 b Ff(C-r)1929 2832 y Fh(2)p
! eop
  %%Page: 3 3
! 3 2 bop 0 -168 a Fg(Multiple)20 b(Windo)n(ws)0 -86 y
! Fh(When)14 b(t)o(w)o(o)f(commands)f(are)i(sho)o(wn,)g(the)g(second)h
! (is)f(for)f(\\other)i(frame.")0 -24 y(delete)g(all)e(other)h(windo)o
! (ws)460 b Ff(C-x)21 b(1)0 38 y Fh(split)13 b(windo)o(w)h(in)f(t)o(w)o
! (o)g(v)o(ertically)230 b Ff(C-x)21 b(2)129 b(C-x)21 b(5)h(2)0
! 88 y Fh(delete)15 b(this)f(windo)o(w)429 b Ff(C-x)21
! b(0)129 b(C-x)21 b(5)h(0)0 150 y Fh(split)13 b(windo)o(w)h(in)f(t)o(w)o
! (o)g(horizon)o(tally)314 b Ff(C-x)21 b(3)0 213 y Fh(scroll)14
! b(other)g(windo)o(w)545 b Ff(C-M-v)0 275 y Fh(switc)o(h)14
! b(cursor)h(to)f(another)g(windo)o(w)174 b Ff(C-x)21 b(o)129
! b(C-x)21 b(5)h(o)0 325 y Fh(select)15 b(bu\013er)g(in)f(other)g(windo)o
! (w)241 b Ff(C-x)21 b(4)h(b)85 b(C-x)21 b(5)h(b)0 375
! y Fh(displa)o(y)13 b(bu\013er)i(in)e(other)i(windo)o(w)213
! b Ff(C-x)21 b(4)h(C-o)41 b(C-x)21 b(5)h(C-o)0 424 y Fh(\014nd)14
! b(\014le)g(in)f(other)i(windo)o(w)323 b Ff(C-x)21 b(4)h(f)85
! b(C-x)21 b(5)h(f)0 474 y Fh(\014nd)14 b(\014le)g(read-only)f(in)h
! (other)g(windo)o(w)140 b Ff(C-x)21 b(4)h(r)85 b(C-x)21
! b(5)h(r)0 524 y Fh(run)14 b(Dired)g(in)f(other)i(windo)o(w)282
! b Ff(C-x)21 b(4)h(d)85 b(C-x)21 b(5)h(d)0 574 y Fh(\014nd)14
! b(tag)g(in)f(other)h(windo)o(w)319 b Ff(C-x)21 b(4)h(.)85
! b(C-x)21 b(5)h(.)0 636 y Fh(gro)o(w)13 b(windo)o(w)g(taller)554
! b Ff(C-x)21 b(^)0 686 y Fh(shrink)14 b(windo)o(w)f(narro)o(w)o(er)464
! b Ff(C-x)21 b({)0 736 y Fh(gro)o(w)13 b(windo)o(w)g(wider)550
! b Ff(C-x)21 b(})0 830 y Fg(F)-6 b(ormatting)0 912 y Fh(inden)o(t)14
! b(curren)o(t)h Fe(line)d Fh(\(mo)q(de-dep)q(enden)o(t\))209
! b Ff(TAB)0 962 y Fh(inden)o(t)14 b Fe(region)e Fh(\(mo)q(de-dep)q
! (enden)o(t\))299 b Ff(C-M-\\)0 1012 y Fh(inden)o(t)14
! b Fe(sexp)f Fh(\(mo)q(de-dep)q(enden)o(t\))336 b Ff(C-M-q)0
! 1062 y Fh(inden)o(t)14 b(region)g(rigidly)e Fb(ar)n(g)17
! b Fh(columns)295 b Ff(C-x)21 b(TAB)0 1124 y Fh(insert)15
! b(newline)f(after)g(p)q(oin)o(t)441 b Ff(C-o)0 1174 y
! Fh(mo)o(v)o(e)12 b(rest)j(of)f(line)f(v)o(ertically)g(do)o(wn)309
! b Ff(C-M-o)0 1224 y Fh(delete)15 b(blank)e(lines)h(around)g(p)q(oin)o
! (t)335 b Ff(C-x)21 b(C-o)0 1273 y Fh(join)13 b(line)g(with)h(previous)g
! (\(with)g(arg,)f(next\))191 b Ff(M-^)0 1323 y Fh(delete)15
! b(all)e(white)h(space)h(around)e(p)q(oin)o(t)263 b Ff(M-\\)0
! 1373 y Fh(put)14 b(exactly)g(one)g(space)h(at)f(p)q(oin)o(t)348
! b Ff(M-SPC)0 1435 y Fh(\014ll)13 b(paragraph)655 b Ff(M-q)0
! 1485 y Fh(set)15 b(\014ll)e(column)642 b Ff(C-x)21 b(f)0
! 1535 y Fh(set)15 b(pre\014x)f(eac)o(h)h(line)e(starts)i(with)350
! b Ff(C-x)21 b(.)0 1597 y Fh(set)15 b(face)765 b Ff(M-g)0
! 1697 y Fg(Case)23 b(Change)0 1779 y Fh(upp)q(ercase)16
! b(w)o(ord)618 b Ff(M-u)0 1829 y Fh(lo)o(w)o(ercase)15
! b(w)o(ord)628 b Ff(M-l)0 1879 y Fh(capitalize)13 b(w)o(ord)627
! b Ff(M-c)0 1941 y Fh(upp)q(ercase)16 b(region)596 b Ff(C-x)21
! b(C-u)0 1991 y Fh(lo)o(w)o(ercase)15 b(region)606 b Ff(C-x)21
! b(C-l)0 2085 y Fg(The)h(Minibu\013er)0 2167 y Fh(The)14
! b(follo)o(wing)e(k)o(eys)i(are)g(de\014ned)h(in)f(the)g(minibu\013er.)0
! 2230 y(complete)f(as)h(m)o(uc)o(h)f(as)h(p)q(ossible)370
! b Ff(TAB)0 2279 y Fh(complete)13 b(up)h(to)g(one)g(w)o(ord)449
! b Ff(SPC)0 2329 y Fh(complete)13 b(and)h(execute)511
! b Ff(RET)0 2379 y Fh(sho)o(w)14 b(p)q(ossible)g(completions)425
! b Ff(?)0 2429 y Fh(fetc)o(h)14 b(previous)h(minibu\013er)d(input)337
! b Ff(M-p)0 2479 y Fh(fetc)o(h)14 b(next)h(later)f(minibu\013er)e(input)
! 312 b Ff(M-n)0 2528 y Fh(regexp)15 b(searc)o(h)g(bac)o(kw)o(ard)f
! (through)f(history)173 b Ff(M-r)0 2578 y Fh(regexp)15
! b(searc)o(h)g(forw)o(ard)e(through)h(history)206 b Ff(M-s)0
! 2628 y Fh(ab)q(ort)14 b(command)610 b Ff(C-g)0 2690 y
! Fh(T)o(yp)q(e)13 b Ff(C-x)21 b(ESC)g(ESC)12 b Fh(to)g(edit)h(and)g(rep)
! q(eat)g(the)g(last)g(command)c(that)k(used)0 2740 y(the)g
! (minibu\013er.)k(T)o(yp)q(e)c Ff(F10)f Fh(to)g(activ)n(ate)h(the)g(men)
! o(u)f(bar)h(using)f(the)h(mini-)0 2790 y(bu\013er.)1929
! 2832 y(3)p eop
  %%Page: 4 4
! 4 3 bop 79 -160 a Fi(GNU)27 b(Emacs)g(Reference)f(Card)0
! -21 y Fg(Bu\013ers)0 82 y Fh(select)15 b(another)g(bu\013er)530
! b Ff(C-x)21 b(b)0 132 y Fh(list)13 b(all)g(bu\013ers)653
! b Ff(C-x)21 b(C-b)0 182 y Fh(kill)12 b(a)i(bu\013er)691
! b Ff(C-x)21 b(k)0 303 y Fg(T)-6 b(ransp)r(osing)0 407
! y Fh(transp)q(ose)15 b Fe(c)o(haracters)500 b Ff(C-t)0
! 457 y Fh(transp)q(ose)15 b Fe(w)o(ords)591 b Ff(M-t)0
! 506 y Fh(transp)q(ose)15 b Fe(lines)618 b Ff(C-x)21 b(C-t)0
! 556 y Fh(transp)q(ose)15 b Fe(sexps)602 b Ff(C-M-t)0
! 678 y Fg(Sp)r(elling)21 b(Chec)n(k)0 781 y Fh(c)o(hec)o(k)15
! b(sp)q(elling)e(of)g(curren)o(t)j(w)o(ord)356 b Ff(M-$)0
! 831 y Fh(c)o(hec)o(k)15 b(sp)q(elling)e(of)g(all)g(w)o(ords)h(in)g
! (region)166 b Ff(M-x)21 b(ispell-region)0 881 y Fh(c)o(hec)o(k)15
! b(sp)q(elling)e(of)g(en)o(tire)i(bu\013er)282 b Ff(M-x)21
! b(ispell-buffer)0 1006 y Fg(T)-6 b(ags)0 1110 y Fh(\014nd)14
! b(a)g(tag)f(\(a)h(de\014nition\))473 b Ff(M-.)0 1160
! y Fh(\014nd)14 b(next)g(o)q(ccurrence)j(of)c(tag)412
! b Ff(C-u)21 b(M-.)0 1210 y Fh(sp)q(ecify)14 b(a)g(new)g(tags)g(\014le)
! 366 b Ff(M-x)21 b(visit-tags-table)0 1277 y Fh(regexp)15
! b(searc)o(h)g(on)e(all)g(\014les)h(in)g(tags)g(table)129
! b Ff(M-x)21 b(tags-search)0 1327 y Fh(run)14 b(query-replace)h(on)f
! (all)f(the)h(\014les)133 b Ff(M-x)21 b(tags-query-repla)o(ce)0
! 1377 y Fh(con)o(tin)o(ue)14 b(last)g(tags)g(searc)o(h)h(or)e
! (query-replace)150 b Ff(M-,)0 1498 y Fg(Shells)0 1602
! y Fh(execute)16 b(a)d(shell)h(command)444 b Ff(M-!)0
! 1651 y Fh(run)14 b(a)g(shell)g(command)d(on)i(the)i(region)265
! b Ff(M-|)0 1701 y Fh(\014lter)14 b(region)g(through)g(a)f(shell)h
! (command)212 b Ff(C-u)21 b(M-|)0 1751 y Fh(start)15 b(a)e(shell)h(in)f
! (windo)o(w)g Ff(*shell*)231 b(M-x)21 b(shell)0 1872 y
! Fg(Rectangles)0 1976 y Fh(cop)o(y)14 b(rectangle)h(to)e(register)442
! b Ff(C-x)21 b(r)h(r)0 2026 y Fh(kill)12 b(rectangle)667
! b Ff(C-x)21 b(r)h(k)0 2075 y Fh(y)o(ank)13 b(rectangle)637
! b Ff(C-x)21 b(r)h(y)0 2125 y Fh(op)q(en)14 b(rectangle,)h(shifting)e
! (text)h(righ)o(t)288 b Ff(C-x)21 b(r)h(o)0 2175 y Fh(blank)13
! b(out)h(rectangle)549 b Ff(C-x)21 b(r)h(c)0 2225 y Fh(pre\014x)15
! b(eac)o(h)f(line)f(with)h(a)g(string)378 b Ff(C-x)21
! b(r)h(t)0 2346 y Fg(Abbrevs)0 2450 y Fh(add)14 b(global)e(abbrev)574
! b Ff(C-x)21 b(a)h(g)0 2499 y Fh(add)14 b(mo)q(de-lo)q(cal)e(abbrev)486
! b Ff(C-x)21 b(a)h(l)0 2549 y Fh(add)14 b(global)e(expansion)i(for)f
! (this)h(abbrev)237 b Ff(C-x)21 b(a)h(i)f(g)0 2599 y Fh(add)14
! b(mo)q(de-lo)q(cal)e(expansion)h(for)h(this)g(abbrev)149
! b Ff(C-x)21 b(a)h(i)f(l)0 2649 y Fh(explicitly)13 b(expand)h(abbrev)453
! b Ff(C-x)21 b(a)h(e)0 2716 y Fh(expand)14 b(previous)g(w)o(ord)g
! (dynamically)266 b Ff(M-/)1929 2832 y Fh(4)p eop
  %%Page: 5 5
! 5 4 bop 0 -168 a Fg(Regular)22 b(Expressions)0 -65 y
! Fh(an)o(y)13 b(single)h(c)o(haracter)h(except)h(a)d(newline)224
! b Ff(.)43 b Fh(\(dot\))0 -15 y(zero)15 b(or)f(more)e(rep)q(eats)529
! b Ff(*)0 35 y Fh(one)14 b(or)g(more)f(rep)q(eats)540
! b Ff(+)0 84 y Fh(zero)15 b(or)f(one)g(rep)q(eat)572 b
! Ff(?)0 134 y Fh(an)o(y)13 b(c)o(haracter)j(in)d(the)i(set)470
! b Ff([)22 b Fa(:)7 b(:)g(:)20 b Ff(])0 184 y Fh(an)o(y)13
! b(c)o(haracter)j(not)d(in)h(the)g(set)397 b Ff([^)21
! b Fa(:)7 b(:)g(:)21 b Ff(])0 234 y Fh(b)q(eginning)13
! b(of)h(line)597 b Ff(^)0 284 y Fh(end)14 b(of)g(line)709
! b Ff($)0 333 y Fh(quote)14 b(a)g(sp)q(ecial)g(c)o(haracter)h
! Fb(c)416 b Ff(\\)p Fb(c)0 383 y Fh(alternativ)o(e)14
! b(\(\\or"\))581 b Ff(\\|)0 433 y Fh(grouping)740 b Ff(\\\()21
! b Fa(:)7 b(:)g(:)21 b Ff(\\\))0 483 y Fb(n)s Fh(th)15
! b(group)716 b Ff(\\)p Fb(n)0 533 y Fh(b)q(eginning)13
! b(of)h(bu\013er)558 b Ff(\\`)0 583 y Fh(end)14 b(of)g(bu\013er)670
! b Ff(\\')0 632 y Fh(w)o(ord)14 b(break)697 b Ff(\\b)0
! 682 y Fh(not)14 b(b)q(eginning)f(or)h(end)g(of)g(w)o(ord)370
! b Ff(\\B)0 732 y Fh(b)q(eginning)13 b(of)h(w)o(ord)573
! b Ff(\\<)0 782 y Fh(end)14 b(of)g(w)o(ord)685 b Ff(\\>)0
! 832 y Fh(an)o(y)13 b(w)o(ord-syn)o(tax)h(c)o(haracter)420
! b Ff(\\w)0 881 y Fh(an)o(y)13 b(non-w)o(ord-syn)o(tax)h(c)o(haracter)
! 339 b Ff(\\W)0 931 y Fh(c)o(haracter)15 b(with)f(syn)o(tax)g
! Fb(c)472 b Ff(\\s)p Fb(c)0 981 y Fh(c)o(haracter)15 b(with)f(syn)o(tax)
! g(not)f Fb(c)399 b Ff(\\S)p Fb(c)0 1102 y Fg(Registers)0
! 1206 y Fh(sa)o(v)o(e)14 b(region)g(in)f(register)505
! b Ff(C-x)21 b(r)h(s)0 1256 y Fh(insert)15 b(register)g(con)o(ten)o(ts)g
! (in)o(to)e(bu\013er)284 b Ff(C-x)21 b(r)h(i)0 1323 y
! Fh(sa)o(v)o(e)14 b(v)n(alue)f(of)h(p)q(oin)o(t)f(in)g(register)367
! b Ff(C-x)21 b(r)h(SPC)0 1373 y Fh(jump)12 b(to)i(p)q(oin)o(t)f(sa)o(v)o
! (ed)h(in)g(register)340 b Ff(C-x)21 b(r)h(j)0 1499 y
! Fg(Info)0 1603 y Fh(en)o(ter)15 b(the)g(Info)e(do)q(cumen)o(tation)g
! (reader)242 b Ff(C-h)21 b(i)0 1671 y Fh(Mo)o(ving)13
! b(within)g(a)g(no)q(de:)42 1738 y(scroll)g(forw)o(ard)611
! b Ff(SPC)42 1788 y Fh(scroll)13 b(rev)o(erse)627 b Ff(DEL)42
! 1838 y Fh(b)q(eginning)13 b(of)g(no)q(de)535 b Ff(.)43
! b Fh(\(dot\))0 1906 y(Mo)o(ving)13 b(b)q(et)o(w)o(een)i(no)q(des:)42
! 1973 y Fe(next)e Fh(no)q(de)666 b Ff(n)42 2023 y Fe(previous)11
! b Fh(no)q(de)583 b Ff(p)42 2073 y Fh(mo)o(v)o(e)12 b
! Fe(up)697 b Ff(u)42 2123 y Fh(select)15 b(men)o(u)e(item)f(b)o(y)i
! (name)383 b Ff(m)42 2173 y Fh(select)15 b Fb(n)s Fh(th)f(men)o(u)f
! (item)g(b)o(y)g(n)o(um)o(b)q(er)h(\(1{9\))155 b Fb(n)42
! 2222 y Fh(follo)o(w)11 b(cross)k(reference)i(\(return)e(with)f
! Ff(l)p Fh(\))186 b Ff(f)42 2272 y Fh(return)15 b(to)e(last)h(no)q(de)g
! (y)o(ou)g(sa)o(w)357 b Ff(l)42 2322 y Fh(return)15 b(to)e(directory)i
! (no)q(de)418 b Ff(d)42 2372 y Fh(go)13 b(to)h(an)o(y)f(no)q(de)h(b)o(y)
! g(name)418 b Ff(g)0 2439 y Fh(Other:)42 2507 y(run)14
! b(Info)f Fe(tutorial)537 b Ff(h)42 2557 y Fh(list)13
! b(Info)g(commands)510 b Ff(?)42 2607 y Fe(quit)12 b Fh(Info)689
! b Ff(q)42 2657 y Fh(searc)o(h)15 b(no)q(des)f(for)g(regexp)434
! b Ff(M-s)1929 2832 y Fh(5)p eop
  %%Page: 6 6
! 6 5 bop 0 -168 a Fg(Keyb)r(oard)24 b(Macros)0 -65 y Fe(start)13
! b Fh(de\014ning)g(a)h(k)o(eyb)q(oard)g(macro)304 b Ff(C-x)21
! b(\()0 -15 y Fe(end)13 b Fh(k)o(eyb)q(oard)h(macro)e(de\014nition)336
! b Ff(C-x)21 b(\))0 35 y Fe(execute)13 b Fh(last-de\014ned)i(k)o(eyb)q
! (oard)f(macro)215 b Ff(C-x)21 b(e)0 84 y Fh(app)q(end)14
! b(to)g(last)g(k)o(eyb)q(oard)g(macro)332 b Ff(C-u)21
! b(C-x)g(\()0 134 y Fh(name)13 b(last)g(k)o(eyb)q(oard)h(macro)218
! b Ff(M-x)21 b(name-last-kbd-mac)o(ro)0 184 y Fh(insert)15
! b(Lisp)e(de\014nition)h(in)f(bu\013er)221 b Ff(M-x)21
! b(insert-kbd-macro)0 305 y Fg(Commands)h(Dealing)g(with)f(Emacs)i(Lisp)
! 0 409 y Fh(ev)n(al)13 b Fe(sexp)g Fh(b)q(efore)i(p)q(oin)o(t)490
! b Ff(C-x)21 b(C-e)0 459 y Fh(ev)n(al)13 b(curren)o(t)j
! Fe(defun)553 b Ff(C-M-x)0 508 y Fh(ev)n(al)13 b Fe(region)598
! b Ff(M-x)21 b(eval-region)0 558 y Fh(ev)n(al)13 b(en)o(tire)i
! Fe(bu\013er)374 b Ff(M-x)21 b(eval-current-buff)o(er)0
! 608 y Fh(read)14 b(and)g(ev)n(al)f(minibu\013er)456 b
! Ff(M-:)0 658 y Fh(re-execute)16 b(last)e(minibu\013er)f(command)246
! b Ff(C-x)21 b(ESC)g(ESC)0 708 y Fh(read)14 b(and)g(ev)n(al)f(Emacs)h
! (Lisp)f(\014le)280 b Ff(M-x)21 b(load-file)0 757 y Fh(load)13
! b(from)f(standard)i(system)g(directory)152 b Ff(M-x)21
! b(load-library)0 884 y Fg(Simple)f(Customization)0 987
! y Fh(Here)15 b(are)f(some)f(examples)g(of)h(binding)f(global)f(k)o(eys)
! i(in)g(Emacs)f(Lisp.)0 1055 y Ff(\(global-set-key)19
! b("\\C-cg")h('goto-line\))0 1105 y(\(global-set-key)f("\\C-x\\C-k")g
! ('kill-region\))0 1155 y(\(global-set-key)g("\\M-#")h
! ('query-replace-rege)o(xp\))0 1222 y Fh(An)14 b(example)f(of)g(setting)
! h(a)g(v)n(ariable)f(in)g(Emacs)g(Lisp:)0 1290 y Ff(\(setq)21
! b(backup-by-copyin)o(g-whe)o(n-lin)o(ked)e(t\))0 1416
! y Fg(W)-6 b(riting)22 b(Commands)0 1520 y Ff(\(defun)f
! Fb(c)n(ommand-name)26 b Ff(\()p Fb(ar)n(gs)s Ff(\))44
! 1570 y(")p Fb(do)n(cumentation)s Ff(")44 1619 y(\(interactive)19
! b(")p Fb(template)s Ff("\))44 1669 y Fb(b)n(o)n(dy)t
! Ff(\))0 1737 y Fh(An)14 b(example:)0 1805 y Ff(\(defun)21
! b(this-line-to-to)o(p-of-)o(windo)o(w)e(\(line\))44 1854
! y("Reposition)g(line)i(point)g(is)g(on)h(to)f(top)g(of)h(window.)0
! 1904 y(With)f(ARG,)g(put)g(point)g(on)g(line)g(ARG.)0
! 1954 y(Negative)f(counts)h(from)g(bottom.")44 2004 y(\(interactive)e
! ("P"\))44 2054 y(\(recenter)h(\(if)h(\(null)f(line\))349
! 2103 y(0)305 2153 y(\(prefix-numeric-va)o(lue)f(line\)\)\)\))0
! 2221 y Fh(The)12 b(argumen)o(t)e(to)i Ff(interactive)d
! Fh(is)i(a)g(string)h(sp)q(ecifying)f(ho)o(w)g(to)h(get)f(the)0
! 2271 y(argumen)o(ts)16 b(when)h(the)h(function)e(is)h(called)g(in)o
! (teractiv)o(ely)m(.)26 b(T)o(yp)q(e)17 b Ff(C-h)k(f)0
! 2321 y(interactive)12 b Fh(for)h(more)g(information.)238
! 2466 y Fd(Cop)o(yrigh)o(t)403 2465 y(c)393 2466 y Fc(\015)f
! Fd(1996)d(F)m(ree)j(Soft)o(w)o(are)e(F)m(oundation,)j(Inc.)269
! 2506 y(designed)e(b)o(y)i(Stephen)f(Gildea,)f(Marc)o(h)g(1996)e(v2.1)
! 281 2545 y(for)i(GNU)f(Emacs)h(v)o(ersion)h(19)e(on)h(Unix)h(systems)0
! 2603 y(P)o(ermission)g(is)f(gran)o(ted)e(to)h(mak)o(e)h(and)f
! (distribute)i(copies)e(of)h(this)g(card)f(pro)o(vided)h(the)g(cop)o(y-)
! 0 2643 y(righ)o(t)h(notice)e(and)i(this)g(p)q(ermission)g(notice)f(are)
! g(preserv)o(ed)g(on)h(all)f(copies.)0 2701 y(F)m(or)g(copies)f(of)g
! (the)h(GNU)e(Emacs)h(man)o(ual,)i(write)e(to)g(the)h(F)m(ree)f(Soft)o
! (w)o(are)g(F)m(oundation,)i(Inc.,)0 2741 y(59)e(T)m(emple)i(Place,)f
! (Suite)h(330,)f(Boston,)g(MA)f(02111-1307)e(USA)1929
! 2832 y Fh(6)p eop
  %%Trailer
  end
  userdict /end-hook known{end-hook}if
  %%EOF
diff -2rcpP --exclude=*.elc emacs-19.30/etc/refcard.tex emacs-19.31/etc/refcard.tex
*** emacs-19.30/etc/refcard.tex	Thu Jun 15 18:33:34 1995
--- emacs-19.31/etc/refcard.tex	Fri Mar 22 17:02:33 1996
***************
*** 1,4 ****
  % Reference Card for GNU Emacs version 19 on Unix systems
- % Time-stamp: <93/05/21 12:52:26 gildea>
  %**start of header
  \newcount\columnsperpage
--- 1,3 ----
***************
*** 9,13 ****
  \columnsperpage=1
  
! % Copyright (c) 1987, 1993 Free Software Foundation, Inc.
  
  % This file is part of GNU Emacs.
--- 8,12 ----
  \columnsperpage=1
  
! % Copyright (c) 1987, 1993, 1996 Free Software Foundation, Inc.
  
  % This file is part of GNU Emacs.
***************
*** 25,29 ****
  % 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.
  
  % This file is intended to be processed by plain TeX (TeX82).
--- 24,29 ----
  % 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, Inc., 59 Temple Place - Suite 330,
! % Boston, MA 02111-1307, USA.
  
  % This file is intended to be processed by plain TeX (TeX82).
***************
*** 52,58 ****
  % If there were room, it would be nice to see a section on Dired.
  
! \def\versionnumber{2.0}
! \def\year{1993}
! \def\version{May \year\ v\versionnumber}
  
  \def\shortcopyrightnotice{\vskip 1ex plus 2 fill
--- 52,58 ----
  % If there were room, it would be nice to see a section on Dired.
  
! \def\versionnumber{2.1}
! \def\year{1996}
! \def\version{March \year\ v\versionnumber}
  
  \def\shortcopyrightnotice{\vskip 1ex plus 2 fill
*************** are preserved on all copies.
*** 71,75 ****
  
  For copies of the GNU Emacs manual, write to the Free Software
! Foundation, Inc., 675 Massachusetts Ave, Cambridge MA 02139.
  
  \endgroup}
--- 71,75 ----
  
  For copies of the GNU Emacs manual, write to the Free Software
! Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  
  \endgroup}
*************** To read in a file to edit, see Files, be
*** 274,285 ****
  \key{replace this file with the file you really want}{C-x C-v}
  \key{write buffer to a specified file}{C-x C-w}
  
  \section{Getting Help}
  
! The Help system is simple.  Type \kbd{C-h} and follow the directions.
! If you are a first-time user, type \kbd{C-h t} for a {\bf tutorial}.
  
  \key{remove Help window}{C-x 1}
! \key{scroll Help window}{ESC C-v}
  
  \key{apropos: show commands matching a string}{C-h a}
--- 274,287 ----
  \key{replace this file with the file you really want}{C-x C-v}
  \key{write buffer to a specified file}{C-x C-w}
+ \key{version control checkin/checkout}{C-x C-q}
  
  \section{Getting Help}
  
! The Help system is simple.  Type \kbd{C-h} (or \kbd{F1}) and follow
! the directions.  If you are a first-time user, type \kbd{C-h t} for a
! {\bf tutorial}.
  
  \key{remove Help window}{C-x 1}
! \key{scroll Help window}{C-M-v}
  
  \key{apropos: show commands matching a string}{C-h a}
*************** Valid responses in query-replace mode ar
*** 378,406 ****
  \key{replace all remaining matches}{!}
  \key{{\bf back up} to the previous match}{^}
! \key{{\bf exit} query-replace}{ESC}
  \key{enter recursive edit (\kbd{C-M-c} to exit)}{C-r}
  
  \section{Multiple Windows}
  
  \key{delete all other windows}{C-x 1}
! \key{delete this window}{C-x 0}
! \key{split window in two vertically}{C-x 2}
  \key{split window in two horizontally}{C-x 3}
  
  \key{scroll other window}{C-M-v}
- \key{switch cursor to another window}{C-x o}
  
! \metax{shrink window shorter}{M-x shrink-window}
  \key{grow window taller}{C-x ^}
  \key{shrink window narrower}{C-x \{}
  \key{grow window wider}{C-x \}}
  
- \key{select buffer in other window}{C-x 4 b}
- \key{display buffer in other window}{C-x 4 C-o}
- \key{find file in other window}{C-x 4 f}
- \key{find file read-only in other window}{C-x 4 r}
- \key{run Dired in other window}{C-x 4 d}
- \key{find tag in other window}{C-x 4 .}
- 
  \section{Formatting}
  
--- 380,417 ----
  \key{replace all remaining matches}{!}
  \key{{\bf back up} to the previous match}{^}
! \key{{\bf exit} query-replace}{RET}
  \key{enter recursive edit (\kbd{C-M-c} to exit)}{C-r}
  
  \section{Multiple Windows}
  
+ When two commands are shown, the second is for ``other frame.''
+ 
  \key{delete all other windows}{C-x 1}
! 
! {\setbox0=\hbox{\kbd{0}}\advance\hsize by 0\wd0
! \paralign to \hsize{#\tabskip=10pt plus 1 fil&#\tabskip=0pt&#\cr
! \threecol{split window in two vertically}{C-x 2\ \ \ \ }{C-x 5 2}
! \threecol{delete this window}{C-x 0\ \ \ \ }{C-x 5 0}
! }}
  \key{split window in two horizontally}{C-x 3}
  
  \key{scroll other window}{C-M-v}
  
! {\setbox0=\hbox{\kbd{0}}\advance\hsize by 2\wd0
! \paralign to \hsize{#\tabskip=10pt plus 1 fil&#\tabskip=0pt&#\cr
! \threecol{switch cursor to another window}{C-x o}{C-x 5 o}
! 
! \threecol{select buffer in other window}{C-x 4 b}{C-x 5 b}
! \threecol{display buffer in other window}{C-x 4 C-o}{C-x 5 C-o}
! \threecol{find file in other window}{C-x 4 f}{C-x 5 f}
! \threecol{find file read-only in other window}{C-x 4 r}{C-x 5 r}
! \threecol{run Dired in other window}{C-x 4 d}{C-x 5 d}
! \threecol{find tag in other window}{C-x 4 .}{C-x 5 .}
! }}
! 
  \key{grow window taller}{C-x ^}
  \key{shrink window narrower}{C-x \{}
  \key{grow window wider}{C-x \}}
  
  \section{Formatting}
  
*************** Valid responses in query-replace mode ar
*** 421,424 ****
--- 432,437 ----
  \key{set prefix each line starts with}{C-x .}
  
+ \key{set face}{M-g}
+ 
  \section{Case Change}
  
*************** Valid responses in query-replace mode ar
*** 429,433 ****
  \key{uppercase region}{C-x C-u}
  \key{lowercase region}{C-x C-l}
- \metax{capitalize region}{M-x capitalize-region}
  
  \section{The Minibuffer}
--- 442,445 ----
*************** The following keys are defined in the mi
*** 446,453 ****
  
  Type \kbd{C-x ESC ESC} to edit and repeat the last command that used the
! minibuffer.  The following keys are then defined.
! 
! \key{previous minibuffer command}{M-p}
! \key{next minibuffer command}{M-n}
  
  \newcolumn
--- 458,462 ----
  
  Type \kbd{C-x ESC ESC} to edit and repeat the last command that used the
! minibuffer.  Type \kbd{F10} to activate the menu bar using the minibuffer.
  
  \newcolumn
*************** Other:
*** 570,574 ****
  \key{list Info commands}{?}
  \key{{\bf quit} Info}{q}
! \key{search nodes for regexp}{s}
  
  \endindentedkeys
--- 579,583 ----
  \key{list Info commands}{?}
  \key{{\bf quit} Info}{q}
! \key{search nodes for regexp}{M-s}
  
  \endindentedkeys
*************** Other:
*** 589,593 ****
  \metax{eval {\bf region}}{M-x eval-region}
  \metax{eval entire {\bf buffer}}{M-x eval-current-buffer}
! \key{read and eval minibuffer}{M-ESC}
  \key{re-execute last minibuffer command}{C-x ESC ESC}
  \metax{read and eval Emacs Lisp file}{M-x load-file}
--- 598,602 ----
  \metax{eval {\bf region}}{M-x eval-region}
  \metax{eval entire {\bf buffer}}{M-x eval-current-buffer}
! \key{read and eval minibuffer}{M-:}
  \key{re-execute last minibuffer command}{C-x ESC ESC}
  \metax{read and eval Emacs Lisp file}{M-x load-file}
*************** Other:
*** 599,609 ****
  % customizations and knows Lisp syntax.
  
! Here are some examples of binding global keys in Emacs Lisp.  Note
! that you cannot say \kbd{"\\M-\#"}; you must say \kbd{"\\e\#"}.
  
  \beginexample%
  (global-set-key "\\C-cg" 'goto-line)
  (global-set-key "\\C-x\\C-k" 'kill-region)
! (global-set-key "\\e\#" 'query-replace-regexp)
  \endexample
  
--- 608,617 ----
  % customizations and knows Lisp syntax.
  
! Here are some examples of binding global keys in Emacs Lisp.
  
  \beginexample%
  (global-set-key "\\C-cg" 'goto-line)
  (global-set-key "\\C-x\\C-k" 'kill-region)
! (global-set-key "\\M-\#" 'query-replace-regexp)
  \endexample
  
diff -2rcpP --exclude=*.elc emacs-19.30/etc/rgb.txt emacs-19.31/etc/rgb.txt
*** emacs-19.30/etc/rgb.txt	Wed Dec 31 19:00:00 1969
--- emacs-19.31/etc/rgb.txt	Thu Jan 18 23:31:47 1996
***************
*** 0 ****
--- 1,788 ----
+ #
+ # This file is not a part of GNU Emacs.  It is from xc/programs/rgb/rgb.txt 
+ # of the X11R6 X Consortium distribution, and is included here to support the
+ # mapping of color names to RGB values on Windows NT and Windows 95.
+ #
+ # The following copyright notice applies to this file, and was taken from
+ # xc/RELNOTES.TXT of the same distribution.
+ #
+ #
+ # Copyright (C) 1994 X Consortium
+ # 
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
+ # of this software and associated documentation files (the "Software"), to
+ # deal in the Software without restriction, including without limitation the
+ # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ # sell copies of the Software, and to permit persons to whom the Software is
+ # furnished to do so, subject to the following conditions:
+ # 
+ # The above copyright notice and this permission notice shall be included in
+ # all copies or substantial portions of the Software.
+ # 
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+ # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+ # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ # 
+ # Except as contained in this notice, the name of the X Consortium shall not
+ # be used in advertising or otherwise to promote the sale, use or other deal-
+ # ings in this Software without prior written authorization from the X Consor-
+ # tium.
+ # 
+ # X Window System is a trademark of X Consortium, Inc.
+ # 
+ 
+ 255 250 250		snow
+ 248 248 255		ghost white
+ 248 248 255		GhostWhite
+ 245 245 245		white smoke
+ 245 245 245		WhiteSmoke
+ 220 220 220		gainsboro
+ 255 250 240		floral white
+ 255 250 240		FloralWhite
+ 253 245 230		old lace
+ 253 245 230		OldLace
+ 250 240 230		linen
+ 250 235 215		antique white
+ 250 235 215		AntiqueWhite
+ 255 239 213		papaya whip
+ 255 239 213		PapayaWhip
+ 255 235 205		blanched almond
+ 255 235 205		BlanchedAlmond
+ 255 228 196		bisque
+ 255 218 185		peach puff
+ 255 218 185		PeachPuff
+ 255 222 173		navajo white
+ 255 222 173		NavajoWhite
+ 255 228 181		moccasin
+ 255 248 220		cornsilk
+ 255 255 240		ivory
+ 255 250 205		lemon chiffon
+ 255 250 205		LemonChiffon
+ 255 245 238		seashell
+ 240 255 240		honeydew
+ 245 255 250		mint cream
+ 245 255 250		MintCream
+ 240 255 255		azure
+ 240 248 255		alice blue
+ 240 248 255		AliceBlue
+ 230 230 250		lavender
+ 255 240 245		lavender blush
+ 255 240 245		LavenderBlush
+ 255 228 225		misty rose
+ 255 228 225		MistyRose
+ 255 255 255		white
+   0   0   0		black
+  47  79  79		dark slate gray
+  47  79  79		DarkSlateGray
+  47  79  79		dark slate grey
+  47  79  79		DarkSlateGrey
+ 105 105 105		dim gray
+ 105 105 105		DimGray
+ 105 105 105		dim grey
+ 105 105 105		DimGrey
+ 112 128 144		slate gray
+ 112 128 144		SlateGray
+ 112 128 144		slate grey
+ 112 128 144		SlateGrey
+ 119 136 153		light slate gray
+ 119 136 153		LightSlateGray
+ 119 136 153		light slate grey
+ 119 136 153		LightSlateGrey
+ 190 190 190		gray
+ 190 190 190		grey
+ 211 211 211		light grey
+ 211 211 211		LightGrey
+ 211 211 211		light gray
+ 211 211 211		LightGray
+  25  25 112		midnight blue
+  25  25 112		MidnightBlue
+   0   0 128		navy
+   0   0 128		navy blue
+   0   0 128		NavyBlue
+ 100 149 237		cornflower blue
+ 100 149 237		CornflowerBlue
+  72  61 139		dark slate blue
+  72  61 139		DarkSlateBlue
+ 106  90 205		slate blue
+ 106  90 205		SlateBlue
+ 123 104 238		medium slate blue
+ 123 104 238		MediumSlateBlue
+ 132 112 255		light slate blue
+ 132 112 255		LightSlateBlue
+   0   0 205		medium blue
+   0   0 205		MediumBlue
+  65 105 225		royal blue
+  65 105 225		RoyalBlue
+   0   0 255		blue
+  30 144 255		dodger blue
+  30 144 255		DodgerBlue
+   0 191 255		deep sky blue
+   0 191 255		DeepSkyBlue
+ 135 206 235		sky blue
+ 135 206 235		SkyBlue
+ 135 206 250		light sky blue
+ 135 206 250		LightSkyBlue
+  70 130 180		steel blue
+  70 130 180		SteelBlue
+ 176 196 222		light steel blue
+ 176 196 222		LightSteelBlue
+ 173 216 230		light blue
+ 173 216 230		LightBlue
+ 176 224 230		powder blue
+ 176 224 230		PowderBlue
+ 175 238 238		pale turquoise
+ 175 238 238		PaleTurquoise
+   0 206 209		dark turquoise
+   0 206 209		DarkTurquoise
+  72 209 204		medium turquoise
+  72 209 204		MediumTurquoise
+  64 224 208		turquoise
+   0 255 255		cyan
+ 224 255 255		light cyan
+ 224 255 255		LightCyan
+  95 158 160		cadet blue
+  95 158 160		CadetBlue
+ 102 205 170		medium aquamarine
+ 102 205 170		MediumAquamarine
+ 127 255 212		aquamarine
+   0 100   0		dark green
+   0 100   0		DarkGreen
+  85 107  47		dark olive green
+  85 107  47		DarkOliveGreen
+ 143 188 143		dark sea green
+ 143 188 143		DarkSeaGreen
+  46 139  87		sea green
+  46 139  87		SeaGreen
+  60 179 113		medium sea green
+  60 179 113		MediumSeaGreen
+  32 178 170		light sea green
+  32 178 170		LightSeaGreen
+ 152 251 152		pale green
+ 152 251 152		PaleGreen
+   0 255 127		spring green
+   0 255 127		SpringGreen
+ 124 252   0		lawn green
+ 124 252   0		LawnGreen
+   0 255   0		green
+ 127 255   0		chartreuse
+   0 250 154		medium spring green
+   0 250 154		MediumSpringGreen
+ 173 255  47		green yellow
+ 173 255  47		GreenYellow
+  50 205  50		lime green
+  50 205  50		LimeGreen
+ 154 205  50		yellow green
+ 154 205  50		YellowGreen
+  34 139  34		forest green
+  34 139  34		ForestGreen
+ 107 142  35		olive drab
+ 107 142  35		OliveDrab
+ 189 183 107		dark khaki
+ 189 183 107		DarkKhaki
+ 240 230 140		khaki
+ 238 232 170		pale goldenrod
+ 238 232 170		PaleGoldenrod
+ 250 250 210		light goldenrod yellow
+ 250 250 210		LightGoldenrodYellow
+ 255 255 224		light yellow
+ 255 255 224		LightYellow
+ 255 255   0		yellow
+ 255 215   0 		gold
+ 238 221 130		light goldenrod
+ 238 221 130		LightGoldenrod
+ 218 165  32		goldenrod
+ 184 134  11		dark goldenrod
+ 184 134  11		DarkGoldenrod
+ 188 143 143		rosy brown
+ 188 143 143		RosyBrown
+ 205  92  92		indian red
+ 205  92  92		IndianRed
+ 139  69  19		saddle brown
+ 139  69  19		SaddleBrown
+ 160  82  45		sienna
+ 205 133  63		peru
+ 222 184 135		burlywood
+ 245 245 220		beige
+ 245 222 179		wheat
+ 244 164  96		sandy brown
+ 244 164  96		SandyBrown
+ 210 180 140		tan
+ 210 105  30		chocolate
+ 178  34  34		firebrick
+ 165  42  42		brown
+ 233 150 122		dark salmon
+ 233 150 122		DarkSalmon
+ 250 128 114		salmon
+ 255 160 122		light salmon
+ 255 160 122		LightSalmon
+ 255 165   0		orange
+ 255 140   0		dark orange
+ 255 140   0		DarkOrange
+ 255 127  80		coral
+ 240 128 128		light coral
+ 240 128 128		LightCoral
+ 255  99  71		tomato
+ 255  69   0		orange red
+ 255  69   0		OrangeRed
+ 255   0   0		red
+ 255 105 180		hot pink
+ 255 105 180		HotPink
+ 255  20 147		deep pink
+ 255  20 147		DeepPink
+ 255 192 203		pink
+ 255 182 193		light pink
+ 255 182 193		LightPink
+ 219 112 147		pale violet red
+ 219 112 147		PaleVioletRed
+ 176  48  96		maroon
+ 199  21 133		medium violet red
+ 199  21 133		MediumVioletRed
+ 208  32 144		violet red
+ 208  32 144		VioletRed
+ 255   0 255		magenta
+ 238 130 238		violet
+ 221 160 221		plum
+ 218 112 214		orchid
+ 186  85 211		medium orchid
+ 186  85 211		MediumOrchid
+ 153  50 204		dark orchid
+ 153  50 204		DarkOrchid
+ 148   0 211		dark violet
+ 148   0 211		DarkViolet
+ 138  43 226		blue violet
+ 138  43 226		BlueViolet
+ 160  32 240		purple
+ 147 112 219		medium purple
+ 147 112 219		MediumPurple
+ 216 191 216		thistle
+ 255 250 250		snow1
+ 238 233 233		snow2
+ 205 201 201		snow3
+ 139 137 137		snow4
+ 255 245 238		seashell1
+ 238 229 222		seashell2
+ 205 197 191		seashell3
+ 139 134 130		seashell4
+ 255 239 219		AntiqueWhite1
+ 238 223 204		AntiqueWhite2
+ 205 192 176		AntiqueWhite3
+ 139 131 120		AntiqueWhite4
+ 255 228 196		bisque1
+ 238 213 183		bisque2
+ 205 183 158		bisque3
+ 139 125 107		bisque4
+ 255 218 185		PeachPuff1
+ 238 203 173		PeachPuff2
+ 205 175 149		PeachPuff3
+ 139 119 101		PeachPuff4
+ 255 222 173		NavajoWhite1
+ 238 207 161		NavajoWhite2
+ 205 179 139		NavajoWhite3
+ 139 121	 94		NavajoWhite4
+ 255 250 205		LemonChiffon1
+ 238 233 191		LemonChiffon2
+ 205 201 165		LemonChiffon3
+ 139 137 112		LemonChiffon4
+ 255 248 220		cornsilk1
+ 238 232 205		cornsilk2
+ 205 200 177		cornsilk3
+ 139 136 120		cornsilk4
+ 255 255 240		ivory1
+ 238 238 224		ivory2
+ 205 205 193		ivory3
+ 139 139 131		ivory4
+ 240 255 240		honeydew1
+ 224 238 224		honeydew2
+ 193 205 193		honeydew3
+ 131 139 131		honeydew4
+ 255 240 245		LavenderBlush1
+ 238 224 229		LavenderBlush2
+ 205 193 197		LavenderBlush3
+ 139 131 134		LavenderBlush4
+ 255 228 225		MistyRose1
+ 238 213 210		MistyRose2
+ 205 183 181		MistyRose3
+ 139 125 123		MistyRose4
+ 240 255 255		azure1
+ 224 238 238		azure2
+ 193 205 205		azure3
+ 131 139 139		azure4
+ 131 111 255		SlateBlue1
+ 122 103 238		SlateBlue2
+ 105  89 205		SlateBlue3
+  71  60 139		SlateBlue4
+  72 118 255		RoyalBlue1
+  67 110 238		RoyalBlue2
+  58  95 205		RoyalBlue3
+  39  64 139		RoyalBlue4
+   0   0 255		blue1
+   0   0 238		blue2
+   0   0 205		blue3
+   0   0 139		blue4
+  30 144 255		DodgerBlue1
+  28 134 238		DodgerBlue2
+  24 116 205		DodgerBlue3
+  16  78 139		DodgerBlue4
+  99 184 255		SteelBlue1
+  92 172 238		SteelBlue2
+  79 148 205		SteelBlue3
+  54 100 139		SteelBlue4
+   0 191 255		DeepSkyBlue1
+   0 178 238		DeepSkyBlue2
+   0 154 205		DeepSkyBlue3
+   0 104 139		DeepSkyBlue4
+ 135 206 255		SkyBlue1
+ 126 192 238		SkyBlue2
+ 108 166 205		SkyBlue3
+  74 112 139		SkyBlue4
+ 176 226 255		LightSkyBlue1
+ 164 211 238		LightSkyBlue2
+ 141 182 205		LightSkyBlue3
+  96 123 139		LightSkyBlue4
+ 198 226 255		SlateGray1
+ 185 211 238		SlateGray2
+ 159 182 205		SlateGray3
+ 108 123 139		SlateGray4
+ 202 225 255		LightSteelBlue1
+ 188 210 238		LightSteelBlue2
+ 162 181 205		LightSteelBlue3
+ 110 123 139		LightSteelBlue4
+ 191 239 255		LightBlue1
+ 178 223 238		LightBlue2
+ 154 192 205		LightBlue3
+ 104 131 139		LightBlue4
+ 224 255 255		LightCyan1
+ 209 238 238		LightCyan2
+ 180 205 205		LightCyan3
+ 122 139 139		LightCyan4
+ 187 255 255		PaleTurquoise1
+ 174 238 238		PaleTurquoise2
+ 150 205 205		PaleTurquoise3
+ 102 139 139		PaleTurquoise4
+ 152 245 255		CadetBlue1
+ 142 229 238		CadetBlue2
+ 122 197 205		CadetBlue3
+  83 134 139		CadetBlue4
+   0 245 255		turquoise1
+   0 229 238		turquoise2
+   0 197 205		turquoise3
+   0 134 139		turquoise4
+   0 255 255		cyan1
+   0 238 238		cyan2
+   0 205 205		cyan3
+   0 139 139		cyan4
+ 151 255 255		DarkSlateGray1
+ 141 238 238		DarkSlateGray2
+ 121 205 205		DarkSlateGray3
+  82 139 139		DarkSlateGray4
+ 127 255 212		aquamarine1
+ 118 238 198		aquamarine2
+ 102 205 170		aquamarine3
+  69 139 116		aquamarine4
+ 193 255 193		DarkSeaGreen1
+ 180 238 180		DarkSeaGreen2
+ 155 205 155		DarkSeaGreen3
+ 105 139 105		DarkSeaGreen4
+  84 255 159		SeaGreen1
+  78 238 148		SeaGreen2
+  67 205 128		SeaGreen3
+  46 139	 87		SeaGreen4
+ 154 255 154		PaleGreen1
+ 144 238 144		PaleGreen2
+ 124 205 124		PaleGreen3
+  84 139	 84		PaleGreen4
+   0 255 127		SpringGreen1
+   0 238 118		SpringGreen2
+   0 205 102		SpringGreen3
+   0 139	 69		SpringGreen4
+   0 255	  0		green1
+   0 238	  0		green2
+   0 205	  0		green3
+   0 139	  0		green4
+ 127 255	  0		chartreuse1
+ 118 238	  0		chartreuse2
+ 102 205	  0		chartreuse3
+  69 139	  0		chartreuse4
+ 192 255	 62		OliveDrab1
+ 179 238	 58		OliveDrab2
+ 154 205	 50		OliveDrab3
+ 105 139	 34		OliveDrab4
+ 202 255 112		DarkOliveGreen1
+ 188 238 104		DarkOliveGreen2
+ 162 205	 90		DarkOliveGreen3
+ 110 139	 61		DarkOliveGreen4
+ 255 246 143		khaki1
+ 238 230 133		khaki2
+ 205 198 115		khaki3
+ 139 134	 78		khaki4
+ 255 236 139		LightGoldenrod1
+ 238 220 130		LightGoldenrod2
+ 205 190 112		LightGoldenrod3
+ 139 129	 76		LightGoldenrod4
+ 255 255 224		LightYellow1
+ 238 238 209		LightYellow2
+ 205 205 180		LightYellow3
+ 139 139 122		LightYellow4
+ 255 255	  0		yellow1
+ 238 238	  0		yellow2
+ 205 205	  0		yellow3
+ 139 139	  0		yellow4
+ 255 215	  0		gold1
+ 238 201	  0		gold2
+ 205 173	  0		gold3
+ 139 117	  0		gold4
+ 255 193	 37		goldenrod1
+ 238 180	 34		goldenrod2
+ 205 155	 29		goldenrod3
+ 139 105	 20		goldenrod4
+ 255 185	 15		DarkGoldenrod1
+ 238 173	 14		DarkGoldenrod2
+ 205 149	 12		DarkGoldenrod3
+ 139 101	  8		DarkGoldenrod4
+ 255 193 193		RosyBrown1
+ 238 180 180		RosyBrown2
+ 205 155 155		RosyBrown3
+ 139 105 105		RosyBrown4
+ 255 106 106		IndianRed1
+ 238  99	 99		IndianRed2
+ 205  85	 85		IndianRed3
+ 139  58	 58		IndianRed4
+ 255 130	 71		sienna1
+ 238 121	 66		sienna2
+ 205 104	 57		sienna3
+ 139  71	 38		sienna4
+ 255 211 155		burlywood1
+ 238 197 145		burlywood2
+ 205 170 125		burlywood3
+ 139 115	 85		burlywood4
+ 255 231 186		wheat1
+ 238 216 174		wheat2
+ 205 186 150		wheat3
+ 139 126 102		wheat4
+ 255 165	 79		tan1
+ 238 154	 73		tan2
+ 205 133	 63		tan3
+ 139  90	 43		tan4
+ 255 127	 36		chocolate1
+ 238 118	 33		chocolate2
+ 205 102	 29		chocolate3
+ 139  69	 19		chocolate4
+ 255  48	 48		firebrick1
+ 238  44	 44		firebrick2
+ 205  38	 38		firebrick3
+ 139  26	 26		firebrick4
+ 255  64	 64		brown1
+ 238  59	 59		brown2
+ 205  51	 51		brown3
+ 139  35	 35		brown4
+ 255 140 105		salmon1
+ 238 130	 98		salmon2
+ 205 112	 84		salmon3
+ 139  76	 57		salmon4
+ 255 160 122		LightSalmon1
+ 238 149 114		LightSalmon2
+ 205 129	 98		LightSalmon3
+ 139  87	 66		LightSalmon4
+ 255 165	  0		orange1
+ 238 154	  0		orange2
+ 205 133	  0		orange3
+ 139  90	  0		orange4
+ 255 127	  0		DarkOrange1
+ 238 118	  0		DarkOrange2
+ 205 102	  0		DarkOrange3
+ 139  69	  0		DarkOrange4
+ 255 114	 86		coral1
+ 238 106	 80		coral2
+ 205  91	 69		coral3
+ 139  62	 47		coral4
+ 255  99	 71		tomato1
+ 238  92	 66		tomato2
+ 205  79	 57		tomato3
+ 139  54	 38		tomato4
+ 255  69	  0		OrangeRed1
+ 238  64	  0		OrangeRed2
+ 205  55	  0		OrangeRed3
+ 139  37	  0		OrangeRed4
+ 255   0	  0		red1
+ 238   0	  0		red2
+ 205   0	  0		red3
+ 139   0	  0		red4
+ 255  20 147		DeepPink1
+ 238  18 137		DeepPink2
+ 205  16 118		DeepPink3
+ 139  10	 80		DeepPink4
+ 255 110 180		HotPink1
+ 238 106 167		HotPink2
+ 205  96 144		HotPink3
+ 139  58  98		HotPink4
+ 255 181 197		pink1
+ 238 169 184		pink2
+ 205 145 158		pink3
+ 139  99 108		pink4
+ 255 174 185		LightPink1
+ 238 162 173		LightPink2
+ 205 140 149		LightPink3
+ 139  95 101		LightPink4
+ 255 130 171		PaleVioletRed1
+ 238 121 159		PaleVioletRed2
+ 205 104 137		PaleVioletRed3
+ 139  71	 93		PaleVioletRed4
+ 255  52 179		maroon1
+ 238  48 167		maroon2
+ 205  41 144		maroon3
+ 139  28	 98		maroon4
+ 255  62 150		VioletRed1
+ 238  58 140		VioletRed2
+ 205  50 120		VioletRed3
+ 139  34	 82		VioletRed4
+ 255   0 255		magenta1
+ 238   0 238		magenta2
+ 205   0 205		magenta3
+ 139   0 139		magenta4
+ 255 131 250		orchid1
+ 238 122 233		orchid2
+ 205 105 201		orchid3
+ 139  71 137		orchid4
+ 255 187 255		plum1
+ 238 174 238		plum2
+ 205 150 205		plum3
+ 139 102 139		plum4
+ 224 102 255		MediumOrchid1
+ 209  95 238		MediumOrchid2
+ 180  82 205		MediumOrchid3
+ 122  55 139		MediumOrchid4
+ 191  62 255		DarkOrchid1
+ 178  58 238		DarkOrchid2
+ 154  50 205		DarkOrchid3
+ 104  34 139		DarkOrchid4
+ 155  48 255		purple1
+ 145  44 238		purple2
+ 125  38 205		purple3
+  85  26 139		purple4
+ 171 130 255		MediumPurple1
+ 159 121 238		MediumPurple2
+ 137 104 205		MediumPurple3
+  93  71 139		MediumPurple4
+ 255 225 255		thistle1
+ 238 210 238		thistle2
+ 205 181 205		thistle3
+ 139 123 139		thistle4
+   0   0   0		gray0
+   0   0   0		grey0
+   3   3   3		gray1
+   3   3   3		grey1
+   5   5   5		gray2
+   5   5   5		grey2
+   8   8   8		gray3
+   8   8   8		grey3
+  10  10  10 		gray4
+  10  10  10 		grey4
+  13  13  13 		gray5
+  13  13  13 		grey5
+  15  15  15 		gray6
+  15  15  15 		grey6
+  18  18  18 		gray7
+  18  18  18 		grey7
+  20  20  20 		gray8
+  20  20  20 		grey8
+  23  23  23 		gray9
+  23  23  23 		grey9
+  26  26  26 		gray10
+  26  26  26 		grey10
+  28  28  28 		gray11
+  28  28  28 		grey11
+  31  31  31 		gray12
+  31  31  31 		grey12
+  33  33  33 		gray13
+  33  33  33 		grey13
+  36  36  36 		gray14
+  36  36  36 		grey14
+  38  38  38 		gray15
+  38  38  38 		grey15
+  41  41  41 		gray16
+  41  41  41 		grey16
+  43  43  43 		gray17
+  43  43  43 		grey17
+  46  46  46 		gray18
+  46  46  46 		grey18
+  48  48  48 		gray19
+  48  48  48 		grey19
+  51  51  51 		gray20
+  51  51  51 		grey20
+  54  54  54 		gray21
+  54  54  54 		grey21
+  56  56  56 		gray22
+  56  56  56 		grey22
+  59  59  59 		gray23
+  59  59  59 		grey23
+  61  61  61 		gray24
+  61  61  61 		grey24
+  64  64  64 		gray25
+  64  64  64 		grey25
+  66  66  66 		gray26
+  66  66  66 		grey26
+  69  69  69 		gray27
+  69  69  69 		grey27
+  71  71  71 		gray28
+  71  71  71 		grey28
+  74  74  74 		gray29
+  74  74  74 		grey29
+  77  77  77 		gray30
+  77  77  77 		grey30
+  79  79  79 		gray31
+  79  79  79 		grey31
+  82  82  82 		gray32
+  82  82  82 		grey32
+  84  84  84 		gray33
+  84  84  84 		grey33
+  87  87  87 		gray34
+  87  87  87 		grey34
+  89  89  89 		gray35
+  89  89  89 		grey35
+  92  92  92 		gray36
+  92  92  92 		grey36
+  94  94  94 		gray37
+  94  94  94 		grey37
+  97  97  97 		gray38
+  97  97  97 		grey38
+  99  99  99 		gray39
+  99  99  99 		grey39
+ 102 102 102 		gray40
+ 102 102 102 		grey40
+ 105 105 105 		gray41
+ 105 105 105 		grey41
+ 107 107 107 		gray42
+ 107 107 107 		grey42
+ 110 110 110 		gray43
+ 110 110 110 		grey43
+ 112 112 112 		gray44
+ 112 112 112 		grey44
+ 115 115 115 		gray45
+ 115 115 115 		grey45
+ 117 117 117 		gray46
+ 117 117 117 		grey46
+ 120 120 120 		gray47
+ 120 120 120 		grey47
+ 122 122 122 		gray48
+ 122 122 122 		grey48
+ 125 125 125 		gray49
+ 125 125 125 		grey49
+ 127 127 127 		gray50
+ 127 127 127 		grey50
+ 130 130 130 		gray51
+ 130 130 130 		grey51
+ 133 133 133 		gray52
+ 133 133 133 		grey52
+ 135 135 135 		gray53
+ 135 135 135 		grey53
+ 138 138 138 		gray54
+ 138 138 138 		grey54
+ 140 140 140 		gray55
+ 140 140 140 		grey55
+ 143 143 143 		gray56
+ 143 143 143 		grey56
+ 145 145 145 		gray57
+ 145 145 145 		grey57
+ 148 148 148 		gray58
+ 148 148 148 		grey58
+ 150 150 150 		gray59
+ 150 150 150 		grey59
+ 153 153 153 		gray60
+ 153 153 153 		grey60
+ 156 156 156 		gray61
+ 156 156 156 		grey61
+ 158 158 158 		gray62
+ 158 158 158 		grey62
+ 161 161 161 		gray63
+ 161 161 161 		grey63
+ 163 163 163 		gray64
+ 163 163 163 		grey64
+ 166 166 166 		gray65
+ 166 166 166 		grey65
+ 168 168 168 		gray66
+ 168 168 168 		grey66
+ 171 171 171 		gray67
+ 171 171 171 		grey67
+ 173 173 173 		gray68
+ 173 173 173 		grey68
+ 176 176 176 		gray69
+ 176 176 176 		grey69
+ 179 179 179 		gray70
+ 179 179 179 		grey70
+ 181 181 181 		gray71
+ 181 181 181 		grey71
+ 184 184 184 		gray72
+ 184 184 184 		grey72
+ 186 186 186 		gray73
+ 186 186 186 		grey73
+ 189 189 189 		gray74
+ 189 189 189 		grey74
+ 191 191 191 		gray75
+ 191 191 191 		grey75
+ 194 194 194 		gray76
+ 194 194 194 		grey76
+ 196 196 196 		gray77
+ 196 196 196 		grey77
+ 199 199 199 		gray78
+ 199 199 199 		grey78
+ 201 201 201 		gray79
+ 201 201 201 		grey79
+ 204 204 204 		gray80
+ 204 204 204 		grey80
+ 207 207 207 		gray81
+ 207 207 207 		grey81
+ 209 209 209 		gray82
+ 209 209 209 		grey82
+ 212 212 212 		gray83
+ 212 212 212 		grey83
+ 214 214 214 		gray84
+ 214 214 214 		grey84
+ 217 217 217 		gray85
+ 217 217 217 		grey85
+ 219 219 219 		gray86
+ 219 219 219 		grey86
+ 222 222 222 		gray87
+ 222 222 222 		grey87
+ 224 224 224 		gray88
+ 224 224 224 		grey88
+ 227 227 227 		gray89
+ 227 227 227 		grey89
+ 229 229 229 		gray90
+ 229 229 229 		grey90
+ 232 232 232 		gray91
+ 232 232 232 		grey91
+ 235 235 235 		gray92
+ 235 235 235 		grey92
+ 237 237 237 		gray93
+ 237 237 237 		grey93
+ 240 240 240 		gray94
+ 240 240 240 		grey94
+ 242 242 242 		gray95
+ 242 242 242 		grey95
+ 245 245 245 		gray96
+ 245 245 245 		grey96
+ 247 247 247 		gray97
+ 247 247 247 		grey97
+ 250 250 250 		gray98
+ 250 250 250 		grey98
+ 252 252 252 		gray99
+ 252 252 252 		grey99
+ 255 255 255 		gray100
+ 255 255 255 		grey100
+ 169 169 169		dark grey
+ 169 169 169		DarkGrey
+ 169 169 169		dark gray
+ 169 169 169		DarkGray
+ 0     0 139		dark blue
+ 0     0 139		DarkBlue
+ 0   139 139		dark cyan
+ 0   139 139		DarkCyan
+ 139   0 139		dark magenta
+ 139   0 139		DarkMagenta
+ 139   0   0		dark red
+ 139   0   0		DarkRed
+ 144 238 144		light green
+ 144 238 144		LightGreen
diff -2rcpP --exclude=*.elc emacs-19.30/etc/viperCard.tex emacs-19.31/etc/viperCard.tex
*** emacs-19.30/etc/viperCard.tex	Thu Feb 16 00:32:02 1995
--- emacs-19.31/etc/viperCard.tex	Thu Jan  4 14:55:14 1996
*************** We will use {\it x\/} to denote a regist
*** 374,378 ****
  \metax{{\bf switch} to a buffer in another window}{:n, :b, {\rm or} C-x 4 {\sl buf}}
  \key{{\bf kill} a buffer}{:q! {\rm or} C-x k}
! \key{list exisiting {\bf buffers}}{:args {\rm or} C-x b}
  
  \section{Files}
--- 374,378 ----
  \metax{{\bf switch} to a buffer in another window}{:n, :b, {\rm or} C-x 4 {\sl buf}}
  \key{{\bf kill} a buffer}{:q! {\rm or} C-x k}
! \key{list existing {\bf buffers}}{:args {\rm or} C-x b}
  
  \section{Files}
*************** There are better VI equivalents
*** 665,669 ****
  for all of them. Also note that all Ex commands expand \% to
  current file name. To include a \% in the command, escape it with a $\backslash$.
! Similiarly, \# is replaced by previous file. For Viper, this is the
  first  file in the {\sl :args} listing for that buffer. This defaults
  to the previous file in the VI sense if you have one window.
--- 665,669 ----
  for all of them. Also note that all Ex commands expand \% to
  current file name. To include a \% in the command, escape it with a $\backslash$.
! Similarly, \# is replaced by previous file. For Viper, this is the
  first  file in the {\sl :args} listing for that buffer. This defaults
  to the previous file in the VI sense if you have one window.
Binary files emacs-19.30/etc/yow.lines and emacs-19.31/etc/yow.lines differ
diff -2rcpP --exclude=*.elc emacs-19.30/info/dir emacs-19.31/info/dir
*** emacs-19.30/info/dir	Mon Jun  5 23:20:08 1995
--- emacs-19.31/info/dir	Thu Jan 25 02:13:38 1996
*************** File: dir	Node: Top	This is the top of t
*** 7,13 ****
    This (the Directory node) gives a menu of major topics. 
    Typing "d" returns here, "q" exits, "?" lists all INFO commands, "h" 
!   gives a primer for first-timers, "mTexinfo<Return>" visits Texinfo topic,
    etc.
!   Or click mouse button 2 on a menu item or cross reference to select it.
    --- PLEASE ADD DOCUMENTATION TO THIS TREE. (See INFO topic first.) ---
  
--- 7,14 ----
    This (the Directory node) gives a menu of major topics. 
    Typing "d" returns here, "q" exits, "?" lists all INFO commands, "h" 
!   gives a primer for first-timers, "mEmacs<Return>" visits the Emacs topic,
    etc.
!   In Emacs, you can click mouse button 2 on a menu item or cross reference
!   to select it.
    --- PLEASE ADD DOCUMENTATION TO THIS TREE. (See INFO topic first.) ---
  
*************** File: dir	Node: Top	This is the top of t
*** 27,28 ****
--- 28,31 ----
  * Dired-X: (dired-x).   Dired Extra Features.
  * Ediff: (ediff).	A comprehensive visual interface to diff & patch.
+ * CC mode: (ccmode).	The GNU Emacs mode for editing C, C++, and
+ 			  Objective-C code.
diff -2rcpP --exclude=*.elc emacs-19.30/install.sh emacs-19.31/install.sh
*** emacs-19.30/install.sh	Sat Nov 25 01:01:26 1995
--- emacs-19.31/install.sh	Sat May 25 20:17:34 1996
*************** rmprog="${RMPROG-rm}"
*** 30,34 ****
  mkdirprog="${MKDIRPROG-mkdir}"
  
! tranformbasename=""
  transform_arg=""
  instcmd="$mvprog"
--- 30,34 ----
  mkdirprog="${MKDIRPROG-mkdir}"
  
! transformbasename=""
  transform_arg=""
  instcmd="$mvprog"
diff -2rcpP --exclude=*.elc emacs-19.30/lib-src/ChangeLog emacs-19.31/lib-src/ChangeLog
*** emacs-19.30/lib-src/ChangeLog	Fri Nov 24 23:42:31 1995
--- emacs-19.31/lib-src/ChangeLog	Sat May 25 15:30:54 1996
***************
*** 1,2 ****
--- 1,255 ----
+ Sat May 25 15:30:10 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
+ 
+ 	* Version 19.31 released.
+ 
+ Fri May 17 18:27:20 1996  Francesco Potorti`  <F.Potorti@cnuce.cnr.it>
+ 
+ 	* etags.c (CNL_SAVE_DEFINEDEF): Set linecharno for use by readline.
+ 	(Pascal_functions): Increase linecharno by the correct number of
+ 	chars, inline the GET_NEW_LINE macro and delete its definition.
+ 
+ Fri May  3 15:08:51 1996  Andrew Innes <andrewi@harlequin.co.uk>
+ 
+ 	* makefile.nt (OBJDIR, BLD): Remove macro definitions.
+ 
+ Fri May  3 14:27:40 1996  Andrew Innes <andrewi@harlequin.co.uk>
+ 
+ 	* makefile.nt (LOCAL_FLAGS): Include path to NT shadow includes.
+ 	(movemail.exe, fakemail.exe): Now built under Win32.o
+ 
+ 	* ntlib.c: Include ntlib.h.
+ 	(nt_sleep): Rename to sleep.
+ 	(getwd): Return directory.
+ 	(getlogin, cuserid, getuid, setuid, getpwuid, getpass, fchown,
+ 	sys_ctime, sys_fopen): New functions.
+ 
+ 	* ntlib.h: New file.
+ 
+ Mon Apr 29 11:43:54 1996  Richard Stallman  <rms@delasyd.gnu.ai.mit.edu>
+ 
+ 	* pop.c (SEND, RECV): Renamed from send, recv.
+ 	(pop_open, pop_trash): Make the trash_started code unconditional.
+ 	(socket_connection): Delete casts to void.
+ 
+ Sun Apr 28 19:36:22 1996  Richard Stallman  <rms@delasyd.gnu.ai.mit.edu>
+ 
+ 	* movemail.c (DIRECTORY_SEP, IS_DIRECTORY_SEP): Definitions
+ 	copied from lisp.h.
+ 
+ Mon Apr 22 22:50:57 1996  Andrew Innes  <andrewi@harlequin.co.uk>
+ 
+ 	* fakemail.c [WINDOWSNT]: Include ntlib.h.
+ 
+ 	* hexl.c [DOSNT]: Include fcntl.h.
+ 	[WINDOWSNT]: Include io.h.
+ 	(main) [MSDOS]: Change conditional to DOS_NT.
+ 
+ 	* movemail.c (access, unlink) [WINDOWSNT]: Macros undefined.
+ 	(fork, syswait, DISABLE_DIRECT_ACCESS) [WINDOWSNT]: Macros defined.
+ 	[WINDOWSNT]: Include locking.h.
+ 	(main): Update usage message.  Use IS_DIRECTORY_SEP.
+ 	(main) [DISABLE_DIRECT_ACCESS]: Don't check access if defined.
+ 	(main) [WINDOWSNT]: Invoke locking instead of flock.
+ 	(main) [MAIL_USE_SYSTEM_LOCK && WINDOWSNT]: Emulate ftruncate.
+ 	(main) [MAIL_USE_POP]: Pass password to popmail if used.
+ 	Include winsock.h; don't include unix inet headers.
+ 	(popmail): Add password argument and pass it to pop_open.
+ 	Open output file in binary mode.
+ 
+ 	* pop.c [WINDOWSNT]: Include winsock.h and ntlib.h.
+ 	Macro SOCKET_ERROR undefined.	
+ 	Don't declare h_errno.
+ 	[!WINDOWSNT]: Define macros recv and send.
+ 	[!WINDOWSNT] (POP_SERVICE): Change to pop3.
+ 	(pop_open) [WINDOWSNT]: Initialize trash_started.
+ 	(have_winsock) [WINDOWSNT]: New variable.
+ 	(socket_connection) [WINDOWSNT]: Initialize winsock.
+ 	(socket_connection): Use closesocket instead of close.
+ 	(getline): Use recv instead of read.
+ 	(fullwrite): Use send instead of write.
+ 	(pop_trash): Use closesocket instead of close.
+ 	(pop_trash) [WINDOWSNT]: Cleanup winsock.
+ 	Check if being called recursively by sendline.
+ 
+ 	* pop.h (struct _popserver): New field trash_started.
+ 
+ 	* wakeup.c [HAVE_CONFIG_H]: Only include config.h when defined.
+ 
+ Sun Apr 14 13:07:39 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* hexl.c (main) [DJGPP v2]: Don't change to binary for a tty.
+ 
+ Wed Apr 10 21:39:09 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* etags.c [WINDOWSNT]: Include io.h.
+ 
+ Wed Apr 10 18:34:20 1996  Geoff Voelker  <voelker@cs.washington.edu>
+ 
+ 	* makefile.nt (CTAGSOBJ): Compile with regexp support.
+ 
+ Tue Apr  9 20:49:15 1996  Eli Zaretskii  <eliz@is.elta.co.il>
+ 
+ 	* hexl.c [DJGPP v2]: Include io.h.
+ 	(main) [DJGPP v2]: Switch standard streams to binary with setmode.
+ 
+ 	* b2m.c (main) [MSDOS]: Switch standard streams to binary under
+ 	DJGPP v2.
+ 
+ Tue Apr  2 10:39:00 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* etags.c (absolute_filename): Use absolutefn.
+ 
+ Sun Mar 31 14:22:03 1996  Eli Zaretskii  <eliz@is.elta.co.il>
+ 
+ 	* etags.c (absolutefn) [DOS_NT]: Support Novell drives whose drive
+ 	letter isn't an alphabetic character.
+ 	(main) [DOS_NT]: Use binary mode on redirected `stdout'.
+ 	(process_file) [DOS_NT]: Convert all slashes to forward style.
+ 	(absolute_filename) [DOS_NT]: Emit error message for relative
+ 	paths with a drive letter.
+ 	(absolute_filename) [DOS_NT]: Handle absolute pathnames with
+ 	DOS/NT drive letters which try to reference the parent of the root.
+ 	(absolute_dirname) [DOS_NT]: Convert all slashes to forward style.
+ 
+ Wed Mar 27 23:32:29 1996  Geoff Voelker  <voelker@cs.washington.edu>
+ 
+ 	* makefile.nt: Change uses of del to $(DEL).
+ 
+ Fri Mar 22 19:56:16 1996  Francesco Potorti`  <F.Potorti@cnuce.cnr.it>
+ 
+ 	* etags.c (just_read_file): Reset lineno and charno on entry.
+ 
+ Fri Mar 15 07:39:17 1996  Anders Lindgren  <andersl@csd.uu.se>
+ 
+ 	* etags.c: Prolog language totaly rewritten.
+         (Prolog_functions): Rewritten from scratch.
+ 	(skip_comment, prolog_getit): Removed.
+         (prolog_skip_comment): New function, like old skip_comment.
+         (prolog_pred, prolog_atom, prolog_white): New functions.
+         (erlang_func, erlang_attributes): Forward declarations added.
+         (erlang_atom): Check if backslash ends line inside quoted atom.
+ 
+ Thu Mar 14 12:11:04 1996  Francesco Potorti`  <F.Potorti@cnuce.cnr.it>
+ 
+ 	* etags.c (absolutefn): DOS_NT version corrected.
+ 	(main): Append "/" to the dir name only if not already there.
+ 	(print_help): Explain the absolute/relative file name issue.
+ 	
+ Fri Mar  8 14:22:26 1996  Anders Lindgren  <andersl@csd.uu.se>
+ 
+ 	* etags.c: New Languange Erlang added.
+ 	(Erlang_functions, erlang_func, erlang_attribute, erlang_atom,
+ 	erlang_white): New functions.
+ 	(Erlang_suffixes): New suffix list.
+ 	(lang_names): Erlang entry added.
+ 	(prolog_getit): Accepts headers spanning several lines.
+ 	Always name tags.
+ 	(Prolog_functions): Removed incorrect compensation for
+ 	newline characters.
+ 	(readline_internal): Zero-terminate last line.
+ 
+ Wed Mar 20 18:10:06 1996  Mike Long  <mike.long@analog.com>
+ 
+ 	* b2m.c (main): Initialize progname variable before using it.
+ 	Quote `username' in From_ header.
+ 
+ Mon Mar 18 21:01:06 1996  Geoff Voelker  <voelker@cs.washington.edu>
+ 
+ 	* ntlib.c (getpid): New function.
+ 
+ Wed Feb 21 15:52:22 1996  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
+ 
+ 	* emacsclient.c (main, both definitions):
+ 	Print a newline for normal termination.
+ 
+ Wed Feb 21 12:10:44 1996  Noah Friedman  <friedman@prep.ai.mit.edu>
+ 
+ 	* tcp.c (main): Convert port to network byte order.
+ 
+ Sat Jan 20 15:49:11 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
+ 
+ 	* pop.c (pop_retrieve, getline): Avoid type clashes.
+ 
+ Fri Jan 19 17:52:48 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
+ 
+ 	* etags.c (enum sym_type, anonymous enum): Delete final comma.
+ 
+ Mon Jan 15 01:17:56 1996  Paul Eggert  <eggert@twinsun.com>
+ 
+ 	* rcs2log (initialize_fullname): Add support for NIS+.
+ 	(hostname): Fully qualify the default hostname with the domainname
+ 	if the hostname lacks a `.'.
+ 
+ Mon Jan 15 01:17:56 1996  Paul Eggert  <eggert@twinsun.com>
+ 
+ 	* rcs2log (initialize_fullname): Add support for NIS+.
+ 	(hostname): Fully qualify the default hostname with the domainname
+ 	if the hostname lacks a `.'.
+ 
+ Wed Jan 10 14:44:16 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
+ 
+ 	* etags.c (consider_token): Fix typo in expression.
+ 
+ Thu Jan  4 19:50:31 1996  Paul Eggert  <eggert@twinsun.com>
+ 
+ 	* etags.c (substitute): Fix spelling in message.
+ 
+ Wed Jan  3 22:01:28 1996  George V. Reilly  <georger@microcrafts.com>
+ 
+ 	* makefile.nt (etags, ctags): Compile with regexp support.
+ 	(make-docfile, wakeup, etags, ctags, hexl): Ensure build
+ 	subdirectory exists before compiling.
+ 	
+ Tue Jan  2 23:19:56 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
+ 
+ 	* emacsserver.c (main): Do chmod based on existing permission.
+ 
+ Wed Dec 27 09:09:37 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* Makefile.in (install): Turn on read/execute permission.
+ 
+ Sun Dec  3 19:31:18 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
+ 
+ 	* Makefile.in (LIB_STANDARD_LIBSRC): Use this instead of LIB_STANDARD.
+ 	(LOADLIBES): Use LIB_STANDARD_LIBSRC.
+ 
+ Fri Dec  1 22:49:27 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
+ 
+ 	* Makefile.in (THIS_IS_MAKEFILE): Renamed from THIS_IS_YMAKEFILE.
+ 
+ Wed Dec  7 10:39:09 1995  Francesco Potorti`  <pot@cnuce.cnr.it>
+ 
+ 	* etags.c (pfnote): Don't make a tag for ctags if there is no name.
+ 	(getit, Asm_labels, Perl_functions, Pascal_functions, L_getit,
+ 	get_scheme, prolog_getit): Name the tag in ctags mode.
+ 	(pfnote): Truncate ctags lines to 50 chars, like it worked once.
+ 	(Perl_interpreters): Accept "@PERL@" as an interpreter.
+ 	(suggest_asking_for_help): New function.
+ 	(main, get_language_from_name): Use suggest_asking_for_help.
+ 	(main): Let get_language_from_name make language existence check.
+ 	(streq, strneq): Check the arguments #if DEBUG.
+ 
+ Wed Dec  6 14:39:09 1995  Francesco Potorti`  <pot@cnuce.cnr.it>
+ 
+ 	* etags.c (Cplusplus_suffixes): Add .M suffix for Objective C++.
+ 	(gperf): Added keywords for Objective C and GNU macros.
+ 	(sym_type): Added values to account for Objective C and GNU macros.
+ 	(begtk): The '@' character can start a token.
+ 	(objdef, methodlen, objtag): New variables for Objective C.
+ 	(consider_token, C_entries): Added code for Objective C.
+ 	(plain_C_suffixes): Add .m and .lm for Objective C.
+ 	(Yacc_suffixes): Add .ym for Objective yacc.
+ 	(GROW_LINEBUFFER): New macro.
+ 	(consider_token, C_entries, Pascal_functions): Use the new macro.
+ 	(consider_token): Take one more argument.  Caller changed.
+ 	(consider_token): Use the hashing function to spot GNU macros.
+ 	(C_entries): Consider // as a comment start even in plain C for
+ 	the sake of Objective C parsing.
+ 
+ Mon Dec  4 19:18:59 1995  Francesco Potorti` <pot@cnuce.cnr.it>
+ 
+ 	* Makefile.in (ctags): depend on etags only for simplicity;
+  	compile with regexp support enabled.
+ 
  Fri Nov 24 23:42:28 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
diff -2rcpP --exclude=*.elc emacs-19.30/lib-src/Makefile.in emacs-19.31/lib-src/Makefile.in
*** emacs-19.30/lib-src/Makefile.in	Mon Nov 13 21:59:04 1995
--- emacs-19.31/lib-src/Makefile.in	Fri Feb 16 21:22:31 1996
***************
*** 16,20 ****
  # 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.  */
  
  # Avoid trouble on systems where the `SHELL' variable might be
--- 16,21 ----
  # 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, Inc., 59 Temple Place - Suite 330,
! # Boston, MA 02111-1307, USA.
  
  # Avoid trouble on systems where the `SHELL' variable might be
*************** MOVE_LIBS=
*** 135,139 ****
  
  #define NO_SHORTNAMES
! #define THIS_IS_YMAKEFILE
  #define NOT_C_CODE
  #include "../src/config.h"
--- 136,140 ----
  
  #define NO_SHORTNAMES
! #define THIS_IS_MAKEFILE
  #define NOT_C_CODE
  #include "../src/config.h"
*************** MOVE_LIBS=
*** 147,165 ****
  /* Some machines don't find the standard C libraries in the usual place.  */
  #ifndef ORDINARY_LINK
! #ifndef LIB_STANDARD
! #define LIB_STANDARD -lc
  #endif
  #else
! #ifndef LIB_STANDARD
! #define LIB_STANDARD
  #endif
  #endif
  
! /* Some s/*.h files define this to request special libraries.  */
  #ifndef LIBS_SYSTEM
  #define LIBS_SYSTEM
  #endif
  
! /* Some m/*.h files define this to request special libraries.  */
  #ifndef LIBS_MACHINE
  #define LIBS_MACHINE
--- 148,166 ----
  /* Some machines don't find the standard C libraries in the usual place.  */
  #ifndef ORDINARY_LINK
! #ifndef LIB_STANDARD_LIBSRC
! #define LIB_STANDARD_LIBSRC -lc
  #endif
  #else
! #ifndef LIB_STANDARD_LIBSRC
! #define LIB_STANDARD_LIBSRC
  #endif
  #endif
  
! /* Some s/SYSTEM.h files define this to request special libraries.  */
  #ifndef LIBS_SYSTEM
  #define LIBS_SYSTEM
  #endif
  
! /* Some m/MACHINE.h files define this to request special libraries.  */
  #ifndef LIBS_MACHINE
  #define LIBS_MACHINE
*************** MOVE_LIBS=
*** 187,191 ****
  #endif
  
! LOADLIBES=LIBS_SYSTEM LIBS_MACHINE LIB_STANDARD
  
  /* We need to #define emacs to get the right versions of some files.
--- 188,192 ----
  #endif
  
! LOADLIBES=LIBS_SYSTEM LIBS_MACHINE LIB_STANDARD_LIBSRC
  
  /* We need to #define emacs to get the right versions of some files.
*************** install: ${archlibdir}
*** 258,264 ****
--- 259,267 ----
  	for file in ${INSTALLABLES} ; do \
  	  $(INSTALL_PROGRAM) $${file} ${bindir}/$${file} ; \
+ 	  chmod a+rx ${bindir}/$${file}; \
  	done
  	for file in ${INSTALLABLE_SCRIPTS} ; do \
  	  $(INSTALL_PROGRAM) ${srcdir}/$${file} ${bindir}/$${file} ; \
+ 	  chmod a+rx ${bindir}/$${file}; \
  	done
  
*************** etags: ${srcdir}/etags.c $(GETOPTDEPS) $
*** 333,338 ****
  /* We depend on etags to assure that parallel makes don't write two
     etags.o files on top of each other.  */
! ctags: ${srcdir}/etags.c $(GETOPTDEPS) etags
! 	$(CC) ${ALL_CFLAGS} -DCTAGS -DVERSION="\"${version}\"" ${srcdir}/etags.c $(GETOPTOBJS) $(LOADLIBES) -o ctags
  
  wakeup: ${srcdir}/wakeup.c
--- 336,341 ----
  /* We depend on etags to assure that parallel makes don't write two
     etags.o files on top of each other.  */
! ctags: etags
! 	$(CC) ${ALL_CFLAGS} -DCTAGS -DVERSION="\"${version}\"" -DETAGS_REGEXPS ${srcdir}/etags.c $(GETOPTOBJS) $(REGEXPOBJ) $(LOADLIBES) -o ctags
  
  wakeup: ${srcdir}/wakeup.c
diff -2rcpP --exclude=*.elc emacs-19.30/lib-src/alloca.c emacs-19.31/lib-src/alloca.c
*** emacs-19.30/lib-src/alloca.c	Sat Nov 25 01:04:24 1995
--- emacs-19.31/lib-src/alloca.c	Sat May 25 20:21:30 1996
***************
*** 26,29 ****
--- 26,36 ----
  #endif
  
+ #ifdef HAVE_STRING_H
+ #include <string.h>
+ #endif
+ #ifdef HAVE_STDLIB_H
+ #include <stdlib.h>
+ #endif
+ 
  #ifdef emacs
  #include "blockinput.h"
*************** typedef char *pointer;
*** 67,71 ****
--- 74,80 ----
  #endif
  
+ #ifndef NULL
  #define	NULL	0
+ #endif
  
  /* Different portions of Emacs need to call different versions of
*************** alloca (size)
*** 209,212 ****
--- 218,224 ----
      register pointer new = malloc (sizeof (header) + size);
      /* Address of header.  */
+ 
+     if (new == 0)
+       abort();
  
      ((header *) new)->h.next = last_alloca_header;
diff -2rcpP --exclude=*.elc emacs-19.30/lib-src/b2m.c emacs-19.31/lib-src/b2m.c
*** emacs-19.30/lib-src/b2m.c	Thu May  4 02:43:45 1995
--- emacs-19.31/lib-src/b2m.c	Tue Apr  9 20:48:03 1996
*************** main (argc, argv)
*** 90,96 ****
--- 90,105 ----
  #ifdef MSDOS
    _fmode = O_BINARY;		/* all of files are treated as binary files */
+ #if __DJGPP__ > 1
+   if (!isatty (fileno (stdout)))
+     setmode (fileno (stdout), O_BINARY);
+   if (!isatty (fileno (stdin)))
+     setmode (fileno (stdin), O_BINARY);
+ #else /* not __DJGPP__ > 1 */
    (stdout)->_flag &= ~_IOTEXT;
    (stdin)->_flag &= ~_IOTEXT;
+ #endif /* not __DJGPP__ > 1 */
  #endif
+   progname = argv[0];
+ 
    if (argc != 1)
      {
*************** main (argc, argv)
*** 99,103 ****
      }
    labels_saved = printing = header = FALSE;
-   progname = argv[0];
    ltoday = time (0);
    today = ctime (&ltoday);
--- 108,111 ----
*************** main (argc, argv)
*** 114,118 ****
  	{
  	  printing = header = TRUE;
! 	  printf ("From Babyl to mail by %s %s", progname, today);
  	  continue;
  	}
--- 122,126 ----
  	{
  	  printing = header = TRUE;
! 	  printf ("From \"Babyl to mail by %s\" %s", progname, today);
  	  continue;
  	}
diff -2rcpP --exclude=*.elc emacs-19.30/lib-src/cvtmail.c emacs-19.31/lib-src/cvtmail.c
*** emacs-19.30/lib-src/cvtmail.c	Thu Apr 13 13:21:00 1995
--- emacs-19.31/lib-src/cvtmail.c	Tue Apr  9 17:17:23 1996
***************
*** 1,3 ****
--- 1,4 ----
  /* Copyright (C) 1985, 1994 Free Software Foundation
+ 
  This file is part of GNU Emacs.
  
*************** GNU General Public License for more deta
*** 14,18 ****
  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.  */
  
  /* cvtmail:
--- 15,20 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* cvtmail:
diff -2rcpP --exclude=*.elc emacs-19.30/lib-src/emacsclient.c emacs-19.31/lib-src/emacsclient.c
*** emacs-19.30/lib-src/emacsclient.c	Tue Apr 18 16:47:42 1995
--- emacs-19.31/lib-src/emacsclient.c	Mon Apr  8 16:52:51 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** main (argc, argv)
*** 172,175 ****
--- 173,177 ----
    rewind (out); /* re-read the output */
    str = fgets (string, BUFSIZ, out); 
+   printf ("\n");
  
    /* Now, wait for an answer and print any messages.  */
*************** main (argc, argv)
*** 325,329 ****
    strcpy (buf, msgp->mtext);
  
!   printf ("\n%s\n", buf);
    exit (0);
  }
--- 327,333 ----
    strcpy (buf, msgp->mtext);
  
!   printf ("\n");
!   if (*buf)
!     printf ("%s\n", buf);
    exit (0);
  }
diff -2rcpP --exclude=*.elc emacs-19.30/lib-src/emacsserver.c emacs-19.31/lib-src/emacsserver.c
*** emacs-19.30/lib-src/emacsserver.c	Wed Jun 28 16:09:44 1995
--- emacs-19.31/lib-src/emacsserver.c	Tue Apr  9 17:17:41 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** main ()
*** 55,58 ****
--- 56,60 ----
  #include <stdio.h>
  #include <errno.h>
+ #include <sys/stat.h>
  
  extern int errno;
*************** main ()
*** 90,93 ****
--- 92,96 ----
    FILE **openfiles;
    int openfiles_size;
+   struct stat statbuf;
  
  #ifndef convex
*************** main ()
*** 137,141 ****
      }
    /* Only this user can send commands to this Emacs.  */
!   chmod (server.sun_path, 0600);
    /*
     * Now, just wait for everything to come in..
--- 140,150 ----
      }
    /* Only this user can send commands to this Emacs.  */
!   if (stat (server.sun_path, &statbuf) < 0)
!     {
!       perror_1 ("bind");
!       exit (1);
!     }
! 
!   chmod (server.sun_path, statbuf.st_mode & 0600);
    /*
     * Now, just wait for everything to come in..
diff -2rcpP --exclude=*.elc emacs-19.30/lib-src/emacstool.c emacs-19.31/lib-src/emacstool.c
*** emacs-19.30/lib-src/emacstool.c	Sat Feb 26 22:50:52 1994
--- emacs-19.31/lib-src/emacstool.c	Mon Jan 15 04:18:04 1996
***************
*** 2,18 ****
     Copyright (C) 1986, 1988, 1990, 1991 Free Software Foundation, Inc.
  
!    This program 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.
! 
!    This program 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 this program; if not, write to the Free Software
!    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
  
  /*
--- 2,21 ----
     Copyright (C) 1986, 1988, 1990, 1991 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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /*
*************** button_value (event)
*** 151,155 ****
   *  sent to emacs.
   *
!  *  The theory is that to time double clicks while ignoreing UP buttons,
   *  we must keep track of the accumulated time.
   *
--- 154,158 ----
   *  sent to emacs.
   *
!  *  The theory is that to time double clicks while ignoring UP buttons,
   *  we must keep track of the accumulated time.
   *
*************** int interpose_on_window(argc,argv)
*** 377,381 ****
  {
  #ifndef TTERM
!     int i, font_width_adjust = 1; /* hackery, and hueristics */
      /* if -Wt is not supplied, then font comes out as lucida-14 (width=8)
       * rather than the screen.r.12 (width=7) typically used
--- 380,384 ----
  {
  #ifndef TTERM
!     int i, font_width_adjust = 1; /* hackery, and heuristics */
      /* if -Wt is not supplied, then font comes out as lucida-14 (width=8)
       * rather than the screen.r.12 (width=7) typically used
diff -2rcpP --exclude=*.elc emacs-19.30/lib-src/etags.c emacs-19.31/lib-src/etags.c
*** emacs-19.30/lib-src/etags.c	Mon Nov  6 12:01:16 1995
--- emacs-19.31/lib-src/etags.c	Fri May 17 12:46:15 1996
***************
*** 2,5 ****
--- 2,6 ----
     Copyright (C) 1984, 87, 88, 89, 93, 94, 95
     Free Software Foundation, Inc. and Ken Arnold
+ 
  This file is not considered part of GNU Emacs.
  
*************** GNU General Public License for more deta
*** 15,20 ****
  
  You should have received a copy of the GNU General Public License
! along with this program; if not, write to the Free Software
! Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
  
  /*
--- 16,21 ----
  
  You should have received a copy of the GNU General Public License
! along with this program; if not, write to the Free Software Foundation,
! Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
  
  /*
*************** Foundation, Inc., 675 Mass Ave, Cambridg
*** 26,40 ****
   *	Sam Kendall added C++.
   *	Francesco Potorti` reorganised C and C++ based on work by Joe Wells.
- #ifdef ETAGS_REGEXPS
   *	Regexp tags by Tom Tromey.
- #endif
   *
!  *	Francesco Potorti` (pot@cnuce.cnr.it) is the current maintainer.
   */
  
! char pot_etags_version[] = "@(#) pot revision number is 11.45";
  
  #define	TRUE	1
  #define	FALSE	0
  #ifndef DEBUG
  # define DEBUG FALSE
--- 27,40 ----
   *	Sam Kendall added C++.
   *	Francesco Potorti` reorganised C and C++ based on work by Joe Wells.
   *	Regexp tags by Tom Tromey.
   *
!  *	Francesco Potorti` (F.Potorti@cnuce.cnr.it) is the current maintainer.
   */
  
! char pot_etags_version[] = "@(#) pot revision number is 11.63";
  
  #define	TRUE	1
  #define	FALSE	0
+ 
  #ifndef DEBUG
  # define DEBUG FALSE
*************** char pot_etags_version[] = "@(#) pot rev
*** 42,61 ****
  
  #ifdef MSDOS
! #include <fcntl.h>
! #include <sys/param.h>
  #endif /* MSDOS */
  
  #ifdef WINDOWSNT
! #include <stdlib.h>
! #include <fcntl.h>
! #include <string.h>
! #define MAXPATHLEN _MAX_PATH
  #endif
  
  #ifdef HAVE_CONFIG_H
! #include <config.h>
! /* On some systems, Emacs defines static as nothing for the sake
!    of unexec.  We don't want that here since we don't use unexec. */
! #undef static
  #endif
  
--- 42,63 ----
  
  #ifdef MSDOS
! # include <string.h>
! # include <fcntl.h>
! # include <sys/param.h>
  #endif /* MSDOS */
  
  #ifdef WINDOWSNT
! # include <stdlib.h>
! # include <fcntl.h>
! # include <string.h>
! # include <io.h>
! # define MAXPATHLEN _MAX_PATH
  #endif
  
  #ifdef HAVE_CONFIG_H
! # include <config.h>
!   /* On some systems, Emacs defines static as nothing for the sake
!      of unexec.  We don't want that here since we don't use unexec. */
! # undef static
  #endif
  
*************** extern int errno;
*** 76,80 ****
  
  #ifdef ETAGS_REGEXPS
! #include <regex.h>
  #endif /* ETAGS_REGEXPS */
  
--- 78,82 ----
  
  #ifdef ETAGS_REGEXPS
! # include <regex.h>
  #endif /* ETAGS_REGEXPS */
  
*************** extern int errno;
*** 91,99 ****
  /* Exit codes for success and failure.  */
  #ifdef VMS
! #define	GOOD	1
! #define BAD	0
  #else
! #define	GOOD	0
! #define	BAD	1
  #endif
  
--- 93,101 ----
  /* Exit codes for success and failure.  */
  #ifdef VMS
! # define	GOOD	1
! # define	BAD	0
  #else
! # define	GOOD	0
! # define	BAD	1
  #endif
  
*************** extern int errno;
*** 103,108 ****
  #define YACC	0x10000		/* yacc file */
  
! #define streq(s,t)	(strcmp (s, t) == 0)
! #define strneq(s,t,n)	(strncmp (s, t, n) == 0)
  
  #define lowcase(c)	tolower ((unsigned char)c)
--- 105,110 ----
  #define YACC	0x10000		/* yacc file */
  
! #define streq(s,t)	((DEBUG &&!(s)&&!(t)&&(abort(),1)) || !strcmp(s,t))
! #define strneq(s,t,n)	((DEBUG &&!(s)&&!(t)&&(abort(),1)) || !strncmp(s,t,n))
  
  #define lowcase(c)	tolower ((unsigned char)c)
*************** extern int errno;
*** 114,118 ****
  
  #ifdef DOS_NT
! # define absolutefn(fn) (fn[0] == '/' || (isalpha (fn[0]) && fn[1] == ':'))
  #else
  # define absolutefn(fn) (fn[0] == '/')
--- 116,121 ----
  
  #ifdef DOS_NT
! # define absolutefn(fn) (fn[0] == '/' \
! 			 || (fn[1] == ':' && fn[2] == '/'))
  #else
  # define absolutefn(fn) (fn[0] == '/')
*************** typedef int logical;
*** 130,134 ****
  
  typedef struct nd_st
! {				/* sorting structure			*/
    char *name;			/* function or type name	*/
    char *file;			/* file name			*/
--- 133,137 ----
  
  typedef struct nd_st
! {				/* sorting structure		*/
    char *name;			/* function or type name	*/
    char *file;			/* file name			*/
*************** Lang_function C_entries;
*** 157,160 ****
--- 160,164 ----
  Lang_function Cplusplus_entries;
  Lang_function Cstar_entries;
+ Lang_function Erlang_functions;
  Lang_function Fortran_functions;
  Lang_function Yacc_entries;
*************** void plain_C_entries ();
*** 173,176 ****
--- 177,181 ----
  void Cplusplus_entries ();
  void Cstar_entries ();
+ void Erlang_functions ();
  void Fortran_functions ();
  void Yacc_entries ();
*************** void add_regex ();
*** 195,198 ****
--- 200,204 ----
  void add_node ();
  void error ();
+ void suggest_asking_for_help ();
  void fatal (), pfatal ();
  void find_entries ();
*************** char searchar = '/';		/* use /.../ searc
*** 211,217 ****
  int lineno;			/* line number of current line */
  long charno;			/* current character number */
! 
! long linecharno;		/* charno of start of line; not used by C,
! 				   but by every other language. */
  
  char *curfile;			/* current input file name */
--- 217,221 ----
  int lineno;			/* line number of current line */
  long charno;			/* current character number */
! long linecharno;		/* charno of start of line */
  
  char *curfile;			/* current input file name */
*************** NODE *head;			/* the head of the binary 
*** 229,232 ****
--- 233,239 ----
   * regardless of the length of the line.
   */
+ #define GROW_LINEBUFFER(buf,toksize)					\
+ while (buf.size < toksize)						\
+   buf.buffer = (char *) xrealloc (buf.buffer, buf.size *= 2)
  struct linebuffer
  {
*************** struct linebuffer
*** 236,240 ****
  
  struct linebuffer lb;		/* the current line */
! struct linebuffer token_name;	/* used by C_entries as temporary area */
  struct
  {
--- 243,247 ----
  
  struct linebuffer lb;		/* the current line */
! struct linebuffer token_name;	/* used by C_entries as a temporary area */
  struct
  {
*************** struct
*** 246,255 ****
  logical _wht[0177], _etk[0177], _itk[0177], _btk[0177];
  char
!  *white = " \f\t\n\013",	/* white chars				*/
!  *endtk = " \t\n\013\"'#()[]{}=-+%*/&|^~!<>;,.:?", /* token ending chars */
! 				/* token starting chars			*/
!  *begtk = "ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz$~",
! 				/* valid in-token chars			*/
!  *intk = "ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz$0123456789";
  
  logical append_to_tagfile;	/* -a: append to tags */
--- 253,264 ----
  logical _wht[0177], _etk[0177], _itk[0177], _btk[0177];
  char
!   /* white chars */
!   *white = " \f\t\n\013",
!   /* token ending chars */
!   *endtk = " \t\n\013\"'#()[]{}=-+%*/&|^~!<>;,.:?",
!   /* token starting chars */
!   *begtk = "ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz$~@",
!   /* valid in-token chars */
!   *intk = "ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz$0123456789";
  
  logical append_to_tagfile;	/* -a: append to tags */
*************** char *default_C_suffixes [] =
*** 335,384 ****
    { "c", "h", NULL };
  
! /* C++ file */
  char *Cplusplus_suffixes [] =
!   { "C", "H", "c++", "cc", "cpp", "cxx", "h++", "hh", "hpp", "hxx", NULL };
  
- /* C* file */
  char *Cstar_suffixes [] =
    { "cs", "hs", NULL };
  
! /* Fortran */
  char *Fortran_suffixes [] =
    { "F", "f", "f90", "for", NULL };
  
- /* Lisp source code */
  char *Lisp_suffixes [] =
    { "cl", "clisp", "el", "l", "lisp", "lsp", "ml", NULL };
  
- /* Pascal file */
  char *Pascal_suffixes [] =
    { "p", "pas", NULL };
  
- /* Perl file */
  char *Perl_suffixes [] =
    { "pl", "pm", NULL };
  char *Perl_interpreters [] =
!   { "perl", NULL };
  
- /* Pro*C file. */
  char *plain_C_suffixes [] =
!   { "pc", NULL };
  
- /* Prolog source code */
  char *Prolog_suffixes [] =
    { "prolog", NULL };
  
! /* Scheme source code */
! /* FIXME Can't do the `SCM' or `scm' prefix with a version number */
  char *Scheme_suffixes [] =
    { "SCM", "SM", "oak", "sch", "scheme", "scm", "sm", "t", NULL };
  
- /* TeX/LaTeX source code */
  char *TeX_suffixes [] =
!   { "bib", "clo", "cls", "ltx", "sty", "TeX", "tex", NULL };
  
- /* Yacc file */
  char *Yacc_suffixes [] =
!   { "y", NULL };
  
  /* Table of language names and corresponding functions, file suffixes
--- 344,389 ----
    { "c", "h", NULL };
  
! /* .M is for Objective C++ files. */
  char *Cplusplus_suffixes [] =
!   { "C", "H", "c++", "cc", "cpp", "cxx", "h++", "hh", "hpp", "hxx", "M", NULL};
  
  char *Cstar_suffixes [] =
    { "cs", "hs", NULL };
  
! char *Erlang_suffixes [] =
!   { "erl", "hrl", NULL };
! 
  char *Fortran_suffixes [] =
    { "F", "f", "f90", "for", NULL };
  
  char *Lisp_suffixes [] =
    { "cl", "clisp", "el", "l", "lisp", "lsp", "ml", NULL };
  
  char *Pascal_suffixes [] =
    { "p", "pas", NULL };
  
  char *Perl_suffixes [] =
    { "pl", "pm", NULL };
  char *Perl_interpreters [] =
!   { "perl", "@PERL@", NULL };
  
  char *plain_C_suffixes [] =
!   { "pc",			/* Pro*C file */
!     "m",			/* Objective C file */
!     "lm",			/* Objective lex file */
!      NULL };
  
  char *Prolog_suffixes [] =
    { "prolog", NULL };
  
! /* Can't do the `SCM' or `scm' prefix with a version number. */
  char *Scheme_suffixes [] =
    { "SCM", "SM", "oak", "sch", "scheme", "scm", "sm", "t", NULL };
  
  char *TeX_suffixes [] =
!   { "TeX", "bib", "clo", "cls", "ltx", "sty", "tex", NULL };
  
  char *Yacc_suffixes [] =
!   { "y", "ym", NULL };		/* .ym is Objective yacc file */
  
  /* Table of language names and corresponding functions, file suffixes
*************** struct lang_entry
*** 396,415 ****
  struct lang_entry lang_names [] =
  {
!   { "asm", Asm_labels, Asm_suffixes },
!   { "c", default_C_entries, default_C_suffixes },
!   { "c++", Cplusplus_entries, Cplusplus_suffixes },
!   { "c*", Cstar_entries, Cstar_suffixes },
!   { "fortran", Fortran_functions, Fortran_suffixes },
!   { "lisp", Lisp_functions, Lisp_suffixes },
!   { "pascal", Pascal_functions, Pascal_suffixes },
!   { "perl", Perl_functions, Perl_suffixes, Perl_interpreters },
!   { "proc", plain_C_entries, plain_C_suffixes },
!   { "prolog", Prolog_functions, Prolog_suffixes },
!   { "scheme" , Scheme_functions, Scheme_suffixes },
!   { "tex", TeX_functions, TeX_suffixes },
!   { "yacc", Yacc_entries, Yacc_suffixes },
!   { "auto", NULL },		/* default guessing scheme */
!   { "none", just_read_file },	/* regexp matching only */
!   { NULL, NULL }		/* end of list */
  };
  
--- 401,421 ----
  struct lang_entry lang_names [] =
  {
!   { "asm",     Asm_labels,	    Asm_suffixes,	  NULL              },
!   { "c",       default_C_entries,   default_C_suffixes,	  NULL              },
!   { "c++",     Cplusplus_entries,   Cplusplus_suffixes,	  NULL              },
!   { "c*",      Cstar_entries,	    Cstar_suffixes,	  NULL              },
!   { "erlang",  Erlang_functions,    Erlang_suffixes,	  NULL              },
!   { "fortran", Fortran_functions,   Fortran_suffixes,	  NULL              },
!   { "lisp",    Lisp_functions,	    Lisp_suffixes,	  NULL              },
!   { "pascal",  Pascal_functions,    Pascal_suffixes,	  NULL              },
!   { "perl",    Perl_functions,	    Perl_suffixes,	  Perl_interpreters },
!   { "proc",    plain_C_entries,	    plain_C_suffixes,	  NULL              },
!   { "prolog",  Prolog_functions,    Prolog_suffixes,	  NULL              },
!   { "scheme",  Scheme_functions,    Scheme_suffixes,	  NULL              },
!   { "tex",     TeX_functions,	    TeX_suffixes,	  NULL              },
!   { "yacc",    Yacc_entries,	    Yacc_suffixes,	  NULL              },
!   { "auto", NULL },             /* default guessing scheme */
!   { "none", just_read_file },   /* regexp matching only */
!   { NULL, NULL }                /* end of list */
  };
  
*************** print_help ()
*** 455,459 ****
    printf ("These are the options accepted by %s.  You may use unambiguous\n\
  abbreviations for the long option names.  A - as file name means read\n\
! names from stdin.\n\n", progname);
  
    puts ("-a, --append\n\
--- 461,469 ----
    printf ("These are the options accepted by %s.  You may use unambiguous\n\
  abbreviations for the long option names.  A - as file name means read\n\
! names from stdin.", progname);
!   if (!CTAGS)
!     printf ("  Absolute names are stored in the output file as they\n\
! are.  Relative ones are stored relative to the output file's directory.");
!   puts ("\n");
  
    puts ("-a, --append\n\
*************** main (argc, argv)
*** 764,768 ****
  	      fprintf (stderr, "%s: -%c option may only be given once.\n",
  		       progname, opt);
! 	      goto usage;
  	    }
  	  tagfile = optarg;
--- 774,778 ----
  	      fprintf (stderr, "%s: -%c option may only be given once.\n",
  		       progname, opt);
! 	      suggest_asking_for_help ();
  	    }
  	  tagfile = optarg;
*************** main (argc, argv)
*** 774,783 ****
  	case 'l':
  	  argbuffer[current_arg].function = get_language_from_name (optarg);
- 	  if (argbuffer[current_arg].function == NULL)
- 	    {
- 	      fprintf (stderr, "%s: language \"%s\" not recognized.\n",
- 		       progname, optarg);
- 	      goto usage;
- 	    }
  	  argbuffer[current_arg].arg_type = at_language;
  	  ++current_arg;
--- 784,787 ----
*************** main (argc, argv)
*** 832,836 ****
  #endif /* CTAGS */
  	default:
! 	  goto usage;
  	}
      }
--- 836,840 ----
  #endif /* CTAGS */
  	default:
! 	  suggest_asking_for_help ();
  	}
      }
*************** main (argc, argv)
*** 847,871 ****
      {
        fprintf (stderr, "%s: No input files specified.\n", progname);
! 
!     usage:
!       fprintf (stderr, "\tTry `%s --help' for a complete list of options.\n",
! 	       progname);
!       exit (BAD);
      }
  
    if (tagfile == NULL)
!     {
!       tagfile = CTAGS ? "tags" : "TAGS";
!     }
    cwd = etags_getcwd ();	/* the current working directory */
!   strcat (cwd, "/");
    if (streq (tagfile, "-"))
!     {
!       tagfiledir = cwd;
!     }
    else
!     {
!       tagfiledir = absolute_dirname (tagfile, cwd);
!     }
  
    init ();			/* set up boolean "functions" */
--- 851,866 ----
      {
        fprintf (stderr, "%s: No input files specified.\n", progname);
!       suggest_asking_for_help ();
      }
  
    if (tagfile == NULL)
!     tagfile = CTAGS ? "tags" : "TAGS";
    cwd = etags_getcwd ();	/* the current working directory */
!   if (cwd[strlen(cwd)-1] != '/')
!     strcat (cwd, "/");
    if (streq (tagfile, "-"))
!     tagfiledir = cwd;
    else
!     tagfiledir = absolute_dirname (tagfile, cwd);
  
    init ();			/* set up boolean "functions" */
*************** main (argc, argv)
*** 880,884 ****
      {
        if (streq (tagfile, "-"))
! 	tagf = stdout;
        else
  	tagf = fopen (tagfile, append_to_tagfile ? "a" : "w");
--- 875,887 ----
      {
        if (streq (tagfile, "-"))
! 	{
! 	  tagf = stdout;
! #ifdef DOS_NT
! 	  /* Switch redirected `stdout' to binary mode (setting `_fmode'
! 	     doesn't take effect until after `stdout' is already open). */
! 	  if (!isatty (fileno (stdout)))
! 	    setmode (fileno (stdout), O_BINARY);
! #endif /* DOS_NT */
! 	}
        else
  	tagf = fopen (tagfile, append_to_tagfile ? "a" : "w");
*************** get_language_from_name (name)
*** 993,1005 ****
    struct lang_entry *lang;
  
!   if (name == NULL)
!     return NULL;
!   for (lang = lang_names; lang->name != NULL; lang++)
!     {
!       if (streq (name, lang->name))
! 	return lang->function;
!     }
  
!   return NULL;
  }
  
--- 996,1015 ----
    struct lang_entry *lang;
  
!   if (name != NULL)
!     for (lang = lang_names; lang->name != NULL; lang++)
!       {
! 	if (streq (name, lang->name))
! 	  return lang->function;
!       }
  
!   fprintf (stderr, "%s: language \"%s\" not recognized.\n",
! 	   progname, optarg);
!   suggest_asking_for_help ();
! 
!   /* This point should never be reached.  The function should either
!      return a function pointer  or never return.  Note that a NULL
!      pointer cannot be considered as an error, as it means that the
!      language has not been explicitely imposed by the user ("auto"). */
!   return NULL;			/* avoid warnings from compiler */
  }
  
*************** process_file (file)
*** 1059,1062 ****
--- 1069,1079 ----
    struct stat stat_buf;
    FILE *inf;
+ #ifdef DOS_NT
+   char *p;
+ 
+   for (p = file; *p != '\0'; p++)
+     if (*p == '\\')
+       *p = '/';
+ #endif
  
    if (stat (file, &stat_buf) == 0 && !S_ISREG (stat_buf.st_mode))
*************** find_entries (file, inf)
*** 1146,1149 ****
--- 1163,1167 ----
    extern NODE *last_node;
  
+ 
    /* Memory leakage here: the memory block pointed by curfile is never
       released.  The amount of memory leaked here is the sum of the
*************** find_entries (file, inf)
*** 1223,1227 ****
  void
  pfnote (name, is_func, linestart, linelen, lno, cno)
!      char *name;		/* tag name, if different from definition */
       logical is_func;		/* tag is a function */
       char *linestart;		/* start of the line where tag is */
--- 1241,1245 ----
  void
  pfnote (name, is_func, linestart, linelen, lno, cno)
!      char *name;		/* tag name, or NULL if unnamed */
       logical is_func;		/* tag is a function */
       char *linestart;		/* start of the line where tag is */
*************** pfnote (name, is_func, linestart, linele
*** 1230,1234 ****
       long cno;			/* character number */
  {
!   register NODE *np = xnew (1, NODE);
  
    /* If ctags mode, change name "main" to M<thisfilename>. */
--- 1248,1257 ----
       long cno;			/* character number */
  {
!   register NODE *np;
! 
!   if (CTAGS && name == NULL)
!     return;
! 
!   np = xnew (1, NODE);
  
    /* If ctags mode, change name "main" to M<thisfilename>. */
*************** pfnote (name, is_func, linestart, linele
*** 1249,1258 ****
    /* Our char numbers are 0-base, because of C language tradition?
       ctags compatibility?  old versions compatibility?   I don't know.
!      Anyway, since emacs's are 1-base we espect etags.el to take care
       of the difference.  If we wanted to have 1-based numbers, we would
       uncomment the +1 below. */
    np->cno = cno /* + 1 */ ;
    np->left = np->right = NULL;
!   np->pat = savenstr (linestart, ((CTAGS && !cxref_style) ? 50 : linelen));
  
    add_node (np, &head);
--- 1272,1289 ----
    /* Our char numbers are 0-base, because of C language tradition?
       ctags compatibility?  old versions compatibility?   I don't know.
!      Anyway, since emacs's are 1-base we expect etags.el to take care
       of the difference.  If we wanted to have 1-based numbers, we would
       uncomment the +1 below. */
    np->cno = cno /* + 1 */ ;
    np->left = np->right = NULL;
!   if (CTAGS && !cxref_style)
!     {
!       if (strlen (linestart) < 50)
! 	np->pat = concat (linestart, "$", "");
!       else
! 	np->pat = savenstr (linestart, 50);
!     }
!   else
!     np->pat = savenstr (linestart, linelen);
  
    add_node (np, &head);
*************** put_entries (node)
*** 1370,1403 ****
  		 node->pat, node->lno, node->cno);
      }
!   else if (!cxref_style)
      {
!       fprintf (tagf, "%s\t%s\t",
! 	       node->name, node->file);
! 
!       if (node->is_func)
! 	{			/* a function */
! 	  putc (searchar, tagf);
! 	  putc ('^', tagf);
  
! 	  for (sp = node->pat; *sp; sp++)
! 	    {
! 	      if (*sp == '\\' || *sp == searchar)
! 		putc ('\\', tagf);
! 	      putc (*sp, tagf);
! 	    }
! 	  putc (searchar, tagf);
  	}
        else
! 	{			/* a typedef; text pattern inadequate */
! 	  fprintf (tagf, "%d", node->lno);
  	}
-       putc ('\n', tagf);
      }
-   else if (vgrind_style)
-     fprintf (stdout, "%s %s %d\n",
- 	     node->name, node->file, (node->lno + 63) / 64);
-   else
-     fprintf (stdout, "%-16s %3d %-16s %s\n",
- 	     node->name, node->lno, node->file, node->pat);
  
    /* Output subentries that follow this one */
--- 1401,1442 ----
  		 node->pat, node->lno, node->cno);
      }
!   else
      {
!       if (node->name == NULL)
! 	error ("internal error: NULL name in ctags mode.", 0);
  
!       if (cxref_style)
! 	{
! 	  if (vgrind_style)
! 	    fprintf (stdout, "%s %s %d\n",
! 		     node->name, node->file, (node->lno + 63) / 64);
! 	  else
! 	    fprintf (stdout, "%-16s %3d %-16s %s\n",
! 		     node->name, node->lno, node->file, node->pat);
  	}
        else
! 	{
! 	  fprintf (tagf, "%s\t%s\t", node->name, node->file);
! 
! 	  if (node->is_func)
! 	    {			/* a function */
! 	      putc (searchar, tagf);
! 	      putc ('^', tagf);
! 
! 	      for (sp = node->pat; *sp; sp++)
! 		{
! 		  if (*sp == '\\' || *sp == searchar)
! 		    putc ('\\', tagf);
! 		  putc (*sp, tagf);
! 		}
! 	      putc (searchar, tagf);
! 	    }
! 	  else
! 	    {			/* a typedef; text pattern inadequate */
! 	      fprintf (tagf, "%d", node->lno);
! 	    }
! 	  putc ('\n', tagf);
  	}
      }
  
    /* Output subentries that follow this one */
*************** total_size_of_entries (node)
*** 1455,1459 ****
  enum sym_type
  {
!   st_none, st_C_struct, st_C_enum, st_C_define, st_C_typedef, st_C_typespec
  };
  
--- 1494,1499 ----
  enum sym_type
  {
!   st_none, st_C_objprot, st_C_objimpl, st_C_objend, st_C_gnumacro,
!   st_C_struct, st_C_enum, st_C_define, st_C_typedef, st_C_typespec
  };
  
*************** enum sym_type
*** 1463,1466 ****
--- 1503,1510 ----
  struct C_stab_entry { char *name; int c_ext; enum sym_type type; }
  %%
+ @interface,	0,	st_C_objprot
+ @protocol,	0,	st_C_objprot
+ @implementation,0,	st_C_objimpl
+ @end,		0,	st_C_objend
  class,  	C_PLPL,	st_C_struct
  domain, 	C_STAR,	st_C_struct
*************** static,  	0,	st_C_typespec
*** 1484,1487 ****
--- 1528,1540 ----
  const,   	0,	st_C_typespec
  volatile,	0,	st_C_typespec
+ # DEFUN used in emacs, the next three used in glibc (SYSCALL only for mach).
+ DEFUN,		0,	st_C_gnumacro
+ SYSCALL,	0,	st_C_gnumacro
+ ENTRY,		0,	st_C_gnumacro
+ PSEUDO,		0,	st_C_gnumacro
+ # These are defined inside C functions, so currently they are not met.
+ # EXFUN used in glibc, DEFVAR_* in emacs.
+ #EXFUN,		0,	st_C_gnumacro
+ #DEFVAR_,	0,	st_C_gnumacro
  %]
  and replace lines between %< and %> with its output. */
*************** struct C_stab_entry { char *name; int c_
*** 1494,1503 ****
  
  #define MIN_WORD_LENGTH 3
! #define MAX_WORD_LENGTH 8
! #define MIN_HASH_VALUE 10
! #define MAX_HASH_VALUE 62
  /*
!    21 keywords
!    53 is the maximum key range
  */
  
--- 1547,1556 ----
  
  #define MIN_WORD_LENGTH 3
! #define MAX_WORD_LENGTH 15
! #define MIN_HASH_VALUE 7
! #define MAX_HASH_VALUE 63
  /*
!    29 keywords
!    57 is the maximum key range
  */
  
*************** hash (str, len)
*** 1509,1525 ****
    static unsigned char hash_table[] =
      {
!      62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
!      62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
!      62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
!      62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
!      62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
!      62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
!      62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
!      62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
!      62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
!      62, 62, 62, 62, 62, 62, 62,  2, 62,  7,
!       6,  9, 15, 30, 62, 24, 62, 62,  1, 24,
!       7, 27, 13, 62, 19, 26, 18, 27,  1, 62,
!      62, 62, 62, 62, 62, 62, 62, 62,
    };
    return len + hash_table[str[2]] + hash_table[str[0]];
--- 1562,1578 ----
    static unsigned char hash_table[] =
      {
!      63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
!      63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
!      63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
!      63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
!      63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
!      63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
!      63, 63, 63, 63, 17, 63, 63, 63,  4, 14,
!       4, 63, 63, 63, 63, 63, 63, 63, 63, 63,
!       8, 63, 63,  0, 23, 63, 63, 63, 63, 63,
!      63, 63, 63, 63, 63, 63, 63, 28, 63, 28,
!      10, 31, 27, 18, 63,  6, 63, 63, 26,  1,
!      11,  2, 29, 63, 29, 16, 26, 13, 15, 63,
!      63, 63, 63, 63, 63, 63, 63, 63,
    };
    return len + hash_table[str[2]] + hash_table[str[0]];
*************** in_word_set  (str, len)
*** 1534,1574 ****
    static struct C_stab_entry  wordlist[] =
      {
!       {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",},
!       {"",},
!       {"volatile", 	0,	st_C_typespec},
!       {"",},
!       {"long",     	0,	st_C_typespec},
!       {"char",     	0,	st_C_typespec},
!       {"class",   	C_PLPL,	st_C_struct},
!       {"",}, {"",}, {"",}, {"",},
!       {"const",    	0,	st_C_typespec},
!       {"",}, {"",}, {"",}, {"",},
!       {"auto",     	0,	st_C_typespec},
!       {"",}, {"",},
!       {"define",   	0,	st_C_define},
!       {"",},
!       {"void",     	0,	st_C_typespec},
        {"",}, {"",}, {"",},
-       {"extern",   	0,	st_C_typespec},
-       {"static",   	0,	st_C_typespec},
-       {"",},
        {"domain",  	C_STAR,	st_C_struct},
!       {"",},
!       {"typedef",  	0,	st_C_typedef},
        {"double",   	0,	st_C_typespec},
!       {"enum",     	0,	st_C_enum},
!       {"",}, {"",}, {"",}, {"",},
        {"int",      	0,	st_C_typespec},
        {"",},
!       {"float",    	0,	st_C_typespec},
        {"",}, {"",}, {"",},
        {"struct",  	0,	st_C_struct},
!       {"",}, {"",}, {"",}, {"",},
!       {"union",   	0,	st_C_struct},
!       {"",},
!       {"short",    	0,	st_C_typespec},
        {"",}, {"",},
!       {"unsigned", 	0,	st_C_typespec},
!       {"signed",   	0,	st_C_typespec},
      };
  
--- 1587,1631 ----
    static struct C_stab_entry  wordlist[] =
      {
!       {"",}, {"",}, {"",}, {"",}, {"",}, {"",}, {"",},
!       {"SYSCALL", 	0,	st_C_gnumacro},
!       {"",}, {"",}, {"",}, {"",}, {"",},
!       {"DEFUN", 		0,	st_C_gnumacro},
        {"",}, {"",}, {"",},
        {"domain",  	C_STAR,	st_C_struct},
!       {"",}, {"",}, {"",}, {"",}, {"",},
!       {"short",    	0,	st_C_typespec},
!       {"union",   	0,	st_C_struct},
!       {"void",     	0,	st_C_typespec},
!       {"",}, {"",},
!       {"PSEUDO", 		0,	st_C_gnumacro},
        {"double",   	0,	st_C_typespec},
!       {"",}, {"",},
!       {"@end", 		0,	st_C_objend},
!       {"@implementation", 0,	st_C_objimpl},
!       {"float",    	0,	st_C_typespec},
        {"int",      	0,	st_C_typespec},
        {"",},
!       {"unsigned", 	0,	st_C_typespec},
!       {"@interface", 	0,	st_C_objprot},
!       {"",},
!       {"signed",   	0,	st_C_typespec},
!       {"long",     	0,	st_C_typespec},
!       {"ENTRY", 		0,	st_C_gnumacro},
!       {"define",   	0,	st_C_define},
!       {"const",    	0,	st_C_typespec},
        {"",}, {"",}, {"",},
+       {"enum",     	0,	st_C_enum},
+       {"volatile", 	0,	st_C_typespec},
+       {"static",   	0,	st_C_typespec},
        {"struct",  	0,	st_C_struct},
!       {"",}, {"",}, {"",},
!       {"@protocol", 	0,	st_C_objprot},
        {"",}, {"",},
!       {"auto",     	0,	st_C_typespec},
!       {"",},
!       {"char",     	0,	st_C_typespec},
!       {"class",   	C_PLPL,	st_C_struct},
!       {"typedef",  	0,	st_C_typedef},
!       {"extern",   	0,	st_C_typespec},
      };
  
*************** in_word_set  (str, len)
*** 1581,1585 ****
            register char *s = wordlist[key].name;
  
!           if (*s == *str && strneq (str + 1, s + 1, len - 1))
              return &wordlist[key];
          }
--- 1638,1642 ----
            register char *s = wordlist[key].name;
  
!           if (*s == *str && !strncmp (str + 1, s + 1, len - 1))
              return &wordlist[key];
          }
*************** C_symtype(str, len, c_ext)
*** 1606,1610 ****
    * funcdef is its state variable.
    */
! typedef enum
  {
    fnone,			/* nothing seen */
--- 1663,1667 ----
    * funcdef is its state variable.
    */
! enum
  {
    fnone,			/* nothing seen */
*************** typedef enum
*** 1614,1626 ****
    flistseen,			/* after parameter list */
    fignore			/* before open brace */
! } FUNCST;
! FUNCST funcdef;
  
  
   /*
    * typedefs are recognized using a simple finite automaton.
!   * typeddef is its state variable.
    */
! typedef enum
  {
    tnone,			/* nothing seen */
--- 1671,1682 ----
    flistseen,			/* after parameter list */
    fignore			/* before open brace */
! } funcdef;
  
  
   /*
    * typedefs are recognized using a simple finite automaton.
!   * typdef is its state variable.
    */
! enum
  {
    tnone,			/* nothing seen */
*************** typedef enum
*** 1629,1634 ****
    tend,				/* just before typedef tag */
    tignore			/* junk after typedef tag */
! } TYPEDST;
! TYPEDST typdef;
  
  
--- 1685,1689 ----
    tend,				/* just before typedef tag */
    tignore			/* junk after typedef tag */
! } typdef;
  
  
*************** TYPEDST typdef;
*** 1638,1642 ****
    * variable.
    */
! typedef enum
  {
    snone,			/* nothing seen yet */
--- 1693,1697 ----
    * variable.
    */
! enum
  {
    snone,			/* nothing seen yet */
*************** typedef enum
*** 1645,1650 ****
    scolonseen,			/* colon seen after struct-like tag */
    sinbody			/* in struct body: recognize member func defs*/
! } STRUCTST;
! STRUCTST structdef;
  
  /*
--- 1700,1704 ----
    scolonseen,			/* colon seen after struct-like tag */
    sinbody			/* in struct body: recognize member func defs*/
! } structdef;
  
  /*
*************** enum sym_type structtype;
*** 1657,1663 ****
  
  /*
   * Yet another little state machine to deal with preprocessor lines.
   */
! typedef enum
  {
    dnone,			/* nothing seen */
--- 1711,1722 ----
  
  /*
+  * When objdef is different from onone, objtag is the name of the class.
+  */
+ char *objtag = "<uninited>";
+ 
+ /*
   * Yet another little state machine to deal with preprocessor lines.
   */
! enum
  {
    dnone,			/* nothing seen */
*************** typedef enum
*** 1665,1670 ****
    ddefineseen,			/* '#' and 'define' seen */
    dignorerest			/* ignore rest of line */
! } DEFINEST;
! DEFINEST definedef;
  
  /*
--- 1724,1747 ----
    ddefineseen,			/* '#' and 'define' seen */
    dignorerest			/* ignore rest of line */
! } definedef;
! 
! /*
!  * State machine for Objective C protocols and implementations.
!  */
! enum
! {
!   onone,			/* nothing seen */
!   oprotocol,			/* @interface or @protocol seen */
!   oimplementation,		/* @implementations seen */
!   otagseen,			/* class name seen */
!   oparenseen,			/* parenthesis before category seen */
!   ocatseen,			/* category name seen */
!   oinbody,			/* in @implementation body */
!   omethodsign,			/* in @implementation body, after +/- */
!   omethodtag,			/* after method name */
!   omethodcolon,			/* after method colon */
!   omethodparm,			/* after method parameter */
!   oignore			/* wait for @end */
! } objdef;
  
  /*
*************** logical yacc_rules;
*** 1680,1683 ****
--- 1757,1765 ----
  
  /*
+  * methodlen is the length of the method name stored in token_name.
+  */
+ int methodlen;
+ 
+ /*
   * consider_token ()
   *	checks to see if the current token is at the start of a
*************** logical yacc_rules;
*** 1698,1706 ****
   *	definedef		IN OUT
   *	typdef			IN OUT
   *	next_token_is_func	IN OUT
   */
  
  logical
! consider_token (str, len, c, c_ext, cblev, is_func)
       register char *str;	/* IN: token pointer */
       register int len;		/* IN: token length */
--- 1780,1789 ----
   *	definedef		IN OUT
   *	typdef			IN OUT
+  *	objdef			IN OUT
   *	next_token_is_func	IN OUT
   */
  
  logical
! consider_token (str, len, c, c_ext, cblev, parlev, is_func)
       register char *str;	/* IN: token pointer */
       register int len;		/* IN: token length */
*************** consider_token (str, len, c, c_ext, cble
*** 1708,1711 ****
--- 1791,1795 ----
       int c_ext;			/* IN: C extensions mask */
       int cblev;			/* IN: curly brace level */
+      int parlev;		/* IN: parenthesis level */
       logical *is_func;		/* OUT: function found */
  {
*************** consider_token (str, len, c, c_ext, cble
*** 1832,1851 ****
  
    /* Detect GNU macros. */
!   if (definedef == dnone)
!     if (strneq (str, "DEFUN", len)	/* Used in emacs */
! #if FALSE
! 	   These are defined inside C functions, so currently they
! 	   are not met anyway.
! 	|| strneq (str, "EXFUN", len) /* Used in glibc */
! 	|| strneq (str, "DEFVAR_", 7) /* Used in emacs */
! #endif
! 	|| strneq (str, "SYSCALL", len) /* Used in glibc (mach) */
! 	|| strneq (str, "ENTRY", len) /* Used in glibc */
! 	|| strneq (str, "PSEUDO", len)) /* Used in glibc */
! 
!       {
! 	next_token_is_func = TRUE;
! 	return FALSE;
!       }
    if (next_token_is_func)
      {
--- 1916,1924 ----
  
    /* Detect GNU macros. */
!   if (definedef == dnone && toktype == st_C_gnumacro)
!     {
!       next_token_is_func = TRUE;
!       return FALSE;
!     }
    if (next_token_is_func)
      {
*************** consider_token (str, len, c, c_ext, cble
*** 1856,1859 ****
--- 1929,2004 ----
      }
  
+   /*
+    * Detecting Objective C constructs.
+    */
+   switch (objdef)
+     {
+     case onone:
+       switch (toktype)
+ 	{
+ 	case st_C_objprot:
+ 	  objdef = oprotocol;
+ 	  return FALSE;
+ 	case st_C_objimpl:
+ 	  objdef = oimplementation;
+ 	  return FALSE;
+ 	}
+       break;
+     case oimplementation:
+       /* Save the class tag for functions that may be defined inside. */
+       objtag = savenstr (str, len);
+       objdef = oinbody;
+       return FALSE;
+     case oprotocol:
+       /* Save the class tag for categories. */
+       objtag = savenstr (str, len);
+       objdef = otagseen;
+       *is_func = TRUE;
+       return TRUE;
+     case oparenseen:
+       objdef = ocatseen;
+       *is_func = TRUE;
+       return TRUE;
+     case oinbody:
+       break;
+     case omethodsign:
+       if (parlev == 0)
+ 	{
+ 	  objdef = omethodtag;
+ 	  methodlen = len;
+ 	  GROW_LINEBUFFER (token_name, methodlen+1);
+ 	  strncpy (token_name.buffer, str, len);
+ 	  token_name.buffer[methodlen] = '\0';
+ 	  return TRUE;
+ 	}
+       return FALSE;
+     case omethodcolon:
+       if (parlev == 0)
+ 	objdef = omethodparm;
+       return FALSE;
+     case omethodparm:
+       if (parlev == 0)
+ 	{
+ 	  objdef = omethodtag;
+ 	  methodlen += len;
+ 	  GROW_LINEBUFFER (token_name, methodlen+1);
+ 	  strncat (token_name.buffer, str, len);
+ 	  return TRUE;
+ 	}
+       return FALSE;
+     case oignore:
+       if (toktype == st_C_objend)
+ 	{
+ 	  /* Memory leakage here: the string pointed by objtag is
+ 	     never released, because many tests would be needed to
+ 	     avoid breaking on incorrect input code.  The amount of
+ 	     memory leaked here is the sum of the lengths of the
+ 	     class tags.
+ 	  free (objtag); */
+ 	  objdef = onone;
+ 	}
+       return FALSE;
+     }
+ 
    /* A function? */
    switch (toktype)
*************** do {									\
*** 1906,1909 ****
--- 2051,2055 ----
    curlinepos = charno;							\
    lineno++;								\
+   linecharno = charno;							\
    charno += readline (&curlb, inf);					\
    lp = curlb.buffer;							\
*************** do {									\
*** 1923,1936 ****
  } while (0)
  
  #define make_tag(isfun)  do \
! {									\
!   if (tok.valid)							\
!     {									\
!       char *name = NULL;						\
!       if (tok.named)							\
! 	name = savestr (token_name.buffer);				\
!       pfnote (name, isfun, tok.buffer, tok.linelen, tok.lineno, tok.linepos); \
!     }									\
!   else if (DEBUG) abort ();						\
    tok.valid = FALSE;							\
  } while (0)
--- 2069,2080 ----
  } while (0)
  
+ /* Ideally this macro should never be called wihen tok.valid is FALSE,
+    but this would mean that the state machines always guess right. */
  #define make_tag(isfun)  do \
! if (tok.valid) {							\
!   char *name = NULL;							\
!   if (CTAGS || tok.named)						\
!     name = savestr (token_name.buffer);					\
!   pfnote (name, isfun, tok.buffer, tok.linelen, tok.lineno, tok.linepos); \
    tok.valid = FALSE;							\
  } while (0)
*************** C_entries (c_ext, inf)
*** 1960,1964 ****
    *lp = 0;
  
!   definedef = dnone; funcdef = fnone; typdef = tnone; structdef = snone;
    next_token_is_func = yacc_rules = FALSE;
    midtoken = inquote = inchar = incomm = quotednl = FALSE;
--- 2104,2109 ----
    *lp = 0;
  
!   funcdef = fnone; typdef = tnone; structdef = snone;
!   definedef = dnone; objdef = onone;
    next_token_is_func = yacc_rules = FALSE;
    midtoken = inquote = inchar = incomm = quotednl = FALSE;
*************** C_entries (c_ext, inf)
*** 2053,2059 ****
  		continue;
  	      }
! 	    else if (cplpl && *lp == '/')
  	      {
! 		c = 0;
  		break;
  	      }
--- 2198,2204 ----
  		continue;
  	      }
! 	    else if (/* cplpl && */ *lp == '/')
  	      {
! 		c = '\0';
  		break;
  	      }
*************** C_entries (c_ext, inf)
*** 2115,2119 ****
  	      if (endtoken (c))
  		{
! 		  if (cplpl && c == ':' && *lp == ':' && begtoken(*(lp + 1)))
  		    {
  		      /*
--- 2260,2264 ----
  	      if (endtoken (c))
  		{
! 		  if (c == ':' && cplpl && *lp == ':' && begtoken(*(lp + 1)))
  		    {
  		      /*
*************** C_entries (c_ext, inf)
*** 2129,2134 ****
  
  		      if (yacc_rules
! 			  || consider_token (newlb.buffer + tokoff, toklen,
! 					     c, c_ext, cblev, &is_func))
  			{
  			  if (structdef == sinbody
--- 2274,2279 ----
  
  		      if (yacc_rules
! 			  || consider_token (newlb.buffer + tokoff, toklen, c,
! 					     c_ext, cblev, parlev, &is_func))
  			{
  			  if (structdef == sinbody
*************** C_entries (c_ext, inf)
*** 2137,2148 ****
  			    /* function defined in C++ class body */
  			    {
! 			      int strsize = strlen(structtag) + 2 + toklen + 1;
! 			      while (token_name.size < strsize)
! 				{
! 				  token_name.size *= 2;
! 				  token_name.buffer
! 				    = (char *) xrealloc (token_name.buffer,
! 							 token_name.size);
! 				}
  			      strcpy (token_name.buffer, structtag);
  			      strcat (token_name.buffer, "::");
--- 2282,2287 ----
  			    /* function defined in C++ class body */
  			    {
! 			      GROW_LINEBUFFER (token_name,
! 					       strlen(structtag)+2+toklen+1);
  			      strcpy (token_name.buffer, structtag);
  			      strcat (token_name.buffer, "::");
*************** C_entries (c_ext, inf)
*** 2151,2163 ****
  			      tok.named = TRUE;
  			    }
  			  else
  			    {
! 			      while (token_name.size < toklen + 1)
! 				{
! 				  token_name.size *= 2;
! 				  token_name.buffer
! 				    = (char *) xrealloc (token_name.buffer,
! 							 token_name.size);
! 				}
  			      strncpy (token_name.buffer,
  				       newlb.buffer+tokoff, toklen);
--- 2290,2314 ----
  			      tok.named = TRUE;
  			    }
+ 			  else if (objdef == ocatseen)
+ 			    /* Objective C category */
+ 			    {
+ 			      GROW_LINEBUFFER (token_name,
+ 					       strlen(objtag)+2+toklen+1);
+ 			      strcpy (token_name.buffer, objtag);
+ 			      strcat (token_name.buffer, "(");
+ 			      strncat (token_name.buffer,
+ 				       newlb.buffer+tokoff, toklen);
+ 			      strcat (token_name.buffer, ")");
+ 			      tok.named = TRUE;
+ 			    }
+ 			  else if (objdef == omethodtag
+ 				   || objdef == omethodparm)
+ 			    /* Objective C method */
+ 			    {
+ 			      tok.named = TRUE;
+ 			    }
  			  else
  			    {
! 			      GROW_LINEBUFFER (token_name, toklen+1);
  			      strncpy (token_name.buffer,
  				       newlb.buffer+tokoff, toklen);
*************** C_entries (c_ext, inf)
*** 2180,2184 ****
  			      && (funcdef == ftagseen
  				  || structdef == stagseen
! 				  || typdef == tend))
  			    {
  			      if (current_lb_is_new)
--- 2331,2336 ----
  			      && (funcdef == ftagseen
  				  || structdef == stagseen
! 				  || typdef == tend
! 				  || objdef != onone))
  			    {
  			      if (current_lb_is_new)
*************** C_entries (c_ext, inf)
*** 2239,2242 ****
--- 2391,2408 ----
  	  if (definedef != dnone)
  	    break;
+ 	  switch (objdef)
+ 	    {
+ 	    case  otagseen:
+ 	      objdef = oignore;
+ 	      make_tag (TRUE);
+ 	      break;
+ 	    case omethodtag:
+ 	    case omethodparm:
+ 	      objdef = omethodcolon;
+ 	      methodlen += 1;
+ 	      GROW_LINEBUFFER (token_name, methodlen+1);
+ 	      strcat (token_name.buffer, ":");
+ 	      break;
+ 	    }
  	  if (structdef == stagseen)
  	    structdef = scolonseen;
*************** C_entries (c_ext, inf)
*** 2282,2285 ****
--- 2448,2459 ----
  	  if (definedef != dnone)
  	    break;
+ 	  switch (objdef)
+ 	    {
+ 	    case omethodtag:
+ 	    case omethodparm:
+ 	      make_tag (TRUE);
+ 	      objdef = oinbody;
+ 	      break;
+ 	    }
  	  if (funcdef != finlist && funcdef != fignore)
  	    funcdef = fnone;
*************** C_entries (c_ext, inf)
*** 2304,2307 ****
--- 2478,2483 ----
  	  if (definedef != dnone)
  	    break;
+ 	  if (objdef == otagseen && parlev == 0)
+ 	    objdef = oparenseen;
  	  switch (funcdef)
  	    {
*************** C_entries (c_ext, inf)
*** 2334,2337 ****
--- 2510,2518 ----
  	  if (definedef != dnone)
  	    break;
+ 	  if (objdef == ocatseen && parlev == 1)
+ 	    {
+ 	      make_tag (TRUE);
+ 	      objdef = oignore;
+ 	    }
  	  if (--parlev == 0)
  	    {
*************** C_entries (c_ext, inf)
*** 2378,2384 ****
  	      break;
  	    case fnone:
! 	      /* Neutralize `extern "C" {' grot and look inside structs. */
! 	      if (cblev == 0 && structdef == snone && typdef == tnone)
! 		cblev = -1;
  	    }
  	  cblev++;
--- 2559,2578 ----
  	      break;
  	    case fnone:
! 	      switch (objdef)
! 		{
! 		case otagseen:
! 		  make_tag (TRUE);
! 		  objdef = oignore;
! 		  break;
! 		case omethodtag:
! 		case omethodparm:
! 		  make_tag (TRUE);
! 		  objdef = oinbody;
! 		  break;
! 		default:
! 		  /* Neutralize `extern "C" {' grot and look inside structs. */
! 		  if (cblev == 0 && structdef == snone && typdef == tnone)
! 		    cblev = -1;
! 		}
  	    }
  	  cblev++;
*************** C_entries (c_ext, inf)
*** 2407,2411 ****
  	         never released, because I fear to miss something and
  	         break things while freeing the area.  The amount of
! 	         memory leaked here is the sum of the lenghts of the
  	         struct tags.
  	      if (structdef == sinbody)
--- 2601,2605 ----
  	         never released, because I fear to miss something and
  	         break things while freeing the area.  The amount of
! 	         memory leaked here is the sum of the lengths of the
  	         struct tags.
  	      if (structdef == sinbody)
*************** C_entries (c_ext, inf)
*** 2416,2421 ****
  	    }
  	  break;
! 	case '=':
! 	case '#': case '+': case '-': case '~': case '&': case '%': case '/':
  	case '|': case '^': case '!': case '<': case '>': case '.': case '?':
  	  if (definedef != dnone)
--- 2610,2622 ----
  	    }
  	  break;
! 	case '+':
! 	case '-':
! 	  if (objdef == oinbody && cblev == 0)
! 	    {
! 	      objdef = omethodsign;
! 	      break;
! 	    }
! 	  /* FALLTHRU */
! 	case '=': case '#': case '~': case '&': case '%': case '/':
  	case '|': case '^': case '!': case '<': case '>': case '.': case '?':
  	  if (definedef != dnone)
*************** C_entries (c_ext, inf)
*** 2426,2429 ****
--- 2627,2635 ----
  	  break;
  	case '\0':
+ 	  if (objdef == otagseen)
+ 	    {
+ 	      make_tag (TRUE);
+ 	      objdef = oignore;
+ 	    }
  	  /* If a macro spans multiple lines don't reset its state. */
  	  if (quotednl)
*************** getit (inf)
*** 2554,2558 ****
         cp++)
      continue;
!   pfnote (NULL, TRUE, lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
  }
  
--- 2760,2765 ----
         cp++)
      continue;
!   pfnote ((CTAGS) ? savenstr (dbp, cp-dbp) : NULL, TRUE,
! 	  lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
  }
  
*************** Asm_labels (inf)
*** 2670,2674 ****
   	    {
   	      /* Found end of label, so copy it and add it to the table. */
!  	      pfnote (NULL, TRUE,
  		      lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
   	    }
--- 2877,2881 ----
   	    {
   	      /* Found end of label, so copy it and add it to the table. */
!  	      pfnote ((CTAGS) ? savenstr(lb.buffer, cp-lb.buffer) : NULL, TRUE,
  		      lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
   	    }
*************** Perl_functions (inf)
*** 2703,2707 ****
  	  while (*cp && ! isspace(*cp) && *cp != '{')
  	    cp++;
! 	  pfnote (NULL, TRUE,
  		  lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
  	}
--- 2910,2914 ----
  	  while (*cp && ! isspace(*cp) && *cp != '{')
  	    cp++;
! 	  pfnote ((CTAGS) ? savenstr (lb.buffer, cp-lb.buffer) : NULL, TRUE,
  		  lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
  	}
*************** Perl_functions (inf)
*** 2712,2722 ****
  /* Pascal parsing                */
  
- #define GET_NEW_LINE \
- { \
-   linecharno = charno; lineno++; \
-   charno += 1 + readline (&lb, inf); \
-   dbp = lb.buffer; \
- }
- 
  /*
   *  Locates tags for procedures & functions.  Doesn't do any type- or
--- 2919,2922 ----
*************** Pascal_functions (inf)
*** 2732,2736 ****
    long save_lcno;
    int save_lineno, save_len;
!   char c;
  
    logical			/* each of these flags is TRUE iff: */
--- 2932,2936 ----
    long save_lcno;
    int save_lineno, save_len;
!   char c, *cp, *namebuf;
  
    logical			/* each of these flags is TRUE iff: */
*************** Pascal_functions (inf)
*** 2765,2769 ****
        if (c == '\0')		/* if end of line */
  	{
! 	  GET_NEW_LINE;
  	  if (*dbp == '\0')
  	    continue;
--- 2965,2972 ----
        if (c == '\0')		/* if end of line */
  	{
! 	  lineno++;
! 	  linecharno = charno;
! 	  charno += readline (&lb, inf);
! 	  dbp = lb.buffer;
  	  if (*dbp == '\0')
  	    continue;
*************** Pascal_functions (inf)
*** 2846,2850 ****
  	      found_tag = FALSE;
  	      verify_tag = FALSE;
! 	      pfnote (NULL, TRUE,
  		      tline.buffer, save_len, save_lineno, save_lcno);
  	      continue;
--- 3049,3053 ----
  	      found_tag = FALSE;
  	      verify_tag = FALSE;
! 	      pfnote (namebuf, TRUE,
  		      tline.buffer, save_len, save_lineno, save_lcno);
  	      continue;
*************** Pascal_functions (inf)
*** 2853,2868 ****
        if (get_tagname)		/* grab name of proc or fn */
  	{
- 	  int size;
- 
  	  if (*dbp == '\0')
  	    continue;
  
  	  /* save all values for later tagging */
! 	  size  = strlen (lb.buffer) + 1;
! 	  while (size > tline.size)
! 	    {
! 	      tline.size *= 2;
! 	      tline.buffer = (char *) xrealloc (tline.buffer, tline.size);
! 	    }
  	  strcpy (tline.buffer, lb.buffer);
  	  save_lineno = lineno;
--- 3056,3064 ----
        if (get_tagname)		/* grab name of proc or fn */
  	{
  	  if (*dbp == '\0')
  	    continue;
  
  	  /* save all values for later tagging */
! 	  GROW_LINEBUFFER (tline, strlen (lb.buffer) + 1);
  	  strcpy (tline.buffer, lb.buffer);
  	  save_lineno = lineno;
*************** Pascal_functions (inf)
*** 2870,2875 ****
  
  	  /* grab block name */
! 	  for (dbp++; *dbp && (!endtoken (*dbp)); dbp++)
  	    continue;
  	  save_len = dbp - lb.buffer + 1;
  	  get_tagname = FALSE;
--- 3066,3073 ----
  
  	  /* grab block name */
! 	  for (cp = dbp + 1; *cp && (!endtoken (*cp)); cp++)
  	    continue;
+ 	  namebuf = (CTAGS) ? savenstr (dbp, cp-dbp) : NULL;
+ 	  dbp = cp;		/* set dbp to e-o-token */
  	  save_len = dbp - lb.buffer + 1;
  	  get_tagname = FALSE;
*************** L_getit ()
*** 2944,2948 ****
      return;
  
!   pfnote (NULL, TRUE, lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
  }
  
--- 3142,3147 ----
      return;
  
!   pfnote ((CTAGS) ? savenstr (dbp, cp-dbp) : NULL, TRUE,
! 	  lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
  }
  
*************** get_scheme ()
*** 3061,3065 ****
         cp++)
      continue;
!   pfnote (NULL, TRUE, lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
  }
  
--- 3260,3265 ----
         cp++)
      continue;
!   pfnote ((CTAGS) ? savenstr (dbp, cp-dbp) : NULL, TRUE,
! 	  lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
  }
  
*************** TEX_Token (cp)
*** 3270,3369 ****
  }
  
! /* Support for Prolog.  */
  
- /* Whole head (not only functor, but also arguments)
-    is gotten in compound term. */
  void
! prolog_getit (s)
       char *s;
  {
!   char *save_s;
!   int insquote, npar;
  
!   save_s = s;
!   insquote = FALSE;
!   npar = 0;
!   while (1)
      {
!       if (s[0] == '\0')		/* syntax error. */
! 	return;
!       else if (insquote && s[0] == '\'' && s[1] == '\'')
! 	s += 2;
!       else if (s[0] == '\'')
! 	{
! 	  insquote = !insquote;
! 	  s++;
  	}
!       else if (!insquote && s[0] == '(')
  	{
! 	  npar++;
! 	  s++;
  	}
!       else if (!insquote && s[0] == ')')
  	{
! 	  npar--;
! 	  s++;
! 	  if (npar == 0)
! 	    break;
! 	  else if (npar < 0)	/* syntax error. */
! 	    return;
! 	}
!       else if (!insquote && s[0] == '.'
! 	       && (isspace (s[1]) || s[1] == '\0'))
! 	{			/* fullstop. */
! 	  if (npar != 0)	/* syntax error. */
! 	    return;
! 	  s++;
! 	  break;
  	}
!       else
! 	s++;
      }
!   pfnote (NULL, TRUE, save_s, s-save_s, lineno, linecharno);
  }
  
! /* It is assumed that prolog predicate starts from column 0. */
  void
! Prolog_functions (inf)
       FILE *inf;
  {
!   void skip_comment (), prolog_getit ();
  
-   lineno = linecharno = charno = 0;
    while (!feof (inf))
      {
        lineno++;
        linecharno += charno;
!       charno = readline (&lb, inf) + 1;	/* 1 for newline. */
        dbp = lb.buffer;
!       if (isspace (dbp[0]))	/* not predicate header. */
  	continue;
!       else if (dbp[0] == '%')	/* comment. */
  	continue;
!       else if (dbp[0] == '/' && dbp[1] == '*')	/* comment. */
! 	skip_comment (&lb, inf, &lineno, &linecharno);
!       else			/* found. */
! 	prolog_getit (dbp);
      }
  }
  
  void
! skip_comment (plb, inf, plineno, plinecharno)
!      struct linebuffer *plb;
!      FILE *inf;
!      int *plineno;		/* result */
!      long *plinecharno;		/* result */
  {
!   char *cp;
  
!   do
      {
!       for (cp = plb->buffer; *cp != '\0'; cp++)
! 	if (cp[0] == '*' && cp[1] == '/')
! 	  return;
!       (*plineno)++;
!       *plinecharno += readline (plb, inf) + 1; /* 1 for newline. */
      }
!   while (!feof(inf));
  }
  
--- 3470,3876 ----
  }
  
! /*
!  * Prolog support (rewritten) by Anders Lindgren, Mar. 96
!  *
!  * Assumes that the predicate starts at column 0.
!  * Only the first clause of a predicate is added. 
!  */
! void
! Prolog_functions (inf)
!      FILE *inf;
! {
!   int prolog_pred ();
!   void prolog_skip_comment ();
! 
!   char * last;
!   int len;
!   int allocated;
! 
!   allocated = 0;
!   len = 0;
!   last = NULL;
! 
!   lineno = 0;
!   linecharno = 0;
!   charno = 0;
! 
!   while (!feof (inf))
!     {
!       lineno++;
!       linecharno += charno;
!       charno = readline (&lb, inf);
!       dbp = lb.buffer;
!       if (dbp[0] == '\0')	/* Empty line */
! 	continue;
!       else if (isspace (dbp[0])) /* Not a predicate */
! 	continue;
!       else if (dbp[0] == '/' && dbp[1] == '*')	/* comment. */
! 	prolog_skip_comment (&lb, inf, &lineno, &linecharno);
!       else if (len = prolog_pred (dbp, last)) 
! 	{
! 	  /* Predicate.  Store the function name so that we only
! 	   * generates a tag for the first clause.  */
! 	  if (last == NULL)
! 	    last = xnew(len + 1, char);
! 	  else if (len + 1 > allocated)
! 	    last = (char *) xrealloc(last, len + 1);
! 	  allocated = len + 1;
! 	  strncpy (last, dbp, len);
! 	  last[len] = '\0';
! 	}
!     }
! }
! 
  
  void
! prolog_skip_comment (plb, inf)
!      struct linebuffer *plb;
!      FILE *inf;
! {
!   char *cp;
! 
!   do
!     {
!       for (cp = plb->buffer; *cp != '\0'; cp++)
! 	if (cp[0] == '*' && cp[1] == '/')
! 	  return;
!       lineno++;
!       linecharno += readline (plb, inf);
!     }
!   while (!feof(inf));
! }
! 
! /*
!  * A predicate definition is added if it matches:
!  *     <beginning of line><Prolog Atom><whitespace>(
!  *
!  * It is added to the tags database if it doesn't match the
!  * name of the previous clause header.
!  *
!  * Return the size of the name of the predicate, or 0 if no header
!  * was found.
!  */
! int
! prolog_pred (s, last)
       char *s;
+      char *last;		/* Name of last clause. */
  {
!   int prolog_atom();
!   int prolog_white();
  
!   int pos;
!   int len;
! 
!   pos = prolog_atom(s, 0);
!   if (pos < 1)
!     return 0;
! 
!   len = pos;
!   pos += prolog_white(s, pos);
! 
!   if ((s[pos] == '(') || (s[pos] == '.'))
      {
!       if (s[pos] == '(')
! 	pos++;
! 
!       /* Save only the first clause. */
!       if ((last == NULL) ||
! 	  (len != strlen(last)) ||
! 	  (strncmp(s, last, len) != 0))
! 	{
! 	  pfnote ((CTAGS) ? savenstr (s, len) : NULL, TRUE,
! 		  s, pos, lineno, linecharno);
! 	  return len;
  	}
!     }
!   return 0;
! }
! 
! /*
!  * Consume a Prolog atom.
!  * Return the number of bytes consumed, or -1 if there was an error.
!  *
!  * A prolog atom, in this context, could be one of:
!  * - An alphanumeric sequence, starting with a lower case letter.
!  * - A quoted arbitrary string. Single quotes can escape themselves.
!  *   Backslash quotes everything.
!  */
! int
! prolog_atom (s, pos)
!      char *s;
!      int pos;
! {
!   int origpos;
! 
!   origpos = pos;
! 
!   if (islower(s[pos]) || (s[pos] == '_'))
!     {
!       /* The atom is unquoted. */
!       pos++;
!       while (isalnum(s[pos]) || (s[pos] == '_'))
  	{
! 	  pos++;
  	}
!       return pos - origpos;
!     }
!   else if (s[pos] == '\'')
!     {
!       pos++;
! 
!       while (1) 
  	{
! 	  if (s[pos] == '\'')
! 	    {
! 	      pos++;
! 	      if (s[pos] != '\'')
! 		break;
! 	      pos++;		/* A double quote */
! 	    }
! 	  else if (s[pos] == '\0')
! 	    /* Multiline quoted atoms are ignored. */
! 	    return -1;
! 	  else if (s[pos] == '\\')
! 	    {
! 	      if (s[pos+1] == '\0')
! 		return -1;
! 	      pos += 2;
! 	    }
! 	  else
! 	    pos++;
  	}
!       return pos - origpos;
      }
!   else
!     return -1;
  }
  
! /* Consume whitespace.  Return the number of bytes eaten. */
! int
! prolog_white (s, pos)
!      char *s;
!      int pos;
! {
!   int origpos;
! 
!   origpos = pos;
! 
!   while (isspace(s[pos]))
!     pos++;
! 
!   return pos - origpos;
! }
! 
! /* 
!  * Support for Erlang  --  Anders Lindgren, Feb 1996.
!  *
!  * Generates tags for functions, defines, and records.
!  *
!  * Assumes that Erlang functions start at column 0.
!  */
  void
! Erlang_functions (inf)
       FILE *inf;
  {
!   int erlang_func ();
!   void erlang_attribute ();
! 
!   char * last;
!   int len;
!   int allocated;
! 
!   allocated = 0;
!   len = 0;
!   last = NULL;
! 
!   lineno = 0;
!   linecharno = 0;
!   charno = 0;
  
    while (!feof (inf))
      {
        lineno++;
        linecharno += charno;
!       charno = readline (&lb, inf);
        dbp = lb.buffer;
!       if (dbp[0] == '\0')	/* Empty line */
  	continue;
!       else if (isspace (dbp[0])) /* Not function nor attribute */
  	continue;
!       else if (dbp[0] == '%')	/* comment */
! 	continue;
!       else if (dbp[0] == '"')	/* Sometimes, strings start in column one */
! 	continue;
!       else if (dbp[0] == '-') 	/* attribute, e.g. "-define" */
! 	{
! 	  erlang_attribute(dbp);
! 	  last = NULL;
! 	}
!       else if (len = erlang_func (dbp, last)) 
! 	{
! 	  /* 
! 	   * Function.  Store the function name so that we only
! 	   * generates a tag for the first clause.
! 	   */
! 	  if (last == NULL)
! 	    last = xnew(len + 1, char);
! 	  else if (len + 1 > allocated)
! 	    last = (char *) xrealloc(last, len + 1);
! 	  allocated = len + 1;
! 	  strncpy (last, dbp, len);
! 	  last[len] = '\0';
! 	}
!     }
! }
! 
! 
! /*
!  * A function definition is added if it matches:
!  *     <beginning of line><Erlang Atom><whitespace>(
!  *
!  * It is added to the tags database if it doesn't match the
!  * name of the previous clause header.
!  *
!  * Return the size of the name of the function, or 0 if no function
!  * was found.
!  */
! int
! erlang_func (s, last)
!      char *s;
!      char *last;		/* Name of last clause. */
! {
!   int erlang_atom ();
!   int erlang_white ();
! 
!   int pos;
!   int len;
! 
!   pos = erlang_atom(s, 0);
!   if (pos < 1)
!     return 0;
! 
!   len = pos;
!   pos += erlang_white(s, pos);
! 
!   if (s[pos++] == '(')
!     {
!       /* Save only the first clause. */
!       if ((last == NULL) ||
! 	  (len != strlen(last)) ||
! 	  (strncmp(s, last, len) != 0))
! 	{
! 	  pfnote ((CTAGS) ? savenstr (s, len) : NULL, TRUE,
! 		  s, pos, lineno, linecharno);
! 	  return len;
! 	}
      }
+   return 0;
  }
  
+ 
+ /*
+  * Handle attributes.  Currently, tags are generated for defines 
+  * and records.
+  *
+  * They are on the form:
+  * -define(foo, bar).
+  * -define(Foo(M, N), M+N).
+  * -record(graph, {vtab = notable, cyclic = true}).
+  */
  void
! erlang_attribute (s)
!      char *s;
  {
!   int erlang_atom ();
!   int erlang_white ();
  
!   int pos;
!   int len;
! 
!   if ((strncmp(s, "-define", 7) == 0) ||
!       (strncmp(s, "-record", 7) == 0))
      {
!       pos = 7;
!       pos += erlang_white(s, pos);
! 
!       if (s[pos++] == '(') 
! 	{
! 	  pos += erlang_white(s, pos);
! 	
! 	  if (len = erlang_atom(s, pos))
! 	    {
! 	      pfnote ((CTAGS) ? savenstr (& s[pos], len) : NULL, TRUE,
! 		      s, pos + len, lineno, linecharno);
! 	    }
! 	}
      }
!   return;
! }
! 
! 
! /*
!  * Consume an Erlang atom (or variable).
!  * Return the number of bytes consumed, or -1 if there was an error.
!  */
! int
! erlang_atom (s, pos)
!      char *s;
!      int pos;
! {
!   int origpos;
! 
!   origpos = pos;
! 
!   if (isalpha (s[pos]) || s[pos] == '_')
!     {
!       /* The atom is unquoted. */
!       pos++;
!       while (isalnum (s[pos]) || s[pos] == '_')
! 	pos++;
!       return pos - origpos;
!     }
!   else if (s[pos] == '\'')
!     {
!       pos++;
! 
!       while (1) 
! 	{
! 	  if (s[pos] == '\'')
! 	    {
! 	      pos++;
! 	      break;
! 	    }
! 	  else if (s[pos] == '\0')
! 	    /* Multiline quoted atoms are ignored. */
! 	    return -1;
! 	  else if (s[pos] == '\\')
! 	    {
! 	      if (s[pos+1] == '\0')
! 		return -1;
! 	      pos += 2;
! 	    }
! 	  else
! 	    pos++;
! 	}
!       return pos - origpos;
!     }
!   else
!     return -1;
! }
! 
! /* Consume whitespace.  Return the number of bytes eaten */
! int
! erlang_white (s, pos)
!      char *s;
!      int pos;
! {
!   int origpos;
! 
!   origpos = pos;
! 
!   while (isspace (s[pos]))
!     pos++;
! 
!   return pos - origpos;
  }
  
*************** skip_comment (plb, inf, plineno, plinech
*** 3371,3375 ****
  /* Take a string like "/blah/" and turn it into "blah", making sure
     that the first and last characters are the same, and handling
!    quoted separator characters.  Actually, stops on the occurence of
     an unquoted separator.  Also turns "\t" into a Tab character.
     Returns pointer to terminating separator.  Works in place.  Null
--- 3878,3882 ----
  /* Take a string like "/blah/" and turn it into "blah", making sure
     that the first and last characters are the same, and handling
!    quoted separator characters.  Actually, stops on the occurrence of
     an unquoted separator.  Also turns "\t" into a Tab character.
     Returns pointer to terminating separator.  Works in place.  Null
*************** substitute (in, out, regs)
*** 3493,3497 ****
  	  if (!*t)
  	    {
! 	      fprintf (stderr, "%s: pattern subtitution ends prematurely\n",
  		       progname);
  	      return NULL;
--- 4000,4004 ----
  	  if (!*t)
  	    {
! 	      fprintf (stderr, "%s: pattern substitution ends prematurely\n",
  		       progname);
  	      return NULL;
*************** readline_internal (linebuffer, stream)
*** 3572,3575 ****
--- 4079,4083 ----
        if (c == EOF)
  	{
+ 	  *p = '\0';
  	  chars_deleted = 0;
  	  break;
*************** readline (linebuffer, stream)
*** 3605,3612 ****
  {
    /* Read new line. */
-   int i;
    long result = readline_internal (linebuffer, stream);
- 
  #ifdef ETAGS_REGEXPS
    /* Match against all listed patterns. */
    for (i = 0; i < num_patterns; ++i)
--- 4113,4120 ----
  {
    /* Read new line. */
    long result = readline_internal (linebuffer, stream);
  #ifdef ETAGS_REGEXPS
+   int i;
+ 
    /* Match against all listed patterns. */
    for (i = 0; i < num_patterns; ++i)
*************** just_read_file (inf)
*** 3661,3664 ****
--- 4169,4175 ----
       FILE *inf;
  {
+   lineno = 0;
+   charno = 0;
+ 
    while (!feof (inf))
      {
*************** pfatal (s1)
*** 3755,3758 ****
--- 4266,4277 ----
  }
  
+ void
+ suggest_asking_for_help ()
+ {
+   fprintf (stderr, "\tTry `%s --help' for a complete list of options.\n",
+ 	   progname);
+   exit (BAD);
+ }
+ 
  /* Print error message.  `s1' is printf control string, `s2' is arg for it. */
  void
*************** etags_getcwd ()
*** 3791,3800 ****
  
    getwd (path);
!   p = path;
!   while (*p)
      if (*p == '\\')
!       *p++ = '/';
      else
!       *p++ = lowcase (*p);
  
    return strdup (path);
--- 4310,4318 ----
  
    getwd (path);
!   for (p = path; *p != '\0'; p++)
      if (*p == '\\')
!       *p = '/';
      else
!       *p = lowcase (*p);
  
    return strdup (path);
*************** absolute_filename (file, cwd)
*** 3876,3879 ****
--- 4394,4403 ----
    if (absolutefn (file))
      res = concat (file, "", "");
+ #ifdef DOS_NT
+   /* We don't support non-absolute filenames with a drive
+      letter, like `d:NAME' (it's too much hassle).  */
+   else if (file[1] == ':')
+     fatal ("%s: relative filenames with drive letters not supported", file);
+ #endif
    else
      res = concat (cwd, file, "");
*************** absolute_filename (file, cwd)
*** 3891,3899 ****
  	      do
  		cp--;
! 	      while (cp >= res && *cp != '/');
  	      if (*cp == '/')
  		{
  		  strcpy (cp, slashp + 3);
  		}
  	      else		/* else (cp == res) */
  		{
--- 4415,4430 ----
  	      do
  		cp--;
! 	      while (cp >= res && !absolutefn (cp));
  	      if (*cp == '/')
  		{
  		  strcpy (cp, slashp + 3);
  		}
+ #ifdef DOS_NT
+ 	      /* Under MSDOS and NT we get `d:/NAME' as absolute
+ 		 filename, so the luser could say `d:/../NAME'.
+ 		 We silently treat this as `d:/NAME'.  */
+ 	      else if (cp[1] == ':')
+ 		strcpy (cp + 3, slashp + 4);
+ #endif
  	      else		/* else (cp == res) */
  		{
*************** absolute_dirname (file, cwd)
*** 3928,3931 ****
--- 4459,4469 ----
    char *slashp, *res;
    char save;
+ #ifdef DOS_NT
+   char *p;
+ 
+   for (p = file; *p != '\0'; p++)
+     if (*p == '\\')
+       *p = '/';
+ #endif
  
    slashp = etags_strrchr (file, '/');
diff -2rcpP --exclude=*.elc emacs-19.30/lib-src/fakemail.c emacs-19.31/lib-src/fakemail.c
*** emacs-19.30/lib-src/fakemail.c	Sat Aug 12 14:14:41 1995
--- emacs-19.31/lib-src/fakemail.c	Sun Apr 28 14:25:12 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** main ()
*** 48,51 ****
--- 49,56 ----
  #undef open
  #undef close
+ #endif
+ 
+ #ifdef WINDOWSNT
+ #include "ntlib.h"
  #endif
  
diff -2rcpP --exclude=*.elc emacs-19.30/lib-src/getdate.c emacs-19.31/lib-src/getdate.c
*** emacs-19.30/lib-src/getdate.c	Wed Nov 22 10:39:44 1995
--- emacs-19.31/lib-src/getdate.c	Tue Apr  9 17:18:04 1996
***************
*** 1,4 ****
  
! /*  A Bison parser, made from getdate.y with Bison version GNU Bison version 1.22
    */
  
--- 1,5 ----
  
! /*  A Bison parser, made from getdate.y
!  by  Bison version A2.5 (Andrew Consortium)
    */
  
*************** static int yyerror ();
*** 116,119 ****
--- 117,121 ----
  
  #define EPOCH		1970
+ #define DOOMSDAY	2038
  #define HOUR(x)		((time_t)(x) * 60)
  #define SECSPERDAY	(24L * 60L * 60L)
*************** static time_t	yyRelSeconds;
*** 173,198 ****
  
  
! #line 155 "getdate.y"
  typedef union {
      time_t		Number;
      enum _MERIDIAN	Meridian;
  } YYSTYPE;
- 
- #ifndef YYLTYPE
- typedef
-   struct yyltype
-     {
-       int timestamp;
-       int first_line;
-       int first_column;
-       int last_line;
-       int last_column;
-       char *text;
-    }
-   yyltype;
- 
- #define YYLTYPE yyltype
- #endif
- 
  #include <stdio.h>
  
--- 175,183 ----
  
  
! #line 156 "getdate.y"
  typedef union {
      time_t		Number;
      enum _MERIDIAN	Meridian;
  } YYSTYPE;
  #include <stdio.h>
  
*************** static const short yyrhs[] = {    -1,
*** 270,284 ****
  #if YYDEBUG != 0
  static const short yyrline[] = { 0,
!    169,   170,   173,   176,   179,   182,   185,   188,   191,   197,
!    203,   210,   216,   226,   230,   234,   241,   245,   249,   255,
!    259,   264,   270,   276,   280,   285,   289,   296,   300,   303,
!    306,   309,   312,   315,   318,   321,   324,   327,   332,   359,
!    362
  };
  
! static const char * const yytname[] = {   "$","error","$illegal.","tAGO","tDAY",
  "tDAYZONE","tID","tMERIDIAN","tMINUTE_UNIT","tMONTH","tMONTH_UNIT","tSEC_UNIT",
  "tSNUMBER","tUNUMBER","tZONE","tDST","':'","','","'/'","spec","item","time",
! "zone","day","date","rel","relunit","number","o_merid",""
  };
  #endif
--- 255,273 ----
  #if YYDEBUG != 0
  static const short yyrline[] = { 0,
!    170,   171,   174,   177,   180,   183,   186,   189,   192,   198,
!    204,   211,   217,   227,   231,   235,   242,   246,   250,   256,
!    260,   265,   271,   277,   281,   286,   290,   297,   301,   304,
!    307,   310,   313,   316,   319,   322,   325,   328,   333,   360,
!    363
  };
+ #endif
  
! 
! #if YYDEBUG != 0
! 
! static const char * const yytname[] = {   "$","error","$undefined.","tAGO","tDAY",
  "tDAYZONE","tID","tMERIDIAN","tMINUTE_UNIT","tMONTH","tMONTH_UNIT","tSEC_UNIT",
  "tSNUMBER","tUNUMBER","tZONE","tDST","':'","','","'/'","spec","item","time",
! "zone","day","date","rel","relunit","number","o_merid", NULL
  };
  #endif
*************** static const short yycheck[] = {     0,
*** 346,357 ****
  };
  /* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
! #line 3 "/usr/local/lib/bison.simple"
  
  /* Skeleton output parser for bison,
!    Copyright (C) 1984, 1989, 1990 Bob Corbett and Richard Stallman
  
     This program 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.
  
--- 335,346 ----
  };
  /* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
! #line 3 "/usr/share/bison.simple"
  
  /* Skeleton output parser for bison,
!    Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc.
  
     This program 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.
  
*************** static const short yycheck[] = {     0,
*** 365,368 ****
--- 354,361 ----
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
  
+ /* As a special exception, when this file is copied by Bison into a
+    Bison output file, you may use that output file without restriction.
+    This special exception was added by the Free Software Foundation
+    in version 1.24 of Bison.  */
  
  #ifndef alloca
*************** while (0)
*** 438,445 ****
--- 431,446 ----
  #ifdef YYPURE
  #ifdef YYLSP_NEEDED
+ #ifdef YYLEX_PARAM
+ #define YYLEX		yylex(&yylval, &yylloc, YYLEX_PARAM)
+ #else
  #define YYLEX		yylex(&yylval, &yylloc)
+ #endif
+ #else /* not YYLSP_NEEDED */
+ #ifdef YYLEX_PARAM
+ #define YYLEX		yylex(&yylval, YYLEX_PARAM)
  #else
  #define YYLEX		yylex(&yylval)
  #endif
+ #endif /* not YYLSP_NEEDED */
  #endif
  
*************** int yyparse (void);
*** 489,493 ****
  
  #if __GNUC__ > 1		/* GNU C and GNU C++ define this.  */
! #define __yy_bcopy(FROM,TO,COUNT)	__builtin_memcpy(TO,FROM,COUNT)
  #else				/* not GNU C or C++ */
  #ifndef __cplusplus
--- 490,494 ----
  
  #if __GNUC__ > 1		/* GNU C and GNU C++ define this.  */
! #define __yy_memcpy(FROM,TO,COUNT)	__builtin_memcpy(TO,FROM,COUNT)
  #else				/* not GNU C or C++ */
  #ifndef __cplusplus
*************** int yyparse (void);
*** 496,500 ****
     in available built-in functions on various systems.  */
  static void
! __yy_bcopy (from, to, count)
       char *from;
       char *to;
--- 497,501 ----
     in available built-in functions on various systems.  */
  static void
! __yy_memcpy (from, to, count)
       char *from;
       char *to;
*************** __yy_bcopy (from, to, count)
*** 514,518 ****
     in available built-in functions on various systems.  */
  static void
! __yy_bcopy (char *from, char *to, int count)
  {
    register char *f = from;
--- 515,519 ----
     in available built-in functions on various systems.  */
  static void
! __yy_memcpy (char *from, char *to, int count)
  {
    register char *f = from;
*************** __yy_bcopy (char *from, char *to, int co
*** 527,531 ****
  #endif
  
! #line 184 "/usr/local/lib/bison.simple"
  
  /* The user can define YYPARSE_PARAM as the name of an argument to be passed
--- 528,532 ----
  #endif
  
! #line 192 "/usr/share/bison.simple"
  
  /* The user can define YYPARSE_PARAM as the name of an argument to be passed
*************** yynewstate:
*** 660,669 ****
  	yystacksize = YYMAXDEPTH;
        yyss = (short *) alloca (yystacksize * sizeof (*yyssp));
!       __yy_bcopy ((char *)yyss1, (char *)yyss, size * sizeof (*yyssp));
        yyvs = (YYSTYPE *) alloca (yystacksize * sizeof (*yyvsp));
!       __yy_bcopy ((char *)yyvs1, (char *)yyvs, size * sizeof (*yyvsp));
  #ifdef YYLSP_NEEDED
        yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp));
!       __yy_bcopy ((char *)yyls1, (char *)yyls, size * sizeof (*yylsp));
  #endif
  #endif /* no yyoverflow */
--- 661,670 ----
  	yystacksize = YYMAXDEPTH;
        yyss = (short *) alloca (yystacksize * sizeof (*yyssp));
!       __yy_memcpy ((char *)yyss1, (char *)yyss, size * sizeof (*yyssp));
        yyvs = (YYSTYPE *) alloca (yystacksize * sizeof (*yyvsp));
!       __yy_memcpy ((char *)yyvs1, (char *)yyvs, size * sizeof (*yyvsp));
  #ifdef YYLSP_NEEDED
        yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp));
!       __yy_memcpy ((char *)yyls1, (char *)yyls, size * sizeof (*yylsp));
  #endif
  #endif /* no yyoverflow */
*************** yyreduce:
*** 826,830 ****
  
  case 3:
! #line 173 "getdate.y"
  {
  	    yyHaveTime++;
--- 827,831 ----
  
  case 3:
! #line 174 "getdate.y"
  {
  	    yyHaveTime++;
*************** case 3:
*** 832,836 ****
      break;}
  case 4:
! #line 176 "getdate.y"
  {
  	    yyHaveZone++;
--- 833,837 ----
      break;}
  case 4:
! #line 177 "getdate.y"
  {
  	    yyHaveZone++;
*************** case 4:
*** 838,842 ****
      break;}
  case 5:
! #line 179 "getdate.y"
  {
  	    yyHaveDate++;
--- 839,843 ----
      break;}
  case 5:
! #line 180 "getdate.y"
  {
  	    yyHaveDate++;
*************** case 5:
*** 844,848 ****
      break;}
  case 6:
! #line 182 "getdate.y"
  {
  	    yyHaveDay++;
--- 845,849 ----
      break;}
  case 6:
! #line 183 "getdate.y"
  {
  	    yyHaveDay++;
*************** case 6:
*** 850,854 ****
      break;}
  case 7:
! #line 185 "getdate.y"
  {
  	    yyHaveRel++;
--- 851,855 ----
      break;}
  case 7:
! #line 186 "getdate.y"
  {
  	    yyHaveRel++;
*************** case 7:
*** 856,860 ****
      break;}
  case 9:
! #line 191 "getdate.y"
  {
  	    yyHour = yyvsp[-1].Number;
--- 857,861 ----
      break;}
  case 9:
! #line 192 "getdate.y"
  {
  	    yyHour = yyvsp[-1].Number;
*************** case 9:
*** 865,869 ****
      break;}
  case 10:
! #line 197 "getdate.y"
  {
  	    yyHour = yyvsp[-3].Number;
--- 866,870 ----
      break;}
  case 10:
! #line 198 "getdate.y"
  {
  	    yyHour = yyvsp[-3].Number;
*************** case 10:
*** 874,878 ****
      break;}
  case 11:
! #line 203 "getdate.y"
  {
  	    yyHour = yyvsp[-3].Number;
--- 875,879 ----
      break;}
  case 11:
! #line 204 "getdate.y"
  {
  	    yyHour = yyvsp[-3].Number;
*************** case 11:
*** 884,888 ****
      break;}
  case 12:
! #line 210 "getdate.y"
  {
  	    yyHour = yyvsp[-5].Number;
--- 885,889 ----
      break;}
  case 12:
! #line 211 "getdate.y"
  {
  	    yyHour = yyvsp[-5].Number;
*************** case 12:
*** 893,897 ****
      break;}
  case 13:
! #line 216 "getdate.y"
  {
  	    yyHour = yyvsp[-5].Number;
--- 894,898 ----
      break;}
  case 13:
! #line 217 "getdate.y"
  {
  	    yyHour = yyvsp[-5].Number;
*************** case 13:
*** 904,908 ****
      break;}
  case 14:
! #line 226 "getdate.y"
  {
  	    yyTimezone = yyvsp[0].Number;
--- 905,909 ----
      break;}
  case 14:
! #line 227 "getdate.y"
  {
  	    yyTimezone = yyvsp[0].Number;
*************** case 14:
*** 911,915 ****
      break;}
  case 15:
! #line 230 "getdate.y"
  {
  	    yyTimezone = yyvsp[0].Number;
--- 912,916 ----
      break;}
  case 15:
! #line 231 "getdate.y"
  {
  	    yyTimezone = yyvsp[0].Number;
*************** case 15:
*** 918,922 ****
      break;}
  case 16:
! #line 235 "getdate.y"
  {
  	    yyTimezone = yyvsp[-1].Number;
--- 919,923 ----
      break;}
  case 16:
! #line 236 "getdate.y"
  {
  	    yyTimezone = yyvsp[-1].Number;
*************** case 16:
*** 925,929 ****
      break;}
  case 17:
! #line 241 "getdate.y"
  {
  	    yyDayOrdinal = 1;
--- 926,930 ----
      break;}
  case 17:
! #line 242 "getdate.y"
  {
  	    yyDayOrdinal = 1;
*************** case 17:
*** 932,936 ****
      break;}
  case 18:
! #line 245 "getdate.y"
  {
  	    yyDayOrdinal = 1;
--- 933,937 ----
      break;}
  case 18:
! #line 246 "getdate.y"
  {
  	    yyDayOrdinal = 1;
*************** case 18:
*** 939,943 ****
      break;}
  case 19:
! #line 249 "getdate.y"
  {
  	    yyDayOrdinal = yyvsp[-1].Number;
--- 940,944 ----
      break;}
  case 19:
! #line 250 "getdate.y"
  {
  	    yyDayOrdinal = yyvsp[-1].Number;
*************** case 19:
*** 946,950 ****
      break;}
  case 20:
! #line 255 "getdate.y"
  {
  	    yyMonth = yyvsp[-2].Number;
--- 947,951 ----
      break;}
  case 20:
! #line 256 "getdate.y"
  {
  	    yyMonth = yyvsp[-2].Number;
*************** case 20:
*** 953,957 ****
      break;}
  case 21:
! #line 259 "getdate.y"
  {
  	    yyMonth = yyvsp[-4].Number;
--- 954,958 ----
      break;}
  case 21:
! #line 260 "getdate.y"
  {
  	    yyMonth = yyvsp[-4].Number;
*************** case 21:
*** 961,965 ****
      break;}
  case 22:
! #line 264 "getdate.y"
  {
  	    /* ISO 8601 format.  yyyy-mm-dd.  */
--- 962,966 ----
      break;}
  case 22:
! #line 265 "getdate.y"
  {
  	    /* ISO 8601 format.  yyyy-mm-dd.  */
*************** case 22:
*** 970,974 ****
      break;}
  case 23:
! #line 270 "getdate.y"
  {
  	    /* e.g. 17-JUN-1992.  */
--- 971,975 ----
      break;}
  case 23:
! #line 271 "getdate.y"
  {
  	    /* e.g. 17-JUN-1992.  */
*************** case 23:
*** 979,983 ****
      break;}
  case 24:
! #line 276 "getdate.y"
  {
  	    yyMonth = yyvsp[-1].Number;
--- 980,984 ----
      break;}
  case 24:
! #line 277 "getdate.y"
  {
  	    yyMonth = yyvsp[-1].Number;
*************** case 24:
*** 986,990 ****
      break;}
  case 25:
! #line 280 "getdate.y"
  {
  	    yyMonth = yyvsp[-3].Number;
--- 987,991 ----
      break;}
  case 25:
! #line 281 "getdate.y"
  {
  	    yyMonth = yyvsp[-3].Number;
*************** case 25:
*** 994,998 ****
      break;}
  case 26:
! #line 285 "getdate.y"
  {
  	    yyMonth = yyvsp[0].Number;
--- 995,999 ----
      break;}
  case 26:
! #line 286 "getdate.y"
  {
  	    yyMonth = yyvsp[0].Number;
*************** case 26:
*** 1001,1005 ****
      break;}
  case 27:
! #line 289 "getdate.y"
  {
  	    yyMonth = yyvsp[-1].Number;
--- 1002,1006 ----
      break;}
  case 27:
! #line 290 "getdate.y"
  {
  	    yyMonth = yyvsp[-1].Number;
*************** case 27:
*** 1009,1013 ****
      break;}
  case 28:
! #line 296 "getdate.y"
  {
  	    yyRelSeconds = -yyRelSeconds;
--- 1010,1014 ----
      break;}
  case 28:
! #line 297 "getdate.y"
  {
  	    yyRelSeconds = -yyRelSeconds;
*************** case 28:
*** 1016,1020 ****
      break;}
  case 30:
! #line 303 "getdate.y"
  {
  	    yyRelSeconds += yyvsp[-1].Number * yyvsp[0].Number * 60L;
--- 1017,1021 ----
      break;}
  case 30:
! #line 304 "getdate.y"
  {
  	    yyRelSeconds += yyvsp[-1].Number * yyvsp[0].Number * 60L;
*************** case 30:
*** 1022,1026 ****
      break;}
  case 31:
! #line 306 "getdate.y"
  {
  	    yyRelSeconds += yyvsp[-1].Number * yyvsp[0].Number * 60L;
--- 1023,1027 ----
      break;}
  case 31:
! #line 307 "getdate.y"
  {
  	    yyRelSeconds += yyvsp[-1].Number * yyvsp[0].Number * 60L;
*************** case 31:
*** 1028,1032 ****
      break;}
  case 32:
! #line 309 "getdate.y"
  {
  	    yyRelSeconds += yyvsp[0].Number * 60L;
--- 1029,1033 ----
      break;}
  case 32:
! #line 310 "getdate.y"
  {
  	    yyRelSeconds += yyvsp[0].Number * 60L;
*************** case 32:
*** 1034,1038 ****
      break;}
  case 33:
! #line 312 "getdate.y"
  {
  	    yyRelSeconds += yyvsp[-1].Number;
--- 1035,1039 ----
      break;}
  case 33:
! #line 313 "getdate.y"
  {
  	    yyRelSeconds += yyvsp[-1].Number;
*************** case 33:
*** 1040,1044 ****
      break;}
  case 34:
! #line 315 "getdate.y"
  {
  	    yyRelSeconds += yyvsp[-1].Number;
--- 1041,1045 ----
      break;}
  case 34:
! #line 316 "getdate.y"
  {
  	    yyRelSeconds += yyvsp[-1].Number;
*************** case 34:
*** 1046,1050 ****
      break;}
  case 35:
! #line 318 "getdate.y"
  {
  	    yyRelSeconds++;
--- 1047,1051 ----
      break;}
  case 35:
! #line 319 "getdate.y"
  {
  	    yyRelSeconds++;
*************** case 35:
*** 1052,1056 ****
      break;}
  case 36:
! #line 321 "getdate.y"
  {
  	    yyRelMonth += yyvsp[-1].Number * yyvsp[0].Number;
--- 1053,1057 ----
      break;}
  case 36:
! #line 322 "getdate.y"
  {
  	    yyRelMonth += yyvsp[-1].Number * yyvsp[0].Number;
*************** case 36:
*** 1058,1062 ****
      break;}
  case 37:
! #line 324 "getdate.y"
  {
  	    yyRelMonth += yyvsp[-1].Number * yyvsp[0].Number;
--- 1059,1063 ----
      break;}
  case 37:
! #line 325 "getdate.y"
  {
  	    yyRelMonth += yyvsp[-1].Number * yyvsp[0].Number;
*************** case 37:
*** 1064,1068 ****
      break;}
  case 38:
! #line 327 "getdate.y"
  {
  	    yyRelMonth += yyvsp[0].Number;
--- 1065,1069 ----
      break;}
  case 38:
! #line 328 "getdate.y"
  {
  	    yyRelMonth += yyvsp[0].Number;
*************** case 38:
*** 1070,1074 ****
      break;}
  case 39:
! #line 332 "getdate.y"
  {
  	    if (yyHaveTime && yyHaveDate && !yyHaveRel)
--- 1071,1075 ----
      break;}
  case 39:
! #line 333 "getdate.y"
  {
  	    if (yyHaveTime && yyHaveDate && !yyHaveRel)
*************** case 39:
*** 1098,1102 ****
      break;}
  case 40:
! #line 359 "getdate.y"
  {
  	    yyval.Meridian = MER24;
--- 1099,1103 ----
      break;}
  case 40:
! #line 360 "getdate.y"
  {
  	    yyval.Meridian = MER24;
*************** case 40:
*** 1104,1108 ****
      break;}
  case 41:
! #line 362 "getdate.y"
  {
  	    yyval.Meridian = yyvsp[0].Meridian;
--- 1105,1109 ----
      break;}
  case 41:
! #line 363 "getdate.y"
  {
  	    yyval.Meridian = yyvsp[0].Meridian;
*************** case 41:
*** 1111,1115 ****
  }
     /* the action file gets copied in in place of this dollarsign */
! #line 480 "/usr/local/lib/bison.simple"
  
    yyvsp -= yylen;
--- 1112,1116 ----
  }
     /* the action file gets copied in in place of this dollarsign */
! #line 487 "/usr/share/bison.simple"
  
    yyvsp -= yylen;
*************** yyerrhandle:
*** 1307,1311 ****
    goto yynewstate;
  }
! #line 367 "getdate.y"
  
  
--- 1308,1312 ----
    goto yynewstate;
  }
! #line 368 "getdate.y"
  
  
*************** Convert (Month, Day, Year, Hours, Minute
*** 1560,1568 ****
    if (Year < 0)
      Year = -Year;
!   if (Year < 100)
      Year += 1900;
    DaysInMonth[1] = Year % 4 == 0 && (Year % 100 != 0 || Year % 400 == 0)
      ? 29 : 28;
!   if (Year < EPOCH || Year > 1999
        || Month < 1 || Month > 12
        /* Lint fluff:  "conversion from long may lose accuracy" */
--- 1561,1571 ----
    if (Year < 0)
      Year = -Year;
!   if (Year < DOOMSDAY-2000)
!     Year += 2000;
!   else if (Year < 100)
      Year += 1900;
    DaysInMonth[1] = Year % 4 == 0 && (Year % 100 != 0 || Year % 400 == 0)
      ? 29 : 28;
!   if (Year < EPOCH || Year >= DOOMSDAY
        || Month < 1 || Month > 12
        /* Lint fluff:  "conversion from long may lose accuracy" */
*************** RelativeMonth (Start, RelMonth)
*** 1629,1633 ****
      return 0;
    tm = localtime (&Start);
!   Month = 12 * tm->tm_year + tm->tm_mon + RelMonth;
    Year = Month / 12;
    Month = Month % 12 + 1;
--- 1632,1636 ----
      return 0;
    tm = localtime (&Start);
!   Month = 12 * (1900 + tm->tm_year) + tm->tm_mon + RelMonth;
    Year = Month / 12;
    Month = Month % 12 + 1;
diff -2rcpP --exclude=*.elc emacs-19.30/lib-src/getdate.y emacs-19.31/lib-src/getdate.y
*** emacs-19.30/lib-src/getdate.y	Tue Nov 21 16:59:08 1995
--- emacs-19.31/lib-src/getdate.y	Sat Mar  9 23:51:47 1996
*************** static int yyerror ();
*** 95,98 ****
--- 95,99 ----
  
  #define EPOCH		1970
+ #define DOOMSDAY	2038
  #define HOUR(x)		((time_t)(x) * 60)
  #define SECSPERDAY	(24L * 60L * 60L)
*************** Convert (Month, Day, Year, Hours, Minute
*** 617,625 ****
    if (Year < 0)
      Year = -Year;
!   if (Year < 100)
      Year += 1900;
    DaysInMonth[1] = Year % 4 == 0 && (Year % 100 != 0 || Year % 400 == 0)
      ? 29 : 28;
!   if (Year < EPOCH || Year > 1999
        || Month < 1 || Month > 12
        /* Lint fluff:  "conversion from long may lose accuracy" */
--- 618,628 ----
    if (Year < 0)
      Year = -Year;
!   if (Year < DOOMSDAY-2000)
!     Year += 2000;
!   else if (Year < 100)
      Year += 1900;
    DaysInMonth[1] = Year % 4 == 0 && (Year % 100 != 0 || Year % 400 == 0)
      ? 29 : 28;
!   if (Year < EPOCH || Year >= DOOMSDAY
        || Month < 1 || Month > 12
        /* Lint fluff:  "conversion from long may lose accuracy" */
*************** RelativeMonth (Start, RelMonth)
*** 686,690 ****
      return 0;
    tm = localtime (&Start);
!   Month = 12 * tm->tm_year + tm->tm_mon + RelMonth;
    Year = Month / 12;
    Month = Month % 12 + 1;
--- 689,693 ----
      return 0;
    tm = localtime (&Start);
!   Month = 12 * (1900 + tm->tm_year) + tm->tm_mon + RelMonth;
    Year = Month / 12;
    Month = Month % 12 + 1;
diff -2rcpP --exclude=*.elc emacs-19.30/lib-src/getopt.c emacs-19.31/lib-src/getopt.c
*** emacs-19.30/lib-src/getopt.c	Sat Sep 30 14:02:40 1995
--- emacs-19.31/lib-src/getopt.c	Wed May 22 17:44:40 1996
***************
*** 4,8 ****
     before changing it!
  
!    Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94, 95
     	Free Software Foundation, Inc.
  
--- 4,8 ----
     before changing it!
  
!    Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94, 95, 1996
     	Free Software Foundation, Inc.
  
***************
*** 19,23 ****
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
!    Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  
  /* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>.
--- 19,24 ----
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
!    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
!    USA.  */
  
  /* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>.
***************
*** 58,63 ****
--- 59,78 ----
     contain conflicting prototypes for getopt.  */
  #include <stdlib.h>
+ #include <unistd.h>
  #endif	/* GNU C library.  */
  
+ #ifdef VMS
+ #include <unixlib.h>
+ #if HAVE_STRING_H - 0
+ #include <string.h>
+ #endif
+ #endif
+ 
+ #ifdef WIN32
+ /* It's not Unix, really.  See?  Capital letters.  */
+ #include <windows.h>
+ #define getpid() GetCurrentProcessId()
+ #endif
+ 
  #ifndef _
  /* This is for other GNU distributions with internationalized messages.
*************** static int first_nonopt;
*** 218,221 ****
--- 233,242 ----
  static int last_nonopt;
  
+ /* Bash 2.0 gives us an environment variable containing flags
+    indicating ARGV elements that should not be considered arguments.  */
+ 
+ static const char *nonoption_flags;
+ static int nonoption_flags_len;
+ 
  /* Exchange two adjacent subsequences of ARGV.
     One subsequence is elements [first_nonopt,last_nonopt)
*************** static int last_nonopt;
*** 227,230 ****
--- 248,255 ----
     the new indices of the non-options in ARGV after they are moved.  */
  
+ #if defined (__STDC__) && __STDC__
+ static void exchange (char **);
+ #endif
+ 
  static void
  exchange (argv)
*************** exchange (argv)
*** 285,288 ****
--- 310,316 ----
  /* Initialize the internal data when the first call is made.  */
  
+ #if defined (__STDC__) && __STDC__
+ static const char *_getopt_initialize (const char *);
+ #endif
  static const char *
  _getopt_initialize (optstring)
*************** _getopt_initialize (optstring)
*** 316,319 ****
--- 344,362 ----
      ordering = PERMUTE;
  
+   if (posixly_correct == NULL)
+     {
+       /* Bash 2.0 puts a special variable in the environment for each
+ 	 command it runs, specifying which ARGV elements are the results of
+ 	 file name wildcard expansion and therefore should not be
+ 	 considered as options.  */
+       char var[100];
+       sprintf (var, "_%d_GNU_nonoption_argv_flags_", getpid ());
+       nonoption_flags = getenv (var);
+       if (nonoption_flags == NULL)
+ 	nonoption_flags_len = 0;
+       else
+ 	nonoption_flags_len = strlen (nonoption_flags);
+     }
+ 
    return optstring;
  }
*************** _getopt_internal (argc, argv, optstring,
*** 392,399 ****
--- 435,456 ----
      }
  
+   /* Test whether ARGV[optind] points to a non-option argument.
+      Either it does not have option syntax, or there is an environment flag
+      from the shell indicating it is not an option.  */
+ #define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0'	      \
+ 		     || (optind < nonoption_flags_len			      \
+ 			 && nonoption_flags[optind] == '1'))
+ 
    if (nextchar == NULL || *nextchar == '\0')
      {
        /* Advance to the next ARGV-element.  */
  
+       /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been
+ 	 moved back by the user (who may also have changed the arguments).  */
+       if (last_nonopt > optind)
+ 	last_nonopt = optind;
+       if (first_nonopt > optind)
+ 	first_nonopt = optind;
+ 
        if (ordering == PERMUTE)
  	{
*************** _getopt_internal (argc, argv, optstring,
*** 409,414 ****
  	     and extend the range of non-options previously skipped.  */
  
! 	  while (optind < argc
! 		 && (argv[optind][0] != '-' || argv[optind][1] == '\0'))
  	    optind++;
  	  last_nonopt = optind;
--- 466,470 ----
  	     and extend the range of non-options previously skipped.  */
  
! 	  while (optind < argc && NONOPTION_P)
  	    optind++;
  	  last_nonopt = optind;
*************** _getopt_internal (argc, argv, optstring,
*** 448,452 ****
  	 either stop the scan or describe it to the caller and pass it by.  */
  
!       if ((argv[optind][0] != '-' || argv[optind][1] == '\0'))
  	{
  	  if (ordering == REQUIRE_ORDER)
--- 504,508 ----
  	 either stop the scan or describe it to the caller and pass it by.  */
  
!       if (NONOPTION_P)
  	{
  	  if (ordering == REQUIRE_ORDER)
*************** _getopt_internal (argc, argv, optstring,
*** 524,527 ****
--- 580,584 ----
  	  nextchar += strlen (nextchar);
  	  optind++;
+ 	  optopt = 0;
  	  return '?';
  	}
*************** _getopt_internal (argc, argv, optstring,
*** 552,555 ****
--- 609,614 ----
  
  		  nextchar += strlen (nextchar);
+ 
+ 		  optopt = pfound->val;
  		  return '?';
  		}
*************** _getopt_internal (argc, argv, optstring,
*** 566,569 ****
--- 625,629 ----
  			   argv[0], argv[optind - 1]);
  		  nextchar += strlen (nextchar);
+ 		  optopt = pfound->val;
  		  return optstring[0] == ':' ? ':' : '?';
  		}
*************** _getopt_internal (argc, argv, optstring,
*** 600,603 ****
--- 660,664 ----
  	  nextchar = (char *) "";
  	  optind++;
+ 	  optopt = 0;
  	  return '?';
  	}
diff -2rcpP --exclude=*.elc emacs-19.30/lib-src/getopt.h emacs-19.31/lib-src/getopt.h
*** emacs-19.30/lib-src/getopt.h	Mon Oct 31 07:10:42 1994
--- emacs-19.31/lib-src/getopt.h	Mon Jan 29 17:13:38 1996
***************
*** 14,18 ****
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
!    Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  
  #ifndef _GETOPT_H
--- 14,19 ----
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
!    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
!    USA.  */
  
  #ifndef _GETOPT_H
diff -2rcpP --exclude=*.elc emacs-19.30/lib-src/getopt1.c emacs-19.31/lib-src/getopt1.c
*** emacs-19.30/lib-src/getopt1.c	Mon Oct 31 07:08:37 1994
--- emacs-19.31/lib-src/getopt1.c	Tue Apr  9 17:18:39 1996
***************
*** 15,19 ****
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
!    Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  
  #ifdef HAVE_CONFIG_H
--- 15,20 ----
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
!    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
!    USA.  */
  
  #ifdef HAVE_CONFIG_H
diff -2rcpP --exclude=*.elc emacs-19.30/lib-src/hexl.c emacs-19.31/lib-src/hexl.c
*** emacs-19.30/lib-src/hexl.c	Wed Oct 12 16:27:01 1994
--- emacs-19.31/lib-src/hexl.c	Sun Apr 28 14:25:14 1996
***************
*** 1,6 ****
  #include <stdio.h>
  #include <ctype.h>
! #ifdef MSDOS
  #include <fcntl.h>
  #endif
  
--- 1,12 ----
  #include <stdio.h>
  #include <ctype.h>
! #ifdef DOS_NT
  #include <fcntl.h>
+ #if __DJGPP__ >= 2
+ #include <io.h>
+ #endif
+ #endif
+ #ifdef WINDOWSNT
+ #include <io.h>
  #endif
  
*************** main (argc, argv)
*** 134,141 ****
  	  char buf[18];
  
! #ifdef MSDOS
  	  (stdout)->_flag &= ~_IOTEXT; /* print binary */
  	  _setmode (fileno (stdout), O_BINARY);
  #endif
  	  for (;;)
  	    {
--- 140,152 ----
  	  char buf[18];
  
! #ifdef DOS_NT
! #if (__DJGPP__ >= 2) || (defined WINDOWSNT)
!           if (!isatty (fileno (stdout)))
! 	    setmode (fileno (stdout), O_BINARY);
! #else
  	  (stdout)->_flag &= ~_IOTEXT; /* print binary */
  	  _setmode (fileno (stdout), O_BINARY);
  #endif
+ #endif
  	  for (;;)
  	    {
*************** main (argc, argv)
*** 178,184 ****
        else
  	{
! #ifdef MSDOS
  	  (fp)->_flag &= ~_IOTEXT; /* read binary */
  	  _setmode (fileno (fp), O_BINARY);
  #endif
  	  address = 0;
--- 189,200 ----
        else
  	{
! #ifdef DOS_NT
! #if (__DJGPP__ >= 2) || (defined WINDOWSNT)
!           if (!isatty (fileno (fp)))
! 	    setmode (fileno (fp), O_BINARY);
! #else
  	  (fp)->_flag &= ~_IOTEXT; /* read binary */
  	  _setmode (fileno (fp), O_BINARY);
+ #endif
  #endif
  	  address = 0;
diff -2rcpP --exclude=*.elc emacs-19.30/lib-src/make-docfile.c emacs-19.31/lib-src/make-docfile.c
*** emacs-19.30/lib-src/make-docfile.c	Wed Jun 21 15:46:25 1995
--- emacs-19.31/lib-src/make-docfile.c	Tue Apr  9 19:41:44 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  You should have received a copy of the GNU General Public License
  along with GNU Emacs; see the file COPYING.  If not, write to
! the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  
  /* The arguments given to this program are all the C and Lisp source files
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* The arguments given to this program are all the C and Lisp source files
diff -2rcpP --exclude=*.elc emacs-19.30/lib-src/makefile.nt emacs-19.31/lib-src/makefile.nt
*** emacs-19.30/lib-src/makefile.nt	Wed Nov 22 13:52:43 1995
--- emacs-19.31/lib-src/makefile.nt	Sat May 18 16:14:40 1996
***************
*** 25,33 ****
  !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 \
--- 25,31 ----
  !include ..\nt\makefile.def
  
! LOCAL_FLAGS	= -DWINDOWSNT -DDOS_NT -DSTDC_HEADERS=1 -DNO_LDAV=1 -DNO_ARCHIVES=1 -I..\nt\inc -I..\src
  
! LINK_FLAGS	= $(ARCH_LDFLAGS) -debug:PARTIAL -machine:$(ARCH) -subsystem:console -entry:mainCRTStartup setargv.obj
  
  ALL	        = $(BLD)\make-docfile.exe \
*************** ALL	        = $(BLD)\make-docfile.exe \
*** 35,39 ****
  		$(BLD)\wakeup.exe	\
  		$(BLD)\ctags.exe	\
! 		$(BLD)\etags.exe
  
  		
--- 33,39 ----
  		$(BLD)\wakeup.exe	\
  		$(BLD)\ctags.exe	\
! 		$(BLD)\etags.exe	\
! 		$(BLD)\movemail.exe	\
! 		$(BLD)\fakemail.exe	\
  
  		
*************** ALL	        = $(BLD)\make-docfile.exe \
*** 44,50 ****
  #		$(BLD)\server.exe	\
  #		$(BLD)\emacstool.exe	\
- #		$(BLD)\fakemail.exe	\
  #		$(BLD)\leditcfns.exe	\
- #		$(BLD)\movemail.exe	\
  #		$(BLD)\emacsclient.exe	\
  #		$(BLD)\cvtmail.exe	\
--- 44,48 ----
*************** ALL	        = $(BLD)\make-docfile.exe \
*** 55,95 ****
  LIBS	      = $(BASE_LIBS)
  
! $(BLD)\make-docfile.exe: 	$(BLD)\make-docfile.obj
  $(BLD)\hexl.exe:		$(BLD)\hexl.obj
- $(BLD)\ctags.exe: 		$(BLD)\etags.exe
- 	copy $(BLD)\etags.exe $(BLD)\ctags.exe
  $(BLD)\wakeup.exe: 		$(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: 		$(ETAGSOBJ)
  		$(LINK) -out:$@ $(LINK_FLAGS) $(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
  
  #
--- 53,123 ----
  LIBS	      = $(BASE_LIBS)
  
! $(BLD)\make-docfile.exe: 	$(BLD)\make-docfile.obj $(BLD)\ntlib.obj
! 		$(LINK) -out:$@ $(LINK_FLAGS) $(BLD)\make-docfile.obj $(BLD)\ntlib.obj $(LIBS)
  $(BLD)\hexl.exe:		$(BLD)\hexl.obj
  $(BLD)\wakeup.exe: 		$(BLD)\wakeup.obj $(BLD)\ntlib.obj
  		$(LINK) -out:$@ $(LINK_FLAGS) $(BLD)\wakeup.obj $(BLD)\ntlib.obj $(LIBS)
! $(BLD)\movemail.exe: 		$(BLD)\movemail.obj $(BLD)\pop.obj $(BLD)\ntlib.obj
! 		$(LINK) -out:$@ $(LINK_FLAGS) -debug:FULL $(BLD)\movemail.obj $(BLD)\pop.obj $(BLD)\ntlib.obj $(LIBS) wsock32.lib
! $(BLD)\fakemail.exe: 		$(BLD)\fakemail.obj $(BLD)\ntlib.obj
! 		$(LINK) -out:$@ $(LINK_FLAGS) -debug:full $(BLD)\fakemail.obj $(BLD)\ntlib.obj $(LIBS)
! 
! make-docfile:	$(BLD) $(BLD)\make-docfile.exe
! wakeup:		$(BLD) $(BLD)\wakeup.exe
! etags:		$(BLD) $(BLD)\etags.exe
! hexl:		$(BLD) $(BLD)\hexl.exe
! movemail:	$(BLD) $(BLD)\movemail.exe
! fakemail:	$(BLD) $(BLD)\fakemail.exe
  
  ETAGSOBJ      = $(BLD)\etags.obj \
  		$(BLD)\getopt.obj \
  		$(BLD)\getopt1.obj \
! 		$(BLD)\ntlib.obj \
! 		$(BLD)\regex.obj \
! 		$(BLD)\alloca.obj
! 
  
! $(BLD)\etags.exe: 	$(ETAGSOBJ)
  		$(LINK) -out:$@ $(LINK_FLAGS) $(ETAGSOBJ) $(LIBS)
  
+ 
+ $(BLD)\regex.obj: ../src/regex.c ../src/regex.h ../src/config.h
+ 		$(CC)  $(CFLAGS) -DCONFIG_BROKETS -DINHIBIT_STRING_HEADER \
+ 		../src/regex.c -Fo$@
+ 
+ ETAGS_CFLAGS  = -DETAGS_REGEXPS
+ $(BLD)\etags.obj: etags.c
+ 		$(CC) $(CFLAGS) $(ETAGS_CFLAGS) -Fo$@ etags.c
+ 
+ CTAGSOBJ      = $(BLD)\ctags.obj \
+ 		$(BLD)\getopt.obj \
+ 		$(BLD)\getopt1.obj \
+ 		$(BLD)\ntlib.obj \
+ 		$(BLD)\regex.obj \
+ 		$(BLD)\alloca.obj
+ 
+ $(BLD)\ctags.exe:           ctags.c $(CTAGSOBJ)
+ 		$(LINK) -out:$@ $(LINK_FLAGS) $(CTAGSOBJ) $(LIBS)
+ 
+ ctags.c:	etags.c
+ 		- $(DEL) ctags.c
+ 		copy etags.c ctags.c
+ 
+ CTAGS_CFLAGS  = -DCTAGS $(ETAGS_CFLAGS)
+ $(BLD)\ctags.obj: ctags.c
+ 		$(CC) $(CFLAGS) $(CTAGS_CFLAGS) -Fo$@ ctags.c
+ 
  #
  # don't know what to do with these yet...
  #
! # $(BLD)\sorted-doc.exe: 	$(BLD)\sorted-doc.obj
! # $(BLD)\yow.exe: 		$(BLD)\yow.obj
! # $(BLD)\emacstool.exe: 	$(BLD)\emacstool.obj
! # $(BLD)\leditcfns.exe: 	$(BLD)\leditcfns.obj
! # $(BLD)\server.exe: 		$(BLD)\server.obj
! # $(BLD)\cvtmail.exe: 		$(BLD)\cvtmail.obj
! # $(BLD)\digest-doc.exe: 	$(BLD)\digest-doc.obj
! # $(BLD)\emacsclient.exe: 	$(BLD)\emacsclient.obj
! # $(BLD)\test-distrib.exe: 	$(BLD)\test-distrib.obj
  
  #
*************** lisp= \
*** 141,145 ****
  DOC	      = DOC 
  $(DOC):		$(BLD)\make-docfile.exe
! 		- del $(DOC)
  		$(BLD)\make-docfile -d ..\src $(obj) > $(DOC)
  		$(BLD)\make-docfile -d ..\src $(lisp) >> $(DOC)
--- 169,173 ----
  DOC	      = DOC 
  $(DOC):		$(BLD)\make-docfile.exe
! 		- $(DEL) $(DOC)
  		$(BLD)\make-docfile -d ..\src $(obj) > $(DOC)
  		$(BLD)\make-docfile -d ..\src $(lisp) >> $(DOC)
*************** install:	$(INSTALL_FILES)
*** 170,173 ****
--- 198,203 ----
  		$(CP) $(BLD)\hexl.exe $(INSTALL_DIR)\bin
  		$(CP) $(BLD)\wakeup.exe $(INSTALL_DIR)\bin
+ 		$(CP) $(BLD)\movemail.exe $(INSTALL_DIR)\bin
+ 		$(CP) $(BLD)\fakemail.exe $(INSTALL_DIR)\bin
  		- mkdir $(INSTALL_DIR)\etc
  		$(CP) $(DOC) $(INSTALL_DIR)\etc
*************** install:	$(INSTALL_FILES)
*** 176,183 ****
  # Maintenance
  # 
! clean:;		- del *~ *.pdb
  		- $(DEL_TREE) deleted
  		- $(DEL_TREE) obj
- 		- del DOC*
  
  #
--- 206,212 ----
  # Maintenance
  # 
! clean:;		- $(DEL) *~ *.pdb DOC*
  		- $(DEL_TREE) deleted
  		- $(DEL_TREE) obj
  
  #
*************** $(BLD)\etags.obj : \
*** 240,243 ****
--- 269,273 ----
  $(BLD)\fakemail.obj : \
  	$(SRC)\fakemail.c \
+ 	$(SRC)\ntlib.h \
  	$(EMACS_ROOT)\src\s\windowsnt.h \
  	$(EMACS_ROOT)\src\m\intel386.h \
*************** $(BLD)\movemail.obj : \
*** 288,291 ****
--- 318,332 ----
  	$(EMACS_ROOT)\lib-src\..\src\syswait.h \
  	$(EMACS_ROOT)\nt\inc\pwd.h
+ 		$(CC) $(CFLAGS) -DUSG -Fo$@ movemail.c
+ 
+ $(BLD)\ntlib.obj : \
+ 	$(SRC)\ntlib.c \
+ 	$(SRC)\ntlib.h \
+ 	$(EMACS_ROOT)\nt\inc\pwd.h
+ 
+ $(BLD)\pop.obj : \
+ 	$(SRC)\pop.c \
+ 	$(SRC)\pop.h \
+ 	$(SRC)\ntlib.h
  
  $(BLD)\profile.obj : \
diff -2rcpP --exclude=*.elc emacs-19.30/lib-src/movemail.c emacs-19.31/lib-src/movemail.c
*** emacs-19.30/lib-src/movemail.c	Sun Aug  6 19:57:25 1995
--- emacs-19.31/lib-src/movemail.c	Sun Apr 28 19:36:20 1996
***************
*** 1,5 ****
  /* movemail foo bar -- move file foo to file bar,
     locking file foo the way /bin/mail respects.
!    Copyright (C) 1986, 1992, 1993, 1994 Free Software Foundation, Inc.
  
  This file is part of GNU Emacs.
--- 1,5 ----
  /* movemail foo bar -- move file foo to file bar,
     locking file foo the way /bin/mail respects.
!    Copyright (C) 1986, 1992, 1993, 1994, 1996 Free Software Foundation, Inc.
  
  This file is part of GNU Emacs.
*************** GNU General Public License for more deta
*** 17,21 ****
  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.  */
  
  /* Important notice: defining MAIL_USE_FLOCK or MAIL_USE_LOCKF *will
--- 17,22 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* Important notice: defining MAIL_USE_FLOCK or MAIL_USE_LOCKF *will
*************** the Free Software Foundation, 675 Mass A
*** 34,38 ****
   * Modified January, 1986 by Michael R. Gretzinger (Project Athena)
   *
!  * Added POP (Post Office Protocol) service.  When compiled -DPOP
   * movemail will accept input filename arguments of the form
   * "po:username".  This will cause movemail to open a connection to
--- 35,39 ----
   * Modified January, 1986 by Michael R. Gretzinger (Project Athena)
   *
!  * Added POP (Post Office Protocol) service.  When compiled -DMAIL_USE_POP
   * movemail will accept input filename arguments of the form
   * "po:username".  This will cause movemail to open a connection to
*************** the Free Software Foundation, 675 Mass A
*** 70,73 ****
--- 71,94 ----
  #endif /* MSDOS */
  
+ #ifndef DIRECTORY_SEP
+ #define DIRECTORY_SEP '/'
+ #endif
+ #ifndef IS_DIRECTORY_SEP
+ #define IS_DIRECTORY_SEP(_c_) ((_c_) == DIRECTORY_SEP)
+ #endif
+ 
+ #ifdef WINDOWSNT
+ #undef access
+ #undef unlink
+ #define fork() 0
+ #define sys_wait(var) (*(var) = 0)
+ /* Unfortunately, Samba doesn't seem to properly lock Unix files even
+    though the locking call succeeds (and indeed blocks local access from
+    other NT programs).  If you have direct file access using an NFS
+    client or something other than Samba, the locking call might work
+    properly - make sure it does before you enable this! */
+ #define DISABLE_DIRECT_ACCESS
+ #endif /* WINDOWSNT */
+ 
  #ifdef USG
  #include <fcntl.h>
*************** the Free Software Foundation, 675 Mass A
*** 85,89 ****
  #endif
  
! #ifdef XENIX
  #include <sys/locking.h>
  #endif
--- 106,110 ----
  #endif
  
! #if defined (XENIX) || defined (WINDOWSNT)
  #include <sys/locking.h>
  #endif
*************** main (argc, argv)
*** 150,154 ****
    if (argc < 3)
      {
!       fprintf (stderr, "Usage: movemail inbox destfile\n");
        exit(1);
      }
--- 171,175 ----
    if (argc < 3)
      {
!       fprintf (stderr, "Usage: movemail inbox destfile [POP-password]\n");
        exit(1);
      }
*************** main (argc, argv)
*** 168,172 ****
      pfatal_with_name (outname);
  
!   /* Also check that outname's directory is writeable to the real uid.  */
    {
      char *buf = (char *) xmalloc (strlen (outname) + 1);
--- 189,193 ----
      pfatal_with_name (outname);
  
!   /* Also check that outname's directory is writable to the real uid.  */
    {
      char *buf = (char *) xmalloc (strlen (outname) + 1);
*************** main (argc, argv)
*** 174,178 ****
      strcpy (buf, outname);
      p = buf + strlen (buf);
!     while (p > buf && p[-1] != '/')
        *--p = 0;
      if (p == buf)
--- 195,199 ----
      strcpy (buf, outname);
      p = buf + strlen (buf);
!     while (p > buf && !IS_DIRECTORY_SEP (p[-1]))
        *--p = 0;
      if (p == buf)
*************** main (argc, argv)
*** 188,192 ****
        int status;
  
!       status = popmail (inname + 3, outname);
        exit (status);
      }
--- 209,213 ----
        int status;
  
!       status = popmail (inname + 3, outname, argc > 3 ? argv[3] : NULL);
        exit (status);
      }
*************** main (argc, argv)
*** 195,198 ****
--- 216,221 ----
  #endif /* MAIL_USE_POP */
  
+ #ifndef DISABLE_DIRECT_ACCESS
+ 
    /* Check access to input file.  */
    if (access (inname, R_OK | W_OK) != 0)
*************** main (argc, argv)
*** 228,232 ****
    strcpy (tempname, inname);
    p = tempname + strlen (tempname);
!   while (p != tempname && p[-1] != '/')
      p--;
    *p = 0;
--- 251,255 ----
    strcpy (tempname, inname);
    p = tempname + strlen (tempname);
!   while (p != tempname && !IS_DIRECTORY_SEP (p[-1]))
      p--;
    *p = 0;
*************** main (argc, argv)
*** 305,310 ****
--- 328,337 ----
        if (locking (indesc, LK_RLCK, 0L) < 0) pfatal_with_name (inname);
  #else
+ #ifdef WINDOWSNT
+       if (locking (indesc, LK_RLCK, -1L) < 0) pfatal_with_name (inname);
+ #else
        if (flock (indesc, LOCK_EX) < 0) pfatal_with_name (inname);
  #endif
+ #endif
  #endif /* not MAIL_USE_LOCKF */
  #endif /* MAIL_USE_SYSTEM_LOCK */
*************** main (argc, argv)
*** 338,342 ****
  
  #ifdef MAIL_USE_SYSTEM_LOCK
! #if defined (STRIDE) || defined (XENIX)
        /* Stride, xenix have file locking, but no ftruncate.  This mess will do. */
        close (open (inname, O_CREAT | O_TRUNC | O_RDWR, 0666));
--- 365,369 ----
  
  #ifdef MAIL_USE_SYSTEM_LOCK
! #if defined (STRIDE) || defined (XENIX) || defined (WINDOWSNT)
        /* Stride, xenix have file locking, but no ftruncate.  This mess will do. */
        close (open (inname, O_CREAT | O_TRUNC | O_RDWR, 0666));
*************** main (argc, argv)
*** 375,378 ****
--- 402,408 ----
    unlink (lockname);
  #endif /* not MAIL_USE_MMDF and not MAIL_USE_SYSTEM_LOCK */
+ 
+ #endif /* ! DISABLE_DIRECT_ACCESS */
+ 
    return 0;
  }
*************** xmalloc (size)
*** 451,457 ****
--- 481,492 ----
  #ifdef MAIL_USE_POP
  
+ #ifndef WINDOWSNT
  #include <sys/socket.h>
  #include <netinet/in.h>
  #include <netdb.h>
+ #else
+ #undef _WINSOCKAPI_
+ #include <winsock.h>
+ #endif
  #include <stdio.h>
  #include <pwd.h>
*************** char obuffer[BUFSIZ];
*** 477,483 ****
  char Errmsg[80];
  
! popmail (user, outfile)
       char *user;
       char *outfile;
  {
    int nmsgs, nbytes;
--- 512,519 ----
  char Errmsg[80];
  
! popmail (user, outfile, password)
       char *user;
       char *outfile;
+      char *password;
  {
    int nmsgs, nbytes;
*************** popmail (user, outfile)
*** 490,494 ****
    extern char *strerror ();
  
!   server = pop_open (0, user, 0, POP_NO_GETPASS);
    if (! server)
      {
--- 526,530 ----
    extern char *strerror ();
  
!   server = pop_open (0, user, password, POP_NO_GETPASS);
    if (! server)
      {
*************** popmail (user, outfile)
*** 518,522 ****
    fchown (mbfi, getuid (), -1);
  
!   if ((mbf = fdopen (mbfi, "w")) == NULL)
      {
        pop_close (server);
--- 554,558 ----
    fchown (mbfi, getuid (), -1);
  
!   if ((mbf = fdopen (mbfi, "wb")) == NULL)
      {
        pop_close (server);
diff -2rcpP --exclude=*.elc emacs-19.30/lib-src/ntlib.c emacs-19.31/lib-src/ntlib.c
*** emacs-19.30/lib-src/ntlib.c	Tue Nov  1 05:07:04 1994
--- emacs-19.31/lib-src/ntlib.c	Fri May  3 14:26:50 1996
***************
*** 2,20 ****
     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
--- 2,21 ----
     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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.
  
     Geoff Voelker (voelker@cs.washington.edu)                         10-8-94
***************
*** 24,27 ****
--- 25,32 ----
  #include <stdlib.h>
  #include <stdio.h>
+ #include <time.h>
+ #include <direct.h>
+ 
+ #include "ntlib.h"
  
  #define MAXPATHLEN _MAX_PATH
***************
*** 31,35 ****
     This is much easier.  */
  void
! nt_sleep(int seconds)
  {
    Sleep (seconds * 1000);
--- 36,40 ----
     This is much easier.  */
  void
! sleep(int seconds)
  {
    Sleep (seconds * 1000);
*************** int
*** 40,44 ****
  getwd (char *dir)
  {
!   return GetCurrentDirectory (MAXPATHLEN, dir);
  }
  
--- 45,57 ----
  getwd (char *dir)
  {
!   if (GetCurrentDirectory (MAXPATHLEN, dir) > 0)
!     return dir;
!   return NULL;
! }
! 
! int
! getpid ()
! {
!   return _getpid ();
  }
  
*************** getppid(void)
*** 88,90 ****
--- 101,216 ----
        exit (1);
      }
+ }
+ 
+ char *
+ getlogin ()
+ {
+   static char user_name[256];
+   DWORD  length = sizeof (user_name);
+ 
+   if (GetUserName (user_name, &length))
+     return user_name;
+   return NULL;
+ }
+ 
+ char *
+ cuserid (char * s)
+ {
+   char * name = getlogin ();
+   if (s)
+     return strcpy (s, name ? name : "");
+   return name;
+ }
+ 
+ int
+ getuid ()
+ {
+   return 0;
+ }
+ 
+ int
+ setuid (int uid)
+ {
+   return 0;
+ }
+ 
+ struct passwd *
+ getpwuid (int uid)
+ {
+   return NULL;
+ }
+ 
+ char *
+ getpass (const char * prompt)
+ {
+   static char input[256];
+   HANDLE in;
+   HANDLE err;
+   DWORD  count;
+ 
+   in = GetStdHandle (STD_INPUT_HANDLE);
+   err = GetStdHandle (STD_ERROR_HANDLE);
+ 
+   if (in == INVALID_HANDLE_VALUE || err == INVALID_HANDLE_VALUE)
+     return NULL;
+ 
+   if (WriteFile (err, prompt, strlen (prompt), &count, NULL))
+     {
+       int istty = (GetFileType (in) == FILE_TYPE_CHAR);
+       DWORD old_flags;
+       int rc;
+ 
+       if (istty)
+ 	{
+ 	  if (GetConsoleMode (in, &old_flags))
+ 	    SetConsoleMode (in, ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT);
+ 	  else
+ 	    istty = 0;
+ 	}
+       rc = ReadFile (in, input, sizeof (input), &count, NULL);
+       if (count >= 2 && input[count - 2] == '\r')
+ 	input[count - 2] = '\0';
+       else
+ 	{
+ 	  char buf[256];
+ 	  while (ReadFile (in, buf, sizeof (buf), &count, NULL) > 0)
+ 	    if (count >= 2 && buf[count - 2] == '\r')
+ 	      break;
+ 	}
+       WriteFile (err, "\r\n", 2, &count, NULL);
+       if (istty)
+ 	SetConsoleMode (in, old_flags);
+       if (rc)
+ 	return input;
+     }
+ 
+   return NULL;
+ }
+ 
+ int
+ fchown (int fd, int uid, int gid)
+ {
+   return 0;
+ }
+ 
+ /* Place a wrapper around the MSVC version of ctime.  It returns NULL
+    on network directories, so we handle that case here.  
+    (Ulrich Leodolter, 1/11/95).  */
+ char *
+ sys_ctime (const time_t *t)
+ {
+   char *str = (char *) ctime (t);
+   return (str ? str : "Sun Jan 01 00:00:00 1970");
+ }
+ 
+ FILE *
+ sys_fopen(const char * path, const char * mode)
+ {
+   return fopen (path, mode);
+ }
+ 
+ int
+ sys_chdir (const char * path)
+ {
+   return _chdir (path);
  }
diff -2rcpP --exclude=*.elc emacs-19.30/lib-src/ntlib.h emacs-19.31/lib-src/ntlib.h
*** emacs-19.30/lib-src/ntlib.h	Wed Dec 31 19:00:00 1969
--- emacs-19.31/lib-src/ntlib.h	Fri May  3 12:34:26 1996
***************
*** 0 ****
--- 1,45 ----
+ /* 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.
+ 
+ */
+ 
+ #include <pwd.h>
+ #include <malloc.h>
+ 
+ void sleep(int seconds);
+ int getwd (char *dir);
+ int getppid(void);
+ char * getlogin ();
+ char * cuserid (char * s);
+ int getuid ();
+ int setuid (int uid);
+ struct passwd * getpwuid (int uid);
+ char * getpass (const char * prompt);
+ int fchown (int fd, int uid, int gid);
+ 
+ #ifndef 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)
+ 
+ #define index   strchr
+ #define rindex  strrchr
+ #endif
+ 
+ /* end of ntlib.h */
diff -2rcpP --exclude=*.elc emacs-19.30/lib-src/pop.c emacs-19.31/lib-src/pop.c
*** emacs-19.30/lib-src/pop.c	Mon Oct 24 00:39:48 1994
--- emacs-19.31/lib-src/pop.c	Mon Apr 29 11:45:44 1996
***************
*** 1,4 ****
  /* pop.c: client routines for talking to a POP3-protocol post-office server
!    Copyright (c) 1991,1993 Free Software Foundation, Inc.
     Written by Jonathan Kamens, jik@security.ov.com.
  
--- 1,4 ----
  /* pop.c: client routines for talking to a POP3-protocol post-office server
!    Copyright (c) 1991, 1993, 1996 Free Software Foundation, Inc.
     Written by Jonathan Kamens, jik@security.ov.com.
  
*************** GNU General Public License for more deta
*** 17,21 ****
  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.  */
  
  #ifdef HAVE_CONFIG_H
--- 17,22 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  #ifdef HAVE_CONFIG_H
*************** the Free Software Foundation, 675 Mass A
*** 37,42 ****
--- 38,55 ----
  
  #include <sys/types.h>
+ #ifdef WINDOWSNT
+ #include "ntlib.h"
+ #include <winsock.h>
+ #undef SOCKET_ERROR
+ #define RECV(s,buf,len,flags) recv(s,buf,len,flags)
+ #define SEND(s,buf,len,flags) send(s,buf,len,flags)
+ #define CLOSESOCKET(s) closesocket(s)
+ #else
  #include <netinet/in.h>
  #include <sys/socket.h>
+ #define RECV(s,buf,len,flags) read(s,buf,len)
+ #define SEND(s,buf,len,flags) write(s,buf,len)
+ #define CLOSESOCKET(s) close(s)
+ #endif
  #include <pop.h>
  
*************** extern char *getlogin (/* void */);
*** 76,79 ****
--- 89,93 ----
  extern char *getpass (/* char * */);
  extern char *strerror (/* int */);
+ extern char *index ();
  
  #ifdef KERBEROS
*************** extern char *krb_realmofhost (/* char * 
*** 87,93 ****
--- 101,109 ----
  #endif /* KERBEROS */
  
+ #ifndef WINDOWSNT
  #if !defined(HAVE_H_ERRNO) || !defined(HAVE_CONFIG_H)
  extern int h_errno;
  #endif
+ #endif
  
  static int socket_connection (/* char *, int */);
*************** static char *find_crlf (/* char * */);
*** 105,109 ****
--- 121,129 ----
  #define POP_PORT 110
  #define KPOP_PORT 1109
+ #ifdef WINDOWSNT
+ #define POP_SERVICE "pop3"	/* we don't want the POP2 port! */
+ #else
  #define POP_SERVICE "pop"
+ #endif
  #ifdef KERBEROS
  #ifdef KRB5
*************** pop_open (host, username, password, flag
*** 268,271 ****
--- 288,292 ----
    server->buffer_size = GETLINE_MIN;
    server->in_multi = 0;
+   server->trash_started = 0;
  
    if (getok (server))
*************** pop_retrieve (server, message, markfrom)
*** 560,564 ****
     */
    bufsize = sizes[0] + (markfrom ? 5 : 0);
!   ptr = malloc (bufsize);
    free ((char *) IDs);
    free ((char *) sizes);
--- 581,585 ----
     */
    bufsize = sizes[0] + (markfrom ? 5 : 0);
!   ptr = (char *)malloc (bufsize);
    free ((char *) IDs);
    free ((char *) sizes);
*************** pop_retrieve (server, message, markfrom)
*** 587,591 ****
  	    {
  	      bufsize += 5;
! 	      ptr = realloc (ptr, bufsize);
  	      if (! ptr)
  		{
--- 608,612 ----
  	    {
  	      bufsize += 5;
! 	      ptr = (char *)realloc (ptr, bufsize);
  	      if (! ptr)
  		{
*************** pop_reset (server)
*** 907,911 ****
   * 	pop_error.
   *
!  * Side Effects: The popserver passed in is unuseable after this
   * 	function is called, even if an error occurs.
   */
--- 928,932 ----
   * 	pop_error.
   *
!  * Side Effects: The popserver passed in is unusable after this
   * 	function is called, even if an error occurs.
   */
*************** pop_quit (server)
*** 938,941 ****
--- 959,966 ----
  }
  
+ #ifdef WINDOWSNT
+ static int have_winsock = 0;
+ #endif
+ 
  /*
   * Function: socket_connection
*************** socket_connection (host, flags)
*** 981,984 ****
--- 1006,1017 ----
    int try_count = 0;
  
+ #ifdef WINDOWSNT
+   {
+     WSADATA winsockData;
+     if (WSAStartup (0x101, &winsockData) == 0)
+       have_winsock = 1;
+   }
+ #endif
+ 
    do
      {
*************** socket_connection (host, flags)
*** 1055,1059 ****
    if (! *hostent->h_addr_list)
      {
!       (void) close (sock);
        strcpy (pop_error, CONNECT_ERROR);
        strncat (pop_error, strerror (errno),
--- 1088,1092 ----
    if (! *hostent->h_addr_list)
      {
!       CLOSESOCKET (sock);
        strcpy (pop_error, CONNECT_ERROR);
        strncat (pop_error, strerror (errno),
*************** socket_connection (host, flags)
*** 1076,1080 ****
  	  strncat (pop_error, error_message (rem),
  		   ERROR_MAX - sizeof(KRB_ERROR));
! 	  (void) close (sock);
  	  return (-1);
  	}
--- 1109,1113 ----
  	  strncat (pop_error, error_message (rem),
  		   ERROR_MAX - sizeof(KRB_ERROR));
! 	  CLOSESOCKET (sock);
  	  return (-1);
  	}
*************** socket_connection (host, flags)
*** 1133,1137 ****
  	    krb5_free_error (err_ret);
  
! 	  (void) close (sock);
  	  return (-1);
  	}
--- 1166,1170 ----
  	    krb5_free_error (err_ret);
  
! 	  CLOSESOCKET (sock);
  	  return (-1);
  	}
*************** socket_connection (host, flags)
*** 1150,1154 ****
  	  strncat (pop_error, krb_err_txt[rem],
  		   ERROR_MAX - sizeof (KRB_ERROR));
! 	  (void) close (sock);
  	  return (-1);
  	}
--- 1183,1187 ----
  	  strncat (pop_error, krb_err_txt[rem],
  		   ERROR_MAX - sizeof (KRB_ERROR));
! 	  CLOSESOCKET (sock);
  	  return (-1);
  	}
*************** getline (server)
*** 1234,1238 ****
  	{
  	  server->buffer_size += GETLINE_INCR;
! 	  server->buffer = realloc (server->buffer, server->buffer_size);
  	  if (! server->buffer)
  	    {
--- 1267,1271 ----
  	{
  	  server->buffer_size += GETLINE_INCR;
! 	  server->buffer = (char *)realloc (server->buffer, server->buffer_size);
  	  if (! server->buffer)
  	    {
*************** getline (server)
*** 1242,1247 ****
  	    }
  	}
!       ret = read (server->file, server->buffer + server->data,
! 		  server->buffer_size - server->data - 1);
        if (ret < 0)
  	{
--- 1275,1280 ----
  	    }
  	}
!       ret = RECV (server->file, server->buffer + server->data,
! 		  server->buffer_size - server->data - 1, 0);
        if (ret < 0)
  	{
*************** fullwrite (fd, buf, nbytes)
*** 1348,1352 ****
  
    cp = buf;
!   while ((ret = write (fd, cp, nbytes)) > 0)
      {
        cp += ret;
--- 1381,1385 ----
  
    cp = buf;
!   while ((ret = SEND (fd, cp, nbytes, 0)) > 0)
      {
        cp += ret;
*************** fullwrite (fd, buf, nbytes)
*** 1369,1373 ****
   * Returns: 0 for success, else for failure and puts error in pop_error.
   *
!  * Side effects: On failure, may make the connection unuseable.
   */
  static int
--- 1402,1406 ----
   * Returns: 0 for success, else for failure and puts error in pop_error.
   *
!  * Side effects: On failure, may make the connection unusable.
   */
  static int
*************** gettermination (server)
*** 1440,1444 ****
   * 	are received.
   *
!  * Side effects: The server is unuseable after this function returns.
   * 	Changes made to the maildrop since the session was started (or
   * 	since the last pop_reset) may be lost.
--- 1473,1477 ----
   * 	are received.
   *
!  * Side effects: The server is unusable after this function returns.
   * 	Changes made to the maildrop since the session was started (or
   * 	since the last pop_reset) may be lost.
*************** pop_trash (server)
*** 1467,1474 ****
    if (server->file >= 0)
      {
        sendline (server, "RSET");
        sendline (server, "QUIT");
  
!       close (server->file);
        server->file = -1;
        if (server->buffer)
--- 1500,1512 ----
    if (server->file >= 0)
      {
+       /* avoid recursion; sendline can call pop_trash */
+       if (server->trash_started)
+ 	return;
+       server->trash_started = 1;
+ 
        sendline (server, "RSET");
        sendline (server, "QUIT");
  
!       CLOSESOCKET (server->file);
        server->file = -1;
        if (server->buffer)
*************** pop_trash (server)
*** 1478,1481 ****
--- 1516,1524 ----
  	}
      }
+ 
+ #ifdef WINDOWSNT
+   if (have_winsock)
+     WSACleanup ();
+ #endif
  }
  
diff -2rcpP --exclude=*.elc emacs-19.30/lib-src/pop.h emacs-19.31/lib-src/pop.h
*** emacs-19.30/lib-src/pop.h	Tue Sep 27 15:49:15 1994
--- emacs-19.31/lib-src/pop.h	Sun Apr 28 14:26:29 1996
*************** GNU General Public License for more deta
*** 17,21 ****
  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 <stdio.h>
--- 17,22 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  #include <stdio.h>
*************** struct _popserver
*** 35,38 ****
--- 36,40 ----
    int buffer_size, buffer_index;
    int in_multi;
+   int trash_started;
  };
  
diff -2rcpP --exclude=*.elc emacs-19.30/lib-src/profile.c emacs-19.31/lib-src/profile.c
*** emacs-19.30/lib-src/profile.c	Thu Jul 27 23:32:19 1995
--- emacs-19.31/lib-src/profile.c	Tue Apr  9 19:42:07 1996
***************
*** 4,22 ****
   Author: Boaz Ben-Zvi <boaz@lcs.mit.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.  */
  
  
--- 4,23 ----
   Author: Boaz Ben-Zvi <boaz@lcs.mit.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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/lib-src/qsort.c emacs-19.31/lib-src/qsort.c
*** emacs-19.30/lib-src/qsort.c	Sun Sep 25 23:12:10 1994
--- emacs-19.31/lib-src/qsort.c	Mon Jan 29 17:18:12 1996
*************** GNU General Public License for more deta
*** 17,21 ****
  You should have received a copy of the GNU General Public License
  along with GNU QSORT; see the file COPYING.  If not, write to
! the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
  
  #ifdef sparc
--- 17,22 ----
  You should have received a copy of the GNU General Public License
  along with GNU QSORT; see the file COPYING.  If not, write to
! the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA. */
  
  #ifdef sparc
*************** qsort (base_ptr, total_elems, size, cmp)
*** 232,234 ****
    return 1;
  }
- 
--- 233,234 ----
diff -2rcpP --exclude=*.elc emacs-19.30/lib-src/rcs2log emacs-19.31/lib-src/rcs2log
*** emacs-19.30/lib-src/rcs2log	Sat Jul  8 14:44:04 1995
--- emacs-19.31/lib-src/rcs2log	Sun Jan 14 20:17:56 1996
***************
*** 13,19 ****
  # Author: Paul Eggert <eggert@twinsun.com>
  
! # $Id: rcs2log,v 1.26 1995/07/08 18:44:04 eggert Exp $
  
! # Copyright 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
  
  # This program is free software; you can redistribute it and/or modify
--- 13,19 ----
  # Author: Paul Eggert <eggert@twinsun.com>
  
! # $Id: rcs2log,v 1.27 1996/01/15 01:17:03 eggert Exp $
  
! # Copyright 1992, 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
  
  # This program is free software; you can redistribute it and/or modify
*************** EOF
*** 365,369 ****
  
  	initialize_fullname=`
! 		(cat /etc/passwd; ypmatch $authors passwd) 2>/dev/null |
  		$AWK -F: "$awkscript"
  	`$initialize_fullname
--- 365,375 ----
  
  	initialize_fullname=`
! 		(
! 			cat /etc/passwd
! 			for author in $authors
! 			do nismatch $author passwd.org_dir
! 			done
! 			ypmatch $authors passwd
! 		) 2>/dev/null |
  		$AWK -F: "$awkscript"
  	`$initialize_fullname
*************** case $hostname in
*** 415,418 ****
--- 421,433 ----
  		exit 1
  	}
+ 
+ 	case $hostname in
+ 	*.*) ;;
+ 	*)
+ 		domainname=`(domainname) 2>/dev/null` &&
+ 		case $domainname in
+ 		*.*) hostname=$hostname.$domainname
+ 		esac
+ 	esac
  esac
  
diff -2rcpP --exclude=*.elc emacs-19.30/lib-src/tcp.c emacs-19.31/lib-src/tcp.c
*** emacs-19.30/lib-src/tcp.c	Sat Feb 26 22:45:53 1994
--- emacs-19.31/lib-src/tcp.c	Wed Feb 21 12:10:27 1996
*************** GNU General Public License for more deta
*** 20,24 ****
  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.
  
   *
--- 20,25 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.
  
   *
*************** main (argc, argv)
*** 122,126 ****
    sockin.sin_family = host->h_addrtype;
    bcopy (host->h_addr, &sockin.sin_addr, host->h_length);
!   sockin.sin_port = port;
    if ((server = socket (AF_INET, SOCK_STREAM, 0)) < 0)
      {
--- 123,127 ----
    sockin.sin_family = host->h_addrtype;
    bcopy (host->h_addr, &sockin.sin_addr, host->h_length);
!   sockin.sin_port = htons (port);
    if ((server = socket (AF_INET, SOCK_STREAM, 0)) < 0)
      {
diff -2rcpP --exclude=*.elc emacs-19.30/lib-src/wakeup.c emacs-19.31/lib-src/wakeup.c
*** emacs-19.30/lib-src/wakeup.c	Wed Oct 12 16:27:17 1994
--- emacs-19.31/lib-src/wakeup.c	Sun Apr 28 14:26:30 1996
***************
*** 1,5 ****
--- 1,7 ----
  /* Program to produce output at regular intervals.  */
  
+ #ifdef HAVE_CONFIG_H
  #include <config.h>
+ #endif
  
  #include <stdio.h>
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/ChangeLog emacs-19.31/lisp/ChangeLog
*** emacs-19.30/lisp/ChangeLog	Sat Nov 25 00:35:21 1995
--- emacs-19.31/lisp/ChangeLog	Sat May 25 15:31:23 1996
***************
*** 1,12532 ****
! Fri Nov 24 17:58:03 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* Version 19.30 released.
  
! 	* diary-lib.el: Renamed from diary.el.
! 	* calendar.el, cal-tex.el: Use new name diary-lib.
  
! 	* cc-mode.el (c++-mode, objc-mode, c-mode): Doc fix.
  
! 	* font-lock.el (font-lock-make-faces): Add special code for ms-dos.
  
! 	* view.el (view-mode, view-mode-enter): Doc changes.
! 	(view-mode-map): Change h and ? to use describe-mode.
! 	Delete binding of help char.
! 	(view-mode-enter): Use describe-mode in message.
  
! Thu Nov 23 12:40:47 1995  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
  
! 	* ediff-mult.el (ediff-intersect-directories): Quote symbols
! 	starting with `:'.
  
! 	* view.el (view-mode-enter): Replace Help-helper by help-command
! 	in doc string and message.
  
! 	* sort.el (sort-regexp-fields): Doc fix.
! 	* inf-lisp.el (inferior-lisp-load-command): Doc fix.
! 	* imenu.el (imenu-generic-expression, imenu--generic-function):
! 	Doc fix.
  
! 	* add-log.el (add-change-log-entry): Initialize add-log-full-name
! 	and add-log-mailing-address before prompting.
  
! Thu Nov 23 00:56:16 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* completion.el (cmpl-make-standard-completion-syntax-table)
! 	(cmpl-make-c-def-completion-syntax-table): Use make-syntax-table.
! 	(completion-c-mode-hook): Encapsulate C-mode changes in new function.
! 	Either call it now or put it on c-mode-hook.
  
! Wed Nov 22 14:55:12 1995  Barry Warsaw  <bwarsaw@anthem (Barry Warsaw)>
  
! 	* cc-mode.el (c-beginning-of-statement-1): CASE 3, can't just
! 	return t at end of let clause since this will break
! 	arglist-cont-nonempty lines.
  
! Wed Nov 22 14:03:08 1995  Geoff Voelker  <voelker@cs.washington.edu>
  
! 	* makefile.nt (install, clean): Don't use switches to del not 
! 	supported by Win95.
  
! Tue Nov 21 00:12:36 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* man.el (Man-fontify-manpage, Man-cleanup-manpage):
! 	Convert \255 to a dash.
  
! 	* apropos.el (apropos-print): Put the item property
! 	on the whole printed symbol.
! 	(apropos-follow): Look for the item property only adjacent to point.
! 	Signal an error if there is none.
  
! Mon Nov 20 00:39:01 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* apropos.el (apropos-print): Use apropos-local-map as buffer's map,
! 	not as a text property.
  
! 	* ediff-hook.el (menu-bar-epatch-menu, menu-bar-ediff-merge-menu)
! 	(menu-bar-ediff-menu): Give names to the menus.
! 	
! 	* ediff-mult.el: Renamed from ediff-meta.el.  Changed provide.
! 	* ediff.el, ediff-util.el: Require ediff-mult.
! 	* ediff-hook.el (ediff-show-registry): Use renamed file ediff-mult.el.
  
! 	* array.el (array-mode): Set overwrite-mode to overwrite-mode-textual.
  
! 	* term/pc-win.el (msdos-color-aliases): Add more aliases.
! 	(msdos-face-setup): Change colors for bold, bold-italic, underline.
! 	(x-frob-font-slant): Define as no-op.
  
! 	* saveplace.el (save-place-to-alist): Handle hexl-mode specially.
  
! Sun Nov 19 18:24:58 1995  Erik Naggum  <erik@naggum.no>
  
! 	* calendar.el (cal-tex-cursor-week-iso): Doc fix.
  
! Sun Nov 19 15:39:49 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* calendar.el:
! 	(cal-tex-cursor-filofax-week): Renamed from cal-tex-cursor-week6.
! 	(cal-tex-cursor-filofax-2week): Renamed from cal-tex-cursor-week5.
! 	(cal-tex-cursor-week-monday): Renamed from cal-tex-cursor-week4.
! 	(cal-tex-cursor-week-iso): Renamed from cal-tex-cursor-week3.
  
! 	* cal-tex.el (cal-tex-version): Deleted.
! 	(cal-tex-cursor-year-landscape): Doc fix.
! 	(cal-tex-cursor-filofax-week): Renamed from cal-tex-cursor-week6.
! 	(cal-tex-cursor-filofax-2week): Renamed from cal-tex-cursor-week5.
! 	(cal-tex-cursor-week-monday): Renamed from cal-tex-cursor-week4.
! 	(cal-tex-cursor-week-iso): Renamed from cal-tex-cursor-week3.
  
! 	* info.el (Info-directory-list): Use source-directory.
  
! Sat Nov 18 10:49:47 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* calendar.el (calendar-goto-info-node): Don't let
! 	same-window-buffer-names do its usual job--force *info* buffer
! 	into another window.
  
! 	* simple.el (do-auto-fill): Look at 2nd line for fill prefix
! 	even when on the first line.  Don't accept non-whitespace prefix
! 	from the first line.
  
! 	* fill.el (fill-context-prefix): New arg first-line-regexp.
  
! 	* finder.el (finder-known-keywords): Delete `debugging'.
  
! Sat Nov 18 03:09:37 1995  Lars Magne Ingebrigtsen  <larsi@surt.ifi.uio.no>
  
! 	* nntp.el (nntp-open-server): Accept a second optional parameter
! 	for just changing virtual server.  Doc fix.
! 	(nntp-possibly-change-server): Use it.
! 	(nntp-close-server): Ditto.
  
! Fri Nov 17 21:39:30 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* cc-mode.el (c-guess-basic-syntax, c-beginning-of-statement-1):
! 	Do not check for c-conditional-key when skipping backwards over
! 	statements that look sort of like conditionals.  This makes
! 	statements following nested functions indent correctly.  CASE 9B.3
! 	(unknown catchall) now gets triggered by the brace that opens a
! 	nested function.  Also, this changes the relpos for top-level
! 	defun-open braces, but that will be very hard to fix, and it may
! 	break backward compatibility.
  
! 	* cc-mode.el (c-guess-basic-syntax):
! 	CASE 5H, inclass relpos should be relative to
! 	boi of the open brace, not the beginning of the class keyword.
  
! 	* cc-mode.el (c-fill-paragraph): Doc fix.
  
! Fri Nov 17 20:51:54 1995  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
  
! 	* gnus.el (gnus-group-quit-config): Return the quit-config instead
! 	of a list containing the quit-config.
  
! Fri Nov 17 17:34:13 1995  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
  
! 	* mail-utils.el (rmail-dont-reply-to): Preserve whitespace after comma.
  
! Fri Nov 17 13:36:39 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* etags.el (next-file): Make interactive arg t if had any prefix arg.
  
! 	* faces.el (face-color-supported-p): Return nil if no window system.
  
! Fri Nov 17 12:39:59 1995  Ed Reingold  <reingold@spiff.gnu.ai.mit.edu>
  
!         * cal-coptic.el: Fix epoch of Ethiopiac calendar.
  
!         * cal-chinese.el: Minor fixes.
  
! Fri Nov 17 11:03:20 1995  Boris Goldowsky  <boris@gnu.ai.mit.edu>
  
! 	* indent.el (move-to-left-margin): Removed left-over code that
!  	made it fail on right-justified and centered text.
  
! 	* fill.el (fill-region-as-paragraph): Remove redundant "setq from".  
! 	Don't add extra newline at end if there is no text in paragraph --
! 	doing so can make fill-region loop.
! 	When testing for indentation exceeding fill-column, skip back over
! 	tabs too. 
  
! Fri Nov 17 03:19:45 1995  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* rmail.el (rmail-retry-failure): Add missing colons in regexp.
! 	Use " +", not " *", to check for indented text.
! 	Don't make a temp buffer; just record the indent amount.  Simplify.
  
! Fri Nov 17 00:26:48 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* simple.el (do-auto-fill): Ignore the result of fill-context-prefix
! 	if it is empty.
  
! 	* cc-mode.el (c-common-init): Set adaptive-fill-regexp to nil.
  
! 	* fill.el (fill-context-prefix): Use adaptive-fill-regexp only if non-nil.
  
! Thu Nov 16 16:49:56 1995  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
  
! 	* calendar.el (calendar-julian-date-string): Autoload this.
  
! Thu Nov 16 17:23:03 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* ange-ftp.el (ange-ftp-process-handle-hash): If
! 	ange-ftp-hash-mark-unit is nil, don't display a message.
! 	(ange-ftp-process-filter): Call ange-ftp-process-handle-hash even
! 	if ange-ftp-hash-mark-unit is nil.
! 	
! Thu Nov 16 15:06:51 1995  Johan Vromans  <jvromans@squirrel.nl>
  
! 	* forms.el: Use `buffer-substring-no-properties' instead of
!  	`buffer-substring' to avoid the properties being copied.
  
! Thu Nov 16 12:22:11 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* cc-mode.el (c-beginning-of-statement, c-end-of-statement):
! 	New arg sentence-flag.  Use that instead of interactive-p.
! 	(c-mode-help-address): Send bug reports to bug-gnu-emacs too.
  
! 	* fill.el (fill-context-prefix): Check adaptive-fill-function non-nil.
  
! Thu Nov 16 15:38:58 1995  Per Abrahamsen  <abraham@dina.kvl.dk>
  
! 	* menu-bar.el (minibuffer maps): Delete extra quote.
  
! Thu Nov 16 11:31:46 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* info.el (Info-complete-menu-item): Don't treat `* Menu:'
! 	as a menu item.
  
! Wed Nov 15 12:24:00 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* nntp.el (nntp-close-server-internal):
! 	Don't call nntp-possibly-change-server.
  
! 	* cplus-md.el (c++-mode): Remove autoload cookie.
  
! 	* mouse-sel.el (mouse-sel-lost-selection-hook): Undo prev change.
  
! 	* tmm.el (tmm-prompt): Delete tmm-add-prompt if we fail.
! 	Don't switch to *Completions* if it wasn't created.
! 	
! 	* startup.el (command-line-1): Mention F10.
  
! Tue Nov 14 12:34:00 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* fill.el (fill-individual-paragraphs): Advance 1 line in inner loop.
! 	(fill-region-as-paragraph): Handle left margin extending to or past
! 	fill-column.
  
! 	* mouse-sel.el (mouse-sel-lost-selection-hook): Use (car selection).
  
! 	* indent.el (indent-line-to): Delete spaces before inserting a tab.
  
! 	* calendar.el (calendar-julian-from-absolute): Autoload it.
  
! 	* goto-addr.el (goto-address): Use S-mouse-2, not S-mouse-1.
! 	Add autoload cookie.
  
! 	* startup.el (command-line-1): Reorganize the initial help output.
  
! 	* hexl.el (hexl-mode): Set require-final-newline to nil.
! 	If point was at end of buffer, move it back one byte.
  
! Tue Nov 14 20:25:01 1995  Eric Ding  <ericding@mit.edu>
  
! 	* goto-addr.el (goto-address-highlight-p): New variable.
! 	(goto-address-fontify): Removed check for invisible text,
! 	set inhibit-point-motion-hooks instead
  
! Mon Nov 13 15:20:42 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* vc-hooks.el (vc-locking-user): In CVS case, convert
! 	user number to a string.
  
! 	* vc.el (vc-directory): Require dired.
! 	(vc-revert-buffer): Ignore vc-suppress-confirm.
  
! Mon Nov 13 13:10:12 1995  Morten Welinder  <terra@diku.dk>
  
! 	* arc-mode.el (archive-remote-regexp): Doc fix.
  
! Sun Nov 12 16:54:33 1995  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
  
! 	* compile.el (compilation-sentinel): Use the local value of
! 	compilation-exit-message-function in the process buffer.
  
! Sun Nov 12 14:33:59 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* tmm.el (tmm-define-keys): Don't define ESC ESC.
  
! 	* ffap.el: New file.
  
! 	* info.el (info-insert-file-contents-1): Various rewrites.
! 	Compute EXT-LEFT after removing the dot from SUFFIX.
  
! Sat Nov 11 00:24:12 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* window.el (balance-windows): Don't count the menu bar's lines
! 	in the frame height.
  
! 	* menu-bar.el (delete-frame): Don't use delete-frame as event name.
  
! 	* startup.el (command-line): Don't reject unknown args here.
! 	(command-line-1): Detect it here.
  
! 	* dabbrev.el (dabbrev-case-replace): Doc fix.
  
! Fri Nov 10 19:30:48 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* tmm.el: Define menu-bar mouse-1 as tmm-menubar.
  
! 	* simple.el (universal-argument-other-key): Add to existing
! 	unread-command-events value.
  
! Fri Nov 10 19:34:15 1995  Per Abrahamsen  <abraham@dina.kvl.dk>
  
! 	* xt-mouse.el (global-map): Removed bindings of down events to ignore. 
! 	(xterm-mouse-translate): Only generate down event when bound.
! 	Cleanup.  Support for mode line and vertical bar dragging, and
! 	menu-bar events.
! 	(xterm-mouse-x): New variable.
! 	(xterm-mouse-y): New variable.
! 	(mouse-position): Advice to use above variables.
! 	(xterm-mouse-event): Support menu-bar.  Set xterm-mouse-x and
! 	xterm-mouse-y. 
  
! Fri Nov 10 10:29:12 1995  Boris Goldowsky  <boris@gnu.ai.mit.edu>
! 	
! 	* add-log.el (change-log-mode): Remove incorrect "^" anchors from
!  	paragraph-start and -separate.
!  	(change-log-fill-paragraph): Use regular value of paragraph-start
!  	to bound paragraph to be filled, modified values only to do the
!  	filling.  Make lines beginning with parentheses
!  	paragraph-starters, but not paragraph-separators.
  
! 	* cc-mode.el (c-common-init): Remove "^" from paragraph-start and
!  	paragraph-separate.  Moved page-delimiter first in case it has a
!  	"^" also.
  
! 	* lisp-mode.el (lisp-mode-variables, lisp-fill-paragraph): Remove
! 	"^" from paragraph-start and paragraph-separate.  Moved
! 	page-delimiter first in case it has a "^" also.
! 	
! 	* sh-script.el (sh-mode): as above.  Use page-delimiter rather than
!  	literal "^L".
  
! 	* fill.el (fill-region-as-paragraph): Since adaptive-fill-regexp
!  	is supposed to match text STARTING at the left margin, use
!  	`looking-at' rather than `re-search-forward'.
! 	(fill-individual-paragraphs): Match fill-prefixes starting at
!  	left-margin.
  
! Fri Nov 10 04:55:12 1995  Erik Naggum  <erik@naggum.no>
  
! 	* view.el (View-scroll-lines-forward): Don't recenter at end.
  
! Fri Nov 10 14:11:43 1995  Kevin Rodgers <kevinr@ihs.com>
  
! 	* files.el (find-file-noselect): Respect the value of
! 	find-file-visit-truename when FILENAME is a directory and
! 	find-file-run-dired is non-nil.
  
! Fri Nov 10 13:55:55 1995  Boris Goldowsky  <boris@gnu.ai.mit.edu>
  
! 	* facemenu.el (facemenu-unlisted-faces): Remove font-lock faces from
!  	the default list.  The list of face names was out of sync; to
!  	prevent this from happenning again I made font-lock.el, and other
! 	packages that create "private" faces, put them on the list
! 	themselves.  This should give them a better chance of being
! 	updated when the packages are changed.
  
! 	* calendar.el (holiday-face, calendar-today-face, diary-face): Add
!  	faces to facemenu-unlisted-faces before creating so that facemenu
! 	won't list them as faces to be added interactively.
  
! 	* viper.el: Don't list any faces in menu.
  
! 	* paren.el (show-paren-command-hook): Don't list `paren-mismatch'
!  	face in menu.
  
! 	* make-mode.el (makefile-space-face): Don't list in facemenu.
  
! 	* ediff-init.el: All faces added to facemenu-unlisted-faces list.
  
! 	* facemenu.el (facemenu-active-faces): Replaces function
! 	`facemenu-discard-redundant-faces'.  This version, written by
! 	Simon Marshall, is faster and does not require optional
! 	argument for recursive re-entry.  New argument FRAME allows
! 	check to be done relative to face definitions in any frame.
  
! Fri Nov 10 12:58:36 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* enriched.el (enriched-next-annotation): Doc fix.
  
! 	* dos-fns.el: Fix previous change.
  
! Thu Nov  9 23:27:08 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* make-mode.el (makefile-mode): Call makefile-define-space-face
! 	only if it is defined.
! 	(makefile-define-space-face): Create the face unconditionally;
! 	alter it only if have X.
  
! 	* cal-x.el: Require calendar.
  
! Thu Nov  9 12:40:50 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* simple.el (do-auto-fill): Use fill-context-prefix.
  
! 	* fill.el (fill-region-as-paragraph): Use fill-context-prefix.
! 	(fill-context-prefix): New function.
  
! Thu Nov  9 03:20:51 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
  
! 	* font-lock.el (font-lock-mode): Use make-local-hook.
! 	(font-lock-fontify-buffer): Don't preserve buffer modification here,
! 	it is done elsewhere, but do preserve match-data.
! 	(font-lock-fontify-syntactically-region,
! 	font-lock-fontify-keywords-region): Don't preserve buffer modification
! 	and temporarily install font-lock-syntax-table here.
! 	(font-lock-fontify-region): Do it here instead.
! 	(font-lock-fontify-anchored-keywords): Ensure LIMIT is end of line.
! 	(font-lock-match-c++-style-declaration-item-and-skip-to-next): No need
! 	to do end-of-line here now.
! 	(font-lock-keywords): Doc fix.
! 	(font-lock-make-face): Add the face to facemenu-unlisted-faces, from
! 	Boris Goldowsky <boris@gnu.ai.mit.edu>.
! 	
! 	* compile.el (compilation-mode-font-lock-keywords): No leading spaces.
  
! Wed Nov  8 05:59:35 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* apropos.el (apropos-print): Use buffer *Apropos*, not *Help*.
! 	(apropos-follow): Don't print a "how to get back" message.
  
! 	* awk-mode.el (awk-mode): Require cc-mode.
  
! 	* term/pc-win.el (x-display-color-p): Accept optional arg.
  
! 	* dos-fns.el (mode-line-format): Modify it, don't override it entirely.
  
! 	* startup.el (command-line): Complain about unknown options.
  
! Tue Nov  7 14:47:02 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* simple.el (shell-command-on-region): Use region-beginning
! 	and region-end, to put them in the command history.
  
! Tue Nov  7 02:46:06 1995  Kevin Gallo  <kgallo@microsoft.com>
  
! 	* term/win32-win.el: New file.
  
! 	* startup.el [win32] (normal-top-level, command-line, command-line-1):
! 	* mouse.el [win32] (mouse-set-region):
! 	* faces.el [win32] (make-face, make-face-x-resource-internal):
! 	* facemenu.el [win32] (face-menu-read-color, list-colors-display,
! 		facemenu-color-equal, face-menu-get-face): 
! 	Test for 'win32 window system as well as 'x.
  
! 	* makefile.nt (install): Change same-dir test to create test file in
! 	installation tree and thereby support read-only shares.
  
! Mon Nov  6 15:37:54 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* apropos.el (apropos-follow): Fix error message.
  
! 	* startup.el (command-line): Handle = in option only if starts with --.
  
! 	* tmm.el (tmm-define-keys): New subroutine.
! 	(tmm-add-prompt): Use that to define keys in both maps separately.
  
! 	* term/internal.el: Rewrite for new case tables.
  
! Mon Nov  6 11:03:34 1995  Boris Goldowsky  <boris@gnu.ai.mit.edu>
  
! 	* fill.el (fill-region-as-paragraph): Don't insert extra space
! 	at end of filled region.
  
! Mon Nov  6 08:27:45 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
  
! 	* bytecomp.el (byte-force-recompile): Make suitably interactive.
  
! Sat Nov  4 13:57:09 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* tmm.el: Use f10 as well as M-`.
  
! 	* menu-bar.el (menu-bar-tools-menu): Always define GNUS entry.
  
! 	* bytecomp.el (byte-compile-associative): Do operations left to right.
  
! Sat Nov  4 23:36:01 1995  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* make-mode.el (makefile-define-space-face): Don't make face if non-X.
  
! Sat Nov  4 01:22:21 1995  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
  
! 	* nnvirtual.el, nntp.el, nnspool.el, nnml.el, nnmh.el, nnmbox.el,
! 	* nnmail.el, nnkiboze.el, nnheader.el, nnfolder.el, nneething.el,
! 	* nndoc.el, nndir.el, nnbabyl.el, gnus.el, gnus-vm.el,
! 	* gnus-vis.el, gnus-uu.el, gnus-score.el, gnus-msg.el, gnus-mh.el,
! 	* gnus-kill.el, gnus-ems.el, gnus-edit.el, gnus-cite.el,
! 	* gnus-cache.el, custom.el: New files.
  
! Fri Nov  3 21:18:13 1995  Erik Naggum  <erik@naggum.no>
  
! 	* gnus.el, gnusmail.el, gnuspost.el, gnusmisc.el, gnus-uu.el,
!  	* mhspool.el, nnspool.el, nntp.el: GNUS release 4 files deleted.
  
! 	* hilit19.el: Removed old gnus hooks.
! 	(gnus-group-mode): Adapt to new Gnus.
! 	(gnus-summary-mode): Removed.
  
! Fri Nov  3 18:11:32 1995  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* sendmail.el (mail): Don't change directory for *mail* buffer.
! 	(sendmail-send-it, mail-recover): Instead, temporarily change to a
! 	safe directory for just the subprocess.
  
! 	* tex-mode.el (tex-send-command): Give meaningful error message.
  
! Fri Nov  3 12:26:02 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* sendmail.el (mail-yank-clear-headers): Do nothing if
! 	mail-yank-ignored-headers is nil.
  
! 	* pc-select.el (pc-selection-mode): Don't mess with c-mode-map.
  
! 	* startup.el (user-mail-address): Doc fix.
  
! 	* view.el (view-mode-map): Use ordinary Help command.
  
! Thu Nov  2 21:58:56 1995  Daniel Pfeiffer <Daniel.Pfeiffer@Informatik.START.dbp.de>
  
! 	* sh-script.el (sh-shells): Eliminated variable redundant with
! 	`interpreter-mode-alist'.
! 	(sh-beginning-of-command): Take into account \quoted newline.
! 	(sh-builtins, sh-leading-keywords, sh-other-keywords): Now three
! 	distinct sets for font-locking.
! 	(sh-font-lock-keywords-1, sh-font-lock-keywords-2): New variables
! 	and functions to give the user finer control over how much to fontify,
! 	including new distinction between keywords and builtins.
! 	(sh-mode): Use new features of `font-lock-defaults' and adaptation
! 	to skeleton changes.
! 	(sh-while): Fix csh, es & rc skeletons.
  
! 	* skeleton.el (skeleton-end-hook): Now defvared and responsible for
! 	pushing out anything following skeleton to next line.  Thus this
! 	behaviour can now be controlled by modes.
! 	(skeleton-insert): Parameter `no-newline' removed.
! 	(skeleton-read): Take this into account.
! 	(skeleton-internal-1): Less spurious empty lines when wrapping.
  
! 	* sh-script.el (sh-remember-variable): Set variable to empty string,
! 	so as not to mess up subprocesses' environment.  Not so nice for
! 	completion.
  
! 	* two-column.el (minor-mode-map-alist): Use substitute-key-definition
! 	to find the appropriate bindings for window enlarge/shrink.
! 	(2C-shrink-window-horizontally, 2C-enlarge-window-horizontally):
! 	Renamed from shrink-window-horizontally, enlarge-window-horizontally
! 	to avoid redefining the standard functions.
  
! Thu Nov  2 21:27:35 1995  Stephen Gildea <gildea@x.org>
  
! 	* mh-e.el (mh-make-folder-mode-line): support mh-msg-count.
! 	(mh-delete-scan-msgs): use fast new mh-goto-msg.
! 	* mh-utils.el (mh-goto-msg): binary search (much faster!).
! 	(mh-prompt-for-folder): error if regular file.
! 	* mh-comp.el: reporter.el support.
  
! Thu Nov  2 15:53:02 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* rmail.el (rmail-delete-message-hook): New hook.
! 	(rmail-delete-message, rmail-delete-forward): Run the hook.
  
! 	* rmail.el (rmail-mode-hook, rmail-get-new-mail-hook): Add defvars.
! 	(rmail-show-message-hook): Likewise.
  
! 	* simple.el (do-auto-fill): When choosing fill-prefix,
! 	don't include the left-margin indentation.
  
! 	* fill.el (fill-individual-paragraphs): Insist on nonempty header name,
! 	in the special mailp case.
  
! Thu Nov  2 15:29:22 1995  Erik Naggum  <erik@naggum.no>
  
! 	* ehelp.el (with-electric-help): Add missing argument MINHEIGHT.
  
! Thu Nov  2 04:31:32 1995  Andre Spiegel  <spiegel@berlin.informatik.uni-stuttgart.de>
  
! 	* vc-hooks.el (vc-utc-string): Use timezone of TIMEVAL for the 
! 	correction, not the current one.
! 	(vc-rcsdiff-knows-brief): New variable.
! 	(vc-rcs-lock-from-diff): Use it.
  
! 	* vc.el (vc-backend-diff): Use new variable vc-rcsdiff-knows-brief.
  
! Wed Nov  1 23:30:20 1995  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* make-mode.el: Renamed from makefile.el.
  
! 	* term/x-win.el: Don't require initial whitespace in vendor name.
  
! 	* tpu-edt.el (tpu-set-mode-line): Add element for column number.
  
! Tue Oct 31 19:44:58 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* cc-mode.el (c-recognize-knr-p): Default now t.
  
! 	* server.el (server-log): Record the current time.
! 	End with newline whenever STRING doesn't end with one.
  
! 	* sh-script.el (sh-mode-map): Put sh-execute-region on C-M-x.
! 	Put executable-interpret on C-c C-x.
  
! Tue Oct 31 00:24:32 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* loadup.el: Always load menu-bar.
  
! 	* msb.el (msb--toggle-menu-type): Pass t as arg.
  
! 	* startup.el (command-line-1): Say how to invoke menu bar, if not X.
  
! 	* jka-compr.el (auto-compression-mode): Make arg optional.
  
! 	* loadup.el: Fix previous change.
  
! Mon Oct 30 19:25:42 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* mailabbrev.el (mail-abbrev-syntax-table): Fix initialization.
  
! 	* startup.el (command-line): If not X, do enable menu bar.
  
! Mon Oct 30 19:00:50 1995  Stephen Gildea  <gildea@x.org>
  
! 	* time-stamp.el: Update some doc strings.
! 	(time-stamp-strftime): Ignore some additional chars we might want
! 	to use in the future for additional controls or parameters.
! 	(time-stamp): Minor optimizations.
  
! Mon Oct 30 12:38:27 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* help.el (describe-function): Call documentation just once.
! 	(describe-key): Likewise.
  
! 	* files.el (set-auto-mode): If mode cmds move point, obey them.
  
! 	* help.el (describe-variable): Don't call substitute-command-keys.
  
! 	* rmailsum.el (rmail-summary-overlay): Make it a permanent local.
  
! 	* vmsx.el: File deleted.
  
! Mon Oct 30 03:31:21 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
  
! 	* makefile.el (makefile-define-space-face): Use frame-parameters for
! 	frame and display attributes.
  
! Sun Oct 29 17:22:51 1995  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
  
! 	* loadup.el (finding existing executable versions):
! 	Add a period to the end of BASE.
  
! 	* arc-mode.el (archive-zoo-summarize): Handle archives
! 	with long file names.
  
! 	* disass.el (disassemble-internal): Handle lazy-loaded doc strings.
! 	(disassemble-1): Handle lazy-loaded bytecode objects.
  
! 	* etags.el (select-tags-table): Don't modify the value of
! 	tags-table-list.
  
! Sun Oct 29 15:21:43 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* tmm.el (tmm-old-mb-map): Initialize to nil.
! 	(tmm-delete-map): Don't use tmm-old-mb-map if nil.
! 	(tmm-add-prompt): Bind C-n and C-p.
! 	Put only the shortcuts into the completion buffer's map.
! 	Produce the completion list by hand so as not to sort it.
! 	(tmm-prompt): Start at the first item in the menu.
! 	Don't reverse tmm-km-list; reverse compl-list instead.
! 	Use try-completion in last-ditch attempt to find a match.
! 	Rename compl-list to history.
! 	(tmm-get-keybind): Put more local bindings last in a menu.
! 	Major rewrite.
! 	(tmm-menubar): Handle menu-bar-final-items.
! 	(tmm-remove-shortcuts): Function deleted.
! 	(tmm-add-shortcuts): If we can't find a letter shortcut,
! 	use a numeric shortcut.
  
! 	* simple.el (column-number-mode): Make default value nil.
  
! 	* cc-mode.el (c-guess-basic-syntax): Verify c-access-key is non-nil
! 	before looking for it.
  
! 	* bytecomp.el (byte-recompile-directory): New arg FORCE.
! 	(byte-force-recompile): New function.
  
! 	* case-table.el (describe-buffer-case-table): Use set-char-table-range.
  
! Sat Oct 28 02:19:32 1995  Erik Naggum  <erik@naggum.no>
  
! 	* iso02-syn.el: Adapt to new char-table implementation.  Fix name
!  	of file in the first line, part number syntax of ISO standards,
!  	and `provide' clause.  Register file with RCS.
  
! 	* ange-ftp.el (ange-ftp-ftp-name,ange-ftp-replace-name-component):
!  	Use posix-string-match for complex regexp in `ange-ftp-name-format'.
! 	(ange-ftp-process-sentinel): Quote final * in buffer name match.
  
! Fri Oct 27 17:40:51 1995  Noah Friedman  <friedman@prep.ai.mit.edu>
  
!         * rlogin.el (rlogin): If `buffer' arg is a buffer object,
!         initialize `buffer-name' to the buffer name.
!         Set `buffer' to buffer actually created or returned by
!         get-buffer-create.
!         Set `proc' to the process actually in the new buffer, not the
!         process with the name buffer-name; they may not be the same if
!         buffers have been renamed.
  
! Thu Oct 26 18:38:26 1995  Ed Reingold  <reingold@spiff.gnu.ai.mit.edu>
  
!         * cal-chinese.el (calendar-chinese-sexagisimal-name): New
!         function.
!         (holiday-chinese-new-year,calendar-chinese-date-string): Use it.
  
! Thu Oct 26 14:21:26 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* files.el (set-visited-file-name, basic-save-buffer):
! 	Set buffer-file-number consistently with find-file-noselect.
  
! Thu Oct 26 09:52:51 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
  
! 	* font-lock.el: General reorganisation.
! 	(font-lock-fontify-syntactically-region): Renamed from
!  	font-lock-fontify-region.  Assume that region end-points are at bol.
! 	Don't bother wrapping with save-excursion; caller does this.
! 	(font-lock-fontify-keywords-region): Renamed from
! 	font-lock-hack-keywords.  Call font-lock-fontify-anchored-keywords if
! 	car of HIGHLIGHT is not a number (i.e., is another MATCHER, not a
! 	MATCH), for new MATCH-ANCHORED font-lock-keywords structure.
! 	(font-lock-fontify-region): Use them.
! 	(font-lock-after-change-function): Use it.  Don't bother invalidating
! 	font-lock-cache-position; called function does this.
! 	(font-lock-keywords-only): Renamed from font-lock-no-comments.
! 	(font-lock-maximum-decoration, font-lock-maximum-size): Doc fix for new
! 	functionality.
! 	(font-lock-set-defaults, font-lock-mode): Cope if they are lists.
! 	(font-lock-keywords): Doc fix for new MATCH-ANCHORED structure and
! 	new OVERRIDE values.
! 	(font-lock-fontify-anchored-keywords): New function for processing the
! 	new MATCH-ANCHORED structure.
! 	(font-lock-fillin-text-property, font-lock-prepend-text-property,
! 	font-lock-append-text-property): New text property functions.
! 	(font-lock-apply-highlight): Use them for new OVERRIDE values.
! 	(scheme-font-lock-keywords): New variable.
! 	(c-font-lock-keywords-3, c++-font-lock-keywords-3): New variables.
! 	(font-lock-defaults-alist): Use them for Scheme, C and C++ modes.
  
! 	* fast-lock.el (fast-lock-read-cache): Set fast-lock-cache-filename.
! 	(fast-lock-cache-data): Don't set it here via caller's local variable.
  
! 	* fortran.el (fortran-mode): Addition for font-lock-defaults.
! 	(fortran-font-lock-keywords-3): Rewrite using MATCH-ANCHORED structure.
  
! 	* rmail.el (rmail-font-lock-keywords): Better citation regexp.
  
! 	* sendmail.el (mail-font-lock-keywords): Likewise.
  
! Thu Oct 26 02:39:28 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* morse.el: New file.
  
! Wed Oct 25 15:23:31 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* cc-mode.el (c-mode): Add autoload.
  
! 	* loadup.el: Don't load c-mode.
! 	* loaddefs.el: Get rid of cplus-md.el; add cc-mode.el.
  
! 	* cmacexp.el: Require cc-mode.
  
! 	* hideif.el: Provide hideif; require cc-mode.
  
! 	* help.el (describe-key, describe-key-briefly): For a mouse click,
!  	go to its buffer and position before looking up the key.
  
! Wed Oct 25 13:01:36 1995  Gregor Schmid  <gs@ivu-berlin.de>
  
! 	* tcl-mode.el: Add support for imenu.
! 	Add support for font-lock-mode (thanks to <simonm@mail.esrin.esa.it>).
  
! Tue Oct 24 12:38:43 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* files.el (set-visited-file-name): Abbreviate buffer-file-name.
  
! 	* mouse.el (mouse-drag-region): Set end-of-range after
! 	calling mouse-scroll-subr.
! 	(mouse-set-region): Don't do the sit-for on a pc frame.
  
! Tue Oct 24 10:29:59 1995 Brian D. Carlstrom  <bdc@ai.mit.edu>
  
! 	* gud.el (gud-dbx-directories): New variable.
! 	(gud-dbx-massage-args): Use gud-dbx-directories.
! 	(gud-dbx-file-name): New function.
! 	(gud-irixdbx-marker-filter): Use gud-dbx-file-name.
! 	(gud-dbx-file-file): Use gud-dbx-file-name.
  
! 	* gud.el (gud-filter): Fix previous change.
  
! Tue Oct 24 11:44:45 1995  Ed Reingold  <reingold@spiff.gnu.ai.mit.edu>
  
!         * cal-menu.el (calendar-mouse-print-dates): Fix entry for Chinese
!         calendar.
  
!         * cal-chinese.el: Completely rewritten!
  
! Tue Oct 24 00:06:14 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* add-log.el (get-method-definition, get-method-definition-1):
! 	Rename var md to get-method-definition-md and defvar it.
  
! Mon Oct 23 12:50:38 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* ange-ftp.el (internal-ange-ftp-mode):
! 	Set comint-password-prompt-regexp locally to not match anything.
  
! 	* informat.el (Info-validate, Info-validate-node-name):
! 	Use buffer-substring-no-properties.
! 	(Info-tagify, batch-info-validate, Info-validate-tags-table): Likewise.
  
! 	* informat.el (Info-validate-tags-table): Change handling
! 	of newline in the loop reading node names.
  
! 	* info.el (Info-following-node-name, Info-extract-menu-node-name)
! 	(Info-select-node): Use buffer-substring-no-properties.
  
! Sun Oct 22 12:30:46 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* case-table.el (copy-case-table): New function.
! 	(set-case-syntax-delims, set-case-syntax-pair, set-case-syntax):
! 	Clear out the three extra slots.
  
! Sun Oct 22 02:28:11 1995  Erik Naggum  <erik@naggum.no>
  
! 	* derived.el (derived-mode-init-mode-variables): Make proper
!  	syntax-table.
  
! 	* iso-syntax.el: Handle new case-table implementation.
  
! Sat Oct 21 13:31:39 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* msb.el: Require cl only when compiling.
  
! Sat Oct 21 13:31:39 1995  Axel Boldt  <boldt@math.ucsb.edu>
  
! 	* electric.el (Electric-command-loop): Don't display a prompt
!         if 2nd arg equals or returns 'noprompt.
  
! 	* ehelp.el: Fix key bindings.
!         (electric-help-mode): Use mouse-leave-buffer-hook.
!         (electric-help-retain): Remove mouse-leave-buffer-hook.
! 	(with-electric-help): New argument minheight.
!         (electric-help-execute-extended): New function.
!         (electric-help-ctrl-x-prefix): New function.
! 	(electric-help-command-loop): Make messages more consistent.
! 	Include strategic sit-for 0, so that
! 	pos-visible-in-window-p will return the right thing.
! 	Make 2nd arg of Electric-command-loop return 'noprompt if we
!         are in isearch-mode.
!         Eval to-be-executed at the very end.
! 	(ehelp-map): Electrify apropos too.
  
! Fri Oct 20 15:34:39 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* noutline.el (outline-view-change-hook): New hook variable.
! 	(outline-flag-region): Run the hook.
  
! 	* informat.el (Info-validate-tags-table): Fix the scan of the
! 	tags table checking that the positions are right.
! 	(Info-validate): Use buffer-substring-no-properties.
  
! 	* dabbrev.el (dabbrev-expand): When no more expansions,
! 	Put back the original abbrev with its original case pattern.
! 	(dabbrev--find-expansion): Move buffers that are visible on the screen
! 	to the front of the list to be searched.
  
! 	* startup.el (normal-top-level): Set auto-save-list-file-name later,
! 	after calling command-line.
  
! Fri Oct 20 15:08:22 1995  Erik Naggum  <erik@naggum.no>
  
! 	* comint.el (comint-exec-1): Fix previous change.
  
! Fri Oct 20 11:22:25 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* add-log.el (add-log-current-defun):
! 	Handle `private', `public' in C++ class definitions.
  
! Thu Oct 19 01:14:59 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* isearch.el (isearch-message-prefix):
! 	Change "wrapped" to "overwrapped" when past original start point.
  
! 	* comint.el (comint-exec-1): Don't alter EMACS envvar
! 	if it's already defined.
  
! 	* cplus-md.el (calculate-c++-indent): Skip over paren-group
! 	when looking back to determine context of a top-level line.
! 	Don't treat a line starting with } as a continuation.
  
! Wed Oct 18 21:06:59 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* emacsbug.el (report-emacs-bug): Don't mention
! 	system-configuration-options if it is empty.
! 	Make it clearer what that text is.
  
! Tue Oct 17 14:10:19 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* tex-mode.el (tex-start-of-header): Now a regexp.
! 	(tex-end-of-header): Likewise.
! 	(plain-tex-mode, latex-mode, slitex-mode, tex-region):
! 	Changed accordingly.
  
! 	* pc-select.el (pc-selection-mode): Add autoload cookie.
  
! 	* pc-select.el: New file.
  
! Mon Oct 16 22:21:38 1995  Rolf Ebert  <re@waporo.muc.de>
  
! 	* ada-mode.el:
! 	All doc strings changed to comply with standard Emacs conventions.
! 	(ada-mode): Support new font-lock-mode.
! 	(ada-format-paramlist): Changed all `accept' to `access'.
! 	(ada-insert-paramlist): Changed all `accept' to `access'.
! 	(ada-in-comment-p): Use standard Emacs way `parse-partial-sexp'.
! 	(ada-font-lock-keywords-1): Change order of some alternatives.
  
! Mon Oct 16 17:45:22 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* cc-mode.el (c-emacs-features): Don't expect integer in syntax table.
  
! 	* flow-ctrl.el (enable-flow-control): Use a char-table.
  
! Sun Oct 15 04:53:55 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* mailabbrev.el (mail-abbrev-syntax-table): Rewrite using
! 	map-char-table.
  
! 	* derived.el (derived-mode-merge-syntax-tables): Rewrite using
! 	map-char-table.
  
! 	* hippie-exp.el (he-transfer-case): Fix typo in prev change.
  
! Fri Oct 13 23:14:10 1995  Michael Kifer  <Michael Kifer <kifer@cs.sunysb.edu>>
  
! 	* ediff.el (ediff-version): is now autoloaded.
! 	* ediff-init.el: Moved defsubsts up.
! 	* ediff-hook.el: Now defines [window] in menu-bar-ediff-menu.
  
! Fri Oct 13 20:14:10 1995  Michael Kifer  <Michael Kifer <kifer@cs.sunysb.edu>>
  
! 	* viper.el (vip-set-hooks): Use view-mode-hook in emacs and view
! 	hook in xemacs.
! 	(vip-read-string-with-history): minibuffer-setup-hook no longer
! 	waits for the user to type, if there are unread events.
! 	Added (vip-leave-region-active) to all simple movement commands.
! 	Viper now understands syntactic tables.
! 	Harnessed view-minor-mode.
! 	(vip-read-string-with-history,vip-search): won't pause inside
! 	macros any more.
! 	* viper-mous.el (vip-surrounding-word): modified to understand
! 	tripple clicks.
! 	* viper-util.el (vip-leave-region-active): new function.
! 	* viper-ex.el (ex-write): uses better defaults.
! 	* viper-macs.el (vip-record-kbd-macro): correctly escapes `.' and
! 	`[' now.
  
! Fri Oct 13 15:17:28 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* help.el (variable-at-point, function-called-at-point):
! 	Switch temporarily to emacs-lisp-mode-syntax-table.
  
! 	* goto-addr.el: New file.
! 	* browse-url.el: New file.
  
! Fri Oct 13 1995  Anders Holst (aho@nada.kth.se)
  
! 	* hippie-exp.el:
! 	(hippie-expand): Removed bug - don't undo from another buffer.
! 	(he-reset-string): Removed bug - don't move markers.
! 	(he-capitalize-first): New function, defining new "case".
! 	(he-transfer-case): New function.
! 	(he-transfer-case-ok): Function removed.
! 	(he-substitute-string,he-ordinary-case-p,he-string-member): Use the
! 	new functions above, for the new case handling.
! 	(he-file-name-chars): New variable.
! 	(he-file-name-beg): Use `he-file-name-chars'.
! 	(he-file-name-nondirectory,he-file-name-directory,
! 	he-file-directory-p,he-concat-directory-file-name): New functions
! 	to handle VMS and PC filename formats more accurately.
! 	(try-complete-file-name,try-complete-file-name-partially): Use the
! 	new functions above.
! 	(try-expand-line-all-buffers,try-expand-list-all-buffers,
! 	try-expand-dabbrev-all-buffers): Use `case-fold-search' from the
! 	original buffer.
! 	(he-line-beg): Removed bug that made point move.
! 	(try-expand-all-abbrevs): Check that abbrev tables exist before use.
! 	(try-expand-dabbrev-visible): New try function.
! 	(he-search-window): New variable used by `try-expand-dabbrev-visible'.
! 	(he-dab-search-regexp): Function removed.
! 	(he-dab-search): Renamed to `he-dabbrev-search'.
! 	(he-dabbrev-search): Find only whole matching symbols.
! 	(he-dabbrev-skip-space): New variable.
! 	(he-dabbrev-beg): Use `he-dabbrev-skip-space'.
! 	(try-expand-dabbrev-from-kill,he-dabbrev-kill-search): New try
! 	function, with requisites.
! 	(try-expand-whole-kill,he-whole-kill-search,he-kill-beg): New try
! 	function, with requisites.
! 	(he-search-loc2): New variable, used by `try-expand-whole-kill'
! 	and `try-expand-dabbrev-from-kill'.
! 	(hippie-expand-try-functions-list): Added the try functions
! 	`try-complete-file-name-partially', `try-expand-dabbrev-from-kill'
! 	and `try-complete-lisp-symbol-partially'.
! 	(Several functions): Adjusted and corrected use of `he-tried-table'.
  
! Fri Oct 13 09:06:37 1995  Ed Reingold  <reingold@spiff.gnu.ai.mit.edu>
  
!         * cal-tex.el: Minor fixes to doc strings and other small changes.
  
! Thu Oct 12 13:55:26 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* help.el (variable-at-point, function-called-at-point):
! 	Fix revious changes.
  
! 	* iso-transl.el: Handle aliases dead-acute,...
  
! Thu Oct 12 11:28:50 1995  Ed Reingold  <reingold@cs.uiuc.edu>
  
!         * cal-tex.el: New file.
  
!         * calendar.el: Add autoloads and key definitions for cal-tex.el.
  
!         * cal-menu.el: Add menu items for cal-tex.el.
  
! Wed Oct 11 14:26:34 1995  Robert J. Chassell  <bob@hill.gnu.ai.mit.edu>
  
!         * texinfmt.el (texinfo-unsupported): Handle commands in all capitals.
  
! Wed Oct 11 11:38:55 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* files.el (find-alternate-file-other-window): New function.
  
! Wed Oct 11 01:23:31 1995  Michael Kifer  <kifer@cs.sunysb.edu>
  
! 	* menu-bar.el: Moved (define-key menu-bar-ediff-menu ...) to
! 	ediff-hook.el, as menu-bar-ediff-menu is not defined yet.
  
! Wed Oct 11 00:59:00 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* fill.el (adaptive-fill-function): Change defun to defvar.
  
! Tue Oct 10 12:52:39 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* simple.el (next-completion): Specify the LIMIT arg when
! 	searching for text properties.
  
! 	* help.el (function-called-at-point, variable-at-point):
! 	Don't back up if we start at the beginning of a symbol.
  
! 	* disp-table.el (display-table-slot, set-display-table-slot):
! 	Get slot number from a property of its name.
! 	Eliminate the type-checking.
! 	(make-display-table): Call make-char-table the new way.
! 	(describe-display-table): Use slot names to access slots.
! 	(display-table): Give it the char-table-extra-slots property.
! 	(display-table-char-p, display-table-vector-p): Functions deleted.
! 	(display-table-slot-name-alist): Variable deleted.
  
! Mon Oct  9 22:30:42 1995  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
  
! 	* mail-utils.el (mail-strip-quoted-names): Preserve white space
!  	after comma when stripping text outside of <> delims.
  
! Mon Oct  9 15:41:18 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* view.el: Doc fixes.
! 	(view-highlight-face): New variable.
! 	(view-search): Use that variable.
  
! Mon Oct  9 14:01:04 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* etags.el (tags-table-check-computed-list): Map
! 	 tags-expand-table-name over lists of included tables.
  
! Mon Oct  9 13:44:43 1995  Erik Naggum  <erik@naggum.no>
  
! 	* disp-table.el: New implementation with char-tables.
  
! Mon Oct  9 13:08:04 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xt-mouse.el: New file.
  
! Mon Oct  9 00:49:37 1995  Noah Friedman  <friedman@prep.ai.mit.edu>
  
! 	* mailabbrev.el (mail-abbrev-syntax-table): Use `equal' instead of
! 	`=', in case elts of syntax table are lists, not integers.
  
! Sun Oct  8 15:58:21 1995  Erik Naggum  <erik@naggum.no>
  
! 	* ada-mode.el (ada-gen-treat-proc): Bind `procname' and `functype'.
  
! 	* view.el (view-exit): Delete view-overlay only if it exists.
  
! Sun Oct  8 14:56:12 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* server.el (server-start): Try both full hostname and shortened
! 	hostname when deleting the socket file.
  
! 	* gud.el (gud-filter): Move the gud-display-frame call
! 	outside of the save-excursion.  New var process-window
! 	controls which window to do it in.
  
! Sat Oct  7 00:08:29 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* subr.el (make-syntax-table): Use nil for "inherit".
  
! Fri Oct  6 11:11:31 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* bytecomp.el (byte-compile-from-buffer): Bind print-level.
  
! 	* simple.el (newline): Call barf-if-buffer-read-only.
  
! 	* iso-acc.el: Fix typo calling iso-accents-customize.
! 	(iso-accents-compose): If this-command is non-nil, do prompt.
  
! Thu Oct 5  20:54:29 1995  Michael Kifer  <kifer@cs.sunysb.edu>
  
! 	* ediff-meta.el: new file.
! 	* ediff-hook.el: new file.
! 	* ediff.el: Moved menubar definitions to a new file, ediff-hook.el
! 	(ediff-files,ediff-merge-files): better file-name defaults.
! 	(ediff-split-string): new function.
! 	(ediff-exec-process): now handles diff args separated by space.
! 	(ediff-backup-extension): new variable.
! 	Replaced -hooks with -hook.
! 	(ediff-revision-key): variable deleted.
! 	* ediff-util.el (ediff-toggle-read-only,ediff-read-file-name):
! 	replaced abbreviate-file-name with ediff-abbreviate-file-name.
! 	(ediff-documentation): bug fix.
! 	(ediff-setup,ediff-really-quit): modified to work with Ediff
! 	session groups.
! 	(ediff-quit,ediff-really-quit): now ask if the user wants to delete
! 	buffers.
! 	* ediff-init.el (ediff-abbreviate-file-name): function modified.
! 	(ediff-truncate-string-left): new function.
! 	(ediff-strip-last-dir,ediff-key-press-event-p,ediff-event-point,
! 	ediff-event-buffer): new functions.
! 	(ediff-frame-has-menubar,ediff-protect-meta-chars): functions deleted.
! 	* ediff-wind.el (ediff-make-frame-position): fixed bugs.
! 	(ediff-control-frame-parameters): fixed defaults.
! 	* ediff-diff.el (ediff-setup-diff-regions,ediff-setup-diff-regions3,
! 	ediff-setup-fine-diff-regions): functions modified.
! 	(ediff-shell-command,ediff-shell-command-sentinel,
! 	ediff-shell-command-filter): deleted.
! 	(ediff-exec-process,ediff-process-sentinel,ediff-process-filter): new.
  
! Thu Oct  5 18:24:01 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* appt.el (appt-disp-window): Call raise-frame.
  
! 	* view.el (View-search-regexp-forward, View-search-regexp-backward):
! 	If arg is empty, use view-last-regexp.
! 	(view-overlay): New variable, local in all buffers.
! 	(view-search): Highlight the match using view-overlay.
! 	(view-exit): Delete view-overlay.
  
! Wed Oct  4 11:59:54 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* desktop.el (desktop-outvar): Support truncation.
! 	(desktop-globals-to-save): Doc fix.
  
! 	* startup.el (command-line): Init user-mail-address here,
! 	after reading init file.
! 	(normal-top-level): Not here.
  
! 	* gnuspost.el (gnus-inews-do-fcc): Use mail-file-babyl-p.
  
! 	* gnus.el (gnus-summary-save-in-mail): Use mail-file-babyl-p.
  
! 	* startup.el (auto-save-list-file-prefix): New variable.
! 	(normal-top-level): Use it.
  
! 	* files.el (recover-session): Use auto-save-list-file-prefix.
  
! 	* sendmail.el (mail-signature-file): New variable.
! 	Fix various doc strings to mention it.
! 	(mail-signature): Use mail-signature-file.
  
! 	* unrmail.el (unrmail): Call rmail-toggle-header.
  
! 	* isearch.el (isearch-forward): Doc fix.
  
! Wed Oct  4 11:15:40 1995  Andre Spiegel  <spiegel@pogo.gnu.ai.mit.edu>
  
! 	* vc.el (vc-next-action-on-file): When locking the latest trunk
! 	version, use empty version number.
  
! Sun Oct  1 16:33:43 1995  Noah Friedman  <friedman@prep.ai.mit.edu>
  
!         * terminal.el (te-escape): Remove spurious partial duplicate
!         definition.
  
! Sun Oct  1 13:59:29 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* files.el (recover-session-finish): Ask only about files that
!  	have auto-save files now.  Don't put "temp" into temp file names.
  
! Sat Sep 30 12:35:24 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* files.el (cd): Fix interactive spec to require match if there is
! 	no CDPATH.
  
! Thu Sep 28 23:48:41 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* comint.el (comint-password-prompt-regexp): Recognize
! 	Old Password and New password.
  
! Thu Sep 28 16:36:14 1995  Michael Ernst  <mernst@rice.edu>
  
! 	* ispell.el (ispell-message-text-end): Match reporter.el bug reports.
  
! Thu Sep 28 15:18:50 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* help.el (print-help-return-message): Handle lists in
! 	special-display-regexps and same-window-regexps.  Also in
!  	special-display-buffer-names and same-window-buffer-names
  
! 	* files.el (interpreter-mode-alist): Handle nawk.
  
! Wed Sep 27 11:25:56 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
  
! 	* sendmail.el (sendmail-send-it): Handle FCC after all text changes.
! 	(mail-do-fcc): Don't add From field here.
  
! 	* undigest.el (undigestify-rmail-message): Better error messages.
  
! Tue Sep 26 15:33:27 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
  
! 	* ange-ftp.el (ange-ftp-dumb-unix-host): Avoid error if HOST is nil.
  
! Mon Sep 25 18:14:51 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
  
! 	* add-log.el (add-log-current-defun): Ignore quotes before fcn name.
  
! Mon Sep 25 14:53:24 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* info.el (Info-title-face-alist): New var.
! 	(Info-fontify-node): Check for headings that are `underlined' with
! 	characters on the following line.
  
! Mon Sep 25 10:53:57 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
  
! 	* help.el (help-mode): Call view-mode.
  
! 	* diary.el (mark-sexp-diary-entries): Add \ for C-M-f's sake.
  
! 	* view.el (view-mode-enter): Renamed from view-mode.  Callers changed.
! 	Don't create local vars here.  Set view-mode-auto-exit.
! 	Don't change local map--just set view-mode.
! 	(view-mode): New function toggles minor mode in the usual way.
! 	(view-mode-map): Put this on minor-mode-map-alist.
! 	(view-mode-exit): Do the exit actions only if view-mode-auto-exit.
! 	(View-scroll-lines-forward): Exit only if view-scroll-lines-forward.
!  	(view-mode-auto-exit, view-old-buffer-read-only)
! 	(view-old-Helper-return-blurb, view-scroll-size, view-last-regexp)
! 	(view-exit-action, view-return-here, view-exit-position):
! 	Defvar them and make them always-local.
  
! Mon Sep 25 06:53:32 1995  Erik Naggum  <erik@naggum.no>
  
! 	* startup.el (command-line-1): --eval: Don't print the value.
! 	(command-line-1): --insert: Don't complain on --insert=file.
  
! Sun Sep 24 19:24:35 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
  
! 	* replace.el (occur): Indent better for matches that contain newlines.
  
! Sat Sep 23 23:49:25 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* jka-compr.el (auto-compression-mode): Add autoload cookie.
! 	Renamed from toggle-auto-compression.
! 	(toggle-auto-compression): Define as alias.
  
! Fri Sep 22 17:51:48 1995  Erik Naggum  <erik@naggum.no>
  
! 	* cl-macs.el (get-setf-method): Protect caller's match-data from
! 	string-match.
  
! Fri Sep 22 17:33:18 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* edt.el (edt-setup-default-bindings): Revert function is
! 	revert-buffer, not revert-file.
  
! Fri Sep 22 17:31:07 1995  Torbjorn Einarsson <T.Einarsson@clab.ericsson.se>
  
! 	* f90.el: Major revision.
! 	Much improved and quicker highlighting using font-lock.
! 	Support for hilit19 removed.
! 	Support for imenu added.
! 	Changed indentation for continue statements.
! 	Added treatment of preprocessor directives.
! 	(f90-directive-comment-re) is now a regular expression.
! 	Many bug fixes.
  
! Fri Sep 22 15:36:23 1995  Ed Reingold  <reingold@spiff.gnu.ai.mit.edu>
  
! 	* cal-menu.el (calendar-mouse-chinese-date): New function.
! 	(calendar-mouse-print-dates): Use it.
  
! Thu Sep 21 21:38:19 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* sendmail.el (mail-do-fcc): Erase the ` mail-temp' buffer.
! 	(mail-do-fcc): Clear read-only flag in ` mail-temp' buffer.
  
! 	* undigest.el (undigestify-rmail-message): Scan back as far as start
! 	of message, to find end of digest.
  
! 	* rmailout.el (rmail-file-p): Function moved to mail-utils.el
! 	ad renamed to mail-file-babyl-p.
! 	(rmail-output, rmail-output-to-rmail-file): Use new name.
! 	* mail-utils.el (mail-file-babyl-p): Function moved from
! 	rmail.el and renamed.
  
! 	* sendmail.el (mail-file-babyl-p): Function deleted.
! 	(sendmail-send-it): Load mail-utils first thing.
  
! Thu Sep 21 18:01:48 1995  Erik Naggum  <erik@naggum.no>
  
! 	* byte-opt.el (byte-boolean-vars): Update list to reflect actual
!  	DEFVAR_BOOL symbols in the C code.
  
! Thu Sep 21 16:53:08 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* edt.el (edt-set-screen-width-80, edt-set-screen-width-132):
! 	If a terminal-specific function exists, call it.
! 	* edt-vt100.el (edt-set-term-width-80, edt-set-term-width-132):
! 	Terminal-specific functions.
! 	Don't redefine edt-set-screen-width-80 and edt-set-screen-width-132.
  
! 	* terminal.el (te-escape, te-escape-help): Handle non-ASCII events.
  
! Tue Sep 19 16:02:37 1995  Edward M. Reingold  <reingold@emr.cs.uiuc.edu>
  
! 	* cal-chinese.el: New file.
  
! 	* cal-coptic.el: New file.
  
! 	* cal-julian.el: New file.  All Julian calendar related code moved here
! 	from calendar.el, holidays.el, and diary-lib.el.
  
! 	* cal-iso.el: New file.  All ISO calendar related code moved here
! 	from calendar.el and diary-lib.el.
  
! 	* cal-islamic.el: New file. All Islamic calendar related code
! 	moved here from calendar.el, holiday.el, diary-lib.el, and
!  	diary-ins.el.
  
! 	* cal-hebrew.el: New file. All Hebrew calendar related code
! 	moved here from calendar.el, holiday.el, diary-lib.el, and
!  	diary-ins.el.
  
! 	* cal-move.el: New file.  All functions related to movement in the
! 	calendar moved here from calendar.el.
  
! 	* diary.el: New file.  Functions related to the diary moved from
! 	diary-lib.el and diary-ins.el.
  
! 	* holidays.el (holiday-hebrew):  Moved to cal-hebrew.
! 	(holiday-islamic): Moved to cal-islamic.
! 	(holiday-julian): Moved to cal-julian.
  
! 	* cal-x.el (calendar-setup):  Moved to calendar.el.
  
! 	* diary-lib.el: Deleted.
!  	(diary-date, diary-remind): New functions.
!   	(list-sexp-diary-entries): Mention them in doc string.
!   	(diary-remind-message, marking-diary-entries,
! 	marking-diary-entry): New variables.
!   	(diary-mark-sexp-diary-entries, mark-diary-entries): Rewritten to
!  	accomodate marking-diary-entries.
! 	(diary-sexp-entry): Fix indentation.
! 	(diary-chinese-date, diary-coptic-date, diary-ethiopic-date):
! 	Do autoloads.
! 	(diary-islamic-date, list-islamic-diary-entries,
! 	mark-islamic-diary-entries, mark-islamic-calendar-date-pattern):
! 	Moved to cal-islamic.el.
! 	(diary-hebrew-date, list-hebrew-diary-entries,
! 	mark-hebrew-diary-entries, mark-hebrew-calendar-date-pattern):
! 	Moved to cal-hebrew.el.
! 	Everything else moved to diary.el.
  
! 	* diary-ins.el: Deleted.
! 	(insert-islamic-diary-entry, insert-monthly-islamic-diary-entry,
!  	insert-yearly-islamic-diary-entry): Moved to cal-islamic.el.
!   	(insert-hebrew-diary-entry, insert-monthly-hebrew-diary-entry,
!  	insert-yearly-hebrew-diary-entry): Moved to cal-hebrew.el.
!   	Everything else moved to diary.el.
  
! 	* cal-menu.el (calendar-mouse-print-dates): Add Chinese and Coptic
! 	dates; fix astro date message.
! 	(calendar-mouse-2-date-menu): Add dayname to menu.
  
! 	* cal-french.el (french-calendar-special-days-array,
!  	calendar-french-date-string): Fix accents.
! 	(calendar-goto-french-date): Use reverse instead of nreverse; fix
! 	accents.
!         (french-calendar-epoch): New variable.
! 	(calendar-french-from-absolute, calendar-absolute-from-french): Use it.
  
! 	* cal-dst.el: Fix commentary.
! 	(dst-adjust-time): Moved and renamed from solar.el.
! 	(dst-in-effect): New function.
  
! 	* solar.el (solar-equinoxes-solstices, solar-ephemeris-correction,
! 	solar-equinoxes/solstices): Rewritten.
! 	(solar-apparent-longitude-of-sun): Deleted.
!         (solar-longitude, solar-date-next-longitude): New functions.
! 	(solar-adj-time-for-dst): Renamed dst-adjust-time and moved to
! 	cal-dst.el.
! 	(solar-sin-degrees, solar-cosine-degrees, solar-tangent-degrees):
! 	Take angle mod 360.0.
! 	(solar-tangent-degrees): Change to macro.
  
! 	* calendar.el (calendar-mod, calendar-absolute-from-astro,
!  	calendar-astro-from-absolute): New functions.
!   	(calendar-astro-date-string, calendar-goto-astro-day-number): Use
!  	them.  Autoload holiday-chinese-new-year,
!  	calendar-goto-chinese-date, calendar-print-chinese-date,
!  	calendar-chinese-date-string, calendar-goto-coptic-date,
!  	calendar-print-coptic-date, calendar-coptic-date-string,
!  	calendar-goto-ethiopic-date, calendar-print-ethiopic-date,
!  	calendar-ethiopic-date-string, calendar-one-frame-setup, and
!  	calendar-two-frame-setup.  (oriental-holidays): New variable for
!  	Chinese New Year.  (calendar-mode-map): Put Chinese and Coptic
!  	calendar functions on keys.  (calendar-setup): Moved here from
!  	cal-x.el.  (diary-file): Mention Chinese, Coptic, and Ethiopic
!  	dates.  (calendar-goto-today, calendar-forward-month,
!  	calendar-forward-year, calendar-backward-month,
!  	calendar-backward-year, scroll-calendar-left,
!  	scroll-calendar-right, scroll-calendar-left-three-months,
!  	scroll-calendar-right-three-months,
!  	calendar-cursor-to-nearest-date, calendar-forward-day,
!  	calendar-backward-day, calendar-forward-week,
!  	calendar-backward-week, calendar-beginning-of-week,
!  	calendar-end-of-week, calendar-beginning-of-month,
!  	calendar-end-of-month, calendar-beginning-of-year,
!  	calendar-end-of-year, calendar-cursor-to-visible-date,
!  	calendar-goto-date, calendar-goto-iso-date): Moved to cal-move.el.
!   	(calendar-goto-julian-date): Moved to cal-julian.
!   	(calendar-cursor-to-date, generate-calendar-month): Consider the
!  	space next to a one-digit date as being on that date.
  
! 	* cal-mayan.el (calendar-mayan-tzolkin-from-absolute): Use them.
! 	(mayan-adjusted-mod): Moved to calendar.el and renamed calendar-mod.
  
! 	* lunar.el (lunar-new-moon-time, lunar-new-moon-on-or-after) New
! 	functions.
  
  
! Mon Sep 18 10:45:24 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* subr.el (substitute-key-definition): Do recursively scan
! 	where KEYMAP has nothing at all.
  
! 	* mouse.el (C-down-mouse-1): Use buffer menu, not font menu.
! 	(S-down-mouse-1): Put font menu here.
  
! 	* mouse.el (mouse-drag-vertical-line): New function.
! 	(mouse-scroll-min-lines): New variable.
! 	(mouse-scroll-subr): Use it.
  
! Sun Sep 17 10:11:08 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* files.el (find-alternate-file): Kill any preexisting ` **lose**' buf.
  
! Thu Sep 14 10:44:41 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* dunnet.el (dun-climb): Handle unknown object name.
! 	(dun-objnames): Add "palm" as alias for "tree".
  
! 	* indent.el (indent-for-tab-command): Get the prefix arg
! 	and pass it along to indent-line-function if it isn't nil.
  
! Thu Sep 14 03:25:26 1995  Andre Spiegel  <spiegel@berlin.informatik.uni-stuttgart.de>
  
! 	* vc-hooks.el (vc-fetch-master-properties): Call "cvs status"
! 	in the right directory, passing only the nondirectory part of
! 	the file name.
! 	(vc-find-cvs-master): Bind `mtime' locally instead of using it
! 	as a free variable.
  
! Tue Sep 12 00:31:50 1995  Erik Naggum  <erik@naggum.no>
  
! 	* dired-x.el: Remove `dired-up-directory'.
! 	(dired-find-buffer-nocreate): Add optional argument `mode' like
! 	the function it redefines from dired.el.
  
! 	* dired.el (dired-up-directory): Add optional argument
! 	`other-window' to obviate the need to redefine it in dired-x.el.
  
! Tue Sep 12 16:57:07 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* files.el (auto-mode-alist): .pl is now Perl.
  
! 	* delsel.el (clipboard-yank): Add delete-selection property.
  
! Mon Sep 11 19:33:17 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* server.el (server-process-filter): Ignore lines that don't start
! 	with `Error:' or `Client:'.
  
! Fri Sep  8 16:43:10 1995  Andre Spiegel  <spiegel@berlin.informatik.uni-stuttgart.de>
  
! 	* dired.el (dired-internal-noselect): Set dired-directory
! 	when refreshing a buffer that displays a list of files.
! 	(dired-find-buffer-nocreate): Handle the case when
! 	dired-directory is a list.
! 	(dired-sort-other): Don't set mode-name if we are not in
! 	dired-mode.
  
! 	* vc.el (vc-dired-mode): Now a major mode derived from dired-mode.
! 	(vc-directory): Take DIRNAME as an argument.  Ask for it in
! 	the minibuffer.  Don't kill pre-existing vc-dired buffers
!         (dired now re-uses the right one).
! 	(vc-file-tree-walk): New argument DIRNAME.  Updated all callers.
! 	(vc-dired-update): New function.  `g' in vc-dired-mode calls it.
! 	(vc-dired-reformat-line): Handle different ls -l formats.
  
! 	* vc-hooks.el (vc-locking-user): Fixed wrong parentheses.
  
! Fri Sep  8 13:19:17 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* register.el: Rename all register-name args to `register'.
  
! Thu Sep  7 06:12:50 1995  Paul Eggert  <eggert@twinsun.com>
  
! 	* env.el (setenv): Call set-time-zone-rule when setting TZ.
  
! Thu Sep  7 00:14:51 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* text-mode.el (center-line): New arg NLINES.
! 	Do nothing for lines that are too wide.
  
! 	* hexl.el (hexl-current-address): New arg VALIDATE.
! 	Handle point values in the ASCII text section and in the addresses.
! 	(hexl-insert-char): Handle point located in the ASCII text.
  
! Wed Sep  6 12:42:02 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* info.el (Info-suffix-list): Add .inf to MSDOS list.
  
! 	* ange-ftp.el (ange-ftp-gwp-filter): Go to process buffer
! 	before getting text from it.
  
! 	* mouse.el (mouse-drag-region): Record where the mouse drag has reached
! 	and use that to adjust the drag event before replaying it.
  
! 	* gud.el (gud-filter): Save up text that arrives while processing
! 	previous text.
  
! Wed Sep  6 14:28:03 1995  Fred Pierresteguy  <F.Pierresteguy@frcl.bull.fr>
  
! 	* rmailsum.el (rmail-summary-construct-io-menu): Use all of FILES.
! 	Also disable the menu instead of not displaying it, if FILES is empty.
  
! Tue Sep  5 17:28:56 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* browse-url.el: New file.
  
! Mon Sep  4 16:25:53 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* mailabbrev.el (mail-interactive-insert-alias):
! 	Call mail-abbrev-expand-hook.
  
! Sat Sep  2 12:27:45 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* info.el (info-insert-file-contents): Use info-insert-file-contents-1
! 	to set FULLNAME.  Use call-process-region to run the decode program.
! 	(Info-find-node): Use info-insert-file-contents-1.
! 	(info-insert-file-contents-1) [MSDOS]: Don't use the dot in SUFFIX
! 	if FILENAME already has one.
  
! 	* dired.el (dired-internal-noselect): New arg MODE.
! 	If it's non-nil, switch to that nil.
! 	(dired-find-buffer-nocreate): New arg MODE.
  
! 	* mouse.el (mouse-drag-region): Store the right end position
! 	in the drag-event before replaying it at the end.
  
! 	* files.el (auto-mode-alist): Handle .f90 files.
  
! 	* dired.el (dired-internal-noselect): Use dirname when finding
! 	existing buffer.
  
! Thu Aug 31 19:48:44 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* cc-compat.el: New file.
  
! 	* sendmail.el (sendmail-send-it): Use user-mail-address.
  
! Thu Aug 31 23:41:21 1995  Barry Warsaw  <bwarsaw@anthem (Barry Warsaw)>
  
! 	* cc-mode.el (c-backslashify-current-line): Obsolete.
! 	(c-append-backslash, c-delete-backslash): Taken from c-mode.el.
! 	(c-backslash-region): Likewise.
  
! 	* cc-mode.el (c-indent-defun): Watch out for point being on the
! 	first top-level open brace in the buffer.
  
! 	* cc-mode.el (c-copy-tree, c-mapcar-defun): Define functions only
! 	available in XEmacs 19.12, or Emacs 19 + lucid.el.
  
! 	* cc-mode.el (c-lineup-ObjC-method-call): New implementation
! 	better handles 1. indentation of arguments to keyword parameters,
! 	2. multiline method calls.
  
! 	* cc-mode.el (c-electric-brace): Fixed preservation of
! 	no-whitespace before brace.
  
! 	* cc-mode.el (c-guess-basic-syntax): CASE 5A.1: Watch out for
! 	c-state-cache; it may or may not be in place, but it should be
! 	ignored.
  
! 	* cc-mode.el (c-electric-colon): In call to c-lookup-lists, fixed
! 	incorrect quoting of symbols in the quoted list.
  
! 	* cc-mode.el (c-search-uplist-for-classkey): Watch out for
! 	embedded c-class-key keywords.
  
! 	* cc-mode.el (c-common-init): Make a deep copy of c-offsets-alist
! 	so that changing the buffer-local value in one buffer doesn't
! 	affect the global value, or other buffers.
  
! 	* cc-mode.el (c-snug-do-while): forward-sexp call could fail;
! 	wrap it in a c-safe.
  
! 	* cc-mode.el (c++-mode, objc-mode): comment-multi-line must be nil
! 	if // is the default comment style.
  
! Thu Aug 31 11:04:43 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* ange-ftp.el (ange-ftp-vms-sans-version): Accept extra args.
  
! Wed Aug 30 12:01:14 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* simple.el (kill-new): Compute 2nd arg to interprogram-cut-function
! 	based on REPLACE.
  
! 	* files.el (list-directory): Set default-directory.
  
! Wed Aug 30 14:37:25 1995  Per Abrahamsen  <abraham@dina.kvl.dk>
  
! 	* mouse.el (mouse-skip-word): Skip complete symbol when over a
! 	character with symbol syntax.
  
! Tue Aug 29 11:30:37 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* dired-aux.el (dired-byte-compile): Report failure if output file
! 	is not created.
  
! 	* term/x-win.el (function-key-map): Consistently map CLEAR to C-l.
  
! Tue Aug 29 06:57:29 1995  Andre Spiegel  <spiegel@berlin.informatik.uni-stuttgart.de>
  
! 	* vc-hooks.el (vc-utc-string): New function.
! 	(vc-find-cvs-master): Use it to compare mtime and checkout time.
! 	(vc-locking-user): CVS case: *only* use checkout time.
! 	(vc-find-cvs-master): Don't attempt to find the RCS master file.
! 	Throw the full name of CVS/Entries.
! 	(vc-name): Doc change (special CVS case).
! 	(vc-after-save): Handle the case when a file is saved in the very
! 	second in which it was checked out.
  
! 	* vc.el (vc-dired-update-line): Don't use dired-do-redisplay.
! 	(vc-next-action-dired): Adjust default-directory before calling
! 	vc-next-action-on-file.
! 	(vc-next-action-on-file): Handle CVS merge in vc-dired-mode correctly.
! 	(vc-next-action): Ask for a check-in comment if there are "added"
! 	CVS files.  Don't special-case single files in vc-dired-mode.
! 	(vc-file-clear-masterprops): Typo fix.
! 	(vc-latest-on-branch-p): Always true for CVS.
! 	(vc-directory): Header change.  Do display the buffer, even if no
! 	locked/registered files were found.
  
! Mon Aug 28 11:09:11 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* files.el (recover-session-finish): Catch erorr in recover-file.
  
! 	* makefile.el (makefile-font-lock-keywords): Highlight lines with
! 	tab followed by #, and initial spaces preceding tabs--not all
! 	initial spaces.
  
! Sun Aug 27 03:19:50 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* tmm.el: Fix typo in global-map define.
  
! 	* cl-seq.el (rassoc): Definition deleted.
  
! 	* mailabbrev.el (mail-mode-syntax-table): defvar deleted.
  
! 	* edebug.el: Delete redundant defvars of built-in variables.
  
! 	* edmacro.el: Load cl only during compilation.
! 	(edmacro-mismatch, edmacro-subseq): New functions.
! 	Use them instead of mismatch and subseq.
  
! 	* hideif.el (hide-ifdef-hiding): Delete duplicate defvar.
  
! 	* modula2.el (m2-execute-monitor-command): Renamed from
! 	execute-monitor-command.
  
! Sat Aug 26 16:24:44 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* refer.el (refer-every): Renamed from every.
!   	(refer-convert-string-to-list-of-strings): Renamed from
!  	convert-string-to-list-of-strings.
  
! 	* levents.el (eventp): Duplicate definition deleted.
  
! 	* ws-mode.el (wordstar-center-line): Renamed from center-line.
! 	(wordstar-center-region): Renamed from center-region.
! 	(wordstar-center-paragraph): Renamed from center-paragraph.
  
! 	* x-menu.el: Doc fixes.
! 	(caar, cdar): Deleted--use (car (car ...)).
  
! 	* find-file.el (ada-spec-suffix): Definition deleted.
! 	(ada-make-filename-from-adaname): Delete autoload.
! 	(ff-special-constructs): Load ada-mode before referring to
! 	ada-spec-suffix and ada-make-filename-from-adaname.
  
! 	* life.el (abs): Function definition deleted.
! 	(goto-beginning-of-buffer): Macro deleted.  Use goto-char.
! 	(goto-end-of-buffer): Macro deleted.  Use goto-char.
! 	(maxint): Macro deleted.
! 	(life-increment): Renamed from increment.
! 	(life-initialized): New variable.
! 	(life): Do (random t) only once and only when `life' is called.
  
! 	* info.el (Info-default-directory-list): Duplicate defvar deleted.
  
! Fri Aug 25 17:18:04 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* uniquify.el: New file.
  
! 	* mailabbrev.el (rebuild-mail-abbrevs): FILE defaults to visited file.
  
! 	* executable.el (executable-set-magic): Use make-local-hook
! 	for after-save-hook.
  
! 	* files.el (basic-save-buffer): Doc fix.
! 	(after-save-hook): Add defvar.
  
! Fri Aug 25 14:39:29 1995  Andre Spiegel  <spiegel@berlin.informatik.uni-stuttgart.de>
! 	* vc.el: Enhanced vc-dired-mode.
! 	(vc-directory): Kill existing vc-dired buffers for this directory.
! 	Provide a better header.  Corrected the check whether any files were
! 	found at all (don't display a listing in this case).  Under CVS,
! 	display cvs-status rather than vc-locking-user.
! 	(vc-next-action-on-file): When doing a check-in in vc-dired-mode, find
! 	the file in another window.
! 	(vc-next-action-dired): Update dired listing while processing the
! 	files.
! 	(vc-next-action): Check whether a check-in comment is really needed
! 	for this mass operation.
! 	(vc-checkout): Resynch the buffer, even if it's not current.
! 	(vc-dired-state-info, vc-dired-update-line): New functions.
! 	(vc-dired-prefix-map): Added local definition for `g' and `='.
! 	(vc-dired-reformat-line): Simplified.  Erase the hardlink count from
! 	the listing, because it doesn't relate to version control.
  
! 	* vc.el: Added functions to dispatch on backend release numbers.
! 	Under RCS, use this to find out whether new features can be used.
! 	(vc-rcs-release, vc-cvs-release, vc-sccs-release): New variables, may
! 	be set by the user.
! 	(vc-backend-release, vc-release-greater-or-equal,
! 	vc-backend-release-p): New Functions.
! 	(vc-do-command): Allow FILE to be nil.
! 	(vc-backend-checkin): When creating a branch, don't bother to unlock
! 	the old version if this is RCS 5.6.2 or higher.
! 	(vc-next-action-on-file): Allow lock-stealing only if RCS 5.6.2 or
! 	higher.
! 	(vc-backend-admin, vc-backend-checkin): If available, use ci -i
! 	and -j.  Updated Developer's Notes.
  
! 	* vc.el (vc-backend-diff): Handle the case of a locally added CVS
! 	file correctly.
  
! 	* vc-hooks.el (vc-fetch-master-properties): Count cvs status
! 	"Needs Patch" as `needs-checkout'.
! 	(vc-after-save): Clear the cvs status.
  
! Fri Aug 25 12:39:51 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* etags.el (next-file): Advance next-file-list before finding the
! 	file named in its car, in case finding signals an error.
  
! Fri Aug 25 10:15:53 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* help.el (describe-function): Show file name for autoloaded fns.
  
! 	* simple.el (what-line): Print narrowed linenum with full buffer num.
  
! Thu Aug 24 01:24:48 1995  Tom Tromey  <tromey@irish.colorado.edu>
  
! 	* makefile.el (makefile-mode-syntax-table): "]" is a close-paren.
! 	(makefile-add-log-defun): Avoid error at eob.
  
! Wed Aug 23 19:40:22 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* makefile.el: Doc fixes.
! 	(makefile-font-lock-keywords): Highlight lines of just whitespace.
  
! Tue Aug 22 16:24:49 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* edebug.el (edebug-outside-post-command-idle-hook)
! 	(post-command-idle-hook): New variables.
! 	(edebug-enter, edebug-outside-excursion): Use them.
  
! 	* avoid.el (mouse-avoidance-mode): Use post-command-idle-hook.
! 	Use remove-hook.
  
! 	* two-column.el (2C-mode): Use make-local-hook and add-hook.
  
! 	* icomplete.el (icomplete-minibuffer-setup): Use make-local-hook
! 	and add and remove hooks locally.
  
! 	* ediff-util.el (ediff-profile): Use make-local-hook
! 	and add and remove hooks locally.
  
! Tue Aug 22 13:57:30 1995  Andre Spiegel  <spiegel@berlin.informatik.uni-stuttgart.de>
  
! 	* files.el (basic-save-buffer): Call vc-after-save, to
! 	support implicit locking in VC.
  
! 	* vc-hooks.el (vc-simple-command): New function.
! 	(vc-fetch-master-properties): CVS case: Use it.
! 	(vc-lock-from-permissions, vc-file-owner, vc-rcs-lock-from-diff):
! 	New functions.
! 	(vc-locking-user): Largely rewritten.  Uses the above, handles RCS
! 	non-strict locking.  Under CVS in CVSREAD-mode, learn the locking
! 	state from the permissions.
! 	(vc-find-cvs-master): Use vc-insert-file, rather than
! 	find-file-noselect. Greatly speeds up things.
! 	(vc-consult-rcs-headers): Bug fix, return status in all cases.
  
! 	* vc.el: Removed the comment that said we assume strict locking.
! 	(vc-next-action-dired): Don't switch to vc-parent-buffer, because
! 	that was already done.
  
! Tue Aug 22 12:43:26 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* sc.el: Provide sc.
  
! Mon Aug 21 18:16:07 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* compile.el (compilation-exit-message-function): New variable.
! 	(compilation-sentinel): If compilation-exit-message-function is
! 	non-nil, call it to produce messages for buffer and mode line.
! 	(grep): Use that variable to produce snazzier messages.
  
! Mon Aug 21 17:59:43 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
  
! 	* paren.el: Use post-command-idle-hook.
!  	(show-paren-command-hook): No need to test for idleness.
  
! Mon Aug 21 15:28:47 1995  Andre Spiegel  <spiegel@berlin.informatik.uni-stuttgart.de>
  
! 	* vc-hooks.el (vc-fetch-master-properties): RCS case: get locking
! 	mode.  CVS case: new state `locally-added'.
! 	(vc-locking-user): Under RCS with non-strict locking, don't trust
! 	the file permissions.  CVS case: change which states count as
! 	"locked".
! 	(vc-consult-rcs-headers): Streamlined. Don't set vc-locking-user if
! 	this is called under CVS.  Under RCS, use a heuristic to find the
! 	value of vc-checkout-model without examining the master file.
! 	(vc-parse-locks): Set vc-checkout-model.
! 	(vc-status): Comment change.
! 	(vc-after-save-hook, vc-after-save): The former renamed to the
! 	latter. Now unconditionally called by `basic-save-buffer', determines
! 	whether the buffer should be "locked" or not.
! 	(vc-checkout-model): Values are now `manual' and `implicit'.  Derive
! 	the property on a per-file basis, supporting all possible modes.
! 	(vc-mode-line): No longer use dynamic after-save-hook. Changed
! 	references to `automatic' into `implicit'.
  
! 	* vc.el (vc-latest-on-branch-p): Under CVS, handle the case when
! 	the file is added, but not yet committed.
! 	(vc-backend-checkout): RCS case: In non-strict locking mode, force
! 	to overwrite the writable workfile. CVS case: Do the right thing in
! 	CVSREAD-mode.
  
! Mon Aug 21 10:47:30 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* files.el (auto-mode-alist): Turn on use of makefile-mode.
  
! 	* rmailsum.el: Require rmail.
! 	(rmail-new-summary): Specify size in split-window.
! 	Call rmail-select-summary to force size to specified amount.
  
! Mon Aug 21 08:15:47 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
  
! 	* fast-lock.el: New version 3.07 from author.
! 	(fast-lock-mode): Use buffer-file-truename, not buffer-file-name.
! 	(fast-lock-cache-directories, fast-lock-cache-name): Doc fixes.
  
! Mon Aug 21 01:18:55 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* solar.el: Doc fixes.
  
! Sun Aug 20 15:12:09 1995  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
  
! 	* icon.el: Define user options with defvar, not defconst.
  
! Sun Aug 20 01:05:26 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* dired.el (dired-string-replace-match): Simplify using replace-match.
  
! 	* dired-aux.el (dired-expand-newtext): Function deleted.
  
! 	* bytecomp.el (byte-compiler-base-file-name): New function.
! 	(byte-compile-dest-file): Call byte-compiler-base-file-name.
  
! 	* jka-compr.el (jka-compr-byte-compiler-base-file-name): New function.
! 	Use it to handle byte-compiler-base-file-name operation.
  
! Sun Aug 20 00:34:10 1995  Michael Kifer  <Michael Kifer <kifer@cs.sunysb.edu>>
  
! 	* viper.el (vip-set-hooks): Use view-mode-hook in emacs and view
! 	hook in xemacs.
! 	(vip-read-string-with-history): minibuffer-setup-hook no longer
! 	waits for the user to type, if there are unread events.
! 	Harnessed view-minor-mode.
! 	Added (vip-leave-region-active) to all simple movement commands.
! 	* viper-mous.el (vip-surrounding-word): modified to understand
! 	tripple clicks.
! 	* viper-util.el (vip-leave-region-active): new function.
  
! Sat Aug 19 12:38:16 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* vc.el (file-regular-p-18): Fix test for whether to use this.
  
! 	* info.el (Info-find-emacs-command-nodes): Fix previous change.
! 	(Info-suffix-list): For MS-DOS, use gunzip as the only uncompressor,
! 	and don't include .info as suffix.
! 	(info-insert-file-contents-1): New function.
! 	(info-insert-file-contents): Use info-insert-file-contents-1.
  
! 	* macros.el (insert-kbd-macro): Express vector char modifiers with
! 	escape prefixes.  Express big basic char codes in octal.
  
! Sat Aug 19 02:33:10 1995  Karl Heuer  <kwzh@gnu.ai.imt.edu>
  
! 	* hilit19.el (hilit-submit-feedback): New ftp site.
  
! Sat Aug 19 00:37:47 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* info.el (Info-file-list-for-emacs): New variable.
! 	(Info-find-emacs-command-nodes): Look in those files, if appropriate.
  
! 	* files.el (basic-save-buffer): Confirm for overwriting old file
! 	when a file name is specified.
  
! Fri Aug 18 20:28:58 1995  Daniel Pfeiffer  <Daniel.Pfeiffer@Informatik.START.dbp.de>
  
! 	* skeleton.el (skeleton-newline-indent-rigidly): New variable.
! 	(skeleton-internal-1): Use it for indenting after \n because previous
! 	behaviour was only useful for `sh-script.el' and old `ada.el'.  Other
! 	modes now get their own indentation.
! 	(skeleton, skeleton-modified, skeleton-point, skeleton-regions): `New'
! 	variables for passing between the mutually recursive functions of
! 	the skeleton engine.  Introduced to remove compiler warnings.
! 	(skeleton-proxy): New argument `str' to make this settable when calling
! 	a skeleton as a function.
! 	(skeleton-insert): New argument `str' to pass down.  Element `\n'
! 	now usually indents according to mode.  Subskeletons may also have
! 	a list of strings as iterator.  Earlier modification also removed
! 	meaning of `quit' -- I did not put it back in since it's useless.
! 	When quitting out of a subskeleton while still wrapping around text
! 	don't duplicate first line of that text.
! 	(skeleton-end-hook): New hook useful say for modes that leave a `;' on
! 	an empty line to indent right and then want to clean it up when doing
! 	a skeleton there.
  
! 	* sh-script.el (sh-newline-and-indent): Don't interpret prefix arg
! 	since `newline-and-indent' doesn't either.  Don't turn a trailing
! 	quoted tab into a space.
! 	(sh-mode): Use new `skeleton-newline-indent-rigidly'.
! 	(sh-set-shell): Make maximum font-locking also hightlight keywords
! 	after ``' and `!'.  (The latter is for ksh '93 but should't hurt other
! 	shells.)
  
! Fri Aug 18 16:36:52 1995  Andre Spiegel  <spiegel@berlin.informatik.uni-stuttgart.de>
  
! 	* vc.el (vc-next-action-on-file): Changed doc string, CVS case.
! 	(vc-backend-checkin): Clear master properties before doing the
! 	check-in.  In the CVS case, catch error and display an appropriate
! 	message in the echo area.
! 	(vc-backend-revert): Clear master properties, because some might get
! 	outdated by the operation.
! 	(vc-backend-merge-news): Scan the output of "cvs update" and find out
! 	whether conflicts have occurred.
  
! 	* vc-hooks.el (vc-fetch-master-properties):
! 	Recognize cvs status "Unresolved Conflict".
! 	(vc-locking-user): Count cvs status `unresolved-conflict' as "locked".
  
! 	* vc.el (vc-finish-logentry):
! 	Delete the *VC-log* buffer *before* doing the
! 	actual check-in. That leads to a better display in case the check-in
! 	fails.
  
! 	* vc.el (vc-latest-on-branch-p): Defined it for CVS in the obvious way.
! 	(vc-next-action-on-file): Removed special CVS cases. At this level,
! 	CVS is now mostly handled like the other backends.
! 	(vc-backend-checkout): CVS case: Clear sticky tag as default when
! 	doing a verbose checkout. (This used to be done in
! 	vc-next-action-on-file.)
  
! 	* vc-hooks.el (vc-checkout-model):
! 	New property and access function (still simplistic).
! 	(vc-after-save-hook): New function.
! 	(vc-mode-line): When the file is locked by somebody else, make the
! 	buffer read-only.  (Formerly this was only done for root.)  Don't
! 	write-protect the buffer if the file is unlocked.  Instead, install
! 	vc-after-save-hook, which "locks" the file when modifications are
! 	saved.
  
! Fri Aug 18 12:42:13 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* makefile.el (makefile-space-face): New variable.
! 	(makefile-define-space-face): New function.
! 	(makefile-tab-face): Variable deleted.
! 	(makefile-define-tab-face): Function deleted.
! 	(makefile-font-lock-keywords): Highlight leading spaces, not tabs.
  
! Thu Aug 17 15:40:32 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* hilit19.el (hilit-submit-feedback): New bug-reporting address.
  
! Thu Aug 17 08:46:53 1995  Andre Spiegel  <spiegel@berlin.informatik.uni-stuttgart.de>
  
! 	* vc.el (vc-next-action-on-file): Moved the setting of the default
! 	branch to vc-backend-checkout, where it belongs.
! 	(vc-backend-checkout): If an explicit version was specified, adjust
! 	the default branch accordingly.
  
! 	* vc-hooks.el (vc-top-version): Renamed to vc-master-workfile-version.
!  	Updated all references.
! 	vc.el: Changed references to vc-top-version into
! 	vc-master-workfile-version.
  
! 	* vc.el (vc-next-action-on-file): Query when trying to lock
! 	non-latest version.
  
! 	* vc.el: Let vc-cancel-version handle branches correctly, and
! 	behave more comfortably in the `norevert' case.
! 	(vc-revert-buffer1): Split part of the function into vc-buffer-context
! 	and vc-restore-buffer-context, so we can use it also in other
! 	circumstances.
! 	(vc-buffer-context, vc-restore-buffer-context): New functions.
! 	(vc-clear-headers): New function, uses the above.
! 	(vc-cancel-version): When `norevert', locks the most recent remaining
! 	version.  Also, refuse to work on anything but the latest version of
! 	a branch.  Removed the check whether the version is the user's,
! 	because that is difficult to decide, now that multiple branches are
! 	possible.
! 	(vc-latest-on-branch-p): New function.
! 	(vc-head-version): New access function to the already existing
! 	property.
! 	(vc-trunk-p, vc-branch-part): Functions moved before first use.
  
! Thu Aug  16 22:21:38 1995  Fred Pierresteguy  <F.Pierresteguy@frcl.bull.fr>
  
! 	* rmailsum.el (rmail-new-summary): Enable the Input/output menu.
  
! Wed Aug 16 16:13:43 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* pascal.el (pascal-mode): Set comment-start.
! 	(pascal-toggle-completions): Doc fix.
  
! Wed Aug 16 10:36:06 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* simple.el (blink-matching-paren-dont-ignore-comments): New var.
! 	(blink-matching-open): Use it.
! 	Also, if the matching char hasn't paren syntax, call that mismatch.
  
! 	* inf-lisp.el (inferior-lisp): Use pop-to-buffer.
! 	Add *inferior-lisp* to same-window-buffer-names.
  
! 	* cmuscheme.el (run-scheme): Use pop-to-buffer.
! 	Add *scheme* to same-window-buffer-names.
  
! 	* xscheme.el (run-scheme): Use pop-to-buffer.
  
! Tue Aug 15 16:02:34 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* sh-script.el (sh-mode-map): Use new name skeleton-pair-insert-maybe.
! 	(sh-mode): Use new names skeleton-pair-alist, skeleton-pair-filter.
  
! Tue Aug 15 15:48:33 1995  Daniel Pfeiffer <Daniel.Pfeiffer@Informatik.START.dbp.de>
  
! 	* skeleton.el (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
! 	(skeleton-insert): If skeleton doesn't fit in window, put beginning
! 	at top before going to _ point.
! 	(skeleton-internal-list): Rewritten so that resume: sections pertain
! 	only to inferior skeletons and make str available there
! 	(skeleton-read): Don't quit and remove partial skeleton when empty
! 	string entered for outer iterator.  Added implicit argument `input'.
! 	(define-skeleton, skeleton-insert, skeleton-internal-list): Use `x
! 	rather than backquote's (` x) or own (list 'x)
  
! 	* sh-script.el (sh-test): New variable.
! 	(sh-if, sh-until, sh-while): Use it.
! 	(sh-while-getopts): Handle csh passably well.
! 	(sh-font-lock-keywords): Use `font-lock-variable-name-face'.
! 	(sh-set-shell): Respect `font-lock-maximum-decoration'.
  
! Tue Aug 15 08:30:32 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* supercite.el (sc-attribs-extract-namestring): If name has <...>,
! 	treat everything before that as the full name.
  
! Mon Aug 14 17:56:23 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* view.el: Rewrite as a minor mode.
  
! 	* viper.el (vip-set-hooks): Use view-mode-hook, not view-hook.
  
! Mon Aug 14 13:21:39 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* files.el (basic-save-buffer-1): Pass new arg to write-region.
  
! Mon Aug 14 12:01:33 1995  Erik Naggum  <erik@naggum.no>
  
! 	* files.el (insert-file-contents-literally): New function.
!   	(find-file-noselect): Use it if new optional argument `rawfile' is
!  	non-nil.
  
! 	* startup.el (command-line-1): Add option --eval to evalute an
! 	expression on the command line and print the result.
  
! Mon Aug 14 02:17:09 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* paren.el (show-paren-command-hook): Do nothing if have unread events.
  
! Sun Aug 13 11:45:09 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* mouse.el (mouse-drag-region): Unread the up-event
! 	rather than execute it here.
  
! Sat Aug 12 05:20:56 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* rmail.el (rmail-convert-file): Look back for ^_ only at bol.
  
! 	* simple.el (shell-command-on-region): Don't examine order of
! 	point and mark; use order of START and END instead.
! 	Interactively pass point and mark, not region-beg and region-end.
  
! Thu Aug 10 16:01:19 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* isearch.el (isearch-other-meta-char): Avoid bug checking whether
! 	a key is defined in the function key map.
! 	Call cancel-kbd-macro-events.
  
! 	* bytecomp.el (byte-compile-insert-header): Use 19.29, not 19.28.90
! 	as limit for where dynamic docstrings are allowed.
  
! 	* server.el (server-buffer-done): Pause between client commands,
! 	but not after the last one.
  
! 	* files.el (recover-file): It's ok if the visited file doesn't exist.
! 	(recover-session-finish): Compute "file name" from autosave file
! 	if no visited file.
  
! Thu Aug 10 10:50:21 1995  Andre Spiegel  <spiegel@berlin.informatik.uni-stuttgart.de>
  
! 	* vc.el (vc-dired-reformat-line): Display eight character user names
! 	correctly.
  
! Thu Aug 10 09:57:30 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
  
! 	* font-lock.el (font-lock-beginning-of-syntax-function): New variable.
! 	(font-lock-defaults-alist): New element to specify it.
! 	(font-lock-set-defaults): Set it.
! 	(font-lock-fontify-region): Use it when calculating the cache state.
! 	(font-lock-maximum-size): Add autoload cookie.
! 	(font-lock-fontify-region, font-lock-unfontify-region): Also wrap
! 	value of buffer-file-truename to avoid clash detection.
! 	(font-lock-hack-keywords): Likewise.  Also use a while loop, not
! 	mapcar, when applying keywords.
! 	(tex-font-lock-keywords): Rewritten again.
! 	(scheme-font-lock-keywords): New keywords.
! 	(font-lock-defaults-alist): Specify defaults for them.
  
! 	* fortran.el (fortran-font-lock-keywords-1): Fix column 72 comments.
  
! 	* texinfo.el (texinfo-font-lock-keywords): Rewritten.
! 	(texinfo-mode): Set up font-lock-defaults for keywords only.
  
! 	* help.el (help-font-lock-keywords): New keywords.
! 	(help-mode): Set up font-lock-defaults.
  
! Wed Aug  9 18:09:15 1995  Francesco Potorti`  (pot@cnuce.cnr.it)
  
! 	* man.el (Man-translate-references): Anchor the regexps.
  
! Tue Aug  8 13:03:51 1995  Boris Goldowsky  <boris@gnu.ai.mit.edu>
  
! 	* forms.el (forms-check-number-of-fields): New vbl.
! 	(forms-mode): Don't issue warning if vbl says not to.
  
! Tue Aug  8 01:14:27 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* vc.el (vc-revert-buffer): In a dedicated solitary window,
! 	make the frame invisible instead of trying to delete window.
  
! 	* paragraphs.el (forward-paragraph): Don't overlook a paragraph-start
! 	line just because it ends at eob.
  
! 	* edebug.el (edebug-functionp): Return t for a bytecode function.
  
! 	* dired.el (dired-mode-map): Set up the map completely
! 	before storing it into dired-mode-map.
  
! Mon Aug  7 04:44:30 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* bytecomp.el (byte-compile-insert-header): New args inbuffer and
!  	outbuffer.  Test byte-compile-dynamic-docstrings in the initially
!  	current buffer.
! 	(byte-compile-from-buffer): Add new args to byte-compile-insert-header.
  
! 	* startup.el (command-line-1): Fix previous change.
  
! 	* bytecomp.el (byte-compile-output-docform): Check
! 	byte-compile-dynamic-docstrings in input buffer, not output buffer.
  
! Sun Aug  6 02:26:39 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* delsel.el (delete-selection-pre-hook): New type value `yank'.
! 	(yank): Use `yank' as delete-selection property.
  
! 	* simple.el (column-number-mode, line-number-mode): Default now t.
  
! Sat Aug  5 02:32:33 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* faces.el (set-face-background): When using face-color-supported-p,
! 	specify foreground, not background.
  
! Fri Aug  4 15:55:57 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* bibtex.el (bibtex-maintain-sorted-entries): Make nil the default.
  
! 	* ps-print.el: Renamed `fsf' to `emacs' in all names.
! 	(ps-print-emacs-type): Renamed from emacs-type.
  
! Fri Aug  4 15:39:50 1995  Stephen A. Wood  <saw@hallc1.cebaf.gov>
  
! 	* fortran.el (fortran-auto-fill-mode, fortran-do-auto-fill,
! 	fortran-fill): Invoke auto filling only when past fill-column.
  
! Fri Aug  4 14:02:11 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* compile.el (compilation-error-regexp-alist): Add regexp for Sun
!  	ada.
  
! Thu Aug  3 22:27:24 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* solitaire.el: New file.
  
! Thu Aug  3 13:53:55 1995  Morten Welinder  <terra+@cs.cmu.edu>
  
! 	* arc-mode.el: Standardize layout of doc strings.
  
! Thu Aug  3 03:26:29 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* rsz-mini.el (resize-minibuffer-setup): Use make-local-hook.
  
! 	* tmm.el: Don't alter bindings in minibuffer-local-must-match-map
! 	or completion-list-mode-map.
! 	(tmm-add-prompt): Use make-local-hook; add hook locally.
! 	(tmm-delete-map): Delete hook locally.
  
! 	* indent.el (tab-to-tab-stop): Expand abbrevs only after a word-char.
  
! Wed Aug  2 17:59:22 1995  Rob Riepel  <riepel@Snowflake.Stanford.EDU>
  
!         * tpu-edt.el (tpu-control-keys): New initial value, nil.
!         (tpu-help): Back up one page at a time.
!         (tpu-set-control-keys): New function.
!         (tpu-edt-on): Call tpu-set-control-keys.
  
! Wed Aug  2 00:41:09 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* jka-compr.el (jka-compr-load): Bind load-force-doc-strings.
  
! 	* dired-aux.el (dired-do-copy): Doc fix.
  
! 	* arc-mode.el (archive-remote-regexp): Don't accept hostnames
! 	ending in period.  (See previous ange-ftp.el change.)
  
! 	* gud.el (gud-xdb-marker-filter): Change pattern to accept spc at end.
  
! Tue Aug  1 19:38:13 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* ange-ftp.el (file-name-handler-alist): Don't match host name
! 	ending in period.
  
! Tue Aug  1 18:40:22 1995  Daniel Pfeiffer  <Daniel.Pfeiffer@Informatik.START.dbp.de>
  
! 	* two-column.el (2C-toggle-autoscroll, 2C-autoscroll):
! 	Only (sit-for 0) once for smoother scrolling.
! 	(2C-associated-buffer): go to same line and column.
! 	(2C-newline): new function.
! 	(2C-other): optional arg to signal missing other buffer.
  
! Tue Aug  1 02:36:29 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* byte-opt.el (byte-optimize-nthcdr): Fix previous change.
  
! Mon Jul 31 16:19:04 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* startup.el (command-line-1):
! 	Mention recover-session if there's a .saves file.
  
! 	* files.el (recover-session): Mention deletion is possible.
! 	(recover-session-finish): Call dired-do-flagged-delete.
  
! 	* dired.el (dired-do-flagged-delete): New arg nomessage.
  
! 	* vi.el (vi-scroll-amount, vi-shift-width): Fix syntax of doc strings.
  
! Mon Jul 31 05:55:56 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
  
! 	* subr.el (run-hooks): Variable doc fix.
! 	(run-hooks, run-hook-with-args-until-success,
! 	run-hook-with-args-until-failure): Functions moved to C.
  
! Sun Jul 30 18:28:45 1995  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
  
! 	* dired-aux.el (dired-read-shell-command): Use
! 	`shell-command-history' in read-string.
  
! Sun Jul 30 02:43:41 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* iso-acc.el: Major additions by Gustavo Chaves.
! 	(iso-languages): New variable.
! 	(iso-accents-list): Now set by iso-customize-accents.
! 	(iso-customize-accents): New function.
! 	(iso-accentuate, iso-deaccentuate, iso-unaccentuate):
! 	(iso-accent-rassoc-unit): New functions.
  
! 	* rmail.el (rmail-unix-mail-delimiter): Allow two-letter timezone name.
  
! 	* faces.el (set-face-background): Don't treat nil as a color.
  
! 	* loadhist.el (unload-feature): Delete the file's load-history element.
! 	(file-set-intersect): Renamed from set-intersect.
! 	(file-dependents): Use new name.
  
! 	* ehelp.el (with-electric-help): Doc fix.
  
! 	* files.el (cd): When reading arg, use just directory as the default.
  
! 	* bytecomp.el (byte-compile-insert-header): If compiling for vers 18,
! 	arrange to set current-load-list when loading the file.
  
! Sat Jul 29 19:32:12 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* fill.el (fill-region-as-paragraph): Don't find adaptive-fill-regexp
! 	on first line of paragraph if it's a paragraph-separate line.
! 	Don't look past the intended line.
! 	(adaptive-fill-function): New variable.
! 	(fill-region-as-paragraph): Use it.
! 	(colon-double-space): New variable.
! 	(canonically-space-region): Put two spaces after colon if necessary.
  
! 	* simple.el (do-auto-fill): Use adaptive-fill-function.
  
! 	* paragraphs.el (forward-paragraph): Don't move back over a line
!  	before the paragraph which doesn't start with fill-prefix unless
!  	that is the only line we've moved over.
  
! Fri Jul 28 15:51:15 1995  Michael Ernst  <mernst@research.microsoft.com>
  
! 	* simple.el (scroll-other-window-down): Bind to S-C-M-v.  Enhance
! 	documentation.
  
! Fri Jul 28 21:49:53 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* info.el (Info-read-node-name-1): New function.
! 	(Info-read-node-name): Use Info-read-node-name-1
! 	to avoid getting confused by spaces when text starts with (FILENAME).
  
! Fri Jul 28 16:26:10 1995  Andre Spiegel  <spiegel@berlin.informatik.uni-stuttgart.de>
  
! 	* vc.el (vc-resynch-buffer): New function.
! 	(vc-locked-example): Renamed to vc-snapshot-precondition. It now also
! 	checks whether any of the files are visited.
! 	(vc-retrieve-snapshot): If any files are visited, ask whether to
! 	revert their buffers. Use vc-backend-checkout and vc-resynch-buffer
! 	to do that, instead of vc-checkout.
  
! 	* vc.el (vc-backend-checkout): Adjust default-directory so that the
! 	checked-out file goes to the right place.
  
! Fri Jul 28 13:10:38 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* dired.el (dired-insert-set-properties): Catch errors.
  
! 	* simple.el (next-line): Doc fix.
  
! 	* dabbrev.el (dabbrev-expand): Save previous point for undo.
  
! Thu Jul 27 18:04:03 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* simple.el (do-auto-fill): Handle adaptive-fill-regexp.
  
! 	* texnfo-upd.el (texinfo-specific-section-type):
! 	Use buffer-substring-no-properties.
  
! Thu Jul 27 15:08:32 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* imenu.el: (imenu-generic-lisp-expression)
! 	(imenu-generic-c++-expression, imenu-generic-c-expression)
! 	(imenu-generic-ada-expression, imenu-generic-texinfo-expression)
! 	(imenu-generic-latex-expression): Vars deleted; now handled by the
! 	major modes themselves.
! 	(imenu--scanning-method-alist): Var deleted.
! 	(imenu-default-create-index-function): Don't use that alist.
! 	* cplus-md.el (c++-imenu-generic-expression): Var defined.
! 	(c++-mode): Set imenu-generic-expression.
! 	* c-mode.el (c-imenu-generic-expression): Var defined.
! 	(c-mode): Set imenu-generic-expression.
! 	* tex-mode.el (latex-imenu-generic-expression): Var defined.
! 	(latex-mode): Set imenu-generic-expression.
! 	* texinfo.el (texinfo-imenu-generic-expression): Var defined.
! 	(texinfo-mode): Set imenu-generic-expression.
! 	* ada-mode.el (ada-imenu-generic-expression): Var defined.
! 	(ada-mode): Set imenu-generic-expression.
! 	* lisp-mode.el (lisp-imenu-generic-expression): Var defined.
! 	(lisp-mode-variables): Set imenu-generic-expression.
  
! 	* faces.el (x-font-regexp): Add \\(\\) for substring extraction.
  
! Thu Jul 27 11:04:08 1995  Ulrich Mueller  <ulm@vsnhd1.cern.ch>
  
! 	* fortran.el (fortran-break-line): Fixed a bug that sometimes
! 	deleted first character in statement field of continuation line.
  
! Thu Jul 27 10:11:59 1995  Espen Skoglund  <espensk@tklab1.cs.uit.no>
  
! 	* pascal.el (pascal-mode): Added imenu support.
! 	(pascal-imenu-generic-expression): New variable.
  
! Thu Jul 27 03:04:18 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* texinfo.el (texinfo-environment-regexp): Allow whitespace at BOL.
  
! 	* isearch.el (isearch-mode-map): Don't bind tab, return, kp-N, etc.
! 	(isearch-other-meta-char): Special handling for keys like tab, etc.
  
! Wed Jul 26 16:01:29 1995  Stefan Schoef  <schoef@OFFIS.Uni-Oldenburg.DE>
  
!         * bibtex.el: Add keywords and comments as per conventions.
  
!         * bibtex.el: Changed almost all occurences of buffer-substring to
!         buffer-substring-no-properties..
  
!         * bibtex.el (bibtex-find-entry-location, bibtex-clean-entry):
!         Added support to handle invalidate buffers in a more friendly
!         manner.
  
!         * bibtex.el (bibtex-make-field): Changed to be called either
!  	interactively with a string (field name) or from Lisp with a list
!  	of two strings (FIELDNAME COMMENT).
  
! Wed Jul 26 13:47:14 1995  Rob Riepel  <riepel@Snowflake.Stanford.edu>
  
!         * tpu-edt.el (tpu-version): New version.
!         (tpu-help-keypad-map): New help text.
!         (tpu-backward-line): Only move to BOL if not already there.
  
!         * tpu-extras.el (tpu-backward-line): Only move to BOL if not
!         already there.
  
! Wed Jul 26 18:19:12 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* indent.el (indent-region-function): Doc fix.
  
! 	* lisp-mode.el (shared-lisp-mode-map):
! 	Don't bind TAB, just set indent-line-function.
  
! Wed Jul 26 15:40:00 Michael Kifer  (kifer@cs.sunysb.edu)
  
! 	* viper-ex.el (vip-submit-report): fnc modified.
  
! 	* viper-keym.el (vip-overriding-map): new variable.
  
! 	* viper-macs.el (vip-repeat-from-history-key): new default.
! 	(vip-read-fast-keysequence, ex-unmap-read-args, ex-map-read-args):
! 	changed to use vip-read-key.
  
! 	* viper-mous.el (vip-multiclick-timeout): new default.
! 	(vip-surrounding-word, vip-mouse-click-get-word): fnc modified.
  
! 	* viper-util.el (vip-add-hook, vip-remove-hook): new fncs.
  
! 	* viper.el (vip-info-file-name): variable removed.
! 	(vip-envelop-ESC-key, vip-start-replace, vip-finish-R-mode,
! 	vip-start-R-mode, vip-insert-state-pre-command-sentinel,
! 	vip-R-state-post-command-sentinel, vip-replace-char) fncs modified.
  
! Tue Jul 25 18:04:33 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* faces.el (x-font-regexp-weight-subnum, x-font-regexp-slant-subnum)
! 	(x-font-regexp-swidth-subnum, x-font-regexp-adstyle-subnum): Defconst.
  
! Tue Jul 25 17:01:48 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* imenu.el (imenu--history-list): Don't make this buffer-local.
! 	(imenu): Call imenu-choose-buffer-index from interactive spec.
  
! Tue Jul 25 15:35:07 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* subr.el (run-hook-with-args): Deleted; now in C code.
  
! Mon Jul 24 21:52:52 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* imenu.el: Many doc fixes.
  
! Tue Jul 25 07:17:02 1995  Ake Stenhoff  <etxaksf@aom.ericsson.se>
  
! 	* perl-mode.el (perl-imenu-generic-expression) New variable.
! 	(perl-mode): Set imenu-generic-expression.
  
! 	* imenu.el (imenu-generic-expression): Call make-variable-buffer-local.
! 	(imenu-create-index-pattern): Variable deleted.
  
! Sat Jul 22 17:24:07 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* tar-mode.el (tar-copy): Inhibit use of jka-compr handler
! 	when both to- and from- files would use it.
  
! Sat Jul 22 11:13:54 1995  Daniel Pfeiffer  <Daniel.Pfeiffer@Informatik.START.dbp.de>
  
! 	* apropos.el: Add latest changes of old library and some more.
! 	(apropos): Only show unbound symbols when do-all
! 	(apropos-documentation-check-elc-file): new copied function.
! 	(apropos-command): also use `apropos-do-all' when called as function.
! 	(apropos-print-doc): renamed from `apropos-print-documentation', i
! 	is numeric index, replaces parameter tem.
! 	(apropos-macrop): new function.
! 	(apropos-print): use it to differentiate macros.
! 	(apropos-symbol-face, apropos-keybinding-face, apropos-label-face)
! 	(apropos-property-face, apropos-match-face): new variables
! 	replace and extend the effect of `apropos-use-faces'.
! 	(apropos-safe-documentation): renames `safe-documentation', also
! 	returns a cons.
! 	(apropos-regexp, apropos-files-scanned, apropos-accumulator)
! 	(apropos-item): new variables to prevent compiler warnings.
! 	(apropos-value-internal, apropos-documentation-internal): new fns.
  
! Fri Jul 21 01:04:25 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* byte-opt.el (byte-optimize-lapcode): Fix format calls.
  
! 	* imenu.el (imenu-choose-buffer-index):
! 	Avoid trying to select WINDOW if it is nil.
  
! 	* menu-bar.el (menu-bar-buffer-menu): Function deleted.
! 	(global-map): Define [menu-bar buffer] as a keymap with no fcn name.
! 	(menu-bar-update-buffers): After defining it, call it.
  
! 	* faces.el (make-face-bold, make-face-italic, make-face-bold-italic)
! 	(make-face-unbold, make-face-unitalic):
! 	No error if font is already bold, italic, or whatever.
  
! 	* font-lock.el (font-lock-make-faces): Redo logic for whether
! 	to call font-lock-make-face for a given face.
  
! Thu Jul 20 16:16:37 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* rmail.el (rmail-insert-inbox-text): Always use movemail
! 	when renaming a file.
  
! 	* simple.el (indent-new-comment-line):
! 	fill-prefix overrides comment indentation.
  
! 	* skeleton.el (local-variables-section): Delete autoload cookie.
! 	(skeleton-pair-insert-maybe): Renamed from pair-insert-maybe.
! 	(skeleton-pair, skeleton-pair-filter, skeleton-pair-alist)
! 	(skeleton-pair-on-word): Renamed from pair-...
! 	(mirror-mode): Commented out.
  
! 	* info.el (Info-current-file): Doc fix.
! 	(Info-find-node): Set Info-current-file to file name as specified.
  
! Thu Jul 20 15:34:52 1995  Dave Love  <d.love@dl.ac.uk>
  
! 	* mail-utils.el (mail-fetch-field): Use buffer-substring-no-properties.
  
! Thu Jul 20 02:13:52 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* derived.el (derived-mode-set-keymap): Cope if old-map is nil.
  
! 	* menu-bar.el (menu-bar-update-yank-menu): Treat all-dashes specially.
  
! Wed Jul 19 11:43:14 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* sendmail.el (mail-default-reply-to): Doc fix.
  
! Tue Jul 18 09:06:10 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* backquote.el (backquote): Doc fix.
  
! 	* noutline.el (outline-next-visible-heading): Rewritten to handle
! 	backwards motion and handle beg/end of buffer properly.
  
! 	* menu-bar.el (menu-bar-tools-menu): Don't define gnus entry
! 	if no network support.
  
! 	* faces.el (x-create-frame-with-faces):
! 	Specify frame arg to x-color-values and frame-parameters.
! 	(set-face-background): Pass background-p arg to face-color-supported-p.
  
! Tue Jul 18 21:45:17 1995  Michael Ernst  <mernst@research.microsoft.com>
  
! 	* ehelp.el (electric-helpify): Autoload with-electric-help,
! 	electric-helpify.
  
! Tue Jul 18 21:05:34 1995  Rolf Ebert  <re@waporo.muc.de>
  
! 	* ada-mode.el (ada-ident-re): Doc fix.
! 	(ada-end-stmt-re): Corrected serious pb of wrong parentheses.
! 	(ada-subprog-start-re): Removed 'body' from the list.
! 	(ada-format-paramlist): Simplified a regexp.
! 	(ada-indent-current): On first line of the buffer, indent to column 0.
! 	Don't reindent if new position is the same as the old one.  Thus, a
! 	correcly indended line is not modified.
! 	(ada-get-indent-subprog): Simplified a regexp.
! 	(ada-goto-matching-decl-start): Distinguish between normal type
! 	declaration and protected types, which are more like procedures.
! 	(ada-remove-trailing-spaces): Use save-match-data, save-restriction
! 	and widen when removing whitespace.
! 	(ada-font-lock-keywords-1): Add 'pragma' as keyword.
! 	(ada-font-lock-keywords-2): Allow *qualified* idents after 'end'.
  
! 	* files.el (auto-mode-alist): Recognize *.ads and *.adb as Ada
! 	specs and bodies.
  
! Tue Jul 18 15:26:23 1995  Dave Love  <d.love@dl.ac.uk>
  
! 	* nroff-mode.el (font-lock-defaults): New variable.
! 	(nroff-mode-syntax-table): New variable to provide comment syntax
! 	for font-lock; I'm not sure if this is (or should be) necessary in
! 	19.29 with font-lock-defaults.
! 	(nroff-font-lock-keywords): New variable.
! 	(nroff-mode): Install nroff syntax table and font lock keywords.
! 	Comment about comments in filling and line-counting.
  
! Tue Jul 18 14:47:21 1995  Andre Spiegel  <spiegel@berlin.informatik.uni-stuttgart.de>
  
! 	* vc.el (vc-do-command): Added parameter BUFFER (the default,
! 	if nil, is *vc*). Updated all callers.
! 	(vc-next-action-on-file, vc-diff, vc-version-diff, vc-backend-diff):
! 	Use buffer *vc-diff* for diff output instead of *vc*.
  
! 	* vc-hooks.el (vc-mode-line, vc-find-file-hook): Moved the test for
! 	version-controlled symbolic link from the former to the latter.
  
! 	* files.el (file-name-sans-versions):
! 	Recognize version control version numbers.
  
! Tue Jul 18 12:37:47 1995  Mike Williams  <mikew@gopher.dosli.govt.nz>
  
! 	* mouse-sel.el:	Don't (require 'backquote).
  
! 	* mouse-sel.el (mouse-extend-internal): Select space in between
! 	"things" when extending selection, ie. we are extending to
! 	"thing" boundaries.
  
! 	* mouse-sel.el:	Use x-lost-selection-hooks to handle loss of selection.
! 	(mouse-sel-lost-selection-hook): New function.
! 	(mouse-sel-selection-owner-p-function): Variable removed.
! 	(mouse-sel-selection-owner-p): Function removed.
! 	(mouse-sel-validate-selection): Function removed.
  
! 	* thingatpt.el (forward-same-syntax): New function.
  
! Sun Jul 16 14:31:08 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* appt.el: Add provide.
  
! Sat Jul 15 11:41:42 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* byte-opt.el (byte-optimize-if): Optimize (if (not foo) nil ...).
  
! 	* add-log.el (add-log-current-defun): Handle C struct definitions.
! 	(add-change-log-entry): Use case-sensitive search for file name.
! 	Find first blank line correctly.
  
! Fri Jul 14 15:12:07 1995  Karl Fogel  <kfogel@floss.cyclic.com>
  
! 	* bookmark.el (bookmark-make): Strip text properties off name.
! 	(bookmark-make-cell): Use `buffer-substring-no-properties'.
  
! Fri Jul 14 03:38:32 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* bytecomp.el (byte-compile-output-file-form): Bind print-length
! 	and print-level to nil.
  
! Thu Jul 13 21:02:01 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* mouse.el (mouse-major-mode-menu): Catch quit in read-key-sequence.
  
! Wed Jul 12 20:25:29 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* bookmark.el (bookmark-yank-word): Use buffer-substring-no-properties.
  
! Thu Jul 13 11:25:21 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* files.el (auto-mode-alist): Move .scm.[0-9] before nroff-mode.
! 	Escape the second period.
  
! Wed Jul 12 19:22:59 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* dabbrev.el (dabbrev--search): Don't let spurious match in middle
! 	of word obscure real match at start of same word.
  
! 	* term/x-win.el (vendor-specific-keysyms):
! 	In Sun keys, f36 was misnamed f35 and f37 misnamed f36.
  
! 	* fill.el (canonically-space-region): Doc fix.
  
! 	* menu-bar.el (menu-bar-help-menu): Add finder-by-keyword.
  
! 	* ediff-wind.el (ediff-skip-unsuitable-frames): Use make-frame,
! 	not ediff-make-frame.
  
! Wed Jul 12 23:10:46 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* paths.el (remote-shell-program): Try rcmd also.
  
! Tue Jul 11 10:39:52 1995  Andre Spiegel  <spiegel@berlin.informatik.uni-stuttgart.de>
  
! 	* vc-hooks.el (vc-mode-line): Don't write-protect a
! 	VC-Log buffer.  Better mode line text for initial comments.
! 	Streamlined the function.
  
! Mon Jul 10 02:59:13 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* faces.el (x-create-frame-with-faces): Set background-mode
! 	and display-type frame parameters.
  
! 	* mouse.el (mouse-major-mode-menu): Don't call command-execute
! 	if lookup-key gives nil.
  
! 	* byte-opt.el (byte-optimize-nth, byte-optimize-nthcdr):
! 	Do nothing if form wrong length.
! 	(byte-optimize-multiply): Fix bug in 0 case.
! 	(byte-optimize-divide): Optimize (/ CONST CONST) if safe.
  
! Sun Jul  9 03:14:03 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* fill.el (fill-region-as-paragraph): In adaptive-fill-mode,
! 	if paragraph has one line, take the fill prefix from it.
! 	(adaptive-fill-regexp): Doc fix.
  
! 	* startup.el (normal-top-level): Don't use mail-host-address
! 	for auto-save-list-file-name.
  
! 	* sendmail.el (mail-setup-hook): New defvar.
! 	(mail): Doc fix.
  
! Thu Jul  6 14:21:50 1995  Francesco Potorti`  <pot@cnuce.cnr.it>
  
! 	* simple.el (shell-command): Use save-match-data.
! 	Put the buffer in shell mode, don't use shell-command-filter.
! 	(shell-command-filter): Deleted.
! 	(shell-command-sentinel): Don't reset the mode line.
! 	Don't test the buffer name--what was that for, anyway?.
  
! Thu Jul  6 10:04:10 1995  Andre Spiegel  <spiegel@berlin.informatik.uni-stuttgart.de>
  
! 	* vc.el (vc-backend-merge-news): Force to refetch the
! 	properties after the merge.
  
! 	* vc-hooks.el (vc-locking-user): Consider a cvs file "locked"
! 	if its status is either 'locally-modified or 'needs-merge.
! 	(vc-workfile-version): Catch 'found when calling vc-find-cvs-master.
! 	(vc-fetch-master-properties): Handle cvs status "Needs Checkout".
! 	This is intended for future use.
  
! Thu Jul  6 04:14:54 1995  Richard Stallman  <rms@whiz-bang.frob.com>
  
! 	* byte-opt.el (byte-optimize-logmumble): Fix (logior -1 ...) case.
  
! 	* cc-mode.el (c-set-style-1): Copy c-offsets-alist if nec.
  
! Wed Jul  5 08:00:09 1995  Richard Stallman  <rms@whiz-bang.frob.com>
  
! 	* faces.el (x-frob-font-slant, x-frob-font-weight):
! 	Replace the adstyle field with *, if we can find it.
  
! 	* find-file.el (ff-set-point-accordingly): Doc fix.
  
! 	* vc-hooks.el (vc-fetch-master-properties): Shrink the window
! 	that displays the error message.
  
! 	* faces.el (set-face-background): Use face-color-supported-p.
  
! Tue Jul  4 15:38:12 1995  Ralf Fassel  <ralf@prl.philips.nl>
  
! 	* fill.el (fill-individual-paragraphs): Use `adaptive-fill-regexp'
! 	to determine `fill-prefix' if `adaptive-fill-mode' is non-nil.
  
! Tue Jul  4 01:22:44 1995  Richard Stallman  <rms@whiz-bang.frob.com>
  
! 	* cc-mode.el (c-common-init): Copy c-offsets-alist.
  
! Sun Jul  2 12:32:38 1995  Richard Stallman  <rms@whiz-bang.frob.com>
  
! 	* ebuff-menu.el (electric-buffer-list): Save point before
! 	finding the first buffer line, and use that saved point to
! 	determine the buffer to use, if it is a reasonable value.
  
! 	* faces.el (face-color-gray-p): New function.
! 	(face-default-stipple): New variable.
! 	(set-face-background): Use face-default-stipple for all grays.
! 	(set-face-stipple): Change arg name.
! 	(face-color-supported-p): Use face-color-gray-p.
  
! 	* simple.el (column-number-mode): New variable and new command.
! 	* loaddefs.el (mode-line-format): Use column-number-mode.
  
! Mon Jul 17 16:14:39 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* sh-script.el (interpreter-mode-alist): Delete autoload cookie.
! 	* executable.el (interpreter-mode-alist): Delete autoload cookie.
  
! Wed Jul 12 15:14:12 1995  Karl Heuer  <kwzh@kropotkin.gnu.ai.mit.edu>
  
! 	* comint.el (comint-kill-output): Preserve entire partial line at
! 	end, even if it doesn't match comint-prompt-regexp.
  
! Wed Jul 12 13:22:20 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* copyright.el: Fixed Author: comment.  This code bears no
! 	relation to what I wrote.
  
! Sun Jul  9 07:41:19 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
  
! 	* font-lock.el: Moved font-lock-doc-string-face to bytecomp.el.
! 	(font-lock-fontify-region): Do all cleanups inside unwind-protect.
! 	(font-lock-hack-keywords): Likewise.
! 	(font-lock-choose-keywords): Don't eval here.
! 	(font-lock-set-defaults): Do it here and compile too.
  
! 	* bytecomp.el: Make executing-macro, before-change-function,
! 	after-change-function and font-lock-doc-string-face obsolete.
  
! 	* version.el: Do a purecopy of emacs-version for UN*X's what command.
  
! Sat Jul  8 09:17:23 1995  Johan Vromans  <jvromans@hill.gnu.ai.mit.edu>
  
! 	* forms.el (forms-mode): Treat local-write-file-hooks as a list.
  
! Fri Jul  7 18:09:41 1995  Francesco Potorti`  <pot@cnuce.cnr.it>
  
! 	* mailalias.el (build-mail-aliases): Fixed the regexp for "^group".
  
! Fri Jul  7 14:43:05 1995  Daniel Pfeiffer  <Daniel.Pfeiffer@Informatik.START.dbp.de>
  
! 	* apropos.el: Restructured, largely rewritten and extended.
! 	(apropos-use-faces, apropos-local-map): New variables.
! 	(apropos-command): New name for `command-apropos' no longer in help.el.
! 	(apropos-value): New command.
! 	(apropos-documentation): New name for `super-apropos'
! 	(apropos-follow, apropos-mouse-follow): New commands for hypertext.
! 	(apropos-describe-plist): New function.
  
! 	* help.el: (command-apropos): Deleted function.  This is replaced by
! 	apropos-command in apropos.el.
  
! 	* autoload.el: (make-autoload): Generate `(autoload ...)' form for
! 	`(define-skeleton ...)'
  
! 	* skeleton.el: partly rewritten and extended.
! 	(skeleton-filter, skeleton-untabify, skeleton-further-elements)
! 	(skeleton-abbrev-cleanup): New variables
! 	(skeleton-proxy, skeleton-abbrev-cleanup): New functions
! 	(skeleton-insert): Sublanguage element < must now be handled via
! 	`skeleton-further-elements' (used only in sh-script and ada).  Lisp
! 	expressions can be quoted to ignore the return value.
! 	(skeleton-read): New name for `skeleton-internal-read' because this may
! 	be useful in skeletons.
! 	(local-variables-section): New skeleton command, might go to simple.el.
  
! 	* autoinsert.el: extended to use skeletons or call functions
! 	(auto-insert, auto-insert-query, auto-insert-prompt): New variables
! 	(auto-insert-alist): New features
! 	(auto-insert): New name for `insert-auto-insert-files'
! 	(define-auto-insert): New function
  
! 	* copyright.el: New name for generalized upd-copyr.el
! 	(copyright-limit, copyright-regexp): New variables
! 	(copyright-query): New name for `inhibit-update-copyright'
! 	(copyright-current-year): New name for `current-year'
! 	(copyright-current-gpl-version): New name for `current-gpl-version'
! 	(copyright-update): New name for `update-copyright' and
! 	`ask-to-update-copyright'
! 	(copyright): New skeleton command
  
! 	* executable.el: New file extracted and optimized from sh-script.el
  
! 	* sh-script.el: restructured, largely rewritten without the bugs and
! 	extended to cover over 15 shells.  Most variables can now work as a
! 	lookup table, and, unless set by user, do.
! 	(sh-mode-syntax-table): Possibly multiple tables.
! 	(sh-shell): Set initially so shell or other libraries may use features.
! 	(sh-assignment-regexp): Replaces `sh-assignment-space'.
! 	(sh-here-document-word): Set to more common "EOF".
! 	(sh-variables): Changed semantics.
! 	(sh-font-lock-keywords): Much nicer.
! 	(sh-ancestor-alist, sh-alias-alist, sh-shells, sh-abbrevs)
! 	(sh-dynamic-complete-functions, sh-require-final-newline)
! 	(sh-comment-prefix, sh-indentation, sh-header-marker, sh-builtins)
! 	(sh-leading-keywords): New variables.
! 	(sh-use-prefix, sh-find-file-modifies, sh-query-for-magic)
! 	(sh-magicless-file-regexp, magic-number-alist, sh-executable)
! 	(sh-chmod-argument, sh-shell-is-csh, sh-tab-width)
! 	(sh-sh-font-lock-keywords, sh-ksh-font-lock-keywords)
! 	(sh-bash-font-lock-keywords, sh-csh-font-lock-keywords)
! 	(sh-tcsh-font-lock-keywords): Variables deleted, see also executable.el.
  
! 	(sh-mode): Shell dependent code moved to `sh-set-shell'.
! 	(sh-feature, sh-abbrevs, sh-syntax-table, sh-append, sh-modify): New
! 	functions.
! 	(sh-execute-region): New command.
! 	(sh-indexed-loop): Far more efficient code generated for sh.
! 	(sh-repeat, sh-tmp-file, sh-while-getopts): New skeletons.
! 	(sh-or-other-mode, define-sh-skeleton, sh-executable, sh-chmod)
! 	(sh-query-for-variable): Command deleted.
  
! 	* two-column.el: Symbols renamed to be like mode-line indicator.
! 	Supposed to now also work for Lucid.
! 	(2C-mode-map): New name for `tc-mode-map'.  Additionally bound to [f2].
! 	(2C-minor-mode-map) New variable.
! 	(2C-mode): New name for `tc-other'.
! 	(2C-mode-line-format): New name for `tc-mode-line-format'.
! 	(2C-other-buffer-hook): New variable.
! 	(2C-separator): New name for `tc-separator'.
! 	(2C-window-width): New name for `tc-window-width'.
! 	(2C-beyond-fill-column): New name for `tc-beyond-fill-column'.
! 	(2C-autoscroll, 2C-autoscroll-start): New variables.
  
! 	(2C-other): New name for `tc-other'.
! 	(2C-mode): New name for `tc-mode', `tc-two-columns'.
! 	(2C-two-columns): New function.
! 	(2C-associate-buffer): New name for `tc-associate-buffer'.
! 	(2C-split): New name for `tc-split'.
! 	(2C-dissociate): New name for `tc-dissociate'.
! 	(2C-merge): New name for `tc-merge'.
! 	(2C-associated-buffer): New name for `tc-associated-buffer'.
! 	(2C-toggle-autoscroll, 2C-autoscroll): New functions.
! 	(tc-scroll-line, tc-scroll-up, tc-scroll-down, tc-recenter): Deleted
! 	functions.
  
! Thu Jul  6 14:16:18 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* timezone.el (timezone-parse-date): Ignore text properties.
  
! 	* find-dired.el (find-dired): Undefine the g command.
  
! Sun Jul  2 04:13:00 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* bytecomp.el (byte-compile-obsolete): Do the funcall to compile
! 	the form whether or not we warn.
  
! 	* c-mode.el (calculate-c-indent-after-brace): New function.
! 	(calculate-c-indent, indent-c-exp): Use it.
! 
! 	* faces.el (x-font-regexp): Include the avgwidth.
  
! 	* iso-transl.el (iso-transl-char-map): Treat m, *m like u and *u.
  
! Sat Jul  1 01:39:19 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* subr.el (shell-quote-argument): Don't do anything, on MS-DOS.
  
! 	* sendmail.el (mail-default-reply-to): Initialize to nil.
! 	(mail-setup): Override it from env var if nil.
  
! 	* talk.el (talk-disconnect): Make it interactive.
! 	(talk-add-display): Ignore dead buffers and deleted frames.
  
! 	* font-lock.el (font-lock-make-faces): On grayscale screen,
! 	use grays for background, not foreground.
  
! 	* faces.el (describe-face): new function.
  
! Fri Jun 30 09:10:07 1995  Andre Spiegel  <spiegel@berlin.informatik.uni-stuttgart.de>
  
! 	* vc-hooks.el (vc-fetch-master-properties): Better error
!         message in case the "cvs status" command fails.
  
! Fri Jun 30 16:27:02 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* man.el (Man-underline-face): Doc fix.
  
! 	* mailalias.el (define-mail-alias): Doc fix.
  
! Fri Jun 30 19:07:05 1995  Paul Eggert  <eggert@twinsun.com>
  
! 	* sendmail.el (sendmail-send-it): If mail-from-style is parens,
!  	don't escape all parentheses; escape only the nonmatching ones.
  
! 	* sendmail.el (sendmail-send-it): If user-full-name contains
! 	special characters, quote or escape them for the From: line.
  
! Fri Jun 30 01:12:40 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* rmail.el (rmail-find-all-files): Bind case-fold-search.
  
! 	* term/x-win.el (x-colors): Doc fix.
  
! Fri Jun 30 00:13:38 1995  Kevin Rodgers <kevinr@ihs.com>
  
! 	* mailabbrev.el (mail-resolve-all-aliases-1):
! 	Downcase address before recursive call.
  
! Thu Jun 29 18:07:10 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* time.el (display-time-filter): Move run-hooks inside let.
  
! 	* simple.el (switch-to-completions): Make a completions window if none.
  
! 	* mouse.el (mouse-selection-click-count-buffer): New variable.
! 	(mouse-drag-region): Set it.
! 	(mouse-save-then-kill): Test it.
  
! Thu Jun 29 17:28:26 1995  David M Smith  <D.M.Smith@lancaster.ac.uk>
  
! 	* ielm.el (ielm-font-lock-keywords): New variable
! 	(inferior-emacs-lisp-mode): Use it for font-lock support
  
! Thu Jun 29 13:42:46 1995  Bryan O'Sullivan  <bos@Eng.Sun.COM>
  
! 	* ange-ftp.el (ange-ftp-normal-login): if ange-ftp-smart-gateway
!  	is set but ange-ftp-gateway-host is nil, use user@host
!  	proxy protocol.
  
! Thu Jun 29 10:51:47 1995  Morten Welinder  <terra+@cs.cmu.edu>
  
! 	* arc-mode.el (archive-mode): Add autoload cookie.
  
! 	* files.el (auto-mode-alist): Make archive-mode the default for
! 	.arc, .lzh, .zip, and .zoo files.
  
! Thu Jun 29 14:48:25 1995  Karl Fogel  (kfogel@wombat.gnu.ai.mit.edu)
  
! 	* bookmark.el: use "Save" and "Save As" instead of the nonstandard
! 	"Save" and "Write", in menu item titles.
  
! Thu Jun 29 00:35:53 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* menu-bar.el (find-tag): Delete the menu-enable property.
  
! 	* info.el (Info-goto-node, Info-search):
! 	In Transient Mark mode, deactivate the mark.
  
! 	* faces.el (make-face-x-resource-internal): Give special meanings
! 	to font "names" `italic', `bold', and `bold-italic'.
  
! 	* rmail.el (rmail-summary-by-sender): Autoload this.
! 	(rmail-mode-map): Add rmail-summary-by-senders.
  
! Wed Jun 28 06:01:36 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* fill.el (current-fill-column): If fill-column is nil, return nil.
! 	* simple.el (do-auto-fill): No-op if (current-fill-column) is nil.
  
! 	* loadup.el: Put isearch before menu-bar.
  
! 	* loaddefs.el: Don't set up key-translation-map.
  
! 	* help-macro.el (make-help-screen): Handle help-event-list.
! 	Handle backspace like delete.
! 	* help.el: Bind f1 and help like C-h.
  
! 	* supercite.el (sc-electric-mode-map): Bind f1 and help like C-h.
! 	* ediff-util.el (ediff-setup-keymap): Bind f1 and help like C-h.
! 	* edt.el (edt-setup-default-bindings): Bind f1 and help like C-h.
  
! 	* cplus-md.el (electric-c++-terminator): Fix logic for handling colon.
  
! 	* menu-bar.el: Make more menu-enables check (not buffer-read-only).
! 	Add minibuffer local menu bar menus.
  
! 	* startup.el: Update copyright year in message.
  
! 	* server.el (server-process-filter): Detect error messages from server.
  
! Tue Jun 27 18:58:43 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* edt.el (edt-emulation-on): Check window-system for x, specifically.
  
! Tue Jun 27 12:23:58 1995  Andre Spiegel  <spiegel@berlin.informatik.uni-stuttgart.de>
  
! 	* vc-hooks.el (vc-consult-rcs-headers): Use an even more
! 	pedantic regexp to match RCS time strings.  Improved
! 	efficiency by using looking-at instead of re-search "\\=...
  
! Tue Jun 27 02:51:17 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* ediff-wind.el (ediff-control-frame-parameters):
! 	Specify user-position.
  
! 	* imenu.el (imenu-choose-buffer-index): Understand that (menu-bar)
! 	doesn't specify a window.
  
! 	* startup.el (command-line): Extract arg value properly for -u.
  
! 	* subr.el (lambda): Doc fix.
  
! Mon Jun 26 15:40:39 1995  Ake Stenhoff  <etxaksf@aom.ericsson.se>
  
! 	* imenu.el (imenu-use-keymap-menu): New variable.
! 	(imenu-auto-rescan): New variable.
!         (imenu-auto-rescan-maxout): New variable.
! 	(imenu-generic-expression): Doc changes.
! 	(imenu-generic-lisp-expression): New variable.
! 	(imenu-generic-c-expression): New variable.
! 	(imenu-example--generic-c++-expression): Changed the name to
! 	imenu-generic-c++-expression.
!         (imenu-example--generic-texinfo-expression): Changed the name to
! 	imenu-generic-texinfo-expression.
! 	(imenu-example--generic-latex-expression): Changed the name to
! 	imenu-generic-latex-expression.
! 	(imenu--scanning-method-alist): New variable.
! 	(imenu--split-menu): Changed it to make the title "Index menu"
! 	instead of "Function menus".
!         (imenu--make-index-alist): Changed to handle auto rescan.
! 	(imenu--create-keymap-2): New function to create a keymap.
! 	(imenu--create-keymap-1): New function.
! 	(imenu--in-alist): New function.
!         (imenu-default-create-index-function): Changed to handle
! 	imenu--scanning-method-alist).
! 	(imenu--generic-extract-name): Removed.
! 	(imenu--generic-function): Rewritten to handle submenus.
! 	(imenu--mouse-menu): Changed to handle keymaps.
  
! Mon Jun 26 19:19:52 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* paths.el (remote-shell-program): Fix typo checking /usr/bin/remsh.
  
! Mon Jun 26 17:04:23 1995  Eric S. Raymond  <esr@snark.thyrsus.com>
  
! 	* vc.el (vc-start-entry): Prevent lossage when doing a mass checkin
! 	from a VC-dired buffer.
  
! Mon Jun 26 21:05:21 1995  Andre Spiegel  <spiegel@berlin.informatik.uni-stuttgart.de>
  
! 	* vc-hooks.el (vc-consult-rcs-headers): Handle the new time
! 	string formats of RCS 5.7.
  
! Mon Jun 26 13:56:46 1995  Mike Long  <mike.long@analog.com>
  
! 	* view.el (view-file-other-window): Re-add missing argument to
!         switch-buffer-other-window.
! 	(view-mode-map): Leave C-c alone!
! 	(view-mode): Doc fix.
  
! Mon Jun 26 07:55:44 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
  
! 	* font-lock.el (font-lock-defaults-alist): List all keywords for C and
! 	Emacs Lisp modes.  Doc fix.
! 	(font-lock-maximum-decoration): Doc fix.
! 	(font-lock-choose-keywords): New function.  Use them.
! 	(font-lock-set-defaults): Use it.  Doc fix.
! 	(lisp-font-lock-keywords): Default to lisp-font-lock-keywords-1.
! 	(c-font-lock-keywords): Default to c-font-lock-keywords-1.
! 	(c++-font-lock-keywords): Default to c++-font-lock-keywords-1.
  
! 	* fortran.el (fortran-mode): List all keywords for font-lock-defaults.
! 	(fortran-font-lock-keywords): Default to fortran-font-lock-keywords-1.
  
! Sat Jun 24 17:58:51 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* rmail.el (rmail-revert): Use the default revert-buffer-function
  
! 	* simple.el (newline): Put point at right place if insert gets error.
  
! Sat Jun 24 00:43:32 1995  Karl Fogel  <kfogel@floss.cyclic.com>
  
! 	* mail-hist.el (mail-hist-text-size-limit): New var.
! 	(mail-hist-text-too-long-p): New func.
! 	(mail-hist-add-header-contents-to-ring): call above; if the text is
! 	too long, then store the empty string in the history.
  
! Sat Jun 24 00:17:08 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* pc-mode.el (pc-bindings-mode): Add autoload.
  
! 	* enriched.el (excerpt): Ignore error making `excerpt' italic.
  
! Fri Jun 23 23:39:14 1995  Tom Tromey  <tromey@drip.colorado.edu>
  
! 	* makefile.el (makefile-define-tab-face): New function.
! 	(makefile-tab-face): Don't create face here.
! 	(makefile-mode): Call makefile-define-tab-face.
  
! Fri Jun 23 18:11:26 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* cc-mode.el (c-mode): Delete autoload cookie.
  
! 	* mail-hist.el: Don't autoload anything to turn on mail-hist.
! 	(mail-hist-enable): New function, autoloaded.
  
! Fri Jun 23 11:21:18 1995  Andre Spiegel  <spiegel@berlin.informatik.uni-stuttgart.de>
  
! 	* vc-hooks.el: Fix bug concerning vc-latest-version.
! 	Accessing that property left erroneous contents in the
! 	*vc-info* buffer, which could later be misinterpreted by
! 	other functions.
! 	(vc-insert-file): Erase the current buffer before inserting the file.
! 	(vc-fetch-master-properties, vc-fetch-properties): Don't erase the
! 	buffer because that is now done in vc-insert-file.
! 	(vc-fetch-properties): Kill the *vc-info* buffer when done.
  
! Fri Jun 23 01:52:12 1995  Paul Eggert  <eggert@twinsun.com>
  
! 	* vc.el (vc-backend-admin, vc-backend-checkin): Assume that
! 	comments are empty if they contain only white space.
  
! Thu Jun 22 13:50:29 1995  Andre Spiegel  <spiegel@berlin.informatik.uni-stuttgart.de>
  
! 	* vc-hooks.el (vc-fetch-master-properties): Pass an absolute
! 	pathname to the cvs status command. This is required to make
! 	recursive vc-directory listings work.
  
! Thu Jun 22 11:59:49 1995  Ethan Bradford  <ethanb@phys.washington.edu>
  
! 	* vt-control.el (vt-keypad-on, vt-keypad-off): Updated codes sent
!  	to terminal to eliminate some garbage that made NCSA telnet crash.
  
! Thu Jun 22 00:36:05 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* vip.el (vip-push-mark-silent): Use (mark t).
  
! 	* mouse.el (mouse-yank-at-click): Clear mouse-selection-click-count.
  
! Wed Jun 21 19:03:13 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* files.el (buffer-file-truename): Duplicate definition deleted.
  
! 	* simple.el (mark-even-if-inactive): Duplicate definition deleted.
  
! 	* lisp-mode.el (eval-defun): Don't change defvar to defconst
! 	if it has just one argument.
  
! Wed Jun 21 14:26:10 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* Version 19.29 released.
  
! 	* startup.el (precompute-menubar-bindings): While dumping,
! 	garbage-collect after each menu.
  
! Tue Jun 20 09:54:02 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* gud.el (gud-make-debug-menu): Cope if no local map yet.
  
! 	* loaddefs.el (help-event-list): Initialize it.
  
! 	* dired-aux.el (dired-do-redisplay): Call dired-uncache.
  
! 	* simple.el (universal-argument-num-events): New variable.
! 	(universal-argument, universal-argument-more, negative-argument)
! 	(digit-argument): Set that variable.
! 	(universal-argument-other-key): Use that variable when unreading.
  
! 	* vc-hooks.el (vc-handle-cvs): New variable.
! 	(vc-find-cvs-master): Check that variable.
  
! Mon Jun 19 21:07:03 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* vc-hooks.el (vc-fetch-properties): Add save-excursion.
  
! 	* cc-mode.el: Version 4.222 installed.  Changes too much to list.
! 	Kept these changes previously installed here:
! 	(c-version): Mention that this may be modified version.
! 	(c-common-init, c-fill-paragraph): Remove "^" used as anchor from
! 	paragraph-start and paragraph-separate values, so that they will
! 	work with non-0 left-margin settings.
  
! 	* vc-hooks.el (vc-fetch-master-properties): Be more careful
! 	about killing the *vc-info* buffer.
  
! Mon Jun 19 18:51:08 1995  Karl Heuer  <kwzh@hill.gnu.ai.mit.edu>
  
! 	* shell.el (shell-directory-tracker): Check for terminator after
! 	cd, pushd, or popd, so that we don't try to do directory tracking
! 	on things like "cdump".
! 	Don't use \\s patterns inside brackets.
  
! Mon Jun 19 16:27:34 1995  David K}gedal  <davidk@lysator.liu.se>
  
! 	* tempo.el: Documented the `l' tag.
! 	(tempo-insert-template): Check for zmacs-regions.
! 	Wrapped it in unwind-protect.
! 	(tempo-save-named): New function.
! 	(tempo-insert-prompt): Added NO-INSERT parameter.
! 	Handles previous values better.  Cleaned up interface.
! 	Check for already saved value.
! 	(tempo-remember-insertion): Function deleted.
! 	(tempo-insert-named): Use tempo-insert if data is not a string.
! 	Use tempo-lookup-named.
! 	(tempo-insert-prompt-compat): New function.
! 	(tempo-lookup-named): New function.
  
! Mon Jun 19 16:06:24 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* simple.el (universal-argument-other-key):
! 	Call reset-this-command-lengths.
  
! Mon Jun 19 11:34:38 1995  Ed Reingold  <reingold@albert.gnu.ai.mit.edu>
  
! 	* solar.el (calendar-location-name, sunrise-sunset): Fix bug in
!         determination of output string.
  
! Sun Jun 18 12:44:24 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* simple.el (negative-argument, digit-argument):
! 	Set overriding-terminal-local-map like C-u.
! 	(universal-argument-map): Add binding for \e t.
  
! 	* texinfo.el (texinfo-environment-regexp): Add @ifhtml, @html.
  
! Sun Jun 18 12:08:17 1995  Morten Welinder  <terra+@cs.cmu.edu>
  
! 	* arc-mode.el (archive-zip-summarize): Handle per-file
! 	comments in central directory.
  
! Sun Jun 18 10:45:30 1995  Johan Vromans  <jvromans@hill.gnu.ai.mit.edu>
  
! 	* forms.el: Remove references to mouse-major-mode-menu.
  
! Sun Jun 18 10:13:17 1995  Andre Spiegel  <spiegel@berlin.informatik.uni-stuttgart.de>
  
! 	* vc-hooks.el (vc-fetch-master-properties): Use path-separator
! 	for path to "cvs status" command.
  
! Sat Jun 17 21:24:28 1995  Karl Fogel  <kfogel@floss.cyclic.com>
  
! 	* bookmark.el: Make doc strings and argument names consistent
! 	where necessary.
! 	Moved user variables to own section.
! 	(bookmark-alist): Better doc string.
! 	(bookmark-insert-current-bookmark): Doc string.
! 	(bookmark-insert-buffer-name): Doc string.
! 	(bookmark-set): Take optional NAME argument.
! 	(bookmark-bmenu-select): Use member to test for string's presence.
! 	Use a more efficent test at end, as suggested by Mikio Nakajima.
  
! Sat Jun 17 11:20:25 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* startup.el (normal-top-level, command-line-1):
! 	Call precompute-menubar-bindings only if using x.
! 	(precompute-menubar-bindings): Don't check for x here.
! 	Set define-key-rebound-commands to t.
  
! 	* loadup.el: Call precompute-menubar-bindings.
! 	Then set define-key-rebound-commands to nil.
  
! 	* subr.el (add-hook): Use local local-variable-if-set-p.
  
! 	* info.el (Info-directory-list): If path-separator isn't available,
! 	bind it here.
  
! 	* vc.el (vc-do-command): Use path-separator.
  
! Sat Jun 17 16:18:18 1995  Andre Spiegel  <spiegel@berlin.informatik.uni-stuttgart.de>
  
! 	* vc.el (vc-directory): Use expand-file-name on default-directory.
! 	(vc-directory-exclusion-list): Add "CVS" to this list.
  
! Sat Jun 17 02:33:21 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* ediff.el: Fixed bogus references to menu-bar-file-menu in
!  	define-key forms.
  
! Fri Jun 16 18:24:06 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* isearch.el (isearch-mode-map): Bind frame events to nil.
  
! Fri Jun 16 19:38:19 1995  Andre Spiegel <spiegel@berlin.informatik.uni-stuttgart.de>
  
! 	* vc-hooks.el (vc-fetch-properties): Don't use
! 	vc-backend-dispatch, as that is in vc.el.
  
! 	* vc.el (vc-register): Inhibit backups for the file's buffer
  
! 	* vc.el (vc-add-triple, vc-lookup-triple, vc-record-rename):
! 	Use absolute file names to access the SCCS named configuration files
! 	("VC-names").
  
! 	* vc-hooks.el (vc-consult-rcs-headers): Fix typo in prev change.
  
! 	* vc-hooks.el (vc-find-cvs-master): Exit gracefully when not
! 	finding CVS/Repository.
  
! 	* vc.el (vc-lookup-triple): Call vc-parse-buffer instead of
! 	vc-master-info.
  
! 	* vc.el (vc-retrieve-snapshot): Use vc-checkout instead of
! 	vc-backend-checkout, as the former also updates the current buffer.
! 	(vc-file-tree-walk, vc-file-tree-walk-internal): Use
! 	expand-file-name, so that FUNC gets called with an unabbreviated name.
  
! Fri Jun 16 09:09:09 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* ispell.el: Reinstalled autoloads from ispell-dictionary-alist,
! 	ispell-menu-map, ispell-menu-lucid, and ispell-menu-map-needed.
  
! 	* vc.el (vc-backend-dispatch): Move definition before first use.
  
! Fri Jun 16 03:38:49 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
  
! 	* c-mode.el (c-mode-map): Put mark-active for menu-enable property on
! 	comment-region, c-macro-expand and c-backslash-region symbols.
  
! 	* facemenu.el (facemenu-menu): Change name to Special Properties.
  
! 	* font-lock.el (font-lock-make-faces): Optional arg OVERRIDE.
! 	Make faces, and their face variables, only if they don't exist already.
! 	(font-lock-make-faces-done): Removed.
! 	(font-lock-set-defaults): Don't set it.
  
! Fri Jun 16 02:08:48 1995  Karl Heuer  <kwzh@hill.gnu.ai.mit.edu>
  
! 	* simple.el (universal-argument-map): New var.
! 	(universal-argument, negative-argument, digit-argument):
! 	Use overriding-terminal-local-map.
! 	(prefix-arg-internal, describe-arg): Functions deleted.
! 	(universal-argument-more, universal-argument-minus): New functions.
! 	(universal-argument-other-key): New function.
  
! 	* isearch.el (isearch-mode): Use overriding-terminal-local-map.
! 	(isearch-done): Likewise.
  
! Thu Jun 15 08:24:03 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* ispell.el: Removed autoload from ispell-dictionary-alist,
! 	ispell-menu-map, ispell-menu-lucid, and ispell-menu-map-needed
! 	so users can more easily modify and upgrade entries.
! 	(ispell-dictionary-alist): Once more a single variable.
! 	(ispell-required-version): Documentation changes
! 	(ispell-skip-sgml): Documentation changes
! 	(ispell-command-loop): mode-line-format now shows misspelled word.
! 	(ispell-message-text-end): Can now process postscript version 1.
! 	(ispell-message-start-skip): New variable for block skips, set up for
! 	pgp and forward blocks.
! 	(ispell-message-end-skip): New variable for block skips, set up for
! 	pgp and forward blocks.
! 	(ispell-message): Added	block message skipping.
! 	(ispell-buffer-local-parsing): Added html-mode.
  
! 	* mouse.el (mouse-set-region): Bind last-command with this-command.
  
! 	* winnt.el (grep-null-device): Set this instead of null-device.
  
! 	* dos-fns.el (path-separator, grep-null-device, grep-regexp-alist):
! 	Set them, as in winnt.el.
  
! 	* compile.el (grep-null-device): Renamed from null-device.
  
! 	* vc-hooks.el (vc-fetch-master-properties): For RCS file,
! 	don't look for vc-latest-version and vc-your-latest-version here.
! 	Read only through ^locks unless we need to find the tip of a branch.
! 	(vc-consult-rcs-headers): Use non-regexp search to find the headers.
! 	(vc-latest-version, vc-your-latest-version): Use vc-fetch-properties.
! 	(vc-fetch-properties): New function.
  
! 	* buff-menu.el (list-buffers-noselect): Don't let space after buf name
! 	inherit the text props from it.
  
! 	* subr.el (make-local-hook): Doc fix.
  
! Thu Jun 15 08:24:03 1995  Andre Spiegel  <spiegel@bruessel.informatik.uni-stuttgart.de>
  
! 	* vc-hooks.el: The RCS status is now found by reading the
! 	master file directly, instead of using rlog.  The properties
! 	retrieved from the master file are kept separately.  The two
! 	main properties, `vc-workfile-version' and `vc-locking-user',
! 	are inferred from those master file properties if the
! 	information cannot be found elsehow.  All properties are
!         consistently cached now.
  
! 	Reordered some defuns so they are grouped in a logical way.
  
! 	(vc-master-info, vc-log-info, vc-fetch-properties): Functions
! 	removed.  Their job is now done by `vc-fetch-master-properties'
! 	and `vc-insert-file'.
  
! 	(vc-fetch-master-properties): New function.
! 	(vc-insert-file): New function.
! 	(vc-parse-locks): New function.
! 	(vc-locked-version): Property no longer set.
! 	(vc-head-version, vc-default-branch, vc-master-locks): New properties.
! 	(vc-top-version): New name for the old property `vc-branch-version'.
  
! 	(vc-master-locking-user): Replaces `vc-true-locking-user'.
  
! 	(vc-locking-user): Slightly changed to use the new properties.
! 	Changed the actual property value for an unlocked file to
! 	'none.  This is to distinguish it from an unknown locking
! 	state, which is represented by nil.  The function vc-locking-user
! 	returns nil if the property is 'none, to make it compatible with
! 	the rest of VC.
  
! 	(vc-consult-rcs-headers, vc-master-locking-user): Adapted to
! 	the new 'none-value of vc-locking-user.
  
! 	(vc-consult-rcs-headers): Fixed bug that prevented
! 	(not vc-consult-headers) from working
  
! 	(vc-file-not-found-hook): Set the default-directory of the new
! 	buffer before check-out.
  
! 	* vc.el: Adapt to the changes in vc-hooks.el, namely, the new
! 	'none-value of vc-locking-user, and the consistent caching
! 	of all properties.  Especially, make the properties survive
!         check-ins and check-outs.  Various minor bug fixes.
  
! 	(vc-file-clear-masterprops): New function.
  
! 	(vc-backend-checkin, vc-backend-revert): Set vc-locking-user
! 	to 'none if the file is unlocked.
  
! 	(vc-backend-checkin, vc-backend-revert, vc-backend-checkout):
! 	Use vc-file-clear-masterprops, and adjust those properties
! 	that are not cleared.
  
! 	(vc-resynch-window):  Temporarily remove vc-find-file-hook, so
! 	that we don't lose the file properties during check-in/out.
  
! 	(vc-resynch-window): Do not try to delete the current window if
! 	`vc-keep-workfiles' is nil (doesn't make sense; killing the
! 	buffer is enough.)
  
! 	(vc-backend-checkin): Rewrote the code that adjusts the default
! 	branch and removes any locks that might remain after check-in.
  
! 	(vc-cancel-version): Abort with error message in the CVS case.
! 	(The error used to be signalled in vc-backend-uncheck, which is
! 	a little too late.)
  
! 	(vc-minor-revision): Function removed.
  
! Wed Jun 14 22:16:14 1995  Geoff Voelker  <voelker@cs.washington.edu>
  
! 	* subr.el (shell-quote-argument) [WINDOWSNT]: Wrap in quotes only.
  
! 	* compile.el (null-device): Defined.
! 	(grep): Use null-device.
  
! 	* winnt.el (null-device): Set to "NUL".
! 	(grep-regexp-alist): Match entries with drive letters.
! 	(save-to-unix-hook,revert-from-unix-hook): Defined.
! 	(using-unix-filesystems): Defined.
! 	(window-frame): Unaliased.
  
! Wed Jun 14 18:27:58 1995  Karl Heuer  <kwzh@churchy.gnu.ai.mit.edu>
  
! 	* simple.el (universal-argument, describe-arg): Restore Lisp code,
! 	undoing Feb 28 change.
! 	(prefix-arg-internal, digit-argument, negative-argument): Likewise.
! 
! Wed Jun 14 12:00:35 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* frame.el (frame-notice-user-settings): When making a minibufferless
! 	frame, don't copy `name' parm explicitly unless it was explicit before.
  
! Wed Jun 14 11:47:33 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* compile.el (compilation-find-file): If FILENAME is absolute,
!  	apply abbreviate-file-name to it and then use its directory part
!  	as the first search path element, searching for its nondirectory
!  	part.  Fix prompting code not to use a free variable.
! 	(compilation-parse-errors, compile-abbreviate-directory): Use
! 	abbreviate-file-name on directories.
  
! Wed Jun 14 21:55:27 1995  Johan Vromans  <jv@NL.net>
  
! 	* forms.el (forms--mode-menu-edit,forms--mode-menu-ro):
! 	Set `mouse-major-mode-menu'.
  
! Wed Jun 14 10:50:27 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
  
! 	* lisp-mode.el (emacs-lisp-mode-map): Put mark-active for menu-enable
! 	property on eval-region, comment-region and indent-region symbols.
! 	(save-selected-window): Define indentation.
  
! Wed Jun 14 07:06:47 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* viper-util.el: Delete the Emacs version error check.
  
! 	* ediff-init.el: Delete the Emacs version error check.
  
! 	* dired.el (dired-change-marks): If OLD is a space,
! 	don't act on non-file lines.
  
! 	* vc.el (vc-backend-checkin): Provide an explicit string saying
! 	the log message is empty instead of providing it as empty.
! 	Always use -m option for ci.
  
! 	* shell.el (shell-mode): Make shell-directory-tracker a hook
! 	function locally only.
  
! Tue Jun 13 16:38:40 1995  Per Bothner  <bothner@kalessin.cygnus.com>
  
! 	* term.el:  Various optimizations.  The main one is to optimize for
! 	simple output at the end of the buffer, with no paging, and in that
! 	case to defer scrolling while we can.
! 	(term-emulate-terminal):  Don't call term-handle-scroll in
! 	simple cases unless we are either paging or term-scroll-with-delete.
! 	(term-down):  Likewise.
! 	(term-handle-scroll):  Modify accordingly.
! 	(term-emulate-terminal):  Avoid deleting old text in common case.
! 	Optimize the simple case of CRLF when we're at buffer end.
! 	Handle deferred scroll when done processing output.
! 	(term-handle-deferred-scroll):  New function.
! 	(term-down):  Simplify - no longer take RIGHT argument.  Tune.
! 	(term-goto):  Use term-move-columns to compensate for the above.
  
! 	* term.el (term-escape-char, term-set-escape-char):  Add doc-string.
! 	(term-mouse-paste):  Add xemacs support.
  
! 	* term.el:  Various speed enhencements:
! 	(term-handle-scroll):  Don't clear term-current-row; maybe adjust it.
! 	(term-down):  Don't call term-adjust-current-row-cache if we've
! 	done term-handle-scroll.
! 	(term-emulate-terminal):  Don't call term-adjust-current-row-cache.
! 	(term-emulate-terminal):  For TAB, don't nil term-start-line-column.
! 	(term-goto):  Possible optimization.
  
! Tue Jun 13 19:28:59 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* comint.el (comint-mode): Use make-local-hook.
! 	(comint-send-input, comint-output-filter): Use run-hook-with-args.
! 	(comint-dynamic-complete): Use run-hook-with-args-until-success.
  
! Tue Jun 13 17:19:52 1995  Michael Kifer <kifer@cs.sunysb.edu>
  
! 	* viper.el (vip-change-state-to-vi): bug fix.
! 	* viper-util.el (vip-over-whitespace-line): new function.
  
! Tue Jun 13 04:16:28 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
  
! 	* files.el (file-truename): Use expand-file-name if filename is "".
  
! 	* shell.el (shell-mode): Set comint-input-ring-file-name to nil if "".
  
! Mon Jun 12 22:16:46 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* menu-bar.el (help-menu): Symbol renamed from `help'.
  
! 	* rmail.el (rmail-search-backwards): Default count is 1, not -1.
  
! Sat Jun 10 00:38:31 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* window.el (save-selected-window): New macro.
  
! Fri Jun  9 11:38:01 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* faces.el (x-create-frame-with-faces): Don't use initial-frame-alist
! 	when looking for the X resource name.
! 	Copy parameters from default-frame-alist, before the geometry
! 	specs from the X resource database.
  
! Fri Jun  9 11:24:26 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* faces.el (x-create-frame-with-faces): Don't look for geometry
! 	resource if name is nil.
  
! Fri Jun  9 08:37:08 1995  Erik Naggum  <erik@naggum.no>
  
! 	* gnuspost.el (gnus-cancel-news): Use `buffer-disable-undo'.
! 	(gnus-inews-article): Ditto.
! 	(gnus-inews-insert-signature): Use the recommended
! 	hyphen-hyphen-space as the signature delimiter.
  
! Thu Jun  8 16:23:13 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* info.el (Info-mode): Doc fix.
! 	(Info-next-preorder): Renamed from Info-next-preorder-1.
! 	Old definition deleted.
! 	After moving up, go to end of node.
! 	(Info-last-preorder): If no menu, try the previous node.
! 	After going down thru menu or to previous, position at end
! 	of node and recenter.
! 	After moving up, position at start of menu.
! 	(Info-follow-nearest-node, Info-mouse-follow-nearest-node):
! 	Use Info-next-preorder.
! 	(Info-scroll-up, Info-scroll-down): Doc fix.
  
! 	* emacsbug.el (report-emacs-bug-info): New command.
! 	(report-emacs-bug): Put it in local map.  Display a message
! 	in another window.
  
! 	* format.el (format-find-file, format-insert-file): New functions.
  
! Thu Jun  8 10:34:10 1995  Morten Welinder  <terra+@cs.cmu.edu>
  
! 	* add-log.el (prompt-for-change-log-name): Handle the case where
! 	a directory name is specified gracefully.
  
! Thu Jun  8 21:20:39 1995  Andre Spiegel <spiegel@bruessel.informatik.uni-stuttgart.de>
  
! 	* vc.el (vc-backend-checkin): Handle RCS `ci'-output in the event
! 	that a check-in only results in reverting to the previous version.
! 	Also be more robust if the new version number cannot be told from
! 	what `ci' says.
  
! Thu Jun  8 20:59:55 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* vc.el (vc-register): Check for a visited file first thing.
  
! 	* files.el (file-precious-flag): Doc clarification.
  
! Thu Jun  8 20:06:03 1995  Michael Kifer <kifer@cs.sunysb.edu>
  
! 	* viper.el (vip-envelop-ESC-key): if an ESC-sequence translates
! 	into a function key, pretend that this key was the last command event.
  
! 	* viper.el (vip-put-back,vip-Put-back): now emulate Vi's behavior
! 	more closely.
  
! 	* viper.el (vip-line): no longer not bombs out.
! 	(vip-exec-shift) now preserves the point.
  
! 	* viper.el: Fixed the behavior of the Vi commands M, L, G, yw, dg, etc.
  
! 	* viper-util.el (vip-event-key): now handles keys 128--255 as
! 	meta-chars.
! 	* viper-ex.el: Fixed problems with yanking/deleting buffers.
  
! 	* viper.el, viper-mous.el, viper-util.el, viper-ex.el:
! 	Changed vip-*-frame-* to *-frame-*, incorporated overlay strings,
! 	unread-command-events, removed support for emacs versions 19.28 and
! 	xemacs 19.11 and earlier.
! 	* viper-macs.el, viper-keym.el: Likewise.
  
! Thu Jun  8 12:48:54 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* map-ynp.el (map-y-or-n-p): Don't eval return value of prompter
!  	function.
  
! Thu Jun  8 10:29:43 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
  
! 	* texinfo.el (texinfo-font-lock-keywords): Do comments first.
  
! Thu Jun  8 09:03:28 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* rlogin.el (rlogin): If optional second arg is buffer or string,
!  	use that as name.
  
! Wed Jun  7 18:08:10 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* gud.el (gud-common-init): Call the MASSAGE-ARGS function even if
!  	FILE is nil.
  
! Wed Jun  7 14:57:24 1995  Morten Welinder  <terra+@cs.cmu.edu>
  
! 	* s-region.el: Delete version number.
! 	(s-region-bind): Doc fix.
! 	(s-region-move): Split into s-region-move and s-region-move-p1.
! 	(s-region-move-p2): New function.
! 	(s-region-move): Bind this-command.  Bind keys to s-region-move-p1
! 	or s-region-move-p2 as appropriate.
  
! Wed Jun  7 11:05:56 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* replace.el (query-replace-map): Bind f1 and help.
  
! 	* subr.el (read-quoted-char): Turn on help-form and turn off help-char.
  
! 	* isearch.el (isearch-other-meta-char): Try downshifting
! 	shifted control characters.
  
! 	* files.el (file-precious-flag): Doc fix.
  
! 	* vc.el (vc-register): Clean error message if no visited file.
  
! 	* vc-hooks.el (vc-menu-map): Disable Register when no visited file.
  
! Wed Jun  7 15:11:27 1995  Paul Eggert  <eggert@twinsun.com>
  
! 	* time.el (display-time-filter):
! 	Use same instant for both time and time-zone.
  
! Mon Jun  5 19:36:35 1995  Michael Kifer  <kifer@cs.sunysb.edu>
  
! 	* ediff-merg.el (ediff-set-state-of-diff-in-all-buffers): bug fix.
! 	(ediff-set-merge-mode): new function.
! 	(ediff-do-merge): now sets correct major mode in the merge buffer.
! 	(ediff-combine-diffs): handles correctly non-interactive calls.
  
! 	* ediff.el: Added ediff-cleanup-hooks and ediff-janitor.
  
! 	* ediff-wind.el (ediff-setup-control-frame, ediff-keep-window-config):
! 	bug fix.
  
! 	* ediff-init.el (ediff-frame-has-menubar): function deleted.
! 	(ediff-device-type, ediff-color-display-p): new functions.
  
! 	* ediff-wind.el (ediff-make-control-frame): optimized for display.
! 	Commented out (redraw-display), to improve speed.
  
! 	* ediff.el: don't make the patch buffer RO.
  
! 	* ediff.el (ediff-load-version-control): now checks if
! 	ediff-revision-key is non-nil.
  
! 	* ediff.el (ediff-revision-key): Now defaults to nil.
  
! 	* ediff.el (ediff-revision): now takes prefix argument; can compare
! 	two versions of the same file.
  
! 	* ediff.el: the merge buffer now assumes the major mode of the
! 	default variant.
  
! 	* ediff.el (ediff-documentation: new function.
  
! 	* ediff-wind.el: Got rid of toolbars in control frame in xemacs
  
! 	* ediff-wind.el: Changed window-min-height from 1 to 2
  
! 	* ediff-wind.el (ediff-diff-at-point, ediff-toggle-multiframe): bug
! 	fixes.
! 	(ediff-destroy-control-frame, ediff-window-display-p): new functions.
! 	* ediff.el, ediff-wind.el, ediff-util.el, ediff-init.el:
! 	Converted xemacs *screen* nomenclature to *frame*.
! 	Incorporated overlay strings. Ediff no longer runs under emacs
! 	19.28 and earlier and XEmacs 19.11 and earlier.
! 	* ediff.el (ediff-patch-buffer): now handles buffers that don't
! 	visit any file.
! 	(ediff-windows): renamed to ediff-windows-wordwise, added
! 	(ediff-windows-linewise): new function.
! 	Changed ediff-small/large-regions to ediff-regions-wordwise/linewise
  
! 	* ediff.el, ediff-wind.el:
! 	Changed window-system to ediff-window-display.
  
! 	* ediff-wind.el (ediff-toggle-multiframe): fixed.
! 	(ediff-destroy-control-frame): new function.
  
! Mon Jun  5 16:43:29 1995  Boris Goldowsky  <boris@spiff.gnu.ai.mit.edu>
  
! 	* avoid.el, enriched.el, facemenu.el, format.el, shadowfile.el:
! 	Change email address for Boris.
  
! Sat Jun  3 14:10:48 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* mouse.el (mouse-set-region): Don't bounce the cursor on X.
! 	mouse-drag-region takes care of showing it, sufficiently.
  
! Fri Jun  2 12:07:40 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* version.el (emacs-version): If using Motif, mention it.
  
! 	* files.el (hack-local-variables-prop-line): Don't downcase var name.
  
! Fri Jun  2 10:34:53 1995  Ed Reingold  <reingold@albert.gnu.ai.mit.edu>
  
!         * calendar.el (calendar-string-spread): Fix to allow 0 or 1 string.
!         (calendar-set-mode-line): Use this ability.
!         (generate-calendar-month): Ditto.
  
!         * cal-x.el (calendar-two-frame-setup): Create fancy buffer if needed.
!         (calendar-one-frame-setup): Ditto.
  
!         * diary-lib.el (make-fancy-diary-buffer): New function.
!         (fancy-diary-display): Use it.
  
! Fri Jun  2 03:42:37 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
  
! 	* comint.el (comint-word): Set match-data to match the word.
  
! Thu Jun  1 20:13:28 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* term/x-win.el (vendor-specific-keysyms): Recognize "X Consortium".
  
! Thu Jun  1 19:19:03 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* files.el (multiple-recover-finish): Renamed to
!  	recover-session-finish.
! 	(recover-session): Changed binding.
! 	(recover-session-finish): Doc fix; rewritten using map-y-or-n-p.
  
! Thu Jun  1 16:53:39 1995  Ed Reingold  <reingold@albert.gnu.ai.mit.edu>
  
!         * cal-x.el (calendar-setup): Autoload it.
  
! Thu Jun  1 05:09:12 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
  
! 	* fast-lock.el: New version 3.06 from author.
! 	(fast-lock-save-cache): Use verify-visited-file-modtime to check
! 	timestamp of file against buffer, and visited-file-modtime to check
! 	timestamp of file against cache.  Check buffer with buffer-modified-p.
! 	Do set-buffer before all of these.
! 	(fast-lock-save-events): Events for which a cache may be saved.
! 	(fast-lock-after-save-hook, fast-lock-kill-buffer-hook,
! 	fast-lock-kill-emacs-hook): Functions for those events; added to hooks.
! 	(fast-lock-save-faces): List of faces to save.
! 	(fast-lock-get-face-properties): Use it.
! 	(fast-lock-cache-filename): Variable to store buffer's cache file name.
! 	(fast-lock-cache-data): Set it.  Use buffer-modified-p to check buffer.
! 	Compile keywords before comparison.  Revert timestamp from
! 	verify-visited-file-modtime format if necessary.
  
! 	* font-lock.el (font-lock-compile-keywords): Optional KEYWORDS to use.
! 	Don't compile them if it looks like they already have been.
  
! Wed May 31 15:40:29 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* time-stamp.el: Move defconsts to avoid byte-compiler warnings.
  
! 	* menu-bar.el (menu-bar-help-menu): Add "..."
  
! Wed May 31 16:25:03 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* dired.el (dired-find-buffer-nocreate): Ignore dead buffers.
  
! 	* scroll-bar.el (scroll-bar-drag): Call scroll-bar-drag-1
! 	inside the let.
  
! Tue May 30 17:44:51 1995  Morten Welinder  <terra+@cs.cmu.edu>
  
! 	* lisp-mode.el (emacs-lisp-mode-map): Add a menu.
! 	(emacs-lisp-byte-compile): New function.
  
! 	* arc-mode.el (archive-lemacs): New variable.
! 	(archive-mode-map, archive-summarize-files): Make it sort-of
! 	work with Lucid Emacs.
! 	(archive-mouse-extract): Use Lucid compatible code.
! 	(archive-summarize-files, archive-lzh-chmod-entry): Guard
! 	lambda with function.
  
! Tue May 30 17:19:56 1995  Stephen Gildea  <gildea@x.org>
  
! 	* time-stamp.el (time-stamp): only warn about time-stamping
! 	being disabled if found a time-stamp that won't get updated.
  
! Tue May 30 15:36:18 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* compile.el (compilation-error-regexp-alist): In "Cray C" regexp,
!  	don't allow newlines.
  
! Tue May 30 15:20:19 1995  Michael Kifer <kifer@cs.sunysb.edu>
  
! 	* ediff-wind.el (ediff-setup-control-frame): Make
! 	Ediff delete the old control frame before creating a new one.
  
! Tue May 30 14:38:48 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* bookmark.el: Fix capitalization in menu bar.
! 	* rmailsum.el: Likewise.
! 	* makefile.el: Likewise.
! 	* hideshow.el: Likewise.
! 	* cal-menu.el: Likewise.
! 	* sh-script.el (sh-mode-map): Likewise.
! 	* compile.el (compilation-mode-map): Likewise.
! 	* bibtex.el (bibtex-mode-map): Likewise.
! 	* tar-mode.el (tar-mode-map): Likewise.
! 	* forms.el (forms--mode-menu-ro, forms--mode-menu-edit): Likewise.
! 	* gud.el: Likewise.
! 	(gud-xdb-find-file): Delete duplicate menu-bar entry.
! 	* f90.el: Fix capitalization and punctuation in menu bar.
  
! 	* frame.el (frame-configuration-p): Moved to subr.el.
! 	* subr.el (frame-configuration-p): Moved here from frame.el.
  
! Tue May 30 14:27:18 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* facemenu.el (facemenu-special-menu): Use characters, not symbols.
! 	Add Remove Special menu item.
! 	(facemenu-remove-special): New function.
! 	(facemenu-set-face-from-menu): If prefix arg, treat region as inactive.
! 	(facemenu-set-face): Likewise.
! 	(facemenu-keymap, facemenu-foreground-menu, facemenu-background-menu):
! 	Add ... after Other.
! 	(facemenu-menu): Change name to Text Properties.
  
! 	* facemenu.el (facemenu-remove-really-all): New function.
! 	(facemenu-special-menu): Add Remove All menu item.
! 	(facemenu-indentation-menu): Make item names clearer.
! 	Pick new key names too.
  
! 	* facemenu.el (facemenu-menu): Split up definition.
! 	Move `Remove All' item here.
! 	(facemenu-special-menu): Delete `Remove All' item.
! 	(facemenu-remove-all): Renamed from facemenu-remove-really-all.
! 	(facemenu-remove-props): Renamed from facemenu-remove-all.
  
! Mon May 29 16:15:53 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* frame.el (make-initial-minibuffer-frame): New function.
! 	(frame-notice-user-settings): Call it.
  
! 	* man.el (Man-default-man-entry): Return result.
  
! 	* gud.el (gud-perldb-find-file): Use gud-make-debug-menu.
  
! Mon May 29 17:59:27 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* gud.el (gud-make-debug-menu): New function.
! 	(gud-mode, gud-gdb-find-file, gud-dbx-find-file, gud-sdb-find-file)
! 	(gud-xdb-find-file): Use gud-make-debug-menu.
  
! 	* find-dired.el (find-dired): If dired-simple-subdir-alist is not
! 	defined, set dired-subdir-alist a different way.
! 	(find-dired-version): Variable deleted.
  
! 	* files.el (after-revert-hook, before-revert-hook): Add defvars.
  
! Mon May 29 16:07:36 1995  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
  
! 	* gud.el (gud-perldb-massage-args): Pass `-emacs' after the file name.
  
! 	* dired.el (dired-mode-map): Rename menubar bindings and use the
! 	new function names `dired-do-query-replace' and `dired-do-search'.
  
! Mon May 29 15:15:01 1995  Francesco Potorti`  (pot@cnuce.cnr.it)
  
! 	* man.el (Man-init-defvars): Don't remove lines containing
! 	"No such file or directory".
! 
! Mon May 29 02:48:05 1995  Karl Heuer  <kwzh@gnu.ai.mit.edu>
! 
! 	* cc-mode.el (c-mode-help-address): New hostname.
! 
! Sun May 28 23:59:00 1995  Erik Naggum  <erik@naggum.no>
  
! 	* mail-extr.el (mail-extr-all-letters-but-separators): reinstate
! 	\377, the bug in search.c is apparently gone.
! 	(mail-extr-first-letters): add 8-bit characters
! 	(mail-extr-last-letters): ditto
  
! 	* simple.el (indent-for-comment): move to beginning of line only
! 	if there is a comment syntax.
  
! Sun May 28 23:58:00 1995  Michael Ernst  <mernst@research.microsoft.com>
  
! 	* dired.el (dired-find-buffer-nocreate): Check only buffers in
! 	dired-buffers instead of all buffers in (buffer-list).
  
! Sun May 28 18:17:22 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* vc.el (vc-revert-buffer1): Delete the special code for font-lock.
  
! 	* font-lock.el (font-lock-revert-cleanup): Always turn font lock on.
! 	(font-lock-mode): When turning mode off, always take out
! 	the revert hooks.
  
! 	* files.el (revert-buffer): Save after-revert-hook (both local and
! 	global values) before reverting, and run the saved values at the end.
  
! 	* files.el (find-file-noselect): In "file changed" messages,
! 	mention buffer name if different from file name.
  
! 	* ediff-wind.el (ediff-setup-control-frame): Use
!  	designated-minibuffer-frame while making the new frame.
! 	And delete the old frame if its minibuffer is not in that frame.
! 	(ediff-setup-windows-multiframe-compare)
! 	(ediff-setup-windows-multiframe-merge): Don't mess with
! 	default-minibuffer-frame here and don't kill the old control frame.
  
! 	* ediff-util.el (ediff-setup): Don't make default-minibuffer-frame
! 	a buffer-local variable.
  
! 	* dabbrev.el (dabbrev--abbrev-at-point): If point is after
! 	a separator, move back to previous abbreviation.
! 	(dabbrev-expand): New feature--if you insert a space and
! 	call this command again, it always fetches consecutive words
! 	after the expansion that was found for the actual abbrev.
  
! 	* isearch.el (isearch-edit-string): Don't bind isearch-other-end.
  
! Fri May 26 20:40:18 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* sendmail.el (send-mail-function, mail): Doc fixes.
  
! 	* simple.el (previous-matching-history-element):
! 	No longer remove empty string from history.
! 	Better error message if history is empty.
  
! Fri May 26 20:33:52 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* vc-hooks.el (vc-log-info): Use path-separator.
! 	* info.el (Info-directory-list): Use path-separator.
! 	* gud.el (gud-gdb-marker-regexp): New var.  Use path-separator.
  
! Fri May 26 20:22:39 1995  Michael Ernst  <mernst@research.microsoft.com>
  
! 	* ispell.el (ispell-message-text-end): Match start of forwarded msg.
  
! Fri May 26 16:11:07 1995  Geoff Voelker  <voelker@cs.washington.edu>
  
! 	* startup.el (command-line): Handle nil command-line-args.
  
! Fri May 26 12:25:13 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* compile.el (compilation-error-regexp-alist): In "IBM C/C++
!  	Tools" regexp, disallow leading spaces and disallow whitespace
!  	chars within the file name.
  
! Fri May 26 00:00:10 1995  Michael Ernst  <mernst@research.microsoft.com>
  
! 	* dired-x.el (dired-find-buffer-nocreate): Don't try to find a
! 	wildcard as a subdirectory.
  
! 	* gud.el (gud-common-init): Don't die if filename not supplied.
! 	Omit trailing hyphen when no filename follows.
  
! 	* texnfo-upd.el (texinfo-sequentially-find-pointer): Don't modify
! 	the kill ring.
  
! Thu May 25 23:53:58 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* bytecomp.el (byte-compile-insert-header):
! 	When using dynamic docstrings, refuse to load in 19.28 and older.
! 	In that error message, don't mention the directory names.
  
! 	* faces.el (x-create-frame-with-faces): Read geometry resource
! 	and use that while creating the frame.
  
! Wed May 24 17:02:23 1995  Rolf Ebert  <re@waporo.muc.de>
  
! 	* ada-mode.el (initial comments): Copyright 1995; don't speak
! 	about setup; correct history for a file that actually IS in
! 	Emacs 19.29; update list of known bugs.
! 	(all functions): inititialize all local variables explicitely to 'nil'.
! 	(ada-font-lock-keywords): initialized according to new user option
! 	`font-lock-maximum-decoration'.
  
! 	* ada-mode.el (ada-ident-re): new regexp for Ada identifiers.
! 	(ada-block-start-re): "record" may be preceded by one or more
! 	occurencies of "limited", "abstract", or "tagged".
! 	(ada-end-stmt-re): added "separate" body parts, "else", and
! 	"package <Id> is".
! 	(ada-subprogram-start-re): added "entry", "protected" and
! 	"package body"
! 	(ada-indent-function): handle "elsif" the same way as "if", added
! 	"separate" for no indent.
! 	(ada-get-indent-type): if "type ... is .." is followed by code on
! 	the same line, it is a broken statement. Test it.
! 	(ada-check-defun-name): check for "protected" records.
! 	(ada-goto-matching-decl-start): use of ada-ident-re.
! 	(ada-goto-matching-start): extend regexp for "protected" record.
! 	(ada-in-limit-line): renamed from in-limit-line. Don't use
! 	count-lines, but test if beginning-of-line/end-of-line puts us
! 	to bob/eob.
! 	(ada-goto-previous-nonblank-line): save a beginning-of-line
! 	statement, as we already are there.
! 	(ada-complete-type): removed.
! 	(ada-tabsize): removed.
! 	(keymap): use C-M-a and C-M-e for proc/func movement.  No
! 	keybinding anymore for next/prev-package.
! 	(ada-font-lock-keywords-[1|2]): add protected records. "when" removed
! 	from 'reference'-face.
! 	(initial comments): updated CREDITS list.
! 	(ada-add-ada-menu): capitalized menu entries.  Added menu statement
! 	needed for XEmacs.
  
! 	* ada-mode.el: changed all Ada94 to Ada95.
  
! 	* ada-mode.el: (ada-xemacs): new function, detect if we are
! 	running on XEmacs. Ada keymap definition and menus use it.
! 	(ada-create-syntax-table): corrected comments explaining use of 2nd
! 	syntax table.  Added creation of ada-mode-symbol-syntax-table
! 	with '_' as word constituent.
! 	(ada-adjust-case): add test, if symbol is preceeded by a "'".
! 	If true, change case according to ada-case-attribute.
! 	(ada-which-function-are-we-in): new routine. Save name of the current
! 	function in the old buffer; we can place cursor now at the same
! 	function in the new buffer using find-file.
! 	(ada-make-body): new function.  Generates body stubs if the body
! 	did not exist yet and you switch to it by find-file.
! 	(ada-gen-treat-proc): complete rewrite for ada-make-body.
! 	(ada-mode): two doc lines about the above extension.
! 	(keymap definition): remove 4th parameter in call to
! 	`substitute-key-definition' to make XEmacs happy.
  
! 	(ada-adjust-case-region, ada-move-to-start, ada-move-to-end,
! 	ada-indent-newline-indent, ada-format-paramlist): switch syntax
! 	tables, protect switching of syntax tables with unwind-protect.
! 	(ada-in-open-paren-p): replace user option
! 	`ada-search-paren-line-count-limit' by
! 	`ada-search-paren-char-count-limit'.
! 	(ada-case-attribute): new user option, but not yet the functionality.
! 	(ada-krunch-args): initialized to 0 exploiting the new capability of
! 	'gnatk8' as of gnat-2.0.
! 	(ada-make-filename-from-adaname): remove downcasing and replacement
! 	of dots. This is done in external program gnatk8 (gnat-2.0).
! 	(ada-in-open-paren-p): complete rewrite for speed-up.
! 	(ada-search-ignore-string-comment): ignore # as a string terminator
! 	in all searches.
! 	(ada-add-ada-menu): use real variables instead of t for invoking
! 	'easymenu'
! 	(require 'easymenu).
! 	(imenu-create-ada-index): we accept forward definitions again.
! 	(ada-indent-region): catch errors, simplified code.
  
! Tue May 23 20:18:57 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* term/x-win.el (vendor-specific-keysyms): Add second spelling for HP.
  
! 	* arc-mode.el: Remove version number.
  
! Tue May 23 15:08:51 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* menu-bar.el (delete-frame-enabled-p): New subroutine.
! 	Use frame-visible-p to reduce consing.
  
! 	* help.el (describe-prefix-bindings): If key is a string,
! 	make a substring; for a vector, make a vector.
  
! Mon May 22 18:24:16 1995  Erik Naggum  <erik@naggum.no>
  
! 	* gnus.el (gnus-gnus-to-quick-newsrc-format): don't save
! 	gnus-newsgroup-alist in .newsrc.el.
  
! Mon May 22 17:41:23 1995  Richard Stallman  <rms@waves>
  
! 	* edmacro.el (edit-kbd-macro): Better error messages for undefined keys
! 	or keys that are not keyboard macros.
  
! 	* ada-mode.el (ada-add-ada-menu): Fix args to easy-menu-define.
  
! Mon May 22 15:40:21 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* files.el (file-ownership-preserved-p): Fix typo in previous change.
  
! 	* sendmail.el (mail-text): Expand abbrev before moving point.
  
! Sat May 20 00:29:11 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* mouse.el (mouse-save-then-kill): Fix previous change.
  
! 	* easymenu.el (easy-menu-do-define): Add autoload cookie.
  
! Fri May 19 14:56:10 1995  Kevin Rodgers <kevinr@ihs.com>
  
! 	* mailalias.el (expand-mail-aliases): Expand aliases in
! 	From and Reply-to headers as well, plus the Resent- variants.
  
! 	* sendmail.el (mail-mode): Clarify doc string.
! 	(mail-text): Ditto.
  
! Thu May 18 18:20:57 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* faces.el: Put property on set-face-stipple, not set-stipple.
! 	(face-fill-in): Handle stipple.
  
! Thu May 18 12:50:58 1995  Richard Stallman  <rms@waves>
  
! 	* bytecomp.el (byte-compile-dynamic-docstrings): Doc fix.
  
! 	* tar-mode.el (tar-mode): Set write-contents-hooks instead of
! 	local-write-file-hooks.
  
! 	* loadhist.el (unload-feature): When we come to (provide . FEATURE),
! 	remove FEATURE from the features list.
  
! Wed May 17 16:34:48 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* c-mode.el (c-fill-paragraph): Don't alter point
! 	when deciding to narrow at the end for the sake of a comment ender.
  
! 	* gnus.el (gnus-expunge): Use defalias.
  
! Wed May 17 15:33:47 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* buff-menu.el (Buffer-menu-buffer): Give more informative error
! 	message if user attempts a selection at end of buffer.
  
! 	* easymenu.el (easy-menu-create-keymaps): Set menu-enable prop.
  
! Tue May 16 17:57:50 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* lpr.el: Add provide call.
  
! Mon May 15 17:52:55 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* facemenu.el (facemenu-set-face-from-menu): Doc fix.
! 	(facemenu-set-background, facemenu-set-foreground): Doc fix.
! 	(facemenu-set-face): Doc fix.
  
! 	* files.el (file-ownership-preserved-p): Don't bomb if file
! 	doesn't exist.
  
! 	* add-log.el (get-method-definition): Fix regexps.
  
! 	* tq.el (tq-process-buffer): Don't hard-code the buffer name.
  
! Fri May 12 20:26:29 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* x-apollo.el: New file.
! 	* term/x-win.el (vendor-specific-keysyms): New function.
  
! Fri May 12 12:39:44 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* rlogin.el (rlogin-history): New defvar.
! 	(rlogin): Use rlogin-history as history var in read-from-minibuffer.
  
! 	* compile.el (compilation-next-error-locus): Ignore zero column number.
! 	(compilation-parse-errors): Don't store the beginning of the line
! 	containing the end of the error-regexp match.  Instead, store the
!  	beginning of the line containing the start of the match, unless
!  	the match starts with a newline, in which case the beginning of
!  	the next line.
  
! 	* vc-hooks.el (vc-status): If vc-locking-user returns a number,
!  	compare it to (user-uid).
  
! Thu May 11 22:16:55 1995  James Thompson  <thompson@wg2.waii.com>
  
! 	* ps-print.el: Miscellaneous fixes for better compatibility with
! 	XEmacs 19.12.
  
! 	* ps-print.el (ps-plot-with-face): Added code to handle Emacs
! 	19.29's new ability for the face attribute to hold a list of
! 	faces.
  
! 	* ps-print.el: Rolled in Chuck Thompson's changes to make color
! 	printing work in XEmacs 19.12.
  
! 	* ps-print.el: Fix error in comments.
  
! 	* ps-print.el (ps-generate-postscript-with-faces): Add fix to
! 	handle extents without faces.
  
! 	* ps-print.el (ps-faces-list): deleted.  Added alias for
! 	list-faces if face-list isn't fbound.
  
! 	* ps-print.el: (ps-print-ensure-fontified) added to make sure
! 	ps-print works correctly in conjunction with lazy-lock.
  
! 	* ps-print.el: RMS's changes for Emacs.
  
! Wed May 10 20:45:12 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* etags.el (tags-loop-continue): Doc fix.  Reset NEW after
!  	visiting for real, so we don't clobber the buffer again.
  
! 	* compile.el (compilation-error-regexp-alist): Add regexps for IBM
!  	and Cray compilers.
! 	(compilation-next-error-locus): Ignore a column number that is zero.
  
! Tue May  9 01:31:23 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* bytecomp.el (byte-compile-insert-header): Cope if user-mail-address
! 	is unbound.
  
! Tue May  9 14:30:19 1995  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
  
! 	* loaddefs.el: Remove duplicate autoloads.
  
! Tue May  9 00:05:37 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* info.el (Info-directory-list): Use installation-directory,
! 	not invocation-directory.  Cope if it is nil.
  
! 	* sendmail.el (mail-font-lock-keywords): Make mail-header-separator
! 	into a regexp.
  
! 	* rnewspost.el (news-reply-mode): Add ^ to paragraph delimiters.
  
! 	* supercite.el (sc-no-blank-line-or-header): Make mail-header-separator
! 	into a regexp.
  
! Mon May  8 11:22:05 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* lmenu.el (popup-dialog-box): x-popup-dialog returns the value,
! 	not the cons cell.
  
! 	* rnewspost.el (news-setup): Bind mail-signature to nil.
  
! 	* ediff.el (ediff-revision-key): Default value nil.
! 	(ediff-load-version-control): Don't remind any key if
! 	ediff-revision-key is nil.
  
! 	* info.el (info-insert-file-contents): Don't use
! 	(file-name-directory fullname) if it is nil.
  
! 	* helper.el (Helper-help): Use read-key-sequence.
  
! 	* mouse.el (mouse-save-then-kill): When making a new region
! 	and not adjusting an old one, always make new kill-ring entry
! 	and don't call mouse-show-mark.
  
! 	* add-log.el (add-log-current-defun): Handle objc-mode like c-mode;
! 	detect method definitions by their syntax.
  
! 	* menu-bar.el (menu-bar-tools-menu): Rename key to `compare'.
  
! Sun May  7 13:31:58 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* add-log.el (get-method-definition, get-method-definition-1):
! 	New functions.
! 	(add-log-current-defun): Use them to handle objc-mode.
  
! 	* pc-mode.el (pc-bindings-mode): Add bindings for C-backspace
! 	and M-backspace.  Make C-delete and M-delete operate on words.
! 	Add C-escape binding.
  
! 	* loaddefs.el (global-map): Add bindings for C-insert and S-insert.
! 	Also S-delete.  Also C-up, C-down, C-prior and C-next.
  
! 	* files.el (recover-session): Renamed from multiple-recover.
  
! 	* noutline.el: Provide noutline as well as outline.
  
! Sat May  6 23:09:50 1995  Geoff Voelker  <voelker@cs.washington.edu>
  
! 	* winnt.el (path-separator): Set to ";".
  
! 	* files.el (path-separator): Defined.
! 	(parse-colon-path): Use path-separator.
  
! Sat May  6 00:23:02 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* pp.el (pp-eval-expression): Update use of temp-buffer-show-function.
  
! 	* term/x-win.el (x-colors): Delete "medium goldenrod" in both forms.
! 	Delete "medium forest green" in both forms.
  
! 	* gnus.el (gnus-use-generic-from): Doc fix.
  
! Fri May  5 18:30:45 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* loaddefs.el: Delete autoloads for ispell4, noutline, noutline1.
! 	* noutline.el: All autoload cookies disabled.
! 	* ispell4.el: All autoload cookies disabled.
  
! 	* gnus.el (gnus-group-mode): Set truncate-lines.
  
! 	* edebug.el (\`): Add backslash.
! 	(edebug-\`): Add backslash.
  
! 	* info.el (info-insert-file-contents): Fix Apr 19 change.
  
! 	* sendmail.el (sendmail-send-it): Check continuation lines
! 	when checking for empty subject lines.
  
! Fri May  5 12:18:28 1995  Michael Ernst  <mernst@research.microsoft.com>
  
! 	* ispell.el (ispell-region): If position not visible, (sit-for 0).
  
! Thu May  4 16:09:02 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* trace.el: Don't try to define backquote.
! 	(trace-version): Deleted.
  
! 	* backquote.el ('\`): Use backslash for reading the backquote.
! 	(backquote-backquote-symbol): Likewise.
! 	(backquote): Doc fix.
  
! Wed May  3 02:10:43 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* cc-mode.el: Doc fixes.
! 	(c-version): Mention that this may be modified version.
  
! Tue May  2 19:25:28 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* scribe.el: (scribe-chapter): Change to C-c C-c.
! 	(scribe-section): Change to C-c C-t.
! 	(scribe-subsection): Change to C-c C-s.
! 	(scribe-insert-environment): Change to C-c C-v.
! 	(scribe-bracket-region-be): Change to C-c C-e.
! 	(scribe-italicize-word): Change to C-c C-i.
! 	(scribe-bold-word): Change to C-c C-b.
! 	(scribe-underline-word): Change to C-c C-u.
! 	* gomoku.el (gomoku-human-plays): Change to C-c C-p.
! 	(gomoku-human-takes-back): Change to C-c C-b.
! 	(gomoku-human-resigns): Change to C-c C-r.
! 	(gomoku-emacs-plays): Change to C-c C-e.
! 	* gnus-uu.el (gnus-uu-interactive-scan-directory): Change to C-c C-d.
! 	(gnus-uu-interactive-save-current-file): Change to C-c C-z.
! 	* allout.el (outline-rebullet-current-heading): Change to C-c *.
  
! Mon May  1 20:51:42 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* s-region.el (S-delete): Fix typo (was C-delete).
  
! 	* hideif.el (hide-ifdef-mode-prefix-key): Change to C-c @.
! 	(hide-ifdef-mode-submap): Get rid of \e from all bindings.
  
! 	* outline.el, noutline.el (outline-minor-mode-prefix): Change to C-c @.
  
! 	* texinfo.el (texinfo-mode-map): Delete C-c ] binding.
  
! 	* forms.el (forms--mode-commands): Delete C-c ? binding.
  
! 	* rnewspost.el (news-reply-mode-map): Delete C-c ? binding.
  
! 	* isearch.el (isearch-mode): Doc fix.
  
! 	* iso-acc.el (iso-accents-mode): Doc fix.
  
! Mon May  1 15:04:21 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* cc-mode.el (c-set-style): Ignore case in completion.
  
! Mon May  1 11:48:34 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* mailalias.el (expand-mail-aliases):
! 	Use buffer-substring-no-properties.
  
! 	* subr.el (buffer-substring-no-properties): New function.
  
! 	* makefile.el (makefile-mode): Set dabbrev-abbrev-skip-leading-regexp.
  
! 	* dabbrev.el (dabbrev-completion): Use mapcar, not mapc.
! 	Call dabbrev--reset-global-variables as the first thing.
  
! 	* files.el (set-auto-mode): If buffer has no file, use buffer name.
  
! Sun Apr 30 21:52:09 1995  Jay Adams  <jka@mustang.ece.cmu.edu>
! 
! 	* jka-compr.el (jka-compr-write-region): Handle the append
! 	argument correctly when the can-append flag is false.
! 	(jka-compr-write-region): Make temp-buffer name unique to this fn.
! 	(jka-compr-file-local-copy): Ditto.
! 
! Sun Apr 30 14:47:33 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* files.el (multiple-recover, multiple-recover-finish): New commands.
! 
! 	* startup.el (normal-top-level): Set auto-save-list-file-name.
! 
! Sat Apr 29 01:28:11 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* startup.el (command-line-1): Implement -L/--directory option.
! 
! 	* jka-compr.el (jka-compr-insert-file-contents): When visiting,
! 	bind buffer-file-name to nil temporarily.
! 
! 	* tex-mode.el (tex-view): Nice error if tex-dvi-view-command is nil.
! 
! Wed Apr 26 14:24:44 1995  Rob Riepel  <riepel@Snowflake.Stanford.edu>
! 
! 	* tpu-edt.el (tpu-copy-keyfile): New function.
!         (tpu-load-xkeys): Copy key definition file to new default name.
! 
! Wed Apr 26 17:42:37 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* vc.el (vc-next-action-on-file): Add missing let-binding.
! 
! Wed Apr 26 17:41:11 1995  Andre Spiegel  <spiegel@bruessel.informatik.uni-stuttgart.de>
! 
! 	* vc.el (vc-default-backend, vc-keep-workfiles, vc-consult-headers):
! 	(vc-mistrust-permissions, vc-path): Vars moved to vc-hooks.el.
! 	(vc-match-substring, vc-lock-file, vc-parse-buffer, vc-master-info):
! 	(vc-log-info, vc-consult-rcs-headers, vc-fetch-properties):
! 	(vc-backend-subdirectory-name, vc-locking-user, vc-true-locking-user):
! 	(vc-latest-version, vc-your-latest-version, vc-branch-version):
! 	(vc-workfile-version): Functions moved to vc-hooks.el.
! 	(vc-trunk-p, vc-minor-revision, vc-branch-part): Functions moved
! 	here from vc-hooks.el.
! 
! 	* vc-hooks.el (vc-default-backend, vc-path, vc-consult-headers):
! 	(vc-mistrust-permissions, vc-keep-workfiles): Customization
! 	variables, moved here from vc.el.
! 	(vc-trunk-p, vc-minor-revision, vc-branch-part): Moved to vc.el.
! 	(vc-backend): Renamed from vc-backend-deduce.  Callers changed.
! 	(vc-match-substring, vc-lock-file, vc-parse-buffer, vc-master-info):
! 	(vc-log-info, vc-consult-rcs-headers, vc-fetch-properties):
! 	(vc-backend-subdirectory-name, vc-locking-user, vc-true-locking-user):
! 	(vc-latest-version, vc-your-latest-version, vc-branch-version):
! 	(vc-workfile-version): Functions moved here from vc.el.
! 	(vc-log-info): Log program is no longer called through vc-do-command,
! 	to avoid including the lengthy vc-do-command here.  It is done
! 	directly through call-process now.  Removed obsolete parameter LAST.
! 	(vc-status): Replaced by the much simpler version that gets the
! 	information from the file properties.  Removed the obsolete
! 	parameter vc-type.
! 	(vc-parse-buffer): changed format of PATTERNS.  Each pattern is now a
! 	list of 2 to 3 elements, the first being the pattern, the remaining
! 	ones the numbers of subexpressions to refer to.
! 	(vc-cvs-status): New per-file property, only used in the CVS case.
! 	(vc-cvs-status): New function.
! 	(vc-log-info): Adapted to new version of vc-parse-buffer
! 	(vc-fetch-properties): Adapted to new version of vc-parse-buffer.
! 	Better search regexp for CVS latest version.
! 	(vc-log-info): Search for branch version only in the RCS case,
! 	since this doesn't make sense for SCCS or CVS.
! 	(vc-fetch-properties): CVS case: set vc-cvs-status.
! 	(vc-locking-user): CVS case: use vc-cvs-status to determine if
! 	the file is up-to-date, thus avoiding an expensive call to
! 	vc-workfile-unchanged-p.
! 	(vc-mode-line): Re-activated the code that makes the buffer read-only
! 	if the work file is unchanged.  But the status of the work file
! 	is now determined by looking at the already-computed mode string.
! 
! Wed Apr 26 05:18:11 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* startup.el (command-line): Handle -iconic and -icon-type here.
! 
! Tue Apr 25 17:49:45 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* abbrev.el (abbrev-mode): Use force-mode-line-update.
! 	* appt.el (appt-check): Likewise.
! 	* array.el (array-mode): Likewise.
! 	* bytecomp.el (byte-recompile-directory): Likewise.
! 	* delsel.el (delete-selection-mode): Likewise.
! 	* dired-x.el (dired-omit-expunge): Likewise.
! 	* dired.el (dired-sort-set-modeline): Likewise.
! 	* double.el (double-mode): Likewise.
! 	* edt.el (edt-advance, edt-backup): Likewise.
! 	* emerge.el (emerge-fast-mode, emerge-edit-mode): Likewise.
! 	(emerge-auto-advance, emerge-skip-prefers): Likewise.
!  	(emerge-refresh-mode-line): Likewise.
! 	* f90.el (f90-auto-fill-mode): Likewise.
! 	* files.el (toggle-read-only, rename-uniquely): Likewise.
! 	* find-dired.el (find-dired-sentinel): Likewise.
! 	* fortran.el (fortran-auto-fill-mode): Likewise.
! 	* gomoku.el (gomoku-display-statistics): Likewise.
! 	* gud.el (gud-sentinel): Likewise.
! 	* hanoi.el (hanoi): Likewise.
! 	* hideif.el (hide-ifdef-toggle-read-only): Likewise.
! 	(hide-ifdef-toggle-outside-read-only): Likewise.
! 	* info.el (Info-edit-mode, Info-cease-edit): Likewise.
! 	* isearch.el (isearch-mode, isearch-done): Likewise.
! 	* ispell.el (ispell-minor-mode): Likewise.
! 	* mh-comp.el (mh-insert-signature): Likewise.
! 	* mh-e.el (mh-set-scan-mode): Likewise.
! 	* mh-utils.el (mh-set-mode-name): Likewise.
! o	* noutline.el (outline-minor-mode): Likewise.
! 	* outline.el (outline-minor-mode): Likewise.
! 	* picture.el (picture-set-motion, picture-mode-exit): Likewise.
! 	* rmailedit.el (rmail-edit-current-message): Likewise.
! 	(rmail-cease-edit): Likewise.
! 	* simple.el (auto-fill-mode): Likewise.
! 	* supercite.el (sc-raw-mode-toggle): Likewise.
! 	* term.el (term-update-mode-line, term-process-pager): Likewise.
! 	(term-pager-continue): Likewise.
! 	* terminal.el (te-edit, te-more-break-unwind): Likewise.
! 	(te-update-pending-output-display): Likewise.
! 	* time.el (display-time-sentinel, display-time-filter): Likewise.
! 	* vi.el (vi-switch-mode, vi-back-to-old-mode): Likewise.
! 	(vi-mode, vi-goto-insert-state): Likewise.
! 	* vip.el (vip-change-mode): Likewise.
! 	* xscheme.el (xscheme-set-runlight, xscheme-set-prompt): Likewise.
! 
! Tue Apr 25 15:00:23 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* compile.el (compile-internal): Disable undo before erasing
! 	the buffer, then enable again afterward.
! 	(compilation-sentinel): Use force-mode-line-update.
! 
! 	* tpu-extras.el: Removed reference to tpu-gnu-emacs18-p.
! 
!         * tpu-mapper.el: Eval key definitions and clean up upon completion.
!         Persistent completion status message.
! 
! 	* loaddefs.el (esc-map): Define ESC ESC : like ESC :.
! 
! Tue Apr 25 09:34:58 1995  Johan Vromans  <jv@squirrel.NL.net>
! 
! 	* forms.el: (forms--make-format-elt-using-text-properties)
! 	forms--make-format): Add `intangible' text property to read-only areas.
! 	(forms-next-field, forms-previous-field): Use
! 	`inhibit-point-motion-hooks' to allow move between two
! 	intangible areas.
! 
! Tue Apr 25 03:52:28 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
! 
! 	* supercite.el (sc-string-text): New function to return raw text.
! 	(sc-mail-fetch-field, sc-mail-append-field): Use it.
! 	(sc-submatch): Make it a defalias for match-string.
! 	(sc-member): Make it a defalias for member.
! 
! Tue Apr 25 00:09:05 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* files.el (rename-uniquely): Don't discard <NN> from end
! 	if that is part of the visited file name.
! 
! 	* rmail.el (rmail-insert-inbox-text): Get the truename of
! 	the standard inbox name, not just of its directory.
! 
! Mon Apr 24 10:58:51 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* sendmail.el (mail-position-on-field): Use $, not \n, in regexp.
! 
! 	* tpu-edt.el (tpu-search-internal): Case-sensitive search if search
! 	string contains upper-case.
! 	tpu-check-search-case): New function.
! 
! 	* tpu-edt.el: Don't turn on tpu-edt mode.
! 	(tpu-gnu-emacs19-p): Function deleted.  Callers changed.
! 	(tpu-load-xkeys): Use file name .tpu-keys by default.
! 	(tpu-gnu-emacs18-p): Function deleted.
! 
! 	* tpu-mapper.el: At end, use default file name .tpu-keys.
! 	Do not kill Emacs.
! 	(tpu-emacs-map-key): Renamed from tpu-gnu-map-key.
! 
! 	* vc.el (vc-backend-checkout): Pass vc-checkout-switches arg
! 	properly to vc-do-command.
! 
! 	* isearch.el (isearch-update-ring): Use STRING arg, not isearch-ring.
! 
! 	* files.el (rename-uniquely): Strip suffix before rename.
! 
! Mon Apr 24 06:51:48 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
! 
! 	* font-lock.el (font-lock-keywords): Doc fix for MATCHER.
! 	(font-lock-maximum-size): Set based on font-lock-maximum-decoration.
! 	(font-lock-after-fontify-buffer-hook): Removed.
! 	(font-lock-after-fontify-buffer): New function.
! 	(font-lock-fontify-buffer): Use instead.  Don't bother if buffer empty.
! 	(font-lock-fontify-region): Use font-lock-syntax-table if set.
! 	(font-lock-unfontify-region): Only set-buffer-modified-p if necessary.
! 	(font-lock-after-change-function): Use it to unfontify.
! 	(font-lock-compile-keywords): New function to compile keywords.
! 	(font-lock-apply-highlight): New inline function to apply highlights.
! 	(font-lock-hack-keywords): Use them, if font-lock-keywords are not
! 	compiled, and to highlight.  Use funcall if MATCHER is not a regexp.
! 	(font-lock-mode): Doc fix for font-lock-maximum-decoration.  Use
! 	font-lock-set-defaults to call font-lock-make-faces.
! 	(tex-font-lock-keywords): Revamped.
! 
! 	* fortran.el (fortran-match-!-comment): New function.
! 	(fortran-font-lock-keywords-1, fortran-font-lock-keywords-2): Use it.
! 	(fortran-font-lock-keywords-3): New variable.
! 	(fortran-find-comment-start-skip): Clean code.
! 
! 	* add-log.el (change-log-font-lock-keywords):
! 	dired.el (dired-font-lock-keywords):
! 	sendmail.el (mail-font-lock-keywords):
! 	rmailsum.el (rmail-summary-font-lock-keywords):
! 	shell.el (shell-font-lock-keywords): Efficiency change.
  
! Mon Apr 24 00:20:29 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* easymenu.el (easy-menu-define): Doc fix.
  
! 	* iso-acc.el (iso-accents-list): Add ~! and ~? combinations.
  
! 	* byte-opt.el (byte-optimize-letX): Use car-safe and cdr-safe.
  
! Thu Apr 20 17:19:49 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* rmail.el (rmail-resend): Fix abbrev expansion.
  
! 	* rmailkwd.el (rmail-attributes): Recognize "resent" attribute.
  
! 	* mailabbrev.el (sendmail-pre-abbrev-expand-hook): When setting the
! 	dummy value for abbrev-start-location, use (point-max) rather than
! 	(point), so we won't delete a "-" that happens to be at point.
  
! Thu Apr 20 19:22:23 1995  Stephen Gildea  <gildea@x.org>
  
! 	* mh-mime.el, mh-comp.el: Update some MIME doc strings.
  
! 	* mh-comp.el (mh-auto-fill-for-letter): Use fill-prefix to do
! 	message headers.
  
! Thu Apr 20 13:22:00 1995  Torbj|rn Einarsson  <tfkte@fy.chalmers.se>
  
! 	* f90.el (f90-keywords): "only" added to keyword list.
! 	(f90-font-lock-keywords-1): Type may now have attributes private
! 	and public.
! 	(f90-font-lock-keywords-2): Fixed difference between type and type().
! 	(hilit-set-mode-patterns): Type may now have attributes private.
! 	and public, fixed difference between type and type().
! 	(f90-p-type-re): New regular-expression constant for type commands.
! 	(f90-mode): indent-tabs-mode put to nil by default.
! 	(f90-looking-at-type-like): Now uses f90-p-type-re.
! 	(f90-no-block-limit): Now uses f90-p-type-re.
! 	(f90-change-keywords): Don't change preprocessor lines.
  
! Thu Apr 20 11:39:25 1995  Kevin Rodgers <kevinr@ihs.com>
  
! 	* dired-x.el: Change the instructions in the INSTALLATION
! 	comment block to set buffer-local variables like
! 	dired-omit-files-p in dired-mode-hook.
! 	(dired-omit-files-p): Make local to all buffers.
! 	(dired-omit-files): Fix doc string (not buffer-local).
! 	(dired-omit-startup): Don't need to make dired-omit-files-p
! 	local to buffer here.
  
! Thu Apr 20 04:38:36 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* rmail.el (rmail-get-new-mail): Simply the reversion check;
! 	don't call rmail-forget-messages.
  
! Wed Apr 19 22:22:06 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* rmail.el (rmail-revert): Call rmail-mode after reverting
! 	to make sure rmail-message-vector is buffer-local.
  
! 	* undigest.el (undigestify-rmail-message): Strip "^- " which is
! 	added by some digest makers to the beginning of lines.
  
! Wed Apr 19 02:06:24 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* info.el (info-insert-file-contents): Set default-directory
! 	around call to shell-command-on-region.
  
! Wed Apr 19 10:39:00 1995  Mike Williams  <mikew@gopher.dosli.govt.nz>
  
! 	* mouse-sel.el: Downcase function parameters.
! 	Doc fixes.
  
! 	* mouse-sel.el Rewrite to support secondary selection.
! 	(mouse-sel-maintainer-address): New constant.
! 	(mouse-sel-submit-bug-report): New function.
! 	Rename mouse-sel-selection-type to mouse-sel-primary-thing.
! 	(mouse-sel-secondary-thing): New variable.
! 	(mouse-sel-selection-alist): New constant.
! 	(mouse-sel-set-selection-function): Semantics changed.  Value
! 	should now be a function taking two arguments.
! 	(mouse-sel-get-selection-function): Semantics changed.  Value
! 	should now be a function taking one argument.
! 	(mouse-sel-selection-owner-p-function): New variable.
! 	Removed variable mouse-sel-check-selection-function.
! 	Rename mouse-sel-determine-selection-type to
! 	mouse-sel-determine-selection-thing.
! 	(mouse-sel-set-selection): New function.
! 	(mouse-sel-get-selection): New function.
! 	(mouse-sel-selection-owner-p): New function.
! 	(mouse-sel-selection-overlay): New function.
! 	(mouse-sel-selection-thing): New function.
! 	(mouse-sel-region-to-primary): New function.
! 	(mouse-sel-primary-to-region): New function.
! 	(mouse-sel-eval-at-event-end): New macro.
! 	(mouse-sel-determine-selection-thing): Quad-click selects paragraphs.
! 	Removed variable mouse-sel-retain-highlight; use inverse of
! 	transient-mark-mode instead.
! 	(mouse-select-internal): New function.
! 	(mouse-select): Re-written using mouse-select-internal and
! 	mouse-sel-primary-to-region.
! 	(mouse-select-secondary): New function.
! 	(mouse-extend-internal): New function.
! 	(mouse-extend): Re-written using mouse-extend-internal,
! 	mouse-sel-region-to-primary and mouse-sel-primary-to-region.
! 	(mouse-extend-secondary): New function.
! 	(mouse-insert-selection-internal): New function.
! 	(mouse-insert-selection): Re-written using
! 	mouse-insert-selection-internal.
! 	(mouse-insert-secondary): New function.
! 	(mouse-sel-validate-selection): Check all selections in
! 	mouse-sel-selection-alist.
  
! Tue Apr 18 13:39:55 1995  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
  
! 	* info.el (Info-find-node, Info-restore-point, Info-search,
!  	Info-forward-node, Info-backward-node): Use string-equal, not equal,
! 	to compare node names.
  
! 	* cpp.el (cpp-edit-reset): Fix typo.
! 	(cpp-signal-read-only, cpp-grow-overlay): Update to new calling
! 	conventions.
! 	(cpp-make-overlay-hidden): Don't allow insertion before a
! 	read-only overlay.
  
! Tue Apr 18 20:05:20 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* cl-specs.el (pushnew): Use edebug-keywordp.
  
! 	* edebug.el (edebug-match-keywordp): Function deleted.
  
! 	* finder.el (finder-known-keywords): Add `debugging'.
  
! 	* vc-hooks.el (vc-buffer-backend): New function.
! 	Also new variable, local in all buffers.
! 	(vc-kill-buffer-hook): Kill local vc-buffer-backend.
! 	* vc.el (vc-update-change-log): Use vc-buffer-backend in menu-enable.
  
! Tue Apr 18 18:53:56 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* complete.el: Add Keywords: comment header for finder.el.
  
! Tue Apr 18 15:23:05 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* menu-bar.el: Disable many Files menu items in minibuffer.
! 	(menu-bar-search-menu): Add ... to many items.
! 	Add a query-replace-regexp item.
! 	(nonincremental-repeat-search-forward): Renamed from noninteractive...
! 	(nonincremental-repeat-search-backward): Likewise.
! 	(nonincremental-repeat-re-search-forward): Likewise.
! 	(nonincremental-repeat-re-search-backward): Likewise.
  
! 	* frame.el (frame-notice-user-settings):
! 	Don't respecify an old value which was nil and remains nil.
  
! Tue Apr 18 14:29:14 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* etags.el (tags-search, tags-query-replace): Put (quote ...)
!  	around args inserted into forms to be evalled.
  
! Tue Apr 18 03:00:44 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* cpp.el (cpp-edit-list): Move definition toward start of file.
! 	(cpp-face-type-list, cpp-writable-list, cpp-button-event)
! 	(cpp-edit-buffer, cpp-branch-list, cpp-face-default-list)
! 	(cpp-face-light-name-list, cpp-face-dark-name-list)
! 	(cpp-face-light-list, cpp-face-dark-list, cpp-face-mono-list)
! 	(cpp-face-none-list, cpp-face-all-list, cpp-overlay-list): Likewise.
  
! 	* cpp.el (cpp-highlight-buffer): Rename stack to cpp-state-stack.
! 	(cpp-parse-open, cpp-parse-close): Likewise.
! 	(cpp-push-button, cpp-choose-symbol): Rename data to cpp-callback-data.
! 	(cpp-state-stack, cpp-callback-data): Add defvars.
  
! 	* simple.el (line-move): Fix previous change: if we get an error,
! 	move to where the error happened, don't go back to starting point.
  
! Mon Apr 17 23:37:58 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* forms.el: Major rewrite to use `intangible' property.
  
! Mon Apr 17 14:51:54 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* map-ynp.el (map-y-or-n-p): Don't log prompt messages.
  
! Mon Apr 17 14:42:13 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* finder.el (finder-known-keywords): Generalize `c' keyword.
  
! Sun Apr 16 23:01:43 1995  Ethan Bradford  <ethanb@phys.washington.edu>
  
! 	* ispell.el (ispell-init-ispell): Don't barf if there is a
! 	warning message	before the version line when Ispell starts up.
  
! Sun Apr 16 00:01:10 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* font-lock.el (font-lock-make-faces): Determine
! 	font-lock-background-mode from color values of background color.
  
! 	* facemenu.el (list-colors-display): Minor clarification.
! 	(facemenu-special-menu): Add "Intangible" item.
! 	(facemenu-color-equal): Doc fix.
  
! 	* faces.el (set-face-background): Handle FRAME = nil directly
! 	so stipple colors work in that case.
  
! 	* term/x-win.el (x-defined-colors): Take frame as optional arg.
! 	Check whether colors are really supported on the display in use.
  
! Sat Apr 15 01:40:12 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* files.el (set-auto-mode): If -*- spec doesn't set `mode:',
! 	look for other ways of specifying major mode.
  
! 	* talk.el: New file.
  
! 	* dired.el (dired-mode-map): Rename commands for A and Q.
  
! 	* dired-aux.el (dired-do-search): Renamed from dired-do-tags-search.
! 	(dired-do-query-replace): Renamed from dired-do-tags-query-replace.
  
! Fri Apr 14 19:15:47 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* cpp.el (cpp-parse-open): Delete comments that go past end of line.
! 	(cpp-edit-reset): Clean up the four standard buttons.
! 	(cpp-parse-buffer): Name was undefined--use cpp-highlight-buffer.
  
! 	* finder.el (finder-known-keywords):
! 	Add frames, hypermedia, outlines, oop.
  
! Fri Apr 14 21:03:27 1995  Erik Naggum  <erik@naggum.no>
  
! 	* rmail.el (rmail-reformat-message): Call `rmail-clear-headers'
!  	also if `rmail-displayed-headers' is set.
! 	(rmail-clear-headers): Handle `rmail-displayed-headers' correctly.
  
! Fri Apr 14 18:01:38 1995  Erik Naggum  <erik@naggum.no>
  
! 	* rmail.el (rmail-insert-inbox-text): When reading old
! 	.newmail-<user> file, report it specifically.
  
! Fri Apr 14 13:15:37 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* mouse.el: Create mouse-drag-overlay as a dead overlay, instead
! 	of having it live in the *scratch* buffer until first used.
  
! 	* edt-vt100.el (edt-vt100-revision): Deleted.
! 	* edt-pc.el (edt-pc-revision): Deleted.
! 	* edt-mapper.el (edt-mapper-revision): Deleted.
! 	* edt-lk201.el (edt-lk201-revision): Deleted.
! 	* edt.el: Many doc fixes.
! 	(edt-version): Deleted.
  
! Fri Apr 14 12:05:38 1995  Morten Welinder  <terra+@cs.cmu.edu>
  
! 	* tar-mode.el (tar-mode): Locally bind next-line-add-newlines to nil.
! 	(tar-subfile-mode): Doc fix.
! 	(tar-expunge): Make questions and messages start with uppercase letter.
! 	(tar-summarize-buffer): Ditto.
! 	(tar-subfile-save-buffer): Make message like others.
! 	(tar-mode): Locally bind local-write-file-hooks.
! 	(tar-mode-write-file): Renamed from tar-mode-maybe-write-tar-file.
! 	(tar-mode-write-file): Simplify to only work for tar file buffers.
! 	(write-file-hooks): Don't modify this.
  
! Fri Apr 14 01:53:54 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* derived.el (derived-mode-merge-keymaps): Recursively merge
! 	prefix key submaps also.
  
! Thu Apr 13 18:14:58 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* edebug.el (edebug-gensym): Renamed from gensym.
! 	Don't use concat on an integer.  Define unconditionally.
! 	(edebug-gensym-index): Renamed from *gensym-index*.
! 	(edebug-lambda-list-keywordp): Renamed from lambda-list-keywordp.
! 	(edebug-keywordp): Renamed from keywordp.  Define unconditionally.
  
! 	* vc-hooks.el (vc-kill-buffer-hook):
! 	Don't put it on kill-buffer-hook.
! 	(vc-file-clearprops): Function moved here.
! 	(vc-workfile-version): Function moved here.
! 	(vc-mode-line): Don't call vc-locking-user.
  
! 	* vc.el (vc-file-clearprops, vc-workfile-version):
! 	Functions moved to vc-hooks.el.
  
! 	* edebug.el (edebug-emacs-19-specific): Use name edebug-menu
! 	for the easy-menu-define call.
  
! 	* font-lock.el (font-lock-make-faces-done): New variable.
! 	(font-lock-make-faces): Set font-lock-make-faces-done to t.
! 	Don't call it when loading the file.
! 	(font-lock-mode): Call font-lock-make-faces if not yet done.
  
! 	* bytecomp.el (byte-compile-log-file): Always insert at eob.
! 	(byte-compile-insert-header): Cope if user-mail-address is nil.
  
! Thu Apr 13 18:00:00 1995  Andre Spiegel  <spiegel@bruessel.informatik.uni-stuttgart.de>
  
! 	* vc-hooks.el: Add branch support for RCS;
! 	treat CVS more like RCS and SCCS.
!         (vc-occurences, vc-trunk-p, vc-branch-p, vc-minor-revision)
!         (vc-branch-part): new functions that operate on RCS revision numbers.
!         (vc-status): Use the new property vc-workfile-version
! 	and vc-locking-user (see vc.el).  Display "locking state" for CVS.
!         (vc-find-cvs-master): Search for file name case-sensitively, store
! 	version number into the new property vc-workfile-version.
! 	(vc-find-file-hook): kill any remaining properties.  Like this,
! 	when re-finding a file (for example because it has changed on disk),
! 	the version control state gets re-computed.
! 	(vc-mode-line): CVS case: make the buffer read-only if the file
! 	is unmodified.
!         (vc-kill-buffer-hook): Clear file's vc props when buffer is killed.
  
!         * vc.el: Add branch support for RCS; treat CVS more like RCS and SCCS.
! 	(vc-next-action-on-file): changed CVS handling, such that C-x C-q
! 	works as with RCS and SCCS.
! 	(vc-consult-rcs-headers): New function.
!         (vc-branch-version): New per-file property, refers
! 	to the RCS version selected by `rcs -b'.
! 	(vc-workfile-version): New function.  Also new per-file property
! 	(vc-consult-headers): New parameter variable.
! 	(vc-mistrust-permissions): Default set to `nil'.
!         (vc-locking-user): Property is now cached.  The other functions
! 	update it as necessary.  Attempts to use RCS headers if enabled.
!         (vc-log-info, vc-parse-buffer): Various bug fixes.  Added support
! 	for property `vc-branch-version'.
! 	(vc-backend-checkout): RCS case: if no explicit version
! 	is specified, check out `vc-workfile-version'.  After check-out,
! 	set `vc-workfile-version' according to the version number
! 	reported by "co".
! 	(vc-backend-checkin): RCS case: remove any remaining locks
! 	if a new branch was created.  After every check-in, adjust
! 	the current branch using `rcs -b' (this cannot be avoided).
! 	CVS case: allow for explicit checkin, but only on the trunk.
! 	(vc-next-action-on-file, vc-backend-checkout, vc-backend-checkin,
! 	vc-backend-revert, vc-backend-diff): Explicitly use
! 	vc-workfile-version as the default version to operate on.
  
! Thu Apr 13 01:43:13 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* help.el (print-help-return-message): Check same-window-buffer-names
! 	and same-window-regexps.
  
! 	* help-macro.el (make-help-screen): Explicitly translate
! 	key thru function-key-map.
  
! 	* tabify.el (tabify): Include entire first line in narrowing.
  
! 	* sendmail.el (mail-do-fcc): Use just find-buffer-visiting
! 	to find buffer to append to.
  
! Wed Apr 12 03:05:23 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* select.el (x-set-selection): Fix up interactive defaults.
  
! 	* fill.el (fill-paragraph, fill-region, fill-nonuniform-paragraphs)
! 	(fill-individual-paragraphs): Pass `full' for JUSTIFY arg,
! 	in the interactive spec, if have prefix arg.
  
! Tue Apr 11 10:20:51 1995  Stephen Gildea  <gildea@x.org>
  
! 	* time-stamp.el (time-stamp-format): Replace list of Lisp
! 	functions with string containing %-escapes, as in `date' program.
! 	(time-stamp): Widen buffer while time-stamping.
! 	(time-stamp-toggle-active): New function.
! 	(time-stamp-warn-inactive): New variable.
  
! Tue Apr 11 23:15:40 1995  Geoff Voelker  <voelker@cs.washington.edu>
  
!         * loadup.el [WINDOWSNT]: Find doc strings.
  
! 	* files.el (set-auto-mode) [WINDOWSNT]: Match insensitive to case.
  
! 	* dired-aux.el (dired-do-chmod): Use dired-chmod-program.
! 	(dired-do-chgrp, dired-do-chown) [DOS_NT]: Disabled.
  
! 	* dired.el (dired-chmod-program): Defined.
  
! 	* makefile.nt (all): Use DEL_TREE instead of delnode.
  
! 	* winnt.el: Key [C-M-backspace] defined.
! 	(mode-line-format): Defined.
  
! Tue Apr 11 19:00:36 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* mail-hist.el (mail-hist-put-headers-into-history):
! 	Add save-excursion around entire function.
  
! Tue Apr 11 11:46:38 1995  Boris Goldowsky  <boris@cs.rochester.edu>
  
! 	* facemenu.el (facemenu-read-color): Don't ignore PROMPT arg.
! 	Make arg optional.
! 	(facemenu-unlisted-faces): Add font-lock faces to default value.
  
! Tue Apr 11 09:17:49 1995  enami tsugutomo  <enami@sys.ptg.sony.co.jp>
  
! 	* perl-mode.el (perl-comment-indent): Make extra space only when
! 	not at beginning of line.
  
! Mon Apr 10 08:30:04 1995  Stefan Schoef  <schoef@Informatik.Uni-Oldenburg.DE>
  
!         * bibtex.el (bibtex-find-text, bibtex-remove-double-quotes-or-braces):
! 	Support both kind of delimiters (braces or quotes) regardless of the
! 	value of bibtex-field-left-delimiter and bibtex-field-right-delimiter.
!         (bibtex-field-left-delimiter, bibtex-field-right-delimiter):
! 	Made buffer-local.
  
!         * bibtex.el (bibtex-beginning-of-entry): At the beginning of an
!  	entry, leave point at the beginning of that entry instead of
!  	moving to the beginning of the previous one.
!         (bibtex-end-of-entry): Outside an entry, now move to the end of
!  	the *previous* entry (i.e. bibtex-beginning-of-entry and
!  	bibtex-end-of-entry are now idempotent).
!         (bibtex-sort-entries, bibtex-clean-entry): Removed now obsolete
!         calls of bibtex-beginning-of-entry just before calls to
!         bibtex-end-of-entry.
!         (bibtex-clean-entry): Minor change to adapt to new behavior of
!         bibtex-beginning-of-entry.
  
! Mon Apr 10 19:21:41 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* reporter.el (reporter-mailer): Replace mail with reporter-mail.
! 	(reporter-mail): New function.
! 	(reporter-submit-bug-report): Don't check return value of
! 	the reporter-mailer function.
  
! Mon Apr 10 15:50:39 1995  Boris Goldowsky  <boris@cs.rochester.edu>
  
- 	* simple.el (newline): Don't auto-fill if flag is on; it was
- 	filling wrong line.
  
! Mon Apr 10 12:45:56 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* compile.el (compilation-error-regexp-alist): Remove superfluous
!  	SGI cc regexp.
  
! Mon Apr 10 09:26:08 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
  
! 	* version.el (emacs-major-version, emacs-minor-version): Use
!         match-string rather than substring.
  
! Mon Apr 10 03:09:18 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* pc-mode.el (pc-bindings-mode): New file.
  
! 	* loaddefs.el (global-map): Bind C-M-backspace like C-M-delete.
  
! Sun Apr  9 20:02:47 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* files.el (write-file): Default is ask for confirmation
! 	only interactively.
  
! Sun Apr  9 18:28:45 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* mh-e.el, mh-seq.el, mh-pick.el, mh-mime.el: New version from author.
! 	* mh-comp.el, mh-utils.el, mh-funcs.el: New version from author.
  
! Sun Apr  9 14:57:14 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* server.el (server-switch-buffer): Make first arg optional too;
!  	server-edit might pass no args, since server-done might return nil.
  
! Sun Apr  9 01:31:30 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* simple.el (line-move): Turn off intangibility for intermediate stops.
  
! 	* menu-bar.el (menu-bar-update-buffers): Reuse the entry for
! 	list-buffers rather than making a new one each time.
  
! 	* simple.el (newline): Don't indent afterward if at page sep line.
! 	Delete whitespace on blank line before the inserted newlines.
! 	(open-line): Add all the left margins and fill prefixes
! 	after inserting all the newlines.
  
! 	* bytecomp.el (byte-compile-log-file): New function.
! 	(displaying-byte-compile-warnings): Log the file name at start;
! 	display the log buffer only if something more gets output by BODY.
! 	(byte-compile-warnings-point-max): Initialize to nil.
  
! Sun Apr  9 07:29:26 1995  G Dinesh Dutt  (brat@htilbom.ernet.in)
  
! 	* etags.el (list-tags): Delete call to select-tags-matched-file.
  
! Sat Apr  8 23:51:05 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
  
! 	* term/x-win.el (mode-line-buffer-identification):
! 	Fix prev change; use setq-default.
  
! Sat Apr  8 23:18:33 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* etags.el (next-file): Handle empty list returned by
!  	(tags-table-files).
  
! Sat Apr  8 18:37:04 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* replace.el (occur): Provide 5 cols for line number.
  
! 	* ange-ftp.el (ange-ftp-parse-netrc): Bind `default-directory' to
! 	"/" to avoid infinite loop while expanding filename.
! 	(ange-ftp-message): Don't truncate message in batch mode.
  
! 	* simple.el (completion-setup-function): Undo March 11 change.
! 	Add some doc strings to completion-related variables.
  
! Sat Apr  8 16:15:37 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* compile.el (compilation-error-regexp-alist): Extend Ultrix 3.0
!  	f77 regexp to also match SGI cc.
  
! Sat Apr  8 15:59:11 1995  Morten Welinder  <terra+@cs.cmu.edu>
  
! 	* comint.el (make-comint): Error, if start-process is not fboundp.
  
! 	* menu-bar.el (menu-bar-edit-menu): Don't define ispell item
! 	unless start-process is fboundp.
  
! Sat Apr  8 15:41:37 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* rnewspost.el (news-reply-mode):
! 	Make mail-header-separator into regexp.
  
! 	* sendmail.el (mail-mode): Convert mail-header-separator to regexp
! 	for use in paragraph-start, etc.
  
! 	* ispell.el (ispell-message): Make mail-header-separator into regexp
! 	and add $ at end.
  
! 	* window.el (walk-windows): Doc fix.
  
! Sat Apr  8 03:31:49 1995  Noah Friedman  <friedman@prep.ai.mit.edu>
  
!         * rsz-mini.el (resize-minibuffer-window): Make sure minibuffer
!         window is selected.
!         (resize-minibuffer-window-restore): Likewise.
  
! Sat Apr  8 01:00:37 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* fill.el (fill-region-as-paragraph): Undo previous change.
! 	Instead, set JUSTIFY to `full' in the interactive spec.
  
! 	* startup.el (normal-top-level): Copy default-directory
! 	from *scratch* to *Messages*.
  
! 	* menu-bar.el (menu-bar-file-menu): Add back as alias for
! 	menu-bar-files-menu.
  
! Fri Apr  7 22:49:34 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* loaddefs.el (mode-line-buffer-identification): Use %F by default.
! 	([C-delete]): Bind C-delete normally, not in function-key-map.
  
! 	* term/x-win.el (mode-line-buffer-identification): Eliminate %F.
  
! Fri Apr  7 17:22:41 1995  Noah Friedman  <friedman@prep.ai.mit.edu>
  
!         * rlogin.el (rlogin): Use format, not concat, to generate numeric
!         buffer names.
!         Do not create a new buffer if process in existing buffer has exited.
!         (rlogin-directory-tracking-mode): Set shell-dirtrackp, not
!         shell-dirtrack-p.
  
! Fri Apr  7 17:27:59 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* ebuff-menu.el (electric-buffer-menu-mode-map): Undefine ESC ESC
! 	before binding ESC ESC ESC.
  
! 	* edt.el (edt-keep-current-page-delimiter): Doc fix.
  
! 	* find-file.el: Many doc fixes.
! 	(ff-upcase-p): Renamed from upcase-p.  Callers changed.
! 	(ff-emacs-19): Renamed from ff-gnu-emacs-19.
! 	(ff-string-match): Simplify.
  
! 	* docref.el (docref-last-active-buffer): Add defvar.
  
! Fri Apr  7 14:32:56 1995  Boris Goldowsky  <boris@cs.rochester.edu>
  
! 	* indent.el (set-right-margin): Fix prompt.
! 	* fill.el (fill-region): Avoid error on reaching end of buffer.
  
! 	* avoid.el: Add autoload cookies; doc fixes.
! 	(mouse-avoidance-set-pointer-shape): New function.
! 	(mouse-avoidance-nudge-mouse): Use it.
! 	(mouse-avoidance-fancy-hook): streamline args to set-mouse-pos.
  
! Fri Apr  7 02:02:10 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* msb.el (msb--toggle-menu-type): menu-bar-update-buffers wants 0 args.
  
! 	* bytecomp.el (byte-compile-output-docform): Output doc string position
! 	as negative number, if doc string starts with *.
  
! 	* mail-hist.el: Use $ at end when searching for mail-header-separator.
  
! 	* fill.el (fill-region-as-paragraph): If JUSTIFY is non-nil,
! 	pass t to justify-current-line.
  
! Thu Apr  6 13:57:13 1995  Morten Welinder  <terra+@cs.cmu.edu>
  
! 	* desktop.el (desktop-save): Use dired-directory as name
! 	of top-level in order to capture wildcards used.
! 	(desktop-buffer-dired): Skip possible wildcard when checking
! 	for directory existance.  Use dired-insert-subdir, not
! 	dired-maybe-insert-subdir.
  
! Thu Apr  6 15:24:30 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* files.el (write-file): Fix arg count in call to y-or-n-p.
  
! Thu Apr  6 01:20:46 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* ispell.el (ispell-menu-map-needed): Delete test for menu-bar feature.
  
! 	* bookmark.el (menu-bar-bookmark-map): Autoload each form
! 	used to set up this variable's value, so that the whole job
! 	is done in loaddefs.el.
! 	(bookmark-menu-locate, bookmark-menu-jump, bookmark-menu-insert)
! 	(bookmark-menu-delete, bookmark-menu-rename): Add autoloads.
  
! 	* buff-menu.el (list-buffers-noselect): Put buffer name in a text
! 	property on the buffer's name.  Put in mouse-face prop here too.
! 	Set Buffer-menu-buffer-column here.
! 	(Buffer-menu-mode): Don't do those things here.
! 	(Buffer-menu-buffer): Use text properties.
! 	(Buffer-menu-buffer-name-position): Function deleted.
  
! 	* tar-mode.el (tar-clear-modification-flags): Fix several bugs.
  
! Wed Apr  5 22:11:13 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* tar-mode.el (tar-mode-map): Fix typo for tar-display-other-file.
  
! Wed Apr  5 15:30:52 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* tempo.el (tempo-build-collection): Clear flag after computing
! 	return value.
  
! Tue Apr  4 18:47:58 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* ispell.el (ispell-personal-dictionary): Add autoload.
  
! 	* simple.el: Change bindings of event-apply-control-modifier,
! 	event-apply-meta-modifier, event-apply-hyper-modifier,
! 	event-apply-shift-modifier, event-apply-alt-modifier, and
! 	event-apply-super-modifier, in function-key-map, to use C-x @
! 	instead of C-x ESC.  Using escape causes problems since that's
! 	in function-key-map itself.
  
! 	* byte-opt.el (byte-compile-inline-expand): Fetch actual bytecode
! 	before inlining a lazy function.
  
! 	* tempo.el (tempo-dolist): Don't use `cadr'.
  
! 	* simple.el (event-apply-modifier): Fix off-by-one errors.
  
! Mon Apr  3 18:00:06 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* jka-compr.el (jka-compr-install): Doc fix.
! 	(jka-compr-uninstall): Delete entries that jka-compr-install
! 	added to inhibit-first-line-modes-suffixes.
  
! Mon Apr  3 18:15:11 1995  David K}gedal  <davidk@lysator.liu.se>
  
! 	* tempo.el (tempo-insert):
! 	Added the P tag and modified the s tag accordingly
! 	(tempo-insert-named): Checks for valid name, insert mark otherwise.
  
! 	* tempo.el (tempo-dolist): Changed (cadr ...) to (car (cdr ...))
  
! 	* tempo.el (tempo-expand-if-complete): New function
  
! Mon Apr  3 17:36:50 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* files.el (set-auto-mode): Fix previous change.
  
! Mon Apr  3 08:11:19 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
  
! 	* comint.el (comint-file-name-quote-list): New variable of special
! 	characters that are quoted when in file names (default nil).
! 	(comint-mode): Make it buffer local.
! 	(comint-quote-filename): Quote them if they are in the file name.
! 	(comint-dynamic-complete-as-filename,
! 	comint-dynamic-list-filename-completions): Call it before insertion.
! 	(comint-unquote-filename): Unquote any character in the file name.
! 	(comint-match-partial-filename): Call it before substitution.
! 	(comint-word): Include any quoted character as part of the word.
! 	(comint-completion-addsuffix): Value can be a cons pair of strings.
! 	(comint-dynamic-complete-as-filename,
! 	comint-dynamic-simple-complete): Use it when inserting suffixes.
  
! 	* shell.el (shell-file-name-quote-list): New variable of special
! 	characters that are quoted when present in file names.
! 	(shell-mode): Set comint-file-name-quote-list with it.
  
! Sun Apr  2 00:40:15 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* netunam.el: File deleted.
  
! 	* menu-bar.el (menu-bar-edit-menu): Capitalize an item name.
! 	(menu-bar-tools-menu): Add verb to Calendar item.
! 	(menu-bar-help-menu): Rename Info to Browse Manuals.
  
! 	* sendmail.el (mail-mode-map): Longer title for headers submenu.
  
! Sat Apr  1 00:14:46 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* fill.el (fill-region-as-paragraph): Remove fill-prefix first,
!  	then remove indentation.
  
! 	* files.el (inhibit-first-line-modes-suffixes): New variable.
! 	(set-auto-mode): Use it.
! 	(inhibit-first-line-modes-regexps): Use \\', not $.
  
! 	* jka-compr.el (jka-compr-install): Add items to
! 	inhibit-first-line-modes-suffixes.
  
! 	* reporter.el (reporter-submit-bug-report): Give up if mailer
! 	command returns nil.  Fix error message syntax.
! 	(reporter-bug-hook): Fix error message syntax.
  
! Fri Mar 31 17:05:15 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* unrmail.el (unrmail): Don't make or switch to a summary buffer.
  
! 	* rmail.el (rmail-displayed-headers): New variable.
! 	(rmail-clear-headers): Handle rmail-displayed-headers
  
! Fri Mar 31 10:11:15 1995  Michael Ernst  <mernst@research.microsoft.com>
  
! 	* scheme.el (scheme-indent-sexp): Don't fail when
! 	calculate-scheme-indent returns a one-element list.
  
! 	* rmailsum.el (rmail-summary-toggle-header): Make header visible
! 	in message buffer.
  
! Fri Mar 31 13:52:21 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* macros.el (insert-kbd-macro): Do something reasonable for vectors.
  
! Thu Mar 30 20:46:55 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
  
! 	* simple.el (choose-completion-string): Use active-minibuffer-window.
  
! 	* dired-aux.el (dired-add-entry): If ange-ftp inserted the file's
! 	absolute name, fix that.
  
! Thu Mar 30 18:37:43 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* comint.el (comint-read-noecho): Don't log prompt messages.
  
! Thu Mar 30 02:14:32 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* apropos.el (apropos): Use apropos-worthy-symbol-p
! 	as default predicate.
! 	(apropos-worthy-symbol-p): New function.
  
! 	* faces.el (modify-face): Handle stipple.  Handle defaulting properly.
! 	Speed up making completion alists.
! 	(modify-face-read-string): New subroutine.
  
! Thu Mar 30 01:59:12 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
  
! 	* dired.el (dired-insert-directory): Wrap filename character
!         quoting code with save-excursion.
  
! Wed Mar 29 02:14:12 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
  
! 	* window.el (minibuffer-window-active-p): Use active-minibuffer-window.
  
! Tue Mar 28 17:24:35 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* comint.el (comint-read-noecho): Use a format string, in case
! 	PROMPT contains a percent sign.
  
! Tue Mar 28 11:54:57 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* nntp.el (nntp-request-article): If ID is integer, convert to string.
  
! Mon Mar 27 17:14:03 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* simple.el (event-apply-modifier): New function.
! 	(event-apply-control-modifier, event-apply-meta-modifier)
! 	(event-apply-hyper-modifier, event-apply-shift-modifier)
! 	(event-apply-alt-modifier, event-apply-super-modifier):
! 	New functions, with bindings in function-key-map.
  
! 	* files.el (insert-directory): Use \ before insert-directory-program
! 	to ignore shell aliasing.
  
! Mon Mar 27 10:26:49 1995  Boris Goldowsky  <boris@cs.rochester.edu>
  
! 	* enriched.el (enriched-mode): Use new plist-put and plist-get
! 	functions, and change name of default-text-properties var.
  
! Mon Mar 27 02:49:02 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* cplus-md.el (calculate-c++-indent): Copy colon-line-end code
! 	from calculate-c-indent.
  
! Sat Mar 25 14:09:29 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* scroll-bar.el (scroll-bar-drag): Bind echo-keystrokes to 0.
  
! Fri Mar 24 22:04:30 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* rmail.el (rmail-display-labels): Use `format' to convert
! 	message numbers to strings.
  
! Fri Mar 24 18:41:20 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* bytecomp.el (byte-compile-out-toplevel): Compile lambda forms
! 	even if trivial.
  
! Fri Mar 24 04:01:31 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
  
! 	* subr.el (match-string): Change to defun, but still return nil if
!         no match.
  
! Thu Mar 23 16:41:30 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* c-mode.el (c-style-alist): Set c-continued-brace-offset and
! 	c-brace-offset in all styles, so that they don't inherit a trash
! 	value from a previously set style.
  
! 	* compile.el (compilation-sentinel): Use `format'; `concat' doesn't
! 	stringize integers anymore.
  
! 	* loadup.el: Don't load mouse and face files in system-specific
! 	branches; an earlier test has already loaded them based on a
! 	symbol equivalent to HAVE_MOUSE or HAVE_FACES.
  
! Thu Mar 23 15:41:00 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* asm-mode.el (asm-mode): Make a per-buffer child keymap here.
! 	Use asm-comment-char to specify which character to define.
! 	(asm-mode-map): Don't bind `;' at load time.
  
! 	* pascal.el (pascal-mode-version): Variable deleted.
  
! Thu Mar 23 17:16:44 1995  Espen Skoglund  <espensk@tklab4.cs.uit.no>
  
! 	* pascal.el (pascal-mode-syntax-table): Give \ punctuation syntax.
  
! Thu Mar 23 03:36:15 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
  
! 	* subr.el (match-string): New macro.  Unlike the function version,
!         returns nil if no match.
  
! Wed Mar 22 16:30:58 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* asm-mode.el: Doc fixes.
  
! Wed Mar 22 15:38:18 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* mlsupport.el (ml-concat): New function.
! 	* mlconvert.el: Translate concat to ml-concat.
  
! Wed Mar 22 11:57:15 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* window.el (one-window-p, walk-windows, minibuffer-window-active-p):
! 	Functions moved here.
! 	* subr.el (one-window-p, walk-windows, minibuffer-window-active-p):
! 	Functions moved to window.el.
  
! Tue Mar 21 16:39:39 1995  Boris Goldowsky  <boris@cs.rochester.edu>
  
! 	* facemenu.el: Added autoload cookies, small doc fixes.
! 	(list-text-properties-at): New fn.
! 	(facemenu-menu): Add it to menu.
! 	* menu-bar.el (menu-bar-edit-menu): Add Text Properties item.
  
! Tue Mar 21 00:14:14 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* startup.el (init-file-user, site-run-file): Doc fixes.
  
! 	* vc.el (vc-update-change-log): Use new -u option for rcs2log.
! 
! 	* replace.el (occur): Copy default-directory to *Occur* buffer.
! 
! 	* simple.el (shell-command): Use *Async Shell Command* for
! 	asynchronous commands.  Doc fix.
! 
! Mon Mar 20 21:18:56 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* tar-mode.el (tar-parse-octal-long-integer): Return list, not vector.
! 
! Mon Mar 20 14:42:09 1995  Karl Fogel  <kfogel@floss.cyclic.com>
! 
! 	* bookmark.el (bookmark-automatically-show-annotations): new var.
! 	(bookmark-jump): only show annotation if above var is non-nil.
! 
! Mon Mar 20 00:09:06 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* debug.el (debug): Now interactive.
! 
! Sun Mar 19 15:09:34 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* c-mode.el (c-mode-map): Use "C-mode", not "C mode".
! 
! 	* menu-bar.el (menu-bar-files-menu): Renamed from ...-file-menu.
! 	(menu-bar-tools-menu, menu-bar-search-menu): New menu bar menus.
! 	Items moved from Edit and Files menus.
! 	Add Split Window, One Window, Find Tag and Postscript print menu items.
! 	(nonincremental-search-forward, nonincremental-search-backward)
! 	(nonincremental-re-search-forward, nonincremental-re-search-backward)
! 	(noninteractive-repeat-search-forward)
! 	(noninteractive-repeat-search-backward)
! 	(noninteractive-repeat-re-search-forward)
! 	(noninteractive-repeat-re-search-backward): New commands.
! 
! 	* isearch.el (isearch-update-ring): New subroutine.
! 	(isearch-done): Use that.
! 
! Sat Mar 18 02:01:07 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* info.el (Info-next-preorder, Info-next-preorder-1):
! 	When moving up, advance to next menu item.
! 
! 	* sendmail.el (mail): Use pop-to-buffer.
! 	(same-window-buffer-names): Add *mail*.
! 	(mail-other-window, mail-other-frame): Bind to nil
! 	same-window-buffer-names, special-display-buffer-names, and ...regexps.
! 
! 	* files.el (write-file): Query if file exists already.
! 
! 	* isearch.el (isearch-abort): Treat "incomplete regexp"
! 	as failure when deciding how much to discard for C-g.
! 
! 	* rmail.el (rmail-resend): If mailabbrev loaded, use that to
! 	expand abbrevs.
! 
! 	* mailabbrev.el: Various doc fixes.
! 	(mail-abbrevs-setup): Use add-hook and make-local-hook.
! 
! Fri Mar 17 20:36:44 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* debug.el (debugger-outer-load-read-function): New variable.
! 	(debug): Bind load-read-function to nil; save old value
! 	in debugger-outer-load-read-function and restore at end.
! 	(debugger-eval-expression): Handle load-read-function
! 	like other magic variables.
! 
! Fri Mar 17 18:00:14 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* ediff.el: Delete some autoloads that are now in menu-bar.el.
! 	Don't put ediff-windows in the menu.
! 	(ediff-patch-buffer): Use buffer name in error message.
! 
! Fri Mar 17 13:16:53 1995  Boris Goldowsky  <boris@spiff.gnu.ai.mit.edu>
! 
! 	* format.el: New file.
! 	* loadup.el: Load format.el.
! 
! 	* enriched.el: Some keybindings adjusted for new function names.
! 	(enriched-auto-save-interval, enriched-downcase-annotations,
! 	enriched-code-face, enriched-indenatation-face,
! 	enriched-ignored-ok, enriched-encode-interesting-regexp,
! 	enriched-decode-special-alist, enriched-decode-interesting-regexp,
! 	enriched-encode-special-alist, enriched-translated,
! 	enriched-ignored-list, enriched-open-ans,
! 	enriched-encode-hard-newline, enriched-decode-hard-newline,
! 	enriched-push, enriched-pop, enriched-which-assoc,
! 	enriched-get-face-attribute, enriched-overlays-overlapping,
! 	enriched-show-codes, enriched-show-margin-codes,
! 	enriched-show-region-as-code, enriched-nogrow-hook, enriched-warn,
! 	enriched-looking-at-with-props,
! 	enriched-search-forward-with-props,
! 	enriched-search-backward-with-props,
! 	enriched-text-properties-include, enriched-tag-indentation,
! 	enriched-open-annotation, enriched-close-annotation,
! 	enriched-annotate-function, enriched-delete-indentation,
! 	enriched-move-to-next-property-change): Deleted.
! 
! 	(enriched-delq-1, enriched-make-list-uniq,
! 	enriched-make-relatively-unique, enriched-common-tail,
! 	enriched-reorder, enriched-insert-annotations,
! 	enriched-loc-annotations, enriched-annotate-change,
! 	enriched-encode-unknown): Moved to format.el.  Names changed.
! 
! 	(enriched-display-table): Copy standard table if there is one,
! 	otherwise create new table.
! 	(enriched-par-props): Don't include front-sticky.
! 	(enriched-initial-annotation): Made it closer to MIME standard.
! 	(enriched-file-width): Use new header format.
! 	(enriched-remove-header): New fn.
! 	(enriched-par-props, enriched-initial-annotation,
! 	enriched-annotation-format, enriched-annotation-regexp): Declare
! 	as const.
! 	(enriched-translations): Name changed from
! 	enriched-annotation-alist.  `hard' removed from list.  Description
! 	of its semantics moved to format.el.
! 	(enriched-list-valued-properties): Deleted, now
! 	`format-list-valued' property holds this information.
! 	(enriched-annotation-name, enriched-annotation-positive-p): Merged
! 	into enriched-next-annotation.
! 	(enriched-mode): Do not translate buffer.  This should be done
! 	already when mode is called.  Do not set
! 	write-region-annotate-functions or after-change-functions hooks.
! 	Put text/enriched on buffer-file-format if necessary.  Don't
! 	set auto-save-interval.  Do set default-properties.
! 	(enriched-insert-indentation): Do nothing to blank lines.
! 	(enriched-encode, enriched-decode): New fns are rewritten
! 	versions of enriched-encode-region and enriched-decode-region.
! 	Much of the complexity moved to format.el.
! 	(enriched-next-annotation): Name changed from
! 	enriched-move-to-next-annotation.  Efficiency & clarity improvements.
! 	Return value changed to agree with format-deannotate-region.
! 
! Fri Mar 17 12:37:30 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* rmail.el (rmail-unix-mail-delimiter): Accept <...> around address
! 	in Unix `From ' line.
! 
! Thu Mar 16 18:28:06 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* isearch.el (isearch-abort): Set isearch-success to nil.
! 
! 	* vms-patch.el (make-auto-save-file-name, auto-save-file-name-p):
! 	Doc fixes.
! 
! Thu Mar 16 17:23:57 1995  Boris Goldowsky  <boris@cs.rochester.edu>
! 
! 	* indent.el (indent-line-to): move to end of indentation, even if
! 	it didn't change.
! 
! Thu Mar 16 15:22:01 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* ediff.el: Installed new version from author.
! 	* ediff-diff.el, ediff-init.el, ediff-merg.el: New files.
! 	* ediff-util.el, ediff-wind.el: New files.
! 	* menu-bar.el (menu-bar-file-menu): Changed "Emerge" to "Merge" to
! 	agree with the new ediff package.
! 
! 	* frame.el (other-frame): Don't try to unfocus in a termcap frame.
! 	(frame-notice-user-settings): Skip menu-bar code in a termcap frame.
! 	(frame-initialize): Set frame-creation-function to
! 	`make-terminal-frame' if appropriate.
! 	* loadup.el: Use appropriate `fboundp' tests to decide what to load.
! 
! Thu Mar 16 13:47:19 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* simple.el (line-move): Handle conses in buffer-invisibility-spec.
! 	Handle skipping invisible overlays.
! 
! Wed Mar 15 23:32:49 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* allout.el (outline-layout): Doc fix.
! 
! 	* edebug.el: Minor doc fixes.
! 
! Wed Mar 15 17:20:26 1995  Per Bothner  <bothner@kalessin.cygnus.com>
! 
! 	* term.el (term-mouse-paste):  Make work for xemacs-19.11.
! 	For GNU emacs, don't mouse-set-point, but do
! 	run-hooks on mouse-leave-buffer-hook,
! 
! 	* term.el (term-char-mode):  Fix paren error that caused
! 	the arrow keys to not be recognized under xemacs.
! 	Also, simplify/fix [(button2)] to [button2] for paste under xemacs.
! 
! Wed Mar 15 18:15:07 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* debug.el (debugger-outer-overriding-local-map): New variable.
! 	(debug): Bind overriding-local-map to nil; save old value
! 	in debugger-outer-overriding-local-map and restore at end.
! 	(debugger-eval-expression): Handle overriding-local-map
! 	like other magic variables.
! 
! Wed Mar 15 09:10:01 1995  enami tsugutomo  <enami@sys.ptg.sony.co.jp>
! 
! 	* window.el (balance-windows): Ignore minibuffer window when
! 	browsing the `levels'.
! 
! Wed Mar 15 18:02:55 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* c-mode.el (c-style-alist): For BSD, set c-continued-brace-offset
! 	instead of c-brace-offset.
! 
! Wed Mar 15 16:29:02 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* mouse.el (mouse-major-mode-menu): Avoid confusing error message
! 	when there's no current local map.
! 
! Wed Mar 15 00:30:41 1995  Torbjvrn Axelsson  <torax@ctrl-c.liu.se>
! 
! 	* options.el (edit-options): Make the buffer read-only.
! 	(Edit-options-modify): Cope with that.
! 
! Wed Mar 15 09:47:22 1995  Karl Fogel  <kfogel@spiff.gnu.ai.mit.edu>
! 
!         * bookmark.el: (bookmark-bmenu-2-window): go to correct position
! 	as well as correct buffer.
! 	(bookmark-bmenu-other-window): same.
!         (bookmark-bmenu-switch-other-window): same.
! 
! Mon Mar 13 22:45:15 1995  Karl Fogel  <kfogel@floss>
! 
! 	* bookmark.el: Removed C-v bindings; they were inconsistent.
! 	Defvarred some variables to nil, solely to avoid compilation warnings.
! 	Use "Author's Update Number:" instead of "Version:".
! 	(bookmark-history): new var.
! 	(bookmark-completing-read): use `bookmark-history'.
! 	(bookmark-maybe-historicize-string): new macro.
! 	Use this everywhere `bookmark-completing-read' is used, because
! 	`completing-read' won't get a chance to add to `bookmark-history' if
! 	we were invoked via a menu.
! 	(bookmark-rename): use `bookmark-history' when reading the new name.
! 	No need for the strange C-o binding anymore.
! 
! Mon Mar 13 00:24:40 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* fill.el (adaptive-fill-regexp): Skip # or ;.
! 	Allow more than one of them (or *'s or >'s).
! 
! 	* telnet.el (rsh): Name the buffer *rsh-HOST*.
! 
! 	* c-mode.el (c-mode): Make comment-multi-line t locally.
! 
! Sun Mar 12 02:38:04 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* simple.el (block-comment-start, block-comment-end): New vars.
! 	(indent-for-comment): Handle them.
! 
! 	* ielm.el (ielm): Use pop-to-buffer.
! 	(same-window-buffer-names): Add *ielm*.
! 
! 	* telnet.el (rsh, telnet): Use pop-to-buffer.
! 	(same-window-regexps): Add elt to match *telnet-...* and *rsh...*
! 	with or without <N> at end.
! 
! 	* info.el (same-window-buffer-names): Set this only in loaddefs.el,
! 	not when info.el is loaded.
! 
! 	* rlogin.el (rlogin): Use pop-to-buffer.
! 	(same-window-regexps): Add elt to match *rlogin-...*
! 	with or without <N> at end.
! 
! 	* hexl.el (hexl-mode-old-local-map, hexl-mode-old-mode-name)
! 	(hexl-mode-old-major-mode): Add defvars.
! 
! 	* shell.el (shell): Use pop-to-buffer.
! 	(same-window-buffer-names): Add *shell* to the list.
! 
! 	* auto-show.el: New file.
! 	Unconditionally add to comint-output-filter-functions.
! 	(auto-show-mode): Command renamed from auto-show-toggle.
! 	Handle an arg in the standard way.
! 	(auto-show-mode): Variable renamed from auto-show-enable.
! 
! 	* rnewspost.el (news-reply-mode-map): Add menu bar menus.
! 
! 	* rmail.el (rmail-duplicate-message): New function.
! 	(rmail-list-to-menu): Bind `command' with let.
! 
! Sat Mar 11 14:11:58 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* server.el (server-buffer-done): Return a list
! 	(NEXT-BUFFER KILLED).  KILLED is t if we killed the buffer.
! 	(server-edit): Values from server-done is now list of
! 	args for server-switch-buffer.
! 	(server-switch-buffer): Likewise.
! 
! 	* simple.el (completion-setup-function): Set completion-base-size.
! 
! Sat Mar 11 11:30:13 1995  Karl Fogel  <kfogel@floss.life.uiuc.edu>
! 
! 	* bookmark.el (bookmark-buffer-name): Be smarter about deducing a name.
! 	(bookmark-insert-buffer-name): Use bookmark-buffer-name.
! 	Replaces bookmark-insert-current-file-name.
! 	(bookmark-make-cell): Fix previous change.
! 
! Fri Mar 10 21:08:29 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* info.el (Info-menu): Bind beg with let.
! 
! 	* tmm.el: New file.
! 
! 	* lmenu.el (add-menu-item-1): Better error message if
! 	a menu not the last in the path does not exist.
! 
! 	* rmail.el (rmail-retry-failure): Don't get errors when
! 	searching for `End of returned message'.
! 
! 	* vc.el (vc-path): Use /usr/sccs only if it is a dir.
! 
! 	* bookmark.el (bookmark-make-cell): Use set-text-properties,
! 	not format, to clear text properties.
! 
! Fri Mar 10 19:53:15 1995  Karl Fogel  <kfogel@floss.life.uiuc.edu>
! 
! 	* bookmark.el:
! 	Insure that all entry points call `bookmark-maybe-load-default-file'.
! 	Changed format of bookmark-alist and therefore of bookmark files.
! 	Have version stamps in bookmark files.
! 	Automatically upgrade old bookmark files to new format.
!         Changed name of default bookmark file to ".emacs.bmk".
! 	Replaced "Bookmark-menu" with "bookmark-bmenu".  The
!         capitalization signified nothing; "bmenu" means "buffer-menu"
! 	-- that is, bmenu code is for the dired-like of bookmarks that
! 	appears when `list-bookmarks' is run, and the "bookmark-menu"
! 	prefix is for the menu-bar.
! 	Internally, use an alist instead of hardcoded list-positions
! 	for storing bookmark information.
! 
! 	Applied <johng@media.mit.edu>'s patches for annotation support:
! 	(bookmark-send-annotation, bookmark-read-annotation-mode)
! 	(bookmark-edit-annotation-mode, bookmark-default-annotation-text)
! 	(bookmark-read-annotation-text-func, bookmark-read-annotation)
! 	(bookmark-send-edited-annotation, bookmark-edit-annotation):
! 	New functions.
! 
! 	(bookmark-get-bookmark, bookmark-get-bookmark-record)
! 	(bookmark-name-from-full-record, bookmark-set-name)
! 	(bookmark-get-annotation, bookmark-set-annotation)
! 	(bookmark-get-info-node, bookmark-set-info-node)
! 	(bookmark-get-filename, bookmark-set-filename)
! 	(bookmark-get-position, bookmark-set-position)
! 	(bookmark-get-front-context-string, bookmark-set-front-context-string)
! 	(bookmark-get-rear-context-string, bookmark-set-rear-context-string):
! 	New subroutines.
! 
! 	(bookmark-file-format-version, bookmark-end-of-version-stamp-marker):
! 	New variables.
! 	(bookmark-grok-file-format-version, bookmark-maybe-upgrade-file-format)
! 	(bookmark-upgrade-version-0-alist, bookmark-upgrade-file-format-from-0)
! 	(bookmark-insert-file-format-version-stamp): New functions.
! 	(bookmark-maybe-load-default-file):
! 	Renamed from bookmark-try-default-file'.
! 	(bookmark-old-default-file): New variable.
! 	(bookmark-default-file): Renamed from `bookmark-file'.
! 	New initial value, ".emacs.bmk".
! 	(bookmark-make-cell): Use backquote.
! 	Produce with the new format (Format Version 1).
! 	Use `format' to strip text-properties.
!         (bookmark-write-file): Use `pp' instead of `princ'.
! 	Call `bookmark-insert-file-format-version-stamp'.
! 	(bookmark-all-names, bookmark-menu-popup-paned-bookmark-menu)
! 	(bookmark-menu-build-paned-menu, bookmark-menu-popup-paned-menu)
! 	(bookmark-insert-location): New functions.
! 	(bookmark-completing-read): New function.  Everyone who called
! 	`completing-read' in the interactive spec now calls this.
! 	(bookmark-load-hook): New hook.
! 
! 	(bookmark-make-menu-alist): Function deleted.
! 	(bookmark-popup-menu-and-apply-function): replaces
! 	`bookmark-make-menu-with-function'.
! 
! 	(bookmark-load): Use `bookmark-alist-from-buffer'.
! 	Call `bookmark-maybe-upgrade-file-format'.
! 	(bookmark-set): If Info mode, record Info-current-node.
! 	Use `bookmark-bmenu-surreptitiously-rebuild-list'.
! 	(bookmark-buffer-file-name): Handle Info files.
! 	(bookmark-buffer-name): If Info mode, return Info-current-node.
! 	(bookmark-jump-noselect): For info node, use Info-goto-node.
! 	Use the helper functions, don't mess with the raw
! 	alist (except in completion, which we'll take care of later).
! 	Don't count on `bookmark-search-size' being correct; use the
! 	length of `forward-str' and `behind-str' instead.
! 	(bookmark-relocate): Use the helper functions; don't mess
! 	with the raw alist except in completion.
! 	(bookmark-rename): C-o in minibuffer now inserts old name.
! 	(bookmark-delete): New arg BATCH.
! 	(bookmark-bmenu-execute-deletions): Was `bookmark-bmenu-execute'.
! 	Just call bookmark-delete with the BATCH arg.
! 	Set the modification count and maybe save when done.
! 	Save point intuitively.
! 	(bookmark-insert-current-file-name): Just use `file-name-nondirectory'.
! 	(bookmark-location): Made non-interactive.
! 	(bookmark-bmenu-list): Replaces `list-bookmarks'.
! 	Delete arg ANNOTATION.  Use mapcar to simplify.
! 	If not interactive-p, then use `set-buffer' instead of
! 	`switch-to-buffer'.
! 	(bookmark-kill-line): New function, used instead of kill-line.
! 	(bookmark-search-size): Init to 16 instead of 500.
! 
! Fri Mar 10 00:54:08 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* dired-aux.el (dired-do-print): Allow lpr-switches to be a string.
! 	Clean up.
! 
! Thu Mar  9 22:19:34 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* simple.el (line-move-ignore-invisible): New variable.
! 	(line-move): If that var is set, use vertical-motion.
! 	Skip any extra invis chars beyond where vertical-motion stops.
! 
! Tue Mar  7 21:19:36 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* files.el (revert-buffer): Doc fix.
! 
! 	* hexl.el (hexl-mode): Make after-revert-hook rehexlify.
! 	(hexl-after-revert-hook): New function.
! 
! 	* perl-mode.el (calculate-perl-indent): When backing up over
! 	continuations, don't go to line beg;
! 	perl-backward-to-start-of-continued-exp gives the right place.
! 
! Tue Mar  7 13:07:23 1995  Enami Tsugutomo  <enami@sys.ptg.sony.co.jp>
! 
! 	* simple.el (indent-new-comment-line): Clean up handling
! 	of \(...\) in comment-start-skip.
! 
! Tue Mar  7 16:43:51 1995  Per Bothner  <bothner@kalessin.cygnus.com>
! 
! 	* term.el (term-eol-on-send):  New variable.
! 	(term-send-input):  Move point to eol before sending only if
! 	term-eol-on-send is true.
! 
! 	* term.el (term-send-input):  Don't move process-mark until
! 	after possible 'history processing.
! 
! Tue Mar  7 16:06:10 1995  Francesco Potorti`  (pot@cnuce.cnr.it)
! 
! 	* cmacexp.el (c-macro-expansion): put the unique string before the
! 	first #line directive (instead of after), preceded by a newline.
! 
! Mon Mar  6 10:51:32 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
! 
! 	* find-dired.el (find-ls-option): Doc fix: now a cons.
! 	(find-dired): Initialize the process-mark for the filter to use.
! 	Find listing switches in cdr of find-ls-option.
! 	(find-dired-filter): Use dired-insert-set-properties on new text.
! 
! 	* compile.el (compilation-buffer-p): Fix braino in last change:
!  	switch to the buffer first.
! 	(compilation-error-regexp-alist): Doc fix: optional cdrs give
! 	string containing %s to produce the file name from the matched text.
! 	(compilation-find-file): Reorder args: MARKER first, then
! 	FILENAME, DIR, and new arg &rest FORMATS (as they appear in parsed
! 	the fileinfo lists).  Try each of the FORMATS in each directory tried.
! 	(compilation-next-error-locus): Apply compilation-find-file to the
! 	FILEINFO list.
! 	(compilation-parse-errors): Instead of a cons (DIR . FILE), make a
! 	list (FILE DIR [FORMATS...]) using the 4th cdr of the matching elt of
! 	regexp-alist.
! 
! Mon Mar  6 00:17:48 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* menu-bar.el (menu-bar-help-menu): Binding for view-emacs-FAQ.
! 
! Sun Mar  5 23:30:29 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* help.el (view-emacs-FAQ): New function.  Bind to C-h F.
! 	(help-for-help): Doc fix.
! 
! 	* info.el (info): Use pop-to-buffer.
! 	(same-window-buffer-names): Add "*info*".
! 
! Fri Mar  3 14:02:58 1995  Robert J. Chassell  <bob@hill.gnu.ai.mit.edu>
! 
!         * texinfmt.el (texinfo-format-refill): Don't confuse a title
!         underline with 2 or more `*' with an xref line starting with one `*'.
! 
! Fri Mar  3 01:46:52 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* simple.el (shell-command-on-region): Obey REPLACE even if
! 	OUTPUT-BUFFER is nil.  Interactively, make REPLACE non-nil
! 	only if there is a prefix arg.
! 
! Thu Mar  2 14:36:28 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* files.el (kill-emacs-query-functions): Doc fix.
! 
! Thu Mar  2 10:22:30 1995  Boris Goldowsky  <boris@spiff.gnu.ai.mit.edu>
! 
! 	* ada.el (ada-mode): Remove "^" used as anchor from
! 	paragraph-start and paragraph-separate values, so that they will
! 	work with non-0 left-margin settings.
! 	* allout.el (outline-mode): Likewise.
! 	* awk-mode.el (awk-mode): Likewise.
! 	* bibtex.el (bibtex-mode): Likewise.
! 	* c-mode.el (c-mode, c-fill-paragraph): Likewise.
! 	* cc-mode.el (c-common-init, c-fill-paragraph): Likewise.
! 	* cplus-md.el (c++-mode): Likewise.
! 	* edt.el (edt-indent-or-fill-region): Likewise.
! 	* gnus-uu.el (gnus-uu-post-reply-mode): Likewise.
! 	* icon.el (icon-mode): Likewise.
! 	* mh-comp.el (mh-letter-mode): Likewise.
! 	* mim-mode.el (mim-mode):  Likewise.
! 	* modula2.el (modula-2-mode):  Likewise.
! 	* nroff-mode.el (nroff-mode):  Likewise.
! 	* options.el (Edit-options-mode):  Likewise.
! 	* outline.el (outline-mode):  Likewise.
! 	* perl-mode.el (perl-mode):  Likewise.
! 	* prolog.el (prolog-mode-variables):  Likewise.
! 	* rnewspost.el (news-reply-mode):  Likewise.
! 	* scheme.el (scheme-mode-variables):  Likewise.
! 	* scribe.el (scribe-mode):  Likewise.
! 	* sendmail.el (mail-mode):  Likewise.
! 	* simula.el (simula-mode):  Likewise.
! 	* texinfmt.el (texinfo-format-refill):  Likewise.
! 	* texinfo.el (texinfo-mode):  Likewise.
! 	* tex-mode.el (tex-common-initialization,latex-mode,slitex-mode):
! 	Likewise.
! 	* text-mode.el (indented-text-mode):  Likewise.
! 	* vc.el (vc-comment-to-change-log):  Likewise.
! 
! Thu Mar  2 05:58:37 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
! 
! 	* font-lock.el (font-lock-maximum-decoration) New variable.
! 	(font-lock-after-fontify-buffer-hook): New variable.
! 	(font-lock-fontify-buffer): Run it after fontifying.
! 	(font-lock-thing-lock-cleanup): New function to turn things off.
! 	(font-lock-mode): Call it when turning Font Lock mode off.
! 	(font-lock-fontify-region): Fix to use forward-comment from
! 	comment-start, rather than searching for comment-end from point.
! 
! 	* ada.el, ada-mode.el (ada-font-lock-keywords): Use
! 	font-lock-maximum-decoration.
! 
! 	* fortran.el, f90.el (fortran-font-lock-keywords): Use
!         font-lock-maximum-decoration.
! 
! Thu Mar  2 03:33:39 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* gud.el (gud-massage-args): Variable and function deleted.
! 	(gud-common-init): Don't set the variable.
! 
! Thu Mar  2 15:11:02 1995  Boris Goldowsky <boris@cs.rochester.edu>
! 
! 	* simple.el (newline): Moved from cmds.c.  Indents last
! 	inserted line to left-margin.
! 
! 	* paragraphs.el (paragraph-start, paragraph-separate): Default
! 	values no longer start with ^. Doc fix.
! 	(use-hard-newlines): Moved here from cmds.c.  Made buffer-local.
! 	Doc fix.
! 	(looking-at-hard): Deleted, not needed.
! 	(forward-paragraph): Removes ^ from beginning of regexps, if
! 	required.  Look for paragraph-start and paragraph-separate at
! 	left-margin, not BOL.  Lines with just left-margin indentation are
! 	treated like blank lines.
! 	Paragraph-separate no longer requires a preceding hard newline, but
! 	paragraph-start does: paragraph-separates usually won't occur by
! 	accident, so it doesn't hurt to respect them whenever they do
! 	occur.
! 
! Wed Mar  1 03:27:15 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* vc.el (vc-do-command): Search vc-path first, not last.
! 
! 	* tar-mode.el (tar-grind-file-mode): Doc fix.
! 
! Tue Feb 28 22:06:57 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* simple.el (shell-command-on-region): Fix typos in doc string.
! 	(universal-argument, describe-arg): Deleted; this is now in C code.
! 	(prefix-arg-internal, digit-argument, negative-argument): Likewise.
! 
! Tue Feb 28 12:54:01 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* gud.el (gud-common-init): Put substed file name back in original
! 	sequence in the args.  Pass ARGS to massage-file even if no file name.
! 	(gud-gdb-massage-args, gud-sdb-massage-args, gud-dbx-massage-args)
! 	(gud-mipsdbx-massage-args, gud-xdb-massage-args)
! 	(gud-perldb-massage-args): Don't add FILE onto the args.
! 
! 	* simple.el (shell-command-on-region): Rename arg; doc fix.
! 
! 	* server.el (server-switch-buffer): New optional arg KILLED-ONE.
! 	Avoid the other-buffer at the end in that case.
! 
! Tue Feb 28 04:07:48 1995  Noah Friedman  <friedman@prep.ai.mit.edu>
! 
!         * rlogin.el (rlogin-carriage-filter): Don't assume buffer is
!         narrowed to region with most recent output.
! 
! Tue Feb 28 01:18:20 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* files.el (revert-buffer): Use current-prefix-arg, not prefix-arg.
! 	* terminal.el (te-escape): Likewise.
! 
! Mon Feb 27 03:05:44 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
! 
! 	* dired.el (dired-internal-noselect): Use substitute-command-keys
! 	to get binding of revert-buffer.
! 
! Sun Feb 26 16:37:37 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
! 
! 	* compile.el (compilation-buffer-p): Check for
!  	compilation-minor-mode or compilation-mode major mode, rather than
!  	internal state variables.  Don't want to match a buffer that was
!  	once in compilation-minor-mode but is not now.
! 
! Sun Feb 26 15:00:54 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* info.el (Info-extract-menu-node-name): Collapse multiple spaces.
! 
! 	* tar-mode.el (tar-mode-show-date): New variable.
! 	(tar-header-block-summarize, tar-next-line): Obey it.
! 
! Sun Feb 26 23:07:09 1995  Greg McGary  <gkm@magilla.cichlid.com>
! 
! 	* tar-mode.el (tar-header-block-tokenize): Parse 32-bit modtime
! 	current-time compatible a list of 16-bit ints (HIGH LOW).
! 	(tar-parse-octal-integer): Write char-const '0' as
! 	?0 instead of more obscure 48.
! 	(tar-parse-octal-long-integer): New function.
! 	(tar-clip-time-string): New function.
! 	(tar-header-block-summarize, tar-header-block-summarize):
! 	Insert mod-time into listing.
! 	(tar-next-line): Move goal column to new location of filenames.
! 
! Sat Feb 25 18:26:30 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* mouse.el (mouse-kill-secondary): Avoid changing this-command.
! 	Don't clear the secondary selection.
! 
! Sat Feb 25 10:23:45 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
! 
! 	* comint.el (comint-truncate-buffer): New function.
! 	(comint-buffer-maximum-size): New variable.
! 
! 	* shell.el (shell-truncate-buffer): Doc them.
! 
! 	* comint.el (comint-dynamic-complete-as-filename): Let
!         file-name-handler-alist to nil; comint-file-name-prefix does this.
! 	(comint-dynamic-list-filename-completions): Likewise.
! 	(comint-dynamic-complete-filename,
! 	comint-dynamic-complete-as-filename): Use window-minibuffer-p.
! 
! Sat Feb 25 02:29:45 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* cplus-md.el (c++-backward-to-noncomment): Don't loop forever
! 	if first line of buffer starts with ` #'.
! 
! 	* subr.el (walk-windows): Doc fix.
! 
! Fri Feb 24 23:55:54 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* subr.el (local-unset-key): Fix args in previous change.
! 
! Fri Feb 24 13:54:41 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* subr.el (global_set_key, local_set_key, global_unset_key)
! 	(local_unset_key): Functions moved here from keyboard.c.
! 
! Fri Feb 24 07:35:36 1995  Lars Lindberg  <Lars.Lindberg@sypro.cap.se>
! 
! 	* msb.el (msb): Select the window that the mouse is in before
! 	  showing the menu.  This makes the "Most recently used" menu more
! 	  accurate.
! 	(menu-bar-update-buffers): The frame list is now an integrated
! 	part of the buffer menu.
! 	(msb--few-menus, msb--very-many-menus): Added rmail-edit-mode.
! 
! 	* msb.el (mouse-select-buffer): Do sit-for before x-popup-menu.
! 
! Thu Feb 23 19:01:46 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* lisp-mode.el (eval-defun): Convert defvar to defconst.
! 
! 	* loaddefs.el (function-key-map): Use vector in definition of C-delete.
! 
! 	* rmail.el (rmail-retry-failure): Support a new style of failure msg.
! 
! Tue Feb 21 14:49:58 EST 1995  Boris Goldowsky  <boris@cs.rochester.edu>
! 
! 	* fill.el (set-fill-prefix): Sets it to the text between
! 	left-margin and point, not the whole line before point.
! 
! 	(fill-region-as-paragraph): Set `from' to the beginning and
! 	`to' to the end immediately, for clarity.  This used to be
! 	done after the save-restriction.
! 
! 	Newlines at end of region used to be changed to spaces, then
!  	deleted.  Now delete them (all but one) explicitly, so that we
!  	can test whether they are hard and not delete hard newlines.
! 
!   	Ignore all whitespace at beginning of region: a line
!  	containing spaces before first line of text used to be joined
!  	onto first line of text, making spurious paragraph
!  	indentation.
! 
! 	If there is only whitespace in the region, exit quickly (fixed
! 	possible infinite-loop condition).
! 
! 	Moved the loop that just indents when justification=none inside
! 	the save-restriction.  It's a little simpler that way.
! 
! 	When deleting indentation and fill-prefixes from lines, delete
! 	any whitespace after the fill-prefix too.
! 
! 	Always exit with point at end of region, after a single
!  	paragraph-final newline.
! 
! 	(fill-region): Don't use paragraph-movement commands
!  	in use-hard-newlines mode; just fill between each pair of hard
!  	newlines.  Old strategy of setting paragraph-start to "^"
! 	doesn't work, since paragraph-start no longer no longer need
! 	occur at BOL.
! 
! 	(current-justification): Don't look for text-props at EOB:
! 	there are none.
! 
! 	(set-justification): New arg WHOLE-PAR controls whether to trust
! 	begin and end args in noninteractive use, or extend to limits of
! 	paragraphs.
! 	Don't use "^" in paragraph-start regexp.
!   	Ignore fill-prefix when searching for enclosing paragraph with
! 	use-hard-newlines true.
!   	Squeeze spaces from regions that used to be full-justified.
! 	Remove leftover debugging code.
! 
!   	(set-justification-{none,left,right,full,center}): Use WHOLE-PAR
! 	arg of set-justification.  Interactive spec changed to avoid
! 	errors when there is no region.
! 
! 	(justify-current-line): Error if JUSTIFY value is not one of
! 	the meaningful symbols (used to do full justification in this case);
! 	change interactive spec to explicitly request full justification.
! 
! 	Don't need to save-restriction & narrow (except for full-justify).
! 	Explicitly remember beginning position, so that we can move it
! 	to after indentation if that is appropriate.
! 	Save a few more useful quantities; add documentation of variables used.
! 
! 	Do nothing if there is no text on the line.
! 
! 	Notice adaptive-fill fill-prefixes too.
! 
! 	Center or flushright indentation is put between fill-prefix
! 	and text; can't use standard line-indent function for this.
! 
! 	If centering, do so between left and right margins.
! 
! 	Warning messages ("line too long") removed; they were annoying
! 	in auto-fill-mode.
! 
! 	(unjustify-current-line, unjustify-region): New functions.
! 
! 	* indent.el (indent-line-to): Don't need `let'.
! 
! 	(current-left-margin): Don't look for text-props at EOB.
! 
! 	(move-to-left-margin): Always move to left-margin, even in
! 	centered or right-justified regions.
! 	New arg FORCE to add indentation or convert tabs to spaces if
! 	necessary.  FORCE is the interactive default; it used to be
! 	available only interactively.
! 
! 	(indent-to-left-margin): Doc fix.
! 
! 	(delete-to-left-margin): Use move-to-left-margin.  Doc fix.
! 	Make arguments optional.
! 
! 	(set-left-margin): Make	region include following spaces and tabs,
! 	so that later insertions there will inherit new setting.
! 	Always reindent text to show new setting, not only when auto-fill
! 	is active; auto-fill controls only whether to re-fill text.
! 	(set-left-margin, increase-left-margin): Use indent-rigidly to
! 	change indentation level.
! 	(set-left-margin, set-right-margin, increase-left-margin): Save
! 	point when calling fill-region.
! 	(increase-left-margin): left-margin property can be
! 	negative, for outdenting, up to the value of the left-margin variable.
! 	(increase-right-margin): right-margin property can be arbitrarily
! 	negative.  Negative values can't be stored in text/enriched
! 	format, but that doesn't mean we shouldn't allow it in general.
! 
! 	(beginning-of-line-text): New function.
! 
! 	* simple.el (open-line): Indent to left-margin any lines that
! 	you would consider inserting a fill-prefix on.
! 
! 	(do-auto-fill): Use unjustify-current-line.
! 
! 	(indent-new-comment-line): Indent to left-margin before inserting
! 	fill-prefix.
! 
! 	* facemenu.el (facemenu-justification-menu): "Unfilled" now bound
! 	to set-justification-none; fn changed name.
! 
! Thu Feb 23 00:00:49 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* perl-mode.el (perl-tab-to-comment): Default is nil.
! 
! 	* loadup.el: Load version.el early on.
! 
! 	* simple.el (shell-command-on-region): When computing interactive args,
! 	read the minibuffer arg first, then get the region bounds.
! 
! Tue Feb 21 17:50:41 1995  Michael Kifer  <kifer@cs.sunysb.edu>
! 
! 	* viper-ex.el (ex-find-file): now gives an error when a wild card
! 	gives no match.
! 	(ex-next): now recognizes counts and puts proper commands in
! 	ex-command-history.
! 	(vip-info-on-file, ex-substitute): bug fixed.
! 
! Tue Feb 21 07:47:38 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
! 
! 	* shell.el (shell-cd): New function.
! 	(shell-process-cd, shell-process-pushd, shell-process-popd,
! 	shell-resync-dirs): Use it instead of cd.
! 	(shell-mode): Make list-buffers-directory local with value
! 	default-directory.
! 
! 	* mouse.el (mouse-buffer-menu): Use list-buffers-directory if
!         non-nil if buffer-file-name is nil.
! 
! Mon Feb 20 19:00:56 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* viper.el, viper-ex.el, viper-util.el: New files.
! 	* viper-keym.el, viper-macs.el, viper-mous.el: New files.
! 
! Mon Feb 20 05:50:44 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
! 
! 	* fortran.el (fortran-mode): Made fortran-font-lock-keywords turn
!         off syntactic fontification by default.
! 
! Mon Feb 20 04:39:48 1995  Roland McGrath  <roland@duality.gnu.ai.mit.edu>
! 
! 	* vc.el (vc-log-info): Don't switch to the *vc* buffer before
!  	running vc-do-command, because that would change its
!  	default-directory.
! 
! Sun Feb 19 15:04:06 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* rnewspost.el: Various doc fixes.
! 	(news-post-news): Add autoload cookie.
! 
! Sat Feb 18 14:40:49 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* mouse.el (mouse-buffer-menu): Don't clear selection when we kill it.
! 
! 	* subr.el (eval-after-load): Run FORM now if FILE's already loaded.
! 
! 	* imenu.el (imenu--cleanup): Set alist to its default
! 	just once, at the beginning.
! 	Don't recurse on a cdr which is nil.
! 
! Fri Feb 17 18:21:54 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* simple.el (quoted-insert): Use insert-and-inherit.
! 	Don't change buffer if arg is negative.
! 
! 	* tex-mode.el (tex-append): Try splitting on last period, then
! 	try splitting on first period.
! 
! 	* desktop.el (desktop-internal-v2s): Don't use format
! 	to eliminate text properties.
! 
! Fri Feb 17 13:31:23 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* mailabbrev.el (mail-abbrev-mode-regexp): Doc fix.
! 
! Fri Feb 17 03:59:35 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* rmailsum.el (rmail-summary-mail, rmail-summary-continue)
! 	(rmail-summary-reply, rmail-summary-retry-failure)
! 	(rmail-summary-forward, rmail-summary-resend): Switch to rmail
! 	buffer's window first, so mail buffer replaces summary.
! 
! Thu Feb 16 00:56:51 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* buff-menu.el (Buffer-menu-save): Fix the test for header line.
! 
! Wed Feb 15 03:34:54 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* info.el (Info-index): Bind Info-history, not Info-keep-history.
! 
! Tue Feb 14 09:47:41 1995  Boris Goldowsky  <boris@cs.rochester.edu>
! 
! 	* facemenu.el (facemenu-self-insert-face): If previous
! 	self-insert-face is still valid, add to rather than replace it.
! 	(facemenu-loc): Variable deleted.
! 
! Tue Feb 14 01:20:35 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* ehelp.el (electric-help-help, electric-help-command-loop):
! 	Mention q and r, not Q and R.
! 
! 	* sort.el (sort-regexp-fields-next-record): New subroutine.
! 	If the first search does not advance point and finds an empty match,
! 	skip one char and search again.
! 	(sort-regexp-fields): Use that subroutine.
! 	Bind sort-regexp-fields-regexp, for sort-regexp-fields-next-record.
! 	(sort-regexp-fields-regexp): Declared.
! 	(sort-regexp-record-end): Declared.
! 
! Mon Feb 13 11:38:23 1995  Jeff Dwork  <jeff.dwork@amd.com>
! 
! 	* ehelp.el (electric-help-map): Use supress-keymap instead of
! 	filling keymap with undefined commands.  Bind R like r.
! 	Substitute electric-command-apropos for command-apropos.
! 	(electric-apropos): New function.
! 	(electric-help-help, electric-help-command-loop):
! 	Mention Q and R in messages.
! 
! Mon Feb 13 22:11:48 1995  Jim Thompson  <thompson@wg2.waii.com>
! 
! 	* ps-print.el (ps-print-version): Add caveat about version number.
! 	(ps-begin-file): Fix format code for /LineHeight.
! 
! Mon Feb 13 03:42:17 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* files.el (auto-mode-alist): Fix problem in previous change.
! 
! 	* pp.el (pp-to-string): Fix previous change.
! 
! 	* debug.el (debugger-step-after-exit): Variable declared.
! 	(debugger-old-buffer, debugger-value): Variables declared.
! 
! 	* facemenu.el (facemenu-next): Variable deleted.
! 	(facemenu-self-insert-face): New function.
! 	(facemenu-set-face): Use facemenu-self-insert-face.
! 	(facemenu-set-face-from-menu): Likewise.
! 	(facemenu-after-change): Function deleted.  Don't use it as hook.
! 
! 	* debug.el (debug): Fix arg to backtrace-debug for debug-on-entry.
! 
! Sun Feb 12 03:25:02 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* pp.el (pp-to-string): Don't use emacs-lisp-mode.
! 	Just do the parts of it we actually want.
! 
! 	* simple.el (next-history-element): Do nothing if n is 0.
! 	Handle errors properly when history list is empty.
! 
! Sat Feb 11 19:15:37 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* menu-bar.el (menu-bar-kill-ring-save): New function--use as `copy'.
! 	(delete-region): Don't enable if (mouse-region-match) is true.
! 
! 	* mouse.el (mouse-drag-region): Delete the overlay before
! 	calling the terminating event's command binding or making a region.
! 	(mouse-set-region-1): New function.
! 	(mouse-drag-region, mouse-set-region, mouse-save-then-kill): Call it.
! 	(mouse-region-match): New function.
! 
! 	* ange-ftp.el (ange-ftp-write-region, ange-ftp-insert-file-contents)
! 	(ange-ftp-copy-file-internal): If remote host is unix, use binary mode.
! 	(ange-ftp-file-local-copy): Delete local var bin1.
! 	(ange-ftp-rename-remote-to-remote): Delete arg `binary'.
! 	(ange-ftp-rename-file): Don't pass or compute that arg.
! 
! Fri Feb 10 01:28:06 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* files.el (auto-mode-alist): Add .cpp, .cxx, .hxx, .c++, .h++.
! 
! 	* sendmail.el (mail-reply-to): New command, on C-c C-f C-r and in menu.
! 
! 	* c-mode.el (c-switch-label-regexp): Insist on colon after `default'.
! 
! 	* sendmail.el (mail-do-fcc): Find buffer to add to
! 	using truename, if can't find it by real name.
! 
! 	* files.el (recover-file): Use ordinary `f' to read file name.
! 
! Thu Feb  9 01:34:25 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* rmail.el (rmail): Don't set rmail-default-file here.
! 	(rmail-default-file): Init it to ~/xmail.
! 	(rmail-default-rmail-file): Don't call expand-file-name.
! 
! 	* dired.el (dired-mark): If on dir header line, always mark
! 	the files in that dir.
! 
! 	* lpr.el (print-region-1): Include print options in echo area msgs.
! 
! Wed Feb  8 18:46:26 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* ada.el (ada-mode): Delete autoload.
! 
! 	* ada-mode.el: New file.
! 	Add autoload cookie.
! 	(ada-mode-map): Don't define C-m, M-a, M-e, M-q.
! 	Don't define M-q.
! 	(ada-mode): Set fill-paragraph-function locally.
! 	(ada-fill-comment-paragraph): Return t.
! 	(ada-gen-make-bodyfile): Add missing backslash.
! 
! Wed Feb  8 08:00:33 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
! 
! 	* comint.el (comint-match-partial-filename): Include `%' char.
! 
! Wed Feb  8 01:03:55 1995  Ken Stevens  <k.stevens@ieee.org>
! 
! 	* ispell.el: Personal dictionary save forced when called from menu,
! 	Epoch compile support.
! 	(ispell-skip-sgml): Added variable for skipping SGML tags & references.
! 	(ispell-buffer-local-parsing): Hard wire set of ispell-skip-sgml-tags
! 	to sgml-mode.
! 	(ispell-pdict-save): Message improvement.
! 	(ispell-command-loop): Properly adjust screen with different settings
! 	of ispell-choices-win-default-height.
! 	(check-ispell-version): Use fundamental-mode as default-major-mode.
! 	(ispell-change-dictionary): Remove unnecessary process kills
! 	(ispell-region): Fold sgml support in with tib checking.
! 	(ispell-message): Skips checking of forwarded messages.
! 
! Tue Feb  7 19:38:25 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* novice.el (disabled-command-hook): Recognize ESC x as well as M-x.
! 
! 	* edmacro.el (edmacro-format-keys): Don't presume internal bit layout
! 	of non-ASCII keys.
! 	(edmacro-parse-keys): Likewise.
! 	* terminal.el (te-pass-through): Likewise.
! 	* subr.el (listify-key-sequence-1, event-modifiers): Likewise.
! 
! 	* edt.el: New enhanced version.
! 	* edt-lk201.el, edt-mapper.el, edt-pc.el, edt-vt100.el: New files.
! 
! 	* bytecomp.el (byte-compile-file-form-defmumble, display-call-tree):
! 	Print ellipsis earlier, so message logging will fold similar strings.
! 	(byte-compile-file): Add "done" message.
! 
! Tue Feb  7 17:46:00 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* ps-print.el (ps-print-thompson-version):
! 	Renamed from ps-print-version.
! 
! Tue Feb  7 16:52:44 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* subr.el (read-quoted-char): Don't log prompt messages.
! 	Use M- notation instead of assuming internal layout.
! 
! Tue Feb  7 02:59:59 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* term.el (term-protocol-version): Renamed from term-version.
! 
! Mon Feb  6 17:34:55 1995  G Dinesh Dutt  (brat@htilbom.ernet.in)
! 
! 	* etags.el (etags-file-of-tag): Handle file name used as tag.
! 
! Sat Feb  4 16:23:18 1995  Per Bothner  <bothner@kalessin.cygnus.com>
! 
! 	* term.el (term-version):  Increased to 0.95.
! 	(term-pager-enabled):  New macro.  Use it a bunch of places.
! 	(term-terminal-menu):  Clean up initialization so we don't get
! 	complaints when re-loading term.el.
! 	(term-send-raw-meta):  Redo to handle meta-symbols (e.g. meta-delete).
! 	More robust checking of parameter to make-string.
! 	(term-update-mode-line):  New function.  Call it whenever we change
! 	char/line/paging mode.  Now includes "page" in mode-line-process
! 	if paging is abled.
! 
! 	* term.el:  Remove causes for byte-compilation to complain:
! 	(term-terminal-pos):  Declare x and y in let-binding.
! 	(term-send-invisible):  Remove bogus second "iteractive" call.
! 	(term-*): Provide defvars for lots of buffer-local variables.
! 	(term-mode):  Make comments and initial value setting from
! 	here to the corresponding defvar.
! 	(term-line-start-column):  Remove unused variable.
! 	(term-erase-in-line):  Fix syntax (incorrect parenthesis) error.
! 	(term-erase-in-display):  Fix typo "\?n" -> "?\n".
! 
! 	* term.el:  Make Unix "resize" command work:
! 	(term-handle-ansi-escape):  On "\e[row;colH", limit row
! 	and col to size of window.  (Resize sends "999;999".)
! 	(term-handle-ansi-escape):   Implement "\e[6n" "Report cursor
! 	position".  This requires that we pass proc as an extra parameter.
! 	(term-scroll-region):  An empty region means extend to window bottom.
! 
! Sun Feb  5 22:28:19 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* lpr.el (lpr-add-switches): Renamed from lpr-add-options.
! 	(print-region-new-buffer): Return new start and end.
! 	(print-region-1): Use new calling convention.
! 
! Sun Feb  5 19:09:36 1995  Jim Blandy  <jimb@totoro.bio.indiana.edu>
! 
! 	* texinfo.el (texinfo-environment-regexp): Match @menu and
! 	@titlepage --- they require @ends.  Don't match @defunx commands;
! 	they don't.
! 	(texinfo-insert-@end): Don't put a command name after the @end
! 	if we ran off the top of the buffer looking for its mate.
! 
! Sat Feb  4 21:16:57 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* rmail.el (rmail-next-same-subject): New command.
! 	(rmail-previous-same-subject): Likewise.
! 	(rmail-mode-map): Add bindings for C-c C-n and C-c C-p.
! 
! 	* rmailsum.el (rmail-summary-next-same-subject): New command.
! 	(rmail-summary-previous-same-subject): Likewise.
! 	(rmail-summary-mode-map): Add bindings for C-c C-n and C-c C-p.
! 
! Sat Feb  4 15:34:55 1995  G Dinesh Dutt  (brat@htilbom.ernet.in)
! 
! 	* etags.el : Changes to support filenames as tags too and provided
! 	a drop-in replacement for list-tags.
! 	(find-tag-noselect): Recognize filenames as valid tags too.
! 	(find-tag-file-order): New variable holds function to check for match
! 	for a file name used as a tag.
! 	(last-tag-file): New variable; stores the filename looked for via
! 	find-tag family of functions.
! 	(find-tag-in-order): If the tag is a file name, position at file beg.
! 	(etags-recognize-tags-table): Added new var find-tag-file-order to
! 	tags-table-format variables.  Added tag-filename-match-p to the
! 	list for find-tag-tag-order.
! 	(tag-filename-match-p): New function.
! 	(list-tags): Rewritten for speed.
! 	(tags-list-functions-in-file): New subroutine for list-tags.
! 	(tags-locate-file-in-tags-table): New function locates a
! 	file in `tags-table-list'.
! 
! Fri Feb  3 14:27:50 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* lpr.el (print-region-1): If we run pr, give it the -h option
! 	instead of giving lpr the -T option.
! 
! 	* dired.el (dired-mode-map): Define up and down arrows like C-p, C-n.
! 
! 	* f90.el (f90-mode-version): Variable deleted.
! 	(f90-mode): Don't use f90-mode-version.
! 
! 	* ps-print.el: Add autoload cookies.
! 	(ps-paper-type): Doc fix.
! 
! 	* lpr.el (print-region-1): Use lpr-page-header-switches,
! 	not ...-options.
! 
! Fri Feb  3 12:59:14 1995  Francesco Potorti`  (pot@cnuce.cnr.it)
! 
! 	* man.el (Man-default-man-entry): Remove text properties from result.
! 
! Thu Feb  2 23:20:29 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* rmail.el (rmail-reply-regexp): New var.
! 	(rmail-reply): Delete text matching rmail-reply-regexp.
! 
! Thu Feb  2 14:27:55 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* completion.el: Don't use cl.  Eliminate use of when, unless,
! 	dotimes, plusp, minusp, pusnhew, second.
! 	(completion-dolist): New macro.  Use instead of dolist.
! 	(completion-gensym-counter, completion-gensym): New variable and fn.
! 	(locate-completion-entry-retry): Bind cmpl-entry, then use it.
! 	(locate-completion-entry): Use completion-string, not string.
! 	(add-completion-to-head, delete-completion):
! 	Rename arg to completion-string.
! 	(completions-list-return-value): Defvar'd and renamed
! 	from return-completions.
! 	(cmpl-preceding-syntax, cdabbrev-stop-point): Add defvars.
! 	(delete-completion, check-completion-length): Fix message format.
! 	(complete, add-completions-from-buffer, add-completions-from-c-buffer)
! 	(save-completions-to-file): Likewise.
! 	(completion-string): Add defvar.
! 
! 	* lpr.el (lpr-headers-switches): Default is nil.
! 
! 	* fill.el (fill-paragraph): Bind fill-paragraph-function
! 	to nil before calling it.
! 
! 	* dabbrev.el (dabbrev-abbrev-char-regexp): Default value is nil again.
! 
! Thu Feb  2 04:37:25 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* c-mode.el (c-mode-map): No binding for c-fill-paragraph
! 	(c-fill-paragraph): Return t.
! 	(c-mode): Put c-fill-paragraph in fill-paragraph-function.
! 
! 	* lisp-mode.el (shared-lisp-mode-map): Don't bind M-q.
! 	(lisp-fill-paragraph): Return t.
! 	(lisp-mode-variables): Put that in fill-paragraph-function locally.
! 
! 	* fill.el (fill-paragraph-function): New variable.
! 	(fill-paragraph): Use it.
! 
! Wed Feb  1 15:23:17 1995  Noah Friedman  <friedman@prep.ai.mit.edu>
! 
!         * sendmail.el (mail-mailer-swallows-blank-line): Handle full range
!           of RFC822-legal header names.
! 
! Wed Feb  1 00:46:57 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* help.el (describe-variable): If var is local, mention default.
! 
! 	* rmail.el (rmail-retry-failure): Handle "Mime-encapsulated messages".
! 	Discard return-path and from headers as well as sender.
! 
! Tue Jan 31 01:24:18 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* f90.el: New file.
! 
! Mon Jan 30 17:36:37 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* iso-acc.el (iso-accents-list): Add Icelandic thorn.
! 	* iso-transl.el (iso-transl-language-alist): Add French & Portuguese.
! 	(iso-transl-char-map): Use /a /e ~d "s ~t digraphs as in iso-acc.el.
! 
! 	* frame.el (frame-notice-user-settings): Avoid having the window
! 	manager re-prompt for the initial frame's clone.
! 
! 	* faces.el (x-create-frame-with-faces): Assume cursor-color,
! 	mouse-color, and border-color are okay as specified unless they
! 	are the same as the new background color.
! 
! Mon Jan 30 01:14:18 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* simple.el (indent-new-comment-line): Obey the convention
! 	about \(...\) pairs in comment-start-skip.
! 
! 	* lucid.el (make-extent, delete-extent, set-extent-property)
! 	(set-extent-face): New functions.
! 
! 	* desktop.el: Many doc fixes.
! 
! Sun Jan 29 04:29:51 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* buff-menu.el (list-buffers-noselect): Handle read-only properly.
! 	Select each buffer just once to get all necessary info about it.
! 
! 	* buff-menu.el (list-buffers-noselect): New subroutine.
! 	(list-buffers): Use that.
! 	(buffer-menu): Switch to the buffer in the same window.
! 	(buffer-menu-other-window): New command.
! 	(Buffer-menu-select): Just change the current window.
! 
! 	* rnewspost.el (news-reply-mode): Change mode-name to News Reply.
! 
! 	* lisp-mode.el (lisp-indent-region): Set endmark
! 	before indenting first line.
! 	(indent-sexp): Fixes for ENDPOS != nil case--use nil
! 	as starting-point, and don't insist on a complete sexp.
! 
! Sat Jan 28 03:26:43 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* subr.el (match-string): Fix braino.
! 
! 	* faces.el (facep): New function.
! 	(internal-check-face): Don't make a loop, since signal can't return.
! 
! Fri Jan 27 16:57:15 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* frame.el (make-frame): Doc fix.
! 
! 	* help.el (describe-variable): Use local-variable-p.
! 
! 	* debug.el (debug-convert-byte-code): Convert the doc info to a string.
! 
! 	* shell.el (shell): If we create a new shell buffer,
! 	select that buffer even if it has been renamed.
! 
! 	* faces.el (x-resolve-font-name): Better error messages.
! 
! Fri Jan 27 13:58:24 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* subr.el (match-string): Delete extra arg to buffer-substring.
! 
! 	* replace.el (perform-replace): Don't log the repetitive prompts.
! 
! Fri Jan 27 02:05:53 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* lucid.el (read-number): New function.
! 
! 	* tex-mode.el (tex-display-shell): Pass nil as arg to
! 	tex-recenter-output-buffer.
! 	(tex-region, tex-file, tex-show-print-queue, tex-bibtex-file):
! 	Put the call to tex-display-shell essentially last.
! 
! 	* menu-bar.el (menu-bar-update-yank-menu): If string is too long,
! 	show start and end, with ... between them.
! 	(yank-menu-length): Default value 20.
! 
! 	* subr.el (match-string): New function.
! 
! Thu Jan 26 01:52:53 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* mouse.el (mouse-save-then-kill): When we don't use existing
! 	region, put where click and put mark at the other end.  Use
! 	point-before-scroll if non-nil.  Recognize mouse-set-region
! 	as a previous command that makes a region we should use.
! 	(mouse-drag-region): When we run the final click's binding,
! 	set this-command.
! 
! 	* scroll-bar.el (scroll-bar-drag-1): Set point-before-scroll properly.
! 	(scroll-bar-scroll-down, scroll-bar-scroll-up): Likewise.
! 
! Wed Jan 25 00:36:14 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* mouse.el (mouse-save-then-kill): Ignore mouse-selection-click-count if no active mark.
! 	(mouse-drag-region): Modify previous change--don't run the ordinary binding
! 	in the case of a multiple click.
! 
! 	* tex-mode.el (tex-display-shell): New function.
! 	(tex-file, tex-region, tex-show-print-queue, tex-bibtex-file):
! 	Use that instead of tex-display-shell.
! 
! Tue Jan 24 17:42:47 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* fill.el (justify-current-line): Avoid error comparing fill-prefix
! 	near end of buffer.  Do nothing fast if justification not wanted.
! 
! 	* bytecpat.el: Renamed from bytecomp1.el.
! 
! Tue Jan 24 10:21:19 1994  G Dinesh Dutt  (brat@htilbom.ernet.in)
! 
! 	* etags.el : Changes to support filenames as tags too and provided
! 	a drop-in replacement for list-tags.
! 	(find-tag-noselect): recognize filenames as valid tags too.
! 	(find-tag-file-order): new variable added. This contains the name of
! 	the function used to qualify a matched filename.
! 	(last-tag-file): new variable; stores the filename looked for via
! 	find-tag fmaily of functions.
! 	(find-tag-in-order): In case tag searched for is a file, don't do
! 	anything fancy to locate position of tag in file. Just seek to
! 	beginning of file.
! 	(etags-recognize-tags-table): Added new var find-tag-file-order to
! 	tags-table-format variables and also set the priority of searching
! 	for tag type to make it look for a filetype tag first.
! 	(tag-filename-match-p): New function added to qualify naive match
! 	for a filename tag.
! 	(list-tags): Replaced with contents with one performing better for
! 	this function.
! 	(tags-list-functions-in-file): New function which is a backend for
! 	list-tags function.
! 	(tags-locate-file-in-tags-table): New function which locates a
! 	file in `tags-table-list'. Its used by list-tags.
! 
! Tue Jan 24 09:29:13 1995  Frederic Lepied  <fred@sugix.frmug.fr.net>
! 
! 	* gnus.el: Added support for descriptions in the group buffer:
! 	(gnus-group-prepare, gnus-group-prepare-line, gnus-setup-news)
! 	(gnus-gnus-to-quick-newsrc-format, gnus-group-list-groups):
! 	Record if we show all groups, to redisplay
! 	correctly after toggling descriptions display.
! 	(gnus-newsgroups-display-toggle, gnus-newsgroups-update-description)
! 	(gnus-newsgroups-retrieve-description): New functions.
! 	(gnus-group-mode-map): Bind t to gnus-newsgroups-display-toggle.
! 	Add a newsgroups-update-description menu.
! 	(gnus-newsgroups-regex, gnus-newsgroups-display, gnus-newsgroups-alist)
! 	(gnus-newsgroups-hashtb, gnus-newsgroups-showall): New variables.
! 	(gnus-group-group-name):  Changed the regexp to avoid  conflict
! 	with descriptions which have a ':' inside.
! 	(gnus-group-mode): Doc fix.
! 
! Mon Jan 23 23:44:06 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* c-mode.el (c-forward-conditional):
! 	If an apparent conditional is not really a conditional, skip past it.
! 
! Mon Jan 23 17:36:42 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* iso-transl.el (iso-transl-dead-key-alist): New var.
! 	(iso-transl-char-map): Give each singleton a doubleton synonym.
! 	(iso-transl-language-alist, iso-transl-ctl-x-8-map): New vars.
! 	(iso-transl-define-keys): New function; sets up keymap.
! 	(iso-transl-set-language): New function; sets language-specific part.
! 
! 	* simple.el (mark): If transient-mark-mode is nil, mark is active.
! 
! Mon Jan 23 14:42:25 1995  Espen Skoglund  <espensk@tklab3.cs.uit.no>
! 
! 	* pascal.el: (pascal-*-completion, pascal-comp-defun)
! 	(pascal-complete-word, pascal-completion-response, pascal-completion)
! 	(pascal-get-completion-decl): Rename some internal variables
! 	to start with 'pascal-'.
! 	(pascal-str, pascal-all, pascal-pred, pascal-flag)
! 	(pascal-buffer-to use): New dummy variables.
! 
! Sun Jan 22 04:50:39 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* vc.el (vc-do-command): Arrange for the default-directory variable
! 	in *vc* to be re-set each time this function uses it.
! 	Discard current dir from front of FILE later on,
! 	and only if last = `WORKFILE'.
! 
! 	* vc.el: Undo Dec 10 change:
! 	(vc-directory, vc-dired-reformat-line): Changed back.
! 	(vc-directory-18): Old function restored.
! 	(vc-dir-all-files): Function deleted.
! 
! 	* vc.el (vc-next-action-on-file): If file is not registered,
! 	check file out after registering it.
! 	(vc-next-action-dired): Restore the window configuration after
! 	doing vc-next-action on each file in a VC-dired buffer.
! 	(file-regular-p-18): New function.
! 	(file-regular-p): Define, if not already defined.
! 
! 	* iso-transl.el (iso-transl-char-map): Add elements for
! 	mute-acute, etc.
! 
! 	* gud.el (gud-mode): Use gud-new-keymap, so inherit keymaps..
! 
! 	* font-lock.el (font-lock-fontify-region): Bind inhibit-read-only.
! 	Also buffer-file-name.
! 	(font-lock-hack-keywords, font-lock-unfontify-region): Likewise.
! 
! Sat Jan 21 19:51:21 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* c-mode.el (c-fill-paragraph): If comment terminator is on a
! 	separate line, don't include that line in the filling.
! 
! 	* bytecomp.el (byte-compile-defvar): Add the var to current-load-list.
! 
! Sat Jan 21 18:04:00 1994  David K}gedal  <davidk@lysator.liu.se>
! 
! 	* tempo.el (tempo-insert-template): Quoted transient-mark-mode
! 	Expansion around region now puts point at the first mark.
! 
! 	* tempo.el (tempo-region-start, tempo-region-stop): New variables
! 	(tempo-insert-template, tempo-insert): Don't affect the
! 	mark.  Check for Transient Mark mode
! 
! 	* tempo.el (tempo-find-match-string): Removed the stupid 1+ again
! 
! 	* tempo.el (tempo-use-tag-list):
! 	Set tempo-match-finder to completion-function
! 
! 	* tempo.el (tempo-match-finder): Renamed variable from
! 	tempo-default-match-finder.  Change the value too.
! 	(tempo-collection, tempo-dirty-collection): New variables.
! 	(tempo-user-elements): New variable.
! 	(tempo-insert): New argument ON-REGION.
! 	New elements 'l and 'r.  Use tempo-is-user-element.
! 	(tempo-is-user-element): New function.
! 	(tempo-invalidate-collection, tempo-build-collection): New functions.
! 	(tempo-find-match-string): Reinserted bugfix for re-search-backward.
! 	(tempo-complete-tag): Complete rewrite.
! 
! 	* tempo.el (tempo-insert): Added the 'o tag.
! 
! Sat Jan 21 14:07:31 1995  Per Bothner  <bothner@kalessin.cygnus.com>
! 
! 	* term.el (term-version):  Increased to 0.94.
! 	(term-if-emacs19, term-if-xemacs, term-ifnot-xemacs):  New macros
! 	to conditionalize at compile-time for different emacs versions.
! 	(various places):  Use them (instead of term-is-XXXX).
! 	(term-is-emacs19):  Removed, no longer needed.
! 
! 	* term.el:  Change keybindings to not use C-c LETTER, for
! 	term-char-mode, term-line-mode.  Keybindings for term-pager-enable
! 	and term-pager-disable replaced by one for term-pager-toggle.
! 	(term-pager-toggle):  New function.
! 
! 	* term.el (term-fake-pager-enable, term-fake-pager-disable):
! 	Define as aliases, so that menubar code will find proper keybindings.
! 	(term-char-mode):  Make no-op if already in char mode.
! 	(term-line-mode):  Make no-op if already in line mode.
! 	(term-mode-map):  Add keybinding for no-op term-line-mode, so
! 	code to display menubar keybindings doesn't lose it.  (Needed
! 	as long as char-mode and line-mode share term-terminal-menu.)
! 	(term-raw-escape-map):  Likewise for term-char-mode.
! 	(term-char-mode, term-line-mode):  Better documentation strings.
! 
! 	* term.el:  Added menubar for pager sub-mode.
! 
! 	* term.el (term-command-hook):  Disabled the feature that allowed
! 	inferior to send a lisp command to emacs - too big a security hole.
! 
! Sat Jan 21 08:59:15 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
! 
! 	* upd-copyr.el (update-copyright): Remove gratuitous error at end.
! 
! Fri Jan 20 18:04:28 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* loadhist.el (unload-feature): Don't care if FILE is a dependency
! 	of itself.
! 
! 	* fill.el (fill-region-as-paragraph): At end, advance over any newlines
! 	that were in the region but excluded from filling.
! 
! Fri Jan 20 14:11:25 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* text-mode.el (center-line): fill-column is a var, not a function.
! 
! Fri Jan 20 00:28:15 1995  Morten Welinder  <terra@diku.dk>
! 
! 	* compile.el (compile-internal): Force redisplay on compilation
! 	buffer before executing compile process.
! 
! Fri Jan 20 01:18:42 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* ps-print.el: New file.
! 
! Thu Jan 19 22:19:59 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* c-mode.el (set-c-style): Ignore case in completion.
! 
! Thu Jan 19 21:28:03 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* rmailsum.el (rmail-summary-update-highlight): New function.
! 	(rmail-summary-goto-msg): Use it.
! 	(rmail-summary-rmail-update): Move the summary highlight.
! 	(rmail-summary-mark-deleted): Do nothing if rmail-summary-overlay
! 	has a nil face-property.
! 	(rmail-new-summary): Make the summary-on-top kludge
! 	more restricted in when it is used.
! 
! Thu Jan 19 17:23:53 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* paths.el (remote-shell-program): Reorder search path.
! 
! Wed Jan 18 17:11:11 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* fill.el (current-justification): Renamed from current-justification.
! 	Callers changed.
! 	(fill-region-as-paragraph): left-margin renamed to current-left-margin.
! 
! 	* indent.el (move-to-left-margin): justification renamed to
!         current-justification.
! 	* simple.el (do-auto-fill): justification renamed to
!         current-justification.
! 
! 	* ispell.el (check-ispell-version): Use Fundamental mode
! 	in the temporary buffer.
! 
! 	* calendar.el: Use byte-compile-dynamic.
! 
! Wed Jan 18 16:57:14 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
! 
! 	* etags.el (etags-file-of-tag): Use a regexp search to find the
! 	file name, allowing it to contain any char but a newline.
! 
! Wed Jan 18 15:56:39 1995  Boris Goldowsky  <boris@cs.rochester.edu>
! 
! 	* indent.el (standard-indent): New variable.
! 	(alter-text-property, current-left-margin, move-to-left-margin)
! 	(delete-to-left-margin, set-left-margin, set-right-margin)
! 	(increase-left-margin, decrease-left-margin, increase-right-margin)
! 	(decrease-right-margin, indent-line-to): New functions.
! 	(indent-to-left-margin): Use indent-line-to.  Don't delete or
! 	insert anything unless necessary.
! 
! 	* fill.el (set-justification): New function.
! 	(set-justification-{none,left,right,full,center}): New functions.
! 	(fill-region-as-paragraph, fill-region, justify-current-line): New
! 	arg NOSQUEEZE defeats normal removal of extra whitespace.
! 	(fill-region-as-paragraph, fill-region)
! 	(fill-nonuniform-paragraphs, fill-individual-paragraphs):
! 	Arg JUSTIFY-FLAG (JUSTIFYP) renamed to JUSTIFY.
! 	(fill-region-as-paragraph): Obey left-margin; fill-prefix starts
! 	after left-margin.  Disable filling if JUSTIFY == none, but indent to
! 	margin anyway.
! 	Adaptive-fill removes text-props from fill-prefixes it finds.
! 	Adaptive-fill no longer has to notice left-margin: std fill does that.
! 	Use fill-column and canonically-space-region functions.
! 	(canonically-space-region): New fn split from fill-region-as-paragraph.
! 	(fill-region): New args NOSQUEEZE (as above) and TO-EOP.
! 	(default-justification): New variable.
! 	(current-left-margin, fill-column, justification): New functions.
! 	(fill-paragraph): Use fill-region-as-paragraph when possible.
! 	(justify-current-line): New arguments; different kinds of
! 	justification handled.  Uses left-margin and fill-column functions.
! 
! 	* paragraphs.el (forward-paragraph): Fix end-of-buffer bug.
! 
! 	* completion.el (completion-separator-self-insert-autofilling):
! 	Don't check fill-column; do-auto-fill will do that.
! 
! 	* simple.el (do-auto-fill): Fill, don't fill, or fill-and-justify
! 	depending on setting of justification text-property.  Respect
! 	left-margin and right-margin text properties.
! 	(open-line, indent-new-comment-line): Inherit when inserting.
! 	(newline-and-indent, reindent-then-newline-and-indent): Doc fix.
! 
! 	* text-mode.el (center-line): Use current-left-margin function.
! 
! 	* enriched.el (enriched-annotation-list): Property `hard-newline'
! 	renamed to `hard'.  Justification value `both' renamed `full'.
! 	(enriched-mode): Don't set auto-fill-function, fill-column,
! 	sentence-end-double-space.  Do set use-hard-newlines.
! 	(enriched-delete-indentation): Use delete-to-left-margin and
! 	canonically-space-region.
! 	(enriched-indent-increment): Deleted, use `standard-indent' instead.
! 	(enriched-insert-hard-newline): Deleted, use `newline'.
! 	(enriched-beginning-of-line): Deleted, use `move-to-left-margin'.
! 	(enriched-squeeze-spaces): Deleted, use canonically-space-region.
! 	(enriched-forward-paragraph, enriched-backward-paragraph)
! 	(enriched-open-line, enriched-fill-paragraph, enriched-fill-region)
! 	(enriched-fill-region-as-paragraph, enriched-auto-fill-function)
! 	(enriched-justify-line): Deleted, use standard versions.
! 	(enriched-region-pars, enriched-end-of-paragraph, enriched-unindent)
! 	(enriched-beginning-of-paragraph, enriched-move-to-fill-column)
! 	(enriched-line-length, enriched-indent-line, enriched-indent)
! 	(enriched-aggressive-auto-fill-function, enriched-hard-newline)
! 	(enriched-indent-right, enriched-unindent-right): Deleted.
! 	(enriched-show-codes, enriched-show-margin-codes)
! 	(enriched-show-region-as-code, enriched-nogrow-hook): Commented out.
! 	(enriched-left-margin, enriched-change-left-margin)
! 	(enriched-change-right-margin, enriched-set-left-margin)
! 	(enriched-set-right-margin): Moved to indent.el as current-left-margin,
! 	increase-left/right-margin, set-left-/right-margin.
! 	(enriched-default-justification, enriched-justification)
! 	(enriched-set-justification-*, enriched-fill-column): Moved to
! 	fill.el as default-justification, current-justification,
! 	set-justification-*, current-fill-column.
! 	(enriched-indentation-menu-map, enriched-justification-menu-map):
! 	Moved to facemenu.el as facemenu-indentation-menu,
! 	facemenu-justification-menu.
! 
! 	* facemenu.el (facemenu-keybindings, facemenu-face-menu):
! 	Keybinding for bold-italic changed from M-g o to M-g l; M-g o is
! 	now "other".
! 	(facemenu-justification-menu, facemenu-indentation-menu):
! 	New submenus, moved from enriched.el
! 	(list-colors-display, facemenu-color-equal): New functions.
! 	(facemenu-menu): Added "Display Faces" item.
! 	(facemenu-new-faces-at-end): New variable.
! 	(facemenu-add-new-face): Obey facemenu-new-faces-at-end.
! 	(facemenu-menu, facemenu-keymap, facemenu-face-menu)
! 	(facemenu-foreground-menu, facemenu-background-menu)
! 	(facemenu-special-menu): Now have function definitions as prefix keys.
! 	(facemenu-menu, facemenu-update): Refer to submenus by their names
! 	rather than including their values.
! 	(facemenu-set-face): Error if read-only; add item to menu if necessary.
! 	(facemenu-get-face): Always return FACE.
! 	(facemenu-add-new-face): Don't add if facemenu-unlisted-faces is t.
! 	(facemenu-unlisted-faces): Doc fix.
! 
! 	* facemenu.el: Revise keybindings; doc fix.
! 	(facemenu-new-faces-at-end): New vbl. (facemenu-add-new-face): Use it.
! 	(facemenu-set-face, facemenu-set-face-from-menu): Check read-only.
! 	(facemenu-set-face): Doc fix.
! 
! 	* facemenu.el (facemenu-face-menu, facemenu-foreground-menu,
! 	facemenu-background-menu, facemenu-special-menu): New or renamed
! 	variables for submenus.
! 	(facemenu-color-alist): Renamed from facemenu-colors.
! 	(facemenu-add-new-face): New function.
! 	(facemenu-update): Don't redo top-level menu;
! 	nothing should change.  Move menu setup to defvars.  Use
! 	facemenu-add-new-face. Changed global binding to C-down-mouse-3.
! 	(facemenu-menu): "Update" item removed; should
! 	no longer be needed interactively.
! 	(facemenu-complete-face-list): Just return faces, not keybindings.
! 
! Wed Jan 18 14:41:12 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* ispell.el (check-ispell-version): Force standard syntax table.
! 
! 	* paths.el (remote-shell-program): New var.
! 	* telnet.el (rsh): Use it.
! 	* rcompile.el (remote-compile): Likewise.
! 	* ange-ftp.el (ange-ftp-gateway-program): Likewise.
! 	(ange-ftp-shell-command): Likewise.
! 
! Wed Jan 18 02:56:21 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* gud.el (gdb): In gud-remove, specify the source file.
! 
! Tue Jan 17 23:54:59 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* gud.el (gud-new-keymap): New function.
! 	(gud-xdb-find-file, gud-dbx-find-file, gud-sdb-find-file, gud-gdb-find-file):
! 	Use it for keymap inheritance.
! 
! Tue Jan 17 20:50:39 1995  Dave Love  <d.love@dl.ac.uk>
! 
! 	* gud.el (gud-gdb-find-file): Propagate debug menu to found buffers.
! 	(gud-dbx-find-file, gud-xdb-find-file, gud-sdb-find-file, gud-perldb-find-file):
! 	Likewise.
! 	(gud-menu-map): New variable.
! 	(gud-mode): Use gud-menu-map and move the menu-setting outside.
! 
! 	* gud.el (dbx): Fix missing cast of $curline for Irix.
! 	(gud-irixdbx-marker-filter): Make $curline cast consistent with the others.
! 
! Tue Jan 17 05:34:53 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
! 
! 	* comint.el (comint-dynamic-list-completions): Test event-start to
!         make sure it is not a complex event (e.g., switch-frame).
! 
! Tue Jan 17 00:35:28 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* help.el (help-for-help): Doc fix.
! 
! 	* help-macro.el (make-help-screen): Use *only* local-map to look
!         up keys.
! 
! Mon Jan 16 17:54:53 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* edebug.el (edebug-enter): Fix reversed setq's.
! 
! 	* calendar.el (calendar): Doc fix.
! 
! 	* disp-table.el (standard-display-ascii): Doc fix.  Allow use with X.
! 
! 	* iso-cvt.el (iso-aggressive-german-trans-tab): Doc fix.
! 	(iso-cvt-ffh, iso-cvt-wfh, iso-cvt-ash): Doc fix.
! 
! Mon Jan 16 18:27:50 1994  Espen Skoglund  <espensk@tklab3.cs.uit.no>
! 
! 	* pascal.el (pascal-mode-map, pascal-outline-map):
! 	C-c C-b now inserts block.  C-c C-d does goto-defun.
! 	`#' calls on electric-pascal-hash.
! 	(pascal-calculate-indent, pascal-indent-alist)
! 	(electric-pascal-tab, pascal-indent-case):
! 	Better handling of indent within case.  Support for CPP.
! 	The `;' in the last statement of a subblock may be omitted.
! 	(electric-pascal-hash): New function.
! 
! Mon Jan 16 00:45:52 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* vc.el: Revert Jan 15 and Jan 5 changes.
! 
! 	* scribe.el (scribe-mode): Treat @: as a sentence end.
! 
! Sun Jan 15 20:12:53 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* dabbrev.el (dabbrev--find-all-expansions): Don't use push.
! 	(dabbrev--search): Likewise.
! 
! Sun Jan 15 04:43:40 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
! 
! 	* vc.el (vc-do-command): Use set-buffer-modified-p instead of
!         not-modified.
! 
! 	* files.el (not-modified): Doc fix.
! 
! 	* etags.el (etags-tags-completion-table): Don't let match string
!         contain a \177.
! 
! Fri Jan 13 22:10:18 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* vc.el (vc-directory): Prompt for a directory, not a file.
! 
! Thu Jan 12 19:35:03 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* edebug.el: Undo Nov 30 change.
! 	(edebug-emacs-19-specific): Don't use quote; easy-menu-define doesn't
! 	evaluate its first arg.
! 
! 	* easymenu.el (easy-menu-define): Doc fix.
! 
! Thu Jan 12 15:53:22 1994  Boris Goldowsky  <boris@cs.rochester.edu>
! 
! 	* paragraphs.el (forward-paragraph): Notice use-hard-newlines value.
! 	(looking-at-hard): New function.
! 	(paragraph-start, paragraph-separate): Doc fix.
! 
! 	* simple.el (open-line, split-line, next-line): Use `newline'
! 	function to insert newline so it will be marked hard if appropriate.
! 	(indent-new-comment-line): Use `newline' function, unless called
! 	with (new) argument.
! 	(do-auto-fill): Call indent-new-comment-line with argument to
! 	make newline soft.
! 
! 	* fill.el (fill-region-as-paragraph): Don't modify newline
! 	at end of paragraph, to make sure text-properties are preserved.
! 	(fill-paragraph): Call fill-region, not fill-region-as-paragraph,
! 	to avoid clobbering paragraph-internal hard-newlines.
! 	(fill-region): If use-hard-newlines is on, divide into
! 	"paragraphs" by breaking at every hard newline, temporarily
! 	ignoring paragraph-start.
! 
! Thu Jan 12 10:36:13 1994  Tom Tromey  <tromey@drip.colorado.edu>
! 
! 	* buff-menu.el (list-buffers): New function.
! 	(ctl-x-map): Define C-x C-b to list-buffers.
! 
! Thu Jan 12 00:42:39 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* files.el (revert-buffer): Recompute buffer-file-truename.
! 
! 	* c-mode.el (indent-c-exp): Handle `{ if (x)\n  foo;\n  bar;' case.
! 	* cplus-md.el (indent-c++-exp): Handle `{ if (x)\n  foo;\n  bar;' case.
! 
! 	* etags.el (etags-goto-tag-location): Add 1 to char positions in TAGS.
! 
! 	* startup.el (command-line-1): Handle -f with kbd macro.
! 
! 	* msb.el (mouse-select-buffer) Handle an aborted selection.
! 
! Wed Jan 11 12:27:27 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* derived.el (define-derived-mode): Doc fix.
! 
! Tue Jan 10 23:43:34 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* term/x-win.el: Put height and width from geometry parm
! 	into default-frame-alist.
! 
! Tue Jan 10 21:22:32 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* isearch.el (isearch-edit-string): Disable message logging.
! 	(isearch-toggle-case-fold, isearch-message): Likewise.
! 
! Tue Jan 10 20:28:01 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* dired.el (dired-insert-directory): Don't call expand-file-name
! 	when dir-or-list is a list.
! 
! Tue Jan 10 17:31:01 1995  Noah Friedman  <friedman@prep.ai.mit.edu>
! 
!         * rlogin.el (rlogin-tab-or-complete): Insert tab in buffer, don't
!         send directly to process.
!         (rlogin, rlogin-directory-tracking-mode): Use rlogin-remote-user,
!         not rlogin-user.
! 
! Tue Jan 10 12:37:54 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* faces.el (face-nontrivial-p): New function.
! 
! 	* paren.el (show-paren-command-hook): Don't alter paren-mismatch face
! 	if make-face gives it some contents.
! 
! Tue Jan 10 12:25:50 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
! 
! 	* shell.el (shell-mode): Doc fix.
! 
! Tue Jan 10 01:23:54 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* dabbrev.el (dabbrev-check-other-buffers):
! 	Renamed from dabbrev-always-check-other-buffers.
! 	(dabbrev-check-all-buffers): Renamed frm dabbrev-check-rest-of-buffers.
! 
! 	* ange-ftp.el (ange-ftp-set-buffer-mode): Don't set make-backup-files.
! 	(ange-ftp-real-find-backup-file-name): New function.
! 	(ange-ftp-find-backup-file-name): New function.
! 	Use it to handle find-backup-file-name.
! 
! 	* files.el (find-backup-file-name): Run a file name handler.
! 	(backup-buffer): Do nothing if backup-info is nil.
! 
! Mon Jan  9 23:58:03 1995  Noah Friedman  <friedman@prep.ai.mit.edu>
! 
!         * rlogin.el: Removed several more gratuitous autoload cookies.
!         (rlogin-initially-track-cwd): Variable deleted.
!         (rlogin-directory-tracking-mode): New variable and function.
!         Default to 'local.
!         (rlogin-host, rlogin-remote-user): New variables.
!         (rlogin): Set them appropriately.
!         (rlogin-tab-or-complete): New function.
!         Bind C-i to it.
!         (rlogin-carriage-filter): New function.
!         (rlogin): Add it to comint-output-filter-functions.
!         (rlogin-parse-words): New function.
!         (rlogin): Make buffer name "*rlogin-USER@HOST* if remote user
!         differs from local.
!         Simplify initialization of local variables, using rlogin-parse-words.
!         Do not call comint-mode directly.
!         Doc fixes.
! 
! Mon Jan  9 18:09:46 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* bytecomp.el: Fix text punctuation.
! 
! Mon Jan  9 04:46:59 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* faces.el (face-try-color-list): Treat `underline' as valid.
! 
! 	* subr.el (listify-key-sequence-1): Update for change in CHAR_META.
! 
! 	* dabbrev.el (dabbrev-expand): Now checks for marker.
! 	(dabbrev--try-find): Now does a protected call to `widen'.
! 	(dabbrev-always-check-other-buffers): Default now t.
! 	(dabbrev--capitalize): Function deleted.
! 	(dabbrev-completion): Use `capitalize'.
! 
! 	* msb.el Better format of files-by-directory menus.  Now
! 	splits big menus into sub-menus.
!         (msb-max-menu-items): Changed default value.  This variable
! 	now depicts the maximum number of items in a sub-menu.
! 	(msb-display-most-recently-used): Changed default value.
! 	(mouse-select-buffer): Now handles several levels of
! 	sub-menus.  New format on return value.
! 
! Sun Jan  8 14:36:11 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* find-file.el: New file.
! 
! Fri Jan  6 15:48:24 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* mouse.el (mouse-drag-region): As once in the past,
! 	call the binding of the terminating event.
! 
! 	* terminal.el (te-terminfo-systems-regexp): Variable deleted.
! 	(te-create-terminfo): Use system-uses-terminfo.
! 
! 	* simple.el (what-cursor-position): Show char in decimal, hex, octal.
! 
! Thu Jan  5 15:27:30 1995  Stefan Schoef  <schoef@Informatik.Uni-Oldenburg.DE>
! 
!         * bibtex.el (bibtex-clean-entry): Killing text while editing
!         the autogenerated label in the minibuffer caused the killed text
!         to appear in front of the bibtex entry.
! 
! Thu Jan  5 17:10:48 1995  Eric Raymond  <esr@locke.ccil.org>
! 
! 	* vc.el (vc-do-command): Change RCS handling so rcsdiff won't strip
! 	away relative-pathname information.  This function no longer sets the
! 	default directory.  Also, mark the *vc* output buffer unmodified.
! 	(vc-revert-buffer1): Handle font-lock mode correctly.
! 	(vc-diff, vc-print-log): vc-do-command no longer sets the default
! 	directory, but doing so	is advantageous for these cases.
! 	(file-executable-p-18):	Better portability to Emacs 18.
! 	(vc-directory-exclusion-list, vc-file-tree-walk-internal):
! 	Implement the new variable vc-directory-exclusion-list to prune
! 	tree walks.  Initial value tells it to ignore SCCS and RCS
! 	subdirectories.
! 
! Thu Jan  5 15:32:51 1995  Ken Laprade  <klaprade@harris.com>
! 
! 	* simple.el (pop-global-mark): Make pop-global-mark treat
! 	global-mark-ring as a ring.
! 
! Thu Jan  5 07:01:33 1995  Johan Vromans  <jv@NL.net>
! 
! 	* forms.el: Change forms-search to forms-search-forward, and add
!         forms-search-backward.
! 	(forms--mode-menu-ro, forms--mode-menu-edit): New
! 	functions to create a pulldown menu in the menubar.
! 	(forms--mode-commands): Call them for the edit and view mode.
! 	* (forms-print): New function.
! 
! Wed Jan  4 17:32:32 1995  Stephen Gildea  <gildea@x.org>
! 
! 	* tex-mode.el (tex-print): Better check for when to print current
! 	buffer's file over last processed file.
! 
! Tue Jan  3 17:12:48 1995  Noah Friedman  <friedman@prep.ai.mit.edu>
! 
!         * sendmail.el (mail-personal-alias-file): New variable.
!         Use globally in place of hardwired "~/.mailrc".
!         * mailalias.el: Here too.
!         * mailabbrev.el (mail-abbrev-mailrc-file): Variable and macro
!         deleted.  All callers now use `mail-personal-alias-file'.
! 
!         * pp.el: Add autoload cookies.
! 
! Tue Jan  3 01:39:54 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* tex-mode.el (tex-mode): Recognize \NeedsTeXFormat{LaTeX2e}.
! 
! 	* startup.el (command-line-1): Pause between init file error
! 	and command line option processing.
! 
! 	* spell.el (spell-filter): Make it a risky-local-variable.
! 
! Mon Jan  2 18:01:07 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* gud.el (gud-sdb-marker-filter): Use gud-marker-acc.
! 
! 	* time.el (display-time-string-forms): Fix doc string syntax error.
! 
! Mon Jan  2 13:03:23 1994  Kevin J. Greiner  <greiner@boston.brc.shell.com>
! 
! 	* gud.el (gud-dbx-marker-filter): Use gud-marker-acc like
! 	gud-gdb-marker-filter.
! 
! Sat Dec 31 00:11:30 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* files.el (auto-mode-alist): Add entries for .cls files,
! 	and for /drafts/.  Put tex-mode and latex-mode in lower case.
! 
! 	* files.el (set-visited-file-name): Error if buffer is indirect.
! 	(basic-save-buffer): For indirect buffer, save the base buffer.
! 	(save-some-buffers): Ignore indirect buffers.
! 
! Fri Dec 30 15:47:30 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* tex-mode.el (tex-mode): \begin at start of file implies Latex.
! 
! 	* terminal.el (terminal-emulator): Test system-configuration
! 	to decide on terminfo vs termcap.
! 	(te-terminfo-systems-regexp): Renamed from te-terminfo-systems.
! 
! Fri Dec 30 14:55:27 1994  Kishore Kumar  (kishorek@tulblr.unisys.com)
! 
! 	* terminal.el: Added terminfo support.
! 	(te-terminal-name-prefix, te-terminal-name, te-terminfo-systems):
! 	New variables.
! 	(terminal-emulator): Handle termcap or terminfo.
! 	(te-create-terminfo, te-create-termcap): New subroutines.
! 	(te-tic-sentinel): New subroutine.
! 
! Thu Dec 29 13:52:13 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* simple.el (completion-list-mode-map): Don't bind return, just C-m.
! 
! Wed Dec 28 20:47:21 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* apropos.el (super-apropos-check-elc-file): New function.
! 	specifies which file to search.
! 	(apropos-files-scanned): New variable.
! 	(super-apropos): Bind apropos-files-scanned.
! 	Update apropos-accumulate from apropos-print-matches.
! 	Call super-apropos-accumulate before checking for no matches.
! 	(super-apropos-check-doc-file): Don't visit the file, just insert it.
! 	(super-apropos-accumulate): When doc string is in a file,
! 	scan that file.
! 	(apropos-print-matches): Return the sorted list.
! 	(safe-documentation): Handle compiled files.
! 
! Wed Dec 28 03:12:30 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
! 
! 	* etags.el (find-tag-in-order): Don't set buffer-local value of
!         tags-file-name.
! 
! Tue Dec 27 15:13:57 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* tex-mode.el (tex-mode-map): Add BibTeX File menu item.
! 
! 	* subr.el (run-hook-with-args-until-failure):
! 	Return non-nil if no hook functions.
! 
! Mon Dec 26 00:06:09 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* startup.el (command-line-1): Split startup msg into two parts.
! 	Add something about C-mouse-3 when on a window system.
! 
! 	* tar-mode.el (tar-mode-map): Bind C-m to tar-extract.
! 
! 	* replace.el (occur-mode-map): Bind C-m to occur-mode-goto-occurrence.
! 	(occur-mode): Doc fix.
! 
! 	* compile.el (compilation-minor-mode-map): Bind C-m to
! 	compilation-goto-error.
! 
! 	* buff-menu.el (Buffer-menu-mode-map): Bind C-m to
! 	Buffer-menu-this-window.
! 
! 	* dired.el (dired-mode-map): Bind C-m to
! 	dired-advertised-find-file.  Change f to dired-find-file.
! 
! 	* simple.el (switch-to-completions): New command, with bindings
! 	in the minibuffer completion maps.
! 
! 	* simple.el (next-completion, previous-completion): New commands.
! 	(completion-list-mode-map): Put them on left, right arrows.
! 
! 	* isearch.el (isearch-mode): Set mouse-leave-buffer-hook.
! 	(isearch-done): Clear it.
! 
! Sun Dec 25 09:27:20 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* mouse.el (mouse-minibuffer-check, mouse-drag-mode-line)
! 	(mouse-yank-at-click, mouse-yank-secondary, mouse-choose-completion):
! 	Run mouse-leave-buffer-hook.
! 
! 	* bytecomp.el (byte-compile-warning-types): Add obsolete.
! 	(byte-compile-warnings): Doc fix.
! 	(byte-compile-obsolete): Check for obsolete in byte-compile-warnings.
! 	(byte-compile-variable-ref): Likewise.
! 
! 	* timezone.el (timezone-fix-time): For year values < 50, add 2000.
! 
! 	* server.el (server-process-filter): Process each line separately.
! 	(server-buffer-done): Delete dead buffers from CLIENT list.
! 	Wait a while after sending a command to emacsclient.
! 	Verify that BUFFER is a buffer.
! 
! 	* subr.el (font-lock-defaults): Add defvar.
! 	(buffer-file-type): Add defvar.
! 
! 	* simple.el (completion-reference-buffer): Initialize to nil.
! 
! 	* dabbrev.el (esc-map): Delete excess closeparen.
! 
! 	* apropos.el (super-apropos, super-apropos-check-doc-file)
! 	(super-apropos-accumulate): Vars item, fn-doc and var-doc renamed
! 	to apropos-item, apropos-fn-doc and apropos-var-doc.
! 	(apropos-item, apropos-var-doc, apropos-fn-doc)
! 	(apropos-accumulate, apropos-regexp): New defvars.
! 	(super-apropos): Bind apropos-regexp to regexp.
! 	(super-apropos-accumulate): Use apropos-regexp.
! 
! 	* ange-ftp.el (ange-ftp-save-match-data): Macro deleted.
! 	Most callers use save-match-data.
! 	(ange-ftp-process-filter, ange-ftp-process-sentinel)
! 	(ange-ftp-gwp-filter): Don't save the match data explicitly.
! 
! 	* ange-ftp.el (ange-ftp-process-filter, ange-ftp-gwp-filter):
! 	After comint output processing, update STR.
! 
! Sat Dec 24 10:24:42 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* fast-lock.el: New file.
! 
! 	* dabbrev.el (dabbrev-abbrev-char-regexp): Accept symbol chars
! 	as well as word constituent chars.
! 
! 	* startup.el (command-line-1): If help-command has no key binding,
! 	say `M-x help', not `M-x help-command'.
! 
! 	* emacs-lock.el: New file.
! 
! Fri Dec 23 13:04:39 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* msb.el: Fix quoting conventions and spaces at end of sentence.
! 
! 	* msb.el: New file.
! 
! 	* dabbrev.el (dabbrev-completion): Now searches all buffers
! 	when given prefix arg 16.
! 	(dabbrev--version): Variable deleted.
! 
! 	* dabbrev.el: Don't require cl, picture, or reporter.
! 	Don't provide new-dabbrev.
! 	(dabbrev--try-find): Don't use `loop'.
! 	Don't create or kill local bindings.
! 	(dabbrev-completion): Use key-description to say what to type.
! 	Fix style of "done" message.
! 	(dabbrev-submit-feedback): Function deleted.
! 	(dabbrev--same-major-mode-p): Simplify.
! 	(dabbrev-completion, dabbrev--abbrev-at-point): Fix error msg style.
! 
! 	* dabbrev.el (dabbrev-filter-elements): New macro.
! 	(dabbrev--select-buffers, dabbrev--find-expansion): Use that.
! 	(dabbrev--search): Use that.
! 
! 	* dabbrev.el: Complete rewrite by Lars.Lindberg@sypro.cap.se.
! 
! Fri Dec 23 18:12:54 1994  Barry Warsaw  (bwarsaw@cnri)
! 
! 	* elp.el (elp-pack-number): New function.
! 	(elp-output-results): Use elp-pack-number to truncate time strings,
! 	watching out for very small or very large numbers.
! 
! 	* elp.el (elp-unset-master): Make it an interactive command.
! 
! 	* reporter.el (reporter-submit-bug-report): Set up for status messages.
! 	Use mail-text to position point to the body of the message.
! 
! 	* reporter.el (reporter-beautify-list): Complete rewrite.
! 	Optional nocompact-p argument.
! 
! 	* reporter.el (reporter-dump-variable): Invert the test and
! 	passing of compact-p argument to reporter-beautify-list.  List
! 	values are not printed as defuns or function calls.
! 
! 	* reporter.el: Updated package list.
! 
! 	* reporter.el (reporter-lisp-indent): New defun.
! 
! 	* reporter.el (reporter-dont-compact-list)
! 	(reporter-status-message, reporter-status-count): New variables.
! 
! 	* reporter.el (reporter-update-status, reporter-beautify-list)
! 	reporter-dump-variable): Now smarter about formating variables
! 	with list values.  Checks the value of reporter-dont-compact-list.
! 
! Fri Dec 23 12:23:40 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* simple.el (next-line, previous-line): If interactive and not in
! 	kbd macro, catch the error and beep instead.
! 
! Thu Dec 22 22:30:08 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* bibtex.el (bibtex-string, bibtex-preamble): Use forward-line.
! 	(sort-subr): Don't call autload for this--that's done in loaddefs.el.
! 	(bibtex-mode): Add autoload cookie.
! 
! 	* server.el (server-switch-buffer): Cope with dead frames and windows.
! 
! Thu Dec 22 19:19:25 1994  Dave Love  <d.love@dl.ac.uk>
! 
!         * gud.el (gdb): Correct tbreak doc string.
!         (gud-mode): Define a Gud menu.
!         (gdb): Set debugger-specific menu entries.
!         (sdb) (dbx) (xdb): Likewise.
! 
! Thu Dec 22 17:52:03 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* novice.el (enable-command): Always insert code to enable.
! 	(disable-command): Insert newline before as well as after.
! 
! Wed Dec 21 12:56:21 1994  David M. Smith  <D.M.Smith@lancaster.ac.uk>
! 
! 	* imenu.el (imenu-always-use-completion-buffer-p): A value of
! 	`never' now means never display a completion buffer.
! 	(imenu--completion-buffer): implement 'never behaviour.
! 
! Wed Dec 21 15:45:00 1994  Stefan Schoef  <schoef@informatik.uni-oldenburg.de>
! 
! 	* bibtex.el: Changed keybinding for bibtex-print-help-message
!         (from \C-ch to \C-c?). Therefore, describe-mode is not longer on
!         \C-c?. Also, changed prefix \C-cn for bibtex-narrow functions to
!         \C-c\C-r.
!         (bibtex-string-files): Changed documentation.
!         (bibtex-mode-map): Inscriptions of menu bar changed from "Entry
!         Types" to "Entry-Types" and "Bibtex Edit" to "BibTeX-Edit".
!         (bibtex-string-files): Changed documentation.
!         (bibtex-mode): If environment variable BIBINPUTS isn't defined,
!         string files are searched in the current directory.
!         (bibtex-completion-candidates): Now buffer-local to allow
!         evaluation of different bibtex-string-files in different buffers.
!         (bibtex-autokey-edit-before-use, bibtex-clean-entry): New variable
!         that determines, if the user is allowed to edit auto-generated
!         reference keys before they are used.
!         (bibtex-generate-autokey, bibtex-clean-entry): New function to
!         generate an autokey if necessary.
!         (bibtex-autokey-names, bibtex-autokey-name-change-strings,
!         bibtex-autokey-name-length, bibtex-autokey-name-separator,
!         bibtex-autokey-year-length, bibtex-autokey-titlewords,
!         bibtex-autokey-title-terminators,
!         bibtex-autokey-titlewords-stretch,
!         bibtex-autokey-titleword-first-ignore,
!         bibtex-autokey-titleword-abbrevs,
!         bibtex-autokey-titleword-change-strings,
!         bibtex-autokey-titleword-length,
!         bibtex-autokey-titleword-separator,
!         bibtex-autokey-name-year-separator,
!         bibtex-autokey-year-title-separator): New variables related to
!         bibtex-generate-autokey.
!         (bibtex-find-entry-location): Optional second parameter maybedup
!         to tell it that entering a duplicate entry isn't to report by an
!         error but by the return value of the function (necessary for
!         bibtex-clean-entry to find the correct position of an entry with
!         an autogenerated key without disturbing the user with unwanted
!         messages).
!         (bibtex-help-message): New variable to avoid printing of help
!         messages in the echo area.
!         (assoc-of-regexp): New function to match an alist of regexps.
!         (bibtex-string-files, bibtex-completion-candidates, bibtex-mode):
!         New variables to allow bibtex-complete-string to work on strings
!         initialized from a variable and from @String definitions in a list
!         of files, too.
!         (bibtex-predefined-strings, bibtex-entry-field-alist): Changed to
!         user options.
!         (bibtex-mode): Changed doc string.
!         (many functions and variables): Changed documentation strings of
!         variables and functions to hold a complete sentence in the first
!         line.
!         (bibtex-print-help-message): Now line dependent and reports if it
!         is called outside a BibTeX field.
!         (validate-bibtex-buffer): Completely rewritten to validate, if
!         buffer is syntactically correct.
!         (find-bibtex-duplicates): Moved into validate-bibtex-buffer.
!         (ispell-abstract, bibtex-ispell-abstract, ispell-bibtex-entry,
!         bibtex-ispell-entry, beginning-of-bibtex-entry,
!         bibtex-beginning-of-entry, end-of-bibtex-entry,
!         bibtex-end-of-entry, hide-bibtex-entry-bodies,
!         bibtex-hide-entry-bodies, narrow-to-bibtex-entry,
!         bibtex-narrow-to-entry, sort-bibtex-entries, bibtex-sort-entries,
!         validate-bibtex-buffer, bibtex-validate-buffer,
!         find-bibtex-entry-location, bibtex-find-entry-location): All
!         interactive functions are renamed, so that any interface function
!         begins with "bibtex-". Mapping:
!         ispell-abstract            --> bibtex-ispell-abstract
!         ispell-bibtex-entry        --> bibtex-ispell-entry
!         beginning-of-bibtex-entry  --> bibtex-beginning-of-entry
!         end-of-bibtex-entry        --> bibtex-end-of-entry
!         hide-bibtex-entry-bodies   --> bibtex-hide-entry-bodies
!         narrow-to-bibtex-entry     --> bibtex-narrow-to-entry
!         sort-bibtex-entries        --> bibtex-sort-entries
!         validate-bibtex-buffer     --> bibtex-validate-buffer
!         find-bibtex-entry-location --> bibtex-find-entry-location
!         (bibtex-maintain-sorted-entries,
!         bibtex-sort-ignore-string-entries): Default is now t.
!         (bibtex-complete-string): String list is built from additional
!         string list bibtex-predefined-string and current strings in file.
!         (string-equalp): Deleted and substituted by string-equal.
!         (assoc-string-equalp): Renamed to assoc-ignore-case.
!         (bibtex-entry): Reference key can be entered with completion. All
!         reference keys that are defined in buffer and all labels that
!         appear in crossreference entries are object to completion.
!         (Entry types): Changed order of entries in menu "entry types".
!         (bibtex-entry-field-alist): Changed order of entries slightly to
!         be more conform with standard BibTeX style layouts.
!         (bibtex-mode-map): Uniform keybindings for \C-c\C-e prefix (often
!         used types on control keys, sometimes used types on normal keys,
!         rarely used types on shift keys, almost never used types on meta
!         keys).
!         (bibtex-mode-map): Function narrow-to-bibtex-entry and counterpart
!         widen and function hide-bibtex-entry-bodies and counterpart
!         show-all bounded to appropriate local keys.
!         (bibtex-abbrev-table): Deleted
!         (bibtex-current-entry-label, put-string-on-kill-ring): Deleted
!         (AUCTeX provides all the functionality needed for citation
!         completion).
!         (bibtex-enclosing-reference, bibtex-pop-previous, bibtex-pop-next,
!         bibtex-clean-entry): Hacked for speed (bibtex-pop-previous and
!         bibtex-pop-next were to slow for larger BibTeX files).
!         (bibtex-pop-previous, bibtex-pop-next): Delimiters from previous
!         or next entry are changed to actual delimters if necessary.
!         (bibtex-entry): Fixed bug (False entry wasn't reported in error
!         message if bibtex-entry was called with undefined reference name).
!         (bibtex-entry-field-alist, bibtex-entry, bibtex-make-field,
!         bibtex-next-field, bibtex-clean-entry): Every reference entry now
!         contains a comment in addition to the name of the reference. This
!         comment appears in the echo area if you start editing that field
!         (after calling bibtex-next-field).
!         (bibtex-include-OPTcrossref, bibtex-entry): Changed
!         bibtex-include-OPTcrossref from single boolean variable to hold a
!         list of reference names which should have a crossref field.
!         (bibtex-complete-word): New function, which completes word
!         fragment before point to the longest prefix of predefined strings
!         in the buffer in the same way that ispell-complete-word operates
!         for words found in the dictionary.
!         (bibtex-reference-head): Start of bibtex-reference-head changed
!         from "^[ \t]*\\(" to "^\\( \\|\t\\)*\\(" (bibtex-pop-previous and
!         bibtex-pop-next didn't work, probably due to a bug in
!         re-search-forward).
!         (several functions): Added support for {} as field delimiters
!         (better than '"' for accented characters.
!         (bibtex-clean-entry): If optional field crossref is empty or
!         missing, former optional fields (if bibtex-include-OPTcrossref was
!         t) are necessary again. bibtex-clean-entry complains if they are
!         empty but not if they are missing, so you can intenionally omit
!         them, e. g. for a pseudo @Journal entry (needed for
!         crossreferences) made out of an @article with missing non-optional
!         fields.
!         Menu bar entries aren't centered anymore.
! 
! Wed Dec 21 15:07:58 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* facemenu.el (facemenu-key): Change to M-g.
! 
! 	* files.el (save-buffers-kill-emacs): Fix backward test of value of
! 	run-hook-with-args-until-failure's value.
! 
! 	* tex-mode.el (tex-start-shell): Use inheritance.
! 
! Wed Dec 21 15:20:15 1994  Dave Love  <d.love@dl.ac.uk>
! 
!         * gud.el (gud-irixdbx-marker-filter): Changes for Irix dbx.
!         (dbx): gud-up, gud-down are now special cases for Irix.
! 
! Wed Dec 21 11:33:45 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* dired.el (dired-string-replace-match): Function moved here.
! 	* dired-aux.el (dired-string-replace-match): Moved to dired.el.
! 
! Wed Dec 21 10:54:38 1994  Ed Reingold  <reingold@albert.gnu.ai.mit.edu>
! 
!         * tex-mode.el (tex-shell-map,tex-start-shell): Start with
!         shell-mode-map.
! 
! Wed Dec 21 09:35:24 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* help.el (describe-function): Don't add `.el' when printing file name.
! 
! Tue Dec 20 10:41:02 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* bytecomp.el (byte-compile-dest-file): New variable.
! 	(byte-compile-file): Bind that var, early on.
! 	(byte-compile-dynamic): New variable.
! 	(byte-compile-dynamic-docstrings): New variable.
! 	(byte-compile-close-variables): Bind byte-compile-dynamic,
! 	byte-compile-dynamic-docstrings, and byte-compiler-compatibility.
! 	(byte-compile-file): Call normal-mode, not set-auto-mode.
! 	(byte-compile-output-docform): New arguments PREFACE, NAME, SPECINDEX,
! 	QUOTED.  Callers changed.  Output doc strings as references to the .elc
! 	file itself, using #@ and #$ constructs.
! 	(byte-compile-output-as-comment): New function.
! 
! 	* bytecomp.el (byte-compile-insert-header): Don't save-excursion.
! 	Insert at point, and move point.  Insert extra newline at end.
! 	(byte-compile-from-buffer): Insert the header before compilation.
! 
! 	* buff-menu.el (Buffer-menu-buffer): Clear text properties in STRING.
! 
! 	* faces.el (frame-update-face-colors): New function.
! 	* frame.el (set-background-color, set-foreground-color):
! 	Call frame-update-face-colors.
! 
! 	* rmail.el (rmail-first-unseen-message): Fix 1-off error.
! 
! Mon Dec 19 14:09:46 1994  Ed Reingold  <reingold@albert.gnu.ai.mit.edu>
! 
!         * tex-mode.el (tex-start-shell): Use comint prompt and mode-map.
! 
! Sun Dec 18 12:39:58 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* rmail.el (rmail-search-backward): Function deleted.
! 	(rmail-mode-map): Use rmail-search-backwards instead.
! 
! Sun Dec 18 14:16:39 1994  Lawrence R. Dodd  (dodd@roebling.poly.edu)
! 
! 	* fortran.el (fortran-end-if, fortran-end-do,
! 	fortran-beginning-if, fortran-beginning-do): New subroutines.
! 	(fortran-blink-matching-if, fortran-blink-matching-do): Use them.
! 	(fortran-mark-do, fortran-mark-if): New user functions.
! 	(fortran-blink-matching-if, fortran-mode): Doc mod.
! 
! Sun Dec 18 14:59:55 1994  Morten Welinder  <terra@diku.dk>
! 
! 	* tar-mode.el (tar-extract): Don't use set-visited-file-name.  to
! 	avoid interaction problems with ange-ftp.
! 
! Fri Dec 16 19:50:24 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* rnewspost.el (news-mail-reply): Restore the saved narrowing
! 	before calling `mail'.
! 
! Thu Dec 15 07:15:27 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* emerge.el (emerge-read-file-name): New arg must-match.
! 	(emerge-files, emerge-files-with-ancestor): Pass new arg.
! 
! 	* isearch.el (isearch-done): Don't print msg about mark
! 	if we don't set it.  Fix paren error.
! 
! 	* subr.el (lambda): Doc fix.
! 
! 	* vc-hooks.el (vc-toggle-read-only): Accept prefix arg
! 	and pass it along to vc-next-action.
! 
! 	* font-lock.el (font-lock-hack-keywords): Turn off undo generation.
! 	(font-lock-unfontify-region. font-lock-fontify-region): Likewise.
! 
! 	* c-mode.el (indent-c-exp): Don't be fooled by else_ or while_.
! 	(c-indent-line): Likewise.
! 	(c-backward-to-start-of-if): Don't be fooled by if_ or else_.
! 
! 	* sendmail.el (sendmail-send-it): Don't convert S: to Subject:.
! 
! 	* faces.el (face-initialize): Test for framep not t or nil.
! 
! 	* files.el (hack-local-variables): Run hack-local-variables-hook.
! 	(hack-local-variables-hook): New variable.
! 
! 	* find-dired.el (find-grep-options): Use -q on non-BSD systems.
! 
! Wed Dec 14 14:58:59 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* find-dired.el (find-ls-option): Don't ask for inode numbers.
! 
! 	* apropos.el (apropos-match-keys): Handle menu bindings
! 	with cached equivalent keys.
! 
! 	* rmail.el (rmail-ignored-headers): Delete junk from definition.
! 
! Tue Dec 13 17:20:12 1994  Don Woods  (don@genmagic.com)
! 
! 	* replace.el (perform-replace):
! 	Report number of replacements when done.
! 	(query-replace, query-replace-regexp, replace-string)
! 	(map-query-replace-regexp. replace-regexp): No message here.
! 
! Tue Dec 13 13:40:41 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* informat.el (Info-split): Fix 1-off error in subfile position.
! 
! 	* replace.el (occur): Escape newlines when printing regexp.
! 
! 	* informat.el (Info-tagify): Avoid 1-off error in position of a tag.
! 
! 	* macros.el (insert-kbd-macro): Specially handle C-\, M-\ and C-M-\.
! 	Only convert the character syntax if definition is a string.
! 
! Sun Dec 11 16:22:26 1994  Richard Stallman  <rms@kepa>
! 
! 	* rmailsum.el (rmail-summary-goto-msg): When highlighting,
! 	don't skip 1st char on line if it isn't a space.
! 
! 	* gnusmail.el (gnus-mail-reply-using-mail): Don't save point;
! 	yank the original at point.
! 
! 	* apropos.el (apropos-match-keys): Handle minor mode maps
! 	and overriding-local-map.
! 
! Sat Dec 10 18:03:42 1994  Richard Stallman  <rms@kepa>
! 
! 	* vc.el (vc-dir-all-files): New function.
! 	(vc-directory): Show just one directory by default.
! 	Read dir name in minibuffer.
! 	(vc-directory-18): Deleted.
! 
! Fri Dec  9 20:59:52 1994  Ken Stevens  <stevensk@afit.af.mil>
! 
! 	* ispell.el: Added ispell-offset for version consistency.
! 	(ispell-dictionary-alist): updated dictionaries & better match defaults
! 	(ispell-alternate-dictionary): added /usr/shar path
! 	(ispell-menu-map-needed): redo changes that made this incompatible
!         with earlier versions of emacs19.
! 	(ispell-required-version): changed to assure version 3.1.12 accessed.
! 	(ispell-word): Correctly accept buffer-local information.
!         Does not try to modify read-only buffer on 'm' command.
! 	(ispell-command-loop): fixed bug that corrupted buffers.
!         removed scrolling when *Choices* buffer shrinks.
! 	(check-ispell-version): Correctly identifies new version requirements.
! 	(ispell-region): Interaction updated for version 3.1.12+
! 	Buffer read-only modification improvement.  Dictionary messages added.
! 	(ispell-message-text-end): skips additional shell files.
! 	(ispell-buffer-local-parsing): extended-char mode now matches text mode
! 
! Fri Dec  9 01:14:03 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* hilit19.el: Add patterns for asm-mode.
! 
! 	* files.el (set-auto-mode): Don't get confused by anything ending
! 	in "mode:" which isn't a mode spec.
! 
! Fri Dec  9 00:03:18 1994  Richard Stallman  <rms@green-hill>
! 
! 	* rlogin.el (rlogin-initially-track-cwd): Now a 3-way flag.
! 	(rlogin): Handle that.
! 
! Thu Dec  8 15:31:50 1994  Richard Stallman  <rms@bethel>
! 
! 	* files.el (ignored-local-variables): Mark it risky.
! 
! Thu Dec  8 13:51:43 1994  Ed Reingold  <reingold@albert.gnu.ai.mit.edu>
! 
!         * cal-mayan.el (calendar-mayan-days-before-absolute-zero): Mention
!         Hochleitner's correlation.
! 
! Wed Dec  7 21:47:48 1994  Richard Stallman  <rms@green-hill>
! 
! 	* telnet.el (telnet): Don't make assumptions about process name.
! 	(telnet-send-process-next-char): Renamed from send-...
! 
! 	* nntp.el (nntp-buggy-select): Delete usg-unix-v from list.
! 
! Wed Dec  7 19:25:27 1994  Richard Stallman  <rms@bethel>
! 
! 	* dired.el (dired-insert-directory): Quote certain chars with \.
! 	(dired-get-filename): Always unquote \ quoting.
! 
! 	* comint.el (comint-mode-map): Treat C-up, C-down like M-p, M-n.
! 
! Tue Dec  6 17:39:14 1994  Richard Stallman  <rms@kepa>
! 
! 	* simple.el (buffer-quit-function): New variable.
! 	(keyboard-escape-quit): Use it.
! 
! 	* loaddefs.el: Delete ESC ESC binding for eval-expression.
! 	(function-key-map): Map C-delete into M-DEL.
! 
! Mon Dec  5 19:17:54 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* ange-ftp.el (ange-ftp-set-binary-mode): Ignore hash size if nil.
! 	(ange-ftp-set-ascii-mode): Likewise.
! 
! Mon Dec  5 19:17:20 1994  Richard Stallman  <rms@green-hill>
! 
! 	* ebuff-menu.el (electric-buffer-menu-mode-map):
! 	Bind ESC ESC ESC to Electric-buffer-menu-quit.
! 
! 	* loaddefs.el (minibuffer-local-map): Bind up and down to history cmds.
! 	(minibuffer-local-ns-map, minibuffer-local-completion-map): Likewise.
! 	(minibuffer-local-must-match-map): Likewise.
! 
! 	* isearch.el (isearch-cancel): New function.
! 	(isearch-mode-map): Bind that to ESC ESC ESC.
! 	Move the code to set up the meta submap earlier in the expression.
! 
! 	* loaddefs.el (function-key-map): Map f1 to C-h.
! 
! 	* simple.el (delete-completion-window): New function.
! 	(completion-list-mode-map): Bind that to ESC ESC ESC.
! 
! 	* simple.el (keyboard-escape-quit): Bind this globally to ESC ESC ESC.
! 
! Mon Dec  5 08:40:29 1994  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
! 
! 	* font-lock.el (font-lock-after-change-function): Undo Oct 18 change.
! 
! Sun Dec  4 12:52:32 1994  Richard Stallman  <rms@kepa>
! 
! 	* fill.el (fill-region-as-paragraph): If region starts in mid-line,
! 	don't fill the text before that, but count it for indentation.
! 	(fill-region): If region starts in mid-line, keep whole line
! 	in the region, but pass the region start to fill-region-as-paragraph.
! 
! 	* faces.el (set-face-font): Pass `default' as face to x-resolve-font-name.
! 	(x-resolve-font-name): Better error message when FACE doesn't specify
! 	the font.
! 
! 	* faces.el: At compile time, discard any defsubr definitions
! 	in the Emacs doing the compilation.
! 
! 	* bibtex.el (bibtex-mode-map): Delete binding for ".
! 	Don't load in tex-insert-quote.
! 
! 	* faces.el (face-name, face-id, face-foreground, face-background)
! 	(face-font, face-stipple, face-underline-p): Change defsubst to defun.
! 	(set-face-font, set-face-foreground, set-face-background)
! 	(set-face-stipple, set-face-underline-p): Change defsubst to defun.
! 
! 	* replace.el (replace-string, query-replace): Doc fixes.
! 
! Sat Dec  3 18:13:44 1994  Richard Stallman  <rms@kepa>
! 
! 	* rmail.el (rmail-get-new-mail): Position on first unseen message.
! 	Return t if actually got new mail.
! 	(rmail): Show rmail-first-unseen-message if got no new mail.
! 
! Thu Dec  1 21:07:06 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* rmailout.el (rmail-output): Don't quote "From " lines unless the
! 	capitalization is exact.
! 
! Thu Dec  1 09:00:40 1994  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
! 
! 	* font-lock.el (font-lock-make-faces): Added font-lock-reference-face
! 	defaults for grayscale.
! 
! Wed Nov 30 15:54:14 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* sendmail.el (sendmail-send-it): Add `From:' header.
! 	(mail-from-style): New variable.
! 
! 	* gud.el (gud-basic-call): Detect error earlier.
! 
! 	* term/x-win.el (system-key-alist): Extra keys are F36 and F37.
! 
! 	* edebug.el (edebug-enter): Add save-excursion so that
! 	buffer-local variables will reset properly.
! 
! Wed Nov 30 15:47:08 1994  Ake Stenhoff  <etxaksf@aom.ericsson.se>
! 
! 	* imenu.el (imenu-generic-expression): New variable.
! 	(imenu-example--generic-c++-expression): New variable.
! 	(imenu-example--generic-texinfo-expression): New variable.
! 	(imenu-example--generic-latex-expression): New variable.
! 	(imenu-example--create-c++-index): Deleted.
! 	(imenu-example--function-name-regexp-c++): Deleted.
! 	(imenu--generic-function): New function.
! 	(imenu--generic-extract-name): New function.
! 	(imenu-default-create-index-function): Added the generic
! 	function calls for the provided examples.
! 
! Wed Nov 30 14:37:55 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
! 
! 	* compile.el (compilation-next-error-locus): Parsed column numbers
!         are 1-origin.
! 
! Tue Nov 29 15:22:33 1994  Richard Stallman  <rms@bethel>
! 
! 	* complete.el (PC-do-completion): If complete but not unique,
! 	the second time in a row, give a list of completions.
! 	(PC-do-complete-and-exit, PC-do-completion): Use [...] in messages.
! 
! Tue Nov 29 10:59:07 1994  Ed Reingold  <reingold@albert.gnu.ai.mit.edu>
! 
!         * cal-x.el: New file.
! 
!         * calendar.el: Mention cal-x.el in comments.
! 
! Mon Nov 28 13:15:01 1994  Richard Stallman  <rms@bethel>
! 
! 	* simple.el (keyboard-escape-quit): Don't make keybinding yet.
! 
! 	* iso-cvt.el: Handle pilcrow, paragraph and pound signs.
! 	Use \aa, \AA for a-with-ring.
! 
! 	* c-mode.el (calculate-c-indent): Handle a top-level decl with multiple
! 	paren groups.
! 
! 	* paths.el (gnus-default-nntp-server): Doc fix.
! 
! 	* gnus.el: Many doc fixes.  Fix progress message formats.
! 	(gnus-article-prev-digest): Rename arg to n.
! 	(gnus-summary-next-digest, gnus-summary-prev-digest): Likewise.
! 	(file-newer-than-file-p): Definition deleted.
! 
! Thu Nov 24 11:16:51 1994  Ake Stenhoff  <etxaksf@aom.ericsson.se>
! 
! 	* imenu.el (imenu): Widen temporary before scan the file.
! 	Widen if the user asks to move to an object
! 	that is outside the current accessible region.
! 
! Thu Nov 24 03:37:55 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* simple.el (beginning-of-buffer, end-of-buffer):
! 	With argument, calculate fraction wrt accessible portion of buffer.
! 
! 	* replace.el (occur): Put number of matches in the header line.
! 
! Wed Nov 23 03:10:00 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* double.el (double-mode-name): Variable deleted.
! 	(minor-mode-alist): Use a constant string to indicate Double mode.
! 
! 	* info.el (Info-follow-reference): Use regexp-quote.
! 
! 	* simple.el (keyboard-escape-quit): New command.  On ESC ESC ESC.
! 
! 	* replace.el (query-replace-map): Define \e and escape as exit-prefix.
! 	(perform-replace): When exiting and rereading, set
! 	this-command to mode-exit.
! 
! 	* map-ynp.el (map-y-or-n-p): Handle exit-prefix as definition of char.
! 
! 	* loaddefs.el (global-map): Add bindings for C-left and C-right.
! 
! Tue Nov 22 14:19:25 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* term/x-win.el (Calling menu-bar-enable-clipboard):
! 	Be less selective matching Suns.
! 
! 	* lpr.el (lpr-page-header-switches): Use -f by default.
! 	(lpr-headers-switches): Make it a list.
! 
! 	* simple.el (append-to-buffer): Don't use current buffer as default.
! 
! Tue Nov 22 06:44:09 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
! 
! 	* vc.el (vc-checkout-switches): New variable.
! 	(vc-backend-checkout): Use it.
! 
! Mon Nov 21 23:37:26 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* gud.el (gud-gdb-marker-filter, gud-irixdbx-marker-filter)
! 	(gud-perldb-marker-filter, gud-mipsdbx-marker-filter):
! 	No need for save-match-data.
! 
! 	* timer.el (timer-process-filter): No need for save-match-data.
! 
! 	* man.el (Man-bgproc-sentinel): No need for save-match-data.
! 
! Mon Nov 21 12:38:05 1994  Per Bothner  <bothner@kalessin.cygnus.com>
! 
! 	* term.el (term-termcap-format):  Add cd capability.  Fix ei.
! 	(term-exec-1): Pass $TERMINFO instead of $TERMCAP if appropriate.
! 	Pass emacs-version and term-version in $TERM.
! 	Rewrite to set process-environment.
! 
! Sun Nov 20 15:08:10 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* compare-w.el (compare-windows): Push mark in both buffers at start.
! 
! 	* loaddefs.el (global-map): Change home and end bindings to
! 	beginning/end-of-line.  Put beginning/end-of-buffer on C-home/end.
! 
! Sat Nov 19 02:51:24 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* term/x-win.el (x-option-alist): New variable now holds
! 	list of short options.  Don't set command-switch-alist.
! 	(x-long-option-alist): New variable.
! 	(x-handle-args): Detect long options and convert to short.
! 
! 	* startup.el (command-line-1): Handle long options
! 	--funcall, --load, --insert, --kill.
! 	(command-line): Don't leave argval set if option not really a long one.
! 
! 	* gomoku.el (gomoku-click): New function.
! 	(gomoku-mode-map): Put it on Mouse-2.
! 
! 	* subr.el (start-process-shell-command): Don't use `exec'--
! 	run the command in a child process.
! 
! 	* find-dired.el (start-process-shell-command): Function deleted.
! 
! 	* simple.el (kill-region): Use = to compare positions.
! 
! Fri Nov 18 11:40:36 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* picture.el (picture-self-insert): Use last-command-event,
! 	not last-input-char.
! 	(picture-mode-map): Make the keymap vector 256 chars long.
! 	Fix typo `newline-andindent'.
! 
! 	* bytecomp1.el: New file.
! 	(batch-byte-compile-emacs): New function.
! 
! 	* sendmail.el (mail-setup): Make fill-column wide for the in-reply-to.
! 
! Fri Nov 18 02:45:24 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* simple.el (kill-region): Set this-command unconditionally.
! 
! Thu Nov 17 11:12:36 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* faces.el (face-color-supported-p): New function.
! 	(face-try-color-list): Use that.
! 
! 	* timer.el (timer-process-filter): Use save-match-data.
! 
! 	* files.el (backup-buffer): Use file-ownership-preserved-p.
! 
! Wed Nov 16 10:18:32 1994  Michael Ernst  <mernst@research.microsoft.com>
! 
! 	* rmailsum.el (rmail-summary-scroll-msg-up): If at end of message,
! 	advance to the next message.
! 	(rmail-summary-scroll-msg-down): If at beginning of message,
! 	advance to the previous message.
! 
! Wed Nov 16 09:26:05 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* timezone.el (timezone-parse-date): Handle two new formats (6 and 7).
! 
! 	* subr.el (substitute-key-definition): Don't recursively scan
! 	where OLDMAP has a submap but KEYMAP does not.
! 
! 	* dired-aux.el (dired-collect-file-versions): Discard version #s from
! 	arg; then do nothing if already in dired-file-version-alist.
! 
! Tue Nov 15 16:03:38 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
! 
! 	* etags.el (tags-query-replace): Use query-replace-read-args in
!         interactive spec.
! 
! Tue Nov 15 11:50:31 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* isearch.el (isearch-unread): Always use unread-command-events.
! 	(isearch-other-meta-char): In the case of a mouse event with a dummy
! 	prefix, recombine the two into a single event before unreading.
! 	(isearch-gnu-emacs-events): Variable deleted.
! 	(isearch-update): Always test unread-command-events.
! 	(isearch-event-data-type): Variable deleted.
! 	(isearch-pre-command-hook-exists): Variable deleted.
! 	(isearch-last-command-char): Only use last-command-char.
! 	(isearch-other-meta-char): Delete debugging code.
! 	(isearch-mode): Use baud-rate as variable.
! 	(isearch-char-to-string): Simplify--assume character is an integer.
! 
! Tue Nov 15 11:16:57 1994  Ed Reingold  <reingold@albert.gnu.ai.mit.edu>
! 
! 	* calendar.el (calendar-mode-map): Undefine kill-region and
! 	copy-region-as-kill.
! 
! 	* cal-menu.el (calendar-mode-map): Get rid of edit menu.
! 
! Tue Nov 15 09:07:58 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* mouse.el (mouse-save-then-kill): Call mouse-show-mark
! 	when we adjust an existing region.
! 
! 	* lucid.el (set-keymap-parent): Fix bug in case of empty keymap.
! 	(switch-to-other-buffer): Fix one-off error.
! 
! Mon Nov 14 23:16:44 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* thingatpt.el (line): Add a beginning-op function.
! 
! Mon Nov 14 21:38:14 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
! 
! 	* etags.el (tags-table-including): Don't gratuitously cons (what
! 	was I thinking?).  Properly skip t elements of
! 	tags-table-computed-list.
! 
! Mon Nov 14 13:53:16 1994  Jim Blandy  <jimb@totoro.bio.indiana.edu>
! 
! 	* scheme.el (scheme-mode-variables): Set
! 	parse-sexp-ignore-comments to t.
! 
! Mon Nov 14 03:03:55 1994  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
! 
! 	* font-lock.el (font-lock-defaults-alist): Defaults for scheme-mode.
! 
! Sun Nov 13 07:15:02 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* rmailout.el (rmail-fields-not-to-output): New variable.
! 	(rmail-delete-unwanted-fields): New function.
! 	(rmail-output, rmail-output-to-rmail-file): Call it.
! 
! 	* replace.el (query-replace-map): Bind Y and N like y and n.
! 
! 	* loadup.el: For windows-nt, load mouse.
! 
! 	* lpr.el (lpr-headers-switches): Base default on lpr-command value.
! 
! Fri Nov 11 08:33:25 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* comint.el (comint-exec-1): Terminate TERMCAP with colon.
! 
! 	* texinfmt.el (texinfo-format-node): Insert the node delimiter
! 	that info is looking for unconditionally.
! 
! Thu Nov 10 18:01:30 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
! 
! 	* compile.el (compile): With prefix arg, prompt even if (not
!         compilation-read-command).
! 	(compilation-error-regexp-alist): Make first regexp match column
! 	numbers too.  Remove regexp for "prog:file:line: error".  Replace
! 	GNAT 1.82 regexp with "prog: file:line\(:col\)?: error".
! 	(compilation-parse-errors): If spec has a column subexpr, but it
! 	was optional and didn't match, ignore it.
! 
! Thu Nov 10 17:01:15 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* add-log.el (find-change-log): If change-log-default-name
! 	has no dir component, search through parent dirs for it.
! 
! Wed Nov  9 15:17:41 1994  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* ange-ftp.el (ange-ftp-version): Var deleted.
! 
! 	* rect.el (string-rectangle): Don't set point.
! 
! 	* simple.el (copy-region-as-kill): Don't set this-command.
! 
! Wed Nov  9 07:57:35 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
! 
! 	* vc-hooks.el: Only define items in vc-menu-map if it is boundp.
! 
! Wed Nov  9 07:46:23 1994  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* compile.el (compilation-error-regexp-alist):
! 	Add an element for Irix 5.2 warnings.
! 
! Wed Nov  9 12:56:23 1994  Francesco Potorti`  (pot@cnuce.cnr.it)
! 
! 	* man.el (Man-berkeley-sed-script, Man-sysv-sed-script,
! 	Man-cleanup-manpage, Man-fontify-manpage): Handle the "+\bo" form
! 	(used by aix) in addition to the "o\b+" one (used by sun).
! 
! Wed Nov  9 00:32:23 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* vi.el (vi-kill-region): Pass args to kill-region.
! 	(vi-mark-region): Don't pass unexpected args.
! 
! 	* apropos.el (apropos-print-matches): Set help-mode in *Help* buffer.
! 	* calendar.el (describe-calendar-mode): Likewise.
! 	* case-table.el (describe-buffer-case-table): Likewise.
! 	* debug.el (debugger-list-functions): Likewise.
! 	* disp-table.el (describe-display-table): Likewise.
! 	* emerge.el (emerge-file-names): Likewise.
! 	[commented out] (describe-mode): Likewise.
! 	* help-macro.el (make-help-screen): Likewise.
! 	* help.el (describe-key, describe-mode, view-lossage): Likewise.
! 	(describe-function, describe-variable): Likewise.
! 	* helper.el (Helper-describe-mode): Likewise.
! 	* info.el (Info-summary): Likewise.
! 	* macros.el (kbd-macro-query): Likewise.
! 	* map-ynp.el (map-y-or-n-p): Likewise.
! 	* novice.el (disabled-command-hook): Likewise.
! 	* refbib.el (r2b-help): Likewise.
! 	* replace.el (perform-replace): Likewise.
! 	* simple.el (set-variable): Likewise.
! 	* supercite.el (sc-set-variable): Likewise.
! 	* upd-copyr.el (update-copyright): Likewise.
! 	* userlock.el (ask-user-about-lock-help): Likewise.
! 	(ask-user-about-supersession-help): Likewise.
! 	* vi.el (vi-switch-mode, vi-ex-cmd): Likewise.
! 	* yow.el (yow): Likewise.
! 
! Tue Nov  8 11:23:46 1994  Ed Reingold  <reingold@albert.gnu.ai.mit.edu>
! 
! 	* calendar.el (diary-entry-marker, calendar-today-marker,
! 	calendar-holiday-marker): Don't supersede attributes for faces
! 	`diary-face', `calendar-display-face', or `holiday-face' if they
! 	are already defined.
! 
! Tue Nov  8 00:00:10 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* help.el (help-mode): New function.
! 	(help-mode-map): Local keymap for help-mode.  Empty for now.
! 	(print-help-return-message): Fix misspelled var.
! 
! Mon Nov  7 11:39:27 1994  Ed Reingold  <reingold@albert.gnu.ai.mit.edu>
! 
!         * solar.el (solar-sunrise-sunset): Check for nil time before
! 	trying to adjust it for dst.
! 
! Mon Nov  7 12:28:15 1994  Francesco Potorti`  (pot@cnuce.cnr.it)
! 
! 	* man.el (Man-reuse-okay-flag): Deleted.
! 	(man, Man-getpage-in-background): Second arg deleted.
! 	References to Man-reuse-okay-flag deleted.
! 	(Man-follow-manual-reference): First arg deleted.  Call
! 	Man-getpage-in-background with one argument only.
! 
! Fri Nov  4 21:13:09 1994  Ethan Bradford  <ethanb@u.washington.edu>
! 
! 	* gnus.el (gnus-configure-windows): Make split-window-keep-point
! 	locally t so that focus doesn't occasionally move to the wrong
! 	window on split-window-vertically.
! 
! Thu Nov  3 16:22:47 1994  Geoff Voelker  <voelker@cs.washington.edu>
! 
! 	* subr.el (start-process-shell-command): Don't use exec on windows-nt.
! 
! Thu Nov  3 15:34:33 1994  Ralf Fassel  <ralf@prl.philips.nl>
! 
! 	* tar-mode.el (tar-extract): Set default-directory to that of the
! 	superior buffer, not the pseudo-dir formed from the archive name.
! 
! Thu Nov  3 15:29:12 1994  Rick Sladkey  <jrs@world.std.com>
! 
! 	* gud.el (gud-gdb-complete-command): Add a trailing single
! 	quote to partially quoted unique completions.
! 
! Thu Nov  3 10:31:08 1994  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
! 
! 	* font-lock.el (font-lock-fontify-region): Wrap string-match with
! 	save-match-data.
! 
! Tue Nov  1 04:53:54 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* comint.el (comint-exec-1): Make sure default-directory is a real dir.
! 
! 	* bytecomp.el (byte-compile-insert-header): Escape backslashes
! 	in FILENAME when putting it inside a string constant.
! 
! Mon Oct 31 13:47:05 1994  voelker  <voelker@cs.washington.edu>
! 
! 	* makefile.nt: New file.
! 
! 	* winnt.el: New file.
! 
! 	* bytecomp.el (byte-compile-file): Treat windows-nt like ms-dos.
! 
! 	* hexl.el (hexl-find-file): Treat windows-nt like ms-dos.
! 
! 	* simple.el (shell-command-switch): New variable.
! 	(shell-command, shell-command-on-region): Use new variable.
! 
! 	* info.el (Info-directory-list): Treat windows-nt like ms-dos.
! 
! 	* startup.el (command-line): Use ~/_emacs as init file in windows-nt.
! 
! 	* loadup.el: On windows-nt, load ls-lisp and winnt.
! 	Treat windows-nt like ms-dos for DOC file name.
! 
! 	* loaddefs.el (completion-ignored-extensions):
! 	Treat windows-nt like ms-dos.
! 
! 	* files.el (abbreviate-file-name):
! 	Handle drive letters on windows-nt as on ms-dos.
! 
! 	* desktop.el (desktop-basefilename): Use emacs.dsk on windows-nt.
! 
! 	* bookmark.el (bookmark-file): Use ~/emacs.bmk on windows-nt.
! 
! 	* add-log.el (change-log-name): Use changlo on windows-nt.
! 
! Mon Oct 31 23:38:21 1994  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* bytecomp.el (byte-compile-file): Check for windows-nt like ms-dos.
! 
! Mon Oct 31 21:19:19 1994  Ed Reingold  <reingold@albert.gnu.ai.mit.edu>
! 
! 	* diary-lib.el (view-diary-entries): Fix error message.
! 	(view-other-diary-entries): New function.
! 
! 	* calendar.el (calendar-mode-map): Bind it to key.
! 
! 	* cal-menu.el (calendar-mouse-view-other-diary-entries): New function.
! 	(calendar-mode-map): Put them on mouse.
! 
! Mon Oct 31 20:28:49 1994  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* comint.el (comint-read-noecho): Use `read-char-exclusive'
! 	instead of `read-char'.
! 
! Sun Oct 30 04:11:05 1994  Erik Naggum  <erik@naggum.no>
! 
! 	* simple.el (blink-matching-delay): New variable.
! 
! 	* isearch.el (isearch-edit-string, isearch-toggle-case-fold):
! 	Pass isearch-nonincremental to isearch-message-prefix.
! 
! 	* cl.el (cl-macroexpand): Copy documentation from `macroexpand'.
! 
! 	* timezone.el (timezone-world-timezones): Add "UT" -> +000.
! 
! Sun Oct 30 16:06:47 1994  Ed Reingold  <reingold@albert.gnu.ai.mit.edu>
! 
!         * calendar.el (calendar-mode): Delete to window configuration var.
! 
! Sun Oct 30 01:38:26 1994  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* texinfmt.el (texinfo-format-scan): Make @- vanish; don't insert -.
! 	(texinfo-format-soft-hyphen): New function.
! 	(texinfo-alias-list): New variable.
! 	(texinfo-format-region, texinfo-format-buffer-1):
! 	Clear texinfo-alias-list.
! 	(texinfo-format-scan): Implement @alias expansion.
! 
! 	* loadup.el: Load facemenu if have X.
! 	After dumping, print number of pure bytes used.
! 
! 	* mouse.el: Put mouse-set-font on C-down-mouse-1.
! 	Don't bind C-down-mouse-2.
! 	* facemenu.el: Doc fixes.
! 	(facemenu-update): Use C-down-mouse-2 for the menu.
! 
! 	* simple.el (line-move): Use sign of arg to choose error condition.
! 
! Sat Oct 29 20:26:50 1994  Ed Reingold  <reingold@albert.gnu.ai.mit.edu>
! 
! 	* calendar.el (calendar, calendar-other-month): Fix use of
!         calendar-read-date.
! 	(calendar-read-date): Fix noday option.
! 
! 	* lunar.el (phases-of-moon): Fix use of calendar-read-date.
! 
! Sat Oct 29 18:58:41 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* simple.el (blink-matching-open): Do blink if an even number of
! 	quoting characters precede the close.
! 
! Sat Oct 29 07:13:35 1994  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* gud.el (gud-common-init): If file arg has no directory,
! 	let the debugger search PATH, and don't set default-directory.
! 
! Fri Oct 28 19:54:06 1994  Tom Tromey  <tromey@drip.colorado.edu>
! 
! 	* makefile.el: Changed almost every doc string.
! 	(makefile-macroassign-regex): Don't include space and tab in macro
! 	names.
! 
! 	* makefile.el (makefile-backslash-column): New variable.
! 	(makefile-backslash-region): New function.
! 	(makefile-backslashify-current-line): New function.
! 	(makefile-mode-map): Bind C-c C-\ to makefile-backslash-region.
! 
! 	* makefile.el (makefile-tab-face): New variable.
! 	(makefile-font-lock-keywords): Use makefile-tab-face.
! 	(makefile-font-lock-keywords): Use defvar, not defconst.
! 
! Fri Oct 28 10:55:19 1994  Ulrich Mueller  <ulm@vsnhd1.cern.ch>
! 
! 	* iso-acc.el (iso-accents-mode): Variable renamed from
! 	iso-accents-minor-mode.
! 
! Fri Oct 28 01:21:18 1994  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* cal-menu.el (calendar-mode-map):
! 	Define c-down-mouse-3 like down-mouse-3.
! 
! Fri Oct 28 22:49:51 1994  Per Abrahamsen  <abraham@iesd.auc.dk>
! 
! 	* easymenu.el (easy-menu-define): Call `easy-menu-do-define' to do
! 	the real work.  Document XEmacs keyword arguments.
! 	(easy-menu-do-define): New function.
! 	(easy-menu-create-keymaps): Support XEmacs keyword arguments in
! 	menu definition.
! 
! Thu Oct 27 18:33:52 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* files.el (find-file-noselect): Call set-buffer-major-mode here.
! 
! Thu Oct 27 18:42:23 1994  Francesco Potorti`  (pot@cnuce.cnr.it)
! 
! 	* man.el (Man-fontify-manpage-flag): defvar put at outer level.
! 	(manual-program, Man-untabify-command, Man-untabify-command-args,
! 	Man-sed-command, Man-awk-command, Man-mode-line-format,
! 	Man-mode-map, Man-mode-hook, Man-cooked-hook, Man-name-regexp,
! 	Man-section-regexp, Man-page-header-regexp, Man-heading-regexp,
! 	Man-see-also-regexp, Man-first-heading-regexp,
! 	Man-reference-regexp, Man-switches, Man-specified-section-option):
! 	Make them normal defvars, no more user options.
! 	(Man-overstrike-face, Man-undeline-face): New user options.
! 	(Man-init-defvars): Man-fontify-manpage-flag removed from here.
! 	(man-fontify-manpage): Use the new user options above.
! 
! Thu Oct 27 14:27:12 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* tar-mode.el (tar-summarize-buffer): Improperly terminated
! 	archive now produces only a warning.
! 
! Wed Oct 26 16:07:09 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* flow-ctrl.el (enable-flow-control): Make message depend on
! 	customization variables.
! 
! Wed Oct 26 13:57:13 1994  Michael Ernst  <mernst@research.microsoft.com>
! 
! 	* ispell.el (ispell-message-text-end): Match Postcript 3 like 2.
! 
! Wed Oct 26 11:27:01 1994  Ed Reingold  <reingold@albert.gnu.ai.mit.edu>
! 
! 	* cal-menu.el (calendar-mouse-insert-diary-entry): New function.
! 	(calendar-mouse-2-date-menu): Put it on menu.
! 
! 	* diary-lib.el (diary-entry-time): Fix regexps to include TAB.
! 	(diary-ordinal-suffix): Fix indentation of code.
! 
! 	* calendar.el (calendar-offset, lunar-phases-buffer): New vars.
! 	Change defmacros to defsubst for readability, where possible.
! 	(calendar-read-date): Rewritten with optional parameter.
! 	(calendar): Delete mention of window configuration; use new form
! 	of calendar-read-date and calendar-offset.
! 	(describe-calendar-mode): Rewritten to link to info.
! 	(calendar-mode-line-format): Refer to info, not help.
! 	(calendar-mode): Just give keymap.
! 	(calendar-goto-info-node, calendar-window-list,
! 	calendar-buffer-list, calendar-hide-window): New functions.
! 	(calendar-mode-map): Put calendar-goto-info-node on key.
! 	(exit-calendar, calendar-current-date): Rewritten.
! 	(calendar-cursor-to-date): Fix doc string.
! 	(calendar-other-month): Use new form of calendar-read-date.
! 
! 	* holidays.el (check-calendar-holidays): Use new form of
! 	calendar-read-date.
! 
! 	* lunar.el (calendar-phases-of-moon): Use new var lunar-phases-buffer.
! 	(phases-of-moon): Use new form of calendar-read-date.
! 
! 	* solar.el: Fix doc at start of file and error message when
! 	floating point is not available.
! 	(calendar-latitude, calendar-longitude, calendar-location): Include
! 	vector form; suggest setting values in site-local.el.
! 	(solar-sin-degrees, solar-cosine-degrees): Change to macros.
! 	(solar-degrees-to-hours, solar-hours-to-days):  Change to defsubst.
! 	(solar-sunrise, solar-sunset): Allow use of vector forms of
! 	latitude/longitude.
! 	(calendar-latitude, calendar-longitude): New macros to allow use
! 	of vector forms.
! 
! Wed Oct 26 05:32:50 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* dired-x.el (dired-find-subdir): Doc fix.
! 
! Tue Oct 25 21:38:59 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* tar-mode.el (tar-summarize-buffer): Check for end of buffer
! 	before extracting substring.
! 
! Tue Oct 25 16:28:42 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* diff.el (diff-command): New variable.
! 	(diff): Use it.
! 
! 	* frame.el (frame-initialize): Set special-display-function here,
! 	not at top level.
! 
! 	* gud.el (gud-irixdbx-marker-filter): Cast $curline to int.
! 
! Tue Oct 25 09:51:53 1994  Boris Goldowsky  <boris@cs.rochester.edu>
! 
! 	* enriched.el (enriched-mode): Add autoload cookie.
! 	(enriched-decode-foreground, enriched-decode-background): Create
! 	faces even if no window system, to prevent multiple warnings.
! 
! Tue Oct 25 00:46:40 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* ispell.el (ispell-grep-command, ispell-look-command):
! 	Don't specify directory.
! 
! 	* files.el (buffer-file-truename): Doc fix.
! 
! Mon Oct 24 19:29:11 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* term/x-win.el: Make previous change conditional.
! 
! Mon Oct 24 16:32:23 1994  Francesco Potorti`  (pot@cnuce.cnr.it)
! 
! 	* man.el (Man-init-defvars): Do not delete empty lines.
! 
! Mon Oct 24 09:55:43 1994  Boris Goldowsky  <boris@mole.gnu.ai.mit.edu>
! 
! 	* enriched.el: New file.
! 
! Mon Oct 24 13:31:57 1994  Francesco Potorti`  (pot@cnuce.cnr.it)
! 
! 	* man.el (Man-cleanup-manpage): do all the work if called
! 	interactively.
! 
! Sun Oct 23 18:56:40 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
! 
! 	* dired.el (dired-mode-map): Add query-replace and search items to
!         operate menu.
! 
! Sun Oct 23 01:01:41 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* tex-mode.el (latex-mode): Recognize \item etc. that have no arg
! 	because only a comment follows.
! 
! 	* fill.el (fill-individual-paragraphs): Avoid infinite loop
! 	if mailp is set and no message was yanked.
! 
! 	* term/x-win.el: Say error in x-open-connection should be fatal.
! 
! 	* menu-bar.el (menu-bar-file-menu): Add item `Make Frame On Display'.
! 
! 	* menu-bar.el (menu-bar-update-buffers-maxbuf): Declare variable.
! 	(menu-bar-update-buffers-1, menu-bar-update-buffers):
! 	Rename local var maxbuf to menu-bar-update-buffers-maxbuf.
! 
! 	* frame.el (make-frame-on-display): New function.
! 
! 	* faces.el (set-face-background): Set either stipple or color,
! 	never both.  Do this only for a specific frame, not for t.
! 
! 	* sendmail.el (mail-setup): Fill in-reply-to field properly.
! 
! Sat Oct 22 20:52:19 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* faces.el (set-face-background): If color is gray, and frame
! 	can't display that directly, use corresponding stipple.
! 	(face-try-color-list): Assume gray colors are valid on any display.
! 
! Sat Oct 22 11:59:08 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
! 
! 	* dired-aux.el (dired-do-tags-search,
!         dired-do-tags-query-replace): New functions.
! 	* dired.el (dired-mode-map): Bind A to dired-do-tags-search, Q to
! 	dired-do-tags-query-replace.
! 
! Sat Oct 22 11:35:54 1994  Ethan Bradford  <ethanb@u.washington.edu>
! 
! 	* ange-ftp.el (ange-ftp-process-handle-line): Check for a
! 	multi-line message before an error message.  Fixes problem of
! 	thinking there is an error in narrative text.
! 
! Fri Oct 21 03:15:37 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* sendmail.el (sendmail-synch-aliases): Check MAILRC envvar.
! 	(mail-aliases, mail-archive-file-name): Doc fixes.
! 
! 	* mailalias.el (define-mail-alias): Check MAILRC envvar.
! 
! 	* view.el (view-file): Do record the buffer switch.
! 
! 	* help.el (describe-function): Mention the file it was loaded from.
! 	(describe-function-find-file): New function.
! 	(describe-function): Use that.
! 
! 	* gud.el (dbx): Delete call to gud-switch-to-buffer.
! 	(gud-sdb-marker-filter): Handle SVR4 clumped lines.
! 
! 	* emerge.el (emerge-auto-advance): Fix criterion for which message.
! 
! Thu Oct 20 14:48:22 1994  Noah Friedman  <friedman@prep.ai.mit.edu>
! 
!         * timer.el (timer-error, timer-abnormal-termination,
!         timer-filter-error): New error conditions.
!         (timer-process-filter, timer-process-sentinel): Signal an error,
!         don't just print a message.
! 
! Thu Oct 20 20:03:33 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* rmail.el (rmail-get-new-mail): If display-time is in use,
! 	call display-time-filter to update the Mail indicator.
! 
! 	* startup.el (command-line): Set x-cut-buffer-max here.
! 	* term/x-win.el: Not here.
! 
! Thu Oct 20 17:17:53 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
! 
! 	* etags.el (next-file): Initialize next-file-list all at once from
! 	all tables.  Never call visit-tags-table-buffer when INITIALIZE is
! 	not t.
! 
! Thu Oct 20 16:02:12 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* ange-ftp.el (ange-ftp-get-passwd): Use user-mail-address.
! 	(ange-ftp-generate-anonymous-password): Doc fix.
! 
! Thu Oct 20 15:47:05 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* simple.el (edit-and-eval-command): Elements of command-history
! 	are forms, not strings.
! 
! 	* chistory.el (repeat-matching-complex-command): Fix check for
! 	empty pattern.  Simplify.
! 	(default-command-history-filter-garbage): Fix doc string.
! 	(list-command-history-filter, list-command-history-max): Likewise.
! 
! Wed Oct 19 18:03:40 1994  Noah Friedman  <friedman@prep.ai.mit.edu>
! 
!         * timer.el (timer-program): Make defvar, not defconst.
!         Expand name of timer program in exec-directory here.
!         (run-at-time): Not here.
! 
! Wed Oct 19 08:46:03 1994  Boris Goldowsky  <boris@cs.rochester.edu>
! 
! 	* facemenu.el (facemenu-face-menu, facemenu-foreground-menu,
! 	facemenu-background-menu, facemenu-special-menu): New or renamed
! 	variables for submenus.
! 	* facemenu.el (facemenu-color-alist): Renamed from facemenu-colors.
! 	* facemenu.el (facemenu-add-new-face): New function.
! 	* facemenu.el (facemenu-update): Don't redo top-level menu;
! 	nothing should change.  Move menu setup to defvars.  Use
! 	facemenu-add-new-face. Changed global binding to C-down-mouse-3.
! 	* facemenu.el (facemenu-menu): "Update" item removed; should
! 	no longer be needed interactively.
! 	* facemenu.el (facemenu-complete-face-list): Just return faces,
! 	not keybindings.
! 
! Mon Oct 17 09:46:09 1994  Boris Goldowsky  <boris@cs.rochester.edu>
! 
! 	* faces.el (make-face): Add new face to Face menu on creation.
! 
! 	* facemenu.el (facemenu-get-face): Don't add to menu here.
! 
! Fri Oct 14 18:46:28 1994  Francesco Potorti`  (pot@cnuce.cnr.it)
! 
! 	* man.el (Man-init-defvars): Corrections to Man-filter-list.
! 	(Man-fontify-manpage): Added cleaning of ksh manpage daggers.
! 	(Man-fontify-manpage): Added cleaning of ksh manpage daggers.
! 	(Man-bgproc-sentinel): Unconditionally call Man-cleanup-manpage.
! 
! Tue Oct 18 00:59:33 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* term.el (term-exec-1): Put `sane' last in stty cmd.
! 	Redirect stderr to /dev/null.
! 
! 	* files.el (auto-mode-alist): Doc fix.
! 
! 	* font-lock.el (font-lock-after-change-function): If inside a comment,
! 	don't scan for keywords.
! 
! 	* cmuscheme.el (run-scheme): Add autoload cookie.
! 	(scheme): Function deleted.
! 
! 	* xscheme.el (run-scheme): Delete autoload cookie.
! 
! 	* easymenu.el (easy-menu-create-keymaps): Add autoload cookie.
! 
! Mon Oct 17 22:38:13 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* nntp.el (nntp-open-server): Send MODE READER command to server.
! 
! 	* time.el (display-time-filter): Ignore mail-spool-file if not string.
! 
! Mon Oct 17 15:36:03 1994  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
! 
! 	* info.el (info-insert-file-contents): Always check for
! 	conflict with jka-compr.
! 	(Info-find-node): Don't search on Info-directory-list if the
! 	file name is absolute.
! 
! 	* etags.el (etags-tags-table-files, etags-tags-included-tables):
! 	Search backwards for the comma in case the file name contains one.
! 
! Mon Oct 17 08:15:45 1994  Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
! 
!         * paths.el (rmail-spool-directory): Add a condition to test
! 	the Bull DPX/2.
! 
! Mon Oct 17 04:05:11 1994  Morten Welinder  <terra@mole.gnu.ai.mit.edu>
! 
! 	* dos-fns.el (window-frame, raise-frame, select-frame): Clean stubs.
! 	* faces.el (face-initialize): Fill in the faces for non-X frames also.
! 	* info.el (Info-mode): Also use fonts for `pc' window system.
! 	* loadup.el ((eq system-type 'ms-dos)): Rearrange what to load.
! 	((eq system-type 'ms-dos)): Under X, let the documentation be
! 	stored in DOC-X.
! 	* mouse.el (mouse-set-region) [MSDOS]: Give pc-frames the same
! 	treatment as X-frames.
! 	* term/pc-win.el: New file.
! 
! Sun Oct 16 07:15:34 1994  Morten Welinder  <terra@mole.gnu.ai.mit.edu>
! 
! 	* emerge.el (emerge-temp-file-prefix): Try TEMP and TMP as
! 	alternatives for TMPDIR.
! 
! Sun Oct 16 02:16:38 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* faces.el (set-face-stipple): New function.
! 	(set-face-background-pixmap): An alias for that.
! 	(face-stipple): New function.
! 	(face-background-pixmap): An alias for that.
! 	(copy-face, face-equal, face-differs-from-default-p)
! 	(make-face-x-resource-internal): Handle stipple bitmaps.
! 
! 	* simple.el (count-lines): Do save-match-data only when necessary.
! 
! 	* loadup.el: Delete code to write subdirs.el.
! 
! Sat Oct 15 04:32:58 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* rmailsum.el (rmail-summary-delete-forward): Don't move fwd to eob.
! 
! 	* gnus.el (gnus-group-group-name): Get rid of text properties.
! 
! 	* cmuscheme.el (run-scheme): Set scheme-program-name.
! 
! Fri Oct 14 00:49:12 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* sendmail.el (mail-setup): Fill the in-reply-to field.
! 
! 	* subr.el (add-to-list): Doc fix.
! 
! 	* rnewspost.el (news-reply-mode-map): Add C-c C-t binding.
! 
! 	* delsel.el (self-insert-iso): Add delete-selection property.
! 
! 	* font-lock.el (font-lock-fontify-region): Discard leading spaces
! 	from comment-end.
! 
! 	* sendmail.el (mail-do-fcc): If file does not exist,
! 	assume it is not a Babyl file.
! 
! Thu Oct 13 23:26:39 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
! 
! 	* etags.el (tags-reset-tags-tables): New function.
! 
! Thu Oct 13 19:29:35 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* lmenu.el (make-lucid-menu-keymap): Allow Lucid-style keyword-based
! 	menu items.
! 	(popup-menu): Update documentation string to describe the new syntax.
! 
! Thu Oct 13 14:33:51 1994  Morten Welinder  <terra@diku.dk>
! 
! 	* desktop.el (desktop-internal-v2s): Remove all text properties
! 	from strings.
! 
! Thu Oct 13 14:56:05 1994  Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
! 
! 	* hilit19.el (hilit-set-mode-patterns - lisp-mode): Fix regexp
! 	for 'defconstant' that leads to an infinite loop.
! 	Hilight the 'list' keyword.
! 
! Thu Oct 13 04:35:24 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* sendmail.el (mail-file-babyl-p): New function.
! 	(mail-do-fcc): If file is a Babyl file, write output in Babyl format.
! 
! 	* loadup.el (Evaluating top-level): Don't load loadup.el again.
! 
! Thu Oct 13 03:55:51 1994  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
! 
! 	* font-lock.el: Use purify-flag rather than noninteractive.
! 
! Thu Oct 13 02:15:40 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* loadup.el: Move the subdirs.el up to near first thing.
! 
! 	* compile.el (compilation-filter): Do nothing if buffer is dead.
! 
! 	* gud.el (gud-filter): Don't bind inhibit-quit.
! 	Do nothing if buffer is dead.
! 
! 	* texinfmt.el (texinfo-no-refill-regexp): Recognize @ifhtml, @html.
! 	(texinfo-format-ifhtml, texinfo-format-html): New functions.
! 	(texinfo-format-enddots): New function.
! 
! Wed Oct 12 19:16:15 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* simple.el (shell-command, shell-command-on-region):
! 	Rename arg FLAG to OUTPUT-BUFFER and allow it to be a buffer.
! 
! 	* ada.el (ada-mode):
! 	Rename end-comment-column to ada-comment-end-column.
! 	(ada-inline-comment): Likewise.
! 	(ada-comment-end-column): Declare variable.
! 
! 	* appt.el (appt-select-lowest-window): Locally bind lowest-window.
! 	(appt-delete): Don't set tmp-appt-msg-list.
! 
! 	* add-log.el (change-log-mode-map): Move the definition up.
! 
! 	* menu-bar.el (menu-bar-update-buffers-1): New subroutine
! 	broken out of menu-bar-update-buffers.
! 	Truncate the file name and discard the nondirectory part.
! 	(menu-bar-update-buffers): Discard middle of long buffer names.
! 
! 	* subr.el (add-to-list): New function.
! 
! Wed Oct 12 16:49:34 1994  Boris Goldowsky  <boris@cs.rochester.edu>
! 
! 	* facemenu.el (facemenu-read-color, facemenu-colors): New fn, var.
! 	(facemenu-set-face, facemenu-set-face-from-menu,
! 	facemenu-after-change):	Face property can take a list value; add
! 	to it rather than completely replacing the property.
! 	(facemenu-add-face, facemenu-discard-redundant-faces): New functions.
! 
! 	* facemenu.el (facemenu-set-foreground, facemenu-set-background)
! 	(facemenu-get-face, facemenu-foreground, facemenu-background): New
! 	functions and variables.  Faces with names of the form fg:color
! 	and bg:color are now treated specially.
! 	(facemenu-update): Updated for above.
! 
! Wed Oct 12 16:03:14 1994  Jonathan I. Kamens  (jik@gza-client1.cam.ov.com)
! 
! 	* jka-compr.el (jka-compr-mode-compression-info-list): Add .tgz
! 	extension.
! 	(jka-compr-mode-alist-additions): New variable.
! 	(jka-compr-install): Append jka...additions to auto-mode-alist.
! 	(jka-compr-uninstall): Remove jka-...-additions from auto-mode-alist.
! 
! Wed Oct 12 14:36:13 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* rmailsum.el (rmail-summary-previous-all)
! 	(rmail-summary-next-all): Don't move forward to the end of the buffer.
! 
! Wed Oct 12 05:24:00 1994  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
! 
! 	* ada.el (ada-mode-syntax-table): Made `-' and `\n' be comments.
! 	(ada-font-lock-keywords-1, ada-font-lock-keywords-2,
! 	ada-font-lock-keywords): New variables.
! 	(ada-mode): Set font-lock-defaults.
! 
! 	* add-log.el (change-log-mode): Set font-lock-defaults.
! 
! 	* asm-mode.el (asm-mode): Set font-lock-defaults.
! 
! 	* compile.el (compilation-mode): Set font-lock-defaults.
! 
! 	* dired.el (dired-mode): Set font-lock-defaults.
! 
! 	* fortran.el (fortran-mode-syntax-table): Made `!' be a comment.
! 	(fortran-font-lock-keywords-1, fortran-font-lock-keywords-2,
! 	fortran-font-lock-keywords): New variables.
! 	(fortran-mode): Set font-lock-defaults.
! 
! 	* makefile.el (makefile-mode-syntax-table): Made `'' and ``' be
! 	strings, and `#' be a comment.
! 	(makefile-font-lock-keywords): Add variable reference regexp.
! 	(makefile-mode): Set font-lock-defaults.
! 
! 	* outline.el (outline-mode): Set font-lock-defaults.
! 
! 	* pascal.el  (pascal-mode): Set font-lock-defaults.
! 
! 	* perl-mode.el (perl-mode): Set font-lock-defaults.
! 
! 	* rmail.el (rmail-variables): Set font-lock-defaults.
! 
! 	* rmailsum.el (rmail-summary-mode): Set font-lock-defaults.
! 
! 	* sendmail.el (mail-mode): Set font-lock-defaults.
! 
! 	* sh-script.el (sh-set-shell): Set font-lock-defaults.
! 
! 	* shell.el (shell-font-lock-keywords): Add `\n' to [^] regexps.
! 	(shell-mode): Set font-lock-defaults.
! 
! 	* texinfo.el (texinfo-mode): Set font-lock-defaults.
! 
! 	* font-lock.el: To make font-lock.el dumpable.
! 	(font-lock-display-type, font-lock-background-mode)
! 	(font-lock-face-attributes): Default to nil.
! 	(font-lock-make-faces): New function.  Set them.
! 	(font-lock.el): Add to after-init-hook if noninteractive or use it.
! 	(font-lock-maximum-size): New variable.
! 	(font-lock-mode): Use it to fontify only if buffer is within it.
! 	(font-lock-defaults, font-lock-defaults-alist): Item for syntax table.
! 	(font-lock-set-defaults): Set font-lock-syntax-table too.
! 	(lisp-font-lock-keywords-2): Fix CLisp end-of-keyword in regexp.
! 	(c-font-lock-keywords-*): Specific to ANSI C.
! 	(c++-font-lock-keywords-*): Specific to ANSI C++.
! 
! Wed Oct 12 03:22:43 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* mouse.el (mouse-major-mode-menu): Use minor-mode-map-alist
! 	instead of overriding-local-map.  Display equiv keys using
! 	mouse-major-mode-menu-compute-equiv-keys.
! 	(mouse-major-mode-menu-compute-equiv-keys): New function.
! 
! 	* sendmail.el (mail-alias-modtime): Doc fix.
! 
! 	* appt.el (appt-delete-window): Avoid error if WINDOW is nil.
! 
! 	* c-mode.el (c-mode-map): Capitalize Mode in C Mode menu bar item.
! 
! Tue Oct 11 13:22:05 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* hilit19.el (calendar-mode): Delete the regexps for diary, hollidays.
! 
! 	* tex-mode.el (compare-windows-whitespace): Eliminate initial value.
! 
! 	* rmail.el (rmail-find-all-files): Fix several errors and make faster.
! 	Always return a single-level list of file names.
! 	(rmail-construct-io-menu): If FILES is null, turn off the menus.
! 	(rmail-disable-menu): A phony "command", always disabled in menus.
! 	(rmail-list-to-menu): Reverse the list L.
! 
! Tue Oct 11 19:04:50 1994  Tom Tromey  <tromey@drip.colorado.edu>
! 
! 	* makefile.el (makefile-mode-name): Removed.
! 	(makefile-mode): Skip any number of "#"s at beginning of comments.
! 	(makefile-electric-keys): New variable.
! 	(makefile-electric-dot): Self insert if not at bol.
! 	(makefile-electric-equal): Really self-insert if not at bol.
! 	(makefile-pickup-everything): Prefix arg means force pickups to be
! 	redone.
! 	(makefile-insert-macro-ref): Don't use format.
! 	(makefile-runtime-macros-list): Added "$" to list.
! 	(makefile-insert-special-target): Don't use format.
! 	(makefile-insert-macro): Don't use format.
! 	(makefile-insert-target): Don't use format.
! 	(makefile-insert-target-ref): Don't use format.
! 	(makefile-electric-colon): Really self-insert if not at bol.
! 	(makefile-complete): New function.  Bound to M-TAB.
! 	(makefile-do-macro-insertion): New function.
! 	(makefile-mode-map): Add menu bar bindings.
! 	(makefile-font-lock-keywords): New constant.
! 	(makefile-mode): Deal with font-lock, add-log, imenu.
! 	(makefile-macroassign-regex): Changed for use with font-lock.
! 	(makefile-dependency-regex): Changed for use with font-lock.
! 	(makefile-add-log-defun): New function.
! 	(makefile-menu-index-function): New function.
! 
! Tue Oct 11 08:56:04 1994  Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
! 
! 	* rmailsum.el (rmail-summary-resend): New function.
! 	(rmail-summary-mode-map - resend): Call rmail-summary-resend
! 	instead of rmail-resend.
! 
! Tue Oct 11 00:42:02 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* startup.el (normal-top-level-add-to-load-path): New function.
! 	(normal-top-level): Load subdirs.el in each dir in load-path.
! 
! 	* loadup.el: Write the subdirs.el file.
! 
! 	* simple.el (blink-matching-open): Check there is a previous
! 	nonblank line before trying to display it.
! 	No need for backward-char before the skip-chars-backward.
! 
! 	* rmail.el (rmail-show-message): New argument no-summary.
! 
! 	* rmailsum.el (rmail-summary-rmail-update):
! 	Pass new arg to rmail-show-message.
! 
! Mon Oct 10 00:47:36 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* iso-transl.el (initializing keymaps):
! 	Define translations for mute-acute and the other mute- keys.
! 
! 	* term/x-win.el (system-key-alist): Add sun versions of
! 	mute-grave, mute-diaeresis, mute-asciicircum.
! 
! 	* c-mode.el (c-mode-map): Use "C mode" for the menu bar item name.
! 
! 	* mouse-sel.el (mouse-select): Pass an arg to mouse-extend.
! 
! 	* mail-hist.el (mail-hist-put-headers-into-history)
! 	(mail-hist-current-header-contents, mail-hist-forward-header)
! 	(mail-hist-current-header-name):
! 	Use regexp-quote on mail-header-separator.
! 
! 	* lisp-mode.el (calculate-lisp-indent): Local var
! 	last-sexp renamed to calculate-lisp-indent-last-sexp.
! 	(lisp-indent-function): Use new name of var.
! 	(calculate-lisp-indent-last-sexp): Var defined.
! 
! 	* menu-bar.el (menu-bar-file-menu): Don't include the frame
! 	commands in a non-frame version of Emacs.
! 
! 	* font-lock.el (font-lock-set-defaults):
! 	Do nothing if font-lock-keywords already non-nil.
! 	Use font-lock-defaults.
! 	(font-lock-defaults): New variable.
! 
! Sun Oct  9 13:22:22 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* appt.el (appt-delete-window): Do nothing if the window
! 	is the only one in its frame.
! 
! 	* calendar.el (calendar-holiday-marker):
! 	Copy holiday-face from highlight face.
! 
! 	* ispell.el (ispell-highlight-spelling-error):
! 	Have just one definition, which decides what to do.
! 	(ispell-command-loop): New args START and END.  Do highlighting
! 	and unhighlighting here.
! 	(ispell-word, ispell-region, ispell-complete-word): Not here.
! 	(ispell-highlight-spelling-error-generic): Bind buffer-undo-list to t.
! 
! 	* lisp-mode.el (emacs-lisp-mode-syntax-table):
! 	Don't set syntax of formfeed.
! 
! 	* bytecomp.el (byte-compile-insert-header): Use user-mail-address.
! 
! Sat Oct  8 00:11:57 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* add-log.el (add-log-current-defun): In texinfo-mode,
! 	handle the case of no commas after @node.
! 
! 	* tex-mode.el (tex-region): Don't delete temp files if we do
! 	one buffer twice in a row.
! 
! 	* rmail.el (rmail-delete-forward): Use rmail-select-summary.
! 
! Fri Oct  7 05:52:06 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* mouse.el (mouse-major-mode-menu): New function, on C-mouse-3.
! 	(mouse-major-mode-menu-1): New function
! 	(mouse-set-font): Move it to C-mouse-2.
! 
! 	* font-lock.el (font-lock-defaults-alist): Delete most modes--all
! 	those that now set font-lock-keywords themselves.
! 	Re-delete code deleted in rms's Oct 5 change.
! 
! 	* pascal.el (pascal-mode): Set font-lock-keywords locally.
! 
! 	* perl-mode.el (perl-mode): Set font-lock-keywords locally.
! 
! 	* asm-mode.el (asm-mode): Set font-lock-keywords locally.
! 
! 	* texinfo.el (texinfo-mode): Set font-lock-keywords locally.
! 
! 	* shell.el (shell-mode): Set font-lock-keywords locally.
! 
! 	* dired.el (dired-mode): Set font-lock-keywords locally.
! 
! 	* sendmail.el (mail-mode): Set font-lock-keywords locally.
! 
! 	* rmail.el (rmail-variables): Set font-lock-keywords locally.
! 
! 	* rmailsum.el (rmail-summary-mode): Set font-lock-keywords locally.
! 
! 	* outline.el (outline-mode): Set font-lock-keywords locally.
! 
! 	* add-log.el (change-log-mode): Set font-lock-keywords locally.
! 
! 	* compile.el (compilation-mode): Use kill-all-local-variables.
! 	Set font-lock-keywords locally.
! 
! Thu Oct  6 16:55:54 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* menu-bar.el (query-replace): Add missing quote.
! 
! Thu Oct  6 14:13:50 1994  Noah Friedman  <friedman@prep.ai.mit.edu>
! 
!         * type-break.el: Do not call type-break-mode upon loading.
!         (type-break-time-sum): New function.
!         (type-break-schedule): Use it.  Make function interactive.
!         (type-break-guestimate-keystroke-threshold): Use `N' interactive
!         spec, not `n'.
!         (type-break-demo-boring): Show elapsed time of break, or number of
!         minutes left for good break.
! 
! Thu Oct  6 04:23:17 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* appt.el (appt-delete-window): Look on all frames for the window.
! 	(appt-disp-window): If frame is unsplittable, use display-buffer.
! 
! Wed Oct  5 20:12:25 1994  Simon Marshall  <Simon.Marshall@mail.esrin.esa.it>
! 
! 	* comint.el (comint-check-proc): Recognise `open'.
! 	(comint-exec): Use open-network-stream if command is a cons pair.
! 
! 	* font-lock.el (compilation-mode-font-lock-keywords,
! 	rmail-summary-font-lock-keywords, dired-font-lock-keywords,
! 	shell-font-lock-keywords, texi-font-lock-keywords,
! 	perl-font-lock-keywords): Deleted.
! 
! 	* sh-script.el (sh-font-lock-keywords): Default to nil.
! 
! 	* compile.el (compilation-mode-font-lock-keywords): New variable.
! 
! 	* add-log.el (change-log-font-lock-keywords): New variable.
! 
! 	* outline.el (outline-font-lock-keywords): New variable.
! 
! 	* rmailsum.el (rmail-summary-font-lock-keywords): New variable.
! 
! 	* rmail.el (rmail-font-lock-keywords): New variable.
! 
! 	* sendmail.el (mail-font-lock-keywords): New variable.
! 
! 	* dired.el (dired-font-lock-keywords): New variable.
! 
! 	* shell.el (shell-font-lock-keywords): New variable.
! 
! 	* texinfo.el (texinfo-font-lock-keywords): New variable.
! 
! 	* asm-mode.el (asm-font-lock-keywords): New variable.
! 
! 	* perl-mode.el (perl-font-lock-keywords): New variable.
! 
! 	* pascal.el (pascal-font-lock-keywords):  New variable.
! 	(pascal-mode): Set comment-start-skip and comment-end.
! 
! 	* font-lock.el: (font-lock-mode): Doc fix; use add/remove-hook, not
! 	setq; removed make-local-variable of font-lock-no-comments.
! 	(font-lock-set-defaults): Do it there, and use:
! 	(font-lock-defaults-alist): Use it to set font-lock-keywords,
! 	font-lock-keywords-case-fold-search and font-lock-no-comments.
! 	(turn-on-font-lock): New function.
! 	(font-lock-fontify-buffer): Made interruptible; deleted messages.
! 
! 	* font-lock.el: (font-lock-fontify-region): Made syntax state reliable
! 	by widening within new restriction; let cstart and cend for speed;
! 	outputs message.
! 	(font-lock-after-change-function): Remove spurious goto-char and use
! 	forward-line, not 1+ end-of-line, for end of fontification region.
! 	(font-lock-any-properties-p): Removed, use text-property-not-all.
! 
! 	* font-lock.el (font-lock-*-face): facename values are themselves.
! 	(font-lock-variable-name-face, font-lock-reference-face): New vars.
! 	(font-lock-doc-string-face): Removed.
! 	(font-lock-keywords): Extended value syntax.
! 	(font-lock-hack-keywords): Cope with it; outputs initial message.
! 
! 	* font-lock.el: Merged in face-lock.el:
! 	(font-lock-display-type, font-lock-background-mode)
! 	(font-lock-face-attributes): New variables, use it.
! 	(font-lock-make-face): New function, use them.
! 
! Wed Oct  5 11:30:10 1994  Francesco Potorti`  (pot@cnuce.cnr.it)
! 
! 	* man.el (Man-notify, Man-current-page, Man-page-list,
! 	Man-filter-list, Man-original-frame, Man-arguments,
! 	Man-fontify-manpage-flag, Man-sections-alist, Man-refpages-alist,
! 	Man-uses-untabify-flag, Man-page-mode-string, Man-sed-script):
! 	Added defvar's to keep the compiler quiet.
! 	(Man-getpage-in-background): Start buffer name with "*Man ".
! 	instead of "*man " to avoid conflict with "*mail*".
! 	(Man-match-substring): Defsubst moved before first call.
! 	(Man-build-page-list, Man-strip-page-headers, Man-unindent): Use
! 	defun instead of defsubst, for code clarity purpose.
! 
! Wed Oct  5 02:29:01 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* font-lock.el: Delete the error when no window system.
! 
! 	* gnuspost.el (sendnews, postnews): Use defalias.
! 
! 	* startup.el (command-line): Load disp-table explicitly.
! 
! 	* add-log.el (add-log-current-defun): Handle Perl specially.
! 
! 	* env.el (read-envvar-name): Special meaning for MUSTMATCH
! 	neither t nor nil.
! 	(setenv): Use that new case, when clearing a var.
! 
! Tue Oct  4 18:57:17 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* texinfmt.el (texinfo-format-scan): Accept @^, @", @?, @!, @-.
! 
! 	* rmailsum.el (rmail-summary-goto-msg):
! 	Get rmail-total-messages from the rmail buffer.
! 
! 	* simple.el (goto-line): Call prefix-numeric-value.
! 
! Mon Oct  3 18:57:36 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* files.el (set-auto-mode): Discard versions from file name before
! 	testing inhibit-first-line-modes-regexps.
! 
! 	* rlogin.el (rlogin): Doc fix.
! 
! Sun Oct  2 22:45:57 1994  Per Cederqvist  <ceder@signum.se>
! 
! 	* vc-hooks.el (vc-status): Handle CVS.
! 
! 	* vc-hooks.el (vc-find-cvs-master): New function.
! 	(vc-master-templates): Add vc-find-cvs-master.
! 	(vc-registered): Allow vc-master-templates to contain atoms, and
! 	call them with dirname and basename as arguments.
! 
! 	* vc-hooks.el (vc-mode-line): Use equal, not string-equal, to
! 	compare the result of vc-locking-user.
! 
! 	* vc.el (vc-backend-checkin): When CVS checks in a file, it is
! 	immediately checked out again, so set vc-checkout-time.
! 
! 	* vc.el (vc-fetch-properties): CVS 1.4A1 says "Repository revision".
! 
! 	* vc.el (vc-locking-user): Do something sensible when the backend
! 	is CVS.  May return a numerical UID or a string when CVS is used.
! 	(vc-dired-reformat-line): Handle numerical arguments.
! 
! 	* vc.el (vc-backend-checkout): Don't extract CVS files twice.
! 
! 	* vc.el (vc-next-action-on-file): Handle return value from
! 	vc-backend-merge-news correctly.
! 
! 	* vc.el (vc-rename-file): Fixed call to vc-backend-dispatch.
! 	(vc-make-buffer-writable-hook): New hook, for CVS only.
! 	(vc-header-alist): Added header for CVS.
! 	(vc-next-action-on-file): Added support for CVS.
! 	(vc-next-action, vc-checkin, vc-revert-buffer): Doc fixes.
! 	(vc-rename-file): Disable if the backend is CVS.
! 	(vc-log-info): New arguments: LAST and FLAGS, passed on to
! 	vc-do-command.  All callers updated.
! 	(vc-fetch-properties): Implement support for CVS files.
! 
! 	* vc.el (vc-backend-checkin): Args REV and COMMENT no longer optional.
! 	Implement support for CVS.
! 	(vc-backend-revert): Implement support for CVS.
! 	(vc-backend-diff): Treat files which are added, but not yet committed,
! 	specially (diff them against /dev/null).
! 	(vc-backend-merge-news): New function.
! 	(vc-log-mode): Talk a little about CVS in the comment.
! 
! 	* vc.el (vc-log-info): Simplify code.
! 
! 	* vc.el (vc-do-command): New argument LAST.  All callers updated.
! 	Legal values for LAST are 'MASTER and 'BASE.
! 	(vc-backend-dispatch): New argument C, used by CVS.  All callers
! 	updated, but many just passes an (error "NYI") form.
! 	(vc-backend-admin): Issue a "cvs add" (but not a "cvs commit").
! 	(vc-backend-checkout, vc-backend-logentry-check, vc-backend-print-log,
! 	vc-backend-assign-name, vc-backend-diff, vc-check-headers): Handle CVS.
! 	(vc-backend-steal, vc-backend-uncheck): Give error if using CVS.
! 
! 	* vc.el (vc-backend-diff): Fixed typo in SCCS code.
! 
! Sun Oct  2 00:01:49 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* comint.el (comint-strip-ctrl-m): Renamed from shell-strip-crtl-m
! 	and moved here.
! 	(shell-strip-ctrl-m): Add defalias.
! 	* shell.el (shell-strip-ctrl-m): Function deleted.
! 
! 	* rect.el (kill-rectangle): In read-only buffer, do record
! 	the rectangle for later yanking.
! 
! 	* shell.el (shell-mode): Compare the truename with /dev/null.
! 
! 	* files.el (file-truename): If name has no dir, use default-directory.
! 
! 	* env.el (setenv-history): New history list.
! 	(setenv): Use setenv-history.
! 	Place the variable's current value at front of setenv-history
! 	while reading the new value.
! 
! Sat Oct  1 17:06:58 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* cplus-md.el (indent-c++-exp): For public/private/protected,
! 	don't do the case/label adjustment.
! 
! 	* fill.el (fill-region, fill-region-as-paragraph): Fix previous change.
! 
! 	* vc.el (vc-register): Verify an old master file really still exists
! 	before giving error.  If it has disappeared, ask for confirmation.
! 
! 	* files.el (save-buffers-kill-emacs): Fix previous change.
! 
! Sat Oct  1 00:23:41 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* mouse.el (mouse-secondary-click-count): New variable.
! 	(mouse-secondary-save-then-kill, mouse-drag-secondary):
! 	Use mouse-secondary-click-count, not mouse-selection-click-count.
! 
! 	* server.el (server-switch-buffer): Don't go to an invisible frame.
! 	Move to a non-dedicated window if possible.
! 	Otherwise, make the window non-dedicated.
! 
! 	* subr.el (add-hook, remove-hook): If the hook was made local
! 	in the old way, always modify the local value.
! 
! 	* ispell.el (ispell-init-process): Add missing arg in error msg.
! 
! 	* finder.el (finder-mode-map): Change key bindings:
! 	RET or f to select, d to go back to directory.
! 	(finder-summary): Fix the help summary.
! 
! Fri Sep 30 14:19:54 1994  Jan-Hein Buhrman  <J.H.Buhrman@ns-nl.att.com>
! 
! 	* env.el (setenv): Provide history, completion for envvar.
! 	(read-envvar-name-history): New variable.
! 	(read-envvar-name): New function.
! 
! Fri Sep 30 18:14:05 1994  Francesco Potorti`  (pot@cnuce.cnr.it)
! 
! 	* man.el (Man-init-defvars, Man-cleanup-manpage,
! 	Man-fontify-manpage): fix previous fix.
! 
! Fri Sep 30 16:29:27 1994  Michael Ernst  <mernst@research.microsoft.com>
! 
! 	* fill.el (fill-region, fill-region-as-paragraph):
! 	If specified region ends before a newline, include that newline.
! 
! Fri Sep 30 00:44:57 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* edmacro.el (edmacro-format-keys): Cope if local keymap is nil.
! 
! 	* faces.el (modify-face): New function.
! 
! 	* files.el (save-buffers-kill-emacs):
! 	Use run-hook-with-args-until-failure.
! 	(find-file-noselect): Use run-hook-with-args-until-success.
! 	(after-find-file): Use run-hooks for find-file-hooks.
! 	(basic-save-buffer): Use run-hook-with-args-until-success.
! 
! 	* subr.el (add-hook): Initialize default value and local value.
! 	(run-hook-with-args-until-success): New function.
! 	(run-hook-with-args-until-failure): New function.
! 
! 	* dired-aux.el (dired-do-print): Put spaces between lpr switches.
! 
! Thu Sep 29 14:51:09 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* lpr.el (print-region-1): Use them instead of just pr.
! 	(lpr-page-header-program, lpr-page-header-switches): New variables.
! 
! 	* abbrev.el (add-abbrev, inverse-add-abbrev):
! 	Clear text properties from NAME.
! 
! 	* scheme.el (scheme-mode-variables): Make parse-sexp-ignore-comments t.
! 
! 	* texinfmt.el (texinfo-format-region, texinfo-format-buffer-1):
! 	Search back for the @include.
! 
! Thu Sep 29 13:39:02 1994  Francesco Potorti`  (pot@cnuce.cnr.it)
! 
! 	* man.el
! 	(Man-init-defvars, Man-cleanup-manpage, Man-fontify-manpage):
! 	added support for the big cross present in the ksh manpage.
! 
! Thu Sep 29 00:48:21 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* frame.el (handle-delete-frame): New function.
! 
! Wed Sep 28 15:49:33 1994  Ake Stenhoff  <etxaksf@aom.ericsson.se>
! 
! 	* imenu.el (imenu--cleanup): Changed 'mapc' to 'mapcar'.
! 
! Wed Sep 28 19:00:42 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* subr.el (run-hooks): t as hook list element means run the global
! 	value of the variable as well as the local value.
! 	(run-hook-with-args): Likewise.
! 	(make-local-hook): New function.
! 	(add-hook, remove-hook): New arg LOCAL means modify local value.
! 	Test default-boundp as well as boundp.
! 
! Wed Sep 28 18:10:55 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* startup.el (command-line): Recognize --longopt synonyms for all
! 	options handled here.
! 
! Tue Sep 27 16:29:27 1994  Michael Ernst  <mernst@research.microsoft.com>
! 
! 	* paragraphs.el (backward-kill-sentence): Work in read-only buffers.
! 	(kill-sentence): Work in read-only buffers.
! 
! Tue Sep 27 16:14:42 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* help.el (command-apropos): Pass t for no-header to apropos.
! 
! 	* apropos.el (apropos-print-matches): Add newline after
! 	Function: or Variable: if line doesn't fit with it.
! 	New arg no-header inhibits them entirely.
! 	(apropos): New arg no-header.  Pass it to apropos-print-matches.
! 
! 	* sendmail.el (mail): Doc fix.
! 
! Tue Sep 27 12:03:04 1994  Christopher J. Madsen  <ac608@yfn.ysu.edu>
! 
!         * files.el (hack-one-local-variable):
! 	Support safe-local-variable property.
! 	(compile-command): Add safe-local-variable property.
! 
! Tue Sep 27 01:41:30 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
! 
! 	* etags.el (etags-tags-completion-table): Allow ? and : in guessed
!         tag names.
! 
! Mon Sep 26 16:47:50 1994  Joe Ramey <ramey@csc.ti.com>
! 
!         * rmailsum.el (rmail-summary-delete-forward): Regexp for
! 	recognizing deleted message should not require a space at the
! 	beginning of the line.
! 
! Mon Sep 26 19:04:19 1994  Richard Stallman  <rms@churchy.gnu.ai.mit.edu>
! 
! 	* gud.el (gud-overload-functions): Function deleted.
! 	(gud-massage-args, gud-marker-filter, gud-find-file): New vars.
! 	Mark them as permanent locals.
! 	(gud-massage-args, gud-marker-filter, gud-find-file):
! 	In these functions, use those variables.
! 	(gud-common-init): 3 new args give values for those variables.
! 	(gdb, sdb, dbx, xdb, perldb): Pass new args to gud-common-init.
! 	(gud-gdb-complete-command): Bind gud-marker-filter.
! 	(gud-find-file): Condense multiple slashes to single slashes.
! 
! Mon Sep 26 06:49:42 1994  Lennart Staflin  <lenst@lysator.liu.se>
! 
! 	* dired.el (dired-re-perms): Accept various file type letters.
! 
! Sun Sep 25 14:27:30 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* flow-ctrl.el (enable-flow-control):
! 	Never make keyboard-translate-table shorter.
! 
! Sun Sep 27 13:27:11 1994  Barry A. Warsaw  (warsaw@anthem.nlm.nih.gov)
! 
! 	* Installed version 4.85.
! 
! 	* cc-mode.el (c-mode-fsf-menu, c-mode-map, c++-mode-map, objc-mode-map):
! 	Use a better feature test to figure out how to set the menu title
! 	string.
! 
! 	* cc-mode.el (c-search-uplist-for-classkey): In `class' keyword
! 	verification section, only skip forward for ?> template char if a
! 	matching ?< char was found previous to search-start.
! 
! 	* cc-mode.el (c-submit-bug-report): Updated var list.
! 
! 	* cc-mode.el (c-search-uplist-for-classkey): Lele patch for objc-mode.
! 
! 	* cc-mode.el (c-search-uplist-for-classkey):
! 	Avoid "invalid search bound" error.
! 
! 	* cc-mode.el (c-beginning-of-statement-1):
! 	Skip special modifier chars in all cases.
! 
! 	* cc-mode.el (c-guess-basic-syntax):
! 	CASE 9: generalize and collect common code for finding position
! 	after conditional statements, and check for `while' statement of a
! 	`do' loop.  In that case, skip over the trailing semi.
! 
! 	* cc-mode.el (c-progress-info, c-progress-init)
! 	(c-progress-update, c-progress-fini):
! 	New vars/defuns for better long indentation progress reporting
! 	(c-indent-exp, c-indent-region): Use them.
! 
! 	* cc-mode.el (c-guess-basic-syntax):
! 	CASE 6F, go forward 1 char from b-o-s of containing-sexp bufpos to
! 	find proper relpos of an arglist-cont.
! 
! 	* cc-mode.el (c-offset-alist-default):
! 	statement-case-open default offset is zero
! 	(c-skip-case-statement-forward): New function.
! 	(c-guess-basic-syntax): CASE 15: use c-skip-case-statement-forward in
! 	proper places to find the real relpos of statement's inside switch
! 	case/default bodies.  CASE 15D: remove special handling when looking
! 	at c-conditional-key.
! 
! 	* cc-mode.el (c-offsets-alist, c-cleanup-list, c-mode-menu)
! 	(c-mode-map, c-symbol-key, c-indent-line, c-popup-menu): Doc fixes.
! 
! 	* cc-mode.el (c-least-enclosing-brace): New function.
! 	(c-most-enclosing-brace): Renamed from c-enclosing-brace.
! 	(c-indent-defun): Handle opening braces not in column 1.
! 
! 	* cc-mode.el (c-beginning-of-statement-1): Skip over statement mod
! 	characters that don't precede an open paren.
! 
! 	* cc-mode.el (c-guess-basic-syntax):
! 	Check for c-access-key non-nil before using it.
! 
! 	* cc-mode.el (c-beginning-of-statement-1): Swapped CASE 3 and 4,
! 	so that conditional statements are picked up properly.
! 
! 	* cc-mode.el (c-guess-basic-syntax):
! 	CASE 15D, calculate relpos from boi of beginning of statement
! 	prior to indent-point, unless we're looking at a conditional key.
! 
! 	* cc-mode.el (c-mode-map, c++-mode-map, objc-mode-map):
! 	Change test of 'FSF in c-emacs-features to specific features
! 	based tests.
! 
! 	* cc-mode.el (c-just-after-func-arglist-p)
! 	(c-guess-basic-syntax, c-lineup-objc-method-args-2):
! 	More objc patches from Lele
! 
! 	* cc-mode.el (c-indent-command):
! 	With optional arg, shift-amt had wrong sign.
! 
! 	* cc-mode.el (c-lineup-arglist):
! 	Better handling of comments preceding arg lists.
! 
! 	* cc-mode.el (c-guess-basic-syntax): Swapped CASE 6A and 6B to
! 	recognize empty arglists with close paren on separate line.
! 
! 	* cc-mode.el (c-mode-menu, c-emacs-features, c-mode-map)
! 
! 	(c-common-init): Remove dependency on string "Lucid" in
! 	emacs-version.  Use features to distinguish.
! 
! 	* cc-mode.el (c-fill-paragraph):
! 	Merge with 19.25's c-mode.el--uses fill-region-as-paragraph.
! 
! 	* cc-mode.el (c-offsets-alist-default, c-offsets-alist)
! 	(c-hanging-braces-alist, c-electric-brace, c-guess-basic-syntax):
! 	Added syntactic symbol statement-case-open for
! 	statement-case-intro's that contain an open brace.
! 
! 	* cc-mode.el (c-lineup-math): Watch for equal signs in literals.
! 
! 	* cc-mode.el (c-beginning-of-statement-1):
! 	CASE5 and CASE 6, better pick up of label's with potential
! 	embedded colons (scope operators).
! 
! 	* cc-mode.el (c-hanging-comment-ender-p): New variable.
! 	(c-fill-paragraph): Use c-hanging-comment-ender-p.
! 
! 	* cc-mode.el (c-recognize-knr-p): New variable.
! 	(c-common-init): Make it buffer-local.
! 	(c-mode, c++-mode, objc-mode): Use c-recognize-knr-p.
! 	(c-guess-basic-syntax): Use c-recognize-knr-p; swap
! 	CASE 5B.2 and 5B.3.
! 
! 	* cc-mode.el (c-offsets-alist-default, c-offsets-alist)
! 	(c-guess-basic-syntax):
! 	Changed syntactic symbol c++-funcdecl-cont to ansi-funcdecl-cont
! 
! 	* cc-mode.el (c-offsets-alist, c-read-offset, c-set-offset):
! 	Accept variable symbols as offsets.
! 	(c-get-offset): Accept ++ and -- symbols.
! 
! 	* cc-mode.el (c-guess-basic-syntax):
! 	CASE 9C: added small performance improvment to c-in-literal call.
! 
! 	* cc-mode.el (c-beginning-of-statement-1): Use c-in-literal-cache,
! 	and limit backscanning in CASE 5 to known, non-literal position.
! 
! 	* cc-mode.el (c-in-literal, c-guess-basic-syntax):
! 	Caching of last literal result.
! 
! 	* cc-mode.el (c-guess-basic-syntax):
! 	CASE 15D, calculate 'statement relpos as the
! 	beginning-of-statement relative to indent-point.
! 
! 	* cc-mode.el (c-beginning-of-statement-1):
! 	CASE 4, check for conditional keywords which could be followed by
! 	a balanced paren expr.  I.e. while(foo).
! 
! 	* cc-mode.el (c++-mode-syntax-table, objc-mode-syntax-table):
! 	Give CR same syntax as newline, for selective-display.
! 
! 	* cc-mode.el (c-electric-star):
! 	Fixed indentation problem when a star is not preceded by a slash.
! 
! 	* cc-mode.el (c-indent-defun):
! 	Removed condition-case inside unwind-protect.
! 
! 	* cc-mode.el (c-class-key, c-search-uplist-for-classkey):
! 	Greatly simplified, this constant now contains a regexp that only
! 	matches valid `class' keywords, in the C++ sense.
! 
! Sun Sep 25 02:04:32 1994  Richard Stallman  <rms@churchy.gnu.ai.mit.edu>
! 
! 	* info.el (Info-scroll-down, Info-scroll-up): Doc fixes.
! 
! 	* rmail.el (rmail-forward): Simplify insertion of forwarded msg.
! 	Don't use exchange-point-and-mark.
! 
! 	* rmail.el (rmail-msg-number-after-expunge): New function.
! 	(rmail-reply, rmail-forward): Use separate local variables
! 	rmail-send-actions-rmail-msg-number, rmail-send-actions-rmail-buffer
! 	to record which message to mark as answered or forwarded.
! 	(rmail-only-expunge): Update msg numbers stored in those variables.
! 
! Sat Sep 24 21:21:26 1994  Richard Stallman  <rms@churchy.gnu.ai.mit.edu>
! 
! 	* rmail.el (rmail-construct-io-menu): Don't print a message
! 	about no matching files.
! 
! Sat Sep 24 06:49:42 1994  Lennart Staflin  <lenst@lysator.liu.se>
! 
! 	* dired.el (dired-re-perms): Accept directories and symbolic links
! 	also, not only plain files.
! 
! Sat Sep 24 00:01:02 1994  Richard Stallman  <rms@churchy.gnu.ai.mit.edu>
! 
! 	* buff-menu.el (Buffer-menu-delete): Handle prefix arg.
! 	(Buffer-menu-delete-backwards): Handle prefix; use Buffer-menu-delete.
! 
! 	* dired-x.el (dired-virtual-mode): Doc fix.
! 
! 	* sh-script.el (auto-mode-alist): Use \' in auto-mode-alist regexps.
! 
! 	* mlsupport.el (auto-execute): Use \' in auto-mode-alist regexps.
! 
! 	* icon.el (icon-mode): Add autoload cookie.
! 
! 	* ada.el (ada-mode): Add autoload cookie.
! 	(auto-mode-alist): Don't alter it here.
! 
! 	* files.el (auto-mode-alist): Handle ada-mode and icon-mode.
! 
! Fri Sep 24 13:03:09 1994  Jan-Hein Buhrman  (J.H.Buhrman@ns-nl.att.com)
! 
! 	* ange-ftp.el (ange-ftp-start-process): Add use-smart-ftp code.
! 	(ange-ftp-get-process): Use ange-ftp-normal-login if
! 	ange-ftp-gateway-host is nil.
! 
! Fri Sep 24 12:02:26 1994  Michael D. Ernst  <mernst@research.microsoft.com>
! 
! 	* simple.el (shell-command, shell-command-on-region):
! 	Make "*Shell Command Output*" non-read-only.
! 
! Fri Sep 24 04:39:22 1994  Erik Naggum  <erik@naggum.no>
! 
! 	* comint.el (comint-input-chunk-size): Variable deleted.
! 	(comint-send-string): Make it an alias for process-send-string.
! 	(comint-send-region): Make it an alias for process-send-region.
! 
! 	* nntp.el (nntp-send-region-to-server): Call process-send-region
! 	just once, for the whole string.
! 
! 	* rmail.el (rmail-reformat-message): Run mail-message-filter
! 	before calling rmail-clear-headers.
! 
! Fri Sep 23 20:57:05 1994  Richard Stallman  <rms@churchy.gnu.ai.mit.edu>
! 
! 	* isearch.el (isearch-mode): Don't set deactivate-mark here.
! 	(isearch-done): In Transient Mark mode, don't set mark if is active.
! 
! 	* vc.el (vc-finish-steal): Do vc-resynch-window in the right buffer.
! 	(vc-steal-lock): Delete spurious reference to `configuration'.
! 
! 	* vc.el (vc-backend-checkout): Add if-statements to the shell cmds
! 	to discard the extra arg some shells make.
! 
! Fri Sep 23 20:03:47 1994  Jonathan I. Kamens  (jik@gza-client1)
! 
!         * files.el (find-alternate-file): Confirm killing buffer
! 	only if it is visiting a file.
! 
! Fri Sep 23 13:30:10 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
! 
! 	* etags.el (tag-symbol-match-p): New function.
! 	(etags-recognize-tags-table): Add that second in find-tag-tag-order,
! 	after tag-exact-match-p.
! 
! 	* etags.el (tags-table-check-computed-list): Call
! 	tags-verify-table on existing buffers.
! 
! Fri Sep 23 10:08:09 1994  Boris Goldowsky  <boris@cs.rochester.edu>
! 
! 	* fill.el (justify-current-line): Inherit props when inserting spaces.
! 
! Fri Sep 23 01:14:28 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* vc.el (vc-rename-file): Add autoload cookie.
! 
! 	* mail-extr.el (mail-extr-all-top-level-domains):
! 	Fix formal name of Hungary.
! 
! Thu Sep 22 21:26:21 1994  Tom Tromey  <tromey@drip.colorado.edu>
! 
! 	* add-log.el (add-change-log-entry): Set add-log-full-name and
! 	add-log-mailing-address here.
! 	(add-log-mailing-address, add-log-full-name): Initialize to nil.
! 
! Thu Sep 22 15:35:40 1994  Stephen Gildea  (gildea@x.org)
! 
! 	* time-stamp.el (time-stamp-mail-host-name): Use mail-host-address.
! 	(time-stamp-mail-host): Variable deleted.
! 
! Thu Sep 22 12:59:27 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* sendmail.el (sendmail-synch-aliases): Renamed from
! 	synch-mail-aliases.  All callers changed.
! 
! Thu Sep 22 14:31:41 1994  Francesco Potorti`  <pot@cnuce.cnr.it>
! 
! 	* man.el (Man-notify-method): New name for old Man-notify-flag
! 	user options.  All functions using it updated.
! 
! 	* ispell.el (check-ispell-version): Suggest to try ispell4.el if
! 	version does not match.
! 
! Thu Sep 22 00:15:12 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* faces.el (x-create-frame-with-faces): Delete the frame if get error.
! 
! 	* rmailsum.el (rmail-summary-goto-msg): Simply the regexp
! 	for finding the message number.  Check that a non-digit follows it.
! 
! 	* help.el (print-help-return-message): Handle cons cells
! 	in special-display-regexps and special-display-buffer-names.
! 
! 	* startup.el (mail-host-address): New variable.
! 	(normal-top-level): Use mail-host-address to init user-mail-address.
! 
! 	* files.el (file-ownership-preserved-p): New function.
! 
! Wed Sep 21 19:52:39 1994  Jonathan I. Kamens  (jik@gza-client1)
! 
! 	* rmail.el (rmail-retry-ignored-headers): New variable,
! 	specifying the headers that should be removed by
! 	rmail-retry-failure.
! 	(rmail-retry-setup-hook): Obsolete variable (see below), deleted.
! 	(rmail-clear-headers): New optional arg is list of headers to clear.
! 	(rmail-retry-failure): Copy the whole block of headers from the message
! 	and then discard those in rmail-retry-ignored-headers.  Delete
! 	usage of rmail-retry-setup-hook.  Bind mail-signature and
! 	mail-setup-hook to nil when composing retry buffer.
! 	Handle mail-self-blind.
! 
! 	* vc.el (vc-steal-lock): (1) Function should be
! 	non-interactive, because it doesn't work when called directly
! 	by the user. (2) Don't display revision "nil" when stealing
! 	lock if revision is unknown.  (3) Put "Stolen lock on <file>"
! 	instead of just the file name in the Subject of the
! 	notification message.
! 
! 	* rmail.el (rmail-ignored-headers): Add resent-message-id.
! 
!         * simple.el (insert-buffer): Default to first other buffer,
!         not first non-visible buffer.
! 
! Wed Sep 21 19:21:43 1994  Erik Naggum  <erik@naggum.no>
! 
! 	* lisp.el (insert-parentheses): Don't insert spaces at beginning
! 	and end of buffer.
! 
! Wed Sep 21 10:23:57 1994  Per Abrahamsen  <abraham@iesd.auc.dk>
! 
! 	* frame.el (special-display-popup-frame): Rename new arg to ARGS.
! 	Allow (FUNCTION OTHER-ARGS...) as the value of ARGS.
! 
! 	* frame.el (special-display-popup-frame): New argument PARAMS.
! 	Use it as well as `special-display-frame-alist'.
! 
! Wed Sep 21 14:18:37 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* mail-extr.el (mail-extr-all-top-level-domains): Update domain list.
! 
! 	* emerge.el (emerge-recenter, emerge-operate-on-windows):
! 	Use `visible' when calling get-buffer-window.
! 
! 	* etags.el (find-tag-noselect): Simplify.
! 	Always run find-tag-hook at the tag's location.
! 
! 	* sendmail.el (mail-default-reply-to): Initialize to t.
! 	(mail-setup): If it's t, set it from envvar REPLYTO.
! 
! Mon Sep 19 14:08:01 1994  Francesco Potorti`  <pot@cnuce.cnr.it>
! 
! 	* man.el (Man-notify-flag): replaces the old Man-notify
! 	variable, use the old one if it is bound as initial value.
! 	(Man-reuse-okay-flag): replaces Man-reuse-okay.
! 	(Man-downcase-section-letters-flag): replaces
! 	Man-downcase-section-letters.
! 	(Man-circular-pages-flag): replaces Man-circular-pages.
! 	(Man-auto-section-alist): variable deleted.
! 	(Man-section-translations-alist): removed the "3x" translation.
! 	(Man-untabify-command, Man-untabify-command-args): new vars.
! 	(Man-sed-command, Man-awk-command): new variables.
! 	(Man-sysv-sed-script, Man-berkeley-sed-script): new constants.
! 	(Man-name-regexp, Man-page-header-regexp): new variable.
! 	(Man-heading-regexp): changed default value.
! 	(Man-reference-regexp): now refers to previous regexps.
! 	(Man-arguments): new buffer-local variable.
! 	(Man-page-mode-string): changed default value.
! 	(Man-mode-map): changed the meanings of ",", ".", "q".  Added new
! 	keys ">", "<", "k".
! 	(Man-page-mode-string): function deleted.
! 	(Man-init-defvars): New function used for initialising the system
! 	and environment dependent variables Man-fontify-manpage-flag,
! 	Man-uses-untabify, Man-sed-script, Man-filter-list.
! 	(Man-delete-trailing-newlines): function deleted.
! 	(Man-make-page-mode-string): new subst.
! 	(Man-build-man-command): now subst instead of function.  Modified
! 	to comply with the new format of Man-filter-list.
! 	(Man-downcase): function deleted.
! 	(Man-translate-references): complete rewrite.
! 	(Man-linepos): function deleted.
! 	(Man-match-substring): new function.
! 	(Man-default-man-args): function deleted.
! 	(Man-default-man-entry): complete rewrite.
! 	(man, manual-entry): function-alias relationship reversed.
! 	(man): prompt changed, prompt using interactive, call
! 	Man-init-defvars, set Man-arguments.
! 	(Man-notify-when-ready): manage the 'pushy value.
! 	(Man-fontify-manpage): substitute Man-set-fonts.
! 	(Man-cleanup-manpage): new function.
! 	(Man-bgproc-sentinel): cleanup, call Man-fontify-manpage and
! 	Man-cleanup-page when necessary.
! 	(Man-mode): call Man-strip-page-headers and Man-unindent.
! 	(Man-build-section-alist, Man-build-references-alist,
! 	Man-build-page-list): substs instead of functions.
! 	(Man-build-references-alist): cleanup.
! 	(Man-build-page-list): new algorithm.
! 	(Man-strip-page-headers, Man-unindent): new substs.
! 	(Man-find-section): assume section names start in column 1.
! 	(Man-quit): bury the buffer instead of killing it, delete the
! 	frame when necessary.
! 	(Man-kill): new function.
! 	(Man-goto-page): do the right thing when the manpage is not found,
! 	do not assume that Man-build-references-alist is broken.
! 
! Wed Sep 21 01:19:09 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* menu-bar.el (vc-menu-map): New menu.
! 	(menu-bar-file-menu): Put the VC map under the File map.
! 
! 	* vc-hooks.el (vc-menu-map): Set up menu items.
! 
! 	* rmail.el (rmail-mode-kill-summary): New function.
! 	(rmail-variables): Put that on kill-buffer-hook locally.
! 
! 	* subr.el (remove-hook, add-hook): Copy existing list before modifying.
! 
! Tue Sep 20 19:52:20 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* sendmail.el (mail-bury-selects-summary): New variable.
! 	(mail-bury): Test it.
! 
! Tue Sep 20 16:38:28 1994  Francesco Potorti`  <pot@cnuce.cnr.it>
! 
! 	* vc-hooks.el (vc-status): Use vc-path when calling prs.
! 
! Tue Sep 20 02:34:26 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* vc-hooks.el (vc-status): New arg vc-type.
! 
! 	* window.el (shrink-window-if-larger-than-buffer): Use WINDOW's frame
! 	for all actions that operate on a frame.  Set WINDOW to selected
! 	window if it was nil.
! 
! Mon Sep 19 11:25:11 1994  Boris Goldowsky  <boris@cs.rochester.edu>
! 
! 	* add-log.el (add-log-current-defun): Deal with
! 	lisp-interaction-mode like lisp-mode.
! 
! 	* facemenu.el (facemenu-update): Make menu separators all dashes.
! 
! Mon Sep 19 20:59:08 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* subr.el (add-hook): Doc fix.
! 
! Mon Sep 19 13:31:16 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* emacsbug.el (report-emacs-bug): system-configuration-options was
! 	misspelled as system-configure-options.
! 
! Mon Sep 19 13:29:03 1994  Jim Blandy  <jimb@geech.gnu.ai.mit.edu>
! 
! 	* disp-table.el: Add support for new window border display table
! 	element.
! 	(describe-display-table): Describe the window border glyph.
! 	(display-table-len): New constant.
! 	(make-display-table, standard-display-8bit,
!         standard-display-default, standard-display-ascii,
!         standard-display-g1, standard-display-graphic,
!         standard-display-underline): Use display-table-len, instead of
!         hard-coding the display table length.
! 
! Mon Sep 19 13:19:50 1994  Francesco Potorti`  <pot@cnuce.cnr.it>
! 
! 	* rlogin.el (rlogin): recognise the `-l user' option to rlogin and
! 	let comint and ange-ftp know about the correct home directory.
! 
! Mon Sep 19 00:17:22 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* picture.el (picture-yank-at-click): New function.
! 
! 	* hideif.el: Handle ==, !=, + and -.
! 	(hif-tokenize): Handle ==, !=, + and -.
! 	(hif-token-regexp): Handle ==, !=, + and -.
! 	(hif-notequal, hif-plus, hif-minus, hif-mathify): New functions.
! 	(hif-math, hif-eq-expr): New functions.
! 	(hif-term): Call hif-eq-expr.
! 	(hide-ifdef-define): Pass 1 to hif-set-var.
! 
! 	* files.el (file-name-sans-extension): New function.
! 
! 	* files.el (basic-save-buffer-1): If writing temp file fails
! 	or a precious file, restore the old visited file modtime.
! 
! 	* replace.el (query-replace-interactive): New user option.
! 	(query-replace-read-args): Obey that option--fetch from
! 	search-ring or regexp-search-ring.  New arg regexp-flag.
! 	(query-replace, query-replace-regexp, replace-string)
! 	(replace-regexp): Pass new arg to query-replace-read-args.
! 	(map-query-replace-regexp): Obey query-replace-interactive.
! 
! Sun Sep 18 15:45:40 1994  Vincent Del Vecchio  (vdelvecc@dsd.camb.inmet.com)
! 
! 	* info.el (Info-insert-dir): Insert newlines before rather than
! 	after nodes copied from other files, for consistency.
! 
! Sun Sep 18 17:15:30 1994  Frederic Pierresteguy  <F.Pierresteguy@frcl.bull.fr>
! 
! 	* rmail.el: Build proper keymap for the "Input (menu)" and
! 	"Output (menu)" submenus.
! 	(rmail-find-all-files, rmail-list-to-menu): New functions.
! 	(rmail-construct-io-menu): New functions.
! 	(rmail-input-menu): Function deleted.
! 	(rmail). Call rmail-construct-io-menu.
! 	(rmail-mode-map): 'Input Rmail file (menu)' renamed to
! 	'Input Rmail file'. 'Output (Rmail menu)' renamed to
! 	'Output Rmail file'.
! 	* rmailout.el (rmail-output-menu): Function deleted.
! 	* rmailsum.el (rmail-summary-construct-io-menu): New function.
! 	(rmail-new-summary): Call rmail-summary-construct-io-menu.
! 	(rmail-summary-mode-map): New menu items 'Input Rmail File' and
! 	'Output Rmail File'.
! 	(rmail-summary-output-to-rmail-file): New arg 'file-name'. If it
! 	non-nil, call rmail-output-to-rmail-file.
! 
! Sun Sep 18 15:07:21 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* tex-mode.el (tex-start-shell): Inherit comint-mode-map, don't copy.
! 
! 	* shell.el (shell-mode-map): Inherit comint-mode-map,
! 	and copy only the completion menu.
! 
! 	* telnet.el (telnet-mode-map): Inherit comint-mode-map, don't copy.
! 
! 	* vc-hooks.el (vc-file-not-found-hook): Use save-excursion.
! 
! Sun Sep 18 22:21:53 1994  Kenneth Manheimer  (klm@coil.nist.gov)
! 
! 	* icomplete.el: Major rewrite to behave more like a minor mode.
! 	Doc fixes.
! 	(icomplete-mode): New function and var.
! 	(icomplete-minibuffer-setup-hook): New hook.
! 	(icomplete-inhibit): Defunct.  Using icomplete-pre-command-hook,
! 	icomplete-post-command-hook as real hook functions.
! 	(icomplete-simple-completing-p): Subsumes
! 	icomplete-window-minibuffer-p plus other stuff, determines whether
! 	simple completion is active.
! 	(icomplete-window-minibuffer-p): Defunct, see above.
! 	(icomplete-minibuffer-setup): Use icomplete-simple-completing-p,
! 	copy-sequence hooks before adding to them, run hooks properly.
! 	(icomplete-tidy): Changed from misnamed icomplete-pre-command-hook;
! 	use icomplete-simple-completing-p.
! 	(icomplete-exhibit): Changed from misnamed icomplete-post-command-hook;
! 	use icomplete-simple-completing-p.
! 	(icomplete-completions): Changed from old, misnamed icomplete-exhibit;
! 	combined with old misnamed icomplete-prompt.
! 
! Sun Sep 18 16:39:30 1994  Michael Kifer  <kifer@cs.sunysb.edu>
! 
! 	* ediff.el (ediff-submit-report, ediff-revision)
! 	(ediff-find-file-name-handler, vc-ediff-internal, rcs-ediff-internal):
! 	New functions.
! 	(ediff-version-control-package): New variable.
! 	(vc-ediff, rcs-ediff): Functions deleted.
! 
! 	* ediff.el (ediff-submit-report): New function.
! 
! 	* ediff.el (ediff-toggle-read-only, ediff-patch-file): Check out
! 	version controlled files before their buffers are modified.
! 	(ediff-local-checkout-flag, ediff-toggle-read-only-function):
! 	 New variables.
! 
! 	* ediff.el (ediff-find-file, ediff-patch-file): Were getting
! 	confused by symbolic links.  Fixed.
! 
! Sun Sep 18 13:47:14 1994  Lawrence R. Dodd  <dodd@roebling.poly.edu>
! 
! 	* rmail.el (rmail-forward): Insert separator before and after message.
! 
! Sun Sep 18 11:48:01 1994  Francesco Potorti`  <pot@cnuce.cnr.it>
! 
! 	* vc-hooks.el (vc-status): Renamed from vc-rcs-status.  Handle SCCS.
! 	(vc-display-status): Renamed from vc-rcs-status.
! 	(vc-mode-line): Call vc-status for SCCS files too.
! 
! Sun Sep 18 01:05:36 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* telnet.el (telnet): Use name *telnet-HOST*, not *HOST-telnet*.
! 
! 	* lmenu.el (make-lucid-menu-keymap-disable): New variable.
! 	(make-lucid-menu-keymap): Use that when disabling item unconditionally.
! 
! Sat Sep 17 01:14:42 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* help.el (describe-variable): Report whether var is local in this buf.
! 
! 	* terminal.el (terminal-map): Define switch-frame.
! 
! Fri Sep 16 19:10:14 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* facemenu.el (facemenu-update): Reverse the menu order again.
! 
! 	* compile.el (compile-internal): Set EMACS=t in process-environment.
! 
! 	* ispell.el (ispell-highlight-spelling-error): Test window-system.
! 
! Fri Sep 16 17:40:22 1994  Karl Heuer  <kwzh@churchy.gnu.ai.mit.edu>
! 
! 	* emacsbug.el: (report-emacs-bug): Insert configuration options.
! 
! 	* ispell.el (ispell-menu-map): Order menu items by size:
! 	buffer > region > word.
! 	* ispell4.el (ispell-menu-map): Likewise.
! 
! 	* register.el (insert-register): Add `*' interactive spec.
! 
! 	* menu-bar.el (complex-buffers-menu-p): Delete; obsolete variable.
! 
! 	* info.el (Info-edit): Move the customary mode-initialization
! 	calls out of here.
! 	(Info-edit-mode): Put them here.  Also enable undo, and call
! 	Info-edit-mode-hook.
! 
! 	* time.el: (display-time-24hr-format): Doc fix.
! 	(display-time-filter): Reenable code that got deleted during a
! 	mispatch.
! 
! 	* sendmail.el (mail-alias-modtime): New variable.
! 	(synch-mail-aliases): New function.
! 	(mail-setup, sendmail-send-it): Synchronize cached list with file.
! 	* mailalias.el: Require sendmail.  Delete redundant defvar.
! 	(expand-mail-aliases, define-mail-alias): Synchronize cached list
! 	with file.
! 
! 	* compile.el (compilation-sentinel): Include exit status in modeline.
! 
! Fri Sep 16 17:30:01 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* dired.el (dired-buffers-for-dir): Delete debugging code.
! 	(dired-in-this-tree): Likewise.
! 
! Fri Sep 16 13:16:21 1994  Michael Ernst  <mernst@research.microsoft.com>
! 
! 	* dired.el, dired-aux.el, dired-x.el: Make directories in
! 	dired-buffers and dired-subdir-alist be expanded; adjust calls
! 	accordingly.
! 	* dired-aux.el (dired-fun-in-all-buffers): Expand dir at start.
! 	(dired-rename-subdir, dired-rename-subdir-1, dired-kill-tree): Likewise.
! 	* dired-x.el (dired-clean-up-after-deletion): Expand fn.
! 	(dired-find-buffer-nocreate): Expand dir at beginning.
! 	* dired.el (dired-buffers-for-dir): Assume dirs are preexpanded.
! 	(dired-in-this-tree): Likewise.
! 	(dired-advertise, dired-unadvertise): Expand default-directory.
! 
! Fri Sep 16 00:36:33 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* window.el (shrink-window-if-larger-than-buffer):
! 	Do nothing in minibuffer-only frame.
! 
! 	* menu-bar.el (menu-bar-file-menu): Rename "Kill Buffer" menu item.
! 
! Thu Sep 15 17:32:37 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* term/x-win.el (system-key-alist): Add Sun definition for mute-acute.
! 
! 	* autoinsert.el (auto-insert-alist): Add entries for C++.
! 	(insert-auto-insert-files): Do case-sensitive match except on vms.
! 
! Thu Sep 15 17:23:50 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* simple.el (kill-new): Call menu-bar-update-yank-menu if that
! 	function is defined.
! 	New optional argument means replace most recent kill.
! 	(kill-append): Use that new interface.
! 	* mouse.el (mouse-save-then-kill, mouse-secondary-save-then-kill):
! 	Use the kill-new interface; don't manipulate kill-ring directly.
! 	* menu-bar.el (yank-menu): New variable; kill-ring in menu format.
! 	(menu-bar-update-yank-menu, menu-bar-select-yank): New function.
! 
! Thu Sep 15 09:11:56 1994  Jay K. Adams  (jka@ece.cmu.edu)
! 
! 	* jka-compr.el (jka-compr-compression-info-list): Expand regular
! 	expressions to include backup files with version numbers.
! 
! 	* jka-compr.el (jka-compr-insert-file-contents): Run the
!         functions in after-insert-file-functions after the
!         buffer-file-name has been set, not before.
! 
! 	* jka-compr.el (jka-compr-insert-file-contents): Properly
!         handle the 'replace' argument for compressed files.
! 
! Thu Sep 15 00:17:40 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* term/x-win.el: Don't call menu-bar-mode.
! 
! 	* startup.el (command-line): If initial X frame has a menu bar,
! 	mark menu-bar-mode as on.
! 
! 	* telnet.el (telnet-program): New variable.
! 	(telnet): Use telnet-program.
! 	(rsh-program): Renamed from telnet-rsh-program.
! 	(rsh): Use new name.
! 
! Wed Sep 14 14:51:15 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* page.el (forward-page): If we find a match that ends where we
! 	started searching, look for another one.
! 
! 	* window.el (shrink-window-if-larger-than-buffer):
! 	Use frame-width, not screen-width.
! 
! 	* startup.el (command-line): If we can't load x-win.el, terminate.
! 
! 	* facemenu.el (facemenu-update): Don't use quoted constant lists
! 	in define-key.  Reverse order of menu definitions.
! 
! 	* autoload.el (generate-file-autoloads): Warn if we put a line
! 	in loaddefs.el that is long enough to cause trouble.
! 
! 	* elp.el: Add autoloads.
! 
! 	* c-mode.el (c-mode-map): Add "Highlight Conditionals" menu item.
! 
! 	* cpp.el (cpp-highlight-buffer): Renamed from cpp-parse-buffer.
! 
! Wed Sep 14 10:53:15 1994  Per Abrahamsen  <abraham@iesd.auc.dk>
! 
! 	* cpp.el (cpp-edit-load): Only call `cpp-edit-reset' in cpp-edit-mode.
! 
! Wed Sep 14 04:18:15 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* type-break.el: New file.
! 
! 	* cpp.el: New file.
! 
! 	* info.el (Info-mode-map): Bind M-s like s.
! 
! 	* ispell.el (ispell-check-only): New variable.
! 	(ispell-word): Handle ispell-check-only.
! 	(ispell-minor-mode): New variable.
! 	(ispell-minor-keymap): New map.
! 	(ispell-minor-mode): New function.
! 
! 	* facemenu.el: New file.
! 
! 	* elp.el: New file.
! 
! Wed Sep 14 21:09:48 1994  Andreas Schwab  (schwab@ls5.informatik.uni-dortmund.de)
! 
! 	* server.el (server-start): Always use pipes for communication.
! 
! Wed Sep 14 14:16:58 1994  Boris Goldowsky  <boris@cs.rochester.edu>
! 
! 	* simple.el (repeat-complex-command, next-history-element,
! 	previous-matching-history-element): Override print-level when
! 	offering command lines to edit.
! 
! Tue Sep 13 23:18:34 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* faces.el (make-face-unbold, make-face-unitalic, make-face-bold,
! 	make-face-italic, make-face-bold-italic): Don't try to frob font
! 	if it's nil.
! 
! Sun Sep 11 14:56:01 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* Version 19.27 released.
! 
! Sun Sep 11 01:41:49 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* ispell.el: Further split the Ispell menu autoloads.
! 
! Sat Sep 10 16:37:11 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* rmailsum.el (rmail-summary-goto-msg): Preserve the current buffer.
! 
! Fri Sep  9 17:35:23 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* window.el (shrink-window-if-larger-than-buffer): Doc fix.
! 
! Thu Sep  8 19:28:02 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* vc.el (vc-do-command): Temporarily add vc-path to the end of PATH.
! 
! Thu Sep  8 13:41:12 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* bibtex.el (put-string-on-kill-ring): Delete this function.
! 	(bibtex-current-entry-label): Call kill-new instead.
! 
! Wed Sep  7 03:54:08 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* Version 19.26 released.
! 
! Tue Sep  6 16:33:01 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* rmailmsc.el (set-rmail-inbox-list): Doc fix.
! 
! Mon Sep  5 19:59:29 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* help-macro.el (make-help-screen): Doc fix.
! 
! Mon Sep  5 15:32:47 1994  Lawrence R. Dodd  <dodd@roebling.poly.edu>
! 
! 	* dired-x.el: (dired-omit-expunge): Avoid setting buffer modified
! 	unless it was modified before and some mark is set so `%*' won't
! 	appear in mode-line of omitted buffers.
! 
! Mon Sep  5 00:32:07 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* saveplace.el (save-place-find-file-hook):
! 	Check after-find-file-from-revert-buffer.
! 
! 	* cmacexp.el (c-macro-prompt-flag): Set default back to nil.
! 
! Sun Sep  4 20:10:40 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* rmail.el (rmail-get-new-mail): Run rmail-get-new-mail-hook.
! 
! Sun Sep  4 22:03:44 1994  Tom Tromey  (tromey@drip.colorado.edu)
! 
! 	* man.el (Man-notify-when-ready): Get Man-original-frame
! 	from the proper buffer.
! 
! Sat Sep  3 04:41:11 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* simple.el (mark-ring): Add permanent-local prop.  Doc fix.
! 
! 	* shell.el (shell-command-regexp): Use a simpler faster regexp.
! 
! 	* info.el (Info-mode): Text for using x, not for make-face defined.
! 
! 	* mh-e.el (mh-get-new-mail): Always use mh-inc-prog, never `inc'.
! 
! Fri Sep  2 20:07:38 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* outline.el (outline-minor-mode-prefix): Doc fix.
! 
! Fri Sep  2 19:11:03 1994  Espen Skoglund  (espensk@tklab1.cs.uit.no)
! 
! 	* pascal.el (pascal-auto-lineup): New variable.
! 	(pascal-end-of-statement): New function.
! 	(pascal-indent-command): Now does optional lineups of : and =.
! 	(pascal-indent-case): Uses pascal-end-of-statement to skip the
! 	case statements.
! 
! Thu Sep  1 12:38:15 1994  Espen Skoglund  (espensk@tklab1.cs.uit.no)
! 
! 	* pascal.el (pascal-indent-declaration): Indent correctly
! 	when record blocks are used within parameterlists.
! 	(pascal-declaration-beg): Strange -0 argument removed.
! 	(pascal-type-completion): Fix typo in regexp.
! 	(pascal-get-lineup-indent): Use match-end instead of end-of-line.
! 
! Thu Sep  1 16:43:04 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* compile.el (grep-command): Doc fix.
! 
! 	* tcl-mode.el: Call provide.
! 
! Thu Sep  1 12:38:02 1994  Francesco Potorti`  (pot@cnuce.cnr.it)
! 
! 	* cmacexp.el (c-macro-prompt-flag): set default to t.
! 	(c-macro-expand): buffer-flush-undo is outdated.
! 	(c-macro-expansion): make exit-status a local variable.
! 
! Thu Sep  1 02:12:12 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* completion.el (completion-before-command): Don't call get
! 	on a non-symbol.
! 
! Tue Aug 30 02:58:32 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* window.el (shrink-window-if-larger-than-buffer):
! 	Don't make the window shorter than window-min-height.
! 
! 	* calendar.el (exit-calendar): Don't restore window config.
! 	(calendar): Don't save one.
! 
! 	* isearch.el (isearch-edit-string): Use isearch-text-char-description.
! 
! 	* ispell.el (ispell-dictionary-alist-1):
! 	For English, remove hyphen from the OTHERCHARS.
! 
! 	* isearch.el (isearch-edit-string): In the isearch-recursive-edit case,
! 	don't end the recursive edit and don't start another one.
! 	(isearch-done): New arg EDIT.
! 	(isearch-mode): Return t if search succeeded.
! 
! Mon Aug 29 22:20:43 1994  Tom Tromey  (tromey@creche.colorado.edu)
! 
! 	* replace.el (perform-replace): Restore match data before highlighting.
! 
! Mon Aug 29 20:46:14 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* help-macro.el (make-help-screen): Don't call window-frame
! 	in a non-multi-frame Emacs.
! 
! Mon Aug 29 08:43:49 1994  Lennart Staflin  <lenst@lysator.liu.se>
! 
! 	* diary-ins.el: Require diary-lib, not diary.
! 	* diary-lib.el: Provide diary-lib not diary.
! 
! Sun Aug 28 00:14:20 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* files.el (after-find-file-from-revert-buffer): Add defvar.
! 
! 	* gud.el (dbx): Use newline, not semicolon, between file and stop cmds.
! 
! Sat Aug 27 15:02:55 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* outline.el (outline-mode-prefix-map): New variable.
! 	Define all the C-c commands here.
! 	(outline-mode-menu-bar-map): New variable, holds local menu-bar keymap.
! 	(outline-mode-map): Bind C-c and menu-bar to those maps.
! 	(outline-minor-mode-map): Likewise use those submaps for the prefixes.
! 
! 	* indent.el (indent-rigidly): Insert new indent, then delete old.
! 
! 	* comint.el (comint-arguments): Treat \n and \t like space.
! 
! Fri Aug 26 02:54:44 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* simple.el (set-mark): When POS is nil, always clear mark-active.
! 
! 	* rmailsum.el (rmail-summary-output-menu): New command.
! 	(rmail-summary-mode-map): Add Output and Input with menu of files.
! 
! Thu Aug 25 01:34:59 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* vc.el (vc-backend-checkout): Don't use -G for SCCS.
! 
! 	* rot13.el (toggle-rot13-mode): New function.
! 
! 	* rmailsum.el (rmail-summary-rmail-update):
! 	Check whether rmail-buffer is dead.
! 
! Wed Aug 24 21:51:39 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
! 
! 	* etags.el (tags-table-extend-computed-list): In loop processing
! 	list of included tables to incorporate it, advance TABLES to its
! 	cdr at end of loop.
! 
! Wed Aug 24 00:48:02 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* files.el (find-file-noselect): Improve "file changed" message.
! 
! 	* comint.el (comint-arguments): Rewrite for speed.
! 	Don't keep parsing once we have enough args.
! 
! 	* ispell.el (ispell-buffer-local-words): Don't treat doublequote
! 	specially when splitting the line into words.
! 
! 	* mouse-sel.el (mouse-extend): In Transient Mark mode, use the region
! 	whenever it is active.
! 
! Tue Aug 23 20:55:18 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* simple.el (shell-command-on-region): Don't delete current buffer.
! 
! Tue Aug 23 12:31:47 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* simple.el (backward-delete-char-untabify): Doc fix.
! 
! 	* lpr.el (lpr-headers-switches): Don't use -p on dgux, irix.
! 
! 	* edebug.el (edebug-read-and-maybe-wrap-form): Increment
!         max-specpdl-size by 2000.
! 
! 	* jka-compr.el (jka-compr-insert-file-contents): Run the
! 	after-insert-file-functions.
! 
! 	* rmail.el (rmail-ignored-headers): Split string constant into lines.
! 
! Sun Aug 21 13:24:32 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* term/news.el (news-fkey-prefix): Use kp-decimal, not kp-period.
! 
! 	* rnews.el (news-select-message): Do most of the work
! 	even for nonexistent article.  (Code copied from 18.59).
! 
! Fri Aug 19 00:37:37 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* rmail.el (rmail-retry-failure, mail-unsent-separator): Doc fix.
! 
! 	* rnews.el (news-mode): Don't set mode-name to a list.
! 	Use mode-line-process instead.
! 
! 	* rot13.el (rot13-other-window): Doc fix.
! 
! 	* lpr.el (lpr-command, lpr-headers-switches): Undo previous change.
! 
! Thu Aug 18 17:02:47 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* window.el (split-window-horizontally): If size is negative,
! 	measure from the right.
! 
! Wed Aug 17 16:29:27 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* info.el (Info-mode): Doc fix.
! 
! 	* lpr.el (lpr-command, lpr-headers-switches): Treat Solaris like BSD.
! 
! 	* paren.el (show-paren-command-hook): Set the face of an overlay
! 	each time we move it somewhere.
! 
! 	* files.el (after-find-file):
! 	New arg after-find-file-from-revert-buffer.
! 	(revert-buffer): Pass t for that.
! 
! 	* simple.el (choose-completion-string): Use plain exit-minibuffer,
! 	not minibuffer-complete-and-exit.  And do so only if the minibuffer
! 	was doing completion.
! 
! 	* tex-mode.el (tex-mode): Allow for documentclass options
! 	when checking for SliTeX.
! 
! Wed Aug 17 19:51:28 1994  Lawrence R. Dodd  <dodd@roebling.poly.edu>
! 
! 	* vc.el (vc-admin): Pass nil instead of
! 	vc-checkout-writable-buffer-hook to vc-start-entry.
! 
! Tue Aug 16 21:45:27 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* perl-mode.el (perl-indent-command): Fix backwards conditional.
! 
! Sun Aug 14 00:09:16 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* rmailsum.el (rmail-summary-scroll-msg-up): Put rmail buffer
! 	on the screen if necessary--but don't scroll in that case.
! 
! 	* rmail.el (rmail-resend): Preserve point around expand-mail-aliases.
! 
! 	* easymenu.el (easy-menu-define): Doc fix.
! 
! Sat Aug 13 13:34:59 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* cmacexp.el (c-macro-expansion): If the CPP output is empty, just
!         show error messages.
! 
! 	* mouse.el (mouse-set-mark): Select the window before saving point.
! 
! 	* iso-cvt.el (iso-tex2iso-trans-tab): Put the sequences with braces
! 	before corresponding ones without.  Escape ? in patterns.
! 	(iso-translate-conventions): Don't widen.
! 	(iso-german-tex-p): Preserve narrowing.
! 
! 	* rmail.el (rmail-maybe-display-summary): If summary is in some frame,
! 	just use that.
! 
! Fri Aug 12 00:49:35 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* rmail.el (rmail-retry-failure): Narrow to just the old header
! 	for calling mail-fetch-field.
! 
! Thu Aug 11 03:10:33 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* compile.el (compilation-set-window-height): Add save-excursion.
! 
! 	* rmail.el (rmail-maybe-display-summary): Don't set summary window
!         height if its frame isn't split.
! 
! 	* subr.el (one-window-p): Doc fix.
! 
! 	* frame.el (frame-notice-user-settings): If we change the frame's font,
! 	call frame-update-faces.
! 
! Wed Aug 10 22:41:58 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* paren.el (show-paren-command-hook): Cope if matching-paren gives nil.
! 
! Wed Aug 10 19:34:45 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
! 
! 	* etags.el (tags-table-including): Inside loop: if CORE-ONLY skip
! 	all consecutive tables not in core; else extend computed list.
! 
! Wed Aug 10 16:21:31 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* gnus.el (gnus-summary-mode-map): Delete unusable `Sort Summary' item.
! 
! Wed Aug 10 04:39:22 1994  Erik Naggum  <erik@naggum.no>
! 
! 	* rmail.el (rmail-forward): Anchor `mail-header-separator' on both
! 	sides to match whole line, not just initial substring.
! 
! Wed Aug 10 00:07:36 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* help.el (view-lossage): Handle buffers and frames in recent-keys.
! 
! Wed Aug 10 00:48:50 1994  Michael Kifer  (Michael Kifer <kifer@cs.sunysb.edu>)
! 
! 	* ediff.el (ediff-find-file, ediff-patch-file): Handle symlinks.
! 
! 	* ediff.el (ediff-save-buffer): Added option for saving diff output.
! 
! 	* ediff.el (ediff-fine-diff-buffer, ediff-ignore-similar-regions):
! 	New variables.
! 	(ediff-no-fine-diffs): Macro added.
! 	(ediff-next-difference, ediff-previous-difference)
! 	(ediff-make-fine-diffs): Enabled a new feature that allows one to
! 	skip over the difference regions where the only differences are
! 	the white space and newlines.
! 	(ediff-toggle-autorefine): Fixed a bug that caused error when the
! 	current difference is <= 0 or > ediff-number-of-differences.
! 
! Tue Aug  9 19:16:26 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* menu-bar.el (menu-bar-file-menu): Compare Files renamed to Compare.
! 	(menu-bar-ediff-menu): Add one element for compare-windows.
! 
! 	* appt.el: Require calendar.
! 
! Tue Aug  9 14:49:17 1994  Michael D. Ernst  <mernst@research.microsoft.com>
! 
! 	* rmailedit.el (rmail-abort-edit): Call `rmail-highlight-headers'.
! 
! Tue Aug  9 01:41:58 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* mailalias.el (define-mail-alias): Avoid error if DEFINITION is "".
! 
! 	* appt.el (appt-check): Update on first wakeup after midnight
! 	even if that's not precisely 12:01.
! 
! Mon Aug  8 00:38:11 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* mouse.el (mouse-drag-mode-line): New function (from mldrag.el,
! 	but changed a little).  Put it on mode-line down-mouse-1.
! 	(mouse-select-window): Bind to mode-line drag-mouse-1.
! 
! 	* info.el (Info-last-menu-item): Fix gross logic errors.
! 	(Info-last-preorder): After going thru menu item, go to end.
! 	(Info-scroll-up): Set window-start if it's out of range.
! 	Once menu start is on or above screen, start using menu items.
! 	(Info-scroll-down): Set window-start if it's out of range.
! 	If there's a menu item, always use menu.
! 
! 	* sendmail.el (mail-alias-file): Add autoload cookie.
! 
! 	* mouse.el (x-fixed-font-alist): Add clean 5x8 and clean 6x8.
! 
! 	* compile.el (compilation-set-window-height): New function,
! 	broken out from compile-internal.
! 	Don't change window height if it is the frame root window.
! 	(compile-internal): Call it.
! 	(compilation-goto-locus): Call it.
! 	Use any visible frame already showing the compilation buffer.
! 
! 	* gnus.el (gnus-start-news-server): Fix the call to `error'.
! 
! Sun Aug  7 02:47:33 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* info.el (Info-additional-directory-list): New variable.
! 	(Info-find-node): Use it.
! 
! 	* faces.el (copy-face): Ignore errors in set-face-font.
! 
! 	* mouse.el (mouse-choose-completion): Pass completion-base-size value
! 	to choose-completion-string.
! 
! 	* simple.el (completion-base-size): New variable.
! 	(completion-list-mode): Make it local.
! 	(choose-completion): Pass its value to choose-completion-string.
! 	(choose-completion-string): New arg base-size.
! 	Use that when deciding how much to delete.
! 
! 	* complete.el (PC-do-completion): Set completion-base-size.
! 
! 	* cmacexp.el: Doc fixes.
! 	(c-macro-expansion): Capture and display CPP error messages.
! 
! 	* tex-mode.el (tex-mode): Accept documentclass when checking Slitex.
! 
! Sat Aug  6 00:45:19 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* gnus.el: Require timezone when loading this file.
! 	Move the provide call to the end.
! 
! 	* c-mode.el (indent-c-exp): Preserve point when handling comments.
! 
! 	* byte-opt.el (byte-after-unbind-ops): Fix paren error wrt doc string.
! 
! 	* font-lock.el (font-lock-hack-keywords): Delete debugging code.
! 
! Fri Aug  5 12:46:53 1994  Erik Naggum  <erik@naggum.no>
! 
! 	* simple.el (choose-completion): Bury or iconify the completion list
! 	using code copied from mouse-choose-completion.
! 
! Fri Aug  5 22:58:12 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* tex-mode.el (tex-mode): Check for documentclass like documentstyle.
! 
! 	* info.el (Info-directory-list): Doc fix.
! 
! Fri Aug  5 03:53:56 1994  Erik Naggum  <erik@naggum.no>
! 
! 	* files.el (save-buffer): Unconditionally make a backup with 2 or
! 	3 C-u's even if make-backup-files is nil.
! 
! Fri Aug  5 14:56:12 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* mouse.el (x-fixed-font-alist): Regularize how fonts are specified.
! 
! 	* time.el (display-time-filter): pm starts at 12, not 13.
! 
! Fri Aug  5 03:42:04 1994  Hans Chalupsky  (hans@hydra.cs.Buffalo.EDU)
! 
! 	* advice.el (ad-subr-arglist): Adapted to new DOC file format.
! 
! Fri Aug  5 00:27:57 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* etags.el (select-tags-table): Doc fix.
! 
! 	* font-lock.el (font-lock-syntax-table): New syntax table.
! 	(font-lock-hack-keywords): Use it temporarily here.
! 	(font-lock-set-defaults): Set up special syntax table for C and C++.
! 
! Thu Aug  4 01:43:39 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* isearch.el (isearch-mode-map): Delete mouse-2, down-mouse-2 bindings.
! 
! 	* rmail.el (rmail-select-summary): Preserve rmail buffer's value of
! 	rmail-total-messages even while summary buffer is current.
! 
! 	* gnus.el: Doc fixes.
! 
! 	* frame.el (frame-delete-all): Copy the whole alist first.
! 
! 	* hilit19.el (hilit-find-file-hook): Preserve buffer modified state.
! 
! 	* simple.el (end-of-buffer-other-window):
! 	Go to the end, not to the beginning.
! 
! 	* appt.el (appt-make-list): Do nothing unless range being processed
! 	for diary entries includes today's date.
! 
! Wed Aug  3 23:27:05 1994  Hans Chalupsky  (hans@hydra.cs.Buffalo.EDU)
! 
! 	* bytecomp.el (byte-compile-protect-from-advice): Macro deleted.
! 	(byte-compile-from-buffer, byte-compile-top-level): Don't use it.
! 
! 	* advice.el: New handling of automatic advice activation that
! 	exploits modified built-in versions of `fset' and `defalias' which
! 	take care of this functionality directly:
! 	(ad-start-advice-on-load, ad-activate-on-definition)
! 	(ad-definition-hooks, ad-enable-definition-hooks, ad-defined-function)
! 	(ad-advised-definers, ad-advised-byte-compilers, byte-constant)
! 	(byte-constant-limit, byte-constant2, byte-fset)
! 	(ad-byte-code-fset-regexp): Variables deleted.
! 	(ad-activate-defined-function, ad-find-fset-in-byte-code)
! 	(ad-scan-byte-code-for-fsets, ad-advised-byte-code)
! 	(ad-recover-byte-code, ad-enable-definition-hooks)
! 	(ad-disable-definition-hooks): Functions deleted.
! 	(defun, defmacro, fset, defalias, define-function)
! 	(byte-compile-from-buffer, byte-compile-top-level): Removed `defadvice'
! 	for these functions.
! 	(ad-save-real-definitions): Removed saving of `byte-code'.
! 	(ad-activate-off): New dummy function.
! 	(ad-activate-on): New name for `ad-activate'.  All calls changed.
! 	(ad-with-auto-activation-disabled): New macro prevents automatic
! 	advice activation.
! 	(ad-safe-fset): New function, used instead of `ad-real-fset'.
! 	(ad-compile-function): Disable automatic advice activation while
! 	compiling, because `byte-compile' uses `fset'.
! 	(ad-activate-on): Renamed from `ad-activate'.  Avoid recursive calls.
! 	(ad-activate-on-top-level): New variable.
! 	(ad-start-advice, ad-stop-advice, ad-recover-normality): Modified to
! 	achieve de/activation of automatic advice activation by setting the
! 	definition of `ad-activate' to `ad-activate-on' or `ad-activate-off'.
! 	(ad-start-advice): Is now called unconditionally when Advice is loaded.
! 
! 	Made compilation behavior of advised definitions customizable, since
! 	loading the byte-compiler takes some time and is not always worth the
! 	cost, e.g., if one only wants to make a few simple modifications:
! 	(ad-default-compilation-action): New variable which specifies whether
! 	to compile an advised definition in case the COMPILE argument to
! 	`ad-activate-on' or one of its friends was supplied as nil.
! 	(ad-preactivate-advice): Supply negative COMPILE argument to prevent
! 	compilation.
! 	(ad-should-compile): New function.
! 	(ad-activate-advised-definition): Use `ad-should-compile' to determine
! 	whether an advised definition should get compiled.
! 	(ad-activate-on, ad-update, ad-activate-regexp, ad-update-regexp)
! 	(ad-activate-all): Doc fixes.
! 	(ad-update): Leave handling of COMPILE up to `ad-activate-on'.
! 
! 	Extracted construction of freeze-advices from `defadvice':
! 	(ad-make-freeze-definition): New function.
! 	(defadvice): Use `ad-make-freeze-definition' to construct frozen defs.
! 
! Wed Aug  3 16:41:06 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* gnus.el (gnus-kill-files-directory): New variable.
! 	(gnus-Newsgroup-kill-file, gnus-newsgroup-kill-file): Use it.
! 
! 	* dired.el (dired-mode): Put expanded name in list-buffers-directory.
! 
! 	* icomplete.el (icomplete-prime-minibuffer): Copy the hook lists
! 	after making them local.
! 
! 	* gnus.el (gnus): Require timezone.  Delete timezone autoloads.
! 
! 	* iso-cvt.el (iso-fix-iso2tex, iso-fix-tex2iso): Check plain-text-mode.
! 
! Tue Aug  2 22:17:21 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* sh-script.el (auto-mode-alist): Fix typos in comments.
! 
! Tue Aug  2 17:58:24 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* mouse.el: Capitalize some error messages.
! 	(mouse-set-point): Nice error if button release is in scrollbar.
! 
! Tue Aug  2 11:43:33 1994  Frederic Pierresteguy  (F.Pierresteguy@frcl.bull.fr)
! 
! 	* compile.el: Set up a "Compile" menubar item.
! 	(recompile): New function.
! 	(previous-error): New function.
! 	(first-error): New function.
! 
! Tue Aug  2 00:57:41 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* frame.el (frame-delete-all): New function.
! 	(frame-notice-user-settings): Call it--with or without separate
! 	minibuffer frame.
! 
! Mon Aug  1 00:40:54 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* rmailsum.el (rmail-summary-mode-map): Fix the Get New Mail entry.
! 	Fix typo.  Add `...' where appropriate.
! 
! 	* rmail.el (rmail-mode-map): Fix the Get New Mail entry.
! 	Add `...' where appropriate.
! 
! 	* ediff.el (ediff-version): Function, variable deleted.
! 	(ediff-date): Var deleted.
! 	(ediff-status-info): Don't call ediff-version.
! 
! 	* dired.el (dired-insert-directory): Call expand-file-name here
! 	because the dir name may have been abbreviated before.
! 
! Sun Jul 31 21:25:27 1994  Morten Welinder  (terra@diku.dk)
! 
! 	* ls-lisp.el (insert-directory): Gracefully handle the case
! 	where a file disappears between it is listed in the directory
! 	and the attributes are requested.
! 
! Sun Jul 31 01:30:57 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* compile.el (compilation-error-regexp-alist): Fix previous change.
! 	Add alternatives for GNU error messages with program name in them.
! 
! 	* time.el (display-time-string-forms): New variable.
! 	(display-time-filter): Simplify to use it.
! 
! 	* dired.el (dired-noselect): Call abbreviate-file-name here.
! 	(dired-internal-noselect): Not here.
! 
! 	* comint.el (comint-password-prompt-regexp): Handle PGP prompt.
! 
! 	* gnus.el (gnus-sortable-date): Use timezone-make-time-string.
! 
! 	* rmail.el (rmail-retry-failure): Handle a weird case with
! 	a couple of lines before the old message header.
! 
! 	* compile.el (compilation-error-regexp-alist): Make separate
! 	regexp for Borland C++; the combined one matched too much.
! 
! 	* ange-ftp.el (ange-ftp-parse-netrc-group): Don't move back to line
! 	beginning.  Skip the machine name whatever it may be.
! 	(ange-ftp-parse-netrc): Skip initial whitespace.
! 
! 	* sendmail.el (sendmail-send-it): Handle resent-to specially.
! 
! 	* mouse-sel.el (mouse-extend): Pass WINDOW arg to mouse-scroll-subr.
! 
! 	* rmailsum.el (rmail-summary-mode-map): Add Get New Mail item.
! 	Move new Re-send menu item to right place.
! 
! 	* rmail.el (rmail-mode-map): Move new Re-send menu item to right place.
! 
! Sat Jul 30 17:19:59 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* hilit19.el: Specify patterns for objc-mode.
! 
! Sat Jul 30 08:55:26 1994  Martin Boyer  <mboyer@ireq-robot.hydro.qc.ca>
! 
! 	* menu-bar.el (menu-bar-enable-clipboard): Moved here the
! 	clipboard function key bindings.
! 
! Sat Jul 30 13:47:16 1994  Michael D. Ernst  <mernst@research.microsoft.com>
! 
! 	* ispell.el (ispell-message-text-end): Improve context diff regexp.
! 
! Sat Jul 30 03:43:09 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* rmailsum.el (rmail-new-summary): If just one window,
! 	put the summary in the upper window and Rmail buffer below.
! 
! Sat Jul 30 11:34:43 1994  Ake Stenhoff (etxaksf@aom.ericsson.se)
! 
! 	* imenu.el (imenu, imenu--flatten-index-alist): Add marker support.
! 	(imenu--cleanup): New function.
!         (imenu-example--name-and-position): Now uses markers.
! 
!         * imenu.el (imenu-add-to-menubar): New function to add an entry
! 	to the menubar for the buffer's current local keymap.
! 
! Fri Jul 29 15:59:47 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* rmail.el (rmail-highlight-face): New variable.
! 	(rmail-highlight-headers): Use it if non-nil.
! 
! 	* gnus.el (gnus-group-suspend): Be sure to bury the right buffer.
! 
! 	* hideif.el (hide-ifdefs): Doc fix.
! 
! Fri Jul 29 14:52:10 1994  Frederic Pierresteguy  (F.Pierresteguy@frcl.bull.fr)
! 
! 	* rmail.el (rmail-display-summary): New variable.
! 	(rmail): Call rmail-summary at the end if rmail-display-summary is
! 	set.
! 
! 	* rmail.el (rmail-mode-map): Add Re-send menu item.
! 	* rmailsum.el (rmail-summary-mode-map): Add Re-send menu item.
! 
! Thu Jul 28 20:44:04 1994  Andreas Schwab  <schwab@ls5.informatik.uni-dortmund.de>
! 
! 	* simple.el (choose-completion): Check for
! 	next-single-property-change returning nil.
! 	* mouse.el (mouse-choose-completion): Dito.
! 
! Thu Jul 28 02:22:24 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* files.el (file-truename): Temporarily get rid of the
! 	ange-ftp completion handler.
! 
! 	* info.el (Info-find-node): Use a loop instead of mapcar and catch.
! 
! 	* buff-menu.el (buffer-menu): Undo previous change.
! 	Instead, save the point value that list-buffers set up
! 	and go back there after switching windows.
! 
! Wed Jul 27 13:49:32 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* faces.el (face-initialize): Use underlining for region face
! 	if there's no gray.
! 	(face-try-color-list): Support `underline' in color list.
! 
! 	* fill.el (justify-current-line): Delete space at end of line.
! 
! 	* files.el (set-auto-mode): Shorten scope of case-fold-search binding.
! 
! 	* files.el (cd-absolute): Call file-name-as-directory first thing.
! 
! 	* compile.el (compilation-error-regexp-alist): Fix bug in Borland
! 	C++ change.  Make first regexp reject cases that give column
! 	numbers.  Add new regexp for GNU format with column numbers.
! 
! Tue Jul 26 11:51:32 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* mail-extr.el (what-domain): Doc fix.
! 
! 	* files.el (basic-save-buffer-1): Ignore file-precious-flag
! 	if the file's dir is not writable.
! 
! 	* forms.el (forms--update): Undo change made mistakenly.
! 
! 	* vc.el (vc-next-action): Even in 1-file case, get its name from FILES.
! 	(vc-finish-logentry): Don't do vc-buffer-sync on the parent buffer
! 	when hat parent buffer is a dired buffer.
! 
! 	* menu-bar.el (menu-bar-update-buffers):
! 	Use (current-global-map), not global-map.
! 
! 	* compile.el (compilation-next-error-locus): New arg SILENT.
! 
! 	* dissociate.el (dissociated-press): Error at start if buffer is empty.
! 
! 	* ediff.el: Made menu bar's autoloaded stuff conditional on
! 	purify-flag, to avoid error message when loading ediff in a frame
! 	that has no menu bar.
! 
! Tue Jul 26 16:24:25 1994  Michael Kifer  (kifer@sbkifer)
! 
! 	* ediff.el (ediff-setup): Improved mode-line-buffer-identification.
! 	Now accommodates buffer identifications generated by
! 	mode-line.el and uniquify.el.
! 
! 	* ediff.el (ediff-current-diff-face-A/B,
! 	ediff-fine-diff-face-A/B,ediff-odd/even-diff-face-A/B):
! 	Variables changed to contain face names
! 	instead of face internal representation.
! 
! Mon Jul 25 20:55:46 1994  Johan Vromans  (jv@squirrel.NL.net)
! 
! 	* forms.el (forms-read-file-filter): new hook function to
! 	preprocess file contents before being passed to forms mode.
! 	(forms-write-file-filter): new hook function to preprocess file
! 	contents before it is being saved to disk. Can be used to undo the
! 	effects of `forms-read-file-filter'.
! 	(forms-mode): Supply a default format if no `forms-format-list' was
! 	specified.
! 	Preprocess file contents using `forms-read-file-filter' and attach
! 	`forms-write-file-filter' to the `local-write-file-hooks' of the file
! 	buffer.
! 	Present a friendly message if the visited file is empty or new.
! 	(forms--intuit-from-file): New subroutine to get the number of fields
! 	from the data file; constructs a default format list.
! 	(forms-save-buffer): Forms mode wrapper for `save-buffer'.
! 	(forms--change-commands, forms--exit): Use it.
! 	(forms--update): Check for the presence of the field separator in any
! 	of the fields.  Refuse update if found.
! 	(forms-delete-record): Allow the last record of the file to be
! 	deleted, even if not terminated by a newline.
! 	(forms--local-write-file-function): Remove.  Didn't do any good.
! 	Replaced by `forms-save-buffer'.
! 
! 	* forms-d2.el: Use `forms-new-record-filter' variable instead of
! 	defining the function.
! 
! Mon Jul 25 17:45:22 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* startup.el (command-line-args-left): Add defvar.
! 
! Sun Jul 24 22:16:58 1994  Andreas Schwab  <schwab@ls5.informatik.uni-dortmund.de>
! 
! 	* comint.el (comint-dynamic-list-completions): Listify the key
! 	sequence to be put back.
! 
! Sun Jul 24 15:57:12 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* lisp-mode.el (emacs-lisp-mode-syntax-table): Give RET the
! 	same syntax as newline.
! 	* cplus-md.el (c++-mode-syntax-table): Likewise.
! 
! 	* vc.el (vc-finish-logentry): Use vc-parent-buffer to find the buffer
! 	to offer to save.
! 
! 	* gud.el (dbx): Use system-configuration, not system-type.
! 
! Sun Jul 24 01:53:22 1994  Erik Naggum  <erik@naggum.no>
! 
! 	* dired.el (dired-internal-noselect): a zero modtime means
! 	directory is unchanged.
! 
! Sat Jul 23 17:11:48 1994  David Robinson  (drtr@mail.ast.cam.ac.uk)
! 
! 	* term/x-win.el (system-key-alist): Add Sun-specific X11R6 keysyms.
! 
! 	* menu-bar.el: Add to global key map for cut, paste & copy keys.
! 
! Sun Jul 24 01:30:54 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* mail-extr.el (mail-extr-all-top-level-domains): Update a few
! 	long names.
! 
! 	* menu-bar.el (menu-bar-update-buffers): If Buffers item is gone,
! 	don't bring it back.
! 
! Sat Jul 23 21:07:03 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* ispell4.el (ispell-tex-buffer-p): Write names in lower case.
! 	Add slitex-mode.
! 
! 	* simple.el (line-move, next-line): Check last line moved over
! 	has a newline, in a way that intangible text does not confuse.
! 
! Sat Jul 23 14:18:38 1994  enami tsugutomo  <enami@sys.ptg.sony.co.jp>
! 
! 	* lisp/add-log.el (add-log-current-defun): Skip doc string
! 	  correctly even if it ends with line that starts space.
! 
! Fri Jul 22 16:43:48 1994  Ed Reingold  <reingold@albert.gnu.ai.mit.edu>
! 
!         * cal-menu.el (calendar-mode-map): Change reference from renamed
!         calendar-current-month to calendar-goto-today.
! 
! Wed Jul 20 15:24:52 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
! 
! 	* dired.el (dired-between-files): Ignore dired-subdir-regexp
! 	if we can move to the file name on the line.
! 
! 	* dired.el (dired-internal-noselect): Don't revert, just suggest `g'.
! 
! Wed Jul 20 22:23:29 1994  Ethan Bradford  (ethanb@ptolemy.astro.washington.edu)
! 
! 	* ispell.el (ispell-command-loop, ispell-region, ispell-word):
! 	Only pop up the choices window if an error is found in the region.
! 	Don't change the size of the choices window except as needed.
! 	Don't (sit-for 0) at the start of ispell-region (i.e. don't force
! 	redisplay at the start of the region).
! 	(ispell-overlay-window): Small documentation fix.
! 
! Wed Jul 20 10:02:57 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
! 
! 	* etags.el (visit-tags-table-buffer): Bind a variable
! 	local-tags-file-name with the value of tags-file-name before
! 	calling tags-verify-table, which switches buffers; change all
! 	references to use local-tags-file-name.  Save current buffer
! 	before that call and on error, switch back before killing local
! 	value of tags-file-name.
! 
! Wed Jul 20 00:08:39 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
! 
! 	* imenu.el (imenu-choose-buffer-index): Use last-nonmenu-event
! 	to decide on mouse vs non-mouse.
! 	(imenu-progress-message): New arg prevpos.  All callers changed.
! 	Don't print messages too frequently.
! 
! 	* byte-opt.el (byte-decompile-bytecode-1): Don't add pc values
! 	if make-spliceable is non-nil.  (Arg renamed from make-splicable.)
! 
! 	* disass.el (disassemble-1): Display the pc values.
! 	(disassemble-column-1-indent): Increase to 8.
! 
! 	* byte-opt.el (byte-decompile-bytecode-1):
! 	Put a pc value before each insn in the list we return.
! 
! Tue Jul 19 16:00:10 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
! 
! 	* ediff.el (Emacs 19 menu setup): Move back to top level
! 	and do it only if purify-flag.
! 
! 	* vc.el: At compile time, require dired.
! 	(vc-finish-logentry): Use the proper files buffer for vc-buffer-sync.
! 
! 	* compile.el (compilation-error-regexp-alist): Allow `(' after
! 	linenum in "FILE", line LINENUM.  Add backslash so C-M-a works.
! 
! Tue Jul 19 02:38:56 1994  Michael Kifer  (kifer@cs.sunysb.edu)
! 
!     	* ediff.el (ediff-find-file, ediff-files-internal, ediff-patch-file):
! 	Modified to work with remote and compressed files.
! 
! 	* ediff.el (ediff-read-file-name, ediff-buffers): Better defaults.
! 	(ediff-read-file-name) Handle OS/2.
! 
! 	* ediff.el (ediff-forward-word-function) New function.
! 	(ediff-wordify-function): Variable deleted.
! 	(ediff-toggle-regexp-match, ediff-hide-regexp-matches): New functions.
! 	(ediff-focus-on-regexp-matches): New function.
! 	(ediff-status-info): New function.
! 	(ediff-file-names, ediff-line-numbers): Functions deleted.
! 
! Mon Jul 18 14:03:30 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* mh-e.el (mh-folder-mode): Use local-write-file-hooks.
  
! Mon Jul 18 09:39:49 1994  Barry A. Warsaw  (warsaw@anthem.nlm.nih.gov)
  
! 	* reporter.el (reporter-dump-state, reporter-submit-bug-report):
! 	Don't print package name if pkgname is nil.  Don't dump state if
! 	varlist is nil.
  
! 	* reporter.el (reporter-bug-hook, reporter-submit-bug-report)
! 	(reporter-calculate-separator, reporter-initial-text):
! 	New or modified functions and variables attempting to prohibit
! 	submission of empty bug reporters.
  
! 	* reporter.el: (reporter-prompt-for-summary-p): Default value now nil.
  
! 	* reporter.el (reporter-dump-state): Make sure there's a final
! 	newline after the setq sexp.
! 	Pass mail buffer as second arg to print fcn.
! 	Use symbol-value to get varsym's value.
  
! 	* reporter.el (reporter-dump-variable): Handle long sexp's even
! 	after entering newline.  Done by filling current line.
! 	Much better pretty printing of long lists!!
! 	Handle void variables.
  
! 	* reporter.el (reporter-version): New variable.
  
! 	* reporter.el (reporter-submit-bug-report-internal): Leave point
! 	after the salutation.
  
! 	* reporter.el (reporter-submit-bug-report): Prompt for a subject.
  
! Mon Jul 18 03:26:04 1994  Karl Fogel  (kfogel@phylo.life.uiuc.edu)
  
!         * mail-hist.el: Make sure that headers are case-insensitive.
!           Upped version to 1.3.
  
! Sun Jul 17 19:55:40 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* forms.el (forms-delete-record): Handle deletion of last line
! 	when it has no terminating newline.
  
! Sat Jul 16 15:29:29 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* mouse.el ([vertical-line C-mouse-2]): Bind it as in a scroll bar.
  
! 	* comint.el (comint-mode-map): Move comint-bol to C-c C-a.
  
! 	* calendar.el (calendar-goto-today):
! 	Renamed from calendar-current-month.
  
! 	* add-log.el (add-change-log-entry): Use <...> around mail address.
  
! 	* help.el (print-help-return-message): If help buffer is a
! 	special display buffer, say nothing about how to switch back.
  
! 	* help-macro.el (make-help-screen): Handle case where *Help* comes
! 	up in a separate frame.
  
! Fri Jul 15 00:30:53 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* sh-script.el: "Comment out" autoload cookies.
  
! 	* mouse.el (mouse-drag-region): Delete redundant switch-frame clause.
! 	(mouse-drag-secondary): Likewise.
  
! 	* sendmail.el (mail-mailer-swallows-blank-line): Verify sendmail.cf
! 	exists before reading it.
  
! Thu Jul 14 18:48:16 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* files.el (rmail-output-file-alist): Mark it risky.
  
! Wed Jul 13 18:56:52 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* help-macro.el (make-help-screen): Bind overriding-local-map
! 	just for short sections of code.
  
! Wed Jul 13 13:19:39 1994  Noah Friedman  (friedman@prep.ai.mit.edu)
  
!         * rsz-mini.el: (resize-minibuffer-setup): Copy post-command-hook
!         when handling minibuffer windows in other frames, not just
!         minibuffer-exclusive frames.
!         Resize the minibuffer window/frame now, in case it has already
!         been initialized with text.
  
! Wed Jul 13 11:14:15 1994  Ed Reingold  (reingold@albert.gnu.ai.mit.edu)
  
!         * diary-lib.el: Correct file name on last line of file.
  
! Wed Jul 13 00:02:56 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* rmail.el (rmail-movemail-program): New variable.
! 	(rmail-insert-inbox-text): Use it.
  
! 	* files.el (insert-directory): Fix previous change.
  
! Tue Jul 12 08:14:43 1994  enami tsugutomo  (enami@sys.ptg.sony.co.jp)
  
! 	* vc.el (vc-finish-logentry): Use the value of
! 	vc-log-after-operation-hook of *VC-log* buffer instead of
! 	vc-parent-buffer.
  
! Tue Jul 12 00:08:25 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* rmail.el (rmail-mode-map): Fix previous change.
  
! 	* menu-bar.el (menu-bar-file-menu): Add insert-file menu item.
  
! 	* gnus.el: Clean up menu item string format.
! 	Add a few menu items and separators.
! 	(gnus-mouse-pick-group): New function, on mouse-2 in Group mode.
! 	(gnus-mouse-pick-article): New function, on mouse-2 in Summary mode.
  
! 	* rsz-mini.el (resize-minibuffer-setup):
! 	Copy the value of post-command-hook.
  
! 	* mouse-sel.el: Many doc fixes.
! 	(mouse-extend): Don't use existing region if EVENT is nil.
  
! 	* mouse.el (mouse-drag-secondary): Don't start making an overlay
! 	when the range is empty.
! 	(mouse-secondary-save-then-kill):
! 	The first time, make a new kill ring entry.
  
! 	* ispell4.el (ispell-word): Call ispell-dehighlight.
  
! 	* files.el (insert-directory): Fix prev change.
  
! 	* rmail.el (rmail-mode-map): Add "Get New Mail" menu item under Mail.
  
! 	* compile.el (compilation-next-error-locus): Don't call
! 	compilation-forget-errors if compilation is still runing.
  
! Mon Jul 11 08:28:42 1994  Erik Naggum  (erik@naggum.no)
  
! 	* buff-menu.el (buffer-menu): Call pop-to-buffer before
! 	list-buffers.  Don't move point afterwards.
  
! Mon Jul 11 20:40:45 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* prolog.el (prolog-mode-syntax-table): Make newline end comments.
  
! 	* sendmail.el (mail-setup): Insert -- line before .signature file.
  
! 	* dired-aux.el (dired-byte-compile): Use byte-compile-dest-file
! 	to get the output file name.
  
! 	* subr.el (ignore): Put doc string in right place.
  
! 	* indent.el (move-to-tab-stop): Delete spurious multiple definition.
  
! Mon Jul 11 09:19:55 1994  Kevin Rodgers <kevinr@ihs.com>
  
! 	* mailabbrev.el (define-mail-abbrev): Don't try to parse empty aliases.
  
! Mon Jul 11 20:41:50 1994  Andreas Schwab  (schwab@ls5.informatik.uni-dortmund.de)
  
! 	* backquote.el (backquote-splice-symbol): Doc typo fix.
  
! 	* edebug.el (edebug-install-read-eval-functions): Fix test for
! 	edebug-read already installed.
  
! 	* hexl.el (hexl-maybe-dehexlify-buffer): New function.
! 	(hexl-mode): Add it to change-major-mode-hook.
! 	(hexl-mode-exit): Remove kludge for mode-line update.
! 	(hexlify-buffer): Doc fix.
  
! Mon Jul 11 00:30:46 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* files.el (insert-directory): Allow list for SWITCHES.
! 	Also split up a string containing separate options.
  
! 	* lisp.el (lisp-complete-symbol): Bind completion-fixup-function.
  
! 	* mouse.el (mouse-choose-completion): Use mouse-face properties to
!         find string to use.
  
! 	* simple.el (completion-setup-function): Put on mouse-face prop
! 	even if no window-system.  Call completion-fixup-function if not nil.
! 	(completion-fixup-function): New variable.
! 	(choose-completion): Use mouse-face properties to find string to use.
  
! 	* server.el (server-start): Try both possible socket file names
! 	for the file to delete.
  
! 	* mouse.el (x-fixed-font-alist): Add 8x13.  Don't specify 75-75
! 	for 7x13, 7x14.
  
! 	* diff.el (diff-latest-backup-file): Cope with backups stored
! 	in a different directory.
  
! Sun Jul 10 17:32:27 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* etags.el (find-tag-regexp): Bind to C-M-..
  
! Sun Jul 10 13:01:06 1994  Erik Naggum  (erik@naggum.no)
  
! 	* buff-menu.el (Buffer-menu-not-modified): Make
! 	`Buffer-menu-not-modified' handle an argument like `not-modified'.
  
! 	* info.el (Info-fontify-maximum-menu-size): New variable.
! 	(Info-fontify-node): Use that variable.
  
! Sat Jul  9 00:15:40 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* faces.el (x-create-frame-with-faces): Don't downcase nil.
  
! 	* loadup.el (current-load-list): Set it to nil.
  
! 	* compile.el (compilation-window-height): Use defvar.
! 	(compilation-leave-directory-regexp): Likewise.
! 	(compilation-enter-directory-regexp): Likewise.
  
! 	* loadup.el: If have frames, load `faces'.
  
! 	* man.el (Man-bgproc-sentinel): Bind case-fold-search for just the
! 	necessary parts of the function, not the call to Man-notify-when-ready.
  
! Fri Jul  8 17:26:21 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* files.el (hack-one-local-variable): Check for root using user-uid.
  
! Thu Jul  7 00:42:03 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* files.el (outline-level): Mark it risky.
  
! 	* version.el (emacs-version): Avoid unnecessary recursive call.
  
! 	* mouse.el ([vertical-scroll-bar C-mouse-2]): Split the window.
  
! 	* version.el (emacs-version): Check x-toolkit with featurep.
  
! 	* gud.el (gud-mips-p): Check for OSF system on Alpha also.
  
! 	* files.el (process-environment, exec-path, load-path,exec-directory):
! 	Mark these as risky.
! 	(hack-one-local-variable): Treat vars ending in -program and -command
! 	as risky.
  
! 	* version.el (emacs-version): Indicate x toolkit usage in value.
  
! 	* files.el (switch-to-buffer-other-frame): Raise the frame.
  
! Wed Jul  6 21:32:45 1994  Michael I Bushnell  (mib@churchy.gnu.ai.mit.edu)
  
! 	* gnus.el (gnus-summary-show-all-threads): Undo previous change.
! 	(gnus-summary-show-thread, gnus-summary-hide-all-threads)
! 	(gnus-summary-hide-thread): Likewise.
  
! Wed Jul  6 17:27:14 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* buff-menu.el (Buffer-menu-revert-function): New function.
! 	(Buffer-menu-mode): Use it, for revert-buffer-function.
! 	(Buffer-menu-mode-map): Bind revert-buffer.
  
! 	* files.el (revert-buffer-function): Doc fix.
  
! 	* vc.el (vc-start-entry): New arg after-hook.
! 	Set vc-log-operation-hook locally.
! 	(vc-next-action-on-file): Not here.
! 	(vc-admin): Pass new arg.
! 	(vc-checkin): Pass new arg instead of setting vc-log-operation-hook.
  
! 	* files.el (auto-save-mode): If autosave is off because buffer has
! 	shrunk, then toggling should turn it on.
  
! 	* tpu-edt.el (tpu-save-all-buffers-kill-emacs):
! 	Use delete-old-versions, and bind it locally.
  
! 	* completion.el (save-completions-to-file): Use delete-old-versions.
  
! 	* files.el (delete-old-versions):
! 	Var renamed from trim-versions-without-asking.
  
! Wed Jul  6 16:25:29 1994  Ed Reingold  (reingold@albert.gnu.ai.mit.edu)
  
!         * diary-lib.el (fancy-diary-display): Consistently turn off selective
! 	display in diary buffer before doing anything.
  
! Wed Jul  6 16:10:27 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* outline.el (outline-next-preface): Undo previous change:
! 	Do stop before final newline.
  
! Wed Jul  6 13:56:23 1994  Morten Welinder  (terra@tyr.diku.dk)
  
! 	* desktop.el (desktop-buffer-rmail): Handle the situation
! 	where the RMAIL file is locked, mail is waiting, and the
! 	user selects `quit' gracefully.
  
! Tue Jul  5 18:36:27 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* files.el (set-visited-file-name): Avoid crash if TRUENAME is nil.
  
! Tue Jul  5 17:52:48 1994  Michael I Bushnell  (mib@churchy.gnu.ai.mit.edu)
  
! 	* sendmail.el (mail): Commented out buggy call to
! 	set-visited-file-name.  (It pukes on a nil argument.)
  
! Tue Jul  5 14:31:57 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* gnusmail.el (gnus-mail-reply-using-mhe): Handle case of no subject.
  
! 	* faces.el (x-create-frame-with-faces): Ignore case in X resource.
! 	(make-face-x-resource-internal): Test underline attribute as boolean.
  
! 	* files.el (file-truename): Use iteration when possible.
! 	Avoid recalculating the same truename twice in one invocation.
! 	Error check for infinite link loop.
  
! 	* files.el (debugger): Mark it a risky-local-variable.
  
! 	* startup.el (command-line): Check LC_ALL and LANG as well as LC_CTYPE.
! 	(iso-8859-1-locale-regexp): Don't check for `iso'.
  
! 	* paths.el (rmail-spool-directory): Use /var/mail if it exists.
  
! Tue Jul  5 11:44:59 1994  Ed Reingold  (reingold@albert.gnu.ai.mit.edu)
  
!         * calendar.el (generate-calendar-month): Make highlighted text for
!         mouse-2 a one character wide for single-digit dates (this undoes
!         the incorrect fix of May 30, 1994).
  
! Mon Jul  4 19:23:56 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* paths.el (rmail-spool-directory): Use /var/mail for bsd386.
  
! 	* startup.el (iso-8859-1-locale-regexp): New variable.
! 	(command-line): Use it.
  
! Mon Jul  4 16:58:45 1994  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)
  
! 	* add-log.el (add-change-log-entry): Apply expand-file-name to
!         FILE-NAME.
  
! Sun Jul  3 20:47:46 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* mouse.el (mouse-drag-region): Bind this-command like last-command.
! 	(mouse-kill-ring-save): Bind this-command and last-command.
  
! Sun Jul  3 15:05:04 1994  Richard Stallman  (rms@gnu.ai.mit.edu)
  
! 	* startup.el (command-line): Accept iso-8859-1 like iso_8859_1.
  
! 	* sendmail.el (sendmail-send-it): Allow specifying Sender.
  
! 	* emacsbug.el (report-emacs-bug-hook): Error if user has added no text.
! 	(report-emacs-bug): Set local report-emacs-bug-orig-text.
! 	Add to mail-send-hook.  Use mail-send-and-exit for the echo area msg.
  
! 	* frame.el (initial-frame-alist): Doc fix.
  
! 	* startup.el (command-line): Automatically use iso-syntax and
! 	standard-display-european if LC_CTYPE asks for it.
  
! Sun Jul  3 09:30:57 1994  Ethan Bradford  (ethanb@ptolemy.astro.washington.edu)
  
! 	* gnuspost.el (gnus-inews-news): Allow newsgroups to be separated
! 	by spaces or commas and spaces.
  
! Set Jul  2 23:00:53 1994  Morten Welinder  (terra@diku.dk)
  
! 	* meese.el: Use add-hook, (provide 'meese).
! 	(protect-innocence-hook): compare expanded file names for the sake
! 	of non-unix file systems.  Use expand-file-name instead of concat
! 	to create "celibacy.1" file name.  Check that the "sex.6" exists.
  
! Sat Jul  2 00:48:54 1994  Richard Stallman  (rms@gnu.ai.mit.edu)
  
! 	* ebuff-menu.el (electric-buffer-list): Change prompt message.
! 	(electric-buffer-menu-mode-map): Define C-m like space.
  
! 	* sh-script.el (sh-chmod-argument): Change default.
  
! 	* vc.el (vc-update-change-log): Pass a -n option to rcs2log.
  
! Fri Jul  1 12:27:28 1994  Richard Stallman  (rms@gnu.ai.mit.edu)
  
! 	* mouse.el (mouse-scroll-subr): Delete some debugging code.
  
! 	* etags.el (visit-tags-table-buffer):
! 	Move error call into scope of `file'.
  
! 	* bytecomp.el (byte-compile-defalias): Fix typo in prev change.
  
! 	* bytecomp.el (byte-compile-callargs-warn): Handle function defnition
! 	that is not a lambda expression or byte code function.
! 	(byte-compile-arglist-warn): Likewise.
! 	(byte-compile-defalias): New function, used to compile defalias.
! 	(byte-compile-defalias-warn): New function.
  
! 	* lpr.el (print-region-1): Essentially undo previous change.
  
! 	* files.el (set-visited-file-name): Handle find-file-visit-truename
! 	early on, before we deal with lock files.
  
! 	* gnuspost.el (gnus-inews-domain-name):
! 	Once again test gnus-your-domain.
  
! 	* shell.el (shell-mode): Don't read history from /dev/null.
  
! 	* faces.el (make-face-italic, make-face-bold): Don't bind f2 here.
! 	(make-face-bold-internal, make-face-italic-internal): Bind f2 here.
! 	(make-face-bold-italic-internal, make-face-italic-internal)
! 	(make-face-bold-internal): New arg `font'.  Callers changed.
  
! 	* loadhist.el (unload-feature): The autoload property does not
! 	start with `autoload'.
  
! 	* faces.el (list-faces-display): Line up multiple lines in sample.
  
! 	* sh-script.el (sh-set-shell): Obey sh-query-for-magic in all cases.
  
! Thu Jun 30 23:49:08 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* tcl-mode.el (tcl-mode): Fix regexp to avoid nested loop.
  
! Thu Jun 30 14:56:58 1994  Richard Stallman  (rms@gnu.ai.mit.edu)
  
! 	* hideif.el (minor-mode-map-alist): Add missing quote.
  
! 	* rmail.el (rmail-highlight-headers): Do nothing if
! 	rmail-highlighted-headers is nil.
  
! Thu Jun 30 02:37:55 1994  Noah Friedman  (friedman@prep.ai.mit.edu)
  
! 	* rsz-mini.el (resize-minibuffer-window-restore): Don't do
! 	anything if the window height is already 1.
  
! Thu Jun 30 00:40:42 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* mouse.el (mouse-drag-secondary): Don't treat end of buffer
! 	specially when within the window.
  
! Wed Jun 29 14:21:50 1994  Noah Friedman  (friedman@prep.ai.mit.edu)
  
!         * comint.el (comint-password-prompt-regexp): New variable.
!         (comint-watch-for-password-prompt): Use it.
  
! Wed Jun 29 12:27:55 1994  Richard Stallman  (rms@gnu.ai.mit.edu)
  
! 	* easymenu.el (easy-menu-change): New function.
  
! Tue Jun 28 16:21:58 1994  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)
  
! 	* etags.el (tag-exact-match-p): Test for point sitting after the
! 	explicit tag name itself.
  
! Tue Jun 28 08:25:30 1994  enami tsugutomo  (enami@sys.ptg.sony.co.jp)
  
! 	* simple.el (line-move): Don't use message or ding; just signal errors.
  
! Tue Jun 28 10:12:51 1994  Lawrence R. Dodd  (dodd@roebling.poly.edu)
  
!         * dired-x.el (dired-x-hands-off-my-keys): New user-defined variable.
!         (dired-x-bind-find-file): Use it.
!         (dired-x-find-file): New function to substitute find-file.
!         (dired-x-find-file-other-window): New function to substitute
!         find-file-other-window.
  
! Tue Jun 28 00:14:23 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* frame.el (auto-lower-mode, auto-raise-mode): Doc fixes.
  
! 	* info.el (Info-index): Fix typo: t => \t.
  
! Mon Jun 27 16:52:57 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* sh-script.el (sh-mode): Don't move point permanently.
  
! 	* info.el (Info-insert-dir): Capitalize `node' when inserting it.
! 	(Info-search): Don't move point to beginning, after Info-read-subfile.
  
! Sat Jun 25 00:30:25 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* mouse.el (mouse-scroll-subr): Don't do anything special at eob.
! 	(mouse-drag-region): Don't treat scrolling differently at eob.
! 	(mouse-drag-secondary): Likewise.
  
! 	* comint.el (comint-send-input): Update markers before
! 	actually sending the input.
  
! 	* dired.el (dired-readin): Record the directory's modtime.
! 	(dired-internal-noselect): Offer to revert if dir has changed.
  
! 	* menu-bar.el (menu-bar-mode): Make this a global variable.
! 	(menu-bar-mode): Make variable menu-bar-mode and default-frame-alist
! 	consistent.
  
! 	* frame.el (frame-notice-user-settings): Make menu-bar-mode
! 	and default-frame-alist consistent with each other.
  
! 	* simple.el (beginning-of-buffer-other-window)
! 	(end-of-buffer-other-window): New functions.
! 	* loaddefs.el: Key bindings for M-home and M-end.
  
! 	* ispell.el (ispell-message): Avoid an infinite loop.
  
! Fri Jun 24 21:42:19 1994  Karl Heuer  (kwzh@nutrimat.gnu.ai.mit.edu)
  
! 	* lmenu.el (popup-menu): Allow user to select nothing.
  
! Fri Jun 24 11:45:18 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* paren.el (show-paren-command-hook): Use matching-paren.
! 	Call overlay-put once for each overlay.
! 	Wait .1 sec to see if any input comes in.
  
! 	* gnuspost.el (gnus-inews-user-name, gnus-inews-domain-name):
! 	Use user-mail-address unless there's a reason to do otherwise.
! 	(gnus-inews-domain-name): Delete compatibility use of gnus-your-domain.
  
! 	* add-log.el (add-log-mailing-address): Use user-mail-address.
  
! 	* startup.el (user-mail-address): New variable.
! 	(normal-top-level): Initialize it.
  
! 	* gnus.el (gnus-summary-show-all-threads): Enable thread use.
! 	(gnus-summary-show-thread): Enable thread use.
! 	(gnus-summary-hide-all-threads): Enable thread use.
! 	(gnus-summary-hide-thread): Enable thread use.
! 	(gnus-summary-catchup-to-here): New function.
! 	(gnus-summary-mode-map): Add menu bar menus.
! 	(gnus-group-mode-map): Add menu bar menus.
  
! 	* timer.el (run-at-time): If REPEAT is 0, don't repeat.
  
! 	* tar-mode.el (tar-alter-one-field): Finish previous renaming change.
  
! 	* add-log.el (find-change-log): If file name specified, just use it.
  
! Fri Jun 24 04:08:11 1994  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)
  
! 	* etags.el (visit-tags-table-buffer): Don't take car of return
! 	from tags-table-including.
  
! Thu Jun 23 19:54:24 1994  Karl Heuer  (kwzh@nutrimat.gnu.ai.mit.edu)
  
! 	* lmenu.el (popup-menu): Convert list to same-size vector, not
! 	singleton vector.
  
! Thu Jun 23 10:22:48 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* comint.el (comint-read-input-ring): Use ring-insert-at-beginning.
! 	Insert most recent string first and only as many as we need.
! 	Don't visit the file, just read it.
  
! 	* ring.el (ring-insert-at-beginning): New function.
  
! 	* jka-compr.el (jka-compr-partial-uncompress): Handle the case where
! 	LEN reaches to or past the end of the data.
  
! 	* soundex.el (soundex-alist): Delete the elements that mapped into nil.
  
! 	* tar-mode.el (tar-extract): Set file name by hand before calling
! 	set-visited-file-name.
  
! 	* tar-mode.el: Various renamings; all callers changed.
! 	(tar-header-block-tokenize): Renamed from tokenize-tar-header-block.
! 	(tar-header-block-checksum): Renamed from checksum-tar-header-block.
! 	(tar-header-block-check-checksum):
! 	Renamed from check-tar-header-block-checksum.
! 	(tar-header-block-recompute-checksum):
! 	Renamed from recompute-tar-header-block-checksum.
! 	(tar-header-block-summarize):
! 	Renamed from summarize-tar-header-block.
  
! 	* paren.el (show-paren-command-hook): Set paren foreground to white.
! 	(show-paren-command-hook): Handle close paren rather than open paren
! 	if point is between the two.
  
! 	* info.el (Info-next-preorder-1): New function.
! 	(Info-mouse-follow-nearest-node): Use that.
! 	(Info-follow-nearest-node): Use that.
  
! Wed Jun 22 23:32:22 1994  Ethan Bradford  (ethanb@ptolemy.astro.washington.edu)
  
! 	* lpr.el (print-region-1): Don't include a space in the job name.
  
! Wed Jun 22 21:11:56 1994  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)
  
! 	* etags.el (tags-table-including): Don't call
! 	tags-table-check-computed-list.  After skipping a table not in
! 	core, make sure TABLES is non-nil before using it.  At end, find
! 	the table in the user's list which includes FOUND.
  
! Wed Jun 22 18:14:36 1994  Noah Friedman  (friedman@prep.ai.mit.edu)
  
!         * rsz-mini.el (resize-minibuffer-window-exactly,
!         resize-minibuffer-frame, resize-minibuffer-frame-exactly): Doc
!         fixes.
!         (resize-minibuffer-frame-exactly): make default t.
!         (resize-minibuffer-frame-original-height): New variable.
!         (resize-minibuffer-setup): Set it locally in the minibuffer.
!         (resize-minibuffer-frame): Use it instead of minibuffer-frame-alist's
!         height.
!         (resize-minibuffer-setup): Append resize-minibuffer-window and
!         resize-minibuffer-frame to the end of post-command-hook, don't
!         insert on the front.
!         (resize-minibuffer-window-restore): New function.
!         (resize-minibuffer-setup): Put it on minibuffer-exit-hook.
  
! Wed Jun 22 00:04:25 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* faces.el (make-face): Return the face name, not the vector.
  
! 	* menu-bar.el: Rearrange the edit and file menus, and add separators.
  
! 	* indent.el (move-to-tab-stop): Delete unnecessary spaces
! 	before the old point if a tab followed or follows the old point.
  
! 	* backquote.el (backquote-process): Fix criterion for using FIRSTLIST.
  
! 	* loaddefs.el (global-map): Bind M-prior.
! 	* simple.el (scroll-other-window-down): New command.
  
! 	* env.el (setenv): Rewrite.  Provide a way to unset interactively.
  
! Tue Jun 21 16:17:42 1994  Per Abrahamsen  (abraham@eupectic.research.att.com)
  
! 	* double.el (double-prefix-only): New variable.
! 	(double-translate-key): Use it.
  
! Tue Jun 21 13:46:04 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* faces.el (face-equal): Do check the underline attribute.
  
! 	* files.el (delete-auto-save-files): Doc fix.
  
! Mon Jun 20 17:55:33 1994  Morten Welinder  (terra@diku.dk)
  
! 	* info.el (Info-directory-list): For msdos, don't check for
! 	exec-directory != ../lib-src (since we use wrapped binaries).
  
! 	* s-region.el: Don't bind keys C-insert, C-delete, and
! 	S-insert if they are already bound.
  
! Mon Jun 20 12:45:13 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* indent.el (move-to-tab-stop): Get rid of spaces before tabs
! 	that were made by an immediately previous use of this command.
  
! 	* gnus.el (gnus-summary-next-article): Fix previous change.
  
! 	* help.el (finder-by-keyword): Add doc string and t for interactive.
  
! 	* cc-mode.el: Large changes--version 3.349.
  
! 	* jka-compr.el: Use plists to record handlers.
! 	(jka-compr-insert-file-contents): Don't leave buffer locked.
! 	Call the standard function, and file-local-copy,
! 	using jka-compr-run-real-handler.
! 	(jka-compr-file-local-copy): Call file-local-copy
! 	using jka-compr-run-real-handler.
! 	(jka-compr-write-region): Likewise.
! 	(jka-compr-load): Don't alter file-name-handler-alist.
! 	Do bind inhibit-file-name-handlers and inhibit-file-name-operation.
! 	(jka-compr-handler): Don't alter file-name-handler-alist.
  
! 	* shell.el (shell-prefixed-directory-name): Do nothing if
! 	comint-file-name-prefix is empty.  Do not inline.
  
! Tue May 31 17:52:11 1994  Lars Magne Ingebrigtsen  (larsi@bera.ifi.uio.no)
  
! 	* gnus-uu.el (gnus-uu-view-directory): Fixed viewing with the
! 	`gnus-uu-asynchronous' variable set.
! 	(gnus-uu-ctl-map): Removed the keystrokes `C-c C-v C-h' and
! 	`C-c C-v h' from the keymap.
! 	(gnus-uu-decode-and-view-all-articles,
! 	(gnus-uu-decode-and-view-all-unread-articles,
! 	(gnus-uu-decode-and-save-all-unread-articles,
! 	(gnus-uu-decode-and-save-all-articles): Accept prefix arg for # files.
! 	(gnus-uu-uustrip-article-as): Waits for uudecode to finish before
! 	further treatment of the resulting files.
! 	(gnus-uu-summary-next-subject): After decoding, if there are no
! 	more unread articles, jump to the last article decoded.
! 	(gnus-uu-post-encoded): Make last posting in a
! 	series always have more than 4 lines.
  
! 	* gnus-uu.el (gnus-uu-interactive-save-original-file): Fixed
! 	original file save when there's more that one original file.
  
! 	* gnus-uu.el (gnus-uu-view-file): Rewrote function and fixed
! 	ask before view/save after view.
! 	(gnus-uu-ask-to-save-file): New function.
  
! 	* gnus-uu.el (gnus-uu-interactive-set-up-windows): New function.
! 	(gnus-uu-interactive-scan-directory) New function.
! 	(gnus-uu-interactive-rescan-directory): New function.
! 	(gnus-uu-ignore-files-by-name, gnus-uu-ignore-files-by-type): New vars.
! 	(gnus-uu-interactive-execute): Change directory to work dir before
! 	executing.
  
! 	(gnus-uu-view-directory, gnus-uu-check-for-generated-files):
! 	Fixed bug deleting generated directories.
! 	(gnus-uu-unpack-archives): Added error message for corrupted archives.
  
! Sun Jun 19 13:13:44 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* indent.el (tab-to-tab-stop): Combine new indentation with previous.
  
! 	* mailalias.el (define-mail-alias): Copy parsing code from
! 	mailabbrev.el.  New arg from-mailrc-file.
! 	(build-mail-aliases): Pass t as new arg.
  
! 	* mouse.el (mouse-scroll-subr):
! 	Preserve point if WINDOW's not the selected window.
! 	(mouse-drag-region, mouse-drag-secondary): Accept any list event
! 	as normal termination of the dragging.
  
! Sun Jun 19 03:56:30 1994  Erik Naggum  (erik@naggum.no)
  
! 	* simple.el (blink-matching-open): Use matching-paren.
  
! Sun Jun 19 15:19:56 1994  Rob Riepel  (riepel@Snowflake.Stanford.edu)
  
! 	* tpu-doc.el (tpu-doc-revision): Variable deleted.
  
! 	* tpu-edt.el (tpu-edt-off): Restore original global key map.
! 	(tpu-next-file-buffer): Move to dired buffer too.
! 	(tpu-make-file-buffer-list): New function.
! 	(tpu-version): New version.
! 	(tpu-set-mode-line): Added line-number-mode to mode-line.
! 	(tpu-search-forward-exit, tpu-search-backward-exit): New functions,
! 	key mappings.
  
! 	* tpu-extras.el: Require tpu-edt.
! 	(tpu-extras-revision): Variable deleted.
  
!         * tpu-mapper.el: Change size of selected screen.  Reposition after
! 	printing help.  Null default directory for save.  Produce minibuffer
! 	key bindings for kp4 and kp5.
! 	(tpu-kp4, tpu-kp5): New variables.
! 	(tpu-mapper-revision): Variable deleted.
  
! 	* vt-control.el (vt-revision): Variable deleted.
  
! Sat Jun 18 09:23:23 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* sendmail.el (mail-bury): Test that rmail-summary-buffer is boundp.
  
! 	* files.el (insert-directory): Don't quote braces for shell.
  
! 	* calendar.el: Fix references to diary.el.
  
! 	* diary-lib.el: Renamed from diary.el.
  
! 	* rmailmsc.el (set-rmail-inbox-list): Use insert-before-markers.
  
! Fri Jun 17 23:39:42 1994  Michael D. Ernst  (mernst@research.microsoft.com)
  
! 	* rmail.el (rmail-highlight-headers): Don't skip newlines,
! 	just tab and space.
  
! Fri Jun 17 18:28:59 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* gnus.el (gnus-summary-next-article): Handle non-character events.
  
! Fri Jun 17 18:15:03 1994  Karl Heuer  (kwzh@hal.gnu.ai.mit.edu)
  
! 	* dired.el (dired-build-subdir-alist): Don't let looking-at
! 	destroy the match data.
  
! Fri Jun 17 09:38:56 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* files.el (make-auto-save-file-name): Double the backslashes
! 	and convert slashes to \!.
  
! 	* finder.el (finder-commentary): Fix error message syntax.
  
! 	* autoload.el, bookmark.el, cl-*.el, cl.el, complete.el:
! 	* mouse-sel.el, rot13.el, thingatpt.el: Fix Commentary section comments
! 	and other section comments.
  
! 	* lisp-mnt.el (lm-section-mark): Accept extra semicolons;
! 	accept spaces at end of line.
  
! 	* faces.el (x-create-frame-with-faces): Set the cursor color last.
  
! Fri Jun 17 17:41:10 1994  Kevin Rodgers  (kevinr@ihs.com)
  
! 	* mailabbrev.el (build-mail-abbrevs): Pass a recursivep argument in
! 	recursive call.
  
! Fri Jun 17 00:06:16 1994  Roland McGrath  (roland@geech.gnu.ai.mit.edu)
  
! 	* etags.el (tags-table-computed-list,
!         tags-table-computed-list-for): New variables.
! 	(tags-table-list-pointer, tags-table-list-started-at): Doc fixes.
! 	(tags-table-parent-pointer-list): Variable removed.
! 	(tags-table-check-computed-list, tags-table-extend-computed-list): New
! 	functions.
! 	(tags-find-table-in-list): Function removed.
! 	(tags-table-list-member): New function replaces it.
! 	(tags-verify-table): New function, broken out of
! 	visit-tags-table-buffer.
! 	(tags-table-including, tags-next-table): Rewritten.
! 	(visit-tags-table-buffer-cont): Variable removed.
! 	(visit-tags-table-buffer): Overhauled.
! 	(tag-exact-match-p): Disallow newline in tag string before \177.
  
! Thu Jun 16 10:14:47 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* mouse.el (mouse-scroll-subr): New arg WINDOW.
! 	(mouse-drag-region, mouse-drag-secondary): Pass new arg.
  
! 	* bibtex.el (bibtex-mode): Set up comment-start locally.
  
! 	* ange-ftp.el (ange-ftp-canonize-filename): Fix wrong var name.
  
! Thu Jun 16 04:09:48 1994  Noah Friedman  (friedman@prep.ai.mit.edu)
  
!         * rlogin.el (rlogin-password-paranoia): Variable deleted.
!         (rlogin-password): Function deleted.
!         This functionality is handled by comint-watch-for-password-prompt.
  
!         * rlogin.el (rlogin-filter): Function deleted.
!         (rlogin): Do not set the process filter to rlogin-filter.
  
! Wed Jun 15 22:22:33 1994  Morten Welinder  (terra@diku.dk)
  
! 	* info.el (Info-directory-list): For msdos, use ";" instead of
! 	":" as delimiter in INFOPATH.
  
! Wed Jun 15 00:37:07 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* outline.el (outline-mode): Make change-major-mode-hook buffer-local.
  
! 	* dired.el (dired-build-subdir-alist): Avoid mistaking a file name
! 	ending in a colon for a subdir header line.
  
! 	* sendmail.el (mail-send-hook): Add defvar.
! 	(mail-send): Run mail-send-hook before the `Sending...' message.
  
! 	* etags.el (find-tag-history): New variable.
! 	(find-tag-noselect): Set that variable.
  
! Tue Jun 14 22:42:00 1994  Karl Heuer  (kwzh@hal.gnu.ai.mit.edu)
  
! 	* mouse.el (mouse-drag-region): Bind last-command, not this-command.
  
! 	* files.el (make-auto-save-file-name): Don't use slashes in
! 	autosave name for a non-file buffer.
  
! Tue Jun 14 16:18:12 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* ispell.el (ispell-command-loop): C-g should be like X, not q.
  
! 	* fortran.el (fortran-blink-matching-do): When looking for do,
! 	insist on nondigit after it.
  
! Tue Jun 14 20:06:55 1994  Ed Reingold  (reingold@albert.gnu.ai.mit.edu)
  
! 	* cal-menu.el (calendar-mode-map): Change moon menu bar to pop up
!         a menu instead doing it directly.
!         (calendar-mouse-2-date-menu): Remove moon phase.
  
! Tue Jun 14 19:50:14 1994  Richard Stallman  (rms@albert.gnu.ai.mit.edu)
  
! 	* cal-menu.el (calendar-mouse-2-date-menu): Put moon phase here.
! 	(calendar-mode-map): Delete from here.
  
! Tue Jun 14 00:34:43 1994  Richard Stallman  (rms@albert.gnu.ai.mit.edu)
  
! 	* simple.el (pop-global-mark): Discard entries for nonexistent buffers.
  
! 	* startup.el (inhibit-startup-echo-area-message): Doc fix.
  
! 	* avoid.el (mouse-avoidance-threshold): Renamed from ...threshhold.
  
! Mon Jun 13 23:40:33 1994  Richard Stallman  (rms@albert.gnu.ai.mit.edu)
  
! 	* simple.el (end-of-buffer): Recenter overlay lists.
  
! Mon Jun 13 19:40:12 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* simple.el (pop-global-mark): Discard entries for nonexistent buffers.
  
! 	* startup.el (inhibit-startup-echo-area-message): Doc fix.
  
! 	* avoid.el (mouse-avoidance-threshold): Renamed from ...threshhold.
  
! 	* simple.el (end-of-buffer): Recenter overlay lists.
  
! Mon Jun 13 19:27:54 1994  Roland McGrath  (roland@geech.gnu.ai.mit.edu)
  
! 	* compile.el (compilation-error-regexp-alist): Extend first regexp
! 	to handle Borland C++ msgs: "Warning" or "Error" before file name.
  
! Mon Jun 13 18:06:09 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* ispell.el (ispell-dictionary-alist): Add autoload.
! 	Split into two subvariables.
! 	(ispell-menu-map): Defvar and set up at top level.
! 	Split into parts.
! 	(ispell-menu-map-needed): New variable.
  
! 	* font-lock.el (font-lock-hack-keywords, font-lock-fontify-region):
! 	Don't call set-buffer-modified-p if no change in its value.
  
! Mon Jun 13 21:31:53 1994  Lawrence R. Dodd  (dodd@roebling)
  
! 	* dired-x.el (dired-man): Use internal function from man.el.
! 	(dired-omit-files): Omit `.' and `..' by default, not all files
! 	ending in `.'.
  
! Mon Jun 13 09:56:51 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* font-lock.el: Don't alter the underline face.
  
! 	* font-lock.el (c-font-lock-keywords-2): Insist on whitespace
! 	before a label.
  
! 	* mouse.el (mouse-save-then-kill-delete-region): Turn off change hooks
! 	for the edit operations that are not real.
  
! Sun Jun 12 21:09:22 1994  Johan Vromans  (jv@NL.net)
  
! 	* forms.el (forms-mode):
! 	Plug security hole by disabling `eval-buffer' unless
! 	`enable-local-eval' is set to t.
! 	Correct setting of `forms--mode-setup'.
! 	(forms--local-write-file-function): New function to be used as
! 	`local-write-file-hooks'.
! 	(forms-mode): Use it.
! 	(forms-find-file,forms-find-file-other-window): Locally set
! 	`enable-local-eval' and `enable-local-variables' to t.
! 	(forms-find-file-other-window): Remove extraneous call to
! 	`eval-current-buffer'.
  
! Sun Jun 12 22:31:50 1994  Kohtala Marko  (Marko.Kohtala@ntc.nokia.com)
  
! 	* info.el (Info-insert-dir): Ignore access times when comparing
! 	file attributes.  Print message while merging.  Use separate
! 	buffers for merging.  Try lower case `dir' first.
  
! Sun Jun 12 08:53:46 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
!  	* iso-cvt.el (iso-iso2tex-trans-tab): Add a few characters.
!  	(iso-iso2gtex-trans-tab): Likewise.
!  	(iso-tex2iso-trans-tab): Recognize TeX accent sequences without braces.
!  	(iso-gtex2iso-trans-tab): Likewise.
  
! 	* info.el (Info-fontify-node): Require some whitespace after *Note.
  
! 	* sendmail.el (mail): If homedir is nonexistent, don't use as default.
  
! Sat Jun 11 14:13:07 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* server.el (server-start): Doc fix.
  
! 	* font-lock.el (font-lock-hack-keywords): Avoid changing the narrowing.
  
! 	* tex-mode.el (latex-mode, slitex-mode): In paragraph-separate,
! 	delete spurious \\\\ from char set.
  
! 	* isearch.el (isearch-mode-map):
! 	Bind the ASCII-equivalent fcn keys explicitly to nil.
  
! 	* iso-cvt.el (iso-translate-conventions): Get rid of interactive spec.
  
! Fri Jun 10 20:56:03 1994  Morten Welinder  (terra@diku.dk)
  
! 	* font-lock.el (tex-font-lock-keywords): Make the pattern for
! 	macros respect TeX's idea of identifiers.
! 	(font-lock-set-defaults): Don't check for 'tex-mode, but instead
! 	for 'plain-tex-mode, 'latex-mode, and 'slitex-mode which is what
! 	tex-mode.el uses.
  
! Fri Jun 10 10:13:10 1994  Boris Goldowsky  (boris@mink.cs.rochester.edu)
  
! 	* avoid.el (mouse-avoidance-point-position): Fix compute-motion
! 	call to use (X . Y) relative to window, not frame.
! 	Avoid errors if window-start < point-min.
  
! Fri Jun 10 16:28:12 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* comint.el (comint-dynamic-list-completions):
! 	No space in *Completions*.
! 	* ispell4.el (ispell-complete-word): Likewise.
! 	* ielm.el (ielm-complete-symbol): Likewise.
! 	* etags.el (complete-tag): Likewise.
! 	* complete.el (PC-do-completion): Likewise.
! 	* lisp.el (lisp-complete-symbol): Likewise.
  
! 	* ispell.el (ispell-dictionary-alist): Fix regexp in francais.
  
! 	* dired-x.el: Require dired and dired-aux in the standard way.
  
! 	* dired-aux.el: Add provide call.
  
! 	* info.el (Info-complete-menu-item): New function.
! 	(Info-menu): Use it to speed completion.
  
! 	* tex-mode.el (tex-start-shell): Add autoload.
  
! Tue Jun  7 13:47:11 1994  Richard Stallman  (rms@geech.gnu.ai.mit.edu)
  
! 	* iso-cvt.el (iso-translate-conventions):
! 	Use case-dependent search and don't alter case.
  
! 	* disp-table.el (standard-display-european): Treat 0 arg like negative.
  
! 	* ange-ftp.el (ange-ftp-canonize-filename): Preserve // after colon.
! 	(ange-ftp-expand-file-name): Likewise.
! 	(ange-ftp-canonize-filename): Preserve // at very beginning.
  
! Tue Jun  7 12:35:11 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* tex-mode.el (tex-show-print-queue): Display the tex shell buffer.
! 	(tex-file, tex-bibtex-file): Likewise.
! 	(latex-mode, slitex-mode): Treat \] as paragraph starter.
  
! Tue Jun  7 21:33:02 1994  Morten Welinder  (terra@diku.dk)
  
! 	* dos-fns.el (Info-default-directory-list):  Setting this no
! 	longer needed.
  
! Tue Jun  7 03:47:05 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* cal-menu.el (calendar-mouse-2-date-menu): Put moon phase here.
! 	(calendar-mode-map): Delete from here.
  
! 	* simple.el (delete-blank-lines): Doc fix.
  
! Mon Jun  6 04:01:24 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* indent.el (tab-stop-list): Doc fix.
  
! 	* sendmail.el (mail-bury): If showing rmail buffer that has summary,
! 	show the summary too.
  
! Mon Jun  6 01:04:39 1994  Karl Heuer  (kwzh@hal.gnu.ai.mit.edu)
  
! 	* menu-bar.el (menu-bar-update-buffers): Avoid excessive consing.
  
! Sun Jun  5 06:59:44 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* tex-mode.el (tex-file, tex-region): Display the tex shell buffer.
  
! 	* gomoku.el (gomoku-display-statistics): Use human's point of view
! 	for wins and losses.
! 	(gomoku-number-of-emacs-wins): Renamed from gomoku-number-of-wins.
! 	(gomoku-number-of-human-wins): Renamed from gomoku-number-losses.
  
! 	* derived.el (derived-mode-merge-abbrev-tables):
! 	Do nothing if OLD is nil.
  
! 	* edebug.el (edebug-emacs-19-specific):
! 	Call x-popup-menu only if using a window system.
  
! 	* info.el (Info-directory-list): Don't use the invocation directory
! 	unless it was used for exec-directory too.
  
! 	* gud.el (gud-massage-args): Fix error message syntax.
! 	(gud-marker-filter, gud-find-file): Likewise.
! 	(gud-display-line): Don't use dialog box for questions.
  
! Fri Jun  3 20:16:43 1994  Morten Welinder  (terra@diku.dk)
  
! 	* dos-fns.el (frame-parameters): Setting this is no longer needed.
  
! Fri Jun  3 20:27:02 1994  Ed Reingold  (reingold@albert.gnu.ai.mit.edu)
  
! 	* solar.el (solar-sunrise, solar-sunset): Fix doc string.
! 	(solar-time-string): Rewritten.
! 	(solar-adj-time-for-dst): New function.
! 	(solar-sunrise-sunset, diary-sabbath-candles,
! 	 solar-equinoxes-solstices): Revised to use the rewritten and new fcns.
  
! 	* calendar.el (solar-holidays): Revised to use the rewritten and
!          new fcns.
  
! 	* lunar.el (lunar-phase): Revised to use the rewritten and new fcns.
  
! Thu Jun  2 18:15:13 1994  Richard Stallman  (rms@albert.gnu.ai.mit.edu)
  
! 	* compile.el (compilation-error-regexp-alist): Stricter Lucid regexp.
  
! 	* complete.el (PC-do-completion): Clear text props from inserted text.
  
! 	* comint.el (comint-dynamic-complete-as-filename)
! 	(comint-dynamic-complete-filename): Suppress most messages
! 	when completing in the minibuffer.
  
! Wed Jun  1 14:18:06 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* gnus-uu.el (gnus-uu-ctl-map): Move C-h binding to C-d.
  
! 	* mouse.el (mouse-choose-completion): If *Completion* is a special
! 	buffer or just has a dedicated window, do something reasonable.
  
! 	* gnus.el (gnus-newsrc-to-gnus-format): In main loop,
! 	don't try to match the ranges with the regexp.
! 	Match just the group name and the subscribed-flag.
  
! Mon May 30 17:44:30 1994  Paul Eggert  (eggert@twinsun.com)
  
! 	* calendar.el (calendar-mod): Remove; it was equivalent to `mod'.
! 	All callers changed.
  
! Mon May 30 14:51:16 1994  Ed Reingold  (reingold@albert.gnu.ai.mit.edu)
  
! 	* calendar.el (generate-calendar-month): Make highlighted text for
! 	mouse-2 a full column (2 chars) wide, even for single-digit dates.
  
! Mon May 30 12:23:10 1994  Richard Stallman  (rms@albert.gnu.ai.mit.edu)
  
! 	* comint.el (comint-read-input-ring): Make regexp stricter.
  
! 	* paths.el (Info-default-directory-list): Don't attach ../info.
! 	So now configure-info-directory comes last.
! 	Put /usr/local/info second.
  
! 	* info.el (Info-directory-list): Doc fix.
  
! 	* font-lock.el (shell-font-lock-keywords): Removed regexp for commands.
! 	(rmail-summary-font-lock-keywords): New variable.
! 	(font-lock-set-defaults): Use it.
  
! 	* bibtex.el (bibtex-clean-entry): Back over close delimiter carefully.
  
! 	* cal-dst.el (calendar-current-time-zone): Fix typo that
! 	transposed DST-STARTS-TIME and DST-ENDS-TIME.
  
! 	* ange-ftp.el (ange-ftp-insert-directory): Expand file name to
! 	check whether it is really an ftp file name.
  
! 	* cal-dst.el (calendar-daylight-savings-ends): Fix typo in put.
  
! 	* menu-bar.el (menu-bar-mode): Fix previous change.
  
! See ChangeLog.4 for earlier changes.
--- 1,6908 ----
! Sat May 25 15:30:10 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* Version 19.31 released.
  
! Tue May 21 13:18:31 1996  Marc Fleischeuers  <marc@mpi.nl>
  
! 	* files.el (make-backup-file-name): Check msdos-long-file-names.
! 	(basic-save-buffer-1, make-auto-save-file-name): Likewise.
  
! Tue May 21 11:40:54 1996  Scott M. Meyers  <spirit2@shellus.com>
  
! 	* cmacexp.el (c-macro-expansion): Delete ??! trigraph in uniquestring.
! 	Use same syntax table in outbuf as in inbuf.
! 	Insert newline instead of space at end, for proprocessors which
! 	don't like truncated lines.
  
! Tue May 21 10:50:56 1996  Francesco Potorti`  <F.Potorti@cnuce.cnr.it>
  
! 	* cmacexp.el (c-macro-expansion): Correct bug in creating tempname.
  
! Tue May 21 10:38:53 1996  Andrew Innes  <andrewi@harlequin.co.uk>
  
! 	* scroll-bar.el (scroll-bar-maybe-set-window-start): Always set
! 	window start, to ensure scroll bar position is updated.
  
! 	* term/win32-win.el (win32-handle-scroll-bar-event): Restore
! 	original window selection after scrolling.
  
! Tue May 21 10:30:53 1996  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* mh-e.el (mh-version): Use mh-e-RCS-id rather than mh-e-version
! 	and mh-e-time-stamp.
  
! 	* simple.el (do-auto-fill): Return t if real work was done.
  
! Mon May 20 11:36:08 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* cal-persia.el: Renamed from cal-persian.el to avoid 14-character
! 	limitation.
! 	* calendar.el, diary-lib.el: Fix autoload references.
  
! Sat May 18 16:44:10 1996  Erik Naggum  <erik@naggum.no>
  
! 	* sun-curs.el (sc::menu): Fix typo.
  
! Fri May 17 17:15:18 1996  Per Bothner  <bothner@deneb.cygnus.com>
  
! 	* term.el (term-send-raw-string):  send-string -> process-send-string.
! 	(term-arguments):  Remove unused local `values'.
! 	(term-handle-deferred-scroll):  Fix off-by-one bug.
  
! Fri May 17 17:02:04 1996  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* f90.el: Delete the hilit19 support--it doesn't work.
!  	(f90-face-*, f90-auto-hilit19, f90-hilit-patterns): Vars deleted.
! 	(f90-mode, f90-update-line): Delete the hilit19 support code.
  
! Wed May 15 10:47:32 1996  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* tex-mode.el (latex-imenu-create-index): 
! 	Change the regexp to match the * versions of commands.
! 	(latex-mode): Make imenu-create-index-function buffer-local.
  
! 	* enriched.el: Several doc fixes.
! 	(enriched-mode-hook): Renamed from enriched-mode-hooks.
  
! 	* cc-mode.el (c++-mode): Set c-recognize-knr-p locally to nil.
  
! Mon May 13 16:48:54 1996  Espen Skoglund  <espensk@tklab3.cs.uit.no>
  
! 	* pascal.el (pascal-end-of-statement, pascal-calculate-indent):
! 	Set parse-sexp-ignore-comments to t before parsing.
! 	(pascal-indent-case): Save position of cursor, and restores it
! 	after reindenting the code.
  
! Sat May 11 16:54:59 1996  Geoff Voelker  <voelker@cs.washington.edu>
  
! 	* winnt.el (using-unix-filesystems): Update doc string.
  
! Sat May 11 14:29:44 1996  Andrew Innes <andrewi@harlequin.co.uk>
  
! 	* scroll-bar.el (scroll-bar-drag-position): New function.
! 	(scroll-bar-maybe-set-window-start): New function.
  
! 	* term/win32-win.el (win32-handle-scroll-bar-event): 
! 	Use scroll-bar-maybe-set-window-start.
  
! Sat May 11 12:58:43 1996  Richard Stallman  <rms@delasyd.gnu.ai.mit.edu>
  
! 	* tex-mode.el (latex-imenu-create-index): New function.
! 	(latex-mode): Use latex-imenu-create-index.
! 	(latex-imenu-generic-expression): Variable deleted.
  
! Fri May 10 17:19:51 1995  Per Bothner  <bothner@kalessin.cygnus.com>
  
! 	* term.el (term-emulate-terminal):  On CR, set term-current-column
! 	to term-start-line-column, not 0.
  
! Fri May 10 18:41:10 1996  Richard Stallman  <rms@delasyd.gnu.ai.mit.edu>
  
! 	* f90.el (f90-hilit-patterns): Avoid using undefined variables.
  
! 	* vc.el (vc-rename-file): After renaming, update VC info and modeline.
! 	Preserve buffer-read-only.
! 	
! Thu May  9 13:35:20 1996  Richard Stallman  <rms@delasyd.gnu.ai.mit.edu>
  
! 	* gud.el (gud-filter): Cal gud-display-frame even
! 	if process-window is nil.
  
! 	* vc-hooks.el (vc-find-file-hook): Follow multiple links all the way.
  
! 	* ispell.el (ispell-check-comments): Default is now t.
  
! Wed May  8 17:03:41 1996  Richard Stallman  <rms@delasyd.gnu.ai.mit.edu>
  
! 	* bookmark.el (bookmark-bmenu-delete-backwards)
! 	(bookmark-write, bookmark-relocate, bookmark-insert-buffer-name)
! 	(bookmark-insert-current-bookmark, bookmark-send-edited-annotation)
! 	(bookmark-read-annotation, bookmark-read-annotation-text-func)
! 	(bookmark-send-annotation, bookmark-insert-file-format-version-stamp): 
! 	Doc fix.
! 	
! Wed May  8 14:43:02 1996  Karl Fogel  <kfogel@floss.red-bean.com>
  
! 	* bookmark.el (bookmark-locate): ;;;###autoload this alias.
! 	(bookmark-bmenu-mode-map): bind C-c C-c to
! 	bookmark-bmenu-this-window, analogously to other Emacs listing
! 	modes such as *grep* and *occur*.
! 	(bookmark-version): upped to 2.6.4.
! 
! Wed May  8 00:33:52 1996  Richard Stallman  <rms@delasyd.gnu.ai.mit.edu>
! 
! 	* gud.el (gud-filter): Move the call to gud-display-frame
! 	outside of the save-excursion.
! 
! Tue May  7 21:57:00 1996  Karl Fogel  <kfogel@floss.red-bean.com>
! 
! 	* bookmark.el (bookmark-make): take optional arg `info-node', pass
! 	it on to bookmark-make-cell.
! 	(bookmark-make-cell): if new optional arg `info-node' is non-nil,
! 	make it be the bookmark's info-node.
! 	(bookmark-info-current-node): new func.
! 	(bookmark-set): call bookmark-make, passing result from above
! 	bookmark-info-current-node.
! 	(bookmark-send-annotation): same as above.
! 	(bookmark-locate): defalias to bookmark-insert-location for
! 	backward compatibility.
! 	(bookmark-version): upped to 2.6.3.
! 
! Tue May  7 19:55:04 1996  Noah Friedman  <friedman@prep.ai.mit.edu>
! 
! 	* rlogin.el (rlogin): Call rlogin-mode after adding
! 	rlogin-carriage-filter to output filter functions, so user can
! 	remove it if desired.
  
! Mon May  6 19:17:04 1996  Richard Stallman  <rms@delasyd.gnu.ai.mit.edu>
  
! 	* gulp.el: New file.
! 	
! 	* info.el (Info-enable-active-nodes): Default to nil.  Mark it risky.
  
! 	* ediff-diff.el (ediff-setup-fine-diff-regions):
! 	Use ediff-diff3-options or ediff-diff-options.
  
! Sun May  5 00:33:20 1996  Richard Stallman  <rms@delasyd.gnu.ai.mit.edu>
  
! 	* mouse.el (mouse-drag-region): Set the region before reading a
! 	character, so the selection exists while we wait.
  
! 	* dos-fns.el (convert-standard-filename): Test msdos-long-file-names.
! 	Return "." or ".." unchanged.
  
! 	* iso-acc.el (iso-accents-compose): Don't insert in the buffer
! 	if this is not the start of the key sequence.
  
! 	* hideif.el (hide-ifdef-mode): Doc fix.
  
! 	* term/win32-win.el (win32-handle-scroll-bar-event):
! 	Look for `up' and `down' instead of `up-arrow' and `down-arrow'.
  
! Sat May  4 23:50:40 1996  Richard Stallman  <rms@delasyd.gnu.ai.mit.edu>
  
! 	* ps-print.el (ps-print-preprint): Special handling if
! 	file entered in the minibuffer is a directory.
  
! 	* sendmail.el (mail-mode): Line starting with ---- is par separator.
  
! 	* vc-hooks.el (vc-follow-link, vc-find-file-hook):
! 	Use file-chase-links instead of file-truename.
! 	(vc-find-file-hook): Follow a link without asking
! 	if the target is already visited.
  
! Fri May  3 20:50:17 1996  Richard Stallman  <rms@delasyd.gnu.ai.mit.edu>
  
! 	* apropos.el (apropos-print): If command has no key bindings,
! 	say how to run it with M-x.
  
! Fri May  3 14:25:02 1996  Andrew Innes <andrewi@harlequin.co.uk>
  
! 	* winnt.el (original-make-auto-save-file-name): New symbol bound
! 	to old value of make-auto-save-file-name.
! 	(make-auto-save-file-name): New function overriding old.
  
! 	* term/win32-win.el (win32-handle-scroll-bar-event): New function.
  
! Thu May  2 23:18:04 1996  Erik Naggum  <erik@naggum.no>
  
! 	* dired-aux.el (dired-handle-overwrite): `find-backup-file-name'
! 	may return nil, so handle that.
  
! Thu May  2 02:07:15 1996  Richard Stallman  <rms@delasyd.gnu.ai.mit.edu>
  
! 	* gud.el (gud-display-line): Switch to gud buffer before
! 	calling gud-find-file.
  
! 	* info.el (Info-find-node): Don't treat file name `dir' specially
! 	if it comes with a directory name.
  
! Wed May  1 19:50:42 1996  Richard Stallman  <rms@delasyd.gnu.ai.mit.edu>
  
! 	* ps-print.el (ps-print-preprint): If user enters a directory name,
! 	use a suitable file in that directory.
  
! Tue Apr 30 12:11:39 1996  Richard Stallman  <rms@delasyd.gnu.ai.mit.edu>
  
! 	* mouse.el (mouse-drag-region): Doc fix.
  
! Mon Apr 29 23:17:34 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* simple.el (shell-command-on-region): Start of region to keep is
! 	min of endpoints, not max.
  
! Mon Apr 29 14:46:45 1996  Richard Stallman  <rms@delasyd.gnu.ai.mit.edu>
  
! 	* cal-x.el (diary-frame-parameters, calendar-frame-parameters)
! 	(calendar-and-diary-frame-parameters): Take out font, auto-lower
! 	and auto-raise.
  
! Sun Apr 28 19:40:30 1996  Richard Stallman  <rms@delasyd.gnu.ai.mit.edu>
  
! 	* indent.el (indent-for-tab-command): Pass prefix arg to indent-tab.
! 	(insert-tab): Handle prefix arg.
  
! Fri Apr 26 20:13:13 1996  Ed Reingold  <reingold@spiff.gnu.ai.mit.edu>
  
! 	* solar.el (diary-sabbath-candles): Don't correct for DST a second
! 	time.
  
! Fri Apr 26 22:15:40 1996  Andrew Innes <andrewi@harlequin.co.uk>
  
! 	* compile.el (compilation-error-regexp-alist): Add regexp
! 	for Microsoft VC++ error messages containing drive letters.
  
! 	* loadup.el [windows-nt]: Load disp-table.
  
! 	* rmail.el (rmail-insert-inbox-text): When required, prompt for 
! 	pop password and pass on to movemail.
! 	(rmail-pop-password, rmail-pop-password-required): New variables.
! 	(rmail-read-password): New function.
  
! Fri Apr 26 15:10:07 1996  Richard Stallman  <rms@delasyd.gnu.ai.mit.edu>
  
! 	* mouse.el (mouse-drag-region): Leave region highlighted
! 	until the next input event.
  
! Thu Apr 25 23:03:17 1996  Richard Stallman  <rms@delasyd.gnu.ai.mit.edu>
  
! 	* window.el (walk-windows): Doc fix.
  
! Wed Apr 24 19:35:23 1996  Ed Reingold  <reingold@spiff.gnu.ai.mit.edu>
  
! 	* cal-persian.el: Doc fix.
  
! 	* cal-julian.el (calendar-print-astro-day-number): Doc fix.
  
! 	* cal-menu.el (calendar-mouse-print-dates): Doc fix.
  
! Tue Apr 23 11:30:15 1996  Richard Stallman  <rms@delasyd.gnu.ai.mit.edu>
  
! 	* doctor.el (doctor-doc): Add period.
  
! Sat Apr 20 21:33:08 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* files.el (auto-mode-alist): .F gets fortran mode.
  
! 	* simula.el (simula-submit-bug-report): Use emacs-version.
! 	(simula-version): Function and variable deleted.
  
! 	* window.el (walk-windows): Doc fix.
  
! Fri Apr 19 23:16:42 1996  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
  
! 	* info.el (Info-next-reference, Info-prev-reference): Add optional
! 	argument RECUR to avoid infinite recursion on malformed nodes.
  
! Fri Apr 19 21:30:25 1996  Hans Henrik Eriksen  <hhe@ifi.uio.no>
  
! 	* simula.el (simula-tab-always-indent, simula-indent-level)
!  	(simula-substatement-offset, simula-continued-statement-offset)
! 	(simula-label-offset, simula-if-indent, simula-inspect-indent)
! 	(simula-electric-indent, simula-abbrev-keyword, simula-abbrev-stdproc):
! 	Added default constants.
! 	(simula-emacs-features): new constant to hold information
! 	on which flavor if emacs is running (from cc-mode.el).
! 	(simula-mode-menu): Menu definition for Lucid Emacs
! 	(simula-mode-map): Bound new command simula-indent-exp to C-M-q
! 	and added lots of commands to [menu-bar].
! 	(simula-popup-menu): New function for Lucid menus.
! 	(simula-keep-region-active): New function for Lucid menus.
! 	(simula-indent-exp): New command that indents a whole expression.
! 	(simula-indent-line): New strategies for finding the right amount
! 	to indent.
! 	(simula-skip-comment-backward): Added optional parameter stop-at-end
! 	to stop at the first END statement.
! 	(simula-expand-stdproc): Added abbrev expansion to verbatim copy
! 	of abbrev table, same for function simula-expand-keyword.
! 	(simula-search-backward): Added Doc string, and lots of error checking.
! 	(simula-search-forward): Added Doc string, and lots of error checking.
! 	Added hilit19 config code.
! 	(simula-version): New variable and function to report value.
! 	(simula-submit-bug-report): New function to submit bug report.
! 
! Fri Apr 19 16:49:43 1996  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
! 
! 	* term/x-win.el [motif]: Make f10 undefined.
! 
! Fri Apr 19 15:53:36 1996  Torbjorn Einarsson  <T.Einarsson@clab.ericsson.se>
! 
! 	* f90.el (f90-keywords-re): Added operator and result.
! 	(f90-keywords-level-3-re): Added operator and result.
! 	(f90-match-end, f90-looking-at-program-block-start): Fixed bug
! 	with false matching in comments/strings.
! 	(f90-looking-at-program-block-start, f90-imenu-generic-expression):
! 	Added knowledge of pure and extrinsic subroutines.
! 	(f90-abbrev-start): Fixed bug using next-command-event.
! 	(f90-keywords-level-3-re): Added keyword "nullify".
! 	(f90-else-like-re): Fixed indentation of case() statements.
! 	(f90-font-lock-keywords-2): Changed highlighting of case() statements.
! 
! Fri Apr 19 05:30:53 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* metamail.el (metamail-mailer-name): New variable.
! 	(metamail-environment): Add MM_QUIET.
! 	(metamail-switches): Delete -m emacs.
! 	(metamail-interpret-header, metamail-interpret-body): New functions.
! 	(metamail-region, metamail-buffer): New arg VIEWMODE.
! 	
! 	* Optional argument which value is passed to the environment
! 	variable EMACS_VIEW_MODE is added to the function metamail-buffer
! 	and metamail-region.
! 	* files.el (after-find-file): Mention file name in
! 	"auto save is newer" message.
  
! Thu Apr 18 22:40:24 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* term/win32-win.el (x-select-text):  Remember selected text.
! 	(x-get-selection-value): Return nil if the clipboard data is
! 	is the same as the remembered selected text.
  
! Thu Apr 18 08:09:41 1996  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
  
! 	* gnus.el (gnus-summary-pipe-output, gnus-buffer-configuration,
! 	gnus-window-to-buffer): Pop up the shell buffer after piping
! 	articles through a filter.
  
! 	* gnus-ems.el: Make invisible text intangible as well.
  
! Wed Apr 17 06:22:40 1996  Simon Marshall  <simon@spiff.gnu.ai.mit.edu>
  
! 	* replace.el (occur): Fix up interactive code.
! 	Strip text properties from regexp.
  
! Tue Apr 16 14:52:53 1996  Francesco Potorti`  <F.Potorti@cnuce.cnr.it>
  
! 	* vc.el (vc-comment-ring): Initialise using make-ring.
! 	(vc-clear-context): Initialise vc-comment-ring using make-ring.
! 	(vc-finish-logentry): Don't initialise vc-comment-ring here.
  
! Mon Apr 15 15:38:48  Eric Ding <ericding@mit.edu>
  
! 	* goto-addr.el (goto-address-send-using-mh-e):
!  	Renamed from goto-address-send-using-mhe.  Require `mh-comp'.
  
! Mon Apr 15 17:16:12 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* sh-script.el (sh-while-getopts): Punctuate help message better.
  
! 	* cl-extra.el (isqrt): Support expanded range of Lisp integers.
! 	(cl-expt): Bug fix for (expt -1 -N).
! 	(cl-macroexpand-all): Change to support `labels'.
! 	* cl-macs.el (defstruct): Treat multi-nested :include properly.
! 	(flet): Warn when flet rebinds a macro name.
! 	(labels): Rewrite to be fully CL-compliant.
  
! Sat Apr 13 15:40:51 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* completion.el: Provide `completion'.
! 	(cmpl-make-standard-completion-syntax-table): Initialize
! 	all chars (to whitespace if nothing else).
! 	(c-mode-map, fortran-mode-map): Add defvars to avoid warnings.
  
! Fri Apr 12 14:42:11 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* files.el (interpreter-mode-alist): Recognize perl5.
  
! Thu Apr 11 01:09:21 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* mail-utils.el (mail-fetch-field): Use skip-chars-backward
! 	to back over whitespace; don't back up past opoint.
  
! 	* files.el (auto-mode-alist): Handle `.java'.
  
! 	* startup.el (command-line-x-option-alist):
! 	--title or -T sets only the title.  Allow -title as alias too.
  
! Wed Apr 10 01:39:01 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* term/x-win.el (x-handle-display): Set DISPLAY envvar too.
  
! Mon Apr  8 11:36:28 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* disass.el (disassemble-internal): Graceful error if compile failed.
  
! Sun Apr  7 18:30:15 1996  Ed Reingold  <reingold@spiff.gnu.ai.mit.edu>
  
! 	* diary-lib.el (fancy-diary-display): Fix length of separator
! 	string.
  
! Sat Apr  6 22:21:06 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* cal-menu.el (calendar-mouse-goto-date): New function.
! 	Call it instead of calendar-goto-date throughout this file.
! 	(calendar-event-to-date): Switch buffers based on the event.
  
! Fri Apr  5 15:20:12 1996  Simon Marshall  <simon@spiff.gnu.ai.mit.edu>
  
! 	* ehelp.el (electric-help-mode): Use add-hook mouse-leave-buffer-hook.
! 	(electric-help-retain): Use remove-hook.
  
! Fri Apr  5 01:54:09 1996  <Daniel.Pfeiffer@Informatik.START.dbp.de>
  
! 	* gomoku.el (gomoku-click): Position on nearest square.  Adapt keymap
! 	accordingly.
! 	(gomoku-mouse-play): Use it to play nearest to mouse click.
! 	(gomoku-terminate-game): Factorize messages.
! 	(gomoku): Allow interactive passing of board size.  Don't make a fuss
! 	about restarting a game that hasn't progressed.
! 	(gomoku-offer-a-draw): Give user the choice it pretended to give.
! 	(gomoku-point-x): Deleted function.
! 	(gomoku-point-y, gomoku-point-square): Simplified because point is
! 	always on a square.
! 	(gomoku-goto-xy, gomoku-plot-square): Fix line count due to intangible
! 	newlines.
! 	(gomoku-init-display): Once again fairly fast due to minimization of
! 	characters in buffer and text-property operations.  Cursor cannot be
! 	be off a square.
! 	(gomoku-display-statistics): Simplified equivalently.
! 	(gomoku-winning-qtuple-beg, gomoku-winning-qtuple-end)
! 	(gomoku-winning-qtuple-dx, gomoku-winning-qtuple-dy): Pseudo variables
! 	only used for non-functional argument passing deleted.
! 	(gomoku-cross-winning-qtuple): Accordingly deleted function and
! 	(gomoku-check-filled-qtuple): Accordingly adapted.
! 	(gomoku-cross-qtuple): Don't be confused by tabs.
! 	(gomoku-move-down, gomoku-move-up): Simplified because point is always
! 	on square.
! 	(gomoku-beginning-of-line, gomoku-end-of-line): New commands necessary
! 	because intangible newlines perverted these.
  
! Thu Apr  4 19:22:23 1996  Erik Naggum  <erik@naggum.no>
  
! 	* dired.el (dired-noselect): Resolve symbolic links in argument.
  
! Thu Apr  4 17:05:43 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* electric.el (Electric-command-loop):
! 	Set universal-argument-other-key to 0.
  
! Thu Apr  4 11:38:34 1996  Richard Stallman  <rms@lucy.gnu.ai.mit.edu>
  
! 	* rmailsum.el (rmail-summary-scroll-between-messages): New var.
! 	(rmail-summary-scroll-msg-down, rmail-summary-scroll-msg-up):
! 	Obey that var.
  
! 	* isearch.el (isearch-mode): Use add-hook for mouse-leave-buffer-hook.
! 	(isearch-done): Use remove-hook.
  
! Thu Apr  4 17:33:08 1996  Simon Marshall  <simon@spiff.gnu.ai.mit.edu>
  
! 	* timer.el (run-at-time): Allow floating REPEAT values.
  
! Wed Apr  3 17:04:58 1996  Ed Reingold  <reingold@spiff.gnu.ai.mit.edu>
  
! 	* calendar.el (general-holidays): Spelling fix.
  
! Wed Apr  3 14:08:10 1996  Richard Stallman  <rms@lucy.gnu.ai.mit.edu>
  
! 	* gud.el (gud-mode): Doc fix.
  
! Wed Apr  3 01:22:49 1996  Erik Naggum  <erik@naggum.no>
  
! 	* gnus.el (gnus-summary-prepare-threads): Call `gnus-message'
! 	instead of `message'.
  
! 	* startup.el (command-line-1): Document the C- and M- conventions
! 	more completely.
  
! Tue Apr  2 22:07:06 1996  Noah Friedman  <friedman@prep.ai.mit.edu>
  
! 	* files.el (file-newest-backup): Return the newest backup for the
! 	exact file name specified, not the newest backup of all files
! 	whose names start with that substring.
  
! Tue Apr  2 23:42:32 1996  Richard Stallman  <rms@lucy.gnu.ai.mit.edu>
  
! 	* sendmail.el (mail): Once again set default dir to home dir.
  
! Tue Apr  2 10:14:03 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* timer.el (timer-event-handler): Save copies of events too.
  
! Sun Mar 31 20:41:37 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* hexl.el (hexlify-buffer, dehexlify-buffer): Clear out the undo
! 	info, and don't record undo info for the conversion.
  
! Fri Mar 29 19:07:36 1996  Ed Reingold  <reingold@spiff.gnu.ai.mit.edu>
  
! 	* solar.el: Misc fixes to arc-trig functions.
  
! Fri Mar 29 17:39:33 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* rmail.el (rmail-forward): Put the "end" line right after the
! 	forwarded message; the signature goes after.
  
! Fri Mar 29 12:34:40 1996  Ed Reingold  <reingold@mole.gnu.ai.mit.edu>
  
! 	* cal-persian.el: New file.
  
! 	* diary-lib.el, calendar.el: Add Persian calendar.
  
! 	* cal-menu.el (calendar-mode-map,calendar-mouse-print-dates): Add
!  	Persian calendar.
  
! Thu Mar 28 19:37:29 1996  Michael Kifer  <kifer@cs.sunysb.edu>
  
! 	* viper.el and related files: copyright message updated.
! 	Also, added eval-when-compile's to reduce the number of warnings.
! 	* viper.el (vip-add-newline-at-eob-if-necessary):
! 	don't add newline for read-only files.
! 	* viper-util.el (vip-set-replace-overlay): made non-detachable
! 	under XEmacs.
! 	* viper-ex.el (ex-next): bug fix.
! 	* viper-macs.el (vip-events-to-macro):
! 	discard events represented as lists in macro
! 	definitions.
! 	* viper-mous.el (vip-mouse-click-insert-word): fixed a typo.
  
! Thu Mar 28 13:10:24 1996  Richard Stallman  <rms@charlie-brown.gnu.ai.mit.edu>
  
! 	* tmm.el (tmm-define-keys): New arg MINIBUFFER.
! 	(tmm-add-prompt): Pass new arg in both calls.
  
! Wed Mar 27 23:40:01 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* facemenu.el (list-text-properties-at): Display category's properties.
  
! Wed Mar 27 23:36:01 1996  Geoff Voelker  <voelker@cs.washington.edu>
  
! 	* makefile.nt: Change uses of del to $(DEL).
  
! Wed Mar 27 17:18:19 1996  Simon Marshall  <simon@spiff.gnu.ai.mit.edu>
  
! 	* rmail.el (rmail-fontify-message, rmail-unfontify-buffer-function):
! 	Reset the buffer modified state if necessary.
  
! Wed Mar 27 16:29:55 1996  Boris Goldowsky  <boris@gnu.ai.mit.edu>
  
! 	* avoid.el (mouse-avoidance-old-pointer-shape): New vbl.
! 	(mouse-avoidance-mode): Save old pointer shape when entering
! 	protean mode; restore when exiting.
  
! Tue Mar 26 19:13:13 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* sh-script.el (sh-alias-alist): Recognize lignux.
  
! 	* dired.el (dired-chown-program): Recognize lignux.
  
! 	* gnus-cus.el (gnus-make-face, custom-declare):
! 	Rename custom-asis to custom:asis.
  
! Mon Mar 25 11:28:42 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* files.el (set-visited-file-name): Don't call find-buffer-visiting
! 	if filename is nil.
  
! 	* custom.el (custom:asis): Renamed from custom-asis.
  
! 	* mouse.el (mouse-buffer-menu): Keep the order of buffers straight.
  
! 	* timer.el (timer-event-handler): Record the last few events.
  
! Sun Mar 24 07:38:34 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* sh-script.el (sh-shell-arg): Add no options for bash, ksh, or wksh.
  
! 	* ange-ftp.el (ange-ftp-wait-not-busy): New subroutine.
! 	Kill ftp process if user quits.
! 	(ange-ftp-raw-send-cmd): Use that.
! 	(ange-ftp-fix-dir-name-for-cms): Fix error message.
  
! 	* timer.el (timer-event-handler): Inhibit quitting.
  
! Sun Mar 24 06:02:54 1996  Jonathan Kamens  <jik@cam.ov.com>
  
! 	* terminal.el (te-terminal-name-prefix): Change from
!  	"emacs-virtual" to "emacs-em", so that things will work on systems
!  	which allow only short terminal-type names.
! 	(terminal-emulator): Delete the hyphen between
!  	te-terminal-name-prefix and the width and height of the window.
! 	(te-create-terminfo): Reformat the terminfo entry slightly.
  
! 	* terminal.el (te-terminfo-directory): New variable.
! 	(te-create-terminfo, te-tic-sentinel): Use te-terminfo-directory.
  
! Sat Mar 23 10:46:03 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* timer.el (timer-set-time): Don't set usecs to nil.
! 	(timer-duration): Return nil if junk at end of string.
! 	Handle just a number--treat it as number of seconds.
  
! 	* ange-ftp.el (ange-ftp-dired-call-process): Return 1 if error.
! 	(ange-ftp-call-chmod): If ftp chmod cmd fails, try rsh.
! 	(ange-ftp-remote-shell): New variable.
  
! 	* timer.el (timer-event-handler): Catch errors when running the event.
  
! 	* ange-ftp.el (ange-ftp-call-chmod): Return proper value.
  
! Sat Mar 23 00:32:19 1996  Per Abrahamsen  <abraham@dina.kvl.dk>
  
! 	* custom.el (custom-type-properties):
! 	Use custom-asis instead of as-is. 
! 	(custom-asis): Set it to itself.
! 	* gnus-cus.el: Use custom-asis instead of as-is. 
  
! Fri Mar 22 18:25:21 1996  Michelangelo Grigni  <mic@mathcs.emory.edu>
  
! 	* ffap.el: Doc fixes.  Reorganized.  Retired v18 support.
! 	(ffap-bindings): Offers a default installation.
! 	(ffap-string-at-point): Modified arguments.
! 	(ffap-gnus-hook): Updated for Gnus 5.
! 	(ffap-tex-init): Delayed initialization of `ffap-tex-path'.
! 	(ffap-dired): New entry in `ffap-alist'.
! 	(ffap-menu-rescan): May fontify the choices in buffer.
! 	(ffap-read-file-or-url): `PC-completion-as-file-name-predicate'
!  	used if available, to work with complete.el.
  
! Fri Mar 22 08:20:31 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* faces.el (x-frob-font-slant): Properly handle a match against
! 	x-font-regexp-head.
! 	(x-frob-font-weight): Separate two cond cases by analogy with 
! 	x-frob-font-slant.
  
! 	* vc.el (vc-update-change-log): Use add-log-full-name and
! 	add-log-mailing-address only if non-nil.
  
! 	* add-log.el (add-log-full-name, add-log-mailing-address):
! 	Add autoload cookies.
  
! Fri Mar 22 03:32:41 1996  <Daniel.Pfeiffer@Informatik.START.dbp.de>
  
! 	* gomoku.el: Ancient leading comment removed.
! 	(gomoku-mode-map): Added numeric keypad for 8 directions, changed
! 	comments to lowercase (C-c rather than C-C), added SPC to play and
! 	undo's binding to go back.
!  	(gomoku-emacs-won, gomoku-font-lock-O-face, gomoku-font-lock-X-face)
! 	(gomoku-font-lock-keywords):  New variables.
! 	(gomoku-mode): Use it and make buffer read-only for user.
! 	(gomoku-terminate-game): Remove (ding) -- maybe should be optonal.
! 	(gomoku-init-display): Rewritten, makes fields intangible so you
! 	can't go in between.  Make free fields have mouse-face.
! 	(gomoku-cross-qtuple): Take account of intangible text, and that
! 	empty lines are now really empty.
! 	(gomoku-move-left, gomoku-move-right): Removed thanks to intangibility.
! 	(gomoku-move-ne, -se, -nw, -sw): Use normal left / right motion.
  
! Fri Mar 22 01:48:22 1996  Lars Magne Ingebrigtsen  <larsi@dain.ifi.uio.no>
  
! 	* elp.el (elp-instrument-package): Don't instrument keymaps and
! 	autoloaded functions.
  
! Thu Mar 21 06:30:59 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* cplus-md.el (indent-c++-exp): Use calculate-c-indent-after-brace.
! 	(c++-mode): Require c-mode.
  
! 	* gnus-cus.el (custom-declare): Change `as' to `as-is'.
  
! Thu Mar 21 03:14:12 1996  Per Abrahamsen  <abraham@dina.kvl.dk>
  
! 	* custom.el (custom-type-properties): Add new type `triggle' for
! 	use with "boolean" face properties.
  
! Wed Mar 20 11:17:21 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* sh-script.el (sh-font-lock-keywords): Highlight \ only with
! 	non-alphanumeric.
  
! Tue Mar 19 15:03:53 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* edebug.el (edebug-eval-defun): Convert defvar to defconst.
  
! 	* gnus-cus.el (gnus-make-face): Redo Feb 20 change.
  
! 	* custom.el (custom-face-hack): Avoid evalling the args
! 	in the list that the export function returns.
  
! 	* inf-lisp.el (switch-to-lisp): Sometimes turn on pop-up-frames.
  
! 	* fill.el (fill-region-as-paragraph): Fix the second check for
! 	whether we reached the end of the paragraph.
  
! Mon Mar 18 18:58:14 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* window.el (count-windows): Doc fix.
  
! Mon Mar 18 19:43:35 1996  Francesco Potorti`  <F.Potorti@cnuce.cnr.it>
  
! 	* simple.el (insert-buffer): Interactive default changed to a more
!  	reasonable one.
  
! Sun Mar 17 14:08:22 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* fill.el (fill-context-prefix): Unused var `eol' deleted.
  
! Sat Mar 16 17:45:39 1996  Geoff Voelker  <voelker@cs.washington.edu>
  
! 	* term/win32-win.el: Don't define backspace, M-backspace, delete,
! 	and M-delete; they are already defined in winnt.el.
  
! Sat Mar 16 05:46:58 1996  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* replace.el (occur): If no matches, just display in echo area.
  
! 	* emacsbug.el (report-emacs-bug): Use a different address
! 	for pretest versions.
  
! 	* comint.el (comint-exec-1): Use dumb instead of unknown, for terminfo.
  
! Thu Mar 14 10:32:48 1996  Roland McGrath  <roland@charlie-brown.gnu.ai.mit.edu>
  
! 	* compile.el (compilation-find-buffer): Only choose
!  	compilation-last-buffer if it is compilation-buffer-p.
  
! Thu Mar 14 07:26:48 1996  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* map-ynp.el (map-y-or-n-p): Fix previous change.
! 	Delete autoload cookie (file is preloaded).
  
! 	* imenu.el (imenu-generic-expression):
! 	Autoload the make-variable-buffer-local call.
  
! Tue Mar 12 00:20:41 1996  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* lisp-mode.el (lisp-fill-paragraph): Treat code-and-comment
! 	case specially.
  
! Mon Mar 11 20:28:39 1996  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
  
! 	* gnus-cus.el (gnus-make-face): Undo Feb 20 change.
  
! Fri Mar  8 16:54:19 1996  Ethan Bradford  <ethanb@phys.washington.edu>
  
! 	* mailalias.el (mail-get-names): Understand "+username" format for
! 	/etc/passwd lines.
  
! Fri Mar  8 16:45:28 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* imenu.el (imenu--menubar-select): Handle the "rescan" item.
! 	(imenu--mouse-menu): Pass proper arg to x-popup-menu.
  
! Fri Mar  8 14:25:35 1996  Gregory Neil Shapiro  <gshapiro@scooter.WPI.EDU>
  
! 	* mailabbrev.el (mail-abbrev-modtime): New variable.
! 	(mail-abbrevs-sync-alaises): New function. Updates mail-abbrevs if
! 	modtime of mail-personal-alias-file is different than
! 	mail-abbrev-modtime.
! 	(mail-abbrevs-setup): Call mail-abbrevs-sync-aliases.
  
! Fri Mar  8 18:29:27 1996  Erik Naggum  <erik@naggum.no>
  
! 	* cl-extra.el (equalp): Use string-equal on strings.
  
! Fri Mar  8 12:40:49 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* menu-bar.el (menu-bar-tools-menu): Delete ediff-doc and
! 	eregistry items.
  
! 	* help.el (describe-mode): Handle minor mode w/o mode line indicator.
  
! 	* bibtex.el (bibtex-version): Variable deleted.
!  	(bibtex-submit-bug-report): Don't use that.
  
! Thu Mar  7 13:14:22 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* rmailsum.el (rmail-make-basic-summary-line): Limit line count
! 	to reformatted header if we have reformatted it.
  
! 	* ehelp.el (with-electric-help): Make buffer read-only as last thing.
  
! Thu Mar  7 05:40:24 1996  Simon Marshall  <simon@spiff.gnu.ai.mit.edu>
  
! 	* font-lock.el (font-lock-set-defaults): Also test font-lock-keywords
! 	against compiled null keywords.
  
! 	* rmail.el (rmail-fontify-buffer-function): Fontify any message here.
  
! Thu Mar  7 02:09:13 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* font-lock.el (font-lock-fontify-block):
! 	Use facemenu-keymap to make the binding.
  
! Wed Mar  6 20:04:42 1996  Espen Skoglund  <espensk@tklab3.cs.uit.no>
  
! 	* pascal.el (pascal-declaration-end): Now locates the end of a
! 	parameterlist correctly.
! 	(electric-pascal-tab): Never indented a line when
! 	pascal-tab-always-indent was set to nil.
! 	(pascal-indent-case): Now locates the end of a case-statement
! 	correctly.
  
! Wed Mar  6 02:47:59 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* tar-mode.el (tar-subfile-mode): Doc fix.
! 	(tar-extract): Call tar-subfile-mode after setting buffer-read-only
! 	and the buffer modified flag.
  
! Wed Mar  6 08:03:18 1996  Stefan Schoef  <schoef@OFFIS.Uni-Oldenburg.DE>
  
! 	* bibtex.el (bibtex-pop): New generic function which unifies the
!  	functionality of bibtex-pop-previous and bibtex-pop-next.  Now,
!  	bibtex-pop moves to the end of field after the pop.  Concatenated
!  	strings are now handled correctly.  Delimiters are not added to
!  	non-delimited entries.  Changed occurences of
!  	bibtex-text-in-cfield to bibtex-text-in-field.
! 	(bibtex-pop-previous, bibtex-pop-next): Call bibtex-pop.
! 	(bibtex-complete-string): Fixed bug that removed delimiters
! 	around the following field if current field is already
! 	undelimited on completion.
! 	(bibtex-complete-string, bibtex-remove-double-quotes-or-braces):
! 	Only remove delimiters if field text is not concatenated.
! 	(bibtex-font-lock-keywords): Use the same regexps used
! 	in all other places of bibtex.el to parse the buffer.
! 	(bibtex-mode): Changed the definition of font-lock-defaults,
! 	so that quote-delimited entries aren't fontified as strings anymore.
! 	(bibtex-parse-keys): Changed the regexp used for finding
! 	crossref entries.
! 	(bibtex-field-const, bibtex-reference-key): Fixed the regexp
! 	to match more of the characters allowed here by BibTeX/LaTeX.
! 	(bibtex-field-name): Made it less restrictive.
! 	(bibtex-field-string): Changed so that quote-delimited entries
! 	with quotes inside aren't a problem anymore.  Changed nesting
! 	level of braces in entries to support three inner braces.
! 	(bibtex-validate-buffer): By giving an optional argument, the
! 	user can now let it not validate the whole buffer, but only
! 	the portion starting at point.  Small modification in strategy
! 	used to find next entry.
! 	(bibtex-print-help-message): Ignore case in field name when
! 	searching for help text.
! 	(bibtex-submit-bug-report): New function.
  
! Wed Mar  6 00:11:07 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* saveplace.el (save-place-kill-emacs-hook):
! 	Always call save-places-to-alist.
  
! 	* profile.el (profile-convert-byte-code): New function.
! 	(profile-a-function): Use profile-convert-byte-code.
  
! 	* bytecomp.el (post-command-idle-hook, post-command-idle-delay):
! 	Mark obsolete.
  
! 	* complete.el (PC-completion-as-file-name-predicate):
! 	Replace PC-do-completion-filename-completers.
! 	(PC-do-completion): Use that.
  
! Tue Mar  5 16:40:05 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* cl-extra.el (equalp): Correctly compare last elt of two lists.
  
! 	* mailabbrev.el (mail-abbrevs-setup): Doc fix.
  
! 	* texinfo.el (texinfo-section-types-regexp)
! 	(texinfo-section-level-regexp, texinfo-subsection-level-regexp)
! 	(texinfo-subsubsection-level-regexp): Add defvars.
  
! Tue Mar  5 16:40:33 1996  Per Abrahamsen  <abraham@dina.kvl.dk>
  
! 	* texinfo.el (texinfo-section-list): New variable.
! 	(texinfo-outline-level): New function.
! 	(texinfo-mode): Use them.
  
! Tue Mar  5 11:32:49 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* complete.el (PC-do-completion-filename-completers): New variable.
! 	(PC-do-completion): Use it.
  
! 	* desktop.el: Global vars mam, fn, bn, misc renamed.
! 	(desktop-buffer-misc): Renamed from misc.  Add defvar.
! 	(desktop-buffer-major-mode): Renamed from mam.  Add defvar.
! 	(desktop-buffer-file-name): Renamed from fn.  Add defvar.
! 	(desktop-buffer-name): Renamed from bn.  Add defvar.
! 	(desktop-create-buffer, desktop-buffer): Use new names.
  
! Mon Mar  4 14:59:29 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* desktop.el (desktop-list*): New function.
! 	(desktop-internal-v2s): Generate output using desktop-list*.
  
! 	* saveplace.el (save-place-kill-emacs-hook): Don't save
! 	if we never loaded the save-place-file.
  
! 	* rmail.el (unforward-rmail-message): Add autoload declaration.
! 	* undigest.el (unforward-rmail-message): Delete autoload cookie.
  
! 	* rmail.el (rmail-unix-mail-delimiter): Don't accept newlines in month.
  
! Sun Mar  3 18:32:37 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* indent.el (beginning-of-line-text):
! 	Check adaptive-fill-regexp is non-nil.
  
! 	* dunnet.el: Require cl only when compiling.
!  	(scroll-step): Don't set it globally.
! 	(dun-mode): Set scroll-step locally.
  
! Sun Mar  3 20:03:16 1996  Per Abrahamsen  <abraham@dina.kvl.dk>
  
! 	* texinfo.el (texinfo-font-lock-keywords): Fixed regexp for `@end'
! 	and `@item'.
  
! Sun Mar  3 00:53:01 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* dired-aux.el (dired-compress-file-suffixes): New variable.
! 	(dired-compress-file): Use that to control file naming.
  
! Sat Mar  2 14:54:00 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* font-lock.el (global-map): Change C-M-g to M-g M-g.
  
! 	* cc-mode.el (set-c-style): Autoload the definition.
! 	(c-set-style): Add autoload cookie.
  
! Fri Mar  1 20:31:29 1996  Johan Vromans  <jvromans@squirrel.nl>
  
! 	* forms.el (forms-insert-after):
! 	New variable. Non-nil means: inserts of new
! 	records go after current record, also initial position is at last
! 	record.
! 	(forms-mode, forms-insert-record): Use it.
  
! Fri Mar  1 10:37:20 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* files.el (set-visited-file-name): Query if there's already another
! 	buffer visiting this file.
  
! 	* startup.el (command-line-normalize-file-name): Do save-match-data.
  
! 	* imenu.el (imenu--menubar-select): No longer interactive.
! 	(imenu-create-submenu-name): Function deleted.
! 	(imenu-example--create-lisp-index): Don't use it.
! 	(imenu--generic-function): Don't use imenu-create-submenu-name.
! 	(imenu-submenu-name-format): Variable deleted.
! 	(imenu--split-menu): Use TITLE as the head of the new list.
! 	Don't split if everything fits in one level.
! 	(imenu--split-submenus): New function.
! 	(imenu-update-menubar): Use imenu--split-submenus.
! 	(imenu--mouse-menu): Use imenu--split-submenus.
  
! 	* imenu.el (imenu-submenu-name-format): Delete the `...'.
  
! 	* skeleton.el: Add provide call.
  
! Thu Feb 29 17:00:29 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* simple.el (backward-delete-char-untabify):
! 	Don't handle overwrite-mode here (done in delete-backward-char).
  
! Thu Feb 29 03:20:58 1996  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
  
! 	* lisp-mode.el (emacs-lisp-byte-compile-and-load): Correct logic.
  
! Wed Feb 28 13:19:29 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* server.el (server-process-filter):
! 	Use command-line-normalize-file-name.
  
! 	* startup.el (command-line-normalize-file-name):
! 	Convert /// at beginning to just /.
  
! 	* iso-acc.el (iso-languages): Add ~? and ~!.
  
! Wed Feb 28 04:22:25 1996  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
  
! 	* font-lock.el (turn-on-font-lock-if-enabled): Bind inhibit-quit.
! 	(font-lock-value-in-major-mode): New function to process alists.
! 	(font-lock-mode, font-lock-set-defaults): Use it.
! 	(font-lock-choose-keywords): Don't process alists here.
! 	(global-font-lock-mode): Show message if extra arg MESSAGE is non-nil.
  
! 	* subr.el (get-buffer-window-list): Take args like next-window not
! 	get-buffer-window.
  
! 	* timer.el (timer-set-time, timer-set-time-with-usecs): Doc fix.
! 	(run-at-time, with-timeout): Doc fix.
! 	(run-with-timer): Just call run-at-time.
! 	(timer-set-idle-time): New function.
! 	(run-with-idle-timer): Use it to set the idle time.
! 	Doc fix.  Fix interactive code.
  
! 	* time.el (display-time): Just use run-at-time to start the timer.
  
! 	* paren.el: (show-paren-delay): New variable.
! 	(show-paren-mode): New command.  Use it.  Call it at the top-level.
! 	(show-paren-mode, show-paren-idle-timer): New variables.
! 	(show-paren-function): Renamed from show-paren-command-hook.
  
! Tue Feb 27 17:41:32 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* levents.el (timeout-event-p): Function deleted.
  
! 	* compile.el (compilation-parse-errors):
! 	Collapse //'s using command-line-normalize-file-name.
  
! 	* startup.el (command-line-normalize-file-name):
! 	Don't collapse // at start of file name.
  
! 	* server.el (server-process-filter):
! 	Don't collapse // at start of file name.
  
! 	* frame.el (handle-delete-frame): Use save-buffers-kill-emacs.
  
! 	* time.el (display-time): Use rmail-after-get-new-mail-hook.
  
! 	* rmail.el (rmail-get-new-mail): Run rmail-after-get-new-mail-hook.
  
! Tue Feb 27 11:31:50 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* iso-transl.el (iso-transl-dead-key-alist): Fix syntax for ?^.
  
! Mon Feb 26 14:16:12 1996  Mark Osbourne  <marko@lexis-nexis.com>
  
! 	* hexl-mode.el (hexl-mode-exit, hexl-maybe-dehexlify-buffer):
! 	Corrected write-contents-hook to write-contents-hooks.
  
! Mon Feb 26 14:33:01 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* tpu-edt.el (tpu-load-xkeys): Fix previous change.
  
! 	* make-mode.el (makefile-runtime-macros-list): Add + to the list.
  
! Mon Feb 26 13:40:41 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* cal-china.el, cal-islam.el: Renamed from cal-chinese.el and
! 	cal-islamic.el to avoid 14-character limitation.
! 	* calendar.el, diary-lib.el, holidays.el: Fix autoload references.
  
! Mon Feb 26 00:48:36 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* iso-acc.el (iso-acc-minibuf-setup): New function.
! 	Add it to minibuf-setup-hook.
  
! Mon Feb 26 03:53:52 1996  Erik Naggum  <erik@naggum.no>
  
! 	* rmailsum.el (rmail-make-basic-summary-line): Fix previous change.
  
! 	* rmail.el (rmail-clear-headers): Bind case-fold-search to t
!  	across the whole function.
  
! Sun Feb 25 19:59:04 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* sendmail.el (mail-mode-map): Bind M-TAB to mail-complete.
  
! 	* mailalias.el (mail-complete): Add autoload cookie.
  
! 	* undigest.el (unforward-rmail-message): Add autoload cookie.
  
! Mon Feb 26 00:53:13 1996  Paul Eggert  <eggert@twinsun.com>
  
! 	* vc-hooks.el (vc-find-cvs-master): Don't require a "/" after the
! 	modification time in CVS/Entries, since the time may be followed
! 	by a conflict notice (in CVS 1.7) or by some other value (in CVS 1.3).
  
! Sun Feb 25 13:28:56 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* vc-hooks.el (vc-follow-link): Kill buffer before creating new one.
  
! 	* finder.el (finder-compile-keywords-make-dist): New function.
  
! 	* emerge.el (emerge-combine-versions-template): Make the
! 	generated comments on the #else and #endif follow the GNU standards.
  
! 	* ps-print.el (ps-generate): Bind inhibit-read-only.
  
! 	* info.el (Info-index): If fail, go back to original node.
! 	(Info-find-node): Make error messages consistent.
! 	(Info-insert-dir): Fix error message.
  
! Sat Feb 24 07:54:23 1996  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
  
! 	* mail-utils.el (rmail-dont-reply-to): Allow parsing lists of
! 	addresses with comment fields.
  
! Fri Feb 23 19:36:08 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* imenu.el (imenu-add-to-menubar): Add menu item for current buf only.
! 	(imenu-update-menubar): Never add menu item here.
  
! 	* undigest.el (unforward-rmail-message):
! 	Handle any kind of forwarding delimiters.
  
! Fri Feb 23 19:31:51 1996  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
  
! 	* nntp.el (nntp-request-post): Clear the server buffer before
! 	sending text to the server.
  
! Fri Feb 23 01:39:49 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* decipher.el: Load cl within eval-when-compile.
! 	(decipher-font-lock-keywords): Fix doc patching error.
  
! 	* sendmail.el (mail-mode): Treat `-- ' line as paragraph separator.
  
! 	* vc-hooks.el (vc-follow-link): Simplify by taking advantage
! 	of Feb 21 change in find-file-noselect.
  
! Thu Feb 22 22:49:13 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* man.el (man): Don't call Man-init-defvars here.
! 	Do it at top level instead.
! 	(Man-init-defvars): Now a defun, not a defsubst.
! 	Don't set Man-uses-untabify-flag.
! 	(Man-uses-untabify-flag): Add doc string.  Make default value t.
! 	(Man-filter-list): Add doc string.
  
! 	* rmailsum.el (rmail-make-basic-summary-line): Less space before subj.
  
! Thu Feb 22 08:15:06 1996  Andre Spiegel  <spiegel@berlin.informatik.uni-stuttgart.de>
  
! 	* vc-hooks.el: (vc-follow-link): New function.
! 	(vc-find-file-hook): Use it.
  
! Thu Feb 22 02:49:22 1996  Erik Naggum  <erik@naggum.no>
  
! 	* fill.el (fill-region-as-paragraph): Doc fix.
  
! 	* comint.el (make-comint, comint-run): Fix autoload cookie.
  
! Wed Feb 21 20:02:34 1996  Christopher J. Madsen  <ac608@yfn.ysu.edu>
  
! 	* decipher.el (decipher-mode): Removed nonstandard font-lock support.
! 	(decipher-make-checkpoint, decipher-resync): Removed special
!  	support for font-lock.
! 	(decipher-resync): Removed `$' from regexps.
! 	(decipher-set-map): Use font-lock-fontify-region-function.
! 	(decipher-font-lock-keywords): Removed newlines from regexps.
! 	(decipher-use-font-lock): Deleted.
! 	(decipher-toggle-font-lock, decipher-turn-on-font-lock): Deleted.
  
! Wed Feb 21 16:17:43 1996  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* vc-hooks.el: Move all the put's for menu-enable props to top level.
! 	(vc-next-action, vc-toggle-read-only): Enable whenever vc-mode.
  
! 	* startup.el (before-init-hook, after-init-hook): Doc fix.
! 	(term-setup-hook): Doc fix.
! 	(emacs-startup-hook): New defvar.
  
! 	* paren.el: Use run-with-idle-timer, not post-command-idle-hook.
  
! 	* rnewspost.el (news-reply-mode-map): Delete news-reply-signature.
! 	(news-reply-signature): Improve the message.
  
! 	* ps-print.el (ps-generate-postscript-with-faces):
! 	Handle buffer-invisibility-spec when interpreting the invisible prop.
  
! 	* lisp-mode.el (lisp-fill-paragraph): When filling a comment,
! 	find paragraph bounds by hand, and pass the SQUEEZE-AFTER arg
! 	to fill-region-as-paragraph.
  
! 	* fill.el (fill-region-as-paragraph): New arg SQUEEZE-AFTER.
  
! 	* doctor.el: More censorship.
  
! 	* undigest.el (unforward-rmail-message): New command.
  
! 	* cplus-md.el (c++-mode-syntax-table): Don't use c-mode-syntax-table.
  
! 	* timer.el (run-with-idle-timer): New function.
! 	(timer-create, timerp): Leave a slot for idle-delay.
! 	(timer-activate-when-idle): New function.
! 	(timer-event-handler): Handle idle-delay timers specially.
! 	(cancel-timer, cancel-function-timers): Handle idle-delay timers.
  
! 	* perl-mode.el (perl-imenu-generic-expression): Recognize packages.
  
! 	* rnewspost.el (news-reply-yank-message-id, news-reply-yank-from):
! 	Fix swapped args in defvars.
  
! 	* simple.el (shell-command): Call file name handler.
  
! 	* imenu.el (imenu-buffer-menubar): Add defvar.
! 	(imenu-update-menubar): Make a buffer-specific copy of the local map.
  
! 	* ange-ftp.el (dired-call-process): Put on ange-ftp property.
! 	* dired-aux.el (dired-call-process): Call file name handler.
  
! 	* files.el (find-file-noselect): If after-find-file switches buffers,
! 	return the buffer that it leaves current.
  
! 	* derived.el (derived-mode-merge-syntax-tables): Use inheritance.
  
! 	* dunnet.el (dun-urinate): Renamed.
! 	(dun-verblist): Indecent word deleted.
! 	(dunnet): Print "censored" message.
  
! 	* time.el (display-time-update): New subroutine broken out from
! 	display-time-event-handler.
  
! 	* time.el (display-time): Add hook to rmail-get-new-mail-hook.
  
! 	* rmail.el (rmail-get-new-mail): Don't mess with display-time here.
  
! Wed Feb 21 16:17:11 1996  Boris Goldowsky  <boris@gnu.ai.mit.edu>
  
! 	* fill.el (canonically-space-region): Use insert-before-markers
! 	when inserting spaces at end of line.
  
! Wed Feb 21 12:16:39 1996  Anders Lindgren  <andersl@csd.uu.se>
  
! 	* follow.el: Update some doc string.  Call `add-minor-mode'.
!  	(follow-windows-start-end-cache, follow-cache-command-list):
! 	New variables.
! 	(follow-cache-valid-p, follow-invalidate-cache): New functions.
! 	(follow-windows-start-end, follow-post-command-hook,
! 	follow-generic-filter): Cache support added.
! 	(follow-avoid-tail-recenter): Problem with minibuffer-only
! 	frames corrected.
! 	(follow-windows-aligned-p): Minor change.
  
! Wed Feb 21 02:29:28 1996  Roland McGrath  <roland@charlie-brown.gnu.ai.mit.edu>
  
! 	* compile.el (compilation-minor-mode): Run compilation-minor-mode-hook.
  
! 	* c-mode.el: Added provide.
  
! Tue Feb 20 14:15:14 1996  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
  
! 	* gnus-msg.el (gnus-inews-insert-headers): Check whether Sender
! 	and From are equal before inserting a Sender header.
  
! 	* nnheader.el (nnheader-insert-head): Make sure the entire head of
! 	the article is inserted.
  
! 	* gnus-cus.el (gnus-make-face):
! 	Use `as-is' parameters to `custom-face-lookup'.
  
! Tue Feb 20 13:38:52 1996  Erik Naggum  <erik@naggum.no>
  
! 	* finder.el: Removed (require 'picture).
! 	(finder-insert-at-column): New function.
! 	(finder-list-keywords, finder-list-matches): Use it.
  
! Mon Feb 19 03:08:54 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* files.el (interpreter-mode-alist): Add mawk.
! 	(set-auto-mode): Allow either space or tab in #! line.
  
! Mon Feb 19 02:51:34 1996  Christopher J. Madsen  <ac608@yfn.ysu.edu>
  
! 	* decipher.el (decipher-mode): Added special support for font-lock.
! 	(decipher-set-map, decipher-insert): Likewise.
! 	(decipher-make-checkpoint, decipher-resync): Likewise.
! 	(decipher-use-font-lock, decipher-font-lock-keywords): New vars.
! 	(decipher-toggle-font-lock, decipher-turn-on-font-lock): New funcs.
  
! Fri Feb 16 21:33:19 1996  Michael Kifer  <kifer@cs.sunysb.edu>
  
! 	* viper-mous.el (vip-mouse-click-insert-word): Fixed a typo.
  
! 	* viper-macs.el (ex-map-read-args,ex-unmap-read-args): Fixed messages.
! 	(vip-events-to-macro): Delete nil in macro definitions.
! 	(vip-events-to-macro): Discard events represented as lists in
!  	macro definitions.
  
! 	* menu-bar.el: Added [ediff-doc] and [eregistry] to
!  	menu-bar-tools-menu.
  
! 	* ediff-util.el: Changed file name length from 8 to 7 under DOS.
! 	(ediff-make-temp-file): Should work with DOS now.
! 	(ediff-copy-list): Made cl-independent.
  
! 	* ediff-util.el, ediff-diff.el, ediff-wind.el:
! 	Added face support for XEmacs TTY and DOS.
  
! 	* ediff-util.el, ediff-wind.el, ediff-init.el
! 	(ediff-prefer-long-help-message): renamed into
!  	ediff-use-long-help-message.
  
! 	* ediff-init.el, ediff-wind.el: Fixed make-ctl-frame for xemacs.
  
! 	* ediff-wind.el (ediff-setup-control-frame): Control frame's
!  	surrogate minibuffer changes without the need to delete the frame.
  
! 	* ediff-merg.el: Changed some defaults.
  
! 	* ediff-mult.el (ediff-show-meta-buffer): Protected against errors
!  	when meta-buffer is invisible.
  
! 	* ediff-wind.el (ediff-skip-unsuitable-frames): Won't select small
!  	frames any more.
! 	(ediff-setup-control-frame): Won't grab mouse on quit.
  
! 	* ediff-hook.el: Added Ediff Manual.
  
! 	* ediff.el, ediff-util.el (ediff-make-temp-file): Preserves buffer
!  	file names as much as possible.
  
! 	* ediff-util.el (ediff-compute-custom-diffs-maybe): Now handles
!  	temp file names correctly.
! 	(ediff-intersection, ediff-union, ediff-set-difference,
!  	ediff-copy-list): Functions modified.
! 	(ediff-union, ediff-intersection, ediff-set-difference): New
!  	functions.  Moved ediff-documentation to ediff.el.
  
! 	* ediff.el: Made all Ediff faces hidden from facemenu.
  
! 	* ediff-init.el (ediff-hide-face): New function.
! 	(ediff-collect-diffs-metajob): Fixed.
! 	(ediff-check-for-cl-seq): Function deleted
! 	(ediff-abbreviate-file-name): Now a defun.
! 	(ediff-has-face-support-p): New function.  Ediff now supports
! 	faces whenever possible.
! 	(ediff-force-faces): New variable.
  
! 	* ediff-diff.el (ediff-set-diff-overlays-in-one-buffer): Takes
!  	advantage of advance-front/rear features of overlays.  Works
!  	synchronously for DOS, Windows.
  
! 	* ediff-util.el (ediff-copy-diff,ediff-pop-diff,
!  	ediff-make-bullet-proof-overlay): These now take advantage of
!  	advance-front/rear features of overlays.
  
! 	* ediff.el (ediff-patch-file): Epatch now ignores VERSION_CONTROL
!  	environment variable and prevents the use of the -V option in GNU
!  	diff.
! 	(run-ediff-from-cvs-buffer): New function.  Moved all
!  	version-control-related stuff to a new file, ediff-vers.el.
  
! 	* ediff-util.el (ediff-save-buffer-in-file): New function
! 	(ediff-visible-region): No longer narrows the merge buffer.
! 	(ediff-status-info): Now tells if we are focusing on regions where
!  	both buffers differ from the ancestor.
! 	(ediff-jump-to-difference, ediff-get-diff-posn): Changed message.
! 	(ediff-compute-custom-diffs-maybe): Now works for merge jobs.
  
! 	* ediff-mult.el: Now uses ediff-check-for-cl-seq to make sure
!  	cl-seq is loaded.
! 	(ediff-append-custom-diff): Finds custom diffs in more cases.
!   	Ediff is no longer dependent on cl.el.  Added ediff-union to
!  	smooth out the possible differences between common emacs
!  	intersection/union and cl.el.
  
! 	* viper.el: Added face support for devices that have faces.
! 	(vip-forward-paragraph,vip-backward-paragraph): Now work
! 	corretly when they are used as motion specs in other commands.
! 	(vip-set-hooks): Added viper to tcl-mode-hook.
  
! 	* viper-util.el (vip-has-face-support-p,vip-abbreviate-file-name):
!  	New functions.
! 	(vip-force-faces): New variable.
  
! 	* viper-keym.el: Added special binding (vip-handle-!) for `!' in
!  	ex-read-filename-map.
  
! 	* viper-ex.el (vip-handle-!): New function.
! 	(vip-ex-read-file-name): Now handles SPC correctly in :r !cmd
! 	and :w !cmd.
  
! Thu Feb 15 20:12:34 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* imenu.el (imenu--generic-function): Ignore text properties.
  
! 	* files.el (auto-mode-alist): Recognize GNUmakefile.
! 	Recognize .itcl and .itk suffixes.
  
! 	* ange-ftp.el (ange-ftp-default-user): Doc fix.
  
! Thu Feb 15 19:57:50 1996  Eli Zaretskii  <eliz@is.elta.co.il>
  
! 	* info.el (info-insert-file-contents-1) [MSDOS]: Remove leading
! 	dot only from non-empty suffixes.
  
+ Thu Feb 15 19:36:27 1996  Christopher J. Madsen  <ac608@yfn.ysu.edu>
  
! 	* decipher.el: Doc changes.
! 	(decipher-char): Added defvar (and also for following variables).
! 	(decipher--prev-char): Renamed from decipher-prev-char.
! 	(decipher--digram): Renamed from digram.
! 	(decipher--digram-list): Renamed from digram-list.
! 	(decipher--before): Renamed from before-array.
! 	(decipher--after): Renamed from after-array.
! 	(decipher--freqs): Renamed from freq-array.
  
! Thu Feb 15 19:11:30 1996  Francesco Potorti`  <pot@cnuce.cnr.it>
  
! 	* hanoi.el (hanoi): Compute height and width of the window in the
!  	correct way, give the correct error message if the window is too
!  	small.  Make rings only with numerical characters.  Set default
!  	number of rings to 7 (was 3 before).
  
! Thu Feb 15 15:51:56 1996  Erik Naggum  <erik@naggum.no>
  
! 	* gnus-kill.el (gnus-kill-file-kill-by-thread): Correct
! 	interactive declaration.
  
! Thu Feb 15 10:12:58 1996  Ed Reingold  <reingold@mole.gnu.ai.mit.edu>
  
! 	* cal-coptic.el (ethiopic-calendar-epoch): Correct value.
! 	(ethiopic-calendar-month-name-array): Fix spelling.
! 	(coptic-calendar-month-name-array): Fix spelling.
  
! Tue Feb 13 23:25:19 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* vc-hooks.el (vc-consult-rcs-headers): Ignore text properties.
  
! 	* startup.el (command-line-1): Don't explain recover-session if
! 	auto-save-list-file-prefix is nil.
  
! Tue Feb 13 23:08:05 1996  Francesco Potorti`  <pot@cnuce.cnr.it>
  
! 	* hanoi.el (hanoi): Don't show line and column numbers.
  
! Mon Feb 12 22:05:22 1996  Roland McGrath  <roland@charlie-brown.gnu.ai.mit.edu>
  
! 	* compile.el (compilation-parse-errors): Detect doubled slashes in
! 	file names matched and fix them up in the buffer.
  
! Mon Feb 12 00:17:08 1996  <Daniel.Pfeiffer@Informatik.START.dbp.de>
  
! 	* mailalias.el (mail-names, mail-local-names, mail-directory-names)
! 	(mail-address-field-regexp, mail-complete-alist)
! 	(mail-complete-function, mail-directory-function)
! 	(mail-directory-requery, mail-directory-process, mail-directory-stream)
! 	(mail-directory-parser): New variables.
! 	(expand-mail-aliases): Use `mail-address-field-regexp'.
! 	(build-mail-aliases): Use space in buffer-name semantics.
! 	(define-mail-alias): Reset `mail-names' to t.
! 	(mail-complete): New command.
! 	(mail-get-names, mail-directory, mail-directory-process)
! 	(mail-directory-stream, mail-sentto-newsgroups): New functions.
  
! Sun Feb 11 20:16:56 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* startup.el (command-line): On windows NT, look for .emacs or _emacs.
  
! Sun Feb 11 12:26:28 1996  Eli Zaretskii  <eliz@is.elta.co.il>
  
! 	* paren.el (show-paren-command-hook): Position show-paren-overlay-1
! 	properly when first creating it (just like when moving it).
  
! Sat Feb 10 13:43:14 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* info.el (Info-find-index-name): New subroutine, from Info-index-next.
! 	Match any type of definition, not just Function and Command.
! 	(Info-index-next): Use Info-find-index-name.
! 	(Info-find-node, Info-index, Info-index-next): Use `...' in err msgs.
  
! 	* doctor.el (doctor-mode): State that file has been censored.
  
! Fri Feb  9 22:09:55 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* picture.el (picture-mode-map): Install picture-self-insert
! 	where completion has put its own self-insert commands.
  
! 	* cc-mode.el (c++-mode):
! 	Delete duplicate setq of imenu-generic-expression.
  
! Fri Feb  9 18:18:15 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* f90.el (f90-indent-subprogram): Fix message.
  
! Fri Feb  9 15:50:27 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* gnus-ems.el: File censored.
  
! Fri Feb  9 08:08:41 1996  Lars Magne Ingebrigtsen  <larsi@eistla.ifi.uio.no>
  
! 	* nntp.el (nntp-send-region-to-server): Use a temporary buffer to
! 	send text to the server.
  
! 	* ediff-init.el: Make sure `facemenu-unlisted-faces' is bound.
  
! Fri Feb  9 01:36:14 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* info.el (info): Doc fix.
  
! 	* add-log.el (add-log-current-defun): In Lisp, if we don't find a
! 	real defun, return nil, not "".
  
! 	* term-nasty.el: Censored.
  
! 	* decipher.el: Load cl only when compiling.
  
! Thu Feb  8 20:37:45 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* rmail.el (rmail-find-all-files): In a directory, ignore `.' and `..'.
  
! Thu Feb  8 18:26:55 1996  Christopher J. Madsen  <ac608@yfn.ysu.edu>
  
! 	* decipher.el: New file.
  
! Thu Feb  8 15:00:16 1996  Simon Leinen  <simon@lia.di.epfl.ch>
  
! 	* sgml-mode.el (html-tag-alist): Within the <ADDRESS> tag
!  	generated with an <HTML> tag, use `user-mail-address'.
  
! Thu Feb  8 13:23:16 1996  Eli Zaretskii  <eliz@is.elta.co.il>
  
! 	* term/pc-win.el (x-display-pixel-height, x-display-pixel-width):
! 	Make the returned value consistent with one-pixel-per-character.
  
! Thu Feb  8 05:05:10 1996  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
  
! 	* subr.el (get-buffer-window-list): New function.
  
! 	* font-lock.el (turn-on-font-lock): Turn on only if supported.
! 	(turn-on-font-lock-if-enabled): Don't test if supported here.
! 	Renamed from turn-on-font-lock-if-supported.
  
! Wed Feb  7 23:12:19 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* lisp-mnt.el: Change defconst into defvar.
! 	Many doc fixes.
  
! Wed Feb  7 11:54:54 1996  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* timer.el (run-at-time): Handle numbers as relative times in
! 	seconds, as the original code did.
  
! Tue Feb  6 22:35:36 1996  Barry Warsaw  <bwarsaw@anthem (Barry Warsaw)>
  
! 	* cc-mode.el (c-common-init): Fix typo.
  
! 	* cc-mode.el (c++-mode-map, objc-mode-map, java-mode-map):
! 	In XEmacs, use set-keymap-parents if it is fboundp.
  
! 	* cc-mode.el (c-delete-backslash):
! 	Sync with old-c-mode.el.  Given by Ben Wing <wing@666.com>.
  
! 	* cc-mode.el (c-emacs-features):
! 	Determine which paragraph filling regexp suite to use based on the
! 	Emacs version number.
  
! 	(c-fill-paragraph): Use the paragraph filling regexp suite as
! 	determined in c-emacs-features.
  
! 	* cc-mode.el:
! 	imenu is required in Emacs 19, but doesn't exist in XEmacs
  
! 	* cc-mode.el (c-site-default-style): New variable.
  
! 	* cc-mode.el:
! 	(java-mode, java-syntax-table, java-mode-map, java-mode-abbrev-table):
! 	New in support of Java.
  
! 	* cc-mode.el (c-common-init): Make comment-multi-line a local variable.
  
! 	* cc-mode.el (c-set-style):
! 	Conditional up-casing of stylename for backwards compatibility.
  
! 	* cc-mode.el (c-backward-to-start-of-do):
! 	Eliminate infinite loop in perverse cases.
  
! 	* cc-mode.el (c-electric-lt-gt): New command.
  
! 	* cc-mode.el (c-mode-map):
! 	Only rebind M-q if fill-paragraph-function doesn't exist, as in
! 	pre-Emacs 19.30.
  
! 	(c-common-init): Set fill-paragraph-function if it exists.
  
! 	* cc-mode.el (c-guess-basic-syntax):
! 	CASE 5B.3: ansi-funcdecl-cont could include legal C++ `throw'
! 	declaration.
  
! 	* cc-mode.el (c-offsets-alist): ansi-funcdecl-cont => +
  
! 	* cc-mode.el (c-beginning-of-statement-1):
! 	Restore old CASE 3 logic -- checking for at a c-conditional-key.
  
! 	(c-guess-basic-syntax): CASE 5A.2: watch out for enum function
! 	return types. CASE 15D: check for landing on a brace that opens a
! 	nested function.
! 
! Tue Feb  6 18:54:36 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* simple.el (text-read-only): New error symbol.
! 	(kill-region): Use it when text has read-only text property.
! 	(yank-pop): Turn on inhibit-read-only.
! 
! Mon Feb  5 16:41:28 1996  Jari Aalto  <ssjaaa@uta.fi>
! 
! 	* lisp-mnt.el (lm-header-prefix): New variable.
! 	(lm-comment-column): defvar moved.
! 	(lm-history-header, lm-commentary-header):  New variables.
! 	(lm-get-header-re, lm-get-package-name): New functions.
! 	(lm-code-mark):	defun --> defsubst.
! 	(lm-history-mark, lm-commentary-mark): New functions.
! 	(lm-header): Now accepts RCS ident style headers.
! 	(lm-summary): Now accepts unix `what' commands prefix @(#).
! 	(lm-crack-address, lm-authors, lm-maintainer, lm-insert-at-column):
! 	(lm-creation-date, lm-last-modified-date, lm-version):
! 	(lm-keywords, lm-adapted-by): Comments made into doc strings.
! 	(lm-commentary): Added more tolerant 'cond' case.
! 	Now uses functions lm-commentary-mark, lm-... to get points.
! 	(lm-verify): Made interactive. Added more check points in the last
! 	prog1 statement.
! 	(lm-synopsis): Made interactive.
  
! Mon Feb  5 17:35:07 1996  Lars Magne Ingebrigtsen  <larsi@eistla.ifi.uio.no>
  
! 	* mail-extr.el (mail-extract-address-components): Accept strings
! 	that end with double trailing quote marks.
  
! Sun Feb  4 16:11:00 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* lisp-mnt.el (lm-insert-at-column): Renamed from insert-at-column.
! 	All callers changed.
! 	(lm-synopsis): Add interactive spec.
  
! 	* view.el (View-search-last-regexp-forward)
! 	(View-search-last-regexp-backward): Nice error if no prev regexp.
  
! Sun Feb  4 15:33:40 1996  Lars Magne Ingebrigtsen  <larsi@eistla.ifi.uio.no>
  
! 	* gnus.el (gnus-update-read-articles): Remove duplicated article
! 	numbers on group exit.
! 	(gnus-request-accept-article): Make sure there's a newline at the
! 	end of the buffer.
! 	(gnus-adjust-marked-articles): Don't remove illegal ticked
! 	articles (for forwards compatability).
  
! Sat Feb  3 14:51:36 1996  Lars Magne Ingebrigtsen  <larsi@aegir.ifi.uio.no>
  
! 	* gnus.el (gnus-gnus-to-newsrc-format): Turn off version-control
! 	before saving the .newsrc files.
  
! 	* gnus-msg.el (gnus-mail-reply-using-mail): Use the local keymap
! 	instead of `mail-mode-map'.
  
! Sat Feb  3 08:38:42 1996  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
  
! 	* shell.el (shell-mode): Set shell-dirstack-query for the ksh.
! 	(shell-resync-dirs): Set shell-last-dir for the ksh.
  
! Fri Feb  2 22:07:54 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* view.el (view-mode-map): Don't call suppress-keymap.
  
! 	* ehelp.el (with-electric-help):
! 	Bind inhibit-read-only around the erase-buffer.
! 	(electric-help-form-to-execute): Renamed from to-be-executed.
! 	Add defvar for it.
! 	(electric-help-mode): Turn off view-mode.
  
! Fri Feb  2 16:00:33 1996  Morten Welinder  <terra@diku.dk>
  
! 	* timer.el (run-with-timer): Set repetition interval.
  
! 	* time.el (display-time): Rewrite to use built-in timers.
! 	(display-time-event-handler): Renamed from display-time-filter;
!  	now takes no parameters.
! 	(display-time-sentinel): Function deleted.
! 	(display-time-process): Variable deleted.
! 	(display-time-timer): New variable.
  
! Fri Feb  2 13:46:11 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* files.el (auto-mode-alist): .ksh suffix means sh-mode.
! 	(write-file): Interactively, prefix arg means don't confirm.
  
! Fri Feb  2 05:38:08 1996  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
  
! 	* font-lock.el (font-lock-keywords): Doc fix.
! 	(font-lock-defaults-alist): Use alists.
! 	(font-lock-set-defaults, font-lock-unset-defaults): Cope with alists.
! 	(font-lock-mark-block-function): New variable for block fontification.
! 	(font-lock-fontify-block): New function.  Use it here.
! 	(font-lock-fontify-window): Deleted.
! 	(font-lock-fontify-syntactically-region): Don't widen here.
! 	(font-lock-default-fontify-region): Do it here.
! 	(font-lock-default-fontify-buffer): Use font-lock-unfontify-buffer.
  
! 	* rmail.el (rmail-mode): Use alists for font-lock-defaults.
! 	(rmail-fontify-buffer-function): Flag the buffer as fontified.
! 	(rmail-unfontify-buffer-function): Remove all text properties.
  
! Fri Feb  2 01:13:32 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* ange-ftp.el (ange-ftp-default-user): Doc fix.
  
! 	* edmacro.el (edmacro-original-buffer, edmacro-finish-hook)
! 	(edmacro-store-hook): Add defvars.
  
! Thu Feb  1 02:21:33 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* lisp-mode.el (lisp-mode-variables): Locally clear adaptive-fill-mode.
  
! 	* ange-ftp.el (ange-ftp-netrc-default-user): New variable.
! 	(ange-ftp-netrc-default-password):
! 	(ange-ftp-netrc-default-account):
! 	(ange-ftp-get-user): Use ange-ftp-netrc-default-user.
! 	(ange-ftp-get-passwd): Use ange-ftp-netrc-default-...
! 	(ange-ftp-get-account): Likewise.
! 	(ange-ftp-parse-netrc-group): Set ange-ftp-netrc-default-...
! 	(ange-ftp-write-region): executing-macro -> executing-kbd-macro.
  
! 	* compile.el (compilation-filter): Run compilation-filter-hook.
  
! Wed Jan 31 16:01:53 1996  Boris Goldowsky  <boris@gnu.ai.mit.edu>
  
! 	* format.el (format-deannotate-region): Fixed bug that created
! 	double marking of multi-annotation text-properties (eg, bold-italic).
  
! Wed Jan 31 15:06:50 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* timer.el (run-at-time): Support relative time specs again.
! 	(timer-duration): New function.
! 	(timer-duration-words): New variable.
! 	(timer-relative-time): New subroutine.
! 	(timer-inc-time): Use timer-relative-time.
! 	(timer-set-time, timer-set-time-with-usecs): Allow floating DELTA.
  
! Wed Jan 31 08:54:52 1996 Caleb Deupree <cdeupree@cincom.com>
  
! 	* winnt.el (mode-line-format): Include column-number-mode.
  
! Tue Jan 30 16:09:03 1996  David Kegedal  <davidk@lysator.liu.se>
  
! 	* sendmail.el (mail-setup): For mail-self-blind, use user-mail-address.
  
! Mon Jan 29 18:44:50 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* timer.el (timer-create): Init slot 0 to t.
  
! Mon Jan 29 18:21:15 1996  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
  
! 	* ada-mode.el (ada-indent-region, ada-check-matching-start,
! 	ada-check-defun-name): Fix error format string.
! 	* allout.el (outline-process-exposed): Likewise.
! 	* bookmark.el (bookmark-load): Likewise.
! 	* cpp.el (cpp-parse-error): Likewise.
! 	* ediff-init.el (ediff-event-point, ediff-event-buffer):
! 	Likewise.
! 	* etags.el (visit-tags-table-buffer, tags-loop-scan,
! 	complete-tag): Likewise.
! 	* forms.el (forms--process-format-list): Likewise.
! 	* gnus-ems.el (gnus-summary-insert-pseudos-xemacs): Likewise.
! 	* hexl.el (hexl-hex-char-to-integer, hexl-oct-char-to-integer):
! 	Likewise.
! 	* info.el (Info-extract-pointer): Likewise.
! 	* mh-seq.el (mh-read-seq): Likewise.
! 	* mh-utils.el (mh-handle-process-error): Likewise.
! 	* msb.el (msb--choose-menu): Likewise.
! 	* nntp.el (nntp-send-strings-to-server, nntp-async-send-strings):
! 	Likewise.
! 	* reporter.el (reporter-dump-variable): Likewise.
! 	* tq.el (tq-process-buffer): Likewise.
! 	* vip.el (vip-execute-ex-command, ex-write): Likewise.
! 	* viper-ex.el (vip-ex, ex-expand-filsyms, vip-execute-ex-command):
! 	Likewise.
! 	* viper-macs.el (vip-register-macro): Likewise.
! 	* viper.el (vip-brac-function): Likewise.
  
! Mon Jan 29 00:29:16 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* sh-script.el (sh-shell-variables-initialized): New variable.
! 	(sh-mode): Make sh-shell-variables and
!  	sh-shell-variables-initialized local.
! 	(sh-set-shell): Don't scan the buffer for variable assignments.
! 	Set sh-shell-variables-initialized to nil.
! 	(sh-shell-initialize-variables): New function.
! 	(sh-add-completer): New function.  Initialize sh-shell-variables
! 	here if not yet done.
! 	(sh-add): Use sh-add-completer for completion.
  
! 	* timer.el (timer-event-handler): Timer event is now a list,
! 	not just a cons.
  
! 	* faces.el (face-color-gray-p): Return nil if x-color-values does.
  
! 	* timer.el (with-timeout): New macro.
! 	(with-timeout-handler): New function.
! 	(y-or-n-p-with-timeout): New function.
! 	(add-timeout, timeout-event-p): New functions.
! 	(run-with-timer): Renamed from run-after-delay.
! 	(run-at-time, run-with-timer): Return the timer.
  
! Sun Jan 28 20:55:10 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* timer.el (run-after-delay): Add autoload cookie.
! 	Delete USECS arg.  Let REPEAT be a float.
  
! 	* timer.el (timer-inc-time): New function.
! 	(run-at-time): Use that.
! 	(run-after-delay): New function.
  
! 	* timer.el: Add a usecs slot to each timer.
! 	Almost all functions changed.
  
! Sun Jan 28 17:31:11 1996  Eli Zaretskii  <eliz@is.elta.co.il>
  
! 	* cmacexp.el (c-macro-preprocessor): Define a preprocessor name
! 	which is valid on MS-DOS.
! 	(c-macro-expansion): Do not rely on ``/tmp/'' being present; use
! 	environment variables as alternatives (MSDOS).  Use
! 	`shell-file-name' rather than ``sh''.  Redirect `stderr' with
! 	`call-process-region' option, not from the shell.  Handle shells
! 	which don't return exit code from `cpp' (MSDOS).  Put messages
! 	from `cpp' inside a comment, to avoid messing up syntax
! 	highlighting.
  
! Sun Jan 28 16:47:55 1996  Morten Welinder  <terra@diku.dk>
  
! 	* timer.el: Complete rewrite to use built-in timer feature.
  
! Sun Jan 28 14:26:49 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* files.el (list-directory): Set default-directory better if the
! 	argument is a directory's file name.
  
! Sun Jan 28 02:11:02 1996  Erik Naggum  <erik@naggum.no>
  
! 	* apropos.el (apropos-print): Fix previous change.
  
! Sat Jan 27 17:44:39 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* edmacro.el (edit-kbd-macro): Reject empty cmd name.
  
! 	* macros.el (name-last-kbd-macro): Reject empty cmd name.
  
! 	* apropos.el (apropos-print): Omit key sequences that contain a frame.
  
! Fri Jan 26 18:56:59 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* ispell.el (ispell-help): Use set-minibuffer-window.
  
! 	* dired.el (dired-get-filename): When quoting " chars,
! 	handle all of them, including one at start of file name.
  
! 	* startup.el (command-line-normalize-file-name): New function.
! 	(command-line-1): Call it to handle foo//bar in non-Emacs fashion.
  
! 	* server.el (server-process-filter):
! 	In file name, collapse multiple slashes to one.
  
! Fri Jan 26 18:26:28 1996  Michael Kifer  <kifer@cs.sunysb.edu>
  
! 	* viper.el, viper-macs.el, viper-util.el, viper-mous.el:
! 	Moved functions around to minimize compiler warnings.
  
! Fri Jan 26 14:36:19 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* tex-mode.el (tex-face-alist, tex-latex-face-alist): New variables.
! 	(tex-common-initialization): Set facemenu-add-face-function,
! 	facemenu-end-add-face, facemenu-remove-face-function.
  
! 	* vc.el (vc-diff): Make NOT-URGENT default to t.
  
! Fri Jan 26 03:19:39 1996  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
  
! 	* font-lock.el (font-lock-after-unfontify-buffer): New function.
! 	(font-lock-default-unfontify-buffer): Use it.
! 	(font-lock-fontify-buffer-function):
! 	(font-lock-unfontify-buffer-function):
! 	(font-lock-fontify-region-function):
! 	(font-lock-unfontify-region-function):
! 	(font-lock-inhibit-thing-lock): New variables for Local Fontification.
! 	(font-lock-set-defaults): Set them here.
! 	(font-lock-fontify-buffer, font-lock-unfontify-buffer):
! 	(font-lock-fontify-region, font-lock-unfontify-region): Use them.
! 	(font-lock-default-fontify-buffer):
! 	(font-lock-default-unfontify-buffer):
! 	(font-lock-default-fontify-region):
! 	(font-lock-default-unfontify-region): Renamed as `default' functions.
  
! 	* fast-lock.el: New version 3.09 from author.
! 	(fast-lock-save-cache): Cope if fast-lock-minimum-size is a list.
! 	(fast-lock-minimum-size): Doc fix.
! 	(fast-lock-mode): Respect the value of font-lock-inhibit-thing-lock.
! 	(fast-lock-after-unfontify-buffer): New function.
  
! 	* rmail.el (rmail-mode): Setup font-lock-defaults local fontification.
! 	(rmail-fontify-buffer-function):
! 	(rmail-unfontify-buffer-function):
! 	(rmail-fontify-message): New functions.
  
! Fri Jan 26 10:23:48 1996  Boris Goldowsky  <boris@gnu.ai.mit.edu>
  
! 	* make-mode.el (makefile-font-lock-keywords): Improve highlighting
! 	of variable references inside other highlighted regions.
  
! Thu Jan 25 18:52:26 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* sendmail.el (mail-yank-original): Doc fix.
  
! Thu Jan 25 15:14:19 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* rmail.el (rmail-start-mail): Set mail-dedicated-frame frame param.
  
! 	* sendmail.el (mail-bury): Check mail-dedicated-frame frame param.
  
! 	* browse-url.el (browse-url-netscape):
! 	Check for call-process returning a string.
  
! Thu Jan 25 12:35:39 1996  Eli Zaretskii  <eliz@is.elta.co.il>
  
! 	* dos-fns.el (mode25): Moved from `src/dosfns.c' for backward
! 	compatibility.
! 	(mode4350): Moved from `src/dosfns.c' for backward compatibility.
  
! Thu Jan 25 05:44:47 1996  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
  
! 	* font-lock.el (font-lock-unfontify-buffer): New function.
! 	(font-lock-unset-defaults): New function.
! 	(font-lock-mode): Use them.  Doc fix.
! 	Don't make font-lock-fontified buffer local here.
! 	(font-lock-set-defaults): Do it here.
! 	(font-lock-compile-keyword): New function.  Recognise `eval' keywords.
! 	(font-lock-compile-keywords): Use it.
! 	(global-font-lock-mode): New command for Global Font Lock mode.
! 	(font-lock-global-modes): New variable.
! 	(font-lock-change-major-mode, turn-on-font-lock-if-supported): New
! 	functions.
  
! 	* perl-mode.el (perl-font-lock-keywords-1, perl-font-lock-keywords-2):
! 	New variables.
! 	(perl-mode): Use them.
  
! 	* texinfo.el (texinfo-font-lock-keywords): Tweaked command regexp.
  
! 	* sendmail.el (mail-font-lock-keywords): Use `eval' keyword.
  
! 	* rmailsum.el (rmail-summary-mode): Use make-local-hook for
! 	post-command-hook.
! 	(rmail-summary-disable, rmail-summary-enable): Respect hook localness.
  
! Thu Jan 25 01:22:52 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* gnus.el (read-news): Define as alias for gnus.
  
! 	* rmail.el (rmail-start-mail): Set unsplittable frame parameter
! 	and make the window dedicated.
  
! Thu Jan 24 23:59:21 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* saveplace.el (toggle-save-place): Fix message text.
! 	* forms.el (forms-mode, forms-toggle-read-only): Fix message text.
! 	(forms-search-forward, forms-search-backward): Likewise.
! 	* info.el (Info-goto-emacs-command-node): Fix error text.
! 	* bookmark.el (bookmark-alist-from-buffer): Fix error text.
! 	(bookmark-maybe-upgrade-file-format, bookmark-set): Likewise.
! 	(bookmark-send-annotation, bookmark-send-edited-annotation): Likewise.
! 	(bookmark-load): Delete redundant format call.
  
! Wed Jan 24 19:43:04 1996  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
  
! 	* cookie1.el (cookie-snarf): Pass proper format string to message.
! 	* diary-lib.el (simple-diary-display, fancy-diary-display):
! 	Likewise.
! 	* dired.el (dired-internal-noselect): Likewise.
! 	* ebuff-menu.el (Electric-buffer-menu-undefined): Likewise.
! 	* edebug.el (edebug-next-breakpoint): Likewise.
! 	* edt.el (edt-display-the-time): Likewise.
! 	* ehelp.el (electric-help-command-loop): Likewise.
! 	* f90.el (f90-indent-subprogram, f90-match-end): Likewise.
! 	* facemenu.el (list-text-properties-at): Likewise.
! 	* finder.el (finder-summary): Likewise.
! 	* flow-ctrl.el (enable-flow-control): Likewise.
! 	* forms.el (forms--help, forms-search-forward,
! 	forms-search-backward): Likewise.
! 	* help-macro.el (make-help-screen): Likewise.
! 	* hippie-exp.el (hippie-expand): Likewise.
! 	* holidays.el (calendar-cursor-holidays): Likewise.
! 	* info.el (Info-edit, Info-goto-emacs-command-node): Likewise.
! 	* ispell.el (ispell-command-loop, ispell-region): Likewise.
! 	* ispell4.el (start-ispell, ispell-next): Likewise.
! 	* lisp-mnt.el (lm-report-bug): Likewise.
! 	* macros.el (kbd-macro-query): Likewise.
! 	* medit.el (medit-save-define): Likewise.
! 	* nnmail.el (nnmail-move-inbox): Likewise.
! 	* picture.el (picture-mode): Likewise.
! 	* rmail.el (rmail-insert-inbox-text): Likewise.
! 	* rmailedit.el (rmail-edit-current-message): Likewise.
! 	* server.el (server-process-filter): Likewise.
! 	* sgml-mode.el (sgml-tag-help): Likewise.
! 	* shadow.el (list-load-path-shadows): Likewise.
! 	* shadowfile.el (shadow-shadows, shadow-add-to-todo): Likewise.
! 	* shell.el (shell-dirstack-message): Likewise.
! 	* simula.el (simula-electric-keyword): Likewise.
! 	* solar.el (sunrise-sunset): Likewise.
! 	* term.el (term-read-noecho): Likewise.
! 	* terminal.el (te-edit): Likewise.
! 	* type-break.el (type-break-demo-life): Likewise.
! 	* view.el (view-mode-enter, View-scroll-lines-forward): Likewise.
! 	* viper-ex.el (ex-pwd, vip-info-on-file): Likewise.
! 	* viper-macs.el (ex-map-read-args, ex-unmap-read-args,
! 	vip-record-kbd-macro): Likewise.
! 	* viper-util.el (vip-save-setting): Likewise.
  
! 	* ada-mode.el (ada-adjust-case-region, ada-indent-region): Delete
!  	format call inside message.
! 	* array.el (array-what-position): Likewise.
! 	* bookmark.el (bookmark-write-file, bookmark-load): Likewise.
! 	* bytecomp.el (byte-compile-log-1): Likewise.
! 	* edt.el (edt-y-or-n-p): Likewise.
! 	* enriched.el (enriched-next-annotation): Likewise.
! 	* ispell4.el (ispell-point): Likewise.
! 	* mh-e.el (mh-get-new-mail): Likewise.
! 	* saveplace.el (toggle-save-place, save-place-alist-to-file,
! 	load-save-place-alist-from-file): Likewise.
! 	* shadow.el (list-load-path-shadows): Likewise.
! 	* shadowfile.el (shadow-cancel, shadow-copy-file): Likewise.
! 	* subr.el (read-quoted-char): Likewise.
! 	* tpu-edt.el (tpu-y-or-n-p): Likewise.
! 	* vip.el (vip-replace-string, vip-search-forward,
! 	vip-search-backward): Likewise.
! 	* viper-ex.el (ex-set): Likewise.
  
! Wed Jan 24 17:01:42 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* startup.el (command-line-1): Update copyright in startup banner.
  
! Wed Jan 24 17:00:05 1996  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
  
! 	* tmm.el (tmm-prompt): Set last-command-event before calling the
! 	selected function.
  
! Wed Jan 24 14:00:31 1996  Erik Naggum  <erik@naggum.no>
  
! 	* emacsbug.el (report-emacs-bug): Insert newlines only in the
!  	inserted key descriptions.
  
! 	* viper.el (vip-ask-level): Prefix \ to ( at start of line.
  
! 	* term.el (term-exec-hook): Doc fix.
  
! 	* solitaire.el (solitaire): Doc fix.
  
! 	* solar.el (solar-moment, solar-ephemeris-time,
!  	solar-equatorial-coordinates, solar-horizontal-coordinates): Doc
!  	fixes.
  
! 	* lunar.el (lunar-new-moon-on-or-after): Doc fix.
  
! 	* dabbrev.el (dabbrev-abbrev-skip-leading-regexp): Doc fix.
  
! Wed Jan 24 10:52:34 1996  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
  
! 	* make-mode.el (makefile-browser-toggle): Use delete-region,
! 	not kill-line.
  
! Wed Jan 24 12:34:06 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* f90.el (f90-face-*): Reinstalled code deleted on Sep 22.
! 	(f90-hilit-patterns): New variable.
! 	(f90-mode): Call hilit-set-mode-patterns if defined.
! 	(f90-auto-hilit19): New variable.
! 	(f90-fill-region): Bind f90-auto-hilit19 to nil.
! 	(f90-update-line): Rehilight if appropriate.
  
! Wed Jan 24 01:01:14 1996  <Daniel.Pfeiffer@Informatik.START.dbp.de>
  
! 	* sgml-mode.el (sgml-quick-keys): New variable.
! 	(sgml-mode-map): Use it, defined additional long keys to compensate.
! 	(sgml-tag-alist): Added <![ ]>
! 	(sgml-tag): Special treatment for previous construct.
! 	(sgml-auto-attributes): Deleted variable covered by sgml-quick-keys,
! 	changed function of same name.
! 	(sgml-delete-tag): Newline also counts as whitespace before tag.
! 	(html-quick-keys): Use sgml-quick-keys as default, thus changed to nil.
! 	(html-mode-map): Added C-c C-c char combinations for when
!  	html-quick-keys is nil.
! 	(html-tag-alist): Added /cgi-bin/ to href completions, submit (spelling
! 	fixed) button to form.
! 	(html-checkboxes): New skeleton.
  
! Wed Jan 24 10:44:43 1996  Ed Reingold  <reingold@mole.gnu.ai.mit.edu>
  
! 	* cal-x.el: Fix doc strings at top of file.
  
! 	* cal-tex.el (cal-tex-preamble): Add \hfuzz=1000pt to get rid of
! 	overfull box messages.
  
! 	* solar.el (calendar-latitude, calendar-longitude,
!  	calendar-location-name, solar-sunrise-and-sunset): Fix doc strings.
! 	(solar-exact-local-noon, solar-sunrise-sunset): Refer to
!  	(calendar-longitude) and (calendar-latitude) instead of
!  	calendar-longitude and
  
! Wed Jan 24 00:40:09 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* iso02-acc.el: File deleted.
  
! 	* font-lock.el (turn-on-font-lock): Test window-system.
  
! Tue Jan 23 16:01:57 1996  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* lisp-mode.el (lisp-fill-paragraph): Use fill-paragraph once again
! 	for filling a comment.
  
! 	* paragraphs.el (forward-paragraph): Comment change.
  
! Tue Jan 23 14:22:35 1996  Ralf Fassel  <ralf@natlab.research.philips.com>
  
! 	* iso-acc.el (iso-languages): Restructure the list to remove
! 	redundancy in list elements.
! 	(iso-accents-compose-key): Function deleted.
! 	(iso-accents-compose, iso-accents-customize, iso-accentuate,
! 	iso-accent-rassoc-unit, iso-unaccentuate, iso-deaccentuate): Adapt
! 	for new structure of `iso-languages'.
  
! Tue Jan 23 12:50:00 1996  Eli Zaretskii  <eliz@is.elta.co.il>
  
! 	* compile.el (compilation-handle-exit): Undo previous change.
! 	Don't reference `proc' object.
! 	Pass current buffer to `compilation-finish-function'.
  
! Mon Jan 22 20:15:41 1996  Paul Eggert  <eggert@twinsun.com>
  
! 	* version.el (emacs-build-time): Record (current-time),
! 	not (current-time-string).
! 	(emacs-version): Use new form of emacs-build-time.
! 	This lessens confusion when the dumped Emacs starts up in a
! 	different time zone.
  
! Sun Jan 21 16:54:08 1996  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* iso-acc.el (iso-accents-customize): Extract accent chars
! 	properly from iso-accents-list.
  
! 	* rmailsum.el (rmail-summary-goto-msg):
! 	Pass along args NOWARN and SKIP-RMAIL in recursive call.
  
! Sun Jan 21 15:20:51 1996  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* autoload.el (update-file-autoloads): Only give "up to date" msg
! 	if (interactive-p).
! 	(update-autoloads-from-directory): Call expand-file-name on arg.
  
! Sat Jan 20 20:42:06 1996  Paul Eggert  <eggert@twinsun.com>
  
! 	* vc-hooks.el (vc-utc-string): Remove; it wasn't reliable near DST
! 	or leap-second transitions.
! 	(vc-find-cvs-master): Convert UTC string to encoded time and compare
! 	the results to the file attributes, rather than attempting to convert
! 	file attributes to UTC string (which wasn't reliable).
  
! Sat Jan 20 07:03:29 1996  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* isearch.el (isearch-other-meta-char): Avoid error if lookup in
! 	function-key-map gives another keymap.
  
! 	* vc.el (vc-backend-checkout): Use let to restore default-directory.
! 	(vc-next-action-dired): Likewise.
  
! 	* msb.el (msb--toggle-menu-type): Call menu-bar-update-buffers
! 	with no argument.
  
! 	* iso02-acc.el: File deleted.
! 	* iso-acc.el (iso-languages): Rename "default" to "latin-1".
! 	Add a new element "latin-2" copied from iso02-acc.el.
  
! 	* type-break.el: Move defsubsts before defuns.
  
! Sat Jan 20 02:41:05 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* compile.el (compilation-handle-exit): If process-status doesn't
! 	exist (e.g. on MSDOS), use an empty string.
  
! 	* rmailsort.el: Add (require 'rmail).
  
! Sat Jan 20 01:41:56 1996  Michael Kifer  <kifer@cs.sunysb.edu>
  
! 	* viper.el (vip-auto-indent,vip-electric-mode): Are now local
! 	variables.
! 	(vip-open-line,vip-Open-line,vip-autoindent): Are now electrified
!  	functions.
! 	(vip-set-hooks): Viperized awk, ksh, makefile, and html-helper modes.
! 	(vip-custom-file-name): Adapted to non-Unix systems.
! 	(vip-move-minibuffer-overlay): Removed.
! 	(vip-read-string-with-history): Now accepts correct defaults when
!  	called to read a shell command.
  
! Fri Jan 19 17:49:51 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* files.el (auto-mode-alist): Recognize ".exp" suffix.
  
! Fri Jan 19 17:42:44 1996  Eli Zaretskii  <eliz@is.elta.co.il>
  
! 	* tpu-edt.el (tpu-load-xkeys): Use `convert-standard-filename' to
! 	set the name of the key mapping file.
! 	* tpu-mapper.el: Likewise.
  
! Fri Jan 19 12:22:10 1996  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* menu-bar.el (menu-bar-search-menu): Clean up key symbols.
! 	(menu-bar-tools-menu): Rename vc-menu key symbol to just vc.
  
! 	* unrmail.el (unrmail): Default the directory of TO-FILE based on FILE.
  
! 	* pc-select.el (pc-selection-mode): Don't mess with c-mode-map.
  
! 	* tar-mode.el (tar-summarize-buffer): Fix "done" message.
! 	(tar-summarize-buffer):
! 	Insert summary lines in same order as tar-parse-info.
  
! 	* files.el (find-file-noselect): Fix error message style.
  
! 	* lisp-mode.el (emacs-lisp-mode-map): Avoid duplicate in menu bindings.
  
! Fri Jan 19 06:23:49 1996  Erik Naggum  <erik@naggum.no>
  
! 	* pp.el (pp-eval-expression): Use `frame-width' instead of
!  	`screen-width'.
  
! Thu Jan 18 19:09:54 1996  Erik Naggum  <erik@naggum.no>
  
! 	* sh-script.el (sh-mode): Add autoload cookie.
  
! Thu Jan 18 14:38:59 1996  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* rmailsum.el (rmail-make-basic-summary-line): Include msg line number.
  
! 	* uniquify.el: Several doc fixes.
  
! Thu Jan 18 02:00:28 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* mouse.el (mouse-buffer-menu): Delete debugging code.
  
! Wed Jan 17 17:24:03 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* ls-lisp.el (ls-lisp-support-shell-wildcards): Add autoload cookie.
  
! 	* cc-mode.el: Load imenu when compiling.
  
! 	* dos-fns.el (convert-standard-filename): Preserve ~ as last char.
  
! 	* make-mode.el (makefile-mode): Fix criterion for calling
! 	makefile-define-space-face.
  
! 	* goto-addr.el (goto-address-at-point, goto-address-at-mouse):
! 	Add autoload cookies.
  
! Wed Jan 17 20:24:59 1996  Eli Zaretskii  <eliz@is.elta.co.il>
  
! 	* dos-fns.el (convert-standard-filename): Don't do anything if the
! 	argument is empty, or isn't a string; leave alone characters with
! 	ASCII codes above 127 and special characters legal in DOS filenames.
  
! Wed Jan 17 14:12:06 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* files.el (auto-mode-alist): Use "\\`" instead of "^".
  
! Wed Jan 17 11:19:20 1996  Michael Staats <michael@thp.Uni-Duisburg.DE>
  
! 	* pc-select.el: Add some keybindings.
!  	(next-line-mark, next-line-nomark): Set this-command.
! 	(previous-line-mark, previous-line-nomark): Likewise.
! 	(end-of-line-mark, end-of-line-nomark): Likewise.
  
! Tue Jan 16 20:27:48 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* sh-script.el (sh-indent-line): Cope if no previous noncomment line.
  
! Tue Jan 16 23:33:21 1996  Lars Magne Ingebrigtsen  <larsi@narfi.ifi.uio.no>
  
! 	* nntp.el (nntp-accept-response): Add a timeout parameter to
! 	`accept-process-output'.
  
! 	* nnkiboze.el (nnkiboze-close-group): Should only be run from
! 	summary buffers.
  
! 	* gnus.el (gnus-group-make-help-group): Check whether
! 	`installation-directory' is nil before using it.
  
! Tue Jan 16 19:08:06 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* sh-script.el (sh-shell-variables): New variable.
! 	(sh-set-shell, sh-remember-variable):
! 	Set sh-shell-variable, not process-environment.
! 	(sh-mode): Don't make process-environment local.
! 	Add a mode-class property.
! 	(sh-add): Use sh-shell-variable in completion.
! 	Compute alist properly from process-environment.
  
! Tue Jan 16 12:05:04 1996  Stefan Schoef  <schoef@OFFIS.Uni-Oldenburg.DE>
  
! 	* bibtex.el (bibtex-font-lock-keywords, bibtex-mode):
! 	Use word-syntax in patterns.
  
! 	* bibtex.el (bibtex-font-lock-keywords): Allow a more relaxed format
! 	of the buffer and use more appropriate faces.
  
! Tue Jan 16 08:13:55 1996  Erik Naggum  <erik@naggum.no>
  
! 	* autoload.el (update-file-autoloads): Fix message.
  
! Mon Jan 15 17:30:57 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* dos-fns.el (ps-lpr-switches, ps-lpr-command): Just setq them;
! 	duplicate defvar is a bad idea.
  
! 	* cc-mode.el (c-common-init): Make comment-multi-line buffer-local.
  
! Mon Jan 15 18:08:07 1996  Eli Zaretskii  <eliz@is.elta.co.il>
  
! 	* dos-fns.el (dos-printer): New variable, the local printer device.
! 	(dos-print-region-function): New function, used for
! 	`print-region-function'.
! 	(dos-ps-printer): New variable; if a string, it's the name of the
! 	local printer device.
! 	(ps-lpr-command, ps-lpr-switches): Set them properly for Ghostscript.
! 	(lpr-headers-switches): Set to non-nil, to disable page headers'
! 	support under MS-DOS.
  
! 	* lpr.el (print-region): Make pipes use binary mode if file is binary.
  
! 	* ps-print.el (ps-do-despool): On MS-DOS, allow both the usual and
! 	the alternative printing methods.
  
! Mon Jan 15 00:48:56 1996  Erik Naggum  <erik@naggum.no>
  
! 	* autoinsert.el (auto-insert-alist): Use FSF's new address.
  
! Sun Jan 14 14:38:33 1996  Morten Welinder  <terra@diku.dk>
  
! 	* desktop.el (desktop-read): Do nothing in batch mode.
! 	Clear desktop-delay-hook after use.  Simplify.
  
! 	* tar-mode.el (tar-summarize-buffer): Speed-up for large files.
  
! Sun Jan 14 01:10:15 1996  Erik Naggum  <erik@naggum.no>
  
! 	* all files: Update FSF's address in, and unify formatting of,
!  	comment preambles.
  
! Sat Jan 13 00:43:52 1996  Erik Naggum  <erik@naggum.no>
  
! 	* files.el (auto-mode-alist): Add sgml-mode and html-mode.
  
! Fri Jan 12 18:22:05 1996  Erik Naggum  <erik@naggum.no>
  
! 	* sgml-mode.el: Remove redundant auto-mode-alist hacking.
! 	Removed auto-mode-alist hacking for html-mode to files.el.
  
! 	* cc-mode.el (c-add-style): Fix typo.
  
! Fri Jan 12 16:14:25 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* page.el (forward-page): Simplify how we avoid getting stuck
! 	when moving backwards.
  
! Fri Jan 12 02:36:47 1996  <Daniel.Pfeiffer@Informatik.START.dbp.de>
  
! 	* sgml-mode.el: Also load for .sgm and .dtd files.
! 	(sgml-specials, sgml-name-8bit-mode, sgml-char-names)
! 	(sgml-font-lock-keywords, sgml-face-tag-alist, sgml-tag-face-alist)
! 	(sgml-display-text, sgml-tag-alist, sgml-tag-help)
! 	(sgml-auto-attributes): New variables.
! 	(sgml-mode-common): New function.
! 	(sgml-mode): Most code moved to it.
! 	(sgml-name-char, sgml-name-self, sgml-maybe-name-self)
! 	(sgml-name-8bit-mode, sgml-tag, sgml-attributes, sgml-auto-attributes)
! 	(sgml-tag-help, sgml-maybe-end-tag, sgml-skip-tag-backward)
! 	(sgml-skip-tag-forward, sgml-tags-invisible): New commands.
! 	(sgml-beginning-of-tag, sgml-value): New functions.
  
! 	(html-*): All these functions and variables are new.
! 	Mostly they parametrize everything preceding.
  
! 	* autoinsert.el (auto-insert-alist): For html-mode, use `sgml-tag'.
  
! 	* facemenu.el (facemenu-add-face): Adding default to no region
! 	once again sets it for following typed in text.
  
! Fri Jan 12 00:15:10 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* hideshow.el: Many doc fixes.
!  	(hs-hide-hook): Renamed from hs-hide-hooks.
! 	(hs-show-hook): Renamed from hs-show-hooks.
  
! Thu Jan 11 23:50:44 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* files.el (write-contents-hooks): Doc fix.
  
! Thu Jan 11 20:49:54 1996  Erik Naggum  <erik@naggum.no>
  
! 	* apropos.el (apropos-print): Fix previous change to mouse message.
  
! Thu Jan 11 11:34:16 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* dired.el (dired-ls-F-marks-symlinks): Doc fix.
  
! Wed Jan 10 10:55:20 1996  Andre Spiegel  <spiegel@berlin.informatik.uni-stuttgart.de>
  
! 	* vc.el (vc-cancel-version): Use search-forward to scan error
! 	message. Added comments.
  
! 	* vc-hooks.el (vc-follow-symlinks): New variable.
! 	(vc-find-file-hook): Use it.
  
! Wed Jan 10 17:04:08 1996  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* sh-script.el (sh-mode): Don't move point.
! 	(sh-set-shell): New args NO-QUERY-FLAG and INSERT-FLAG.
! 	Pass them to executable-set-magic.
! 	Really set font-lock-syntax-table.  Slight cleanups.
  
! 	* cc-mode.el (c-add-style): Downcase STYLE before use.
  
! Wed Jan 10 10:03:53 1996  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* diff.el (diff): Fix local compilation-exit-message-function to
!  	take the proper arguments; remove gratuitous use of if around
!  	cond; return useful mode line messages for normal completion.
  
! Tue Jan  9 19:14:56 1996  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* imenu.el (imenu--create-keymap-2): Delete debugging line.
  
! 	* ange-ftp.el (ange-ftp-name-format): Don't match "/:" or "/.:".
  
! Mon Jan  8 17:46:13 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* man.el (Man-filter-list): Recognize "Rev" footers.
  
! Mon Jan  8 17:41:16 1996  Michael Ernst  <mernst@asia.cs.rice.edu>
  
! 	* uniquify.el (uniquify-rationalize-file-buffer-names): If
! 	newbuffile is nil, don't call expand-file-name on it.
  
! Mon Jan  8 17:23:39 1996  Dave Love  <d.love@dl.ac.uk>
  
! 	* vc.el (vc-update-change-log): Use add-log-full-name and
! 	add-log-mailing-address if they are defined.
  
! Mon Jan  8 10:36:02 1996  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* edt.el (edt-emulation-on): system-type is a symbol.
  
! 	* apropos.el (apropos-print): Fix message about mouse command.
  
! 	* tmm.el (tmm-menubar-mouse): Add autoload cookie.
  
! 	* make-mode.el (makefile-space-face): Don't work on
! 	facemenu-unlisted-faces if it isn't bound.
  
! 	* iso-acc.el (iso-accents-accent-key): Check iso-accents-enable here.
! 	(iso-accents-customize): Define all possible accent keys with
! 	translations, not just the enabled ones.
! 	Don't bind iso-accents-enable around the initial call to this function.
! 	(iso-accents-enable): Make the default once again include all prefixes.
  
! 	* term/x-win.el (x-cut-buffer-or-selection-value): Don't print messages
! 	about failure to get selection or cut buffer.
  
! 	* ediff-hook.el: Delete spaces before `...' in menu strings.
  
! 	* emerge.el (menu-bar-emerge-menu): Delete spaces before `...'.
  
! Sun Jan  7 08:41:01 1996  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* executable.el (executable-find): Renamed from `executable'.
! 	(executable-set-magic): Use new name `executable'.  Fix messages.
! 	Add save-excursion.  Don't test this-command--use interactive
! 	to get the information.  Simplify considerably.
  
! 	* winnt.el (using-unix-filesystems):
! 	Don't do anything to write-contents-hooks.
  
! 	* mh-utils.el (mh-display-msg): Use kill-local-variable
! 	to clear out write-contents-hooks.
  
! 	* files.el (write-contents-hooks): Call make-variable-buffer-local.
! 	Doc fix.
! 	(local-write-file-hooks, write-file-hooks): Doc fixes.
  
! 	* lisp-mode.el (emacs-lisp-byte-compile): Fix error message.
! 	(emacs-lisp-compile-and-load): New function.
! 	(emacs-lisp-mode-map): Add emacs-lisp-compile-and-load to menu bar.
  
! 	* imenu.el (imenu--create-keymap-2): Fix bug in constructing
! 	the lambda expression.  Use backquote.  Don't use incf.
  
! 	* sh-script.el (sh-alias-alist): Don't map sh to bash.
! 	(sh-canonicalize-shell): New function.
! 	(sh-shell-file): Renamed from sh-shell-path.
! 	(sh-set-shell): Don't set local-abbrev-table.
! 	(sh-abbrevs): Variable and function definition commented out.
  
! 	* diff.el (diff): Set compilation-exit-message-function.
  
! Sat Jan  6 08:11:49 1996  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* dos-fns.el (convert-standard-filename): Make sure firstdot
! 	is not nil.
  
! 	* easymenu.el (easy-menu-define): Doc fix.
  
! Sat Jan  6 16:20:55 1996  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* compile.el (compilation-error-regexp-alist, grep-regexp-alist
! 	compilation-mode-font-lock-keywords): Allow leading "[a-zA-Z]:" in file
! 	name regexps, for DOS drive letters.
! 
! Mon Nov  6 18:01:01 1995  Dave Love  <d.love@dl.ac.uk>
! 
! 	* compile.el (compilation-error-regexp-alist): Add MIPS lint
! 	regexps.
! 
! Sat Jan  6 13:38:53 1996  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
! 
! 	* compile.el (compilation-error-regexp-alist): Broaden GNAT regexp
! 	to match column numbers.
! 
! 	* compile.el (compilation-handle-exit): New function, broken out
! 	of compilation-sentinel.
! 	(compilation-sentinel, compile-internal): Use it.
! 	(compilation-exit-message-function): Doc fix for protocol change: take
! 	process status and exit-code args instead of process object.
! 	(grep): Use new protocol for compilation-exit-message-function.
! 
! 	* autoload.el (update-file-autoloads): Fix placement of new
! 	sections.
! 
! 	* autoload.el (update-file-autoloads): Notice when searching found
! 	nothing at all.
! 	(update-autoloads-from-directory): New function.
! 	(batch-update-autoloads): Use it.
! 	(update-directory-autoloads, update-autoloads-here): Functions removed.
! 
! Fri Jan  5 20:02:55 1996  Stephen Gildea  <gildea@x.org>
! 
! 	* time-stamp.el (time-stamp-line-limit): negative value counts
! 	from end of file.
! 
! Fri Jan  5 19:24:21 1996  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
! 
! 	* fill.el (fill-region-as-paragraph): Check again for reaching
! 	the end of the paragraph, after we adjust for places we can't break
! 	and make sure to keep at least one word.
! 
! 	* dired.el (dired-standard-move-to-filename-regexp): New variable.
! 	(dired-insert-directory): Don't alter environment if would use the
! 	C locale anyway, or if dired-move-to-filename-regexp has been
! 	changed from the default value.
! 	When changing the environment, avoid need for setenv.
! 
! Fri Jan  5 16:29:38 1996  Karl Eichwalder  <ke@ke.Central.DE>
! 	                  and Karl Fogel <kfogel@floss.red-bean.com>
! 
! 	* bookmark.el: "cyclic.com" addresses changed to "red-bean.com".
! 	(bookmark-bmenu-mode-map): Don't bind C-k.
! 	(bookmark-bmenu-mode): Better key description.
! 	(bookmark-bmenu-execute-deletions): Display message while working.
! 	(bookmark-version): Upped to 2.6.20.
! 	(bookmark-load): Fixed "done" message, duh.
! 
! Fri Jan  5 02:13:37 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* rmail.el (rmail-retry-failure): Bind inhibit-read-only.
! 
! 	* mail-extr.el (mail-extr-nuke-outside-range): Fix error message.
! 	(mail-extract-address-components, what-domain): Fix error messages.
! 
! Thu Jan  4 21:08:04 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* files.el (interpreter-mode-alist): Add most shells, with sh-mode.
! 	Add tail, more, less, pg with text-mode.
! 	(auto-mode-alist): Recognize extensions that indicate
! 	shell scripts, as well as common init file names.
! 	* executable.el (interpreter-mode-alist): Don't alter this here.
! 	* sh-script.el (interpreter-mode-alist, auto-mode-alist):
! 	Don't alter this here.
! 
! 	* autoload.el (batch-update-autoloads): Use error-message-string.
! 
! Thu Jan  4 18:54:22 1996  Paul Eggert  <eggert@twinsun.com>
! 
! 	Spelling corrections.
! 
! 	* ediff-wind.el (ediff-mouse-pixel-threshold): Renamed from
! 	ediff-mouse-pixel-threshhold.
! 	* gnus.el (gnus-cache-removable-articles): Renamed from
! 	gnus-cache-removeable-articles.
! 	(gnus-newsgroup-savable-name): Renamed from
! 	gnus-newsgroup-saveable-name.
! 	(gnus-bugaboo): Renamed from gnus-boogaboo.
! 	* sendmail.el (sendmail-sync-aliases): Renamed from
! 	sendmail-synch-aliases.
! 	* type-break.el (type-break-guesstimate-keystroke-threshold):
! 	Renamed from type-break-guestimate-keystroke-threshold.
! 	* vi.el (vi-backward-windowful): Renamed from vi-backward-windowfull.
! 	(vi-forward-windowful): Renamed from vi-forward-windowfull.
! 
! 	* cc-mode.el (c++-c-mode-syntax-table): Fix misspelling in
! 	initialization.
! 	* tex-mode.el (slitex-mode): Fix misspelling in value.
! 
! 	* dunnet.el (dun-cd): Fix local var misspelling.
! 	* ediff-diff.el (ediff-exec-process): Likewise.
! 	* terminal.el (te-process-output): Likewise.
! 
! 	* custom.el (custom-default-validate): Fix message spelling.
! 	* debug.el (debug): Likewise.
! 	* doctor.el (make-doctor-variables, doctor-othermodifierp,
! 	doctor-strangelove): Likewise.
! 	* dunnet.el (dun-sauna-heat, dun-login): Likewise.
! 	* gnus.el (gnus-summary-save-article): Likewise.
! 	* hideshow.el (hs-hide-block): Likewise.
! 	* hilit19.el (hilit-submit-feedback): Likewise.
! 	* mail-extr.el (mail-extr-nuke-outside-range,
! 	mail-extr-all-top-level-domains): Likewise.
! 	* simple.el (shell-command): Likewise.
! 	* term.el (term-process-pager): Likewise.
! 	* term/sun-mouse.el (describe-mouse-briefly): Likewise.
! 
! 	* ada-mode.el (ada-case-keyword, ada-auto-case, ada-krunch-args,
! 	ada-call-pretty-printer): Doc fix.
! 	* allout.el (outline-primary-bullet, outline-numbered-bullet,
! 	outline-override-protect, outline-explicitly-deactivated,
! 	outline-init, outline-chart-subtree, outline-chart-spec,
! 	outline-make-topic-prefix, outline-open-topic,
! 	outline-reindent-body, outline-yank-processing, outline-yank,
! 	outlineify-sticky): Doc fix.
! 	* apropos.el (apropos-files-scanned): Doc fix.
! 	* arc-mode.el (archive-summarize-files): Doc fix.
! 	* bib-mode.el (capitalize-title-stop-words): Doc fix.
! 	* bibtex.el (bibtex-generate-autokey, bibtex-find-entry-location):
! 	Doc fix.
! 	* bookmark.el (bookmark-save-flag, bookmark-read-annotation-text-func,
! 	bookmark-rename, bookmark-bmenu-mode, bookmark-menu-rename): Doc fix.
! 	* cc-mode.el (c-file-offsets, c++-mode, c-mode, objc-mode,
! 	c-postprocess-file-styles): Doc fix.
! 	* cl-extra.el (cl-copy-tree): Doc fix.
! 	* comint.el (comint-ptyp, comint-completion-autolist): Doc fix.
! 	* compile.el (compilation-error-list): Doc fix.
! 	* cplus-md.el (c++-mode): Doc fix.
! 	* cpp.el (cpp-unknown-face, cpp-face-mono-list, cpp-face-all-list):
! 	Doc fix.
! 	* custom.el (rear-nonsticky, custom-property-set, custom-field-accept,
! 	custom-repeat-extract, custom-pair-extract, custom-list-extract,
! 	custom-choice-extract, custom-choice-validate, custom-mode-map):
! 	Doc fix.
! 	* dired-x.el (dired-mark-sexp): Doc fix.
! 	* docref.el (docref-subst): Doc fix.
! 	* edebug.el (edebug-read): Doc fix.
! 	* ediff-init.el (ediff-keep-variants): Doc fix.
! 	* ediff-wind.el (ediff-prefer-iconified-control-frame): Doc fix.
! 	* edt.el (edt-find-forward, edt-find-backward, edt-find,
! 	edt-find-next-forward, edt-find-next-backward, edt-find-next): Doc fix.
! 	* ffap.el (ffap-list-env): Doc fix.
! 	* files.el (make-directory): Doc fix.
! 	* fill.el (fill-context-prefix, unjustify-current-line,
! 	unjustify-region): Doc fix.
! 	* font-lock.el (font-lock-keywords): Doc fix.
! 	* format.el (format-annotate-atomic-property-change): Doc fix.
! 	* forms.el (forms-toggle-read-only, forms-enumerate): Doc fix.
! 	gnus-cus.el: Doc fix.
! 	* gnus-edit.el (gnus-score-custom-data): Doc fix.
! 	* gnus-uu.el (gnus-uu-do-not-unpack-archives): Doc fix.
! 	* gnus.el (gnus-buffer-configuration,
! 	gnus-article-hide-headers-if-wanted): Doc fix.
! 	* hexl.el (hexl-program, hexl-beginning-of-1k-page,
! 	hexl-end-of-1k-page, hexl-beginning-of-512b-page,
! 	hexl-end-of-512b-page): Doc fix.
! 	* hideshow.el (hs-unbalance-handler-method, hs-show-block): Doc fix.
! 	* hilit19.el (hilit-lookup-face-create): Doc fix.
! 	* icomplete.el (icomplete-simple-completing-p, icomplete-completions):
! 	Doc fix.
! 	* info.el (Info-get-token): Doc fix.
! 	* isearch.el (isearch-abort, isearch-no-upper-case-p): Doc fix.
! 	* iso-acc.el (iso-accents-mode): Doc fix.
! 	* iso-cvt.el (iso-fix-tex2iso): Doc fix.
! 	* ispell4.el (ispell-gnu-look-still-broken-p, ispell-message-text-end):
! 	Doc fix.
! 	* make-mode.el (makefile-insert-special-target,
! 	makefile-backslash-region): Doc fix.
! 	* mh-e.el (mh-good-msg-regexp): Doc fix.
! 	* modula2.el (m2-case, m2-for, m2-if): Doc fix.
! 	* msb.el (msb-max-file-menu-items, msb-menu-cond): Doc fix.
! 	* nnmail.el (nnmail-message-id-cache-length): Doc fix.
! 	* pascal.el (pascal-auto-newline, pascal-mode, electric-pascal-hash):
! 	Doc fix.
! 	* rcompile.el (remote-compile-run-before): Doc fix.
! 	* refbib.el (r2b-additional-stop-words, capitalize-title-stop-words):
! 	Doc fix.
! 	* regi.el (regi-interpret): Doc fix.
! 	* reporter.el (reporter-dont-compact-list): Doc fix.
! 	* sh-script.el (sh-mode-syntax-table): Doc fix.
! 	* simple.el (next-completion): Doc fix.
! 	* skeleton.el (skeleton-insert): Doc fix.
! 	* supercite.el (sc-citation-nonnested-root-regexp,
! 	sc-add-citation-level, sc-no-blank-line-or-header): Doc fix.
! 	* tempo.el (tempo-local-tags, tempo-user-elements, tempo-use-tag-list):
! 	Doc fix.
! 	* term.el (term-ptyp, term-termcap-format, term-scroll-region,
! 	term-completion-autolist): Doc fix.
! 	* texinfo.el (texinfo-master-menu): Doc fix.
! 	* texnfo-upd.el (texinfo-master-menu): Doc fix.
! 	* thingatpt.el (read-from-whole-string): Doc fix.
! 	* tmm.el (tmm-get-keybind): Doc fix.
! 	* tpu-edt.el (GOLD-map, GOLD-CSI-map, GOLD-SS3-map, tpu-set-mark):
! 	Doc fix.
! 	* type-break.el (type-break-keystroke-threshold, type-break-mode):
! 	Doc fix.
! 	* vip.el (vip-shift-width): Doc fix.
! 	* viper.el (vip-insert-diehard-minor-mode, vip-toggle-search-style,
! 	vip-del-backward-char-in-replace, vip-query-replace): Doc fix.
! 	* vmsproc.el (display-subprocess-window): Doc fix.
! 	* xscheme.el (xscheme-control-g-synchronization-p): Doc fix.
  
! Thu Jan  4 17:52:55 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* browse-url.el (browse-url-usr1-signal): Doc fix.
  
! Thu Jan  4 15:09:01 1996  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* autoload.el (generate-file-autoloads): Preserve whitespace after
! 	cookie in literal text copied to output; eat only a single space.
  
! Thu Jan  4 14:00:13 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* subr.el (error): Doc fix.
  
! Thu Jan  4 11:02:30 1996  Andre Spiegel  <spiegel@berlin.informatik.uni-stuttgart.de>
  
! 	* vc.el: Better doc strings for a few variables.
! 	(vc-cancel-version): Handle versions that start a new branch.
! 	(vc-backend-checkout): SCCS case: handle empty revision number.
! 	(vc-diff): Don't pop to the *vc-diff* buffer if file is unchanged.
  
! 	* vc-hooks.el: Better doc strings.
  
! Thu Jan  4 03:23:11 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* browse-url.el (browse-url-mosaic): Print "done" message
! 	after starting mosaic.  Change the message about sending a signal.
! 	(browse-url-netscape): Print "done" message after starting.
! 	(browse-url-usr1-signal): Use SIGUSR1 in upper case.
! 	(browse-url-at-point, browse-url-at-mouse, browse-url-of-buffer)
! 	(browse-url-of-file, browse-url-of-dired-file): Add autoload cookies.
  
! Wed Jan  3 13:34:47 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* dired.el (dired-insert-directory): Force use of C locale.
  
! 	* sendmail.el (mail-header-separator): Don't put on read-only property.
  
! Tue Jan  2 00:23:10 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* man.el (Man-mode-map): Delete `toggle-truncate-lines' binding.
  
! 	* xt-mouse.el (xterm-mouse-translate, xterm-mouse-event):
! 	Variable `last' renamed to `xterm-mouse-last'.
! 	(xterm-mouse-last): Add defvar.
  
! 	* sendmail.el (sendmail-send-it): Make deletion of empty subject line
! 	work reliably.
  
! 	* tmm.el (tmm-prompt): Major cleanups.  Handle pop-menu case nicely.
! 	Arg BIND renamed to MENU.
!   	Look at MENU to decide whether it is a keymap.
! 	Arg IN-POPUP now used only in recursive call.
! 	Use "Menu bar" as the default menu name.
! 	Delete some debugging code.
  
! 	* tmm.el (tmm-menubar-mouse): New function, handles [menu-bar mouse-1].
! 	(tmm-menubar): New arg x-position.
! 	(tmm-prompt): New arg default-item specifies item to offer by default.
  
! Mon Jan  1 17:44:54 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* startup.el (normal-top-level):
! 	Add ~ at end of auto-save-list-file-prefix.
  
! 	* completion.el (save-completions-file-name):
! 	Use convert-standard-filename.
  
! 	* paths.el (abbrev-file-name): Use convert-standard-filename.
  
! 	* saveplace.el (save-place-file): Use convert-standard-filename.
  
! 	* viper.el (vip-custom-file-name): Use convert-standard-filename.
  
! 	* dired-x.el (dired-local-variables-file):
! 	Use convert-standard-filename.
  
! 	* files.el (convert-standard-filename): New function.
! 	* dos-fns.el (convert-standard-filename): New alternate definition.
  
! Mon Jan  1 15:50:32 1996  Eli Zaretskii  <eliz@is.elta.co.il>
  
! 	* term/pc-win.el (x-colors): New variable, a list of colors
! 	supported by PC color displays under MS-DOS.
!  	(msdos-color-translate): Use `x-colors'.
! 	(x-defined-colors): New alternate definition.
  
! 	* facemenu.el (facemenu-read-color, list-colors-display)
! 	(facemenu-get-face): Treat all non-nil window-system values alike.
! 	(facemenu-color-equal): Special case for MSDOS.
  
! Sun Dec 31 16:07:49 1995  Eli Zaretskii  <eliz@is.elta.co.il>
  
! 	* cpp.el (cpp-config-file): New variable.
! 	(cpp-edit-load): Use `cpp-config-file'.
! 	(cpp-edit-save): Use `cpp-config-file'.
  
! 	* completion.el (save-completions-file-name): Under MS-DOS set to
! 	a filename without a leading dot.
  
! 	* custom.el (custom-file):  Under MS-DOS set to a filename without
! 	a leading dot.
  
! 	* vip.el (vip-startup-file): New variable.
! 	(vip-mode): Use `vip-startup-file' for the startup file name.
  
! 	* ffap.el (ffap-list-env): Use `path-separator' rather than ":".
  
! 	* startup.el (auto-save-list-file-prefix):  Under MS-DOS, use `.s-'.
! 	(normal-top-level): Under MS-DOS, use `make-temp-name' to produce
! 	a unique `auto-save-list-file-name' (PID is not unique enough).
! 	(command-line-1): Delete explicit test for msdos and windowsnt;
! 	test just `window-system'.
  
! 	* files.el (abbrev-file-name): Drive letter can go beyond `Z'
! 	under MS-DOS/Novell.
! 	(auto-mode-alist): Support txt and txi like text and texi.
! 	(backup-buffer): Use convert-standard-filename.
! 	(basic-save-buffer-1): Make the name of the temporary file (where
! 	precious files are saved) conform to MS-DOS 8+3 constraints.
  
! Sun Dec 31 11:00:38 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* jka-compr.el (auto-compression-mode): Add `interactive'.
! 	Put \-newline in doc string.
! 	(toggle-auto-compression): New arg MESSAGE.  Don't use interactive-p.
  
! 	* mouse.el (mouse-drag-region, mouse-drag-secondary):
! 	Bind echo-keystrokes to 0.
  
! 	* hexl.el (hexl-mode): Don't call kill-all-local-variables.
! 	Save write-contents-hooks, require-final-newline, the syntax table.
! 	Use make-local-hook for change-major-mode-hook.
! 	(hexl-mode-exit): Restore those vars; remove our local hooks.
  
! Sat Dec 30 11:43:20 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* find-file.el: Doc fixes.
!  	(ff-get-file): Use get-file-buffer to avoid false match.
! 	(ff-switch-to-buffer): Rename arg FILE to BUFFER-OR-NAME.
  
! 	* lpr.el (lpr-page-header-switches, lpr-headers-switches): Doc fixes.
  
! Sat Dec 30 04:22:11 1995  <Daniel.Pfeiffer@Informatik.START.dbp.de>
  
! 	* facemenu.el (facemenu-add-face-function, facemenu-end-add-face)
! 	(facemenu-remove-face-function): New variables.
! 	(list-text-properties-at): Output in echo area when one short prop.
! 	(facemenu-self-insert-face): Deleted function.
! 	(facemenu-add-face): 2nd & 3rd arg optional, thus also handles
! 	`facemenu-self-insert-face'.  Use new variables to potentially do
! 	something other than set a face under mode (TeX, HTML) control.
! 	When region is empty, add face to next input.
  
! 	* tex-mode.el (tex-face-alist, tex-latex-face-alist): New variables.
! 	(latex-mode, tex-common-initialization): Use them to set up facemenu.
  
! Fri Dec 29 16:06:28 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* term/x-win.el (x-handle-switch, x-handle-numeric-switch)
! 	(x-handle-args): Use command-line-x-option-alist.
! 	(x-option-alist, x-switch-definitions, x-long-option-alist): Deleted.
  
! Fri Dec 29 15:49:02 1995  Erik Naggum  <erik@churchy.gnu.ai.mit.edu>
  
! 	* vc.el (vc-backend-checkin): Use vc-checkin-switches.
  
! Fri Dec 29 00:42:53 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* startup.el (command-line-x-option-alist): Use x-handle-geometry
! 	for geometry options.
  
! 	* startup.el (command-line-x-option-alist): New variable.
! 	(command-line-1): Ignore X options when not using X.
  
! 	* jka-compr.el (auto-compression-mode): This is now a stub function
! 	that calls toggle-auto-compression, and is put bodily into loaddefs.el.
!  	(toggle-auto-compression): Renamed from auto-compression-mode.
! 	Not autloaded.
  
! Thu Dec 28 22:32:53 1995  Karl Eichwalder  <ke@ke.Central.DE>
  
! 	* dired.el (dired): Fix typo.
  
! Thu Dec 28 14:22:39 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* ps-print.el (ps-do-despool): Alternative output method for MSDOS.
  
! 	* files.el (recover-session): Bind ls-lisp-support-shell-wildcards.
  
! Thu Dec 28 11:49:16 1995  Eli Zaretskii  <eliz@is.elta.co.il>
  
! 	* ls-lisp.el (ls-lisp-support-shell-wildcards): New variable.
! 	(insert-directory): Convert the filename wildcard to an equivalent
! 	Emacs regexp, when `ls-lisp-support-shell-wildcards' is non-nil.
! 	Handle file patterns like "/foo*/" as if it were "/foo*", like the
! 	shell would.  Print zero total for files whose total size is
! 	exactly zero (in particular, for no files at all).  Say "No match"
! 	when no files match the given wildcard.
! 	(ls-lisp-format): Make directory listing format more like POSIX ls.
  
! 	* files.el (wildcard-to-regexp): New function.
  
! Thu Dec 28 00:38:40 1995 1995  Marc Fleischeuers  <marc@mpi.nl>
  
! 	* files.el (make-auto-save-file-name): Make name always end in #,
! 	i.e. overwrite third char in extension if required.
  
! Wed Dec 27 12:21:50 1995  Ed Reingold  <reingold@mole.gnu.ai.mit.edu>
  
! 	* diary-lib.el: Replaced all uses of get-file-buffer with
! 	find-buffer-visiting.
  
! 	* cal-menu.el (calendar-mouse-print-dates): Put date on top of menu.
  
! 	* calendar.el: Fix autoloads for astro functions.
  
! 	* solar.el: Rewrote completely for better accuracy.
  
! Tue Dec 26 14:42:31 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* mouse.el (mouse-menu-buffer-maxlen): New variable.
! 	(mouse-buffer-menu): Use it.
  
! Tue Dec 26 07:53:30 1995  Karl Eichwalder  <ke@ke.Central.DE>
  
! 	* menu-bar.el (buffers-menu-max-size): Move definition to top of file.
  
! Mon Dec 25 12:34:10 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* mouse.el (mouse-buffer-menu): If lots of buffers,
! 	group them into multiple panes.
  
! 	* cc-mode.el: Switch to GNU style only the first time file is loaded.
  
! 	* hideif.el: Many doc fixes.
! 	(hide-ifdefs): New arg NOMSG.  Set hif-outside-read-only here.
! 	(hif-before-revert-function): New function.  Put on after-revert-hook.
  
! 	* files.el (revert-buffer): New arg preserve-modes.
! 	(after-find-file): New arg nomodes.
! 	* vc.el (vc-revert-buffer1): Pass t as preserve-modes to revert-buffer.
  
! 	* vc.el: Fix error message style.
! 	(vc-backend-checkout, vc-backend-checkin):
! 	Allow vc-checkin-switches and vc-checkout-switches to be a string.
  
! Sun Dec 24 23:15:50 1995  Noah Friedman  <friedman@prep.ai.mit.edu>
  
! 	* window.el (split-window-vertically): Don't change point in old
! 	window if both the original point and the end of the buffer are
! 	visible after splitting, when split-window-keep-point is nil.
  
! Sun Dec 24 21:51:57 1995  Michael Ernst  <mernst@cs.rice.edu>
  
! 	* uniquify.el (uniquify-fix-list-filename-lessp):
! 	Renamed from uniquify-filename-sort.
  
! Sun Dec 24 20:30:43 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* make-mode.el (makefile-add-log-defun): Rewrite to scan back
!  	checking one line at a time.  Notice blank lines and comments.
  
! Sun Dec 24 18:20:23 1995  Karl Fogel  <kfogel@wombat.gnu.ai.mit.edu>
  
! 	* bookmark.el: Removed all `bookmark-xemacsp' conditional code
! 	relating to menus.  Do ";;;###autoloads" the as they were done in
! 	2.6.13.
! 	(bookmark-version): new var, set to 2.6.19.
! 	(baud-rate): set to 19200 if not already bound.
! 	(bookmark-make): don't call `set-text-properties' on a Lisp string
! 	if this is XEmacs, because it won't work.
! 	(buffer-substring-no-properties): if this is not fboundp, then
! 	fset it to `buffer-substring-without-properties'.
  
! Sun Dec 24 13:43:55 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* iso-acc.el: When turning on default settings,
! 	preserve iso-accents-enable if it's already set.
  
! 	* rmail.el (rmail-forward): Quote lines with `- ' when necessary.
  
! Sun Dec 24 04:25:39 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* files.el (save-some-buffers): Don't give message if we queried.
  
! Sat Dec 23 20:09:36 1995  Geoff Voelker  <voelker@cs.washington.edu>
  
! 	* term/win32-win.el: Disable scrollbars until fully functional.
  
! Sat Dec 23 01:56:42 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* ps-print.el (ps-spool-buffer-with-faces): Fix typo in previous chg.
! 	(ps-spool-region-with-faces): Likewise.
  
! 	* cc-mode.el (c-fill-paragraph): Return t if did special filling.
! 	Otherwise return nil and don't change the buffer.
  
! 	* fill.el (fill-paragraph-function): Doc fix.
  
! 	* iso-acc.el (iso-languages): Add entry for `irish'.
  
! 	* cc-mode.el (c-mode-map): Don't rebind M-q.
! 	(c-common-init): Set fill-paragraph-function.
  
! 	* rmail.el (rmail): Allow nonexistent file as arg.
  
! Fri Dec 22 17:21:11 1995  Eli Zaretskii  <eliz@is.elta.co.il>
  
! 	* compile.el (compile-internal): On systems with no asynchronous
! 	processes: do relevant parts of compilation-sentinel after the
! 	process exits; make modeline during and after compilation be
! 	similar to what compilation-sentinel displays.
  
! Fri Dec 22 07:13:45 1995  Erik Naggum  <erik@naggum.no>
  
! 	* paths.el (rmail-spool-directory): Append slash to all pathnames.
  
! Thu Dec 21 14:01:38 1995  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* emacsbug.el (report-emacs-bug): Don't die if *Messages* buf is gone.
  
! Thu Dec 21 08:27:43 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* disp-table.el (standard-display-european): Make 160 display as space.
  
! 	* files.el (save-buffer): Doc fix.
  
! Thu Dec 21 00:14:36 1995  <Daniel.Pfeiffer@Informatik.START.dbp.de>
  
! 	* sendmail.el (mail-setup): Put text property on mail-header-separator.
! 	(mail-header-separator): Set it up for use as a category property.
! 	(mail, mail-send): Turn on inhibit-read-only temporarily.
  
! Wed Dec 20 14:10:32 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* disp-table.el (standard-display-european): Test code 161, not 160.
  
! 	* loaddefs.el (debug-ignored-errors): Set it.
  
! Mon Dec 18 22:02:06 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* startup.el (normal-top-level): Don't set auto-save-list-file-name
! 	if auto-save-list-file-prefix is nil.
  
! Sun Dec 17 02:07:05 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* simple.el (shell-command-on-region): If current buffer is
! 	*Shell Command Output*, use the replacement case.
  
! 	* iso-acc.el: Many doc fixes.
  
! 	* iso-ascii.el (iso-ascii-convenient): New variable.
! 	(iso-ascii-display): New function to implement that variable.
! 	Use it instead of using standard-display-ascii directly.
  
! 	* startup.el (normal-top-level): Don't set auto-save-list-file-name
! 	if it was already set non-nil (by .emacs, for example).
! 	(auto-save-list-file-prefix): Doc fix.
  
! 	* imenu.el (imenu-update-menubar): New function.
! 	(imenu-add-to-menubar): Use an ordinary menu bar submenu.
! 	Add imenu-add-to-menubar to menu-bar-update-hook to update the submenu.
! 	(imenu--make-index-alist): Add noerror argument.
! 	(imenu--menubar-select): New function.
! 	(imenu--create-keymap-1, imenu--create-keymap-2): New arg COMMANDS.
! 	(imenu): Allow a string as arg.
  
! Sat Dec 16 06:04:56 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* emacsbug.el (report-emacs-bug): If `mail' asks for confirmation
! 	and the user doesn't give it, don't do anything more.
! 	Explain a way to cancel the message.
! 	Include recent keys and recent *Messages* messages at end.
  
! Fri Dec 15 00:04:56 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* ps-print.el: Doc fixes.
  
! 	* edebug.el (edebug-read-syntax-table): Add backquote.
! 	(edebug-read-alist): Handle comma and backquote.
! 	(edebug-read-backquote, edebug-read-comma): New functions.
! 	(edebug-read-list): Special handling for backquote.
  
! 	* rmail.el (rmail-ignored-headers): Add resent-date, nntp-posting-host.
  
! 	* make-mode.el (makefile-font-lock-keywords): Fix bad structure
! 	for the "^\t+#" element.
  
! 	* startup.el (command-line-1): Use auto-save-list-file-prefix
! 	when checking for existing files.
  
! Thu Dec 14 03:01:52 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* calendar.el (calendar-astro-from-absolute): Autoload it.
  
! 	* subr.el (add-to-list): Doc fix.
  
! 	* supercite.el (sc-attribs-extract-namestring): Do look for
! 	doublequotes after finding angle brackets.
  
! 	* rmail.el (rmail-retry-failure): Fix previous change.
! 	Combine variables mail-buffer and rmail-buffer.
! 	Look for an end-delimiter in case where the start-of-bounce
! 	delimiter looks like -- plus some more text.
  
! Tue Dec 13 02:18:39 1995  Kevin Rodgers <kevinr@ihs.com>
  
! 	* ange-ftp.el (ange-ftp-load): Added missing form to `cdr' down
! 	tryfiles in `while' loop.
  
! Tue Dec 12 21:51:57 1995  Michael Ernst  <mernst@cs.rice.edu>
  
! 	* uniquify.el (uniquify-fix-list-filename-lessp): Rename from
! 	uniquify-filename-sort.
! 	Correct doc references to Emacses that aren't FSF GNU Emacs 19.
  
! Tue Dec 12 03:05:06 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* flow-ctrl.el (enable-flow-control-on): Try the whole TERM name
! 	before trying to strip off words from the end.
  
! 	* rmail.el (rmail-search): Doc fix.
  
! Mon Dec 11 08:43:36 1995  Ake Stenhoff <etxaksf@aom.ericsson.se>
  
! 	* cc-mode.el (cc-imenu-c++-generic-expression): New variable.
! 	(cc-imenu-c-generic-expression): New variable.
! 	(c++-mode): Set imenu-generic-expression.
! 	(c-mode): Set imenu-generic-expression.
  
! Sun Dec 10 04:28:15 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* isearch.el (isearch-done): Use executing-kbd-macro.
  
! 	* rmailsum.el (rmail-make-basic-summary-line):
! 	Recognize user-mail-address in From field means msg is from you.
  
! Thu Dec  7 00:07:38 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* byte-opt.el (byte-compile-unfold-lambda): Recursively optimize body.
  
! 	* cc-mode.el (c-style-alist): Downcase the style names.
! 	(c-set-style): Downcase style names for lookup.
! 	(cc-mode style): Define with lower-case name.
  
! Wed Dec  6 02:55:33 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* ange-ftp.el (ange-ftp-start-process): Bind env var TERM to dumb.
  
! 	* lpr.el (lpr-switches, lpr-add-switches): Doc fixes.
  
! Tue Dec  5 08:34:32 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* cc-mode.el (c-progress-fini): Fix "done" message.
  
! Mon Dec  4 03:38:46 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* subr.el (buffer-substring-no-properties): Function deleted.
  
! Sun Dec  3 17:33:37 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* paren.el (window-setup-hook): Clear blink-matching-paren-on-screen;
! 	don't touch  blink-paren-function.
  
! 	* simple.el (blink-matching-paren-on-screen): New variable.
! 	(blink-matching-open): Obey it.
  
! 	* completion.el (symbol-under-point, symbol-before-point)
! 	(symbol-under-or-before-point, symbol-before-point-for-complete):
! 	Use unwind-protect to restore syntax table.
! 	(symbol-before-point, symbol-before-point-for-complete):
! 	Start the backward scan-sexps from point, not (1+ (point)).
  
! 	* bytecomp.el (byte-compile-output-docform): Don't do dynamic doc
! 	strings if byte-compile-compatibility.
  
! 	* isearch.el (isearch-search-and-update): Use isearch-case-fold-search
! 	around the looking-at call.
  
! Sat Dec  2 22:29:07 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* paths.el (rmail-spool-directory): Try /var/spool/mail.
! 	(news-path): Use /var/spool/news as last resort.
  
! 	* lisp-mode.el (lisp-fill-paragraph): Several changes.
! 	Change how to recognize partial comment lines,
! 	how to find start of region to fill.  Use fill-region.
! 	Use tabs when making comment-fill-prefix.
  
! Fri Dec  1 19:07:00 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* isearch.el (isearch-just-started): New variable.
! 	(isearch-mode): Set it.
! 	(isearch-search): Clear it.
! 	(isearch-repeat): If isearch-just-started, don't test for empty match.
! 	(isearch-unread): Use store-kbd-macro-event.
  
! Fri Dec  1 13:13:40 1995  Francesco Potorti` <pot@cnuce.cnr.it>
  
! 	* gud.el (gud-sdb-marker-filter): Modify the regexp for sysVR3 to
! 	take care of the asterisk prompt.  Correctly set gud-marker-acc.
  
! Fri Dec  1 12:09:11 1995  Francesco Potorti` <pot@cnuce.cnr.it>
  
! 	* make-mode.el: Add faces to menu only if window-system.
! 	(makefile-mode): Do not check if makefile-define-space-face is
! 	defined.  Call it only if window-system.
  
! Thu Nov 30 23:46:14 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* gnus-msg.el (gnus-post-news): Add autoload.
  
! Wed Dec 20 14:41:38 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* compile.el (compilation-mode): Add autoload cookie.
  
! Tue Dec 19 16:27:22 1995  Noah Friedman  <friedman@prep.ai.mit.edu>
  
! 	* yow.el (apropos-zippy): New command.
! 	(yow-load-message, yow-after-load-message): New constants.
! 	(yow, read-zippyism): Use them.
! 	Now KEN and BARBIE are PERMANENTLY ADDICTED to MIND-ALTERING DRUGS..
  
! Tue Dec 19 16:59:38 1995  Daniel Pfeiffer  <Daniel.Pfeiffer@Informatik.START.dbp.de>
  
! 	* apropos.el (apropos-match-face): Use `secondary-selection' rather
! 	than `highlight' to distinguish it from mouse-face highlighting of
! 	hyperlinks.
! 	(apropos-mode-map): Rename from `apropos-local-map'.
! 	(apropos-mode): Set it rather than have a local-map that made RET
! 	locally unusable when copied to other buffer.
! 	(apropos-print): Use it.  When there is only one property, show
!  	what it is.  Remove superfluous `save-excursion', thus making help
!  	commands' return-message be correct.
! 	(apropos-print, apropos-describe-plist): `print-help-return-message'
! 	like help commands.
  
! Tue Dec 19 16:01:23 1995  Eli Zaretskii  <eliz@is.elta.co.il>
  
! 	* time.el (display-time): make it work under ms-dos by setting the
! 	`dos-display-time' variable instead of invoking `wakeup' as
! 	asynchronous process (which doesn't work under ms-dos).
  
! Tue Dec 19 15:27:48 1995  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* files.el (auto-mode-alist): Recognize .S and .asm extensions.
  
! 	* files.el (make-backup-file-name, backup-file-name-p): Use ~ even
! 	on ms-dos.
! 	* dired.el (dired-flag-backup-files): Undo previous change.
  
! Sat Dec 16 09:52:28 1995  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
  
! 	* nntp.el (nntp-open-server): Enable successful "connectionless"
! 	server switching.
  
! Fri Dec 15 16:19:43 1995  Eric Ding  <ericding@mit.edu>
  
! 	* goto-addr.el: Mouse-click method now bound using text
! 	properties rather than local-set-key.
  
! Fri Dec 15 16:10:59 1995  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* sendmail.el (mail-bury): Use window-dedicated-p.
  
! 	* files.el (set-auto-mode): Recognize `#!/bin/env INTERPRETER' hack.
  
! Thu Dec 14 06:59:16 1995  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
  
! 	* gnus.el (gnus-summary-mode-line-format,
! 	gnus-article-mode-line-format, gnus-group-mode-line-format):
! 	Include the buffer name in the default mode strings.
! 	(gnus-mode-non-string-length): Changed the default to not
! 	limit/pad mode line lengths.
! 	(gnus-set-mode-line): Supply new values for the mode string
! 	variables.
! 	(gnus-summary-remove-lines-marked-with): Put point on the current
! 	article after expunging lines.
  
! Thu Dec 14 00:08:10 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* etags.el: Fix completely broken changes of 4 Feb 95 by
! 	brat@htilbom.ernet.in, which were obviously never tested or even
! 	examined closely before being installed.
! 	(find-tag-file-order): Variable removed.
! 	(find-tag-noselect): Remove gratuitously added variable SEARCH-TAG and
! 	bogus clobbering of find-tag-order for patterns ending in dot (serious
! 	braindamage here).
! 	(find-tag-in-order): Remove gratuitously added variable
! 	TAGS-TABLE-FILE.  Remove variable MATCH-TYPE and code testing it
! 	for stupid special case.
! 	(etags-recognize-tags-table): Put tag-exact-file-name-match-p first in
! 	find-tag-tag-order list.  Don't set bogus find-tag-file-order variable.
! 	(etags-snarf-tag): Notice file name match and return tag info with t
! 	in place of tag text.
! 	(etags-goto-tag-location): If (car TAG-INFO) is t, go directly to
! 	the specified location.
! 	(tag-exact-file-name-match-p): Renamed from tag-filename-match-p,
! 	and fixed.
! 	(tags-table-files): Doc fix: names are returned unexpanded.
! 	(etags-tags-table-files): Don't expand file names.
! 	(tags-table-including, next-file): Expand result of (tags-table-files).
! 	(tags-complete-tags-table-file): New function, helper for interactive
! 	spec of list-tags.
! 	(list-tags): Revert to original code, but use that function to lazify
! 	the completion table.
! 	(tags-list-functions-in-file, tags-locate-file-in-tags-table):
! 	Functions removed.
  
! 	* autoload.el (generate-file-autoloads): If no buffer visiting
! 	FILE exists, read it into a temp buffer for processing without
! 	visiting it.
  
! Wed Dec 13 15:20:09 1995  Stefan Schoef  <schoef@OFFIS.Uni-Oldenburg.DE>
  
! 	* bibtex.el (bibtex-auto-fill-function): Adapted for use with
! 	changed autofill policy of emacs-19.30 (uses now fill-prefix
! 	instead of indent-line-function).
! 	(bibtex-indent-line-function): Removed (not used any more).
  
! 	* bibtex.el (bibtex-make-field): Was broken when called
! 	non-interactively.
  
! 	* bibtex.el (bibtex-make-field): Point is now placed on closing
! 	brace or quote (suggested by Karl Eichwalder <ke@ke.Central.DE>).
  
! 	* bibtex.el (bibtex-clean-entry): Comma after last field isn't
! 	deleted anymore (new standard in BibTeX 0.99 and 1.xx).
! 	(bibtex-enclosing-reference-maybe-empty-head): Works with entries
! 	with comma after last field.
! 	(bibtex-reference): Permits entries with comma after last field.
! 	(bibtex-font-lock-keywords): Enhanced to support new field-name
! 	characters (suggested by Martin Maechler
! 	<maechler@stat.math.ethz.ch>).
  
! 	(bibtex-field-name): Now numbers (not as the first sign), dashes,
! 	and underscores are allowed (suggested by Martin Maechler
! 	<maechler@stat.math.ethz.ch> and Oren Patashnik
! 	<opbibtex@labrea.Stanford.EDU>).
  
! 	* bibtex.el (bibtex-make-field): Was broken on lines containing
! 	non-parenthesized entries (reported by Karl Eichwalder
! 	<ke@ke.Central.DE>).
  
! 	* bibtex.el (bibtex-validate-buffer): Changed so that preamble
! 	references are ignored (same as string entries) (reported by
! 	Martin Maechler <maechler@stat.math.ethz.ch>).
  
! 	* bibtex.el (bibtex-enclosing-reference-maybe-empty-head):
! 	New function to be used in case reference head may be empty.
! 	(bibtex-clean-entry, bibtex-pop-previous, bibtex-pop-next): Uses
! 	now bibtex-enclosing-reference-maybe-empty-head.
! 	(bibtex-mode): Added support for font-lock mode.
! 	(bibtex-font-lock-keywords): New variable with font-lock keywords
! 	for BibTeX mode.
  
! 	* bibtex.el (bibtex-make-optional-field): Not longer interactive
! 	(suggested by Karl Eichwalder <karl@pertron.central.de>).
  
! 	* bibtex.el (bibtex-maintain-sorted-entries): Set to nil, since it
! 	requires more user attention and more restricted files to have
! 	this set to t.
! 	(bibtex-maintain-sorted-entries,
! 	bibtex-sort-ignore-string-entries): Made buffer local, since it
! 	may depend on the buffer which preferences to use.
! 	(bibtex-validate-buffer): Looking for correct sort order only when
! 	bibtex-maintain-sorted-entries is non-nil.
! 	Put a comment in the `KNOWN BUGS' section about the
! 	quote-inside-quotes problem.
! 	(whole file): Changed string `true' in some documentation strings
! 	to `non-nil' (e.g. `if variable has a true/non-nil value').
! 	(bibtex-mode-map): Changed `move/edit' to `bibtex-edit'.
  
! 	* bibtex.el (bibtex-sort-entries): Now works correctly with
! 	`@String' entries inside BibTeX files (i.e. after the occurence of
! 	other references).
! 	(bibtex-validate-buffer): Inserted code which looks if entries are
! 	balanced (a single non-escaped quote inside braces was not
! 	detected till now, but bibtex-sort-entries stumbles about it).
  
! 	* bibtex.el (bibtex-entry): bibtex-move-outside-of-entry is only
! 	called when bibtex-maintain-sorted-entries is nil (otherwise
! 	bibtex-find-entry-location determines the correct location).
! 	(bibtex-find-entry-location): Now uses binary search. As before,
! 	it assumes that the buffer is sorted without duplicates (but as
! 	before it is only called when bibtex-maintain-sorted-entries is
! 	t). Ignores `@String' entries if told so via variable
! 	bibtex-sort-ignore-string-entries.
  
! 	* bibtex.el (bibtex-clean-entry): Respect
! 	bibtex-maintain-sorted-entries when inserting autokey.
! 	(bibtex-validate-buffer): Searching whole buffer for duplicates
! 	and correct order is now done directly instead of calling
! 	bibtex-find-entry-location (since this is to be reprogrammed to
! 	use a binary search instead a sequential one).
  
! 	* bibtex.el (bibtex-parse-keys): May now be called with an
! 	optional parameter which (if t) tells bibtex-parse-keys that it
! 	should abort if input is pending.
! 	(bibtex-mode): The instance of bibtex-parse-keys called in
! 	auto-save-mode-hook is now called with this new parameter set to
! 	t, so an auto-save caused by exceeding auto-save-interval is now
! 	aborted immediately if user is still typing.
  
! 	* bibtex.el (bibtex-print-help-message, bibtex-clean-entry): Use
! 	now constant strings instead of custom ones.
  
! 	* bibtex.el (bibtex-clean-entry): Changed the call of
! 	bibtex-enclosing-reference to a more specific call so entries
! 	without a key (here allowed) can be handled.
! 	(bibtex-reference-key): Cleared off parentheses (caused string
! 	entries enclosed by parentheses instead of braces to be not added
! 	to bibtex-completion-candidates).
! 	(bibtex-complete-string): Made it use bibtex-string.
  
! 	* bibtex.el (bibtex-keys,
! 	bibtex-buffer-last-parsed-for-keys-tick): New buffer-local
! 	variables to make parsing of BibTeX buffer for reference keys
! 	(needed by TAB completion in minibuffer when entering key) more
! 	occasional.
! 	(bibtex-parse-keys): New function to parse for keys (functionality
! 	was partially included in bibtex-entry).
! 	(bibtex-entry): Changed to use bibtex-parse-keys.
! 	(bibtex-mode): Installs bibtex-parse-keys as an
! 	auto-save-mode-hook, so whole buffer is parsed at most when it is
! 	autosaved.
! 	(bibtex-clean-entry): Calls bibtex-parse-keys on the new entry, so
! 	bibtex-keys remains consistent for new entries that are finished
! 	by calling this function (most should).
  
! 	* bibtex.el (bibtex-inside-field): Be independent on current
! 	setting of bibtex-field-right-delimiter (allows more intermixing
! 	between quotes and braces).
! 	(bibtex-make-field): Last change didn't make it work correctly
! 	when called non-interactively by bibtex-entry (fixed).
  
! Wed Dec 13 14:41:20 1995  Eli Zaretskii  <eliz@is.elta.co.il>
  
! 	* dired.el (dired-flag-backup-files): Under MS-DOS, search for
! 	possible backup files by checking for filenames which end with a
! 	`k' (the backup extension is `.bak').
  
! Wed Dec 13 10:07:54 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
  
! 	* faces.el (modify-face): Take extra optional arg FRAME.
! 	Use face-try-color-list to change foreground and background colours.
! 	If BOLD-P, ITALIC-P or UNDERLINE-P not nil or t, don't change the
! 	display attribute corresponding to that arg.  Doc fix.
  
! Tue Dec 12 21:18:33 1995  David K}gedal  <davidk@lysator.liu.se>
  
! 	* sendmail.el (sendmail-send-it): Added support for Resent-CC and
! 	Resent-BCC headers.
  
! Tue Dec 12 20:37:04 1995  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* rmail.el (rmail-forward): Delete trailing blank lines.
  
! 	* fill.el (fill-context-prefix): Doc fix.
  
! 	* sh-script.el: Provide sh-script.
  
! Tue Dec 12 20:35:19 1995  Karl Eichwalder  <ke@ke.Central.DE>
  
! 	* add-log.el (change-log-mode): Defaults for `indent-tabs-mode'
! 	and `tab-width'.
  
! Tue Dec 12 20:20:55 1995  Daniel Pfeiffer  <Daniel.Pfeiffer@Informatik.START.dbp.de>
  
! 	* sh-script.el (sh-mode-map): Make the code more legible.
! 	(sh-font-lock-keywords-1): Allow keyword `in' at eol too.
! 	(sh-font-lock-keywords-only): New variable to prevent an apostrophe
! 	in comment from misfontifying buffer, but to allow users who don't
! 	have such to get strings fontified.
! 	(sh-mode): Use it.
  
! Tue Dec 12 03:19:38 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
  
! 	* faces.el (x-frob-font-weight, x-frob-font-slant): Make sure
! 	case-fold-search is bound to t.
  
! Mon Dec 11 08:37:52 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
  
! 	* comint.el (send-invisible): Send string using comint-input-sender.
  
! Sat Dec  9 11:36:34 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
  
! 	* font-lock.el (font-lock-mode): Don't turn on in any buffer with
! 	a leading space in its name, and widen when unfontifying.  Doc fix.
! 	(font-lock-fontify-buffer): Widen when fontifying.
! 	(font-lock-fontify-window): New command.  Bind to C-S-l.
! 	(font-lock-fontify-region, font-lock-unfontify-region): Bind both
! 	change hooks to nil while changing text properties.
  
! Sat Dec  9 03:49:03 1995  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
  
! 	* gnus.el (gnus-simplify-mode-line): New function to simplify the
! 	mode line in a safer manner.
! 	(gnus-group-mode, gnus-browse-mode, gnus-summary-mode,
! 	gnus-article-mode, gnus-server-mode): Use the function.
  
! Fri Dec  8 00:09:26 1995  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
  
! 	* gnus.el (gnus-group-set-mode-line): Allow user defined specs in
! 	the group format mode line.
  
! Wed Dec  6 16:13:34 1995  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
  
! 	* gnus.el (gnus-parse-headers-hook): New hook.
! 	(gnus-get-newsgroup-headers): Call it.
! 	(gnus-get-newsgroup-headers-xover): Call it.
! 	(gnus-group-mode-map): Moved `gnus-group-fetch-faq' from `M-f' to
! 	`H f'.
! 	(gnus-summary-copy-article): Allow respooling to any backend.
! 	(gnus-summary-set-process-mark): Make sure each article can only
! 	be process marked once.
! 	(gnus-summary-remove-lines-marked-with): Put point on a valid
! 	article after removing lines.
! 	(gnus-summary-sort-by-author): Didn't allow sorting when
! 	pseudo-articles were present.
! 	(gnus-summary-sort-by-subject): Ditto.
  
! Wed Dec  6 06:58:24 1995  Erik Naggum  <erik@naggum.no>
  
! 	* files.el (recover-file): Also recover new, unsaved files.
  
! Tue Dec  5 17:55:31 1995  Ed Reingold  <reingold@mole.gnu.ai.mit.edu>
  
! 	* cal-menu.el (calendar-mode-map): Undefine search button.
! 	Many places: Use correct names of functions.
  
! 	* diary-lib.el: Changed all occurrences of buffer-substring to
! 	buffer-substring-no-properties.
! 	(diary-iso-date): Autoload it.
  
! 	* cal-dst.el (dst-in-effect): Fixed calculations for southern
! 	hemisphere and made the doc string clearer.
  
! Sun Dec  3 15:40:23 1995  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* copyright.el (copyright-regexp): Recognize ISO copyright symbol.
! 	(copyright-update): Pattern is now match #2, not #1.
  
! Sat Dec  2 20:53:05 1995  Erik Naggum  <erik@naggum.no>
  
! 	* disp-table.el (display-table-slot,set-display-table-slot):
! 	Document the slot names.
  
! Fri Dec  1 13:13:40 1995  Francesco Potorti` <pot@cnuce.cnr.it>
  
! 	* gud.el (gud-sdb-marker-filter): start may be nil, so check it
! 	with numberp before using it.
  
! 	* isearch.el (isearch-edit-string): Consider the case when
! 	isearch-string is empty and so are the search rings.
  
! Thu Nov 30 23:46:14 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* gnus-msg.el (gnus-post-news): Add autoload.
  
! Wed Nov 29 22:25:04 1995  Paul Eggert  <eggert@twinsun.com>
  
! 	* cal-chinese.el (calendar-chinese-sexagesimal-name): Renamed from
! 	calendar-chinese-sexagisimal-name to fix misspelling.
! 	* cal-hebrew.el (holiday-rosh-hashanah-etc): Fix misspelled var.
! 	* holidays.el (holiday-easter-etc): Fix misspelling of "Whitmonday".
! 	* calendar.el (calendar-setup, calendar-basic-setup,
! 	calendar-next-calendar-round-date,
! 	calendar-previous-calendar-round-date, cal-tex-cursor-year),
! 	cal-julian.el (calendar-absolute-from-astro),
! 	cal-mayan.el: (calendar-next-calendar-round-date,
! 	calendar-previous-calendar-round-date),
! 	diary-lib.el (list-sexp-diary-entries),
! 	solar.el (solar-longitude): Doc fixes to fix misspellings.
  
! Wed Nov 29 01:18:29 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* files.el (auto-mode-alist): Don't purecopy the alist elts.
  
! 	* saveplace.el (save-place-limit): New variable.
! 	(load-save-place-alist-from-file): Obey it.
! 	Fix "done" message.
! 	(save-place-alist-to-file): Fix "done" message.
  
! Tue Nov 28 10:16:22 1995  Gary Oberbrunner  <garyo@darkstar.avs.com>
  
! 	* gud.el (gud-dbx-find-file): Find correct source file.
  
! Mon Nov 27 02:59:54 1995  Erik Naggum  <erik@naggum.no>
  
! 	* apropos.el (apropos-follow): Rewrite to use whole line as target
!  	of reference.
  
! Mon Nov 27 00:40:25 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* apropos.el (apropos-mouse-follow): Do save-excursion.
! 	Error if not adjacent to a mouse-face property.
  
! Sun Nov 26 22:13:24 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* rmailsum.el (rmail-summary-get-new-mail): Don't call
! 	rmail-summary-goto-msg if msg is 0.
  
! Fri Nov 24 11:57:11 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
  
! 	* mailalias.el (build-mail-aliases): Use buffer-substring-no-properties
! 	not buffer-substring.
  
! Fri Nov 24 17:58:03 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* Version 19.30 released.
  
! 	* diary-lib.el: Renamed from diary.el.
! 	* calendar.el, cal-tex.el: Use new name diary-lib.
  
! 	* cc-mode.el (c++-mode, objc-mode, c-mode): Doc fix.
  
! 	* font-lock.el (font-lock-make-faces): Add special code for ms-dos.
  
! 	* view.el (view-mode, view-mode-enter): Doc changes.
! 	(view-mode-map): Change h and ? to use describe-mode.
! 	Delete binding of help char.
! 	(view-mode-enter): Use describe-mode in message.
  
! Thu Nov 23 12:40:47 1995  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
  
! 	* ediff-mult.el (ediff-intersect-directories): Quote symbols
! 	starting with `:'.
  
! 	* view.el (view-mode-enter): Replace Help-helper by help-command
! 	in doc string and message.
  
! 	* sort.el (sort-regexp-fields): Doc fix.
! 	* inf-lisp.el (inferior-lisp-load-command): Doc fix.
! 	* imenu.el (imenu-generic-expression, imenu--generic-function):
! 	Doc fix.
  
! 	* add-log.el (add-change-log-entry): Initialize add-log-full-name
! 	and add-log-mailing-address before prompting.
  
! Thu Nov 23 00:56:16 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* completion.el (cmpl-make-standard-completion-syntax-table)
! 	(cmpl-make-c-def-completion-syntax-table): Use make-syntax-table.
! 	(completion-c-mode-hook): Encapsulate C-mode changes in new function.
! 	Either call it now or put it on c-mode-hook.
  
! Wed Nov 22 14:55:12 1995  Barry Warsaw  <bwarsaw@anthem (Barry Warsaw)>
  
! 	* cc-mode.el (c-beginning-of-statement-1): CASE 3, can't just
! 	return t at end of let clause since this will break
! 	arglist-cont-nonempty lines.
  
! Wed Nov 22 14:03:08 1995  Geoff Voelker  <voelker@cs.washington.edu>
  
! 	* makefile.nt (install, clean): Don't use switches to del not
! 	supported by Win95.
  
! Tue Nov 21 00:12:36 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* man.el (Man-fontify-manpage, Man-cleanup-manpage):
! 	Convert \255 to a dash.
  
! 	* apropos.el (apropos-print): Put the item property
! 	on the whole printed symbol.
! 	(apropos-follow): Look for the item property only adjacent to point.
! 	Signal an error if there is none.
  
! Mon Nov 20 00:39:01 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* apropos.el (apropos-print): Use apropos-local-map as buffer's map,
! 	not as a text property.
  
! 	* ediff-hook.el (menu-bar-epatch-menu, menu-bar-ediff-merge-menu)
! 	(menu-bar-ediff-menu): Give names to the menus.
  
! 	* ediff-mult.el: Renamed from ediff-meta.el.  Changed provide.
! 	* ediff.el, ediff-util.el: Require ediff-mult.
! 	* ediff-hook.el (ediff-show-registry): Use renamed file ediff-mult.el.
  
! 	* array.el (array-mode): Set overwrite-mode to overwrite-mode-textual.
  
! 	* term/pc-win.el (msdos-color-aliases): Add more aliases.
! 	(msdos-face-setup): Change colors for bold, bold-italic, underline.
! 	(x-frob-font-slant): Define as no-op.
  
! 	* saveplace.el (save-place-to-alist): Handle hexl-mode specially.
  
! Sun Nov 19 18:24:58 1995  Erik Naggum  <erik@naggum.no>
  
! 	* calendar.el (cal-tex-cursor-week-iso): Doc fix.
  
! Sun Nov 19 15:39:49 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* calendar.el:
! 	(cal-tex-cursor-filofax-week): Renamed from cal-tex-cursor-week6.
! 	(cal-tex-cursor-filofax-2week): Renamed from cal-tex-cursor-week5.
! 	(cal-tex-cursor-week-monday): Renamed from cal-tex-cursor-week4.
! 	(cal-tex-cursor-week-iso): Renamed from cal-tex-cursor-week3.
  
! 	* cal-tex.el (cal-tex-version): Deleted.
! 	(cal-tex-cursor-year-landscape): Doc fix.
! 	(cal-tex-cursor-filofax-week): Renamed from cal-tex-cursor-week6.
! 	(cal-tex-cursor-filofax-2week): Renamed from cal-tex-cursor-week5.
! 	(cal-tex-cursor-week-monday): Renamed from cal-tex-cursor-week4.
! 	(cal-tex-cursor-week-iso): Renamed from cal-tex-cursor-week3.
  
! 	* info.el (Info-directory-list): Use source-directory.
  
! Sat Nov 18 10:49:47 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* calendar.el (calendar-goto-info-node): Don't let
! 	same-window-buffer-names do its usual job--force *info* buffer
! 	into another window.
  
! 	* simple.el (do-auto-fill): Look at 2nd line for fill prefix
! 	even when on the first line.  Don't accept non-whitespace prefix
! 	from the first line.
  
! 	* fill.el (fill-context-prefix): New arg first-line-regexp.
  
! 	* finder.el (finder-known-keywords): Delete `debugging'.
  
! Sat Nov 18 03:09:37 1995  Lars Magne Ingebrigtsen  <larsi@surt.ifi.uio.no>
  
! 	* nntp.el (nntp-open-server): Accept a second optional parameter
! 	for just changing virtual server.  Doc fix.
! 	(nntp-possibly-change-server): Use it.
! 	(nntp-close-server): Ditto.
  
! Fri Nov 17 21:39:30 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* cc-mode.el (c-guess-basic-syntax, c-beginning-of-statement-1):
! 	Do not check for c-conditional-key when skipping backwards over
! 	statements that look sort of like conditionals.  This makes
! 	statements following nested functions indent correctly.  CASE 9B.3
! 	(unknown catchall) now gets triggered by the brace that opens a
! 	nested function.  Also, this changes the relpos for top-level
! 	defun-open braces, but that will be very hard to fix, and it may
! 	break backward compatibility.
  
! 	* cc-mode.el (c-guess-basic-syntax):
! 	CASE 5H, inclass relpos should be relative to
! 	boi of the open brace, not the beginning of the class keyword.
  
! 	* cc-mode.el (c-fill-paragraph): Doc fix.
  
! Fri Nov 17 20:51:54 1995  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
  
! 	* gnus.el (gnus-group-quit-config): Return the quit-config instead
! 	of a list containing the quit-config.
  
! Fri Nov 17 17:34:13 1995  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
  
! 	* mail-utils.el (rmail-dont-reply-to): Preserve whitespace after comma.
  
! Fri Nov 17 13:36:39 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* etags.el (next-file): Make interactive arg t if had any prefix arg.
  
! 	* faces.el (face-color-supported-p): Return nil if no window system.
  
! Fri Nov 17 12:39:59 1995  Ed Reingold  <reingold@spiff.gnu.ai.mit.edu>
  
! 	* cal-coptic.el: Fix epoch of Ethiopiac calendar.
  
! 	* cal-chinese.el: Minor fixes.
  
! Fri Nov 17 11:03:20 1995  Boris Goldowsky  <boris@gnu.ai.mit.edu>
  
! 	* indent.el (move-to-left-margin): Removed left-over code that
!  	made it fail on right-justified and centered text.
  
! 	* fill.el (fill-region-as-paragraph): Remove redundant "setq from".
! 	Don't add extra newline at end if there is no text in paragraph --
! 	doing so can make fill-region loop.
! 	When testing for indentation exceeding fill-column, skip back over
! 	tabs too.
  
! Fri Nov 17 03:19:45 1995  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* rmail.el (rmail-retry-failure): Add missing colons in regexp.
! 	Use " +", not " *", to check for indented text.
! 	Don't make a temp buffer; just record the indent amount.  Simplify.
  
! Fri Nov 17 00:26:48 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* simple.el (do-auto-fill): Ignore the result of fill-context-prefix
! 	if it is empty.
  
! 	* cc-mode.el (c-common-init): Set adaptive-fill-regexp to nil.
  
! 	* fill.el (fill-context-prefix): Use adaptive-fill-regexp only if non-nil.
  
! Thu Nov 16 16:49:56 1995  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
  
! 	* calendar.el (calendar-julian-date-string): Autoload this.
  
! Thu Nov 16 17:23:03 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* ange-ftp.el (ange-ftp-process-handle-hash): If
! 	ange-ftp-hash-mark-unit is nil, don't display a message.
! 	(ange-ftp-process-filter): Call ange-ftp-process-handle-hash even
! 	if ange-ftp-hash-mark-unit is nil.
  
! Thu Nov 16 15:06:51 1995  Johan Vromans  <jvromans@squirrel.nl>
  
! 	* forms.el: Use `buffer-substring-no-properties' instead of
!  	`buffer-substring' to avoid the properties being copied.
  
! Thu Nov 16 12:22:11 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* cc-mode.el (c-beginning-of-statement, c-end-of-statement):
! 	New arg sentence-flag.  Use that instead of interactive-p.
! 	(c-mode-help-address): Send bug reports to bug-gnu-emacs too.
  
! 	* fill.el (fill-context-prefix): Check adaptive-fill-function non-nil.
  
! Thu Nov 16 15:38:58 1995  Per Abrahamsen  <abraham@dina.kvl.dk>
  
! 	* menu-bar.el (minibuffer maps): Delete extra quote.
  
! Thu Nov 16 11:31:46 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* info.el (Info-complete-menu-item): Don't treat `* Menu:'
! 	as a menu item.
  
! Wed Nov 15 12:24:00 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* nntp.el (nntp-close-server-internal):
! 	Don't call nntp-possibly-change-server.
  
! 	* cplus-md.el (c++-mode): Remove autoload cookie.
  
! 	* mouse-sel.el (mouse-sel-lost-selection-hook): Undo prev change.
  
! 	* tmm.el (tmm-prompt): Delete tmm-add-prompt if we fail.
! 	Don't switch to *Completions* if it wasn't created.
  
! 	* startup.el (command-line-1): Mention F10.
  
! Tue Nov 14 12:34:00 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* fill.el (fill-individual-paragraphs): Advance 1 line in inner loop.
! 	(fill-region-as-paragraph): Handle left margin extending to or past
! 	fill-column.
  
! 	* mouse-sel.el (mouse-sel-lost-selection-hook): Use (car selection).
  
! 	* indent.el (indent-line-to): Delete spaces before inserting a tab.
  
! 	* calendar.el (calendar-julian-from-absolute): Autoload it.
  
! 	* goto-addr.el (goto-address): Use S-mouse-2, not S-mouse-1.
! 	Add autoload cookie.
  
! 	* startup.el (command-line-1): Reorganize the initial help output.
  
! 	* hexl.el (hexl-mode): Set require-final-newline to nil.
! 	If point was at end of buffer, move it back one byte.
  
! Tue Nov 14 20:25:01 1995  Eric Ding  <ericding@mit.edu>
  
! 	* goto-addr.el (goto-address-highlight-p): New variable.
! 	(goto-address-fontify): Removed check for invisible text,
! 	set inhibit-point-motion-hooks instead
  
! Mon Nov 13 15:20:42 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* vc-hooks.el (vc-locking-user): In CVS case, convert
! 	user number to a string.
  
! 	* vc.el (vc-directory): Require dired.
! 	(vc-revert-buffer): Ignore vc-suppress-confirm.
  
! Mon Nov 13 13:10:12 1995  Morten Welinder  <terra@diku.dk>
  
! 	* arc-mode.el (archive-remote-regexp): Doc fix.
  
! Sun Nov 12 16:54:33 1995  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
  
! 	* compile.el (compilation-sentinel): Use the local value of
! 	compilation-exit-message-function in the process buffer.
  
! Sun Nov 12 14:33:59 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* tmm.el (tmm-define-keys): Don't define ESC ESC.
  
! 	* ffap.el: New file.
  
! 	* info.el (info-insert-file-contents-1): Various rewrites.
! 	Compute EXT-LEFT after removing the dot from SUFFIX.
  
! Sat Nov 11 00:24:12 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* window.el (balance-windows): Don't count the menu bar's lines
! 	in the frame height.
  
! 	* menu-bar.el (delete-frame): Don't use delete-frame as event name.
  
! 	* startup.el (command-line): Don't reject unknown args here.
! 	(command-line-1): Detect it here.
  
! 	* dabbrev.el (dabbrev-case-replace): Doc fix.
  
! Fri Nov 10 19:30:48 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* tmm.el: Define menu-bar mouse-1 as tmm-menubar.
  
! 	* simple.el (universal-argument-other-key): Add to existing
! 	unread-command-events value.
  
! Fri Nov 10 19:34:15 1995  Per Abrahamsen  <abraham@dina.kvl.dk>
  
! 	* xt-mouse.el (global-map): Removed bindings of down events to ignore.
! 	(xterm-mouse-translate): Only generate down event when bound.
! 	Cleanup.  Support for mode line and vertical bar dragging, and
! 	menu-bar events.
! 	(xterm-mouse-x): New variable.
! 	(xterm-mouse-y): New variable.
! 	(mouse-position): Advice to use above variables.
! 	(xterm-mouse-event): Support menu-bar.  Set xterm-mouse-x and
! 	xterm-mouse-y.
  
! Fri Nov 10 10:29:12 1995  Boris Goldowsky  <boris@gnu.ai.mit.edu>
  
! 	* add-log.el (change-log-mode): Remove incorrect "^" anchors from
!  	paragraph-start and -separate.
!  	(change-log-fill-paragraph): Use regular value of paragraph-start
!  	to bound paragraph to be filled, modified values only to do the
!  	filling.  Make lines beginning with parentheses
!  	paragraph-starters, but not paragraph-separators.
  
! 	* cc-mode.el (c-common-init): Remove "^" from paragraph-start and
!  	paragraph-separate.  Moved page-delimiter first in case it has a
!  	"^" also.
  
! 	* lisp-mode.el (lisp-mode-variables, lisp-fill-paragraph): Remove
! 	"^" from paragraph-start and paragraph-separate.  Moved
! 	page-delimiter first in case it has a "^" also.
  
! 	* sh-script.el (sh-mode): as above.  Use page-delimiter rather than
!  	literal "^L".
  
! 	* fill.el (fill-region-as-paragraph): Since adaptive-fill-regexp
!  	is supposed to match text STARTING at the left margin, use
!  	`looking-at' rather than `re-search-forward'.
! 	(fill-individual-paragraphs): Match fill-prefixes starting at
!  	left-margin.
  
! Fri Nov 10 04:55:12 1995  Erik Naggum  <erik@naggum.no>
  
! 	* view.el (View-scroll-lines-forward): Don't recenter at end.
  
! Fri Nov 10 14:11:43 1995  Kevin Rodgers <kevinr@ihs.com>
  
! 	* files.el (find-file-noselect): Respect the value of
! 	find-file-visit-truename when FILENAME is a directory and
! 	find-file-run-dired is non-nil.
  
! Fri Nov 10 13:55:55 1995  Boris Goldowsky  <boris@gnu.ai.mit.edu>
  
! 	* facemenu.el (facemenu-unlisted-faces): Remove font-lock faces from
!  	the default list.  The list of face names was out of sync; to
!  	prevent this from happenning again I made font-lock.el, and other
! 	packages that create "private" faces, put them on the list
! 	themselves.  This should give them a better chance of being
! 	updated when the packages are changed.
  
! 	* calendar.el (holiday-face, calendar-today-face, diary-face): Add
!  	faces to facemenu-unlisted-faces before creating so that facemenu
! 	won't list them as faces to be added interactively.
  
! 	* viper.el: Don't list any faces in menu.
  
! 	* paren.el (show-paren-command-hook): Don't list `paren-mismatch'
!  	face in menu.
  
! 	* make-mode.el (makefile-space-face): Don't list in facemenu.
  
! 	* ediff-init.el: All faces added to facemenu-unlisted-faces list.
  
! 	* facemenu.el (facemenu-active-faces): Replaces function
! 	`facemenu-discard-redundant-faces'.  This version, written by
! 	Simon Marshall, is faster and does not require optional
! 	argument for recursive re-entry.  New argument FRAME allows
! 	check to be done relative to face definitions in any frame.
  
! Fri Nov 10 12:58:36 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* enriched.el (enriched-next-annotation): Doc fix.
  
! 	* dos-fns.el: Fix previous change.
  
! Thu Nov  9 23:27:08 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* make-mode.el (makefile-mode): Call makefile-define-space-face
! 	only if it is defined.
! 	(makefile-define-space-face): Create the face unconditionally;
! 	alter it only if have X.
  
! 	* cal-x.el: Require calendar.
  
! Thu Nov  9 12:40:50 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* simple.el (do-auto-fill): Use fill-context-prefix.
  
! 	* fill.el (fill-region-as-paragraph): Use fill-context-prefix.
! 	(fill-context-prefix): New function.
  
! Thu Nov  9 03:20:51 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
  
! 	* font-lock.el (font-lock-mode): Use make-local-hook.
! 	(font-lock-fontify-buffer): Don't preserve buffer modification here,
! 	it is done elsewhere, but do preserve match-data.
! 	(font-lock-fontify-syntactically-region,
! 	font-lock-fontify-keywords-region): Don't preserve buffer modification
! 	and temporarily install font-lock-syntax-table here.
! 	(font-lock-fontify-region): Do it here instead.
! 	(font-lock-fontify-anchored-keywords): Ensure LIMIT is end of line.
! 	(font-lock-match-c++-style-declaration-item-and-skip-to-next): No need
! 	to do end-of-line here now.
! 	(font-lock-keywords): Doc fix.
! 	(font-lock-make-face): Add the face to facemenu-unlisted-faces, from
! 	Boris Goldowsky <boris@gnu.ai.mit.edu>.
  
! 	* compile.el (compilation-mode-font-lock-keywords): No leading spaces.
  
! Wed Nov  8 05:59:35 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* apropos.el (apropos-print): Use buffer *Apropos*, not *Help*.
! 	(apropos-follow): Don't print a "how to get back" message.
  
! 	* awk-mode.el (awk-mode): Require cc-mode.
  
! 	* term/pc-win.el (x-display-color-p): Accept optional arg.
  
! 	* dos-fns.el (mode-line-format): Modify it, don't override it entirely.
  
! 	* startup.el (command-line): Complain about unknown options.
  
! Tue Nov  7 14:47:02 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* simple.el (shell-command-on-region): Use region-beginning
! 	and region-end, to put them in the command history.
  
! Tue Nov  7 02:46:06 1995  Kevin Gallo  <kgallo@microsoft.com>
  
! 	* term/win32-win.el: New file.
  
! 	* startup.el [win32] (normal-top-level, command-line, command-line-1):
! 	* mouse.el [win32] (mouse-set-region):
! 	* faces.el [win32] (make-face, make-face-x-resource-internal):
! 	* facemenu.el [win32] (face-menu-read-color, list-colors-display,
! 		facemenu-color-equal, face-menu-get-face):
! 	Test for 'win32 window system as well as 'x.
  
! 	* makefile.nt (install): Change same-dir test to create test file in
! 	installation tree and thereby support read-only shares.
  
! Mon Nov  6 15:37:54 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* apropos.el (apropos-follow): Fix error message.
  
! 	* startup.el (command-line): Handle = in option only if starts with --.
  
! 	* tmm.el (tmm-define-keys): New subroutine.
! 	(tmm-add-prompt): Use that to define keys in both maps separately.
  
! 	* term/internal.el: Rewrite for new case tables.
  
! Mon Nov  6 11:03:34 1995  Boris Goldowsky  <boris@gnu.ai.mit.edu>
  
! 	* fill.el (fill-region-as-paragraph): Don't insert extra space
! 	at end of filled region.
  
! Mon Nov  6 08:27:45 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
  
! 	* bytecomp.el (byte-force-recompile): Make suitably interactive.
  
! Sat Nov  4 13:57:09 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* tmm.el: Use f10 as well as M-`.
  
! 	* menu-bar.el (menu-bar-tools-menu): Always define GNUS entry.
  
! 	* bytecomp.el (byte-compile-associative): Do operations left to right.
  
! Sat Nov  4 23:36:01 1995  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* make-mode.el (makefile-define-space-face): Don't make face if non-X.
  
! Sat Nov  4 01:22:21 1995  Lars Magne Ingebrigtsen  <larsi@ifi.uio.no>
  
! 	* nnvirtual.el, nntp.el, nnspool.el, nnml.el, nnmh.el, nnmbox.el,
! 	* nnmail.el, nnkiboze.el, nnheader.el, nnfolder.el, nneething.el,
! 	* nndoc.el, nndir.el, nnbabyl.el, gnus.el, gnus-vm.el,
! 	* gnus-vis.el, gnus-uu.el, gnus-score.el, gnus-msg.el, gnus-mh.el,
! 	* gnus-kill.el, gnus-ems.el, gnus-edit.el, gnus-cite.el,
! 	* gnus-cache.el, custom.el: New files.
  
! Fri Nov  3 21:18:13 1995  Erik Naggum  <erik@naggum.no>
  
! 	* gnus.el, gnusmail.el, gnuspost.el, gnusmisc.el, gnus-uu.el,
!  	* mhspool.el, nnspool.el, nntp.el: GNUS release 4 files deleted.
  
! 	* hilit19.el: Removed old gnus hooks.
! 	(gnus-group-mode): Adapt to new Gnus.
! 	(gnus-summary-mode): Removed.
  
! Fri Nov  3 18:11:32 1995  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* sendmail.el (mail): Don't change directory for *mail* buffer.
! 	(sendmail-send-it, mail-recover): Instead, temporarily change to a
! 	safe directory for just the subprocess.
  
! 	* tex-mode.el (tex-send-command): Give meaningful error message.
  
! Fri Nov  3 12:26:02 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* sendmail.el (mail-yank-clear-headers): Do nothing if
! 	mail-yank-ignored-headers is nil.
  
! 	* pc-select.el (pc-selection-mode): Don't mess with c-mode-map.
  
! 	* startup.el (user-mail-address): Doc fix.
  
! 	* view.el (view-mode-map): Use ordinary Help command.
  
! Thu Nov  2 21:58:56 1995  Daniel Pfeiffer <Daniel.Pfeiffer@Informatik.START.dbp.de>
  
! 	* sh-script.el (sh-shells): Eliminated variable redundant with
! 	`interpreter-mode-alist'.
! 	(sh-beginning-of-command): Take into account \quoted newline.
! 	(sh-builtins, sh-leading-keywords, sh-other-keywords): Now three
! 	distinct sets for font-locking.
! 	(sh-font-lock-keywords-1, sh-font-lock-keywords-2): New variables
! 	and functions to give the user finer control over how much to fontify,
! 	including new distinction between keywords and builtins.
! 	(sh-mode): Use new features of `font-lock-defaults' and adaptation
! 	to skeleton changes.
! 	(sh-while): Fix csh, es & rc skeletons.
  
! 	* skeleton.el (skeleton-end-hook): Now defvared and responsible for
! 	pushing out anything following skeleton to next line.  Thus this
! 	behaviour can now be controlled by modes.
! 	(skeleton-insert): Parameter `no-newline' removed.
! 	(skeleton-read): Take this into account.
! 	(skeleton-internal-1): Less spurious empty lines when wrapping.
  
! 	* sh-script.el (sh-remember-variable): Set variable to empty string,
! 	so as not to mess up subprocesses' environment.  Not so nice for
! 	completion.
  
! 	* two-column.el (minor-mode-map-alist): Use substitute-key-definition
! 	to find the appropriate bindings for window enlarge/shrink.
! 	(2C-shrink-window-horizontally, 2C-enlarge-window-horizontally):
! 	Renamed from shrink-window-horizontally, enlarge-window-horizontally
! 	to avoid redefining the standard functions.
  
! Thu Nov  2 21:27:35 1995  Stephen Gildea <gildea@x.org>
  
! 	* mh-e.el (mh-make-folder-mode-line): support mh-msg-count.
! 	(mh-delete-scan-msgs): use fast new mh-goto-msg.
! 	* mh-utils.el (mh-goto-msg): binary search (much faster!).
! 	(mh-prompt-for-folder): error if regular file.
! 	* mh-comp.el: reporter.el support.
  
! Thu Nov  2 15:53:02 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* rmail.el (rmail-delete-message-hook): New hook.
! 	(rmail-delete-message, rmail-delete-forward): Run the hook.
  
! 	* rmail.el (rmail-mode-hook, rmail-get-new-mail-hook): Add defvars.
! 	(rmail-show-message-hook): Likewise.
  
! 	* simple.el (do-auto-fill): When choosing fill-prefix,
! 	don't include the left-margin indentation.
  
! 	* fill.el (fill-individual-paragraphs): Insist on nonempty header name,
! 	in the special mailp case.
  
! Thu Nov  2 15:29:22 1995  Erik Naggum  <erik@naggum.no>
  
! 	* ehelp.el (with-electric-help): Add missing argument MINHEIGHT.
  
! Thu Nov  2 04:31:32 1995  Andre Spiegel  <spiegel@berlin.informatik.uni-stuttgart.de>
  
! 	* vc-hooks.el (vc-utc-string): Use timezone of TIMEVAL for the
! 	correction, not the current one.
! 	(vc-rcsdiff-knows-brief): New variable.
! 	(vc-rcs-lock-from-diff): Use it.
  
! 	* vc.el (vc-backend-diff): Use new variable vc-rcsdiff-knows-brief.
  
! Wed Nov  1 23:30:20 1995  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* make-mode.el: Renamed from makefile.el.
  
! 	* term/x-win.el: Don't require initial whitespace in vendor name.
  
! 	* tpu-edt.el (tpu-set-mode-line): Add element for column number.
  
! Tue Oct 31 19:44:58 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* cc-mode.el (c-recognize-knr-p): Default now t.
  
! 	* server.el (server-log): Record the current time.
! 	End with newline whenever STRING doesn't end with one.
  
! 	* sh-script.el (sh-mode-map): Put sh-execute-region on C-M-x.
! 	Put executable-interpret on C-c C-x.
  
! Tue Oct 31 00:24:32 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* loadup.el: Always load menu-bar.
  
! 	* msb.el (msb--toggle-menu-type): Pass t as arg.
  
! 	* startup.el (command-line-1): Say how to invoke menu bar, if not X.
  
! 	* jka-compr.el (auto-compression-mode): Make arg optional.
  
! 	* loadup.el: Fix previous change.
  
! Mon Oct 30 19:25:42 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* mailabbrev.el (mail-abbrev-syntax-table): Fix initialization.
  
! 	* startup.el (command-line): If not X, do enable menu bar.
  
! Mon Oct 30 19:00:50 1995  Stephen Gildea  <gildea@x.org>
  
! 	* time-stamp.el: Update some doc strings.
! 	(time-stamp-strftime): Ignore some additional chars we might want
! 	to use in the future for additional controls or parameters.
! 	(time-stamp): Minor optimizations.
  
! Mon Oct 30 12:38:27 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* help.el (describe-function): Call documentation just once.
! 	(describe-key): Likewise.
  
! 	* files.el (set-auto-mode): If mode cmds move point, obey them.
  
! 	* help.el (describe-variable): Don't call substitute-command-keys.
  
! 	* rmailsum.el (rmail-summary-overlay): Make it a permanent local.
  
! 	* vmsx.el: File deleted.
  
! Mon Oct 30 03:31:21 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
  
! 	* makefile.el (makefile-define-space-face): Use frame-parameters for
! 	frame and display attributes.
  
! Sun Oct 29 17:22:51 1995  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
  
! 	* loadup.el (finding existing executable versions):
! 	Add a period to the end of BASE.
  
! 	* arc-mode.el (archive-zoo-summarize): Handle archives
! 	with long file names.
  
! 	* disass.el (disassemble-internal): Handle lazy-loaded doc strings.
! 	(disassemble-1): Handle lazy-loaded bytecode objects.
  
! 	* etags.el (select-tags-table): Don't modify the value of
! 	tags-table-list.
  
! Sun Oct 29 15:21:43 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* tmm.el (tmm-old-mb-map): Initialize to nil.
! 	(tmm-delete-map): Don't use tmm-old-mb-map if nil.
! 	(tmm-add-prompt): Bind C-n and C-p.
! 	Put only the shortcuts into the completion buffer's map.
! 	Produce the completion list by hand so as not to sort it.
! 	(tmm-prompt): Start at the first item in the menu.
! 	Don't reverse tmm-km-list; reverse compl-list instead.
! 	Use try-completion in last-ditch attempt to find a match.
! 	Rename compl-list to history.
! 	(tmm-get-keybind): Put more local bindings last in a menu.
! 	Major rewrite.
! 	(tmm-menubar): Handle menu-bar-final-items.
! 	(tmm-remove-shortcuts): Function deleted.
! 	(tmm-add-shortcuts): If we can't find a letter shortcut,
! 	use a numeric shortcut.
  
! 	* simple.el (column-number-mode): Make default value nil.
  
! 	* cc-mode.el (c-guess-basic-syntax): Verify c-access-key is non-nil
! 	before looking for it.
  
! 	* bytecomp.el (byte-recompile-directory): New arg FORCE.
! 	(byte-force-recompile): New function.
  
! 	* case-table.el (describe-buffer-case-table): Use set-char-table-range.
  
! Sat Oct 28 02:19:32 1995  Erik Naggum  <erik@naggum.no>
  
! 	* iso02-syn.el: Adapt to new char-table implementation.  Fix name
!  	of file in the first line, part number syntax of ISO standards,
!  	and `provide' clause.  Register file with RCS.
  
! 	* ange-ftp.el (ange-ftp-ftp-name,ange-ftp-replace-name-component):
!  	Use posix-string-match for complex regexp in `ange-ftp-name-format'.
! 	(ange-ftp-process-sentinel): Quote final * in buffer name match.
  
! Fri Oct 27 17:40:51 1995  Noah Friedman  <friedman@prep.ai.mit.edu>
  
! 	* rlogin.el (rlogin): If `buffer' arg is a buffer object,
! 	initialize `buffer-name' to the buffer name.
! 	Set `buffer' to buffer actually created or returned by
! 	get-buffer-create.
! 	Set `proc' to the process actually in the new buffer, not the
! 	process with the name buffer-name; they may not be the same if
! 	buffers have been renamed.
  
! Thu Oct 26 18:38:26 1995  Ed Reingold  <reingold@spiff.gnu.ai.mit.edu>
  
! 	* cal-chinese.el (calendar-chinese-sexagisimal-name): New
! 	function.
! 	(holiday-chinese-new-year,calendar-chinese-date-string): Use it.
  
! Thu Oct 26 14:21:26 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* files.el (set-visited-file-name, basic-save-buffer):
! 	Set buffer-file-number consistently with find-file-noselect.
  
! Thu Oct 26 09:52:51 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
  
! 	* font-lock.el: General reorganisation.
! 	(font-lock-fontify-syntactically-region): Renamed from
!  	font-lock-fontify-region.  Assume that region end-points are at bol.
! 	Don't bother wrapping with save-excursion; caller does this.
! 	(font-lock-fontify-keywords-region): Renamed from
! 	font-lock-hack-keywords.  Call font-lock-fontify-anchored-keywords if
! 	car of HIGHLIGHT is not a number (i.e., is another MATCHER, not a
! 	MATCH), for new MATCH-ANCHORED font-lock-keywords structure.
! 	(font-lock-fontify-region): Use them.
! 	(font-lock-after-change-function): Use it.  Don't bother invalidating
! 	font-lock-cache-position; called function does this.
! 	(font-lock-keywords-only): Renamed from font-lock-no-comments.
! 	(font-lock-maximum-decoration, font-lock-maximum-size): Doc fix for new
! 	functionality.
! 	(font-lock-set-defaults, font-lock-mode): Cope if they are lists.
! 	(font-lock-keywords): Doc fix for new MATCH-ANCHORED structure and
! 	new OVERRIDE values.
! 	(font-lock-fontify-anchored-keywords): New function for processing the
! 	new MATCH-ANCHORED structure.
! 	(font-lock-fillin-text-property, font-lock-prepend-text-property,
! 	font-lock-append-text-property): New text property functions.
! 	(font-lock-apply-highlight): Use them for new OVERRIDE values.
! 	(scheme-font-lock-keywords): New variable.
! 	(c-font-lock-keywords-3, c++-font-lock-keywords-3): New variables.
! 	(font-lock-defaults-alist): Use them for Scheme, C and C++ modes.
  
! 	* fast-lock.el (fast-lock-read-cache): Set fast-lock-cache-filename.
! 	(fast-lock-cache-data): Don't set it here via caller's local variable.
  
! 	* fortran.el (fortran-mode): Addition for font-lock-defaults.
! 	(fortran-font-lock-keywords-3): Rewrite using MATCH-ANCHORED structure.
  
! 	* rmail.el (rmail-font-lock-keywords): Better citation regexp.
  
! 	* sendmail.el (mail-font-lock-keywords): Likewise.
  
! Thu Oct 26 02:39:28 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* morse.el: New file.
  
! Wed Oct 25 15:23:31 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* cc-mode.el (c-mode): Add autoload.
  
! 	* loadup.el: Don't load c-mode.
! 	* loaddefs.el: Get rid of cplus-md.el; add cc-mode.el.
  
! 	* cmacexp.el: Require cc-mode.
  
! 	* hideif.el: Provide hideif; require cc-mode.
  
! 	* help.el (describe-key, describe-key-briefly): For a mouse click,
!  	go to its buffer and position before looking up the key.
  
! Wed Oct 25 13:01:36 1995  Gregor Schmid  <gs@ivu-berlin.de>
  
! 	* tcl-mode.el: Add support for imenu.
! 	Add support for font-lock-mode (thanks to <simonm@mail.esrin.esa.it>).
  
! Tue Oct 24 12:38:43 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* files.el (set-visited-file-name): Abbreviate buffer-file-name.
  
! 	* mouse.el (mouse-drag-region): Set end-of-range after
! 	calling mouse-scroll-subr.
! 	(mouse-set-region): Don't do the sit-for on a pc frame.
  
! Tue Oct 24 10:29:59 1995 Brian D. Carlstrom  <bdc@ai.mit.edu>
  
! 	* gud.el (gud-dbx-directories): New variable.
! 	(gud-dbx-massage-args): Use gud-dbx-directories.
! 	(gud-dbx-file-name): New function.
! 	(gud-irixdbx-marker-filter): Use gud-dbx-file-name.
! 	(gud-dbx-file-file): Use gud-dbx-file-name.
  
! 	* gud.el (gud-filter): Fix previous change.
  
! Tue Oct 24 11:44:45 1995  Ed Reingold  <reingold@spiff.gnu.ai.mit.edu>
  
! 	* cal-menu.el (calendar-mouse-print-dates): Fix entry for Chinese
! 	calendar.
  
! 	* cal-chinese.el: Completely rewritten!
  
! Tue Oct 24 00:06:14 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* add-log.el (get-method-definition, get-method-definition-1):
! 	Rename var md to get-method-definition-md and defvar it.
  
! Mon Oct 23 12:50:38 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* ange-ftp.el (internal-ange-ftp-mode):
! 	Set comint-password-prompt-regexp locally to not match anything.
  
! 	* informat.el (Info-validate, Info-validate-node-name):
! 	Use buffer-substring-no-properties.
! 	(Info-tagify, batch-info-validate, Info-validate-tags-table): Likewise.
  
! 	* informat.el (Info-validate-tags-table): Change handling
! 	of newline in the loop reading node names.
  
! 	* info.el (Info-following-node-name, Info-extract-menu-node-name)
! 	(Info-select-node): Use buffer-substring-no-properties.
  
! Sun Oct 22 12:30:46 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* case-table.el (copy-case-table): New function.
! 	(set-case-syntax-delims, set-case-syntax-pair, set-case-syntax):
! 	Clear out the three extra slots.
  
! Sun Oct 22 02:28:11 1995  Erik Naggum  <erik@naggum.no>
  
! 	* derived.el (derived-mode-init-mode-variables): Make proper
!  	syntax-table.
  
! 	* iso-syntax.el: Handle new case-table implementation.
  
! Sat Oct 21 13:31:39 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* msb.el: Require cl only when compiling.
  
! Sat Oct 21 13:31:39 1995  Axel Boldt  <boldt@math.ucsb.edu>
  
! 	* electric.el (Electric-command-loop): Don't display a prompt
! 	if 2nd arg equals or returns 'noprompt.
  
! 	* ehelp.el: Fix key bindings.
! 	(electric-help-mode): Use mouse-leave-buffer-hook.
! 	(electric-help-retain): Remove mouse-leave-buffer-hook.
! 	(with-electric-help): New argument minheight.
! 	(electric-help-execute-extended): New function.
! 	(electric-help-ctrl-x-prefix): New function.
! 	(electric-help-command-loop): Make messages more consistent.
! 	Include strategic sit-for 0, so that
! 	pos-visible-in-window-p will return the right thing.
! 	Make 2nd arg of Electric-command-loop return 'noprompt if we
! 	are in isearch-mode.
! 	Eval to-be-executed at the very end.
! 	(ehelp-map): Electrify apropos too.
  
! Fri Oct 20 15:34:39 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* noutline.el (outline-view-change-hook): New hook variable.
! 	(outline-flag-region): Run the hook.
  
! 	* informat.el (Info-validate-tags-table): Fix the scan of the
! 	tags table checking that the positions are right.
! 	(Info-validate): Use buffer-substring-no-properties.
  
! 	* dabbrev.el (dabbrev-expand): When no more expansions,
! 	Put back the original abbrev with its original case pattern.
! 	(dabbrev--find-expansion): Move buffers that are visible on the screen
! 	to the front of the list to be searched.
  
! 	* startup.el (normal-top-level): Set auto-save-list-file-name later,
! 	after calling command-line.
  
! Fri Oct 20 15:08:22 1995  Erik Naggum  <erik@naggum.no>
  
! 	* comint.el (comint-exec-1): Fix previous change.
  
! Fri Oct 20 11:22:25 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* add-log.el (add-log-current-defun):
! 	Handle `private', `public' in C++ class definitions.
  
! Thu Oct 19 01:14:59 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* isearch.el (isearch-message-prefix):
! 	Change "wrapped" to "overwrapped" when past original start point.
  
! 	* comint.el (comint-exec-1): Don't alter EMACS envvar
! 	if it's already defined.
  
! 	* cplus-md.el (calculate-c++-indent): Skip over paren-group
! 	when looking back to determine context of a top-level line.
! 	Don't treat a line starting with } as a continuation.
  
! Wed Oct 18 21:06:59 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* emacsbug.el (report-emacs-bug): Don't mention
! 	system-configuration-options if it is empty.
! 	Make it clearer what that text is.
  
! Tue Oct 17 14:10:19 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* tex-mode.el (tex-start-of-header): Now a regexp.
! 	(tex-end-of-header): Likewise.
! 	(plain-tex-mode, latex-mode, slitex-mode, tex-region):
! 	Changed accordingly.
  
! 	* pc-select.el (pc-selection-mode): Add autoload cookie.
  
! 	* pc-select.el: New file.
  
! Mon Oct 16 22:21:38 1995  Rolf Ebert  <re@waporo.muc.de>
  
! 	* ada-mode.el:
! 	All doc strings changed to comply with standard Emacs conventions.
! 	(ada-mode): Support new font-lock-mode.
! 	(ada-format-paramlist): Changed all `accept' to `access'.
! 	(ada-insert-paramlist): Changed all `accept' to `access'.
! 	(ada-in-comment-p): Use standard Emacs way `parse-partial-sexp'.
! 	(ada-font-lock-keywords-1): Change order of some alternatives.
  
! Mon Oct 16 17:45:22 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* cc-mode.el (c-emacs-features): Don't expect integer in syntax table.
  
! 	* flow-ctrl.el (enable-flow-control): Use a char-table.
  
! Sun Oct 15 04:53:55 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* mailabbrev.el (mail-abbrev-syntax-table): Rewrite using
! 	map-char-table.
  
! 	* derived.el (derived-mode-merge-syntax-tables): Rewrite using
! 	map-char-table.
  
! 	* hippie-exp.el (he-transfer-case): Fix typo in prev change.
  
! Fri Oct 13 23:14:10 1995  Michael Kifer  <Michael Kifer <kifer@cs.sunysb.edu>>
  
! 	* ediff.el (ediff-version): is now autoloaded.
! 	* ediff-init.el: Moved defsubsts up.
! 	* ediff-hook.el: Now defines [window] in menu-bar-ediff-menu.
  
! Fri Oct 13 20:14:10 1995  Michael Kifer  <Michael Kifer <kifer@cs.sunysb.edu>>
  
! 	* viper.el (vip-set-hooks): Use view-mode-hook in emacs and view
! 	hook in xemacs.
! 	(vip-read-string-with-history): minibuffer-setup-hook no longer
! 	waits for the user to type, if there are unread events.
! 	Added (vip-leave-region-active) to all simple movement commands.
! 	Viper now understands syntactic tables.
! 	Harnessed view-minor-mode.
! 	(vip-read-string-with-history,vip-search): won't pause inside
! 	macros any more.
! 	* viper-mous.el (vip-surrounding-word): modified to understand
! 	tripple clicks.
! 	* viper-util.el (vip-leave-region-active): new function.
! 	* viper-ex.el (ex-write): uses better defaults.
! 	* viper-macs.el (vip-record-kbd-macro): correctly escapes `.' and
! 	`[' now.
  
! Fri Oct 13 15:17:28 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* help.el (variable-at-point, function-called-at-point):
! 	Switch temporarily to emacs-lisp-mode-syntax-table.
  
! 	* goto-addr.el: New file.
! 	* browse-url.el: New file.
  
! Fri Oct 13 1995  Anders Holst (aho@nada.kth.se)
  
! 	* hippie-exp.el:
! 	(hippie-expand): Removed bug - don't undo from another buffer.
! 	(he-reset-string): Removed bug - don't move markers.
! 	(he-capitalize-first): New function, defining new "case".
! 	(he-transfer-case): New function.
! 	(he-transfer-case-ok): Function removed.
! 	(he-substitute-string,he-ordinary-case-p,he-string-member): Use the
! 	new functions above, for the new case handling.
! 	(he-file-name-chars): New variable.
! 	(he-file-name-beg): Use `he-file-name-chars'.
! 	(he-file-name-nondirectory,he-file-name-directory,
! 	he-file-directory-p,he-concat-directory-file-name): New functions
! 	to handle VMS and PC filename formats more accurately.
! 	(try-complete-file-name,try-complete-file-name-partially): Use the
! 	new functions above.
! 	(try-expand-line-all-buffers,try-expand-list-all-buffers,
! 	try-expand-dabbrev-all-buffers): Use `case-fold-search' from the
! 	original buffer.
! 	(he-line-beg): Removed bug that made point move.
! 	(try-expand-all-abbrevs): Check that abbrev tables exist before use.
! 	(try-expand-dabbrev-visible): New try function.
! 	(he-search-window): New variable used by `try-expand-dabbrev-visible'.
! 	(he-dab-search-regexp): Function removed.
! 	(he-dab-search): Renamed to `he-dabbrev-search'.
! 	(he-dabbrev-search): Find only whole matching symbols.
! 	(he-dabbrev-skip-space): New variable.
! 	(he-dabbrev-beg): Use `he-dabbrev-skip-space'.
! 	(try-expand-dabbrev-from-kill,he-dabbrev-kill-search): New try
! 	function, with requisites.
! 	(try-expand-whole-kill,he-whole-kill-search,he-kill-beg): New try
! 	function, with requisites.
! 	(he-search-loc2): New variable, used by `try-expand-whole-kill'
! 	and `try-expand-dabbrev-from-kill'.
! 	(hippie-expand-try-functions-list): Added the try functions
! 	`try-complete-file-name-partially', `try-expand-dabbrev-from-kill'
! 	and `try-complete-lisp-symbol-partially'.
! 	(Several functions): Adjusted and corrected use of `he-tried-table'.
  
! Fri Oct 13 09:06:37 1995  Ed Reingold  <reingold@spiff.gnu.ai.mit.edu>
  
! 	* cal-tex.el: Minor fixes to doc strings and other small changes.
  
! Thu Oct 12 13:55:26 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* help.el (variable-at-point, function-called-at-point):
! 	Fix revious changes.
  
! 	* iso-transl.el: Handle aliases dead-acute,...
  
! Thu Oct 12 11:28:50 1995  Ed Reingold  <reingold@cs.uiuc.edu>
  
! 	* cal-tex.el: New file.
  
! 	* calendar.el: Add autoloads and key definitions for cal-tex.el.
  
! 	* cal-menu.el: Add menu items for cal-tex.el.
  
! Wed Oct 11 14:26:34 1995  Robert J. Chassell  <bob@hill.gnu.ai.mit.edu>
  
! 	* texinfmt.el (texinfo-unsupported): Handle commands in all capitals.
  
! Wed Oct 11 11:38:55 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* files.el (find-alternate-file-other-window): New function.
  
! Wed Oct 11 01:23:31 1995  Michael Kifer  <kifer@cs.sunysb.edu>
  
! 	* menu-bar.el: Moved (define-key menu-bar-ediff-menu ...) to
! 	ediff-hook.el, as menu-bar-ediff-menu is not defined yet.
  
! Wed Oct 11 00:59:00 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* fill.el (adaptive-fill-function): Change defun to defvar.
  
! Tue Oct 10 12:52:39 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* simple.el (next-completion): Specify the LIMIT arg when
! 	searching for text properties.
  
! 	* help.el (function-called-at-point, variable-at-point):
! 	Don't back up if we start at the beginning of a symbol.
  
! 	* disp-table.el (display-table-slot, set-display-table-slot):
! 	Get slot number from a property of its name.
! 	Eliminate the type-checking.
! 	(make-display-table): Call make-char-table the new way.
! 	(describe-display-table): Use slot names to access slots.
! 	(display-table): Give it the char-table-extra-slots property.
! 	(display-table-char-p, display-table-vector-p): Functions deleted.
! 	(display-table-slot-name-alist): Variable deleted.
  
! Mon Oct  9 22:30:42 1995  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
  
! 	* mail-utils.el (mail-strip-quoted-names): Preserve white space
!  	after comma when stripping text outside of <> delims.
  
! Mon Oct  9 15:41:18 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* view.el: Doc fixes.
! 	(view-highlight-face): New variable.
! 	(view-search): Use that variable.
  
! Mon Oct  9 14:01:04 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* etags.el (tags-table-check-computed-list): Map
! 	 tags-expand-table-name over lists of included tables.
  
! Mon Oct  9 13:44:43 1995  Erik Naggum  <erik@naggum.no>
  
! 	* disp-table.el: New implementation with char-tables.
  
! Mon Oct  9 13:08:04 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xt-mouse.el: New file.
  
! Mon Oct  9 00:49:37 1995  Noah Friedman  <friedman@prep.ai.mit.edu>
  
! 	* mailabbrev.el (mail-abbrev-syntax-table): Use `equal' instead of
! 	`=', in case elts of syntax table are lists, not integers.
  
! Sun Oct  8 15:58:21 1995  Erik Naggum  <erik@naggum.no>
  
! 	* ada-mode.el (ada-gen-treat-proc): Bind `procname' and `functype'.
  
! 	* view.el (view-exit): Delete view-overlay only if it exists.
  
! Sun Oct  8 14:56:12 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* server.el (server-start): Try both full hostname and shortened
! 	hostname when deleting the socket file.
  
! 	* gud.el (gud-filter): Move the gud-display-frame call
! 	outside of the save-excursion.  New var process-window
! 	controls which window to do it in.
  
! Sat Oct  7 00:08:29 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* subr.el (make-syntax-table): Use nil for "inherit".
  
! Fri Oct  6 11:11:31 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* bytecomp.el (byte-compile-from-buffer): Bind print-level.
  
! 	* simple.el (newline): Call barf-if-buffer-read-only.
  
! 	* iso-acc.el: Fix typo calling iso-accents-customize.
! 	(iso-accents-compose): If this-command is non-nil, do prompt.
  
! Thu Oct 5  20:54:29 1995  Michael Kifer  <kifer@cs.sunysb.edu>
  
! 	* ediff-meta.el: new file.
! 	* ediff-hook.el: new file.
! 	* ediff.el: Moved menubar definitions to a new file, ediff-hook.el
! 	(ediff-files,ediff-merge-files): better file-name defaults.
! 	(ediff-split-string): new function.
! 	(ediff-exec-process): now handles diff args separated by space.
! 	(ediff-backup-extension): new variable.
! 	Replaced -hooks with -hook.
! 	(ediff-revision-key): variable deleted.
! 	* ediff-util.el (ediff-toggle-read-only,ediff-read-file-name):
! 	replaced abbreviate-file-name with ediff-abbreviate-file-name.
! 	(ediff-documentation): bug fix.
! 	(ediff-setup,ediff-really-quit): modified to work with Ediff
! 	session groups.
! 	(ediff-quit,ediff-really-quit): now ask if the user wants to delete
! 	buffers.
! 	* ediff-init.el (ediff-abbreviate-file-name): function modified.
! 	(ediff-truncate-string-left): new function.
! 	(ediff-strip-last-dir,ediff-key-press-event-p,ediff-event-point,
! 	ediff-event-buffer): new functions.
! 	(ediff-frame-has-menubar,ediff-protect-meta-chars): functions deleted.
! 	* ediff-wind.el (ediff-make-frame-position): fixed bugs.
! 	(ediff-control-frame-parameters): fixed defaults.
! 	* ediff-diff.el (ediff-setup-diff-regions,ediff-setup-diff-regions3,
! 	ediff-setup-fine-diff-regions): functions modified.
! 	(ediff-shell-command,ediff-shell-command-sentinel,
! 	ediff-shell-command-filter): deleted.
! 	(ediff-exec-process,ediff-process-sentinel,ediff-process-filter): new.
  
! Thu Oct  5 18:24:01 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* appt.el (appt-disp-window): Call raise-frame.
  
! 	* view.el (View-search-regexp-forward, View-search-regexp-backward):
! 	If arg is empty, use view-last-regexp.
! 	(view-overlay): New variable, local in all buffers.
! 	(view-search): Highlight the match using view-overlay.
! 	(view-exit): Delete view-overlay.
  
! Wed Oct  4 11:59:54 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* desktop.el (desktop-outvar): Support truncation.
! 	(desktop-globals-to-save): Doc fix.
  
! 	* startup.el (command-line): Init user-mail-address here,
! 	after reading init file.
! 	(normal-top-level): Not here.
  
! 	* gnuspost.el (gnus-inews-do-fcc): Use mail-file-babyl-p.
  
! 	* gnus.el (gnus-summary-save-in-mail): Use mail-file-babyl-p.
  
! 	* startup.el (auto-save-list-file-prefix): New variable.
! 	(normal-top-level): Use it.
  
! 	* files.el (recover-session): Use auto-save-list-file-prefix.
  
! 	* sendmail.el (mail-signature-file): New variable.
! 	Fix various doc strings to mention it.
! 	(mail-signature): Use mail-signature-file.
  
! 	* unrmail.el (unrmail): Call rmail-toggle-header.
  
! 	* isearch.el (isearch-forward): Doc fix.
  
! Wed Oct  4 11:15:40 1995  Andre Spiegel  <spiegel@pogo.gnu.ai.mit.edu>
  
! 	* vc.el (vc-next-action-on-file): When locking the latest trunk
! 	version, use empty version number.
  
! Sun Oct  1 16:33:43 1995  Noah Friedman  <friedman@prep.ai.mit.edu>
  
! 	* terminal.el (te-escape): Remove spurious partial duplicate
! 	definition.
  
! Sun Oct  1 13:59:29 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* files.el (recover-session-finish): Ask only about files that
!  	have auto-save files now.  Don't put "temp" into temp file names.
  
! Sat Sep 30 12:35:24 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* files.el (cd): Fix interactive spec to require match if there is
! 	no CDPATH.
  
! Thu Sep 28 23:48:41 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* comint.el (comint-password-prompt-regexp): Recognize
! 	Old Password and New password.
  
! Thu Sep 28 16:36:14 1995  Michael Ernst  <mernst@rice.edu>
  
! 	* ispell.el (ispell-message-text-end): Match reporter.el bug reports.
  
! Thu Sep 28 15:18:50 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* help.el (print-help-return-message): Handle lists in
! 	special-display-regexps and same-window-regexps.  Also in
!  	special-display-buffer-names and same-window-buffer-names
  
! 	* files.el (interpreter-mode-alist): Handle nawk.
  
! Wed Sep 27 11:25:56 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
  
! 	* sendmail.el (sendmail-send-it): Handle FCC after all text changes.
! 	(mail-do-fcc): Don't add From field here.
  
! 	* undigest.el (undigestify-rmail-message): Better error messages.
  
! Tue Sep 26 15:33:27 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
  
! 	* ange-ftp.el (ange-ftp-dumb-unix-host): Avoid error if HOST is nil.
  
! Mon Sep 25 18:14:51 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
  
! 	* add-log.el (add-log-current-defun): Ignore quotes before fcn name.
  
! Mon Sep 25 14:53:24 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* info.el (Info-title-face-alist): New var.
! 	(Info-fontify-node): Check for headings that are `underlined' with
! 	characters on the following line.
  
! Mon Sep 25 10:53:57 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
  
! 	* help.el (help-mode): Call view-mode.
  
! 	* diary.el (mark-sexp-diary-entries): Add \ for C-M-f's sake.
  
! 	* view.el (view-mode-enter): Renamed from view-mode.  Callers changed.
! 	Don't create local vars here.  Set view-mode-auto-exit.
! 	Don't change local map--just set view-mode.
! 	(view-mode): New function toggles minor mode in the usual way.
! 	(view-mode-map): Put this on minor-mode-map-alist.
! 	(view-mode-exit): Do the exit actions only if view-mode-auto-exit.
! 	(View-scroll-lines-forward): Exit only if view-scroll-lines-forward.
!  	(view-mode-auto-exit, view-old-buffer-read-only)
! 	(view-old-Helper-return-blurb, view-scroll-size, view-last-regexp)
! 	(view-exit-action, view-return-here, view-exit-position):
! 	Defvar them and make them always-local.
  
! Mon Sep 25 06:53:32 1995  Erik Naggum  <erik@naggum.no>
  
! 	* startup.el (command-line-1): --eval: Don't print the value.
! 	(command-line-1): --insert: Don't complain on --insert=file.
  
! Sun Sep 24 19:24:35 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
  
! 	* replace.el (occur): Indent better for matches that contain newlines.
  
! Sat Sep 23 23:49:25 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* jka-compr.el (auto-compression-mode): Add autoload cookie.
! 	Renamed from toggle-auto-compression.
! 	(toggle-auto-compression): Define as alias.
  
! Fri Sep 22 17:51:48 1995  Erik Naggum  <erik@naggum.no>
  
! 	* cl-macs.el (get-setf-method): Protect caller's match-data from
! 	string-match.
  
! Fri Sep 22 17:33:18 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* edt.el (edt-setup-default-bindings): Revert function is
! 	revert-buffer, not revert-file.
  
! Fri Sep 22 17:31:07 1995  Torbjorn Einarsson <T.Einarsson@clab.ericsson.se>
  
! 	* f90.el: Major revision.
! 	Much improved and quicker highlighting using font-lock.
! 	Support for hilit19 removed.
! 	Support for imenu added.
! 	Changed indentation for continue statements.
! 	Added treatment of preprocessor directives.
! 	(f90-directive-comment-re) is now a regular expression.
! 	Many bug fixes.
  
! Fri Sep 22 15:36:23 1995  Ed Reingold  <reingold@spiff.gnu.ai.mit.edu>
  
! 	* cal-menu.el (calendar-mouse-chinese-date): New function.
! 	(calendar-mouse-print-dates): Use it.
  
! Thu Sep 21 21:38:19 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* sendmail.el (mail-do-fcc): Erase the ` mail-temp' buffer.
! 	(mail-do-fcc): Clear read-only flag in ` mail-temp' buffer.
  
! 	* undigest.el (undigestify-rmail-message): Scan back as far as start
! 	of message, to find end of digest.
  
! 	* rmailout.el (rmail-file-p): Function moved to mail-utils.el
! 	ad renamed to mail-file-babyl-p.
! 	(rmail-output, rmail-output-to-rmail-file): Use new name.
! 	* mail-utils.el (mail-file-babyl-p): Function moved from
! 	rmail.el and renamed.
  
! 	* sendmail.el (mail-file-babyl-p): Function deleted.
! 	(sendmail-send-it): Load mail-utils first thing.
  
! Thu Sep 21 18:01:48 1995  Erik Naggum  <erik@naggum.no>
  
! 	* byte-opt.el (byte-boolean-vars): Update list to reflect actual
!  	DEFVAR_BOOL symbols in the C code.
  
! Thu Sep 21 16:53:08 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* edt.el (edt-set-screen-width-80, edt-set-screen-width-132):
! 	If a terminal-specific function exists, call it.
! 	* edt-vt100.el (edt-set-term-width-80, edt-set-term-width-132):
! 	Terminal-specific functions.
! 	Don't redefine edt-set-screen-width-80 and edt-set-screen-width-132.
  
! 	* terminal.el (te-escape, te-escape-help): Handle non-ASCII events.
  
! Tue Sep 19 16:02:37 1995  Edward M. Reingold  <reingold@emr.cs.uiuc.edu>
  
! 	* cal-chinese.el: New file.
  
! 	* cal-coptic.el: New file.
  
! 	* cal-julian.el: New file.  All Julian calendar related code moved here
! 	from calendar.el, holidays.el, and diary-lib.el.
  
! 	* cal-iso.el: New file.  All ISO calendar related code moved here
! 	from calendar.el and diary-lib.el.
  
! 	* cal-islamic.el: New file. All Islamic calendar related code
! 	moved here from calendar.el, holiday.el, diary-lib.el, and
!  	diary-ins.el.
  
! 	* cal-hebrew.el: New file. All Hebrew calendar related code
! 	moved here from calendar.el, holiday.el, diary-lib.el, and
!  	diary-ins.el.
  
! 	* cal-move.el: New file.  All functions related to movement in the
! 	calendar moved here from calendar.el.
  
! 	* diary.el: New file.  Functions related to the diary moved from
! 	diary-lib.el and diary-ins.el.
  
! 	* holidays.el (holiday-hebrew):  Moved to cal-hebrew.
! 	(holiday-islamic): Moved to cal-islamic.
! 	(holiday-julian): Moved to cal-julian.
  
! 	* cal-x.el (calendar-setup):  Moved to calendar.el.
  
! 	* diary-lib.el: Deleted.
!  	(diary-date, diary-remind): New functions.
!   	(list-sexp-diary-entries): Mention them in doc string.
!   	(diary-remind-message, marking-diary-entries,
! 	marking-diary-entry): New variables.
!   	(diary-mark-sexp-diary-entries, mark-diary-entries): Rewritten to
!  	accomodate marking-diary-entries.
! 	(diary-sexp-entry): Fix indentation.
! 	(diary-chinese-date, diary-coptic-date, diary-ethiopic-date):
! 	Do autoloads.
! 	(diary-islamic-date, list-islamic-diary-entries,
! 	mark-islamic-diary-entries, mark-islamic-calendar-date-pattern):
! 	Moved to cal-islamic.el.
! 	(diary-hebrew-date, list-hebrew-diary-entries,
! 	mark-hebrew-diary-entries, mark-hebrew-calendar-date-pattern):
! 	Moved to cal-hebrew.el.
! 	Everything else moved to diary.el.
  
! 	* diary-ins.el: Deleted.
! 	(insert-islamic-diary-entry, insert-monthly-islamic-diary-entry,
!  	insert-yearly-islamic-diary-entry): Moved to cal-islamic.el.
!   	(insert-hebrew-diary-entry, insert-monthly-hebrew-diary-entry,
!  	insert-yearly-hebrew-diary-entry): Moved to cal-hebrew.el.
!   	Everything else moved to diary.el.
  
! 	* cal-menu.el (calendar-mouse-print-dates): Add Chinese and Coptic
! 	dates; fix astro date message.
! 	(calendar-mouse-2-date-menu): Add dayname to menu.
  
! 	* cal-french.el (french-calendar-special-days-array,
!  	calendar-french-date-string): Fix accents.
! 	(calendar-goto-french-date): Use reverse instead of nreverse; fix
! 	accents.
! 	(french-calendar-epoch): New variable.
! 	(calendar-french-from-absolute, calendar-absolute-from-french): Use it.
  
! 	* cal-dst.el: Fix commentary.
! 	(dst-adjust-time): Moved and renamed from solar.el.
! 	(dst-in-effect): New function.
  
! 	* solar.el (solar-equinoxes-solstices, solar-ephemeris-correction,
! 	solar-equinoxes/solstices): Rewritten.
! 	(solar-apparent-longitude-of-sun): Deleted.
! 	(solar-longitude, solar-date-next-longitude): New functions.
! 	(solar-adj-time-for-dst): Renamed dst-adjust-time and moved to
! 	cal-dst.el.
! 	(solar-sin-degrees, solar-cosine-degrees, solar-tangent-degrees):
! 	Take angle mod 360.0.
! 	(solar-tangent-degrees): Change to macro.
  
! 	* calendar.el (calendar-mod, calendar-absolute-from-astro,
!  	calendar-astro-from-absolute): New functions.
!   	(calendar-astro-date-string, calendar-goto-astro-day-number): Use
!  	them.  Autoload holiday-chinese-new-year,
!  	calendar-goto-chinese-date, calendar-print-chinese-date,
!  	calendar-chinese-date-string, calendar-goto-coptic-date,
!  	calendar-print-coptic-date, calendar-coptic-date-string,
!  	calendar-goto-ethiopic-date, calendar-print-ethiopic-date,
!  	calendar-ethiopic-date-string, calendar-one-frame-setup, and
!  	calendar-two-frame-setup.  (oriental-holidays): New variable for
!  	Chinese New Year.  (calendar-mode-map): Put Chinese and Coptic
!  	calendar functions on keys.  (calendar-setup): Moved here from
!  	cal-x.el.  (diary-file): Mention Chinese, Coptic, and Ethiopic
!  	dates.  (calendar-goto-today, calendar-forward-month,
!  	calendar-forward-year, calendar-backward-month,
!  	calendar-backward-year, scroll-calendar-left,
!  	scroll-calendar-right, scroll-calendar-left-three-months,
!  	scroll-calendar-right-three-months,
!  	calendar-cursor-to-nearest-date, calendar-forward-day,
!  	calendar-backward-day, calendar-forward-week,
!  	calendar-backward-week, calendar-beginning-of-week,
!  	calendar-end-of-week, calendar-beginning-of-month,
!  	calendar-end-of-month, calendar-beginning-of-year,
!  	calendar-end-of-year, calendar-cursor-to-visible-date,
!  	calendar-goto-date, calendar-goto-iso-date): Moved to cal-move.el.
!   	(calendar-goto-julian-date): Moved to cal-julian.
!   	(calendar-cursor-to-date, generate-calendar-month): Consider the
!  	space next to a one-digit date as being on that date.
  
! 	* cal-mayan.el (calendar-mayan-tzolkin-from-absolute): Use them.
! 	(mayan-adjusted-mod): Moved to calendar.el and renamed calendar-mod.
  
! 	* lunar.el (lunar-new-moon-time, lunar-new-moon-on-or-after) New
! 	functions.
  
  
! Mon Sep 18 10:45:24 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* subr.el (substitute-key-definition): Do recursively scan
! 	where KEYMAP has nothing at all.
  
! 	* mouse.el (C-down-mouse-1): Use buffer menu, not font menu.
! 	(S-down-mouse-1): Put font menu here.
  
! 	* mouse.el (mouse-drag-vertical-line): New function.
! 	(mouse-scroll-min-lines): New variable.
! 	(mouse-scroll-subr): Use it.
  
! Sun Sep 17 10:11:08 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* files.el (find-alternate-file): Kill any preexisting ` **lose**' buf.
  
! Thu Sep 14 10:44:41 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* dunnet.el (dun-climb): Handle unknown object name.
! 	(dun-objnames): Add "palm" as alias for "tree".
  
! 	* indent.el (indent-for-tab-command): Get the prefix arg
! 	and pass it along to indent-line-function if it isn't nil.
  
! Thu Sep 14 03:25:26 1995  Andre Spiegel  <spiegel@berlin.informatik.uni-stuttgart.de>
  
! 	* vc-hooks.el (vc-fetch-master-properties): Call "cvs status"
! 	in the right directory, passing only the nondirectory part of
! 	the file name.
! 	(vc-find-cvs-master): Bind `mtime' locally instead of using it
! 	as a free variable.
  
! Tue Sep 12 00:31:50 1995  Erik Naggum  <erik@naggum.no>
  
! 	* dired-x.el: Remove `dired-up-directory'.
! 	(dired-find-buffer-nocreate): Add optional argument `mode' like
! 	the function it redefines from dired.el.
  
! 	* dired.el (dired-up-directory): Add optional argument
! 	`other-window' to obviate the need to redefine it in dired-x.el.
  
! Tue Sep 12 16:57:07 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* files.el (auto-mode-alist): .pl is now Perl.
  
! 	* delsel.el (clipboard-yank): Add delete-selection property.
  
! Mon Sep 11 19:33:17 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* server.el (server-process-filter): Ignore lines that don't start
! 	with `Error:' or `Client:'.
  
! Fri Sep  8 16:43:10 1995  Andre Spiegel  <spiegel@berlin.informatik.uni-stuttgart.de>
  
! 	* dired.el (dired-internal-noselect): Set dired-directory
! 	when refreshing a buffer that displays a list of files.
! 	(dired-find-buffer-nocreate): Handle the case when
! 	dired-directory is a list.
! 	(dired-sort-other): Don't set mode-name if we are not in
! 	dired-mode.
  
! 	* vc.el (vc-dired-mode): Now a major mode derived from dired-mode.
! 	(vc-directory): Take DIRNAME as an argument.  Ask for it in
! 	the minibuffer.  Don't kill pre-existing vc-dired buffers
! 	(dired now re-uses the right one).
! 	(vc-file-tree-walk): New argument DIRNAME.  Updated all callers.
! 	(vc-dired-update): New function.  `g' in vc-dired-mode calls it.
! 	(vc-dired-reformat-line): Handle different ls -l formats.
  
! 	* vc-hooks.el (vc-locking-user): Fixed wrong parentheses.
  
! Fri Sep  8 13:19:17 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* register.el: Rename all register-name args to `register'.
  
! Thu Sep  7 06:12:50 1995  Paul Eggert  <eggert@twinsun.com>
  
! 	* env.el (setenv): Call set-time-zone-rule when setting TZ.
  
! Thu Sep  7 00:14:51 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* text-mode.el (center-line): New arg NLINES.
! 	Do nothing for lines that are too wide.
  
! 	* hexl.el (hexl-current-address): New arg VALIDATE.
! 	Handle point values in the ASCII text section and in the addresses.
! 	(hexl-insert-char): Handle point located in the ASCII text.
  
! Wed Sep  6 12:42:02 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* info.el (Info-suffix-list): Add .inf to MSDOS list.
  
! 	* ange-ftp.el (ange-ftp-gwp-filter): Go to process buffer
! 	before getting text from it.
  
! 	* mouse.el (mouse-drag-region): Record where the mouse drag has reached
! 	and use that to adjust the drag event before replaying it.
  
! 	* gud.el (gud-filter): Save up text that arrives while processing
! 	previous text.
  
! Wed Sep  6 14:28:03 1995  Fred Pierresteguy  <F.Pierresteguy@frcl.bull.fr>
  
! 	* rmailsum.el (rmail-summary-construct-io-menu): Use all of FILES.
! 	Also disable the menu instead of not displaying it, if FILES is empty.
  
! Tue Sep  5 17:28:56 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* browse-url.el: New file.
  
! Mon Sep  4 16:25:53 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* mailabbrev.el (mail-interactive-insert-alias):
! 	Call mail-abbrev-expand-hook.
  
! Sat Sep  2 12:27:45 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* info.el (info-insert-file-contents): Use info-insert-file-contents-1
! 	to set FULLNAME.  Use call-process-region to run the decode program.
! 	(Info-find-node): Use info-insert-file-contents-1.
! 	(info-insert-file-contents-1) [MSDOS]: Don't use the dot in SUFFIX
! 	if FILENAME already has one.
  
! 	* dired.el (dired-internal-noselect): New arg MODE.
! 	If it's non-nil, switch to that nil.
! 	(dired-find-buffer-nocreate): New arg MODE.
  
! 	* mouse.el (mouse-drag-region): Store the right end position
! 	in the drag-event before replaying it at the end.
  
! 	* files.el (auto-mode-alist): Handle .f90 files.
  
! 	* dired.el (dired-internal-noselect): Use dirname when finding
! 	existing buffer.
  
! Thu Aug 31 19:48:44 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* cc-compat.el: New file.
  
! 	* sendmail.el (sendmail-send-it): Use user-mail-address.
  
! Thu Aug 31 23:41:21 1995  Barry Warsaw  <bwarsaw@anthem (Barry Warsaw)>
  
! 	* cc-mode.el (c-backslashify-current-line): Obsolete.
! 	(c-append-backslash, c-delete-backslash): Taken from c-mode.el.
! 	(c-backslash-region): Likewise.
  
! 	* cc-mode.el (c-indent-defun): Watch out for point being on the
! 	first top-level open brace in the buffer.
  
! 	* cc-mode.el (c-copy-tree, c-mapcar-defun): Define functions only
! 	available in XEmacs 19.12, or Emacs 19 + lucid.el.
  
! 	* cc-mode.el (c-lineup-ObjC-method-call): New implementation
! 	better handles 1. indentation of arguments to keyword parameters,
! 	2. multiline method calls.
  
! 	* cc-mode.el (c-electric-brace): Fixed preservation of
! 	no-whitespace before brace.
  
! 	* cc-mode.el (c-guess-basic-syntax): CASE 5A.1: Watch out for
! 	c-state-cache; it may or may not be in place, but it should be
! 	ignored.
  
! 	* cc-mode.el (c-electric-colon): In call to c-lookup-lists, fixed
! 	incorrect quoting of symbols in the quoted list.
  
! 	* cc-mode.el (c-search-uplist-for-classkey): Watch out for
! 	embedded c-class-key keywords.
  
! 	* cc-mode.el (c-common-init): Make a deep copy of c-offsets-alist
! 	so that changing the buffer-local value in one buffer doesn't
! 	affect the global value, or other buffers.
  
! 	* cc-mode.el (c-snug-do-while): forward-sexp call could fail;
! 	wrap it in a c-safe.
  
! 	* cc-mode.el (c++-mode, objc-mode): comment-multi-line must be nil
! 	if // is the default comment style.
  
! Thu Aug 31 11:04:43 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* ange-ftp.el (ange-ftp-vms-sans-version): Accept extra args.
  
! Wed Aug 30 12:01:14 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* simple.el (kill-new): Compute 2nd arg to interprogram-cut-function
! 	based on REPLACE.
  
! 	* files.el (list-directory): Set default-directory.
  
! Wed Aug 30 14:37:25 1995  Per Abrahamsen  <abraham@dina.kvl.dk>
  
! 	* mouse.el (mouse-skip-word): Skip complete symbol when over a
! 	character with symbol syntax.
  
! Tue Aug 29 11:30:37 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* dired-aux.el (dired-byte-compile): Report failure if output file
! 	is not created.
  
! 	* term/x-win.el (function-key-map): Consistently map CLEAR to C-l.
  
! Tue Aug 29 06:57:29 1995  Andre Spiegel  <spiegel@berlin.informatik.uni-stuttgart.de>
  
! 	* vc-hooks.el (vc-utc-string): New function.
! 	(vc-find-cvs-master): Use it to compare mtime and checkout time.
! 	(vc-locking-user): CVS case: *only* use checkout time.
! 	(vc-find-cvs-master): Don't attempt to find the RCS master file.
! 	Throw the full name of CVS/Entries.
! 	(vc-name): Doc change (special CVS case).
! 	(vc-after-save): Handle the case when a file is saved in the very
! 	second in which it was checked out.
  
! 	* vc.el (vc-dired-update-line): Don't use dired-do-redisplay.
! 	(vc-next-action-dired): Adjust default-directory before calling
! 	vc-next-action-on-file.
! 	(vc-next-action-on-file): Handle CVS merge in vc-dired-mode correctly.
! 	(vc-next-action): Ask for a check-in comment if there are "added"
! 	CVS files.  Don't special-case single files in vc-dired-mode.
! 	(vc-file-clear-masterprops): Typo fix.
! 	(vc-latest-on-branch-p): Always true for CVS.
! 	(vc-directory): Header change.  Do display the buffer, even if no
! 	locked/registered files were found.
  
! Mon Aug 28 11:09:11 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* files.el (recover-session-finish): Catch erorr in recover-file.
  
! 	* makefile.el (makefile-font-lock-keywords): Highlight lines with
! 	tab followed by #, and initial spaces preceding tabs--not all
! 	initial spaces.
  
! Sun Aug 27 03:19:50 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* tmm.el: Fix typo in global-map define.
  
! 	* cl-seq.el (rassoc): Definition deleted.
  
! 	* mailabbrev.el (mail-mode-syntax-table): defvar deleted.
  
! 	* edebug.el: Delete redundant defvars of built-in variables.
  
! 	* edmacro.el: Load cl only during compilation.
! 	(edmacro-mismatch, edmacro-subseq): New functions.
! 	Use them instead of mismatch and subseq.
  
! 	* hideif.el (hide-ifdef-hiding): Delete duplicate defvar.
  
! 	* modula2.el (m2-execute-monitor-command): Renamed from
! 	execute-monitor-command.
  
! Sat Aug 26 16:24:44 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* refer.el (refer-every): Renamed from every.
!   	(refer-convert-string-to-list-of-strings): Renamed from
!  	convert-string-to-list-of-strings.
  
! 	* levents.el (eventp): Duplicate definition deleted.
  
! 	* ws-mode.el (wordstar-center-line): Renamed from center-line.
! 	(wordstar-center-region): Renamed from center-region.
! 	(wordstar-center-paragraph): Renamed from center-paragraph.
  
! 	* x-menu.el: Doc fixes.
! 	(caar, cdar): Deleted--use (car (car ...)).
  
! 	* find-file.el (ada-spec-suffix): Definition deleted.
! 	(ada-make-filename-from-adaname): Delete autoload.
! 	(ff-special-constructs): Load ada-mode before referring to
! 	ada-spec-suffix and ada-make-filename-from-adaname.
  
! 	* life.el (abs): Function definition deleted.
! 	(goto-beginning-of-buffer): Macro deleted.  Use goto-char.
! 	(goto-end-of-buffer): Macro deleted.  Use goto-char.
! 	(maxint): Macro deleted.
! 	(life-increment): Renamed from increment.
! 	(life-initialized): New variable.
! 	(life): Do (random t) only once and only when `life' is called.
  
! 	* info.el (Info-default-directory-list): Duplicate defvar deleted.
  
! Fri Aug 25 17:18:04 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* uniquify.el: New file.
  
! 	* mailabbrev.el (rebuild-mail-abbrevs): FILE defaults to visited file.
  
! 	* executable.el (executable-set-magic): Use make-local-hook
! 	for after-save-hook.
  
! 	* files.el (basic-save-buffer): Doc fix.
! 	(after-save-hook): Add defvar.
  
! Fri Aug 25 14:39:29 1995  Andre Spiegel  <spiegel@berlin.informatik.uni-stuttgart.de>
! 	* vc.el: Enhanced vc-dired-mode.
! 	(vc-directory): Kill existing vc-dired buffers for this directory.
! 	Provide a better header.  Corrected the check whether any files were
! 	found at all (don't display a listing in this case).  Under CVS,
! 	display cvs-status rather than vc-locking-user.
! 	(vc-next-action-on-file): When doing a check-in in vc-dired-mode, find
! 	the file in another window.
! 	(vc-next-action-dired): Update dired listing while processing the
! 	files.
! 	(vc-next-action): Check whether a check-in comment is really needed
! 	for this mass operation.
! 	(vc-checkout): Resynch the buffer, even if it's not current.
! 	(vc-dired-state-info, vc-dired-update-line): New functions.
! 	(vc-dired-prefix-map): Added local definition for `g' and `='.
! 	(vc-dired-reformat-line): Simplified.  Erase the hardlink count from
! 	the listing, because it doesn't relate to version control.
  
! 	* vc.el: Added functions to dispatch on backend release numbers.
! 	Under RCS, use this to find out whether new features can be used.
! 	(vc-rcs-release, vc-cvs-release, vc-sccs-release): New variables, may
! 	be set by the user.
! 	(vc-backend-release, vc-release-greater-or-equal,
! 	vc-backend-release-p): New Functions.
! 	(vc-do-command): Allow FILE to be nil.
! 	(vc-backend-checkin): When creating a branch, don't bother to unlock
! 	the old version if this is RCS 5.6.2 or higher.
! 	(vc-next-action-on-file): Allow lock-stealing only if RCS 5.6.2 or
! 	higher.
! 	(vc-backend-admin, vc-backend-checkin): If available, use ci -i
! 	and -j.  Updated Developer's Notes.
  
! 	* vc.el (vc-backend-diff): Handle the case of a locally added CVS
! 	file correctly.
  
! 	* vc-hooks.el (vc-fetch-master-properties): Count cvs status
! 	"Needs Patch" as `needs-checkout'.
! 	(vc-after-save): Clear the cvs status.
  
! Fri Aug 25 12:39:51 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* etags.el (next-file): Advance next-file-list before finding the
! 	file named in its car, in case finding signals an error.
  
! Fri Aug 25 10:15:53 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* help.el (describe-function): Show file name for autoloaded fns.
  
! 	* simple.el (what-line): Print narrowed linenum with full buffer num.
  
! Thu Aug 24 01:24:48 1995  Tom Tromey  <tromey@irish.colorado.edu>
  
! 	* makefile.el (makefile-mode-syntax-table): "]" is a close-paren.
! 	(makefile-add-log-defun): Avoid error at eob.
  
! Wed Aug 23 19:40:22 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* makefile.el: Doc fixes.
! 	(makefile-font-lock-keywords): Highlight lines of just whitespace.
  
! Tue Aug 22 16:24:49 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* edebug.el (edebug-outside-post-command-idle-hook)
! 	(post-command-idle-hook): New variables.
! 	(edebug-enter, edebug-outside-excursion): Use them.
  
! 	* avoid.el (mouse-avoidance-mode): Use post-command-idle-hook.
! 	Use remove-hook.
  
! 	* two-column.el (2C-mode): Use make-local-hook and add-hook.
  
! 	* icomplete.el (icomplete-minibuffer-setup): Use make-local-hook
! 	and add and remove hooks locally.
  
! 	* ediff-util.el (ediff-profile): Use make-local-hook
! 	and add and remove hooks locally.
  
! Tue Aug 22 13:57:30 1995  Andre Spiegel  <spiegel@berlin.informatik.uni-stuttgart.de>
  
! 	* files.el (basic-save-buffer): Call vc-after-save, to
! 	support implicit locking in VC.
  
! 	* vc-hooks.el (vc-simple-command): New function.
! 	(vc-fetch-master-properties): CVS case: Use it.
! 	(vc-lock-from-permissions, vc-file-owner, vc-rcs-lock-from-diff):
! 	New functions.
! 	(vc-locking-user): Largely rewritten.  Uses the above, handles RCS
! 	non-strict locking.  Under CVS in CVSREAD-mode, learn the locking
! 	state from the permissions.
! 	(vc-find-cvs-master): Use vc-insert-file, rather than
! 	find-file-noselect. Greatly speeds up things.
! 	(vc-consult-rcs-headers): Bug fix, return status in all cases.
  
! 	* vc.el: Removed the comment that said we assume strict locking.
! 	(vc-next-action-dired): Don't switch to vc-parent-buffer, because
! 	that was already done.
  
! Tue Aug 22 12:43:26 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* sc.el: Provide sc.
  
! Mon Aug 21 18:16:07 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* compile.el (compilation-exit-message-function): New variable.
! 	(compilation-sentinel): If compilation-exit-message-function is
! 	non-nil, call it to produce messages for buffer and mode line.
! 	(grep): Use that variable to produce snazzier messages.
  
! Mon Aug 21 17:59:43 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
  
! 	* paren.el: Use post-command-idle-hook.
!  	(show-paren-command-hook): No need to test for idleness.
  
! Mon Aug 21 15:28:47 1995  Andre Spiegel  <spiegel@berlin.informatik.uni-stuttgart.de>
  
! 	* vc-hooks.el (vc-fetch-master-properties): RCS case: get locking
! 	mode.  CVS case: new state `locally-added'.
! 	(vc-locking-user): Under RCS with non-strict locking, don't trust
! 	the file permissions.  CVS case: change which states count as
! 	"locked".
! 	(vc-consult-rcs-headers): Streamlined. Don't set vc-locking-user if
! 	this is called under CVS.  Under RCS, use a heuristic to find the
! 	value of vc-checkout-model without examining the master file.
! 	(vc-parse-locks): Set vc-checkout-model.
! 	(vc-status): Comment change.
! 	(vc-after-save-hook, vc-after-save): The former renamed to the
! 	latter. Now unconditionally called by `basic-save-buffer', determines
! 	whether the buffer should be "locked" or not.
! 	(vc-checkout-model): Values are now `manual' and `implicit'.  Derive
! 	the property on a per-file basis, supporting all possible modes.
! 	(vc-mode-line): No longer use dynamic after-save-hook. Changed
! 	references to `automatic' into `implicit'.
  
! 	* vc.el (vc-latest-on-branch-p): Under CVS, handle the case when
! 	the file is added, but not yet committed.
! 	(vc-backend-checkout): RCS case: In non-strict locking mode, force
! 	to overwrite the writable workfile. CVS case: Do the right thing in
! 	CVSREAD-mode.
  
! Mon Aug 21 10:47:30 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* files.el (auto-mode-alist): Turn on use of makefile-mode.
  
! 	* rmailsum.el: Require rmail.
! 	(rmail-new-summary): Specify size in split-window.
! 	Call rmail-select-summary to force size to specified amount.
  
! Mon Aug 21 08:15:47 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
  
! 	* fast-lock.el: New version 3.07 from author.
! 	(fast-lock-mode): Use buffer-file-truename, not buffer-file-name.
! 	(fast-lock-cache-directories, fast-lock-cache-name): Doc fixes.
  
! Mon Aug 21 01:18:55 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* solar.el: Doc fixes.
  
! Sun Aug 20 15:12:09 1995  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
  
! 	* icon.el: Define user options with defvar, not defconst.
  
! Sun Aug 20 01:05:26 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* dired.el (dired-string-replace-match): Simplify using replace-match.
  
! 	* dired-aux.el (dired-expand-newtext): Function deleted.
  
! 	* bytecomp.el (byte-compiler-base-file-name): New function.
! 	(byte-compile-dest-file): Call byte-compiler-base-file-name.
  
! 	* jka-compr.el (jka-compr-byte-compiler-base-file-name): New function.
! 	Use it to handle byte-compiler-base-file-name operation.
  
! Sun Aug 20 00:34:10 1995  Michael Kifer  <Michael Kifer <kifer@cs.sunysb.edu>>
  
! 	* viper.el (vip-set-hooks): Use view-mode-hook in emacs and view
! 	hook in xemacs.
! 	(vip-read-string-with-history): minibuffer-setup-hook no longer
! 	waits for the user to type, if there are unread events.
! 	Harnessed view-minor-mode.
! 	Added (vip-leave-region-active) to all simple movement commands.
! 	* viper-mous.el (vip-surrounding-word): modified to understand
! 	tripple clicks.
! 	* viper-util.el (vip-leave-region-active): new function.
  
! Sat Aug 19 12:38:16 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* vc.el (file-regular-p-18): Fix test for whether to use this.
  
! 	* info.el (Info-find-emacs-command-nodes): Fix previous change.
! 	(Info-suffix-list): For MS-DOS, use gunzip as the only uncompressor,
! 	and don't include .info as suffix.
! 	(info-insert-file-contents-1): New function.
! 	(info-insert-file-contents): Use info-insert-file-contents-1.
  
! 	* macros.el (insert-kbd-macro): Express vector char modifiers with
! 	escape prefixes.  Express big basic char codes in octal.
  
! Sat Aug 19 02:33:10 1995  Karl Heuer  <kwzh@gnu.ai.imt.edu>
  
! 	* hilit19.el (hilit-submit-feedback): New ftp site.
  
! Sat Aug 19 00:37:47 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* info.el (Info-file-list-for-emacs): New variable.
! 	(Info-find-emacs-command-nodes): Look in those files, if appropriate.
  
! 	* files.el (basic-save-buffer): Confirm for overwriting old file
! 	when a file name is specified.
  
! Fri Aug 18 20:28:58 1995  Daniel Pfeiffer  <Daniel.Pfeiffer@Informatik.START.dbp.de>
  
! 	* skeleton.el (skeleton-newline-indent-rigidly): New variable.
! 	(skeleton-internal-1): Use it for indenting after \n because previous
! 	behaviour was only useful for `sh-script.el' and old `ada.el'.  Other
! 	modes now get their own indentation.
! 	(skeleton, skeleton-modified, skeleton-point, skeleton-regions): `New'
! 	variables for passing between the mutually recursive functions of
! 	the skeleton engine.  Introduced to remove compiler warnings.
! 	(skeleton-proxy): New argument `str' to make this settable when calling
! 	a skeleton as a function.
! 	(skeleton-insert): New argument `str' to pass down.  Element `\n'
! 	now usually indents according to mode.  Subskeletons may also have
! 	a list of strings as iterator.  Earlier modification also removed
! 	meaning of `quit' -- I did not put it back in since it's useless.
! 	When quitting out of a subskeleton while still wrapping around text
! 	don't duplicate first line of that text.
! 	(skeleton-end-hook): New hook useful say for modes that leave a `;' on
! 	an empty line to indent right and then want to clean it up when doing
! 	a skeleton there.
  
! 	* sh-script.el (sh-newline-and-indent): Don't interpret prefix arg
! 	since `newline-and-indent' doesn't either.  Don't turn a trailing
! 	quoted tab into a space.
! 	(sh-mode): Use new `skeleton-newline-indent-rigidly'.
! 	(sh-set-shell): Make maximum font-locking also hightlight keywords
! 	after ``' and `!'.  (The latter is for ksh '93 but should't hurt other
! 	shells.)
  
! Fri Aug 18 16:36:52 1995  Andre Spiegel  <spiegel@berlin.informatik.uni-stuttgart.de>
  
! 	* vc.el (vc-next-action-on-file): Changed doc string, CVS case.
! 	(vc-backend-checkin): Clear master properties before doing the
! 	check-in.  In the CVS case, catch error and display an appropriate
! 	message in the echo area.
! 	(vc-backend-revert): Clear master properties, because some might get
! 	outdated by the operation.
! 	(vc-backend-merge-news): Scan the output of "cvs update" and find out
! 	whether conflicts have occurred.
  
! 	* vc-hooks.el (vc-fetch-master-properties):
! 	Recognize cvs status "Unresolved Conflict".
! 	(vc-locking-user): Count cvs status `unresolved-conflict' as "locked".
  
! 	* vc.el (vc-finish-logentry):
! 	Delete the *VC-log* buffer *before* doing the
! 	actual check-in. That leads to a better display in case the check-in
! 	fails.
  
! 	* vc.el (vc-latest-on-branch-p): Defined it for CVS in the obvious way.
! 	(vc-next-action-on-file): Removed special CVS cases. At this level,
! 	CVS is now mostly handled like the other backends.
! 	(vc-backend-checkout): CVS case: Clear sticky tag as default when
! 	doing a verbose checkout. (This used to be done in
! 	vc-next-action-on-file.)
  
! 	* vc-hooks.el (vc-checkout-model):
! 	New property and access function (still simplistic).
! 	(vc-after-save-hook): New function.
! 	(vc-mode-line): When the file is locked by somebody else, make the
! 	buffer read-only.  (Formerly this was only done for root.)  Don't
! 	write-protect the buffer if the file is unlocked.  Instead, install
! 	vc-after-save-hook, which "locks" the file when modifications are
! 	saved.
  
! Fri Aug 18 12:42:13 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* makefile.el (makefile-space-face): New variable.
! 	(makefile-define-space-face): New function.
! 	(makefile-tab-face): Variable deleted.
! 	(makefile-define-tab-face): Function deleted.
! 	(makefile-font-lock-keywords): Highlight leading spaces, not tabs.
  
! Thu Aug 17 15:40:32 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* hilit19.el (hilit-submit-feedback): New bug-reporting address.
  
! Thu Aug 17 08:46:53 1995  Andre Spiegel  <spiegel@berlin.informatik.uni-stuttgart.de>
  
! 	* vc.el (vc-next-action-on-file): Moved the setting of the default
! 	branch to vc-backend-checkout, where it belongs.
! 	(vc-backend-checkout): If an explicit version was specified, adjust
! 	the default branch accordingly.
  
! 	* vc-hooks.el (vc-top-version): Renamed to vc-master-workfile-version.
!  	Updated all references.
! 	vc.el: Changed references to vc-top-version into
! 	vc-master-workfile-version.
  
! 	* vc.el (vc-next-action-on-file): Query when trying to lock
! 	non-latest version.
  
! 	* vc.el: Let vc-cancel-version handle branches correctly, and
! 	behave more comfortably in the `norevert' case.
! 	(vc-revert-buffer1): Split part of the function into vc-buffer-context
! 	and vc-restore-buffer-context, so we can use it also in other
! 	circumstances.
! 	(vc-buffer-context, vc-restore-buffer-context): New functions.
! 	(vc-clear-headers): New function, uses the above.
! 	(vc-cancel-version): When `norevert', locks the most recent remaining
! 	version.  Also, refuse to work on anything but the latest version of
! 	a branch.  Removed the check whether the version is the user's,
! 	because that is difficult to decide, now that multiple branches are
! 	possible.
! 	(vc-latest-on-branch-p): New function.
! 	(vc-head-version): New access function to the already existing
! 	property.
! 	(vc-trunk-p, vc-branch-part): Functions moved before first use.
  
! Thu Aug  16 22:21:38 1995  Fred Pierresteguy  <F.Pierresteguy@frcl.bull.fr>
  
! 	* rmailsum.el (rmail-new-summary): Enable the Input/output menu.
  
! Wed Aug 16 16:13:43 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* pascal.el (pascal-mode): Set comment-start.
! 	(pascal-toggle-completions): Doc fix.
  
! Wed Aug 16 10:36:06 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* simple.el (blink-matching-paren-dont-ignore-comments): New var.
! 	(blink-matching-open): Use it.
! 	Also, if the matching char hasn't paren syntax, call that mismatch.
  
! 	* inf-lisp.el (inferior-lisp): Use pop-to-buffer.
! 	Add *inferior-lisp* to same-window-buffer-names.
  
! 	* cmuscheme.el (run-scheme): Use pop-to-buffer.
! 	Add *scheme* to same-window-buffer-names.
  
! 	* xscheme.el (run-scheme): Use pop-to-buffer.
  
! Tue Aug 15 16:02:34 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* sh-script.el (sh-mode-map): Use new name skeleton-pair-insert-maybe.
! 	(sh-mode): Use new names skeleton-pair-alist, skeleton-pair-filter.
  
! Tue Aug 15 15:48:33 1995  Daniel Pfeiffer <Daniel.Pfeiffer@Informatik.START.dbp.de>
  
! 	* skeleton.el (skeleton-pair-insert-maybe): Plain insert in Ovwrt mode
! 	(skeleton-insert): If skeleton doesn't fit in window, put beginning
! 	at top before going to _ point.
! 	(skeleton-internal-list): Rewritten so that resume: sections pertain
! 	only to inferior skeletons and make str available there
! 	(skeleton-read): Don't quit and remove partial skeleton when empty
! 	string entered for outer iterator.  Added implicit argument `input'.
! 	(define-skeleton, skeleton-insert, skeleton-internal-list): Use `x
! 	rather than backquote's (` x) or own (list 'x)
  
! 	* sh-script.el (sh-test): New variable.
! 	(sh-if, sh-until, sh-while): Use it.
! 	(sh-while-getopts): Handle csh passably well.
! 	(sh-font-lock-keywords): Use `font-lock-variable-name-face'.
! 	(sh-set-shell): Respect `font-lock-maximum-decoration'.
  
! Tue Aug 15 08:30:32 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* supercite.el (sc-attribs-extract-namestring): If name has <...>,
! 	treat everything before that as the full name.
  
! Mon Aug 14 17:56:23 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* view.el: Rewrite as a minor mode.
  
! 	* viper.el (vip-set-hooks): Use view-mode-hook, not view-hook.
  
! Mon Aug 14 13:21:39 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* files.el (basic-save-buffer-1): Pass new arg to write-region.
  
! Mon Aug 14 12:01:33 1995  Erik Naggum  <erik@naggum.no>
  
! 	* files.el (insert-file-contents-literally): New function.
!   	(find-file-noselect): Use it if new optional argument `rawfile' is
!  	non-nil.
  
! 	* startup.el (command-line-1): Add option --eval to evalute an
! 	expression on the command line and print the result.
  
! Mon Aug 14 02:17:09 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* paren.el (show-paren-command-hook): Do nothing if have unread events.
  
! Sun Aug 13 11:45:09 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* mouse.el (mouse-drag-region): Unread the up-event
! 	rather than execute it here.
  
! Sat Aug 12 05:20:56 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* rmail.el (rmail-convert-file): Look back for ^_ only at bol.
  
! 	* simple.el (shell-command-on-region): Don't examine order of
! 	point and mark; use order of START and END instead.
! 	Interactively pass point and mark, not region-beg and region-end.
  
! Thu Aug 10 16:01:19 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* isearch.el (isearch-other-meta-char): Avoid bug checking whether
! 	a key is defined in the function key map.
! 	Call cancel-kbd-macro-events.
  
! 	* bytecomp.el (byte-compile-insert-header): Use 19.29, not 19.28.90
! 	as limit for where dynamic docstrings are allowed.
  
! 	* server.el (server-buffer-done): Pause between client commands,
! 	but not after the last one.
  
! 	* files.el (recover-file): It's ok if the visited file doesn't exist.
! 	(recover-session-finish): Compute "file name" from autosave file
! 	if no visited file.
  
! Thu Aug 10 10:50:21 1995  Andre Spiegel  <spiegel@berlin.informatik.uni-stuttgart.de>
  
! 	* vc.el (vc-dired-reformat-line): Display eight character user names
! 	correctly.
  
! Thu Aug 10 09:57:30 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
  
! 	* font-lock.el (font-lock-beginning-of-syntax-function): New variable.
! 	(font-lock-defaults-alist): New element to specify it.
! 	(font-lock-set-defaults): Set it.
! 	(font-lock-fontify-region): Use it when calculating the cache state.
! 	(font-lock-maximum-size): Add autoload cookie.
! 	(font-lock-fontify-region, font-lock-unfontify-region): Also wrap
! 	value of buffer-file-truename to avoid clash detection.
! 	(font-lock-hack-keywords): Likewise.  Also use a while loop, not
! 	mapcar, when applying keywords.
! 	(tex-font-lock-keywords): Rewritten again.
! 	(scheme-font-lock-keywords): New keywords.
! 	(font-lock-defaults-alist): Specify defaults for them.
  
! 	* fortran.el (fortran-font-lock-keywords-1): Fix column 72 comments.
  
! 	* texinfo.el (texinfo-font-lock-keywords): Rewritten.
! 	(texinfo-mode): Set up font-lock-defaults for keywords only.
  
! 	* help.el (help-font-lock-keywords): New keywords.
! 	(help-mode): Set up font-lock-defaults.
  
! Wed Aug  9 18:09:15 1995  Francesco Potorti`  (pot@cnuce.cnr.it)
  
! 	* man.el (Man-translate-references): Anchor the regexps.
  
! Tue Aug  8 13:03:51 1995  Boris Goldowsky  <boris@gnu.ai.mit.edu>
  
! 	* forms.el (forms-check-number-of-fields): New vbl.
! 	(forms-mode): Don't issue warning if vbl says not to.
  
! Tue Aug  8 01:14:27 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* vc.el (vc-revert-buffer): In a dedicated solitary window,
! 	make the frame invisible instead of trying to delete window.
  
! 	* paragraphs.el (forward-paragraph): Don't overlook a paragraph-start
! 	line just because it ends at eob.
  
! 	* edebug.el (edebug-functionp): Return t for a bytecode function.
  
! 	* dired.el (dired-mode-map): Set up the map completely
! 	before storing it into dired-mode-map.
  
! Mon Aug  7 04:44:30 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* bytecomp.el (byte-compile-insert-header): New args inbuffer and
!  	outbuffer.  Test byte-compile-dynamic-docstrings in the initially
!  	current buffer.
! 	(byte-compile-from-buffer): Add new args to byte-compile-insert-header.
  
! 	* startup.el (command-line-1): Fix previous change.
  
! 	* bytecomp.el (byte-compile-output-docform): Check
! 	byte-compile-dynamic-docstrings in input buffer, not output buffer.
  
! Sun Aug  6 02:26:39 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* delsel.el (delete-selection-pre-hook): New type value `yank'.
! 	(yank): Use `yank' as delete-selection property.
  
! 	* simple.el (column-number-mode, line-number-mode): Default now t.
  
! Sat Aug  5 02:32:33 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* faces.el (set-face-background): When using face-color-supported-p,
! 	specify foreground, not background.
  
! Fri Aug  4 15:55:57 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* bibtex.el (bibtex-maintain-sorted-entries): Make nil the default.
  
! 	* ps-print.el: Renamed `fsf' to `emacs' in all names.
! 	(ps-print-emacs-type): Renamed from emacs-type.
  
! Fri Aug  4 15:39:50 1995  Stephen A. Wood  <saw@hallc1.cebaf.gov>
  
! 	* fortran.el (fortran-auto-fill-mode, fortran-do-auto-fill,
! 	fortran-fill): Invoke auto filling only when past fill-column.
  
! Fri Aug  4 14:02:11 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* compile.el (compilation-error-regexp-alist): Add regexp for Sun
!  	ada.
  
! Thu Aug  3 22:27:24 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* solitaire.el: New file.
  
! Thu Aug  3 13:53:55 1995  Morten Welinder  <terra+@cs.cmu.edu>
  
! 	* arc-mode.el: Standardize layout of doc strings.
  
! Thu Aug  3 03:26:29 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* rsz-mini.el (resize-minibuffer-setup): Use make-local-hook.
  
! 	* tmm.el: Don't alter bindings in minibuffer-local-must-match-map
! 	or completion-list-mode-map.
! 	(tmm-add-prompt): Use make-local-hook; add hook locally.
! 	(tmm-delete-map): Delete hook locally.
  
! 	* indent.el (tab-to-tab-stop): Expand abbrevs only after a word-char.
  
! Wed Aug  2 17:59:22 1995  Rob Riepel  <riepel@Snowflake.Stanford.EDU>
  
! 	* tpu-edt.el (tpu-control-keys): New initial value, nil.
! 	(tpu-help): Back up one page at a time.
! 	(tpu-set-control-keys): New function.
! 	(tpu-edt-on): Call tpu-set-control-keys.
  
! Wed Aug  2 00:41:09 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* jka-compr.el (jka-compr-load): Bind load-force-doc-strings.
  
! 	* dired-aux.el (dired-do-copy): Doc fix.
  
! 	* arc-mode.el (archive-remote-regexp): Don't accept hostnames
! 	ending in period.  (See previous ange-ftp.el change.)
  
! 	* gud.el (gud-xdb-marker-filter): Change pattern to accept spc at end.
  
! Tue Aug  1 19:38:13 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* ange-ftp.el (file-name-handler-alist): Don't match host name
! 	ending in period.
  
! Tue Aug  1 18:40:22 1995  Daniel Pfeiffer  <Daniel.Pfeiffer@Informatik.START.dbp.de>
  
! 	* two-column.el (2C-toggle-autoscroll, 2C-autoscroll):
! 	Only (sit-for 0) once for smoother scrolling.
! 	(2C-associated-buffer): go to same line and column.
! 	(2C-newline): new function.
! 	(2C-other): optional arg to signal missing other buffer.
  
! Tue Aug  1 02:36:29 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* byte-opt.el (byte-optimize-nthcdr): Fix previous change.
  
! Mon Jul 31 16:19:04 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* startup.el (command-line-1):
! 	Mention recover-session if there's a .saves file.
  
! 	* files.el (recover-session): Mention deletion is possible.
! 	(recover-session-finish): Call dired-do-flagged-delete.
  
! 	* dired.el (dired-do-flagged-delete): New arg nomessage.
  
! 	* vi.el (vi-scroll-amount, vi-shift-width): Fix syntax of doc strings.
  
! Mon Jul 31 05:55:56 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
  
! 	* subr.el (run-hooks): Variable doc fix.
! 	(run-hooks, run-hook-with-args-until-success,
! 	run-hook-with-args-until-failure): Functions moved to C.
  
! Sun Jul 30 18:28:45 1995  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
  
! 	* dired-aux.el (dired-read-shell-command): Use
! 	`shell-command-history' in read-string.
  
! Sun Jul 30 02:43:41 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* iso-acc.el: Major additions by Gustavo Chaves.
! 	(iso-languages): New variable.
! 	(iso-accents-list): Now set by iso-customize-accents.
! 	(iso-customize-accents): New function.
! 	(iso-accentuate, iso-deaccentuate, iso-unaccentuate):
! 	(iso-accent-rassoc-unit): New functions.
  
! 	* rmail.el (rmail-unix-mail-delimiter): Allow two-letter timezone name.
  
! 	* faces.el (set-face-background): Don't treat nil as a color.
  
! 	* loadhist.el (unload-feature): Delete the file's load-history element.
! 	(file-set-intersect): Renamed from set-intersect.
! 	(file-dependents): Use new name.
  
! 	* ehelp.el (with-electric-help): Doc fix.
  
! 	* files.el (cd): When reading arg, use just directory as the default.
  
! 	* bytecomp.el (byte-compile-insert-header): If compiling for vers 18,
! 	arrange to set current-load-list when loading the file.
  
! Sat Jul 29 19:32:12 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* fill.el (fill-region-as-paragraph): Don't find adaptive-fill-regexp
! 	on first line of paragraph if it's a paragraph-separate line.
! 	Don't look past the intended line.
! 	(adaptive-fill-function): New variable.
! 	(fill-region-as-paragraph): Use it.
! 	(colon-double-space): New variable.
! 	(canonically-space-region): Put two spaces after colon if necessary.
  
! 	* simple.el (do-auto-fill): Use adaptive-fill-function.
  
! 	* paragraphs.el (forward-paragraph): Don't move back over a line
!  	before the paragraph which doesn't start with fill-prefix unless
!  	that is the only line we've moved over.
  
! Fri Jul 28 15:51:15 1995  Michael Ernst  <mernst@research.microsoft.com>
  
! 	* simple.el (scroll-other-window-down): Bind to S-C-M-v.  Enhance
! 	documentation.
  
! Fri Jul 28 21:49:53 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* info.el (Info-read-node-name-1): New function.
! 	(Info-read-node-name): Use Info-read-node-name-1
! 	to avoid getting confused by spaces when text starts with (FILENAME).
  
! Fri Jul 28 16:26:10 1995  Andre Spiegel  <spiegel@berlin.informatik.uni-stuttgart.de>
  
! 	* vc.el (vc-resynch-buffer): New function.
! 	(vc-locked-example): Renamed to vc-snapshot-precondition. It now also
! 	checks whether any of the files are visited.
! 	(vc-retrieve-snapshot): If any files are visited, ask whether to
! 	revert their buffers. Use vc-backend-checkout and vc-resynch-buffer
! 	to do that, instead of vc-checkout.
  
! 	* vc.el (vc-backend-checkout): Adjust default-directory so that the
! 	checked-out file goes to the right place.
  
! Fri Jul 28 13:10:38 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* dired.el (dired-insert-set-properties): Catch errors.
  
! 	* simple.el (next-line): Doc fix.
  
! 	* dabbrev.el (dabbrev-expand): Save previous point for undo.
  
! Thu Jul 27 18:04:03 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* simple.el (do-auto-fill): Handle adaptive-fill-regexp.
  
! 	* texnfo-upd.el (texinfo-specific-section-type):
! 	Use buffer-substring-no-properties.
  
! Thu Jul 27 15:08:32 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* imenu.el: (imenu-generic-lisp-expression)
! 	(imenu-generic-c++-expression, imenu-generic-c-expression)
! 	(imenu-generic-ada-expression, imenu-generic-texinfo-expression)
! 	(imenu-generic-latex-expression): Vars deleted; now handled by the
! 	major modes themselves.
! 	(imenu--scanning-method-alist): Var deleted.
! 	(imenu-default-create-index-function): Don't use that alist.
! 	* cplus-md.el (c++-imenu-generic-expression): Var defined.
! 	(c++-mode): Set imenu-generic-expression.
! 	* c-mode.el (c-imenu-generic-expression): Var defined.
! 	(c-mode): Set imenu-generic-expression.
! 	* tex-mode.el (latex-imenu-generic-expression): Var defined.
! 	(latex-mode): Set imenu-generic-expression.
! 	* texinfo.el (texinfo-imenu-generic-expression): Var defined.
! 	(texinfo-mode): Set imenu-generic-expression.
! 	* ada-mode.el (ada-imenu-generic-expression): Var defined.
! 	(ada-mode): Set imenu-generic-expression.
! 	* lisp-mode.el (lisp-imenu-generic-expression): Var defined.
! 	(lisp-mode-variables): Set imenu-generic-expression.
  
! 	* faces.el (x-font-regexp): Add \\(\\) for substring extraction.
  
! Thu Jul 27 11:04:08 1995  Ulrich Mueller  <ulm@vsnhd1.cern.ch>
  
! 	* fortran.el (fortran-break-line): Fixed a bug that sometimes
! 	deleted first character in statement field of continuation line.
  
! Thu Jul 27 10:11:59 1995  Espen Skoglund  <espensk@tklab1.cs.uit.no>
  
! 	* pascal.el (pascal-mode): Added imenu support.
! 	(pascal-imenu-generic-expression): New variable.
  
! Thu Jul 27 03:04:18 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* texinfo.el (texinfo-environment-regexp): Allow whitespace at BOL.
  
! 	* isearch.el (isearch-mode-map): Don't bind tab, return, kp-N, etc.
! 	(isearch-other-meta-char): Special handling for keys like tab, etc.
  
! Wed Jul 26 16:01:29 1995  Stefan Schoef  <schoef@OFFIS.Uni-Oldenburg.DE>
  
! 	* bibtex.el: Add keywords and comments as per conventions.
  
! 	* bibtex.el: Changed almost all occurences of buffer-substring to
! 	buffer-substring-no-properties..
  
! 	* bibtex.el (bibtex-find-entry-location, bibtex-clean-entry):
! 	Added support to handle invalidate buffers in a more friendly
! 	manner.
  
! 	* bibtex.el (bibtex-make-field): Changed to be called either
!  	interactively with a string (field name) or from Lisp with a list
!  	of two strings (FIELDNAME COMMENT).
  
! Wed Jul 26 13:47:14 1995  Rob Riepel  <riepel@Snowflake.Stanford.edu>
  
! 	* tpu-edt.el (tpu-version): New version.
! 	(tpu-help-keypad-map): New help text.
! 	(tpu-backward-line): Only move to BOL if not already there.
  
! 	* tpu-extras.el (tpu-backward-line): Only move to BOL if not
! 	already there.
  
! Wed Jul 26 18:19:12 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* indent.el (indent-region-function): Doc fix.
  
! 	* lisp-mode.el (shared-lisp-mode-map):
! 	Don't bind TAB, just set indent-line-function.
  
! Wed Jul 26 15:40:00 Michael Kifer  (kifer@cs.sunysb.edu)
  
! 	* viper-ex.el (vip-submit-report): fnc modified.
  
! 	* viper-keym.el (vip-overriding-map): new variable.
  
! 	* viper-macs.el (vip-repeat-from-history-key): new default.
! 	(vip-read-fast-keysequence, ex-unmap-read-args, ex-map-read-args):
! 	changed to use vip-read-key.
  
! 	* viper-mous.el (vip-multiclick-timeout): new default.
! 	(vip-surrounding-word, vip-mouse-click-get-word): fnc modified.
  
! 	* viper-util.el (vip-add-hook, vip-remove-hook): new fncs.
  
! 	* viper.el (vip-info-file-name): variable removed.
! 	(vip-envelop-ESC-key, vip-start-replace, vip-finish-R-mode,
! 	vip-start-R-mode, vip-insert-state-pre-command-sentinel,
! 	vip-R-state-post-command-sentinel, vip-replace-char) fncs modified.
  
! Tue Jul 25 18:04:33 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* faces.el (x-font-regexp-weight-subnum, x-font-regexp-slant-subnum)
! 	(x-font-regexp-swidth-subnum, x-font-regexp-adstyle-subnum): Defconst.
  
! Tue Jul 25 17:01:48 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* imenu.el (imenu--history-list): Don't make this buffer-local.
! 	(imenu): Call imenu-choose-buffer-index from interactive spec.
  
! Tue Jul 25 15:35:07 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* subr.el (run-hook-with-args): Deleted; now in C code.
  
! Mon Jul 24 21:52:52 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* imenu.el: Many doc fixes.
  
! Tue Jul 25 07:17:02 1995  Ake Stenhoff  <etxaksf@aom.ericsson.se>
  
! 	* perl-mode.el (perl-imenu-generic-expression) New variable.
! 	(perl-mode): Set imenu-generic-expression.
  
! 	* imenu.el (imenu-generic-expression): Call make-variable-buffer-local.
! 	(imenu-create-index-pattern): Variable deleted.
  
! Sat Jul 22 17:24:07 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* tar-mode.el (tar-copy): Inhibit use of jka-compr handler
! 	when both to- and from- files would use it.
  
! Sat Jul 22 11:13:54 1995  Daniel Pfeiffer  <Daniel.Pfeiffer@Informatik.START.dbp.de>
  
! 	* apropos.el: Add latest changes of old library and some more.
! 	(apropos): Only show unbound symbols when do-all
! 	(apropos-documentation-check-elc-file): new copied function.
! 	(apropos-command): also use `apropos-do-all' when called as function.
! 	(apropos-print-doc): renamed from `apropos-print-documentation', i
! 	is numeric index, replaces parameter tem.
! 	(apropos-macrop): new function.
! 	(apropos-print): use it to differentiate macros.
! 	(apropos-symbol-face, apropos-keybinding-face, apropos-label-face)
! 	(apropos-property-face, apropos-match-face): new variables
! 	replace and extend the effect of `apropos-use-faces'.
! 	(apropos-safe-documentation): renames `safe-documentation', also
! 	returns a cons.
! 	(apropos-regexp, apropos-files-scanned, apropos-accumulator)
! 	(apropos-item): new variables to prevent compiler warnings.
! 	(apropos-value-internal, apropos-documentation-internal): new fns.
  
! Fri Jul 21 01:04:25 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* byte-opt.el (byte-optimize-lapcode): Fix format calls.
  
! 	* imenu.el (imenu-choose-buffer-index):
! 	Avoid trying to select WINDOW if it is nil.
  
! 	* menu-bar.el (menu-bar-buffer-menu): Function deleted.
! 	(global-map): Define [menu-bar buffer] as a keymap with no fcn name.
! 	(menu-bar-update-buffers): After defining it, call it.
  
! 	* faces.el (make-face-bold, make-face-italic, make-face-bold-italic)
! 	(make-face-unbold, make-face-unitalic):
! 	No error if font is already bold, italic, or whatever.
  
! 	* font-lock.el (font-lock-make-faces): Redo logic for whether
! 	to call font-lock-make-face for a given face.
  
! Thu Jul 20 16:16:37 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* rmail.el (rmail-insert-inbox-text): Always use movemail
! 	when renaming a file.
  
! 	* simple.el (indent-new-comment-line):
! 	fill-prefix overrides comment indentation.
  
! 	* skeleton.el (local-variables-section): Delete autoload cookie.
! 	(skeleton-pair-insert-maybe): Renamed from pair-insert-maybe.
! 	(skeleton-pair, skeleton-pair-filter, skeleton-pair-alist)
! 	(skeleton-pair-on-word): Renamed from pair-...
! 	(mirror-mode): Commented out.
  
! 	* info.el (Info-current-file): Doc fix.
! 	(Info-find-node): Set Info-current-file to file name as specified.
  
! Thu Jul 20 15:34:52 1995  Dave Love  <d.love@dl.ac.uk>
  
! 	* mail-utils.el (mail-fetch-field): Use buffer-substring-no-properties.
  
! Thu Jul 20 02:13:52 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* derived.el (derived-mode-set-keymap): Cope if old-map is nil.
  
! 	* menu-bar.el (menu-bar-update-yank-menu): Treat all-dashes specially.
  
! Wed Jul 19 11:43:14 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* sendmail.el (mail-default-reply-to): Doc fix.
  
! Tue Jul 18 09:06:10 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* backquote.el (backquote): Doc fix.
  
! 	* noutline.el (outline-next-visible-heading): Rewritten to handle
! 	backwards motion and handle beg/end of buffer properly.
  
! 	* menu-bar.el (menu-bar-tools-menu): Don't define gnus entry
! 	if no network support.
  
! 	* faces.el (x-create-frame-with-faces):
! 	Specify frame arg to x-color-values and frame-parameters.
! 	(set-face-background): Pass background-p arg to face-color-supported-p.
  
! Tue Jul 18 21:45:17 1995  Michael Ernst  <mernst@research.microsoft.com>
  
! 	* ehelp.el (electric-helpify): Autoload with-electric-help,
! 	electric-helpify.
  
! Tue Jul 18 21:05:34 1995  Rolf Ebert  <re@waporo.muc.de>
  
! 	* ada-mode.el (ada-ident-re): Doc fix.
! 	(ada-end-stmt-re): Corrected serious pb of wrong parentheses.
! 	(ada-subprog-start-re): Removed 'body' from the list.
! 	(ada-format-paramlist): Simplified a regexp.
! 	(ada-indent-current): On first line of the buffer, indent to column 0.
! 	Don't reindent if new position is the same as the old one.  Thus, a
! 	correcly indended line is not modified.
! 	(ada-get-indent-subprog): Simplified a regexp.
! 	(ada-goto-matching-decl-start): Distinguish between normal type
! 	declaration and protected types, which are more like procedures.
! 	(ada-remove-trailing-spaces): Use save-match-data, save-restriction
! 	and widen when removing whitespace.
! 	(ada-font-lock-keywords-1): Add 'pragma' as keyword.
! 	(ada-font-lock-keywords-2): Allow *qualified* idents after 'end'.
  
! 	* files.el (auto-mode-alist): Recognize *.ads and *.adb as Ada
! 	specs and bodies.
  
! Tue Jul 18 15:26:23 1995  Dave Love  <d.love@dl.ac.uk>
  
! 	* nroff-mode.el (font-lock-defaults): New variable.
! 	(nroff-mode-syntax-table): New variable to provide comment syntax
! 	for font-lock; I'm not sure if this is (or should be) necessary in
! 	19.29 with font-lock-defaults.
! 	(nroff-font-lock-keywords): New variable.
! 	(nroff-mode): Install nroff syntax table and font lock keywords.
! 	Comment about comments in filling and line-counting.
  
! Tue Jul 18 14:47:21 1995  Andre Spiegel  <spiegel@berlin.informatik.uni-stuttgart.de>
  
! 	* vc.el (vc-do-command): Added parameter BUFFER (the default,
! 	if nil, is *vc*). Updated all callers.
! 	(vc-next-action-on-file, vc-diff, vc-version-diff, vc-backend-diff):
! 	Use buffer *vc-diff* for diff output instead of *vc*.
  
! 	* vc-hooks.el (vc-mode-line, vc-find-file-hook): Moved the test for
! 	version-controlled symbolic link from the former to the latter.
  
! 	* files.el (file-name-sans-versions):
! 	Recognize version control version numbers.
  
! Tue Jul 18 12:37:47 1995  Mike Williams  <mikew@gopher.dosli.govt.nz>
  
! 	* mouse-sel.el:	Don't (require 'backquote).
  
! 	* mouse-sel.el (mouse-extend-internal): Select space in between
! 	"things" when extending selection, ie. we are extending to
! 	"thing" boundaries.
  
! 	* mouse-sel.el:	Use x-lost-selection-hooks to handle loss of selection.
! 	(mouse-sel-lost-selection-hook): New function.
! 	(mouse-sel-selection-owner-p-function): Variable removed.
! 	(mouse-sel-selection-owner-p): Function removed.
! 	(mouse-sel-validate-selection): Function removed.
  
! 	* thingatpt.el (forward-same-syntax): New function.
  
! Sun Jul 16 14:31:08 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* appt.el: Add provide.
  
! Sat Jul 15 11:41:42 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* byte-opt.el (byte-optimize-if): Optimize (if (not foo) nil ...).
  
! 	* add-log.el (add-log-current-defun): Handle C struct definitions.
! 	(add-change-log-entry): Use case-sensitive search for file name.
! 	Find first blank line correctly.
  
! Fri Jul 14 15:12:07 1995  Karl Fogel  <kfogel@floss.cyclic.com>
  
! 	* bookmark.el (bookmark-make): Strip text properties off name.
! 	(bookmark-make-cell): Use `buffer-substring-no-properties'.
  
! Fri Jul 14 03:38:32 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* bytecomp.el (byte-compile-output-file-form): Bind print-length
! 	and print-level to nil.
  
! Thu Jul 13 21:02:01 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* mouse.el (mouse-major-mode-menu): Catch quit in read-key-sequence.
  
! Wed Jul 12 20:25:29 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* bookmark.el (bookmark-yank-word): Use buffer-substring-no-properties.
  
! Thu Jul 13 11:25:21 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* files.el (auto-mode-alist): Move .scm.[0-9] before nroff-mode.
! 	Escape the second period.
  
! Wed Jul 12 19:22:59 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* dabbrev.el (dabbrev--search): Don't let spurious match in middle
! 	of word obscure real match at start of same word.
  
! 	* term/x-win.el (vendor-specific-keysyms):
! 	In Sun keys, f36 was misnamed f35 and f37 misnamed f36.
  
! 	* fill.el (canonically-space-region): Doc fix.
  
! 	* menu-bar.el (menu-bar-help-menu): Add finder-by-keyword.
  
! 	* ediff-wind.el (ediff-skip-unsuitable-frames): Use make-frame,
! 	not ediff-make-frame.
  
! Wed Jul 12 23:10:46 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* paths.el (remote-shell-program): Try rcmd also.
  
! Tue Jul 11 10:39:52 1995  Andre Spiegel  <spiegel@berlin.informatik.uni-stuttgart.de>
  
! 	* vc-hooks.el (vc-mode-line): Don't write-protect a
! 	VC-Log buffer.  Better mode line text for initial comments.
! 	Streamlined the function.
  
! Mon Jul 10 02:59:13 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* faces.el (x-create-frame-with-faces): Set background-mode
! 	and display-type frame parameters.
  
! 	* mouse.el (mouse-major-mode-menu): Don't call command-execute
! 	if lookup-key gives nil.
  
! 	* byte-opt.el (byte-optimize-nth, byte-optimize-nthcdr):
! 	Do nothing if form wrong length.
! 	(byte-optimize-multiply): Fix bug in 0 case.
! 	(byte-optimize-divide): Optimize (/ CONST CONST) if safe.
  
! Sun Jul  9 03:14:03 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* fill.el (fill-region-as-paragraph): In adaptive-fill-mode,
! 	if paragraph has one line, take the fill prefix from it.
! 	(adaptive-fill-regexp): Doc fix.
  
! 	* startup.el (normal-top-level): Don't use mail-host-address
! 	for auto-save-list-file-name.
  
! 	* sendmail.el (mail-setup-hook): New defvar.
! 	(mail): Doc fix.
  
! Thu Jul  6 14:21:50 1995  Francesco Potorti`  <pot@cnuce.cnr.it>
  
! 	* simple.el (shell-command): Use save-match-data.
! 	Put the buffer in shell mode, don't use shell-command-filter.
! 	(shell-command-filter): Deleted.
! 	(shell-command-sentinel): Don't reset the mode line.
! 	Don't test the buffer name--what was that for, anyway?.
  
! Thu Jul  6 10:04:10 1995  Andre Spiegel  <spiegel@berlin.informatik.uni-stuttgart.de>
  
! 	* vc.el (vc-backend-merge-news): Force to refetch the
! 	properties after the merge.
  
! 	* vc-hooks.el (vc-locking-user): Consider a cvs file "locked"
! 	if its status is either 'locally-modified or 'needs-merge.
! 	(vc-workfile-version): Catch 'found when calling vc-find-cvs-master.
! 	(vc-fetch-master-properties): Handle cvs status "Needs Checkout".
! 	This is intended for future use.
  
! Thu Jul  6 04:14:54 1995  Richard Stallman  <rms@whiz-bang.frob.com>
  
! 	* byte-opt.el (byte-optimize-logmumble): Fix (logior -1 ...) case.
  
! 	* cc-mode.el (c-set-style-1): Copy c-offsets-alist if nec.
  
! Wed Jul  5 08:00:09 1995  Richard Stallman  <rms@whiz-bang.frob.com>
  
! 	* faces.el (x-frob-font-slant, x-frob-font-weight):
! 	Replace the adstyle field with *, if we can find it.
  
! 	* find-file.el (ff-set-point-accordingly): Doc fix.
  
! 	* vc-hooks.el (vc-fetch-master-properties): Shrink the window
! 	that displays the error message.
  
! 	* faces.el (set-face-background): Use face-color-supported-p.
  
! Tue Jul  4 15:38:12 1995  Ralf Fassel  <ralf@prl.philips.nl>
  
! 	* fill.el (fill-individual-paragraphs): Use `adaptive-fill-regexp'
! 	to determine `fill-prefix' if `adaptive-fill-mode' is non-nil.
  
! Tue Jul  4 01:22:44 1995  Richard Stallman  <rms@whiz-bang.frob.com>
  
! 	* cc-mode.el (c-common-init): Copy c-offsets-alist.
  
! Sun Jul  2 12:32:38 1995  Richard Stallman  <rms@whiz-bang.frob.com>
  
! 	* ebuff-menu.el (electric-buffer-list): Save point before
! 	finding the first buffer line, and use that saved point to
! 	determine the buffer to use, if it is a reasonable value.
  
! 	* faces.el (face-color-gray-p): New function.
! 	(face-default-stipple): New variable.
! 	(set-face-background): Use face-default-stipple for all grays.
! 	(set-face-stipple): Change arg name.
! 	(face-color-supported-p): Use face-color-gray-p.
  
! 	* simple.el (column-number-mode): New variable and new command.
! 	* loaddefs.el (mode-line-format): Use column-number-mode.
  
! Mon Jul 17 16:14:39 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* sh-script.el (interpreter-mode-alist): Delete autoload cookie.
! 	* executable.el (interpreter-mode-alist): Delete autoload cookie.
  
! Wed Jul 12 15:14:12 1995  Karl Heuer  <kwzh@kropotkin.gnu.ai.mit.edu>
  
! 	* comint.el (comint-kill-output): Preserve entire partial line at
! 	end, even if it doesn't match comint-prompt-regexp.
  
! Wed Jul 12 13:22:20 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* copyright.el: Fixed Author: comment.  This code bears no
! 	relation to what I wrote.
  
! Sun Jul  9 07:41:19 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
  
! 	* font-lock.el: Moved font-lock-doc-string-face to bytecomp.el.
! 	(font-lock-fontify-region): Do all cleanups inside unwind-protect.
! 	(font-lock-hack-keywords): Likewise.
! 	(font-lock-choose-keywords): Don't eval here.
! 	(font-lock-set-defaults): Do it here and compile too.
  
! 	* bytecomp.el: Make executing-macro, before-change-function,
! 	after-change-function and font-lock-doc-string-face obsolete.
  
! 	* version.el: Do a purecopy of emacs-version for UN*X's what command.
  
! Sat Jul  8 09:17:23 1995  Johan Vromans  <jvromans@hill.gnu.ai.mit.edu>
  
! 	* forms.el (forms-mode): Treat local-write-file-hooks as a list.
  
! Fri Jul  7 18:09:41 1995  Francesco Potorti`  <pot@cnuce.cnr.it>
  
! 	* mailalias.el (build-mail-aliases): Fixed the regexp for "^group".
  
! Fri Jul  7 14:43:05 1995  Daniel Pfeiffer  <Daniel.Pfeiffer@Informatik.START.dbp.de>
  
! 	* apropos.el: Restructured, largely rewritten and extended.
! 	(apropos-use-faces, apropos-local-map): New variables.
! 	(apropos-command): New name for `command-apropos' no longer in help.el.
! 	(apropos-value): New command.
! 	(apropos-documentation): New name for `super-apropos'
! 	(apropos-follow, apropos-mouse-follow): New commands for hypertext.
! 	(apropos-describe-plist): New function.
  
! 	* help.el: (command-apropos): Deleted function.  This is replaced by
! 	apropos-command in apropos.el.
  
! 	* autoload.el: (make-autoload): Generate `(autoload ...)' form for
! 	`(define-skeleton ...)'
  
! 	* skeleton.el: partly rewritten and extended.
! 	(skeleton-filter, skeleton-untabify, skeleton-further-elements)
! 	(skeleton-abbrev-cleanup): New variables
! 	(skeleton-proxy, skeleton-abbrev-cleanup): New functions
! 	(skeleton-insert): Sublanguage element < must now be handled via
! 	`skeleton-further-elements' (used only in sh-script and ada).  Lisp
! 	expressions can be quoted to ignore the return value.
! 	(skeleton-read): New name for `skeleton-internal-read' because this may
! 	be useful in skeletons.
! 	(local-variables-section): New skeleton command, might go to simple.el.
  
! 	* autoinsert.el: extended to use skeletons or call functions
! 	(auto-insert, auto-insert-query, auto-insert-prompt): New variables
! 	(auto-insert-alist): New features
! 	(auto-insert): New name for `insert-auto-insert-files'
! 	(define-auto-insert): New function
  
! 	* copyright.el: New name for generalized upd-copyr.el
! 	(copyright-limit, copyright-regexp): New variables
! 	(copyright-query): New name for `inhibit-update-copyright'
! 	(copyright-current-year): New name for `current-year'
! 	(copyright-current-gpl-version): New name for `current-gpl-version'
! 	(copyright-update): New name for `update-copyright' and
! 	`ask-to-update-copyright'
! 	(copyright): New skeleton command
  
! 	* executable.el: New file extracted and optimized from sh-script.el
  
! 	* sh-script.el: restructured, largely rewritten without the bugs and
! 	extended to cover over 15 shells.  Most variables can now work as a
! 	lookup table, and, unless set by user, do.
! 	(sh-mode-syntax-table): Possibly multiple tables.
! 	(sh-shell): Set initially so shell or other libraries may use features.
! 	(sh-assignment-regexp): Replaces `sh-assignment-space'.
! 	(sh-here-document-word): Set to more common "EOF".
! 	(sh-variables): Changed semantics.
! 	(sh-font-lock-keywords): Much nicer.
! 	(sh-ancestor-alist, sh-alias-alist, sh-shells, sh-abbrevs)
! 	(sh-dynamic-complete-functions, sh-require-final-newline)
! 	(sh-comment-prefix, sh-indentation, sh-header-marker, sh-builtins)
! 	(sh-leading-keywords): New variables.
! 	(sh-use-prefix, sh-find-file-modifies, sh-query-for-magic)
! 	(sh-magicless-file-regexp, magic-number-alist, sh-executable)
! 	(sh-chmod-argument, sh-shell-is-csh, sh-tab-width)
! 	(sh-sh-font-lock-keywords, sh-ksh-font-lock-keywords)
! 	(sh-bash-font-lock-keywords, sh-csh-font-lock-keywords)
! 	(sh-tcsh-font-lock-keywords): Variables deleted, see also executable.el.
  
! 	(sh-mode): Shell dependent code moved to `sh-set-shell'.
! 	(sh-feature, sh-abbrevs, sh-syntax-table, sh-append, sh-modify): New
! 	functions.
! 	(sh-execute-region): New command.
! 	(sh-indexed-loop): Far more efficient code generated for sh.
! 	(sh-repeat, sh-tmp-file, sh-while-getopts): New skeletons.
! 	(sh-or-other-mode, define-sh-skeleton, sh-executable, sh-chmod)
! 	(sh-query-for-variable): Command deleted.
  
! 	* two-column.el: Symbols renamed to be like mode-line indicator.
! 	Supposed to now also work for Lucid.
! 	(2C-mode-map): New name for `tc-mode-map'.  Additionally bound to [f2].
! 	(2C-minor-mode-map) New variable.
! 	(2C-mode): New name for `tc-other'.
! 	(2C-mode-line-format): New name for `tc-mode-line-format'.
! 	(2C-other-buffer-hook): New variable.
! 	(2C-separator): New name for `tc-separator'.
! 	(2C-window-width): New name for `tc-window-width'.
! 	(2C-beyond-fill-column): New name for `tc-beyond-fill-column'.
! 	(2C-autoscroll, 2C-autoscroll-start): New variables.
  
! 	(2C-other): New name for `tc-other'.
! 	(2C-mode): New name for `tc-mode', `tc-two-columns'.
! 	(2C-two-columns): New function.
! 	(2C-associate-buffer): New name for `tc-associate-buffer'.
! 	(2C-split): New name for `tc-split'.
! 	(2C-dissociate): New name for `tc-dissociate'.
! 	(2C-merge): New name for `tc-merge'.
! 	(2C-associated-buffer): New name for `tc-associated-buffer'.
! 	(2C-toggle-autoscroll, 2C-autoscroll): New functions.
! 	(tc-scroll-line, tc-scroll-up, tc-scroll-down, tc-recenter): Deleted
! 	functions.
  
! Thu Jul  6 14:16:18 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* timezone.el (timezone-parse-date): Ignore text properties.
  
! 	* find-dired.el (find-dired): Undefine the g command.
  
! Sun Jul  2 04:13:00 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* bytecomp.el (byte-compile-obsolete): Do the funcall to compile
! 	the form whether or not we warn.
  
! 	* c-mode.el (calculate-c-indent-after-brace): New function.
! 	(calculate-c-indent, indent-c-exp): Use it.
  
! 	* faces.el (x-font-regexp): Include the avgwidth.
  
! 	* iso-transl.el (iso-transl-char-map): Treat m, *m like u and *u.
  
! Sat Jul  1 01:39:19 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* subr.el (shell-quote-argument): Don't do anything, on MS-DOS.
  
! 	* sendmail.el (mail-default-reply-to): Initialize to nil.
! 	(mail-setup): Override it from env var if nil.
  
! 	* talk.el (talk-disconnect): Make it interactive.
! 	(talk-add-display): Ignore dead buffers and deleted frames.
  
! 	* font-lock.el (font-lock-make-faces): On grayscale screen,
! 	use grays for background, not foreground.
  
! 	* faces.el (describe-face): new function.
  
! Fri Jun 30 09:10:07 1995  Andre Spiegel  <spiegel@berlin.informatik.uni-stuttgart.de>
  
! 	* vc-hooks.el (vc-fetch-master-properties): Better error
! 	message in case the "cvs status" command fails.
  
! Fri Jun 30 16:27:02 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* man.el (Man-underline-face): Doc fix.
  
! 	* mailalias.el (define-mail-alias): Doc fix.
  
! Fri Jun 30 19:07:05 1995  Paul Eggert  <eggert@twinsun.com>
  
! 	* sendmail.el (sendmail-send-it): If mail-from-style is parens,
!  	don't escape all parentheses; escape only the nonmatching ones.
  
! 	* sendmail.el (sendmail-send-it): If user-full-name contains
! 	special characters, quote or escape them for the From: line.
  
! Fri Jun 30 01:12:40 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* rmail.el (rmail-find-all-files): Bind case-fold-search.
  
! 	* term/x-win.el (x-colors): Doc fix.
  
! Fri Jun 30 00:13:38 1995  Kevin Rodgers <kevinr@ihs.com>
  
! 	* mailabbrev.el (mail-resolve-all-aliases-1):
! 	Downcase address before recursive call.
  
! Thu Jun 29 18:07:10 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* time.el (display-time-filter): Move run-hooks inside let.
  
! 	* simple.el (switch-to-completions): Make a completions window if none.
  
! 	* mouse.el (mouse-selection-click-count-buffer): New variable.
! 	(mouse-drag-region): Set it.
! 	(mouse-save-then-kill): Test it.
  
! Thu Jun 29 17:28:26 1995  David M Smith  <D.M.Smith@lancaster.ac.uk>
  
! 	* ielm.el (ielm-font-lock-keywords): New variable
! 	(inferior-emacs-lisp-mode): Use it for font-lock support
  
! Thu Jun 29 13:42:46 1995  Bryan O'Sullivan  <bos@Eng.Sun.COM>
  
! 	* ange-ftp.el (ange-ftp-normal-login): if ange-ftp-smart-gateway
!  	is set but ange-ftp-gateway-host is nil, use user@host
!  	proxy protocol.
  
! Thu Jun 29 10:51:47 1995  Morten Welinder  <terra+@cs.cmu.edu>
  
! 	* arc-mode.el (archive-mode): Add autoload cookie.
  
! 	* files.el (auto-mode-alist): Make archive-mode the default for
! 	.arc, .lzh, .zip, and .zoo files.
  
! Thu Jun 29 14:48:25 1995  Karl Fogel  (kfogel@wombat.gnu.ai.mit.edu)
  
! 	* bookmark.el: use "Save" and "Save As" instead of the nonstandard
! 	"Save" and "Write", in menu item titles.
  
! Thu Jun 29 00:35:53 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* menu-bar.el (find-tag): Delete the menu-enable property.
  
! 	* info.el (Info-goto-node, Info-search):
! 	In Transient Mark mode, deactivate the mark.
  
! 	* faces.el (make-face-x-resource-internal): Give special meanings
! 	to font "names" `italic', `bold', and `bold-italic'.
  
! 	* rmail.el (rmail-summary-by-sender): Autoload this.
! 	(rmail-mode-map): Add rmail-summary-by-senders.
  
! Wed Jun 28 06:01:36 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* fill.el (current-fill-column): If fill-column is nil, return nil.
! 	* simple.el (do-auto-fill): No-op if (current-fill-column) is nil.
  
! 	* loadup.el: Put isearch before menu-bar.
  
! 	* loaddefs.el: Don't set up key-translation-map.
  
! 	* help-macro.el (make-help-screen): Handle help-event-list.
! 	Handle backspace like delete.
! 	* help.el: Bind f1 and help like C-h.
  
! 	* supercite.el (sc-electric-mode-map): Bind f1 and help like C-h.
! 	* ediff-util.el (ediff-setup-keymap): Bind f1 and help like C-h.
! 	* edt.el (edt-setup-default-bindings): Bind f1 and help like C-h.
  
! 	* cplus-md.el (electric-c++-terminator): Fix logic for handling colon.
  
! 	* menu-bar.el: Make more menu-enables check (not buffer-read-only).
! 	Add minibuffer local menu bar menus.
  
! 	* startup.el: Update copyright year in message.
  
! 	* server.el (server-process-filter): Detect error messages from server.
  
! Tue Jun 27 18:58:43 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* edt.el (edt-emulation-on): Check window-system for x, specifically.
  
! Tue Jun 27 12:23:58 1995  Andre Spiegel  <spiegel@berlin.informatik.uni-stuttgart.de>
  
! 	* vc-hooks.el (vc-consult-rcs-headers): Use an even more
! 	pedantic regexp to match RCS time strings.  Improved
! 	efficiency by using looking-at instead of re-search "\\=...
  
! Tue Jun 27 02:51:17 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* ediff-wind.el (ediff-control-frame-parameters):
! 	Specify user-position.
  
! 	* imenu.el (imenu-choose-buffer-index): Understand that (menu-bar)
! 	doesn't specify a window.
  
! 	* startup.el (command-line): Extract arg value properly for -u.
  
! 	* subr.el (lambda): Doc fix.
  
! Mon Jun 26 15:40:39 1995  Ake Stenhoff  <etxaksf@aom.ericsson.se>
  
! 	* imenu.el (imenu-use-keymap-menu): New variable.
! 	(imenu-auto-rescan): New variable.
! 	(imenu-auto-rescan-maxout): New variable.
! 	(imenu-generic-expression): Doc changes.
! 	(imenu-generic-lisp-expression): New variable.
! 	(imenu-generic-c-expression): New variable.
! 	(imenu-example--generic-c++-expression): Changed the name to
! 	imenu-generic-c++-expression.
! 	(imenu-example--generic-texinfo-expression): Changed the name to
! 	imenu-generic-texinfo-expression.
! 	(imenu-example--generic-latex-expression): Changed the name to
! 	imenu-generic-latex-expression.
! 	(imenu--scanning-method-alist): New variable.
! 	(imenu--split-menu): Changed it to make the title "Index menu"
! 	instead of "Function menus".
! 	(imenu--make-index-alist): Changed to handle auto rescan.
! 	(imenu--create-keymap-2): New function to create a keymap.
! 	(imenu--create-keymap-1): New function.
! 	(imenu--in-alist): New function.
! 	(imenu-default-create-index-function): Changed to handle
! 	imenu--scanning-method-alist).
! 	(imenu--generic-extract-name): Removed.
! 	(imenu--generic-function): Rewritten to handle submenus.
! 	(imenu--mouse-menu): Changed to handle keymaps.
  
! Mon Jun 26 19:19:52 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* paths.el (remote-shell-program): Fix typo checking /usr/bin/remsh.
  
! Mon Jun 26 17:04:23 1995  Eric S. Raymond  <esr@snark.thyrsus.com>
  
! 	* vc.el (vc-start-entry): Prevent lossage when doing a mass checkin
! 	from a VC-dired buffer.
  
! Mon Jun 26 21:05:21 1995  Andre Spiegel  <spiegel@berlin.informatik.uni-stuttgart.de>
  
! 	* vc-hooks.el (vc-consult-rcs-headers): Handle the new time
! 	string formats of RCS 5.7.
  
! Mon Jun 26 13:56:46 1995  Mike Long  <mike.long@analog.com>
  
! 	* view.el (view-file-other-window): Re-add missing argument to
! 	switch-buffer-other-window.
! 	(view-mode-map): Leave C-c alone!
! 	(view-mode): Doc fix.
  
! Mon Jun 26 07:55:44 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
  
! 	* font-lock.el (font-lock-defaults-alist): List all keywords for C and
! 	Emacs Lisp modes.  Doc fix.
! 	(font-lock-maximum-decoration): Doc fix.
! 	(font-lock-choose-keywords): New function.  Use them.
! 	(font-lock-set-defaults): Use it.  Doc fix.
! 	(lisp-font-lock-keywords): Default to lisp-font-lock-keywords-1.
! 	(c-font-lock-keywords): Default to c-font-lock-keywords-1.
! 	(c++-font-lock-keywords): Default to c++-font-lock-keywords-1.
  
! 	* fortran.el (fortran-mode): List all keywords for font-lock-defaults.
! 	(fortran-font-lock-keywords): Default to fortran-font-lock-keywords-1.
  
! Sat Jun 24 17:58:51 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* rmail.el (rmail-revert): Use the default revert-buffer-function
  
! 	* simple.el (newline): Put point at right place if insert gets error.
  
! Sat Jun 24 00:43:32 1995  Karl Fogel  <kfogel@floss.cyclic.com>
  
! 	* mail-hist.el (mail-hist-text-size-limit): New var.
! 	(mail-hist-text-too-long-p): New func.
! 	(mail-hist-add-header-contents-to-ring): call above; if the text is
! 	too long, then store the empty string in the history.
  
! Sat Jun 24 00:17:08 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* pc-mode.el (pc-bindings-mode): Add autoload.
  
! 	* enriched.el (excerpt): Ignore error making `excerpt' italic.
  
! Fri Jun 23 23:39:14 1995  Tom Tromey  <tromey@drip.colorado.edu>
  
! 	* makefile.el (makefile-define-tab-face): New function.
! 	(makefile-tab-face): Don't create face here.
! 	(makefile-mode): Call makefile-define-tab-face.
  
! Fri Jun 23 18:11:26 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* cc-mode.el (c-mode): Delete autoload cookie.
  
! 	* mail-hist.el: Don't autoload anything to turn on mail-hist.
! 	(mail-hist-enable): New function, autoloaded.
  
! Fri Jun 23 11:21:18 1995  Andre Spiegel  <spiegel@berlin.informatik.uni-stuttgart.de>
  
! 	* vc-hooks.el: Fix bug concerning vc-latest-version.
! 	Accessing that property left erroneous contents in the
! 	*vc-info* buffer, which could later be misinterpreted by
! 	other functions.
! 	(vc-insert-file): Erase the current buffer before inserting the file.
! 	(vc-fetch-master-properties, vc-fetch-properties): Don't erase the
! 	buffer because that is now done in vc-insert-file.
! 	(vc-fetch-properties): Kill the *vc-info* buffer when done.
  
! Fri Jun 23 01:52:12 1995  Paul Eggert  <eggert@twinsun.com>
  
! 	* vc.el (vc-backend-admin, vc-backend-checkin): Assume that
! 	comments are empty if they contain only white space.
  
! Thu Jun 22 13:50:29 1995  Andre Spiegel  <spiegel@berlin.informatik.uni-stuttgart.de>
  
! 	* vc-hooks.el (vc-fetch-master-properties): Pass an absolute
! 	pathname to the cvs status command. This is required to make
! 	recursive vc-directory listings work.
  
! Thu Jun 22 11:59:49 1995  Ethan Bradford  <ethanb@phys.washington.edu>
  
! 	* vt-control.el (vt-keypad-on, vt-keypad-off): Updated codes sent
!  	to terminal to eliminate some garbage that made NCSA telnet crash.
  
! Thu Jun 22 00:36:05 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* vip.el (vip-push-mark-silent): Use (mark t).
  
! 	* mouse.el (mouse-yank-at-click): Clear mouse-selection-click-count.
  
! Wed Jun 21 19:03:13 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* files.el (buffer-file-truename): Duplicate definition deleted.
  
! 	* simple.el (mark-even-if-inactive): Duplicate definition deleted.
  
! 	* lisp-mode.el (eval-defun): Don't change defvar to defconst
! 	if it has just one argument.
  
! See ChangeLog.5 for earlier changes.
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/ChangeLog.5 emacs-19.31/lisp/ChangeLog.5
*** emacs-19.30/lisp/ChangeLog.5	Wed Dec 31 19:00:00 1969
--- emacs-19.31/lisp/ChangeLog.5	Fri Jan  5 02:24:41 1996
***************
*** 0 ****
--- 1,9267 ----
+ Wed Jun 21 14:26:10 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* Version 19.29 released.
+ 
+ 	* startup.el (precompute-menubar-bindings): While dumping,
+ 	garbage-collect after each menu.
+ 
+ Tue Jun 20 09:54:02 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* gud.el (gud-make-debug-menu): Cope if no local map yet.
+ 
+ 	* loaddefs.el (help-event-list): Initialize it.
+ 
+ 	* dired-aux.el (dired-do-redisplay): Call dired-uncache.
+ 
+ 	* simple.el (universal-argument-num-events): New variable.
+ 	(universal-argument, universal-argument-more, negative-argument)
+ 	(digit-argument): Set that variable.
+ 	(universal-argument-other-key): Use that variable when unreading.
+ 
+ 	* vc-hooks.el (vc-handle-cvs): New variable.
+ 	(vc-find-cvs-master): Check that variable.
+ 
+ Mon Jun 19 21:07:03 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* vc-hooks.el (vc-fetch-properties): Add save-excursion.
+ 
+ 	* cc-mode.el: Version 4.222 installed.  Changes too much to list.
+ 	Kept these changes previously installed here:
+ 	(c-version): Mention that this may be modified version.
+ 	(c-common-init, c-fill-paragraph): Remove "^" used as anchor from
+ 	paragraph-start and paragraph-separate values, so that they will
+ 	work with non-0 left-margin settings.
+ 
+ 	* vc-hooks.el (vc-fetch-master-properties): Be more careful
+ 	about killing the *vc-info* buffer.
+ 
+ Mon Jun 19 18:51:08 1995  Karl Heuer  <kwzh@hill.gnu.ai.mit.edu>
+ 
+ 	* shell.el (shell-directory-tracker): Check for terminator after
+ 	cd, pushd, or popd, so that we don't try to do directory tracking
+ 	on things like "cdump".
+ 	Don't use \\s patterns inside brackets.
+ 
+ Mon Jun 19 16:27:34 1995  David K}gedal  <davidk@lysator.liu.se>
+ 
+ 	* tempo.el: Documented the `l' tag.
+ 	(tempo-insert-template): Check for zmacs-regions.
+ 	Wrapped it in unwind-protect.
+ 	(tempo-save-named): New function.
+ 	(tempo-insert-prompt): Added NO-INSERT parameter.
+ 	Handles previous values better.  Cleaned up interface.
+ 	Check for already saved value.
+ 	(tempo-remember-insertion): Function deleted.
+ 	(tempo-insert-named): Use tempo-insert if data is not a string.
+ 	Use tempo-lookup-named.
+ 	(tempo-insert-prompt-compat): New function.
+ 	(tempo-lookup-named): New function.
+ 
+ Mon Jun 19 16:06:24 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* simple.el (universal-argument-other-key):
+ 	Call reset-this-command-lengths.
+ 
+ Mon Jun 19 11:34:38 1995  Ed Reingold  <reingold@albert.gnu.ai.mit.edu>
+ 
+ 	* solar.el (calendar-location-name, sunrise-sunset): Fix bug in
+         determination of output string.
+ 
+ Sun Jun 18 12:44:24 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* simple.el (negative-argument, digit-argument):
+ 	Set overriding-terminal-local-map like C-u.
+ 	(universal-argument-map): Add binding for \e t.
+ 
+ 	* texinfo.el (texinfo-environment-regexp): Add @ifhtml, @html.
+ 
+ Sun Jun 18 12:08:17 1995  Morten Welinder  <terra+@cs.cmu.edu>
+ 
+ 	* arc-mode.el (archive-zip-summarize): Handle per-file
+ 	comments in central directory.
+ 
+ Sun Jun 18 10:45:30 1995  Johan Vromans  <jvromans@hill.gnu.ai.mit.edu>
+ 
+ 	* forms.el: Remove references to mouse-major-mode-menu.
+ 
+ Sun Jun 18 10:13:17 1995  Andre Spiegel  <spiegel@berlin.informatik.uni-stuttgart.de>
+ 
+ 	* vc-hooks.el (vc-fetch-master-properties): Use path-separator
+ 	for path to "cvs status" command.
+ 
+ Sat Jun 17 21:24:28 1995  Karl Fogel  <kfogel@floss.cyclic.com>
+ 
+ 	* bookmark.el: Make doc strings and argument names consistent
+ 	where necessary.
+ 	Moved user variables to own section.
+ 	(bookmark-alist): Better doc string.
+ 	(bookmark-insert-current-bookmark): Doc string.
+ 	(bookmark-insert-buffer-name): Doc string.
+ 	(bookmark-set): Take optional NAME argument.
+ 	(bookmark-bmenu-select): Use member to test for string's presence.
+ 	Use a more efficent test at end, as suggested by Mikio Nakajima.
+ 
+ Sat Jun 17 11:20:25 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* startup.el (normal-top-level, command-line-1):
+ 	Call precompute-menubar-bindings only if using x.
+ 	(precompute-menubar-bindings): Don't check for x here.
+ 	Set define-key-rebound-commands to t.
+ 
+ 	* loadup.el: Call precompute-menubar-bindings.
+ 	Then set define-key-rebound-commands to nil.
+ 
+ 	* subr.el (add-hook): Use local local-variable-if-set-p.
+ 
+ 	* info.el (Info-directory-list): If path-separator isn't available,
+ 	bind it here.
+ 
+ 	* vc.el (vc-do-command): Use path-separator.
+ 
+ Sat Jun 17 16:18:18 1995  Andre Spiegel  <spiegel@berlin.informatik.uni-stuttgart.de>
+ 
+ 	* vc.el (vc-directory): Use expand-file-name on default-directory.
+ 	(vc-directory-exclusion-list): Add "CVS" to this list.
+ 
+ Sat Jun 17 02:33:21 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* ediff.el: Fixed bogus references to menu-bar-file-menu in
+  	define-key forms.
+ 
+ Fri Jun 16 18:24:06 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* isearch.el (isearch-mode-map): Bind frame events to nil.
+ 
+ Fri Jun 16 19:38:19 1995  Andre Spiegel <spiegel@berlin.informatik.uni-stuttgart.de>
+ 
+ 	* vc-hooks.el (vc-fetch-properties): Don't use
+ 	vc-backend-dispatch, as that is in vc.el.
+ 
+ 	* vc.el (vc-register): Inhibit backups for the file's buffer
+ 
+ 	* vc.el (vc-add-triple, vc-lookup-triple, vc-record-rename):
+ 	Use absolute file names to access the SCCS named configuration files
+ 	("VC-names").
+ 
+ 	* vc-hooks.el (vc-consult-rcs-headers): Fix typo in prev change.
+ 
+ 	* vc-hooks.el (vc-find-cvs-master): Exit gracefully when not
+ 	finding CVS/Repository.
+ 
+ 	* vc.el (vc-lookup-triple): Call vc-parse-buffer instead of
+ 	vc-master-info.
+ 
+ 	* vc.el (vc-retrieve-snapshot): Use vc-checkout instead of
+ 	vc-backend-checkout, as the former also updates the current buffer.
+ 	(vc-file-tree-walk, vc-file-tree-walk-internal): Use
+ 	expand-file-name, so that FUNC gets called with an unabbreviated name.
+ 
+ Fri Jun 16 09:09:09 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* ispell.el: Reinstalled autoloads from ispell-dictionary-alist,
+ 	ispell-menu-map, ispell-menu-lucid, and ispell-menu-map-needed.
+ 
+ 	* vc.el (vc-backend-dispatch): Move definition before first use.
+ 
+ Fri Jun 16 03:38:49 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
+ 
+ 	* c-mode.el (c-mode-map): Put mark-active for menu-enable property on
+ 	comment-region, c-macro-expand and c-backslash-region symbols.
+ 
+ 	* facemenu.el (facemenu-menu): Change name to Special Properties.
+ 
+ 	* font-lock.el (font-lock-make-faces): Optional arg OVERRIDE.
+ 	Make faces, and their face variables, only if they don't exist already.
+ 	(font-lock-make-faces-done): Removed.
+ 	(font-lock-set-defaults): Don't set it.
+ 
+ Fri Jun 16 02:08:48 1995  Karl Heuer  <kwzh@hill.gnu.ai.mit.edu>
+ 
+ 	* simple.el (universal-argument-map): New var.
+ 	(universal-argument, negative-argument, digit-argument):
+ 	Use overriding-terminal-local-map.
+ 	(prefix-arg-internal, describe-arg): Functions deleted.
+ 	(universal-argument-more, universal-argument-minus): New functions.
+ 	(universal-argument-other-key): New function.
+ 
+ 	* isearch.el (isearch-mode): Use overriding-terminal-local-map.
+ 	(isearch-done): Likewise.
+ 
+ Thu Jun 15 08:24:03 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* ispell.el: Removed autoload from ispell-dictionary-alist,
+ 	ispell-menu-map, ispell-menu-lucid, and ispell-menu-map-needed
+ 	so users can more easily modify and upgrade entries.
+ 	(ispell-dictionary-alist): Once more a single variable.
+ 	(ispell-required-version): Documentation changes
+ 	(ispell-skip-sgml): Documentation changes
+ 	(ispell-command-loop): mode-line-format now shows misspelled word.
+ 	(ispell-message-text-end): Can now process postscript version 1.
+ 	(ispell-message-start-skip): New variable for block skips, set up for
+ 	pgp and forward blocks.
+ 	(ispell-message-end-skip): New variable for block skips, set up for
+ 	pgp and forward blocks.
+ 	(ispell-message): Added	block message skipping.
+ 	(ispell-buffer-local-parsing): Added html-mode.
+ 
+ 	* mouse.el (mouse-set-region): Bind last-command with this-command.
+ 
+ 	* winnt.el (grep-null-device): Set this instead of null-device.
+ 
+ 	* dos-fns.el (path-separator, grep-null-device, grep-regexp-alist):
+ 	Set them, as in winnt.el.
+ 
+ 	* compile.el (grep-null-device): Renamed from null-device.
+ 
+ 	* vc-hooks.el (vc-fetch-master-properties): For RCS file,
+ 	don't look for vc-latest-version and vc-your-latest-version here.
+ 	Read only through ^locks unless we need to find the tip of a branch.
+ 	(vc-consult-rcs-headers): Use non-regexp search to find the headers.
+ 	(vc-latest-version, vc-your-latest-version): Use vc-fetch-properties.
+ 	(vc-fetch-properties): New function.
+ 
+ 	* buff-menu.el (list-buffers-noselect): Don't let space after buf name
+ 	inherit the text props from it.
+ 
+ 	* subr.el (make-local-hook): Doc fix.
+ 
+ Thu Jun 15 08:24:03 1995  Andre Spiegel  <spiegel@bruessel.informatik.uni-stuttgart.de>
+ 
+ 	* vc-hooks.el: The RCS status is now found by reading the
+ 	master file directly, instead of using rlog.  The properties
+ 	retrieved from the master file are kept separately.  The two
+ 	main properties, `vc-workfile-version' and `vc-locking-user',
+ 	are inferred from those master file properties if the
+ 	information cannot be found elsehow.  All properties are
+         consistently cached now.
+ 
+ 	Reordered some defuns so they are grouped in a logical way.
+ 
+ 	(vc-master-info, vc-log-info, vc-fetch-properties): Functions
+ 	removed.  Their job is now done by `vc-fetch-master-properties'
+ 	and `vc-insert-file'.
+ 
+ 	(vc-fetch-master-properties): New function.
+ 	(vc-insert-file): New function.
+ 	(vc-parse-locks): New function.
+ 	(vc-locked-version): Property no longer set.
+ 	(vc-head-version, vc-default-branch, vc-master-locks): New properties.
+ 	(vc-top-version): New name for the old property `vc-branch-version'.
+ 
+ 	(vc-master-locking-user): Replaces `vc-true-locking-user'.
+ 
+ 	(vc-locking-user): Slightly changed to use the new properties.
+ 	Changed the actual property value for an unlocked file to
+ 	'none.  This is to distinguish it from an unknown locking
+ 	state, which is represented by nil.  The function vc-locking-user
+ 	returns nil if the property is 'none, to make it compatible with
+ 	the rest of VC.
+ 
+ 	(vc-consult-rcs-headers, vc-master-locking-user): Adapted to
+ 	the new 'none-value of vc-locking-user.
+ 
+ 	(vc-consult-rcs-headers): Fixed bug that prevented
+ 	(not vc-consult-headers) from working
+ 
+ 	(vc-file-not-found-hook): Set the default-directory of the new
+ 	buffer before check-out.
+ 
+ 	* vc.el: Adapt to the changes in vc-hooks.el, namely, the new
+ 	'none-value of vc-locking-user, and the consistent caching
+ 	of all properties.  Especially, make the properties survive
+         check-ins and check-outs.  Various minor bug fixes.
+ 
+ 	(vc-file-clear-masterprops): New function.
+ 
+ 	(vc-backend-checkin, vc-backend-revert): Set vc-locking-user
+ 	to 'none if the file is unlocked.
+ 
+ 	(vc-backend-checkin, vc-backend-revert, vc-backend-checkout):
+ 	Use vc-file-clear-masterprops, and adjust those properties
+ 	that are not cleared.
+ 
+ 	(vc-resynch-window):  Temporarily remove vc-find-file-hook, so
+ 	that we don't lose the file properties during check-in/out.
+ 
+ 	(vc-resynch-window): Do not try to delete the current window if
+ 	`vc-keep-workfiles' is nil (doesn't make sense; killing the
+ 	buffer is enough.)
+ 
+ 	(vc-backend-checkin): Rewrote the code that adjusts the default
+ 	branch and removes any locks that might remain after check-in.
+ 
+ 	(vc-cancel-version): Abort with error message in the CVS case.
+ 	(The error used to be signalled in vc-backend-uncheck, which is
+ 	a little too late.)
+ 
+ 	(vc-minor-revision): Function removed.
+ 
+ Wed Jun 14 22:16:14 1995  Geoff Voelker  <voelker@cs.washington.edu>
+ 
+ 	* subr.el (shell-quote-argument) [WINDOWSNT]: Wrap in quotes only.
+ 
+ 	* compile.el (null-device): Defined.
+ 	(grep): Use null-device.
+ 
+ 	* winnt.el (null-device): Set to "NUL".
+ 	(grep-regexp-alist): Match entries with drive letters.
+ 	(save-to-unix-hook,revert-from-unix-hook): Defined.
+ 	(using-unix-filesystems): Defined.
+ 	(window-frame): Unaliased.
+ 
+ Wed Jun 14 18:27:58 1995  Karl Heuer  <kwzh@churchy.gnu.ai.mit.edu>
+ 
+ 	* simple.el (universal-argument, describe-arg): Restore Lisp code,
+ 	undoing Feb 28 change.
+ 	(prefix-arg-internal, digit-argument, negative-argument): Likewise.
+ 
+ Wed Jun 14 12:00:35 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* frame.el (frame-notice-user-settings): When making a minibufferless
+ 	frame, don't copy `name' parm explicitly unless it was explicit before.
+ 
+ Wed Jun 14 11:47:33 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* compile.el (compilation-find-file): If FILENAME is absolute,
+  	apply abbreviate-file-name to it and then use its directory part
+  	as the first search path element, searching for its nondirectory
+  	part.  Fix prompting code not to use a free variable.
+ 	(compilation-parse-errors, compile-abbreviate-directory): Use
+ 	abbreviate-file-name on directories.
+ 
+ Wed Jun 14 21:55:27 1995  Johan Vromans  <jv@NL.net>
+ 
+ 	* forms.el (forms--mode-menu-edit,forms--mode-menu-ro):
+ 	Set `mouse-major-mode-menu'.
+ 
+ Wed Jun 14 10:50:27 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
+ 
+ 	* lisp-mode.el (emacs-lisp-mode-map): Put mark-active for menu-enable
+ 	property on eval-region, comment-region and indent-region symbols.
+ 	(save-selected-window): Define indentation.
+ 
+ Wed Jun 14 07:06:47 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* viper-util.el: Delete the Emacs version error check.
+ 
+ 	* ediff-init.el: Delete the Emacs version error check.
+ 
+ 	* dired.el (dired-change-marks): If OLD is a space,
+ 	don't act on non-file lines.
+ 
+ 	* vc.el (vc-backend-checkin): Provide an explicit string saying
+ 	the log message is empty instead of providing it as empty.
+ 	Always use -m option for ci.
+ 
+ 	* shell.el (shell-mode): Make shell-directory-tracker a hook
+ 	function locally only.
+ 
+ Tue Jun 13 16:38:40 1995  Per Bothner  <bothner@kalessin.cygnus.com>
+ 
+ 	* term.el:  Various optimizations.  The main one is to optimize for
+ 	simple output at the end of the buffer, with no paging, and in that
+ 	case to defer scrolling while we can.
+ 	(term-emulate-terminal):  Don't call term-handle-scroll in
+ 	simple cases unless we are either paging or term-scroll-with-delete.
+ 	(term-down):  Likewise.
+ 	(term-handle-scroll):  Modify accordingly.
+ 	(term-emulate-terminal):  Avoid deleting old text in common case.
+ 	Optimize the simple case of CRLF when we're at buffer end.
+ 	Handle deferred scroll when done processing output.
+ 	(term-handle-deferred-scroll):  New function.
+ 	(term-down):  Simplify - no longer take RIGHT argument.  Tune.
+ 	(term-goto):  Use term-move-columns to compensate for the above.
+ 
+ 	* term.el (term-escape-char, term-set-escape-char):  Add doc-string.
+ 	(term-mouse-paste):  Add xemacs support.
+ 
+ 	* term.el:  Various speed enhencements:
+ 	(term-handle-scroll):  Don't clear term-current-row; maybe adjust it.
+ 	(term-down):  Don't call term-adjust-current-row-cache if we've
+ 	done term-handle-scroll.
+ 	(term-emulate-terminal):  Don't call term-adjust-current-row-cache.
+ 	(term-emulate-terminal):  For TAB, don't nil term-start-line-column.
+ 	(term-goto):  Possible optimization.
+ 
+ Tue Jun 13 19:28:59 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* comint.el (comint-mode): Use make-local-hook.
+ 	(comint-send-input, comint-output-filter): Use run-hook-with-args.
+ 	(comint-dynamic-complete): Use run-hook-with-args-until-success.
+ 
+ Tue Jun 13 17:19:52 1995  Michael Kifer <kifer@cs.sunysb.edu>
+ 
+ 	* viper.el (vip-change-state-to-vi): bug fix.
+ 	* viper-util.el (vip-over-whitespace-line): new function.
+ 
+ Tue Jun 13 04:16:28 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
+ 
+ 	* files.el (file-truename): Use expand-file-name if filename is "".
+ 
+ 	* shell.el (shell-mode): Set comint-input-ring-file-name to nil if "".
+ 
+ Mon Jun 12 22:16:46 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* menu-bar.el (help-menu): Symbol renamed from `help'.
+ 
+ 	* rmail.el (rmail-search-backwards): Default count is 1, not -1.
+ 
+ Sat Jun 10 00:38:31 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
+ 
+ 	* window.el (save-selected-window): New macro.
+ 
+ Fri Jun  9 11:38:01 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* faces.el (x-create-frame-with-faces): Don't use initial-frame-alist
+ 	when looking for the X resource name.
+ 	Copy parameters from default-frame-alist, before the geometry
+ 	specs from the X resource database.
+ 
+ Fri Jun  9 11:24:26 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
+ 
+ 	* faces.el (x-create-frame-with-faces): Don't look for geometry
+ 	resource if name is nil.
+ 
+ Fri Jun  9 08:37:08 1995  Erik Naggum  <erik@naggum.no>
+ 
+ 	* gnuspost.el (gnus-cancel-news): Use `buffer-disable-undo'.
+ 	(gnus-inews-article): Ditto.
+ 	(gnus-inews-insert-signature): Use the recommended
+ 	hyphen-hyphen-space as the signature delimiter.
+ 
+ Thu Jun  8 16:23:13 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
+ 
+ 	* info.el (Info-mode): Doc fix.
+ 	(Info-next-preorder): Renamed from Info-next-preorder-1.
+ 	Old definition deleted.
+ 	After moving up, go to end of node.
+ 	(Info-last-preorder): If no menu, try the previous node.
+ 	After going down thru menu or to previous, position at end
+ 	of node and recenter.
+ 	After moving up, position at start of menu.
+ 	(Info-follow-nearest-node, Info-mouse-follow-nearest-node):
+ 	Use Info-next-preorder.
+ 	(Info-scroll-up, Info-scroll-down): Doc fix.
+ 
+ 	* emacsbug.el (report-emacs-bug-info): New command.
+ 	(report-emacs-bug): Put it in local map.  Display a message
+ 	in another window.
+ 
+ 	* format.el (format-find-file, format-insert-file): New functions.
+ 
+ Thu Jun  8 10:34:10 1995  Morten Welinder  <terra+@cs.cmu.edu>
+ 
+ 	* add-log.el (prompt-for-change-log-name): Handle the case where
+ 	a directory name is specified gracefully.
+ 
+ Thu Jun  8 21:20:39 1995  Andre Spiegel <spiegel@bruessel.informatik.uni-stuttgart.de>
+ 
+ 	* vc.el (vc-backend-checkin): Handle RCS `ci'-output in the event
+ 	that a check-in only results in reverting to the previous version.
+ 	Also be more robust if the new version number cannot be told from
+ 	what `ci' says.
+ 
+ Thu Jun  8 20:59:55 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* vc.el (vc-register): Check for a visited file first thing.
+ 
+ 	* files.el (file-precious-flag): Doc clarification.
+ 
+ Thu Jun  8 20:06:03 1995  Michael Kifer <kifer@cs.sunysb.edu>
+ 
+ 	* viper.el (vip-envelop-ESC-key): if an ESC-sequence translates
+ 	into a function key, pretend that this key was the last command event.
+ 
+ 	* viper.el (vip-put-back,vip-Put-back): now emulate Vi's behavior
+ 	more closely.
+ 
+ 	* viper.el (vip-line): no longer not bombs out.
+ 	(vip-exec-shift) now preserves the point.
+ 
+ 	* viper.el: Fixed the behavior of the Vi commands M, L, G, yw, dg, etc.
+ 
+ 	* viper-util.el (vip-event-key): now handles keys 128--255 as
+ 	meta-chars.
+ 	* viper-ex.el: Fixed problems with yanking/deleting buffers.
+ 
+ 	* viper.el, viper-mous.el, viper-util.el, viper-ex.el:
+ 	Changed vip-*-frame-* to *-frame-*, incorporated overlay strings,
+ 	unread-command-events, removed support for emacs versions 19.28 and
+ 	xemacs 19.11 and earlier.
+ 	* viper-macs.el, viper-keym.el: Likewise.
+ 
+ Thu Jun  8 12:48:54 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* map-ynp.el (map-y-or-n-p): Don't eval return value of prompter
+  	function.
+ 
+ Thu Jun  8 10:29:43 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
+ 
+ 	* texinfo.el (texinfo-font-lock-keywords): Do comments first.
+ 
+ Thu Jun  8 09:03:28 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* rlogin.el (rlogin): If optional second arg is buffer or string,
+  	use that as name.
+ 
+ Wed Jun  7 18:08:10 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* gud.el (gud-common-init): Call the MASSAGE-ARGS function even if
+  	FILE is nil.
+ 
+ Wed Jun  7 14:57:24 1995  Morten Welinder  <terra+@cs.cmu.edu>
+ 
+ 	* s-region.el: Delete version number.
+ 	(s-region-bind): Doc fix.
+ 	(s-region-move): Split into s-region-move and s-region-move-p1.
+ 	(s-region-move-p2): New function.
+ 	(s-region-move): Bind this-command.  Bind keys to s-region-move-p1
+ 	or s-region-move-p2 as appropriate.
+ 
+ Wed Jun  7 11:05:56 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
+ 
+ 	* replace.el (query-replace-map): Bind f1 and help.
+ 
+ 	* subr.el (read-quoted-char): Turn on help-form and turn off help-char.
+ 
+ 	* isearch.el (isearch-other-meta-char): Try downshifting
+ 	shifted control characters.
+ 
+ 	* files.el (file-precious-flag): Doc fix.
+ 
+ 	* vc.el (vc-register): Clean error message if no visited file.
+ 
+ 	* vc-hooks.el (vc-menu-map): Disable Register when no visited file.
+ 
+ Wed Jun  7 15:11:27 1995  Paul Eggert  <eggert@twinsun.com>
+ 
+ 	* time.el (display-time-filter):
+ 	Use same instant for both time and time-zone.
+ 
+ Mon Jun  5 19:36:35 1995  Michael Kifer  <kifer@cs.sunysb.edu>
+ 
+ 	* ediff-merg.el (ediff-set-state-of-diff-in-all-buffers): bug fix.
+ 	(ediff-set-merge-mode): new function.
+ 	(ediff-do-merge): now sets correct major mode in the merge buffer.
+ 	(ediff-combine-diffs): handles correctly non-interactive calls.
+ 
+ 	* ediff.el: Added ediff-cleanup-hooks and ediff-janitor.
+ 
+ 	* ediff-wind.el (ediff-setup-control-frame, ediff-keep-window-config):
+ 	bug fix.
+ 
+ 	* ediff-init.el (ediff-frame-has-menubar): function deleted.
+ 	(ediff-device-type, ediff-color-display-p): new functions.
+ 
+ 	* ediff-wind.el (ediff-make-control-frame): optimized for display.
+ 	Commented out (redraw-display), to improve speed.
+ 
+ 	* ediff.el: don't make the patch buffer RO.
+ 
+ 	* ediff.el (ediff-load-version-control): now checks if
+ 	ediff-revision-key is non-nil.
+ 
+ 	* ediff.el (ediff-revision-key): Now defaults to nil.
+ 
+ 	* ediff.el (ediff-revision): now takes prefix argument; can compare
+ 	two versions of the same file.
+ 
+ 	* ediff.el: the merge buffer now assumes the major mode of the
+ 	default variant.
+ 
+ 	* ediff.el (ediff-documentation: new function.
+ 
+ 	* ediff-wind.el: Got rid of toolbars in control frame in xemacs
+ 
+ 	* ediff-wind.el: Changed window-min-height from 1 to 2
+ 
+ 	* ediff-wind.el (ediff-diff-at-point, ediff-toggle-multiframe): bug
+ 	fixes.
+ 	(ediff-destroy-control-frame, ediff-window-display-p): new functions.
+ 	* ediff.el, ediff-wind.el, ediff-util.el, ediff-init.el:
+ 	Converted xemacs *screen* nomenclature to *frame*.
+ 	Incorporated overlay strings. Ediff no longer runs under emacs
+ 	19.28 and earlier and XEmacs 19.11 and earlier.
+ 	* ediff.el (ediff-patch-buffer): now handles buffers that don't
+ 	visit any file.
+ 	(ediff-windows): renamed to ediff-windows-wordwise, added
+ 	(ediff-windows-linewise): new function.
+ 	Changed ediff-small/large-regions to ediff-regions-wordwise/linewise
+ 
+ 	* ediff.el, ediff-wind.el:
+ 	Changed window-system to ediff-window-display.
+ 
+ 	* ediff-wind.el (ediff-toggle-multiframe): fixed.
+ 	(ediff-destroy-control-frame): new function.
+ 
+ Mon Jun  5 16:43:29 1995  Boris Goldowsky  <boris@spiff.gnu.ai.mit.edu>
+ 
+ 	* avoid.el, enriched.el, facemenu.el, format.el, shadowfile.el:
+ 	Change email address for Boris.
+ 
+ Sat Jun  3 14:10:48 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
+ 
+ 	* mouse.el (mouse-set-region): Don't bounce the cursor on X.
+ 	mouse-drag-region takes care of showing it, sufficiently.
+ 
+ Fri Jun  2 12:07:40 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
+ 
+ 	* version.el (emacs-version): If using Motif, mention it.
+ 
+ 	* files.el (hack-local-variables-prop-line): Don't downcase var name.
+ 
+ Fri Jun  2 10:34:53 1995  Ed Reingold  <reingold@albert.gnu.ai.mit.edu>
+ 
+         * calendar.el (calendar-string-spread): Fix to allow 0 or 1 string.
+         (calendar-set-mode-line): Use this ability.
+         (generate-calendar-month): Ditto.
+ 
+         * cal-x.el (calendar-two-frame-setup): Create fancy buffer if needed.
+         (calendar-one-frame-setup): Ditto.
+ 
+         * diary-lib.el (make-fancy-diary-buffer): New function.
+         (fancy-diary-display): Use it.
+ 
+ Fri Jun  2 03:42:37 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
+ 
+ 	* comint.el (comint-word): Set match-data to match the word.
+ 
+ Thu Jun  1 20:13:28 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* term/x-win.el (vendor-specific-keysyms): Recognize "X Consortium".
+ 
+ Thu Jun  1 19:19:03 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* files.el (multiple-recover-finish): Renamed to
+  	recover-session-finish.
+ 	(recover-session): Changed binding.
+ 	(recover-session-finish): Doc fix; rewritten using map-y-or-n-p.
+ 
+ Thu Jun  1 16:53:39 1995  Ed Reingold  <reingold@albert.gnu.ai.mit.edu>
+ 
+         * cal-x.el (calendar-setup): Autoload it.
+ 
+ Thu Jun  1 05:09:12 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
+ 
+ 	* fast-lock.el: New version 3.06 from author.
+ 	(fast-lock-save-cache): Use verify-visited-file-modtime to check
+ 	timestamp of file against buffer, and visited-file-modtime to check
+ 	timestamp of file against cache.  Check buffer with buffer-modified-p.
+ 	Do set-buffer before all of these.
+ 	(fast-lock-save-events): Events for which a cache may be saved.
+ 	(fast-lock-after-save-hook, fast-lock-kill-buffer-hook,
+ 	fast-lock-kill-emacs-hook): Functions for those events; added to hooks.
+ 	(fast-lock-save-faces): List of faces to save.
+ 	(fast-lock-get-face-properties): Use it.
+ 	(fast-lock-cache-filename): Variable to store buffer's cache file name.
+ 	(fast-lock-cache-data): Set it.  Use buffer-modified-p to check buffer.
+ 	Compile keywords before comparison.  Revert timestamp from
+ 	verify-visited-file-modtime format if necessary.
+ 
+ 	* font-lock.el (font-lock-compile-keywords): Optional KEYWORDS to use.
+ 	Don't compile them if it looks like they already have been.
+ 
+ Wed May 31 15:40:29 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* time-stamp.el: Move defconsts to avoid byte-compiler warnings.
+ 
+ 	* menu-bar.el (menu-bar-help-menu): Add "..."
+ 
+ Wed May 31 16:25:03 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
+ 
+ 	* dired.el (dired-find-buffer-nocreate): Ignore dead buffers.
+ 
+ 	* scroll-bar.el (scroll-bar-drag): Call scroll-bar-drag-1
+ 	inside the let.
+ 
+ Tue May 30 17:44:51 1995  Morten Welinder  <terra+@cs.cmu.edu>
+ 
+ 	* lisp-mode.el (emacs-lisp-mode-map): Add a menu.
+ 	(emacs-lisp-byte-compile): New function.
+ 
+ 	* arc-mode.el (archive-lemacs): New variable.
+ 	(archive-mode-map, archive-summarize-files): Make it sort-of
+ 	work with Lucid Emacs.
+ 	(archive-mouse-extract): Use Lucid compatible code.
+ 	(archive-summarize-files, archive-lzh-chmod-entry): Guard
+ 	lambda with function.
+ 
+ Tue May 30 17:19:56 1995  Stephen Gildea  <gildea@x.org>
+ 
+ 	* time-stamp.el (time-stamp): only warn about time-stamping
+ 	being disabled if found a time-stamp that won't get updated.
+ 
+ Tue May 30 15:36:18 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* compile.el (compilation-error-regexp-alist): In "Cray C" regexp,
+  	don't allow newlines.
+ 
+ Tue May 30 15:20:19 1995  Michael Kifer <kifer@cs.sunysb.edu>
+ 
+ 	* ediff-wind.el (ediff-setup-control-frame): Make
+ 	Ediff delete the old control frame before creating a new one.
+ 
+ Tue May 30 14:38:48 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* bookmark.el: Fix capitalization in menu bar.
+ 	* rmailsum.el: Likewise.
+ 	* makefile.el: Likewise.
+ 	* hideshow.el: Likewise.
+ 	* cal-menu.el: Likewise.
+ 	* sh-script.el (sh-mode-map): Likewise.
+ 	* compile.el (compilation-mode-map): Likewise.
+ 	* bibtex.el (bibtex-mode-map): Likewise.
+ 	* tar-mode.el (tar-mode-map): Likewise.
+ 	* forms.el (forms--mode-menu-ro, forms--mode-menu-edit): Likewise.
+ 	* gud.el: Likewise.
+ 	(gud-xdb-find-file): Delete duplicate menu-bar entry.
+ 	* f90.el: Fix capitalization and punctuation in menu bar.
+ 
+ 	* frame.el (frame-configuration-p): Moved to subr.el.
+ 	* subr.el (frame-configuration-p): Moved here from frame.el.
+ 
+ Tue May 30 14:27:18 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
+ 
+ 	* facemenu.el (facemenu-special-menu): Use characters, not symbols.
+ 	Add Remove Special menu item.
+ 	(facemenu-remove-special): New function.
+ 	(facemenu-set-face-from-menu): If prefix arg, treat region as inactive.
+ 	(facemenu-set-face): Likewise.
+ 	(facemenu-keymap, facemenu-foreground-menu, facemenu-background-menu):
+ 	Add ... after Other.
+ 	(facemenu-menu): Change name to Text Properties.
+ 
+ 	* facemenu.el (facemenu-remove-really-all): New function.
+ 	(facemenu-special-menu): Add Remove All menu item.
+ 	(facemenu-indentation-menu): Make item names clearer.
+ 	Pick new key names too.
+ 
+ 	* facemenu.el (facemenu-menu): Split up definition.
+ 	Move `Remove All' item here.
+ 	(facemenu-special-menu): Delete `Remove All' item.
+ 	(facemenu-remove-all): Renamed from facemenu-remove-really-all.
+ 	(facemenu-remove-props): Renamed from facemenu-remove-all.
+ 
+ Mon May 29 16:15:53 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* frame.el (make-initial-minibuffer-frame): New function.
+ 	(frame-notice-user-settings): Call it.
+ 
+ 	* man.el (Man-default-man-entry): Return result.
+ 
+ 	* gud.el (gud-perldb-find-file): Use gud-make-debug-menu.
+ 
+ Mon May 29 17:59:27 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
+ 
+ 	* gud.el (gud-make-debug-menu): New function.
+ 	(gud-mode, gud-gdb-find-file, gud-dbx-find-file, gud-sdb-find-file)
+ 	(gud-xdb-find-file): Use gud-make-debug-menu.
+ 
+ 	* find-dired.el (find-dired): If dired-simple-subdir-alist is not
+ 	defined, set dired-subdir-alist a different way.
+ 	(find-dired-version): Variable deleted.
+ 
+ 	* files.el (after-revert-hook, before-revert-hook): Add defvars.
+ 
+ Mon May 29 16:07:36 1995  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+ 
+ 	* gud.el (gud-perldb-massage-args): Pass `-emacs' after the file name.
+ 
+ 	* dired.el (dired-mode-map): Rename menubar bindings and use the
+ 	new function names `dired-do-query-replace' and `dired-do-search'.
+ 
+ Mon May 29 15:15:01 1995  Francesco Potorti`  (pot@cnuce.cnr.it)
+ 
+ 	* man.el (Man-init-defvars): Don't remove lines containing
+ 	"No such file or directory".
+ 
+ Mon May 29 02:48:05 1995  Karl Heuer  <kwzh@gnu.ai.mit.edu>
+ 
+ 	* cc-mode.el (c-mode-help-address): New hostname.
+ 
+ Sun May 28 23:59:00 1995  Erik Naggum  <erik@naggum.no>
+ 
+ 	* mail-extr.el (mail-extr-all-letters-but-separators): reinstate
+ 	\377, the bug in search.c is apparently gone.
+ 	(mail-extr-first-letters): add 8-bit characters
+ 	(mail-extr-last-letters): ditto
+ 
+ 	* simple.el (indent-for-comment): move to beginning of line only
+ 	if there is a comment syntax.
+ 
+ Sun May 28 23:58:00 1995  Michael Ernst  <mernst@research.microsoft.com>
+ 
+ 	* dired.el (dired-find-buffer-nocreate): Check only buffers in
+ 	dired-buffers instead of all buffers in (buffer-list).
+ 
+ Sun May 28 18:17:22 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
+ 
+ 	* vc.el (vc-revert-buffer1): Delete the special code for font-lock.
+ 
+ 	* font-lock.el (font-lock-revert-cleanup): Always turn font lock on.
+ 	(font-lock-mode): When turning mode off, always take out
+ 	the revert hooks.
+ 
+ 	* files.el (revert-buffer): Save after-revert-hook (both local and
+ 	global values) before reverting, and run the saved values at the end.
+ 
+ 	* files.el (find-file-noselect): In "file changed" messages,
+ 	mention buffer name if different from file name.
+ 
+ 	* ediff-wind.el (ediff-setup-control-frame): Use
+  	designated-minibuffer-frame while making the new frame.
+ 	And delete the old frame if its minibuffer is not in that frame.
+ 	(ediff-setup-windows-multiframe-compare)
+ 	(ediff-setup-windows-multiframe-merge): Don't mess with
+ 	default-minibuffer-frame here and don't kill the old control frame.
+ 
+ 	* ediff-util.el (ediff-setup): Don't make default-minibuffer-frame
+ 	a buffer-local variable.
+ 
+ 	* dabbrev.el (dabbrev--abbrev-at-point): If point is after
+ 	a separator, move back to previous abbreviation.
+ 	(dabbrev-expand): New feature--if you insert a space and
+ 	call this command again, it always fetches consecutive words
+ 	after the expansion that was found for the actual abbrev.
+ 
+ 	* isearch.el (isearch-edit-string): Don't bind isearch-other-end.
+ 
+ Fri May 26 20:40:18 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
+ 
+ 	* sendmail.el (send-mail-function, mail): Doc fixes.
+ 
+ 	* simple.el (previous-matching-history-element):
+ 	No longer remove empty string from history.
+ 	Better error message if history is empty.
+ 
+ Fri May 26 20:33:52 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* vc-hooks.el (vc-log-info): Use path-separator.
+ 	* info.el (Info-directory-list): Use path-separator.
+ 	* gud.el (gud-gdb-marker-regexp): New var.  Use path-separator.
+ 
+ Fri May 26 20:22:39 1995  Michael Ernst  <mernst@research.microsoft.com>
+ 
+ 	* ispell.el (ispell-message-text-end): Match start of forwarded msg.
+ 
+ Fri May 26 16:11:07 1995  Geoff Voelker  <voelker@cs.washington.edu>
+ 
+ 	* startup.el (command-line): Handle nil command-line-args.
+ 
+ Fri May 26 12:25:13 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* compile.el (compilation-error-regexp-alist): In "IBM C/C++
+  	Tools" regexp, disallow leading spaces and disallow whitespace
+  	chars within the file name.
+ 
+ Fri May 26 00:00:10 1995  Michael Ernst  <mernst@research.microsoft.com>
+ 
+ 	* dired-x.el (dired-find-buffer-nocreate): Don't try to find a
+ 	wildcard as a subdirectory.
+ 
+ 	* gud.el (gud-common-init): Don't die if filename not supplied.
+ 	Omit trailing hyphen when no filename follows.
+ 
+ 	* texnfo-upd.el (texinfo-sequentially-find-pointer): Don't modify
+ 	the kill ring.
+ 
+ Thu May 25 23:53:58 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
+ 
+ 	* bytecomp.el (byte-compile-insert-header):
+ 	When using dynamic docstrings, refuse to load in 19.28 and older.
+ 	In that error message, don't mention the directory names.
+ 
+ 	* faces.el (x-create-frame-with-faces): Read geometry resource
+ 	and use that while creating the frame.
+ 
+ Wed May 24 17:02:23 1995  Rolf Ebert  <re@waporo.muc.de>
+ 
+ 	* ada-mode.el (initial comments): Copyright 1995; don't speak
+ 	about setup; correct history for a file that actually IS in
+ 	Emacs 19.29; update list of known bugs.
+ 	(all functions): inititialize all local variables explicitely to 'nil'.
+ 	(ada-font-lock-keywords): initialized according to new user option
+ 	`font-lock-maximum-decoration'.
+ 
+ 	* ada-mode.el (ada-ident-re): new regexp for Ada identifiers.
+ 	(ada-block-start-re): "record" may be preceded by one or more
+ 	occurencies of "limited", "abstract", or "tagged".
+ 	(ada-end-stmt-re): added "separate" body parts, "else", and
+ 	"package <Id> is".
+ 	(ada-subprogram-start-re): added "entry", "protected" and
+ 	"package body"
+ 	(ada-indent-function): handle "elsif" the same way as "if", added
+ 	"separate" for no indent.
+ 	(ada-get-indent-type): if "type ... is .." is followed by code on
+ 	the same line, it is a broken statement. Test it.
+ 	(ada-check-defun-name): check for "protected" records.
+ 	(ada-goto-matching-decl-start): use of ada-ident-re.
+ 	(ada-goto-matching-start): extend regexp for "protected" record.
+ 	(ada-in-limit-line): renamed from in-limit-line. Don't use
+ 	count-lines, but test if beginning-of-line/end-of-line puts us
+ 	to bob/eob.
+ 	(ada-goto-previous-nonblank-line): save a beginning-of-line
+ 	statement, as we already are there.
+ 	(ada-complete-type): removed.
+ 	(ada-tabsize): removed.
+ 	(keymap): use C-M-a and C-M-e for proc/func movement.  No
+ 	keybinding anymore for next/prev-package.
+ 	(ada-font-lock-keywords-[1|2]): add protected records. "when" removed
+ 	from 'reference'-face.
+ 	(initial comments): updated CREDITS list.
+ 	(ada-add-ada-menu): capitalized menu entries.  Added menu statement
+ 	needed for XEmacs.
+ 
+ 	* ada-mode.el: changed all Ada94 to Ada95.
+ 
+ 	* ada-mode.el: (ada-xemacs): new function, detect if we are
+ 	running on XEmacs. Ada keymap definition and menus use it.
+ 	(ada-create-syntax-table): corrected comments explaining use of 2nd
+ 	syntax table.  Added creation of ada-mode-symbol-syntax-table
+ 	with '_' as word constituent.
+ 	(ada-adjust-case): add test, if symbol is preceeded by a "'".
+ 	If true, change case according to ada-case-attribute.
+ 	(ada-which-function-are-we-in): new routine. Save name of the current
+ 	function in the old buffer; we can place cursor now at the same
+ 	function in the new buffer using find-file.
+ 	(ada-make-body): new function.  Generates body stubs if the body
+ 	did not exist yet and you switch to it by find-file.
+ 	(ada-gen-treat-proc): complete rewrite for ada-make-body.
+ 	(ada-mode): two doc lines about the above extension.
+ 	(keymap definition): remove 4th parameter in call to
+ 	`substitute-key-definition' to make XEmacs happy.
+ 
+ 	(ada-adjust-case-region, ada-move-to-start, ada-move-to-end,
+ 	ada-indent-newline-indent, ada-format-paramlist): switch syntax
+ 	tables, protect switching of syntax tables with unwind-protect.
+ 	(ada-in-open-paren-p): replace user option
+ 	`ada-search-paren-line-count-limit' by
+ 	`ada-search-paren-char-count-limit'.
+ 	(ada-case-attribute): new user option, but not yet the functionality.
+ 	(ada-krunch-args): initialized to 0 exploiting the new capability of
+ 	'gnatk8' as of gnat-2.0.
+ 	(ada-make-filename-from-adaname): remove downcasing and replacement
+ 	of dots. This is done in external program gnatk8 (gnat-2.0).
+ 	(ada-in-open-paren-p): complete rewrite for speed-up.
+ 	(ada-search-ignore-string-comment): ignore # as a string terminator
+ 	in all searches.
+ 	(ada-add-ada-menu): use real variables instead of t for invoking
+ 	'easymenu'
+ 	(require 'easymenu).
+ 	(imenu-create-ada-index): we accept forward definitions again.
+ 	(ada-indent-region): catch errors, simplified code.
+ 
+ Tue May 23 20:18:57 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* term/x-win.el (vendor-specific-keysyms): Add second spelling for HP.
+ 
+ 	* arc-mode.el: Remove version number.
+ 
+ Tue May 23 15:08:51 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
+ 
+ 	* menu-bar.el (delete-frame-enabled-p): New subroutine.
+ 	Use frame-visible-p to reduce consing.
+ 
+ 	* help.el (describe-prefix-bindings): If key is a string,
+ 	make a substring; for a vector, make a vector.
+ 
+ Mon May 22 18:24:16 1995  Erik Naggum  <erik@naggum.no>
+ 
+ 	* gnus.el (gnus-gnus-to-quick-newsrc-format): don't save
+ 	gnus-newsgroup-alist in .newsrc.el.
+ 
+ Mon May 22 17:41:23 1995  Richard Stallman  <rms@waves>
+ 
+ 	* edmacro.el (edit-kbd-macro): Better error messages for undefined keys
+ 	or keys that are not keyboard macros.
+ 
+ 	* ada-mode.el (ada-add-ada-menu): Fix args to easy-menu-define.
+ 
+ Mon May 22 15:40:21 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* files.el (file-ownership-preserved-p): Fix typo in previous change.
+ 
+ 	* sendmail.el (mail-text): Expand abbrev before moving point.
+ 
+ Sat May 20 00:29:11 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* mouse.el (mouse-save-then-kill): Fix previous change.
+ 
+ 	* easymenu.el (easy-menu-do-define): Add autoload cookie.
+ 
+ Fri May 19 14:56:10 1995  Kevin Rodgers <kevinr@ihs.com>
+ 
+ 	* mailalias.el (expand-mail-aliases): Expand aliases in
+ 	From and Reply-to headers as well, plus the Resent- variants.
+ 
+ 	* sendmail.el (mail-mode): Clarify doc string.
+ 	(mail-text): Ditto.
+ 
+ Thu May 18 18:20:57 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* faces.el: Put property on set-face-stipple, not set-stipple.
+ 	(face-fill-in): Handle stipple.
+ 
+ Thu May 18 12:50:58 1995  Richard Stallman  <rms@waves>
+ 
+ 	* bytecomp.el (byte-compile-dynamic-docstrings): Doc fix.
+ 
+ 	* tar-mode.el (tar-mode): Set write-contents-hooks instead of
+ 	local-write-file-hooks.
+ 
+ 	* loadhist.el (unload-feature): When we come to (provide . FEATURE),
+ 	remove FEATURE from the features list.
+ 
+ Wed May 17 16:34:48 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
+ 
+ 	* c-mode.el (c-fill-paragraph): Don't alter point
+ 	when deciding to narrow at the end for the sake of a comment ender.
+ 
+ 	* gnus.el (gnus-expunge): Use defalias.
+ 
+ Wed May 17 15:33:47 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* buff-menu.el (Buffer-menu-buffer): Give more informative error
+ 	message if user attempts a selection at end of buffer.
+ 
+ 	* easymenu.el (easy-menu-create-keymaps): Set menu-enable prop.
+ 
+ Tue May 16 17:57:50 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* lpr.el: Add provide call.
+ 
+ Mon May 15 17:52:55 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* facemenu.el (facemenu-set-face-from-menu): Doc fix.
+ 	(facemenu-set-background, facemenu-set-foreground): Doc fix.
+ 	(facemenu-set-face): Doc fix.
+ 
+ 	* files.el (file-ownership-preserved-p): Don't bomb if file
+ 	doesn't exist.
+ 
+ 	* add-log.el (get-method-definition): Fix regexps.
+ 
+ 	* tq.el (tq-process-buffer): Don't hard-code the buffer name.
+ 
+ Fri May 12 20:26:29 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* x-apollo.el: New file.
+ 	* term/x-win.el (vendor-specific-keysyms): New function.
+ 
+ Fri May 12 12:39:44 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* rlogin.el (rlogin-history): New defvar.
+ 	(rlogin): Use rlogin-history as history var in read-from-minibuffer.
+ 
+ 	* compile.el (compilation-next-error-locus): Ignore zero column number.
+ 	(compilation-parse-errors): Don't store the beginning of the line
+ 	containing the end of the error-regexp match.  Instead, store the
+  	beginning of the line containing the start of the match, unless
+  	the match starts with a newline, in which case the beginning of
+  	the next line.
+ 
+ 	* vc-hooks.el (vc-status): If vc-locking-user returns a number,
+  	compare it to (user-uid).
+ 
+ Thu May 11 22:16:55 1995  James Thompson  <thompson@wg2.waii.com>
+ 
+ 	* ps-print.el: Miscellaneous fixes for better compatibility with
+ 	XEmacs 19.12.
+ 
+ 	* ps-print.el (ps-plot-with-face): Added code to handle Emacs
+ 	19.29's new ability for the face attribute to hold a list of
+ 	faces.
+ 
+ 	* ps-print.el: Rolled in Chuck Thompson's changes to make color
+ 	printing work in XEmacs 19.12.
+ 
+ 	* ps-print.el: Fix error in comments.
+ 
+ 	* ps-print.el (ps-generate-postscript-with-faces): Add fix to
+ 	handle extents without faces.
+ 
+ 	* ps-print.el (ps-faces-list): deleted.  Added alias for
+ 	list-faces if face-list isn't fbound.
+ 
+ 	* ps-print.el: (ps-print-ensure-fontified) added to make sure
+ 	ps-print works correctly in conjunction with lazy-lock.
+ 
+ 	* ps-print.el: RMS's changes for Emacs.
+ 
+ Wed May 10 20:45:12 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* etags.el (tags-loop-continue): Doc fix.  Reset NEW after
+  	visiting for real, so we don't clobber the buffer again.
+ 
+ 	* compile.el (compilation-error-regexp-alist): Add regexps for IBM
+  	and Cray compilers.
+ 	(compilation-next-error-locus): Ignore a column number that is zero.
+ 
+ Tue May  9 01:31:23 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* bytecomp.el (byte-compile-insert-header): Cope if user-mail-address
+ 	is unbound.
+ 
+ Tue May  9 14:30:19 1995  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+ 
+ 	* loaddefs.el: Remove duplicate autoloads.
+ 
+ Tue May  9 00:05:37 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* info.el (Info-directory-list): Use installation-directory,
+ 	not invocation-directory.  Cope if it is nil.
+ 
+ 	* sendmail.el (mail-font-lock-keywords): Make mail-header-separator
+ 	into a regexp.
+ 
+ 	* rnewspost.el (news-reply-mode): Add ^ to paragraph delimiters.
+ 
+ 	* supercite.el (sc-no-blank-line-or-header): Make mail-header-separator
+ 	into a regexp.
+ 
+ Mon May  8 11:22:05 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* lmenu.el (popup-dialog-box): x-popup-dialog returns the value,
+ 	not the cons cell.
+ 
+ 	* rnewspost.el (news-setup): Bind mail-signature to nil.
+ 
+ 	* ediff.el (ediff-revision-key): Default value nil.
+ 	(ediff-load-version-control): Don't remind any key if
+ 	ediff-revision-key is nil.
+ 
+ 	* info.el (info-insert-file-contents): Don't use
+ 	(file-name-directory fullname) if it is nil.
+ 
+ 	* helper.el (Helper-help): Use read-key-sequence.
+ 
+ 	* mouse.el (mouse-save-then-kill): When making a new region
+ 	and not adjusting an old one, always make new kill-ring entry
+ 	and don't call mouse-show-mark.
+ 
+ 	* add-log.el (add-log-current-defun): Handle objc-mode like c-mode;
+ 	detect method definitions by their syntax.
+ 
+ 	* menu-bar.el (menu-bar-tools-menu): Rename key to `compare'.
+ 
+ Sun May  7 13:31:58 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* add-log.el (get-method-definition, get-method-definition-1):
+ 	New functions.
+ 	(add-log-current-defun): Use them to handle objc-mode.
+ 
+ 	* pc-mode.el (pc-bindings-mode): Add bindings for C-backspace
+ 	and M-backspace.  Make C-delete and M-delete operate on words.
+ 	Add C-escape binding.
+ 
+ 	* loaddefs.el (global-map): Add bindings for C-insert and S-insert.
+ 	Also S-delete.  Also C-up, C-down, C-prior and C-next.
+ 
+ 	* files.el (recover-session): Renamed from multiple-recover.
+ 
+ 	* noutline.el: Provide noutline as well as outline.
+ 
+ Sat May  6 23:09:50 1995  Geoff Voelker  <voelker@cs.washington.edu>
+ 
+ 	* winnt.el (path-separator): Set to ";".
+ 
+ 	* files.el (path-separator): Defined.
+ 	(parse-colon-path): Use path-separator.
+ 
+ Sat May  6 00:23:02 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* pp.el (pp-eval-expression): Update use of temp-buffer-show-function.
+ 
+ 	* term/x-win.el (x-colors): Delete "medium goldenrod" in both forms.
+ 	Delete "medium forest green" in both forms.
+ 
+ 	* gnus.el (gnus-use-generic-from): Doc fix.
+ 
+ Fri May  5 18:30:45 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* loaddefs.el: Delete autoloads for ispell4, noutline, noutline1.
+ 	* noutline.el: All autoload cookies disabled.
+ 	* ispell4.el: All autoload cookies disabled.
+ 
+ 	* gnus.el (gnus-group-mode): Set truncate-lines.
+ 
+ 	* edebug.el (\`): Add backslash.
+ 	(edebug-\`): Add backslash.
+ 
+ 	* info.el (info-insert-file-contents): Fix Apr 19 change.
+ 
+ 	* sendmail.el (sendmail-send-it): Check continuation lines
+ 	when checking for empty subject lines.
+ 
+ Fri May  5 12:18:28 1995  Michael Ernst  <mernst@research.microsoft.com>
+ 
+ 	* ispell.el (ispell-region): If position not visible, (sit-for 0).
+ 
+ Thu May  4 16:09:02 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* trace.el: Don't try to define backquote.
+ 	(trace-version): Deleted.
+ 
+ 	* backquote.el ('\`): Use backslash for reading the backquote.
+ 	(backquote-backquote-symbol): Likewise.
+ 	(backquote): Doc fix.
+ 
+ Wed May  3 02:10:43 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* cc-mode.el: Doc fixes.
+ 	(c-version): Mention that this may be modified version.
+ 
+ Tue May  2 19:25:28 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* scribe.el: (scribe-chapter): Change to C-c C-c.
+ 	(scribe-section): Change to C-c C-t.
+ 	(scribe-subsection): Change to C-c C-s.
+ 	(scribe-insert-environment): Change to C-c C-v.
+ 	(scribe-bracket-region-be): Change to C-c C-e.
+ 	(scribe-italicize-word): Change to C-c C-i.
+ 	(scribe-bold-word): Change to C-c C-b.
+ 	(scribe-underline-word): Change to C-c C-u.
+ 	* gomoku.el (gomoku-human-plays): Change to C-c C-p.
+ 	(gomoku-human-takes-back): Change to C-c C-b.
+ 	(gomoku-human-resigns): Change to C-c C-r.
+ 	(gomoku-emacs-plays): Change to C-c C-e.
+ 	* gnus-uu.el (gnus-uu-interactive-scan-directory): Change to C-c C-d.
+ 	(gnus-uu-interactive-save-current-file): Change to C-c C-z.
+ 	* allout.el (outline-rebullet-current-heading): Change to C-c *.
+ 
+ Mon May  1 20:51:42 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* s-region.el (S-delete): Fix typo (was C-delete).
+ 
+ 	* hideif.el (hide-ifdef-mode-prefix-key): Change to C-c @.
+ 	(hide-ifdef-mode-submap): Get rid of \e from all bindings.
+ 
+ 	* outline.el, noutline.el (outline-minor-mode-prefix): Change to C-c @.
+ 
+ 	* texinfo.el (texinfo-mode-map): Delete C-c ] binding.
+ 
+ 	* forms.el (forms--mode-commands): Delete C-c ? binding.
+ 
+ 	* rnewspost.el (news-reply-mode-map): Delete C-c ? binding.
+ 
+ 	* isearch.el (isearch-mode): Doc fix.
+ 
+ 	* iso-acc.el (iso-accents-mode): Doc fix.
+ 
+ Mon May  1 15:04:21 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* cc-mode.el (c-set-style): Ignore case in completion.
+ 
+ Mon May  1 11:48:34 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* mailalias.el (expand-mail-aliases):
+ 	Use buffer-substring-no-properties.
+ 
+ 	* subr.el (buffer-substring-no-properties): New function.
+ 
+ 	* makefile.el (makefile-mode): Set dabbrev-abbrev-skip-leading-regexp.
+ 
+ 	* dabbrev.el (dabbrev-completion): Use mapcar, not mapc.
+ 	Call dabbrev--reset-global-variables as the first thing.
+ 
+ 	* files.el (set-auto-mode): If buffer has no file, use buffer name.
+ 
+ Sun Apr 30 21:52:09 1995  Jay Adams  <jka@mustang.ece.cmu.edu>
+ 
+ 	* jka-compr.el (jka-compr-write-region): Handle the append
+ 	argument correctly when the can-append flag is false.
+ 	(jka-compr-write-region): Make temp-buffer name unique to this fn.
+ 	(jka-compr-file-local-copy): Ditto.
+ 
+ Sun Apr 30 14:47:33 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* files.el (multiple-recover, multiple-recover-finish): New commands.
+ 
+ 	* startup.el (normal-top-level): Set auto-save-list-file-name.
+ 
+ Sat Apr 29 01:28:11 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* startup.el (command-line-1): Implement -L/--directory option.
+ 
+ 	* jka-compr.el (jka-compr-insert-file-contents): When visiting,
+ 	bind buffer-file-name to nil temporarily.
+ 
+ 	* tex-mode.el (tex-view): Nice error if tex-dvi-view-command is nil.
+ 
+ Wed Apr 26 14:24:44 1995  Rob Riepel  <riepel@Snowflake.Stanford.edu>
+ 
+ 	* tpu-edt.el (tpu-copy-keyfile): New function.
+         (tpu-load-xkeys): Copy key definition file to new default name.
+ 
+ Wed Apr 26 17:42:37 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* vc.el (vc-next-action-on-file): Add missing let-binding.
+ 
+ Wed Apr 26 17:41:11 1995  Andre Spiegel  <spiegel@bruessel.informatik.uni-stuttgart.de>
+ 
+ 	* vc.el (vc-default-backend, vc-keep-workfiles, vc-consult-headers):
+ 	(vc-mistrust-permissions, vc-path): Vars moved to vc-hooks.el.
+ 	(vc-match-substring, vc-lock-file, vc-parse-buffer, vc-master-info):
+ 	(vc-log-info, vc-consult-rcs-headers, vc-fetch-properties):
+ 	(vc-backend-subdirectory-name, vc-locking-user, vc-true-locking-user):
+ 	(vc-latest-version, vc-your-latest-version, vc-branch-version):
+ 	(vc-workfile-version): Functions moved to vc-hooks.el.
+ 	(vc-trunk-p, vc-minor-revision, vc-branch-part): Functions moved
+ 	here from vc-hooks.el.
+ 
+ 	* vc-hooks.el (vc-default-backend, vc-path, vc-consult-headers):
+ 	(vc-mistrust-permissions, vc-keep-workfiles): Customization
+ 	variables, moved here from vc.el.
+ 	(vc-trunk-p, vc-minor-revision, vc-branch-part): Moved to vc.el.
+ 	(vc-backend): Renamed from vc-backend-deduce.  Callers changed.
+ 	(vc-match-substring, vc-lock-file, vc-parse-buffer, vc-master-info):
+ 	(vc-log-info, vc-consult-rcs-headers, vc-fetch-properties):
+ 	(vc-backend-subdirectory-name, vc-locking-user, vc-true-locking-user):
+ 	(vc-latest-version, vc-your-latest-version, vc-branch-version):
+ 	(vc-workfile-version): Functions moved here from vc.el.
+ 	(vc-log-info): Log program is no longer called through vc-do-command,
+ 	to avoid including the lengthy vc-do-command here.  It is done
+ 	directly through call-process now.  Removed obsolete parameter LAST.
+ 	(vc-status): Replaced by the much simpler version that gets the
+ 	information from the file properties.  Removed the obsolete
+ 	parameter vc-type.
+ 	(vc-parse-buffer): changed format of PATTERNS.  Each pattern is now a
+ 	list of 2 to 3 elements, the first being the pattern, the remaining
+ 	ones the numbers of subexpressions to refer to.
+ 	(vc-cvs-status): New per-file property, only used in the CVS case.
+ 	(vc-cvs-status): New function.
+ 	(vc-log-info): Adapted to new version of vc-parse-buffer
+ 	(vc-fetch-properties): Adapted to new version of vc-parse-buffer.
+ 	Better search regexp for CVS latest version.
+ 	(vc-log-info): Search for branch version only in the RCS case,
+ 	since this doesn't make sense for SCCS or CVS.
+ 	(vc-fetch-properties): CVS case: set vc-cvs-status.
+ 	(vc-locking-user): CVS case: use vc-cvs-status to determine if
+ 	the file is up-to-date, thus avoiding an expensive call to
+ 	vc-workfile-unchanged-p.
+ 	(vc-mode-line): Re-activated the code that makes the buffer read-only
+ 	if the work file is unchanged.  But the status of the work file
+ 	is now determined by looking at the already-computed mode string.
+ 
+ Wed Apr 26 05:18:11 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* startup.el (command-line): Handle -iconic and -icon-type here.
+ 
+ Tue Apr 25 17:49:45 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* abbrev.el (abbrev-mode): Use force-mode-line-update.
+ 	* appt.el (appt-check): Likewise.
+ 	* array.el (array-mode): Likewise.
+ 	* bytecomp.el (byte-recompile-directory): Likewise.
+ 	* delsel.el (delete-selection-mode): Likewise.
+ 	* dired-x.el (dired-omit-expunge): Likewise.
+ 	* dired.el (dired-sort-set-modeline): Likewise.
+ 	* double.el (double-mode): Likewise.
+ 	* edt.el (edt-advance, edt-backup): Likewise.
+ 	* emerge.el (emerge-fast-mode, emerge-edit-mode): Likewise.
+ 	(emerge-auto-advance, emerge-skip-prefers): Likewise.
+  	(emerge-refresh-mode-line): Likewise.
+ 	* f90.el (f90-auto-fill-mode): Likewise.
+ 	* files.el (toggle-read-only, rename-uniquely): Likewise.
+ 	* find-dired.el (find-dired-sentinel): Likewise.
+ 	* fortran.el (fortran-auto-fill-mode): Likewise.
+ 	* gomoku.el (gomoku-display-statistics): Likewise.
+ 	* gud.el (gud-sentinel): Likewise.
+ 	* hanoi.el (hanoi): Likewise.
+ 	* hideif.el (hide-ifdef-toggle-read-only): Likewise.
+ 	(hide-ifdef-toggle-outside-read-only): Likewise.
+ 	* info.el (Info-edit-mode, Info-cease-edit): Likewise.
+ 	* isearch.el (isearch-mode, isearch-done): Likewise.
+ 	* ispell.el (ispell-minor-mode): Likewise.
+ 	* mh-comp.el (mh-insert-signature): Likewise.
+ 	* mh-e.el (mh-set-scan-mode): Likewise.
+ 	* mh-utils.el (mh-set-mode-name): Likewise.
+ o	* noutline.el (outline-minor-mode): Likewise.
+ 	* outline.el (outline-minor-mode): Likewise.
+ 	* picture.el (picture-set-motion, picture-mode-exit): Likewise.
+ 	* rmailedit.el (rmail-edit-current-message): Likewise.
+ 	(rmail-cease-edit): Likewise.
+ 	* simple.el (auto-fill-mode): Likewise.
+ 	* supercite.el (sc-raw-mode-toggle): Likewise.
+ 	* term.el (term-update-mode-line, term-process-pager): Likewise.
+ 	(term-pager-continue): Likewise.
+ 	* terminal.el (te-edit, te-more-break-unwind): Likewise.
+ 	(te-update-pending-output-display): Likewise.
+ 	* time.el (display-time-sentinel, display-time-filter): Likewise.
+ 	* vi.el (vi-switch-mode, vi-back-to-old-mode): Likewise.
+ 	(vi-mode, vi-goto-insert-state): Likewise.
+ 	* vip.el (vip-change-mode): Likewise.
+ 	* xscheme.el (xscheme-set-runlight, xscheme-set-prompt): Likewise.
+ 
+ Tue Apr 25 15:00:23 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* compile.el (compile-internal): Disable undo before erasing
+ 	the buffer, then enable again afterward.
+ 	(compilation-sentinel): Use force-mode-line-update.
+ 
+ 	* tpu-extras.el: Removed reference to tpu-gnu-emacs18-p.
+ 
+         * tpu-mapper.el: Eval key definitions and clean up upon completion.
+         Persistent completion status message.
+ 
+ 	* loaddefs.el (esc-map): Define ESC ESC : like ESC :.
+ 
+ Tue Apr 25 09:34:58 1995  Johan Vromans  <jv@squirrel.NL.net>
+ 
+ 	* forms.el: (forms--make-format-elt-using-text-properties)
+ 	forms--make-format): Add `intangible' text property to read-only areas.
+ 	(forms-next-field, forms-previous-field): Use
+ 	`inhibit-point-motion-hooks' to allow move between two
+ 	intangible areas.
+ 
+ Tue Apr 25 03:52:28 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
+ 
+ 	* supercite.el (sc-string-text): New function to return raw text.
+ 	(sc-mail-fetch-field, sc-mail-append-field): Use it.
+ 	(sc-submatch): Make it a defalias for match-string.
+ 	(sc-member): Make it a defalias for member.
+ 
+ Tue Apr 25 00:09:05 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* files.el (rename-uniquely): Don't discard <NN> from end
+ 	if that is part of the visited file name.
+ 
+ 	* rmail.el (rmail-insert-inbox-text): Get the truename of
+ 	the standard inbox name, not just of its directory.
+ 
+ Mon Apr 24 10:58:51 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* sendmail.el (mail-position-on-field): Use $, not \n, in regexp.
+ 
+ 	* tpu-edt.el (tpu-search-internal): Case-sensitive search if search
+ 	string contains upper-case.
+ 	tpu-check-search-case): New function.
+ 
+ 	* tpu-edt.el: Don't turn on tpu-edt mode.
+ 	(tpu-gnu-emacs19-p): Function deleted.  Callers changed.
+ 	(tpu-load-xkeys): Use file name .tpu-keys by default.
+ 	(tpu-gnu-emacs18-p): Function deleted.
+ 
+ 	* tpu-mapper.el: At end, use default file name .tpu-keys.
+ 	Do not kill Emacs.
+ 	(tpu-emacs-map-key): Renamed from tpu-gnu-map-key.
+ 
+ 	* vc.el (vc-backend-checkout): Pass vc-checkout-switches arg
+ 	properly to vc-do-command.
+ 
+ 	* isearch.el (isearch-update-ring): Use STRING arg, not isearch-ring.
+ 
+ 	* files.el (rename-uniquely): Strip suffix before rename.
+ 
+ Mon Apr 24 06:51:48 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
+ 
+ 	* font-lock.el (font-lock-keywords): Doc fix for MATCHER.
+ 	(font-lock-maximum-size): Set based on font-lock-maximum-decoration.
+ 	(font-lock-after-fontify-buffer-hook): Removed.
+ 	(font-lock-after-fontify-buffer): New function.
+ 	(font-lock-fontify-buffer): Use instead.  Don't bother if buffer empty.
+ 	(font-lock-fontify-region): Use font-lock-syntax-table if set.
+ 	(font-lock-unfontify-region): Only set-buffer-modified-p if necessary.
+ 	(font-lock-after-change-function): Use it to unfontify.
+ 	(font-lock-compile-keywords): New function to compile keywords.
+ 	(font-lock-apply-highlight): New inline function to apply highlights.
+ 	(font-lock-hack-keywords): Use them, if font-lock-keywords are not
+ 	compiled, and to highlight.  Use funcall if MATCHER is not a regexp.
+ 	(font-lock-mode): Doc fix for font-lock-maximum-decoration.  Use
+ 	font-lock-set-defaults to call font-lock-make-faces.
+ 	(tex-font-lock-keywords): Revamped.
+ 
+ 	* fortran.el (fortran-match-!-comment): New function.
+ 	(fortran-font-lock-keywords-1, fortran-font-lock-keywords-2): Use it.
+ 	(fortran-font-lock-keywords-3): New variable.
+ 	(fortran-find-comment-start-skip): Clean code.
+ 
+ 	* add-log.el (change-log-font-lock-keywords):
+ 	dired.el (dired-font-lock-keywords):
+ 	sendmail.el (mail-font-lock-keywords):
+ 	rmailsum.el (rmail-summary-font-lock-keywords):
+ 	shell.el (shell-font-lock-keywords): Efficiency change.
+ 
+ Mon Apr 24 00:20:29 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* easymenu.el (easy-menu-define): Doc fix.
+ 
+ 	* iso-acc.el (iso-accents-list): Add ~! and ~? combinations.
+ 
+ 	* byte-opt.el (byte-optimize-letX): Use car-safe and cdr-safe.
+ 
+ Thu Apr 20 17:19:49 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* rmail.el (rmail-resend): Fix abbrev expansion.
+ 
+ 	* rmailkwd.el (rmail-attributes): Recognize "resent" attribute.
+ 
+ 	* mailabbrev.el (sendmail-pre-abbrev-expand-hook): When setting the
+ 	dummy value for abbrev-start-location, use (point-max) rather than
+ 	(point), so we won't delete a "-" that happens to be at point.
+ 
+ Thu Apr 20 19:22:23 1995  Stephen Gildea  <gildea@x.org>
+ 
+ 	* mh-mime.el, mh-comp.el: Update some MIME doc strings.
+ 
+ 	* mh-comp.el (mh-auto-fill-for-letter): Use fill-prefix to do
+ 	message headers.
+ 
+ Thu Apr 20 13:22:00 1995  Torbj|rn Einarsson  <tfkte@fy.chalmers.se>
+ 
+ 	* f90.el (f90-keywords): "only" added to keyword list.
+ 	(f90-font-lock-keywords-1): Type may now have attributes private
+ 	and public.
+ 	(f90-font-lock-keywords-2): Fixed difference between type and type().
+ 	(hilit-set-mode-patterns): Type may now have attributes private.
+ 	and public, fixed difference between type and type().
+ 	(f90-p-type-re): New regular-expression constant for type commands.
+ 	(f90-mode): indent-tabs-mode put to nil by default.
+ 	(f90-looking-at-type-like): Now uses f90-p-type-re.
+ 	(f90-no-block-limit): Now uses f90-p-type-re.
+ 	(f90-change-keywords): Don't change preprocessor lines.
+ 
+ Thu Apr 20 11:39:25 1995  Kevin Rodgers <kevinr@ihs.com>
+ 
+ 	* dired-x.el: Change the instructions in the INSTALLATION
+ 	comment block to set buffer-local variables like
+ 	dired-omit-files-p in dired-mode-hook.
+ 	(dired-omit-files-p): Make local to all buffers.
+ 	(dired-omit-files): Fix doc string (not buffer-local).
+ 	(dired-omit-startup): Don't need to make dired-omit-files-p
+ 	local to buffer here.
+ 
+ Thu Apr 20 04:38:36 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* rmail.el (rmail-get-new-mail): Simply the reversion check;
+ 	don't call rmail-forget-messages.
+ 
+ Wed Apr 19 22:22:06 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* rmail.el (rmail-revert): Call rmail-mode after reverting
+ 	to make sure rmail-message-vector is buffer-local.
+ 
+ 	* undigest.el (undigestify-rmail-message): Strip "^- " which is
+ 	added by some digest makers to the beginning of lines.
+ 
+ Wed Apr 19 02:06:24 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* info.el (info-insert-file-contents): Set default-directory
+ 	around call to shell-command-on-region.
+ 
+ Wed Apr 19 10:39:00 1995  Mike Williams  <mikew@gopher.dosli.govt.nz>
+ 
+ 	* mouse-sel.el: Downcase function parameters.
+ 	Doc fixes.
+ 
+ 	* mouse-sel.el Rewrite to support secondary selection.
+ 	(mouse-sel-maintainer-address): New constant.
+ 	(mouse-sel-submit-bug-report): New function.
+ 	Rename mouse-sel-selection-type to mouse-sel-primary-thing.
+ 	(mouse-sel-secondary-thing): New variable.
+ 	(mouse-sel-selection-alist): New constant.
+ 	(mouse-sel-set-selection-function): Semantics changed.  Value
+ 	should now be a function taking two arguments.
+ 	(mouse-sel-get-selection-function): Semantics changed.  Value
+ 	should now be a function taking one argument.
+ 	(mouse-sel-selection-owner-p-function): New variable.
+ 	Removed variable mouse-sel-check-selection-function.
+ 	Rename mouse-sel-determine-selection-type to
+ 	mouse-sel-determine-selection-thing.
+ 	(mouse-sel-set-selection): New function.
+ 	(mouse-sel-get-selection): New function.
+ 	(mouse-sel-selection-owner-p): New function.
+ 	(mouse-sel-selection-overlay): New function.
+ 	(mouse-sel-selection-thing): New function.
+ 	(mouse-sel-region-to-primary): New function.
+ 	(mouse-sel-primary-to-region): New function.
+ 	(mouse-sel-eval-at-event-end): New macro.
+ 	(mouse-sel-determine-selection-thing): Quad-click selects paragraphs.
+ 	Removed variable mouse-sel-retain-highlight; use inverse of
+ 	transient-mark-mode instead.
+ 	(mouse-select-internal): New function.
+ 	(mouse-select): Re-written using mouse-select-internal and
+ 	mouse-sel-primary-to-region.
+ 	(mouse-select-secondary): New function.
+ 	(mouse-extend-internal): New function.
+ 	(mouse-extend): Re-written using mouse-extend-internal,
+ 	mouse-sel-region-to-primary and mouse-sel-primary-to-region.
+ 	(mouse-extend-secondary): New function.
+ 	(mouse-insert-selection-internal): New function.
+ 	(mouse-insert-selection): Re-written using
+ 	mouse-insert-selection-internal.
+ 	(mouse-insert-secondary): New function.
+ 	(mouse-sel-validate-selection): Check all selections in
+ 	mouse-sel-selection-alist.
+ 
+ Tue Apr 18 13:39:55 1995  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+ 
+ 	* info.el (Info-find-node, Info-restore-point, Info-search,
+  	Info-forward-node, Info-backward-node): Use string-equal, not equal,
+ 	to compare node names.
+ 
+ 	* cpp.el (cpp-edit-reset): Fix typo.
+ 	(cpp-signal-read-only, cpp-grow-overlay): Update to new calling
+ 	conventions.
+ 	(cpp-make-overlay-hidden): Don't allow insertion before a
+ 	read-only overlay.
+ 
+ Tue Apr 18 20:05:20 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* cl-specs.el (pushnew): Use edebug-keywordp.
+ 
+ 	* edebug.el (edebug-match-keywordp): Function deleted.
+ 
+ 	* finder.el (finder-known-keywords): Add `debugging'.
+ 
+ 	* vc-hooks.el (vc-buffer-backend): New function.
+ 	Also new variable, local in all buffers.
+ 	(vc-kill-buffer-hook): Kill local vc-buffer-backend.
+ 	* vc.el (vc-update-change-log): Use vc-buffer-backend in menu-enable.
+ 
+ Tue Apr 18 18:53:56 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* complete.el: Add Keywords: comment header for finder.el.
+ 
+ Tue Apr 18 15:23:05 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* menu-bar.el: Disable many Files menu items in minibuffer.
+ 	(menu-bar-search-menu): Add ... to many items.
+ 	Add a query-replace-regexp item.
+ 	(nonincremental-repeat-search-forward): Renamed from noninteractive...
+ 	(nonincremental-repeat-search-backward): Likewise.
+ 	(nonincremental-repeat-re-search-forward): Likewise.
+ 	(nonincremental-repeat-re-search-backward): Likewise.
+ 
+ 	* frame.el (frame-notice-user-settings):
+ 	Don't respecify an old value which was nil and remains nil.
+ 
+ Tue Apr 18 14:29:14 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* etags.el (tags-search, tags-query-replace): Put (quote ...)
+  	around args inserted into forms to be evalled.
+ 
+ Tue Apr 18 03:00:44 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* cpp.el (cpp-edit-list): Move definition toward start of file.
+ 	(cpp-face-type-list, cpp-writable-list, cpp-button-event)
+ 	(cpp-edit-buffer, cpp-branch-list, cpp-face-default-list)
+ 	(cpp-face-light-name-list, cpp-face-dark-name-list)
+ 	(cpp-face-light-list, cpp-face-dark-list, cpp-face-mono-list)
+ 	(cpp-face-none-list, cpp-face-all-list, cpp-overlay-list): Likewise.
+ 
+ 	* cpp.el (cpp-highlight-buffer): Rename stack to cpp-state-stack.
+ 	(cpp-parse-open, cpp-parse-close): Likewise.
+ 	(cpp-push-button, cpp-choose-symbol): Rename data to cpp-callback-data.
+ 	(cpp-state-stack, cpp-callback-data): Add defvars.
+ 
+ 	* simple.el (line-move): Fix previous change: if we get an error,
+ 	move to where the error happened, don't go back to starting point.
+ 
+ Mon Apr 17 23:37:58 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* forms.el: Major rewrite to use `intangible' property.
+ 
+ Mon Apr 17 14:51:54 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* map-ynp.el (map-y-or-n-p): Don't log prompt messages.
+ 
+ Mon Apr 17 14:42:13 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* finder.el (finder-known-keywords): Generalize `c' keyword.
+ 
+ Sun Apr 16 23:01:43 1995  Ethan Bradford  <ethanb@phys.washington.edu>
+ 
+ 	* ispell.el (ispell-init-ispell): Don't barf if there is a
+ 	warning message	before the version line when Ispell starts up.
+ 
+ Sun Apr 16 00:01:10 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* font-lock.el (font-lock-make-faces): Determine
+ 	font-lock-background-mode from color values of background color.
+ 
+ 	* facemenu.el (list-colors-display): Minor clarification.
+ 	(facemenu-special-menu): Add "Intangible" item.
+ 	(facemenu-color-equal): Doc fix.
+ 
+ 	* faces.el (set-face-background): Handle FRAME = nil directly
+ 	so stipple colors work in that case.
+ 
+ 	* term/x-win.el (x-defined-colors): Take frame as optional arg.
+ 	Check whether colors are really supported on the display in use.
+ 
+ Sat Apr 15 01:40:12 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* files.el (set-auto-mode): If -*- spec doesn't set `mode:',
+ 	look for other ways of specifying major mode.
+ 
+ 	* talk.el: New file.
+ 
+ 	* dired.el (dired-mode-map): Rename commands for A and Q.
+ 
+ 	* dired-aux.el (dired-do-search): Renamed from dired-do-tags-search.
+ 	(dired-do-query-replace): Renamed from dired-do-tags-query-replace.
+ 
+ Fri Apr 14 19:15:47 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* cpp.el (cpp-parse-open): Delete comments that go past end of line.
+ 	(cpp-edit-reset): Clean up the four standard buttons.
+ 	(cpp-parse-buffer): Name was undefined--use cpp-highlight-buffer.
+ 
+ 	* finder.el (finder-known-keywords):
+ 	Add frames, hypermedia, outlines, oop.
+ 
+ Fri Apr 14 21:03:27 1995  Erik Naggum  <erik@naggum.no>
+ 
+ 	* rmail.el (rmail-reformat-message): Call `rmail-clear-headers'
+  	also if `rmail-displayed-headers' is set.
+ 	(rmail-clear-headers): Handle `rmail-displayed-headers' correctly.
+ 
+ Fri Apr 14 18:01:38 1995  Erik Naggum  <erik@naggum.no>
+ 
+ 	* rmail.el (rmail-insert-inbox-text): When reading old
+ 	.newmail-<user> file, report it specifically.
+ 
+ Fri Apr 14 13:15:37 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* mouse.el: Create mouse-drag-overlay as a dead overlay, instead
+ 	of having it live in the *scratch* buffer until first used.
+ 
+ 	* edt-vt100.el (edt-vt100-revision): Deleted.
+ 	* edt-pc.el (edt-pc-revision): Deleted.
+ 	* edt-mapper.el (edt-mapper-revision): Deleted.
+ 	* edt-lk201.el (edt-lk201-revision): Deleted.
+ 	* edt.el: Many doc fixes.
+ 	(edt-version): Deleted.
+ 
+ Fri Apr 14 12:05:38 1995  Morten Welinder  <terra+@cs.cmu.edu>
+ 
+ 	* tar-mode.el (tar-mode): Locally bind next-line-add-newlines to nil.
+ 	(tar-subfile-mode): Doc fix.
+ 	(tar-expunge): Make questions and messages start with uppercase letter.
+ 	(tar-summarize-buffer): Ditto.
+ 	(tar-subfile-save-buffer): Make message like others.
+ 	(tar-mode): Locally bind local-write-file-hooks.
+ 	(tar-mode-write-file): Renamed from tar-mode-maybe-write-tar-file.
+ 	(tar-mode-write-file): Simplify to only work for tar file buffers.
+ 	(write-file-hooks): Don't modify this.
+ 
+ Fri Apr 14 01:53:54 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* derived.el (derived-mode-merge-keymaps): Recursively merge
+ 	prefix key submaps also.
+ 
+ Thu Apr 13 18:14:58 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* edebug.el (edebug-gensym): Renamed from gensym.
+ 	Don't use concat on an integer.  Define unconditionally.
+ 	(edebug-gensym-index): Renamed from *gensym-index*.
+ 	(edebug-lambda-list-keywordp): Renamed from lambda-list-keywordp.
+ 	(edebug-keywordp): Renamed from keywordp.  Define unconditionally.
+ 
+ 	* vc-hooks.el (vc-kill-buffer-hook):
+ 	Don't put it on kill-buffer-hook.
+ 	(vc-file-clearprops): Function moved here.
+ 	(vc-workfile-version): Function moved here.
+ 	(vc-mode-line): Don't call vc-locking-user.
+ 
+ 	* vc.el (vc-file-clearprops, vc-workfile-version):
+ 	Functions moved to vc-hooks.el.
+ 
+ 	* edebug.el (edebug-emacs-19-specific): Use name edebug-menu
+ 	for the easy-menu-define call.
+ 
+ 	* font-lock.el (font-lock-make-faces-done): New variable.
+ 	(font-lock-make-faces): Set font-lock-make-faces-done to t.
+ 	Don't call it when loading the file.
+ 	(font-lock-mode): Call font-lock-make-faces if not yet done.
+ 
+ 	* bytecomp.el (byte-compile-log-file): Always insert at eob.
+ 	(byte-compile-insert-header): Cope if user-mail-address is nil.
+ 
+ Thu Apr 13 18:00:00 1995  Andre Spiegel  <spiegel@bruessel.informatik.uni-stuttgart.de>
+ 
+ 	* vc-hooks.el: Add branch support for RCS;
+ 	treat CVS more like RCS and SCCS.
+         (vc-occurences, vc-trunk-p, vc-branch-p, vc-minor-revision)
+         (vc-branch-part): new functions that operate on RCS revision numbers.
+         (vc-status): Use the new property vc-workfile-version
+ 	and vc-locking-user (see vc.el).  Display "locking state" for CVS.
+         (vc-find-cvs-master): Search for file name case-sensitively, store
+ 	version number into the new property vc-workfile-version.
+ 	(vc-find-file-hook): kill any remaining properties.  Like this,
+ 	when re-finding a file (for example because it has changed on disk),
+ 	the version control state gets re-computed.
+ 	(vc-mode-line): CVS case: make the buffer read-only if the file
+ 	is unmodified.
+         (vc-kill-buffer-hook): Clear file's vc props when buffer is killed.
+ 
+         * vc.el: Add branch support for RCS; treat CVS more like RCS and SCCS.
+ 	(vc-next-action-on-file): changed CVS handling, such that C-x C-q
+ 	works as with RCS and SCCS.
+ 	(vc-consult-rcs-headers): New function.
+         (vc-branch-version): New per-file property, refers
+ 	to the RCS version selected by `rcs -b'.
+ 	(vc-workfile-version): New function.  Also new per-file property
+ 	(vc-consult-headers): New parameter variable.
+ 	(vc-mistrust-permissions): Default set to `nil'.
+         (vc-locking-user): Property is now cached.  The other functions
+ 	update it as necessary.  Attempts to use RCS headers if enabled.
+         (vc-log-info, vc-parse-buffer): Various bug fixes.  Added support
+ 	for property `vc-branch-version'.
+ 	(vc-backend-checkout): RCS case: if no explicit version
+ 	is specified, check out `vc-workfile-version'.  After check-out,
+ 	set `vc-workfile-version' according to the version number
+ 	reported by "co".
+ 	(vc-backend-checkin): RCS case: remove any remaining locks
+ 	if a new branch was created.  After every check-in, adjust
+ 	the current branch using `rcs -b' (this cannot be avoided).
+ 	CVS case: allow for explicit checkin, but only on the trunk.
+ 	(vc-next-action-on-file, vc-backend-checkout, vc-backend-checkin,
+ 	vc-backend-revert, vc-backend-diff): Explicitly use
+ 	vc-workfile-version as the default version to operate on.
+ 
+ Thu Apr 13 01:43:13 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* help.el (print-help-return-message): Check same-window-buffer-names
+ 	and same-window-regexps.
+ 
+ 	* help-macro.el (make-help-screen): Explicitly translate
+ 	key thru function-key-map.
+ 
+ 	* tabify.el (tabify): Include entire first line in narrowing.
+ 
+ 	* sendmail.el (mail-do-fcc): Use just find-buffer-visiting
+ 	to find buffer to append to.
+ 
+ Wed Apr 12 03:05:23 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* select.el (x-set-selection): Fix up interactive defaults.
+ 
+ 	* fill.el (fill-paragraph, fill-region, fill-nonuniform-paragraphs)
+ 	(fill-individual-paragraphs): Pass `full' for JUSTIFY arg,
+ 	in the interactive spec, if have prefix arg.
+ 
+ Tue Apr 11 10:20:51 1995  Stephen Gildea  <gildea@x.org>
+ 
+ 	* time-stamp.el (time-stamp-format): Replace list of Lisp
+ 	functions with string containing %-escapes, as in `date' program.
+ 	(time-stamp): Widen buffer while time-stamping.
+ 	(time-stamp-toggle-active): New function.
+ 	(time-stamp-warn-inactive): New variable.
+ 
+ Tue Apr 11 23:15:40 1995  Geoff Voelker  <voelker@cs.washington.edu>
+ 
+         * loadup.el [WINDOWSNT]: Find doc strings.
+ 
+ 	* files.el (set-auto-mode) [WINDOWSNT]: Match insensitive to case.
+ 
+ 	* dired-aux.el (dired-do-chmod): Use dired-chmod-program.
+ 	(dired-do-chgrp, dired-do-chown) [DOS_NT]: Disabled.
+ 
+ 	* dired.el (dired-chmod-program): Defined.
+ 
+ 	* makefile.nt (all): Use DEL_TREE instead of delnode.
+ 
+ 	* winnt.el: Key [C-M-backspace] defined.
+ 	(mode-line-format): Defined.
+ 
+ Tue Apr 11 19:00:36 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* mail-hist.el (mail-hist-put-headers-into-history):
+ 	Add save-excursion around entire function.
+ 
+ Tue Apr 11 11:46:38 1995  Boris Goldowsky  <boris@cs.rochester.edu>
+ 
+ 	* facemenu.el (facemenu-read-color): Don't ignore PROMPT arg.
+ 	Make arg optional.
+ 	(facemenu-unlisted-faces): Add font-lock faces to default value.
+ 
+ Tue Apr 11 09:17:49 1995  enami tsugutomo  <enami@sys.ptg.sony.co.jp>
+ 
+ 	* perl-mode.el (perl-comment-indent): Make extra space only when
+ 	not at beginning of line.
+ 
+ Mon Apr 10 08:30:04 1995  Stefan Schoef  <schoef@Informatik.Uni-Oldenburg.DE>
+ 
+         * bibtex.el (bibtex-find-text, bibtex-remove-double-quotes-or-braces):
+ 	Support both kind of delimiters (braces or quotes) regardless of the
+ 	value of bibtex-field-left-delimiter and bibtex-field-right-delimiter.
+         (bibtex-field-left-delimiter, bibtex-field-right-delimiter):
+ 	Made buffer-local.
+ 
+         * bibtex.el (bibtex-beginning-of-entry): At the beginning of an
+  	entry, leave point at the beginning of that entry instead of
+  	moving to the beginning of the previous one.
+         (bibtex-end-of-entry): Outside an entry, now move to the end of
+  	the *previous* entry (i.e. bibtex-beginning-of-entry and
+  	bibtex-end-of-entry are now idempotent).
+         (bibtex-sort-entries, bibtex-clean-entry): Removed now obsolete
+         calls of bibtex-beginning-of-entry just before calls to
+         bibtex-end-of-entry.
+         (bibtex-clean-entry): Minor change to adapt to new behavior of
+         bibtex-beginning-of-entry.
+ 
+ Mon Apr 10 19:21:41 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* reporter.el (reporter-mailer): Replace mail with reporter-mail.
+ 	(reporter-mail): New function.
+ 	(reporter-submit-bug-report): Don't check return value of
+ 	the reporter-mailer function.
+ 
+ Mon Apr 10 15:50:39 1995  Boris Goldowsky  <boris@cs.rochester.edu>
+ 
+ 	* simple.el (newline): Don't auto-fill if flag is on; it was
+ 	filling wrong line.
+ 
+ Mon Apr 10 12:45:56 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* compile.el (compilation-error-regexp-alist): Remove superfluous
+  	SGI cc regexp.
+ 
+ Mon Apr 10 09:26:08 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
+ 
+ 	* version.el (emacs-major-version, emacs-minor-version): Use
+         match-string rather than substring.
+ 
+ Mon Apr 10 03:09:18 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* pc-mode.el (pc-bindings-mode): New file.
+ 
+ 	* loaddefs.el (global-map): Bind C-M-backspace like C-M-delete.
+ 
+ Sun Apr  9 20:02:47 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* files.el (write-file): Default is ask for confirmation
+ 	only interactively.
+ 
+ Sun Apr  9 18:28:45 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* mh-e.el, mh-seq.el, mh-pick.el, mh-mime.el: New version from author.
+ 	* mh-comp.el, mh-utils.el, mh-funcs.el: New version from author.
+ 
+ Sun Apr  9 14:57:14 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* server.el (server-switch-buffer): Make first arg optional too;
+  	server-edit might pass no args, since server-done might return nil.
+ 
+ Sun Apr  9 01:31:30 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* simple.el (line-move): Turn off intangibility for intermediate stops.
+ 
+ 	* menu-bar.el (menu-bar-update-buffers): Reuse the entry for
+ 	list-buffers rather than making a new one each time.
+ 
+ 	* simple.el (newline): Don't indent afterward if at page sep line.
+ 	Delete whitespace on blank line before the inserted newlines.
+ 	(open-line): Add all the left margins and fill prefixes
+ 	after inserting all the newlines.
+ 
+ 	* bytecomp.el (byte-compile-log-file): New function.
+ 	(displaying-byte-compile-warnings): Log the file name at start;
+ 	display the log buffer only if something more gets output by BODY.
+ 	(byte-compile-warnings-point-max): Initialize to nil.
+ 
+ Sun Apr  9 07:29:26 1995  G Dinesh Dutt  (brat@htilbom.ernet.in)
+ 
+ 	* etags.el (list-tags): Delete call to select-tags-matched-file.
+ 
+ Sat Apr  8 23:51:05 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* term/x-win.el (mode-line-buffer-identification):
+ 	Fix prev change; use setq-default.
+ 
+ Sat Apr  8 23:18:33 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* etags.el (next-file): Handle empty list returned by
+  	(tags-table-files).
+ 
+ Sat Apr  8 18:37:04 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* replace.el (occur): Provide 5 cols for line number.
+ 
+ 	* ange-ftp.el (ange-ftp-parse-netrc): Bind `default-directory' to
+ 	"/" to avoid infinite loop while expanding filename.
+ 	(ange-ftp-message): Don't truncate message in batch mode.
+ 
+ 	* simple.el (completion-setup-function): Undo March 11 change.
+ 	Add some doc strings to completion-related variables.
+ 
+ Sat Apr  8 16:15:37 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* compile.el (compilation-error-regexp-alist): Extend Ultrix 3.0
+  	f77 regexp to also match SGI cc.
+ 
+ Sat Apr  8 15:59:11 1995  Morten Welinder  <terra+@cs.cmu.edu>
+ 
+ 	* comint.el (make-comint): Error, if start-process is not fboundp.
+ 
+ 	* menu-bar.el (menu-bar-edit-menu): Don't define ispell item
+ 	unless start-process is fboundp.
+ 
+ Sat Apr  8 15:41:37 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* rnewspost.el (news-reply-mode):
+ 	Make mail-header-separator into regexp.
+ 
+ 	* sendmail.el (mail-mode): Convert mail-header-separator to regexp
+ 	for use in paragraph-start, etc.
+ 
+ 	* ispell.el (ispell-message): Make mail-header-separator into regexp
+ 	and add $ at end.
+ 
+ 	* window.el (walk-windows): Doc fix.
+ 
+ Sat Apr  8 03:31:49 1995  Noah Friedman  <friedman@prep.ai.mit.edu>
+ 
+         * rsz-mini.el (resize-minibuffer-window): Make sure minibuffer
+         window is selected.
+         (resize-minibuffer-window-restore): Likewise.
+ 
+ Sat Apr  8 01:00:37 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* fill.el (fill-region-as-paragraph): Undo previous change.
+ 	Instead, set JUSTIFY to `full' in the interactive spec.
+ 
+ 	* startup.el (normal-top-level): Copy default-directory
+ 	from *scratch* to *Messages*.
+ 
+ 	* menu-bar.el (menu-bar-file-menu): Add back as alias for
+ 	menu-bar-files-menu.
+ 
+ Fri Apr  7 22:49:34 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* loaddefs.el (mode-line-buffer-identification): Use %F by default.
+ 	([C-delete]): Bind C-delete normally, not in function-key-map.
+ 
+ 	* term/x-win.el (mode-line-buffer-identification): Eliminate %F.
+ 
+ Fri Apr  7 17:22:41 1995  Noah Friedman  <friedman@prep.ai.mit.edu>
+ 
+         * rlogin.el (rlogin): Use format, not concat, to generate numeric
+         buffer names.
+         Do not create a new buffer if process in existing buffer has exited.
+         (rlogin-directory-tracking-mode): Set shell-dirtrackp, not
+         shell-dirtrack-p.
+ 
+ Fri Apr  7 17:27:59 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* ebuff-menu.el (electric-buffer-menu-mode-map): Undefine ESC ESC
+ 	before binding ESC ESC ESC.
+ 
+ 	* edt.el (edt-keep-current-page-delimiter): Doc fix.
+ 
+ 	* find-file.el: Many doc fixes.
+ 	(ff-upcase-p): Renamed from upcase-p.  Callers changed.
+ 	(ff-emacs-19): Renamed from ff-gnu-emacs-19.
+ 	(ff-string-match): Simplify.
+ 
+ 	* docref.el (docref-last-active-buffer): Add defvar.
+ 
+ Fri Apr  7 14:32:56 1995  Boris Goldowsky  <boris@cs.rochester.edu>
+ 
+ 	* indent.el (set-right-margin): Fix prompt.
+ 	* fill.el (fill-region): Avoid error on reaching end of buffer.
+ 
+ 	* avoid.el: Add autoload cookies; doc fixes.
+ 	(mouse-avoidance-set-pointer-shape): New function.
+ 	(mouse-avoidance-nudge-mouse): Use it.
+ 	(mouse-avoidance-fancy-hook): streamline args to set-mouse-pos.
+ 
+ Fri Apr  7 02:02:10 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* msb.el (msb--toggle-menu-type): menu-bar-update-buffers wants 0 args.
+ 
+ 	* bytecomp.el (byte-compile-output-docform): Output doc string position
+ 	as negative number, if doc string starts with *.
+ 
+ 	* mail-hist.el: Use $ at end when searching for mail-header-separator.
+ 
+ 	* fill.el (fill-region-as-paragraph): If JUSTIFY is non-nil,
+ 	pass t to justify-current-line.
+ 
+ Thu Apr  6 13:57:13 1995  Morten Welinder  <terra+@cs.cmu.edu>
+ 
+ 	* desktop.el (desktop-save): Use dired-directory as name
+ 	of top-level in order to capture wildcards used.
+ 	(desktop-buffer-dired): Skip possible wildcard when checking
+ 	for directory existance.  Use dired-insert-subdir, not
+ 	dired-maybe-insert-subdir.
+ 
+ Thu Apr  6 15:24:30 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* files.el (write-file): Fix arg count in call to y-or-n-p.
+ 
+ Thu Apr  6 01:20:46 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* ispell.el (ispell-menu-map-needed): Delete test for menu-bar feature.
+ 
+ 	* bookmark.el (menu-bar-bookmark-map): Autoload each form
+ 	used to set up this variable's value, so that the whole job
+ 	is done in loaddefs.el.
+ 	(bookmark-menu-locate, bookmark-menu-jump, bookmark-menu-insert)
+ 	(bookmark-menu-delete, bookmark-menu-rename): Add autoloads.
+ 
+ 	* buff-menu.el (list-buffers-noselect): Put buffer name in a text
+ 	property on the buffer's name.  Put in mouse-face prop here too.
+ 	Set Buffer-menu-buffer-column here.
+ 	(Buffer-menu-mode): Don't do those things here.
+ 	(Buffer-menu-buffer): Use text properties.
+ 	(Buffer-menu-buffer-name-position): Function deleted.
+ 
+ 	* tar-mode.el (tar-clear-modification-flags): Fix several bugs.
+ 
+ Wed Apr  5 22:11:13 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* tar-mode.el (tar-mode-map): Fix typo for tar-display-other-file.
+ 
+ Wed Apr  5 15:30:52 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* tempo.el (tempo-build-collection): Clear flag after computing
+ 	return value.
+ 
+ Tue Apr  4 18:47:58 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* ispell.el (ispell-personal-dictionary): Add autoload.
+ 
+ 	* simple.el: Change bindings of event-apply-control-modifier,
+ 	event-apply-meta-modifier, event-apply-hyper-modifier,
+ 	event-apply-shift-modifier, event-apply-alt-modifier, and
+ 	event-apply-super-modifier, in function-key-map, to use C-x @
+ 	instead of C-x ESC.  Using escape causes problems since that's
+ 	in function-key-map itself.
+ 
+ 	* byte-opt.el (byte-compile-inline-expand): Fetch actual bytecode
+ 	before inlining a lazy function.
+ 
+ 	* tempo.el (tempo-dolist): Don't use `cadr'.
+ 
+ 	* simple.el (event-apply-modifier): Fix off-by-one errors.
+ 
+ Mon Apr  3 18:00:06 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* jka-compr.el (jka-compr-install): Doc fix.
+ 	(jka-compr-uninstall): Delete entries that jka-compr-install
+ 	added to inhibit-first-line-modes-suffixes.
+ 
+ Mon Apr  3 18:15:11 1995  David K}gedal  <davidk@lysator.liu.se>
+ 
+ 	* tempo.el (tempo-insert):
+ 	Added the P tag and modified the s tag accordingly
+ 	(tempo-insert-named): Checks for valid name, insert mark otherwise.
+ 
+ 	* tempo.el (tempo-dolist): Changed (cadr ...) to (car (cdr ...))
+ 
+ 	* tempo.el (tempo-expand-if-complete): New function
+ 
+ Mon Apr  3 17:36:50 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* files.el (set-auto-mode): Fix previous change.
+ 
+ Mon Apr  3 08:11:19 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
+ 
+ 	* comint.el (comint-file-name-quote-list): New variable of special
+ 	characters that are quoted when in file names (default nil).
+ 	(comint-mode): Make it buffer local.
+ 	(comint-quote-filename): Quote them if they are in the file name.
+ 	(comint-dynamic-complete-as-filename,
+ 	comint-dynamic-list-filename-completions): Call it before insertion.
+ 	(comint-unquote-filename): Unquote any character in the file name.
+ 	(comint-match-partial-filename): Call it before substitution.
+ 	(comint-word): Include any quoted character as part of the word.
+ 	(comint-completion-addsuffix): Value can be a cons pair of strings.
+ 	(comint-dynamic-complete-as-filename,
+ 	comint-dynamic-simple-complete): Use it when inserting suffixes.
+ 
+ 	* shell.el (shell-file-name-quote-list): New variable of special
+ 	characters that are quoted when present in file names.
+ 	(shell-mode): Set comint-file-name-quote-list with it.
+ 
+ Sun Apr  2 00:40:15 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* netunam.el: File deleted.
+ 
+ 	* menu-bar.el (menu-bar-edit-menu): Capitalize an item name.
+ 	(menu-bar-tools-menu): Add verb to Calendar item.
+ 	(menu-bar-help-menu): Rename Info to Browse Manuals.
+ 
+ 	* sendmail.el (mail-mode-map): Longer title for headers submenu.
+ 
+ Sat Apr  1 00:14:46 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* fill.el (fill-region-as-paragraph): Remove fill-prefix first,
+  	then remove indentation.
+ 
+ 	* files.el (inhibit-first-line-modes-suffixes): New variable.
+ 	(set-auto-mode): Use it.
+ 	(inhibit-first-line-modes-regexps): Use \\', not $.
+ 
+ 	* jka-compr.el (jka-compr-install): Add items to
+ 	inhibit-first-line-modes-suffixes.
+ 
+ 	* reporter.el (reporter-submit-bug-report): Give up if mailer
+ 	command returns nil.  Fix error message syntax.
+ 	(reporter-bug-hook): Fix error message syntax.
+ 
+ Fri Mar 31 17:05:15 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* unrmail.el (unrmail): Don't make or switch to a summary buffer.
+ 
+ 	* rmail.el (rmail-displayed-headers): New variable.
+ 	(rmail-clear-headers): Handle rmail-displayed-headers
+ 
+ Fri Mar 31 10:11:15 1995  Michael Ernst  <mernst@research.microsoft.com>
+ 
+ 	* scheme.el (scheme-indent-sexp): Don't fail when
+ 	calculate-scheme-indent returns a one-element list.
+ 
+ 	* rmailsum.el (rmail-summary-toggle-header): Make header visible
+ 	in message buffer.
+ 
+ Fri Mar 31 13:52:21 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* macros.el (insert-kbd-macro): Do something reasonable for vectors.
+ 
+ Thu Mar 30 20:46:55 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* simple.el (choose-completion-string): Use active-minibuffer-window.
+ 
+ 	* dired-aux.el (dired-add-entry): If ange-ftp inserted the file's
+ 	absolute name, fix that.
+ 
+ Thu Mar 30 18:37:43 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* comint.el (comint-read-noecho): Don't log prompt messages.
+ 
+ Thu Mar 30 02:14:32 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* apropos.el (apropos): Use apropos-worthy-symbol-p
+ 	as default predicate.
+ 	(apropos-worthy-symbol-p): New function.
+ 
+ 	* faces.el (modify-face): Handle stipple.  Handle defaulting properly.
+ 	Speed up making completion alists.
+ 	(modify-face-read-string): New subroutine.
+ 
+ Thu Mar 30 01:59:12 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
+ 
+ 	* dired.el (dired-insert-directory): Wrap filename character
+         quoting code with save-excursion.
+ 
+ Wed Mar 29 02:14:12 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* window.el (minibuffer-window-active-p): Use active-minibuffer-window.
+ 
+ Tue Mar 28 17:24:35 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* comint.el (comint-read-noecho): Use a format string, in case
+ 	PROMPT contains a percent sign.
+ 
+ Tue Mar 28 11:54:57 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* nntp.el (nntp-request-article): If ID is integer, convert to string.
+ 
+ Mon Mar 27 17:14:03 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* simple.el (event-apply-modifier): New function.
+ 	(event-apply-control-modifier, event-apply-meta-modifier)
+ 	(event-apply-hyper-modifier, event-apply-shift-modifier)
+ 	(event-apply-alt-modifier, event-apply-super-modifier):
+ 	New functions, with bindings in function-key-map.
+ 
+ 	* files.el (insert-directory): Use \ before insert-directory-program
+ 	to ignore shell aliasing.
+ 
+ Mon Mar 27 10:26:49 1995  Boris Goldowsky  <boris@cs.rochester.edu>
+ 
+ 	* enriched.el (enriched-mode): Use new plist-put and plist-get
+ 	functions, and change name of default-text-properties var.
+ 
+ Mon Mar 27 02:49:02 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* cplus-md.el (calculate-c++-indent): Copy colon-line-end code
+ 	from calculate-c-indent.
+ 
+ Sat Mar 25 14:09:29 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* scroll-bar.el (scroll-bar-drag): Bind echo-keystrokes to 0.
+ 
+ Fri Mar 24 22:04:30 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* rmail.el (rmail-display-labels): Use `format' to convert
+ 	message numbers to strings.
+ 
+ Fri Mar 24 18:41:20 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* bytecomp.el (byte-compile-out-toplevel): Compile lambda forms
+ 	even if trivial.
+ 
+ Fri Mar 24 04:01:31 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
+ 
+ 	* subr.el (match-string): Change to defun, but still return nil if
+         no match.
+ 
+ Thu Mar 23 16:41:30 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* c-mode.el (c-style-alist): Set c-continued-brace-offset and
+ 	c-brace-offset in all styles, so that they don't inherit a trash
+ 	value from a previously set style.
+ 
+ 	* compile.el (compilation-sentinel): Use `format'; `concat' doesn't
+ 	stringize integers anymore.
+ 
+ 	* loadup.el: Don't load mouse and face files in system-specific
+ 	branches; an earlier test has already loaded them based on a
+ 	symbol equivalent to HAVE_MOUSE or HAVE_FACES.
+ 
+ Thu Mar 23 15:41:00 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* asm-mode.el (asm-mode): Make a per-buffer child keymap here.
+ 	Use asm-comment-char to specify which character to define.
+ 	(asm-mode-map): Don't bind `;' at load time.
+ 
+ 	* pascal.el (pascal-mode-version): Variable deleted.
+ 
+ Thu Mar 23 17:16:44 1995  Espen Skoglund  <espensk@tklab4.cs.uit.no>
+ 
+ 	* pascal.el (pascal-mode-syntax-table): Give \ punctuation syntax.
+ 
+ Thu Mar 23 03:36:15 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
+ 
+ 	* subr.el (match-string): New macro.  Unlike the function version,
+         returns nil if no match.
+ 
+ Wed Mar 22 16:30:58 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* asm-mode.el: Doc fixes.
+ 
+ Wed Mar 22 15:38:18 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* mlsupport.el (ml-concat): New function.
+ 	* mlconvert.el: Translate concat to ml-concat.
+ 
+ Wed Mar 22 11:57:15 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* window.el (one-window-p, walk-windows, minibuffer-window-active-p):
+ 	Functions moved here.
+ 	* subr.el (one-window-p, walk-windows, minibuffer-window-active-p):
+ 	Functions moved to window.el.
+ 
+ Tue Mar 21 16:39:39 1995  Boris Goldowsky  <boris@cs.rochester.edu>
+ 
+ 	* facemenu.el: Added autoload cookies, small doc fixes.
+ 	(list-text-properties-at): New fn.
+ 	(facemenu-menu): Add it to menu.
+ 	* menu-bar.el (menu-bar-edit-menu): Add Text Properties item.
+ 
+ Tue Mar 21 00:14:14 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* startup.el (init-file-user, site-run-file): Doc fixes.
+ 
+ 	* vc.el (vc-update-change-log): Use new -u option for rcs2log.
+ 
+ 	* replace.el (occur): Copy default-directory to *Occur* buffer.
+ 
+ 	* simple.el (shell-command): Use *Async Shell Command* for
+ 	asynchronous commands.  Doc fix.
+ 
+ Mon Mar 20 21:18:56 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* tar-mode.el (tar-parse-octal-long-integer): Return list, not vector.
+ 
+ Mon Mar 20 14:42:09 1995  Karl Fogel  <kfogel@floss.cyclic.com>
+ 
+ 	* bookmark.el (bookmark-automatically-show-annotations): new var.
+ 	(bookmark-jump): only show annotation if above var is non-nil.
+ 
+ Mon Mar 20 00:09:06 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* debug.el (debug): Now interactive.
+ 
+ Sun Mar 19 15:09:34 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* c-mode.el (c-mode-map): Use "C-mode", not "C mode".
+ 
+ 	* menu-bar.el (menu-bar-files-menu): Renamed from ...-file-menu.
+ 	(menu-bar-tools-menu, menu-bar-search-menu): New menu bar menus.
+ 	Items moved from Edit and Files menus.
+ 	Add Split Window, One Window, Find Tag and Postscript print menu items.
+ 	(nonincremental-search-forward, nonincremental-search-backward)
+ 	(nonincremental-re-search-forward, nonincremental-re-search-backward)
+ 	(noninteractive-repeat-search-forward)
+ 	(noninteractive-repeat-search-backward)
+ 	(noninteractive-repeat-re-search-forward)
+ 	(noninteractive-repeat-re-search-backward): New commands.
+ 
+ 	* isearch.el (isearch-update-ring): New subroutine.
+ 	(isearch-done): Use that.
+ 
+ Sat Mar 18 02:01:07 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* info.el (Info-next-preorder, Info-next-preorder-1):
+ 	When moving up, advance to next menu item.
+ 
+ 	* sendmail.el (mail): Use pop-to-buffer.
+ 	(same-window-buffer-names): Add *mail*.
+ 	(mail-other-window, mail-other-frame): Bind to nil
+ 	same-window-buffer-names, special-display-buffer-names, and ...regexps.
+ 
+ 	* files.el (write-file): Query if file exists already.
+ 
+ 	* isearch.el (isearch-abort): Treat "incomplete regexp"
+ 	as failure when deciding how much to discard for C-g.
+ 
+ 	* rmail.el (rmail-resend): If mailabbrev loaded, use that to
+ 	expand abbrevs.
+ 
+ 	* mailabbrev.el: Various doc fixes.
+ 	(mail-abbrevs-setup): Use add-hook and make-local-hook.
+ 
+ Fri Mar 17 20:36:44 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* debug.el (debugger-outer-load-read-function): New variable.
+ 	(debug): Bind load-read-function to nil; save old value
+ 	in debugger-outer-load-read-function and restore at end.
+ 	(debugger-eval-expression): Handle load-read-function
+ 	like other magic variables.
+ 
+ Fri Mar 17 18:00:14 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* ediff.el: Delete some autoloads that are now in menu-bar.el.
+ 	Don't put ediff-windows in the menu.
+ 	(ediff-patch-buffer): Use buffer name in error message.
+ 
+ Fri Mar 17 13:16:53 1995  Boris Goldowsky  <boris@spiff.gnu.ai.mit.edu>
+ 
+ 	* format.el: New file.
+ 	* loadup.el: Load format.el.
+ 
+ 	* enriched.el: Some keybindings adjusted for new function names.
+ 	(enriched-auto-save-interval, enriched-downcase-annotations,
+ 	enriched-code-face, enriched-indenatation-face,
+ 	enriched-ignored-ok, enriched-encode-interesting-regexp,
+ 	enriched-decode-special-alist, enriched-decode-interesting-regexp,
+ 	enriched-encode-special-alist, enriched-translated,
+ 	enriched-ignored-list, enriched-open-ans,
+ 	enriched-encode-hard-newline, enriched-decode-hard-newline,
+ 	enriched-push, enriched-pop, enriched-which-assoc,
+ 	enriched-get-face-attribute, enriched-overlays-overlapping,
+ 	enriched-show-codes, enriched-show-margin-codes,
+ 	enriched-show-region-as-code, enriched-nogrow-hook, enriched-warn,
+ 	enriched-looking-at-with-props,
+ 	enriched-search-forward-with-props,
+ 	enriched-search-backward-with-props,
+ 	enriched-text-properties-include, enriched-tag-indentation,
+ 	enriched-open-annotation, enriched-close-annotation,
+ 	enriched-annotate-function, enriched-delete-indentation,
+ 	enriched-move-to-next-property-change): Deleted.
+ 
+ 	(enriched-delq-1, enriched-make-list-uniq,
+ 	enriched-make-relatively-unique, enriched-common-tail,
+ 	enriched-reorder, enriched-insert-annotations,
+ 	enriched-loc-annotations, enriched-annotate-change,
+ 	enriched-encode-unknown): Moved to format.el.  Names changed.
+ 
+ 	(enriched-display-table): Copy standard table if there is one,
+ 	otherwise create new table.
+ 	(enriched-par-props): Don't include front-sticky.
+ 	(enriched-initial-annotation): Made it closer to MIME standard.
+ 	(enriched-file-width): Use new header format.
+ 	(enriched-remove-header): New fn.
+ 	(enriched-par-props, enriched-initial-annotation,
+ 	enriched-annotation-format, enriched-annotation-regexp): Declare
+ 	as const.
+ 	(enriched-translations): Name changed from
+ 	enriched-annotation-alist.  `hard' removed from list.  Description
+ 	of its semantics moved to format.el.
+ 	(enriched-list-valued-properties): Deleted, now
+ 	`format-list-valued' property holds this information.
+ 	(enriched-annotation-name, enriched-annotation-positive-p): Merged
+ 	into enriched-next-annotation.
+ 	(enriched-mode): Do not translate buffer.  This should be done
+ 	already when mode is called.  Do not set
+ 	write-region-annotate-functions or after-change-functions hooks.
+ 	Put text/enriched on buffer-file-format if necessary.  Don't
+ 	set auto-save-interval.  Do set default-properties.
+ 	(enriched-insert-indentation): Do nothing to blank lines.
+ 	(enriched-encode, enriched-decode): New fns are rewritten
+ 	versions of enriched-encode-region and enriched-decode-region.
+ 	Much of the complexity moved to format.el.
+ 	(enriched-next-annotation): Name changed from
+ 	enriched-move-to-next-annotation.  Efficiency & clarity improvements.
+ 	Return value changed to agree with format-deannotate-region.
+ 
+ Fri Mar 17 12:37:30 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* rmail.el (rmail-unix-mail-delimiter): Accept <...> around address
+ 	in Unix `From ' line.
+ 
+ Thu Mar 16 18:28:06 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* isearch.el (isearch-abort): Set isearch-success to nil.
+ 
+ 	* vms-patch.el (make-auto-save-file-name, auto-save-file-name-p):
+ 	Doc fixes.
+ 
+ Thu Mar 16 17:23:57 1995  Boris Goldowsky  <boris@cs.rochester.edu>
+ 
+ 	* indent.el (indent-line-to): move to end of indentation, even if
+ 	it didn't change.
+ 
+ Thu Mar 16 15:22:01 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* ediff.el: Installed new version from author.
+ 	* ediff-diff.el, ediff-init.el, ediff-merg.el: New files.
+ 	* ediff-util.el, ediff-wind.el: New files.
+ 	* menu-bar.el (menu-bar-file-menu): Changed "Emerge" to "Merge" to
+ 	agree with the new ediff package.
+ 
+ 	* frame.el (other-frame): Don't try to unfocus in a termcap frame.
+ 	(frame-notice-user-settings): Skip menu-bar code in a termcap frame.
+ 	(frame-initialize): Set frame-creation-function to
+ 	`make-terminal-frame' if appropriate.
+ 	* loadup.el: Use appropriate `fboundp' tests to decide what to load.
+ 
+ Thu Mar 16 13:47:19 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* simple.el (line-move): Handle conses in buffer-invisibility-spec.
+ 	Handle skipping invisible overlays.
+ 
+ Wed Mar 15 23:32:49 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* allout.el (outline-layout): Doc fix.
+ 
+ 	* edebug.el: Minor doc fixes.
+ 
+ Wed Mar 15 17:20:26 1995  Per Bothner  <bothner@kalessin.cygnus.com>
+ 
+ 	* term.el (term-mouse-paste):  Make work for xemacs-19.11.
+ 	For GNU emacs, don't mouse-set-point, but do
+ 	run-hooks on mouse-leave-buffer-hook,
+ 
+ 	* term.el (term-char-mode):  Fix paren error that caused
+ 	the arrow keys to not be recognized under xemacs.
+ 	Also, simplify/fix [(button2)] to [button2] for paste under xemacs.
+ 
+ Wed Mar 15 18:15:07 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* debug.el (debugger-outer-overriding-local-map): New variable.
+ 	(debug): Bind overriding-local-map to nil; save old value
+ 	in debugger-outer-overriding-local-map and restore at end.
+ 	(debugger-eval-expression): Handle overriding-local-map
+ 	like other magic variables.
+ 
+ Wed Mar 15 09:10:01 1995  enami tsugutomo  <enami@sys.ptg.sony.co.jp>
+ 
+ 	* window.el (balance-windows): Ignore minibuffer window when
+ 	browsing the `levels'.
+ 
+ Wed Mar 15 18:02:55 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* c-mode.el (c-style-alist): For BSD, set c-continued-brace-offset
+ 	instead of c-brace-offset.
+ 
+ Wed Mar 15 16:29:02 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* mouse.el (mouse-major-mode-menu): Avoid confusing error message
+ 	when there's no current local map.
+ 
+ Wed Mar 15 00:30:41 1995  Torbjvrn Axelsson  <torax@ctrl-c.liu.se>
+ 
+ 	* options.el (edit-options): Make the buffer read-only.
+ 	(Edit-options-modify): Cope with that.
+ 
+ Wed Mar 15 09:47:22 1995  Karl Fogel  <kfogel@spiff.gnu.ai.mit.edu>
+ 
+         * bookmark.el: (bookmark-bmenu-2-window): go to correct position
+ 	as well as correct buffer.
+ 	(bookmark-bmenu-other-window): same.
+         (bookmark-bmenu-switch-other-window): same.
+ 
+ Mon Mar 13 22:45:15 1995  Karl Fogel  <kfogel@floss>
+ 
+ 	* bookmark.el: Removed C-v bindings; they were inconsistent.
+ 	Defvarred some variables to nil, solely to avoid compilation warnings.
+ 	Use "Author's Update Number:" instead of "Version:".
+ 	(bookmark-history): new var.
+ 	(bookmark-completing-read): use `bookmark-history'.
+ 	(bookmark-maybe-historicize-string): new macro.
+ 	Use this everywhere `bookmark-completing-read' is used, because
+ 	`completing-read' won't get a chance to add to `bookmark-history' if
+ 	we were invoked via a menu.
+ 	(bookmark-rename): use `bookmark-history' when reading the new name.
+ 	No need for the strange C-o binding anymore.
+ 
+ Mon Mar 13 00:24:40 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* fill.el (adaptive-fill-regexp): Skip # or ;.
+ 	Allow more than one of them (or *'s or >'s).
+ 
+ 	* telnet.el (rsh): Name the buffer *rsh-HOST*.
+ 
+ 	* c-mode.el (c-mode): Make comment-multi-line t locally.
+ 
+ Sun Mar 12 02:38:04 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* simple.el (block-comment-start, block-comment-end): New vars.
+ 	(indent-for-comment): Handle them.
+ 
+ 	* ielm.el (ielm): Use pop-to-buffer.
+ 	(same-window-buffer-names): Add *ielm*.
+ 
+ 	* telnet.el (rsh, telnet): Use pop-to-buffer.
+ 	(same-window-regexps): Add elt to match *telnet-...* and *rsh...*
+ 	with or without <N> at end.
+ 
+ 	* info.el (same-window-buffer-names): Set this only in loaddefs.el,
+ 	not when info.el is loaded.
+ 
+ 	* rlogin.el (rlogin): Use pop-to-buffer.
+ 	(same-window-regexps): Add elt to match *rlogin-...*
+ 	with or without <N> at end.
+ 
+ 	* hexl.el (hexl-mode-old-local-map, hexl-mode-old-mode-name)
+ 	(hexl-mode-old-major-mode): Add defvars.
+ 
+ 	* shell.el (shell): Use pop-to-buffer.
+ 	(same-window-buffer-names): Add *shell* to the list.
+ 
+ 	* auto-show.el: New file.
+ 	Unconditionally add to comint-output-filter-functions.
+ 	(auto-show-mode): Command renamed from auto-show-toggle.
+ 	Handle an arg in the standard way.
+ 	(auto-show-mode): Variable renamed from auto-show-enable.
+ 
+ 	* rnewspost.el (news-reply-mode-map): Add menu bar menus.
+ 
+ 	* rmail.el (rmail-duplicate-message): New function.
+ 	(rmail-list-to-menu): Bind `command' with let.
+ 
+ Sat Mar 11 14:11:58 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* server.el (server-buffer-done): Return a list
+ 	(NEXT-BUFFER KILLED).  KILLED is t if we killed the buffer.
+ 	(server-edit): Values from server-done is now list of
+ 	args for server-switch-buffer.
+ 	(server-switch-buffer): Likewise.
+ 
+ 	* simple.el (completion-setup-function): Set completion-base-size.
+ 
+ Sat Mar 11 11:30:13 1995  Karl Fogel  <kfogel@floss.life.uiuc.edu>
+ 
+ 	* bookmark.el (bookmark-buffer-name): Be smarter about deducing a name.
+ 	(bookmark-insert-buffer-name): Use bookmark-buffer-name.
+ 	Replaces bookmark-insert-current-file-name.
+ 	(bookmark-make-cell): Fix previous change.
+ 
+ Fri Mar 10 21:08:29 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* info.el (Info-menu): Bind beg with let.
+ 
+ 	* tmm.el: New file.
+ 
+ 	* lmenu.el (add-menu-item-1): Better error message if
+ 	a menu not the last in the path does not exist.
+ 
+ 	* rmail.el (rmail-retry-failure): Don't get errors when
+ 	searching for `End of returned message'.
+ 
+ 	* vc.el (vc-path): Use /usr/sccs only if it is a dir.
+ 
+ 	* bookmark.el (bookmark-make-cell): Use set-text-properties,
+ 	not format, to clear text properties.
+ 
+ Fri Mar 10 19:53:15 1995  Karl Fogel  <kfogel@floss.life.uiuc.edu>
+ 
+ 	* bookmark.el:
+ 	Insure that all entry points call `bookmark-maybe-load-default-file'.
+ 	Changed format of bookmark-alist and therefore of bookmark files.
+ 	Have version stamps in bookmark files.
+ 	Automatically upgrade old bookmark files to new format.
+         Changed name of default bookmark file to ".emacs.bmk".
+ 	Replaced "Bookmark-menu" with "bookmark-bmenu".  The
+         capitalization signified nothing; "bmenu" means "buffer-menu"
+ 	-- that is, bmenu code is for the dired-like of bookmarks that
+ 	appears when `list-bookmarks' is run, and the "bookmark-menu"
+ 	prefix is for the menu-bar.
+ 	Internally, use an alist instead of hardcoded list-positions
+ 	for storing bookmark information.
+ 
+ 	Applied <johng@media.mit.edu>'s patches for annotation support:
+ 	(bookmark-send-annotation, bookmark-read-annotation-mode)
+ 	(bookmark-edit-annotation-mode, bookmark-default-annotation-text)
+ 	(bookmark-read-annotation-text-func, bookmark-read-annotation)
+ 	(bookmark-send-edited-annotation, bookmark-edit-annotation):
+ 	New functions.
+ 
+ 	(bookmark-get-bookmark, bookmark-get-bookmark-record)
+ 	(bookmark-name-from-full-record, bookmark-set-name)
+ 	(bookmark-get-annotation, bookmark-set-annotation)
+ 	(bookmark-get-info-node, bookmark-set-info-node)
+ 	(bookmark-get-filename, bookmark-set-filename)
+ 	(bookmark-get-position, bookmark-set-position)
+ 	(bookmark-get-front-context-string, bookmark-set-front-context-string)
+ 	(bookmark-get-rear-context-string, bookmark-set-rear-context-string):
+ 	New subroutines.
+ 
+ 	(bookmark-file-format-version, bookmark-end-of-version-stamp-marker):
+ 	New variables.
+ 	(bookmark-grok-file-format-version, bookmark-maybe-upgrade-file-format)
+ 	(bookmark-upgrade-version-0-alist, bookmark-upgrade-file-format-from-0)
+ 	(bookmark-insert-file-format-version-stamp): New functions.
+ 	(bookmark-maybe-load-default-file):
+ 	Renamed from bookmark-try-default-file'.
+ 	(bookmark-old-default-file): New variable.
+ 	(bookmark-default-file): Renamed from `bookmark-file'.
+ 	New initial value, ".emacs.bmk".
+ 	(bookmark-make-cell): Use backquote.
+ 	Produce with the new format (Format Version 1).
+ 	Use `format' to strip text-properties.
+         (bookmark-write-file): Use `pp' instead of `princ'.
+ 	Call `bookmark-insert-file-format-version-stamp'.
+ 	(bookmark-all-names, bookmark-menu-popup-paned-bookmark-menu)
+ 	(bookmark-menu-build-paned-menu, bookmark-menu-popup-paned-menu)
+ 	(bookmark-insert-location): New functions.
+ 	(bookmark-completing-read): New function.  Everyone who called
+ 	`completing-read' in the interactive spec now calls this.
+ 	(bookmark-load-hook): New hook.
+ 
+ 	(bookmark-make-menu-alist): Function deleted.
+ 	(bookmark-popup-menu-and-apply-function): replaces
+ 	`bookmark-make-menu-with-function'.
+ 
+ 	(bookmark-load): Use `bookmark-alist-from-buffer'.
+ 	Call `bookmark-maybe-upgrade-file-format'.
+ 	(bookmark-set): If Info mode, record Info-current-node.
+ 	Use `bookmark-bmenu-surreptitiously-rebuild-list'.
+ 	(bookmark-buffer-file-name): Handle Info files.
+ 	(bookmark-buffer-name): If Info mode, return Info-current-node.
+ 	(bookmark-jump-noselect): For info node, use Info-goto-node.
+ 	Use the helper functions, don't mess with the raw
+ 	alist (except in completion, which we'll take care of later).
+ 	Don't count on `bookmark-search-size' being correct; use the
+ 	length of `forward-str' and `behind-str' instead.
+ 	(bookmark-relocate): Use the helper functions; don't mess
+ 	with the raw alist except in completion.
+ 	(bookmark-rename): C-o in minibuffer now inserts old name.
+ 	(bookmark-delete): New arg BATCH.
+ 	(bookmark-bmenu-execute-deletions): Was `bookmark-bmenu-execute'.
+ 	Just call bookmark-delete with the BATCH arg.
+ 	Set the modification count and maybe save when done.
+ 	Save point intuitively.
+ 	(bookmark-insert-current-file-name): Just use `file-name-nondirectory'.
+ 	(bookmark-location): Made non-interactive.
+ 	(bookmark-bmenu-list): Replaces `list-bookmarks'.
+ 	Delete arg ANNOTATION.  Use mapcar to simplify.
+ 	If not interactive-p, then use `set-buffer' instead of
+ 	`switch-to-buffer'.
+ 	(bookmark-kill-line): New function, used instead of kill-line.
+ 	(bookmark-search-size): Init to 16 instead of 500.
+ 
+ Fri Mar 10 00:54:08 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* dired-aux.el (dired-do-print): Allow lpr-switches to be a string.
+ 	Clean up.
+ 
+ Thu Mar  9 22:19:34 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* simple.el (line-move-ignore-invisible): New variable.
+ 	(line-move): If that var is set, use vertical-motion.
+ 	Skip any extra invis chars beyond where vertical-motion stops.
+ 
+ Tue Mar  7 21:19:36 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* files.el (revert-buffer): Doc fix.
+ 
+ 	* hexl.el (hexl-mode): Make after-revert-hook rehexlify.
+ 	(hexl-after-revert-hook): New function.
+ 
+ 	* perl-mode.el (calculate-perl-indent): When backing up over
+ 	continuations, don't go to line beg;
+ 	perl-backward-to-start-of-continued-exp gives the right place.
+ 
+ Tue Mar  7 13:07:23 1995  Enami Tsugutomo  <enami@sys.ptg.sony.co.jp>
+ 
+ 	* simple.el (indent-new-comment-line): Clean up handling
+ 	of \(...\) in comment-start-skip.
+ 
+ Tue Mar  7 16:43:51 1995  Per Bothner  <bothner@kalessin.cygnus.com>
+ 
+ 	* term.el (term-eol-on-send):  New variable.
+ 	(term-send-input):  Move point to eol before sending only if
+ 	term-eol-on-send is true.
+ 
+ 	* term.el (term-send-input):  Don't move process-mark until
+ 	after possible 'history processing.
+ 
+ Tue Mar  7 16:06:10 1995  Francesco Potorti`  (pot@cnuce.cnr.it)
+ 
+ 	* cmacexp.el (c-macro-expansion): put the unique string before the
+ 	first #line directive (instead of after), preceded by a newline.
+ 
+ Mon Mar  6 10:51:32 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* find-dired.el (find-ls-option): Doc fix: now a cons.
+ 	(find-dired): Initialize the process-mark for the filter to use.
+ 	Find listing switches in cdr of find-ls-option.
+ 	(find-dired-filter): Use dired-insert-set-properties on new text.
+ 
+ 	* compile.el (compilation-buffer-p): Fix braino in last change:
+  	switch to the buffer first.
+ 	(compilation-error-regexp-alist): Doc fix: optional cdrs give
+ 	string containing %s to produce the file name from the matched text.
+ 	(compilation-find-file): Reorder args: MARKER first, then
+ 	FILENAME, DIR, and new arg &rest FORMATS (as they appear in parsed
+ 	the fileinfo lists).  Try each of the FORMATS in each directory tried.
+ 	(compilation-next-error-locus): Apply compilation-find-file to the
+ 	FILEINFO list.
+ 	(compilation-parse-errors): Instead of a cons (DIR . FILE), make a
+ 	list (FILE DIR [FORMATS...]) using the 4th cdr of the matching elt of
+ 	regexp-alist.
+ 
+ Mon Mar  6 00:17:48 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* menu-bar.el (menu-bar-help-menu): Binding for view-emacs-FAQ.
+ 
+ Sun Mar  5 23:30:29 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* help.el (view-emacs-FAQ): New function.  Bind to C-h F.
+ 	(help-for-help): Doc fix.
+ 
+ 	* info.el (info): Use pop-to-buffer.
+ 	(same-window-buffer-names): Add "*info*".
+ 
+ Fri Mar  3 14:02:58 1995  Robert J. Chassell  <bob@hill.gnu.ai.mit.edu>
+ 
+         * texinfmt.el (texinfo-format-refill): Don't confuse a title
+         underline with 2 or more `*' with an xref line starting with one `*'.
+ 
+ Fri Mar  3 01:46:52 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* simple.el (shell-command-on-region): Obey REPLACE even if
+ 	OUTPUT-BUFFER is nil.  Interactively, make REPLACE non-nil
+ 	only if there is a prefix arg.
+ 
+ Thu Mar  2 14:36:28 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* files.el (kill-emacs-query-functions): Doc fix.
+ 
+ Thu Mar  2 10:22:30 1995  Boris Goldowsky  <boris@spiff.gnu.ai.mit.edu>
+ 
+ 	* ada.el (ada-mode): Remove "^" used as anchor from
+ 	paragraph-start and paragraph-separate values, so that they will
+ 	work with non-0 left-margin settings.
+ 	* allout.el (outline-mode): Likewise.
+ 	* awk-mode.el (awk-mode): Likewise.
+ 	* bibtex.el (bibtex-mode): Likewise.
+ 	* c-mode.el (c-mode, c-fill-paragraph): Likewise.
+ 	* cc-mode.el (c-common-init, c-fill-paragraph): Likewise.
+ 	* cplus-md.el (c++-mode): Likewise.
+ 	* edt.el (edt-indent-or-fill-region): Likewise.
+ 	* gnus-uu.el (gnus-uu-post-reply-mode): Likewise.
+ 	* icon.el (icon-mode): Likewise.
+ 	* mh-comp.el (mh-letter-mode): Likewise.
+ 	* mim-mode.el (mim-mode):  Likewise.
+ 	* modula2.el (modula-2-mode):  Likewise.
+ 	* nroff-mode.el (nroff-mode):  Likewise.
+ 	* options.el (Edit-options-mode):  Likewise.
+ 	* outline.el (outline-mode):  Likewise.
+ 	* perl-mode.el (perl-mode):  Likewise.
+ 	* prolog.el (prolog-mode-variables):  Likewise.
+ 	* rnewspost.el (news-reply-mode):  Likewise.
+ 	* scheme.el (scheme-mode-variables):  Likewise.
+ 	* scribe.el (scribe-mode):  Likewise.
+ 	* sendmail.el (mail-mode):  Likewise.
+ 	* simula.el (simula-mode):  Likewise.
+ 	* texinfmt.el (texinfo-format-refill):  Likewise.
+ 	* texinfo.el (texinfo-mode):  Likewise.
+ 	* tex-mode.el (tex-common-initialization,latex-mode,slitex-mode):
+ 	Likewise.
+ 	* text-mode.el (indented-text-mode):  Likewise.
+ 	* vc.el (vc-comment-to-change-log):  Likewise.
+ 
+ Thu Mar  2 05:58:37 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
+ 
+ 	* font-lock.el (font-lock-maximum-decoration) New variable.
+ 	(font-lock-after-fontify-buffer-hook): New variable.
+ 	(font-lock-fontify-buffer): Run it after fontifying.
+ 	(font-lock-thing-lock-cleanup): New function to turn things off.
+ 	(font-lock-mode): Call it when turning Font Lock mode off.
+ 	(font-lock-fontify-region): Fix to use forward-comment from
+ 	comment-start, rather than searching for comment-end from point.
+ 
+ 	* ada.el, ada-mode.el (ada-font-lock-keywords): Use
+ 	font-lock-maximum-decoration.
+ 
+ 	* fortran.el, f90.el (fortran-font-lock-keywords): Use
+         font-lock-maximum-decoration.
+ 
+ Thu Mar  2 03:33:39 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* gud.el (gud-massage-args): Variable and function deleted.
+ 	(gud-common-init): Don't set the variable.
+ 
+ Thu Mar  2 15:11:02 1995  Boris Goldowsky <boris@cs.rochester.edu>
+ 
+ 	* simple.el (newline): Moved from cmds.c.  Indents last
+ 	inserted line to left-margin.
+ 
+ 	* paragraphs.el (paragraph-start, paragraph-separate): Default
+ 	values no longer start with ^. Doc fix.
+ 	(use-hard-newlines): Moved here from cmds.c.  Made buffer-local.
+ 	Doc fix.
+ 	(looking-at-hard): Deleted, not needed.
+ 	(forward-paragraph): Removes ^ from beginning of regexps, if
+ 	required.  Look for paragraph-start and paragraph-separate at
+ 	left-margin, not BOL.  Lines with just left-margin indentation are
+ 	treated like blank lines.
+ 	Paragraph-separate no longer requires a preceding hard newline, but
+ 	paragraph-start does: paragraph-separates usually won't occur by
+ 	accident, so it doesn't hurt to respect them whenever they do
+ 	occur.
+ 
+ Wed Mar  1 03:27:15 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* vc.el (vc-do-command): Search vc-path first, not last.
+ 
+ 	* tar-mode.el (tar-grind-file-mode): Doc fix.
+ 
+ Tue Feb 28 22:06:57 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* simple.el (shell-command-on-region): Fix typos in doc string.
+ 	(universal-argument, describe-arg): Deleted; this is now in C code.
+ 	(prefix-arg-internal, digit-argument, negative-argument): Likewise.
+ 
+ Tue Feb 28 12:54:01 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* gud.el (gud-common-init): Put substed file name back in original
+ 	sequence in the args.  Pass ARGS to massage-file even if no file name.
+ 	(gud-gdb-massage-args, gud-sdb-massage-args, gud-dbx-massage-args)
+ 	(gud-mipsdbx-massage-args, gud-xdb-massage-args)
+ 	(gud-perldb-massage-args): Don't add FILE onto the args.
+ 
+ 	* simple.el (shell-command-on-region): Rename arg; doc fix.
+ 
+ 	* server.el (server-switch-buffer): New optional arg KILLED-ONE.
+ 	Avoid the other-buffer at the end in that case.
+ 
+ Tue Feb 28 04:07:48 1995  Noah Friedman  <friedman@prep.ai.mit.edu>
+ 
+         * rlogin.el (rlogin-carriage-filter): Don't assume buffer is
+         narrowed to region with most recent output.
+ 
+ Tue Feb 28 01:18:20 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* files.el (revert-buffer): Use current-prefix-arg, not prefix-arg.
+ 	* terminal.el (te-escape): Likewise.
+ 
+ Mon Feb 27 03:05:44 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
+ 
+ 	* dired.el (dired-internal-noselect): Use substitute-command-keys
+ 	to get binding of revert-buffer.
+ 
+ Sun Feb 26 16:37:37 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* compile.el (compilation-buffer-p): Check for
+  	compilation-minor-mode or compilation-mode major mode, rather than
+  	internal state variables.  Don't want to match a buffer that was
+  	once in compilation-minor-mode but is not now.
+ 
+ Sun Feb 26 15:00:54 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* info.el (Info-extract-menu-node-name): Collapse multiple spaces.
+ 
+ 	* tar-mode.el (tar-mode-show-date): New variable.
+ 	(tar-header-block-summarize, tar-next-line): Obey it.
+ 
+ Sun Feb 26 23:07:09 1995  Greg McGary  <gkm@magilla.cichlid.com>
+ 
+ 	* tar-mode.el (tar-header-block-tokenize): Parse 32-bit modtime
+ 	current-time compatible a list of 16-bit ints (HIGH LOW).
+ 	(tar-parse-octal-integer): Write char-const '0' as
+ 	?0 instead of more obscure 48.
+ 	(tar-parse-octal-long-integer): New function.
+ 	(tar-clip-time-string): New function.
+ 	(tar-header-block-summarize, tar-header-block-summarize):
+ 	Insert mod-time into listing.
+ 	(tar-next-line): Move goal column to new location of filenames.
+ 
+ Sat Feb 25 18:26:30 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* mouse.el (mouse-kill-secondary): Avoid changing this-command.
+ 	Don't clear the secondary selection.
+ 
+ Sat Feb 25 10:23:45 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
+ 
+ 	* comint.el (comint-truncate-buffer): New function.
+ 	(comint-buffer-maximum-size): New variable.
+ 
+ 	* shell.el (shell-truncate-buffer): Doc them.
+ 
+ 	* comint.el (comint-dynamic-complete-as-filename): Let
+         file-name-handler-alist to nil; comint-file-name-prefix does this.
+ 	(comint-dynamic-list-filename-completions): Likewise.
+ 	(comint-dynamic-complete-filename,
+ 	comint-dynamic-complete-as-filename): Use window-minibuffer-p.
+ 
+ Sat Feb 25 02:29:45 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* cplus-md.el (c++-backward-to-noncomment): Don't loop forever
+ 	if first line of buffer starts with ` #'.
+ 
+ 	* subr.el (walk-windows): Doc fix.
+ 
+ Fri Feb 24 23:55:54 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* subr.el (local-unset-key): Fix args in previous change.
+ 
+ Fri Feb 24 13:54:41 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* subr.el (global_set_key, local_set_key, global_unset_key)
+ 	(local_unset_key): Functions moved here from keyboard.c.
+ 
+ Fri Feb 24 07:35:36 1995  Lars Lindberg  <Lars.Lindberg@sypro.cap.se>
+ 
+ 	* msb.el (msb): Select the window that the mouse is in before
+ 	  showing the menu.  This makes the "Most recently used" menu more
+ 	  accurate.
+ 	(menu-bar-update-buffers): The frame list is now an integrated
+ 	part of the buffer menu.
+ 	(msb--few-menus, msb--very-many-menus): Added rmail-edit-mode.
+ 
+ 	* msb.el (mouse-select-buffer): Do sit-for before x-popup-menu.
+ 
+ Thu Feb 23 19:01:46 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* lisp-mode.el (eval-defun): Convert defvar to defconst.
+ 
+ 	* loaddefs.el (function-key-map): Use vector in definition of C-delete.
+ 
+ 	* rmail.el (rmail-retry-failure): Support a new style of failure msg.
+ 
+ Tue Feb 21 14:49:58 EST 1995  Boris Goldowsky  <boris@cs.rochester.edu>
+ 
+ 	* fill.el (set-fill-prefix): Sets it to the text between
+ 	left-margin and point, not the whole line before point.
+ 
+ 	(fill-region-as-paragraph): Set `from' to the beginning and
+ 	`to' to the end immediately, for clarity.  This used to be
+ 	done after the save-restriction.
+ 
+ 	Newlines at end of region used to be changed to spaces, then
+  	deleted.  Now delete them (all but one) explicitly, so that we
+  	can test whether they are hard and not delete hard newlines.
+ 
+   	Ignore all whitespace at beginning of region: a line
+  	containing spaces before first line of text used to be joined
+  	onto first line of text, making spurious paragraph
+  	indentation.
+ 
+ 	If there is only whitespace in the region, exit quickly (fixed
+ 	possible infinite-loop condition).
+ 
+ 	Moved the loop that just indents when justification=none inside
+ 	the save-restriction.  It's a little simpler that way.
+ 
+ 	When deleting indentation and fill-prefixes from lines, delete
+ 	any whitespace after the fill-prefix too.
+ 
+ 	Always exit with point at end of region, after a single
+  	paragraph-final newline.
+ 
+ 	(fill-region): Don't use paragraph-movement commands
+  	in use-hard-newlines mode; just fill between each pair of hard
+  	newlines.  Old strategy of setting paragraph-start to "^"
+ 	doesn't work, since paragraph-start no longer no longer need
+ 	occur at BOL.
+ 
+ 	(current-justification): Don't look for text-props at EOB:
+ 	there are none.
+ 
+ 	(set-justification): New arg WHOLE-PAR controls whether to trust
+ 	begin and end args in noninteractive use, or extend to limits of
+ 	paragraphs.
+ 	Don't use "^" in paragraph-start regexp.
+   	Ignore fill-prefix when searching for enclosing paragraph with
+ 	use-hard-newlines true.
+   	Squeeze spaces from regions that used to be full-justified.
+ 	Remove leftover debugging code.
+ 
+   	(set-justification-{none,left,right,full,center}): Use WHOLE-PAR
+ 	arg of set-justification.  Interactive spec changed to avoid
+ 	errors when there is no region.
+ 
+ 	(justify-current-line): Error if JUSTIFY value is not one of
+ 	the meaningful symbols (used to do full justification in this case);
+ 	change interactive spec to explicitly request full justification.
+ 
+ 	Don't need to save-restriction & narrow (except for full-justify).
+ 	Explicitly remember beginning position, so that we can move it
+ 	to after indentation if that is appropriate.
+ 	Save a few more useful quantities; add documentation of variables used.
+ 
+ 	Do nothing if there is no text on the line.
+ 
+ 	Notice adaptive-fill fill-prefixes too.
+ 
+ 	Center or flushright indentation is put between fill-prefix
+ 	and text; can't use standard line-indent function for this.
+ 
+ 	If centering, do so between left and right margins.
+ 
+ 	Warning messages ("line too long") removed; they were annoying
+ 	in auto-fill-mode.
+ 
+ 	(unjustify-current-line, unjustify-region): New functions.
+ 
+ 	* indent.el (indent-line-to): Don't need `let'.
+ 
+ 	(current-left-margin): Don't look for text-props at EOB.
+ 
+ 	(move-to-left-margin): Always move to left-margin, even in
+ 	centered or right-justified regions.
+ 	New arg FORCE to add indentation or convert tabs to spaces if
+ 	necessary.  FORCE is the interactive default; it used to be
+ 	available only interactively.
+ 
+ 	(indent-to-left-margin): Doc fix.
+ 
+ 	(delete-to-left-margin): Use move-to-left-margin.  Doc fix.
+ 	Make arguments optional.
+ 
+ 	(set-left-margin): Make	region include following spaces and tabs,
+ 	so that later insertions there will inherit new setting.
+ 	Always reindent text to show new setting, not only when auto-fill
+ 	is active; auto-fill controls only whether to re-fill text.
+ 	(set-left-margin, increase-left-margin): Use indent-rigidly to
+ 	change indentation level.
+ 	(set-left-margin, set-right-margin, increase-left-margin): Save
+ 	point when calling fill-region.
+ 	(increase-left-margin): left-margin property can be
+ 	negative, for outdenting, up to the value of the left-margin variable.
+ 	(increase-right-margin): right-margin property can be arbitrarily
+ 	negative.  Negative values can't be stored in text/enriched
+ 	format, but that doesn't mean we shouldn't allow it in general.
+ 
+ 	(beginning-of-line-text): New function.
+ 
+ 	* simple.el (open-line): Indent to left-margin any lines that
+ 	you would consider inserting a fill-prefix on.
+ 
+ 	(do-auto-fill): Use unjustify-current-line.
+ 
+ 	(indent-new-comment-line): Indent to left-margin before inserting
+ 	fill-prefix.
+ 
+ 	* facemenu.el (facemenu-justification-menu): "Unfilled" now bound
+ 	to set-justification-none; fn changed name.
+ 
+ Thu Feb 23 00:00:49 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* perl-mode.el (perl-tab-to-comment): Default is nil.
+ 
+ 	* loadup.el: Load version.el early on.
+ 
+ 	* simple.el (shell-command-on-region): When computing interactive args,
+ 	read the minibuffer arg first, then get the region bounds.
+ 
+ Tue Feb 21 17:50:41 1995  Michael Kifer  <kifer@cs.sunysb.edu>
+ 
+ 	* viper-ex.el (ex-find-file): now gives an error when a wild card
+ 	gives no match.
+ 	(ex-next): now recognizes counts and puts proper commands in
+ 	ex-command-history.
+ 	(vip-info-on-file, ex-substitute): bug fixed.
+ 
+ Tue Feb 21 07:47:38 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
+ 
+ 	* shell.el (shell-cd): New function.
+ 	(shell-process-cd, shell-process-pushd, shell-process-popd,
+ 	shell-resync-dirs): Use it instead of cd.
+ 	(shell-mode): Make list-buffers-directory local with value
+ 	default-directory.
+ 
+ 	* mouse.el (mouse-buffer-menu): Use list-buffers-directory if
+         non-nil if buffer-file-name is nil.
+ 
+ Mon Feb 20 19:00:56 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* viper.el, viper-ex.el, viper-util.el: New files.
+ 	* viper-keym.el, viper-macs.el, viper-mous.el: New files.
+ 
+ Mon Feb 20 05:50:44 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
+ 
+ 	* fortran.el (fortran-mode): Made fortran-font-lock-keywords turn
+         off syntactic fontification by default.
+ 
+ Mon Feb 20 04:39:48 1995  Roland McGrath  <roland@duality.gnu.ai.mit.edu>
+ 
+ 	* vc.el (vc-log-info): Don't switch to the *vc* buffer before
+  	running vc-do-command, because that would change its
+  	default-directory.
+ 
+ Sun Feb 19 15:04:06 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* rnewspost.el: Various doc fixes.
+ 	(news-post-news): Add autoload cookie.
+ 
+ Sat Feb 18 14:40:49 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* mouse.el (mouse-buffer-menu): Don't clear selection when we kill it.
+ 
+ 	* subr.el (eval-after-load): Run FORM now if FILE's already loaded.
+ 
+ 	* imenu.el (imenu--cleanup): Set alist to its default
+ 	just once, at the beginning.
+ 	Don't recurse on a cdr which is nil.
+ 
+ Fri Feb 17 18:21:54 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* simple.el (quoted-insert): Use insert-and-inherit.
+ 	Don't change buffer if arg is negative.
+ 
+ 	* tex-mode.el (tex-append): Try splitting on last period, then
+ 	try splitting on first period.
+ 
+ 	* desktop.el (desktop-internal-v2s): Don't use format
+ 	to eliminate text properties.
+ 
+ Fri Feb 17 13:31:23 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* mailabbrev.el (mail-abbrev-mode-regexp): Doc fix.
+ 
+ Fri Feb 17 03:59:35 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* rmailsum.el (rmail-summary-mail, rmail-summary-continue)
+ 	(rmail-summary-reply, rmail-summary-retry-failure)
+ 	(rmail-summary-forward, rmail-summary-resend): Switch to rmail
+ 	buffer's window first, so mail buffer replaces summary.
+ 
+ Thu Feb 16 00:56:51 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* buff-menu.el (Buffer-menu-save): Fix the test for header line.
+ 
+ Wed Feb 15 03:34:54 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* info.el (Info-index): Bind Info-history, not Info-keep-history.
+ 
+ Tue Feb 14 09:47:41 1995  Boris Goldowsky  <boris@cs.rochester.edu>
+ 
+ 	* facemenu.el (facemenu-self-insert-face): If previous
+ 	self-insert-face is still valid, add to rather than replace it.
+ 	(facemenu-loc): Variable deleted.
+ 
+ Tue Feb 14 01:20:35 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* ehelp.el (electric-help-help, electric-help-command-loop):
+ 	Mention q and r, not Q and R.
+ 
+ 	* sort.el (sort-regexp-fields-next-record): New subroutine.
+ 	If the first search does not advance point and finds an empty match,
+ 	skip one char and search again.
+ 	(sort-regexp-fields): Use that subroutine.
+ 	Bind sort-regexp-fields-regexp, for sort-regexp-fields-next-record.
+ 	(sort-regexp-fields-regexp): Declared.
+ 	(sort-regexp-record-end): Declared.
+ 
+ Mon Feb 13 11:38:23 1995  Jeff Dwork  <jeff.dwork@amd.com>
+ 
+ 	* ehelp.el (electric-help-map): Use supress-keymap instead of
+ 	filling keymap with undefined commands.  Bind R like r.
+ 	Substitute electric-command-apropos for command-apropos.
+ 	(electric-apropos): New function.
+ 	(electric-help-help, electric-help-command-loop):
+ 	Mention Q and R in messages.
+ 
+ Mon Feb 13 22:11:48 1995  Jim Thompson  <thompson@wg2.waii.com>
+ 
+ 	* ps-print.el (ps-print-version): Add caveat about version number.
+ 	(ps-begin-file): Fix format code for /LineHeight.
+ 
+ Mon Feb 13 03:42:17 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* files.el (auto-mode-alist): Fix problem in previous change.
+ 
+ 	* pp.el (pp-to-string): Fix previous change.
+ 
+ 	* debug.el (debugger-step-after-exit): Variable declared.
+ 	(debugger-old-buffer, debugger-value): Variables declared.
+ 
+ 	* facemenu.el (facemenu-next): Variable deleted.
+ 	(facemenu-self-insert-face): New function.
+ 	(facemenu-set-face): Use facemenu-self-insert-face.
+ 	(facemenu-set-face-from-menu): Likewise.
+ 	(facemenu-after-change): Function deleted.  Don't use it as hook.
+ 
+ 	* debug.el (debug): Fix arg to backtrace-debug for debug-on-entry.
+ 
+ Sun Feb 12 03:25:02 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* pp.el (pp-to-string): Don't use emacs-lisp-mode.
+ 	Just do the parts of it we actually want.
+ 
+ 	* simple.el (next-history-element): Do nothing if n is 0.
+ 	Handle errors properly when history list is empty.
+ 
+ Sat Feb 11 19:15:37 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* menu-bar.el (menu-bar-kill-ring-save): New function--use as `copy'.
+ 	(delete-region): Don't enable if (mouse-region-match) is true.
+ 
+ 	* mouse.el (mouse-drag-region): Delete the overlay before
+ 	calling the terminating event's command binding or making a region.
+ 	(mouse-set-region-1): New function.
+ 	(mouse-drag-region, mouse-set-region, mouse-save-then-kill): Call it.
+ 	(mouse-region-match): New function.
+ 
+ 	* ange-ftp.el (ange-ftp-write-region, ange-ftp-insert-file-contents)
+ 	(ange-ftp-copy-file-internal): If remote host is unix, use binary mode.
+ 	(ange-ftp-file-local-copy): Delete local var bin1.
+ 	(ange-ftp-rename-remote-to-remote): Delete arg `binary'.
+ 	(ange-ftp-rename-file): Don't pass or compute that arg.
+ 
+ Fri Feb 10 01:28:06 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* files.el (auto-mode-alist): Add .cpp, .cxx, .hxx, .c++, .h++.
+ 
+ 	* sendmail.el (mail-reply-to): New command, on C-c C-f C-r and in menu.
+ 
+ 	* c-mode.el (c-switch-label-regexp): Insist on colon after `default'.
+ 
+ 	* sendmail.el (mail-do-fcc): Find buffer to add to
+ 	using truename, if can't find it by real name.
+ 
+ 	* files.el (recover-file): Use ordinary `f' to read file name.
+ 
+ Thu Feb  9 01:34:25 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* rmail.el (rmail): Don't set rmail-default-file here.
+ 	(rmail-default-file): Init it to ~/xmail.
+ 	(rmail-default-rmail-file): Don't call expand-file-name.
+ 
+ 	* dired.el (dired-mark): If on dir header line, always mark
+ 	the files in that dir.
+ 
+ 	* lpr.el (print-region-1): Include print options in echo area msgs.
+ 
+ Wed Feb  8 18:46:26 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* ada.el (ada-mode): Delete autoload.
+ 
+ 	* ada-mode.el: New file.
+ 	Add autoload cookie.
+ 	(ada-mode-map): Don't define C-m, M-a, M-e, M-q.
+ 	Don't define M-q.
+ 	(ada-mode): Set fill-paragraph-function locally.
+ 	(ada-fill-comment-paragraph): Return t.
+ 	(ada-gen-make-bodyfile): Add missing backslash.
+ 
+ Wed Feb  8 08:00:33 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
+ 
+ 	* comint.el (comint-match-partial-filename): Include `%' char.
+ 
+ Wed Feb  8 01:03:55 1995  Ken Stevens  <k.stevens@ieee.org>
+ 
+ 	* ispell.el: Personal dictionary save forced when called from menu,
+ 	Epoch compile support.
+ 	(ispell-skip-sgml): Added variable for skipping SGML tags & references.
+ 	(ispell-buffer-local-parsing): Hard wire set of ispell-skip-sgml-tags
+ 	to sgml-mode.
+ 	(ispell-pdict-save): Message improvement.
+ 	(ispell-command-loop): Properly adjust screen with different settings
+ 	of ispell-choices-win-default-height.
+ 	(check-ispell-version): Use fundamental-mode as default-major-mode.
+ 	(ispell-change-dictionary): Remove unnecessary process kills
+ 	(ispell-region): Fold sgml support in with tib checking.
+ 	(ispell-message): Skips checking of forwarded messages.
+ 
+ Tue Feb  7 19:38:25 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* novice.el (disabled-command-hook): Recognize ESC x as well as M-x.
+ 
+ 	* edmacro.el (edmacro-format-keys): Don't presume internal bit layout
+ 	of non-ASCII keys.
+ 	(edmacro-parse-keys): Likewise.
+ 	* terminal.el (te-pass-through): Likewise.
+ 	* subr.el (listify-key-sequence-1, event-modifiers): Likewise.
+ 
+ 	* edt.el: New enhanced version.
+ 	* edt-lk201.el, edt-mapper.el, edt-pc.el, edt-vt100.el: New files.
+ 
+ 	* bytecomp.el (byte-compile-file-form-defmumble, display-call-tree):
+ 	Print ellipsis earlier, so message logging will fold similar strings.
+ 	(byte-compile-file): Add "done" message.
+ 
+ Tue Feb  7 17:46:00 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* ps-print.el (ps-print-thompson-version):
+ 	Renamed from ps-print-version.
+ 
+ Tue Feb  7 16:52:44 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* subr.el (read-quoted-char): Don't log prompt messages.
+ 	Use M- notation instead of assuming internal layout.
+ 
+ Tue Feb  7 02:59:59 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* term.el (term-protocol-version): Renamed from term-version.
+ 
+ Mon Feb  6 17:34:55 1995  G Dinesh Dutt  (brat@htilbom.ernet.in)
+ 
+ 	* etags.el (etags-file-of-tag): Handle file name used as tag.
+ 
+ Sat Feb  4 16:23:18 1995  Per Bothner  <bothner@kalessin.cygnus.com>
+ 
+ 	* term.el (term-version):  Increased to 0.95.
+ 	(term-pager-enabled):  New macro.  Use it a bunch of places.
+ 	(term-terminal-menu):  Clean up initialization so we don't get
+ 	complaints when re-loading term.el.
+ 	(term-send-raw-meta):  Redo to handle meta-symbols (e.g. meta-delete).
+ 	More robust checking of parameter to make-string.
+ 	(term-update-mode-line):  New function.  Call it whenever we change
+ 	char/line/paging mode.  Now includes "page" in mode-line-process
+ 	if paging is abled.
+ 
+ 	* term.el:  Remove causes for byte-compilation to complain:
+ 	(term-terminal-pos):  Declare x and y in let-binding.
+ 	(term-send-invisible):  Remove bogus second "iteractive" call.
+ 	(term-*): Provide defvars for lots of buffer-local variables.
+ 	(term-mode):  Make comments and initial value setting from
+ 	here to the corresponding defvar.
+ 	(term-line-start-column):  Remove unused variable.
+ 	(term-erase-in-line):  Fix syntax (incorrect parenthesis) error.
+ 	(term-erase-in-display):  Fix typo "\?n" -> "?\n".
+ 
+ 	* term.el:  Make Unix "resize" command work:
+ 	(term-handle-ansi-escape):  On "\e[row;colH", limit row
+ 	and col to size of window.  (Resize sends "999;999".)
+ 	(term-handle-ansi-escape):   Implement "\e[6n" "Report cursor
+ 	position".  This requires that we pass proc as an extra parameter.
+ 	(term-scroll-region):  An empty region means extend to window bottom.
+ 
+ Sun Feb  5 22:28:19 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* lpr.el (lpr-add-switches): Renamed from lpr-add-options.
+ 	(print-region-new-buffer): Return new start and end.
+ 	(print-region-1): Use new calling convention.
+ 
+ Sun Feb  5 19:09:36 1995  Jim Blandy  <jimb@totoro.bio.indiana.edu>
+ 
+ 	* texinfo.el (texinfo-environment-regexp): Match @menu and
+ 	@titlepage --- they require @ends.  Don't match @defunx commands;
+ 	they don't.
+ 	(texinfo-insert-@end): Don't put a command name after the @end
+ 	if we ran off the top of the buffer looking for its mate.
+ 
+ Sat Feb  4 21:16:57 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* rmail.el (rmail-next-same-subject): New command.
+ 	(rmail-previous-same-subject): Likewise.
+ 	(rmail-mode-map): Add bindings for C-c C-n and C-c C-p.
+ 
+ 	* rmailsum.el (rmail-summary-next-same-subject): New command.
+ 	(rmail-summary-previous-same-subject): Likewise.
+ 	(rmail-summary-mode-map): Add bindings for C-c C-n and C-c C-p.
+ 
+ Sat Feb  4 15:34:55 1995  G Dinesh Dutt  (brat@htilbom.ernet.in)
+ 
+ 	* etags.el : Changes to support filenames as tags too and provided
+ 	a drop-in replacement for list-tags.
+ 	(find-tag-noselect): Recognize filenames as valid tags too.
+ 	(find-tag-file-order): New variable holds function to check for match
+ 	for a file name used as a tag.
+ 	(find-tag-in-order): If the tag is a file name, position at file beg.
+ 	(etags-recognize-tags-table): Added new var find-tag-file-order to
+ 	tags-table-format variables.  Added tag-filename-match-p to the
+ 	list for find-tag-tag-order.
+ 	(tag-filename-match-p): New function.
+ 	(list-tags): Rewritten for speed.
+ 	(tags-list-functions-in-file): New subroutine for list-tags.
+ 	(tags-locate-file-in-tags-table): New function locates a
+ 	file in `tags-table-list'.
+ 
+ Fri Feb  3 14:27:50 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* lpr.el (print-region-1): If we run pr, give it the -h option
+ 	instead of giving lpr the -T option.
+ 
+ 	* dired.el (dired-mode-map): Define up and down arrows like C-p, C-n.
+ 
+ 	* f90.el (f90-mode-version): Variable deleted.
+ 	(f90-mode): Don't use f90-mode-version.
+ 
+ 	* ps-print.el: Add autoload cookies.
+ 	(ps-paper-type): Doc fix.
+ 
+ 	* lpr.el (print-region-1): Use lpr-page-header-switches,
+ 	not ...-options.
+ 
+ Fri Feb  3 12:59:14 1995  Francesco Potorti`  (pot@cnuce.cnr.it)
+ 
+ 	* man.el (Man-default-man-entry): Remove text properties from result.
+ 
+ Thu Feb  2 23:20:29 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* rmail.el (rmail-reply-regexp): New var.
+ 	(rmail-reply): Delete text matching rmail-reply-regexp.
+ 
+ Thu Feb  2 14:27:55 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* completion.el: Don't use cl.  Eliminate use of when, unless,
+ 	dotimes, plusp, minusp, pusnhew, second.
+ 	(completion-dolist): New macro.  Use instead of dolist.
+ 	(completion-gensym-counter, completion-gensym): New variable and fn.
+ 	(locate-completion-entry-retry): Bind cmpl-entry, then use it.
+ 	(locate-completion-entry): Use completion-string, not string.
+ 	(add-completion-to-head, delete-completion):
+ 	Rename arg to completion-string.
+ 	(completions-list-return-value): Defvar'd and renamed
+ 	from return-completions.
+ 	(cmpl-preceding-syntax, cdabbrev-stop-point): Add defvars.
+ 	(delete-completion, check-completion-length): Fix message format.
+ 	(complete, add-completions-from-buffer, add-completions-from-c-buffer)
+ 	(save-completions-to-file): Likewise.
+ 	(completion-string): Add defvar.
+ 
+ 	* lpr.el (lpr-headers-switches): Default is nil.
+ 
+ 	* fill.el (fill-paragraph): Bind fill-paragraph-function
+ 	to nil before calling it.
+ 
+ 	* dabbrev.el (dabbrev-abbrev-char-regexp): Default value is nil again.
+ 
+ Thu Feb  2 04:37:25 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* c-mode.el (c-mode-map): No binding for c-fill-paragraph
+ 	(c-fill-paragraph): Return t.
+ 	(c-mode): Put c-fill-paragraph in fill-paragraph-function.
+ 
+ 	* lisp-mode.el (shared-lisp-mode-map): Don't bind M-q.
+ 	(lisp-fill-paragraph): Return t.
+ 	(lisp-mode-variables): Put that in fill-paragraph-function locally.
+ 
+ 	* fill.el (fill-paragraph-function): New variable.
+ 	(fill-paragraph): Use it.
+ 
+ Wed Feb  1 15:23:17 1995  Noah Friedman  <friedman@prep.ai.mit.edu>
+ 
+         * sendmail.el (mail-mailer-swallows-blank-line): Handle full range
+           of RFC822-legal header names.
+ 
+ Wed Feb  1 00:46:57 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* help.el (describe-variable): If var is local, mention default.
+ 
+ 	* rmail.el (rmail-retry-failure): Handle "Mime-encapsulated messages".
+ 	Discard return-path and from headers as well as sender.
+ 
+ Tue Jan 31 01:24:18 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* f90.el: New file.
+ 
+ Mon Jan 30 17:36:37 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* iso-acc.el (iso-accents-list): Add Icelandic thorn.
+ 	* iso-transl.el (iso-transl-language-alist): Add French & Portuguese.
+ 	(iso-transl-char-map): Use /a /e ~d "s ~t digraphs as in iso-acc.el.
+ 
+ 	* frame.el (frame-notice-user-settings): Avoid having the window
+ 	manager re-prompt for the initial frame's clone.
+ 
+ 	* faces.el (x-create-frame-with-faces): Assume cursor-color,
+ 	mouse-color, and border-color are okay as specified unless they
+ 	are the same as the new background color.
+ 
+ Mon Jan 30 01:14:18 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* simple.el (indent-new-comment-line): Obey the convention
+ 	about \(...\) pairs in comment-start-skip.
+ 
+ 	* lucid.el (make-extent, delete-extent, set-extent-property)
+ 	(set-extent-face): New functions.
+ 
+ 	* desktop.el: Many doc fixes.
+ 
+ Sun Jan 29 04:29:51 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* buff-menu.el (list-buffers-noselect): Handle read-only properly.
+ 	Select each buffer just once to get all necessary info about it.
+ 
+ 	* buff-menu.el (list-buffers-noselect): New subroutine.
+ 	(list-buffers): Use that.
+ 	(buffer-menu): Switch to the buffer in the same window.
+ 	(buffer-menu-other-window): New command.
+ 	(Buffer-menu-select): Just change the current window.
+ 
+ 	* rnewspost.el (news-reply-mode): Change mode-name to News Reply.
+ 
+ 	* lisp-mode.el (lisp-indent-region): Set endmark
+ 	before indenting first line.
+ 	(indent-sexp): Fixes for ENDPOS != nil case--use nil
+ 	as starting-point, and don't insist on a complete sexp.
+ 
+ Sat Jan 28 03:26:43 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* subr.el (match-string): Fix braino.
+ 
+ 	* faces.el (facep): New function.
+ 	(internal-check-face): Don't make a loop, since signal can't return.
+ 
+ Fri Jan 27 16:57:15 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* frame.el (make-frame): Doc fix.
+ 
+ 	* help.el (describe-variable): Use local-variable-p.
+ 
+ 	* debug.el (debug-convert-byte-code): Convert the doc info to a string.
+ 
+ 	* shell.el (shell): If we create a new shell buffer,
+ 	select that buffer even if it has been renamed.
+ 
+ 	* faces.el (x-resolve-font-name): Better error messages.
+ 
+ Fri Jan 27 13:58:24 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* subr.el (match-string): Delete extra arg to buffer-substring.
+ 
+ 	* replace.el (perform-replace): Don't log the repetitive prompts.
+ 
+ Fri Jan 27 02:05:53 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* lucid.el (read-number): New function.
+ 
+ 	* tex-mode.el (tex-display-shell): Pass nil as arg to
+ 	tex-recenter-output-buffer.
+ 	(tex-region, tex-file, tex-show-print-queue, tex-bibtex-file):
+ 	Put the call to tex-display-shell essentially last.
+ 
+ 	* menu-bar.el (menu-bar-update-yank-menu): If string is too long,
+ 	show start and end, with ... between them.
+ 	(yank-menu-length): Default value 20.
+ 
+ 	* subr.el (match-string): New function.
+ 
+ Thu Jan 26 01:52:53 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* mouse.el (mouse-save-then-kill): When we don't use existing
+ 	region, put where click and put mark at the other end.  Use
+ 	point-before-scroll if non-nil.  Recognize mouse-set-region
+ 	as a previous command that makes a region we should use.
+ 	(mouse-drag-region): When we run the final click's binding,
+ 	set this-command.
+ 
+ 	* scroll-bar.el (scroll-bar-drag-1): Set point-before-scroll properly.
+ 	(scroll-bar-scroll-down, scroll-bar-scroll-up): Likewise.
+ 
+ Wed Jan 25 00:36:14 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* mouse.el (mouse-save-then-kill): Ignore mouse-selection-click-count if no active mark.
+ 	(mouse-drag-region): Modify previous change--don't run the ordinary binding
+ 	in the case of a multiple click.
+ 
+ 	* tex-mode.el (tex-display-shell): New function.
+ 	(tex-file, tex-region, tex-show-print-queue, tex-bibtex-file):
+ 	Use that instead of tex-display-shell.
+ 
+ Tue Jan 24 17:42:47 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* fill.el (justify-current-line): Avoid error comparing fill-prefix
+ 	near end of buffer.  Do nothing fast if justification not wanted.
+ 
+ 	* bytecpat.el: Renamed from bytecomp1.el.
+ 
+ Tue Jan 24 10:21:19 1994  G Dinesh Dutt  (brat@htilbom.ernet.in)
+ 
+ 	* etags.el : Changes to support filenames as tags too and provided
+ 	a drop-in replacement for list-tags.
+ 	(find-tag-noselect): recognize filenames as valid tags too.
+ 	(find-tag-file-order): new variable added. This contains the name of
+ 	the function used to qualify a matched filename.
+ 	(last-tag-file): new variable; stores the filename looked for via
+ 	find-tag fmaily of functions.
+ 	(find-tag-in-order): In case tag searched for is a file, don't do
+ 	anything fancy to locate position of tag in file. Just seek to
+ 	beginning of file.
+ 	(etags-recognize-tags-table): Added new var find-tag-file-order to
+ 	tags-table-format variables and also set the priority of searching
+ 	for tag type to make it look for a filetype tag first.
+ 	(tag-filename-match-p): New function added to qualify naive match
+ 	for a filename tag.
+ 	(list-tags): Replaced with contents with one performing better for
+ 	this function.
+ 	(tags-list-functions-in-file): New function which is a backend for
+ 	list-tags function.
+ 	(tags-locate-file-in-tags-table): New function which locates a
+ 	file in `tags-table-list'. Its used by list-tags.
+ 
+ Tue Jan 24 09:29:13 1995  Frederic Lepied  <fred@sugix.frmug.fr.net>
+ 
+ 	* gnus.el: Added support for descriptions in the group buffer:
+ 	(gnus-group-prepare, gnus-group-prepare-line, gnus-setup-news)
+ 	(gnus-gnus-to-quick-newsrc-format, gnus-group-list-groups):
+ 	Record if we show all groups, to redisplay
+ 	correctly after toggling descriptions display.
+ 	(gnus-newsgroups-display-toggle, gnus-newsgroups-update-description)
+ 	(gnus-newsgroups-retrieve-description): New functions.
+ 	(gnus-group-mode-map): Bind t to gnus-newsgroups-display-toggle.
+ 	Add a newsgroups-update-description menu.
+ 	(gnus-newsgroups-regex, gnus-newsgroups-display, gnus-newsgroups-alist)
+ 	(gnus-newsgroups-hashtb, gnus-newsgroups-showall): New variables.
+ 	(gnus-group-group-name):  Changed the regexp to avoid  conflict
+ 	with descriptions which have a ':' inside.
+ 	(gnus-group-mode): Doc fix.
+ 
+ Mon Jan 23 23:44:06 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* c-mode.el (c-forward-conditional):
+ 	If an apparent conditional is not really a conditional, skip past it.
+ 
+ Mon Jan 23 17:36:42 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* iso-transl.el (iso-transl-dead-key-alist): New var.
+ 	(iso-transl-char-map): Give each singleton a doubleton synonym.
+ 	(iso-transl-language-alist, iso-transl-ctl-x-8-map): New vars.
+ 	(iso-transl-define-keys): New function; sets up keymap.
+ 	(iso-transl-set-language): New function; sets language-specific part.
+ 
+ 	* simple.el (mark): If transient-mark-mode is nil, mark is active.
+ 
+ Mon Jan 23 14:42:25 1995  Espen Skoglund  <espensk@tklab3.cs.uit.no>
+ 
+ 	* pascal.el: (pascal-*-completion, pascal-comp-defun)
+ 	(pascal-complete-word, pascal-completion-response, pascal-completion)
+ 	(pascal-get-completion-decl): Rename some internal variables
+ 	to start with 'pascal-'.
+ 	(pascal-str, pascal-all, pascal-pred, pascal-flag)
+ 	(pascal-buffer-to use): New dummy variables.
+ 
+ Sun Jan 22 04:50:39 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* vc.el (vc-do-command): Arrange for the default-directory variable
+ 	in *vc* to be re-set each time this function uses it.
+ 	Discard current dir from front of FILE later on,
+ 	and only if last = `WORKFILE'.
+ 
+ 	* vc.el: Undo Dec 10 change:
+ 	(vc-directory, vc-dired-reformat-line): Changed back.
+ 	(vc-directory-18): Old function restored.
+ 	(vc-dir-all-files): Function deleted.
+ 
+ 	* vc.el (vc-next-action-on-file): If file is not registered,
+ 	check file out after registering it.
+ 	(vc-next-action-dired): Restore the window configuration after
+ 	doing vc-next-action on each file in a VC-dired buffer.
+ 	(file-regular-p-18): New function.
+ 	(file-regular-p): Define, if not already defined.
+ 
+ 	* iso-transl.el (iso-transl-char-map): Add elements for
+ 	mute-acute, etc.
+ 
+ 	* gud.el (gud-mode): Use gud-new-keymap, so inherit keymaps..
+ 
+ 	* font-lock.el (font-lock-fontify-region): Bind inhibit-read-only.
+ 	Also buffer-file-name.
+ 	(font-lock-hack-keywords, font-lock-unfontify-region): Likewise.
+ 
+ Sat Jan 21 19:51:21 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* c-mode.el (c-fill-paragraph): If comment terminator is on a
+ 	separate line, don't include that line in the filling.
+ 
+ 	* bytecomp.el (byte-compile-defvar): Add the var to current-load-list.
+ 
+ Sat Jan 21 18:04:00 1994  David K}gedal  <davidk@lysator.liu.se>
+ 
+ 	* tempo.el (tempo-insert-template): Quoted transient-mark-mode
+ 	Expansion around region now puts point at the first mark.
+ 
+ 	* tempo.el (tempo-region-start, tempo-region-stop): New variables
+ 	(tempo-insert-template, tempo-insert): Don't affect the
+ 	mark.  Check for Transient Mark mode
+ 
+ 	* tempo.el (tempo-find-match-string): Removed the stupid 1+ again
+ 
+ 	* tempo.el (tempo-use-tag-list):
+ 	Set tempo-match-finder to completion-function
+ 
+ 	* tempo.el (tempo-match-finder): Renamed variable from
+ 	tempo-default-match-finder.  Change the value too.
+ 	(tempo-collection, tempo-dirty-collection): New variables.
+ 	(tempo-user-elements): New variable.
+ 	(tempo-insert): New argument ON-REGION.
+ 	New elements 'l and 'r.  Use tempo-is-user-element.
+ 	(tempo-is-user-element): New function.
+ 	(tempo-invalidate-collection, tempo-build-collection): New functions.
+ 	(tempo-find-match-string): Reinserted bugfix for re-search-backward.
+ 	(tempo-complete-tag): Complete rewrite.
+ 
+ 	* tempo.el (tempo-insert): Added the 'o tag.
+ 
+ Sat Jan 21 14:07:31 1995  Per Bothner  <bothner@kalessin.cygnus.com>
+ 
+ 	* term.el (term-version):  Increased to 0.94.
+ 	(term-if-emacs19, term-if-xemacs, term-ifnot-xemacs):  New macros
+ 	to conditionalize at compile-time for different emacs versions.
+ 	(various places):  Use them (instead of term-is-XXXX).
+ 	(term-is-emacs19):  Removed, no longer needed.
+ 
+ 	* term.el:  Change keybindings to not use C-c LETTER, for
+ 	term-char-mode, term-line-mode.  Keybindings for term-pager-enable
+ 	and term-pager-disable replaced by one for term-pager-toggle.
+ 	(term-pager-toggle):  New function.
+ 
+ 	* term.el (term-fake-pager-enable, term-fake-pager-disable):
+ 	Define as aliases, so that menubar code will find proper keybindings.
+ 	(term-char-mode):  Make no-op if already in char mode.
+ 	(term-line-mode):  Make no-op if already in line mode.
+ 	(term-mode-map):  Add keybinding for no-op term-line-mode, so
+ 	code to display menubar keybindings doesn't lose it.  (Needed
+ 	as long as char-mode and line-mode share term-terminal-menu.)
+ 	(term-raw-escape-map):  Likewise for term-char-mode.
+ 	(term-char-mode, term-line-mode):  Better documentation strings.
+ 
+ 	* term.el:  Added menubar for pager sub-mode.
+ 
+ 	* term.el (term-command-hook):  Disabled the feature that allowed
+ 	inferior to send a lisp command to emacs - too big a security hole.
+ 
+ Sat Jan 21 08:59:15 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* upd-copyr.el (update-copyright): Remove gratuitous error at end.
+ 
+ Fri Jan 20 18:04:28 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* loadhist.el (unload-feature): Don't care if FILE is a dependency
+ 	of itself.
+ 
+ 	* fill.el (fill-region-as-paragraph): At end, advance over any newlines
+ 	that were in the region but excluded from filling.
+ 
+ Fri Jan 20 14:11:25 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* text-mode.el (center-line): fill-column is a var, not a function.
+ 
+ Fri Jan 20 00:28:15 1995  Morten Welinder  <terra@diku.dk>
+ 
+ 	* compile.el (compile-internal): Force redisplay on compilation
+ 	buffer before executing compile process.
+ 
+ Fri Jan 20 01:18:42 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* ps-print.el: New file.
+ 
+ Thu Jan 19 22:19:59 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* c-mode.el (set-c-style): Ignore case in completion.
+ 
+ Thu Jan 19 21:28:03 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* rmailsum.el (rmail-summary-update-highlight): New function.
+ 	(rmail-summary-goto-msg): Use it.
+ 	(rmail-summary-rmail-update): Move the summary highlight.
+ 	(rmail-summary-mark-deleted): Do nothing if rmail-summary-overlay
+ 	has a nil face-property.
+ 	(rmail-new-summary): Make the summary-on-top kludge
+ 	more restricted in when it is used.
+ 
+ Thu Jan 19 17:23:53 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* paths.el (remote-shell-program): Reorder search path.
+ 
+ Wed Jan 18 17:11:11 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* fill.el (current-justification): Renamed from current-justification.
+ 	Callers changed.
+ 	(fill-region-as-paragraph): left-margin renamed to current-left-margin.
+ 
+ 	* indent.el (move-to-left-margin): justification renamed to
+         current-justification.
+ 	* simple.el (do-auto-fill): justification renamed to
+         current-justification.
+ 
+ 	* ispell.el (check-ispell-version): Use Fundamental mode
+ 	in the temporary buffer.
+ 
+ 	* calendar.el: Use byte-compile-dynamic.
+ 
+ Wed Jan 18 16:57:14 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* etags.el (etags-file-of-tag): Use a regexp search to find the
+ 	file name, allowing it to contain any char but a newline.
+ 
+ Wed Jan 18 15:56:39 1995  Boris Goldowsky  <boris@cs.rochester.edu>
+ 
+ 	* indent.el (standard-indent): New variable.
+ 	(alter-text-property, current-left-margin, move-to-left-margin)
+ 	(delete-to-left-margin, set-left-margin, set-right-margin)
+ 	(increase-left-margin, decrease-left-margin, increase-right-margin)
+ 	(decrease-right-margin, indent-line-to): New functions.
+ 	(indent-to-left-margin): Use indent-line-to.  Don't delete or
+ 	insert anything unless necessary.
+ 
+ 	* fill.el (set-justification): New function.
+ 	(set-justification-{none,left,right,full,center}): New functions.
+ 	(fill-region-as-paragraph, fill-region, justify-current-line): New
+ 	arg NOSQUEEZE defeats normal removal of extra whitespace.
+ 	(fill-region-as-paragraph, fill-region)
+ 	(fill-nonuniform-paragraphs, fill-individual-paragraphs):
+ 	Arg JUSTIFY-FLAG (JUSTIFYP) renamed to JUSTIFY.
+ 	(fill-region-as-paragraph): Obey left-margin; fill-prefix starts
+ 	after left-margin.  Disable filling if JUSTIFY == none, but indent to
+ 	margin anyway.
+ 	Adaptive-fill removes text-props from fill-prefixes it finds.
+ 	Adaptive-fill no longer has to notice left-margin: std fill does that.
+ 	Use fill-column and canonically-space-region functions.
+ 	(canonically-space-region): New fn split from fill-region-as-paragraph.
+ 	(fill-region): New args NOSQUEEZE (as above) and TO-EOP.
+ 	(default-justification): New variable.
+ 	(current-left-margin, fill-column, justification): New functions.
+ 	(fill-paragraph): Use fill-region-as-paragraph when possible.
+ 	(justify-current-line): New arguments; different kinds of
+ 	justification handled.  Uses left-margin and fill-column functions.
+ 
+ 	* paragraphs.el (forward-paragraph): Fix end-of-buffer bug.
+ 
+ 	* completion.el (completion-separator-self-insert-autofilling):
+ 	Don't check fill-column; do-auto-fill will do that.
+ 
+ 	* simple.el (do-auto-fill): Fill, don't fill, or fill-and-justify
+ 	depending on setting of justification text-property.  Respect
+ 	left-margin and right-margin text properties.
+ 	(open-line, indent-new-comment-line): Inherit when inserting.
+ 	(newline-and-indent, reindent-then-newline-and-indent): Doc fix.
+ 
+ 	* text-mode.el (center-line): Use current-left-margin function.
+ 
+ 	* enriched.el (enriched-annotation-list): Property `hard-newline'
+ 	renamed to `hard'.  Justification value `both' renamed `full'.
+ 	(enriched-mode): Don't set auto-fill-function, fill-column,
+ 	sentence-end-double-space.  Do set use-hard-newlines.
+ 	(enriched-delete-indentation): Use delete-to-left-margin and
+ 	canonically-space-region.
+ 	(enriched-indent-increment): Deleted, use `standard-indent' instead.
+ 	(enriched-insert-hard-newline): Deleted, use `newline'.
+ 	(enriched-beginning-of-line): Deleted, use `move-to-left-margin'.
+ 	(enriched-squeeze-spaces): Deleted, use canonically-space-region.
+ 	(enriched-forward-paragraph, enriched-backward-paragraph)
+ 	(enriched-open-line, enriched-fill-paragraph, enriched-fill-region)
+ 	(enriched-fill-region-as-paragraph, enriched-auto-fill-function)
+ 	(enriched-justify-line): Deleted, use standard versions.
+ 	(enriched-region-pars, enriched-end-of-paragraph, enriched-unindent)
+ 	(enriched-beginning-of-paragraph, enriched-move-to-fill-column)
+ 	(enriched-line-length, enriched-indent-line, enriched-indent)
+ 	(enriched-aggressive-auto-fill-function, enriched-hard-newline)
+ 	(enriched-indent-right, enriched-unindent-right): Deleted.
+ 	(enriched-show-codes, enriched-show-margin-codes)
+ 	(enriched-show-region-as-code, enriched-nogrow-hook): Commented out.
+ 	(enriched-left-margin, enriched-change-left-margin)
+ 	(enriched-change-right-margin, enriched-set-left-margin)
+ 	(enriched-set-right-margin): Moved to indent.el as current-left-margin,
+ 	increase-left/right-margin, set-left-/right-margin.
+ 	(enriched-default-justification, enriched-justification)
+ 	(enriched-set-justification-*, enriched-fill-column): Moved to
+ 	fill.el as default-justification, current-justification,
+ 	set-justification-*, current-fill-column.
+ 	(enriched-indentation-menu-map, enriched-justification-menu-map):
+ 	Moved to facemenu.el as facemenu-indentation-menu,
+ 	facemenu-justification-menu.
+ 
+ 	* facemenu.el (facemenu-keybindings, facemenu-face-menu):
+ 	Keybinding for bold-italic changed from M-g o to M-g l; M-g o is
+ 	now "other".
+ 	(facemenu-justification-menu, facemenu-indentation-menu):
+ 	New submenus, moved from enriched.el
+ 	(list-colors-display, facemenu-color-equal): New functions.
+ 	(facemenu-menu): Added "Display Faces" item.
+ 	(facemenu-new-faces-at-end): New variable.
+ 	(facemenu-add-new-face): Obey facemenu-new-faces-at-end.
+ 	(facemenu-menu, facemenu-keymap, facemenu-face-menu)
+ 	(facemenu-foreground-menu, facemenu-background-menu)
+ 	(facemenu-special-menu): Now have function definitions as prefix keys.
+ 	(facemenu-menu, facemenu-update): Refer to submenus by their names
+ 	rather than including their values.
+ 	(facemenu-set-face): Error if read-only; add item to menu if necessary.
+ 	(facemenu-get-face): Always return FACE.
+ 	(facemenu-add-new-face): Don't add if facemenu-unlisted-faces is t.
+ 	(facemenu-unlisted-faces): Doc fix.
+ 
+ 	* facemenu.el: Revise keybindings; doc fix.
+ 	(facemenu-new-faces-at-end): New vbl. (facemenu-add-new-face): Use it.
+ 	(facemenu-set-face, facemenu-set-face-from-menu): Check read-only.
+ 	(facemenu-set-face): Doc fix.
+ 
+ 	* facemenu.el (facemenu-face-menu, facemenu-foreground-menu,
+ 	facemenu-background-menu, facemenu-special-menu): New or renamed
+ 	variables for submenus.
+ 	(facemenu-color-alist): Renamed from facemenu-colors.
+ 	(facemenu-add-new-face): New function.
+ 	(facemenu-update): Don't redo top-level menu;
+ 	nothing should change.  Move menu setup to defvars.  Use
+ 	facemenu-add-new-face. Changed global binding to C-down-mouse-3.
+ 	(facemenu-menu): "Update" item removed; should
+ 	no longer be needed interactively.
+ 	(facemenu-complete-face-list): Just return faces, not keybindings.
+ 
+ Wed Jan 18 14:41:12 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* ispell.el (check-ispell-version): Force standard syntax table.
+ 
+ 	* paths.el (remote-shell-program): New var.
+ 	* telnet.el (rsh): Use it.
+ 	* rcompile.el (remote-compile): Likewise.
+ 	* ange-ftp.el (ange-ftp-gateway-program): Likewise.
+ 	(ange-ftp-shell-command): Likewise.
+ 
+ Wed Jan 18 02:56:21 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* gud.el (gdb): In gud-remove, specify the source file.
+ 
+ Tue Jan 17 23:54:59 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* gud.el (gud-new-keymap): New function.
+ 	(gud-xdb-find-file, gud-dbx-find-file, gud-sdb-find-file, gud-gdb-find-file):
+ 	Use it for keymap inheritance.
+ 
+ Tue Jan 17 20:50:39 1995  Dave Love  <d.love@dl.ac.uk>
+ 
+ 	* gud.el (gud-gdb-find-file): Propagate debug menu to found buffers.
+ 	(gud-dbx-find-file, gud-xdb-find-file, gud-sdb-find-file, gud-perldb-find-file):
+ 	Likewise.
+ 	(gud-menu-map): New variable.
+ 	(gud-mode): Use gud-menu-map and move the menu-setting outside.
+ 
+ 	* gud.el (dbx): Fix missing cast of $curline for Irix.
+ 	(gud-irixdbx-marker-filter): Make $curline cast consistent with the others.
+ 
+ Tue Jan 17 05:34:53 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
+ 
+ 	* comint.el (comint-dynamic-list-completions): Test event-start to
+         make sure it is not a complex event (e.g., switch-frame).
+ 
+ Tue Jan 17 00:35:28 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* help.el (help-for-help): Doc fix.
+ 
+ 	* help-macro.el (make-help-screen): Use *only* local-map to look
+         up keys.
+ 
+ Mon Jan 16 17:54:53 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* edebug.el (edebug-enter): Fix reversed setq's.
+ 
+ 	* calendar.el (calendar): Doc fix.
+ 
+ 	* disp-table.el (standard-display-ascii): Doc fix.  Allow use with X.
+ 
+ 	* iso-cvt.el (iso-aggressive-german-trans-tab): Doc fix.
+ 	(iso-cvt-ffh, iso-cvt-wfh, iso-cvt-ash): Doc fix.
+ 
+ Mon Jan 16 18:27:50 1994  Espen Skoglund  <espensk@tklab3.cs.uit.no>
+ 
+ 	* pascal.el (pascal-mode-map, pascal-outline-map):
+ 	C-c C-b now inserts block.  C-c C-d does goto-defun.
+ 	`#' calls on electric-pascal-hash.
+ 	(pascal-calculate-indent, pascal-indent-alist)
+ 	(electric-pascal-tab, pascal-indent-case):
+ 	Better handling of indent within case.  Support for CPP.
+ 	The `;' in the last statement of a subblock may be omitted.
+ 	(electric-pascal-hash): New function.
+ 
+ Mon Jan 16 00:45:52 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* vc.el: Revert Jan 15 and Jan 5 changes.
+ 
+ 	* scribe.el (scribe-mode): Treat @: as a sentence end.
+ 
+ Sun Jan 15 20:12:53 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* dabbrev.el (dabbrev--find-all-expansions): Don't use push.
+ 	(dabbrev--search): Likewise.
+ 
+ Sun Jan 15 04:43:40 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* vc.el (vc-do-command): Use set-buffer-modified-p instead of
+         not-modified.
+ 
+ 	* files.el (not-modified): Doc fix.
+ 
+ 	* etags.el (etags-tags-completion-table): Don't let match string
+         contain a \177.
+ 
+ Fri Jan 13 22:10:18 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* vc.el (vc-directory): Prompt for a directory, not a file.
+ 
+ Thu Jan 12 19:35:03 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* edebug.el: Undo Nov 30 change.
+ 	(edebug-emacs-19-specific): Don't use quote; easy-menu-define doesn't
+ 	evaluate its first arg.
+ 
+ 	* easymenu.el (easy-menu-define): Doc fix.
+ 
+ Thu Jan 12 15:53:22 1994  Boris Goldowsky  <boris@cs.rochester.edu>
+ 
+ 	* paragraphs.el (forward-paragraph): Notice use-hard-newlines value.
+ 	(looking-at-hard): New function.
+ 	(paragraph-start, paragraph-separate): Doc fix.
+ 
+ 	* simple.el (open-line, split-line, next-line): Use `newline'
+ 	function to insert newline so it will be marked hard if appropriate.
+ 	(indent-new-comment-line): Use `newline' function, unless called
+ 	with (new) argument.
+ 	(do-auto-fill): Call indent-new-comment-line with argument to
+ 	make newline soft.
+ 
+ 	* fill.el (fill-region-as-paragraph): Don't modify newline
+ 	at end of paragraph, to make sure text-properties are preserved.
+ 	(fill-paragraph): Call fill-region, not fill-region-as-paragraph,
+ 	to avoid clobbering paragraph-internal hard-newlines.
+ 	(fill-region): If use-hard-newlines is on, divide into
+ 	"paragraphs" by breaking at every hard newline, temporarily
+ 	ignoring paragraph-start.
+ 
+ Thu Jan 12 10:36:13 1994  Tom Tromey  <tromey@drip.colorado.edu>
+ 
+ 	* buff-menu.el (list-buffers): New function.
+ 	(ctl-x-map): Define C-x C-b to list-buffers.
+ 
+ Thu Jan 12 00:42:39 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* files.el (revert-buffer): Recompute buffer-file-truename.
+ 
+ 	* c-mode.el (indent-c-exp): Handle `{ if (x)\n  foo;\n  bar;' case.
+ 	* cplus-md.el (indent-c++-exp): Handle `{ if (x)\n  foo;\n  bar;' case.
+ 
+ 	* etags.el (etags-goto-tag-location): Add 1 to char positions in TAGS.
+ 
+ 	* startup.el (command-line-1): Handle -f with kbd macro.
+ 
+ 	* msb.el (mouse-select-buffer) Handle an aborted selection.
+ 
+ Wed Jan 11 12:27:27 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* derived.el (define-derived-mode): Doc fix.
+ 
+ Tue Jan 10 23:43:34 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* term/x-win.el: Put height and width from geometry parm
+ 	into default-frame-alist.
+ 
+ Tue Jan 10 21:22:32 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* isearch.el (isearch-edit-string): Disable message logging.
+ 	(isearch-toggle-case-fold, isearch-message): Likewise.
+ 
+ Tue Jan 10 20:28:01 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* dired.el (dired-insert-directory): Don't call expand-file-name
+ 	when dir-or-list is a list.
+ 
+ Tue Jan 10 17:31:01 1995  Noah Friedman  <friedman@prep.ai.mit.edu>
+ 
+         * rlogin.el (rlogin-tab-or-complete): Insert tab in buffer, don't
+         send directly to process.
+         (rlogin, rlogin-directory-tracking-mode): Use rlogin-remote-user,
+         not rlogin-user.
+ 
+ Tue Jan 10 12:37:54 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* faces.el (face-nontrivial-p): New function.
+ 
+ 	* paren.el (show-paren-command-hook): Don't alter paren-mismatch face
+ 	if make-face gives it some contents.
+ 
+ Tue Jan 10 12:25:50 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
+ 
+ 	* shell.el (shell-mode): Doc fix.
+ 
+ Tue Jan 10 01:23:54 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* dabbrev.el (dabbrev-check-other-buffers):
+ 	Renamed from dabbrev-always-check-other-buffers.
+ 	(dabbrev-check-all-buffers): Renamed frm dabbrev-check-rest-of-buffers.
+ 
+ 	* ange-ftp.el (ange-ftp-set-buffer-mode): Don't set make-backup-files.
+ 	(ange-ftp-real-find-backup-file-name): New function.
+ 	(ange-ftp-find-backup-file-name): New function.
+ 	Use it to handle find-backup-file-name.
+ 
+ 	* files.el (find-backup-file-name): Run a file name handler.
+ 	(backup-buffer): Do nothing if backup-info is nil.
+ 
+ Mon Jan  9 23:58:03 1995  Noah Friedman  <friedman@prep.ai.mit.edu>
+ 
+         * rlogin.el: Removed several more gratuitous autoload cookies.
+         (rlogin-initially-track-cwd): Variable deleted.
+         (rlogin-directory-tracking-mode): New variable and function.
+         Default to 'local.
+         (rlogin-host, rlogin-remote-user): New variables.
+         (rlogin): Set them appropriately.
+         (rlogin-tab-or-complete): New function.
+         Bind C-i to it.
+         (rlogin-carriage-filter): New function.
+         (rlogin): Add it to comint-output-filter-functions.
+         (rlogin-parse-words): New function.
+         (rlogin): Make buffer name "*rlogin-USER@HOST* if remote user
+         differs from local.
+         Simplify initialization of local variables, using rlogin-parse-words.
+         Do not call comint-mode directly.
+         Doc fixes.
+ 
+ Mon Jan  9 18:09:46 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* bytecomp.el: Fix text punctuation.
+ 
+ Mon Jan  9 04:46:59 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* faces.el (face-try-color-list): Treat `underline' as valid.
+ 
+ 	* subr.el (listify-key-sequence-1): Update for change in CHAR_META.
+ 
+ 	* dabbrev.el (dabbrev-expand): Now checks for marker.
+ 	(dabbrev--try-find): Now does a protected call to `widen'.
+ 	(dabbrev-always-check-other-buffers): Default now t.
+ 	(dabbrev--capitalize): Function deleted.
+ 	(dabbrev-completion): Use `capitalize'.
+ 
+ 	* msb.el Better format of files-by-directory menus.  Now
+ 	splits big menus into sub-menus.
+         (msb-max-menu-items): Changed default value.  This variable
+ 	now depicts the maximum number of items in a sub-menu.
+ 	(msb-display-most-recently-used): Changed default value.
+ 	(mouse-select-buffer): Now handles several levels of
+ 	sub-menus.  New format on return value.
+ 
+ Sun Jan  8 14:36:11 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* find-file.el: New file.
+ 
+ Fri Jan  6 15:48:24 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* mouse.el (mouse-drag-region): As once in the past,
+ 	call the binding of the terminating event.
+ 
+ 	* terminal.el (te-terminfo-systems-regexp): Variable deleted.
+ 	(te-create-terminfo): Use system-uses-terminfo.
+ 
+ 	* simple.el (what-cursor-position): Show char in decimal, hex, octal.
+ 
+ Thu Jan  5 15:27:30 1995  Stefan Schoef  <schoef@Informatik.Uni-Oldenburg.DE>
+ 
+         * bibtex.el (bibtex-clean-entry): Killing text while editing
+         the autogenerated label in the minibuffer caused the killed text
+         to appear in front of the bibtex entry.
+ 
+ Thu Jan  5 17:10:48 1995  Eric Raymond  <esr@locke.ccil.org>
+ 
+ 	* vc.el (vc-do-command): Change RCS handling so rcsdiff won't strip
+ 	away relative-pathname information.  This function no longer sets the
+ 	default directory.  Also, mark the *vc* output buffer unmodified.
+ 	(vc-revert-buffer1): Handle font-lock mode correctly.
+ 	(vc-diff, vc-print-log): vc-do-command no longer sets the default
+ 	directory, but doing so	is advantageous for these cases.
+ 	(file-executable-p-18):	Better portability to Emacs 18.
+ 	(vc-directory-exclusion-list, vc-file-tree-walk-internal):
+ 	Implement the new variable vc-directory-exclusion-list to prune
+ 	tree walks.  Initial value tells it to ignore SCCS and RCS
+ 	subdirectories.
+ 
+ Thu Jan  5 15:32:51 1995  Ken Laprade  <klaprade@harris.com>
+ 
+ 	* simple.el (pop-global-mark): Make pop-global-mark treat
+ 	global-mark-ring as a ring.
+ 
+ Thu Jan  5 07:01:33 1995  Johan Vromans  <jv@NL.net>
+ 
+ 	* forms.el: Change forms-search to forms-search-forward, and add
+         forms-search-backward.
+ 	(forms--mode-menu-ro, forms--mode-menu-edit): New
+ 	functions to create a pulldown menu in the menubar.
+ 	(forms--mode-commands): Call them for the edit and view mode.
+ 	* (forms-print): New function.
+ 
+ Wed Jan  4 17:32:32 1995  Stephen Gildea  <gildea@x.org>
+ 
+ 	* tex-mode.el (tex-print): Better check for when to print current
+ 	buffer's file over last processed file.
+ 
+ Tue Jan  3 17:12:48 1995  Noah Friedman  <friedman@prep.ai.mit.edu>
+ 
+         * sendmail.el (mail-personal-alias-file): New variable.
+         Use globally in place of hardwired "~/.mailrc".
+         * mailalias.el: Here too.
+         * mailabbrev.el (mail-abbrev-mailrc-file): Variable and macro
+         deleted.  All callers now use `mail-personal-alias-file'.
+ 
+         * pp.el: Add autoload cookies.
+ 
+ Tue Jan  3 01:39:54 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* tex-mode.el (tex-mode): Recognize \NeedsTeXFormat{LaTeX2e}.
+ 
+ 	* startup.el (command-line-1): Pause between init file error
+ 	and command line option processing.
+ 
+ 	* spell.el (spell-filter): Make it a risky-local-variable.
+ 
+ Mon Jan  2 18:01:07 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* gud.el (gud-sdb-marker-filter): Use gud-marker-acc.
+ 
+ 	* time.el (display-time-string-forms): Fix doc string syntax error.
+ 
+ Mon Jan  2 13:03:23 1994  Kevin J. Greiner  <greiner@boston.brc.shell.com>
+ 
+ 	* gud.el (gud-dbx-marker-filter): Use gud-marker-acc like
+ 	gud-gdb-marker-filter.
+ 
+ Sat Dec 31 00:11:30 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* files.el (auto-mode-alist): Add entries for .cls files,
+ 	and for /drafts/.  Put tex-mode and latex-mode in lower case.
+ 
+ 	* files.el (set-visited-file-name): Error if buffer is indirect.
+ 	(basic-save-buffer): For indirect buffer, save the base buffer.
+ 	(save-some-buffers): Ignore indirect buffers.
+ 
+ Fri Dec 30 15:47:30 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* tex-mode.el (tex-mode): \begin at start of file implies Latex.
+ 
+ 	* terminal.el (terminal-emulator): Test system-configuration
+ 	to decide on terminfo vs termcap.
+ 	(te-terminfo-systems-regexp): Renamed from te-terminfo-systems.
+ 
+ Fri Dec 30 14:55:27 1994  Kishore Kumar  (kishorek@tulblr.unisys.com)
+ 
+ 	* terminal.el: Added terminfo support.
+ 	(te-terminal-name-prefix, te-terminal-name, te-terminfo-systems):
+ 	New variables.
+ 	(terminal-emulator): Handle termcap or terminfo.
+ 	(te-create-terminfo, te-create-termcap): New subroutines.
+ 	(te-tic-sentinel): New subroutine.
+ 
+ Thu Dec 29 13:52:13 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* simple.el (completion-list-mode-map): Don't bind return, just C-m.
+ 
+ Wed Dec 28 20:47:21 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* apropos.el (super-apropos-check-elc-file): New function.
+ 	specifies which file to search.
+ 	(apropos-files-scanned): New variable.
+ 	(super-apropos): Bind apropos-files-scanned.
+ 	Update apropos-accumulate from apropos-print-matches.
+ 	Call super-apropos-accumulate before checking for no matches.
+ 	(super-apropos-check-doc-file): Don't visit the file, just insert it.
+ 	(super-apropos-accumulate): When doc string is in a file,
+ 	scan that file.
+ 	(apropos-print-matches): Return the sorted list.
+ 	(safe-documentation): Handle compiled files.
+ 
+ Wed Dec 28 03:12:30 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* etags.el (find-tag-in-order): Don't set buffer-local value of
+         tags-file-name.
+ 
+ Tue Dec 27 15:13:57 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* tex-mode.el (tex-mode-map): Add BibTeX File menu item.
+ 
+ 	* subr.el (run-hook-with-args-until-failure):
+ 	Return non-nil if no hook functions.
+ 
+ Mon Dec 26 00:06:09 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* startup.el (command-line-1): Split startup msg into two parts.
+ 	Add something about C-mouse-3 when on a window system.
+ 
+ 	* tar-mode.el (tar-mode-map): Bind C-m to tar-extract.
+ 
+ 	* replace.el (occur-mode-map): Bind C-m to occur-mode-goto-occurrence.
+ 	(occur-mode): Doc fix.
+ 
+ 	* compile.el (compilation-minor-mode-map): Bind C-m to
+ 	compilation-goto-error.
+ 
+ 	* buff-menu.el (Buffer-menu-mode-map): Bind C-m to
+ 	Buffer-menu-this-window.
+ 
+ 	* dired.el (dired-mode-map): Bind C-m to
+ 	dired-advertised-find-file.  Change f to dired-find-file.
+ 
+ 	* simple.el (switch-to-completions): New command, with bindings
+ 	in the minibuffer completion maps.
+ 
+ 	* simple.el (next-completion, previous-completion): New commands.
+ 	(completion-list-mode-map): Put them on left, right arrows.
+ 
+ 	* isearch.el (isearch-mode): Set mouse-leave-buffer-hook.
+ 	(isearch-done): Clear it.
+ 
+ Sun Dec 25 09:27:20 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* mouse.el (mouse-minibuffer-check, mouse-drag-mode-line)
+ 	(mouse-yank-at-click, mouse-yank-secondary, mouse-choose-completion):
+ 	Run mouse-leave-buffer-hook.
+ 
+ 	* bytecomp.el (byte-compile-warning-types): Add obsolete.
+ 	(byte-compile-warnings): Doc fix.
+ 	(byte-compile-obsolete): Check for obsolete in byte-compile-warnings.
+ 	(byte-compile-variable-ref): Likewise.
+ 
+ 	* timezone.el (timezone-fix-time): For year values < 50, add 2000.
+ 
+ 	* server.el (server-process-filter): Process each line separately.
+ 	(server-buffer-done): Delete dead buffers from CLIENT list.
+ 	Wait a while after sending a command to emacsclient.
+ 	Verify that BUFFER is a buffer.
+ 
+ 	* subr.el (font-lock-defaults): Add defvar.
+ 	(buffer-file-type): Add defvar.
+ 
+ 	* simple.el (completion-reference-buffer): Initialize to nil.
+ 
+ 	* dabbrev.el (esc-map): Delete excess closeparen.
+ 
+ 	* apropos.el (super-apropos, super-apropos-check-doc-file)
+ 	(super-apropos-accumulate): Vars item, fn-doc and var-doc renamed
+ 	to apropos-item, apropos-fn-doc and apropos-var-doc.
+ 	(apropos-item, apropos-var-doc, apropos-fn-doc)
+ 	(apropos-accumulate, apropos-regexp): New defvars.
+ 	(super-apropos): Bind apropos-regexp to regexp.
+ 	(super-apropos-accumulate): Use apropos-regexp.
+ 
+ 	* ange-ftp.el (ange-ftp-save-match-data): Macro deleted.
+ 	Most callers use save-match-data.
+ 	(ange-ftp-process-filter, ange-ftp-process-sentinel)
+ 	(ange-ftp-gwp-filter): Don't save the match data explicitly.
+ 
+ 	* ange-ftp.el (ange-ftp-process-filter, ange-ftp-gwp-filter):
+ 	After comint output processing, update STR.
+ 
+ Sat Dec 24 10:24:42 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* fast-lock.el: New file.
+ 
+ 	* dabbrev.el (dabbrev-abbrev-char-regexp): Accept symbol chars
+ 	as well as word constituent chars.
+ 
+ 	* startup.el (command-line-1): If help-command has no key binding,
+ 	say `M-x help', not `M-x help-command'.
+ 
+ 	* emacs-lock.el: New file.
+ 
+ Fri Dec 23 13:04:39 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* msb.el: Fix quoting conventions and spaces at end of sentence.
+ 
+ 	* msb.el: New file.
+ 
+ 	* dabbrev.el (dabbrev-completion): Now searches all buffers
+ 	when given prefix arg 16.
+ 	(dabbrev--version): Variable deleted.
+ 
+ 	* dabbrev.el: Don't require cl, picture, or reporter.
+ 	Don't provide new-dabbrev.
+ 	(dabbrev--try-find): Don't use `loop'.
+ 	Don't create or kill local bindings.
+ 	(dabbrev-completion): Use key-description to say what to type.
+ 	Fix style of "done" message.
+ 	(dabbrev-submit-feedback): Function deleted.
+ 	(dabbrev--same-major-mode-p): Simplify.
+ 	(dabbrev-completion, dabbrev--abbrev-at-point): Fix error msg style.
+ 
+ 	* dabbrev.el (dabbrev-filter-elements): New macro.
+ 	(dabbrev--select-buffers, dabbrev--find-expansion): Use that.
+ 	(dabbrev--search): Use that.
+ 
+ 	* dabbrev.el: Complete rewrite by Lars.Lindberg@sypro.cap.se.
+ 
+ Fri Dec 23 18:12:54 1994  Barry Warsaw  (bwarsaw@cnri)
+ 
+ 	* elp.el (elp-pack-number): New function.
+ 	(elp-output-results): Use elp-pack-number to truncate time strings,
+ 	watching out for very small or very large numbers.
+ 
+ 	* elp.el (elp-unset-master): Make it an interactive command.
+ 
+ 	* reporter.el (reporter-submit-bug-report): Set up for status messages.
+ 	Use mail-text to position point to the body of the message.
+ 
+ 	* reporter.el (reporter-beautify-list): Complete rewrite.
+ 	Optional nocompact-p argument.
+ 
+ 	* reporter.el (reporter-dump-variable): Invert the test and
+ 	passing of compact-p argument to reporter-beautify-list.  List
+ 	values are not printed as defuns or function calls.
+ 
+ 	* reporter.el: Updated package list.
+ 
+ 	* reporter.el (reporter-lisp-indent): New defun.
+ 
+ 	* reporter.el (reporter-dont-compact-list)
+ 	(reporter-status-message, reporter-status-count): New variables.
+ 
+ 	* reporter.el (reporter-update-status, reporter-beautify-list)
+ 	reporter-dump-variable): Now smarter about formating variables
+ 	with list values.  Checks the value of reporter-dont-compact-list.
+ 
+ Fri Dec 23 12:23:40 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* simple.el (next-line, previous-line): If interactive and not in
+ 	kbd macro, catch the error and beep instead.
+ 
+ Thu Dec 22 22:30:08 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* bibtex.el (bibtex-string, bibtex-preamble): Use forward-line.
+ 	(sort-subr): Don't call autload for this--that's done in loaddefs.el.
+ 	(bibtex-mode): Add autoload cookie.
+ 
+ 	* server.el (server-switch-buffer): Cope with dead frames and windows.
+ 
+ Thu Dec 22 19:19:25 1994  Dave Love  <d.love@dl.ac.uk>
+ 
+         * gud.el (gdb): Correct tbreak doc string.
+         (gud-mode): Define a Gud menu.
+         (gdb): Set debugger-specific menu entries.
+         (sdb) (dbx) (xdb): Likewise.
+ 
+ Thu Dec 22 17:52:03 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* novice.el (enable-command): Always insert code to enable.
+ 	(disable-command): Insert newline before as well as after.
+ 
+ Wed Dec 21 12:56:21 1994  David M. Smith  <D.M.Smith@lancaster.ac.uk>
+ 
+ 	* imenu.el (imenu-always-use-completion-buffer-p): A value of
+ 	`never' now means never display a completion buffer.
+ 	(imenu--completion-buffer): implement 'never behaviour.
+ 
+ Wed Dec 21 15:45:00 1994  Stefan Schoef  <schoef@informatik.uni-oldenburg.de>
+ 
+ 	* bibtex.el: Changed keybinding for bibtex-print-help-message
+         (from \C-ch to \C-c?). Therefore, describe-mode is not longer on
+         \C-c?. Also, changed prefix \C-cn for bibtex-narrow functions to
+         \C-c\C-r.
+         (bibtex-string-files): Changed documentation.
+         (bibtex-mode-map): Inscriptions of menu bar changed from "Entry
+         Types" to "Entry-Types" and "Bibtex Edit" to "BibTeX-Edit".
+         (bibtex-string-files): Changed documentation.
+         (bibtex-mode): If environment variable BIBINPUTS isn't defined,
+         string files are searched in the current directory.
+         (bibtex-completion-candidates): Now buffer-local to allow
+         evaluation of different bibtex-string-files in different buffers.
+         (bibtex-autokey-edit-before-use, bibtex-clean-entry): New variable
+         that determines, if the user is allowed to edit auto-generated
+         reference keys before they are used.
+         (bibtex-generate-autokey, bibtex-clean-entry): New function to
+         generate an autokey if necessary.
+         (bibtex-autokey-names, bibtex-autokey-name-change-strings,
+         bibtex-autokey-name-length, bibtex-autokey-name-separator,
+         bibtex-autokey-year-length, bibtex-autokey-titlewords,
+         bibtex-autokey-title-terminators,
+         bibtex-autokey-titlewords-stretch,
+         bibtex-autokey-titleword-first-ignore,
+         bibtex-autokey-titleword-abbrevs,
+         bibtex-autokey-titleword-change-strings,
+         bibtex-autokey-titleword-length,
+         bibtex-autokey-titleword-separator,
+         bibtex-autokey-name-year-separator,
+         bibtex-autokey-year-title-separator): New variables related to
+         bibtex-generate-autokey.
+         (bibtex-find-entry-location): Optional second parameter maybedup
+         to tell it that entering a duplicate entry isn't to report by an
+         error but by the return value of the function (necessary for
+         bibtex-clean-entry to find the correct position of an entry with
+         an autogenerated key without disturbing the user with unwanted
+         messages).
+         (bibtex-help-message): New variable to avoid printing of help
+         messages in the echo area.
+         (assoc-of-regexp): New function to match an alist of regexps.
+         (bibtex-string-files, bibtex-completion-candidates, bibtex-mode):
+         New variables to allow bibtex-complete-string to work on strings
+         initialized from a variable and from @String definitions in a list
+         of files, too.
+         (bibtex-predefined-strings, bibtex-entry-field-alist): Changed to
+         user options.
+         (bibtex-mode): Changed doc string.
+         (many functions and variables): Changed documentation strings of
+         variables and functions to hold a complete sentence in the first
+         line.
+         (bibtex-print-help-message): Now line dependent and reports if it
+         is called outside a BibTeX field.
+         (validate-bibtex-buffer): Completely rewritten to validate, if
+         buffer is syntactically correct.
+         (find-bibtex-duplicates): Moved into validate-bibtex-buffer.
+         (ispell-abstract, bibtex-ispell-abstract, ispell-bibtex-entry,
+         bibtex-ispell-entry, beginning-of-bibtex-entry,
+         bibtex-beginning-of-entry, end-of-bibtex-entry,
+         bibtex-end-of-entry, hide-bibtex-entry-bodies,
+         bibtex-hide-entry-bodies, narrow-to-bibtex-entry,
+         bibtex-narrow-to-entry, sort-bibtex-entries, bibtex-sort-entries,
+         validate-bibtex-buffer, bibtex-validate-buffer,
+         find-bibtex-entry-location, bibtex-find-entry-location): All
+         interactive functions are renamed, so that any interface function
+         begins with "bibtex-". Mapping:
+         ispell-abstract            --> bibtex-ispell-abstract
+         ispell-bibtex-entry        --> bibtex-ispell-entry
+         beginning-of-bibtex-entry  --> bibtex-beginning-of-entry
+         end-of-bibtex-entry        --> bibtex-end-of-entry
+         hide-bibtex-entry-bodies   --> bibtex-hide-entry-bodies
+         narrow-to-bibtex-entry     --> bibtex-narrow-to-entry
+         sort-bibtex-entries        --> bibtex-sort-entries
+         validate-bibtex-buffer     --> bibtex-validate-buffer
+         find-bibtex-entry-location --> bibtex-find-entry-location
+         (bibtex-maintain-sorted-entries,
+         bibtex-sort-ignore-string-entries): Default is now t.
+         (bibtex-complete-string): String list is built from additional
+         string list bibtex-predefined-string and current strings in file.
+         (string-equalp): Deleted and substituted by string-equal.
+         (assoc-string-equalp): Renamed to assoc-ignore-case.
+         (bibtex-entry): Reference key can be entered with completion. All
+         reference keys that are defined in buffer and all labels that
+         appear in crossreference entries are object to completion.
+         (Entry types): Changed order of entries in menu "entry types".
+         (bibtex-entry-field-alist): Changed order of entries slightly to
+         be more conform with standard BibTeX style layouts.
+         (bibtex-mode-map): Uniform keybindings for \C-c\C-e prefix (often
+         used types on control keys, sometimes used types on normal keys,
+         rarely used types on shift keys, almost never used types on meta
+         keys).
+         (bibtex-mode-map): Function narrow-to-bibtex-entry and counterpart
+         widen and function hide-bibtex-entry-bodies and counterpart
+         show-all bounded to appropriate local keys.
+         (bibtex-abbrev-table): Deleted
+         (bibtex-current-entry-label, put-string-on-kill-ring): Deleted
+         (AUCTeX provides all the functionality needed for citation
+         completion).
+         (bibtex-enclosing-reference, bibtex-pop-previous, bibtex-pop-next,
+         bibtex-clean-entry): Hacked for speed (bibtex-pop-previous and
+         bibtex-pop-next were to slow for larger BibTeX files).
+         (bibtex-pop-previous, bibtex-pop-next): Delimiters from previous
+         or next entry are changed to actual delimters if necessary.
+         (bibtex-entry): Fixed bug (False entry wasn't reported in error
+         message if bibtex-entry was called with undefined reference name).
+         (bibtex-entry-field-alist, bibtex-entry, bibtex-make-field,
+         bibtex-next-field, bibtex-clean-entry): Every reference entry now
+         contains a comment in addition to the name of the reference. This
+         comment appears in the echo area if you start editing that field
+         (after calling bibtex-next-field).
+         (bibtex-include-OPTcrossref, bibtex-entry): Changed
+         bibtex-include-OPTcrossref from single boolean variable to hold a
+         list of reference names which should have a crossref field.
+         (bibtex-complete-word): New function, which completes word
+         fragment before point to the longest prefix of predefined strings
+         in the buffer in the same way that ispell-complete-word operates
+         for words found in the dictionary.
+         (bibtex-reference-head): Start of bibtex-reference-head changed
+         from "^[ \t]*\\(" to "^\\( \\|\t\\)*\\(" (bibtex-pop-previous and
+         bibtex-pop-next didn't work, probably due to a bug in
+         re-search-forward).
+         (several functions): Added support for {} as field delimiters
+         (better than '"' for accented characters.
+         (bibtex-clean-entry): If optional field crossref is empty or
+         missing, former optional fields (if bibtex-include-OPTcrossref was
+         t) are necessary again. bibtex-clean-entry complains if they are
+         empty but not if they are missing, so you can intenionally omit
+         them, e. g. for a pseudo @Journal entry (needed for
+         crossreferences) made out of an @article with missing non-optional
+         fields.
+         Menu bar entries aren't centered anymore.
+ 
+ Wed Dec 21 15:07:58 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* facemenu.el (facemenu-key): Change to M-g.
+ 
+ 	* files.el (save-buffers-kill-emacs): Fix backward test of value of
+ 	run-hook-with-args-until-failure's value.
+ 
+ 	* tex-mode.el (tex-start-shell): Use inheritance.
+ 
+ Wed Dec 21 15:20:15 1994  Dave Love  <d.love@dl.ac.uk>
+ 
+         * gud.el (gud-irixdbx-marker-filter): Changes for Irix dbx.
+         (dbx): gud-up, gud-down are now special cases for Irix.
+ 
+ Wed Dec 21 11:33:45 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* dired.el (dired-string-replace-match): Function moved here.
+ 	* dired-aux.el (dired-string-replace-match): Moved to dired.el.
+ 
+ Wed Dec 21 10:54:38 1994  Ed Reingold  <reingold@albert.gnu.ai.mit.edu>
+ 
+         * tex-mode.el (tex-shell-map,tex-start-shell): Start with
+         shell-mode-map.
+ 
+ Wed Dec 21 09:35:24 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* help.el (describe-function): Don't add `.el' when printing file name.
+ 
+ Tue Dec 20 10:41:02 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* bytecomp.el (byte-compile-dest-file): New variable.
+ 	(byte-compile-file): Bind that var, early on.
+ 	(byte-compile-dynamic): New variable.
+ 	(byte-compile-dynamic-docstrings): New variable.
+ 	(byte-compile-close-variables): Bind byte-compile-dynamic,
+ 	byte-compile-dynamic-docstrings, and byte-compiler-compatibility.
+ 	(byte-compile-file): Call normal-mode, not set-auto-mode.
+ 	(byte-compile-output-docform): New arguments PREFACE, NAME, SPECINDEX,
+ 	QUOTED.  Callers changed.  Output doc strings as references to the .elc
+ 	file itself, using #@ and #$ constructs.
+ 	(byte-compile-output-as-comment): New function.
+ 
+ 	* bytecomp.el (byte-compile-insert-header): Don't save-excursion.
+ 	Insert at point, and move point.  Insert extra newline at end.
+ 	(byte-compile-from-buffer): Insert the header before compilation.
+ 
+ 	* buff-menu.el (Buffer-menu-buffer): Clear text properties in STRING.
+ 
+ 	* faces.el (frame-update-face-colors): New function.
+ 	* frame.el (set-background-color, set-foreground-color):
+ 	Call frame-update-face-colors.
+ 
+ 	* rmail.el (rmail-first-unseen-message): Fix 1-off error.
+ 
+ Mon Dec 19 14:09:46 1994  Ed Reingold  <reingold@albert.gnu.ai.mit.edu>
+ 
+         * tex-mode.el (tex-start-shell): Use comint prompt and mode-map.
+ 
+ Sun Dec 18 12:39:58 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* rmail.el (rmail-search-backward): Function deleted.
+ 	(rmail-mode-map): Use rmail-search-backwards instead.
+ 
+ Sun Dec 18 14:16:39 1994  Lawrence R. Dodd  (dodd@roebling.poly.edu)
+ 
+ 	* fortran.el (fortran-end-if, fortran-end-do,
+ 	fortran-beginning-if, fortran-beginning-do): New subroutines.
+ 	(fortran-blink-matching-if, fortran-blink-matching-do): Use them.
+ 	(fortran-mark-do, fortran-mark-if): New user functions.
+ 	(fortran-blink-matching-if, fortran-mode): Doc mod.
+ 
+ Sun Dec 18 14:59:55 1994  Morten Welinder  <terra@diku.dk>
+ 
+ 	* tar-mode.el (tar-extract): Don't use set-visited-file-name.  to
+ 	avoid interaction problems with ange-ftp.
+ 
+ Fri Dec 16 19:50:24 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* rnewspost.el (news-mail-reply): Restore the saved narrowing
+ 	before calling `mail'.
+ 
+ Thu Dec 15 07:15:27 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* emerge.el (emerge-read-file-name): New arg must-match.
+ 	(emerge-files, emerge-files-with-ancestor): Pass new arg.
+ 
+ 	* isearch.el (isearch-done): Don't print msg about mark
+ 	if we don't set it.  Fix paren error.
+ 
+ 	* subr.el (lambda): Doc fix.
+ 
+ 	* vc-hooks.el (vc-toggle-read-only): Accept prefix arg
+ 	and pass it along to vc-next-action.
+ 
+ 	* font-lock.el (font-lock-hack-keywords): Turn off undo generation.
+ 	(font-lock-unfontify-region. font-lock-fontify-region): Likewise.
+ 
+ 	* c-mode.el (indent-c-exp): Don't be fooled by else_ or while_.
+ 	(c-indent-line): Likewise.
+ 	(c-backward-to-start-of-if): Don't be fooled by if_ or else_.
+ 
+ 	* sendmail.el (sendmail-send-it): Don't convert S: to Subject:.
+ 
+ 	* faces.el (face-initialize): Test for framep not t or nil.
+ 
+ 	* files.el (hack-local-variables): Run hack-local-variables-hook.
+ 	(hack-local-variables-hook): New variable.
+ 
+ 	* find-dired.el (find-grep-options): Use -q on non-BSD systems.
+ 
+ Wed Dec 14 14:58:59 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* find-dired.el (find-ls-option): Don't ask for inode numbers.
+ 
+ 	* apropos.el (apropos-match-keys): Handle menu bindings
+ 	with cached equivalent keys.
+ 
+ 	* rmail.el (rmail-ignored-headers): Delete junk from definition.
+ 
+ Tue Dec 13 17:20:12 1994  Don Woods  (don@genmagic.com)
+ 
+ 	* replace.el (perform-replace):
+ 	Report number of replacements when done.
+ 	(query-replace, query-replace-regexp, replace-string)
+ 	(map-query-replace-regexp. replace-regexp): No message here.
+ 
+ Tue Dec 13 13:40:41 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* informat.el (Info-split): Fix 1-off error in subfile position.
+ 
+ 	* replace.el (occur): Escape newlines when printing regexp.
+ 
+ 	* informat.el (Info-tagify): Avoid 1-off error in position of a tag.
+ 
+ 	* macros.el (insert-kbd-macro): Specially handle C-\, M-\ and C-M-\.
+ 	Only convert the character syntax if definition is a string.
+ 
+ Sun Dec 11 16:22:26 1994  Richard Stallman  <rms@kepa>
+ 
+ 	* rmailsum.el (rmail-summary-goto-msg): When highlighting,
+ 	don't skip 1st char on line if it isn't a space.
+ 
+ 	* gnusmail.el (gnus-mail-reply-using-mail): Don't save point;
+ 	yank the original at point.
+ 
+ 	* apropos.el (apropos-match-keys): Handle minor mode maps
+ 	and overriding-local-map.
+ 
+ Sat Dec 10 18:03:42 1994  Richard Stallman  <rms@kepa>
+ 
+ 	* vc.el (vc-dir-all-files): New function.
+ 	(vc-directory): Show just one directory by default.
+ 	Read dir name in minibuffer.
+ 	(vc-directory-18): Deleted.
+ 
+ Fri Dec  9 20:59:52 1994  Ken Stevens  <stevensk@afit.af.mil>
+ 
+ 	* ispell.el: Added ispell-offset for version consistency.
+ 	(ispell-dictionary-alist): updated dictionaries & better match defaults
+ 	(ispell-alternate-dictionary): added /usr/shar path
+ 	(ispell-menu-map-needed): redo changes that made this incompatible
+         with earlier versions of emacs19.
+ 	(ispell-required-version): changed to assure version 3.1.12 accessed.
+ 	(ispell-word): Correctly accept buffer-local information.
+         Does not try to modify read-only buffer on 'm' command.
+ 	(ispell-command-loop): fixed bug that corrupted buffers.
+         removed scrolling when *Choices* buffer shrinks.
+ 	(check-ispell-version): Correctly identifies new version requirements.
+ 	(ispell-region): Interaction updated for version 3.1.12+
+ 	Buffer read-only modification improvement.  Dictionary messages added.
+ 	(ispell-message-text-end): skips additional shell files.
+ 	(ispell-buffer-local-parsing): extended-char mode now matches text mode
+ 
+ Fri Dec  9 01:14:03 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* hilit19.el: Add patterns for asm-mode.
+ 
+ 	* files.el (set-auto-mode): Don't get confused by anything ending
+ 	in "mode:" which isn't a mode spec.
+ 
+ Fri Dec  9 00:03:18 1994  Richard Stallman  <rms@green-hill>
+ 
+ 	* rlogin.el (rlogin-initially-track-cwd): Now a 3-way flag.
+ 	(rlogin): Handle that.
+ 
+ Thu Dec  8 15:31:50 1994  Richard Stallman  <rms@bethel>
+ 
+ 	* files.el (ignored-local-variables): Mark it risky.
+ 
+ Thu Dec  8 13:51:43 1994  Ed Reingold  <reingold@albert.gnu.ai.mit.edu>
+ 
+         * cal-mayan.el (calendar-mayan-days-before-absolute-zero): Mention
+         Hochleitner's correlation.
+ 
+ Wed Dec  7 21:47:48 1994  Richard Stallman  <rms@green-hill>
+ 
+ 	* telnet.el (telnet): Don't make assumptions about process name.
+ 	(telnet-send-process-next-char): Renamed from send-...
+ 
+ 	* nntp.el (nntp-buggy-select): Delete usg-unix-v from list.
+ 
+ Wed Dec  7 19:25:27 1994  Richard Stallman  <rms@bethel>
+ 
+ 	* dired.el (dired-insert-directory): Quote certain chars with \.
+ 	(dired-get-filename): Always unquote \ quoting.
+ 
+ 	* comint.el (comint-mode-map): Treat C-up, C-down like M-p, M-n.
+ 
+ Tue Dec  6 17:39:14 1994  Richard Stallman  <rms@kepa>
+ 
+ 	* simple.el (buffer-quit-function): New variable.
+ 	(keyboard-escape-quit): Use it.
+ 
+ 	* loaddefs.el: Delete ESC ESC binding for eval-expression.
+ 	(function-key-map): Map C-delete into M-DEL.
+ 
+ Mon Dec  5 19:17:54 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* ange-ftp.el (ange-ftp-set-binary-mode): Ignore hash size if nil.
+ 	(ange-ftp-set-ascii-mode): Likewise.
+ 
+ Mon Dec  5 19:17:20 1994  Richard Stallman  <rms@green-hill>
+ 
+ 	* ebuff-menu.el (electric-buffer-menu-mode-map):
+ 	Bind ESC ESC ESC to Electric-buffer-menu-quit.
+ 
+ 	* loaddefs.el (minibuffer-local-map): Bind up and down to history cmds.
+ 	(minibuffer-local-ns-map, minibuffer-local-completion-map): Likewise.
+ 	(minibuffer-local-must-match-map): Likewise.
+ 
+ 	* isearch.el (isearch-cancel): New function.
+ 	(isearch-mode-map): Bind that to ESC ESC ESC.
+ 	Move the code to set up the meta submap earlier in the expression.
+ 
+ 	* loaddefs.el (function-key-map): Map f1 to C-h.
+ 
+ 	* simple.el (delete-completion-window): New function.
+ 	(completion-list-mode-map): Bind that to ESC ESC ESC.
+ 
+ 	* simple.el (keyboard-escape-quit): Bind this globally to ESC ESC ESC.
+ 
+ Mon Dec  5 08:40:29 1994  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
+ 
+ 	* font-lock.el (font-lock-after-change-function): Undo Oct 18 change.
+ 
+ Sun Dec  4 12:52:32 1994  Richard Stallman  <rms@kepa>
+ 
+ 	* fill.el (fill-region-as-paragraph): If region starts in mid-line,
+ 	don't fill the text before that, but count it for indentation.
+ 	(fill-region): If region starts in mid-line, keep whole line
+ 	in the region, but pass the region start to fill-region-as-paragraph.
+ 
+ 	* faces.el (set-face-font): Pass `default' as face to x-resolve-font-name.
+ 	(x-resolve-font-name): Better error message when FACE doesn't specify
+ 	the font.
+ 
+ 	* faces.el: At compile time, discard any defsubr definitions
+ 	in the Emacs doing the compilation.
+ 
+ 	* bibtex.el (bibtex-mode-map): Delete binding for ".
+ 	Don't load in tex-insert-quote.
+ 
+ 	* faces.el (face-name, face-id, face-foreground, face-background)
+ 	(face-font, face-stipple, face-underline-p): Change defsubst to defun.
+ 	(set-face-font, set-face-foreground, set-face-background)
+ 	(set-face-stipple, set-face-underline-p): Change defsubst to defun.
+ 
+ 	* replace.el (replace-string, query-replace): Doc fixes.
+ 
+ Sat Dec  3 18:13:44 1994  Richard Stallman  <rms@kepa>
+ 
+ 	* rmail.el (rmail-get-new-mail): Position on first unseen message.
+ 	Return t if actually got new mail.
+ 	(rmail): Show rmail-first-unseen-message if got no new mail.
+ 
+ Thu Dec  1 21:07:06 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* rmailout.el (rmail-output): Don't quote "From " lines unless the
+ 	capitalization is exact.
+ 
+ Thu Dec  1 09:00:40 1994  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
+ 
+ 	* font-lock.el (font-lock-make-faces): Added font-lock-reference-face
+ 	defaults for grayscale.
+ 
+ Wed Nov 30 15:54:14 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* sendmail.el (sendmail-send-it): Add `From:' header.
+ 	(mail-from-style): New variable.
+ 
+ 	* gud.el (gud-basic-call): Detect error earlier.
+ 
+ 	* term/x-win.el (system-key-alist): Extra keys are F36 and F37.
+ 
+ 	* edebug.el (edebug-enter): Add save-excursion so that
+ 	buffer-local variables will reset properly.
+ 
+ Wed Nov 30 15:47:08 1994  Ake Stenhoff  <etxaksf@aom.ericsson.se>
+ 
+ 	* imenu.el (imenu-generic-expression): New variable.
+ 	(imenu-example--generic-c++-expression): New variable.
+ 	(imenu-example--generic-texinfo-expression): New variable.
+ 	(imenu-example--generic-latex-expression): New variable.
+ 	(imenu-example--create-c++-index): Deleted.
+ 	(imenu-example--function-name-regexp-c++): Deleted.
+ 	(imenu--generic-function): New function.
+ 	(imenu--generic-extract-name): New function.
+ 	(imenu-default-create-index-function): Added the generic
+ 	function calls for the provided examples.
+ 
+ Wed Nov 30 14:37:55 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* compile.el (compilation-next-error-locus): Parsed column numbers
+         are 1-origin.
+ 
+ Tue Nov 29 15:22:33 1994  Richard Stallman  <rms@bethel>
+ 
+ 	* complete.el (PC-do-completion): If complete but not unique,
+ 	the second time in a row, give a list of completions.
+ 	(PC-do-complete-and-exit, PC-do-completion): Use [...] in messages.
+ 
+ Tue Nov 29 10:59:07 1994  Ed Reingold  <reingold@albert.gnu.ai.mit.edu>
+ 
+         * cal-x.el: New file.
+ 
+         * calendar.el: Mention cal-x.el in comments.
+ 
+ Mon Nov 28 13:15:01 1994  Richard Stallman  <rms@bethel>
+ 
+ 	* simple.el (keyboard-escape-quit): Don't make keybinding yet.
+ 
+ 	* iso-cvt.el: Handle pilcrow, paragraph and pound signs.
+ 	Use \aa, \AA for a-with-ring.
+ 
+ 	* c-mode.el (calculate-c-indent): Handle a top-level decl with multiple
+ 	paren groups.
+ 
+ 	* paths.el (gnus-default-nntp-server): Doc fix.
+ 
+ 	* gnus.el: Many doc fixes.  Fix progress message formats.
+ 	(gnus-article-prev-digest): Rename arg to n.
+ 	(gnus-summary-next-digest, gnus-summary-prev-digest): Likewise.
+ 	(file-newer-than-file-p): Definition deleted.
+ 
+ Thu Nov 24 11:16:51 1994  Ake Stenhoff  <etxaksf@aom.ericsson.se>
+ 
+ 	* imenu.el (imenu): Widen temporary before scan the file.
+ 	Widen if the user asks to move to an object
+ 	that is outside the current accessible region.
+ 
+ Thu Nov 24 03:37:55 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* simple.el (beginning-of-buffer, end-of-buffer):
+ 	With argument, calculate fraction wrt accessible portion of buffer.
+ 
+ 	* replace.el (occur): Put number of matches in the header line.
+ 
+ Wed Nov 23 03:10:00 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* double.el (double-mode-name): Variable deleted.
+ 	(minor-mode-alist): Use a constant string to indicate Double mode.
+ 
+ 	* info.el (Info-follow-reference): Use regexp-quote.
+ 
+ 	* simple.el (keyboard-escape-quit): New command.  On ESC ESC ESC.
+ 
+ 	* replace.el (query-replace-map): Define \e and escape as exit-prefix.
+ 	(perform-replace): When exiting and rereading, set
+ 	this-command to mode-exit.
+ 
+ 	* map-ynp.el (map-y-or-n-p): Handle exit-prefix as definition of char.
+ 
+ 	* loaddefs.el (global-map): Add bindings for C-left and C-right.
+ 
+ Tue Nov 22 14:19:25 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* term/x-win.el (Calling menu-bar-enable-clipboard):
+ 	Be less selective matching Suns.
+ 
+ 	* lpr.el (lpr-page-header-switches): Use -f by default.
+ 	(lpr-headers-switches): Make it a list.
+ 
+ 	* simple.el (append-to-buffer): Don't use current buffer as default.
+ 
+ Tue Nov 22 06:44:09 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* vc.el (vc-checkout-switches): New variable.
+ 	(vc-backend-checkout): Use it.
+ 
+ Mon Nov 21 23:37:26 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* gud.el (gud-gdb-marker-filter, gud-irixdbx-marker-filter)
+ 	(gud-perldb-marker-filter, gud-mipsdbx-marker-filter):
+ 	No need for save-match-data.
+ 
+ 	* timer.el (timer-process-filter): No need for save-match-data.
+ 
+ 	* man.el (Man-bgproc-sentinel): No need for save-match-data.
+ 
+ Mon Nov 21 12:38:05 1994  Per Bothner  <bothner@kalessin.cygnus.com>
+ 
+ 	* term.el (term-termcap-format):  Add cd capability.  Fix ei.
+ 	(term-exec-1): Pass $TERMINFO instead of $TERMCAP if appropriate.
+ 	Pass emacs-version and term-version in $TERM.
+ 	Rewrite to set process-environment.
+ 
+ Sun Nov 20 15:08:10 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* compare-w.el (compare-windows): Push mark in both buffers at start.
+ 
+ 	* loaddefs.el (global-map): Change home and end bindings to
+ 	beginning/end-of-line.  Put beginning/end-of-buffer on C-home/end.
+ 
+ Sat Nov 19 02:51:24 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* term/x-win.el (x-option-alist): New variable now holds
+ 	list of short options.  Don't set command-switch-alist.
+ 	(x-long-option-alist): New variable.
+ 	(x-handle-args): Detect long options and convert to short.
+ 
+ 	* startup.el (command-line-1): Handle long options
+ 	--funcall, --load, --insert, --kill.
+ 	(command-line): Don't leave argval set if option not really a long one.
+ 
+ 	* gomoku.el (gomoku-click): New function.
+ 	(gomoku-mode-map): Put it on Mouse-2.
+ 
+ 	* subr.el (start-process-shell-command): Don't use `exec'--
+ 	run the command in a child process.
+ 
+ 	* find-dired.el (start-process-shell-command): Function deleted.
+ 
+ 	* simple.el (kill-region): Use = to compare positions.
+ 
+ Fri Nov 18 11:40:36 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* picture.el (picture-self-insert): Use last-command-event,
+ 	not last-input-char.
+ 	(picture-mode-map): Make the keymap vector 256 chars long.
+ 	Fix typo `newline-andindent'.
+ 
+ 	* bytecomp1.el: New file.
+ 	(batch-byte-compile-emacs): New function.
+ 
+ 	* sendmail.el (mail-setup): Make fill-column wide for the in-reply-to.
+ 
+ Fri Nov 18 02:45:24 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* simple.el (kill-region): Set this-command unconditionally.
+ 
+ Thu Nov 17 11:12:36 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* faces.el (face-color-supported-p): New function.
+ 	(face-try-color-list): Use that.
+ 
+ 	* timer.el (timer-process-filter): Use save-match-data.
+ 
+ 	* files.el (backup-buffer): Use file-ownership-preserved-p.
+ 
+ Wed Nov 16 10:18:32 1994  Michael Ernst  <mernst@research.microsoft.com>
+ 
+ 	* rmailsum.el (rmail-summary-scroll-msg-up): If at end of message,
+ 	advance to the next message.
+ 	(rmail-summary-scroll-msg-down): If at beginning of message,
+ 	advance to the previous message.
+ 
+ Wed Nov 16 09:26:05 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* timezone.el (timezone-parse-date): Handle two new formats (6 and 7).
+ 
+ 	* subr.el (substitute-key-definition): Don't recursively scan
+ 	where OLDMAP has a submap but KEYMAP does not.
+ 
+ 	* dired-aux.el (dired-collect-file-versions): Discard version #s from
+ 	arg; then do nothing if already in dired-file-version-alist.
+ 
+ Tue Nov 15 16:03:38 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* etags.el (tags-query-replace): Use query-replace-read-args in
+         interactive spec.
+ 
+ Tue Nov 15 11:50:31 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* isearch.el (isearch-unread): Always use unread-command-events.
+ 	(isearch-other-meta-char): In the case of a mouse event with a dummy
+ 	prefix, recombine the two into a single event before unreading.
+ 	(isearch-gnu-emacs-events): Variable deleted.
+ 	(isearch-update): Always test unread-command-events.
+ 	(isearch-event-data-type): Variable deleted.
+ 	(isearch-pre-command-hook-exists): Variable deleted.
+ 	(isearch-last-command-char): Only use last-command-char.
+ 	(isearch-other-meta-char): Delete debugging code.
+ 	(isearch-mode): Use baud-rate as variable.
+ 	(isearch-char-to-string): Simplify--assume character is an integer.
+ 
+ Tue Nov 15 11:16:57 1994  Ed Reingold  <reingold@albert.gnu.ai.mit.edu>
+ 
+ 	* calendar.el (calendar-mode-map): Undefine kill-region and
+ 	copy-region-as-kill.
+ 
+ 	* cal-menu.el (calendar-mode-map): Get rid of edit menu.
+ 
+ Tue Nov 15 09:07:58 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* mouse.el (mouse-save-then-kill): Call mouse-show-mark
+ 	when we adjust an existing region.
+ 
+ 	* lucid.el (set-keymap-parent): Fix bug in case of empty keymap.
+ 	(switch-to-other-buffer): Fix one-off error.
+ 
+ Mon Nov 14 23:16:44 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* thingatpt.el (line): Add a beginning-op function.
+ 
+ Mon Nov 14 21:38:14 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* etags.el (tags-table-including): Don't gratuitously cons (what
+ 	was I thinking?).  Properly skip t elements of
+ 	tags-table-computed-list.
+ 
+ Mon Nov 14 13:53:16 1994  Jim Blandy  <jimb@totoro.bio.indiana.edu>
+ 
+ 	* scheme.el (scheme-mode-variables): Set
+ 	parse-sexp-ignore-comments to t.
+ 
+ Mon Nov 14 03:03:55 1994  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
+ 
+ 	* font-lock.el (font-lock-defaults-alist): Defaults for scheme-mode.
+ 
+ Sun Nov 13 07:15:02 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* rmailout.el (rmail-fields-not-to-output): New variable.
+ 	(rmail-delete-unwanted-fields): New function.
+ 	(rmail-output, rmail-output-to-rmail-file): Call it.
+ 
+ 	* replace.el (query-replace-map): Bind Y and N like y and n.
+ 
+ 	* loadup.el: For windows-nt, load mouse.
+ 
+ 	* lpr.el (lpr-headers-switches): Base default on lpr-command value.
+ 
+ Fri Nov 11 08:33:25 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* comint.el (comint-exec-1): Terminate TERMCAP with colon.
+ 
+ 	* texinfmt.el (texinfo-format-node): Insert the node delimiter
+ 	that info is looking for unconditionally.
+ 
+ Thu Nov 10 18:01:30 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* compile.el (compile): With prefix arg, prompt even if (not
+         compilation-read-command).
+ 	(compilation-error-regexp-alist): Make first regexp match column
+ 	numbers too.  Remove regexp for "prog:file:line: error".  Replace
+ 	GNAT 1.82 regexp with "prog: file:line\(:col\)?: error".
+ 	(compilation-parse-errors): If spec has a column subexpr, but it
+ 	was optional and didn't match, ignore it.
+ 
+ Thu Nov 10 17:01:15 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* add-log.el (find-change-log): If change-log-default-name
+ 	has no dir component, search through parent dirs for it.
+ 
+ Wed Nov  9 15:17:41 1994  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* ange-ftp.el (ange-ftp-version): Var deleted.
+ 
+ 	* rect.el (string-rectangle): Don't set point.
+ 
+ 	* simple.el (copy-region-as-kill): Don't set this-command.
+ 
+ Wed Nov  9 07:57:35 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* vc-hooks.el: Only define items in vc-menu-map if it is boundp.
+ 
+ Wed Nov  9 07:46:23 1994  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* compile.el (compilation-error-regexp-alist):
+ 	Add an element for Irix 5.2 warnings.
+ 
+ Wed Nov  9 12:56:23 1994  Francesco Potorti`  (pot@cnuce.cnr.it)
+ 
+ 	* man.el (Man-berkeley-sed-script, Man-sysv-sed-script,
+ 	Man-cleanup-manpage, Man-fontify-manpage): Handle the "+\bo" form
+ 	(used by aix) in addition to the "o\b+" one (used by sun).
+ 
+ Wed Nov  9 00:32:23 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* vi.el (vi-kill-region): Pass args to kill-region.
+ 	(vi-mark-region): Don't pass unexpected args.
+ 
+ 	* apropos.el (apropos-print-matches): Set help-mode in *Help* buffer.
+ 	* calendar.el (describe-calendar-mode): Likewise.
+ 	* case-table.el (describe-buffer-case-table): Likewise.
+ 	* debug.el (debugger-list-functions): Likewise.
+ 	* disp-table.el (describe-display-table): Likewise.
+ 	* emerge.el (emerge-file-names): Likewise.
+ 	[commented out] (describe-mode): Likewise.
+ 	* help-macro.el (make-help-screen): Likewise.
+ 	* help.el (describe-key, describe-mode, view-lossage): Likewise.
+ 	(describe-function, describe-variable): Likewise.
+ 	* helper.el (Helper-describe-mode): Likewise.
+ 	* info.el (Info-summary): Likewise.
+ 	* macros.el (kbd-macro-query): Likewise.
+ 	* map-ynp.el (map-y-or-n-p): Likewise.
+ 	* novice.el (disabled-command-hook): Likewise.
+ 	* refbib.el (r2b-help): Likewise.
+ 	* replace.el (perform-replace): Likewise.
+ 	* simple.el (set-variable): Likewise.
+ 	* supercite.el (sc-set-variable): Likewise.
+ 	* upd-copyr.el (update-copyright): Likewise.
+ 	* userlock.el (ask-user-about-lock-help): Likewise.
+ 	(ask-user-about-supersession-help): Likewise.
+ 	* vi.el (vi-switch-mode, vi-ex-cmd): Likewise.
+ 	* yow.el (yow): Likewise.
+ 
+ Tue Nov  8 11:23:46 1994  Ed Reingold  <reingold@albert.gnu.ai.mit.edu>
+ 
+ 	* calendar.el (diary-entry-marker, calendar-today-marker,
+ 	calendar-holiday-marker): Don't supersede attributes for faces
+ 	`diary-face', `calendar-display-face', or `holiday-face' if they
+ 	are already defined.
+ 
+ Tue Nov  8 00:00:10 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* help.el (help-mode): New function.
+ 	(help-mode-map): Local keymap for help-mode.  Empty for now.
+ 	(print-help-return-message): Fix misspelled var.
+ 
+ Mon Nov  7 11:39:27 1994  Ed Reingold  <reingold@albert.gnu.ai.mit.edu>
+ 
+         * solar.el (solar-sunrise-sunset): Check for nil time before
+ 	trying to adjust it for dst.
+ 
+ Mon Nov  7 12:28:15 1994  Francesco Potorti`  (pot@cnuce.cnr.it)
+ 
+ 	* man.el (Man-reuse-okay-flag): Deleted.
+ 	(man, Man-getpage-in-background): Second arg deleted.
+ 	References to Man-reuse-okay-flag deleted.
+ 	(Man-follow-manual-reference): First arg deleted.  Call
+ 	Man-getpage-in-background with one argument only.
+ 
+ Fri Nov  4 21:13:09 1994  Ethan Bradford  <ethanb@u.washington.edu>
+ 
+ 	* gnus.el (gnus-configure-windows): Make split-window-keep-point
+ 	locally t so that focus doesn't occasionally move to the wrong
+ 	window on split-window-vertically.
+ 
+ Thu Nov  3 16:22:47 1994  Geoff Voelker  <voelker@cs.washington.edu>
+ 
+ 	* subr.el (start-process-shell-command): Don't use exec on windows-nt.
+ 
+ Thu Nov  3 15:34:33 1994  Ralf Fassel  <ralf@prl.philips.nl>
+ 
+ 	* tar-mode.el (tar-extract): Set default-directory to that of the
+ 	superior buffer, not the pseudo-dir formed from the archive name.
+ 
+ Thu Nov  3 15:29:12 1994  Rick Sladkey  <jrs@world.std.com>
+ 
+ 	* gud.el (gud-gdb-complete-command): Add a trailing single
+ 	quote to partially quoted unique completions.
+ 
+ Thu Nov  3 10:31:08 1994  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
+ 
+ 	* font-lock.el (font-lock-fontify-region): Wrap string-match with
+ 	save-match-data.
+ 
+ Tue Nov  1 04:53:54 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* comint.el (comint-exec-1): Make sure default-directory is a real dir.
+ 
+ 	* bytecomp.el (byte-compile-insert-header): Escape backslashes
+ 	in FILENAME when putting it inside a string constant.
+ 
+ Mon Oct 31 13:47:05 1994  voelker  <voelker@cs.washington.edu>
+ 
+ 	* makefile.nt: New file.
+ 
+ 	* winnt.el: New file.
+ 
+ 	* bytecomp.el (byte-compile-file): Treat windows-nt like ms-dos.
+ 
+ 	* hexl.el (hexl-find-file): Treat windows-nt like ms-dos.
+ 
+ 	* simple.el (shell-command-switch): New variable.
+ 	(shell-command, shell-command-on-region): Use new variable.
+ 
+ 	* info.el (Info-directory-list): Treat windows-nt like ms-dos.
+ 
+ 	* startup.el (command-line): Use ~/_emacs as init file in windows-nt.
+ 
+ 	* loadup.el: On windows-nt, load ls-lisp and winnt.
+ 	Treat windows-nt like ms-dos for DOC file name.
+ 
+ 	* loaddefs.el (completion-ignored-extensions):
+ 	Treat windows-nt like ms-dos.
+ 
+ 	* files.el (abbreviate-file-name):
+ 	Handle drive letters on windows-nt as on ms-dos.
+ 
+ 	* desktop.el (desktop-basefilename): Use emacs.dsk on windows-nt.
+ 
+ 	* bookmark.el (bookmark-file): Use ~/emacs.bmk on windows-nt.
+ 
+ 	* add-log.el (change-log-name): Use changlo on windows-nt.
+ 
+ Mon Oct 31 23:38:21 1994  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* bytecomp.el (byte-compile-file): Check for windows-nt like ms-dos.
+ 
+ Mon Oct 31 21:19:19 1994  Ed Reingold  <reingold@albert.gnu.ai.mit.edu>
+ 
+ 	* diary-lib.el (view-diary-entries): Fix error message.
+ 	(view-other-diary-entries): New function.
+ 
+ 	* calendar.el (calendar-mode-map): Bind it to key.
+ 
+ 	* cal-menu.el (calendar-mouse-view-other-diary-entries): New function.
+ 	(calendar-mode-map): Put them on mouse.
+ 
+ Mon Oct 31 20:28:49 1994  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* comint.el (comint-read-noecho): Use `read-char-exclusive'
+ 	instead of `read-char'.
+ 
+ Sun Oct 30 04:11:05 1994  Erik Naggum  <erik@naggum.no>
+ 
+ 	* simple.el (blink-matching-delay): New variable.
+ 
+ 	* isearch.el (isearch-edit-string, isearch-toggle-case-fold):
+ 	Pass isearch-nonincremental to isearch-message-prefix.
+ 
+ 	* cl.el (cl-macroexpand): Copy documentation from `macroexpand'.
+ 
+ 	* timezone.el (timezone-world-timezones): Add "UT" -> +000.
+ 
+ Sun Oct 30 16:06:47 1994  Ed Reingold  <reingold@albert.gnu.ai.mit.edu>
+ 
+         * calendar.el (calendar-mode): Delete to window configuration var.
+ 
+ Sun Oct 30 01:38:26 1994  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* texinfmt.el (texinfo-format-scan): Make @- vanish; don't insert -.
+ 	(texinfo-format-soft-hyphen): New function.
+ 	(texinfo-alias-list): New variable.
+ 	(texinfo-format-region, texinfo-format-buffer-1):
+ 	Clear texinfo-alias-list.
+ 	(texinfo-format-scan): Implement @alias expansion.
+ 
+ 	* loadup.el: Load facemenu if have X.
+ 	After dumping, print number of pure bytes used.
+ 
+ 	* mouse.el: Put mouse-set-font on C-down-mouse-1.
+ 	Don't bind C-down-mouse-2.
+ 	* facemenu.el: Doc fixes.
+ 	(facemenu-update): Use C-down-mouse-2 for the menu.
+ 
+ 	* simple.el (line-move): Use sign of arg to choose error condition.
+ 
+ Sat Oct 29 20:26:50 1994  Ed Reingold  <reingold@albert.gnu.ai.mit.edu>
+ 
+ 	* calendar.el (calendar, calendar-other-month): Fix use of
+         calendar-read-date.
+ 	(calendar-read-date): Fix noday option.
+ 
+ 	* lunar.el (phases-of-moon): Fix use of calendar-read-date.
+ 
+ Sat Oct 29 18:58:41 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* simple.el (blink-matching-open): Do blink if an even number of
+ 	quoting characters precede the close.
+ 
+ Sat Oct 29 07:13:35 1994  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* gud.el (gud-common-init): If file arg has no directory,
+ 	let the debugger search PATH, and don't set default-directory.
+ 
+ Fri Oct 28 19:54:06 1994  Tom Tromey  <tromey@drip.colorado.edu>
+ 
+ 	* makefile.el: Changed almost every doc string.
+ 	(makefile-macroassign-regex): Don't include space and tab in macro
+ 	names.
+ 
+ 	* makefile.el (makefile-backslash-column): New variable.
+ 	(makefile-backslash-region): New function.
+ 	(makefile-backslashify-current-line): New function.
+ 	(makefile-mode-map): Bind C-c C-\ to makefile-backslash-region.
+ 
+ 	* makefile.el (makefile-tab-face): New variable.
+ 	(makefile-font-lock-keywords): Use makefile-tab-face.
+ 	(makefile-font-lock-keywords): Use defvar, not defconst.
+ 
+ Fri Oct 28 10:55:19 1994  Ulrich Mueller  <ulm@vsnhd1.cern.ch>
+ 
+ 	* iso-acc.el (iso-accents-mode): Variable renamed from
+ 	iso-accents-minor-mode.
+ 
+ Fri Oct 28 01:21:18 1994  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* cal-menu.el (calendar-mode-map):
+ 	Define c-down-mouse-3 like down-mouse-3.
+ 
+ Fri Oct 28 22:49:51 1994  Per Abrahamsen  <abraham@iesd.auc.dk>
+ 
+ 	* easymenu.el (easy-menu-define): Call `easy-menu-do-define' to do
+ 	the real work.  Document XEmacs keyword arguments.
+ 	(easy-menu-do-define): New function.
+ 	(easy-menu-create-keymaps): Support XEmacs keyword arguments in
+ 	menu definition.
+ 
+ Thu Oct 27 18:33:52 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* files.el (find-file-noselect): Call set-buffer-major-mode here.
+ 
+ Thu Oct 27 18:42:23 1994  Francesco Potorti`  (pot@cnuce.cnr.it)
+ 
+ 	* man.el (Man-fontify-manpage-flag): defvar put at outer level.
+ 	(manual-program, Man-untabify-command, Man-untabify-command-args,
+ 	Man-sed-command, Man-awk-command, Man-mode-line-format,
+ 	Man-mode-map, Man-mode-hook, Man-cooked-hook, Man-name-regexp,
+ 	Man-section-regexp, Man-page-header-regexp, Man-heading-regexp,
+ 	Man-see-also-regexp, Man-first-heading-regexp,
+ 	Man-reference-regexp, Man-switches, Man-specified-section-option):
+ 	Make them normal defvars, no more user options.
+ 	(Man-overstrike-face, Man-undeline-face): New user options.
+ 	(Man-init-defvars): Man-fontify-manpage-flag removed from here.
+ 	(man-fontify-manpage): Use the new user options above.
+ 
+ Thu Oct 27 14:27:12 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* tar-mode.el (tar-summarize-buffer): Improperly terminated
+ 	archive now produces only a warning.
+ 
+ Wed Oct 26 16:07:09 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* flow-ctrl.el (enable-flow-control): Make message depend on
+ 	customization variables.
+ 
+ Wed Oct 26 13:57:13 1994  Michael Ernst  <mernst@research.microsoft.com>
+ 
+ 	* ispell.el (ispell-message-text-end): Match Postcript 3 like 2.
+ 
+ Wed Oct 26 11:27:01 1994  Ed Reingold  <reingold@albert.gnu.ai.mit.edu>
+ 
+ 	* cal-menu.el (calendar-mouse-insert-diary-entry): New function.
+ 	(calendar-mouse-2-date-menu): Put it on menu.
+ 
+ 	* diary-lib.el (diary-entry-time): Fix regexps to include TAB.
+ 	(diary-ordinal-suffix): Fix indentation of code.
+ 
+ 	* calendar.el (calendar-offset, lunar-phases-buffer): New vars.
+ 	Change defmacros to defsubst for readability, where possible.
+ 	(calendar-read-date): Rewritten with optional parameter.
+ 	(calendar): Delete mention of window configuration; use new form
+ 	of calendar-read-date and calendar-offset.
+ 	(describe-calendar-mode): Rewritten to link to info.
+ 	(calendar-mode-line-format): Refer to info, not help.
+ 	(calendar-mode): Just give keymap.
+ 	(calendar-goto-info-node, calendar-window-list,
+ 	calendar-buffer-list, calendar-hide-window): New functions.
+ 	(calendar-mode-map): Put calendar-goto-info-node on key.
+ 	(exit-calendar, calendar-current-date): Rewritten.
+ 	(calendar-cursor-to-date): Fix doc string.
+ 	(calendar-other-month): Use new form of calendar-read-date.
+ 
+ 	* holidays.el (check-calendar-holidays): Use new form of
+ 	calendar-read-date.
+ 
+ 	* lunar.el (calendar-phases-of-moon): Use new var lunar-phases-buffer.
+ 	(phases-of-moon): Use new form of calendar-read-date.
+ 
+ 	* solar.el: Fix doc at start of file and error message when
+ 	floating point is not available.
+ 	(calendar-latitude, calendar-longitude, calendar-location): Include
+ 	vector form; suggest setting values in site-local.el.
+ 	(solar-sin-degrees, solar-cosine-degrees): Change to macros.
+ 	(solar-degrees-to-hours, solar-hours-to-days):  Change to defsubst.
+ 	(solar-sunrise, solar-sunset): Allow use of vector forms of
+ 	latitude/longitude.
+ 	(calendar-latitude, calendar-longitude): New macros to allow use
+ 	of vector forms.
+ 
+ Wed Oct 26 05:32:50 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* dired-x.el (dired-find-subdir): Doc fix.
+ 
+ Tue Oct 25 21:38:59 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* tar-mode.el (tar-summarize-buffer): Check for end of buffer
+ 	before extracting substring.
+ 
+ Tue Oct 25 16:28:42 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* diff.el (diff-command): New variable.
+ 	(diff): Use it.
+ 
+ 	* frame.el (frame-initialize): Set special-display-function here,
+ 	not at top level.
+ 
+ 	* gud.el (gud-irixdbx-marker-filter): Cast $curline to int.
+ 
+ Tue Oct 25 09:51:53 1994  Boris Goldowsky  <boris@cs.rochester.edu>
+ 
+ 	* enriched.el (enriched-mode): Add autoload cookie.
+ 	(enriched-decode-foreground, enriched-decode-background): Create
+ 	faces even if no window system, to prevent multiple warnings.
+ 
+ Tue Oct 25 00:46:40 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* ispell.el (ispell-grep-command, ispell-look-command):
+ 	Don't specify directory.
+ 
+ 	* files.el (buffer-file-truename): Doc fix.
+ 
+ Mon Oct 24 19:29:11 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* term/x-win.el: Make previous change conditional.
+ 
+ Mon Oct 24 16:32:23 1994  Francesco Potorti`  (pot@cnuce.cnr.it)
+ 
+ 	* man.el (Man-init-defvars): Do not delete empty lines.
+ 
+ Mon Oct 24 09:55:43 1994  Boris Goldowsky  <boris@mole.gnu.ai.mit.edu>
+ 
+ 	* enriched.el: New file.
+ 
+ Mon Oct 24 13:31:57 1994  Francesco Potorti`  (pot@cnuce.cnr.it)
+ 
+ 	* man.el (Man-cleanup-manpage): do all the work if called
+ 	interactively.
+ 
+ Sun Oct 23 18:56:40 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* dired.el (dired-mode-map): Add query-replace and search items to
+         operate menu.
+ 
+ Sun Oct 23 01:01:41 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* tex-mode.el (latex-mode): Recognize \item etc. that have no arg
+ 	because only a comment follows.
+ 
+ 	* fill.el (fill-individual-paragraphs): Avoid infinite loop
+ 	if mailp is set and no message was yanked.
+ 
+ 	* term/x-win.el: Say error in x-open-connection should be fatal.
+ 
+ 	* menu-bar.el (menu-bar-file-menu): Add item `Make Frame On Display'.
+ 
+ 	* menu-bar.el (menu-bar-update-buffers-maxbuf): Declare variable.
+ 	(menu-bar-update-buffers-1, menu-bar-update-buffers):
+ 	Rename local var maxbuf to menu-bar-update-buffers-maxbuf.
+ 
+ 	* frame.el (make-frame-on-display): New function.
+ 
+ 	* faces.el (set-face-background): Set either stipple or color,
+ 	never both.  Do this only for a specific frame, not for t.
+ 
+ 	* sendmail.el (mail-setup): Fill in-reply-to field properly.
+ 
+ Sat Oct 22 20:52:19 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* faces.el (set-face-background): If color is gray, and frame
+ 	can't display that directly, use corresponding stipple.
+ 	(face-try-color-list): Assume gray colors are valid on any display.
+ 
+ Sat Oct 22 11:59:08 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* dired-aux.el (dired-do-tags-search,
+         dired-do-tags-query-replace): New functions.
+ 	* dired.el (dired-mode-map): Bind A to dired-do-tags-search, Q to
+ 	dired-do-tags-query-replace.
+ 
+ Sat Oct 22 11:35:54 1994  Ethan Bradford  <ethanb@u.washington.edu>
+ 
+ 	* ange-ftp.el (ange-ftp-process-handle-line): Check for a
+ 	multi-line message before an error message.  Fixes problem of
+ 	thinking there is an error in narrative text.
+ 
+ Fri Oct 21 03:15:37 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* sendmail.el (sendmail-synch-aliases): Check MAILRC envvar.
+ 	(mail-aliases, mail-archive-file-name): Doc fixes.
+ 
+ 	* mailalias.el (define-mail-alias): Check MAILRC envvar.
+ 
+ 	* view.el (view-file): Do record the buffer switch.
+ 
+ 	* help.el (describe-function): Mention the file it was loaded from.
+ 	(describe-function-find-file): New function.
+ 	(describe-function): Use that.
+ 
+ 	* gud.el (dbx): Delete call to gud-switch-to-buffer.
+ 	(gud-sdb-marker-filter): Handle SVR4 clumped lines.
+ 
+ 	* emerge.el (emerge-auto-advance): Fix criterion for which message.
+ 
+ Thu Oct 20 14:48:22 1994  Noah Friedman  <friedman@prep.ai.mit.edu>
+ 
+         * timer.el (timer-error, timer-abnormal-termination,
+         timer-filter-error): New error conditions.
+         (timer-process-filter, timer-process-sentinel): Signal an error,
+         don't just print a message.
+ 
+ Thu Oct 20 20:03:33 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* rmail.el (rmail-get-new-mail): If display-time is in use,
+ 	call display-time-filter to update the Mail indicator.
+ 
+ 	* startup.el (command-line): Set x-cut-buffer-max here.
+ 	* term/x-win.el: Not here.
+ 
+ Thu Oct 20 17:17:53 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* etags.el (next-file): Initialize next-file-list all at once from
+ 	all tables.  Never call visit-tags-table-buffer when INITIALIZE is
+ 	not t.
+ 
+ Thu Oct 20 16:02:12 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* ange-ftp.el (ange-ftp-get-passwd): Use user-mail-address.
+ 	(ange-ftp-generate-anonymous-password): Doc fix.
+ 
+ Thu Oct 20 15:47:05 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* simple.el (edit-and-eval-command): Elements of command-history
+ 	are forms, not strings.
+ 
+ 	* chistory.el (repeat-matching-complex-command): Fix check for
+ 	empty pattern.  Simplify.
+ 	(default-command-history-filter-garbage): Fix doc string.
+ 	(list-command-history-filter, list-command-history-max): Likewise.
+ 
+ Wed Oct 19 18:03:40 1994  Noah Friedman  <friedman@prep.ai.mit.edu>
+ 
+         * timer.el (timer-program): Make defvar, not defconst.
+         Expand name of timer program in exec-directory here.
+         (run-at-time): Not here.
+ 
+ Wed Oct 19 08:46:03 1994  Boris Goldowsky  <boris@cs.rochester.edu>
+ 
+ 	* facemenu.el (facemenu-face-menu, facemenu-foreground-menu,
+ 	facemenu-background-menu, facemenu-special-menu): New or renamed
+ 	variables for submenus.
+ 	* facemenu.el (facemenu-color-alist): Renamed from facemenu-colors.
+ 	* facemenu.el (facemenu-add-new-face): New function.
+ 	* facemenu.el (facemenu-update): Don't redo top-level menu;
+ 	nothing should change.  Move menu setup to defvars.  Use
+ 	facemenu-add-new-face. Changed global binding to C-down-mouse-3.
+ 	* facemenu.el (facemenu-menu): "Update" item removed; should
+ 	no longer be needed interactively.
+ 	* facemenu.el (facemenu-complete-face-list): Just return faces,
+ 	not keybindings.
+ 
+ Mon Oct 17 09:46:09 1994  Boris Goldowsky  <boris@cs.rochester.edu>
+ 
+ 	* faces.el (make-face): Add new face to Face menu on creation.
+ 
+ 	* facemenu.el (facemenu-get-face): Don't add to menu here.
+ 
+ Fri Oct 14 18:46:28 1994  Francesco Potorti`  (pot@cnuce.cnr.it)
+ 
+ 	* man.el (Man-init-defvars): Corrections to Man-filter-list.
+ 	(Man-fontify-manpage): Added cleaning of ksh manpage daggers.
+ 	(Man-fontify-manpage): Added cleaning of ksh manpage daggers.
+ 	(Man-bgproc-sentinel): Unconditionally call Man-cleanup-manpage.
+ 
+ Tue Oct 18 00:59:33 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* term.el (term-exec-1): Put `sane' last in stty cmd.
+ 	Redirect stderr to /dev/null.
+ 
+ 	* files.el (auto-mode-alist): Doc fix.
+ 
+ 	* font-lock.el (font-lock-after-change-function): If inside a comment,
+ 	don't scan for keywords.
+ 
+ 	* cmuscheme.el (run-scheme): Add autoload cookie.
+ 	(scheme): Function deleted.
+ 
+ 	* xscheme.el (run-scheme): Delete autoload cookie.
+ 
+ 	* easymenu.el (easy-menu-create-keymaps): Add autoload cookie.
+ 
+ Mon Oct 17 22:38:13 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* nntp.el (nntp-open-server): Send MODE READER command to server.
+ 
+ 	* time.el (display-time-filter): Ignore mail-spool-file if not string.
+ 
+ Mon Oct 17 15:36:03 1994  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+ 
+ 	* info.el (info-insert-file-contents): Always check for
+ 	conflict with jka-compr.
+ 	(Info-find-node): Don't search on Info-directory-list if the
+ 	file name is absolute.
+ 
+ 	* etags.el (etags-tags-table-files, etags-tags-included-tables):
+ 	Search backwards for the comma in case the file name contains one.
+ 
+ Mon Oct 17 08:15:45 1994  Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
+ 
+         * paths.el (rmail-spool-directory): Add a condition to test
+ 	the Bull DPX/2.
+ 
+ Mon Oct 17 04:05:11 1994  Morten Welinder  <terra@mole.gnu.ai.mit.edu>
+ 
+ 	* dos-fns.el (window-frame, raise-frame, select-frame): Clean stubs.
+ 	* faces.el (face-initialize): Fill in the faces for non-X frames also.
+ 	* info.el (Info-mode): Also use fonts for `pc' window system.
+ 	* loadup.el ((eq system-type 'ms-dos)): Rearrange what to load.
+ 	((eq system-type 'ms-dos)): Under X, let the documentation be
+ 	stored in DOC-X.
+ 	* mouse.el (mouse-set-region) [MSDOS]: Give pc-frames the same
+ 	treatment as X-frames.
+ 	* term/pc-win.el: New file.
+ 
+ Sun Oct 16 07:15:34 1994  Morten Welinder  <terra@mole.gnu.ai.mit.edu>
+ 
+ 	* emerge.el (emerge-temp-file-prefix): Try TEMP and TMP as
+ 	alternatives for TMPDIR.
+ 
+ Sun Oct 16 02:16:38 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* faces.el (set-face-stipple): New function.
+ 	(set-face-background-pixmap): An alias for that.
+ 	(face-stipple): New function.
+ 	(face-background-pixmap): An alias for that.
+ 	(copy-face, face-equal, face-differs-from-default-p)
+ 	(make-face-x-resource-internal): Handle stipple bitmaps.
+ 
+ 	* simple.el (count-lines): Do save-match-data only when necessary.
+ 
+ 	* loadup.el: Delete code to write subdirs.el.
+ 
+ Sat Oct 15 04:32:58 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* rmailsum.el (rmail-summary-delete-forward): Don't move fwd to eob.
+ 
+ 	* gnus.el (gnus-group-group-name): Get rid of text properties.
+ 
+ 	* cmuscheme.el (run-scheme): Set scheme-program-name.
+ 
+ Fri Oct 14 00:49:12 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* sendmail.el (mail-setup): Fill the in-reply-to field.
+ 
+ 	* subr.el (add-to-list): Doc fix.
+ 
+ 	* rnewspost.el (news-reply-mode-map): Add C-c C-t binding.
+ 
+ 	* delsel.el (self-insert-iso): Add delete-selection property.
+ 
+ 	* font-lock.el (font-lock-fontify-region): Discard leading spaces
+ 	from comment-end.
+ 
+ 	* sendmail.el (mail-do-fcc): If file does not exist,
+ 	assume it is not a Babyl file.
+ 
+ Thu Oct 13 23:26:39 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* etags.el (tags-reset-tags-tables): New function.
+ 
+ Thu Oct 13 19:29:35 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* lmenu.el (make-lucid-menu-keymap): Allow Lucid-style keyword-based
+ 	menu items.
+ 	(popup-menu): Update documentation string to describe the new syntax.
+ 
+ Thu Oct 13 14:33:51 1994  Morten Welinder  <terra@diku.dk>
+ 
+ 	* desktop.el (desktop-internal-v2s): Remove all text properties
+ 	from strings.
+ 
+ Thu Oct 13 14:56:05 1994  Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
+ 
+ 	* hilit19.el (hilit-set-mode-patterns - lisp-mode): Fix regexp
+ 	for 'defconstant' that leads to an infinite loop.
+ 	Hilight the 'list' keyword.
+ 
+ Thu Oct 13 04:35:24 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* sendmail.el (mail-file-babyl-p): New function.
+ 	(mail-do-fcc): If file is a Babyl file, write output in Babyl format.
+ 
+ 	* loadup.el (Evaluating top-level): Don't load loadup.el again.
+ 
+ Thu Oct 13 03:55:51 1994  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
+ 
+ 	* font-lock.el: Use purify-flag rather than noninteractive.
+ 
+ Thu Oct 13 02:15:40 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* loadup.el: Move the subdirs.el up to near first thing.
+ 
+ 	* compile.el (compilation-filter): Do nothing if buffer is dead.
+ 
+ 	* gud.el (gud-filter): Don't bind inhibit-quit.
+ 	Do nothing if buffer is dead.
+ 
+ 	* texinfmt.el (texinfo-no-refill-regexp): Recognize @ifhtml, @html.
+ 	(texinfo-format-ifhtml, texinfo-format-html): New functions.
+ 	(texinfo-format-enddots): New function.
+ 
+ Wed Oct 12 19:16:15 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* simple.el (shell-command, shell-command-on-region):
+ 	Rename arg FLAG to OUTPUT-BUFFER and allow it to be a buffer.
+ 
+ 	* ada.el (ada-mode):
+ 	Rename end-comment-column to ada-comment-end-column.
+ 	(ada-inline-comment): Likewise.
+ 	(ada-comment-end-column): Declare variable.
+ 
+ 	* appt.el (appt-select-lowest-window): Locally bind lowest-window.
+ 	(appt-delete): Don't set tmp-appt-msg-list.
+ 
+ 	* add-log.el (change-log-mode-map): Move the definition up.
+ 
+ 	* menu-bar.el (menu-bar-update-buffers-1): New subroutine
+ 	broken out of menu-bar-update-buffers.
+ 	Truncate the file name and discard the nondirectory part.
+ 	(menu-bar-update-buffers): Discard middle of long buffer names.
+ 
+ 	* subr.el (add-to-list): New function.
+ 
+ Wed Oct 12 16:49:34 1994  Boris Goldowsky  <boris@cs.rochester.edu>
+ 
+ 	* facemenu.el (facemenu-read-color, facemenu-colors): New fn, var.
+ 	(facemenu-set-face, facemenu-set-face-from-menu,
+ 	facemenu-after-change):	Face property can take a list value; add
+ 	to it rather than completely replacing the property.
+ 	(facemenu-add-face, facemenu-discard-redundant-faces): New functions.
+ 
+ 	* facemenu.el (facemenu-set-foreground, facemenu-set-background)
+ 	(facemenu-get-face, facemenu-foreground, facemenu-background): New
+ 	functions and variables.  Faces with names of the form fg:color
+ 	and bg:color are now treated specially.
+ 	(facemenu-update): Updated for above.
+ 
+ Wed Oct 12 16:03:14 1994  Jonathan I. Kamens  (jik@gza-client1.cam.ov.com)
+ 
+ 	* jka-compr.el (jka-compr-mode-compression-info-list): Add .tgz
+ 	extension.
+ 	(jka-compr-mode-alist-additions): New variable.
+ 	(jka-compr-install): Append jka...additions to auto-mode-alist.
+ 	(jka-compr-uninstall): Remove jka-...-additions from auto-mode-alist.
+ 
+ Wed Oct 12 14:36:13 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* rmailsum.el (rmail-summary-previous-all)
+ 	(rmail-summary-next-all): Don't move forward to the end of the buffer.
+ 
+ Wed Oct 12 05:24:00 1994  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
+ 
+ 	* ada.el (ada-mode-syntax-table): Made `-' and `\n' be comments.
+ 	(ada-font-lock-keywords-1, ada-font-lock-keywords-2,
+ 	ada-font-lock-keywords): New variables.
+ 	(ada-mode): Set font-lock-defaults.
+ 
+ 	* add-log.el (change-log-mode): Set font-lock-defaults.
+ 
+ 	* asm-mode.el (asm-mode): Set font-lock-defaults.
+ 
+ 	* compile.el (compilation-mode): Set font-lock-defaults.
+ 
+ 	* dired.el (dired-mode): Set font-lock-defaults.
+ 
+ 	* fortran.el (fortran-mode-syntax-table): Made `!' be a comment.
+ 	(fortran-font-lock-keywords-1, fortran-font-lock-keywords-2,
+ 	fortran-font-lock-keywords): New variables.
+ 	(fortran-mode): Set font-lock-defaults.
+ 
+ 	* makefile.el (makefile-mode-syntax-table): Made `'' and ``' be
+ 	strings, and `#' be a comment.
+ 	(makefile-font-lock-keywords): Add variable reference regexp.
+ 	(makefile-mode): Set font-lock-defaults.
+ 
+ 	* outline.el (outline-mode): Set font-lock-defaults.
+ 
+ 	* pascal.el  (pascal-mode): Set font-lock-defaults.
+ 
+ 	* perl-mode.el (perl-mode): Set font-lock-defaults.
+ 
+ 	* rmail.el (rmail-variables): Set font-lock-defaults.
+ 
+ 	* rmailsum.el (rmail-summary-mode): Set font-lock-defaults.
+ 
+ 	* sendmail.el (mail-mode): Set font-lock-defaults.
+ 
+ 	* sh-script.el (sh-set-shell): Set font-lock-defaults.
+ 
+ 	* shell.el (shell-font-lock-keywords): Add `\n' to [^] regexps.
+ 	(shell-mode): Set font-lock-defaults.
+ 
+ 	* texinfo.el (texinfo-mode): Set font-lock-defaults.
+ 
+ 	* font-lock.el: To make font-lock.el dumpable.
+ 	(font-lock-display-type, font-lock-background-mode)
+ 	(font-lock-face-attributes): Default to nil.
+ 	(font-lock-make-faces): New function.  Set them.
+ 	(font-lock.el): Add to after-init-hook if noninteractive or use it.
+ 	(font-lock-maximum-size): New variable.
+ 	(font-lock-mode): Use it to fontify only if buffer is within it.
+ 	(font-lock-defaults, font-lock-defaults-alist): Item for syntax table.
+ 	(font-lock-set-defaults): Set font-lock-syntax-table too.
+ 	(lisp-font-lock-keywords-2): Fix CLisp end-of-keyword in regexp.
+ 	(c-font-lock-keywords-*): Specific to ANSI C.
+ 	(c++-font-lock-keywords-*): Specific to ANSI C++.
+ 
+ Wed Oct 12 03:22:43 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* mouse.el (mouse-major-mode-menu): Use minor-mode-map-alist
+ 	instead of overriding-local-map.  Display equiv keys using
+ 	mouse-major-mode-menu-compute-equiv-keys.
+ 	(mouse-major-mode-menu-compute-equiv-keys): New function.
+ 
+ 	* sendmail.el (mail-alias-modtime): Doc fix.
+ 
+ 	* appt.el (appt-delete-window): Avoid error if WINDOW is nil.
+ 
+ 	* c-mode.el (c-mode-map): Capitalize Mode in C Mode menu bar item.
+ 
+ Tue Oct 11 13:22:05 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* hilit19.el (calendar-mode): Delete the regexps for diary, hollidays.
+ 
+ 	* tex-mode.el (compare-windows-whitespace): Eliminate initial value.
+ 
+ 	* rmail.el (rmail-find-all-files): Fix several errors and make faster.
+ 	Always return a single-level list of file names.
+ 	(rmail-construct-io-menu): If FILES is null, turn off the menus.
+ 	(rmail-disable-menu): A phony "command", always disabled in menus.
+ 	(rmail-list-to-menu): Reverse the list L.
+ 
+ Tue Oct 11 19:04:50 1994  Tom Tromey  <tromey@drip.colorado.edu>
+ 
+ 	* makefile.el (makefile-mode-name): Removed.
+ 	(makefile-mode): Skip any number of "#"s at beginning of comments.
+ 	(makefile-electric-keys): New variable.
+ 	(makefile-electric-dot): Self insert if not at bol.
+ 	(makefile-electric-equal): Really self-insert if not at bol.
+ 	(makefile-pickup-everything): Prefix arg means force pickups to be
+ 	redone.
+ 	(makefile-insert-macro-ref): Don't use format.
+ 	(makefile-runtime-macros-list): Added "$" to list.
+ 	(makefile-insert-special-target): Don't use format.
+ 	(makefile-insert-macro): Don't use format.
+ 	(makefile-insert-target): Don't use format.
+ 	(makefile-insert-target-ref): Don't use format.
+ 	(makefile-electric-colon): Really self-insert if not at bol.
+ 	(makefile-complete): New function.  Bound to M-TAB.
+ 	(makefile-do-macro-insertion): New function.
+ 	(makefile-mode-map): Add menu bar bindings.
+ 	(makefile-font-lock-keywords): New constant.
+ 	(makefile-mode): Deal with font-lock, add-log, imenu.
+ 	(makefile-macroassign-regex): Changed for use with font-lock.
+ 	(makefile-dependency-regex): Changed for use with font-lock.
+ 	(makefile-add-log-defun): New function.
+ 	(makefile-menu-index-function): New function.
+ 
+ Tue Oct 11 08:56:04 1994  Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
+ 
+ 	* rmailsum.el (rmail-summary-resend): New function.
+ 	(rmail-summary-mode-map - resend): Call rmail-summary-resend
+ 	instead of rmail-resend.
+ 
+ Tue Oct 11 00:42:02 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* startup.el (normal-top-level-add-to-load-path): New function.
+ 	(normal-top-level): Load subdirs.el in each dir in load-path.
+ 
+ 	* loadup.el: Write the subdirs.el file.
+ 
+ 	* simple.el (blink-matching-open): Check there is a previous
+ 	nonblank line before trying to display it.
+ 	No need for backward-char before the skip-chars-backward.
+ 
+ 	* rmail.el (rmail-show-message): New argument no-summary.
+ 
+ 	* rmailsum.el (rmail-summary-rmail-update):
+ 	Pass new arg to rmail-show-message.
+ 
+ Mon Oct 10 00:47:36 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* iso-transl.el (initializing keymaps):
+ 	Define translations for mute-acute and the other mute- keys.
+ 
+ 	* term/x-win.el (system-key-alist): Add sun versions of
+ 	mute-grave, mute-diaeresis, mute-asciicircum.
+ 
+ 	* c-mode.el (c-mode-map): Use "C mode" for the menu bar item name.
+ 
+ 	* mouse-sel.el (mouse-select): Pass an arg to mouse-extend.
+ 
+ 	* mail-hist.el (mail-hist-put-headers-into-history)
+ 	(mail-hist-current-header-contents, mail-hist-forward-header)
+ 	(mail-hist-current-header-name):
+ 	Use regexp-quote on mail-header-separator.
+ 
+ 	* lisp-mode.el (calculate-lisp-indent): Local var
+ 	last-sexp renamed to calculate-lisp-indent-last-sexp.
+ 	(lisp-indent-function): Use new name of var.
+ 	(calculate-lisp-indent-last-sexp): Var defined.
+ 
+ 	* menu-bar.el (menu-bar-file-menu): Don't include the frame
+ 	commands in a non-frame version of Emacs.
+ 
+ 	* font-lock.el (font-lock-set-defaults):
+ 	Do nothing if font-lock-keywords already non-nil.
+ 	Use font-lock-defaults.
+ 	(font-lock-defaults): New variable.
+ 
+ Sun Oct  9 13:22:22 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* appt.el (appt-delete-window): Do nothing if the window
+ 	is the only one in its frame.
+ 
+ 	* calendar.el (calendar-holiday-marker):
+ 	Copy holiday-face from highlight face.
+ 
+ 	* ispell.el (ispell-highlight-spelling-error):
+ 	Have just one definition, which decides what to do.
+ 	(ispell-command-loop): New args START and END.  Do highlighting
+ 	and unhighlighting here.
+ 	(ispell-word, ispell-region, ispell-complete-word): Not here.
+ 	(ispell-highlight-spelling-error-generic): Bind buffer-undo-list to t.
+ 
+ 	* lisp-mode.el (emacs-lisp-mode-syntax-table):
+ 	Don't set syntax of formfeed.
+ 
+ 	* bytecomp.el (byte-compile-insert-header): Use user-mail-address.
+ 
+ Sat Oct  8 00:11:57 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* add-log.el (add-log-current-defun): In texinfo-mode,
+ 	handle the case of no commas after @node.
+ 
+ 	* tex-mode.el (tex-region): Don't delete temp files if we do
+ 	one buffer twice in a row.
+ 
+ 	* rmail.el (rmail-delete-forward): Use rmail-select-summary.
+ 
+ Fri Oct  7 05:52:06 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* mouse.el (mouse-major-mode-menu): New function, on C-mouse-3.
+ 	(mouse-major-mode-menu-1): New function
+ 	(mouse-set-font): Move it to C-mouse-2.
+ 
+ 	* font-lock.el (font-lock-defaults-alist): Delete most modes--all
+ 	those that now set font-lock-keywords themselves.
+ 	Re-delete code deleted in rms's Oct 5 change.
+ 
+ 	* pascal.el (pascal-mode): Set font-lock-keywords locally.
+ 
+ 	* perl-mode.el (perl-mode): Set font-lock-keywords locally.
+ 
+ 	* asm-mode.el (asm-mode): Set font-lock-keywords locally.
+ 
+ 	* texinfo.el (texinfo-mode): Set font-lock-keywords locally.
+ 
+ 	* shell.el (shell-mode): Set font-lock-keywords locally.
+ 
+ 	* dired.el (dired-mode): Set font-lock-keywords locally.
+ 
+ 	* sendmail.el (mail-mode): Set font-lock-keywords locally.
+ 
+ 	* rmail.el (rmail-variables): Set font-lock-keywords locally.
+ 
+ 	* rmailsum.el (rmail-summary-mode): Set font-lock-keywords locally.
+ 
+ 	* outline.el (outline-mode): Set font-lock-keywords locally.
+ 
+ 	* add-log.el (change-log-mode): Set font-lock-keywords locally.
+ 
+ 	* compile.el (compilation-mode): Use kill-all-local-variables.
+ 	Set font-lock-keywords locally.
+ 
+ Thu Oct  6 16:55:54 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* menu-bar.el (query-replace): Add missing quote.
+ 
+ Thu Oct  6 14:13:50 1994  Noah Friedman  <friedman@prep.ai.mit.edu>
+ 
+         * type-break.el: Do not call type-break-mode upon loading.
+         (type-break-time-sum): New function.
+         (type-break-schedule): Use it.  Make function interactive.
+         (type-break-guestimate-keystroke-threshold): Use `N' interactive
+         spec, not `n'.
+         (type-break-demo-boring): Show elapsed time of break, or number of
+         minutes left for good break.
+ 
+ Thu Oct  6 04:23:17 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* appt.el (appt-delete-window): Look on all frames for the window.
+ 	(appt-disp-window): If frame is unsplittable, use display-buffer.
+ 
+ Wed Oct  5 20:12:25 1994  Simon Marshall  <Simon.Marshall@mail.esrin.esa.it>
+ 
+ 	* comint.el (comint-check-proc): Recognise `open'.
+ 	(comint-exec): Use open-network-stream if command is a cons pair.
+ 
+ 	* font-lock.el (compilation-mode-font-lock-keywords,
+ 	rmail-summary-font-lock-keywords, dired-font-lock-keywords,
+ 	shell-font-lock-keywords, texi-font-lock-keywords,
+ 	perl-font-lock-keywords): Deleted.
+ 
+ 	* sh-script.el (sh-font-lock-keywords): Default to nil.
+ 
+ 	* compile.el (compilation-mode-font-lock-keywords): New variable.
+ 
+ 	* add-log.el (change-log-font-lock-keywords): New variable.
+ 
+ 	* outline.el (outline-font-lock-keywords): New variable.
+ 
+ 	* rmailsum.el (rmail-summary-font-lock-keywords): New variable.
+ 
+ 	* rmail.el (rmail-font-lock-keywords): New variable.
+ 
+ 	* sendmail.el (mail-font-lock-keywords): New variable.
+ 
+ 	* dired.el (dired-font-lock-keywords): New variable.
+ 
+ 	* shell.el (shell-font-lock-keywords): New variable.
+ 
+ 	* texinfo.el (texinfo-font-lock-keywords): New variable.
+ 
+ 	* asm-mode.el (asm-font-lock-keywords): New variable.
+ 
+ 	* perl-mode.el (perl-font-lock-keywords): New variable.
+ 
+ 	* pascal.el (pascal-font-lock-keywords):  New variable.
+ 	(pascal-mode): Set comment-start-skip and comment-end.
+ 
+ 	* font-lock.el: (font-lock-mode): Doc fix; use add/remove-hook, not
+ 	setq; removed make-local-variable of font-lock-no-comments.
+ 	(font-lock-set-defaults): Do it there, and use:
+ 	(font-lock-defaults-alist): Use it to set font-lock-keywords,
+ 	font-lock-keywords-case-fold-search and font-lock-no-comments.
+ 	(turn-on-font-lock): New function.
+ 	(font-lock-fontify-buffer): Made interruptible; deleted messages.
+ 
+ 	* font-lock.el: (font-lock-fontify-region): Made syntax state reliable
+ 	by widening within new restriction; let cstart and cend for speed;
+ 	outputs message.
+ 	(font-lock-after-change-function): Remove spurious goto-char and use
+ 	forward-line, not 1+ end-of-line, for end of fontification region.
+ 	(font-lock-any-properties-p): Removed, use text-property-not-all.
+ 
+ 	* font-lock.el (font-lock-*-face): facename values are themselves.
+ 	(font-lock-variable-name-face, font-lock-reference-face): New vars.
+ 	(font-lock-doc-string-face): Removed.
+ 	(font-lock-keywords): Extended value syntax.
+ 	(font-lock-hack-keywords): Cope with it; outputs initial message.
+ 
+ 	* font-lock.el: Merged in face-lock.el:
+ 	(font-lock-display-type, font-lock-background-mode)
+ 	(font-lock-face-attributes): New variables, use it.
+ 	(font-lock-make-face): New function, use them.
+ 
+ Wed Oct  5 11:30:10 1994  Francesco Potorti`  (pot@cnuce.cnr.it)
+ 
+ 	* man.el (Man-notify, Man-current-page, Man-page-list,
+ 	Man-filter-list, Man-original-frame, Man-arguments,
+ 	Man-fontify-manpage-flag, Man-sections-alist, Man-refpages-alist,
+ 	Man-uses-untabify-flag, Man-page-mode-string, Man-sed-script):
+ 	Added defvar's to keep the compiler quiet.
+ 	(Man-getpage-in-background): Start buffer name with "*Man ".
+ 	instead of "*man " to avoid conflict with "*mail*".
+ 	(Man-match-substring): Defsubst moved before first call.
+ 	(Man-build-page-list, Man-strip-page-headers, Man-unindent): Use
+ 	defun instead of defsubst, for code clarity purpose.
+ 
+ Wed Oct  5 02:29:01 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* font-lock.el: Delete the error when no window system.
+ 
+ 	* gnuspost.el (sendnews, postnews): Use defalias.
+ 
+ 	* startup.el (command-line): Load disp-table explicitly.
+ 
+ 	* add-log.el (add-log-current-defun): Handle Perl specially.
+ 
+ 	* env.el (read-envvar-name): Special meaning for MUSTMATCH
+ 	neither t nor nil.
+ 	(setenv): Use that new case, when clearing a var.
+ 
+ Tue Oct  4 18:57:17 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* texinfmt.el (texinfo-format-scan): Accept @^, @", @?, @!, @-.
+ 
+ 	* rmailsum.el (rmail-summary-goto-msg):
+ 	Get rmail-total-messages from the rmail buffer.
+ 
+ 	* simple.el (goto-line): Call prefix-numeric-value.
+ 
+ Mon Oct  3 18:57:36 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* files.el (set-auto-mode): Discard versions from file name before
+ 	testing inhibit-first-line-modes-regexps.
+ 
+ 	* rlogin.el (rlogin): Doc fix.
+ 
+ Sun Oct  2 22:45:57 1994  Per Cederqvist  <ceder@signum.se>
+ 
+ 	* vc-hooks.el (vc-status): Handle CVS.
+ 
+ 	* vc-hooks.el (vc-find-cvs-master): New function.
+ 	(vc-master-templates): Add vc-find-cvs-master.
+ 	(vc-registered): Allow vc-master-templates to contain atoms, and
+ 	call them with dirname and basename as arguments.
+ 
+ 	* vc-hooks.el (vc-mode-line): Use equal, not string-equal, to
+ 	compare the result of vc-locking-user.
+ 
+ 	* vc.el (vc-backend-checkin): When CVS checks in a file, it is
+ 	immediately checked out again, so set vc-checkout-time.
+ 
+ 	* vc.el (vc-fetch-properties): CVS 1.4A1 says "Repository revision".
+ 
+ 	* vc.el (vc-locking-user): Do something sensible when the backend
+ 	is CVS.  May return a numerical UID or a string when CVS is used.
+ 	(vc-dired-reformat-line): Handle numerical arguments.
+ 
+ 	* vc.el (vc-backend-checkout): Don't extract CVS files twice.
+ 
+ 	* vc.el (vc-next-action-on-file): Handle return value from
+ 	vc-backend-merge-news correctly.
+ 
+ 	* vc.el (vc-rename-file): Fixed call to vc-backend-dispatch.
+ 	(vc-make-buffer-writable-hook): New hook, for CVS only.
+ 	(vc-header-alist): Added header for CVS.
+ 	(vc-next-action-on-file): Added support for CVS.
+ 	(vc-next-action, vc-checkin, vc-revert-buffer): Doc fixes.
+ 	(vc-rename-file): Disable if the backend is CVS.
+ 	(vc-log-info): New arguments: LAST and FLAGS, passed on to
+ 	vc-do-command.  All callers updated.
+ 	(vc-fetch-properties): Implement support for CVS files.
+ 
+ 	* vc.el (vc-backend-checkin): Args REV and COMMENT no longer optional.
+ 	Implement support for CVS.
+ 	(vc-backend-revert): Implement support for CVS.
+ 	(vc-backend-diff): Treat files which are added, but not yet committed,
+ 	specially (diff them against /dev/null).
+ 	(vc-backend-merge-news): New function.
+ 	(vc-log-mode): Talk a little about CVS in the comment.
+ 
+ 	* vc.el (vc-log-info): Simplify code.
+ 
+ 	* vc.el (vc-do-command): New argument LAST.  All callers updated.
+ 	Legal values for LAST are 'MASTER and 'BASE.
+ 	(vc-backend-dispatch): New argument C, used by CVS.  All callers
+ 	updated, but many just passes an (error "NYI") form.
+ 	(vc-backend-admin): Issue a "cvs add" (but not a "cvs commit").
+ 	(vc-backend-checkout, vc-backend-logentry-check, vc-backend-print-log,
+ 	vc-backend-assign-name, vc-backend-diff, vc-check-headers): Handle CVS.
+ 	(vc-backend-steal, vc-backend-uncheck): Give error if using CVS.
+ 
+ 	* vc.el (vc-backend-diff): Fixed typo in SCCS code.
+ 
+ Sun Oct  2 00:01:49 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* comint.el (comint-strip-ctrl-m): Renamed from shell-strip-crtl-m
+ 	and moved here.
+ 	(shell-strip-ctrl-m): Add defalias.
+ 	* shell.el (shell-strip-ctrl-m): Function deleted.
+ 
+ 	* rect.el (kill-rectangle): In read-only buffer, do record
+ 	the rectangle for later yanking.
+ 
+ 	* shell.el (shell-mode): Compare the truename with /dev/null.
+ 
+ 	* files.el (file-truename): If name has no dir, use default-directory.
+ 
+ 	* env.el (setenv-history): New history list.
+ 	(setenv): Use setenv-history.
+ 	Place the variable's current value at front of setenv-history
+ 	while reading the new value.
+ 
+ Sat Oct  1 17:06:58 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* cplus-md.el (indent-c++-exp): For public/private/protected,
+ 	don't do the case/label adjustment.
+ 
+ 	* fill.el (fill-region, fill-region-as-paragraph): Fix previous change.
+ 
+ 	* vc.el (vc-register): Verify an old master file really still exists
+ 	before giving error.  If it has disappeared, ask for confirmation.
+ 
+ 	* files.el (save-buffers-kill-emacs): Fix previous change.
+ 
+ Sat Oct  1 00:23:41 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* mouse.el (mouse-secondary-click-count): New variable.
+ 	(mouse-secondary-save-then-kill, mouse-drag-secondary):
+ 	Use mouse-secondary-click-count, not mouse-selection-click-count.
+ 
+ 	* server.el (server-switch-buffer): Don't go to an invisible frame.
+ 	Move to a non-dedicated window if possible.
+ 	Otherwise, make the window non-dedicated.
+ 
+ 	* subr.el (add-hook, remove-hook): If the hook was made local
+ 	in the old way, always modify the local value.
+ 
+ 	* ispell.el (ispell-init-process): Add missing arg in error msg.
+ 
+ 	* finder.el (finder-mode-map): Change key bindings:
+ 	RET or f to select, d to go back to directory.
+ 	(finder-summary): Fix the help summary.
+ 
+ Fri Sep 30 14:19:54 1994  Jan-Hein Buhrman  <J.H.Buhrman@ns-nl.att.com>
+ 
+ 	* env.el (setenv): Provide history, completion for envvar.
+ 	(read-envvar-name-history): New variable.
+ 	(read-envvar-name): New function.
+ 
+ Fri Sep 30 18:14:05 1994  Francesco Potorti`  (pot@cnuce.cnr.it)
+ 
+ 	* man.el (Man-init-defvars, Man-cleanup-manpage,
+ 	Man-fontify-manpage): fix previous fix.
+ 
+ Fri Sep 30 16:29:27 1994  Michael Ernst  <mernst@research.microsoft.com>
+ 
+ 	* fill.el (fill-region, fill-region-as-paragraph):
+ 	If specified region ends before a newline, include that newline.
+ 
+ Fri Sep 30 00:44:57 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* edmacro.el (edmacro-format-keys): Cope if local keymap is nil.
+ 
+ 	* faces.el (modify-face): New function.
+ 
+ 	* files.el (save-buffers-kill-emacs):
+ 	Use run-hook-with-args-until-failure.
+ 	(find-file-noselect): Use run-hook-with-args-until-success.
+ 	(after-find-file): Use run-hooks for find-file-hooks.
+ 	(basic-save-buffer): Use run-hook-with-args-until-success.
+ 
+ 	* subr.el (add-hook): Initialize default value and local value.
+ 	(run-hook-with-args-until-success): New function.
+ 	(run-hook-with-args-until-failure): New function.
+ 
+ 	* dired-aux.el (dired-do-print): Put spaces between lpr switches.
+ 
+ Thu Sep 29 14:51:09 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* lpr.el (print-region-1): Use them instead of just pr.
+ 	(lpr-page-header-program, lpr-page-header-switches): New variables.
+ 
+ 	* abbrev.el (add-abbrev, inverse-add-abbrev):
+ 	Clear text properties from NAME.
+ 
+ 	* scheme.el (scheme-mode-variables): Make parse-sexp-ignore-comments t.
+ 
+ 	* texinfmt.el (texinfo-format-region, texinfo-format-buffer-1):
+ 	Search back for the @include.
+ 
+ Thu Sep 29 13:39:02 1994  Francesco Potorti`  (pot@cnuce.cnr.it)
+ 
+ 	* man.el
+ 	(Man-init-defvars, Man-cleanup-manpage, Man-fontify-manpage):
+ 	added support for the big cross present in the ksh manpage.
+ 
+ Thu Sep 29 00:48:21 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* frame.el (handle-delete-frame): New function.
+ 
+ Wed Sep 28 15:49:33 1994  Ake Stenhoff  <etxaksf@aom.ericsson.se>
+ 
+ 	* imenu.el (imenu--cleanup): Changed 'mapc' to 'mapcar'.
+ 
+ Wed Sep 28 19:00:42 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* subr.el (run-hooks): t as hook list element means run the global
+ 	value of the variable as well as the local value.
+ 	(run-hook-with-args): Likewise.
+ 	(make-local-hook): New function.
+ 	(add-hook, remove-hook): New arg LOCAL means modify local value.
+ 	Test default-boundp as well as boundp.
+ 
+ Wed Sep 28 18:10:55 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* startup.el (command-line): Recognize --longopt synonyms for all
+ 	options handled here.
+ 
+ Tue Sep 27 16:29:27 1994  Michael Ernst  <mernst@research.microsoft.com>
+ 
+ 	* paragraphs.el (backward-kill-sentence): Work in read-only buffers.
+ 	(kill-sentence): Work in read-only buffers.
+ 
+ Tue Sep 27 16:14:42 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* help.el (command-apropos): Pass t for no-header to apropos.
+ 
+ 	* apropos.el (apropos-print-matches): Add newline after
+ 	Function: or Variable: if line doesn't fit with it.
+ 	New arg no-header inhibits them entirely.
+ 	(apropos): New arg no-header.  Pass it to apropos-print-matches.
+ 
+ 	* sendmail.el (mail): Doc fix.
+ 
+ Tue Sep 27 12:03:04 1994  Christopher J. Madsen  <ac608@yfn.ysu.edu>
+ 
+         * files.el (hack-one-local-variable):
+ 	Support safe-local-variable property.
+ 	(compile-command): Add safe-local-variable property.
+ 
+ Tue Sep 27 01:41:30 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* etags.el (etags-tags-completion-table): Allow ? and : in guessed
+         tag names.
+ 
+ Mon Sep 26 16:47:50 1994  Joe Ramey <ramey@csc.ti.com>
+ 
+         * rmailsum.el (rmail-summary-delete-forward): Regexp for
+ 	recognizing deleted message should not require a space at the
+ 	beginning of the line.
+ 
+ Mon Sep 26 19:04:19 1994  Richard Stallman  <rms@churchy.gnu.ai.mit.edu>
+ 
+ 	* gud.el (gud-overload-functions): Function deleted.
+ 	(gud-massage-args, gud-marker-filter, gud-find-file): New vars.
+ 	Mark them as permanent locals.
+ 	(gud-massage-args, gud-marker-filter, gud-find-file):
+ 	In these functions, use those variables.
+ 	(gud-common-init): 3 new args give values for those variables.
+ 	(gdb, sdb, dbx, xdb, perldb): Pass new args to gud-common-init.
+ 	(gud-gdb-complete-command): Bind gud-marker-filter.
+ 	(gud-find-file): Condense multiple slashes to single slashes.
+ 
+ Mon Sep 26 06:49:42 1994  Lennart Staflin  <lenst@lysator.liu.se>
+ 
+ 	* dired.el (dired-re-perms): Accept various file type letters.
+ 
+ Sun Sep 25 14:27:30 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* flow-ctrl.el (enable-flow-control):
+ 	Never make keyboard-translate-table shorter.
+ 
+ Sun Sep 27 13:27:11 1994  Barry A. Warsaw  (warsaw@anthem.nlm.nih.gov)
+ 
+ 	* Installed version 4.85.
+ 
+ 	* cc-mode.el (c-mode-fsf-menu, c-mode-map, c++-mode-map, objc-mode-map):
+ 	Use a better feature test to figure out how to set the menu title
+ 	string.
+ 
+ 	* cc-mode.el (c-search-uplist-for-classkey): In `class' keyword
+ 	verification section, only skip forward for ?> template char if a
+ 	matching ?< char was found previous to search-start.
+ 
+ 	* cc-mode.el (c-submit-bug-report): Updated var list.
+ 
+ 	* cc-mode.el (c-search-uplist-for-classkey): Lele patch for objc-mode.
+ 
+ 	* cc-mode.el (c-search-uplist-for-classkey):
+ 	Avoid "invalid search bound" error.
+ 
+ 	* cc-mode.el (c-beginning-of-statement-1):
+ 	Skip special modifier chars in all cases.
+ 
+ 	* cc-mode.el (c-guess-basic-syntax):
+ 	CASE 9: generalize and collect common code for finding position
+ 	after conditional statements, and check for `while' statement of a
+ 	`do' loop.  In that case, skip over the trailing semi.
+ 
+ 	* cc-mode.el (c-progress-info, c-progress-init)
+ 	(c-progress-update, c-progress-fini):
+ 	New vars/defuns for better long indentation progress reporting
+ 	(c-indent-exp, c-indent-region): Use them.
+ 
+ 	* cc-mode.el (c-guess-basic-syntax):
+ 	CASE 6F, go forward 1 char from b-o-s of containing-sexp bufpos to
+ 	find proper relpos of an arglist-cont.
+ 
+ 	* cc-mode.el (c-offset-alist-default):
+ 	statement-case-open default offset is zero
+ 	(c-skip-case-statement-forward): New function.
+ 	(c-guess-basic-syntax): CASE 15: use c-skip-case-statement-forward in
+ 	proper places to find the real relpos of statement's inside switch
+ 	case/default bodies.  CASE 15D: remove special handling when looking
+ 	at c-conditional-key.
+ 
+ 	* cc-mode.el (c-offsets-alist, c-cleanup-list, c-mode-menu)
+ 	(c-mode-map, c-symbol-key, c-indent-line, c-popup-menu): Doc fixes.
+ 
+ 	* cc-mode.el (c-least-enclosing-brace): New function.
+ 	(c-most-enclosing-brace): Renamed from c-enclosing-brace.
+ 	(c-indent-defun): Handle opening braces not in column 1.
+ 
+ 	* cc-mode.el (c-beginning-of-statement-1): Skip over statement mod
+ 	characters that don't precede an open paren.
+ 
+ 	* cc-mode.el (c-guess-basic-syntax):
+ 	Check for c-access-key non-nil before using it.
+ 
+ 	* cc-mode.el (c-beginning-of-statement-1): Swapped CASE 3 and 4,
+ 	so that conditional statements are picked up properly.
+ 
+ 	* cc-mode.el (c-guess-basic-syntax):
+ 	CASE 15D, calculate relpos from boi of beginning of statement
+ 	prior to indent-point, unless we're looking at a conditional key.
+ 
+ 	* cc-mode.el (c-mode-map, c++-mode-map, objc-mode-map):
+ 	Change test of 'FSF in c-emacs-features to specific features
+ 	based tests.
+ 
+ 	* cc-mode.el (c-just-after-func-arglist-p)
+ 	(c-guess-basic-syntax, c-lineup-objc-method-args-2):
+ 	More objc patches from Lele
+ 
+ 	* cc-mode.el (c-indent-command):
+ 	With optional arg, shift-amt had wrong sign.
+ 
+ 	* cc-mode.el (c-lineup-arglist):
+ 	Better handling of comments preceding arg lists.
+ 
+ 	* cc-mode.el (c-guess-basic-syntax): Swapped CASE 6A and 6B to
+ 	recognize empty arglists with close paren on separate line.
+ 
+ 	* cc-mode.el (c-mode-menu, c-emacs-features, c-mode-map)
+ 
+ 	(c-common-init): Remove dependency on string "Lucid" in
+ 	emacs-version.  Use features to distinguish.
+ 
+ 	* cc-mode.el (c-fill-paragraph):
+ 	Merge with 19.25's c-mode.el--uses fill-region-as-paragraph.
+ 
+ 	* cc-mode.el (c-offsets-alist-default, c-offsets-alist)
+ 	(c-hanging-braces-alist, c-electric-brace, c-guess-basic-syntax):
+ 	Added syntactic symbol statement-case-open for
+ 	statement-case-intro's that contain an open brace.
+ 
+ 	* cc-mode.el (c-lineup-math): Watch for equal signs in literals.
+ 
+ 	* cc-mode.el (c-beginning-of-statement-1):
+ 	CASE5 and CASE 6, better pick up of label's with potential
+ 	embedded colons (scope operators).
+ 
+ 	* cc-mode.el (c-hanging-comment-ender-p): New variable.
+ 	(c-fill-paragraph): Use c-hanging-comment-ender-p.
+ 
+ 	* cc-mode.el (c-recognize-knr-p): New variable.
+ 	(c-common-init): Make it buffer-local.
+ 	(c-mode, c++-mode, objc-mode): Use c-recognize-knr-p.
+ 	(c-guess-basic-syntax): Use c-recognize-knr-p; swap
+ 	CASE 5B.2 and 5B.3.
+ 
+ 	* cc-mode.el (c-offsets-alist-default, c-offsets-alist)
+ 	(c-guess-basic-syntax):
+ 	Changed syntactic symbol c++-funcdecl-cont to ansi-funcdecl-cont
+ 
+ 	* cc-mode.el (c-offsets-alist, c-read-offset, c-set-offset):
+ 	Accept variable symbols as offsets.
+ 	(c-get-offset): Accept ++ and -- symbols.
+ 
+ 	* cc-mode.el (c-guess-basic-syntax):
+ 	CASE 9C: added small performance improvment to c-in-literal call.
+ 
+ 	* cc-mode.el (c-beginning-of-statement-1): Use c-in-literal-cache,
+ 	and limit backscanning in CASE 5 to known, non-literal position.
+ 
+ 	* cc-mode.el (c-in-literal, c-guess-basic-syntax):
+ 	Caching of last literal result.
+ 
+ 	* cc-mode.el (c-guess-basic-syntax):
+ 	CASE 15D, calculate 'statement relpos as the
+ 	beginning-of-statement relative to indent-point.
+ 
+ 	* cc-mode.el (c-beginning-of-statement-1):
+ 	CASE 4, check for conditional keywords which could be followed by
+ 	a balanced paren expr.  I.e. while(foo).
+ 
+ 	* cc-mode.el (c++-mode-syntax-table, objc-mode-syntax-table):
+ 	Give CR same syntax as newline, for selective-display.
+ 
+ 	* cc-mode.el (c-electric-star):
+ 	Fixed indentation problem when a star is not preceded by a slash.
+ 
+ 	* cc-mode.el (c-indent-defun):
+ 	Removed condition-case inside unwind-protect.
+ 
+ 	* cc-mode.el (c-class-key, c-search-uplist-for-classkey):
+ 	Greatly simplified, this constant now contains a regexp that only
+ 	matches valid `class' keywords, in the C++ sense.
+ 
+ Sun Sep 25 02:04:32 1994  Richard Stallman  <rms@churchy.gnu.ai.mit.edu>
+ 
+ 	* info.el (Info-scroll-down, Info-scroll-up): Doc fixes.
+ 
+ 	* rmail.el (rmail-forward): Simplify insertion of forwarded msg.
+ 	Don't use exchange-point-and-mark.
+ 
+ 	* rmail.el (rmail-msg-number-after-expunge): New function.
+ 	(rmail-reply, rmail-forward): Use separate local variables
+ 	rmail-send-actions-rmail-msg-number, rmail-send-actions-rmail-buffer
+ 	to record which message to mark as answered or forwarded.
+ 	(rmail-only-expunge): Update msg numbers stored in those variables.
+ 
+ Sat Sep 24 21:21:26 1994  Richard Stallman  <rms@churchy.gnu.ai.mit.edu>
+ 
+ 	* rmail.el (rmail-construct-io-menu): Don't print a message
+ 	about no matching files.
+ 
+ Sat Sep 24 06:49:42 1994  Lennart Staflin  <lenst@lysator.liu.se>
+ 
+ 	* dired.el (dired-re-perms): Accept directories and symbolic links
+ 	also, not only plain files.
+ 
+ Sat Sep 24 00:01:02 1994  Richard Stallman  <rms@churchy.gnu.ai.mit.edu>
+ 
+ 	* buff-menu.el (Buffer-menu-delete): Handle prefix arg.
+ 	(Buffer-menu-delete-backwards): Handle prefix; use Buffer-menu-delete.
+ 
+ 	* dired-x.el (dired-virtual-mode): Doc fix.
+ 
+ 	* sh-script.el (auto-mode-alist): Use \' in auto-mode-alist regexps.
+ 
+ 	* mlsupport.el (auto-execute): Use \' in auto-mode-alist regexps.
+ 
+ 	* icon.el (icon-mode): Add autoload cookie.
+ 
+ 	* ada.el (ada-mode): Add autoload cookie.
+ 	(auto-mode-alist): Don't alter it here.
+ 
+ 	* files.el (auto-mode-alist): Handle ada-mode and icon-mode.
+ 
+ Fri Sep 24 13:03:09 1994  Jan-Hein Buhrman  (J.H.Buhrman@ns-nl.att.com)
+ 
+ 	* ange-ftp.el (ange-ftp-start-process): Add use-smart-ftp code.
+ 	(ange-ftp-get-process): Use ange-ftp-normal-login if
+ 	ange-ftp-gateway-host is nil.
+ 
+ Fri Sep 24 12:02:26 1994  Michael D. Ernst  <mernst@research.microsoft.com>
+ 
+ 	* simple.el (shell-command, shell-command-on-region):
+ 	Make "*Shell Command Output*" non-read-only.
+ 
+ Fri Sep 24 04:39:22 1994  Erik Naggum  <erik@naggum.no>
+ 
+ 	* comint.el (comint-input-chunk-size): Variable deleted.
+ 	(comint-send-string): Make it an alias for process-send-string.
+ 	(comint-send-region): Make it an alias for process-send-region.
+ 
+ 	* nntp.el (nntp-send-region-to-server): Call process-send-region
+ 	just once, for the whole string.
+ 
+ 	* rmail.el (rmail-reformat-message): Run mail-message-filter
+ 	before calling rmail-clear-headers.
+ 
+ Fri Sep 23 20:57:05 1994  Richard Stallman  <rms@churchy.gnu.ai.mit.edu>
+ 
+ 	* isearch.el (isearch-mode): Don't set deactivate-mark here.
+ 	(isearch-done): In Transient Mark mode, don't set mark if is active.
+ 
+ 	* vc.el (vc-finish-steal): Do vc-resynch-window in the right buffer.
+ 	(vc-steal-lock): Delete spurious reference to `configuration'.
+ 
+ 	* vc.el (vc-backend-checkout): Add if-statements to the shell cmds
+ 	to discard the extra arg some shells make.
+ 
+ Fri Sep 23 20:03:47 1994  Jonathan I. Kamens  (jik@gza-client1)
+ 
+         * files.el (find-alternate-file): Confirm killing buffer
+ 	only if it is visiting a file.
+ 
+ Fri Sep 23 13:30:10 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* etags.el (tag-symbol-match-p): New function.
+ 	(etags-recognize-tags-table): Add that second in find-tag-tag-order,
+ 	after tag-exact-match-p.
+ 
+ 	* etags.el (tags-table-check-computed-list): Call
+ 	tags-verify-table on existing buffers.
+ 
+ Fri Sep 23 10:08:09 1994  Boris Goldowsky  <boris@cs.rochester.edu>
+ 
+ 	* fill.el (justify-current-line): Inherit props when inserting spaces.
+ 
+ Fri Sep 23 01:14:28 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* vc.el (vc-rename-file): Add autoload cookie.
+ 
+ 	* mail-extr.el (mail-extr-all-top-level-domains):
+ 	Fix formal name of Hungary.
+ 
+ Thu Sep 22 21:26:21 1994  Tom Tromey  <tromey@drip.colorado.edu>
+ 
+ 	* add-log.el (add-change-log-entry): Set add-log-full-name and
+ 	add-log-mailing-address here.
+ 	(add-log-mailing-address, add-log-full-name): Initialize to nil.
+ 
+ Thu Sep 22 15:35:40 1994  Stephen Gildea  (gildea@x.org)
+ 
+ 	* time-stamp.el (time-stamp-mail-host-name): Use mail-host-address.
+ 	(time-stamp-mail-host): Variable deleted.
+ 
+ Thu Sep 22 12:59:27 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* sendmail.el (sendmail-synch-aliases): Renamed from
+ 	synch-mail-aliases.  All callers changed.
+ 
+ Thu Sep 22 14:31:41 1994  Francesco Potorti`  <pot@cnuce.cnr.it>
+ 
+ 	* man.el (Man-notify-method): New name for old Man-notify-flag
+ 	user options.  All functions using it updated.
+ 
+ 	* ispell.el (check-ispell-version): Suggest to try ispell4.el if
+ 	version does not match.
+ 
+ Thu Sep 22 00:15:12 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* faces.el (x-create-frame-with-faces): Delete the frame if get error.
+ 
+ 	* rmailsum.el (rmail-summary-goto-msg): Simply the regexp
+ 	for finding the message number.  Check that a non-digit follows it.
+ 
+ 	* help.el (print-help-return-message): Handle cons cells
+ 	in special-display-regexps and special-display-buffer-names.
+ 
+ 	* startup.el (mail-host-address): New variable.
+ 	(normal-top-level): Use mail-host-address to init user-mail-address.
+ 
+ 	* files.el (file-ownership-preserved-p): New function.
+ 
+ Wed Sep 21 19:52:39 1994  Jonathan I. Kamens  (jik@gza-client1)
+ 
+ 	* rmail.el (rmail-retry-ignored-headers): New variable,
+ 	specifying the headers that should be removed by
+ 	rmail-retry-failure.
+ 	(rmail-retry-setup-hook): Obsolete variable (see below), deleted.
+ 	(rmail-clear-headers): New optional arg is list of headers to clear.
+ 	(rmail-retry-failure): Copy the whole block of headers from the message
+ 	and then discard those in rmail-retry-ignored-headers.  Delete
+ 	usage of rmail-retry-setup-hook.  Bind mail-signature and
+ 	mail-setup-hook to nil when composing retry buffer.
+ 	Handle mail-self-blind.
+ 
+ 	* vc.el (vc-steal-lock): (1) Function should be
+ 	non-interactive, because it doesn't work when called directly
+ 	by the user. (2) Don't display revision "nil" when stealing
+ 	lock if revision is unknown.  (3) Put "Stolen lock on <file>"
+ 	instead of just the file name in the Subject of the
+ 	notification message.
+ 
+ 	* rmail.el (rmail-ignored-headers): Add resent-message-id.
+ 
+         * simple.el (insert-buffer): Default to first other buffer,
+         not first non-visible buffer.
+ 
+ Wed Sep 21 19:21:43 1994  Erik Naggum  <erik@naggum.no>
+ 
+ 	* lisp.el (insert-parentheses): Don't insert spaces at beginning
+ 	and end of buffer.
+ 
+ Wed Sep 21 10:23:57 1994  Per Abrahamsen  <abraham@iesd.auc.dk>
+ 
+ 	* frame.el (special-display-popup-frame): Rename new arg to ARGS.
+ 	Allow (FUNCTION OTHER-ARGS...) as the value of ARGS.
+ 
+ 	* frame.el (special-display-popup-frame): New argument PARAMS.
+ 	Use it as well as `special-display-frame-alist'.
+ 
+ Wed Sep 21 14:18:37 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* mail-extr.el (mail-extr-all-top-level-domains): Update domain list.
+ 
+ 	* emerge.el (emerge-recenter, emerge-operate-on-windows):
+ 	Use `visible' when calling get-buffer-window.
+ 
+ 	* etags.el (find-tag-noselect): Simplify.
+ 	Always run find-tag-hook at the tag's location.
+ 
+ 	* sendmail.el (mail-default-reply-to): Initialize to t.
+ 	(mail-setup): If it's t, set it from envvar REPLYTO.
+ 
+ Mon Sep 19 14:08:01 1994  Francesco Potorti`  <pot@cnuce.cnr.it>
+ 
+ 	* man.el (Man-notify-flag): replaces the old Man-notify
+ 	variable, use the old one if it is bound as initial value.
+ 	(Man-reuse-okay-flag): replaces Man-reuse-okay.
+ 	(Man-downcase-section-letters-flag): replaces
+ 	Man-downcase-section-letters.
+ 	(Man-circular-pages-flag): replaces Man-circular-pages.
+ 	(Man-auto-section-alist): variable deleted.
+ 	(Man-section-translations-alist): removed the "3x" translation.
+ 	(Man-untabify-command, Man-untabify-command-args): new vars.
+ 	(Man-sed-command, Man-awk-command): new variables.
+ 	(Man-sysv-sed-script, Man-berkeley-sed-script): new constants.
+ 	(Man-name-regexp, Man-page-header-regexp): new variable.
+ 	(Man-heading-regexp): changed default value.
+ 	(Man-reference-regexp): now refers to previous regexps.
+ 	(Man-arguments): new buffer-local variable.
+ 	(Man-page-mode-string): changed default value.
+ 	(Man-mode-map): changed the meanings of ",", ".", "q".  Added new
+ 	keys ">", "<", "k".
+ 	(Man-page-mode-string): function deleted.
+ 	(Man-init-defvars): New function used for initialising the system
+ 	and environment dependent variables Man-fontify-manpage-flag,
+ 	Man-uses-untabify, Man-sed-script, Man-filter-list.
+ 	(Man-delete-trailing-newlines): function deleted.
+ 	(Man-make-page-mode-string): new subst.
+ 	(Man-build-man-command): now subst instead of function.  Modified
+ 	to comply with the new format of Man-filter-list.
+ 	(Man-downcase): function deleted.
+ 	(Man-translate-references): complete rewrite.
+ 	(Man-linepos): function deleted.
+ 	(Man-match-substring): new function.
+ 	(Man-default-man-args): function deleted.
+ 	(Man-default-man-entry): complete rewrite.
+ 	(man, manual-entry): function-alias relationship reversed.
+ 	(man): prompt changed, prompt using interactive, call
+ 	Man-init-defvars, set Man-arguments.
+ 	(Man-notify-when-ready): manage the 'pushy value.
+ 	(Man-fontify-manpage): substitute Man-set-fonts.
+ 	(Man-cleanup-manpage): new function.
+ 	(Man-bgproc-sentinel): cleanup, call Man-fontify-manpage and
+ 	Man-cleanup-page when necessary.
+ 	(Man-mode): call Man-strip-page-headers and Man-unindent.
+ 	(Man-build-section-alist, Man-build-references-alist,
+ 	Man-build-page-list): substs instead of functions.
+ 	(Man-build-references-alist): cleanup.
+ 	(Man-build-page-list): new algorithm.
+ 	(Man-strip-page-headers, Man-unindent): new substs.
+ 	(Man-find-section): assume section names start in column 1.
+ 	(Man-quit): bury the buffer instead of killing it, delete the
+ 	frame when necessary.
+ 	(Man-kill): new function.
+ 	(Man-goto-page): do the right thing when the manpage is not found,
+ 	do not assume that Man-build-references-alist is broken.
+ 
+ Wed Sep 21 01:19:09 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* menu-bar.el (vc-menu-map): New menu.
+ 	(menu-bar-file-menu): Put the VC map under the File map.
+ 
+ 	* vc-hooks.el (vc-menu-map): Set up menu items.
+ 
+ 	* rmail.el (rmail-mode-kill-summary): New function.
+ 	(rmail-variables): Put that on kill-buffer-hook locally.
+ 
+ 	* subr.el (remove-hook, add-hook): Copy existing list before modifying.
+ 
+ Tue Sep 20 19:52:20 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* sendmail.el (mail-bury-selects-summary): New variable.
+ 	(mail-bury): Test it.
+ 
+ Tue Sep 20 16:38:28 1994  Francesco Potorti`  <pot@cnuce.cnr.it>
+ 
+ 	* vc-hooks.el (vc-status): Use vc-path when calling prs.
+ 
+ Tue Sep 20 02:34:26 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* vc-hooks.el (vc-status): New arg vc-type.
+ 
+ 	* window.el (shrink-window-if-larger-than-buffer): Use WINDOW's frame
+ 	for all actions that operate on a frame.  Set WINDOW to selected
+ 	window if it was nil.
+ 
+ Mon Sep 19 11:25:11 1994  Boris Goldowsky  <boris@cs.rochester.edu>
+ 
+ 	* add-log.el (add-log-current-defun): Deal with
+ 	lisp-interaction-mode like lisp-mode.
+ 
+ 	* facemenu.el (facemenu-update): Make menu separators all dashes.
+ 
+ Mon Sep 19 20:59:08 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* subr.el (add-hook): Doc fix.
+ 
+ Mon Sep 19 13:31:16 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* emacsbug.el (report-emacs-bug): system-configuration-options was
+ 	misspelled as system-configure-options.
+ 
+ Mon Sep 19 13:29:03 1994  Jim Blandy  <jimb@geech.gnu.ai.mit.edu>
+ 
+ 	* disp-table.el: Add support for new window border display table
+ 	element.
+ 	(describe-display-table): Describe the window border glyph.
+ 	(display-table-len): New constant.
+ 	(make-display-table, standard-display-8bit,
+         standard-display-default, standard-display-ascii,
+         standard-display-g1, standard-display-graphic,
+         standard-display-underline): Use display-table-len, instead of
+         hard-coding the display table length.
+ 
+ Mon Sep 19 13:19:50 1994  Francesco Potorti`  <pot@cnuce.cnr.it>
+ 
+ 	* rlogin.el (rlogin): recognise the `-l user' option to rlogin and
+ 	let comint and ange-ftp know about the correct home directory.
+ 
+ Mon Sep 19 00:17:22 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* picture.el (picture-yank-at-click): New function.
+ 
+ 	* hideif.el: Handle ==, !=, + and -.
+ 	(hif-tokenize): Handle ==, !=, + and -.
+ 	(hif-token-regexp): Handle ==, !=, + and -.
+ 	(hif-notequal, hif-plus, hif-minus, hif-mathify): New functions.
+ 	(hif-math, hif-eq-expr): New functions.
+ 	(hif-term): Call hif-eq-expr.
+ 	(hide-ifdef-define): Pass 1 to hif-set-var.
+ 
+ 	* files.el (file-name-sans-extension): New function.
+ 
+ 	* files.el (basic-save-buffer-1): If writing temp file fails
+ 	or a precious file, restore the old visited file modtime.
+ 
+ 	* replace.el (query-replace-interactive): New user option.
+ 	(query-replace-read-args): Obey that option--fetch from
+ 	search-ring or regexp-search-ring.  New arg regexp-flag.
+ 	(query-replace, query-replace-regexp, replace-string)
+ 	(replace-regexp): Pass new arg to query-replace-read-args.
+ 	(map-query-replace-regexp): Obey query-replace-interactive.
+ 
+ Sun Sep 18 15:45:40 1994  Vincent Del Vecchio  (vdelvecc@dsd.camb.inmet.com)
+ 
+ 	* info.el (Info-insert-dir): Insert newlines before rather than
+ 	after nodes copied from other files, for consistency.
+ 
+ Sun Sep 18 17:15:30 1994  Frederic Pierresteguy  <F.Pierresteguy@frcl.bull.fr>
+ 
+ 	* rmail.el: Build proper keymap for the "Input (menu)" and
+ 	"Output (menu)" submenus.
+ 	(rmail-find-all-files, rmail-list-to-menu): New functions.
+ 	(rmail-construct-io-menu): New functions.
+ 	(rmail-input-menu): Function deleted.
+ 	(rmail). Call rmail-construct-io-menu.
+ 	(rmail-mode-map): 'Input Rmail file (menu)' renamed to
+ 	'Input Rmail file'. 'Output (Rmail menu)' renamed to
+ 	'Output Rmail file'.
+ 	* rmailout.el (rmail-output-menu): Function deleted.
+ 	* rmailsum.el (rmail-summary-construct-io-menu): New function.
+ 	(rmail-new-summary): Call rmail-summary-construct-io-menu.
+ 	(rmail-summary-mode-map): New menu items 'Input Rmail File' and
+ 	'Output Rmail File'.
+ 	(rmail-summary-output-to-rmail-file): New arg 'file-name'. If it
+ 	non-nil, call rmail-output-to-rmail-file.
+ 
+ Sun Sep 18 15:07:21 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* tex-mode.el (tex-start-shell): Inherit comint-mode-map, don't copy.
+ 
+ 	* shell.el (shell-mode-map): Inherit comint-mode-map,
+ 	and copy only the completion menu.
+ 
+ 	* telnet.el (telnet-mode-map): Inherit comint-mode-map, don't copy.
+ 
+ 	* vc-hooks.el (vc-file-not-found-hook): Use save-excursion.
+ 
+ Sun Sep 18 22:21:53 1994  Kenneth Manheimer  (klm@coil.nist.gov)
+ 
+ 	* icomplete.el: Major rewrite to behave more like a minor mode.
+ 	Doc fixes.
+ 	(icomplete-mode): New function and var.
+ 	(icomplete-minibuffer-setup-hook): New hook.
+ 	(icomplete-inhibit): Defunct.  Using icomplete-pre-command-hook,
+ 	icomplete-post-command-hook as real hook functions.
+ 	(icomplete-simple-completing-p): Subsumes
+ 	icomplete-window-minibuffer-p plus other stuff, determines whether
+ 	simple completion is active.
+ 	(icomplete-window-minibuffer-p): Defunct, see above.
+ 	(icomplete-minibuffer-setup): Use icomplete-simple-completing-p,
+ 	copy-sequence hooks before adding to them, run hooks properly.
+ 	(icomplete-tidy): Changed from misnamed icomplete-pre-command-hook;
+ 	use icomplete-simple-completing-p.
+ 	(icomplete-exhibit): Changed from misnamed icomplete-post-command-hook;
+ 	use icomplete-simple-completing-p.
+ 	(icomplete-completions): Changed from old, misnamed icomplete-exhibit;
+ 	combined with old misnamed icomplete-prompt.
+ 
+ Sun Sep 18 16:39:30 1994  Michael Kifer  <kifer@cs.sunysb.edu>
+ 
+ 	* ediff.el (ediff-submit-report, ediff-revision)
+ 	(ediff-find-file-name-handler, vc-ediff-internal, rcs-ediff-internal):
+ 	New functions.
+ 	(ediff-version-control-package): New variable.
+ 	(vc-ediff, rcs-ediff): Functions deleted.
+ 
+ 	* ediff.el (ediff-submit-report): New function.
+ 
+ 	* ediff.el (ediff-toggle-read-only, ediff-patch-file): Check out
+ 	version controlled files before their buffers are modified.
+ 	(ediff-local-checkout-flag, ediff-toggle-read-only-function):
+ 	 New variables.
+ 
+ 	* ediff.el (ediff-find-file, ediff-patch-file): Were getting
+ 	confused by symbolic links.  Fixed.
+ 
+ Sun Sep 18 13:47:14 1994  Lawrence R. Dodd  <dodd@roebling.poly.edu>
+ 
+ 	* rmail.el (rmail-forward): Insert separator before and after message.
+ 
+ Sun Sep 18 11:48:01 1994  Francesco Potorti`  <pot@cnuce.cnr.it>
+ 
+ 	* vc-hooks.el (vc-status): Renamed from vc-rcs-status.  Handle SCCS.
+ 	(vc-display-status): Renamed from vc-rcs-status.
+ 	(vc-mode-line): Call vc-status for SCCS files too.
+ 
+ Sun Sep 18 01:05:36 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* telnet.el (telnet): Use name *telnet-HOST*, not *HOST-telnet*.
+ 
+ 	* lmenu.el (make-lucid-menu-keymap-disable): New variable.
+ 	(make-lucid-menu-keymap): Use that when disabling item unconditionally.
+ 
+ Sat Sep 17 01:14:42 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* help.el (describe-variable): Report whether var is local in this buf.
+ 
+ 	* terminal.el (terminal-map): Define switch-frame.
+ 
+ Fri Sep 16 19:10:14 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* facemenu.el (facemenu-update): Reverse the menu order again.
+ 
+ 	* compile.el (compile-internal): Set EMACS=t in process-environment.
+ 
+ 	* ispell.el (ispell-highlight-spelling-error): Test window-system.
+ 
+ Fri Sep 16 17:40:22 1994  Karl Heuer  <kwzh@churchy.gnu.ai.mit.edu>
+ 
+ 	* emacsbug.el: (report-emacs-bug): Insert configuration options.
+ 
+ 	* ispell.el (ispell-menu-map): Order menu items by size:
+ 	buffer > region > word.
+ 	* ispell4.el (ispell-menu-map): Likewise.
+ 
+ 	* register.el (insert-register): Add `*' interactive spec.
+ 
+ 	* menu-bar.el (complex-buffers-menu-p): Delete; obsolete variable.
+ 
+ 	* info.el (Info-edit): Move the customary mode-initialization
+ 	calls out of here.
+ 	(Info-edit-mode): Put them here.  Also enable undo, and call
+ 	Info-edit-mode-hook.
+ 
+ 	* time.el: (display-time-24hr-format): Doc fix.
+ 	(display-time-filter): Reenable code that got deleted during a
+ 	mispatch.
+ 
+ 	* sendmail.el (mail-alias-modtime): New variable.
+ 	(synch-mail-aliases): New function.
+ 	(mail-setup, sendmail-send-it): Synchronize cached list with file.
+ 	* mailalias.el: Require sendmail.  Delete redundant defvar.
+ 	(expand-mail-aliases, define-mail-alias): Synchronize cached list
+ 	with file.
+ 
+ 	* compile.el (compilation-sentinel): Include exit status in modeline.
+ 
+ Fri Sep 16 17:30:01 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* dired.el (dired-buffers-for-dir): Delete debugging code.
+ 	(dired-in-this-tree): Likewise.
+ 
+ Fri Sep 16 13:16:21 1994  Michael Ernst  <mernst@research.microsoft.com>
+ 
+ 	* dired.el, dired-aux.el, dired-x.el: Make directories in
+ 	dired-buffers and dired-subdir-alist be expanded; adjust calls
+ 	accordingly.
+ 	* dired-aux.el (dired-fun-in-all-buffers): Expand dir at start.
+ 	(dired-rename-subdir, dired-rename-subdir-1, dired-kill-tree): Likewise.
+ 	* dired-x.el (dired-clean-up-after-deletion): Expand fn.
+ 	(dired-find-buffer-nocreate): Expand dir at beginning.
+ 	* dired.el (dired-buffers-for-dir): Assume dirs are preexpanded.
+ 	(dired-in-this-tree): Likewise.
+ 	(dired-advertise, dired-unadvertise): Expand default-directory.
+ 
+ Fri Sep 16 00:36:33 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* window.el (shrink-window-if-larger-than-buffer):
+ 	Do nothing in minibuffer-only frame.
+ 
+ 	* menu-bar.el (menu-bar-file-menu): Rename "Kill Buffer" menu item.
+ 
+ Thu Sep 15 17:32:37 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* term/x-win.el (system-key-alist): Add Sun definition for mute-acute.
+ 
+ 	* autoinsert.el (auto-insert-alist): Add entries for C++.
+ 	(insert-auto-insert-files): Do case-sensitive match except on vms.
+ 
+ Thu Sep 15 17:23:50 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* simple.el (kill-new): Call menu-bar-update-yank-menu if that
+ 	function is defined.
+ 	New optional argument means replace most recent kill.
+ 	(kill-append): Use that new interface.
+ 	* mouse.el (mouse-save-then-kill, mouse-secondary-save-then-kill):
+ 	Use the kill-new interface; don't manipulate kill-ring directly.
+ 	* menu-bar.el (yank-menu): New variable; kill-ring in menu format.
+ 	(menu-bar-update-yank-menu, menu-bar-select-yank): New function.
+ 
+ Thu Sep 15 09:11:56 1994  Jay K. Adams  (jka@ece.cmu.edu)
+ 
+ 	* jka-compr.el (jka-compr-compression-info-list): Expand regular
+ 	expressions to include backup files with version numbers.
+ 
+ 	* jka-compr.el (jka-compr-insert-file-contents): Run the
+         functions in after-insert-file-functions after the
+         buffer-file-name has been set, not before.
+ 
+ 	* jka-compr.el (jka-compr-insert-file-contents): Properly
+         handle the 'replace' argument for compressed files.
+ 
+ Thu Sep 15 00:17:40 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* term/x-win.el: Don't call menu-bar-mode.
+ 
+ 	* startup.el (command-line): If initial X frame has a menu bar,
+ 	mark menu-bar-mode as on.
+ 
+ 	* telnet.el (telnet-program): New variable.
+ 	(telnet): Use telnet-program.
+ 	(rsh-program): Renamed from telnet-rsh-program.
+ 	(rsh): Use new name.
+ 
+ Wed Sep 14 14:51:15 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* page.el (forward-page): If we find a match that ends where we
+ 	started searching, look for another one.
+ 
+ 	* window.el (shrink-window-if-larger-than-buffer):
+ 	Use frame-width, not screen-width.
+ 
+ 	* startup.el (command-line): If we can't load x-win.el, terminate.
+ 
+ 	* facemenu.el (facemenu-update): Don't use quoted constant lists
+ 	in define-key.  Reverse order of menu definitions.
+ 
+ 	* autoload.el (generate-file-autoloads): Warn if we put a line
+ 	in loaddefs.el that is long enough to cause trouble.
+ 
+ 	* elp.el: Add autoloads.
+ 
+ 	* c-mode.el (c-mode-map): Add "Highlight Conditionals" menu item.
+ 
+ 	* cpp.el (cpp-highlight-buffer): Renamed from cpp-parse-buffer.
+ 
+ Wed Sep 14 10:53:15 1994  Per Abrahamsen  <abraham@iesd.auc.dk>
+ 
+ 	* cpp.el (cpp-edit-load): Only call `cpp-edit-reset' in cpp-edit-mode.
+ 
+ Wed Sep 14 04:18:15 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* type-break.el: New file.
+ 
+ 	* cpp.el: New file.
+ 
+ 	* info.el (Info-mode-map): Bind M-s like s.
+ 
+ 	* ispell.el (ispell-check-only): New variable.
+ 	(ispell-word): Handle ispell-check-only.
+ 	(ispell-minor-mode): New variable.
+ 	(ispell-minor-keymap): New map.
+ 	(ispell-minor-mode): New function.
+ 
+ 	* facemenu.el: New file.
+ 
+ 	* elp.el: New file.
+ 
+ Wed Sep 14 21:09:48 1994  Andreas Schwab  (schwab@ls5.informatik.uni-dortmund.de)
+ 
+ 	* server.el (server-start): Always use pipes for communication.
+ 
+ Wed Sep 14 14:16:58 1994  Boris Goldowsky  <boris@cs.rochester.edu>
+ 
+ 	* simple.el (repeat-complex-command, next-history-element,
+ 	previous-matching-history-element): Override print-level when
+ 	offering command lines to edit.
+ 
+ Tue Sep 13 23:18:34 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* faces.el (make-face-unbold, make-face-unitalic, make-face-bold,
+ 	make-face-italic, make-face-bold-italic): Don't try to frob font
+ 	if it's nil.
+ 
+ Sun Sep 11 14:56:01 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* Version 19.27 released.
+ 
+ Sun Sep 11 01:41:49 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* ispell.el: Further split the Ispell menu autoloads.
+ 
+ Sat Sep 10 16:37:11 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* rmailsum.el (rmail-summary-goto-msg): Preserve the current buffer.
+ 
+ Fri Sep  9 17:35:23 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* window.el (shrink-window-if-larger-than-buffer): Doc fix.
+ 
+ Thu Sep  8 19:28:02 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* vc.el (vc-do-command): Temporarily add vc-path to the end of PATH.
+ 
+ Thu Sep  8 13:41:12 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* bibtex.el (put-string-on-kill-ring): Delete this function.
+ 	(bibtex-current-entry-label): Call kill-new instead.
+ 
+ Wed Sep  7 03:54:08 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* Version 19.26 released.
+ 
+ Tue Sep  6 16:33:01 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* rmailmsc.el (set-rmail-inbox-list): Doc fix.
+ 
+ Mon Sep  5 19:59:29 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* help-macro.el (make-help-screen): Doc fix.
+ 
+ Mon Sep  5 15:32:47 1994  Lawrence R. Dodd  <dodd@roebling.poly.edu>
+ 
+ 	* dired-x.el: (dired-omit-expunge): Avoid setting buffer modified
+ 	unless it was modified before and some mark is set so `%*' won't
+ 	appear in mode-line of omitted buffers.
+ 
+ Mon Sep  5 00:32:07 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* saveplace.el (save-place-find-file-hook):
+ 	Check after-find-file-from-revert-buffer.
+ 
+ 	* cmacexp.el (c-macro-prompt-flag): Set default back to nil.
+ 
+ Sun Sep  4 20:10:40 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* rmail.el (rmail-get-new-mail): Run rmail-get-new-mail-hook.
+ 
+ Sun Sep  4 22:03:44 1994  Tom Tromey  (tromey@drip.colorado.edu)
+ 
+ 	* man.el (Man-notify-when-ready): Get Man-original-frame
+ 	from the proper buffer.
+ 
+ Sat Sep  3 04:41:11 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* simple.el (mark-ring): Add permanent-local prop.  Doc fix.
+ 
+ 	* shell.el (shell-command-regexp): Use a simpler faster regexp.
+ 
+ 	* info.el (Info-mode): Text for using x, not for make-face defined.
+ 
+ 	* mh-e.el (mh-get-new-mail): Always use mh-inc-prog, never `inc'.
+ 
+ Fri Sep  2 20:07:38 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* outline.el (outline-minor-mode-prefix): Doc fix.
+ 
+ Fri Sep  2 19:11:03 1994  Espen Skoglund  (espensk@tklab1.cs.uit.no)
+ 
+ 	* pascal.el (pascal-auto-lineup): New variable.
+ 	(pascal-end-of-statement): New function.
+ 	(pascal-indent-command): Now does optional lineups of : and =.
+ 	(pascal-indent-case): Uses pascal-end-of-statement to skip the
+ 	case statements.
+ 
+ Thu Sep  1 12:38:15 1994  Espen Skoglund  (espensk@tklab1.cs.uit.no)
+ 
+ 	* pascal.el (pascal-indent-declaration): Indent correctly
+ 	when record blocks are used within parameterlists.
+ 	(pascal-declaration-beg): Strange -0 argument removed.
+ 	(pascal-type-completion): Fix typo in regexp.
+ 	(pascal-get-lineup-indent): Use match-end instead of end-of-line.
+ 
+ Thu Sep  1 16:43:04 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* compile.el (grep-command): Doc fix.
+ 
+ 	* tcl-mode.el: Call provide.
+ 
+ Thu Sep  1 12:38:02 1994  Francesco Potorti`  (pot@cnuce.cnr.it)
+ 
+ 	* cmacexp.el (c-macro-prompt-flag): set default to t.
+ 	(c-macro-expand): buffer-flush-undo is outdated.
+ 	(c-macro-expansion): make exit-status a local variable.
+ 
+ Thu Sep  1 02:12:12 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* completion.el (completion-before-command): Don't call get
+ 	on a non-symbol.
+ 
+ Tue Aug 30 02:58:32 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* window.el (shrink-window-if-larger-than-buffer):
+ 	Don't make the window shorter than window-min-height.
+ 
+ 	* calendar.el (exit-calendar): Don't restore window config.
+ 	(calendar): Don't save one.
+ 
+ 	* isearch.el (isearch-edit-string): Use isearch-text-char-description.
+ 
+ 	* ispell.el (ispell-dictionary-alist-1):
+ 	For English, remove hyphen from the OTHERCHARS.
+ 
+ 	* isearch.el (isearch-edit-string): In the isearch-recursive-edit case,
+ 	don't end the recursive edit and don't start another one.
+ 	(isearch-done): New arg EDIT.
+ 	(isearch-mode): Return t if search succeeded.
+ 
+ Mon Aug 29 22:20:43 1994  Tom Tromey  (tromey@creche.colorado.edu)
+ 
+ 	* replace.el (perform-replace): Restore match data before highlighting.
+ 
+ Mon Aug 29 20:46:14 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* help-macro.el (make-help-screen): Don't call window-frame
+ 	in a non-multi-frame Emacs.
+ 
+ Mon Aug 29 08:43:49 1994  Lennart Staflin  <lenst@lysator.liu.se>
+ 
+ 	* diary-ins.el: Require diary-lib, not diary.
+ 	* diary-lib.el: Provide diary-lib not diary.
+ 
+ Sun Aug 28 00:14:20 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* files.el (after-find-file-from-revert-buffer): Add defvar.
+ 
+ 	* gud.el (dbx): Use newline, not semicolon, between file and stop cmds.
+ 
+ Sat Aug 27 15:02:55 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* outline.el (outline-mode-prefix-map): New variable.
+ 	Define all the C-c commands here.
+ 	(outline-mode-menu-bar-map): New variable, holds local menu-bar keymap.
+ 	(outline-mode-map): Bind C-c and menu-bar to those maps.
+ 	(outline-minor-mode-map): Likewise use those submaps for the prefixes.
+ 
+ 	* indent.el (indent-rigidly): Insert new indent, then delete old.
+ 
+ 	* comint.el (comint-arguments): Treat \n and \t like space.
+ 
+ Fri Aug 26 02:54:44 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* simple.el (set-mark): When POS is nil, always clear mark-active.
+ 
+ 	* rmailsum.el (rmail-summary-output-menu): New command.
+ 	(rmail-summary-mode-map): Add Output and Input with menu of files.
+ 
+ Thu Aug 25 01:34:59 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* vc.el (vc-backend-checkout): Don't use -G for SCCS.
+ 
+ 	* rot13.el (toggle-rot13-mode): New function.
+ 
+ 	* rmailsum.el (rmail-summary-rmail-update):
+ 	Check whether rmail-buffer is dead.
+ 
+ Wed Aug 24 21:51:39 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* etags.el (tags-table-extend-computed-list): In loop processing
+ 	list of included tables to incorporate it, advance TABLES to its
+ 	cdr at end of loop.
+ 
+ Wed Aug 24 00:48:02 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* files.el (find-file-noselect): Improve "file changed" message.
+ 
+ 	* comint.el (comint-arguments): Rewrite for speed.
+ 	Don't keep parsing once we have enough args.
+ 
+ 	* ispell.el (ispell-buffer-local-words): Don't treat doublequote
+ 	specially when splitting the line into words.
+ 
+ 	* mouse-sel.el (mouse-extend): In Transient Mark mode, use the region
+ 	whenever it is active.
+ 
+ Tue Aug 23 20:55:18 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* simple.el (shell-command-on-region): Don't delete current buffer.
+ 
+ Tue Aug 23 12:31:47 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* simple.el (backward-delete-char-untabify): Doc fix.
+ 
+ 	* lpr.el (lpr-headers-switches): Don't use -p on dgux, irix.
+ 
+ 	* edebug.el (edebug-read-and-maybe-wrap-form): Increment
+         max-specpdl-size by 2000.
+ 
+ 	* jka-compr.el (jka-compr-insert-file-contents): Run the
+ 	after-insert-file-functions.
+ 
+ 	* rmail.el (rmail-ignored-headers): Split string constant into lines.
+ 
+ Sun Aug 21 13:24:32 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* term/news.el (news-fkey-prefix): Use kp-decimal, not kp-period.
+ 
+ 	* rnews.el (news-select-message): Do most of the work
+ 	even for nonexistent article.  (Code copied from 18.59).
+ 
+ Fri Aug 19 00:37:37 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* rmail.el (rmail-retry-failure, mail-unsent-separator): Doc fix.
+ 
+ 	* rnews.el (news-mode): Don't set mode-name to a list.
+ 	Use mode-line-process instead.
+ 
+ 	* rot13.el (rot13-other-window): Doc fix.
+ 
+ 	* lpr.el (lpr-command, lpr-headers-switches): Undo previous change.
+ 
+ Thu Aug 18 17:02:47 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* window.el (split-window-horizontally): If size is negative,
+ 	measure from the right.
+ 
+ Wed Aug 17 16:29:27 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* info.el (Info-mode): Doc fix.
+ 
+ 	* lpr.el (lpr-command, lpr-headers-switches): Treat Solaris like BSD.
+ 
+ 	* paren.el (show-paren-command-hook): Set the face of an overlay
+ 	each time we move it somewhere.
+ 
+ 	* files.el (after-find-file):
+ 	New arg after-find-file-from-revert-buffer.
+ 	(revert-buffer): Pass t for that.
+ 
+ 	* simple.el (choose-completion-string): Use plain exit-minibuffer,
+ 	not minibuffer-complete-and-exit.  And do so only if the minibuffer
+ 	was doing completion.
+ 
+ 	* tex-mode.el (tex-mode): Allow for documentclass options
+ 	when checking for SliTeX.
+ 
+ Wed Aug 17 19:51:28 1994  Lawrence R. Dodd  <dodd@roebling.poly.edu>
+ 
+ 	* vc.el (vc-admin): Pass nil instead of
+ 	vc-checkout-writable-buffer-hook to vc-start-entry.
+ 
+ Tue Aug 16 21:45:27 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* perl-mode.el (perl-indent-command): Fix backwards conditional.
+ 
+ Sun Aug 14 00:09:16 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* rmailsum.el (rmail-summary-scroll-msg-up): Put rmail buffer
+ 	on the screen if necessary--but don't scroll in that case.
+ 
+ 	* rmail.el (rmail-resend): Preserve point around expand-mail-aliases.
+ 
+ 	* easymenu.el (easy-menu-define): Doc fix.
+ 
+ Sat Aug 13 13:34:59 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* cmacexp.el (c-macro-expansion): If the CPP output is empty, just
+         show error messages.
+ 
+ 	* mouse.el (mouse-set-mark): Select the window before saving point.
+ 
+ 	* iso-cvt.el (iso-tex2iso-trans-tab): Put the sequences with braces
+ 	before corresponding ones without.  Escape ? in patterns.
+ 	(iso-translate-conventions): Don't widen.
+ 	(iso-german-tex-p): Preserve narrowing.
+ 
+ 	* rmail.el (rmail-maybe-display-summary): If summary is in some frame,
+ 	just use that.
+ 
+ Fri Aug 12 00:49:35 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* rmail.el (rmail-retry-failure): Narrow to just the old header
+ 	for calling mail-fetch-field.
+ 
+ Thu Aug 11 03:10:33 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* compile.el (compilation-set-window-height): Add save-excursion.
+ 
+ 	* rmail.el (rmail-maybe-display-summary): Don't set summary window
+         height if its frame isn't split.
+ 
+ 	* subr.el (one-window-p): Doc fix.
+ 
+ 	* frame.el (frame-notice-user-settings): If we change the frame's font,
+ 	call frame-update-faces.
+ 
+ Wed Aug 10 22:41:58 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* paren.el (show-paren-command-hook): Cope if matching-paren gives nil.
+ 
+ Wed Aug 10 19:34:45 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* etags.el (tags-table-including): Inside loop: if CORE-ONLY skip
+ 	all consecutive tables not in core; else extend computed list.
+ 
+ Wed Aug 10 16:21:31 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* gnus.el (gnus-summary-mode-map): Delete unusable `Sort Summary' item.
+ 
+ Wed Aug 10 04:39:22 1994  Erik Naggum  <erik@naggum.no>
+ 
+ 	* rmail.el (rmail-forward): Anchor `mail-header-separator' on both
+ 	sides to match whole line, not just initial substring.
+ 
+ Wed Aug 10 00:07:36 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* help.el (view-lossage): Handle buffers and frames in recent-keys.
+ 
+ Wed Aug 10 00:48:50 1994  Michael Kifer  (Michael Kifer <kifer@cs.sunysb.edu>)
+ 
+ 	* ediff.el (ediff-find-file, ediff-patch-file): Handle symlinks.
+ 
+ 	* ediff.el (ediff-save-buffer): Added option for saving diff output.
+ 
+ 	* ediff.el (ediff-fine-diff-buffer, ediff-ignore-similar-regions):
+ 	New variables.
+ 	(ediff-no-fine-diffs): Macro added.
+ 	(ediff-next-difference, ediff-previous-difference)
+ 	(ediff-make-fine-diffs): Enabled a new feature that allows one to
+ 	skip over the difference regions where the only differences are
+ 	the white space and newlines.
+ 	(ediff-toggle-autorefine): Fixed a bug that caused error when the
+ 	current difference is <= 0 or > ediff-number-of-differences.
+ 
+ Tue Aug  9 19:16:26 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* menu-bar.el (menu-bar-file-menu): Compare Files renamed to Compare.
+ 	(menu-bar-ediff-menu): Add one element for compare-windows.
+ 
+ 	* appt.el: Require calendar.
+ 
+ Tue Aug  9 14:49:17 1994  Michael D. Ernst  <mernst@research.microsoft.com>
+ 
+ 	* rmailedit.el (rmail-abort-edit): Call `rmail-highlight-headers'.
+ 
+ Tue Aug  9 01:41:58 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* mailalias.el (define-mail-alias): Avoid error if DEFINITION is "".
+ 
+ 	* appt.el (appt-check): Update on first wakeup after midnight
+ 	even if that's not precisely 12:01.
+ 
+ Mon Aug  8 00:38:11 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* mouse.el (mouse-drag-mode-line): New function (from mldrag.el,
+ 	but changed a little).  Put it on mode-line down-mouse-1.
+ 	(mouse-select-window): Bind to mode-line drag-mouse-1.
+ 
+ 	* info.el (Info-last-menu-item): Fix gross logic errors.
+ 	(Info-last-preorder): After going thru menu item, go to end.
+ 	(Info-scroll-up): Set window-start if it's out of range.
+ 	Once menu start is on or above screen, start using menu items.
+ 	(Info-scroll-down): Set window-start if it's out of range.
+ 	If there's a menu item, always use menu.
+ 
+ 	* sendmail.el (mail-alias-file): Add autoload cookie.
+ 
+ 	* mouse.el (x-fixed-font-alist): Add clean 5x8 and clean 6x8.
+ 
+ 	* compile.el (compilation-set-window-height): New function,
+ 	broken out from compile-internal.
+ 	Don't change window height if it is the frame root window.
+ 	(compile-internal): Call it.
+ 	(compilation-goto-locus): Call it.
+ 	Use any visible frame already showing the compilation buffer.
+ 
+ 	* gnus.el (gnus-start-news-server): Fix the call to `error'.
+ 
+ Sun Aug  7 02:47:33 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* info.el (Info-additional-directory-list): New variable.
+ 	(Info-find-node): Use it.
+ 
+ 	* faces.el (copy-face): Ignore errors in set-face-font.
+ 
+ 	* mouse.el (mouse-choose-completion): Pass completion-base-size value
+ 	to choose-completion-string.
+ 
+ 	* simple.el (completion-base-size): New variable.
+ 	(completion-list-mode): Make it local.
+ 	(choose-completion): Pass its value to choose-completion-string.
+ 	(choose-completion-string): New arg base-size.
+ 	Use that when deciding how much to delete.
+ 
+ 	* complete.el (PC-do-completion): Set completion-base-size.
+ 
+ 	* cmacexp.el: Doc fixes.
+ 	(c-macro-expansion): Capture and display CPP error messages.
+ 
+ 	* tex-mode.el (tex-mode): Accept documentclass when checking Slitex.
+ 
+ Sat Aug  6 00:45:19 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* gnus.el: Require timezone when loading this file.
+ 	Move the provide call to the end.
+ 
+ 	* c-mode.el (indent-c-exp): Preserve point when handling comments.
+ 
+ 	* byte-opt.el (byte-after-unbind-ops): Fix paren error wrt doc string.
+ 
+ 	* font-lock.el (font-lock-hack-keywords): Delete debugging code.
+ 
+ Fri Aug  5 12:46:53 1994  Erik Naggum  <erik@naggum.no>
+ 
+ 	* simple.el (choose-completion): Bury or iconify the completion list
+ 	using code copied from mouse-choose-completion.
+ 
+ Fri Aug  5 22:58:12 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* tex-mode.el (tex-mode): Check for documentclass like documentstyle.
+ 
+ 	* info.el (Info-directory-list): Doc fix.
+ 
+ Fri Aug  5 03:53:56 1994  Erik Naggum  <erik@naggum.no>
+ 
+ 	* files.el (save-buffer): Unconditionally make a backup with 2 or
+ 	3 C-u's even if make-backup-files is nil.
+ 
+ Fri Aug  5 14:56:12 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* mouse.el (x-fixed-font-alist): Regularize how fonts are specified.
+ 
+ 	* time.el (display-time-filter): pm starts at 12, not 13.
+ 
+ Fri Aug  5 03:42:04 1994  Hans Chalupsky  (hans@hydra.cs.Buffalo.EDU)
+ 
+ 	* advice.el (ad-subr-arglist): Adapted to new DOC file format.
+ 
+ Fri Aug  5 00:27:57 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* etags.el (select-tags-table): Doc fix.
+ 
+ 	* font-lock.el (font-lock-syntax-table): New syntax table.
+ 	(font-lock-hack-keywords): Use it temporarily here.
+ 	(font-lock-set-defaults): Set up special syntax table for C and C++.
+ 
+ Thu Aug  4 01:43:39 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* isearch.el (isearch-mode-map): Delete mouse-2, down-mouse-2 bindings.
+ 
+ 	* rmail.el (rmail-select-summary): Preserve rmail buffer's value of
+ 	rmail-total-messages even while summary buffer is current.
+ 
+ 	* gnus.el: Doc fixes.
+ 
+ 	* frame.el (frame-delete-all): Copy the whole alist first.
+ 
+ 	* hilit19.el (hilit-find-file-hook): Preserve buffer modified state.
+ 
+ 	* simple.el (end-of-buffer-other-window):
+ 	Go to the end, not to the beginning.
+ 
+ 	* appt.el (appt-make-list): Do nothing unless range being processed
+ 	for diary entries includes today's date.
+ 
+ Wed Aug  3 23:27:05 1994  Hans Chalupsky  (hans@hydra.cs.Buffalo.EDU)
+ 
+ 	* bytecomp.el (byte-compile-protect-from-advice): Macro deleted.
+ 	(byte-compile-from-buffer, byte-compile-top-level): Don't use it.
+ 
+ 	* advice.el: New handling of automatic advice activation that
+ 	exploits modified built-in versions of `fset' and `defalias' which
+ 	take care of this functionality directly:
+ 	(ad-start-advice-on-load, ad-activate-on-definition)
+ 	(ad-definition-hooks, ad-enable-definition-hooks, ad-defined-function)
+ 	(ad-advised-definers, ad-advised-byte-compilers, byte-constant)
+ 	(byte-constant-limit, byte-constant2, byte-fset)
+ 	(ad-byte-code-fset-regexp): Variables deleted.
+ 	(ad-activate-defined-function, ad-find-fset-in-byte-code)
+ 	(ad-scan-byte-code-for-fsets, ad-advised-byte-code)
+ 	(ad-recover-byte-code, ad-enable-definition-hooks)
+ 	(ad-disable-definition-hooks): Functions deleted.
+ 	(defun, defmacro, fset, defalias, define-function)
+ 	(byte-compile-from-buffer, byte-compile-top-level): Removed `defadvice'
+ 	for these functions.
+ 	(ad-save-real-definitions): Removed saving of `byte-code'.
+ 	(ad-activate-off): New dummy function.
+ 	(ad-activate-on): New name for `ad-activate'.  All calls changed.
+ 	(ad-with-auto-activation-disabled): New macro prevents automatic
+ 	advice activation.
+ 	(ad-safe-fset): New function, used instead of `ad-real-fset'.
+ 	(ad-compile-function): Disable automatic advice activation while
+ 	compiling, because `byte-compile' uses `fset'.
+ 	(ad-activate-on): Renamed from `ad-activate'.  Avoid recursive calls.
+ 	(ad-activate-on-top-level): New variable.
+ 	(ad-start-advice, ad-stop-advice, ad-recover-normality): Modified to
+ 	achieve de/activation of automatic advice activation by setting the
+ 	definition of `ad-activate' to `ad-activate-on' or `ad-activate-off'.
+ 	(ad-start-advice): Is now called unconditionally when Advice is loaded.
+ 
+ 	Made compilation behavior of advised definitions customizable, since
+ 	loading the byte-compiler takes some time and is not always worth the
+ 	cost, e.g., if one only wants to make a few simple modifications:
+ 	(ad-default-compilation-action): New variable which specifies whether
+ 	to compile an advised definition in case the COMPILE argument to
+ 	`ad-activate-on' or one of its friends was supplied as nil.
+ 	(ad-preactivate-advice): Supply negative COMPILE argument to prevent
+ 	compilation.
+ 	(ad-should-compile): New function.
+ 	(ad-activate-advised-definition): Use `ad-should-compile' to determine
+ 	whether an advised definition should get compiled.
+ 	(ad-activate-on, ad-update, ad-activate-regexp, ad-update-regexp)
+ 	(ad-activate-all): Doc fixes.
+ 	(ad-update): Leave handling of COMPILE up to `ad-activate-on'.
+ 
+ 	Extracted construction of freeze-advices from `defadvice':
+ 	(ad-make-freeze-definition): New function.
+ 	(defadvice): Use `ad-make-freeze-definition' to construct frozen defs.
+ 
+ Wed Aug  3 16:41:06 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* gnus.el (gnus-kill-files-directory): New variable.
+ 	(gnus-Newsgroup-kill-file, gnus-newsgroup-kill-file): Use it.
+ 
+ 	* dired.el (dired-mode): Put expanded name in list-buffers-directory.
+ 
+ 	* icomplete.el (icomplete-prime-minibuffer): Copy the hook lists
+ 	after making them local.
+ 
+ 	* gnus.el (gnus): Require timezone.  Delete timezone autoloads.
+ 
+ 	* iso-cvt.el (iso-fix-iso2tex, iso-fix-tex2iso): Check plain-text-mode.
+ 
+ Tue Aug  2 22:17:21 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* sh-script.el (auto-mode-alist): Fix typos in comments.
+ 
+ Tue Aug  2 17:58:24 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* mouse.el: Capitalize some error messages.
+ 	(mouse-set-point): Nice error if button release is in scrollbar.
+ 
+ Tue Aug  2 11:43:33 1994  Frederic Pierresteguy  (F.Pierresteguy@frcl.bull.fr)
+ 
+ 	* compile.el: Set up a "Compile" menubar item.
+ 	(recompile): New function.
+ 	(previous-error): New function.
+ 	(first-error): New function.
+ 
+ Tue Aug  2 00:57:41 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* frame.el (frame-delete-all): New function.
+ 	(frame-notice-user-settings): Call it--with or without separate
+ 	minibuffer frame.
+ 
+ Mon Aug  1 00:40:54 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* rmailsum.el (rmail-summary-mode-map): Fix the Get New Mail entry.
+ 	Fix typo.  Add `...' where appropriate.
+ 
+ 	* rmail.el (rmail-mode-map): Fix the Get New Mail entry.
+ 	Add `...' where appropriate.
+ 
+ 	* ediff.el (ediff-version): Function, variable deleted.
+ 	(ediff-date): Var deleted.
+ 	(ediff-status-info): Don't call ediff-version.
+ 
+ 	* dired.el (dired-insert-directory): Call expand-file-name here
+ 	because the dir name may have been abbreviated before.
+ 
+ Sun Jul 31 21:25:27 1994  Morten Welinder  (terra@diku.dk)
+ 
+ 	* ls-lisp.el (insert-directory): Gracefully handle the case
+ 	where a file disappears between it is listed in the directory
+ 	and the attributes are requested.
+ 
+ Sun Jul 31 01:30:57 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* compile.el (compilation-error-regexp-alist): Fix previous change.
+ 	Add alternatives for GNU error messages with program name in them.
+ 
+ 	* time.el (display-time-string-forms): New variable.
+ 	(display-time-filter): Simplify to use it.
+ 
+ 	* dired.el (dired-noselect): Call abbreviate-file-name here.
+ 	(dired-internal-noselect): Not here.
+ 
+ 	* comint.el (comint-password-prompt-regexp): Handle PGP prompt.
+ 
+ 	* gnus.el (gnus-sortable-date): Use timezone-make-time-string.
+ 
+ 	* rmail.el (rmail-retry-failure): Handle a weird case with
+ 	a couple of lines before the old message header.
+ 
+ 	* compile.el (compilation-error-regexp-alist): Make separate
+ 	regexp for Borland C++; the combined one matched too much.
+ 
+ 	* ange-ftp.el (ange-ftp-parse-netrc-group): Don't move back to line
+ 	beginning.  Skip the machine name whatever it may be.
+ 	(ange-ftp-parse-netrc): Skip initial whitespace.
+ 
+ 	* sendmail.el (sendmail-send-it): Handle resent-to specially.
+ 
+ 	* mouse-sel.el (mouse-extend): Pass WINDOW arg to mouse-scroll-subr.
+ 
+ 	* rmailsum.el (rmail-summary-mode-map): Add Get New Mail item.
+ 	Move new Re-send menu item to right place.
+ 
+ 	* rmail.el (rmail-mode-map): Move new Re-send menu item to right place.
+ 
+ Sat Jul 30 17:19:59 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* hilit19.el: Specify patterns for objc-mode.
+ 
+ Sat Jul 30 08:55:26 1994  Martin Boyer  <mboyer@ireq-robot.hydro.qc.ca>
+ 
+ 	* menu-bar.el (menu-bar-enable-clipboard): Moved here the
+ 	clipboard function key bindings.
+ 
+ Sat Jul 30 13:47:16 1994  Michael D. Ernst  <mernst@research.microsoft.com>
+ 
+ 	* ispell.el (ispell-message-text-end): Improve context diff regexp.
+ 
+ Sat Jul 30 03:43:09 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* rmailsum.el (rmail-new-summary): If just one window,
+ 	put the summary in the upper window and Rmail buffer below.
+ 
+ Sat Jul 30 11:34:43 1994  Ake Stenhoff (etxaksf@aom.ericsson.se)
+ 
+ 	* imenu.el (imenu, imenu--flatten-index-alist): Add marker support.
+ 	(imenu--cleanup): New function.
+         (imenu-example--name-and-position): Now uses markers.
+ 
+         * imenu.el (imenu-add-to-menubar): New function to add an entry
+ 	to the menubar for the buffer's current local keymap.
+ 
+ Fri Jul 29 15:59:47 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* rmail.el (rmail-highlight-face): New variable.
+ 	(rmail-highlight-headers): Use it if non-nil.
+ 
+ 	* gnus.el (gnus-group-suspend): Be sure to bury the right buffer.
+ 
+ 	* hideif.el (hide-ifdefs): Doc fix.
+ 
+ Fri Jul 29 14:52:10 1994  Frederic Pierresteguy  (F.Pierresteguy@frcl.bull.fr)
+ 
+ 	* rmail.el (rmail-display-summary): New variable.
+ 	(rmail): Call rmail-summary at the end if rmail-display-summary is
+ 	set.
+ 
+ 	* rmail.el (rmail-mode-map): Add Re-send menu item.
+ 	* rmailsum.el (rmail-summary-mode-map): Add Re-send menu item.
+ 
+ Thu Jul 28 20:44:04 1994  Andreas Schwab  <schwab@ls5.informatik.uni-dortmund.de>
+ 
+ 	* simple.el (choose-completion): Check for
+ 	next-single-property-change returning nil.
+ 	* mouse.el (mouse-choose-completion): Dito.
+ 
+ Thu Jul 28 02:22:24 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* files.el (file-truename): Temporarily get rid of the
+ 	ange-ftp completion handler.
+ 
+ 	* info.el (Info-find-node): Use a loop instead of mapcar and catch.
+ 
+ 	* buff-menu.el (buffer-menu): Undo previous change.
+ 	Instead, save the point value that list-buffers set up
+ 	and go back there after switching windows.
+ 
+ Wed Jul 27 13:49:32 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* faces.el (face-initialize): Use underlining for region face
+ 	if there's no gray.
+ 	(face-try-color-list): Support `underline' in color list.
+ 
+ 	* fill.el (justify-current-line): Delete space at end of line.
+ 
+ 	* files.el (set-auto-mode): Shorten scope of case-fold-search binding.
+ 
+ 	* files.el (cd-absolute): Call file-name-as-directory first thing.
+ 
+ 	* compile.el (compilation-error-regexp-alist): Fix bug in Borland
+ 	C++ change.  Make first regexp reject cases that give column
+ 	numbers.  Add new regexp for GNU format with column numbers.
+ 
+ Tue Jul 26 11:51:32 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* mail-extr.el (what-domain): Doc fix.
+ 
+ 	* files.el (basic-save-buffer-1): Ignore file-precious-flag
+ 	if the file's dir is not writable.
+ 
+ 	* forms.el (forms--update): Undo change made mistakenly.
+ 
+ 	* vc.el (vc-next-action): Even in 1-file case, get its name from FILES.
+ 	(vc-finish-logentry): Don't do vc-buffer-sync on the parent buffer
+ 	when hat parent buffer is a dired buffer.
+ 
+ 	* menu-bar.el (menu-bar-update-buffers):
+ 	Use (current-global-map), not global-map.
+ 
+ 	* compile.el (compilation-next-error-locus): New arg SILENT.
+ 
+ 	* dissociate.el (dissociated-press): Error at start if buffer is empty.
+ 
+ 	* ediff.el: Made menu bar's autoloaded stuff conditional on
+ 	purify-flag, to avoid error message when loading ediff in a frame
+ 	that has no menu bar.
+ 
+ Tue Jul 26 16:24:25 1994  Michael Kifer  (kifer@sbkifer)
+ 
+ 	* ediff.el (ediff-setup): Improved mode-line-buffer-identification.
+ 	Now accommodates buffer identifications generated by
+ 	mode-line.el and uniquify.el.
+ 
+ 	* ediff.el (ediff-current-diff-face-A/B,
+ 	ediff-fine-diff-face-A/B,ediff-odd/even-diff-face-A/B):
+ 	Variables changed to contain face names
+ 	instead of face internal representation.
+ 
+ Mon Jul 25 20:55:46 1994  Johan Vromans  (jv@squirrel.NL.net)
+ 
+ 	* forms.el (forms-read-file-filter): new hook function to
+ 	preprocess file contents before being passed to forms mode.
+ 	(forms-write-file-filter): new hook function to preprocess file
+ 	contents before it is being saved to disk. Can be used to undo the
+ 	effects of `forms-read-file-filter'.
+ 	(forms-mode): Supply a default format if no `forms-format-list' was
+ 	specified.
+ 	Preprocess file contents using `forms-read-file-filter' and attach
+ 	`forms-write-file-filter' to the `local-write-file-hooks' of the file
+ 	buffer.
+ 	Present a friendly message if the visited file is empty or new.
+ 	(forms--intuit-from-file): New subroutine to get the number of fields
+ 	from the data file; constructs a default format list.
+ 	(forms-save-buffer): Forms mode wrapper for `save-buffer'.
+ 	(forms--change-commands, forms--exit): Use it.
+ 	(forms--update): Check for the presence of the field separator in any
+ 	of the fields.  Refuse update if found.
+ 	(forms-delete-record): Allow the last record of the file to be
+ 	deleted, even if not terminated by a newline.
+ 	(forms--local-write-file-function): Remove.  Didn't do any good.
+ 	Replaced by `forms-save-buffer'.
+ 
+ 	* forms-d2.el: Use `forms-new-record-filter' variable instead of
+ 	defining the function.
+ 
+ Mon Jul 25 17:45:22 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* startup.el (command-line-args-left): Add defvar.
+ 
+ Sun Jul 24 22:16:58 1994  Andreas Schwab  <schwab@ls5.informatik.uni-dortmund.de>
+ 
+ 	* comint.el (comint-dynamic-list-completions): Listify the key
+ 	sequence to be put back.
+ 
+ Sun Jul 24 15:57:12 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* lisp-mode.el (emacs-lisp-mode-syntax-table): Give RET the
+ 	same syntax as newline.
+ 	* cplus-md.el (c++-mode-syntax-table): Likewise.
+ 
+ 	* vc.el (vc-finish-logentry): Use vc-parent-buffer to find the buffer
+ 	to offer to save.
+ 
+ 	* gud.el (dbx): Use system-configuration, not system-type.
+ 
+ Sun Jul 24 01:53:22 1994  Erik Naggum  <erik@naggum.no>
+ 
+ 	* dired.el (dired-internal-noselect): a zero modtime means
+ 	directory is unchanged.
+ 
+ Sat Jul 23 17:11:48 1994  David Robinson  (drtr@mail.ast.cam.ac.uk)
+ 
+ 	* term/x-win.el (system-key-alist): Add Sun-specific X11R6 keysyms.
+ 
+ 	* menu-bar.el: Add to global key map for cut, paste & copy keys.
+ 
+ Sun Jul 24 01:30:54 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* mail-extr.el (mail-extr-all-top-level-domains): Update a few
+ 	long names.
+ 
+ 	* menu-bar.el (menu-bar-update-buffers): If Buffers item is gone,
+ 	don't bring it back.
+ 
+ Sat Jul 23 21:07:03 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* ispell4.el (ispell-tex-buffer-p): Write names in lower case.
+ 	Add slitex-mode.
+ 
+ 	* simple.el (line-move, next-line): Check last line moved over
+ 	has a newline, in a way that intangible text does not confuse.
+ 
+ Sat Jul 23 14:18:38 1994  enami tsugutomo  <enami@sys.ptg.sony.co.jp>
+ 
+ 	* lisp/add-log.el (add-log-current-defun): Skip doc string
+ 	  correctly even if it ends with line that starts space.
+ 
+ Fri Jul 22 16:43:48 1994  Ed Reingold  <reingold@albert.gnu.ai.mit.edu>
+ 
+         * cal-menu.el (calendar-mode-map): Change reference from renamed
+         calendar-current-month to calendar-goto-today.
+ 
+ Wed Jul 20 15:24:52 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* dired.el (dired-between-files): Ignore dired-subdir-regexp
+ 	if we can move to the file name on the line.
+ 
+ 	* dired.el (dired-internal-noselect): Don't revert, just suggest `g'.
+ 
+ Wed Jul 20 22:23:29 1994  Ethan Bradford  (ethanb@ptolemy.astro.washington.edu)
+ 
+ 	* ispell.el (ispell-command-loop, ispell-region, ispell-word):
+ 	Only pop up the choices window if an error is found in the region.
+ 	Don't change the size of the choices window except as needed.
+ 	Don't (sit-for 0) at the start of ispell-region (i.e. don't force
+ 	redisplay at the start of the region).
+ 	(ispell-overlay-window): Small documentation fix.
+ 
+ Wed Jul 20 10:02:57 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* etags.el (visit-tags-table-buffer): Bind a variable
+ 	local-tags-file-name with the value of tags-file-name before
+ 	calling tags-verify-table, which switches buffers; change all
+ 	references to use local-tags-file-name.  Save current buffer
+ 	before that call and on error, switch back before killing local
+ 	value of tags-file-name.
+ 
+ Wed Jul 20 00:08:39 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* imenu.el (imenu-choose-buffer-index): Use last-nonmenu-event
+ 	to decide on mouse vs non-mouse.
+ 	(imenu-progress-message): New arg prevpos.  All callers changed.
+ 	Don't print messages too frequently.
+ 
+ 	* byte-opt.el (byte-decompile-bytecode-1): Don't add pc values
+ 	if make-spliceable is non-nil.  (Arg renamed from make-splicable.)
+ 
+ 	* disass.el (disassemble-1): Display the pc values.
+ 	(disassemble-column-1-indent): Increase to 8.
+ 
+ 	* byte-opt.el (byte-decompile-bytecode-1):
+ 	Put a pc value before each insn in the list we return.
+ 
+ Tue Jul 19 16:00:10 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* ediff.el (Emacs 19 menu setup): Move back to top level
+ 	and do it only if purify-flag.
+ 
+ 	* vc.el: At compile time, require dired.
+ 	(vc-finish-logentry): Use the proper files buffer for vc-buffer-sync.
+ 
+ 	* compile.el (compilation-error-regexp-alist): Allow `(' after
+ 	linenum in "FILE", line LINENUM.  Add backslash so C-M-a works.
+ 
+ Tue Jul 19 02:38:56 1994  Michael Kifer  (kifer@cs.sunysb.edu)
+ 
+     	* ediff.el (ediff-find-file, ediff-files-internal, ediff-patch-file):
+ 	Modified to work with remote and compressed files.
+ 
+ 	* ediff.el (ediff-read-file-name, ediff-buffers): Better defaults.
+ 	(ediff-read-file-name) Handle OS/2.
+ 
+ 	* ediff.el (ediff-forward-word-function) New function.
+ 	(ediff-wordify-function): Variable deleted.
+ 	(ediff-toggle-regexp-match, ediff-hide-regexp-matches): New functions.
+ 	(ediff-focus-on-regexp-matches): New function.
+ 	(ediff-status-info): New function.
+ 	(ediff-file-names, ediff-line-numbers): Functions deleted.
+ 
+ Mon Jul 18 14:03:30 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* mh-e.el (mh-folder-mode): Use local-write-file-hooks.
+ 
+ Mon Jul 18 09:39:49 1994  Barry A. Warsaw  (warsaw@anthem.nlm.nih.gov)
+ 
+ 	* reporter.el (reporter-dump-state, reporter-submit-bug-report):
+ 	Don't print package name if pkgname is nil.  Don't dump state if
+ 	varlist is nil.
+ 
+ 	* reporter.el (reporter-bug-hook, reporter-submit-bug-report)
+ 	(reporter-calculate-separator, reporter-initial-text):
+ 	New or modified functions and variables attempting to prohibit
+ 	submission of empty bug reporters.
+ 
+ 	* reporter.el: (reporter-prompt-for-summary-p): Default value now nil.
+ 
+ 	* reporter.el (reporter-dump-state): Make sure there's a final
+ 	newline after the setq sexp.
+ 	Pass mail buffer as second arg to print fcn.
+ 	Use symbol-value to get varsym's value.
+ 
+ 	* reporter.el (reporter-dump-variable): Handle long sexp's even
+ 	after entering newline.  Done by filling current line.
+ 	Much better pretty printing of long lists!!
+ 	Handle void variables.
+ 
+ 	* reporter.el (reporter-version): New variable.
+ 
+ 	* reporter.el (reporter-submit-bug-report-internal): Leave point
+ 	after the salutation.
+ 
+ 	* reporter.el (reporter-submit-bug-report): Prompt for a subject.
+ 
+ Mon Jul 18 03:26:04 1994  Karl Fogel  (kfogel@phylo.life.uiuc.edu)
+ 
+         * mail-hist.el: Make sure that headers are case-insensitive.
+           Upped version to 1.3.
+ 
+ Sun Jul 17 19:55:40 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* forms.el (forms-delete-record): Handle deletion of last line
+ 	when it has no terminating newline.
+ 
+ Sat Jul 16 15:29:29 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* mouse.el ([vertical-line C-mouse-2]): Bind it as in a scroll bar.
+ 
+ 	* comint.el (comint-mode-map): Move comint-bol to C-c C-a.
+ 
+ 	* calendar.el (calendar-goto-today):
+ 	Renamed from calendar-current-month.
+ 
+ 	* add-log.el (add-change-log-entry): Use <...> around mail address.
+ 
+ 	* help.el (print-help-return-message): If help buffer is a
+ 	special display buffer, say nothing about how to switch back.
+ 
+ 	* help-macro.el (make-help-screen): Handle case where *Help* comes
+ 	up in a separate frame.
+ 
+ Fri Jul 15 00:30:53 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* sh-script.el: "Comment out" autoload cookies.
+ 
+ 	* mouse.el (mouse-drag-region): Delete redundant switch-frame clause.
+ 	(mouse-drag-secondary): Likewise.
+ 
+ 	* sendmail.el (mail-mailer-swallows-blank-line): Verify sendmail.cf
+ 	exists before reading it.
+ 
+ Thu Jul 14 18:48:16 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* files.el (rmail-output-file-alist): Mark it risky.
+ 
+ Wed Jul 13 18:56:52 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* help-macro.el (make-help-screen): Bind overriding-local-map
+ 	just for short sections of code.
+ 
+ Wed Jul 13 13:19:39 1994  Noah Friedman  (friedman@prep.ai.mit.edu)
+ 
+         * rsz-mini.el: (resize-minibuffer-setup): Copy post-command-hook
+         when handling minibuffer windows in other frames, not just
+         minibuffer-exclusive frames.
+         Resize the minibuffer window/frame now, in case it has already
+         been initialized with text.
+ 
+ Wed Jul 13 11:14:15 1994  Ed Reingold  (reingold@albert.gnu.ai.mit.edu)
+ 
+         * diary-lib.el: Correct file name on last line of file.
+ 
+ Wed Jul 13 00:02:56 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* rmail.el (rmail-movemail-program): New variable.
+ 	(rmail-insert-inbox-text): Use it.
+ 
+ 	* files.el (insert-directory): Fix previous change.
+ 
+ Tue Jul 12 08:14:43 1994  enami tsugutomo  (enami@sys.ptg.sony.co.jp)
+ 
+ 	* vc.el (vc-finish-logentry): Use the value of
+ 	vc-log-after-operation-hook of *VC-log* buffer instead of
+ 	vc-parent-buffer.
+ 
+ Tue Jul 12 00:08:25 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* rmail.el (rmail-mode-map): Fix previous change.
+ 
+ 	* menu-bar.el (menu-bar-file-menu): Add insert-file menu item.
+ 
+ 	* gnus.el: Clean up menu item string format.
+ 	Add a few menu items and separators.
+ 	(gnus-mouse-pick-group): New function, on mouse-2 in Group mode.
+ 	(gnus-mouse-pick-article): New function, on mouse-2 in Summary mode.
+ 
+ 	* rsz-mini.el (resize-minibuffer-setup):
+ 	Copy the value of post-command-hook.
+ 
+ 	* mouse-sel.el: Many doc fixes.
+ 	(mouse-extend): Don't use existing region if EVENT is nil.
+ 
+ 	* mouse.el (mouse-drag-secondary): Don't start making an overlay
+ 	when the range is empty.
+ 	(mouse-secondary-save-then-kill):
+ 	The first time, make a new kill ring entry.
+ 
+ 	* ispell4.el (ispell-word): Call ispell-dehighlight.
+ 
+ 	* files.el (insert-directory): Fix prev change.
+ 
+ 	* rmail.el (rmail-mode-map): Add "Get New Mail" menu item under Mail.
+ 
+ 	* compile.el (compilation-next-error-locus): Don't call
+ 	compilation-forget-errors if compilation is still runing.
+ 
+ Mon Jul 11 08:28:42 1994  Erik Naggum  (erik@naggum.no)
+ 
+ 	* buff-menu.el (buffer-menu): Call pop-to-buffer before
+ 	list-buffers.  Don't move point afterwards.
+ 
+ Mon Jul 11 20:40:45 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* prolog.el (prolog-mode-syntax-table): Make newline end comments.
+ 
+ 	* sendmail.el (mail-setup): Insert -- line before .signature file.
+ 
+ 	* dired-aux.el (dired-byte-compile): Use byte-compile-dest-file
+ 	to get the output file name.
+ 
+ 	* subr.el (ignore): Put doc string in right place.
+ 
+ 	* indent.el (move-to-tab-stop): Delete spurious multiple definition.
+ 
+ Mon Jul 11 09:19:55 1994  Kevin Rodgers <kevinr@ihs.com>
+ 
+ 	* mailabbrev.el (define-mail-abbrev): Don't try to parse empty aliases.
+ 
+ Mon Jul 11 20:41:50 1994  Andreas Schwab  (schwab@ls5.informatik.uni-dortmund.de)
+ 
+ 	* backquote.el (backquote-splice-symbol): Doc typo fix.
+ 
+ 	* edebug.el (edebug-install-read-eval-functions): Fix test for
+ 	edebug-read already installed.
+ 
+ 	* hexl.el (hexl-maybe-dehexlify-buffer): New function.
+ 	(hexl-mode): Add it to change-major-mode-hook.
+ 	(hexl-mode-exit): Remove kludge for mode-line update.
+ 	(hexlify-buffer): Doc fix.
+ 
+ Mon Jul 11 00:30:46 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* files.el (insert-directory): Allow list for SWITCHES.
+ 	Also split up a string containing separate options.
+ 
+ 	* lisp.el (lisp-complete-symbol): Bind completion-fixup-function.
+ 
+ 	* mouse.el (mouse-choose-completion): Use mouse-face properties to
+         find string to use.
+ 
+ 	* simple.el (completion-setup-function): Put on mouse-face prop
+ 	even if no window-system.  Call completion-fixup-function if not nil.
+ 	(completion-fixup-function): New variable.
+ 	(choose-completion): Use mouse-face properties to find string to use.
+ 
+ 	* server.el (server-start): Try both possible socket file names
+ 	for the file to delete.
+ 
+ 	* mouse.el (x-fixed-font-alist): Add 8x13.  Don't specify 75-75
+ 	for 7x13, 7x14.
+ 
+ 	* diff.el (diff-latest-backup-file): Cope with backups stored
+ 	in a different directory.
+ 
+ Sun Jul 10 17:32:27 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* etags.el (find-tag-regexp): Bind to C-M-..
+ 
+ Sun Jul 10 13:01:06 1994  Erik Naggum  (erik@naggum.no)
+ 
+ 	* buff-menu.el (Buffer-menu-not-modified): Make
+ 	`Buffer-menu-not-modified' handle an argument like `not-modified'.
+ 
+ 	* info.el (Info-fontify-maximum-menu-size): New variable.
+ 	(Info-fontify-node): Use that variable.
+ 
+ Sat Jul  9 00:15:40 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* faces.el (x-create-frame-with-faces): Don't downcase nil.
+ 
+ 	* loadup.el (current-load-list): Set it to nil.
+ 
+ 	* compile.el (compilation-window-height): Use defvar.
+ 	(compilation-leave-directory-regexp): Likewise.
+ 	(compilation-enter-directory-regexp): Likewise.
+ 
+ 	* loadup.el: If have frames, load `faces'.
+ 
+ 	* man.el (Man-bgproc-sentinel): Bind case-fold-search for just the
+ 	necessary parts of the function, not the call to Man-notify-when-ready.
+ 
+ Fri Jul  8 17:26:21 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* files.el (hack-one-local-variable): Check for root using user-uid.
+ 
+ Thu Jul  7 00:42:03 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* files.el (outline-level): Mark it risky.
+ 
+ 	* version.el (emacs-version): Avoid unnecessary recursive call.
+ 
+ 	* mouse.el ([vertical-scroll-bar C-mouse-2]): Split the window.
+ 
+ 	* version.el (emacs-version): Check x-toolkit with featurep.
+ 
+ 	* gud.el (gud-mips-p): Check for OSF system on Alpha also.
+ 
+ 	* files.el (process-environment, exec-path, load-path,exec-directory):
+ 	Mark these as risky.
+ 	(hack-one-local-variable): Treat vars ending in -program and -command
+ 	as risky.
+ 
+ 	* version.el (emacs-version): Indicate x toolkit usage in value.
+ 
+ 	* files.el (switch-to-buffer-other-frame): Raise the frame.
+ 
+ Wed Jul  6 21:32:45 1994  Michael I Bushnell  (mib@churchy.gnu.ai.mit.edu)
+ 
+ 	* gnus.el (gnus-summary-show-all-threads): Undo previous change.
+ 	(gnus-summary-show-thread, gnus-summary-hide-all-threads)
+ 	(gnus-summary-hide-thread): Likewise.
+ 
+ Wed Jul  6 17:27:14 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* buff-menu.el (Buffer-menu-revert-function): New function.
+ 	(Buffer-menu-mode): Use it, for revert-buffer-function.
+ 	(Buffer-menu-mode-map): Bind revert-buffer.
+ 
+ 	* files.el (revert-buffer-function): Doc fix.
+ 
+ 	* vc.el (vc-start-entry): New arg after-hook.
+ 	Set vc-log-operation-hook locally.
+ 	(vc-next-action-on-file): Not here.
+ 	(vc-admin): Pass new arg.
+ 	(vc-checkin): Pass new arg instead of setting vc-log-operation-hook.
+ 
+ 	* files.el (auto-save-mode): If autosave is off because buffer has
+ 	shrunk, then toggling should turn it on.
+ 
+ 	* tpu-edt.el (tpu-save-all-buffers-kill-emacs):
+ 	Use delete-old-versions, and bind it locally.
+ 
+ 	* completion.el (save-completions-to-file): Use delete-old-versions.
+ 
+ 	* files.el (delete-old-versions):
+ 	Var renamed from trim-versions-without-asking.
+ 
+ Wed Jul  6 16:25:29 1994  Ed Reingold  (reingold@albert.gnu.ai.mit.edu)
+ 
+         * diary-lib.el (fancy-diary-display): Consistently turn off selective
+ 	display in diary buffer before doing anything.
+ 
+ Wed Jul  6 16:10:27 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* outline.el (outline-next-preface): Undo previous change:
+ 	Do stop before final newline.
+ 
+ Wed Jul  6 13:56:23 1994  Morten Welinder  (terra@tyr.diku.dk)
+ 
+ 	* desktop.el (desktop-buffer-rmail): Handle the situation
+ 	where the RMAIL file is locked, mail is waiting, and the
+ 	user selects `quit' gracefully.
+ 
+ Tue Jul  5 18:36:27 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* files.el (set-visited-file-name): Avoid crash if TRUENAME is nil.
+ 
+ Tue Jul  5 17:52:48 1994  Michael I Bushnell  (mib@churchy.gnu.ai.mit.edu)
+ 
+ 	* sendmail.el (mail): Commented out buggy call to
+ 	set-visited-file-name.  (It pukes on a nil argument.)
+ 
+ Tue Jul  5 14:31:57 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* gnusmail.el (gnus-mail-reply-using-mhe): Handle case of no subject.
+ 
+ 	* faces.el (x-create-frame-with-faces): Ignore case in X resource.
+ 	(make-face-x-resource-internal): Test underline attribute as boolean.
+ 
+ 	* files.el (file-truename): Use iteration when possible.
+ 	Avoid recalculating the same truename twice in one invocation.
+ 	Error check for infinite link loop.
+ 
+ 	* files.el (debugger): Mark it a risky-local-variable.
+ 
+ 	* startup.el (command-line): Check LC_ALL and LANG as well as LC_CTYPE.
+ 	(iso-8859-1-locale-regexp): Don't check for `iso'.
+ 
+ 	* paths.el (rmail-spool-directory): Use /var/mail if it exists.
+ 
+ Tue Jul  5 11:44:59 1994  Ed Reingold  (reingold@albert.gnu.ai.mit.edu)
+ 
+         * calendar.el (generate-calendar-month): Make highlighted text for
+         mouse-2 a one character wide for single-digit dates (this undoes
+         the incorrect fix of May 30, 1994).
+ 
+ Mon Jul  4 19:23:56 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* paths.el (rmail-spool-directory): Use /var/mail for bsd386.
+ 
+ 	* startup.el (iso-8859-1-locale-regexp): New variable.
+ 	(command-line): Use it.
+ 
+ Mon Jul  4 16:58:45 1994  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)
+ 
+ 	* add-log.el (add-change-log-entry): Apply expand-file-name to
+         FILE-NAME.
+ 
+ Sun Jul  3 20:47:46 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* mouse.el (mouse-drag-region): Bind this-command like last-command.
+ 	(mouse-kill-ring-save): Bind this-command and last-command.
+ 
+ Sun Jul  3 15:05:04 1994  Richard Stallman  (rms@gnu.ai.mit.edu)
+ 
+ 	* startup.el (command-line): Accept iso-8859-1 like iso_8859_1.
+ 
+ 	* sendmail.el (sendmail-send-it): Allow specifying Sender.
+ 
+ 	* emacsbug.el (report-emacs-bug-hook): Error if user has added no text.
+ 	(report-emacs-bug): Set local report-emacs-bug-orig-text.
+ 	Add to mail-send-hook.  Use mail-send-and-exit for the echo area msg.
+ 
+ 	* frame.el (initial-frame-alist): Doc fix.
+ 
+ 	* startup.el (command-line): Automatically use iso-syntax and
+ 	standard-display-european if LC_CTYPE asks for it.
+ 
+ Sun Jul  3 09:30:57 1994  Ethan Bradford  (ethanb@ptolemy.astro.washington.edu)
+ 
+ 	* gnuspost.el (gnus-inews-news): Allow newsgroups to be separated
+ 	by spaces or commas and spaces.
+ 
+ Set Jul  2 23:00:53 1994  Morten Welinder  (terra@diku.dk)
+ 
+ 	* meese.el: Use add-hook, (provide 'meese).
+ 	(protect-innocence-hook): compare expanded file names for the sake
+ 	of non-unix file systems.  Use expand-file-name instead of concat
+ 	to create "celibacy.1" file name.  Check that the "sex.6" exists.
+ 
+ Sat Jul  2 00:48:54 1994  Richard Stallman  (rms@gnu.ai.mit.edu)
+ 
+ 	* ebuff-menu.el (electric-buffer-list): Change prompt message.
+ 	(electric-buffer-menu-mode-map): Define C-m like space.
+ 
+ 	* sh-script.el (sh-chmod-argument): Change default.
+ 
+ 	* vc.el (vc-update-change-log): Pass a -n option to rcs2log.
+ 
+ Fri Jul  1 12:27:28 1994  Richard Stallman  (rms@gnu.ai.mit.edu)
+ 
+ 	* mouse.el (mouse-scroll-subr): Delete some debugging code.
+ 
+ 	* etags.el (visit-tags-table-buffer):
+ 	Move error call into scope of `file'.
+ 
+ 	* bytecomp.el (byte-compile-defalias): Fix typo in prev change.
+ 
+ 	* bytecomp.el (byte-compile-callargs-warn): Handle function defnition
+ 	that is not a lambda expression or byte code function.
+ 	(byte-compile-arglist-warn): Likewise.
+ 	(byte-compile-defalias): New function, used to compile defalias.
+ 	(byte-compile-defalias-warn): New function.
+ 
+ 	* lpr.el (print-region-1): Essentially undo previous change.
+ 
+ 	* files.el (set-visited-file-name): Handle find-file-visit-truename
+ 	early on, before we deal with lock files.
+ 
+ 	* gnuspost.el (gnus-inews-domain-name):
+ 	Once again test gnus-your-domain.
+ 
+ 	* shell.el (shell-mode): Don't read history from /dev/null.
+ 
+ 	* faces.el (make-face-italic, make-face-bold): Don't bind f2 here.
+ 	(make-face-bold-internal, make-face-italic-internal): Bind f2 here.
+ 	(make-face-bold-italic-internal, make-face-italic-internal)
+ 	(make-face-bold-internal): New arg `font'.  Callers changed.
+ 
+ 	* loadhist.el (unload-feature): The autoload property does not
+ 	start with `autoload'.
+ 
+ 	* faces.el (list-faces-display): Line up multiple lines in sample.
+ 
+ 	* sh-script.el (sh-set-shell): Obey sh-query-for-magic in all cases.
+ 
+ Thu Jun 30 23:49:08 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* tcl-mode.el (tcl-mode): Fix regexp to avoid nested loop.
+ 
+ Thu Jun 30 14:56:58 1994  Richard Stallman  (rms@gnu.ai.mit.edu)
+ 
+ 	* hideif.el (minor-mode-map-alist): Add missing quote.
+ 
+ 	* rmail.el (rmail-highlight-headers): Do nothing if
+ 	rmail-highlighted-headers is nil.
+ 
+ Thu Jun 30 02:37:55 1994  Noah Friedman  (friedman@prep.ai.mit.edu)
+ 
+ 	* rsz-mini.el (resize-minibuffer-window-restore): Don't do
+ 	anything if the window height is already 1.
+ 
+ Thu Jun 30 00:40:42 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* mouse.el (mouse-drag-secondary): Don't treat end of buffer
+ 	specially when within the window.
+ 
+ Wed Jun 29 14:21:50 1994  Noah Friedman  (friedman@prep.ai.mit.edu)
+ 
+         * comint.el (comint-password-prompt-regexp): New variable.
+         (comint-watch-for-password-prompt): Use it.
+ 
+ Wed Jun 29 12:27:55 1994  Richard Stallman  (rms@gnu.ai.mit.edu)
+ 
+ 	* easymenu.el (easy-menu-change): New function.
+ 
+ Tue Jun 28 16:21:58 1994  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)
+ 
+ 	* etags.el (tag-exact-match-p): Test for point sitting after the
+ 	explicit tag name itself.
+ 
+ Tue Jun 28 08:25:30 1994  enami tsugutomo  (enami@sys.ptg.sony.co.jp)
+ 
+ 	* simple.el (line-move): Don't use message or ding; just signal errors.
+ 
+ Tue Jun 28 10:12:51 1994  Lawrence R. Dodd  (dodd@roebling.poly.edu)
+ 
+         * dired-x.el (dired-x-hands-off-my-keys): New user-defined variable.
+         (dired-x-bind-find-file): Use it.
+         (dired-x-find-file): New function to substitute find-file.
+         (dired-x-find-file-other-window): New function to substitute
+         find-file-other-window.
+ 
+ Tue Jun 28 00:14:23 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* frame.el (auto-lower-mode, auto-raise-mode): Doc fixes.
+ 
+ 	* info.el (Info-index): Fix typo: t => \t.
+ 
+ Mon Jun 27 16:52:57 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* sh-script.el (sh-mode): Don't move point permanently.
+ 
+ 	* info.el (Info-insert-dir): Capitalize `node' when inserting it.
+ 	(Info-search): Don't move point to beginning, after Info-read-subfile.
+ 
+ Sat Jun 25 00:30:25 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* mouse.el (mouse-scroll-subr): Don't do anything special at eob.
+ 	(mouse-drag-region): Don't treat scrolling differently at eob.
+ 	(mouse-drag-secondary): Likewise.
+ 
+ 	* comint.el (comint-send-input): Update markers before
+ 	actually sending the input.
+ 
+ 	* dired.el (dired-readin): Record the directory's modtime.
+ 	(dired-internal-noselect): Offer to revert if dir has changed.
+ 
+ 	* menu-bar.el (menu-bar-mode): Make this a global variable.
+ 	(menu-bar-mode): Make variable menu-bar-mode and default-frame-alist
+ 	consistent.
+ 
+ 	* frame.el (frame-notice-user-settings): Make menu-bar-mode
+ 	and default-frame-alist consistent with each other.
+ 
+ 	* simple.el (beginning-of-buffer-other-window)
+ 	(end-of-buffer-other-window): New functions.
+ 	* loaddefs.el: Key bindings for M-home and M-end.
+ 
+ 	* ispell.el (ispell-message): Avoid an infinite loop.
+ 
+ Fri Jun 24 21:42:19 1994  Karl Heuer  (kwzh@nutrimat.gnu.ai.mit.edu)
+ 
+ 	* lmenu.el (popup-menu): Allow user to select nothing.
+ 
+ Fri Jun 24 11:45:18 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* paren.el (show-paren-command-hook): Use matching-paren.
+ 	Call overlay-put once for each overlay.
+ 	Wait .1 sec to see if any input comes in.
+ 
+ 	* gnuspost.el (gnus-inews-user-name, gnus-inews-domain-name):
+ 	Use user-mail-address unless there's a reason to do otherwise.
+ 	(gnus-inews-domain-name): Delete compatibility use of gnus-your-domain.
+ 
+ 	* add-log.el (add-log-mailing-address): Use user-mail-address.
+ 
+ 	* startup.el (user-mail-address): New variable.
+ 	(normal-top-level): Initialize it.
+ 
+ 	* gnus.el (gnus-summary-show-all-threads): Enable thread use.
+ 	(gnus-summary-show-thread): Enable thread use.
+ 	(gnus-summary-hide-all-threads): Enable thread use.
+ 	(gnus-summary-hide-thread): Enable thread use.
+ 	(gnus-summary-catchup-to-here): New function.
+ 	(gnus-summary-mode-map): Add menu bar menus.
+ 	(gnus-group-mode-map): Add menu bar menus.
+ 
+ 	* timer.el (run-at-time): If REPEAT is 0, don't repeat.
+ 
+ 	* tar-mode.el (tar-alter-one-field): Finish previous renaming change.
+ 
+ 	* add-log.el (find-change-log): If file name specified, just use it.
+ 
+ Fri Jun 24 04:08:11 1994  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)
+ 
+ 	* etags.el (visit-tags-table-buffer): Don't take car of return
+ 	from tags-table-including.
+ 
+ Thu Jun 23 19:54:24 1994  Karl Heuer  (kwzh@nutrimat.gnu.ai.mit.edu)
+ 
+ 	* lmenu.el (popup-menu): Convert list to same-size vector, not
+ 	singleton vector.
+ 
+ Thu Jun 23 10:22:48 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* comint.el (comint-read-input-ring): Use ring-insert-at-beginning.
+ 	Insert most recent string first and only as many as we need.
+ 	Don't visit the file, just read it.
+ 
+ 	* ring.el (ring-insert-at-beginning): New function.
+ 
+ 	* jka-compr.el (jka-compr-partial-uncompress): Handle the case where
+ 	LEN reaches to or past the end of the data.
+ 
+ 	* soundex.el (soundex-alist): Delete the elements that mapped into nil.
+ 
+ 	* tar-mode.el (tar-extract): Set file name by hand before calling
+ 	set-visited-file-name.
+ 
+ 	* tar-mode.el: Various renamings; all callers changed.
+ 	(tar-header-block-tokenize): Renamed from tokenize-tar-header-block.
+ 	(tar-header-block-checksum): Renamed from checksum-tar-header-block.
+ 	(tar-header-block-check-checksum):
+ 	Renamed from check-tar-header-block-checksum.
+ 	(tar-header-block-recompute-checksum):
+ 	Renamed from recompute-tar-header-block-checksum.
+ 	(tar-header-block-summarize):
+ 	Renamed from summarize-tar-header-block.
+ 
+ 	* paren.el (show-paren-command-hook): Set paren foreground to white.
+ 	(show-paren-command-hook): Handle close paren rather than open paren
+ 	if point is between the two.
+ 
+ 	* info.el (Info-next-preorder-1): New function.
+ 	(Info-mouse-follow-nearest-node): Use that.
+ 	(Info-follow-nearest-node): Use that.
+ 
+ Wed Jun 22 23:32:22 1994  Ethan Bradford  (ethanb@ptolemy.astro.washington.edu)
+ 
+ 	* lpr.el (print-region-1): Don't include a space in the job name.
+ 
+ Wed Jun 22 21:11:56 1994  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)
+ 
+ 	* etags.el (tags-table-including): Don't call
+ 	tags-table-check-computed-list.  After skipping a table not in
+ 	core, make sure TABLES is non-nil before using it.  At end, find
+ 	the table in the user's list which includes FOUND.
+ 
+ Wed Jun 22 18:14:36 1994  Noah Friedman  (friedman@prep.ai.mit.edu)
+ 
+         * rsz-mini.el (resize-minibuffer-window-exactly,
+         resize-minibuffer-frame, resize-minibuffer-frame-exactly): Doc
+         fixes.
+         (resize-minibuffer-frame-exactly): make default t.
+         (resize-minibuffer-frame-original-height): New variable.
+         (resize-minibuffer-setup): Set it locally in the minibuffer.
+         (resize-minibuffer-frame): Use it instead of minibuffer-frame-alist's
+         height.
+         (resize-minibuffer-setup): Append resize-minibuffer-window and
+         resize-minibuffer-frame to the end of post-command-hook, don't
+         insert on the front.
+         (resize-minibuffer-window-restore): New function.
+         (resize-minibuffer-setup): Put it on minibuffer-exit-hook.
+ 
+ Wed Jun 22 00:04:25 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* faces.el (make-face): Return the face name, not the vector.
+ 
+ 	* menu-bar.el: Rearrange the edit and file menus, and add separators.
+ 
+ 	* indent.el (move-to-tab-stop): Delete unnecessary spaces
+ 	before the old point if a tab followed or follows the old point.
+ 
+ 	* backquote.el (backquote-process): Fix criterion for using FIRSTLIST.
+ 
+ 	* loaddefs.el (global-map): Bind M-prior.
+ 	* simple.el (scroll-other-window-down): New command.
+ 
+ 	* env.el (setenv): Rewrite.  Provide a way to unset interactively.
+ 
+ Tue Jun 21 16:17:42 1994  Per Abrahamsen  (abraham@eupectic.research.att.com)
+ 
+ 	* double.el (double-prefix-only): New variable.
+ 	(double-translate-key): Use it.
+ 
+ Tue Jun 21 13:46:04 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* faces.el (face-equal): Do check the underline attribute.
+ 
+ 	* files.el (delete-auto-save-files): Doc fix.
+ 
+ Mon Jun 20 17:55:33 1994  Morten Welinder  (terra@diku.dk)
+ 
+ 	* info.el (Info-directory-list): For msdos, don't check for
+ 	exec-directory != ../lib-src (since we use wrapped binaries).
+ 
+ 	* s-region.el: Don't bind keys C-insert, C-delete, and
+ 	S-insert if they are already bound.
+ 
+ Mon Jun 20 12:45:13 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* indent.el (move-to-tab-stop): Get rid of spaces before tabs
+ 	that were made by an immediately previous use of this command.
+ 
+ 	* gnus.el (gnus-summary-next-article): Fix previous change.
+ 
+ 	* help.el (finder-by-keyword): Add doc string and t for interactive.
+ 
+ 	* cc-mode.el: Large changes--version 3.349.
+ 
+ 	* jka-compr.el: Use plists to record handlers.
+ 	(jka-compr-insert-file-contents): Don't leave buffer locked.
+ 	Call the standard function, and file-local-copy,
+ 	using jka-compr-run-real-handler.
+ 	(jka-compr-file-local-copy): Call file-local-copy
+ 	using jka-compr-run-real-handler.
+ 	(jka-compr-write-region): Likewise.
+ 	(jka-compr-load): Don't alter file-name-handler-alist.
+ 	Do bind inhibit-file-name-handlers and inhibit-file-name-operation.
+ 	(jka-compr-handler): Don't alter file-name-handler-alist.
+ 
+ 	* shell.el (shell-prefixed-directory-name): Do nothing if
+ 	comint-file-name-prefix is empty.  Do not inline.
+ 
+ Tue May 31 17:52:11 1994  Lars Magne Ingebrigtsen  (larsi@bera.ifi.uio.no)
+ 
+ 	* gnus-uu.el (gnus-uu-view-directory): Fixed viewing with the
+ 	`gnus-uu-asynchronous' variable set.
+ 	(gnus-uu-ctl-map): Removed the keystrokes `C-c C-v C-h' and
+ 	`C-c C-v h' from the keymap.
+ 	(gnus-uu-decode-and-view-all-articles,
+ 	(gnus-uu-decode-and-view-all-unread-articles,
+ 	(gnus-uu-decode-and-save-all-unread-articles,
+ 	(gnus-uu-decode-and-save-all-articles): Accept prefix arg for # files.
+ 	(gnus-uu-uustrip-article-as): Waits for uudecode to finish before
+ 	further treatment of the resulting files.
+ 	(gnus-uu-summary-next-subject): After decoding, if there are no
+ 	more unread articles, jump to the last article decoded.
+ 	(gnus-uu-post-encoded): Make last posting in a
+ 	series always have more than 4 lines.
+ 
+ 	* gnus-uu.el (gnus-uu-interactive-save-original-file): Fixed
+ 	original file save when there's more that one original file.
+ 
+ 	* gnus-uu.el (gnus-uu-view-file): Rewrote function and fixed
+ 	ask before view/save after view.
+ 	(gnus-uu-ask-to-save-file): New function.
+ 
+ 	* gnus-uu.el (gnus-uu-interactive-set-up-windows): New function.
+ 	(gnus-uu-interactive-scan-directory) New function.
+ 	(gnus-uu-interactive-rescan-directory): New function.
+ 	(gnus-uu-ignore-files-by-name, gnus-uu-ignore-files-by-type): New vars.
+ 	(gnus-uu-interactive-execute): Change directory to work dir before
+ 	executing.
+ 
+ 	(gnus-uu-view-directory, gnus-uu-check-for-generated-files):
+ 	Fixed bug deleting generated directories.
+ 	(gnus-uu-unpack-archives): Added error message for corrupted archives.
+ 
+ Sun Jun 19 13:13:44 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* indent.el (tab-to-tab-stop): Combine new indentation with previous.
+ 
+ 	* mailalias.el (define-mail-alias): Copy parsing code from
+ 	mailabbrev.el.  New arg from-mailrc-file.
+ 	(build-mail-aliases): Pass t as new arg.
+ 
+ 	* mouse.el (mouse-scroll-subr):
+ 	Preserve point if WINDOW's not the selected window.
+ 	(mouse-drag-region, mouse-drag-secondary): Accept any list event
+ 	as normal termination of the dragging.
+ 
+ Sun Jun 19 03:56:30 1994  Erik Naggum  (erik@naggum.no)
+ 
+ 	* simple.el (blink-matching-open): Use matching-paren.
+ 
+ Sun Jun 19 15:19:56 1994  Rob Riepel  (riepel@Snowflake.Stanford.edu)
+ 
+ 	* tpu-doc.el (tpu-doc-revision): Variable deleted.
+ 
+ 	* tpu-edt.el (tpu-edt-off): Restore original global key map.
+ 	(tpu-next-file-buffer): Move to dired buffer too.
+ 	(tpu-make-file-buffer-list): New function.
+ 	(tpu-version): New version.
+ 	(tpu-set-mode-line): Added line-number-mode to mode-line.
+ 	(tpu-search-forward-exit, tpu-search-backward-exit): New functions,
+ 	key mappings.
+ 
+ 	* tpu-extras.el: Require tpu-edt.
+ 	(tpu-extras-revision): Variable deleted.
+ 
+         * tpu-mapper.el: Change size of selected screen.  Reposition after
+ 	printing help.  Null default directory for save.  Produce minibuffer
+ 	key bindings for kp4 and kp5.
+ 	(tpu-kp4, tpu-kp5): New variables.
+ 	(tpu-mapper-revision): Variable deleted.
+ 
+ 	* vt-control.el (vt-revision): Variable deleted.
+ 
+ Sat Jun 18 09:23:23 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* sendmail.el (mail-bury): Test that rmail-summary-buffer is boundp.
+ 
+ 	* files.el (insert-directory): Don't quote braces for shell.
+ 
+ 	* calendar.el: Fix references to diary.el.
+ 
+ 	* diary-lib.el: Renamed from diary.el.
+ 
+ 	* rmailmsc.el (set-rmail-inbox-list): Use insert-before-markers.
+ 
+ Fri Jun 17 23:39:42 1994  Michael D. Ernst  (mernst@research.microsoft.com)
+ 
+ 	* rmail.el (rmail-highlight-headers): Don't skip newlines,
+ 	just tab and space.
+ 
+ Fri Jun 17 18:28:59 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* gnus.el (gnus-summary-next-article): Handle non-character events.
+ 
+ Fri Jun 17 18:15:03 1994  Karl Heuer  (kwzh@hal.gnu.ai.mit.edu)
+ 
+ 	* dired.el (dired-build-subdir-alist): Don't let looking-at
+ 	destroy the match data.
+ 
+ Fri Jun 17 09:38:56 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* files.el (make-auto-save-file-name): Double the backslashes
+ 	and convert slashes to \!.
+ 
+ 	* finder.el (finder-commentary): Fix error message syntax.
+ 
+ 	* autoload.el, bookmark.el, cl-*.el, cl.el, complete.el:
+ 	* mouse-sel.el, rot13.el, thingatpt.el: Fix Commentary section comments
+ 	and other section comments.
+ 
+ 	* lisp-mnt.el (lm-section-mark): Accept extra semicolons;
+ 	accept spaces at end of line.
+ 
+ 	* faces.el (x-create-frame-with-faces): Set the cursor color last.
+ 
+ Fri Jun 17 17:41:10 1994  Kevin Rodgers  (kevinr@ihs.com)
+ 
+ 	* mailabbrev.el (build-mail-abbrevs): Pass a recursivep argument in
+ 	recursive call.
+ 
+ Fri Jun 17 00:06:16 1994  Roland McGrath  (roland@geech.gnu.ai.mit.edu)
+ 
+ 	* etags.el (tags-table-computed-list,
+         tags-table-computed-list-for): New variables.
+ 	(tags-table-list-pointer, tags-table-list-started-at): Doc fixes.
+ 	(tags-table-parent-pointer-list): Variable removed.
+ 	(tags-table-check-computed-list, tags-table-extend-computed-list): New
+ 	functions.
+ 	(tags-find-table-in-list): Function removed.
+ 	(tags-table-list-member): New function replaces it.
+ 	(tags-verify-table): New function, broken out of
+ 	visit-tags-table-buffer.
+ 	(tags-table-including, tags-next-table): Rewritten.
+ 	(visit-tags-table-buffer-cont): Variable removed.
+ 	(visit-tags-table-buffer): Overhauled.
+ 	(tag-exact-match-p): Disallow newline in tag string before \177.
+ 
+ Thu Jun 16 10:14:47 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* mouse.el (mouse-scroll-subr): New arg WINDOW.
+ 	(mouse-drag-region, mouse-drag-secondary): Pass new arg.
+ 
+ 	* bibtex.el (bibtex-mode): Set up comment-start locally.
+ 
+ 	* ange-ftp.el (ange-ftp-canonize-filename): Fix wrong var name.
+ 
+ Thu Jun 16 04:09:48 1994  Noah Friedman  (friedman@prep.ai.mit.edu)
+ 
+         * rlogin.el (rlogin-password-paranoia): Variable deleted.
+         (rlogin-password): Function deleted.
+         This functionality is handled by comint-watch-for-password-prompt.
+ 
+         * rlogin.el (rlogin-filter): Function deleted.
+         (rlogin): Do not set the process filter to rlogin-filter.
+ 
+ Wed Jun 15 22:22:33 1994  Morten Welinder  (terra@diku.dk)
+ 
+ 	* info.el (Info-directory-list): For msdos, use ";" instead of
+ 	":" as delimiter in INFOPATH.
+ 
+ Wed Jun 15 00:37:07 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* outline.el (outline-mode): Make change-major-mode-hook buffer-local.
+ 
+ 	* dired.el (dired-build-subdir-alist): Avoid mistaking a file name
+ 	ending in a colon for a subdir header line.
+ 
+ 	* sendmail.el (mail-send-hook): Add defvar.
+ 	(mail-send): Run mail-send-hook before the `Sending...' message.
+ 
+ 	* etags.el (find-tag-history): New variable.
+ 	(find-tag-noselect): Set that variable.
+ 
+ Tue Jun 14 22:42:00 1994  Karl Heuer  (kwzh@hal.gnu.ai.mit.edu)
+ 
+ 	* mouse.el (mouse-drag-region): Bind last-command, not this-command.
+ 
+ 	* files.el (make-auto-save-file-name): Don't use slashes in
+ 	autosave name for a non-file buffer.
+ 
+ Tue Jun 14 16:18:12 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* ispell.el (ispell-command-loop): C-g should be like X, not q.
+ 
+ 	* fortran.el (fortran-blink-matching-do): When looking for do,
+ 	insist on nondigit after it.
+ 
+ Tue Jun 14 20:06:55 1994  Ed Reingold  (reingold@albert.gnu.ai.mit.edu)
+ 
+ 	* cal-menu.el (calendar-mode-map): Change moon menu bar to pop up
+         a menu instead doing it directly.
+         (calendar-mouse-2-date-menu): Remove moon phase.
+ 
+ Tue Jun 14 19:50:14 1994  Richard Stallman  (rms@albert.gnu.ai.mit.edu)
+ 
+ 	* cal-menu.el (calendar-mouse-2-date-menu): Put moon phase here.
+ 	(calendar-mode-map): Delete from here.
+ 
+ Tue Jun 14 00:34:43 1994  Richard Stallman  (rms@albert.gnu.ai.mit.edu)
+ 
+ 	* simple.el (pop-global-mark): Discard entries for nonexistent buffers.
+ 
+ 	* startup.el (inhibit-startup-echo-area-message): Doc fix.
+ 
+ 	* avoid.el (mouse-avoidance-threshold): Renamed from ...threshhold.
+ 
+ Mon Jun 13 23:40:33 1994  Richard Stallman  (rms@albert.gnu.ai.mit.edu)
+ 
+ 	* simple.el (end-of-buffer): Recenter overlay lists.
+ 
+ Mon Jun 13 19:40:12 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* simple.el (pop-global-mark): Discard entries for nonexistent buffers.
+ 
+ 	* startup.el (inhibit-startup-echo-area-message): Doc fix.
+ 
+ 	* avoid.el (mouse-avoidance-threshold): Renamed from ...threshhold.
+ 
+ 	* simple.el (end-of-buffer): Recenter overlay lists.
+ 
+ Mon Jun 13 19:27:54 1994  Roland McGrath  (roland@geech.gnu.ai.mit.edu)
+ 
+ 	* compile.el (compilation-error-regexp-alist): Extend first regexp
+ 	to handle Borland C++ msgs: "Warning" or "Error" before file name.
+ 
+ Mon Jun 13 18:06:09 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* ispell.el (ispell-dictionary-alist): Add autoload.
+ 	Split into two subvariables.
+ 	(ispell-menu-map): Defvar and set up at top level.
+ 	Split into parts.
+ 	(ispell-menu-map-needed): New variable.
+ 
+ 	* font-lock.el (font-lock-hack-keywords, font-lock-fontify-region):
+ 	Don't call set-buffer-modified-p if no change in its value.
+ 
+ Mon Jun 13 21:31:53 1994  Lawrence R. Dodd  (dodd@roebling)
+ 
+ 	* dired-x.el (dired-man): Use internal function from man.el.
+ 	(dired-omit-files): Omit `.' and `..' by default, not all files
+ 	ending in `.'.
+ 
+ Mon Jun 13 09:56:51 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* font-lock.el: Don't alter the underline face.
+ 
+ 	* font-lock.el (c-font-lock-keywords-2): Insist on whitespace
+ 	before a label.
+ 
+ 	* mouse.el (mouse-save-then-kill-delete-region): Turn off change hooks
+ 	for the edit operations that are not real.
+ 
+ Sun Jun 12 21:09:22 1994  Johan Vromans  (jv@NL.net)
+ 
+ 	* forms.el (forms-mode):
+ 	Plug security hole by disabling `eval-buffer' unless
+ 	`enable-local-eval' is set to t.
+ 	Correct setting of `forms--mode-setup'.
+ 	(forms--local-write-file-function): New function to be used as
+ 	`local-write-file-hooks'.
+ 	(forms-mode): Use it.
+ 	(forms-find-file,forms-find-file-other-window): Locally set
+ 	`enable-local-eval' and `enable-local-variables' to t.
+ 	(forms-find-file-other-window): Remove extraneous call to
+ 	`eval-current-buffer'.
+ 
+ Sun Jun 12 22:31:50 1994  Kohtala Marko  (Marko.Kohtala@ntc.nokia.com)
+ 
+ 	* info.el (Info-insert-dir): Ignore access times when comparing
+ 	file attributes.  Print message while merging.  Use separate
+ 	buffers for merging.  Try lower case `dir' first.
+ 
+ Sun Jun 12 08:53:46 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+  	* iso-cvt.el (iso-iso2tex-trans-tab): Add a few characters.
+  	(iso-iso2gtex-trans-tab): Likewise.
+  	(iso-tex2iso-trans-tab): Recognize TeX accent sequences without braces.
+  	(iso-gtex2iso-trans-tab): Likewise.
+ 
+ 	* info.el (Info-fontify-node): Require some whitespace after *Note.
+ 
+ 	* sendmail.el (mail): If homedir is nonexistent, don't use as default.
+ 
+ Sat Jun 11 14:13:07 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* server.el (server-start): Doc fix.
+ 
+ 	* font-lock.el (font-lock-hack-keywords): Avoid changing the narrowing.
+ 
+ 	* tex-mode.el (latex-mode, slitex-mode): In paragraph-separate,
+ 	delete spurious \\\\ from char set.
+ 
+ 	* isearch.el (isearch-mode-map):
+ 	Bind the ASCII-equivalent fcn keys explicitly to nil.
+ 
+ 	* iso-cvt.el (iso-translate-conventions): Get rid of interactive spec.
+ 
+ Fri Jun 10 20:56:03 1994  Morten Welinder  (terra@diku.dk)
+ 
+ 	* font-lock.el (tex-font-lock-keywords): Make the pattern for
+ 	macros respect TeX's idea of identifiers.
+ 	(font-lock-set-defaults): Don't check for 'tex-mode, but instead
+ 	for 'plain-tex-mode, 'latex-mode, and 'slitex-mode which is what
+ 	tex-mode.el uses.
+ 
+ Fri Jun 10 10:13:10 1994  Boris Goldowsky  (boris@mink.cs.rochester.edu)
+ 
+ 	* avoid.el (mouse-avoidance-point-position): Fix compute-motion
+ 	call to use (X . Y) relative to window, not frame.
+ 	Avoid errors if window-start < point-min.
+ 
+ Fri Jun 10 16:28:12 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* comint.el (comint-dynamic-list-completions):
+ 	No space in *Completions*.
+ 	* ispell4.el (ispell-complete-word): Likewise.
+ 	* ielm.el (ielm-complete-symbol): Likewise.
+ 	* etags.el (complete-tag): Likewise.
+ 	* complete.el (PC-do-completion): Likewise.
+ 	* lisp.el (lisp-complete-symbol): Likewise.
+ 
+ 	* ispell.el (ispell-dictionary-alist): Fix regexp in francais.
+ 
+ 	* dired-x.el: Require dired and dired-aux in the standard way.
+ 
+ 	* dired-aux.el: Add provide call.
+ 
+ 	* info.el (Info-complete-menu-item): New function.
+ 	(Info-menu): Use it to speed completion.
+ 
+ 	* tex-mode.el (tex-start-shell): Add autoload.
+ 
+ Tue Jun  7 13:47:11 1994  Richard Stallman  (rms@geech.gnu.ai.mit.edu)
+ 
+ 	* iso-cvt.el (iso-translate-conventions):
+ 	Use case-dependent search and don't alter case.
+ 
+ 	* disp-table.el (standard-display-european): Treat 0 arg like negative.
+ 
+ 	* ange-ftp.el (ange-ftp-canonize-filename): Preserve // after colon.
+ 	(ange-ftp-expand-file-name): Likewise.
+ 	(ange-ftp-canonize-filename): Preserve // at very beginning.
+ 
+ Tue Jun  7 12:35:11 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* tex-mode.el (tex-show-print-queue): Display the tex shell buffer.
+ 	(tex-file, tex-bibtex-file): Likewise.
+ 	(latex-mode, slitex-mode): Treat \] as paragraph starter.
+ 
+ Tue Jun  7 21:33:02 1994  Morten Welinder  (terra@diku.dk)
+ 
+ 	* dos-fns.el (Info-default-directory-list):  Setting this no
+ 	longer needed.
+ 
+ Tue Jun  7 03:47:05 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* cal-menu.el (calendar-mouse-2-date-menu): Put moon phase here.
+ 	(calendar-mode-map): Delete from here.
+ 
+ 	* simple.el (delete-blank-lines): Doc fix.
+ 
+ Mon Jun  6 04:01:24 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* indent.el (tab-stop-list): Doc fix.
+ 
+ 	* sendmail.el (mail-bury): If showing rmail buffer that has summary,
+ 	show the summary too.
+ 
+ Mon Jun  6 01:04:39 1994  Karl Heuer  (kwzh@hal.gnu.ai.mit.edu)
+ 
+ 	* menu-bar.el (menu-bar-update-buffers): Avoid excessive consing.
+ 
+ Sun Jun  5 06:59:44 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* tex-mode.el (tex-file, tex-region): Display the tex shell buffer.
+ 
+ 	* gomoku.el (gomoku-display-statistics): Use human's point of view
+ 	for wins and losses.
+ 	(gomoku-number-of-emacs-wins): Renamed from gomoku-number-of-wins.
+ 	(gomoku-number-of-human-wins): Renamed from gomoku-number-losses.
+ 
+ 	* derived.el (derived-mode-merge-abbrev-tables):
+ 	Do nothing if OLD is nil.
+ 
+ 	* edebug.el (edebug-emacs-19-specific):
+ 	Call x-popup-menu only if using a window system.
+ 
+ 	* info.el (Info-directory-list): Don't use the invocation directory
+ 	unless it was used for exec-directory too.
+ 
+ 	* gud.el (gud-massage-args): Fix error message syntax.
+ 	(gud-marker-filter, gud-find-file): Likewise.
+ 	(gud-display-line): Don't use dialog box for questions.
+ 
+ Fri Jun  3 20:16:43 1994  Morten Welinder  (terra@diku.dk)
+ 
+ 	* dos-fns.el (frame-parameters): Setting this is no longer needed.
+ 
+ Fri Jun  3 20:27:02 1994  Ed Reingold  (reingold@albert.gnu.ai.mit.edu)
+ 
+ 	* solar.el (solar-sunrise, solar-sunset): Fix doc string.
+ 	(solar-time-string): Rewritten.
+ 	(solar-adj-time-for-dst): New function.
+ 	(solar-sunrise-sunset, diary-sabbath-candles,
+ 	 solar-equinoxes-solstices): Revised to use the rewritten and new fcns.
+ 
+ 	* calendar.el (solar-holidays): Revised to use the rewritten and
+          new fcns.
+ 
+ 	* lunar.el (lunar-phase): Revised to use the rewritten and new fcns.
+ 
+ Thu Jun  2 18:15:13 1994  Richard Stallman  (rms@albert.gnu.ai.mit.edu)
+ 
+ 	* compile.el (compilation-error-regexp-alist): Stricter Lucid regexp.
+ 
+ 	* complete.el (PC-do-completion): Clear text props from inserted text.
+ 
+ 	* comint.el (comint-dynamic-complete-as-filename)
+ 	(comint-dynamic-complete-filename): Suppress most messages
+ 	when completing in the minibuffer.
+ 
+ Wed Jun  1 14:18:06 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* gnus-uu.el (gnus-uu-ctl-map): Move C-h binding to C-d.
+ 
+ 	* mouse.el (mouse-choose-completion): If *Completion* is a special
+ 	buffer or just has a dedicated window, do something reasonable.
+ 
+ 	* gnus.el (gnus-newsrc-to-gnus-format): In main loop,
+ 	don't try to match the ranges with the regexp.
+ 	Match just the group name and the subscribed-flag.
+ 
+ Mon May 30 17:44:30 1994  Paul Eggert  (eggert@twinsun.com)
+ 
+ 	* calendar.el (calendar-mod): Remove; it was equivalent to `mod'.
+ 	All callers changed.
+ 
+ Mon May 30 14:51:16 1994  Ed Reingold  (reingold@albert.gnu.ai.mit.edu)
+ 
+ 	* calendar.el (generate-calendar-month): Make highlighted text for
+ 	mouse-2 a full column (2 chars) wide, even for single-digit dates.
+ 
+ Mon May 30 12:23:10 1994  Richard Stallman  (rms@albert.gnu.ai.mit.edu)
+ 
+ 	* comint.el (comint-read-input-ring): Make regexp stricter.
+ 
+ 	* paths.el (Info-default-directory-list): Don't attach ../info.
+ 	So now configure-info-directory comes last.
+ 	Put /usr/local/info second.
+ 
+ 	* info.el (Info-directory-list): Doc fix.
+ 
+ 	* font-lock.el (shell-font-lock-keywords): Removed regexp for commands.
+ 	(rmail-summary-font-lock-keywords): New variable.
+ 	(font-lock-set-defaults): Use it.
+ 
+ 	* bibtex.el (bibtex-clean-entry): Back over close delimiter carefully.
+ 
+ 	* cal-dst.el (calendar-current-time-zone): Fix typo that
+ 	transposed DST-STARTS-TIME and DST-ENDS-TIME.
+ 
+ 	* ange-ftp.el (ange-ftp-insert-directory): Expand file name to
+ 	check whether it is really an ftp file name.
+ 
+ 	* cal-dst.el (calendar-daylight-savings-ends): Fix typo in put.
+ 
+ 	* menu-bar.el (menu-bar-mode): Fix previous change.
+ 
+ See ChangeLog.4 for earlier changes.
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/Makefile emacs-19.31/lisp/Makefile
*** emacs-19.30/lisp/Makefile	Sat Apr 23 11:54:12 1994
--- emacs-19.31/lisp/Makefile	Thu Jan  4 14:56:07 1996
***************
*** 1,4 ****
  #
! # Maintainence productions for the Lisp directory
  #
  SOURCES = *.el COPYING Makefile
--- 1,4 ----
  #
! # Maintenance productions for the Lisp directory
  #
  SOURCES = *.el COPYING Makefile
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/abbrev.el emacs-19.31/lisp/abbrev.el
*** emacs-19.30/lisp/abbrev.el	Tue Apr 25 16:12:42 1995
--- emacs-19.31/lisp/abbrev.el	Sun Jan 14 02:34:30 1996
***************
*** 18,23 ****
  
  ;; 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:
--- 18,24 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/ada-mode.el emacs-19.31/lisp/ada-mode.el
*** emacs-19.30/lisp/ada-mode.el	Mon Oct 30 11:45:56 1995
--- emacs-19.31/lisp/ada-mode.el	Mon Jan 29 17:52:28 1996
***************
*** 18,23 ****
  
  ;; 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.
  
  ;;; This mode is a complete rewrite of a major mode for editing Ada 83
--- 18,24 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; This mode is a complete rewrite of a major mode for editing Ada 83
***************
*** 80,84 ****
  ;;;
  ;;; Many thanks to
! ;;;    Philippe Warroquiers (PW) <philippe@cfmu.eurocontrol.be> in particular,
  ;;;    woodruff@stc.llnl.gov (John Woodruff)
  ;;;    jj@ddci.dk (Jesper Joergensen)
--- 81,85 ----
  ;;;
  ;;; Many thanks to
! ;;;    Philippe Waroquiers (PW) <philippe@cfmu.eurocontrol.be> in particular,
  ;;;    woodruff@stc.llnl.gov (John Woodruff)
  ;;;    jj@ddci.dk (Jesper Joergensen)
*************** not to 'begin'.")
*** 152,156 ****
  
  (defvar ada-case-keyword 'downcase-word
!   "*Function to call to adjust the case of Ada keyworrds.
  It may be `downcase-word', `upcase-word', `ada-loose-case-word' or 
  `capitalize-word'.")
--- 153,157 ----
  
  (defvar ada-case-keyword 'downcase-word
!   "*Function to call to adjust the case of Ada keywords.
  It may be `downcase-word', `upcase-word', `ada-loose-case-word' or 
  `capitalize-word'.")
*************** It may be `downcase-word', `upcase-word'
*** 167,171 ****
  
  (defvar ada-auto-case t
!   "*Non-nil automatically changes casing of preceeding word while typing.
  Casing is done according to `ada-case-keyword', `ada-case-identifier'
  and `ada-cacse-attribute'.")
--- 168,172 ----
  
  (defvar ada-auto-case t
!   "*Non-nil automatically changes case of preceding word while typing.
  Casing is done according to `ada-case-keyword', `ada-case-identifier'
  and `ada-cacse-attribute'.")
*************** with `ada-fill-comment-paragraph-postfix
*** 193,197 ****
  (defvar ada-krunch-args "0"
    "*Argument of gnatk8, a string containing the max number of characters.
! Set to 0, if you dont use crunched filenames.")
  
  ;;; ---- end of user configurable variables
--- 194,198 ----
  (defvar ada-krunch-args "0"
    "*Argument of gnatk8, a string containing the max number of characters.
! Set to 0, if you don't use crunched filenames.")
  
  ;;; ---- end of user configurable variables
*************** The name is specified in `ada-external-p
*** 661,665 ****
  current buffer in a directory specified by `ada-tmp-directory',
  starts the pretty printer as external process on that file and then
! reloads the beautyfied program in the buffer and cleans up
  `ada-tmp-directory'."
    (interactive)
--- 662,666 ----
  current buffer in a directory specified by `ada-tmp-directory',
  starts the pretty printer as external process on that file and then
! reloads the beautified program in the buffer and cleans up
  `ada-tmp-directory'."
    (interactive)
*************** Attention: This function might take very
*** 858,863 ****
  	    ;;
  	    (setq reldiff (- (point) from))
! 	    (message (format "adjusting case ... %5d characters left"
! 			     (- (point) from)))
  	    (forward-char 1)
  	    (or
--- 859,864 ----
  	    ;;
  	    (setq reldiff (- (point) from))
! 	    (message "adjusting case ... %5d characters left"
! 		     (- (point) from))
  	    (forward-char 1)
  	    (or
*************** Moves to 'begin' if in a declarative par
*** 1399,1403 ****
          (while (< (point) endmark)
            (if (> block-done 9)
!               (progn (message (format msg lines-remaining))
                       (setq block-done 0)))
  	  (if (looking-at "^$") nil
--- 1400,1404 ----
          (while (< (point) endmark)
            (if (> block-done 9)
!               (progn (message msg lines-remaining)
                       (setq block-done 0)))
  	  (if (looking-at "^$") nil
*************** Moves to 'begin' if in a declarative par
*** 1406,1414 ****
  	  (setq block-done (1+ block-done))
  	  (setq lines-remaining (1- lines-remaining)))
!       ;; show line number where the error occured
        (error
!        (error (format "line %d: %s"
!                       (1+ (count-lines (point-min) (point)))
!                       err) nil)))
      (message "indenting ... done")))
  
--- 1407,1413 ----
  	  (setq block-done (1+ block-done))
  	  (setq lines-remaining (1- lines-remaining)))
!       ;; show line number where the error occurred
        (error
!        (error "line %d: %s" (1+ (count-lines (point-min) (point))) err)))
      (message "indenting ... done")))
  
*************** This works by two steps:
*** 1851,1855 ****
  (defun ada-get-indent-open-paren (orgpoint)
    ;; Returns the indentation (column #) for the new line after ORGPOINT.
!   ;; Assumes point to be behind an open paranthesis not yet closed.
    (ada-in-open-paren-p))
  
--- 1850,1854 ----
  (defun ada-get-indent-open-paren (orgpoint)
    ;; Returns the indentation (column #) for the new line after ORGPOINT.
!   ;; Assumes point to be behind an open parenthesis not yet closed.
    (ada-in-open-paren-p))
  
*************** This works by two steps:
*** 2387,2391 ****
                (setq match-dat (ada-search-prev-end-stmt limit)))
            ;;
!           ;; if found the correct end-stetement => goto next non-ws
            ;;
            (if match-dat
--- 2386,2390 ----
                (setq match-dat (ada-search-prev-end-stmt limit)))
            ;;
!           ;; if found the correct end-statement => goto next non-ws
            ;;
            (if match-dat
*************** This works by two steps:
*** 2501,2507 ****
    (ada-goto-matching-start 0)
    (if (not (looking-at (concat "\\<" keyword "\\>")))
!       (error (concat
!               "matching start is not '"
!               keyword "'"))))
  
  
--- 2500,2504 ----
    (ada-goto-matching-start 0)
    (if (not (looking-at (concat "\\<" keyword "\\>")))
!       (error "matching start is not '%s'" keyword)))
  
  
*************** This works by two steps:
*** 2542,2553 ****
      ;;
      (if (not (looking-at (concat "\\<" defun-name "\\>")))
!         (error
!          (concat
!           "matching defun has different name: "
!           (buffer-substring
!            (point)
!            (progn
!              (forward-sexp 1)
!              (point))))))))
  
  
--- 2539,2545 ----
      ;;
      (if (not (looking-at (concat "\\<" defun-name "\\>")))
!         (error "matching defun has different name: %s"
! 	       (buffer-substring (point)
! 				 (progn (forward-sexp 1) (point)))))))
  
  
*************** This works by two steps:
*** 3109,3113 ****
       (looking-at "(")
       (backward-word 2)
!      ;; right keyword before paranthesis ?
       (looking-at (concat "\\<\\("
                           "procedure\\|function\\|body\\|package\\|"
--- 3101,3105 ----
       (looking-at "(")
       (backward-word 2)
!      ;; right keyword before parenthesis ?
       (looking-at (concat "\\<\\("
                           "procedure\\|function\\|body\\|package\\|"
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/add-log.el emacs-19.31/lisp/add-log.el
*** emacs-19.30/lisp/add-log.el	Fri Nov 24 22:46:46 1995
--- emacs-19.31/lisp/add-log.el	Fri Mar 22 08:22:18 1996
***************
*** 18,23 ****
  
  ;; 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:
--- 18,24 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 36,43 ****
--- 37,46 ----
  instead) with no arguments.  It returns a string or nil if it cannot guess.")
  
+ ;;;###autoload
  (defvar add-log-full-name nil
    "*Full name of user, for inclusion in ChangeLog daily headers.
  This defaults to the value returned by the `user-full-name' function.")
  
+ ;;;###autoload
  (defvar add-log-mailing-address nil
    "*Electronic mail address of user, for inclusion in ChangeLog daily headers.
*************** Runs `change-log-mode-hook'."
*** 280,284 ****
  	mode-name "Change Log"
  	left-margin 8
! 	fill-column 74)
    (use-local-map change-log-mode-map)
    ;; Let each entry behave as one paragraph:
--- 283,289 ----
  	mode-name "Change Log"
  	left-margin 8
! 	fill-column 74
!     indent-tabs-mode t
!     tab-width 8)
    (use-local-map change-log-mode-map)
    ;; Let each entry behave as one paragraph:
*************** Has a preference of looking backwards."
*** 338,342 ****
  		 (beginning-of-defun)
  		 ;; Make sure we are really inside the defun found, not after it.
! 		 (if (and (progn (end-of-defun)
  				 (< location (point)))
  			  (progn (forward-sexp -1)
--- 343,348 ----
  		 (beginning-of-defun)
  		 ;; Make sure we are really inside the defun found, not after it.
! 		 (if (and (looking-at "\\s(")
! 			  (progn (end-of-defun)
  				 (< location (point)))
  			  (progn (forward-sexp -1)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/advice.el emacs-19.31/lisp/advice.el
*** emacs-19.30/lisp/advice.el	Wed Mar 15 23:35:14 1995
--- emacs-19.31/lisp/advice.el	Sun Jan 14 02:34:30 1996
***************
*** 21,26 ****
  
  ;; 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.
  
  ;; LCD Archive Entry:
--- 21,27 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;; LCD Archive Entry:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/allout.el emacs-19.31/lisp/allout.el
*** emacs-19.30/lisp/allout.el	Mon Oct 30 11:46:46 1995
--- emacs-19.31/lisp/allout.el	Mon Jan 29 17:52:43 1996
***************
*** 22,27 ****
  
  ;; 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:
--- 22,28 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;;_* Commentary:
***************
*** 36,40 ****
  ;; It also includes such things as topic-oriented repositioning, cut, and
  ;; paste; integral outline exposure-layout; incremental search with
! ;; dynamic exposure/conceament of concealed text; automatic topic-number
  ;; maintenance; and many other features.
  ;; 
--- 37,41 ----
  ;; It also includes such things as topic-oriented repositioning, cut, and
  ;; paste; integral outline exposure-layout; incremental search with
! ;; dynamic exposure/concealment of concealed text; automatic topic-number
  ;; maintenance; and many other features.
  ;; 
*************** prefix, which is concluded by bullets th
*** 140,144 ****
  var and the respective outline-*-bullets-string vars.
  
! The value of an asterisk ('*') provides for backwards compatability
  with the original emacs outline mode.  See outline-plain-bullets-string
  and outline-distinctive-bullets-string for the range of available
--- 141,145 ----
  var and the respective outline-*-bullets-string vars.
  
! The value of an asterisk ('*') provides for backwards compatibility
  with the original emacs outline mode.  See outline-plain-bullets-string
  and outline-distinctive-bullets-string for the range of available
*************** is non-nil.")
*** 272,279 ****
    "*String designating bullet of topics that have auto-numbering; nil for none.
  
! Topics having this bullet have automatic maintainence of a sibling
  sequence-number tacked on, just after the bullet.  Conventionally set
  to \"#\", you can set it to a bullet of your choice.  A nil value
! disables numbering maintainence.")
  (make-variable-buffer-local 'outline-numbered-bullet)
  ;;;_  = outline-file-xref-bullet
--- 273,280 ----
    "*String designating bullet of topics that have auto-numbering; nil for none.
  
! Topics having this bullet have automatic maintenance of a sibling
  sequence-number tacked on, just after the bullet.  Conventionally set
  to \"#\", you can set it to a bullet of your choice.  A nil value
! disables numbering maintenance.")
  (make-variable-buffer-local 'outline-numbered-bullet)
  ;;;_  = outline-file-xref-bullet
*************** functions.")
*** 715,719 ****
  
  Allout outline mode regulates alteration of concealed text to protect
! against inadvertant, unnoticed changes.  This is for use by specific,
  native outline functions to temporarily override that protection.
  It's automatically reset to nil after every buffer modification.")
--- 716,720 ----
  
  Allout outline mode regulates alteration of concealed text to protect
! against inadvertent, unnoticed changes.  This is for use by specific,
  native outline functions to temporarily override that protection.
  It's automatically reset to nil after every buffer modification.")
*************** protection knows to keep inactive during
*** 755,759 ****
  ;;;_  = outline-explicitly-deactivated
  (defvar outline-explicitly-deactivated nil
!   "Outline-mode was last deliberately deactived.
  So outline-post-command-business should not reactivate it...")
  (make-variable-buffer-local 'outline-explicitly-deactivated)
--- 756,760 ----
  ;;;_  = outline-explicitly-deactivated
  (defvar outline-explicitly-deactivated nil
!   "Outline-mode was last deliberately deactivated.
  So outline-post-command-business should not reactivate it...")
  (make-variable-buffer-local 'outline-explicitly-deactivated)
*************** MODE is one of the following symbols:
*** 767,771 ****
   - 'activate', enable auto-activation only;
   - 'ask', enable auto-activation, and enable auto-layout but with
!    confirmation for layout operation solicitated from user each time;
   - 'report', just report and return the current auto-activation state;
   - anything else \(eg, t) for auto-activation and auto-layout, without
--- 768,772 ----
   - 'activate', enable auto-activation only;
   - 'ask', enable auto-activation, and enable auto-layout but with
!    confirmation for layout operation solicited from user each time;
   - 'report', just report and return the current auto-activation state;
   - anything else \(eg, t) for auto-activation and auto-layout, without
*************** which is organized in outline structure.
*** 849,853 ****
  It also includes such things as topic-oriented repositioning, cut, and
  paste; integral outline exposure-layout; incremental search with
! dynamic exposure/conceament of concealed text; automatic topic-number
  maintenance; and many other features.
  
--- 850,854 ----
  It also includes such things as topic-oriented repositioning, cut, and
  paste; integral outline exposure-layout; incremental search with
! dynamic exposure/concealment of concealed text; automatic topic-number
  maintenance; and many other features.
  
*************** OPEN:	A topic that is not closed, though
*** 1018,1022 ****
  		     (or (and (listp toggle)(car toggle))
  			 toggle)))
! 				       ; Activation specficially demanded?
  	 (explicit-activation (or
  			      ;;
--- 1019,1023 ----
  		     (or (and (listp toggle)(car toggle))
  			 toggle)))
! 				       ; Activation specifically demanded?
  	 (explicit-activation (or
  			      ;;
*************** Return the location of the beginning of 
*** 1409,1413 ****
    "Produce a location \"chart\" of subtopics of the containing topic.
  
! Optional argument LEVELS specifies the depth \(releative to start
  depth\) for the chart.  Subsequent optional args are not for public
  use.
--- 1410,1414 ----
    "Produce a location \"chart\" of subtopics of the containing topic.
  
! Optional argument LEVELS specifies the depth \(relative to start
  depth\) for the chart.  Subsequent optional args are not for public
  use.
*************** exposed reside.
*** 1547,1551 ****
     including their entries.
   - bare positive values indicate that this topic header should be
!    openned.
   - Lists signify the beginning and end points of regions that should
     be flagged, and the flag to employ.  (For concealment: '\(\?r\)', and
--- 1548,1552 ----
     including their entries.
   - bare positive values indicate that this topic header should be
!    opened.
   - Lists signify the beginning and end points of regions that should
     be flagged, and the flag to employ.  (For concealment: '\(\?r\)', and
*************** that the index for the numbered prefix w
*** 2236,2240 ****
  siblings back to start of level.  If INDEX is a number, then that
  number is used as the index for the numbered prefix (allowing, eg,
! sequential renumbering to not requre this function counting back the
  index for each successive sibling)."
  ;;;_    . Code:
--- 2237,2241 ----
  siblings back to start of level.  If INDEX is a number, then that
  number is used as the index for the numbered prefix (allowing, eg,
! sequential renumbering to not require this function counting back the
  index for each successive sibling)."
  ;;;_    . Code:
*************** Nuances:
*** 2359,2363 ****
    you're starting from, even when creating backwards.  This way you
    can easily create a sibling in front of the current topic without
!   having to go to its preceeding sibling, and then open forward
    from there."
  
--- 2360,2364 ----
    you're starting from, even when creating backwards.  This way you
    can easily create a sibling in front of the current topic without
!   having to go to its preceding sibling, and then open forward
    from there."
  
*************** Nuances:
*** 2393,2397 ****
                  (or (and (<= relative-depth 0)	; not descending;
                           (save-excursion
!                            ;; at b-o-b or preceeded by a blank line?
                             (or (> 0 (forward-line -1))
                                 (looking-at "^\\s-*$")
--- 2394,2398 ----
                  (or (and (<= relative-depth 0)	; not descending;
                           (save-excursion
!                            ;; at b-o-b or preceded by a blank line?
                             (or (> 0 (forward-line -1))
                                 (looking-at "^\\s-*$")
*************** Nuances:
*** 2485,2489 ****
  ;;;_     ; base topic - one from which open was issued
  ;;;_      , beginning char
! ;;;_      , amount of space before will be used, unless openning in place
  ;;;_      , end char will be used, unless opening before (and it still may)
  ;;;_     ; absolute depth of new topic
--- 2486,2490 ----
  ;;;_     ; base topic - one from which open was issued
  ;;;_      , beginning char
! ;;;_      , amount of space before will be used, unless opening in place
  ;;;_      , end char will be used, unless opening before (and it still may)
  ;;;_     ; absolute depth of new topic
*************** Maintains outline hanging topic indentat
*** 2550,2554 ****
  
  Optional arg NUMBER indicates numbering is being added, and it must
! be accomodated.
  
  Note that refill of indented paragraphs is not done."
--- 2551,2555 ----
  
  Optional arg NUMBER indicates numbering is being added, and it must
! be accommodated.
  
  Note that refill of indented paragraphs is not done."
*************** Does depth adjustment of yanked topics, 
*** 2938,2942 ****
       topic prefix.
  
! Also, adjusts numbering of subsequent siblings when appropropriate.
  
  Depth adjustment alters the depth of all the topics being yanked
--- 2939,2943 ----
       topic prefix.
  
! Also, adjusts numbering of subsequent siblings when appropriate.
  
  Depth adjustment alters the depth of all the topics being yanked
*************** however, are left exactly like normal, n
*** 3058,3062 ****
    "Outline-mode yank, with depth and numbering adjustment of yanked topics.
  
! Non-topic yanks work no differntly than normal yanks.
  
  If a topic is being yanked into a bare topic prefix, the depth of the
--- 3059,3063 ----
    "Outline-mode yank, with depth and numbering adjustment of yanked topics.
  
! Non-topic yanks work no differently than normal yanks.
  
  If a topic is being yanked into a bare topic prefix, the depth of the
*************** however, (ones that don't qualify for ad
*** 3077,3081 ****
  exactly like normal yanks.
  
! Numbering of yanked topics, and the succesive siblings at the depth
  into which they're being yanked, is adjusted.
  
--- 3078,3082 ----
  exactly like normal yanks.
  
! Numbering of yanked topics, and the successive siblings at the depth
  into which they're being yanked, is adjusted.
  
*************** representations of topic entries produce
*** 3265,3271 ****
  	  (let ((got (get-buffer frombuf)))
  	    (if (not got)
! 		(error (concat "outline-process-exposed: source buffer "
! 			       frombuf
! 			       " not found."))
  	      (setq frombuf got))))
      ;; not specified - default it:
--- 3266,3271 ----
  	  (let ((got (get-buffer frombuf)))
  	    (if (not got)
! 		(error "outline-process-exposed: source buffer %s not found."
! 		       frombuf)
  	      (setq frombuf got))))
      ;; not specified - default it:
*************** With repeat count, copy the exposed port
*** 4198,4202 ****
  (defalias 'outlinify-sticky 'outlineify-sticky)
  (defun outlineify-sticky (&optional arg)
!   "Activate outline mode and establish file var so it is started subseqently.
  
  See doc-string for `outline-layout' and `outline-init' for details on
--- 4198,4202 ----
  (defalias 'outlinify-sticky 'outlineify-sticky)
  (defun outlineify-sticky (&optional arg)
!   "Activate outline mode and establish file var so it is started subsequently.
  
  See doc-string for `outline-layout' and `outline-init' for details on
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/ange-ftp.el emacs-19.31/lisp/ange-ftp.el
*** emacs-19.30/lisp/ange-ftp.el	Thu Nov 16 17:27:14 1995
--- emacs-19.31/lisp/ange-ftp.el	Sun Mar 24 19:14:32 1996
***************
*** 1,622 ****
  ;;; ange-ftp.el --- transparent FTP support for GNU Emacs
  
! ;;; Copyright (C) 1989,90,91,92,93,94,95  Free Software Foundation, Inc.
! ;;;
  ;; Author: Andy Norman (ange@hplb.hpl.hp.com)
  ;; Keywords: comm
! ;;;
! ;;; This program 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.
! ;;;
! ;;; This program 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.
! ;;;
! ;;; A copy of the GNU General Public License can be obtained from this
! ;;; program's author (send electronic mail to ange@hplb.hpl.hp.com) or from
! ;;; the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA
! ;;; 02139, USA.
  
  ;;; Commentary:
! ;;;
! ;;; This package attempts to make accessing files and directories using FTP
! ;;; from within GNU Emacs as simple and transparent as possible.  A subset of
! ;;; the common file-handling routines are extended to interact with FTP.
! 
! ;;; Usage:
! ;;;
! ;;; Some of the common GNU Emacs file-handling operations have been made
! ;;; FTP-smart.  If one of these routines is given a filename that matches
! ;;; '/user@host:name' then it will spawn an FTP process connecting to machine
! ;;; 'host' as account 'user' and perform its operation on the file 'name'.
! ;;;
! ;;; For example: if find-file is given a filename of:
! ;;;
! ;;;   /ange@anorman:/tmp/notes
! ;;;
! ;;; then ange-ftp spawns an FTP process, connect to the host 'anorman' as
! ;;; user 'ange', get the file '/tmp/notes' and pop up a buffer containing the
! ;;; contents of that file as if it were on the local filesystem.  If ange-ftp
! ;;; needs a password to connect then it reads one in the echo area.
! 
! ;;; Extended filename syntax:
! ;;;
! ;;; The default extended filename syntax is '/user@host:name', where the
! ;;; 'user@' part may be omitted.  This syntax can be customised to a certain
! ;;; extent by changing ange-ftp-name-format.  There are limitations.
! ;;;
! ;;; If the user part is omitted then ange-ftp generates a default user
! ;;; instead whose value depends on the variable ange-ftp-default-user.
! 
! ;;; Passwords:
! ;;;
! ;;; A password is required for each host/user pair.  Ange-ftp reads passwords
! ;;; as needed.  You can also specify a password with ange-ftp-set-passwd, or
! ;;; in a *valid* ~/.netrc file.
! 
! ;;; Passwords for user "anonymous":
! ;;;
! ;;; Passwords for the user "anonymous" (or "ftp") are handled
! ;;; specially.  The variable `ange-ftp-generate-anonymous-password'
! ;;; controls what happens: if the value of this variable is a string,
! ;;; then this is used as the password; if non-nil (the default), then
! ;;; the value of `user-mail-address' is used; if nil then the user
! ;;; is prompted for a password as normal.
! 
! ;;; "Dumb" UNIX hosts:
! ;;;
! ;;; The FTP servers on some UNIX machines have problems if the 'ls' command is
! ;;; used.
! ;;;
! ;;; The routine ange-ftp-add-dumb-unix-host can be called to tell ange-ftp to
! ;;; limit itself to the DIR command and not 'ls' for a given UNIX host.  Note
! ;;; that this change will take effect for the current GNU Emacs session only.
! ;;; See below for a discussion of non-UNIX hosts.  If a large number of
! ;;; machines with similar hostnames have this problem then it is easier to set
! ;;; the value of ange-ftp-dumb-unix-host-regexp in your .emacs file. ange-ftp
! ;;; is unable to automatically recognize dumb unix hosts.
! 
! ;;; File name completion:
! ;;;
! ;;; Full file-name completion is supported on UNIX, VMS, CMS, and MTS hosts.
! ;;; To do filename completion, ange-ftp needs a listing from the remote host.
! ;;; Therefore, for very slow connections, it might not save any time.
! 
! ;;; FTP processes:
! ;;;
! ;;; When ange-ftp starts up an FTP process, it leaves it running for speed
! ;;; purposes.  Some FTP servers will close the connection after a period of
! ;;; time, but ange-ftp should be able to quietly reconnect the next time that
! ;;; the process is needed.
! ;;;
! ;;; Killing the "*ftp user@host*" buffer also kills the ftp process.
! ;;; This should not cause ange-ftp any grief.
! 
! ;;; Binary file transfers:
! ;;;
! ;;; By default ange-ftp transfers files in ASCII mode.  If a file being
! ;;; transferred matches the value of ange-ftp-binary-file-name-regexp then
! ;;; binary mode is used for that transfer.
! 
! ;;; Account passwords:
! ;;;
! ;;; Some FTP servers require an additional password which is sent by the
! ;;; ACCOUNT command.  ange-ftp partially supports this by allowing the user to
! ;;; specify an account password by either calling ange-ftp-set-account, or by
! ;;; specifying an account token in the .netrc file.  If the account password
! ;;; is set by either of these methods then ange-ftp will issue an ACCOUNT
! ;;; command upon starting the FTP process.
! 
! ;;; Preloading:
! ;;;
! ;;; ange-ftp can be preloaded, but must be put in the site-init.el file and
! ;;; not the site-load.el file in order for the documentation strings for the
! ;;; functions being overloaded to be available.
! 
! ;;; Status reports:
! ;;;
! ;;; Most ange-ftp commands that talk to the FTP process output a status
! ;;; message on what they are doing.  In addition, ange-ftp can take advantage
! ;;; of the FTP client's HASH command to display the status of transferring
! ;;; files and listing directories.  See the documentation for the variables
! ;;; ange-ftp-{ascii,binary}-hash-mark-size, ange-ftp-send-hash and
! ;;; ange-ftp-process-verbose for more details.
! 
! ;;; Gateways:
! ;;;
! ;;; Sometimes it is necessary for the FTP process to be run on a different
! ;;; machine than the machine running GNU Emacs.  This can happen when the
! ;;; local machine has restrictions on what hosts it can access.
! ;;;
! ;;; ange-ftp has support for running the ftp process on a different (gateway)
! ;;; machine.  The way it works is as follows:
! ;;;
! ;;; 1) Set the variable 'ange-ftp-gateway-host' to the name of a machine
! ;;;    that doesn't have the access restrictions.
! ;;;
! ;;; 2) Set the variable 'ange-ftp-local-host-regexp' to a regular expression
! ;;;    that matches hosts that can be contacted from running a local ftp
! ;;;    process, but fails to match hosts that can't be accessed locally.  For
! ;;;    example:
! ;;;
! ;;;    "\\.hp\\.com$\\|^[^.]*$"
! ;;;
! ;;;    will match all hosts that are in the .hp.com domain, or don't have an
! ;;;    explicit domain in their name, but will fail to match hosts with
! ;;;    explicit domains or that are specified by their ip address.
! ;;;
! ;;; 3) Using NFS and symlinks, make sure that there is a shared directory with
! ;;;    the *same* name between the local machine and the gateway machine.
! ;;;    This directory is necessary for temporary files created by ange-ftp.
! ;;;
! ;;; 4) Set the variable 'ange-ftp-gateway-tmp-name-template' to the name of
! ;;;    this directory plus an identifying filename prefix.  For example:
! ;;;
! ;;;    "/nfs/hplose/ange/ange-ftp"
! ;;;
! ;;;    where /nfs/hplose/ange is a directory that is shared between the
! ;;;    gateway machine and the local machine.
! ;;;
! ;;; The simplest way of getting a ftp process running on the gateway machine
! ;;; is if you can spawn a remote shell using either 'rsh' or 'remsh'.  If you
! ;;; can't do this for some reason such as security then points 7 onwards will
! ;;; discuss an alternative approach.
! ;;;
! ;;; 5) Set the variable ange-ftp-gateway-program to the name of the remote
! ;;;    shell process such as 'remsh' or 'rsh' if the default isn't correct.
! ;;;
! ;;; 6) Set the variable ange-ftp-gateway-program-interactive to nil if it
! ;;;    isn't already.  This tells ange-ftp that you are using a remote shell
! ;;;    rather than logging in using telnet or rlogin.
! ;;;
! ;;; That should be all you need to allow ange-ftp to spawn a ftp process on
! ;;; the gateway machine.  If you have to use telnet or rlogin to get to the
! ;;; gateway machine then follow the instructions below.
! ;;;
! ;;; 7) Set the variable ange-ftp-gateway-program to the name of the program
! ;;;    that lets you log onto the gateway machine.  This may be something like
! ;;;    telnet or rlogin.
! ;;;
! ;;; 8) Set the variable ange-ftp-gateway-prompt-pattern to a regular
! ;;;    expression that matches the prompt you get when you login to the
! ;;;    gateway machine.  Be very specific here; this regexp must not match
! ;;;    *anything* in your login banner except this prompt.
! ;;;    shell-prompt-pattern is far too general as it appears to match some
! ;;;    login banners from Sun machines.  For example:
! ;;;
! ;;;    "^$*$ *"
! ;;;
! ;;; 9) Set the variable ange-ftp-gateway-program-interactive to 't' to let
! ;;;    ange-ftp know that it has to "hand-hold" the login to the gateway
! ;;;    machine.
! ;;;
! ;;; 10) Set the variable ange-ftp-gateway-setup-term-command to a UNIX command
! ;;;     that will put the pty connected to the gateway machine into a
! ;;;     no-echoing mode, and will strip off carriage-returns from output from
! ;;;     the gateway machine.  For example:
! ;;;
! ;;;     "stty -onlcr -echo"
! ;;;
! ;;;     will work on HP-UX machines, whereas:
! ;;;
! ;;;     "stty -echo nl"
! ;;;
! ;;;     appears to work for some Sun machines.
! ;;;
! ;;; That's all there is to it.
! 
! ;;; Smart gateways:
! ;;;
! ;;; If you have a "smart" ftp program that allows you to issue commands like
! ;;; "USER foo@bar" which do nice proxy things, then look at the variables
! ;;; ange-ftp-smart-gateway and ange-ftp-smart-gateway-port.
! ;;;
! ;;; Otherwise, if there is an alternate ftp program that implements proxy in
! ;;; a transparent way (i.e. w/o specifying the proxy host), that will
! ;;; connect you directly to the desired destination host:
! ;;; Set ange-ftp-gateway-ftp-program-name to that program's name.
! ;;; Set ange-ftp-local-host-regexp to a value as stated earlier on.
! ;;; Leave ange-ftp-gateway-host set to nil.
! ;;; Set ange-ftp-smart-gateway to t.
! 
! ;;; Tips for using ange-ftp:
! ;;;
! ;;; 1. For dired to work on a host which marks symlinks with a trailing @ in
! ;;;    an ls -alF listing, you need to (setq dired-ls-F-marks-symlinks t).
! ;;;    Most UNIX systems do not do this, but ULTRIX does. If you think that
! ;;;    there is a chance you might connect to an ULTRIX machine (such as
! ;;;    prep.ai.mit.edu), then set this variable accordingly.  This will have
! ;;;    the side effect that dired will have problems with symlinks whose names
! ;;;    end in an @.  If you get yourself into this situation then editing
! ;;;    dired's ls-switches to remove "F", will temporarily fix things.
! ;;;
! ;;; 2. If you know that you are connecting to a certain non-UNIX machine
! ;;;    frequently, and ange-ftp seems to be unable to guess its host-type,
! ;;;    then setting the appropriate host-type regexp
! ;;;    (ange-ftp-vms-host-regexp, ange-ftp-mts-host-regexp, or
! ;;;    ange-ftp-cms-host-regexp) accordingly should help. Also, please report
! ;;;    ange-ftp's inability to recognize the host-type as a bug.
! ;;;
! ;;; 3. For slow connections, you might get "listing unreadable" error
! ;;;    messages, or get an empty buffer for a file that you know has something
! ;;;    in it. The solution is to increase the value of ange-ftp-retry-time.
! ;;;    Its default value is 5 which is plenty for reasonable connections.
! ;;;    However, for some transatlantic connections I set this to 20.
! ;;;
! ;;; 4. Beware of compressing files on non-UNIX hosts. Ange-ftp will do it by
! ;;;    copying the file to the local machine, compressing it there, and then
! ;;;    sending it back. Binary file transfers between machines of different
! ;;;    architectures can be a risky business. Test things out first on some
! ;;;    test files. See "Bugs" below. Also, note that ange-ftp copies files by
! ;;;    moving them through the local machine. Again, be careful when doing
! ;;;    this with binary files on non-Unix machines.
! ;;;
! ;;; 5. Beware that dired over ftp will use your setting of dired-no-confirm
! ;;;    (list of dired commands for which confirmation is not asked).  You
! ;;;    might want to reconsider your setting of this variable, because you
! ;;;    might want confirmation for more commands on remote direds than on
! ;;;    local direds. For example, I strongly recommend that you not include
! ;;;    compress and uncompress in this list. If there is enough demand it
! ;;;    might be a good idea to have an alist ange-ftp-dired-no-confirm of
! ;;;    pairs ( TYPE . LIST ), where TYPE is an operating system type and LIST
! ;;;    is a list of commands for which confirmation would be suppressed.  Then
! ;;;    remote dired listings would take their (buffer-local) value of
! ;;;    dired-no-confirm from this alist. Who votes for this?
! 
! ;;; ---------------------------------------------------------------------
! ;;; Non-UNIX support:
! ;;; ---------------------------------------------------------------------
! 
! ;;; VMS support:
! ;;;
! ;;; Ange-ftp has full support for VMS hosts.  It
! ;;; should be able to automatically recognize any VMS machine. However, if it
! ;;; fails to do this, you can use the command ange-ftp-add-vms-host.  As well,
! ;;; you can set the variable ange-ftp-vms-host-regexp in your .emacs file. We
! ;;; would be grateful if you would report any failures to automatically
! ;;; recognize a VMS host as a bug.
! ;;;
! ;;; Filename Syntax:
! ;;;
! ;;; For ease of *implementation*, the user enters the VMS filename syntax in a
! ;;; UNIX-y way.  For example:
! ;;;  PUB$:[ANONYMOUS.SDSCPUB.NEXT]README.TXT;1
! ;;; would be entered as:
! ;;;  /PUB$$:/ANONYMOUS/SDSCPUB/NEXT/README.TXT;1
! ;;; i.e. to log in as anonymous on ymir.claremont.edu and grab the file:
! ;;;  [.CSV.POLICY]RULES.MEM
! ;;; you would type:
! ;;;  C-x C-f /anonymous@ymir.claremont.edu:CSV/POLICY/RULES.MEM
! ;;;
! ;;; A legal VMS filename is of the form: FILE.TYPE;##
! ;;; where FILE can be up to 39 characters
! ;;;       TYPE can be up to 39 characters
! ;;;       ## is a version number (an integer between 1 and 32,767)
! ;;; Valid characters in FILE and TYPE are A-Z 0-9 _ - $
! ;;; $ cannot begin a filename, and - cannot be used as the first or last
! ;;; character.
! ;;;
! ;;; Tips:
! ;;; 1. Although VMS is not case sensitive, EMACS running under UNIX is.
! ;;;    Therefore, to access a VMS file, you must enter the filename with upper
! ;;;    case letters.
! ;;; 2. To access the latest version of file under VMS, you use the filename
! ;;;    without the ";" and version number. You should always edit the latest
! ;;;    version of a file. If you want to edit an earlier version, copy it to a
! ;;;    new file first. This has nothing to do with ange-ftp, but is simply
! ;;;    good VMS operating practice. Therefore, to edit FILE.TXT;3 (say 3 is
! ;;;    latest version), do C-x C-f /ymir.claremont.edu:FILE.TXT. If you
! ;;;    inadvertently do C-x C-f /ymir.claremont.edu:FILE.TXT;3, you will find
! ;;;    that VMS will not allow you to save the file because it will refuse to
! ;;;    overwrite FILE.TXT;3, but instead will want to create FILE.TXT;4, and
! ;;;    attach the buffer to this file. To get out of this situation, M-x
! ;;;    write-file /ymir.claremont.edu:FILE.TXT will attach the buffer to
! ;;;    latest version of the file. For this reason, in dired "f"
! ;;;    (dired-find-file), always loads the file sans version, whereas "v",
! ;;;    (dired-view-file), always loads the explicit version number. The
! ;;;    reasoning being that it reasonable to view old versions of a file, but
! ;;;    not to edit them.
! ;;; 3. EMACS has a feature in which it does environment variable substitution
! ;;;    in filenames. Therefore, to enter a $ in a filename, you must quote it
! ;;;    by typing $$.
! 
! ;;; MTS support:
! ;;;
! ;;; Ange-ftp has full support for hosts running
! ;;; the Michigan terminal system.  It should be able to automatically
! ;;; recognize any MTS machine. However, if it fails to do this, you can use
! ;;; the command ange-ftp-add-mts-host.  As well, you can set the variable
! ;;; ange-ftp-mts-host-regexp in your .emacs file. We would be grateful if you
! ;;; would report any failures to automatically recognize a MTS host as a bug.
! ;;;
! ;;; Filename syntax:
! ;;; 
! ;;; MTS filenames are entered in a UNIX-y way. For example, if your account
! ;;; was YYYY, the file FILE in the account XXXX: on mtsg.ubc.ca would be
! ;;; entered as
! ;;;   /YYYY@mtsg.ubc.ca:/XXXX:/FILE
! ;;; In other words, MTS accounts are treated as UNIX directories. Of course,
! ;;; to access a file in another account, you must have access permission for
! ;;; it.  If FILE were in your own account, then you could enter it in a
! ;;; relative name fashion as
! ;;;   /YYYY@mtsg.ubc.ca:FILE
! ;;; MTS filenames can be up to 12 characters. Like UNIX, the structure of the
! ;;; filename does not contain a TYPE (i.e. it can have as many "."'s as you
! ;;; like.) MTS filenames are always in upper case, and hence be sure to enter
! ;;; them as such! MTS is not case sensitive, but an EMACS running under UNIX
! ;;; is.
! 
! ;;; CMS support:
! ;;; 
! ;;; Ange-ftp has full support for hosts running
! ;;; CMS.  It should be able to automatically recognize any CMS machine.
! ;;; However, if it fails to do this, you can use the command
! ;;; ange-ftp-add-cms-host.  As well, you can set the variable
! ;;; ange-ftp-cms-host-regexp in your .emacs file. We would be grateful if you
! ;;; would report any failures to automatically recognize a CMS host as a bug.
! ;;; 
! ;;; Filename syntax:
! ;;;
! ;;; CMS filenames are entered in a UNIX-y way. In otherwords, minidisks are
! ;;; treated as UNIX directories. For example to access the file READ.ME in
! ;;; minidisk *.311 on cuvmb.cc.columbia.edu, you would enter
! ;;;   /anonymous@cuvmb.cc.columbia.edu:/*.311/READ.ME
! ;;; If *.301 is the default minidisk for this account, you could access
! ;;; FOO.BAR on this minidisk as
! ;;;   /anonymous@cuvmb.cc.columbia.edu:FOO.BAR
! ;;; CMS filenames are of the form FILE.TYPE, where both FILE and TYPE can be
! ;;; up to 8 characters. Again, beware that CMS filenames are always upper
! ;;; case, and hence must be entered as such.
! ;;;
! ;;; Tips:
! ;;; 1. CMS machines, with the exception of anonymous accounts, nearly always
! ;;;    need an account password. To have ange-ftp send an account password,
! ;;;    you can either include it in your .netrc file, or use
! ;;;    ange-ftp-set-account.
! ;;; 2. Ange-ftp cannot send "write passwords" for a minidisk. Hopefully, we
! ;;;    can fix this.
! ;;;
! ;;; ------------------------------------------------------------------
! ;;; Bugs:
! ;;; ------------------------------------------------------------------
! ;;; 
! ;;; 1. Umask problems:
! ;;;    Be warned that files created by using ange-ftp will take account of the
! ;;;    umask of the ftp daemon process rather than the umask of the creating
! ;;;    user.  This is particularly important when logging in as the root user.
! ;;;    The way that I tighten up the ftp daemon's umask under HP-UX is to make
! ;;;    sure that the umask is changed to 027 before I spawn /etc/inetd.  I
! ;;;    suspect that there is something similar on other systems.
! ;;;
! ;;; 2. Some combinations of FTP clients and servers break and get out of sync
! ;;;    when asked to list a non-existent directory.  Some of the ai.mit.edu
! ;;;    machines cause this problem for some FTP clients. Using
! ;;;    ange-ftp-kill-ftp-process can restart the ftp process, which
! ;;;    should get things back in synch.
! ;;;
! ;;; 3. Ange-ftp does not check to make sure that when creating a new file,
! ;;;    you provide a valid filename for the remote operating system.
! ;;;    If you do not, then the remote FTP server will most likely
! ;;;    translate your filename in some way. This may cause ange-ftp to
! ;;;    get confused about what exactly is the name of the file. The
! ;;;    most common causes of this are using lower case filenames on systems
! ;;;    which support only upper case, and using filenames which are too
! ;;;    long.
! ;;;
! ;;; 4. Null (blank) passwords confuse both ange-ftp and some FTP daemons.
! ;;;
! ;;; 5. Ange-ftp likes to use pty's to talk to its FTP processes.  If GNU Emacs
! ;;;    for some reason creates a FTP process that only talks via pipes then
! ;;;    ange-ftp won't be getting the information it requires at the time that
! ;;;    it wants it since pipes flush at different times to pty's.  One
! ;;;    disgusting way around this problem is to talk to the FTP process via
! ;;;    rlogin which does the 'right' things with pty's.
! ;;;
! ;;; 6. For CMS support, we send too many cd's. Since cd's are cheap, I haven't
! ;;;    worried about this too much. Eventually, we should have some caching
! ;;;    of the current minidisk.
! ;;;    
! ;;; 7. Some CMS machines do not assign a default minidisk when you ftp them as
! ;;;    anonymous. It is then necessary to guess a valid minidisk name, and cd
! ;;;    to it. This is (understandably) beyond ange-ftp.
! ;;;
! ;;; 8. Remote to remote copying of files on non-Unix machines can be risky.
! ;;;    Depending on the variable ange-ftp-binary-file-name-regexp, ange-ftp
! ;;;    will use binary mode for the copy. Between systems of different
! ;;;    architecture, this still may not be enough to guarantee the integrity
! ;;;    of binary files. Binary file transfers from VMS machines are
! ;;;    particularly problematical. Should ange-ftp-binary-file-name-regexp be
! ;;;    an alist of OS type, regexp pairs?
! ;;;
! ;;; 9. The code to do compression of files over ftp is not as careful as it
! ;;;    should be. It deletes the old remote version of the file, before
! ;;;    actually checking if the local to remote transfer of the compressed
! ;;;    file succeeds. Of course to delete the original version of the file
! ;;;    after transferring the compressed version back is also dangerous,
! ;;;    because some OS's have severe restrictions on the length of filenames,
! ;;;    and when the compressed version is copied back the "-Z" or ".Z" may be
! ;;;    truncated. Then, ange-ftp would delete the only remaining version of
! ;;;    the file.  Maybe ange-ftp should make backups when it compresses files
! ;;;    (of course, the backup "~" could also be truncated off, sigh...).
! ;;;    Suggestions?
! ;;;
! 
! ;;; 10. If a dir listing is attempted for an empty directory on (at least
! ;;;     some) VMS hosts, an ftp error is given. This is really an ftp bug, and
! ;;;     I don't know how to get ange-ftp work to around it.
! ;;;
! ;;; 11. Bombs on filenames that start with a space. Deals well with filenames
! ;;;     containing spaces, but beware that the remote ftpd may not like them
! ;;;     much.
! ;;;
! ;;; 12. The dired support for non-Unix-like systems does not currently work.
! ;;;     It needs to be reimplemented by modifying the parse-...-listing
! ;;;	functions to convert the directory listing to ls -l format.
! ;;; 
! ;;; 13. The famous @ bug. As mentioned above in TIPS, ULTRIX marks symlinks
! ;;;     with a trailing @ in a ls -alF listing. In order to account for this
! ;;;     ange-ftp looks to chop trailing @'s off of symlink names when it is
! ;;;     parsing a listing with the F switch. This will cause ange-ftp to
! ;;;     incorrectly get the name of a symlink on a non-ULTRIX host if its name
! ;;;     ends in an @. ange-ftp will correct itself if you take F out of the
! ;;;     dired ls switches (C-u s will allow you to edit the switches). The
! ;;;     dired buffer will be automatically reverted, which will allow ange-ftp
! ;;;     to fix its files hashtable.  A cookie to anyone who can think of a
! ;;;     fast, sure-fire way to recognize ULTRIX over ftp.
! 
! ;;; If you find any bugs or problems with this package, PLEASE either e-mail
! ;;; the above author, or send a message to the ange-ftp-lovers mailing list
! ;;; below.  Ideas and constructive comments are especially welcome.
! 
! ;;; ange-ftp-lovers:
! ;;;
! ;;; ange-ftp has its own mailing list modestly called ange-ftp-lovers.  All
! ;;; users of ange-ftp are welcome to subscribe (see below) and to discuss
! ;;; aspects of ange-ftp.  New versions of ange-ftp are posted periodically to
! ;;; the mailing list.
! ;;;
! ;;; To [un]subscribe to ange-ftp-lovers, or to report mailer problems with the
! ;;; list, please mail one of the following addresses:
! ;;;
! ;;;     ange-ftp-lovers-request@anorman.hpl.hp.com
! ;;; or
! ;;;     ange-ftp-lovers-request%anorman.hpl.hp.com@hplb.hpl.hp.com
! ;;;
! ;;; Please don't forget the -request part.
! ;;;
! ;;; For mail to be posted directly to ange-ftp-lovers, send to one of the
! ;;; following addresses:
! ;;; 
! ;;;     ange-ftp-lovers@anorman.hpl.hp.com
! ;;; or
! ;;;     ange-ftp-lovers%anorman.hpl.hp.com@hplb.hpl.hp.com
! ;;;
! ;;; Alternatively, there is a mailing list that only gets announcements of new
! ;;; ange-ftp releases.  This is called ange-ftp-lovers-announce, and can be
! ;;; subscribed to by e-mailing to the -request address as above.  Please make
! ;;; it clear in the request which mailing list you wish to join.
! 
! ;;; The latest version of ange-ftp can usually be obtained via anonymous ftp
! ;;; from:
! ;;;     alpha.gnu.ai.mit.edu:ange-ftp/ange-ftp.tar.Z
! ;;; or:
! ;;;     ugle.unit.no:/pub/gnu/emacs-lisp/ange-ftp.tar.Z
! ;;; or:
! ;;;   archive.cis.ohio-state.edu:pub/gnu/emacs/elisp-archive/packages/ange-ftp.tar.Z
! 
! ;;; The archives for ange-ftp-lovers can be found via anonymous ftp under:
! ;;;
! ;;;     ftp.reed.edu:pub/mailing-lists/ange-ftp/
  
! ;;; -----------------------------------------------------------
! ;;; Technical information on this package:
! ;;; -----------------------------------------------------------
! 
! ;;; ange-ftp works by putting a handler on file-name-handler-alist
! ;;; which is called by many primitives, and a few non-primitives,
! ;;; whenever they see a file name of the appropriate sort.
! 
! ;;; Checklist for adding non-UNIX support for TYPE
! ;;; 
! ;;; The following functions may need TYPE versions:
! ;;; (not all functions will be needed for every OS)
! ;;;
! ;;; ange-ftp-fix-name-for-TYPE
! ;;; ange-ftp-fix-dir-name-for-TYPE
! ;;; ange-ftp-TYPE-host
! ;;; ange-ftp-TYPE-add-host
! ;;; ange-ftp-parse-TYPE-listing
! ;;; ange-ftp-TYPE-delete-file-entry
! ;;; ange-ftp-TYPE-add-file-entry
! ;;; ange-ftp-TYPE-file-name-as-directory
! ;;; ange-ftp-TYPE-make-compressed-filename
! ;;; ange-ftp-TYPE-file-name-sans-versions
! ;;;
! ;;; Variables:
! ;;;
! ;;; ange-ftp-TYPE-host-regexp
! ;;; May need to add TYPE to ange-ftp-dumb-host-types
! ;;;
! ;;; Check the following functions for OS dependent coding:
! ;;;
! ;;; ange-ftp-host-type
! ;;; ange-ftp-guess-host-type
! ;;; ange-ftp-allow-child-lookup
! 
! ;;; Host type conventions:
! ;;;
! ;;; The function ange-ftp-host-type and the variable ange-ftp-dired-host-type
! ;;; (mostly) follow the following conventions for remote host types.  At
! ;;; least, I think that future code should try to follow these conventions,
! ;;; and the current code should eventually be made compliant.
! ;;;
! ;;; nil = local host type, whatever that is (probably unix).
! ;;;       Think nil as in "not a remote host". This value is used by
! ;;;       ange-ftp-dired-host-type for local buffers.
! ;;;
! ;;; t = a remote host of unknown type. Think t is in true, it's remote.
! ;;;     Currently, 'unix is used as the default remote host type.
! ;;;     Maybe we should use t.
! ;;;
! ;;; 'type = a remote host of TYPE type.
! ;;;
! ;;; 'type:list = a remote host of TYPE type, using a specialized ftp listing
! ;;;              program called list. This is currently only used for Unix
! ;;;              dl (descriptive listings), when ange-ftp-dired-host-type
! ;;;              is set to 'unix:dl.
! 
! ;;; Bug report codes:
! ;;;
! ;;; Because of their naive faith in this code, there are certain situations
! ;;; which the writers of this program believe could never happen. However,
! ;;; being realists they have put calls to `error' in the program at these
! ;;; points. These errors provide a code, which is an integer, greater than 1.
! ;;; To aid debugging.  the error codes, and the functions in which they reside
! ;;; are listed below.
! ;;; 
! ;;; 1: See ange-ftp-ls
! ;;;
  
! ;;; -----------------------------------------------------------
! ;;; Hall of fame:
! ;;; -----------------------------------------------------------
! ;;; 
! ;;; Thanks to Roland McGrath for improving the filename syntax handling,
! ;;; for suggesting many enhancements and for numerous cleanups to the code.
! ;;;
! ;;; Thanks to Jamie Zawinski for bugfixes and for ideas such as gateways.
! ;;;
! ;;; Thanks to Ken Laprade for improved .netrc parsing, password reading, and
! ;;; dired / shell auto-loading.
! ;;;
! ;;; Thanks to Sebastian Kremer for dired support and for many ideas and
! ;;; bugfixes.
! ;;;
! ;;; Thanks to Joe Wells for bugfixes, the original non-UNIX system support,
! ;;; VOS support, and hostname completion.
! ;;;
! ;;; Thanks to Nakagawa Takayuki for many good ideas, filename-completion, help
! ;;; with file-name expansion, efficiency worries, stylistic concerns and many
! ;;; bugfixes.
! ;;;
! ;;; Thanks to Sandy Rutherford who re-wrote most of ange-ftp to support VMS,
! ;;; MTS, CMS and UNIX-dls.  Sandy also added dired-support for non-UNIX OS and
! ;;; auto-recognition of the host type.
! ;;;
! ;;; Thanks to Dave Smith who wrote the info file for ange-ftp.
! ;;;
! ;;; Finally, thanks to Keith Waclena, Mark D. Baushke, Terence Kelleher, Ping
! ;;; Zhou, Edward Vielmetti, Jack Repenning, Mike Balenger, Todd Kaufmann,
! ;;; Kjetil Svarstad, Tom Wurgler, Linus Tolke, Niko Makila, Carl Edman, Bill
! ;;; Trost, Dave Brennan, Dan Jacobson, Andy Scott, Steve Anderson, Sanjay
! ;;; Mathur, the folks on the ange-ftp-lovers mailing list and many others
! ;;; whose names I've forgotten who have helped to debug and fix problems with
! ;;; ange-ftp.el.
  
- 
  ;;; Code:
  (require 'comint)
  
--- 1,624 ----
  ;;; ange-ftp.el --- transparent FTP support for GNU Emacs
  
! ;; Copyright (C) 1989,90,91,92,93,94,95,96  Free Software Foundation, Inc.
! 
  ;; Author: Andy Norman (ange@hplb.hpl.hp.com)
+ ;; Maintainer: FSF
  ;; Keywords: comm
! 
! ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
! 
! ;; This package attempts to make accessing files and directories using FTP
! ;; from within GNU Emacs as simple and transparent as possible.  A subset of
! ;; the common file-handling routines are extended to interact with FTP.
! 
! ;; Usage:
! ;;
! ;; Some of the common GNU Emacs file-handling operations have been made
! ;; FTP-smart.  If one of these routines is given a filename that matches
! ;; '/user@host:name' then it will spawn an FTP process connecting to machine
! ;; 'host' as account 'user' and perform its operation on the file 'name'.
! ;;
! ;; For example: if find-file is given a filename of:
! ;;
! ;;   /ange@anorman:/tmp/notes
! ;;
! ;; then ange-ftp spawns an FTP process, connect to the host 'anorman' as
! ;; user 'ange', get the file '/tmp/notes' and pop up a buffer containing the
! ;; contents of that file as if it were on the local filesystem.  If ange-ftp
! ;; needs a password to connect then it reads one in the echo area.
! 
! ;; Extended filename syntax:
! ;;
! ;; The default extended filename syntax is '/user@host:name', where the
! ;; 'user@' part may be omitted.  This syntax can be customised to a certain
! ;; extent by changing ange-ftp-name-format.  There are limitations.
! ;;
! ;; If the user part is omitted then ange-ftp generates a default user
! ;; instead whose value depends on the variable ange-ftp-default-user.
! 
! ;; Passwords:
! ;;
! ;; A password is required for each host/user pair.  Ange-ftp reads passwords
! ;; as needed.  You can also specify a password with ange-ftp-set-passwd, or
! ;; in a *valid* ~/.netrc file.
! 
! ;; Passwords for user "anonymous":
! ;;
! ;; Passwords for the user "anonymous" (or "ftp") are handled
! ;; specially.  The variable `ange-ftp-generate-anonymous-password'
! ;; controls what happens: if the value of this variable is a string,
! ;; then this is used as the password; if non-nil (the default), then
! ;; the value of `user-mail-address' is used; if nil then the user
! ;; is prompted for a password as normal.
! 
! ;; "Dumb" UNIX hosts:
! ;;
! ;; The FTP servers on some UNIX machines have problems if the 'ls' command is
! ;; used.
! ;;
! ;; The routine ange-ftp-add-dumb-unix-host can be called to tell ange-ftp to
! ;; limit itself to the DIR command and not 'ls' for a given UNIX host.  Note
! ;; that this change will take effect for the current GNU Emacs session only.
! ;; See below for a discussion of non-UNIX hosts.  If a large number of
! ;; machines with similar hostnames have this problem then it is easier to set
! ;; the value of ange-ftp-dumb-unix-host-regexp in your .emacs file. ange-ftp
! ;; is unable to automatically recognize dumb unix hosts.
! 
! ;; File name completion:
! ;;
! ;; Full file-name completion is supported on UNIX, VMS, CMS, and MTS hosts.
! ;; To do filename completion, ange-ftp needs a listing from the remote host.
! ;; Therefore, for very slow connections, it might not save any time.
! 
! ;; FTP processes:
! ;;
! ;; When ange-ftp starts up an FTP process, it leaves it running for speed
! ;; purposes.  Some FTP servers will close the connection after a period of
! ;; time, but ange-ftp should be able to quietly reconnect the next time that
! ;; the process is needed.
! ;;
! ;; Killing the "*ftp user@host*" buffer also kills the ftp process.
! ;; This should not cause ange-ftp any grief.
! 
! ;; Binary file transfers:
! ;;
! ;; By default ange-ftp transfers files in ASCII mode.  If a file being
! ;; transferred matches the value of ange-ftp-binary-file-name-regexp then
! ;; binary mode is used for that transfer.
! 
! ;; Account passwords:
! ;;
! ;; Some FTP servers require an additional password which is sent by the
! ;; ACCOUNT command.  ange-ftp partially supports this by allowing the user to
! ;; specify an account password by either calling ange-ftp-set-account, or by
! ;; specifying an account token in the .netrc file.  If the account password
! ;; is set by either of these methods then ange-ftp will issue an ACCOUNT
! ;; command upon starting the FTP process.
! 
! ;; Preloading:
! ;;
! ;; ange-ftp can be preloaded, but must be put in the site-init.el file and
! ;; not the site-load.el file in order for the documentation strings for the
! ;; functions being overloaded to be available.
! 
! ;; Status reports:
! ;;
! ;; Most ange-ftp commands that talk to the FTP process output a status
! ;; message on what they are doing.  In addition, ange-ftp can take advantage
! ;; of the FTP client's HASH command to display the status of transferring
! ;; files and listing directories.  See the documentation for the variables
! ;; ange-ftp-{ascii,binary}-hash-mark-size, ange-ftp-send-hash and
! ;; ange-ftp-process-verbose for more details.
! 
! ;; Gateways:
! ;;
! ;; Sometimes it is necessary for the FTP process to be run on a different
! ;; machine than the machine running GNU Emacs.  This can happen when the
! ;; local machine has restrictions on what hosts it can access.
! ;;
! ;; ange-ftp has support for running the ftp process on a different (gateway)
! ;; machine.  The way it works is as follows:
! ;;
! ;; 1) Set the variable 'ange-ftp-gateway-host' to the name of a machine
! ;;    that doesn't have the access restrictions.
! ;;
! ;; 2) Set the variable 'ange-ftp-local-host-regexp' to a regular expression
! ;;    that matches hosts that can be contacted from running a local ftp
! ;;    process, but fails to match hosts that can't be accessed locally.  For
! ;;    example:
! ;;
! ;;    "\\.hp\\.com$\\|^[^.]*$"
! ;;
! ;;    will match all hosts that are in the .hp.com domain, or don't have an
! ;;    explicit domain in their name, but will fail to match hosts with
! ;;    explicit domains or that are specified by their ip address.
! ;;
! ;; 3) Using NFS and symlinks, make sure that there is a shared directory with
! ;;    the *same* name between the local machine and the gateway machine.
! ;;    This directory is necessary for temporary files created by ange-ftp.
! ;;
! ;; 4) Set the variable 'ange-ftp-gateway-tmp-name-template' to the name of
! ;;    this directory plus an identifying filename prefix.  For example:
! ;;
! ;;    "/nfs/hplose/ange/ange-ftp"
! ;;
! ;;    where /nfs/hplose/ange is a directory that is shared between the
! ;;    gateway machine and the local machine.
! ;;
! ;; The simplest way of getting a ftp process running on the gateway machine
! ;; is if you can spawn a remote shell using either 'rsh' or 'remsh'.  If you
! ;; can't do this for some reason such as security then points 7 onwards will
! ;; discuss an alternative approach.
! ;;
! ;; 5) Set the variable ange-ftp-gateway-program to the name of the remote
! ;;    shell process such as 'remsh' or 'rsh' if the default isn't correct.
! ;;
! ;; 6) Set the variable ange-ftp-gateway-program-interactive to nil if it
! ;;    isn't already.  This tells ange-ftp that you are using a remote shell
! ;;    rather than logging in using telnet or rlogin.
! ;;
! ;; That should be all you need to allow ange-ftp to spawn a ftp process on
! ;; the gateway machine.  If you have to use telnet or rlogin to get to the
! ;; gateway machine then follow the instructions below.
! ;;
! ;; 7) Set the variable ange-ftp-gateway-program to the name of the program
! ;;    that lets you log onto the gateway machine.  This may be something like
! ;;    telnet or rlogin.
! ;;
! ;; 8) Set the variable ange-ftp-gateway-prompt-pattern to a regular
! ;;    expression that matches the prompt you get when you login to the
! ;;    gateway machine.  Be very specific here; this regexp must not match
! ;;    *anything* in your login banner except this prompt.
! ;;    shell-prompt-pattern is far too general as it appears to match some
! ;;    login banners from Sun machines.  For example:
! ;;
! ;;    "^$*$ *"
! ;;
! ;; 9) Set the variable ange-ftp-gateway-program-interactive to 't' to let
! ;;    ange-ftp know that it has to "hand-hold" the login to the gateway
! ;;    machine.
! ;;
! ;; 10) Set the variable ange-ftp-gateway-setup-term-command to a UNIX command
! ;;     that will put the pty connected to the gateway machine into a
! ;;     no-echoing mode, and will strip off carriage-returns from output from
! ;;     the gateway machine.  For example:
! ;;
! ;;     "stty -onlcr -echo"
! ;;
! ;;     will work on HP-UX machines, whereas:
! ;;
! ;;     "stty -echo nl"
! ;;
! ;;     appears to work for some Sun machines.
! ;;
! ;; That's all there is to it.
! 
! ;; Smart gateways:
! ;;
! ;; If you have a "smart" ftp program that allows you to issue commands like
! ;; "USER foo@bar" which do nice proxy things, then look at the variables
! ;; ange-ftp-smart-gateway and ange-ftp-smart-gateway-port.
! ;;
! ;; Otherwise, if there is an alternate ftp program that implements proxy in
! ;; a transparent way (i.e. w/o specifying the proxy host), that will
! ;; connect you directly to the desired destination host:
! ;; Set ange-ftp-gateway-ftp-program-name to that program's name.
! ;; Set ange-ftp-local-host-regexp to a value as stated earlier on.
! ;; Leave ange-ftp-gateway-host set to nil.
! ;; Set ange-ftp-smart-gateway to t.
! 
! ;; Tips for using ange-ftp:
! ;;
! ;; 1. For dired to work on a host which marks symlinks with a trailing @ in
! ;;    an ls -alF listing, you need to (setq dired-ls-F-marks-symlinks t).
! ;;    Most UNIX systems do not do this, but ULTRIX does. If you think that
! ;;    there is a chance you might connect to an ULTRIX machine (such as
! ;;    prep.ai.mit.edu), then set this variable accordingly.  This will have
! ;;    the side effect that dired will have problems with symlinks whose names
! ;;    end in an @.  If you get yourself into this situation then editing
! ;;    dired's ls-switches to remove "F", will temporarily fix things.
! ;;
! ;; 2. If you know that you are connecting to a certain non-UNIX machine
! ;;    frequently, and ange-ftp seems to be unable to guess its host-type,
! ;;    then setting the appropriate host-type regexp
! ;;    (ange-ftp-vms-host-regexp, ange-ftp-mts-host-regexp, or
! ;;    ange-ftp-cms-host-regexp) accordingly should help. Also, please report
! ;;    ange-ftp's inability to recognize the host-type as a bug.
! ;;
! ;; 3. For slow connections, you might get "listing unreadable" error
! ;;    messages, or get an empty buffer for a file that you know has something
! ;;    in it. The solution is to increase the value of ange-ftp-retry-time.
! ;;    Its default value is 5 which is plenty for reasonable connections.
! ;;    However, for some transatlantic connections I set this to 20.
! ;;
! ;; 4. Beware of compressing files on non-UNIX hosts. Ange-ftp will do it by
! ;;    copying the file to the local machine, compressing it there, and then
! ;;    sending it back. Binary file transfers between machines of different
! ;;    architectures can be a risky business. Test things out first on some
! ;;    test files. See "Bugs" below. Also, note that ange-ftp copies files by
! ;;    moving them through the local machine. Again, be careful when doing
! ;;    this with binary files on non-Unix machines.
! ;;
! ;; 5. Beware that dired over ftp will use your setting of dired-no-confirm
! ;;    (list of dired commands for which confirmation is not asked).  You
! ;;    might want to reconsider your setting of this variable, because you
! ;;    might want confirmation for more commands on remote direds than on
! ;;    local direds. For example, I strongly recommend that you not include
! ;;    compress and uncompress in this list. If there is enough demand it
! ;;    might be a good idea to have an alist ange-ftp-dired-no-confirm of
! ;;    pairs ( TYPE . LIST ), where TYPE is an operating system type and LIST
! ;;    is a list of commands for which confirmation would be suppressed.  Then
! ;;    remote dired listings would take their (buffer-local) value of
! ;;    dired-no-confirm from this alist. Who votes for this?
! 
! ;; ---------------------------------------------------------------------
! ;; Non-UNIX support:
! ;; ---------------------------------------------------------------------
! 
! ;; VMS support:
! ;;
! ;; Ange-ftp has full support for VMS hosts.  It
! ;; should be able to automatically recognize any VMS machine. However, if it
! ;; fails to do this, you can use the command ange-ftp-add-vms-host.  As well,
! ;; you can set the variable ange-ftp-vms-host-regexp in your .emacs file. We
! ;; would be grateful if you would report any failures to automatically
! ;; recognize a VMS host as a bug.
! ;;
! ;; Filename Syntax:
! ;;
! ;; For ease of *implementation*, the user enters the VMS filename syntax in a
! ;; UNIX-y way.  For example:
! ;;  PUB$:[ANONYMOUS.SDSCPUB.NEXT]README.TXT;1
! ;; would be entered as:
! ;;  /PUB$$:/ANONYMOUS/SDSCPUB/NEXT/README.TXT;1
! ;; i.e. to log in as anonymous on ymir.claremont.edu and grab the file:
! ;;  [.CSV.POLICY]RULES.MEM
! ;; you would type:
! ;;  C-x C-f /anonymous@ymir.claremont.edu:CSV/POLICY/RULES.MEM
! ;;
! ;; A legal VMS filename is of the form: FILE.TYPE;##
! ;; where FILE can be up to 39 characters
! ;;       TYPE can be up to 39 characters
! ;;       ## is a version number (an integer between 1 and 32,767)
! ;; Valid characters in FILE and TYPE are A-Z 0-9 _ - $
! ;; $ cannot begin a filename, and - cannot be used as the first or last
! ;; character.
! ;;
! ;; Tips:
! ;; 1. Although VMS is not case sensitive, EMACS running under UNIX is.
! ;;    Therefore, to access a VMS file, you must enter the filename with upper
! ;;    case letters.
! ;; 2. To access the latest version of file under VMS, you use the filename
! ;;    without the ";" and version number. You should always edit the latest
! ;;    version of a file. If you want to edit an earlier version, copy it to a
! ;;    new file first. This has nothing to do with ange-ftp, but is simply
! ;;    good VMS operating practice. Therefore, to edit FILE.TXT;3 (say 3 is
! ;;    latest version), do C-x C-f /ymir.claremont.edu:FILE.TXT. If you
! ;;    inadvertently do C-x C-f /ymir.claremont.edu:FILE.TXT;3, you will find
! ;;    that VMS will not allow you to save the file because it will refuse to
! ;;    overwrite FILE.TXT;3, but instead will want to create FILE.TXT;4, and
! ;;    attach the buffer to this file. To get out of this situation, M-x
! ;;    write-file /ymir.claremont.edu:FILE.TXT will attach the buffer to
! ;;    latest version of the file. For this reason, in dired "f"
! ;;    (dired-find-file), always loads the file sans version, whereas "v",
! ;;    (dired-view-file), always loads the explicit version number. The
! ;;    reasoning being that it reasonable to view old versions of a file, but
! ;;    not to edit them.
! ;; 3. EMACS has a feature in which it does environment variable substitution
! ;;    in filenames. Therefore, to enter a $ in a filename, you must quote it
! ;;    by typing $$.
! 
! ;; MTS support:
! ;;
! ;; Ange-ftp has full support for hosts running
! ;; the Michigan terminal system.  It should be able to automatically
! ;; recognize any MTS machine. However, if it fails to do this, you can use
! ;; the command ange-ftp-add-mts-host.  As well, you can set the variable
! ;; ange-ftp-mts-host-regexp in your .emacs file. We would be grateful if you
! ;; would report any failures to automatically recognize a MTS host as a bug.
! ;;
! ;; Filename syntax:
! ;; 
! ;; MTS filenames are entered in a UNIX-y way. For example, if your account
! ;; was YYYY, the file FILE in the account XXXX: on mtsg.ubc.ca would be
! ;; entered as
! ;;   /YYYY@mtsg.ubc.ca:/XXXX:/FILE
! ;; In other words, MTS accounts are treated as UNIX directories. Of course,
! ;; to access a file in another account, you must have access permission for
! ;; it.  If FILE were in your own account, then you could enter it in a
! ;; relative name fashion as
! ;;   /YYYY@mtsg.ubc.ca:FILE
! ;; MTS filenames can be up to 12 characters. Like UNIX, the structure of the
! ;; filename does not contain a TYPE (i.e. it can have as many "."'s as you
! ;; like.) MTS filenames are always in upper case, and hence be sure to enter
! ;; them as such! MTS is not case sensitive, but an EMACS running under UNIX
! ;; is.
! 
! ;; CMS support:
! ;; 
! ;; Ange-ftp has full support for hosts running
! ;; CMS.  It should be able to automatically recognize any CMS machine.
! ;; However, if it fails to do this, you can use the command
! ;; ange-ftp-add-cms-host.  As well, you can set the variable
! ;; ange-ftp-cms-host-regexp in your .emacs file. We would be grateful if you
! ;; would report any failures to automatically recognize a CMS host as a bug.
! ;; 
! ;; Filename syntax:
! ;;
! ;; CMS filenames are entered in a UNIX-y way. In otherwords, minidisks are
! ;; treated as UNIX directories. For example to access the file READ.ME in
! ;; minidisk *.311 on cuvmb.cc.columbia.edu, you would enter
! ;;   /anonymous@cuvmb.cc.columbia.edu:/*.311/READ.ME
! ;; If *.301 is the default minidisk for this account, you could access
! ;; FOO.BAR on this minidisk as
! ;;   /anonymous@cuvmb.cc.columbia.edu:FOO.BAR
! ;; CMS filenames are of the form FILE.TYPE, where both FILE and TYPE can be
! ;; up to 8 characters. Again, beware that CMS filenames are always upper
! ;; case, and hence must be entered as such.
! ;;
! ;; Tips:
! ;; 1. CMS machines, with the exception of anonymous accounts, nearly always
! ;;    need an account password. To have ange-ftp send an account password,
! ;;    you can either include it in your .netrc file, or use
! ;;    ange-ftp-set-account.
! ;; 2. Ange-ftp cannot send "write passwords" for a minidisk. Hopefully, we
! ;;    can fix this.
! ;;
! ;; ------------------------------------------------------------------
! ;; Bugs:
! ;; ------------------------------------------------------------------
! ;; 
! ;; 1. Umask problems:
! ;;    Be warned that files created by using ange-ftp will take account of the
! ;;    umask of the ftp daemon process rather than the umask of the creating
! ;;    user.  This is particularly important when logging in as the root user.
! ;;    The way that I tighten up the ftp daemon's umask under HP-UX is to make
! ;;    sure that the umask is changed to 027 before I spawn /etc/inetd.  I
! ;;    suspect that there is something similar on other systems.
! ;;
! ;; 2. Some combinations of FTP clients and servers break and get out of sync
! ;;    when asked to list a non-existent directory.  Some of the ai.mit.edu
! ;;    machines cause this problem for some FTP clients. Using
! ;;    ange-ftp-kill-ftp-process can restart the ftp process, which
! ;;    should get things back in sync.
! ;;
! ;; 3. Ange-ftp does not check to make sure that when creating a new file,
! ;;    you provide a valid filename for the remote operating system.
! ;;    If you do not, then the remote FTP server will most likely
! ;;    translate your filename in some way. This may cause ange-ftp to
! ;;    get confused about what exactly is the name of the file. The
! ;;    most common causes of this are using lower case filenames on systems
! ;;    which support only upper case, and using filenames which are too
! ;;    long.
! ;;
! ;; 4. Null (blank) passwords confuse both ange-ftp and some FTP daemons.
! ;;
! ;; 5. Ange-ftp likes to use pty's to talk to its FTP processes.  If GNU Emacs
! ;;    for some reason creates a FTP process that only talks via pipes then
! ;;    ange-ftp won't be getting the information it requires at the time that
! ;;    it wants it since pipes flush at different times to pty's.  One
! ;;    disgusting way around this problem is to talk to the FTP process via
! ;;    rlogin which does the 'right' things with pty's.
! ;;
! ;; 6. For CMS support, we send too many cd's. Since cd's are cheap, I haven't
! ;;    worried about this too much. Eventually, we should have some caching
! ;;    of the current minidisk.
! ;;    
! ;; 7. Some CMS machines do not assign a default minidisk when you ftp them as
! ;;    anonymous. It is then necessary to guess a valid minidisk name, and cd
! ;;    to it. This is (understandably) beyond ange-ftp.
! ;;
! ;; 8. Remote to remote copying of files on non-Unix machines can be risky.
! ;;    Depending on the variable ange-ftp-binary-file-name-regexp, ange-ftp
! ;;    will use binary mode for the copy. Between systems of different
! ;;    architecture, this still may not be enough to guarantee the integrity
! ;;    of binary files. Binary file transfers from VMS machines are
! ;;    particularly problematical. Should ange-ftp-binary-file-name-regexp be
! ;;    an alist of OS type, regexp pairs?
! ;;
! ;; 9. The code to do compression of files over ftp is not as careful as it
! ;;    should be. It deletes the old remote version of the file, before
! ;;    actually checking if the local to remote transfer of the compressed
! ;;    file succeeds. Of course to delete the original version of the file
! ;;    after transferring the compressed version back is also dangerous,
! ;;    because some OS's have severe restrictions on the length of filenames,
! ;;    and when the compressed version is copied back the "-Z" or ".Z" may be
! ;;    truncated. Then, ange-ftp would delete the only remaining version of
! ;;    the file.  Maybe ange-ftp should make backups when it compresses files
! ;;    (of course, the backup "~" could also be truncated off, sigh...).
! ;;    Suggestions?
! ;;
! ;; 10. If a dir listing is attempted for an empty directory on (at least
! ;;     some) VMS hosts, an ftp error is given. This is really an ftp bug, and
! ;;     I don't know how to get ange-ftp work to around it.
! ;;
! ;; 11. Bombs on filenames that start with a space. Deals well with filenames
! ;;     containing spaces, but beware that the remote ftpd may not like them
! ;;     much.
! ;;
! ;; 12. The dired support for non-Unix-like systems does not currently work.
! ;;     It needs to be reimplemented by modifying the parse-...-listing
! ;;	functions to convert the directory listing to ls -l format.
! ;; 
! ;; 13. The famous @ bug. As mentioned above in TIPS, ULTRIX marks symlinks
! ;;     with a trailing @ in a ls -alF listing. In order to account for this
! ;;     ange-ftp looks to chop trailing @'s off of symlink names when it is
! ;;     parsing a listing with the F switch. This will cause ange-ftp to
! ;;     incorrectly get the name of a symlink on a non-ULTRIX host if its name
! ;;     ends in an @. ange-ftp will correct itself if you take F out of the
! ;;     dired ls switches (C-u s will allow you to edit the switches). The
! ;;     dired buffer will be automatically reverted, which will allow ange-ftp
! ;;     to fix its files hashtable.  A cookie to anyone who can think of a
! ;;     fast, sure-fire way to recognize ULTRIX over ftp.
! 
! ;; If you find any bugs or problems with this package, PLEASE either e-mail
! ;; the above author, or send a message to the ange-ftp-lovers mailing list
! ;; below.  Ideas and constructive comments are especially welcome.
! 
! ;; ange-ftp-lovers:
! ;;
! ;; ange-ftp has its own mailing list modestly called ange-ftp-lovers.  All
! ;; users of ange-ftp are welcome to subscribe (see below) and to discuss
! ;; aspects of ange-ftp.  New versions of ange-ftp are posted periodically to
! ;; the mailing list.
! ;;
! ;; To [un]subscribe to ange-ftp-lovers, or to report mailer problems with the
! ;; list, please mail one of the following addresses:
! ;;
! ;;     ange-ftp-lovers-request@anorman.hpl.hp.com
! ;; or
! ;;     ange-ftp-lovers-request%anorman.hpl.hp.com@hplb.hpl.hp.com
! ;;
! ;; Please don't forget the -request part.
! ;;
! ;; For mail to be posted directly to ange-ftp-lovers, send to one of the
! ;; following addresses:
! ;; 
! ;;     ange-ftp-lovers@anorman.hpl.hp.com
! ;; or
! ;;     ange-ftp-lovers%anorman.hpl.hp.com@hplb.hpl.hp.com
! ;;
! ;; Alternatively, there is a mailing list that only gets announcements of new
! ;; ange-ftp releases.  This is called ange-ftp-lovers-announce, and can be
! ;; subscribed to by e-mailing to the -request address as above.  Please make
! ;; it clear in the request which mailing list you wish to join.
! 
! ;; The latest version of ange-ftp can usually be obtained via anonymous ftp
! ;; from:
! ;;     alpha.gnu.ai.mit.edu:ange-ftp/ange-ftp.tar.Z
! ;; or:
! ;;     ugle.unit.no:/pub/gnu/emacs-lisp/ange-ftp.tar.Z
! ;; or:
! ;;   archive.cis.ohio-state.edu:pub/gnu/emacs/elisp-archive/packages/ange-ftp.tar.Z
! 
! ;; The archives for ange-ftp-lovers can be found via anonymous ftp under:
! ;;
! ;;     ftp.reed.edu:pub/mailing-lists/ange-ftp/
  
! ;; -----------------------------------------------------------
! ;; Technical information on this package:
! ;; -----------------------------------------------------------
! 
! ;; ange-ftp works by putting a handler on file-name-handler-alist
! ;; which is called by many primitives, and a few non-primitives,
! ;; whenever they see a file name of the appropriate sort.
! 
! ;; Checklist for adding non-UNIX support for TYPE
! ;; 
! ;; The following functions may need TYPE versions:
! ;; (not all functions will be needed for every OS)
! ;;
! ;; ange-ftp-fix-name-for-TYPE
! ;; ange-ftp-fix-dir-name-for-TYPE
! ;; ange-ftp-TYPE-host
! ;; ange-ftp-TYPE-add-host
! ;; ange-ftp-parse-TYPE-listing
! ;; ange-ftp-TYPE-delete-file-entry
! ;; ange-ftp-TYPE-add-file-entry
! ;; ange-ftp-TYPE-file-name-as-directory
! ;; ange-ftp-TYPE-make-compressed-filename
! ;; ange-ftp-TYPE-file-name-sans-versions
! ;;
! ;; Variables:
! ;;
! ;; ange-ftp-TYPE-host-regexp
! ;; May need to add TYPE to ange-ftp-dumb-host-types
! ;;
! ;; Check the following functions for OS dependent coding:
! ;;
! ;; ange-ftp-host-type
! ;; ange-ftp-guess-host-type
! ;; ange-ftp-allow-child-lookup
! 
! ;; Host type conventions:
! ;;
! ;; The function ange-ftp-host-type and the variable ange-ftp-dired-host-type
! ;; (mostly) follow the following conventions for remote host types.  At
! ;; least, I think that future code should try to follow these conventions,
! ;; and the current code should eventually be made compliant.
! ;;
! ;; nil = local host type, whatever that is (probably unix).
! ;;       Think nil as in "not a remote host". This value is used by
! ;;       ange-ftp-dired-host-type for local buffers.
! ;;
! ;; t = a remote host of unknown type. Think t is in true, it's remote.
! ;;     Currently, 'unix is used as the default remote host type.
! ;;     Maybe we should use t.
! ;;
! ;; 'type = a remote host of TYPE type.
! ;;
! ;; 'type:list = a remote host of TYPE type, using a specialized ftp listing
! ;;              program called list. This is currently only used for Unix
! ;;              dl (descriptive listings), when ange-ftp-dired-host-type
! ;;              is set to 'unix:dl.
! 
! ;; Bug report codes:
! ;;
! ;; Because of their naive faith in this code, there are certain situations
! ;; which the writers of this program believe could never happen. However,
! ;; being realists they have put calls to `error' in the program at these
! ;; points. These errors provide a code, which is an integer, greater than 1.
! ;; To aid debugging.  the error codes, and the functions in which they reside
! ;; are listed below.
! ;; 
! ;; 1: See ange-ftp-ls
! ;;
  
! ;; -----------------------------------------------------------
! ;; Hall of fame:
! ;; -----------------------------------------------------------
! ;; 
! ;; Thanks to Roland McGrath for improving the filename syntax handling,
! ;; for suggesting many enhancements and for numerous cleanups to the code.
! ;;
! ;; Thanks to Jamie Zawinski for bugfixes and for ideas such as gateways.
! ;;
! ;; Thanks to Ken Laprade for improved .netrc parsing, password reading, and
! ;; dired / shell auto-loading.
! ;;
! ;; Thanks to Sebastian Kremer for dired support and for many ideas and
! ;; bugfixes.
! ;;
! ;; Thanks to Joe Wells for bugfixes, the original non-UNIX system support,
! ;; VOS support, and hostname completion.
! ;;
! ;; Thanks to Nakagawa Takayuki for many good ideas, filename-completion, help
! ;; with file-name expansion, efficiency worries, stylistic concerns and many
! ;; bugfixes.
! ;;
! ;; Thanks to Sandy Rutherford who re-wrote most of ange-ftp to support VMS,
! ;; MTS, CMS and UNIX-dls.  Sandy also added dired-support for non-UNIX OS and
! ;; auto-recognition of the host type.
! ;;
! ;; Thanks to Dave Smith who wrote the info file for ange-ftp.
! ;;
! ;; Finally, thanks to Keith Waclena, Mark D. Baushke, Terence Kelleher, Ping
! ;; Zhou, Edward Vielmetti, Jack Repenning, Mike Balenger, Todd Kaufmann,
! ;; Kjetil Svarstad, Tom Wurgler, Linus Tolke, Niko Makila, Carl Edman, Bill
! ;; Trost, Dave Brennan, Dan Jacobson, Andy Scott, Steve Anderson, Sanjay
! ;; Mathur, the folks on the ange-ftp-lovers mailing list and many others
! ;; whose names I've forgotten who have helped to debug and fix problems with
! ;; ange-ftp.el.
  
  ;;; Code:
+ 
  (require 'comint)
  
***************
*** 626,630 ****
  
  (defvar ange-ftp-name-format
!   '("^/\\(\\([^@/:]*\\)@\\)?\\([^@/:]*\\):\\(.*\\)" . (3 2 4))
    "*Format of a fully expanded remote file name.
  This is a list of the form \(REGEXP HOST USER NAME\),
--- 628,632 ----
  
  (defvar ange-ftp-name-format
!   '("^/\\(\\([^@/:]*\\)@\\)?\\([^@/:]*[^@/:.]\\):\\(.*\\)" . (3 2 4))
    "*Format of a fully expanded remote file name.
  This is a list of the form \(REGEXP HOST USER NAME\),
*************** cross-mounted.")
*** 689,701 ****
  
  (defvar ange-ftp-default-user nil
!   "*User name to use when none is specied in a file name.
! If nil, then the name under which the user is logged in is used.
! If non-nil but not a string, the user is prompted for the name.")
  
  (defvar ange-ftp-default-password nil
!   "*Password to use when the user is the same as ange-ftp-default-user.")
  
  (defvar ange-ftp-default-account nil
!   "*Account password to use when the user is the same as ange-ftp-default-user.")
  
  (defvar ange-ftp-generate-anonymous-password t
--- 691,721 ----
  
  (defvar ange-ftp-default-user nil
!   "*User name to use when none is specified in a file name.
! If non-nil but not a string, you are prompted for the name.
! If nil, the value of `ange-ftp-netrc-default-user' is used.
! If that is nil too, then your login name is used.
! 
! Once a connection to a given host has been initiated, the user name
! and password information for that host are cached and re-used by
! ange-ftp.  Use `ange-ftp-set-user' to change the cached values,
! since setting `ange-ftp-default-user' directly does not affect
! the cached information.")  
! 
! (defvar ange-ftp-netrc-default-user nil
!   "Alternate default user name to use when none is specified.
! This variable is set from the `default' command in your `.netrc' file,
! if there is one.")
  
  (defvar ange-ftp-default-password nil
!   "*Password to use when the user name equals `ange-ftp-default-user'.")
  
  (defvar ange-ftp-default-account nil
!   "*Account to use when the user name equals `ange-ftp-default-user'.")
! 
! (defvar ange-ftp-netrc-default-password nil
!   "*Password to use when the user name equals `ange-ftp-netrc-default-user'.")
! 
! (defvar ange-ftp-netrc-default-account nil
!   "*Account to use when the user name equals `ange-ftp-netrc-default-user'.")
  
  (defvar ange-ftp-generate-anonymous-password t
*************** only return the directory part of FILE."
*** 975,978 ****
--- 995,999 ----
  			   (read-string (format "User for %s: " host)
  					(user-login-name))))
+ 			(ange-ftp-netrc-default-user)
  			;; Default to the user's login name.
  			(t
*************** Optional DEFAULT is password to start wi
*** 1052,1056 ****
    (cond ((ange-ftp-lookup-passwd host user))
  	
! 	;; see if default user and password set from the .netrc file.
  	((and (stringp ange-ftp-default-user)
  	      ange-ftp-default-password
--- 1073,1077 ----
    (cond ((ange-ftp-lookup-passwd host user))
  	
! 	;; See if default user and password set.
  	((and (stringp ange-ftp-default-user)
  	      ange-ftp-default-password
*************** Optional DEFAULT is password to start wi
*** 1058,1061 ****
--- 1079,1088 ----
  	 ange-ftp-default-password)
  	
+ 	;; See if default user and password set from .netrc file.
+ 	((and (stringp ange-ftp-netrc-default-user)
+ 	      ange-ftp-netrc-default-password
+ 	      (string-equal user ange-ftp-netrc-default-user))
+ 	 ange-ftp-netrc-default-password)
+ 	
  	;; anonymous ftp password is handled specially since there is an
  	;; unwritten rule about how that is used on the Internet.
*************** Optional DEFAULT is password to start wi
*** 1111,1115 ****
        (and (stringp ange-ftp-default-user)
  	   (string-equal user ange-ftp-default-user)
! 	   ange-ftp-default-account)))
  
  ;;;; ------------------------------------------------------------
--- 1138,1145 ----
        (and (stringp ange-ftp-default-user)
  	   (string-equal user ange-ftp-default-user)
! 	   ange-ftp-default-account)
!       (and (stringp ange-ftp-netrc-default-user)
! 	   (string-equal user ange-ftp-netrc-default-user)
! 	   ange-ftp-netrc-default-account)))
  
  ;;;; ------------------------------------------------------------
*************** Optional DEFAULT is password to start wi
*** 1185,1193 ****
  		  account  (ange-ftp-parse-netrc-token "account"  end))
  	    (and login
! 		 (setq ange-ftp-default-user login))
  	    (and password
! 		 (setq ange-ftp-default-password password))
  	    (and account
! 		 (setq ange-ftp-default-account account)))))
      (goto-char end)))
  
--- 1215,1223 ----
  		  account  (ange-ftp-parse-netrc-token "account"  end))
  	    (and login
! 		 (setq ange-ftp-netrc-default-user login))
  	    (and password
! 		 (setq ange-ftp-netrc-default-password password))
  	    (and account
! 		 (setq ange-ftp-netrc-default-account account)))))
      (goto-char end)))
  
*************** been queued with no result.  CONT will s
*** 1682,1695 ****
        (save-excursion
  	(set-buffer (process-buffer proc))
! 	(while ange-ftp-process-busy
! 	  ;; This is a kludge to let user quit in case ftp gets hung.
! 	  ;; It matters because this function can be called from the filter.
! 	  ;; It is bad to allow quitting in a filter, but getting hung
! 	  ;; is worse.  By binding quit-flag to nil, we might avoid
! 	  ;; most of the probability of getting screwed because the user
! 	  ;; wants to quit some command.
! 	  (let ((quit-flag nil)
! 		(inhibit-quit nil))
! 	    (accept-process-output)))
  	(setq ange-ftp-process-string ""
  	      ange-ftp-process-result-line ""
--- 1712,1716 ----
        (save-excursion
  	(set-buffer (process-buffer proc))
! 	(ange-ftp-wait-not-busy proc)
  	(setq ange-ftp-process-string ""
  	      ange-ftp-process-result-line ""
*************** been queued with no result.  CONT will s
*** 1715,1729 ****
  	(if nowait
  	    nil
! 	  ;; hang around for command to complete
! 	  (while ange-ftp-process-busy
! 	    ;; This is a kludge to let user quit in case ftp gets hung.
! 	    ;; It matters because this function can be called from the filter.
! 	    (let ((quit-flag nil)
! 		  (inhibit-quit nil))
! 	      (accept-process-output proc)))
  	  (if cont
  	      nil			;cont has already been called
  	    (cons ange-ftp-process-result ange-ftp-process-result-line))))))
  
  (defun ange-ftp-nslookup-host (host)
    "Attempt to resolve the given HOSTNAME using nslookup if possible."
--- 1736,1766 ----
  	(if nowait
  	    nil
! 	  (ange-ftp-wait-not-busy proc)
  	  (if cont
  	      nil			;cont has already been called
  	    (cons ange-ftp-process-result ange-ftp-process-result-line))))))
  
+ ;; Wait for the ange-ftp process PROC not to be busy.
+ (defun ange-ftp-wait-not-busy (proc)
+   (save-excursion
+     (set-buffer (process-buffer proc))
+     (condition-case nil
+ 	;; This is a kludge to let user quit in case ftp gets hung.
+ 	;; It matters because this function can be called from the filter.
+ 	;; It is bad to allow quitting in a filter, but getting hung
+ 	;; is worse.  By binding quit-flag to nil, we might avoid
+ 	;; most of the probability of getting screwed because the user
+ 	;; wants to quit some command.
+ 	(let ((quit-flag nil)
+ 	      (inhibit-quit nil))
+ 	  (while ange-ftp-process-busy
+ 	    (accept-process-output proc)))
+       (quit
+        ;; If the user does quit out of this,
+        ;; kill the process.  That stops any transfer in progress.
+        ;; The next operation will open a new ftp connection.
+        (delete-process proc)
+        (signal 'quit nil)))))
+ 
  (defun ange-ftp-nslookup-host (host)
    "Attempt to resolve the given HOSTNAME using nslookup if possible."
*************** on the gateway machine to do the ftp ins
*** 1779,1783 ****
      ;; but that doesn't work: ftp never responds.
      ;; Can anyone find a fix for that?
!     (let ((process-connection-type t))
        (if use-gateway
  	  (if ange-ftp-gateway-program-interactive
--- 1816,1823 ----
      ;; but that doesn't work: ftp never responds.
      ;; Can anyone find a fix for that?
!     (let ((process-connection-type t)
! 	  (process-environment process-environment))
!       ;; This tells GNU ftp not to output any fancy escape sequences.
!       (setenv "TERM" "dumb")
        (if use-gateway
  	  (if ange-ftp-gateway-program-interactive
*************** which can parse the output from a DIR li
*** 2240,2244 ****
  ;; With no-error t, it returns:
  ;; an error if not an ange-ftp-name
! ;; error if listing is unreable (most likely caused by a slow connection)
  ;; nil if ftp error (this is because although asking to list a nonexistent
  ;;                   directory on a remote unix machine usually (except
--- 2280,2284 ----
  ;; With no-error t, it returns:
  ;; an error if not an ange-ftp-name
! ;; error if listing is unreadable (most likely caused by a slow connection)
  ;; nil if ftp error (this is because although asking to list a nonexistent
  ;;                   directory on a remote unix machine usually (except
*************** system TYPE.")
*** 2922,2926 ****
  	  (unwind-protect
  	      (progn
! 		(let ((executing-macro t)
  		      (filename (buffer-file-name))
  		      (mod-p (buffer-modified-p)))
--- 2962,2966 ----
  	  (unwind-protect
  	      (progn
! 		(let ((executing-kbd-macro t)
  		      (filename (buffer-file-name))
  		      (mod-p (buffer-modified-p)))
*************** system TYPE.")
*** 3704,3708 ****
  	  (condition-case error
  	      (setq copy (ange-ftp-file-local-copy (car tryfiles)))
! 	    (ftp-error nil)))
  	(if copy
  	    (unwind-protect
--- 3744,3749 ----
  	  (condition-case error
  	      (setq copy (ange-ftp-file-local-copy (car tryfiles)))
! 	    (ftp-error nil))
! 	  (setq tryfiles (cdr tryfiles)))
  	(if copy
  	    (unwind-protect
*************** NEWNAME should be the name to give the n
*** 3902,3905 ****
--- 3943,3948 ----
  ;; This returns nil for any file name as argument.
  (put 'vc-registered 'ange-ftp 'null)
+ 
+ (put 'dired-call-process 'ange-ftp 'ange-ftp-dired-call-process)
  
  ;;; Define ways of getting at unmodified Emacs primitives,
*************** NEWNAME should be the name to give the n
*** 4038,4042 ****
        (ange-ftp-real-shell-command command))))
  
! ;;; Thisis not hooked up yet.	    
  (defun ange-ftp-dired-call-process (program discard &rest arguments)
    ;; PROGRAM is always one of those below in the cond in dired.el.
--- 4081,4085 ----
        (ange-ftp-real-shell-command command))))
  
! ;;; This is the handler for call-process.
  (defun ange-ftp-dired-call-process (program discard &rest arguments)
    ;; PROGRAM is always one of those below in the cond in dired.el.
*************** NEWNAME should be the name to give the n
*** 4054,4062 ****
  				    (nth 1 oops)
  				    (nth 2 oops)
! 				    (nth 3 oops))))
! 	(error (insert (format "%s\n" (nth 1 oops)))))
      (apply 'call-process program nil (not discard) nil arguments)))
  
! ;;; This currently does not work; it is never called.
  (defun ange-ftp-call-chmod (args)
    (if (< (length args) 2)
--- 4097,4112 ----
  				    (nth 1 oops)
  				    (nth 2 oops)
! 				    (nth 3 oops)))
! 		   ;; Caller expects nonzero value to mean failure.
! 		   1)
! 	(error (insert (format "%s\n" (nth 1 oops)))
! 	       1))
      (apply 'call-process program nil (not discard) nil arguments)))
  
! (defvar ange-ftp-remote-shell "rsh" 
!   "Remote shell to use for chmod, if FTP server rejects the `chmod' command.")
! 
! ;; Handle an attempt to run chmod on a remote file
! ;; by using the ftp chmod command.
  (defun ange-ftp-call-chmod (args)
    (if (< (length args) 2)
*************** NEWNAME should be the name to give the n
*** 4078,4087 ****
  							abbr))))
  		(or (car result)
! 		    (ange-ftp-error host user
! 				    (format "chmod: %s: \"%s\""
! 					    file 
! 					    (cdr result)))))))))
       (cdr args)))
!   (setq ange-ftp-ls-cache-file nil))	;stop confusing dired
  
  ;;; This is turned off because it has nothing properly to do
--- 4128,4137 ----
  							abbr))))
  		(or (car result)
! 		    (call-process 
! 		     ange-ftp-remote-shell
! 		     nil t nil host "chmod" mode name)))))))
       (cdr args)))
!   (setq ange-ftp-ls-cache-file nil)	;Stop confusing Dired.
!   0)
  
  ;;; This is turned off because it has nothing properly to do
*************** Other orders of $ and _ seem to all work
*** 5239,5243 ****
  	    ;; give up
  	    (ange-ftp-error ange-ftp-this-host ange-ftp-this-user
! 			    (format "cd to minidisk %s failed: "
  				    minidisk (cdr result))))))))
     (t (error "Invalid CMS file name"))))
--- 5289,5293 ----
  	    ;; give up
  	    (ange-ftp-error ange-ftp-this-host ange-ftp-this-user
! 			    (format "cd to minidisk %s failed: %s"
  				    minidisk (cdr result))))))))
     (t (error "Invalid CMS file name"))))
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/appt.el emacs-19.31/lisp/appt.el
*** emacs-19.30/lisp/appt.el	Thu Oct  5 19:39:47 1995
--- emacs-19.31/lisp/appt.el	Sun Jan 14 02:34:30 1996
***************
*** 20,25 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/apropos.el emacs-19.31/lisp/apropos.el
*** emacs-19.30/lisp/apropos.el	Tue Nov 21 00:12:29 1995
--- emacs-19.31/lisp/apropos.el	Fri May  3 20:48:19 1996
***************
*** 20,25 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** text-property list for efficiency.")
*** 82,91 ****
  This looks good, but slows down the commands several times.")
  
! (defvar apropos-match-face (if window-system 'highlight)
    "*Face for matching part in apropos-documentation/value output or `nil'.  
  This looks good, but slows down the commands several times.")
  
  
! (defvar apropos-local-map
    (let ((map (make-sparse-keymap)))
      (define-key map "\C-m" 'apropos-follow)
--- 83,92 ----
  This looks good, but slows down the commands several times.")
  
! (defvar apropos-match-face (if window-system 'secondary-selection)
    "*Face for matching part in apropos-documentation/value output or `nil'.  
  This looks good, but slows down the commands several times.")
  
  
! (defvar apropos-mode-map
    (let ((map (make-sparse-keymap)))
      (define-key map "\C-m" 'apropos-follow)
*************** This looks good, but slows down the comm
*** 93,97 ****
      (define-key map [down-mouse-2] nil)
      map)
!   "Local map active when displaying apropos output.")
  
  
--- 94,98 ----
      (define-key map [down-mouse-2] nil)
      map)
!   "Keymap used in Apropos mode.")
  
  
*************** This looks good, but slows down the comm
*** 100,104 ****
  
  (defvar apropos-files-scanned ()
!   "List of elc files already scanned in current run of `apropos-documentaion'.")
  
  (defvar apropos-accumulator ()
--- 101,105 ----
  
  (defvar apropos-files-scanned ()
!   "List of elc files already scanned in current run of `apropos-documentation'.")
  
  (defvar apropos-accumulator ()
*************** This looks good, but slows down the comm
*** 108,111 ****
--- 109,123 ----
    "Current item in or for apropos-accumulator.")
  
+ (defun apropos-mode ()
+   "Major mode for following hyperlinks in output of apropos commands.
+ 
+ \\{apropos-mode-map}"
+   (interactive)
+   (kill-all-local-variables)
+   (use-local-map apropos-mode-map)
+   (setq major-mode 'apropos-mode
+ 	mode-name "Apropos"))
+ 
+ 
  ;; For auld lang syne:
  ;;;###autoload
*************** variables."
*** 123,127 ****
  		     current-prefix-arg))
    (let ((message
! 	 (let ((standard-output (get-buffer-create "*Help*")))
  	   (print-help-return-message 'identity))))
      (or do-all (setq do-all apropos-do-all))
--- 135,139 ----
  		     current-prefix-arg))
    (let ((message
! 	 (let ((standard-output (get-buffer-create "*Apropos*")))
  	   (print-help-return-message 'identity))))
      (or do-all (setq do-all apropos-do-all))
*************** Returns list of symbols and documentatio
*** 187,193 ****
  			  "(not documented)"))
  		    (if (setq doc (symbol-plist symbol))
! 			(if (eq (setq doc (/ (length doc) 2)) 1)
! 			    "1 property"
! 			  (concat doc " properties")))))
  	 (setq p (cdr p)))))
     nil))
--- 199,205 ----
  			  "(not documented)"))
  		    (if (setq doc (symbol-plist symbol))
! 			(if (eq (/ (length doc) 2) 1)
! 			    (format "1 property (%s)" (car doc))
! 			  (concat (/ (length doc) 2) " properties")))))
  	 (setq p (cdr p)))))
     nil))
*************** Returns list of symbols and values found
*** 221,225 ****
  ;;;###autoload
  (defun apropos-documentation (apropos-regexp &optional do-all)
!   "Show symbols whose names or documentation contain matches for REGEXP.
  With optional prefix ARG or if `apropos-do-all' is non-nil, also use
  documentation that is not stored in the documentation file and show key
--- 233,237 ----
  ;;;###autoload
  (defun apropos-documentation (apropos-regexp &optional do-all)
!   "Show symbols whose documentation contain matches for REGEXP.
  With optional prefix ARG or if `apropos-do-all' is non-nil, also use
  documentation that is not stored in the documentation file and show key
*************** Returns list of symbols and documentatio
*** 239,247 ****
  	       (lambda (symbol)
  		 (setq f (apropos-safe-documentation symbol)
! 		       v (get symbol 'variable-documentation)
! 		       v (if (integerp v) nil v))
! 		 (or (string-match apropos-regexp (symbol-name symbol))
! 		     (setq f (apropos-documentation-internal f)
! 			   v (apropos-documentation-internal v)))
  		 (if (or f v)
  		     (if (setq apropos-item
--- 251,258 ----
  	       (lambda (symbol)
  		 (setq f (apropos-safe-documentation symbol)
! 		       v (get symbol 'variable-documentation))
! 		 (if (integerp v) (setq v))
! 		 (setq f (apropos-documentation-internal f)
! 		       v (apropos-documentation-internal v))
  		 (if (or f v)
  		     (if (setq apropos-item
*************** Returns list of symbols and documentatio
*** 255,259 ****
  			     (cons (list symbol f v)
  				   apropos-accumulator)))))))
! 	  (apropos-print do-all nil t))
        (kill-buffer standard-input))))
  
--- 266,270 ----
  			     (cons (list symbol f v)
  				   apropos-accumulator)))))))
! 	  (apropos-print nil nil t))
        (kill-buffer standard-input))))
  
*************** Returns list of symbols and documentatio
*** 308,344 ****
  
  (defun apropos-documentation-check-doc-file ()
!   (let (type symbol beg end)
      (insert-file-contents (concat doc-directory internal-doc-file-name))
!     (while (re-search-forward apropos-regexp nil t)
!       (setq beg (match-beginning 0)
! 	    end (point))
!       (search-backward "\C-_")
!       (if (> (point) beg)
! 	  ()
! 	(or (setq type (if (eq ?F (char-after (1+ (point))))
! 			   1		;function documentation
! 			 2)		;variable documentation
! 		  symbol (prog2
! 			     (forward-char 2)
! 			     (read))
! 		  beg (- beg (point) 1)
! 		  end (- end (point) 1)
! 		  doc (buffer-substring
! 		       (1+ (point))
! 		       (if (search-forward "\C-_" nil 'move)
! 			   (1- (point))
! 			 (point)))
! 		  apropos-item (assq symbol apropos-accumulator))
! 	    (setq apropos-item (list symbol nil nil)
! 		  apropos-accumulator (cons apropos-item apropos-accumulator)))
! 	(and apropos-match-face
! 	     (>= beg 0)
! 	     (put-text-property beg end 'face apropos-match-face doc))
! 	(setcar (nthcdr type apropos-item) doc)))))
  
  (defun apropos-documentation-check-elc-file (file)
    (if (member file apropos-files-scanned)
        nil
!     (let (symbol doc beg end end1 this-is-a-variable)
        (setq apropos-files-scanned (cons file apropos-files-scanned))
        (erase-buffer)
--- 319,358 ----
  
  (defun apropos-documentation-check-doc-file ()
!   (let (type symbol (sepa 2) sepb beg end)
!     (insert ?\^_)
!     (backward-char)
      (insert-file-contents (concat doc-directory internal-doc-file-name))
!     (forward-char)
!     (while (save-excursion
! 	     (setq sepb (search-forward "\^_"))
! 	     (not (eobp)))
!       (beginning-of-line 2)
!       (if (save-restriction
! 	    (narrow-to-region (point) (1- sepb))
! 	    (re-search-forward apropos-regexp nil t))
! 	  (progn
! 	    (setq beg (match-beginning 0)
! 		  end (point))
! 	    (goto-char (1+ sepa))
! 	    (or (setq type (if (eq ?F (preceding-char))
! 			       1	; function documentation
! 			     2)		; variable documentation
! 		      symbol (read)
! 		      beg (- beg (point) 1)
! 		      end (- end (point) 1)
! 		      doc (buffer-substring (1+ (point)) (1- sepb))
! 		      apropos-item (assq symbol apropos-accumulator))
! 		(setq apropos-item (list symbol nil nil)
! 		      apropos-accumulator (cons apropos-item
! 						apropos-accumulator)))
! 	    (if apropos-match-face
! 		(put-text-property beg end 'face apropos-match-face doc))
! 	    (setcar (nthcdr type apropos-item) doc)))
!       (setq sepa (goto-char sepb)))))
  
  (defun apropos-documentation-check-elc-file (file)
    (if (member file apropos-files-scanned)
        nil
!     (let (symbol doc beg end this-is-a-variable)
        (setq apropos-files-scanned (cons file apropos-files-scanned))
        (erase-buffer)
*************** Returns list of symbols and documentatio
*** 347,362 ****
  	;; Read the comment length, and advance over it.
  	(setq end (read)
! 	      beg (point)
! 	      end (+ (point) end 1))
! 	(if (re-search-forward apropos-regexp end t)
  	    (progn
! 	      (goto-char end)
! 	      (setq doc (buffer-substring (1+ beg) (- end 2))
! 		    end1 (- (match-end 0) beg 1)
! 		    beg (- (match-beginning 0) beg 1)
! 		    this-is-a-variable (looking-at "(defvar\\|(defconst")
  		    symbol (progn
  			     (skip-chars-forward "(a-z")
! 			     (forward-char 1)
  			     (read))
  		    symbol (if (consp symbol)
--- 361,380 ----
  	;; Read the comment length, and advance over it.
  	(setq end (read)
! 	      beg (1+ (point))
! 	      end (+ (point) end -1))
! 	(forward-char)
! 	(if (save-restriction
! 	      ;; match ^ and $ relative to doc string
! 	      (narrow-to-region beg end)
! 	      (re-search-forward apropos-regexp nil t))
  	    (progn
! 	      (goto-char (+ end 2))
! 	      (setq doc (buffer-substring beg end)
! 		    end (- (match-end 0) beg)
! 		    beg (- (match-beginning 0) beg)
! 		    this-is-a-variable (looking-at "(def\\(var\\|const\\) ")
  		    symbol (progn
  			     (skip-chars-forward "(a-z")
! 			     (forward-char)
  			     (read))
  		    symbol (if (consp symbol)
*************** Returns list of symbols and documentatio
*** 372,381 ****
  							apropos-accumulator)))
  		    (if apropos-match-face
! 			(put-text-property beg end1 'face apropos-match-face
  					   doc))
  		    (setcar (nthcdr (if this-is-a-variable 2 1)
  				    apropos-item)
! 			    doc)))))
! 	(goto-char end)))))
  
  
--- 390,398 ----
  							apropos-accumulator)))
  		    (if apropos-match-face
! 			(put-text-property beg end 'face apropos-match-face
  					   doc))
  		    (setcar (nthcdr (if this-is-a-variable 2 1)
  				    apropos-item)
! 			    doc)))))))))
  
  
*************** found."
*** 417,421 ****
      (setq apropos-accumulator
  	  (sort apropos-accumulator (lambda (a b)
! 				 (string-lessp (car a) (car b)))))
      (and apropos-label-face
  	 (symbolp apropos-label-face)
--- 434,438 ----
      (setq apropos-accumulator
  	  (sort apropos-accumulator (lambda (a b)
! 				      (string-lessp (car a) (car b)))))
      (and apropos-label-face
  	 (symbolp apropos-label-face)
*************** found."
*** 426,483 ****
  	    (old-buffer (current-buffer))
  	    symbol item point1 point2)
! 	(save-excursion
! 	  (set-buffer standard-output)
! 	  (if window-system
! 	      (insert (substitute-command-keys
! 		       "Click \\<apropos-local-map>\\[apropos-mouse-follow] to get full documentation.\n")))
! 	  (insert (substitute-command-keys
! 		   "In this buffer, type \\<apropos-local-map>\\[apropos-follow] to get full documentation.\n\n"))
! 	  (use-local-map apropos-local-map)
! 	  (while (consp p)
! 	    (or (not spacing) (bobp) (terpri))
! 	    (setq apropos-item (car p)
! 		  symbol (car apropos-item)
! 		  p (cdr p)
! 		  point1 (point))
! 	    (princ symbol)		        ;print symbol name
! 	    (setq point2 (point))
! 	    ;; don't calculate key-bindings unless needed
! 	    (and do-keys
! 		 (commandp symbol)
! 		 (indent-to 30 1)
! 		 (insert
! 		  (if (setq item (save-excursion
! 				   (set-buffer old-buffer)
! 				   (where-is-internal symbol)))
! 		      (mapconcat
  		       (if apropos-keybinding-face
! 			   (lambda (key)
! 			     (setq key (key-description key))
! 			     (put-text-property 0 (length key)
! 						'face apropos-keybinding-face
! 						key)
! 			     key)
! 			 'key-description)
! 		       item ", ")
! 		    "(not bound to any keys)")))
! 	    (terpri)
! 	    ;; only now so we don't propagate text attributes all over
! 	    (put-text-property point1 point2 'item
! 			       (if (eval `(or ,@(cdr apropos-item)))
! 				   (car apropos-item)
! 				 apropos-item))
! 	    (if apropos-symbol-face
! 		(put-text-property point1 point2 'face apropos-symbol-face))
! 	    (apropos-print-doc 'describe-function 1
! 			       (if (commandp symbol)
! 				   "Command"
! 				 (if (apropos-macrop symbol)
! 				     "Macro"
! 				   "Function"))
! 			       do-keys)
! 	    (apropos-print-doc 'describe-variable 2
! 			       "Variable" do-keys)
! 	    (apropos-print-doc 'apropos-describe-plist 3
! 			       "Plist" nil))))))
    (prog1 apropos-accumulator
      (setq apropos-accumulator ())))	; permit gc
--- 443,524 ----
  	    (old-buffer (current-buffer))
  	    symbol item point1 point2)
! 	(set-buffer standard-output)
! 	(apropos-mode)
! 	(if window-system
! 	    (insert "If you move the mouse over text that changes color,\n"
! 		    (substitute-command-keys
! 		     "you can click \\[apropos-mouse-follow] to get more information.\n")))
! 	(insert (substitute-command-keys
! 		 "In this buffer, type \\[apropos-follow] to get full documentation.\n\n"))
! 	(while (consp p)
! 	  (or (not spacing) (bobp) (terpri))
! 	  (setq apropos-item (car p)
! 		symbol (car apropos-item)
! 		p (cdr p)
! 		point1 (point))
! 	  (princ symbol)		        ; print symbol name
! 	  (setq point2 (point))
! 	  ;; Calculate key-bindings if we want them.
! 	  (and do-keys
! 	       (commandp symbol)
! 	       (indent-to 30 1)
! 	       (if (let ((keys
! 			  (save-excursion
! 			    (set-buffer old-buffer)
! 			    (where-is-internal symbol)))
! 			 filtered)
! 		     ;; Copy over the list of key sequences,
! 		     ;; omitting any that contain a buffer or a frame.
! 		     (while keys
! 		       (let ((key (car keys))
! 			     (i 0)
! 			     loser)
! 			 (while (< i (length key))
! 			   (if (or (framep (aref key i))
! 				   (bufferp (aref key i)))
! 			       (setq loser t))
! 			   (setq i (1+ i)))
! 			 (or loser
! 			     (setq filtered (cons key filtered))))
! 		       (setq keys (cdr keys)))
! 		     (setq item filtered))
! 		   ;; Convert the remaining keys to a string and insert.
! 		   (insert
! 		    (mapconcat
! 		     (lambda (key)
! 		       (setq key (key-description key))
  		       (if apropos-keybinding-face
! 			   (put-text-property 0 (length key)
! 					      'face apropos-keybinding-face
! 					      key))
! 		       key)
! 		     item ", "))
! 		 (insert "Type ")
! 		 (insert "M-x")
! 		 (put-text-property (- (point) 3) (point)
! 				    'face apropos-keybinding-face)
! 		 (insert " " (symbol-name symbol) " ")
! 		 (insert "RET")
! 		 (put-text-property (- (point) 3) (point)
! 				    'face apropos-keybinding-face)))
! 	  (terpri)
! 	  ;; only now so we don't propagate text attributes all over
! 	  (put-text-property point1 point2 'item
! 			     (if (eval `(or ,@(cdr apropos-item)))
! 				 (car apropos-item)
! 			       apropos-item))
! 	  (if apropos-symbol-face
! 	      (put-text-property point1 point2 'face apropos-symbol-face))
! 	  (apropos-print-doc 'describe-function 1
! 			     (if (commandp symbol)
! 				 "Command"
! 			       (if (apropos-macrop symbol)
! 				   "Macro"
! 				 "Function"))
! 			     do-keys)
! 	  (apropos-print-doc 'describe-variable 2
! 			     "Variable" do-keys)
! 	  (apropos-print-doc 'apropos-describe-plist 3
! 			     "Plist" nil)))))
    (prog1 apropos-accumulator
      (setq apropos-accumulator ())))	; permit gc
*************** found."
*** 512,545 ****
  (defun apropos-mouse-follow (event)
    (interactive "e")
!   (let ((other (if (eq (current-buffer) (get-buffer "*Help*"))
  		   ()
  		 (current-buffer))))
!     (set-buffer (window-buffer (posn-window (event-start event))))
!     (goto-char (posn-point (event-start event)))
!     ;; somehow when clicking with the point in another window, undoes badly
!     (undo-boundary)
!     (apropos-follow other)))
  
  
  (defun apropos-follow (&optional other)
    (interactive)
!   (let ((point (point))
! 	(item
! 	 (or (and (not (eobp)) (get-text-property (point) 'item))
! 	     (and (not (bobp)) (get-text-property (1- (point)) 'item))))
! 	action action-point)
!     (if (null item)
  	(error "There is nothing to follow here"))
!     (if (consp item)
! 	(error "There is nothing to follow in `%s'" (car item)))
!     (while (if (setq action-point
! 		     (next-single-property-change (point) 'action))
! 	       (<= action-point point))
!       (goto-char (1+ action-point))
!       (setq action action-point))
!     (funcall
!      (prog1 (get-text-property (or action action-point (point)) 'action)
!        (if other (set-buffer other)))
!      item)))
  
  
--- 553,587 ----
  (defun apropos-mouse-follow (event)
    (interactive "e")
!   (let ((other (if (eq (current-buffer) (get-buffer "*Apropos*"))
  		   ()
  		 (current-buffer))))
!     (save-excursion
!       (set-buffer (window-buffer (posn-window (event-start event))))
!       (goto-char (posn-point (event-start event)))
!       (or (and (not (eobp)) (get-text-property (point) 'mouse-face))
! 	  (and (not (bobp)) (get-text-property (1- (point)) 'mouse-face))
! 	  (error "There is nothing to follow here"))
!       (apropos-follow other))))
  
  
  (defun apropos-follow (&optional other)
    (interactive)
!   (let* (;; Properties are always found at the beginning of the line.
! 	 (bol (save-excursion (beginning-of-line) (point)))
! 	 ;; If there is no `item' property here, look behind us.
! 	 (item (get-text-property bol 'item))
! 	 (item-at (if item nil (previous-single-property-change bol 'item)))
! 	 ;; Likewise, if there is no `action' property here, look in front.
! 	 (action (get-text-property bol 'action))
! 	 (action-at (if action nil (next-single-property-change bol 'action))))
!     (and (null item) item-at
! 	 (setq item (get-text-property (1- item-at) 'item)))
!     (and (null action) action-at
! 	 (setq action (get-text-property action-at 'action)))
!     (if (not (and item action))
  	(error "There is nothing to follow here"))
!     (if (consp item) (error "There is nothing to follow in `%s'" (car item)))
!     (if other (set-buffer other))
!     (funcall action item)))
  
  
*************** found."
*** 555,559 ****
  	(put-text-property 8 (- (point) 14) 'face apropos-symbol-face))
      (insert (apropos-format-plist symbol "\n  "))
!     (princ ")")))
  
  ;;; apropos.el ends here
--- 597,602 ----
  	(put-text-property 8 (- (point) 14) 'face apropos-symbol-face))
      (insert (apropos-format-plist symbol "\n  "))
!     (princ ")")
!     (print-help-return-message)))
  
  ;;; apropos.el ends here
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/arc-mode.el emacs-19.31/lisp/arc-mode.el
*** emacs-19.30/lisp/arc-mode.el	Mon Nov 13 22:44:23 1995
--- emacs-19.31/lisp/arc-mode.el	Sun Jan 14 02:34:30 1996
***************
*** 1,5 ****
  ;;; arc-mode.el --- simple editing of archives
  
! ;;; Copyright (C) 1995 Free Software Foundation, Inc.
  
  ;; Author: Morten Welinder (terra@diku.dk)
--- 1,5 ----
  ;;; arc-mode.el --- simple editing of archives
  
! ;; Copyright (C) 1995 Free Software Foundation, Inc.
  
  ;; Author: Morten Welinder (terra@diku.dk)
***************
*** 7,28 ****
  ;; Favourite-brand-of-beer: None, I hate beer.
  
! ;;; 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:
! ;;
  ;; NAMING: "arc" is short for "archive" and does not refer specifically
  ;; to files whose name end in ".arc"
--- 7,29 ----
  ;; Favourite-brand-of-beer: None, I hate beer.
  
! ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
! 
  ;; NAMING: "arc" is short for "archive" and does not refer specifically
  ;; to files whose name end in ".arc"
*************** be added.  If `archive-zip-use-pkzip' is
*** 167,171 ****
  expected to extract to a file junking the directory part of the name.")
  
! ;; For several reasons the latter behaviour is not desireable in general.
  ;; (1) It uses more disk space.  (2) Error checking is worse or non-
  ;; existent.  (3) It tends to do funny things with other systems' file
--- 168,172 ----
  expected to extract to a file junking the directory part of the name.")
  
! ;; For several reasons the latter behaviour is not desirable in general.
  ;; (1) It uses more disk space.  (2) Error checking is worse or non-
  ;; existent.  (3) It tends to do funny things with other systems' file
*************** is visible (and the real data of the buf
*** 617,621 ****
  
  (defun archive-summarize-files (files)
!   "Insert a desciption of a list of files annotated with proper mouse face"
    (setq archive-file-list-start (point-marker))
    (setq archive-file-name-indent (if files (aref (car files) 1) 0))
--- 618,622 ----
  
  (defun archive-summarize-files (files)
!   "Insert a description of a list of files annotated with proper mouse face"
    (setq archive-file-list-start (point-marker))
    (setq archive-file-name-indent (if files (aref (car files) 1) 0))
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/array.el emacs-19.31/lisp/array.el
*** emacs-19.30/lisp/array.el	Mon Nov 20 16:54:33 1995
--- emacs-19.31/lisp/array.el	Wed Jan 24 19:24:02 1996
***************
*** 20,25 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** to the optional arguments A-ROW and A-CO
*** 103,109 ****
    (let ((buffer-line (current-line))
  	(buffer-column (current-column)))
!     (message (format "Array row: %s  Array column: %s" 
! 		     (prin1-to-string (array-current-row))
! 		     (prin1-to-string (array-current-column))))))
  
  (defun array-display-local-variables ()
--- 104,110 ----
    (let ((buffer-line (current-line))
  	(buffer-column (current-column)))
!     (message "Array row: %s  Array column: %s" 
! 	     (prin1-to-string (array-current-row))
! 	     (prin1-to-string (array-current-column)))))
  
  (defun array-display-local-variables ()
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/asm-mode.el emacs-19.31/lisp/asm-mode.el
*** emacs-19.30/lisp/asm-mode.el	Thu Mar 23 15:56:23 1995
--- emacs-19.31/lisp/asm-mode.el	Sun Jan 14 02:34:30 1996
***************
*** 20,25 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/assoc.el emacs-19.31/lisp/assoc.el
*** emacs-19.30/lisp/assoc.el	Thu Jul 15 01:07:41 1993
--- emacs-19.31/lisp/assoc.el	Sun Jan 14 02:34:30 1996
***************
*** 1,19 ****
  ;;; assoc.el --- insert/delete/sort functions on association lists
  
  ;; Author: Barry A. Warsaw <bwarsaw@cen.com>
  ;; Keywords: extensions
  
! ;; This software is distributed in the hope that it will be useful,
! ;; but WITHOUT ANY WARRANTY.  No author or distributor accepts
! ;; responsibility to anyone for the consequences of using it or for
! ;; whether it serves any particular purpose or works at all, unless he
! ;; says so in writing.
  
! ;; This software was written as part of the supercite author's
! ;; official duty as an employee of the United States Government and is
! ;; thus in the public domain.  You are free to use that particular
! ;; software as you wish, but WITHOUT ANY WARRANTY WHATSOEVER.  It
! ;; would be nice, though if when you use any of this code, you give
! ;; due credit to the author.
  
  ;;; Commentary:
--- 1,25 ----
  ;;; assoc.el --- insert/delete/sort functions on association lists
  
+ ;; Copyright (C) 1996 Free Software Foundation, Inc.
+ 
  ;; Author: Barry A. Warsaw <bwarsaw@cen.com>
  ;; Keywords: extensions
  
! ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/autoinsert.el emacs-19.31/lisp/autoinsert.el
*** emacs-19.30/lisp/autoinsert.el	Fri Jul  7 15:23:44 1995
--- emacs-19.31/lisp/autoinsert.el	Mon Jan 15 00:49:47 1996
***************
*** 1,3 ****
--- 1,4 ----
  ;;; autoinsert.el --- automatic mode-dependent insertion of text into new files
+ 
  ;; Copyright (C) 1985, 1986, 1987, 1994, 1995 Free Software Foundation, Inc.
  
***************
*** 18,23 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** If this contains a %s, that will be repl
*** 87,99 ****
      ("[Mm]akefile\\'" . "makefile.inc")
  
!     ("\\.html\\'"
!      nil
!      "<html>\n"
!      "<head>\n"
!      "<title>" _ "</title>\n"
!      "</head>\n"
!      "<body>\n\n"
!      "</body>\n"
!      "</html>")
      
      (plain-tex-mode . "tex-insert.tex")
--- 89,93 ----
      ("[Mm]akefile\\'" . "makefile.inc")
  
!     (html-mode . (lambda () (sgml-tag "html")))
      
      (plain-tex-mode . "tex-insert.tex")
*************** If this contains a %s, that will be repl
*** 153,157 ****
  ;; 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:
--- 147,152 ----
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/autoload.el emacs-19.31/lisp/autoload.el
*** emacs-19.30/lisp/autoload.el	Fri Jul  7 15:10:43 1995
--- emacs-19.31/lisp/autoload.el	Fri Jan 19 00:30:56 1996
***************
*** 1,24 ****
  ;;; autoload.el --- maintain autoloads in loaddefs.el.
  
! ;;; Copyright (C) 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
! ;;;
  ;; Author: Roland McGrath <roland@gnu.ai.mit.edu>
  ;; Keywords: maint
  
! ;;; This program 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.
! ;;;
! ;;; This program 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.
! ;;;
! ;;; A copy of the GNU General Public License can be obtained from this
! ;;; program's author (send electronic mail to roland@ai.mit.edu) or from
! ;;; the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA
! ;;; 02139, USA.
! ;;;
  
  ;;; Commentary:
--- 1,25 ----
  ;;; autoload.el --- maintain autoloads in loaddefs.el.
  
! ;; Copyright (C) 1991, 92, 93, 94, 95, 96 Free Software Foundation, Inc.
! 
  ;; Author: Roland McGrath <roland@gnu.ai.mit.edu>
  ;; Keywords: maint
  
! ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** are used."
*** 151,155 ****
        (unwind-protect
  	  (progn
! 	    (set-buffer (find-file-noselect file))
  	    (save-excursion
  	      (save-restriction
--- 152,165 ----
        (unwind-protect
  	  (progn
! 	    (if visited
! 		(set-buffer visited)
! 	      ;; It is faster to avoid visiting the file.
! 	      (set-buffer (get-buffer-create " *generate-autoload-file*"))
! 	      (kill-all-local-variables)
! 	      (erase-buffer)
! 	      (setq buffer-undo-list t
! 		    buffer-read-only nil)
! 	      (emacs-lisp-mode)
! 	      (insert-file-contents file nil))
  	    (save-excursion
  	      (save-restriction
*************** are used."
*** 216,222 ****
  			      (print autoload outbuf))))
  			  ;; Copy the rest of the line to the output.
! 			  (let ((begin (point)))
! 			    (forward-line 1)
! 			    (princ (buffer-substring begin (point)) outbuf))))
  		   ((looking-at ";")
  		    ;; Don't read the comment.
--- 226,239 ----
  			      (print autoload outbuf))))
  			  ;; Copy the rest of the line to the output.
! 		      (princ (buffer-substring
! 			      (progn
! 				;; Back up over whitespace, to preserve it.
! 				(skip-chars-backward " \f\t")
! 				(if (= (char-after (1+ (point))) ? )
! 				    ;; Eat one space.
! 				    (forward-char 1))
! 				(point))
! 			      (progn (forward-line 1) (point)))
! 			     outbuf)))
  		   ((looking-at ";")
  		    ;; Don't read the comment.
*************** autoloads go somewhere else.")
*** 274,278 ****
        ;; We want to get a value for generated-autoload-file from
        ;; the local variables section if it's there.
!       (set-buffer (find-file-noselect file))
        (set-buffer (find-file-noselect generated-autoload-file))
        (save-excursion
--- 291,296 ----
        ;; We want to get a value for generated-autoload-file from
        ;; the local variables section if it's there.
!       (if existing-buffer
! 	  (set-buffer existing-buffer))
        (set-buffer (find-file-noselect generated-autoload-file))
        (save-excursion
*************** autoloads go somewhere else.")
*** 300,305 ****
  					     (nth 1 file-time)))))
  			   (progn
! 			     (message "Autoload section for %s is up to date."
! 				      file)
  			     (setq found 'up-to-date))
  			 (search-forward generate-autoload-section-trailer)
--- 318,325 ----
  					     (nth 1 file-time)))))
  			   (progn
! 			     (if (interactive-p)
! 				 (message "\
! Autoload section for %s is up to date."
! 					  file))
  			     (setq found 'up-to-date))
  			 (search-forward generate-autoload-section-trailer)
*************** autoloads go somewhere else.")
*** 313,316 ****
--- 333,342 ----
  		     (goto-char (match-beginning 0))
  		     (setq found 'new)))))
+ 	  (or found
+ 	      (progn
+ 		(setq found 'new)
+ 		;; No later sections in the file.  Put before the last page.
+ 		(goto-char (point-max))
+ 		(search-backward "\f")))
  	  (or (eq found 'up-to-date)
  	      (and (eq found 'new)
*************** autoloads go somewhere else.")
*** 318,419 ****
  		   ;; new section for it.
  		   (save-excursion
! 		     (set-buffer (find-file-noselect file))
  		     (save-excursion
! 		       (widen)
! 		       (goto-char (point-min))
! 		       (if (search-forward (concat "\n"
! 						   generate-autoload-cookie)
! 					   nil t)
! 			   nil
! 			 (if (interactive-p)
! 			     (message file " has no autoloads"))
! 			 t))))
  	      (generate-file-autoloads file))))
!       (if (interactive-p) (save-buffer))
!       (if (and (null existing-buffer)
! 	       (setq existing-buffer (get-file-buffer file)))
! 	  (kill-buffer existing-buffer)))))
  
  ;;;###autoload
! (defun update-autoloads-here ()
    "\
! Update sections of the current buffer generated by \\[update-file-autoloads]."
!   (interactive)
!   (let ((generated-autoload-file (buffer-file-name)))
      (save-excursion
!       (goto-char (point-min))
!       (while (search-forward generate-autoload-section-header nil t)
! 	(let* ((form (condition-case ()
! 			 (read (current-buffer))
! 		       (end-of-file nil)))
! 	       (file (nth 3 form)))
! 	  (if (and (stringp file)
! 		   (or (get-file-buffer file)
! 		       (file-exists-p file)))
! 	      ()
! 	    (setq file (if (y-or-n-p (format "Can't find library `%s'; remove its autoloads? "
! 					     (nth 2 form) file))
! 			   t
! 			 (condition-case ()
! 			     (read-file-name (format "Find `%s' load file: "
! 						     (nth 2 form))
! 					     nil nil t)
! 			   (quit nil)))))
! 	  (if file
! 	      (let ((begin (match-beginning 0)))
! 		(search-forward generate-autoload-section-trailer)
! 		(delete-region begin (point))))
! 	  (if (stringp file)
! 	      (generate-file-autoloads file)))))))
! 
! ;;;###autoload
! (defun update-directory-autoloads (dir)
!   "Run \\[update-file-autoloads] on each .el file in DIR."
!   (interactive "DUpdate autoloads for directory: ")
!   (let ((enable-local-eval nil))
!     (mapcar 'update-file-autoloads
! 	    (directory-files dir t "^[^=].*\\.el$")))
!   (if (interactive-p)
        (save-excursion
! 	(set-buffer (find-file-noselect generated-autoload-file))
! 	(save-buffer))))
  
  ;;;###autoload
  (defun batch-update-autoloads ()
!   "Update the autoloads for the files or directories on the command line.
! Runs \\[update-file-autoloads] on files and \\[update-directory-autoloads]
! on directories.  Must be used only with -batch, and kills Emacs on completion.
! Each file will be processed even if an error occurred previously.
! For example, invoke `emacs -batch -f batch-update-autoloads *.el'."
!   (if (not noninteractive)
!       (error "batch-update-autoloads is to be used only with -batch"))
!   (let ((lost nil)
! 	(args command-line-args-left)
! 	(enable-local-eval nil))	;Don't query in batch mode.
!     (message "Updating autoloads in %s..." generated-autoload-file)
!     (let ((frob (function
!  		 (lambda (file)
!  		   (condition-case lossage
!  		       (update-file-autoloads file)
!  		     (error
!  		      (princ ">>Error processing ")
!  		      (princ file)
!  		      (princ ": ")
!  		      (if (fboundp 'display-error)
!  			  (display-error lossage nil)
!  			(prin1 lossage))
!  		      (princ "\n")
!  		      (setq lost t)))))))
!       (while args
!  	(if (file-directory-p (expand-file-name (car args)))
!  	    (let ((rest (directory-files (car args) t "\\.el$")))
!  	      (while rest
!  		(funcall frob (car rest))
!  		(setq rest (cdr rest))))
!  	  (funcall frob (car args)))
!  	(setq args (cdr args))))
!     (save-some-buffers t)
!     (message "Done")
!     (kill-emacs (if lost 1 0))))
  
  (provide 'autoload)
--- 344,414 ----
  		   ;; new section for it.
  		   (save-excursion
! 		     (if existing-buffer
! 			 (set-buffer existing-buffer)
! 		       ;; It is faster to avoid visiting the file.
! 		       (set-buffer (get-buffer-create " *autoload-file*"))
! 		       (kill-all-local-variables)
! 		       (erase-buffer)
! 		       (setq buffer-undo-list t
! 			     buffer-read-only nil)
! 		       (emacs-lisp-mode)
! 		       (insert-file-contents file nil))
  		     (save-excursion
! 		       (save-restriction
! 			 (widen)
! 			 (goto-char (point-min))
! 			 (prog1
! 			     (if (search-forward
! 				  (concat "\n" generate-autoload-cookie)
! 				  nil t)
! 				 nil
! 			       (if (interactive-p)
! 				   (message "%s has no autoloads" file))
! 			       t)
! 			   (or existing-buffer
! 			       (kill-buffer (current-buffer))))))))
  	      (generate-file-autoloads file))))
!       (if (interactive-p) (save-buffer)))))
  
  ;;;###autoload
! (defun update-autoloads-from-directory (dir)
    "\
! Update loaddefs.el with all the current autoloads from DIR, and no old ones.
! This uses `update-file-autoloads' (which see) do its work."
!   (interactive "DUpdate autoloads from directory: ")
!   (setq dir (expand-file-name dir))
!   (let ((files (directory-files dir nil "^[^=].*\\.el$")))
      (save-excursion
!       (set-buffer (find-file-noselect
! 		   (if (file-exists-p generated-autoload-file)
! 		       generated-autoload-file
! 		     (expand-file-name generated-autoload-file
! 				       dir))))
        (save-excursion
! 	(goto-char (point-min))
! 	(while (search-forward generate-autoload-section-header nil t)
! 	  (let* ((form (condition-case ()
! 			   (read (current-buffer))
! 			 (end-of-file nil)))
! 		 (file (nth 3 form)))
! 	    (cond ((not (stringp file)))
! 		  ((not (file-exists-p (expand-file-name file dir)))
! 		   ;; Remove the obsolete section.
! 		   (let ((begin (match-beginning 0)))
! 		     (search-forward generate-autoload-section-trailer)
! 		     (delete-region begin (point))))
! 		  (t
! 		   (update-file-autoloads file)))
! 	    (setq files (delete file files)))))
!       ;; Elements remaining in FILES have no existing autoload sections.
!       (mapcar 'update-file-autoloads files)
!       (save-buffer))))
  
  ;;;###autoload
  (defun batch-update-autoloads ()
!   "Update loaddefs.el autoloads in batch mode.
! Calls `update-autoloads-from-directory' on each command line argument."
!   (mapcar 'update-autoloads-from-directory command-line-args-left)
!   (setq command-line-args-left nil))
  
  (provide 'autoload)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/avoid.el emacs-19.31/lisp/avoid.el
*** emacs-19.30/lisp/avoid.el	Mon Oct 30 11:49:00 1995
--- emacs-19.31/lisp/avoid.el	Wed Mar 27 17:37:41 1996
***************
*** 19,68 ****
  
  ;; 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:
! ;;;
! ;;; For those who are annoyed by the mouse pointer obscuring text,
! ;;; this mode moves the mouse pointer - either just a little out of
! ;;; the way, or all the way to the corner of the frame. 
! ;;; To use, load or evaluate this file and type M-x mouse-avoidance-mode .
! ;;; To set up permanently, put the following in your .emacs: 
! ;;;
! ;;; (if window-system (mouse-avoidance-mode 'animate))
! ;;;
! ;;; The 'animate can be 'jump or 'banish or 'exile or 'protean if you prefer.
! ;;; See the documentation for function `mouse-avoidance-mode' for
! ;;; details of the different modes.
! ;;;
! ;;; For added silliness, make the animatee animate...
! ;;; put something similar to the following into your .emacs:
! ;;;
! ;;; (if window-system
! ;;;     (mouse-avoidance-set-pointer-shape
! ;;;	     (eval (nth (random 4)
! ;;;			'(x-pointer-man x-pointer-spider
! ;;;			  x-pointer-gobbler x-pointer-gumby)))))
! ;;;
! ;;; For completely random pointer shape, replace the setq above with:
! ;;; (setq x-pointer-shape (mouse-avoidance-random-shape))
! ;;; 
! ;;; Bugs / Warnings / To-Do:
! ;;;
! ;;; - Using this code does slow emacs down.  "banish" mode shouldn't
! ;;;   be too bad, and on my workstation even "animate" is reasonable.
! ;;;
! ;;; - It ought to find out where any overlapping frames are and avoid them,
! ;;;   rather than always raising the frame.
! 
! ;;; Credits:
! ;;; This code was helped by all those who contributed suggestions, 
! ;;;   fixes, and additions
! ;;; Joe Harrington (and his advisor), for the original inspiration.
! ;;; Ken Manheimer, for dreaming up the Protean mode.
! ;;; Richard Stallman, for the awful cat-and-mouse pun, among other things.
! ;;; Mike Williams, Denis Howe, Bill Benedetto, Chris Moore, Don Morris,
! ;;; Simon Marshall, and M.S. Ashton, for their feedback.
! ;;;
  ;;; Code:
  
--- 19,69 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
! 
! ;; For those who are annoyed by the mouse pointer obscuring text,
! ;; this mode moves the mouse pointer - either just a little out of
! ;; the way, or all the way to the corner of the frame. 
! ;; To use, load or evaluate this file and type M-x mouse-avoidance-mode .
! ;; To set up permanently, put the following in your .emacs: 
! ;;
! ;; (if window-system (mouse-avoidance-mode 'animate))
! ;;
! ;; The 'animate can be 'jump or 'banish or 'exile or 'protean if you prefer.
! ;; See the documentation for function `mouse-avoidance-mode' for
! ;; details of the different modes.
! ;;
! ;; For added silliness, make the animatee animate...
! ;; put something similar to the following into your .emacs:
! ;;
! ;; (if window-system
! ;;     (mouse-avoidance-set-pointer-shape
! ;;	     (eval (nth (random 4)
! ;;			'(x-pointer-man x-pointer-spider
! ;;			  x-pointer-gobbler x-pointer-gumby)))))
! ;;
! ;; For completely random pointer shape, replace the setq above with:
! ;; (setq x-pointer-shape (mouse-avoidance-random-shape))
! ;; 
! ;; Bugs / Warnings / To-Do:
! ;;
! ;; - Using this code does slow emacs down.  "banish" mode shouldn't
! ;;   be too bad, and on my workstation even "animate" is reasonable.
! ;;
! ;; - It ought to find out where any overlapping frames are and avoid them,
! ;;   rather than always raising the frame.
! 
! ;; Credits:
! ;; This code was helped by all those who contributed suggestions, 
! ;;   fixes, and additions
! ;; Joe Harrington (and his advisor), for the original inspiration.
! ;; Ken Manheimer, for dreaming up the Protean mode.
! ;; Richard Stallman, for the awful cat-and-mouse pun, among other things.
! ;; Mike Williams, Denis Howe, Bill Benedetto, Chris Moore, Don Morris,
! ;; Simon Marshall, and M.S. Ashton, for their feedback.
! 
  ;;; Code:
  
*************** Only applies in mouse-avoidance-modes `a
*** 95,98 ****
--- 96,100 ----
  (defvar mouse-avoidance-pointer-shapes nil)
  (defvar mouse-avoidance-n-pointer-shapes 0)
+ (defvar mouse-avoidance-old-pointer-shape nil)
  
  ;;; Functions:
*************** You can redefine this if you want the mo
*** 167,171 ****
    ;; warp-conservation, the DISTANCE we like to move, the VARIABILITY
    ;; in distance allowed, and the MIN and MAX possible window positions.
!   ;; Returns something as close to DELTA as possible withing the constraints.
    (let ((L1 (max (- min cur) (+ (- dist) (- var))))
  	(R1                  (+ (- dist)    var ))
--- 169,173 ----
    ;; warp-conservation, the DISTANCE we like to move, the VARIABILITY
    ;; in distance allowed, and the MIN and MAX possible window positions.
!   ;; Returns something as close to DELTA as possible within the constraints.
    (let ((L1 (max (- min cur) (+ (- dist) (- var))))
  	(R1                  (+ (- dist)    var ))
*************** definition of \"random distance\".)"
*** 323,326 ****
--- 325,334 ----
    (remove-hook 'post-command-idle-hook 'mouse-avoidance-exile-hook)
    (remove-hook 'post-command-idle-hook 'mouse-avoidance-fancy-hook)
+ 
+   ;; Restore pointer shape if necessary
+   (if (eq mouse-avoidance-mode 'proteus)
+       (mouse-avoidance-set-pointer-shape mouse-avoidance-old-pointer-shape))
+ 
+   ;; Do additional setup depending on version of mode requested
    (cond	((eq mode 'none)
  	 (setq mouse-avoidance-mode nil))
*************** definition of \"random distance\".)"
*** 330,334 ****
  	 (add-hook 'post-command-idle-hook 'mouse-avoidance-fancy-hook)
  	 (setq mouse-avoidance-mode mode
! 	       mouse-avoidance-state (cons 0 0)))
  	((eq mode 'exile)
  	 (add-hook 'post-command-idle-hook 'mouse-avoidance-exile-hook)
--- 338,343 ----
  	 (add-hook 'post-command-idle-hook 'mouse-avoidance-fancy-hook)
  	 (setq mouse-avoidance-mode mode
! 	       mouse-avoidance-state (cons 0 0)
! 	       mouse-avoidance-old-pointer-shape x-pointer-shape))
  	((eq mode 'exile)
  	 (add-hook 'post-command-idle-hook 'mouse-avoidance-exile-hook)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/awk-mode.el emacs-19.31/lisp/awk-mode.el
*** emacs-19.30/lisp/awk-mode.el	Fri Nov 10 12:09:17 1995
--- emacs-19.31/lisp/awk-mode.el	Sun Jan 14 02:34:30 1996
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/backquote.el emacs-19.31/lisp/backquote.el
*** emacs-19.30/lisp/backquote.el	Mon Oct 30 11:50:24 1995
--- emacs-19.31/lisp/backquote.el	Mon May 20 16:58:44 1996
***************
*** 1,3 ****
! ;;; backquote.el -- implement the ` Lisp construct
  ;;; Copyright (C) 1990, 1992, 1994 Free Software Foundation, Inc.
  
--- 1,4 ----
! ;;; backquote.el --- implement the ` Lisp construct
! 
  ;;; Copyright (C) 1990, 1992, 1994 Free Software Foundation, Inc.
  
***************
*** 19,24 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/bib-mode.el emacs-19.31/lisp/bib-mode.el
*** emacs-19.30/lisp/bib-mode.el	Mon Mar 22 09:40:59 1993
--- emacs-19.31/lisp/bib-mode.el	Sun Jan 14 02:34:30 1996
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** named by variable `unread-bib-file'."
*** 199,203 ****
        "the\\|and\\|of\\|is\\|a\\|an\\|of\\|for\\|in\\|to\\|in\\|on\\|at\\|"
        "by\\|with\\|that\\|its")
!    "Words not to be capitialized in a title (unless they're the first word
  in the title).")
  
--- 200,204 ----
        "the\\|and\\|of\\|is\\|a\\|an\\|of\\|for\\|in\\|to\\|in\\|on\\|at\\|"
        "by\\|with\\|that\\|its")
!    "Words not to be capitalized in a title (unless they're the first word
  in the title).")
  
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/bibtex.el emacs-19.31/lisp/bibtex.el
*** emacs-19.30/lisp/bibtex.el	Fri Aug  4 20:49:49 1995
--- emacs-19.31/lisp/bibtex.el	Fri Mar  8 12:42:37 1996
***************
*** 1,12 ****
  ;;; bibtex.el --- BibTeX mode for GNU Emacs
  
! ;; Copyright (C) 1992, 1994, 1995 Free Software Foundation, Inc.
  
! ;; Author: Stefan Schoef <schoef@informatik.uni-oldenburg.de>
! ;;      Bengt Martensson <ubrinf!mond!bengt>
  ;;	Mark Shapiro <shapiro@corto.inria.fr>
  ;;	Mike Newton <newton@gumby.cs.caltech.edu>
  ;;	Aaron Larson <alarson@src.honeywell.com>
! ;; Maintainer: Stefan Schoef <schoef@informatik.uni-oldenburg.de>
  ;; Keywords: BibTeX, LaTeX, TeX
  
--- 1,12 ----
  ;;; bibtex.el --- BibTeX mode for GNU Emacs
  
! ;; Copyright (C) 1992, 1994, 1995, 1996 Free Software Foundation, Inc.
  
! ;; Author: Stefan Schoef <schoef@offis.uni-oldenburg.de>
! ;;      Bengt Martensson <bengt@mathematik.uni-Bremen.de>
  ;;	Mark Shapiro <shapiro@corto.inria.fr>
  ;;	Mike Newton <newton@gumby.cs.caltech.edu>
  ;;	Aaron Larson <alarson@src.honeywell.com>
! ;; Maintainer: Stefan Schoef <schoef@offis.uni-oldenburg.de>
  ;; Keywords: BibTeX, LaTeX, TeX
  
***************
*** 24,31 ****
  
  ;; 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:
  ;;  Major mode for editing and validating BibTeX files.
  
--- 24,33 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
+ 
  ;;  Major mode for editing and validating BibTeX files.
  
***************
*** 45,52 ****
  ;;      moving to the empty string. [reported by gernot@cs.unsw.oz.au]
  
! ;; (current keeper: schoef@informatik.uni-oldenburg.de
  ;;  previous: alarson@src.honeywell.com)
  
  ;;; Code:
  ;; User Options:
  
--- 47,55 ----
  ;;      moving to the empty string. [reported by gernot@cs.unsw.oz.au]
  
! ;; (current keeper: schoef@offis.uni-oldenburg.de
  ;;  previous: alarson@src.honeywell.com)
  
  ;;; Code:
+ 
  ;; User Options:
  
*************** name of the field, second element = comm
*** 79,95 ****
  
  (defvar bibtex-sort-ignore-string-entries t
!   "*If true, BibTeX @STRING entries are not sort-significant.
  That means they are ignored when determining ordering of the buffer
! (e.g. sorting, locating alphabetical position for new entries, etc.).")
  
  (defvar bibtex-maintain-sorted-entries nil
!   "*If true, bibtex-mode maintains all BibTeX entries in sorted order.
  Setting this variable to nil will strip off some comfort (e.g. TAB
! completion for reference keys) from bibtex-mode.")
  
  (defvar bibtex-entry-field-alist
    '(
      ("Article" . (((("author" "Author1 [and Author2 ...] [and others]")
!                     ("title" "Title of the article (will be converted to lowercase)")
                      ("journal" "Name of the journal (use string, remove braces)")
                      ("year" "Year of publication"))
--- 82,103 ----
  
  (defvar bibtex-sort-ignore-string-entries t
!   "*If non-nil, BibTeX @STRING entries are not sort-significant.
  That means they are ignored when determining ordering of the buffer
! (e.g. sorting, locating alphabetical position for new entries, etc.).
! This variable is buffer local.")
! (make-variable-buffer-local 'bibtex-sort-ignore-string-entries)
  
  (defvar bibtex-maintain-sorted-entries nil
!   "*If non-nil, bibtex-mode maintains all BibTeX entries in sorted order.
  Setting this variable to nil will strip off some comfort (e.g. TAB
! completion for reference keys in minibuffer, automatic detection of
! duplicates) from bibtex-mode. See also bibtex-sort-ignore-string-entries.
! This variable is buffer local.")
! (make-variable-buffer-local 'bibtex-maintain-sorted-entries)
  
  (defvar bibtex-entry-field-alist
    '(
      ("Article" . (((("author" "Author1 [and Author2 ...] [and others]")
!                     ("title" "Title of the article (BibTeX converts it to lowercase)")
                      ("journal" "Name of the journal (use string, remove braces)")
                      ("year" "Year of publication"))
*************** completion for reference keys) from bibt
*** 100,104 ****
                      ("note" "Remarks to be put at the end of the \\bibitem")))
  		  ((("author" "Author1 [and Author2 ...] [and others]")
!                     ("title" "Title of the article (will be converted to lowercase)"))
  		   (("journal" "Name of the journal (use string, remove braces)") 
                      ("year" "Year of publication")
--- 108,112 ----
                      ("note" "Remarks to be put at the end of the \\bibitem")))
  		  ((("author" "Author1 [and Author2 ...] [and others]")
!                     ("title" "Title of the article (BibTeX converts it to lowercase)"))
  		   (("journal" "Name of the journal (use string, remove braces)") 
                      ("year" "Year of publication")
*************** completion for reference keys) from bibt
*** 120,124 ****
                   ("month" "Month of the publication as a string (remove braces)")
                   ("note" "Remarks to be put at the end of the \\bibitem")))))
!     ("Booklet" . (((("title" "Title of the booklet (will be converted to lowercase)"))
  		   (("author" "Author1 [and Author2 ...] [and others]")
                      ("howpublished" "The way in which the booklet was published")
--- 128,132 ----
                   ("month" "Month of the publication as a string (remove braces)")
                   ("note" "Remarks to be put at the end of the \\bibitem")))))
!     ("Booklet" . (((("title" "Title of the booklet (BibTeX converts it to lowercase)"))
  		   (("author" "Author1 [and Author2 ...] [and others]")
                      ("howpublished" "The way in which the booklet was published")
*************** completion for reference keys) from bibt
*** 158,162 ****
                     ("note" "Remarks to be put at the end of the \\bibitem")))))
      ("InCollection" . (((("author" "Author1 [and Author2 ...] [and others]")
!                          ("title" "Title of the article in book (will be converted to lowercase)")
  			 ("booktitle" "Name of the book")
                           ("publisher" "Publishing company")
--- 166,170 ----
                     ("note" "Remarks to be put at the end of the \\bibitem")))))
      ("InCollection" . (((("author" "Author1 [and Author2 ...] [and others]")
!                          ("title" "Title of the article in book (BibTeX converts it to lowercase)")
  			 ("booktitle" "Name of the book")
                           ("publisher" "Publishing company")
*************** completion for reference keys) from bibt
*** 174,178 ****
                           ("note" "Remarks to be put at the end of the \\bibitem")))
  		       ((("author" "Author1 [and Author2 ...] [and others]")
!                          ("title" "Title of the article in book (will be converted to lowercase)")
                           ("booktitle" "Name of the book"))
  			(("publisher" "Publishing company")
--- 182,186 ----
                           ("note" "Remarks to be put at the end of the \\bibitem")))
  		       ((("author" "Author1 [and Author2 ...] [and others]")
!                          ("title" "Title of the article in book (BibTeX converts it to lowercase)")
                           ("booktitle" "Name of the book"))
  			(("publisher" "Publishing company")
*************** completion for reference keys) from bibt
*** 190,194 ****
                           ("note" "Remarks to be put at the end of the \\bibitem")))))
      ("InProceedings" . (((("author" "Author1 [and Author2 ...] [and others]")
!                           ("title" "Title of the article in proceedings (will be converted to lowercase)")
                            ("booktitle" "Name of the conference proceedings")
                            ("year" "Year of publication"))
--- 198,202 ----
                           ("note" "Remarks to be put at the end of the \\bibitem")))))
      ("InProceedings" . (((("author" "Author1 [and Author2 ...] [and others]")
!                           ("title" "Title of the article in proceedings (BibTeX converts it to lowercase)")
                            ("booktitle" "Name of the conference proceedings")
                            ("year" "Year of publication"))
*************** completion for reference keys) from bibt
*** 204,208 ****
                            ("note" "Remarks to be put at the end of the \\bibitem")))
  			((("author" "Author1 [and Author2 ...] [and others]")
!                           ("title" "Title of the article in proceedings (will be converted to lowercase)")
  			  ("booktitle" "Name of the conference proceedings"))
  			 (("editor" "Editor1 [and Editor2 ...] [and others]")
--- 212,216 ----
                            ("note" "Remarks to be put at the end of the \\bibitem")))
  			((("author" "Author1 [and Author2 ...] [and others]")
!                           ("title" "Title of the article in proceedings (BibTeX converts it to lowercase)")
  			  ("booktitle" "Name of the conference proceedings"))
  			 (("editor" "Editor1 [and Editor2 ...] [and others]")
*************** completion for reference keys) from bibt
*** 227,231 ****
  
      ("MastersThesis" . (((("author" "Author1 [and Author2 ...] [and others]")
!                           ("title" "Title of the master\'s thesis (will be converted to lowercase)")
                            ("school" "School where the master\'s thesis was written")
                            ("year" "Year of publication"))
--- 235,239 ----
  
      ("MastersThesis" . (((("author" "Author1 [and Author2 ...] [and others]")
!                           ("title" "Title of the master\'s thesis (BibTeX converts it to lowercase)")
                            ("school" "School where the master\'s thesis was written")
                            ("year" "Year of publication"))
*************** completion for reference keys) from bibt
*** 236,240 ****
      ("Misc" . ((()
  		(("author" "Author1 [and Author2 ...] [and others]")
!                  ("title" "Title of the reference (will be converted to lowercase)")
                   ("howpublished" "The way in which the reference was published")
                   ("year" "Year of publication")
--- 244,248 ----
      ("Misc" . ((()
  		(("author" "Author1 [and Author2 ...] [and others]")
!                  ("title" "Title of the reference (BibTeX converts it to lowercase)")
                   ("howpublished" "The way in which the reference was published")
                   ("year" "Year of publication")
*************** completion for reference keys) from bibt
*** 261,265 ****
                          ("note" "Remarks to be put at the end of the \\bibitem")))))
      ("TechReport" . (((("author" "Author1 [and Author2 ...] [and others]")
!                        ("title" "Title of the technical report (will be converted to lowercase)")
                         ("institution" "Sponsoring institution of the report")
                         ("year" "Year of publication"))
--- 269,273 ----
                          ("note" "Remarks to be put at the end of the \\bibitem")))))
      ("TechReport" . (((("author" "Author1 [and Author2 ...] [and others]")
!                        ("title" "Title of the technical report (BibTeX converts it to lowercase)")
                         ("institution" "Sponsoring institution of the report")
                         ("year" "Year of publication"))
*************** completion for reference keys) from bibt
*** 270,274 ****
                         ("note" "Remarks to be put at the end of the \\bibitem")))))
      ("Unpublished" . (((("author" "Author1 [and Author2 ...] [and others]")
!                         ("title" "Title of the unpublished reference (will be converted to lowercase)")
                          ("note" "Remarks to be put at the end of the \\bibitem"))
  		       (("year" "Year of publication")
--- 278,282 ----
                         ("note" "Remarks to be put at the end of the \\bibitem")))))
      ("Unpublished" . (((("author" "Author1 [and Author2 ...] [and others]")
!                         ("title" "Title of the unpublished reference (BibTeX converts it to lowercase)")
                          ("note" "Remarks to be put at the end of the \\bibitem"))
  		       (("year" "Year of publication")
*************** See the documentation of function bibtex
*** 398,401 ****
--- 406,412 ----
    "*If non-nil, user is allowed to edit the generated key before it is used.")
  
+ ;; bibtex-font-lock-keywords is a user option as well, but since the
+ ;; patterns used to define this variable are defined in a later
+ ;; section of this file, its definition comes later.
  
  
*************** See the documentation of function bibtex
*** 435,439 ****
      (define-key km "\C-c\C-b"   'bibtex-entry)
      (define-key km "\C-c\C-q" 'bibtex-hide-entry-bodies)
-     (define-key km "\C-c\C-a" 'show-all)
      (define-key km "\C-c\C-rn" 'bibtex-narrow-to-entry)
      (define-key km "\C-c\C-rw" 'widen)
--- 446,449 ----
*************** See the documentation of function bibtex
*** 460,486 ****
      km))
  
! (define-key bibtex-mode-map [menu-bar move/edit]
    (cons "BibTeX-Edit" (make-sparse-keymap "BibTeX-Edit")))
! (define-key bibtex-mode-map [menu-bar move/edit bibtex-print-help-message]
    '("Help about Current Field" . bibtex-print-help-message))
! (define-key bibtex-mode-map [menu-bar move/edit bibtex-complete-string]
    '("String Complete" . bibtex-complete-string))
! (define-key bibtex-mode-map [menu-bar move/edit bibtex-next-field]
    '("Next Field" . bibtex-next-field))
! (define-key bibtex-mode-map [menu-bar move/edit bibtex-find-text]
    '("End of Field" . bibtex-find-text))
! (define-key bibtex-mode-map [menu-bar move/edit bibtex-pop-previous]
    '("Snatch from Similar Preceding Field" . bibtex-pop-previous))
! (define-key bibtex-mode-map [menu-bar move/edit bibtex-pop-next]
    '("Snatch from Similar Following Field" . bibtex-pop-next))
! (define-key bibtex-mode-map [menu-bar move/edit bibtex-remove-OPT]
    '("Remove OPT" . bibtex-remove-OPT))
! (define-key bibtex-mode-map [menu-bar move/edit bibtex-remove-double-quotes-or-braces]
    '("Remove Quotes or Braces" . bibtex-remove-double-quotes-or-braces))
! (define-key bibtex-mode-map [menu-bar move/edit bibtex-clean-entry]
    '("Clean Up Entry" . bibtex-clean-entry))
! (define-key bibtex-mode-map [menu-bar move/edit bibtex-sort-entries]
    '("Sort Entries" . bibtex-sort-entries))
! (define-key bibtex-mode-map [menu-bar move/edit bibtex-validate-buffer]
    '("Validate Entries" . bibtex-validate-buffer))
  
--- 470,502 ----
      km))
  
! (define-key bibtex-mode-map [menu-bar bibtex-edit]
    (cons "BibTeX-Edit" (make-sparse-keymap "BibTeX-Edit")))
! (define-key bibtex-mode-map [menu-bar bibtex-edit bibtex-print-help-message]
    '("Help about Current Field" . bibtex-print-help-message))
! (define-key bibtex-mode-map [menu-bar bibtex-edit bibtex-complete-string]
    '("String Complete" . bibtex-complete-string))
! (define-key bibtex-mode-map [menu-bar bibtex-edit bibtex-next-field]
    '("Next Field" . bibtex-next-field))
! (define-key bibtex-mode-map [menu-bar bibtex-edit bibtex-find-text]
    '("End of Field" . bibtex-find-text))
! (define-key bibtex-mode-map [menu-bar bibtex-edit bibtex-pop-previous]
    '("Snatch from Similar Preceding Field" . bibtex-pop-previous))
! (define-key bibtex-mode-map [menu-bar bibtex-edit bibtex-pop-next]
    '("Snatch from Similar Following Field" . bibtex-pop-next))
! (define-key bibtex-mode-map [menu-bar bibtex-edit bibtex-remove-OPT]
    '("Remove OPT" . bibtex-remove-OPT))
! (define-key bibtex-mode-map [menu-bar bibtex-edit bibtex-remove-double-quotes-or-braces]
    '("Remove Quotes or Braces" . bibtex-remove-double-quotes-or-braces))
! (define-key bibtex-mode-map [menu-bar bibtex-edit bibtex-clean-entry]
    '("Clean Up Entry" . bibtex-clean-entry))
! (define-key bibtex-mode-map [menu-bar bibtex-edit bibtex-sort-entries]
    '("Sort Entries" . bibtex-sort-entries))
! (define-key bibtex-mode-map
!   [menu-bar bibtex-edit bibtex-validate-buffer-from-point]
!   '("Validate Entries Starting at Point" .
!     (lambda ()
!       (interactive)
!       (bibtex-validate-buffer t))))
! (define-key bibtex-mode-map [menu-bar bibtex-edit bibtex-validate-buffer]
    '("Validate Entries" . bibtex-validate-buffer))
  
*************** See the documentation of function bibtex
*** 518,521 ****
--- 534,543 ----
    '("Article in Journal" . bibtex-Article))
  
+ 
+ ;; Bug Reporting
+ 
+ (defconst
+   bibtex-maintainer-address "Stefan Schoef <schoef@offis.uni-oldenburg.de>")
+ ;; current maintainer
  
  
*************** See the documentation of function bibtex
*** 535,538 ****
--- 557,571 ----
  (make-variable-buffer-local 'bibtex-completion-candidates)
  
+ (defvar bibtex-keys nil)
+ ;; Candidates for TAB completion when entering a reference key using
+ ;; the minibuffer. Initialized in bibtex-mode and updated for each
+ ;; new entry. This variable is buffer-local.
+ (make-variable-buffer-local 'bibtex-keys)
+ 
+ (defvar bibtex-buffer-last-parsed-for-keys-tick nil)
+ ;; Remembers the value returned by buffer-modified-tick when buffer
+ ;; was parsed for keys the last time.
+ (make-variable-buffer-local 'bibtex-keys)
+ 
  
  ;; Functions to Parse the BibTeX Entries
*************** See the documentation of function bibtex
*** 551,568 ****
  ;; The regexp subexpression number of the text part in bibtex-cfield.
  
! (defconst bibtex-field-name "[A-Za-z][]A-Za-z0-9.:;?!`'()/*@_+=-]*")
  ;; Regexp defining the name part of a BibTeX field.
  
! (defconst bibtex-field-const "[0-9A-Za-z][A-Za-z0-9:_+-]*"
!   "Format of a bibtex field constant.")
  
! (defconst bibtex-field-string
    (concat
     "\\("
!    "{\\(\\({\\(\\({[^}]*}\\)\\|\\([^{}]\\)\\)*}\\)\\|\\([^{}]\\)\\)*}"
!    ;; maximal twice nested {}
!    "\\)\\|\\("
!    "\"[^\"]*[^\\\\]\"\\|\"\"\\)"))
! ;; Match either a string or an empty string.
  
  (defconst bibtex-field-string-or-const
--- 584,666 ----
  ;; The regexp subexpression number of the text part in bibtex-cfield.
  
! (defconst bibtex-field-name "[^\"#%'(),={} \t\n0-9][^\"#%'(),={} \t\n]*")
  ;; Regexp defining the name part of a BibTeX field.
  
! (defconst bibtex-field-const "[][A-Za-z0-9.:;?!`'()/*@_+=|<>-]+")
! ;; Format of a bibtex field constant (same as bibtex-reference-key (see below))
  
! (defconst bibtex-field-string-part-not-braced
!   "[^{}]")
! ;; Match field string part without braces
! 
! (defconst bibtex-field-string-part-no-inner-braces
!   (concat
!    "{"
!    "\\(" bibtex-field-string-part-not-braced "\\)*"
!    "}"))
! ;; Match field string part with no inner braces
! 
! (defconst bibtex-field-string-part-1-inner-brace
!   (concat
!    "{"
!    "\\("
!      "\\(" bibtex-field-string-part-not-braced "\\)"
!      "\\|"
!      "\\(" bibtex-field-string-part-no-inner-braces "\\)"
!    "\\)*"
!    "}"))
! ;; Match field string part with at most 1 inner brace
! 
! (defconst bibtex-field-string-part-2-inner-braces
    (concat
+    "{"
     "\\("
!      "\\(" bibtex-field-string-part-not-braced "\\)"
!      "\\|"
!      "\\(" bibtex-field-string-part-no-inner-braces "\\)"
!      "\\|"
!      "\\(" bibtex-field-string-part-1-inner-brace "\\)"
!    "\\)*"
!    "}"))
! ;; Match field string part with at most 2 inner braces
! 
! (defconst bibtex-field-string-part-3-inner-braces
!   (concat
!    "{"
!    "\\("
!      "\\(" bibtex-field-string-part-not-braced "\\)"
!      "\\|"
!      "\\(" bibtex-field-string-part-no-inner-braces "\\)"
!      "\\|"
!      "\\(" bibtex-field-string-part-1-inner-brace "\\)"
!      "\\|"
!      "\\(" bibtex-field-string-part-2-inner-braces "\\)"
!    "\\)*"
!    "}"))
! ;; Match field string part with at most 3 inner braces
! 
! (defconst bibtex-field-string-braced
!   bibtex-field-string-part-3-inner-braces)
! ;; Match braced field string with inner nesting level of braces at most 3
! 
! (defconst bibtex-field-string-quoted
!   (concat
!    "\""
!    "\\("
!      "\\(" "[^\"\\]" "\\)"      ;; every character except quote or backslash
!      "\\|"
!      "\\(" "\"[A-Za-z-]" "\\)"  ;; a quote followed by a letter or dash 
!      "\\|"
!      "\\(" "\\\\.\\|\n"  "\\)"  ;; a backslash followed by any character
!    "\\)*"
!    "\""))
! ;; Match quoted field string
! 
! (defconst bibtex-field-string
!   (concat
!    "\\(" bibtex-field-string-braced "\\)"
!    "\\|"
!    "\\(" bibtex-field-string-quoted "\\)"))
! ;; Match a braced or quoted string
  
  (defconst bibtex-field-string-or-const
*************** See the documentation of function bibtex
*** 573,581 ****
    (concat
      "\\(" bibtex-field-string-or-const "\\)"
!         "\\([ \t\n]+#[ \t\n]+\\(" bibtex-field-string-or-const "\\)\\)*\\|"
!     "{[^{}]*[^\\\\]}"))
  ;; Regexp defining the text part of a BibTeX field: either a string,
  ;; or an empty string, or a constant followed by one or more # /
! ;; constant pairs. Also matches simple {...} patterns.
  
  (defconst bibtex-field
--- 671,678 ----
    (concat
      "\\(" bibtex-field-string-or-const "\\)"
!     "\\([ \t\n]+#[ \t\n]+\\(" bibtex-field-string-or-const "\\)\\)*"))
  ;; Regexp defining the text part of a BibTeX field: either a string,
  ;; or an empty string, or a constant followed by one or more # /
! ;; constant pairs.
  
  (defconst bibtex-field
*************** See the documentation of function bibtex
*** 589,605 ****
  ;; The regexp subexpression number of the text part in BibTeX-field.
  
! (defconst bibtex-reference-type
!   "@[A-Za-z]+")
  ;; Regexp defining the type part of a BibTeX reference entry.
  
  (defconst bibtex-reference-head
    (concat "^\\( \\|\t\\)*\\("
  	  bibtex-reference-type
  	  "\\)[ \t]*[({]\\("
! 	  bibtex-field-name
  	  "\\)"))
  ;; Regexp defining format of the header line of a BibTeX reference
  ;; entry.
  
  (defconst bibtex-type-in-head 2)
  ;; The regexp subexpression number of the type part in
--- 686,710 ----
  ;; The regexp subexpression number of the text part in BibTeX-field.
  
! (defconst bibtex-reference-type "@[A-Za-z]+")
  ;; Regexp defining the type part of a BibTeX reference entry.
  
+ (defconst bibtex-reference-key "[][A-Za-z0-9.:;?!`'()/*@_+=|<>-]+")
+ ;; Regexp defining the label part of a BibTeX reference entry (same as
+ ;; bibtex-field-const (see above))
+ 
  (defconst bibtex-reference-head
    (concat "^\\( \\|\t\\)*\\("
  	  bibtex-reference-type
  	  "\\)[ \t]*[({]\\("
! 	  bibtex-reference-key
  	  "\\)"))
  ;; Regexp defining format of the header line of a BibTeX reference
  ;; entry.
  
+ (defconst bibtex-reference-maybe-empty-head
+   (concat bibtex-reference-head "?"))
+ ;; Regexp defining format of the header line of a maybe empty
+ ;; BibTeX reference entry (without reference key).
+ 
  (defconst bibtex-type-in-head 2)
  ;; The regexp subexpression number of the type part in
*************** See the documentation of function bibtex
*** 613,617 ****
    (concat bibtex-reference-head
  	  "\\([ \t\n]*" bibtex-field "\\)*"
! 	  "[ \t\n]*[})]"))
  ;; Regexp defining the format of a BibTeX reference entry.
  
--- 718,722 ----
    (concat bibtex-reference-head
  	  "\\([ \t\n]*" bibtex-field "\\)*"
! 	  "[ \t\n]*,?[ \t\n]*[})]"))
  ;; Regexp defining the format of a BibTeX reference entry.
  
*************** See the documentation of function bibtex
*** 626,630 ****
  (defconst bibtex-string
    (concat "^[ \t]*@[sS][tT][rR][iI][nN][gG][ \t\n]*[({][ \t\n]*\\("
! 	  bibtex-field-name
  	  "\\)[ \t\n]*=[ \t\n]*\\("
  	  bibtex-field-text
--- 731,735 ----
  (defconst bibtex-string
    (concat "^[ \t]*@[sS][tT][rR][iI][nN][gG][ \t\n]*[({][ \t\n]*\\("
! 	  bibtex-reference-key
  	  "\\)[ \t\n]*=[ \t\n]*\\("
  	  bibtex-field-text
*************** See the documentation of function bibtex
*** 632,636 ****
  ;; Regexp defining the format of a BibTeX string entry.
  
! (defconst bibtex-name-in-string 1)
  ;; The regexp subexpression of the name part in bibtex-string.
  
--- 737,741 ----
  ;; Regexp defining the format of a BibTeX string entry.
  
! (defconst bibtex-key-in-string 1)
  ;; The regexp subexpression of the name part in bibtex-string.
  
*************** See the documentation of function bibtex
*** 638,641 ****
--- 743,761 ----
  ;; The regexp subexpression of the text part in bibtex-string.
  
+ (defvar bibtex-font-lock-keywords
+   (list
+    (list bibtex-reference-maybe-empty-head
+          (list bibtex-type-in-head 'font-lock-function-name-face)
+          (list bibtex-key-in-head 'font-lock-reference-face nil t))
+    ;; reference type and reference label
+    (list (concat "^[ \t]*\\(OPT" bibtex-field-name "\\)[ \t]*=")
+          1 'font-lock-comment-face)
+    ;; optional field names (treated as comments)
+    (list (concat "^[ \t]*\\(" bibtex-field-name "\\)[ \t]*=")
+          1 'font-lock-variable-name-face)
+    ;; field names
+    "*Default expressions to highlight in BibTeX mode."))
+ ;; now all needed patterns are defined
+ 
  (defconst bibtex-name-alignment 2)
  ;; Alignment for the name part in BibTeX fields. Chosen on aesthetic
*************** See the documentation of function bibtex
*** 646,650 ****
  ;; needed for the longest name part.
  
- 
  
  ;; Helper Functions
--- 766,769 ----
*************** See the documentation of function bibtex
*** 710,725 ****
    ;; to the end of the file. FUN is called with one argument, the key
    ;; of the entry, and with point inside the entry. If
!   ;; bibtex-sort-ignore-string-entries is true, FUN will not be called
    ;; for @string entries.
    (bibtex-beginning-of-entry)
!   (while (re-search-forward "^@[^{]*{[ \t]*\\([^, ]*\\)" nil t)
      (if (and bibtex-sort-ignore-string-entries
! 	     (string-equal "@string{"
                             (downcase (buffer-substring-no-properties
!                                       (match-beginning 0)
!                                       (match-beginning 1)))))
  	nil
        (funcall fun (buffer-substring-no-properties
!                     (match-beginning 1) (match-end 1))))))
  
  (defun bibtex-flash-head ()
--- 829,845 ----
    ;; to the end of the file. FUN is called with one argument, the key
    ;; of the entry, and with point inside the entry. If
!   ;; bibtex-sort-ignore-string-entries is non-nil, FUN will not be called
    ;; for @string entries.
    (bibtex-beginning-of-entry)
!   (while (re-search-forward bibtex-reference-head nil t)
      (if (and bibtex-sort-ignore-string-entries
! 	     (string-equal "@string"
                             (downcase (buffer-substring-no-properties
!                                       (match-beginning bibtex-type-in-head)
!                                       (match-end bibtex-type-in-head)))))
  	nil
        (funcall fun (buffer-substring-no-properties
!                     (match-beginning bibtex-key-in-head)
!                     (match-end bibtex-key-in-head))))))
  
  (defun bibtex-flash-head ()
*************** See the documentation of function bibtex
*** 756,775 ****
    ;; Go to the beginning of the first BibTeX entry in buffer.
    (goto-char (point-min))
!   (cond
!    ((re-search-forward "^@" nil 'move)
!     (beginning-of-line))
!    ((and (bobp) (eobp))
!     nil)
!    (t
!     (message "Warning: No BibTeX entries found!"))))
  
  (defun bibtex-inside-field ()
    ;; Try to avoid point being at end of a BibTeX field.
    (end-of-line)
!   (skip-chars-backward " \t")		;MON - maybe delete these chars?
    (cond ((= (preceding-char) ?,)
! 	 (forward-char -2))) ; -1 --> -2 sct@dcs.edinburgh.ac.uk
!   (cond ((= (preceding-char) (aref bibtex-field-right-delimiter 0))
! 	 (forward-char -1))))		;MON - only go back if quote
  
  (defun bibtex-enclosing-field ()
--- 876,897 ----
    ;; Go to the beginning of the first BibTeX entry in buffer.
    (goto-char (point-min))
!    (cond
!     ((re-search-forward "^@" nil 'move)
!      (beginning-of-line))
!     ((and (bobp) (eobp))
!      nil)
!     (t
!      (message "Warning: No BibTeX entries found!"))))
  
  (defun bibtex-inside-field ()
    ;; Try to avoid point being at end of a BibTeX field.
    (end-of-line)
!   (skip-chars-backward " \t")
    (cond ((= (preceding-char) ?,)
! 	 (forward-char -2)))
!   (cond ((or
!           (= (preceding-char) ?})
!           (= (preceding-char) ?\"))
!          (forward-char -1))))
  
  (defun bibtex-enclosing-field ()
*************** See the documentation of function bibtex
*** 785,804 ****
  
  (defun bibtex-enclosing-reference ()
!   ;; Search for BibTeX reference enclosing point. Point moves to begin
!   ;; of reference. (match-end 0) denotes end of reference.
!   ;; Hacked up for speed. Parsing isn't guaranteed any more.
!   ;; schoef@informatik.uni-oldenburg.de
!   ;; sct@dcs.edinburgh.ac.uk
    (let ((old-point (point)))
      (if (not
           (re-search-backward
!           "^@[A-Za-z]+[ \t\n]*[{(][^, \t\n]*[ \t\n]*,"
!           (point-min) t))
          (progn
            (error "Can't find enclosing BibTeX reference.")
            (goto-char old-point)))
      (let ((pnt (point)))
        (if (not
!            (re-search-forward "^[)}]$" (point-max) t))
            (progn
              (error "Can't find enclosing BibTeX reference.")
--- 907,948 ----
  
  (defun bibtex-enclosing-reference ()
!   ;; Search for BibTeX reference enclosing point. Point moves to
!   ;; beginning of reference. Beginning/end of reference is given by
!   ;; (match-beginning/match-end 0).
!   (let ((old-point (point)))
!     (if (not
!          (re-search-backward bibtex-reference-head (point-min) t))
!         (progn
!           (error "Can't find enclosing BibTeX reference.")
!           (goto-char old-point)))
!     (goto-char (match-beginning bibtex-type-in-head))
!     (let ((pnt (point)))
!       (if (not
!            (re-search-forward bibtex-reference (point-max) t))
!           (progn
!             (error "Can't find enclosing BibTeX reference.")
!             (goto-char old-point))
!         (goto-char pnt)))))
! 
! (defun bibtex-enclosing-reference-maybe-empty-head ()
!   ;; Search for BibTeX reference enclosing point. Point moves to
!   ;; beginning of reference. Beginning/end of reference is given by
!   ;; (match-beginning/match-end 0).
    (let ((old-point (point)))
      (if (not
           (re-search-backward
!           bibtex-reference-maybe-empty-head (point-min) t))
          (progn
            (error "Can't find enclosing BibTeX reference.")
            (goto-char old-point)))
+     (goto-char (match-beginning bibtex-type-in-head))
      (let ((pnt (point)))
        (if (not
!            (re-search-forward
!             (concat
!              bibtex-reference-maybe-empty-head
!              "\\([ \t\n]*" bibtex-field "\\)*"
!              "[ \t\n]*,?[ \t\n]*[})]")
!             (point-max) t))
            (progn
              (error "Can't find enclosing BibTeX reference.")
*************** See the documentation of function bibtex
*** 812,816 ****
    ;; undefined location.
    ;; Doesn't something like this exist already?
!   ; compute reasonable limits for the loop
    (let* ((initial (point))
  	 (right (if (re-search-forward regexp (point-max) t)
--- 956,960 ----
    ;; undefined location.
    ;; Doesn't something like this exist already?
!   ;; compute reasonable limits for the loop
    (let* ((initial (point))
  	 (right (if (re-search-forward regexp (point-max) t)
*************** The generation algorithm works as follow
*** 903,907 ****
       new one (see documentation of this variable for further detail).
    8. Abbreviate the result to the string up to (but not including) the
!      first occurence of a regexp matched by the items of
       `bibtex-autokey-title-terminators' and delete the first
       word if it appears in `bibtex-autokey-titleword-first-ignore'. 
--- 1047,1051 ----
       new one (see documentation of this variable for further detail).
    8. Abbreviate the result to the string up to (but not including) the
!      first occurrence of a regexp matched by the items of
       `bibtex-autokey-title-terminators' and delete the first
       word if it appears in `bibtex-autokey-titleword-first-ignore'. 
*************** The generation algorithm works as follow
*** 940,945 ****
              (goto-char min)
              (if (or
!                  (search-forward-regexp "^[ \t]*author[ \t]*=" max t)
!                  (search-forward-regexp "^[ \t]*editor[ \t]*=" max t))
                  (let* (bibtex-help-message
                         (start (progn
--- 1084,1089 ----
              (goto-char min)
              (if (or
!                  (re-search-forward "^[ \t]*author[ \t]*=" max t)
!                  (re-search-forward "^[ \t]*editor[ \t]*=" max t))
                  (let* (bibtex-help-message
                         (start (progn
*************** The generation algorithm works as follow
*** 996,1000 ****
            (progn
              (goto-char min)
!             (if (search-forward-regexp
                   "^[ \t]*year[ \t]*=[ \t]*\\([0-9]*\\)" max t)
                  (buffer-substring-no-properties
--- 1140,1144 ----
            (progn
              (goto-char min)
!             (if (re-search-forward
                   "^[ \t]*year[ \t]*=[ \t]*\\([0-9]*\\)" max t)
                  (buffer-substring-no-properties
*************** The generation algorithm works as follow
*** 1012,1016 ****
                   (progn
                     (goto-char min)
!                    (if (search-forward-regexp
                          "^[ \t]*title[ \t]*=" max t)
                         (let* (bibtex-help-message
--- 1156,1160 ----
                   (progn
                     (goto-char min)
!                    (if (re-search-forward
                          "^[ \t]*title[ \t]*=" max t)
                         (let* (bibtex-help-message
*************** The generation algorithm works as follow
*** 1113,1116 ****
--- 1257,1328 ----
      autokey))
  
+ (defun bibtex-parse-keys (add &optional abortable)
+   ;; Sets bibtex-keys to the keys used in the whole (possibly
+   ;; restricted) buffer (either as entry keys or as crossref entries).
+   ;; If ADD is non-nil adds the new keys to bibtex-keys instead of
+   ;; simply resetting it. If ABORTABLE is non-nil abort on user input.
+   (if bibtex-maintain-sorted-entries
+       (let ((labels (if add
+                         bibtex-keys))
+             label
+             (case-fold-search t))
+         (save-excursion
+           (goto-char (point-min))
+           (if (not add)
+               (message "Parsing reference keys..."))
+ 
+           (if (not
+                (catch 'userkey
+                  (while
+                      (re-search-forward
+                       (concat
+                        "\\(" bibtex-reference-head "\\)"
+                        "\\|"
+                        "\\("
+                          "^[ \t]*crossref[ \t\n]*=[ \t\n]*"
+                          "\\("
+                            "\\({"
+                            bibtex-reference-key
+                            ;; every valid crossref entry must have the
+                            ;; form of a reference key, so we need no
+                            ;; nesting of brace etc. here
+                            "}\\)"
+                            "\\|"
+                            "\\(\""
+                            bibtex-reference-key
+                            "\"\\)"
+                          "\\)"
+                          ",?$"
+                        "\\)")
+                       nil t)
+                    (if (and
+                         abortable
+                         (input-pending-p))
+                        (throw 'userkey t))
+                    (if (match-beginning (1+ bibtex-key-in-head))
+                        (setq
+                         label
+                         (buffer-substring-no-properties 
+                          (match-beginning (1+ bibtex-key-in-head))
+                          (match-end (1+ bibtex-key-in-head))))
+                      (setq
+                       label
+                       (buffer-substring-no-properties
+                        (1+ (match-beginning (+ 3 bibtex-key-in-head)))
+                        (1- (match-end (+ 3 bibtex-key-in-head))))))
+                    (if (not (assoc label labels))
+                        (setq labels
+                              (cons (list label) labels))))))
+               (progn
+                 (setq
+                  bibtex-buffer-last-parsed-for-keys-tick
+                  (buffer-modified-tick))
+                 (if (not add)
+                     (message "Parsing reference keys... done"))
+                 (setq bibtex-keys labels)))))))
+ 
+ (defun bibtex-auto-fill-function ()
+   (let ((fill-prefix (make-string (+ bibtex-text-alignment 1) ? )))
+     (do-auto-fill)))
  
  
*************** The generation algorithm works as follow
*** 1120,1123 ****
--- 1332,1340 ----
  (defun bibtex-mode () 
    "Major mode for editing BibTeX files.
+ To submit a problem report, enter `\\[bibtex-submit-bug-report]' from a
+ bibtex-mode buffer.  This automatically sets up a mail buffer with
+ version information already added.  You just need to add a description
+ of the problem, including a reproducable test case and send the
+ message.
  
  \\{bibtex-mode-map}
*************** non-nil."
*** 1227,1231 ****
                (insert-file-contents fullfilename)
                (goto-char (point-min))
!               (while (search-forward-regexp bibtex-string nil t)
                  (setq
                   compl
--- 1444,1448 ----
                (insert-file-contents fullfilename)
                (goto-char (point-min))
!               (while (re-search-forward bibtex-string nil t)
                  (setq
                   compl
*************** non-nil."
*** 1234,1239 ****
                    (list
                     (list (buffer-substring-no-properties
!                           (match-beginning bibtex-name-in-string)
!                           (match-end bibtex-name-in-string)))))))
                (kill-buffer bufname)
                (set-buffer curbuf)
--- 1451,1456 ----
                    (list
                     (list (buffer-substring-no-properties
!                           (match-beginning bibtex-key-in-string)
!                           (match-end bibtex-key-in-string)))))))
                (kill-buffer bufname)
                (set-buffer curbuf)
*************** non-nil."
*** 1241,1253 ****
            (error "File %s not in $BIBINPUTS paths" filename)))))
     bibtex-string-files)
    (make-local-variable 'paragraph-start)
    (setq paragraph-start "[ \f\n\t]*$")
    (make-local-variable 'comment-start)
    (setq comment-start "%")
!   (auto-fill-mode 1)			; nice alignments
!   (setq left-margin (+ bibtex-text-alignment 1))
    (run-hooks 'bibtex-mode-hook))
  
  (defun bibtex-entry (entry-type &optional required optional)
    (interactive (let* ((completion-ignore-case t)
  		      (e-t (completing-read
--- 1458,1557 ----
            (error "File %s not in $BIBINPUTS paths" filename)))))
     bibtex-string-files)
+   (add-hook
+    'auto-save-hook
+    (function
+     (lambda ()
+       (if (and
+            bibtex-maintain-sorted-entries
+            (eq major-mode 'bibtex-mode)
+            (not
+             (eq (buffer-modified-tick)
+                 bibtex-buffer-last-parsed-for-keys-tick)))
+           (bibtex-parse-keys nil t)))))
+   (bibtex-parse-keys nil)
    (make-local-variable 'paragraph-start)
    (setq paragraph-start "[ \f\n\t]*$")
    (make-local-variable 'comment-start)
    (setq comment-start "%")
!   (auto-fill-mode 1)
!   (setq auto-fill-function 'bibtex-auto-fill-function)
!   (set (make-local-variable 'font-lock-defaults)
!        '(bibtex-font-lock-keywords
!          nil t ((?$ . "\"")
!                 ;; Mathematical expressions should be fontified as strings
!                 (?\" . ".")
!                 ;; Quotes are field delimiters and quote-delimited
!                 ;; entries should be fontified in the same way as
!                 ;; brace-delimited ones
!                 )))
    (run-hooks 'bibtex-mode-hook))
  
+ (defun bibtex-submit-bug-report ()
+   "Submit via mail a bug report on bibtex.el."
+   (interactive)
+   (if (y-or-n-p "Do you want to submit a bug report on BibTeX mode? ")
+       (progn
+         (require 'reporter)
+         (let ((reporter-prompt-for-summary-p t))
+           (reporter-submit-bug-report
+            bibtex-maintainer-address
+            "bibtex.el"
+            (list
+             'system-configuration
+             'system-configuration-options
+             'bibtex-sort-ignore-string-entries
+             'bibtex-maintain-sorted-entries
+             'bibtex-field-left-delimiter
+             'bibtex-field-right-delimiter
+             ;; Possible sorting and parsing bugs
+             'bibtex-mode-user-optional-fields
+             ;; Possible format error
+             'bibtex-predefined-strings
+             'bibtex-string-files
+             ;; Possible format error
+             'bibtex-font-lock-keywords
+             ;; Possible bugs regarding fontlocking
+             'bibtex-autokey-names
+             'bibtex-autokey-name-change-strings
+             'bibtex-autokey-name-length
+             'bibtex-autokey-name-separator
+             'bibtex-autokey-year-length
+             'bibtex-autokey-titlewords
+             'bibtex-autokey-title-terminators
+             'bibtex-autokey-titlewords-stretch
+             'bibtex-autokey-titleword-first-ignore
+             'bibtex-autokey-titleword-abbrevs
+             'bibtex-autokey-titleword-change-strings
+             'bibtex-autokey-titleword-length
+             'bibtex-autokey-titleword-separator
+             'bibtex-autokey-name-year-separator
+             'bibtex-autokey-year-title-separator
+             'bibtex-autokey-edit-before-use
+             ;; Possible bugs regarding automatic labels
+             'bibtex-entry-field-alist
+             ;; Possible format error
+             'bibtex-help-message
+             'bibtex-include-OPTcrossref
+             'bibtex-include-OPTkey
+             'bibtex-include-OPTannote
+             'bibtex-clean-entry-zap-empty-opts
+             ;; User variables which shouldn't cause any errors
+             )
+            nil nil
+            (concat "Hi Stefan,
+  
+ I want to report a bug on Emacs BibTeX mode.
+ I've read the `Bugs' section in the `Emacs' info page, so I know how
+ to make a clear and unambiguous report. I have started a fresh Emacs
+ via `"invocation-name " --no-init-file --no-site-file', thereafter (in
+ case I'm reporting on a version of `bibtex.el' which is not part of
+ the standard emacs distribution) I loaded the questionable version
+ of `bibtex.el' with `M-x load-file', and then, to produce the buggy
+ behaviour, I did the following:")))
+         (message nil))))
+ 
  (defun bibtex-entry (entry-type &optional required optional)
+   "Inserts a new BibTeX entry.
+ Calls the value of bibtex-add-entry-hook if that value is non-nil."
    (interactive (let* ((completion-ignore-case t)
  		      (e-t (completing-read
*************** non-nil."
*** 1269,1299 ****
  	  (setq required (elt r-n-o 0)
  		optional (elt r-n-o 1)))))
!   (let*
!       (labels
!        label
!        (case-fold-search t)
!        (key
!         (if bibtex-maintain-sorted-entries
!             (progn
!               (save-excursion
!                 (goto-char (point-min))
!                 (while
!                     (re-search-forward
!                      "\\(^@[a-z]+[ \t\n]*[{(][ \t\n]*\\([^ ,\t\n]+\\)[ \t\n]*,\\)\\|\\(^[ \t\n]*crossref[ \t\n]*=[ \t\n]*[{\"]\\([^ ,\t\n]*\\)[}\"],$\\)"
!                      nil t)
!                   (if (match-beginning 2)
!                       (setq label (buffer-substring-no-properties 
!                                    (match-beginning 2) (match-end 2)))
!                     (setq label (buffer-substring-no-properties
!                                  (match-beginning 4) (match-end 4))))
!                   (if (not (assoc label labels))
!                       (setq labels
!                             (cons (list label) labels)))))
!               (completing-read
!                (format "%s key: " entry-type)
!                labels)))))
!     (if key
! 	(bibtex-find-entry-location key))	
!     (bibtex-move-outside-of-entry)
      (insert "@" entry-type "{")
      (if key
--- 1573,1584 ----
  	  (setq required (elt r-n-o 0)
  		optional (elt r-n-o 1)))))
!   (let ((key
!          (if bibtex-maintain-sorted-entries
!              (completing-read
!               (format "%s key: " entry-type)
!               bibtex-keys))))
!     (if bibtex-maintain-sorted-entries
! 	(bibtex-find-entry-location key)
!       (bibtex-move-outside-of-entry))
      (insert "@" entry-type "{")
      (if key
*************** non-nil."
*** 1311,1316 ****
  	  (bibtex-make-optional-field '("annote")))
        (insert "\n}\n\n"))
!     (if key
! 	(bibtex-next-field t))
      (run-hooks 'bibtex-add-entry-hook)))
  
--- 1596,1600 ----
  	  (bibtex-make-optional-field '("annote")))
        (insert "\n}\n\n"))
!     (bibtex-next-field t)
      (run-hooks 'bibtex-add-entry-hook)))
  
*************** non-nil."
*** 1327,1336 ****
                 (goto-char pnt)
                 (error "Not on BibTeX field")))
!             (re-search-backward
!              "^[ \t]*\\([A-Za-z]+\\)[ \t\n]*=" nil t)
!             (let ((mb (match-beginning 1))
!                   (me (match-end 1)))
                (buffer-substring-no-properties
!                (if (looking-at "^[ \t]*OPT")
                     (+ 3 mb)
                   mb)
--- 1611,1619 ----
                 (goto-char pnt)
                 (error "Not on BibTeX field")))
!             (let ((mb (match-beginning bibtex-name-in-field))
!                   (me (match-end bibtex-name-in-field)))
!               (goto-char mb)
                (buffer-substring-no-properties
!                (if (looking-at "OPT")
                     (+ 3 mb)
                   mb)
*************** non-nil."
*** 1339,1345 ****
            (progn
              (re-search-backward
!              "^@\\([A-Za-z]+\\)[ \t\n]*[{(][^, \t\n]*[ \t\n]*," nil t)
              (buffer-substring-no-properties
!              (match-beginning 1) (match-end 1))))
           (entry-list
            (assoc-ignore-case reference-type
--- 1622,1629 ----
            (progn
              (re-search-backward
!              bibtex-reference-maybe-empty-head nil t)
              (buffer-substring-no-properties
!              (1+ (match-beginning bibtex-type-in-head))
!              (match-end bibtex-type-in-head))))
           (entry-list
            (assoc-ignore-case reference-type
*************** non-nil."
*** 1368,1392 ****
                                    "Key used for label creation if author and editor fields are missing"))))))
      (goto-char pnt)
!     (if (assoc field-name list-of-entries)
!         (message (elt (assoc field-name list-of-entries) 1))
!       (message "NO COMMENT AVAILABLE"))))
  
  (defun bibtex-make-field (e-t)
    "Makes a field named E-T in current BibTeX entry."
!   (interactive "sBibTeX entry type: ")
    (let ((name (if (consp e-t)
                    (elt e-t 0)
                  e-t)))
!     (bibtex-find-text nil)
!     (forward-char 1)
      (insert ",\n")
      (indent-to-column bibtex-name-alignment)
      (insert name " = ")
      (indent-to-column bibtex-text-alignment)
!     (insert bibtex-field-left-delimiter bibtex-field-right-delimiter)))
  
  (defun bibtex-make-optional-field (e-t)
    "Makes an optional field named E-T in current BibTeX entry."
-   (interactive "sOptional BibTeX entry type: ")
    (if (consp e-t)
        (setq e-t (cons (concat "OPT" (car e-t)) (cdr e-t)))
--- 1652,1681 ----
                                    "Key used for label creation if author and editor fields are missing"))))))
      (goto-char pnt)
!     (let ((comment (assoc-ignore-case field-name list-of-entries)))
!       (if comment
!           (message (elt comment 1))
!         (message "NO COMMENT AVAILABLE")))))
  
  (defun bibtex-make-field (e-t)
    "Makes a field named E-T in current BibTeX entry."
!   (interactive "sBibTeX field name: ")
    (let ((name (if (consp e-t)
                    (elt e-t 0)
                  e-t)))
!     (if (interactive-p)
!         (progn
!           (bibtex-find-text nil)
!           (if (looking-at "[}\"]")
!               (forward-char 1))))
      (insert ",\n")
      (indent-to-column bibtex-name-alignment)
      (insert name " = ")
      (indent-to-column bibtex-text-alignment)
!     (insert bibtex-field-left-delimiter bibtex-field-right-delimiter)
!     (if (interactive-p)
!         (forward-char -1))))
  
  (defun bibtex-make-optional-field (e-t)
    "Makes an optional field named E-T in current BibTeX entry."
    (if (consp e-t)
        (setq e-t (cons (concat "OPT" (car e-t)) (cdr e-t)))
*************** of the previous entry."
*** 1437,1441 ****
  		      (progn (bibtex-end-of-entry) (point)))))
  
- 
  (defun bibtex-hide-entry-bodies (&optional arg)
    "Hide all lines between first and last BibTeX entries not beginning with @.
--- 1726,1729 ----
*************** With argument, show all text."
*** 1460,1470 ****
  (defun bibtex-sort-entries ()
    "Sort BibTeX entries alphabetically by key.
! Text before the first BibTeX entry, and following the last is not affected.
! If bibtex-sort-ignore-string-entries is true, @string entries will be ignored.
! 
! Bugs:
!   1. Text between the closing brace ending one BibTeX entry, and the @ starting
!      the next, is considered part of the PRECEDING entry.  Perhaps it should be
!      part of the following entry."
    (interactive)
    (save-restriction
--- 1748,1754 ----
  (defun bibtex-sort-entries ()
    "Sort BibTeX entries alphabetically by key.
! Text outside of BibTeX entries is not affected. If
! bibtex-sort-ignore-string-entries is non-nil, @string entries will be
! ignored."
    (interactive)
    (save-restriction
*************** Bugs:
*** 1476,1590 ****
         (bibtex-end-of-entry)
         (point)))
      (sort-subr
       nil
       ;; NEXTREC function
-      'forward-line
-      ;; ENDREC function
       (function
        (lambda ()
!         (and
!          (re-search-forward "}\\s-*\n[\n \t]*@" nil 'move)
!          (forward-char -2))))
       ;; STARTKEY function
-      (if bibtex-sort-ignore-string-entries
-          (function
-           (lambda ()
-             (while
-                 (and
-                  (re-search-forward "^\\s-*\\([@a-zA-Z]*\\)\\s-*{\\s-*")
-                  (string-equal
-                   "@string"
-                   (downcase
-                    (buffer-substring-no-properties
-                     (match-beginning 1)
-                     (match-end 1))))))
-             nil))
-        (function
-         (lambda ()
-           (re-search-forward "{\\s-*"))))
-      ;; ENDKEY function
       (function
        (lambda ()
!         (search-forward ","))))))
    
! (defun bibtex-find-entry-location (entry-name &optional ignore-errors)
    "Looking for place to put the BibTeX entry named ENTRY-NAME.
! Searches from beginning of buffer. Buffer is assumed to be in sorted
! order, without duplicates (see \\[bibtex-sort-entries]), if it is not,
! an error will be signalled. However, if optional argument
! IGNORE-ERRORS is non-nil, no error messages about duplicate entries or
! sort order violences are signalled, but the error handling is assumed
! to be made in the calling function. Nil is returned, if any error
! occured during search for location of the new entry, and t in all
! other cases. If an error occured, point is not moved."
!   (interactive "sBibtex entry key: ")
!   (let ((noerr t)
!         (previous nil)
!         (pnt (point))
! 	point)
!     (beginning-of-first-bibtex-entry)
!     (or
!      (catch 'done
!        (map-bibtex-entries
!         (function
!          (lambda (current)
!            (cond ((string-equal entry-name current)
!                   (setq noerr nil)
!                   (bibtex-beginning-of-entry)
!                   (if ignore-errors
!                       (throw 'done t)
!                     (error "Entry duplicates existing!")))
!                  ((or (null previous)
!                       (string< previous current))
!                   (setq previous current
!                         point (point))
!                   (if (string< entry-name current)
!                       (progn
!                         (bibtex-beginning-of-entry)
!                         ;; Many schemes append strings to
!                         ;; existing entries to resolve them,
!                         ;; so initial substring matches may
!                         ;; indicate a duplicate entry.  
!                         (let ((idx
!                                (string-match
!                                 (regexp-quote entry-name) current)))
!                           (if (and
!                                (integerp idx)
!                                (zerop idx)
! ;;                               (not ignore-errors)
!                                (not (equal entry-name "")))
!                               (progn
!                                 (message
!                                  "Warning: Entry %s may be a duplicate of %s!"
!                                  entry-name current)
!                                 (ding t))))
!                         (throw 'done t))))
!                  ((string-equal previous current)
!                   (setq noerr nil)
!                   (if ignore-errors
!                       (throw 'done t)
!                     (error "Duplicate here with previous!")))
!                  (t
!                   (setq noerr nil)
!                   (if ignore-errors
!                       (throw 'done t)
!                     (error "Entries out of order here!"))))))))
!      (goto-char (point-max)))
!     (if (not noerr)
!         (goto-char pnt))
!     noerr))
  
! (defun bibtex-validate-buffer ()
    "Validate if the current BibTeX buffer is syntactically correct.
  Any garbage (e.g. comments) before the first \"@\" is not tested (so
! you can put comments here)."
!   (interactive)
    (let ((pnt (point))
!         (max (point-max)))
!     (goto-char (point-min))
!     (while (< (re-search-forward "@\\|\\'") max)
        (forward-char -1)
        (let ((p (point)))
!         (if (looking-at "@string")
              (forward-char)
            (if (not (and
--- 1760,1893 ----
         (bibtex-end-of-entry)
         (point)))
+     (if bibtex-sort-ignore-string-entries
+         (if (re-search-forward bibtex-reference nil 'move)
+             (goto-char (match-beginning 0))))
      (sort-subr
       nil
       ;; NEXTREC function
       (function
        (lambda ()
!         (if bibtex-sort-ignore-string-entries
!             (if (re-search-forward bibtex-reference nil 'move)
!                 (goto-char (match-beginning 0)))
!           (if (re-search-forward bibtex-reference-head nil 'move)
!               (goto-char (match-beginning 0))))))
!      ;; ENDREC function
!      'bibtex-end-of-entry
       ;; STARTKEY function
       (function
        (lambda ()
!         (if bibtex-sort-ignore-string-entries
!             (progn
!               (re-search-forward bibtex-reference)
!               (buffer-substring-no-properties
!                (match-beginning bibtex-key-in-reference)
!                (match-end bibtex-key-in-reference)))
!           (re-search-forward bibtex-reference-head)
!           (buffer-substring-no-properties
!            (match-beginning bibtex-key-in-head)
!            (match-end bibtex-key-in-head)))))
!      ;; ENDKEY function
!      nil)))
    
! (defun bibtex-find-entry-location (entry-name &optional ignore-dups)
    "Looking for place to put the BibTeX entry named ENTRY-NAME.
! Performs a binary search (therefore, buffer is assumed to be in sorted
! order, without duplicates (see \\[bibtex-validate-buffer]), if it is
! not, bibtex-find-entry-location will fail). If entry-name is already
! used as a reference key, an error is signaled. However, if optional
! variable IGNORE-DUPS is non-nil, no error messages about duplicate
! entries are signaled, but the error handling is assumed to be made in
! the calling function. Nil is returned, if an duplicate entry error
! occurred, and t in all other cases."
!   (let* ((left
!           (progn
!             (beginning-of-first-bibtex-entry)
!             (if bibtex-sort-ignore-string-entries
!                 (re-search-forward bibtex-reference nil `move)
!               (bibtex-end-of-entry))
!             (point)))
!          (right
!           (progn
!             (goto-char (point-max))
!             (if bibtex-sort-ignore-string-entries
!                 (re-search-backward bibtex-reference nil `move)
!               (bibtex-beginning-of-entry))
!             (point)))
!          actual-point
!          actual-key
!          (done (>= left right))
!          new
!          dup)
!     (while (not done)
!       (setq actual-point (/ (+ left right) 2))
!       (goto-char actual-point)
!       (bibtex-beginning-of-entry)
!       (setq actual-key
!             (if bibtex-sort-ignore-string-entries
!                 (progn
!                   (re-search-forward bibtex-reference)
!                   (buffer-substring-no-properties
!                    (match-beginning bibtex-key-in-reference)
!                    (match-end bibtex-key-in-reference)))
!               (re-search-forward bibtex-reference-head)
!               (buffer-substring-no-properties
!                (match-beginning bibtex-key-in-head)
!                (match-end bibtex-key-in-head))))
!       (cond
!        ((string-lessp entry-name actual-key)
!         (setq new (match-beginning 0))
!         (if (equal right new)
!             (setq done t)
!           (setq right new)))
!        ((string-lessp actual-key entry-name)
!         (setq new (match-end 0))
!         (if (equal left new)
!             (setq done t)
!           (setq left new)))
!        ((string-equal actual-key entry-name)
!         (setq dup t
!               done t)
!         (if (not ignore-dups)
!             (error "Entry with key `%s' already exists!" entry-name)))))
!     (if dup
!         nil
!       (goto-char right)
!       (if (re-search-forward bibtex-reference nil t)
!           (progn
!             (setq actual-key
!                   (buffer-substring-no-properties
!                    (match-beginning bibtex-key-in-reference)
!                    (match-end bibtex-key-in-reference)))
!             (if (string-lessp actual-key entry-name)
!                 ;; even greater than last entry --> we must append
!                 (progn
!                   (goto-char (match-end 0))
!                   (newline (forward-line 2))
!                   (beginning-of-line))
!               (goto-char right))))
!       t)))    
  
! (defun bibtex-validate-buffer (&optional from-point)
    "Validate if the current BibTeX buffer is syntactically correct.
  Any garbage (e.g. comments) before the first \"@\" is not tested (so
! you can put comments here).
! With non-nil FROM-POINT it starts with entry enclosing point."
!   (interactive "P")
    (let ((pnt (point))
!         (starting-point
!          (progn
!            (if from-point
!                (bibtex-beginning-of-entry)
!              (beginning-of-first-bibtex-entry))
!            (point))))
!     ;; looking if entries fit syntactical structure
!     (goto-char starting-point)
!     (while (re-search-forward "^@" nil t)
        (forward-char -1)
        (let ((p (point)))
!         (if (or
!              (looking-at "@string")
!              (looking-at "@preamble"))
              (forward-char)
            (if (not (and
*************** you can put comments here)."
*** 1594,1601 ****
                  (goto-char p)
                  (error "Bad entry begins here"))))))
!     (bibtex-find-entry-location (make-string 10 255))
!     ;; find duplicates
      (goto-char pnt)
!     (message "BibTeX buffer is syntactically correct")))
  
  (defun bibtex-next-field (arg)
--- 1897,1929 ----
                  (goto-char p)
                  (error "Bad entry begins here"))))))
!     ;; looking if entries are balanced (a single non-escaped quote
!     ;; inside braces is not detected by the former check, but
!     ;; bibtex-sort-entries stumbles about it
!     (goto-char starting-point)
!     (map-bibtex-entries
!      (function
!       (lambda (current)
!         (bibtex-beginning-of-entry)
!         (forward-sexp 2))))
!     ;; looking for correct sort order and duplicates
!     (if bibtex-maintain-sorted-entries
!         (let (previous
!               point)
!           (goto-char starting-point)
!           (map-bibtex-entries
!            (function
!             (lambda (current)
!               (cond ((or (null previous)
!                          (string< previous current))
!                      (setq previous current
!                            point (point)))
!                     ((string-equal previous current)
!                      (error "Duplicate here with previous!"))
!                     (t
!                      (error "Entries out of order here!"))))))))
      (goto-char pnt)
!     (if from-point
!         (message "Part of BibTeX buffer starting at point is syntactically correct")
!       (message "BibTeX buffer is syntactically correct"))))
  
  (defun bibtex-next-field (arg)
*************** you can put comments here)."
*** 1656,1667 ****
      (bibtex-enclosing-field)
      (let ((start (match-beginning bibtex-text-in-field))
! 	  (stop (match-end  bibtex-text-in-field)))
!       (goto-char stop)
!       (forward-char -1)
!       (if (looking-at "[}\"]")
! 	  (delete-char 1))
        (goto-char start)
!       (if (looking-at "[{\"]")
! 	  (delete-char 1)))))
  
  (defun bibtex-kill-optional-field ()
--- 1984,1999 ----
      (bibtex-enclosing-field)
      (let ((start (match-beginning bibtex-text-in-field))
! 	  (stop (match-end bibtex-text-in-field)))
        (goto-char start)
!       (while (re-search-forward bibtex-field-string stop t)
!         (let ((beg (match-beginning 0))
!               (end (match-end 0)))
!           (goto-char end)
!           (forward-char -1)
!           (if (looking-at "[}\"]")
!               (delete-char 1))
!           (goto-char beg)
!           (if (looking-at "[{\"]")
!               (delete-char 1)))))))
  
  (defun bibtex-kill-optional-field ()
*************** you can put comments here)."
*** 1691,1702 ****
    (bibtex-find-text t))
  
! (defun bibtex-pop-previous (arg)
!   "Replace text of current field with the text of similar field in previous entry.
! With arg, go up ARG entries.  Repeated, goes up so many times.  May be
! intermixed with \\[bibtex-pop-next] (bibtex-pop-next)."
!   (interactive "p")
!   (bibtex-inside-field)
    (save-excursion
!     ; parse current field
      (bibtex-enclosing-field)
      (let ((start-old-text (match-beginning bibtex-text-in-field))
--- 2023,2033 ----
    (bibtex-find-text t))
  
! (defun bibtex-pop (arg direction)
!   ;; generic function to be used by bibtex-pop-previous and bibtex-pop-next
!   (let (bibtex-help-message)
!     (bibtex-find-text nil))
    (save-excursion
!     ;; parse current field
!     (bibtex-inside-field)
      (bibtex-enclosing-field)
      (let ((start-old-text (match-beginning bibtex-text-in-field))
*************** intermixed with \\[bibtex-pop-next] (bib
*** 1706,1710 ****
  	  (new-text))
        (goto-char start-name)
!       ; construct regexp for previous field with same name as this one
        (let ((matching-entry
  	     (bibtex-cfield
--- 2037,2042 ----
  	  (new-text))
        (goto-char start-name)
!       ;; construct regexp for field with same name as this one,
!       ;; ignoring possible OPT's 
        (let ((matching-entry
  	     (bibtex-cfield
*************** intermixed with \\[bibtex-pop-next] (bib
*** 1714,1846 ****
                                                stop-name)
  	      bibtex-field-text)))
! 	; if executed several times in a row, start each search where the
! 	; last one finished
! 	(cond ((or (eq last-command 'bibtex-pop-previous)
! 		   (eq last-command 'bibtex-pop-next))
! 	       t
! 	       )
  	      (t
! 	       (bibtex-enclosing-reference)
  	       (setq bibtex-pop-previous-search-point (point))
  	       (setq bibtex-pop-next-search-point (match-end 0))))
! 	(goto-char bibtex-pop-previous-search-point)
! 	; Now search for arg'th previous similar field
  	(cond
! 	 ((re-search-backward matching-entry (point-min) t arg)
! 	  (setq new-text
  		(buffer-substring-no-properties
!                  (match-beginning bibtex-text-in-cfield)
!                  (match-end bibtex-text-in-cfield)))
            ;; change delimiters, if any changes needed
!           (cond
!            ((and
!              (equal bibtex-field-left-delimiter "{")
!              (eq (aref new-text 0) ?\")
!              (eq (aref new-text (1- (length new-text))) ?\"))
!             (aset new-text 0 ?\{)
!             (aset new-text (1- (length new-text)) ?\}))
!            ((and
!              (equal bibtex-field-left-delimiter "\"")
!              (eq (aref new-text 0) ?\{)
!              (eq (aref new-text (1- (length new-text))) ?\}))
!             (aset new-text 0 ?\")
!             (aset new-text (1- (length new-text)) ?\"))
!            ((or
!              (not (eq (aref new-text 0)
!                       (aref bibtex-field-left-delimiter 0)))
!              (not (eq (aref new-text (1- (length new-text)))
!                       (aref bibtex-field-right-delimiter 0))))
!             (setq new-text (concat bibtex-field-left-delimiter
!                                    new-text 
!                                    bibtex-field-right-delimiter))))
! 	  ; Found a matching field. Remember boundaries.
! 	  (setq bibtex-pop-next-search-point (match-end 0))
! 	  (setq bibtex-pop-previous-search-point (match-beginning 0))
  	  (bibtex-flash-head)
! 	  ; Go back to where we started, delete old text, and pop new.
  	  (goto-char stop-old-text)
  	  (delete-region start-old-text stop-old-text)
  	  (insert new-text))
! 	 (t				; search failed
! 	  (error "No previous matching BibTeX field."))))))
!   (setq this-command 'bibtex-pop-previous))
  
  (defun bibtex-pop-next (arg)
    "Replace text of current field with the text of similar field in next entry.
! With arg, go up ARG entries.  Repeated, goes up so many times.  May be
  intermixed with \\[bibtex-pop-previous] (bibtex-pop-previous)."
    (interactive "p")
!   (bibtex-inside-field)
!   (save-excursion
!     ; parse current field
!     (bibtex-enclosing-field)
!     (let ((start-old-text (match-beginning bibtex-text-in-field))
! 	  (stop-old-text  (match-end bibtex-text-in-field))
! 	  (start-name (match-beginning bibtex-name-in-field))
! 	  (stop-name (match-end bibtex-name-in-field))
! 	  (new-text))
!       (goto-char start-name)
!       ; construct regexp for next field with same name as this one,
!       ; ignoring possible OPT's
!       (let ((matching-entry
! 	     (bibtex-cfield
! 	      (buffer-substring-no-properties (if (looking-at "OPT")
!                                                   (+ (point) (length "OPT"))
!                                                 (point))
!                                               stop-name)
! 	      bibtex-field-text)))
! 	
! 	; if executed several times in a row, start each search where the
! 	; last one finished
! 	(cond ((or (eq last-command 'bibtex-pop-next)
! 		   (eq last-command 'bibtex-pop-previous))
! 	       t
! 	       )
! 	      (t
! 	       (bibtex-enclosing-reference)
! 	       (setq bibtex-pop-previous-search-point (point))
! 	       (setq bibtex-pop-next-search-point (match-end 0))))
! 	(goto-char bibtex-pop-next-search-point)
! 	
! 	; Now search for arg'th next similar field
! 	(cond
! 	 ((re-search-forward matching-entry (point-max) t arg)
! 	  (setq new-text
! 		(buffer-substring-no-properties
!                  (match-beginning bibtex-text-in-cfield)
!                  (match-end bibtex-text-in-cfield)))
!           ;; change delimiters, if any changes needed
!           (cond
!            ((and
!              (equal bibtex-field-left-delimiter "{")
!              (eq (aref new-text 0) ?\")
!              (eq (aref new-text (1- (length new-text))) ?\"))
!             (aset new-text 0 ?\{)
!             (aset new-text (1- (length new-text)) ?\}))
!            ((and
!              (equal bibtex-field-left-delimiter "\"")
!              (eq (aref new-text 0) ?\{)
!              (eq (aref new-text (1- (length new-text))) ?\}))
!             (aset new-text 0 ?\")
!             (aset new-text (1- (length new-text)) ?\"))
!            ((or
!              (not (eq (aref new-text 0)
!                       (aref bibtex-field-left-delimiter 0)))
!              (not (eq (aref new-text (1- (length new-text)))
!                       (aref bibtex-field-right-delimiter 0))))
!             (setq new-text (concat bibtex-field-left-delimiter
!                                    new-text 
!                                    bibtex-field-right-delimiter))))
! 	  ; Found a matching field. Remember boundaries.
! 	  (setq bibtex-pop-next-search-point (match-end 0))
! 	  (setq bibtex-pop-previous-search-point (match-beginning 0))
! 	  (bibtex-flash-head)
! 	  ; Go back to where we started, delete old text, and pop new.
! 	  (goto-char stop-old-text)
! 	  (delete-region start-old-text stop-old-text)
! 	  (insert new-text))
! 	 (t				; search failed
! 	  (error "No next matching BibTeX field."))))))
!   (setq this-command 'bibtex-pop-next))
  
  (defun bibtex-clean-entry (&optional arg)
--- 2046,2127 ----
                                                stop-name)
  	      bibtex-field-text)))
! 	;; if executed several times in a row, start each search where
!         ;; the last one was finished
! 	(cond ((eq last-command 'bibtex-pop)
!                t
!                )
  	      (t
! 	       (bibtex-enclosing-reference-maybe-empty-head)
  	       (setq bibtex-pop-previous-search-point (point))
  	       (setq bibtex-pop-next-search-point (match-end 0))))
! 	(if (eq direction 'previous)
!             (goto-char bibtex-pop-previous-search-point)
!           (goto-char bibtex-pop-next-search-point))
!         ;; Now search for arg'th previous/next similar field
  	(cond
!          ((if (eq direction 'previous)
!               (re-search-backward matching-entry (point-min) t arg)
!             (re-search-forward matching-entry (point-max) t arg))
!           ;; Found a matching field. Remember boundaries.
! 	  (setq bibtex-pop-previous-search-point (match-beginning 0))
! 	  (setq bibtex-pop-next-search-point (match-end 0))
!           (setq new-text
  		(buffer-substring-no-properties
!                  (match-beginning bibtex-text-in-field)
!                  (match-end bibtex-text-in-field)))
            ;; change delimiters, if any changes needed
!           (let ((start 0)
!                 old-open
!                 new-open
!                 old-close
!                 new-close)
!             (if (equal bibtex-field-left-delimiter "{")
!                 (setq old-open ?\"
!                       new-open ?\{
!                       old-close ?\"
!                       new-close ?\})
!               (setq old-open ?\{
!                     new-open ?\"
!                     old-close ?\}
!                     new-close ?\"))
!             (while (string-match bibtex-field-string new-text start)
!               (let ((beg (match-beginning 0))
!                     (end (1- (match-end 0))))
!                 (if (and
!                      (eq (aref new-text beg) old-open)
!                      (eq (aref new-text end) old-close))
!                     (progn
!                       (aset new-text beg new-open)
!                       (aset new-text end new-close))))
!               (setq start (match-end 0))))
  	  (bibtex-flash-head)
!           ;; Go back to where we started, delete old text, and pop new.
  	  (goto-char stop-old-text)
  	  (delete-region start-old-text stop-old-text)
  	  (insert new-text))
! 	 (t
!           ;; search failed
! 	  (error (concat "No "
!                          (if (eq direction 'previous)
!                              "previous"
!                            "next")
!                          " matching BibTeX field.")))))))
!   (let (bibtex-help-message)
!     (bibtex-find-text nil))
!   (setq this-command 'bibtex-pop))
! 
! (defun bibtex-pop-previous (arg)
!   "Replace text of current field with the text of similar field in previous entry.
! With arg, goes up ARG entries. Repeated, goes up so many times. May be
! intermixed with \\[bibtex-pop-next] (bibtex-pop-next)."
!   (interactive "p")
!   (bibtex-pop arg 'previous))
  
  (defun bibtex-pop-next (arg)
    "Replace text of current field with the text of similar field in next entry.
! With arg, goes down ARG entries. Repeated, goes down so many times. May be
  intermixed with \\[bibtex-pop-previous] (bibtex-pop-previous)."
    (interactive "p")
!   (bibtex-pop arg 'next))
  
  (defun bibtex-clean-entry (&optional arg)
*************** given, calculate a new entry label."
*** 1867,1876 ****
                (progn
                  (goto-char begin-text)
!                 (if (not (looking-at
!                           (concat
!                            bibtex-field-left-delimiter
!                            bibtex-field-right-delimiter)))
                      (setq crossref-there t))))))
!       (bibtex-enclosing-reference)
        (re-search-forward bibtex-reference-type)
        (let ((begin-type (1+ (match-beginning 0)))
--- 2148,2154 ----
                (progn
                  (goto-char begin-text)
!                 (if (not (looking-at "\\(\"\"\\)\\|\\({}\\)"))
                      (setq crossref-there t))))))
!       (bibtex-enclosing-reference-maybe-empty-head)
        (re-search-forward bibtex-reference-type)
        (let ((begin-type (1+ (match-beginning 0)))
*************** given, calculate a new entry label."
*** 1890,1897 ****
                      bibtex-clean-entry-zap-empty-opts)
                     (goto-char begin-text)
!                    (if (looking-at
!                         (concat
!                          bibtex-field-left-delimiter
!                          bibtex-field-right-delimiter))
                         ;; empty: delete whole field if really optional
                         ;; (missing crossref handled) or complain
--- 2168,2172 ----
                      bibtex-clean-entry-zap-empty-opts)
                     (goto-char begin-text)
!                    (if (looking-at "\\(\"\"\\)\\|\\({}\\)")
                         ;; empty: delete whole field if really optional
                         ;; (missing crossref handled) or complain
*************** given, calculate a new entry label."
*** 1931,1954 ****
                         (delete-horizontal-space)
                         (indent-to-column bibtex-text-alignment))
!                      (goto-char begin-field) ; and loop to go through next test
                       ))
                    (t
                     (goto-char begin-text)
!                    (cond ((looking-at (concat
!                                        bibtex-field-left-delimiter
!                                        "[0-9]+"
!                                        bibtex-field-right-delimiter))
                            ;; if numerical,
                            (goto-char end-text)
!                           (delete-char -1) ; delete enclosing double-quotes
                            (goto-char begin-text)
                            (delete-char 1)
!                           (goto-char end-field) ; go to end for next search
!                           (forward-char -2) ; to compensate for the 2 quotes deleted
                            )
!                          ((looking-at (concat
!                                        bibtex-field-left-delimiter
!                                        bibtex-field-right-delimiter))
!                           ;; if empty quotes, complain
                            (forward-char 1)
                            (if (not (or (equal (buffer-substring-no-properties
--- 2206,2228 ----
                         (delete-horizontal-space)
                         (indent-to-column bibtex-text-alignment))
!                      (goto-char begin-field)
!                      ;; and loop to go through next test
                       ))
                    (t
                     (goto-char begin-text)
!                    (cond ((looking-at "\\(\"[0-9]+\"\\)\\|\\({[0-9]+}\\)")
                            ;; if numerical,
                            (goto-char end-text)
!                           (delete-char -1)
                            (goto-char begin-text)
                            (delete-char 1)
!                           ;; delete enclosing delimiters
!                           (goto-char end-field)
!                           ;; go to end for next search
!                           (forward-char -2)
!                           ;; to compensate for the 2 delimiters deleted
                            )
!                          ((looking-at "\\(\"\"\\)\\|\\({}\\)")
!                           ;; if empty field, complain
                            (forward-char 1)
                            (if (not (or (equal (buffer-substring-no-properties
*************** given, calculate a new entry label."
*** 1966,1976 ****
                            (goto-char end-field)))))))))
      (goto-char start)
!     (bibtex-end-of-entry)
!     ;; sct@dcs.edinburgh.ac.uk
!     (save-excursion
!       (forward-line -1)
!       (end-of-line)
!       (if (eq (preceding-char) ?,)
!  	  (backward-delete-char 1))))
    (let* ((eob (progn
                  (bibtex-end-of-entry)
--- 2240,2244 ----
                            (goto-char end-field)))))))))
      (goto-char start)
!     (bibtex-end-of-entry))
    (let* ((eob (progn
                  (bibtex-end-of-entry)
*************** given, calculate a new entry label."
*** 1978,1982 ****
           (key (progn
                  (bibtex-beginning-of-entry)
!                 (if (search-forward-regexp
                       bibtex-reference-head eob t)
                      (buffer-substring-no-properties
--- 2246,2250 ----
           (key (progn
                  (bibtex-beginning-of-entry)
!                 (if (re-search-forward
                       bibtex-reference-head eob t)
                      (buffer-substring-no-properties
*************** given, calculate a new entry label."
*** 1993,1999 ****
                     (bibtex-generate-autokey))))
              (bibtex-beginning-of-entry)
!             (search-forward-regexp "^@[A-Za-z]+[ \t]*[({]\\([^,]*\\)")
!             (delete-region (match-beginning 1)
!                            (match-end 1))
              (insert autokey)
              (let ((start (progn
--- 2261,2268 ----
                     (bibtex-generate-autokey))))
              (bibtex-beginning-of-entry)
!             (re-search-forward bibtex-reference-maybe-empty-head)
!             (if (match-beginning bibtex-key-in-head)
!                 (delete-region (match-beginning bibtex-key-in-head)
!                                (match-end bibtex-key-in-head)))
              (insert autokey)
              (let ((start (progn
*************** given, calculate a new entry label."
*** 2002,2020 ****
                    (end (progn
                           (bibtex-end-of-entry)
!                          (search-forward-regexp "^@" nil 'move)
                           (beginning-of-line)
                           (point)))
                    last-command)
                (kill-region start end)
!               (let ((success (bibtex-find-entry-location autokey t)))
                  (yank)
                  (setq kill-ring (cdr kill-ring))
!                 (if success
!                     (bibtex-beginning-of-entry)
!                   (goto-char start))
!                 (search-forward-regexp bibtex-reference-head)
                  (if (not success)
                      (error
!                      "BibTeX buffer was or has become invalid (call `bibtex-validate-buffer')")))))))))
  
  (defun bibtex-complete-string ()
--- 2271,2297 ----
                    (end (progn
                           (bibtex-end-of-entry)
!                          (re-search-forward "^@" nil 'move)
                           (beginning-of-line)
                           (point)))
                    last-command)
                (kill-region start end)
!               (let ((success
!                      (or
!                       (not bibtex-maintain-sorted-entries)
!                       (bibtex-find-entry-location autokey t))))
                  (yank)
                  (setq kill-ring (cdr kill-ring))
!                 (forward-char -1)
!                 (bibtex-beginning-of-entry)
!                 (re-search-forward bibtex-reference-head)
                  (if (not success)
                      (error
!                      "New inserted reference may be a duplicate."))))))))
!   (save-excursion
!     (let ((start (progn (bibtex-beginning-of-entry) (point)))
!           (end (progn (bibtex-end-of-entry) (point))))
!       (save-restriction
!         (narrow-to-region start end)
!         (bibtex-parse-keys t)))))
  
  (defun bibtex-complete-string ()
*************** If point is not after the part of a word
*** 2031,2059 ****
           (case-fold-search t)
           (completion (save-excursion
!                        (progn
!                          (while (re-search-backward
!                                  "@string[ \t\n]*{" (point-min) t)
!                            (goto-char (match-end 0))
!                            (let ((pnt (point))
!                                  (strt (match-beginning 0)))
!                              (re-search-forward "[ \t\n]*="
!                                                 (point-max) t)
!                              (goto-char (match-beginning 0))
!                              (setq string-list
!                                    (cons
!                                     (list
!                                      (buffer-substring-no-properties
!                                       pnt (point)))
!                                     string-list))
!                              (goto-char strt)))
                           (setq string-list
!                                (sort string-list
!                                      (lambda(x y)
!                                        (string-lessp
!                                         (car x)
!                                         (car y)))))
!                          (try-completion part-of-word string-list)))))
      (cond ((eq completion t)
!            (bibtex-remove-double-quotes-or-braces))
            ((null completion)
             (error "Can't find completion for \"%s\"" part-of-word))
--- 2308,2338 ----
           (case-fold-search t)
           (completion (save-excursion
!                        (while (re-search-backward
!                                bibtex-string (point-min) t)
                           (setq string-list
!                                (cons
!                                 (list
!                                  (buffer-substring-no-properties
!                                   (match-beginning bibtex-key-in-string)
!                                   (match-end bibtex-key-in-string)))
!                                 string-list)))
!                        (setq string-list
!                              (sort string-list
!                                    (lambda(x y)
!                                      (string-lessp
!                                       (car x)
!                                       (car y)))))
!                        (try-completion part-of-word string-list))))
      (cond ((eq completion t)
!            ;; remove double-quotes or braces if field is no concatenation
!            (save-excursion
!              (bibtex-inside-field)
!              (bibtex-enclosing-field)
!              (let ((end (match-end bibtex-text-in-field)))
!                (goto-char (match-beginning bibtex-text-in-field))
!                (if (and
!                     (looking-at bibtex-field-string)
!                     (equal (match-end 0) end))
!                    (bibtex-remove-double-quotes-or-braces)))))
            ((null completion)
             (error "Can't find completion for \"%s\"" part-of-word))
*************** If point is not after the part of a word
*** 2062,2066 ****
             (insert completion)
             (if (assoc completion string-list)
!                (bibtex-remove-double-quotes-or-braces)))
            (t
             (message "Making completion list...")
--- 2341,2354 ----
             (insert completion)
             (if (assoc completion string-list)
!                ;; remove double-quotes or braces if field is no concatenation
!                (save-excursion
!                  (bibtex-inside-field)
!                  (bibtex-enclosing-field)
!                  (let ((end (match-end bibtex-text-in-field)))
!                    (goto-char (match-beginning bibtex-text-in-field))
!                    (if (and
!                         (looking-at bibtex-field-string)
!                         (equal (match-end 0) end))
!                        (bibtex-remove-double-quotes-or-braces))))))
            (t
             (message "Making completion list...")
*************** If point is not after the part of a word
*** 2141,2150 ****
    (forward-char 10))
  
- 
  
  ;; Make BibTeX a Feature
  
  (provide 'bibtex)
- 
  
  ;;; bibtex.el ends here
--- 2429,2436 ----
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/blackbox.el emacs-19.31/lisp/blackbox.el
*** emacs-19.30/lisp/blackbox.el	Sun Aug  1 18:43:47 1993
--- emacs-19.31/lisp/blackbox.el	Sun Jan 14 02:34:30 1996
***************
*** 20,68 ****
  
  ;; 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:
  
! ; by F. Thomas May <uw-nsr!uw-warp!tom@beaver.cs.washington.edu>
! ; doc comment by Root Boy Jim <rbj@dsys.icst.nbs.gov>, 27 Apr 89
! ; interface improvements by ESR, Dec 5 1991.
  
! ; The object of the game is to find four hidden balls by shooting rays
! ; into the black box.  There are four possibilities: 1) the ray will
! ; pass thru the box undisturbed, 2) it will hit a ball and be absorbed,
! ; 3) it will be deflected and exit the box, or 4) be deflected immediately,
! ; not even being allowed entry into the box.
! ; 
! ; The strange part is the method of deflection.  It seems that rays will
! ; not pass next to a ball, and change direction at right angles to avoid it.
! ; 
! ; 		             R   3   
! ; 		 1 - - - - - - - - 1 
! ; 		   - - - - - - - -   
! ; 		   - O - - - - - - 3 
! ; 		 2 - - - - O - O -   
! ; 		 4 - - - - - - - - 
! ; 		 5 - - - - - - - - 5 
! ; 		   - - - - - - - - R 
! ; 		 H - - - - - - - O   
! ; 		   2   H 4       H   
! ; 
! ; Rays which enter and exit are numbered.  You can see that rays 1 & 5 pass
! ; thru the box undisturbed. Ray 2 is deflected by the northwesternmost
! ; ball.  Likewise rays 3 and 4. Rays which hit balls and are absorbed are
! ; marked with H.  The bottom of the left and the right of the bottom hit
! ; the southeastern ball directly.  Rays may also hit balls after being
! ; reflected. Consider the H on the bottom next to the 4.  It bounces off
! ; the NW-ern most ball and hits the central ball.  A ray shot from above
! ; the right side 5 would hit the SE-ern most ball.  The R beneath the 5
! ; is because the ball is returned instantly.  It is not allowed into
! ; the box if it would reflect immediately.  The R on the top is a more
! ; leisurely return.  Both central balls would tend to deflect it east
! ; or west, but it cannot go either way, so it just retreats.
! ;
! ; At the end of the game, if you've placed guesses for as many balls as
! ; there are in the box, the true board position will be revealed.  Each
! ; `x' is an incorrect guess of yours; `o' is the true location of a ball.
  
  ;;; Code:
--- 20,69 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
! ;; by F. Thomas May <uw-nsr!uw-warp!tom@beaver.cs.washington.edu>
! ;; doc comment by Root Boy Jim <rbj@dsys.icst.nbs.gov>, 27 Apr 89
! ;; interface improvements by ESR, Dec 5 1991.
  
! ;; The object of the game is to find four hidden balls by shooting rays
! ;; into the black box.  There are four possibilities: 1) the ray will
! ;; pass thru the box undisturbed, 2) it will hit a ball and be absorbed,
! ;; 3) it will be deflected and exit the box, or 4) be deflected immediately,
! ;; not even being allowed entry into the box.
! ;; 
! ;; The strange part is the method of deflection.  It seems that rays will
! ;; not pass next to a ball, and change direction at right angles to avoid it.
! ;; 
! ;; 		             R   3   
! ;; 		 1 - - - - - - - - 1 
! ;; 		   - - - - - - - -   
! ;; 		   - O - - - - - - 3 
! ;; 		 2 - - - - O - O -   
! ;; 		 4 - - - - - - - - 
! ;; 		 5 - - - - - - - - 5 
! ;; 		   - - - - - - - - R 
! ;; 		 H - - - - - - - O   
! ;; 		   2   H 4       H   
! ;; 
! ;; Rays which enter and exit are numbered.  You can see that rays 1 & 5 pass
! ;; thru the box undisturbed. Ray 2 is deflected by the northwesternmost
! ;; ball.  Likewise rays 3 and 4. Rays which hit balls and are absorbed are
! ;; marked with H.  The bottom of the left and the right of the bottom hit
! ;; the southeastern ball directly.  Rays may also hit balls after being
! ;; reflected. Consider the H on the bottom next to the 4.  It bounces off
! ;; the NW-ern most ball and hits the central ball.  A ray shot from above
! ;; the right side 5 would hit the SE-ern most ball.  The R beneath the 5
! ;; is because the ball is returned instantly.  It is not allowed into
! ;; the box if it would reflect immediately.  The R on the top is a more
! ;; leisurely return.  Both central balls would tend to deflect it east
! ;; or west, but it cannot go either way, so it just retreats.
! ;;
! ;; At the end of the game, if you've placed guesses for as many balls as
! ;; there are in the box, the true board position will be revealed.  Each
! ;; `x' is an incorrect guess of yours; `o' is the true location of a ball.
  
  ;;; Code:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/blessmail.el emacs-19.31/lisp/blessmail.el
*** emacs-19.30/lisp/blessmail.el	Thu May 12 06:50:40 1994
--- emacs-19.31/lisp/blessmail.el	Sun Jan 14 02:34:30 1996
***************
*** 1,5 ****
  ;;; blessmail.el --- Decide whether movemail needs special privileges.
  
! ;;; Copyright (C) 1994 Free Software Foundation, Inc.
  
  ;; Maintainer: FSF
--- 1,5 ----
  ;;; blessmail.el --- Decide whether movemail needs special privileges.
  
! ;; Copyright (C) 1994 Free Software Foundation, Inc.
  
  ;; Maintainer: FSF
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/bookmark.el emacs-19.31/lisp/bookmark.el
*** emacs-19.30/lisp/bookmark.el	Thu Aug 17 15:36:50 1995
--- emacs-19.31/lisp/bookmark.el	Wed May  8 17:29:40 1996
***************
*** 1,19 ****
  ;;; bookmark.el --- set bookmarks, maybe annotate them, jump to them later.
  
! ;; Copyright (C) 1993, 1994, 1995 Free Software Foundation
  
! ;; Author: Karl Fogel <kfogel@cyclic.com>
! ;; Maintainer: Karl Fogel <kfogel@cyclic.com>
  ;; Created: July, 1993
! ;; Author's Update Number: 2.6.13
  ;; Keywords: bookmarks, placeholders, annotations
  
- ;;; Summary:
- ;; This package is for setting "bookmarks" in files.  A bookmark
- ;; associates a string with a location in a certain file.  Thus, you
- ;; can navigate your way to that location by providing the string.
- ;; See the "User Variables" section for customizations.
- 
- ;;; Copyright info:
  ;; This file is part of GNU Emacs.
  
--- 1,12 ----
  ;;; bookmark.el --- set bookmarks, maybe annotate them, jump to them later.
  
! ;; Copyright (C) 1993, 1994, 1995, 1996 Free Software Foundation
  
! ;; Author: Karl Fogel <kfogel@red-bean.com>
! ;; Maintainer: Karl Fogel <kfogel@red-bean.com>
  ;; Created: July, 1993
! ;; Author's Update Number: see variable `bookmark-version'.
  ;; Keywords: bookmarks, placeholders, annotations
  
  ;; This file is part of GNU Emacs.
  
***************
*** 29,34 ****
  
  ;; 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.
  
  ;; Thanks to David Bremner <bremner@cs.sfu.ca> for thinking of and
--- 22,35 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
! 
! ;;; Commentary:
! 
! ;; This package is for setting "bookmarks" in files.  A bookmark
! ;; associates a string with a location in a certain file.  Thus, you
! ;; can navigate your way to that location by providing the string.
! ;; See the "User Variables" section for customizations.
  
  ;; Thanks to David Bremner <bremner@cs.sfu.ca> for thinking of and
***************
*** 48,52 ****
  ;; stuff).
  
! ;; Kudos (whatever they are) go to Jim Blandy <jimb@cyclic.com>
  ;; for his eminently sensible suggestion to separate bookmark-jump
  ;; into bookmark-jump and bookmark-jump-noselect, which made many
--- 49,53 ----
  ;; stuff).
  
! ;; Kudos (whatever they are) go to Jim Blandy <jimb@red-bean.com>
  ;; for his eminently sensible suggestion to separate bookmark-jump
  ;; into bookmark-jump and bookmark-jump-noselect, which made many
***************
*** 70,73 ****
--- 71,76 ----
  ;; reported and fixed.
  
+ ;; Thank you, Michael Kifer, for contributing the XEmacs support.
+ 
  ;; Enough with the credits already, get on to the good stuff:
  
***************
*** 75,84 ****
  ;; Boy, that's a tough one.  Probably Hong Min, or maybe Emperor's
  ;; Choice (both in Chicago's Chinatown).  Well, both.  How about you?
- 
  
  (require 'pp)
  
! 
! ;;;; Code:
  
  ;;; Misc comments:
--- 78,90 ----
  ;; Boy, that's a tough one.  Probably Hong Min, or maybe Emperor's
  ;; Choice (both in Chicago's Chinatown).  Well, both.  How about you?
  
+ ;;;; Code:
+ 
  (require 'pp)
  
! (defconst bookmark-version "2.6.4"
!   "Version number of bookmark.el.  This is not related to the version
! of Emacs bookmark comes with; it is used solely by bookmark's
! maintainers to avoid version confusion.")
  
  ;;; Misc comments:
*************** buffer.")
*** 104,108 ****
      explicitly called \(\\[bookmark-save]\).
  --> t means save bookmarks when Emacs is killed.
! --> Otherise, it should be a number that is the frequency with which
      the bookmark list is saved \(i.e.: the number of times which
      Emacs' bookmark list may be modified before it is automatically
--- 110,114 ----
      explicitly called \(\\[bookmark-save]\).
  --> t means save bookmarks when Emacs is killed.
! --> Otherwise, it should be a number that is the frequency with which
      the bookmark list is saved \(i.e.: the number of times which
      Emacs' bookmark list may be modified before it is automatically
*************** following in your .emacs:
*** 177,180 ****
--- 183,191 ----
  ;;; No user-serviceable parts beyond this point.
  
+ ;; Is it XEmacs?
+ (defconst bookmark-xemacsp
+   (string-match "\\(Lucid\\|Xemacs\\)" emacs-version))
+ 
+ 
  ;; Added  for lucid emacs  compatibility, db
  (or (fboundp 'defalias)  (fset 'defalias 'fset))
*************** following in your .emacs:
*** 183,186 ****
--- 194,209 ----
  (or (fboundp 'frame-height)  (defalias 'frame-height 'screen-height))
  
+ ;; This variable is probably obsolete now...
+ (or (boundp 'baud-rate)
+     ;; some random value higher than 9600    
+     (setq baud-rate 19200))
+ 
+ ;; XEmacs apparently call this `buffer-substring-without-properties',
+ ;; sigh.
+ (or (fboundp 'buffer-substring-no-properties)
+     (if (fboundp 'buffer-substring-without-properties)
+         (fset 'buffer-substring-no-properties
+               'buffer-substring-without-properties)
+       (fset 'buffer-substring-no-properties 'buffer-substring)))
  
  
*************** That is, all information but the name."
*** 428,432 ****
          (setcdr cell node)
        (nconc (bookmark-get-bookmark-record bookmark)
!              (list (cons 'info-node node))))))
    
  
--- 451,459 ----
          (setcdr cell node)
        (nconc (bookmark-get-bookmark-record bookmark)
!              (list (cons 'info-node node)))))
! 
!   (message "%S" (assq 'info-node (bookmark-get-bookmark-record bookmark)))
!   (sit-for 4)
!   )
    
  
*************** menus, so `completing-read' never gets a
*** 468,484 ****
  
  
! (defun bookmark-make (name &optional annotation overwrite)
    "Make a bookmark named NAME.
  Optional second arg ANNOTATION gives it an annotation.
  Optional third arg OVERWRITE means replace any existing bookmarks with
! this name."
    (bookmark-maybe-load-default-file)
    (let ((stripped-name (copy-sequence name)))
!     (set-text-properties 0 (length stripped-name) nil stripped-name)
      (if (and (bookmark-get-bookmark stripped-name) (not overwrite))
!         ;; already existing boookmark under that name and
          ;; no prefix arg means just overwrite old bookmark
          (setcdr (bookmark-get-bookmark stripped-name)
!                 (list (bookmark-make-cell annotation)))
        
        ;; otherwise just cons it onto the front (either the bookmark
--- 495,516 ----
  
  
! (defun bookmark-make (name &optional annotation overwrite info-node)
    "Make a bookmark named NAME.
  Optional second arg ANNOTATION gives it an annotation.
  Optional third arg OVERWRITE means replace any existing bookmarks with
! this name.
! Optional fourth arg INFO-NODE means this bookmark is at info node
! INFO-NODE, so record this fact in the bookmark's entry."
    (bookmark-maybe-load-default-file)
    (let ((stripped-name (copy-sequence name)))
!     (or bookmark-xemacsp
!         ;; XEmacs's `set-text-properties' doesn't work on
!         ;; free-standing strings, apparently.
!         (set-text-properties 0 (length stripped-name) nil stripped-name))
      (if (and (bookmark-get-bookmark stripped-name) (not overwrite))
!         ;; already existing bookmark under that name and
          ;; no prefix arg means just overwrite old bookmark
          (setcdr (bookmark-get-bookmark stripped-name)
!                 (list (bookmark-make-cell annotation info-node)))
        
        ;; otherwise just cons it onto the front (either the bookmark
*************** this name."
*** 489,493 ****
              (cons
               (list stripped-name 
!                    (bookmark-make-cell annotation))
               bookmark-alist)))
      
--- 521,525 ----
              (cons
               (list stripped-name 
!                    (bookmark-make-cell annotation info-node))
               bookmark-alist)))
      
*************** this name."
*** 500,522 ****
  
  
! (defun bookmark-make-cell (annotation)
    "Return the record part of a new bookmark, given ANNOTATION.
  Must be at the correct position in the buffer in which the bookmark is
! being set.  This will change soon."
!   (` ((filename . (, (bookmark-buffer-file-name)))
!       (front-context-string
!        . (, (if (>= (- (point-max) (point)) bookmark-search-size)
!                 (buffer-substring-no-properties
!                  (point)
!                  (+ (point) bookmark-search-size))
!               nil)))
!       (rear-context-string
!        . (, (if (>= (- (point) (point-min)) bookmark-search-size)
!                 (buffer-substring-no-properties
!                  (point)
!                  (- (point) bookmark-search-size))
!               nil)))
!       (position . (, (point)))
!       (annotation . (, annotation)))))
    
  
--- 532,567 ----
  
  
! (defun bookmark-make-cell (annotation &optional info-node)
    "Return the record part of a new bookmark, given ANNOTATION.
  Must be at the correct position in the buffer in which the bookmark is
! being set.  This might change someday.
! Optional second arg INFO-NODE means this bookmark is at info node
! INFO-NODE, so record this fact in the bookmark's entry."
!   (let ((the-record
!          (` ((filename . (, (bookmark-buffer-file-name)))
!              (front-context-string
!               . (, (if (>= (- (point-max) (point)) bookmark-search-size)
!                        (buffer-substring-no-properties
!                         (point)
!                         (+ (point) bookmark-search-size))
!                      nil)))
!              (rear-context-string
!               . (, (if (>= (- (point) (point-min)) bookmark-search-size)
!                        (buffer-substring-no-properties
!                         (point)
!                         (- (point) bookmark-search-size))
!                      nil)))
!              (position . (, (point)))
!              ))))
! 
!     ;; Now fill in the optional parts:
!     (if annotation
!         (nconc the-record (list (cons 'annotation annotation))))
!     (if info-node
!         (nconc the-record (list (cons 'info-node info-node))))
! 
!     ;; Finally, return the completed record.
!     the-record))
!     
    
  
*************** being set.  This will change soon."
*** 565,573 ****
  ;; case the file has changed since the bookmark was set.  It will
  ;; attempt to place the user before the changes, if there were any.
! ;; annotation is the annotation for the bookmark; it may not exist
  ;; (for backward compatibility), be nil (no annotation), or be a
  ;; string.
- ;;
- ;; ANNOTATION is an annotation for the bookmark.
  
  
--- 610,616 ----
  ;; case the file has changed since the bookmark was set.  It will
  ;; attempt to place the user before the changes, if there were any.
! ;; ANNOTATION is the annotation for the bookmark; it may not exist
  ;; (for backward compatibility), be nil (no annotation), or be a
  ;; string.
  
  
*************** affect point."
*** 597,601 ****
              (read (current-buffer)))
          ;; Else no hope of getting information here.
!         (error "Not bookmark format.")))))
  
  
--- 640,644 ----
              (read (current-buffer)))
          ;; Else no hope of getting information here.
!         (error "Not bookmark format")))))
  
  
*************** This expects to be called from point-min
*** 633,637 ****
      (save-buffer))
    (goto-char (point-min))
!   (message "Upgrading bookmark format from 0 to %d... done."
             bookmark-file-format-version)
    )
--- 676,680 ----
      (save-buffer))
    (goto-char (point-min))
!   (message "Upgrading bookmark format from 0 to %d...done"
             bookmark-file-format-version)
    )
*************** This expects to be called from point-min
*** 663,671 ****
        (bookmark-upgrade-file-format-from-0))
       (t
!       (error "Bookmark file format version strangeness.")))))
  
  
  (defun bookmark-insert-file-format-version-stamp ()
!   "Insert text indicating current version of bookmark file-format."
    (insert
     (format ";;;; Emacs Bookmark Format Version %d ;;;;\n"
--- 706,714 ----
        (bookmark-upgrade-file-format-from-0))
       (t
!       (error "Bookmark file format version strangeness")))))
  
  
  (defun bookmark-insert-file-format-version-stamp ()
!   "Insert text indicating current version of bookmark file format."
    (insert
     (format ";;;; Emacs Bookmark Format Version %d ;;;;\n"
*************** the list of bookmarks.\)"
*** 708,712 ****
    (or
     (bookmark-buffer-file-name)
!    (error "Buffer not visiting a file or directory."))
  
    (bookmark-maybe-load-default-file)
--- 751,755 ----
    (or
     (bookmark-buffer-file-name)
!    (error "Buffer not visiting a file or directory"))
  
    (bookmark-maybe-load-default-file)
*************** the list of bookmarks.\)"
*** 735,742 ****
  	(bookmark-read-annotation parg str)
        (progn
! 	(bookmark-make str annotation parg)
!         ;; In Info, there's a little more information to record:
!         (if (eq major-mode 'Info-mode)
!             (bookmark-set-info-node str Info-current-node))
  	(setq bookmark-current-bookmark str)
  	(bookmark-bmenu-surreptitiously-rebuild-list)
--- 778,782 ----
  	(bookmark-read-annotation parg str)
        (progn
! 	(bookmark-make str annotation parg (bookmark-info-current-node))
  	(setq bookmark-current-bookmark str)
  	(bookmark-bmenu-surreptitiously-rebuild-list)
*************** the list of bookmarks.\)"
*** 744,747 ****
--- 784,793 ----
  
  
+ (defun bookmark-info-current-node ()
+   "If in Info-mode, return current node name (a string), else nil."
+   (if (eq major-mode 'Info-mode)
+       Info-current-node))
+ 
+ 
  (defun bookmark-kill-line (&optional newline-too)
    "Kill from point to end of line.
*************** Does not affect the kill-ring."
*** 763,772 ****
  
  (defun bookmark-send-annotation ()
!   "After remove lines beginning with '#', use the contents of this buffer
! as the annotation for a bookmark, and store it in the bookmark list with
  the bookmark (and file, and point) specified in buffer local variables."
    (interactive)
    (if (not (eq major-mode 'bookmark-read-annotation-mode))
!       (error "Not in bookmark-read-annotation-mode."))
    (goto-char (point-min))
    (while (< (point) (point-max))
--- 809,819 ----
  
  (defun bookmark-send-annotation ()
!   "Use buffer contents as the annotation for a bookmark.
! Exclude lines that begin with `#'.
! Store the annotation text in the bookmark list with
  the bookmark (and file, and point) specified in buffer local variables."
    (interactive)
    (if (not (eq major-mode 'bookmark-read-annotation-mode))
!       (error "Not in bookmark-read-annotation-mode"))
    (goto-char (point-min))
    (while (< (point) (point-max))
*************** the bookmark (and file, and point) speci
*** 787,791 ****
        (pop-to-buffer buf)
        (goto-char pt)
!       (bookmark-make bookmark annotation parg)
        (setq bookmark-current-bookmark bookmark))
      (bookmark-bmenu-surreptitiously-rebuild-list)
--- 834,838 ----
        (pop-to-buffer buf)
        (goto-char pt)
!       (bookmark-make bookmark annotation parg (bookmark-info-current-node))
        (setq bookmark-current-bookmark bookmark))
      (bookmark-bmenu-surreptitiously-rebuild-list)
*************** the bookmark (and file, and point) speci
*** 804,811 ****
  
  (defvar bookmark-read-annotation-text-func 'bookmark-default-annotation-text
!   "A variable containing a function which returns the text to insert
! into an annotation compisition buffer.  It takes the name of the bookmark,
! as a string, as an arg.")
! 
  
  (defun bookmark-read-annotation-mode (buf point parg bookmark)
--- 851,856 ----
  
  (defvar bookmark-read-annotation-text-func 'bookmark-default-annotation-text
!   "Function to return default text to use for a bookmark annotation.
! It takes the name of the bookmark, as a string, as an arg.")
  
  (defun bookmark-read-annotation-mode (buf point parg bookmark)
*************** the annotation.
*** 836,841 ****
  
  (defun bookmark-read-annotation (parg bookmark)
!   "Pop up a buffer for entering a bookmark annotation.  Text surrounding
! the bookmark is PARG; the bookmark name is BOOKMARK."
    (let ((buf (current-buffer))
  	(point (point)))
--- 881,886 ----
  
  (defun bookmark-read-annotation (parg bookmark)
!   "Pop up a buffer for entering a bookmark annotation.
! Text surrounding the bookmark is PARG; the bookmark name is BOOKMARK."
    (let ((buf (current-buffer))
  	(point (point)))
*************** When you have finished composing, type \
*** 873,881 ****
  
  (defun bookmark-send-edited-annotation ()
!   "After remove lines beginning with '#', use the contents of this buffer
! as the new annotation for a bookmark."
    (interactive)
    (if (not (eq major-mode 'bookmark-edit-annotation-mode))
!       (error "Not in bookmark-edit-annotation-mode."))
    (goto-char (point-min))
    (while (< (point) (point-max))
--- 918,925 ----
  
  (defun bookmark-send-edited-annotation ()
!   "Use buffer contents (minus beginning with `#' as annotation for a bookmark."
    (interactive)
    (if (not (eq major-mode 'bookmark-edit-annotation-mode))
!       (error "Not in bookmark-edit-annotation-mode"))
    (goto-char (point-min))
    (while (< (point) (point-max))
*************** as the new annotation for a bookmark."
*** 900,905 ****
  
  (defun bookmark-insert-current-bookmark ()
!   "Insert this buffer's value of bookmark-current-bookmark, default
! to file name if it's nil."
    (interactive)
    (let ((str
--- 944,949 ----
  
  (defun bookmark-insert-current-bookmark ()
!   "Insert this buffer's value of bookmark-current-bookmark.
! Default to file name if it's nil."
    (interactive)
    (let ((str
*************** to file name if it's nil."
*** 911,916 ****
  
  (defun bookmark-insert-buffer-name ()
!   "Insert the name (sans path) of the current file into the bookmark
! name that is being set."
    (interactive)
    (let ((str
--- 955,960 ----
  
  (defun bookmark-insert-buffer-name ()
!   "Insert the current file name into the bookmark name being set.
! The directory part of the file name is not used."
    (interactive)
    (let ((str
*************** For example, if this is a Info buffer, r
*** 976,980 ****
    (and (not bookmarks-already-loaded)
         (null bookmark-alist)
- 
         (prog2
             (and
--- 1020,1023 ----
*************** of the old one in the permanent bookmark
*** 1098,1105 ****
  ;;;###autoload
  (defun bookmark-relocate (bookmark)
!   "Relocate BOOKMARK -- prompts for a filename, and makes an already
! existing bookmark point to that file, instead of the one it used to
! point at.  Useful when a file has been renamed after a bookmark was
! set in it."
    (interactive (bookmark-completing-read "Bookmark to relocate"))
    (bookmark-maybe-historicize-string bookmark)
--- 1141,1148 ----
  ;;;###autoload
  (defun bookmark-relocate (bookmark)
!   "Relocate BOOKMARK to another file (reading file name with minibuffer).
! This makes an already existing bookmark point to that file, instead of
! the one it used to point at.  Useful when a file has been renamed
! after a bookmark was set in it."
    (interactive (bookmark-completing-read "Bookmark to relocate"))
    (bookmark-maybe-historicize-string bookmark)
*************** minibuffer history list `bookmark-histor
*** 1122,1125 ****
--- 1165,1170 ----
    (insert (bookmark-location bookmark)))
  
+ ;;;###autoload
+ (defalias 'bookmark-locate 'bookmark-insert-location)
  
  (defun bookmark-location (bookmark)
*************** minibuffer history list `bookmark-histor
*** 1131,1144 ****
  ;;;###autoload
  (defun bookmark-rename (old &optional new)
!   "Change the name of OLD bookmark to NEW name.  If called from
! keyboard, prompts for OLD and NEW.  If called from menubar, OLD is
! selected from a menu, and prompts for NEW.
  
! If called from Lisp, prompts for NEW if only OLD was passed as an
  argument.  If called with two strings, then no prompting is done.  You
  must pass at least OLD when calling from Lisp.
  
  While you are entering the new name, consecutive C-w's insert
! consectutive words from the text of the buffer into the new bookmark
  name."
    (interactive (bookmark-completing-read "Old bookmark name"))
--- 1176,1189 ----
  ;;;###autoload
  (defun bookmark-rename (old &optional new)
!   "Change the name of OLD bookmark to NEW name.
! If called from keyboard, prompt for OLD and NEW.  If called from
! menubar, select OLD from a menu and prompt for NEW.
  
! If called from Lisp, prompt for NEW if only OLD was passed as an
  argument.  If called with two strings, then no prompting is done.  You
  must pass at least OLD when calling from Lisp.
  
  While you are entering the new name, consecutive C-w's insert
! consecutive words from the text of the buffer into the new bookmark
  name."
    (interactive (bookmark-completing-read "Old bookmark name"))
*************** probably because we were called from the
*** 1205,1209 ****
      (setq bookmark-alist (delq will-go bookmark-alist))
      ;; Added by db, nil bookmark-current-bookmark if the last
!     ;; occurence has been deleted
      (or (bookmark-get-bookmark bookmark-current-bookmark)
          (setq bookmark-current-bookmark nil)))
--- 1250,1254 ----
      (setq bookmark-alist (delq will-go bookmark-alist))
      ;; Added by db, nil bookmark-current-bookmark if the last
!     ;; occurrence has been deleted
      (or (bookmark-get-bookmark bookmark-current-bookmark)
          (setq bookmark-current-bookmark nil)))
*************** probably because we were called from the
*** 1236,1242 ****
  ;;;###autoload
  (defun bookmark-write ()
!   "Write bookmarks to a file \(for which the user will be prompted
! interactively\).  Don't use this in Lisp programs; use bookmark-save
! instead."
    (interactive)
    (bookmark-maybe-load-default-file)
--- 1281,1286 ----
  ;;;###autoload
  (defun bookmark-write ()
!   "Write bookmarks to a file (reading the file name with the minibuffer).
! Don't use this in Lisp programs; use `bookmark-save' instead."
    (interactive)
    (bookmark-maybe-load-default-file)
*************** for a file, defaulting to the file defin
*** 1287,1291 ****
      (save-window-excursion
        (if (>= baud-rate 9600)
!           (message (format "Saving bookmarks to file %s..." file)))
        (set-buffer (let ((enable-local-variables nil))
                      (find-file-noselect file)))
--- 1331,1335 ----
      (save-window-excursion
        (if (>= baud-rate 9600)
!           (message "Saving bookmarks to file %s..." file))
        (set-buffer (let ((enable-local-variables nil))
                      (find-file-noselect file)))
*************** for a file, defaulting to the file defin
*** 1304,1308 ****
          (kill-buffer (current-buffer))
          (if (>= baud-rate 9600)
!             (message (format "Saving bookmarks to file %s... done." file)))
          ))))
  
--- 1348,1352 ----
          (kill-buffer (current-buffer))
          (if (>= baud-rate 9600)
!             (message "Saving bookmarks to file %s...done" file))
          ))))
  
*************** explicitly."
*** 1335,1339 ****
          (save-window-excursion
            (if (and (null no-msg) (>= baud-rate 9600))
!               (message (format "Loading bookmarks from %s..." file)))
            (set-buffer (let ((enable-local-variables nil))
                          (find-file-noselect file)))
--- 1379,1383 ----
          (save-window-excursion
            (if (and (null no-msg) (>= baud-rate 9600))
!               (message "Loading bookmarks from %s..." file))
            (set-buffer (let ((enable-local-variables nil))
                          (find-file-noselect file)))
*************** explicitly."
*** 1350,1358 ****
                          (append blist (if (not revert) bookmark-alist)))
                    (bookmark-bmenu-surreptitiously-rebuild-list)) 
!               (error (format "Invalid bookmark list in %s." file))))
            (kill-buffer (current-buffer)))
  	(if (and (null no-msg) (>= baud-rate 9600))
!             (message (format "Loading bookmarks from %s... done" file))))
!     (error (format "Cannot read bookmark file %s." file))))
  
  
--- 1394,1402 ----
                          (append blist (if (not revert) bookmark-alist)))
                    (bookmark-bmenu-surreptitiously-rebuild-list)) 
!               (error "Invalid bookmark list in %s" file)))
            (kill-buffer (current-buffer)))
  	(if (and (null no-msg) (>= baud-rate 9600))
!             (message "Loading bookmarks from %s...done" file)))
!     (error "Cannot read bookmark file %s" file)))
  
  
*************** explicitly."
*** 1381,1392 ****
    (define-key bookmark-bmenu-mode-map "1" 'bookmark-bmenu-1-window)
    (define-key bookmark-bmenu-mode-map "j" 'bookmark-bmenu-this-window)
    (define-key bookmark-bmenu-mode-map "f" 'bookmark-bmenu-this-window)
    (define-key bookmark-bmenu-mode-map "o" 'bookmark-bmenu-other-window)
!   (define-key bookmark-bmenu-mode-map "\C-o" 'bookmark-bmenu-switch-other-window)
    (define-key bookmark-bmenu-mode-map "s" 'bookmark-bmenu-save)
    (define-key bookmark-bmenu-mode-map "k" 'bookmark-bmenu-delete)
    (define-key bookmark-bmenu-mode-map "\C-d" 'bookmark-bmenu-delete-backwards)
    (define-key bookmark-bmenu-mode-map "x" 'bookmark-bmenu-execute-deletions)
-   (define-key bookmark-bmenu-mode-map "\C-k" 'bookmark-bmenu-delete)
    (define-key bookmark-bmenu-mode-map "d" 'bookmark-bmenu-delete)
    (define-key bookmark-bmenu-mode-map " " 'next-line)
--- 1425,1437 ----
    (define-key bookmark-bmenu-mode-map "1" 'bookmark-bmenu-1-window)
    (define-key bookmark-bmenu-mode-map "j" 'bookmark-bmenu-this-window)
+   (define-key bookmark-bmenu-mode-map "\C-c\C-c" 'bookmark-bmenu-this-window)
    (define-key bookmark-bmenu-mode-map "f" 'bookmark-bmenu-this-window)
    (define-key bookmark-bmenu-mode-map "o" 'bookmark-bmenu-other-window)
!   (define-key bookmark-bmenu-mode-map "\C-o"
!     'bookmark-bmenu-switch-other-window)
    (define-key bookmark-bmenu-mode-map "s" 'bookmark-bmenu-save)
    (define-key bookmark-bmenu-mode-map "k" 'bookmark-bmenu-delete)
    (define-key bookmark-bmenu-mode-map "\C-d" 'bookmark-bmenu-delete-backwards)
    (define-key bookmark-bmenu-mode-map "x" 'bookmark-bmenu-execute-deletions)
    (define-key bookmark-bmenu-mode-map "d" 'bookmark-bmenu-delete)
    (define-key bookmark-bmenu-mode-map " " 'next-line)
*************** deletion, or > if it is flagged for disp
*** 1445,1449 ****
      (mapcar
       (lambda (full-record)
!        ;; if a bookmark has an annotation, preceed it with a "*"
         ;; in the list of bookmarks.
         (let ((annotation (bookmark-get-annotation
--- 1490,1494 ----
      (mapcar
       (lambda (full-record)
!        ;; if a bookmark has an annotation, prepend a "*"
         ;; in the list of bookmarks.
         (let ((annotation (bookmark-get-annotation
*************** deletion, or > if it is flagged for disp
*** 1472,1476 ****
  Each line describes one of the bookmarks in Emacs.
  Letters do not insert themselves; instead, they are commands.
! Bookmark names preceeded by a \"*\" have annotations.
  \\<bookmark-bmenu-mode-map>
  \\[bookmark-bmenu-mark] -- mark bookmark to be displayed.
--- 1517,1521 ----
  Each line describes one of the bookmarks in Emacs.
  Letters do not insert themselves; instead, they are commands.
! Bookmark names preceded by a \"*\" have annotations.
  \\<bookmark-bmenu-mode-map>
  \\[bookmark-bmenu-mark] -- mark bookmark to be displayed.
*************** Bookmark names preceeded by a \"*\" have
*** 1489,1493 ****
  \\[bookmark-bmenu-delete] -- mark this bookmark to be deleted, and move down.
  \\[bookmark-bmenu-delete-backwards] -- mark this bookmark to be deleted, and move up. 
! \\[bookmark-bmenu-execute-deletions] -- delete marked bookmarks.
  \\[bookmark-bmenu-save] -- save the current bookmark list in the default file.
    With a prefix arg, prompts for a file to save in.
--- 1534,1538 ----
  \\[bookmark-bmenu-delete] -- mark this bookmark to be deleted, and move down.
  \\[bookmark-bmenu-delete-backwards] -- mark this bookmark to be deleted, and move up. 
! \\[bookmark-bmenu-execute-deletions] -- delete bookmarks marked with `\\[bookmark-bmenu-delete]'.
  \\[bookmark-bmenu-save] -- save the current bookmark list in the default file.
    With a prefix arg, prompts for a file to save in.
*************** if an annotation exists."
*** 1657,1661 ****
  
  (defun bookmark-bmenu-mark ()
!   "Mark bookmark on this line to be displayed by \\<bookmark-bmenu-mode-map>\\[bookmark-bmenu-select] command."
    (interactive)
    (beginning-of-line)
--- 1702,1706 ----
  
  (defun bookmark-bmenu-mark ()
!   "Mark bookmark on this line to be displayed by \\<bookmark-bmenu-mode-map>\\[bookmark-bmenu-select]."
    (interactive)
    (beginning-of-line)
*************** Optional BACKUP means move up."
*** 1842,1846 ****
  
  (defun bookmark-bmenu-delete ()
!   "Mark bookmark on this line to be deleted by \\<bookmark-bmenu-mode-map>\\[bookmark-bmenu-execute-deletions] command."
    (interactive)
    (beginning-of-line)
--- 1887,1892 ----
  
  (defun bookmark-bmenu-delete ()
!   "Mark bookmark on this line to be deleted.
! To carry out the deletions that you've marked, use \\<bookmark-bmenu-mode-map>\\[bookmark-bmenu-execute-deletions]."
    (interactive)
    (beginning-of-line)
*************** Optional BACKUP means move up."
*** 1853,1858 ****
  
  (defun bookmark-bmenu-delete-backwards ()
!   "Mark bookmark on this line to be deleted by \\<bookmark-bmenu-mode-map>\\[bookmark-bmenu-execute-deletions] command
! and then move up one line"
    (interactive)
    (bookmark-bmenu-delete)
--- 1899,1904 ----
  
  (defun bookmark-bmenu-delete-backwards ()
!   "Mark bookmark on this line to be deleted, then move up one line.
! To carry out the deletions that you've marked, use \\<bookmark-bmenu-mode-map>\\[bookmark-bmenu-execute-deletions]."
    (interactive)
    (bookmark-bmenu-delete)
*************** and then move up one line"
*** 1865,1868 ****
--- 1911,1915 ----
    "Delete bookmarks marked with \\<Buffer-menu-mode-map>\\[Buffer-menu-delete] commands."
    (interactive)
+   (message "Deleting bookmarks...")
    (let ((hide-em bookmark-bmenu-toggle-filenames)
          (o-point  (point))
*************** and then move up one line"
*** 1896,1900 ****
            (1+ bookmark-alist-modification-count))
      (if (bookmark-time-to-save-p)
!         (bookmark-save))))
  
  
--- 1943,1949 ----
            (1+ bookmark-alist-modification-count))
      (if (bookmark-time-to-save-p)
!         (bookmark-save))
!     (message "Deleting bookmarks...done")
!     ))
  
  
*************** strings returned are not."
*** 1959,1962 ****
--- 2008,2038 ----
  
  
+ (defun bookmark-build-xemacs-menu (name entries function)
+   "Build a menu named NAME from the strings in ENTRIES.
+ That is, ENTRIES is a list of strings that appear as the choices
+ in the menu.
+ The visible entries are truncated to `bookmark-menu-length', but the
+ strings returned are not."
+   (let* (lst 
+ 	 (pane-list
+ 	  (progn
+ 	    (while entries
+ 	      (let ((str (car entries)))
+ 		(setq lst (cons
+ 			   (vector
+ 			    (if (> (length str) bookmark-menu-length)
+ 				(substring str 0 bookmark-menu-length)
+ 			      str)
+ 			    (list function str)
+ 			    t)
+ 			   lst))
+ 		(setq entries (cdr entries))))
+ 	    (nreverse lst))))
+ 
+     ;; Return the menu:
+     (append (if popup-menu-titles (list (concat "-*- " name " -*-")))
+  	    pane-list)))
+ 
+ 
  (defun bookmark-menu-popup-paned-menu (event name entries)
    "Pop up multi-paned menu at EVENT, return string chosen from ENTRIES.
*************** is done.  You must pass at least OLD-BOO
*** 2039,2043 ****
  
  While you are entering the new name, consecutive C-w's insert
! consectutive words from the text of the buffer into the new bookmark
  name.
  
--- 2115,2119 ----
  
  While you are entering the new name, consecutive C-w's insert
! consecutive words from the text of the buffer into the new bookmark
  name.
  
*************** corresponding bookmark function from Lis
*** 2072,2092 ****
  ;; that the whole job is done in loaddefs.el.
  
  ;;;###autoload
  (defvar menu-bar-bookmark-map (make-sparse-keymap "Bookmark functions"))
!  
  ;;;###autoload
  (defalias 'menu-bar-bookmark-map (symbol-value 'menu-bar-bookmark-map))
  
  ;;;###autoload
  (define-key menu-bar-bookmark-map [load]
!   '("Load a Bookmark File" . bookmark-load))
  
  ;;;###autoload
  (define-key menu-bar-bookmark-map [write]
!   '("Write \(to another file\)" . bookmark-write))
  
  ;;;###autoload
  (define-key menu-bar-bookmark-map [save]
!   '("Save  \(in default file\)" . bookmark-save))
  
  ;;;###autoload
--- 2148,2177 ----
  ;; that the whole job is done in loaddefs.el.
  
+ ;; Emacs menubar stuff.
+ 
  ;;;###autoload
  (defvar menu-bar-bookmark-map (make-sparse-keymap "Bookmark functions"))
! 
  ;;;###autoload
  (defalias 'menu-bar-bookmark-map (symbol-value 'menu-bar-bookmark-map))
  
+ ;; make bookmarks appear toward the right side of the menu.
+ (if (boundp 'menu-bar-final-items)
+     (if menu-bar-final-items 
+         (setq menu-bar-final-items
+               (cons 'bookmark menu-bar-final-items)))
+   (setq menu-bar-final-items '(bookmark)))
+ 
  ;;;###autoload
  (define-key menu-bar-bookmark-map [load]
!   '("Load a Bookmark File..." . bookmark-load))
  
  ;;;###autoload
  (define-key menu-bar-bookmark-map [write]
!   '("Save Bookmarks As..." . bookmark-write))
  
  ;;;###autoload
  (define-key menu-bar-bookmark-map [save]
!   '("Save Bookmarks" . bookmark-save))
  
  ;;;###autoload
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/browse-url.el emacs-19.31/lisp/browse-url.el
*** emacs-19.30/lisp/browse-url.el	Sat Oct 14 23:09:16 1995
--- emacs-19.31/lisp/browse-url.el	Sat Mar  2 01:35:56 1996
***************
*** 1,4 ****
  ;;; browse-url.el --- ask a WWW browser to load a URL
! ;; Copyright 1995 Free Software Foundation, Inc.
  
  ;; Author: Denis Howe <dbh@doc.ic.ac.uk>
--- 1,5 ----
  ;;; browse-url.el --- ask a WWW browser to load a URL
! 
! ;; Copyright 1995, 1996 Free Software Foundation, Inc.
  
  ;; Author: Denis Howe <dbh@doc.ic.ac.uk>
***************
*** 11,28 ****
  
  ;; 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:
  
--- 12,29 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
***************
*** 91,110 ****
  
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;; Installation
- 
- ;; Put the following in your ~/.emacs file:
- ;;
- ;; (autoload 'browse-url-at-point "browse-url"
- ;;   "Ask a WWW browser to load the URL at or before point." t)
- ;; (autoload 'browse-url-at-mouse "browse-url"
- ;;   "Ask a WWW browser to load a URL clicked with the mouse." t)
- ;; (autoload 'browse-url-of-buffer "browse-url"
- ;;   "Ask a WWW browser to display BUFFER." t)
- ;; (autoload 'browse-url-of-file "browse-url"
- ;;   "Ask a WWW browser to display FILE." t)
- ;; (autoload 'browse-url-of-dired-file "browse-url"
- ;;   "In Dired, ask a WWW browser to display the file named on this line." t)
- 
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;; Usage
  
--- 92,95 ----
***************
*** 114,118 ****
  ;; To display a URL by shift-clicking on it, put this in your ~/.emacs
  ;; file:
! ;;      (global-set-key [S-mouse-1] 'browse-url-at-mouse)
  
  ;; To display the current buffer in a web browser:
--- 99,105 ----
  ;; To display a URL by shift-clicking on it, put this in your ~/.emacs
  ;; file:
! ;;      (global-set-key [S-mouse-2] 'browse-url-at-mouse)
! ;; (Note that using Shift-mouse-1 is not desirable because
! ;; that event has a standard meaning in Emacs.)
  
  ;; To display the current buffer in a web browser:
*************** file rather than displaying a cached cop
*** 313,320 ****
    (if (and (boundp 'emacs-major-version)
             (or (> emacs-major-version 19) (>= emacs-minor-version 29)))
!       'sigusr1
      30)                                 ; Check /usr/include/signal.h.
    "The argument to `signal-process' for sending SIGUSR1 to XMosaic.
! Emacs 19.29 accepts 'sigusr1, earlier versions require an integer
  which is 30 on SunOS and 16 on HP-UX and Solaris.")
  
--- 300,307 ----
    (if (and (boundp 'emacs-major-version)
             (or (> emacs-major-version 19) (>= emacs-minor-version 29)))
!       'SIGUSR1
      30)                                 ; Check /usr/include/signal.h.
    "The argument to `signal-process' for sending SIGUSR1 to XMosaic.
! Emacs 19.29 accepts 'SIGUSR1, earlier versions require an integer
  which is 30 on SunOS and 16 on HP-UX and Solaris.")
  
*************** use in `interactive'."
*** 356,359 ****
--- 343,347 ----
    (list (read-string (or prompt "URL: ") (browse-url-url-at-point))))
  
+ ;;;###autoload
  (defun browse-url-at-point ()
    "Ask a WWW browser to load the URL at or before point.
*************** The URL is loaded according to the value
*** 362,365 ****
--- 350,354 ----
    (funcall browse-url-browser-function (browse-url-url-at-point)))
  
+ ;;;###autoload
  (defun browse-url-at-mouse (event)
    "Ask a WWW browser to load a URL clicked with the mouse.
*************** but point is not changed.  The URL is lo
*** 380,383 ****
--- 369,373 ----
  ;; Browse current buffer
  
+ ;;;###autoload
  (defun browse-url-of-file (&optional file)
    "Ask a WWW browser to display FILE.
*************** Uses variable `browse-url-filename-alist
*** 422,425 ****
--- 412,416 ----
  (defvar browse-url-temp-file-list '())
  
+ ;;;###autoload
  (defun browse-url-of-buffer (&optional buffer)
    "Ask a WWW browser to display BUFFER.
*************** Display the current buffer if BUFFER is 
*** 470,473 ****
--- 461,465 ----
  (add-hook 'kill-emacs-hook 'browse-url-delete-temp-file-list)
  
+ ;;;###autoload
  (defun browse-url-of-dired-file ()
    "In Dired, ask a WWW browser to display the file named on this line."
*************** used instead of browse-url-new-window-p.
*** 495,510 ****
                         (list (not (eq (null browse-url-new-window-p)
                                        (null current-prefix-arg))))))
!   (or (zerop
!        (apply 'call-process "netscape" nil nil nil
!               (append browse-url-netscape-arguments
!                       (if new-window '("-noraise"))
!                       (list "-remote" 
!                             (concat "openURL(" url 
!                                     (if new-window ",new-window")
!                                     ")")))))
!       (progn                            ; Netscape not running - start it
!         (message "Starting Netscape...")
!         (apply 'start-process "netscape" nil "netscape"
!                (append browse-url-netscape-arguments (list url))))))
  
  (defun browse-url-netscape-reload ()
--- 487,506 ----
                         (list (not (eq (null browse-url-new-window-p)
                                        (null current-prefix-arg))))))
!   (let ((res
! 	 (apply 'call-process "netscape" nil nil nil
! 		(append browse-url-netscape-arguments
! 			(if new-window '("-noraise"))
! 			(list "-remote" 
! 			      (concat "openURL(" url 
! 				      (if new-window ",new-window")
! 				      ")"))))
! 	 ))
!     (if (stringp res)
! 	(error "netscape got signal: %s" res)
!       (or (zerop res)
! 	  (progn			; Netscape not running - start it
! 	    (message "Starting Netscape...")
! 	    (apply 'start-process "netscape" nil "netscape"
! 		   (append browse-url-netscape-arguments (list url))))))))
  
  (defun browse-url-netscape-reload ()
*************** Default to the URL around or before poin
*** 539,544 ****
            (kill-buffer nil)
            ;; Send signal SIGUSR to Mosaic
-           (message "Signalling Mosaic...")
            (signal-process pid browse-url-usr1-signal)
            ;; Or you could try:
            ;; (call-process "kill" nil 0 nil "-USR1" (int-to-string pid))
--- 535,540 ----
            (kill-buffer nil)
            ;; Send signal SIGUSR to Mosaic
            (signal-process pid browse-url-usr1-signal)
+           (message "Signal sent to Mosaic")
            ;; Or you could try:
            ;; (call-process "kill" nil 0 nil "-USR1" (int-to-string pid))
*************** Default to the URL around or before poin
*** 547,551 ****
        (message "Starting Mosaic...")
        (apply 'start-process "xmosaic" nil "xmosaic"
!              (append browse-url-mosaic-arguments (list url))))))
  
  (defun browse-url-cci (url &optional new-window)
--- 543,548 ----
        (message "Starting Mosaic...")
        (apply 'start-process "xmosaic" nil "xmosaic"
!              (append browse-url-mosaic-arguments (list url)))
!       (message "Starting Mosaic...done"))))
  
  (defun browse-url-cci (url &optional new-window)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/buff-menu.el emacs-19.31/lisp/buff-menu.el
*** emacs-19.30/lisp/buff-menu.el	Thu Sep 28 17:34:18 1995
--- emacs-19.31/lisp/buff-menu.el	Sun Jan 14 02:34:30 1996
***************
*** 18,23 ****
  
  ;; 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:
--- 18,24 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/byte-opt.el emacs-19.31/lisp/byte-opt.el
*** emacs-19.30/lisp/byte-opt.el	Thu Sep 21 18:01:11 1995
--- emacs-19.31/lisp/byte-opt.el	Wed Feb 21 14:58:31 1996
***************
*** 20,148 ****
  
  ;; 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:
  
! ;;; ========================================================================
! ;;; "No matter how hard you try, you can't make a racehorse out of a pig.
! ;;; You can, however, make a faster pig."
! ;;;
! ;;; Or, to put it another way, the emacs byte compiler is a VW Bug.  This code
! ;;; makes it be a VW Bug with fuel injection and a turbocharger...  You're 
! ;;; still not going to make it go faster than 70 mph, but it might be easier
! ;;; to get it there.
! ;;;
! 
! ;;; TO DO:
! ;;;
! ;;; (apply '(lambda (x &rest y) ...) 1 (foo))
! ;;;
! ;;; maintain a list of functions known not to access any global variables
! ;;; (actually, give them a 'dynamically-safe property) and then
! ;;;   (let ( v1 v2 ... vM vN ) <...dynamically-safe...> )  ==>
! ;;;   (let ( v1 v2 ... vM ) vN <...dynamically-safe...> )
! ;;; by recursing on this, we might be able to eliminate the entire let.
! ;;; However certain variables should never have their bindings optimized
! ;;; away, because they affect everything.
! ;;;   (put 'debug-on-error 'binding-is-magic t)
! ;;;   (put 'debug-on-abort 'binding-is-magic t)
! ;;;   (put 'debug-on-next-call 'binding-is-magic t)
! ;;;   (put 'mocklisp-arguments 'binding-is-magic t)
! ;;;   (put 'inhibit-quit 'binding-is-magic t)
! ;;;   (put 'quit-flag 'binding-is-magic t)
! ;;;   (put 't 'binding-is-magic t)
! ;;;   (put 'nil 'binding-is-magic t)
! ;;; possibly also
! ;;;   (put 'gc-cons-threshold 'binding-is-magic t)
! ;;;   (put 'track-mouse 'binding-is-magic t)
! ;;; others?
! ;;;
! ;;; Simple defsubsts often produce forms like
! ;;;    (let ((v1 (f1)) (v2 (f2)) ...)
! ;;;       (FN v1 v2 ...))
! ;;; It would be nice if we could optimize this to 
! ;;;    (FN (f1) (f2) ...)
! ;;; but we can't unless FN is dynamically-safe (it might be dynamically
! ;;; referring to the bindings that the lambda arglist established.)
! ;;; One of the uncountable lossages introduced by dynamic scope...
! ;;;
! ;;; Maybe there should be a control-structure that says "turn on 
! ;;; fast-and-loose type-assumptive optimizations here."  Then when
! ;;; we see a form like (car foo) we can from then on assume that
! ;;; the variable foo is of type cons, and optimize based on that.
! ;;; But, this won't win much because of (you guessed it) dynamic 
! ;;; scope.  Anything down the stack could change the value.
! ;;; (Another reason it doesn't work is that it is perfectly valid
! ;;; to call car with a null argument.)  A better approach might
! ;;; be to allow type-specification of the form
! ;;;   (put 'foo 'arg-types '(float (list integer) dynamic))
! ;;;   (put 'foo 'result-type 'bool)
! ;;; It should be possible to have these types checked to a certain
! ;;; degree.
! ;;;
! ;;; collapse common subexpressions
! ;;;
! ;;; It would be nice if redundant sequences could be factored out as well,
! ;;; when they are known to have no side-effects:
! ;;;   (list (+ a b c) (+ a b c))   -->  a b add c add dup list-2
! ;;; but beware of traps like
! ;;;   (cons (list x y) (list x y))
! ;;;
! ;;; Tail-recursion elimination is not really possible in Emacs Lisp.
! ;;; Tail-recursion elimination is almost always impossible when all variables
! ;;; have dynamic scope, but given that the "return" byteop requires the
! ;;; binding stack to be empty (rather than emptying it itself), there can be
! ;;; no truly tail-recursive Emacs Lisp functions that take any arguments or
! ;;; make any bindings.
! ;;;
! ;;; Here is an example of an Emacs Lisp function which could safely be
! ;;; byte-compiled tail-recursively:
! ;;;
! ;;;  (defun tail-map (fn list)
! ;;;    (cond (list
! ;;;           (funcall fn (car list))
! ;;;           (tail-map fn (cdr list)))))
! ;;;
! ;;; However, if there was even a single let-binding around the COND,
! ;;; it could not be byte-compiled, because there would be an "unbind"
! ;;; byte-op between the final "call" and "return."  Adding a 
! ;;; Bunbind_all byteop would fix this.
! ;;;
! ;;;   (defun foo (x y z) ... (foo a b c))
! ;;;   ... (const foo) (varref a) (varref b) (varref c) (call 3) END: (return)
! ;;;   ... (varref a) (varbind x) (varref b) (varbind y) (varref c) (varbind z) (goto 0) END: (unbind-all) (return)
! ;;;   ... (varref a) (varset x) (varref b) (varset y) (varref c) (varset z) (goto 0) END: (return)
! ;;;
! ;;; this also can be considered tail recursion:
! ;;;
! ;;;   ... (const foo) (varref a) (call 1) (goto X) ... X: (return)
! ;;; could generalize this by doing the optimization
! ;;;   (goto X) ... X: (return)  -->  (return)
! ;;;
! ;;; But this doesn't solve all of the problems: although by doing tail-
! ;;; recursion elimination in this way, the call-stack does not grow, the
! ;;; binding-stack would grow with each recursive step, and would eventually
! ;;; overflow.  I don't believe there is any way around this without lexical
! ;;; scope.
! ;;;
! ;;; Wouldn't it be nice if Emacs Lisp had lexical scope.
! ;;;
! ;;; Idea: the form (lexical-scope) in a file means that the file may be 
! ;;; compiled lexically.  This proclamation is file-local.  Then, within 
! ;;; that file, "let" would establish lexical bindings, and "let-dynamic"
! ;;; would do things the old way.  (Or we could use CL "declare" forms.)
! ;;; We'd have to notice defvars and defconsts, since those variables should
! ;;; always be dynamic, and attempting to do a lexical binding of them
! ;;; should simply do a dynamic binding instead.
! ;;; But!  We need to know about variables that were not necessarily defvarred
! ;;; in the file being compiled (doing a boundp check isn't good enough.)
! ;;; Fdefvar() would have to be modified to add something to the plist.
! ;;;
! ;;; A major disadvantage of this scheme is that the interpreter and compiler 
! ;;; would have different semantics for files compiled with (dynamic-scope).  
! ;;; Since this would be a file-local optimization, there would be no way to
! ;;; modify the interpreter to obey this (unless the loader was hacked 
! ;;; in some grody way, but that's a really bad idea.)
  
  ;; Other things to consider:
--- 20,158 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
! ;;; This file has been censored by the Communications Decency Act.
! ;;; That law was passed under the guise of a ban on pornography, but
! ;;; it bans far more than that.  This file did not contain pornography,
! ;;; but it was censored nonetheless.
! 
! ;;; For information on US government censorship of the Internet, and
! ;;; what you can do to bring back freedom of the press, see the web
! ;;; site http://www.vtw.org/
! 
! ;; ========================================================================
! ;; "No matter how hard you try, you can't make a racehorse out of a pig.
! ;; You can, however, make a faster pig."
! ;;
! ;; Or, to put it another way, the emacs byte compiler is a VW Bug.  This code
! ;; makes it be a VW Bug with fuel injection and a turbocharger...  You're 
! ;; still not going to make it go faster than 70 mph, but it might be easier
! ;; to get it there.
! ;;
! 
! ;; TO DO:
! ;;
! ;; (apply '(lambda (x &rest y) ...) 1 (foo))
! ;;
! ;; maintain a list of functions known not to access any global variables
! ;; (actually, give them a 'dynamically-safe property) and then
! ;;   (let ( v1 v2 ... vM vN ) <...dynamically-safe...> )  ==>
! ;;   (let ( v1 v2 ... vM ) vN <...dynamically-safe...> )
! ;; by recursing on this, we might be able to eliminate the entire let.
! ;; However certain variables should never have their bindings optimized
! ;; away, because they affect everything.
! ;;   (put 'debug-on-error 'binding-is-magic t)
! ;;   (put 'debug-on-abort 'binding-is-magic t)
! ;;   (put 'debug-on-next-call 'binding-is-magic t)
! ;;   (put 'mocklisp-arguments 'binding-is-magic t)
! ;;   (put 'inhibit-quit 'binding-is-magic t)
! ;;   (put 'quit-flag 'binding-is-magic t)
! ;;   (put 't 'binding-is-magic t)
! ;;   (put 'nil 'binding-is-magic t)
! ;; possibly also
! ;;   (put 'gc-cons-threshold 'binding-is-magic t)
! ;;   (put 'track-mouse 'binding-is-magic t)
! ;; others?
! ;;
! ;; Simple defsubsts often produce forms like
! ;;    (let ((v1 (f1)) (v2 (f2)) ...)
! ;;       (FN v1 v2 ...))
! ;; It would be nice if we could optimize this to 
! ;;    (FN (f1) (f2) ...)
! ;; but we can't unless FN is dynamically-safe (it might be dynamically
! ;; referring to the bindings that the lambda arglist established.)
! ;; One of the uncountable lossages introduced by dynamic scope...
! ;;
! ;; Maybe there should be a control-structure that says "turn on 
! ;; fast-and-loose type-assumptive optimizations here."  Then when
! ;; we see a form like (car foo) we can from then on assume that
! ;; the variable foo is of type cons, and optimize based on that.
! ;; But, this won't win much because of (you guessed it) dynamic 
! ;; scope.  Anything down the stack could change the value.
! ;; (Another reason it doesn't work is that it is perfectly valid
! ;; to call car with a null argument.)  A better approach might
! ;; be to allow type-specification of the form
! ;;   (put 'foo 'arg-types '(float (list integer) dynamic))
! ;;   (put 'foo 'result-type 'bool)
! ;; It should be possible to have these types checked to a certain
! ;; degree.
! ;;
! ;; collapse common subexpressions
! ;;
! ;; It would be nice if redundant sequences could be factored out as well,
! ;; when they are known to have no side-effects:
! ;;   (list (+ a b c) (+ a b c))   -->  a b add c add dup list-2
! ;; but beware of traps like
! ;;   (cons (list x y) (list x y))
! ;;
! ;; Tail-recursion elimination is not really possible in Emacs Lisp.
! ;; Tail-recursion elimination is almost always impossible when all variables
! ;; have dynamic scope, but given that the "return" byteop requires the
! ;; binding stack to be empty (rather than emptying it itself), there can be
! ;; no truly tail-recursive Emacs Lisp functions that take any arguments or
! ;; make any bindings.
! ;;
! ;; Here is an example of an Emacs Lisp function which could safely be
! ;; byte-compiled tail-recursively:
! ;;
! ;;  (defun tail-map (fn list)
! ;;    (cond (list
! ;;           (funcall fn (car list))
! ;;           (tail-map fn (cdr list)))))
! ;;
! ;; However, if there was even a single let-binding around the COND,
! ;; it could not be byte-compiled, because there would be an "unbind"
! ;; byte-op between the final "call" and "return."  Adding a 
! ;; Bunbind_all byteop would fix this.
! ;;
! ;;   (defun foo (x y z) ... (foo a b c))
! ;;   ... (const foo) (varref a) (varref b) (varref c) (call 3) END: (return)
! ;;   ... (varref a) (varbind x) (varref b) (varbind y) (varref c) (varbind z) (goto 0) END: (unbind-all) (return)
! ;;   ... (varref a) (varset x) (varref b) (varset y) (varref c) (varset z) (goto 0) END: (return)
! ;;
! ;; this also can be considered tail recursion:
! ;;
! ;;   ... (const foo) (varref a) (call 1) (goto X) ... X: (return)
! ;; could generalize this by doing the optimization
! ;;   (goto X) ... X: (return)  -->  (return)
! ;;
! ;; But this doesn't solve all of the problems: although by doing tail-
! ;; recursion elimination in this way, the call-stack does not grow, the
! ;; binding-stack would grow with each recursive step, and would eventually
! ;; overflow.  I don't believe there is any way around this without lexical
! ;; scope.
! ;;
! ;; Wouldn't it be nice if Emacs Lisp had lexical scope.
! ;;
! ;; Idea: the form (lexical-scope) in a file means that the file may be 
! ;; compiled lexically.  This proclamation is file-local.  Then, within 
! ;; that file, "let" would establish lexical bindings, and "let-dynamic"
! ;; would do things the old way.  (Or we could use CL "declare" forms.)
! ;; We'd have to notice defvars and defconsts, since those variables should
! ;; always be dynamic, and attempting to do a lexical binding of them
! ;; should simply do a dynamic binding instead.
! ;; But!  We need to know about variables that were not necessarily defvarred
! ;; in the file being compiled (doing a boundp check isn't good enough.)
! ;; Fdefvar() would have to be modified to add something to the plist.
! ;;
! ;; A major disadvantage of this scheme is that the interpreter and compiler 
! ;; would have different semantics for files compiled with (dynamic-scope).  
! ;; Since this would be a file-local optimization, there would be no way to
! ;; modify the interpreter to obey this (unless the loader was hacked 
! ;; in some grody way, but that's a really bad idea.)
  
  ;; Other things to consider:
***************
*** 329,332 ****
--- 339,343 ----
  		 "attempt to open-code %s with too many arguments" name))
  	    form)
+ 	(setq body (mapcar 'byte-optimize-form body))
  	(let ((newform 
  	       (if bindings
***************
*** 1284,1288 ****
     byte-compile-side-effect-and-error-free-ops))
  
! ;;; This piece of shit is because of the way DEFVAR_BOOL() variables work.
  ;;; Consider the code
  ;;;
--- 1295,1299 ----
     byte-compile-side-effect-and-error-free-ops))
  
! ;;; This crock is because of the way DEFVAR_BOOL variables work.
  ;;; Consider the code
  ;;;
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/byte-run.el emacs-19.31/lisp/byte-run.el
*** emacs-19.30/lisp/byte-run.el	Wed Dec 21 11:57:57 1994
--- emacs-19.31/lisp/byte-run.el	Sun Jan 14 02:34:30 1996
***************
*** 20,30 ****
  
  ;; 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:
  
! ;;; interface to selectively inlining functions.
! ;;; This only happens when source-code optimization is turned on.
  
  ;;; Code:
--- 20,31 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
! ;; interface to selectively inlining functions.
! ;; This only happens when source-code optimization is turned on.
  
  ;;; Code:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/bytecomp.el emacs-19.31/lisp/bytecomp.el
*** emacs-19.30/lisp/bytecomp.el	Fri Nov 10 12:16:25 1995
--- emacs-19.31/lisp/bytecomp.el	Mon Apr  8 12:55:38 1996
***************
*** 1,5 ****
  ;;; bytecomp.el --- compilation of Lisp code into byte code.
  
! ;;; Copyright (C) 1985, 1986, 1987, 1992, 1994 Free Software Foundation, Inc.
  
  ;; Author: Jamie Zawinski <jwz@lucid.com>
--- 1,5 ----
  ;;; bytecomp.el --- compilation of Lisp code into byte code.
  
! ;; Copyright (C) 1985, 1986, 1987, 1992, 1994 Free Software Foundation, Inc.
  
  ;; Author: Jamie Zawinski <jwz@lucid.com>
***************
*** 26,31 ****
  
  ;; 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:
--- 26,32 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 37,154 ****
  ;;; Code:
  
! ;;; ========================================================================
! ;;; Entry points:
! ;;;	byte-recompile-directory, byte-compile-file,
! ;;;     batch-byte-compile, batch-byte-recompile-directory,
! ;;;	byte-compile, compile-defun,
! ;;;	display-call-tree
! ;;; (byte-compile-buffer and byte-compile-and-load-file were turned off
! ;;;  because they are not terribly useful and get in the way of completion.)
! 
! ;;; This version of the byte compiler has the following improvements:
! ;;;  + optimization of compiled code:
! ;;;    - removal of unreachable code;
! ;;;    - removal of calls to side-effectless functions whose return-value
! ;;;      is unused;
! ;;;    - compile-time evaluation of safe constant forms, such as (consp nil)
! ;;;      and (ash 1 6);
! ;;;    - open-coding of literal lambdas;
! ;;;    - peephole optimization of emitted code;
! ;;;    - trivial functions are left uncompiled for speed.
! ;;;  + support for inline functions;
! ;;;  + compile-time evaluation of arbitrary expressions;
! ;;;  + compile-time warning messages for:
! ;;;    - functions being redefined with incompatible arglists;
! ;;;    - functions being redefined as macros, or vice-versa;
! ;;;    - functions or macros defined multiple times in the same file;
! ;;;    - functions being called with the incorrect number of arguments;
! ;;;    - functions being called which are not defined globally, in the 
! ;;;      file, or as autoloads;
! ;;;    - assignment and reference of undeclared free variables;
! ;;;    - various syntax errors;
! ;;;  + correct compilation of nested defuns, defmacros, defvars and defsubsts;
! ;;;  + correct compilation of top-level uses of macros;
! ;;;  + the ability to generate a histogram of functions called.
  
! ;;; User customization variables:
! ;;;
! ;;; byte-compile-verbose	Whether to report the function currently being
! ;;;				compiled in the minibuffer;
! ;;; byte-optimize		Whether to do optimizations; this may be 
! ;;;				t, nil, 'source, or 'byte;
! ;;; byte-optimize-log		Whether to report (in excruciating detail) 
! ;;;				exactly which optimizations have been made.
! ;;;				This may be t, nil, 'source, or 'byte;
! ;;; byte-compile-error-on-warn	Whether to stop compilation when a warning is
! ;;;				produced;
! ;;; byte-compile-delete-errors	Whether the optimizer may delete calls or
! ;;;				variable references that are side-effect-free
! ;;;				except that they may return an error.
! ;;; byte-compile-generate-call-tree	Whether to generate a histogram of
! ;;;				function calls.  This can be useful for 
! ;;;				finding unused functions, as well as simple
! ;;;				performance metering.
! ;;; byte-compile-warnings	List of warnings to issue, or t.  May contain
! ;;;				'free-vars (references to variables not in the
! ;;;					    current lexical scope)
! ;;;				'unresolved (calls to unknown functions)
! ;;;				'callargs  (lambda calls with args that don't
! ;;;					    match the lambda's definition)
! ;;;				'redefine  (function cell redefined from
! ;;;					    a macro to a lambda or vice versa,
! ;;;					    or redefined to take other args)
! ;;;				'obsolete  (obsolete variables and functions)
! ;;; byte-compile-compatibility	Whether the compiler should
! ;;;				generate .elc files which can be loaded into
! ;;;				generic emacs 18.
! ;;; emacs-lisp-file-regexp	Regexp for the extension of source-files;
! ;;;				see also the function byte-compile-dest-file.
  
! ;;; New Features:
! ;;;
! ;;;  o	The form `defsubst' is just like `defun', except that the function
! ;;;	generated will be open-coded in compiled code which uses it.  This
! ;;;	means that no function call will be generated, it will simply be
! ;;;	spliced in.  Lisp functions calls are very slow, so this can be a
! ;;;	big win.
! ;;;
! ;;;	You can generally accomplish the same thing with `defmacro', but in
! ;;;	that case, the defined procedure can't be used as an argument to
! ;;;	mapcar, etc.
! ;;;
! ;;;  o	You can also open-code one particular call to a function without
! ;;;	open-coding all calls.  Use the 'inline' form to do this, like so:
! ;;;
! ;;;		(inline (foo 1 2 3))	;; `foo' will be open-coded
! ;;;	or...
! ;;;		(inline			;;  `foo' and `baz' will be 
! ;;;		 (foo 1 2 3 (bar 5))	;; open-coded, but `bar' will not.
! ;;;		 (baz 0))
! ;;;
! ;;;  o	It is possible to open-code a function in the same file it is defined
! ;;;	in without having to load that file before compiling it.  the
! ;;;	byte-compiler has been modified to remember function definitions in
! ;;;	the compilation environment in the same way that it remembers macro
! ;;;	definitions.
! ;;;
! ;;;  o  Forms like ((lambda ...) ...) are open-coded.
! ;;;
! ;;;  o  The form `eval-when-compile' is like progn, except that the body
! ;;;     is evaluated at compile-time.  When it appears at top-level, this
! ;;;     is analogous to the Common Lisp idiom (eval-when (compile) ...).
! ;;;     When it does not appear at top-level, it is similar to the
! ;;;     Common Lisp #. reader macro (but not in interpreted code).
! ;;;
! ;;;  o  The form `eval-and-compile' is similar to eval-when-compile, but
! ;;;	the whole form is evalled both at compile-time and at run-time.
! ;;;
! ;;;  o  The command compile-defun is analogous to eval-defun.
! ;;;
! ;;;  o  If you run byte-compile-file on a filename which is visited in a 
! ;;;     buffer, and that buffer is modified, you are asked whether you want
! ;;;     to save the buffer before compiling.
! ;;;
! ;;;  o  byte-compiled files now start with the string `;ELC'.
! ;;;     Some versions of `file' can be customized to recognize that.
  
  (require 'backquote)
--- 38,155 ----
  ;;; Code:
  
! ;; ========================================================================
! ;; Entry points:
! ;;	byte-recompile-directory, byte-compile-file,
! ;;     batch-byte-compile, batch-byte-recompile-directory,
! ;;	byte-compile, compile-defun,
! ;;	display-call-tree
! ;; (byte-compile-buffer and byte-compile-and-load-file were turned off
! ;;  because they are not terribly useful and get in the way of completion.)
! 
! ;; This version of the byte compiler has the following improvements:
! ;;  + optimization of compiled code:
! ;;    - removal of unreachable code;
! ;;    - removal of calls to side-effectless functions whose return-value
! ;;      is unused;
! ;;    - compile-time evaluation of safe constant forms, such as (consp nil)
! ;;      and (ash 1 6);
! ;;    - open-coding of literal lambdas;
! ;;    - peephole optimization of emitted code;
! ;;    - trivial functions are left uncompiled for speed.
! ;;  + support for inline functions;
! ;;  + compile-time evaluation of arbitrary expressions;
! ;;  + compile-time warning messages for:
! ;;    - functions being redefined with incompatible arglists;
! ;;    - functions being redefined as macros, or vice-versa;
! ;;    - functions or macros defined multiple times in the same file;
! ;;    - functions being called with the incorrect number of arguments;
! ;;    - functions being called which are not defined globally, in the 
! ;;      file, or as autoloads;
! ;;    - assignment and reference of undeclared free variables;
! ;;    - various syntax errors;
! ;;  + correct compilation of nested defuns, defmacros, defvars and defsubsts;
! ;;  + correct compilation of top-level uses of macros;
! ;;  + the ability to generate a histogram of functions called.
  
! ;; User customization variables:
! ;;
! ;; byte-compile-verbose	Whether to report the function currently being
! ;;				compiled in the minibuffer;
! ;; byte-optimize		Whether to do optimizations; this may be 
! ;;				t, nil, 'source, or 'byte;
! ;; byte-optimize-log		Whether to report (in excruciating detail) 
! ;;				exactly which optimizations have been made.
! ;;				This may be t, nil, 'source, or 'byte;
! ;; byte-compile-error-on-warn	Whether to stop compilation when a warning is
! ;;				produced;
! ;; byte-compile-delete-errors	Whether the optimizer may delete calls or
! ;;				variable references that are side-effect-free
! ;;				except that they may return an error.
! ;; byte-compile-generate-call-tree	Whether to generate a histogram of
! ;;				function calls.  This can be useful for 
! ;;				finding unused functions, as well as simple
! ;;				performance metering.
! ;; byte-compile-warnings	List of warnings to issue, or t.  May contain
! ;;				'free-vars (references to variables not in the
! ;;					    current lexical scope)
! ;;				'unresolved (calls to unknown functions)
! ;;				'callargs  (lambda calls with args that don't
! ;;					    match the lambda's definition)
! ;;				'redefine  (function cell redefined from
! ;;					    a macro to a lambda or vice versa,
! ;;					    or redefined to take other args)
! ;;				'obsolete  (obsolete variables and functions)
! ;; byte-compile-compatibility	Whether the compiler should
! ;;				generate .elc files which can be loaded into
! ;;				generic emacs 18.
! ;; emacs-lisp-file-regexp	Regexp for the extension of source-files;
! ;;				see also the function byte-compile-dest-file.
  
! ;; New Features:
! ;;
! ;;  o	The form `defsubst' is just like `defun', except that the function
! ;;	generated will be open-coded in compiled code which uses it.  This
! ;;	means that no function call will be generated, it will simply be
! ;;	spliced in.  Lisp functions calls are very slow, so this can be a
! ;;	big win.
! ;;
! ;;	You can generally accomplish the same thing with `defmacro', but in
! ;;	that case, the defined procedure can't be used as an argument to
! ;;	mapcar, etc.
! ;;
! ;;  o	You can also open-code one particular call to a function without
! ;;	open-coding all calls.  Use the 'inline' form to do this, like so:
! ;;
! ;;		(inline (foo 1 2 3))	;; `foo' will be open-coded
! ;;	or...
! ;;		(inline			;;  `foo' and `baz' will be 
! ;;		 (foo 1 2 3 (bar 5))	;; open-coded, but `bar' will not.
! ;;		 (baz 0))
! ;;
! ;;  o	It is possible to open-code a function in the same file it is defined
! ;;	in without having to load that file before compiling it.  the
! ;;	byte-compiler has been modified to remember function definitions in
! ;;	the compilation environment in the same way that it remembers macro
! ;;	definitions.
! ;;
! ;;  o  Forms like ((lambda ...) ...) are open-coded.
! ;;
! ;;  o  The form `eval-when-compile' is like progn, except that the body
! ;;     is evaluated at compile-time.  When it appears at top-level, this
! ;;     is analogous to the Common Lisp idiom (eval-when (compile) ...).
! ;;     When it does not appear at top-level, it is similar to the
! ;;     Common Lisp #. reader macro (but not in interpreted code).
! ;;
! ;;  o  The form `eval-and-compile' is similar to eval-when-compile, but
! ;;	the whole form is evalled both at compile-time and at run-time.
! ;;
! ;;  o  The command compile-defun is analogous to eval-defun.
! ;;
! ;;  o  If you run byte-compile-file on a filename which is visited in a 
! ;;     buffer, and that buffer is modified, you are asked whether you want
! ;;     to save the buffer before compiling.
! ;;
! ;;  o  byte-compiled files now start with the string `;ELC'.
! ;;     Some versions of `file' can be customized to recognize that.
  
  (require 'backquote)
*************** otherwise pop it")
*** 749,760 ****
  		      (not (eq byte-compile-current-form
  			       byte-compile-last-warned-form))))
! 	     (message (format "While compiling %s%s:"
! 			(or byte-compile-current-form "toplevel forms")
! 			(if byte-compile-current-file
! 			    (if (stringp byte-compile-current-file)
! 				(concat " in file " byte-compile-current-file)
! 			      (concat " in buffer "
! 				      (buffer-name byte-compile-current-file)))
! 			    ""))))
  	 (message "  %s" string))
  	(t
--- 750,761 ----
  		      (not (eq byte-compile-current-form
  			       byte-compile-last-warned-form))))
! 	     (message "While compiling %s%s:"
! 		      (or byte-compile-current-form "toplevel forms")
! 		      (if byte-compile-current-file
! 			  (if (stringp byte-compile-current-file)
! 			      (concat " in file " byte-compile-current-file)
! 			    (concat " in buffer "
! 				    (buffer-name byte-compile-current-file)))
! 			"")))
  	 (message "  %s" string))
  	(t
*************** otherwise pop it")
*** 939,943 ****
    (not (or
  	 (> (car new) (car old))  ; requires more args now
! 	 (and (null (cdr old))    ; tooks rest-args, doesn't any more
  	      (cdr new))
  	 (and (cdr new) (cdr old) ; can't take as many args now
--- 940,944 ----
    (not (or
  	 (> (car new) (car old))  ; requires more args now
! 	 (and (null (cdr old))    ; took rest-args, doesn't any more
  	      (cdr new))
  	 (and (cdr new) (cdr old) ; can't take as many args now
*************** With argument, insert value in current b
*** 1382,1386 ****
  	(byte-compile-flush-pending)
  	(byte-compile-warn-about-unresolved-functions)
! 	;; SHould we always do this?  When calling multiple files, it
  	;; would be useful to delay this warning until all have
  	;; been compiled.
--- 1383,1387 ----
  	(byte-compile-flush-pending)
  	(byte-compile-warn-about-unresolved-functions)
! 	;; Should we always do this?  When calling multiple files, it
  	;; would be useful to delay this warning until all have
  	;; been compiled.
*************** list that represents a doc string refere
*** 1487,1490 ****
--- 1488,1492 ----
  	 (and (>= (nth 1 info) 0)
  	      dynamic-docstrings
+ 	      (not byte-compile-compatibility)
  	      (progn
  		;; Make the doc string start at beginning of line
*************** For example, invoke `emacs -batch -f bat
*** 3324,3327 ****
--- 3326,3333 ----
    "use after-change-functions; which is a list of functions rather than a single function.")
  (make-obsolete-variable 'font-lock-doc-string-face 'font-lock-string-face)
+ (make-obsolete-variable 'post-command-idle-hook
+   "use timers instead, with `run-with-idle-timer'.")
+ (make-obsolete-variable 'post-command-idle-delay
+   "use timers instead, with `run-with-idle-timer'.")
  
  (provide 'byte-compile)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/c-mode.el emacs-19.31/lisp/c-mode.el
*** emacs-19.30/lisp/c-mode.el	Thu Jul 27 19:30:17 1995
--- emacs-19.31/lisp/c-mode.el	Wed Feb 21 02:29:00 1996
***************
*** 1,3 ****
--- 1,4 ----
  ;;; c-mode.el --- C code editing commands for Emacs
+ 
  ;; Copyright (C) 1985, 86, 87, 92, 94, 95 Free Software Foundation, Inc.
  
***************
*** 18,23 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** regardless of where in the line point is
*** 182,188 ****
  ;; This is actually the expression for C++ mode, but it's used for C too.
  (defvar c-imenu-generic-expression
!   (` 
     ((nil
!      (, 
        (concat
         "^"				  ; beginning of line is required
--- 184,190 ----
  ;; This is actually the expression for C++ mode, but it's used for C too.
  (defvar c-imenu-generic-expression
!   (`
     ((nil
!      (,
        (concat
         "^"				  ; beginning of line is required
*************** regardless of where in the line point is
*** 190,194 ****
         "\\([a-zA-Z0-9_:]+[ \t]+\\)?"	  ; type specs; there can be no
         "\\([a-zA-Z0-9_:]+[ \t]+\\)?"	  ; more than 3 tokens, right?
!        
         "\\("				  ; last type spec including */&
         "[a-zA-Z0-9_:]+"
--- 192,196 ----
         "\\([a-zA-Z0-9_:]+[ \t]+\\)?"	  ; type specs; there can be no
         "\\([a-zA-Z0-9_:]+[ \t]+\\)?"	  ; more than 3 tokens, right?
! 
         "\\("				  ; last type spec including */&
         "[a-zA-Z0-9_:]+"
*************** regardless of where in the line point is
*** 197,201 ****
         "\\("			      ; name; take that into the imenu entry
         "[a-zA-Z0-9_:~]+"		      ; member function, ctor or dtor...
! 					; (may not contain * because then 
  					; "a::operator char*" would become "char*"!)
         "\\|"
--- 199,203 ----
         "\\("			      ; name; take that into the imenu entry
         "[a-zA-Z0-9_:~]+"		      ; member function, ctor or dtor...
! 					; (may not contain * because then
  					; "a::operator char*" would become "char*"!)
         "\\|"
*************** regardless of where in the line point is
*** 208,215 ****
  					; surrounding the parameters
  					; (like "int foo(int a=bar()) {...}"
!        
!        )) 6)    
!     ("Class" 
!      (, (concat 
  	 "^"				   ; beginning of line is required
  	 "\\(template[ \t]*<[^>]+>[ \t]*\\)?" ; there may be a "template <...>"
--- 210,217 ----
  					; surrounding the parameters
  					; (like "int foo(int a=bar()) {...}"
! 
!        )) 6)
!     ("Class"
!      (, (concat
  	 "^"				   ; beginning of line is required
  	 "\\(template[ \t]*<[^>]+>[ \t]*\\)?" ; there may be a "template <...>"
*************** regardless of where in the line point is
*** 222,226 ****
  ;; the indexes.
  ;    ("Prototypes"
! ;     (, 
  ;      (concat
  ;       "^"				  ; beginning of line is required
--- 224,228 ----
  ;; the indexes.
  ;    ("Prototypes"
! ;     (,
  ;      (concat
  ;       "^"				  ; beginning of line is required
*************** regardless of where in the line point is
*** 228,232 ****
  ;       "\\([a-zA-Z0-9_:]+[ \t]+\\)?"	  ; type specs; there can be no
  ;       "\\([a-zA-Z0-9_:]+[ \t]+\\)?"	  ; more than 3 tokens, right?
!        
  ;       "\\("				  ; last type spec including */&
  ;       "[a-zA-Z0-9_:]+"
--- 230,234 ----
  ;       "\\([a-zA-Z0-9_:]+[ \t]+\\)?"	  ; type specs; there can be no
  ;       "\\([a-zA-Z0-9_:]+[ \t]+\\)?"	  ; more than 3 tokens, right?
! 
  ;       "\\("				  ; last type spec including */&
  ;       "[a-zA-Z0-9_:]+"
*************** regardless of where in the line point is
*** 235,239 ****
  ;       "\\("			      ; name; take that into the imenu entry
  ;       "[a-zA-Z0-9_:~]+"		      ; member function, ctor or dtor...
! ;					; (may not contain * because then 
  ;					; "a::operator char*" would become "char*"!)
  ;       "\\|"
--- 237,241 ----
  ;       "\\("			      ; name; take that into the imenu entry
  ;       "[a-zA-Z0-9_:~]+"		      ; member function, ctor or dtor...
! ;					; (may not contain * because then
  ;					; "a::operator char*" would become "char*"!)
  ;       "\\|"
*************** regardless of where in the line point is
*** 245,250 ****
  ;					; catch cases with () inside the parentheses
  ;					; surrounding the parameters
! ;					; (like "int foo(int a=bar());"       
! ;       )) 6)    
  ;    ("Struct"
  ;     (, (concat
--- 247,252 ----
  ;					; catch cases with () inside the parentheses
  ;					; surrounding the parameters
! ;					; (like "int foo(int a=bar());"
! ;       )) 6)
  ;    ("Struct"
  ;     (, (concat
*************** preserving the comment indentation or li
*** 419,423 ****
  	       ;; Lines containing just a comment start or just an end
  	       ;; should not be filled into paragraphs they are next to.
! 	       (concat 
  		paragraph-start
  		"\\|[ \t]*/\\*[ \t]*$\\|[ \t]*\\*/[ \t]*$\\|[ \t/*]*$"))
--- 421,425 ----
  	       ;; Lines containing just a comment start or just an end
  	       ;; should not be filled into paragraphs they are next to.
! 	       (concat
  		paragraph-start
  		"\\|[ \t]*/\\*[ \t]*$\\|[ \t]*\\*/[ \t]*$\\|[ \t/*]*$"))
*************** preserving the comment indentation or li
*** 530,534 ****
  		 ;; Lines containing just a comment start or just an end
  		 ;; should not be filled into paragraphs they are next to.
! 		 (concat 
  		  paragraph-start
  		  "\\|[ \t]*/\\*[ \t]*$\\|[ \t]*\\*/[ \t]*$\\|[ \t/*]*$"))
--- 532,536 ----
  		 ;; Lines containing just a comment start or just an end
  		 ;; should not be filled into paragraphs they are next to.
! 		 (concat
  		  paragraph-start
  		  "\\|[ \t]*/\\*[ \t]*$\\|[ \t]*\\*/[ \t]*$\\|[ \t/*]*$"))
*************** preserving the comment indentation or li
*** 548,553 ****
  				      (goto-char comment-start-place)
  				    (search-backward "/*"))
! 				  ;; Protect text before the comment start 
! 				  ;; by excluding it.  Add spaces to bring back 
  				  ;; proper indentation of that point.
  				  (let ((column (current-column)))
--- 550,555 ----
  				      (goto-char comment-start-place)
  				    (search-backward "/*"))
! 				  ;; Protect text before the comment start
! 				  ;; by excluding it.  Add spaces to bring back
  				  ;; proper indentation of that point.
  				  (let ((column (current-column)))
*************** Returns nil if line starts inside a stri
*** 970,974 ****
  		     ;; if it is before the line we want to indent.
  		     (and (< (point) indent-point)
! 			  (- 
  			   (if (> colon-line-end (point))
  			       (- (current-indentation) c-label-offset)
--- 972,976 ----
  		     ;; if it is before the line we want to indent.
  		     (and (< (point) indent-point)
! 			  (-
  			   (if (> colon-line-end (point))
  			       (- (current-indentation) c-label-offset)
*************** If within a string or comment, move by s
*** 1173,1177 ****
  	(re-search-backward "[;}]")
  	(forward-char 1))
!     (error 
       (let ((beg (point)))
         (backward-up-list -1)
--- 1175,1179 ----
  	(re-search-backward "[;}]")
  	(forward-char 1))
!     (error
       (let ((beg (point)))
         (backward-up-list -1)
*************** With no argument, inserts backslashes an
*** 1510,1514 ****
  With an argument, deletes the backslashes.
  
! This function does not modify the last line of the region if the region ends 
  right at the start of the following line; it does not modify blank lines
  at the start of the region.  So you can put the region around an entire macro
--- 1512,1516 ----
  With an argument, deletes the backslashes.
  
! This function does not modify the last line of the region if the region ends
  right at the start of the following line; it does not modify blank lines
  at the start of the region.  So you can put the region around an entire macro
*************** move backward across a preprocessor cond
*** 1643,1646 ****
--- 1645,1650 ----
      (push-mark)
      (goto-char new)))
+ 
+ (provide 'c-mode)
  
  ;;; c-mode.el ends here
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/cal-china.el emacs-19.31/lisp/cal-china.el
*** emacs-19.30/lisp/cal-china.el	Fri Nov 17 12:40:27 1995
--- emacs-19.31/lisp/cal-china.el	Mon Feb 26 13:40:34 1996
***************
*** 1,3 ****
! ;;; cal-chinese.el --- calendar functions for the Chinese calendar.
  
  ;; Copyright (C) 1995 Free Software Foundation, Inc.
--- 1,3 ----
! ;;; cal-china.el --- calendar functions for the Chinese calendar.
  
  ;; Copyright (C) 1995 Free Software Foundation, Inc.
***************
*** 20,25 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** Gregorian date Sunday, December 31, 1 BC
*** 326,330 ****
             (list chinese-new-year
                   (format "Chinese New Year (%s)"
!                          (calendar-chinese-sexagisimal-name (+ y 57))))))))))
  
  (defun calendar-chinese-date-string (&optional date)
--- 327,331 ----
             (list chinese-new-year
                   (format "Chinese New Year (%s)"
!                          (calendar-chinese-sexagesimal-name (+ y 57))))))))))
  
  (defun calendar-chinese-date-string (&optional date)
*************** Defaults to today's date if DATE is not 
*** 348,352 ****
      (format "Cycle %s, year %s (%s), %smonth %s%s, day %s (%s)"
              cycle
!             year (calendar-chinese-sexagisimal-name year)
              (if (not (integerp month))
                  "second "
--- 349,353 ----
      (format "Cycle %s, year %s (%s), %smonth %s%s, day %s (%s)"
              cycle
!             year (calendar-chinese-sexagesimal-name year)
              (if (not (integerp month))
                  "second "
*************** Defaults to today's date if DATE is not 
*** 356,366 ****
              (floor month)
              (if (integerp month)
!                 (format " (%s)" (calendar-chinese-sexagisimal-name
                                   (+ (* 5 year) month 44)))
                "")
!             day (calendar-chinese-sexagisimal-name (+ a-date 15)))))
  
! (defun calendar-chinese-sexagisimal-name (n)
!   "The N-th name of the Chinese sexagisimal cycle.
  N congruent to 1 gives the first name, N congruent to 2 gives the second name,
  ..., N congruent to 60 gives the sixtieth name."
--- 357,367 ----
              (floor month)
              (if (integerp month)
!                 (format " (%s)" (calendar-chinese-sexagesimal-name
                                   (+ (* 5 year) month 44)))
                "")
!             day (calendar-chinese-sexagesimal-name (+ a-date 15)))))
  
! (defun calendar-chinese-sexagesimal-name (n)
!   "The N-th name of the Chinese sexagesimal cycle.
  N congruent to 1 gives the first name, N congruent to 2 gives the second name,
  ..., N congruent to 60 gives the sixtieth name."
*************** Echo Chinese date unless NOECHO is t."
*** 450,454 ****
    (format "Chinese date: %s" (calendar-chinese-date-string date)))
  
! (provide 'cal-chinese)
  
! ;;; cal-chinese ends here
--- 451,455 ----
    (format "Chinese date: %s" (calendar-chinese-date-string date)))
  
! (provide 'cal-china)
  
! ;;; cal-china.el ends here
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/cal-coptic.el emacs-19.31/lisp/cal-coptic.el
*** emacs-19.30/lisp/cal-coptic.el	Fri Nov 17 12:41:22 1995
--- emacs-19.31/lisp/cal-coptic.el	Thu Feb 15 10:17:51 1996
***************
*** 20,25 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 39,44 ****
  
  (defvar coptic-calendar-month-name-array
!   ["Tot" "Babe" "Hatur" "Kihak" "Tube" "Amshir" "Baramhat" "Barmuda"
!    "Bashnas" "Bauna" "Abib" "Misra" "Nisi"])
  
  (defvar coptic-calendar-epoch (calendar-absolute-from-julian '(8 29 284))
--- 40,45 ----
  
  (defvar coptic-calendar-month-name-array
!   ["Tut" "Babah" "Hatur" "Kiyahk" "Tubah" "Amshir" "Baramhat" "Barmundah"
!    "Bashans" "Baunah" "Abib" "Misra" "al-Nasi"])
  
  (defvar coptic-calendar-epoch (calendar-absolute-from-julian '(8 29 284))
*************** Echo Coptic date unless NOECHO is t."
*** 170,178 ****
  
  (defconst ethiopic-calendar-month-name-array
!   ["Maskarram" "Tekemt" "Hadar" "Tahsas" "Tarr" "Yekatit" "Magawit" "Miaziah"
!    "Genbot" "Sanni" "Hamle" "Nas'hi" "Pagnem"])
  
! (defconst ethiopic-calendar-epoch -2006079
!   "Absolute date of start of Ethiopic calendar = August 29, 5493 B.C.E. (Julian).")
  
  (defconst ethiopic-name "Ethiopic")
--- 171,179 ----
  
  (defconst ethiopic-calendar-month-name-array
!   ["Maskaram" "Teqemt" "Khedar" "Takhsas" "Ter" "Yakatit" "Magabit" "Miyazya"
!    "Genbot" "Sane" "Hamle" "Nahas" "Paguem"])
  
! (defconst ethiopic-calendar-epoch 2430
!   "Absolute date of start of Ethiopic calendar = August 29, 7 C.E. (Julian).")
  
  (defconst ethiopic-name "Ethiopic")
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/cal-dst.el emacs-19.31/lisp/cal-dst.el
*** emacs-19.30/lisp/cal-dst.el	Wed Sep 20 22:55:29 1995
--- emacs-19.31/lisp/cal-dst.el	Sun Jan 14 02:34:30 1996
***************
*** 21,26 ****
  
  ;; 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:
--- 21,27 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** If the locale never uses daylight saving
*** 333,357 ****
  (defun dst-in-effect (date)
    "True if on absolute DATE daylight savings time is in effect.
! Fractional part of DATE is time of day."
    (let* ((year (extract-calendar-year
                  (calendar-gregorian-from-absolute (floor date))))
!          (dst-starts (and (eval calendar-daylight-savings-starts)
                            (+ (calendar-absolute-from-gregorian
!                               (eval calendar-daylight-savings-starts))
                               (/ calendar-daylight-savings-starts-time
                                  60.0 24.0))))
!          (dst-ends (and (eval calendar-daylight-savings-ends)
                          (+ (calendar-absolute-from-gregorian
!                             (eval calendar-daylight-savings-ends))
                             (/ (- calendar-daylight-savings-ends-time
                                   calendar-daylight-time-offset)
                                60.0 24.0)))))
!     (and (and dst-starts dst-ends
!               (or (and (< dst-starts dst-ends);; northern hemi.
!                        (<= dst-starts date) (< date dst-ends))
!                   (and (< dst-ends dst-starts);; southern hemi.
!                        (<= dst-starts date) (< date dst-ends))
!                   (and dst-starts (not dst-ends) (<= dst-starts date))
!                   (and dst-ends (not dst-starts) (< date dst-ends)))))))
  
  (defun dst-adjust-time (date time &optional style)
--- 334,357 ----
  (defun dst-in-effect (date)
    "True if on absolute DATE daylight savings time is in effect.
! Fractional part of DATE is local standard time of day."
    (let* ((year (extract-calendar-year
                  (calendar-gregorian-from-absolute (floor date))))
!          (dst-starts-gregorian (eval calendar-daylight-savings-starts))
!          (dst-ends-gregorian (eval calendar-daylight-savings-ends))
!          (dst-starts (and dst-starts-gregorian
                            (+ (calendar-absolute-from-gregorian
!                               dst-starts-gregorian)
                               (/ calendar-daylight-savings-starts-time
                                  60.0 24.0))))
!          (dst-ends (and dst-ends-gregorian
                          (+ (calendar-absolute-from-gregorian
!                             dst-ends-gregorian)
                             (/ (- calendar-daylight-savings-ends-time
                                   calendar-daylight-time-offset)
                                60.0 24.0)))))
!     (and dst-starts dst-ends
!          (if (< dst-starts dst-ends)
!              (and (<= dst-starts date) (< date dst-ends))
!            (or (<= dst-starts date) (< date dst-ends))))))
  
  (defun dst-adjust-time (date time &optional style)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/cal-french.el emacs-19.31/lisp/cal-french.el
*** emacs-19.30/lisp/cal-french.el	Wed Sep 20 22:52:21 1995
--- emacs-19.31/lisp/cal-french.el	Sun Jan 14 02:34:30 1996
***************
*** 20,25 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/cal-hebrew.el emacs-19.31/lisp/cal-hebrew.el
*** emacs-19.30/lisp/cal-hebrew.el	Wed Sep 20 23:06:07 1995
--- emacs-19.31/lisp/cal-hebrew.el	Sun Jan 14 02:34:30 1996
***************
*** 21,26 ****
  
  ;; 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:
--- 21,27 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** nil if it is not visible in the current 
*** 319,323 ****
                     "Selichot (night)")
               (list (calendar-gregorian-from-absolute (1- abs-r-h))
!                    "Erev Rosh HaShannah")
               (list (calendar-gregorian-from-absolute (1+ abs-r-h))
                     "Rosh HaShanah (second day)")
--- 320,324 ----
                     "Selichot (night)")
               (list (calendar-gregorian-from-absolute (1- abs-r-h))
!                    "Erev Rosh HaShanah")
               (list (calendar-gregorian-from-absolute (1+ abs-r-h))
                     "Rosh HaShanah (second day)")
*************** Entry applies if date is Rosh Hodesh, th
*** 1002,1011 ****
              ((h-year (extract-calendar-year
                        (calendar-hebrew-from-absolute d)))
!              (rosh-hashannah
                (calendar-absolute-from-hebrew (list 7 1 h-year)))
               (passover
                (calendar-absolute-from-hebrew (list 1 15 h-year)))
!              (rosh-hashannah-day
!               (aref calendar-day-name-array (% rosh-hashannah 7)))
               (passover-day
                (aref calendar-day-name-array (% passover 7)))
--- 1003,1012 ----
              ((h-year (extract-calendar-year
                        (calendar-hebrew-from-absolute d)))
!              (rosh-hashanah
                (calendar-absolute-from-hebrew (list 7 1 h-year)))
               (passover
                (calendar-absolute-from-hebrew (list 1 15 h-year)))
!              (rosh-hashanah-day
!               (aref calendar-day-name-array (% rosh-hashanah 7)))
               (passover-day
                (aref calendar-day-name-array (% passover 7)))
*************** Entry applies if date is Rosh Hodesh, th
*** 1018,1024 ****
                (symbol-value
                 (intern (format "hebrew-calendar-year-%s-%s-%s";; keviah
!                                rosh-hashannah-day type passover-day))))
               (first-saturday;; of Hebrew year
!               (calendar-dayname-on-or-before 6 (+ 6 rosh-hashannah)))
               (saturday;; which Saturday of the Hebrew year
                (/ (- d first-saturday) 7))
--- 1019,1025 ----
                (symbol-value
                 (intern (format "hebrew-calendar-year-%s-%s-%s";; keviah
!                                rosh-hashanah-day type passover-day))))
               (first-saturday;; of Hebrew year
!               (calendar-dayname-on-or-before 6 (+ 6 rosh-hashanah)))
               (saturday;; which Saturday of the Hebrew year
                (/ (- d first-saturday) 7))
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/cal-islam.el emacs-19.31/lisp/cal-islam.el
*** emacs-19.30/lisp/cal-islam.el	Wed Sep 20 23:06:56 1995
--- emacs-19.31/lisp/cal-islam.el	Mon Feb 26 13:40:30 1996
***************
*** 1,3 ****
! ;;; cal-islamic.el --- calendar functions for the Islamic calendar.
  
  ;; Copyright (C) 1995 Free Software Foundation, Inc.
--- 1,3 ----
! ;;; cal-islam.el --- calendar functions for the Islamic calendar.
  
  ;; Copyright (C) 1995 Free Software Foundation, Inc.
***************
*** 20,25 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** Prefix arg will make the entry nonmarkin
*** 487,491 ****
       arg)))
  
! (provide 'cal-islamic)
  
! ;;; cal-islamic.el ends here
--- 488,492 ----
       arg)))
  
! (provide 'cal-islam)
  
! ;;; cal-islam.el ends here
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/cal-iso.el emacs-19.31/lisp/cal-iso.el
*** emacs-19.30/lisp/cal-iso.el	Wed Sep 20 23:07:28 1995
--- emacs-19.31/lisp/cal-iso.el	Sun Jan 14 02:34:30 1996
***************
*** 20,25 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/cal-julian.el emacs-19.31/lisp/cal-julian.el
*** emacs-19.30/lisp/cal-julian.el	Wed Sep 20 23:07:55 1995
--- emacs-19.31/lisp/cal-julian.el	Wed Apr 24 19:36:34 1996
***************
*** 20,25 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** nil if it is not visible in the current 
*** 162,166 ****
  
  (defun calendar-absolute-from-astro (d)
!   "Absolute date of astronical (Julian) day number D."
    (- d 1721424.5))
  
--- 163,167 ----
  
  (defun calendar-absolute-from-astro (d)
!   "Absolute date of astronomical (Julian) day number D."
    (- d 1721424.5))
  
*************** Defaults to today's date if DATE is not 
*** 182,186 ****
    (interactive)
    (message
!    "Astronomical (Julian) day number (after noon UTC): %s"
     (calendar-astro-date-string (calendar-cursor-to-date t))))
  
--- 183,187 ----
    (interactive)
    (message
!    "Astronomical (Julian) day number (at noon UTC): %s.0"
     (calendar-astro-date-string (calendar-cursor-to-date t))))
  
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/cal-mayan.el emacs-19.31/lisp/cal-mayan.el
*** emacs-19.30/lisp/cal-mayan.el	Wed Sep 20 22:51:37 1995
--- emacs-19.31/lisp/cal-mayan.el	Sun Jan 14 02:34:30 1996
***************
*** 21,26 ****
  
  ;; 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:
--- 21,27 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** Returns nil if such a tzolkin-haab combi
*** 283,287 ****
  (defun calendar-next-calendar-round-date
    (tzolkin-date haab-date &optional noecho)
!   "Move cursor to next instance of Mayan HAAB-DATE TZOKLIN-DATE combination.
  Echo Mayan date if NOECHO is t."
    (interactive (list (calendar-read-mayan-tzolkin-date)
--- 284,288 ----
  (defun calendar-next-calendar-round-date
    (tzolkin-date haab-date &optional noecho)
!   "Move cursor to next instance of Mayan HAAB-DATE TZOLKIN-DATE combination.
  Echo Mayan date if NOECHO is t."
    (interactive (list (calendar-read-mayan-tzolkin-date)
*************** Echo Mayan date if NOECHO is t."
*** 300,304 ****
  (defun calendar-previous-calendar-round-date
    (tzolkin-date haab-date &optional noecho)
!   "Move to previous instance of Mayan TZOKLIN-DATE HAAB-DATE combination.
  Echo Mayan date if NOECHO is t."
    (interactive (list (calendar-read-mayan-tzolkin-date)
--- 301,305 ----
  (defun calendar-previous-calendar-round-date
    (tzolkin-date haab-date &optional noecho)
!   "Move to previous instance of Mayan TZOLKIN-DATE HAAB-DATE combination.
  Echo Mayan date if NOECHO is t."
    (interactive (list (calendar-read-mayan-tzolkin-date)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/cal-menu.el emacs-19.31/lisp/cal-menu.el
*** emacs-19.30/lisp/cal-menu.el	Tue Oct 24 11:51:04 1995
--- emacs-19.31/lisp/cal-menu.el	Wed Apr 24 19:34:49 1996
***************
*** 21,26 ****
  
  ;; 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:
--- 21,27 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 38,41 ****
--- 39,43 ----
  
  (define-key calendar-mode-map [menu-bar edit] 'undefined)
+ (define-key calendar-mode-map [menu-bar search] 'undefined)
  
  (define-key calendar-mode-map [down-mouse-2] 'calendar-mouse-2-date-menu)
***************
*** 111,114 ****
--- 113,118 ----
  (define-key calendar-mode-map [menu-bar goto islamic]
    '("Islamic Date" . calendar-goto-islamic-date))
+ (define-key calendar-mode-map [menu-bar goto persian]
+   '("Persian Date" . calendar-goto-persian-date))
  (define-key calendar-mode-map [menu-bar goto hebrew]
    '("Hebrew Date" . calendar-goto-hebrew-date))
***************
*** 198,205 ****
  (put 'cal-tex-cursor-week 'menu-enable '(calendar-cursor-to-date))
  (put 'cal-tex-cursor-week2 'menu-enable '(calendar-cursor-to-date))
! (put 'cal-tex-cursor-week3 'menu-enable '(calendar-cursor-to-date))
! (put 'cal-tex-cursor-week4 'menu-enable '(calendar-cursor-to-date))
! (put 'cal-tex-cursor-week5 'menu-enable '(calendar-cursor-to-date))
! (put 'cal-tex-cursor-week6 'menu-enable '(calendar-cursor-to-date))
  (put 'cal-tex-cursor-month 'menu-enable '(calendar-cursor-to-date))
  (put 'cal-tex-cursor-month-landscape 'menu-enable '(calendar-cursor-to-date))
--- 202,210 ----
  (put 'cal-tex-cursor-week 'menu-enable '(calendar-cursor-to-date))
  (put 'cal-tex-cursor-week2 'menu-enable '(calendar-cursor-to-date))
! (put 'cal-tex-cursor-week-iso 'menu-enable '(calendar-cursor-to-date))
! (put 'cal-tex-cursor-week-monday 'menu-enable '(calendar-cursor-to-date))
! (put 'cal-tex-cursor-filofax-2week
!      'menu-enable '(calendar-cursor-to-date))
! (put 'cal-tex-cursor-filofax-week 'menu-enable '(calendar-cursor-to-date))
  (put 'cal-tex-cursor-month 'menu-enable '(calendar-cursor-to-date))
  (put 'cal-tex-cursor-month-landscape 'menu-enable '(calendar-cursor-to-date))
*************** If event is not on a specific date, sign
*** 213,216 ****
--- 218,222 ----
  ERROR is t, otherwise just returns nil."
    (save-excursion
+     (set-buffer (window-buffer (posn-window (event-start last-input-event))))
      (goto-char (posn-point (event-start last-input-event)))
      (calendar-cursor-to-date error)))
*************** ERROR is t, otherwise just returns nil."
*** 246,250 ****
    (interactive)
    (save-excursion
!     (calendar-goto-date (calendar-event-to-date))
      (calendar-sunrise-sunset)))
  
--- 252,256 ----
    (interactive)
    (save-excursion
!     (calendar-mouse-goto-date (calendar-event-to-date))
      (calendar-sunrise-sunset)))
  
*************** ERROR is t, otherwise just returns nil."
*** 253,257 ****
    (interactive)
    (save-excursion
!     (calendar-goto-date (calendar-event-to-date))
      (calendar-cursor-holidays)))
  
--- 259,263 ----
    (interactive)
    (save-excursion
!     (calendar-mouse-goto-date (calendar-event-to-date))
      (calendar-cursor-holidays)))
  
*************** ERROR is t, otherwise just returns nil."
*** 260,264 ****
    (interactive)
    (save-excursion
!     (calendar-goto-date (calendar-event-to-date))
      (view-diary-entries 1)))
  
--- 266,270 ----
    (interactive)
    (save-excursion
!     (calendar-mouse-goto-date (calendar-event-to-date))
      (view-diary-entries 1)))
  
*************** ERROR is t, otherwise just returns nil."
*** 267,271 ****
    (interactive)
    (save-excursion
!     (calendar-goto-date (calendar-event-to-date))
      (call-interactively 'view-other-diary-entries)))
  
--- 273,277 ----
    (interactive)
    (save-excursion
!     (calendar-mouse-goto-date (calendar-event-to-date))
      (call-interactively 'view-other-diary-entries)))
  
*************** ERROR is t, otherwise just returns nil."
*** 274,278 ****
    (interactive)
    (save-excursion
!     (calendar-goto-date (calendar-event-to-date))
      (insert-diary-entry nil)))
  
--- 280,284 ----
    (interactive)
    (save-excursion
!     (calendar-mouse-goto-date (calendar-event-to-date))
      (insert-diary-entry nil)))
  
*************** ERROR is t, otherwise just returns nil."
*** 281,285 ****
    (interactive)
    (save-excursion
!     (calendar-goto-date (calendar-event-to-date))
      (calendar-set-mark nil)))
  
--- 287,291 ----
    (interactive)
    (save-excursion
!     (calendar-mouse-goto-date (calendar-event-to-date))
      (calendar-set-mark nil)))
  
*************** ERROR is t, otherwise just returns nil."
*** 288,292 ****
    (interactive)
    (save-excursion
!     (calendar-goto-date (calendar-event-to-date))
      (cal-tex-cursor-day nil)))
  
--- 294,298 ----
    (interactive)
    (save-excursion
!     (calendar-mouse-goto-date (calendar-event-to-date))
      (cal-tex-cursor-day nil)))
  
*************** Holidays are included if `cal-tex-holida
*** 296,300 ****
    (interactive)
    (save-excursion
!     (calendar-goto-date (calendar-event-to-date))
      (cal-tex-cursor-week nil)))
  
--- 302,306 ----
    (interactive)
    (save-excursion
!     (calendar-mouse-goto-date (calendar-event-to-date))
      (cal-tex-cursor-week nil)))
  
*************** The printed output will be on two pages.
*** 304,338 ****
    (interactive)
    (save-excursion
!     (calendar-goto-date (calendar-event-to-date))
      (cal-tex-cursor-week2 nil)))
  
! (defun cal-tex-mouse-week3 ()
    "One page calendar for week indicated by cursor.
  Holidays are included if `cal-tex-holidays' is t."
    (interactive)
    (save-excursion
!     (calendar-goto-date (calendar-event-to-date))
!     (cal-tex-cursor-week3 nil)))
  
! (defun cal-tex-mouse-week4 ()
    "One page calendar for week indicated by cursor."
    (interactive)
    (save-excursion
!     (calendar-goto-date (calendar-event-to-date))
!     (cal-tex-cursor-week4 nil)))
  
! (defun cal-tex-mouse-week5 ()
    "One page Filofax calendar for week indicated by cursor."
    (interactive)
    (save-excursion
!     (calendar-goto-date (calendar-event-to-date))
!     (cal-tex-cursor-week5 nil)))
  
! (defun cal-tex-mouse-week6 ()
    "Two page Filofax calendar for week indicated by cursor."
    (interactive)
    (save-excursion
!     (calendar-goto-date (calendar-event-to-date))
!     (cal-tex-cursor-week6 nil)))
  
  (defun cal-tex-mouse-month ()
--- 310,344 ----
    (interactive)
    (save-excursion
!     (calendar-mouse-goto-date (calendar-event-to-date))
      (cal-tex-cursor-week2 nil)))
  
! (defun cal-tex-mouse-week-iso ()
    "One page calendar for week indicated by cursor.
  Holidays are included if `cal-tex-holidays' is t."
    (interactive)
    (save-excursion
!     (calendar-mouse-goto-date (calendar-event-to-date))
!     (cal-tex-cursor-week-iso nil)))
  
! (defun cal-tex-mouse-week-monday ()
    "One page calendar for week indicated by cursor."
    (interactive)
    (save-excursion
!     (calendar-mouse-goto-date (calendar-event-to-date))
!     (cal-tex-cursor-week-monday nil)))
  
! (defun cal-tex-mouse-filofax-2week ()
    "One page Filofax calendar for week indicated by cursor."
    (interactive)
    (save-excursion
!     (calendar-mouse-goto-date (calendar-event-to-date))
!     (cal-tex-cursor-filofax-2week nil)))
  
! (defun cal-tex-mouse-filofax-week ()
    "Two page Filofax calendar for week indicated by cursor."
    (interactive)
    (save-excursion
!     (calendar-mouse-goto-date (calendar-event-to-date))
!     (cal-tex-cursor-filofax-week nil)))
  
  (defun cal-tex-mouse-month ()
*************** Calendar is condensed onto one page."
*** 341,345 ****
    (interactive)
    (save-excursion
!     (calendar-goto-date (calendar-event-to-date))
      (cal-tex-cursor-month nil)))
  
--- 347,351 ----
    (interactive)
    (save-excursion
!     (calendar-mouse-goto-date (calendar-event-to-date))
      (cal-tex-cursor-month nil)))
  
*************** The output is in landscape format, one m
*** 349,353 ****
    (interactive)
    (save-excursion
!     (calendar-goto-date (calendar-event-to-date))
      (cal-tex-cursor-month-landscape nil)))
  
--- 355,359 ----
    (interactive)
    (save-excursion
!     (calendar-mouse-goto-date (calendar-event-to-date))
      (cal-tex-cursor-month-landscape nil)))
  
*************** The output is in landscape format, one m
*** 356,360 ****
    (interactive)
    (save-excursion
!     (calendar-goto-date (calendar-event-to-date))
      (cal-tex-cursor-year nil)))
  
--- 362,366 ----
    (interactive)
    (save-excursion
!     (calendar-mouse-goto-date (calendar-event-to-date))
      (cal-tex-cursor-year nil)))
  
*************** The output is in landscape format, one m
*** 363,367 ****
    (interactive)
    (save-excursion
!     (calendar-goto-date (calendar-event-to-date))
      (cal-tex-cursor-filofax-year nil)))
  
--- 369,373 ----
    (interactive)
    (save-excursion
!     (calendar-mouse-goto-date (calendar-event-to-date))
      (cal-tex-cursor-filofax-year nil)))
  
*************** The output is in landscape format, one m
*** 370,374 ****
    (interactive)
    (save-excursion
!     (calendar-goto-date (calendar-event-to-date))
      (cal-tex-cursor-year-landscape nil)))
  
--- 376,380 ----
    (interactive)
    (save-excursion
!     (calendar-mouse-goto-date (calendar-event-to-date))
      (cal-tex-cursor-year-landscape nil)))
  
*************** The output is in landscape format, one m
*** 381,385 ****
            event
            (list
!            "Date Menu"
             (append
              (list
--- 387,391 ----
            event
            (list
!            (concat (calendar-date-string date) " (Gregorian)")
             (append
              (list
*************** The output is in landscape format, one m
*** 390,397 ****
                             (calendar-julian-date-string date)))
               (list
!               (format "Astronomical (Julian) day number (after noon UTC): %s"
                             (calendar-astro-date-string date)))
               (list (format "Hebrew date (before sunset): %s"
!                            (calendar-hebrew-date-string date))))
              (let ((i (calendar-islamic-date-string date)))
                (if (not (string-equal i ""))
--- 396,405 ----
                             (calendar-julian-date-string date)))
               (list
!               (format "Astronomical (Julian) day number (at noon UTC): %s.0"
                             (calendar-astro-date-string date)))
               (list (format "Hebrew date (before sunset): %s"
!                            (calendar-hebrew-date-string date)))
!              (list (format "Persian date: %s"
!                            (calendar-persian-date-string date))))
              (let ((i (calendar-islamic-date-string date)))
                (if (not (string-equal i ""))
*************** The output is in landscape format, one m
*** 421,427 ****
    (interactive)
    (save-excursion
!     (calendar-goto-date (calendar-event-to-date))
      (calendar-print-chinese-date)))
  
  (defun calendar-mouse-2-date-menu (event)
    "Pop up menu for Mouse-2 for selected date in the calendar window."
--- 429,439 ----
    (interactive)
    (save-excursion
!     (calendar-mouse-goto-date (calendar-event-to-date))
      (calendar-print-chinese-date)))
  
+ (defun calendar-mouse-goto-date (date)
+   (set-buffer (window-buffer (posn-window (event-start last-input-event))))
+   (calendar-goto-date date))
+ 
  (defun calendar-mouse-2-date-menu (event)
    "Pop up menu for Mouse-2 for selected date in the calendar window."
*************** The output is in landscape format, one m
*** 431,437 ****
            (x-popup-menu
             event
!            (list "Menu"
                   (list
!                   (calendar-date-string date t nil)
                    '("Holidays" . calendar-mouse-holidays)
                    '("Mark date" . calendar-mouse-set-mark)
--- 443,449 ----
            (x-popup-menu
             event
!            (list (calendar-date-string date t nil)
                   (list
!                   ""
                    '("Holidays" . calendar-mouse-holidays)
                    '("Mark date" . calendar-mouse-set-mark)
*************** The output is in landscape format, one m
*** 452,463 ****
            (x-popup-menu
             event
!            (list "Menu"
                   (list
!                   (calendar-date-string date t nil)
                    '("Daily (1 page)" . cal-tex-mouse-day)
                    '("Weekly (1 page)" . cal-tex-mouse-week)
                    '("Weekly (2 pages)" . cal-tex-mouse-week2)
!                   '("Weekly (other style; 1 page)" . cal-tex-mouse-week3)
!                   '("Weekly (yet another style; 1 page)" . cal-tex-mouse-week4)
                    '("Monthly" . cal-tex-mouse-month)
                    '("Monthly (landscape)" . cal-tex-mouse-month-landscape)
--- 464,476 ----
            (x-popup-menu
             event
!            (list (calendar-date-string date t nil)
                   (list
!                   ""
                    '("Daily (1 page)" . cal-tex-mouse-day)
                    '("Weekly (1 page)" . cal-tex-mouse-week)
                    '("Weekly (2 pages)" . cal-tex-mouse-week2)
!                   '("Weekly (other style; 1 page)" . cal-tex-mouse-week-iso)
!                   '("Weekly (yet another style; 1 page)" .
!                     cal-tex-mouse-week-monday)
                    '("Monthly" . cal-tex-mouse-month)
                    '("Monthly (landscape)" . cal-tex-mouse-month-landscape)
*************** The output is in landscape format, one m
*** 474,482 ****
            (x-popup-menu
             event
!            (list "Menu"
                   (list
!                   (calendar-date-string date t nil)
!                   '("Filofax Weekly (1 page)" . cal-tex-mouse-week5)
!                   '("Filofax Weekly (2 pages)" . cal-tex-mouse-week6)
                    '("Filofax Yearly" . cal-tex-mouse-filofax-year)
                    )))))
--- 487,497 ----
            (x-popup-menu
             event
!            (list (calendar-date-string date t nil)
                   (list
!                   ""
!                   '("Filofax Weekly (2-weeks-at-a-glance)" .
!                     cal-tex-mouse-filofax-2week)
!                   '("Filofax Weekly (week-at-a-glance)" .
!                     cal-tex-mouse-filofax-week)
                    '("Filofax Yearly" . cal-tex-mouse-filofax-year)
                    )))))
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/cal-move.el emacs-19.31/lisp/cal-move.el
*** emacs-19.30/lisp/cal-move.el	Wed Sep 20 23:12:06 1995
--- emacs-19.31/lisp/cal-move.el	Sun Jan 14 02:34:30 1996
***************
*** 20,25 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/cal-persia.el emacs-19.31/lisp/cal-persia.el
*** emacs-19.30/lisp/cal-persia.el	Wed Dec 31 19:00:00 1969
--- emacs-19.31/lisp/cal-persia.el	Mon May 20 11:32:21 1996
***************
*** 0 ****
--- 1,206 ----
+ ;;; cal-persia.el --- calendar functions for the Persian calendar.
+ 
+ ;; Copyright (C) 1996 Free Software Foundation, Inc.
+ 
+ ;; Author: Edward M. Reingold <reingold@cs.uiuc.edu>
+ ;; Keywords: calendar
+ ;; Human-Keywords: Persian calendar, calendar, diary
+ 
+ ;; 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, Inc., 59 Temple Place - Suite 330,
+ ;; Boston, MA 02111-1307, USA.
+ 
+ ;;; Commentary:
+ 
+ ;; This collection of functions implements the features of calendar.el and
+ ;; diary.el that deal with the Persian calendar.
+ 
+ ;; Comments, corrections, and improvements should be sent to
+ ;;  Edward M. Reingold               Department of Computer Science
+ ;;  (217) 333-6733                   University of Illinois at Urbana-Champaign
+ ;;  reingold@cs.uiuc.edu             1304 West Springfield Avenue
+ ;;                                   Urbana, Illinois 61801
+ 
+ ;;; Code:
+ 
+ (require 'cal-julian)
+ 
+ (defvar persian-calendar-month-name-array
+   ["Farvardin" "Ordibehest" "Xordad" "Tir" "Mordad" "Sahrivar" "Mehr" "Aban"
+    "Azar" "Dey" "Bahman" "Esfand"])
+ 
+ (defvar persian-calendar-epoch (calendar-absolute-from-julian '(3 19 622))
+   "Absolute date of start of Persian calendar = March 19, 622 A.D. (Julian).")
+ 
+ (defun persian-calendar-leap-year-p (year)
+   "True if YEAR is a leap year on the Persian calendar."
+   (< (mod (* (mod (mod (if (<= 0 year)
+                            ; No year zero
+                            (+ year 2346)
+                          (+ year 2347))
+                        2820)
+                   768)
+               683)
+            2820)
+       683))
+ 
+ (defun persian-calendar-last-day-of-month (month year)
+   "Return last day of MONTH, YEAR on the Persian calendar."
+   (cond
+    ((< month 7) 31)
+    ((or (< month 12) (persian-calendar-leap-year-p year)) 30)
+    (t 29)))
+ 
+ (defun calendar-absolute-from-persian (date)
+   "Compute absolute date from Persian date DATE.
+ The absolute date is the number of days elapsed since the (imaginary)
+ Gregorian date Sunday, December 31, 1 BC."
+   (let ((month (extract-calendar-month date))
+         (day (extract-calendar-day date))
+         (year (extract-calendar-year date)))
+     (if (< year 0)
+         (+ (calendar-absolute-from-persian
+             (list month day (1+ (mod year 2820))))
+            (* 1029983 (floor year 2820)))
+       (+ (1- persian-calendar-epoch); Days before epoch
+          (* 365 (1- year)) ; Days in prior years.
+          (* 683        ; Leap days in prior 2820-year cycles
+             (floor (+ year 2345) 2820))
+          (* 186        ; Leap days in prior 768 year cycles
+             (floor (mod (+ year 2345) 2820) 768))
+          (floor; Leap years in current 768 or 516 year cycle
+           (* 683 (mod (mod (+ year 2345) 2820) 768))
+           2820)
+          -568          ; Leap years in Persian years -2345...-1
+          (calendar-sum ; Days in prior months this year.
+           m 1 (< m month)
+           (persian-calendar-last-day-of-month m year))
+          day))))        ; Days so far this month.
+ 
+ (defun calendar-persian-year-from-absolute (date)
+   "Persian year corresponding to the absolute DATE."
+   (let* ((d0        ; Prior days since start of 2820 cycles
+           (- date (calendar-absolute-from-persian (list 1 1 -2345))))
+          (n2820     ; Completed 2820-year cycles
+           (floor d0 1029983))
+          (d1        ; Prior days not in n2820
+           (mod d0 1029983))
+          (n768      ; 768-year cycles not in n2820
+           (floor d1 280506))
+          (d2        ; Prior days not in n2820 or n768
+           (mod d1 280506))
+          (n1        ; Years not in n2820 or n768
+           ; we want is
+           ; (floor (+ (* 2820 d2) (* 2820 366)) 1029983))
+           ; but that causes overflow, so we use
+           (let ((a (floor d2 366)); we use 366 as the divisor because
+                                   ; (2820*366 mod 1029983) is small
+                 (b (mod d2 366)))
+             (+ 1 a (floor (+ (* 2137 a) (* 2820 b) 2137) 1029983))))
+          (year (+ (* 2820 n2820); Complete 2820 year cycles
+                   (* 768 n768)  ; Complete 768 year cycles
+                   (if           ; Remaining years
+                       ; Last day of 2820 year cycle
+                       (= d1 1029617)
+                       (1- n1)
+                     n1)
+                   -2345)))      ; Years before year 1
+     (if (< year 1)
+         (1- year); No year zero
+       year)))
+ 
+ (defun calendar-persian-from-absolute (date)
+   "Compute the Persian equivalent for absolute date DATE.
+ The result is a list of the form (MONTH DAY YEAR).
+ The absolute date is the number of days elapsed since the imaginary
+ Gregorian date Sunday, December 31, 1 BC."
+   (let* ((year (calendar-persian-year-from-absolute date))
+          (month         ; Search forward from Farvardin
+           (1+ (calendar-sum m 1
+                             (> date
+                                (calendar-absolute-from-persian
+                                 (list
+                                  m
+                                  (persian-calendar-last-day-of-month m year)
+                                  year)))
+                             1)))
+          (day           ; Calculate the day by subtraction
+           (- date (1- (calendar-absolute-from-persian
+                        (list month 1 year))))))
+     (list month day year)))
+ 
+ (defun calendar-persian-date-string (&optional date)
+   "String of Persian date of Gregorian DATE.
+ Defaults to today's date if DATE is not given."
+   (let* ((persian-date (calendar-persian-from-absolute
+                        (calendar-absolute-from-gregorian
+                         (or date (calendar-current-date)))))
+          (y (extract-calendar-year persian-date))
+          (m (extract-calendar-month persian-date)))
+     (let ((monthname (aref persian-calendar-month-name-array (1- m)))
+           (day (int-to-string (extract-calendar-day persian-date)))
+           (dayname nil)
+           (month (int-to-string m))
+           (year (int-to-string y)))
+       (mapconcat 'eval calendar-date-display-form ""))))
+ 
+ (defun calendar-print-persian-date ()
+   "Show the Persian calendar equivalent of the selected date."
+   (interactive)
+   (message "Persian date: %s"
+            (calendar-persian-date-string (calendar-cursor-to-date t))))
+ 
+ (defun calendar-goto-persian-date (date &optional noecho)
+   "Move cursor to Persian date DATE.
+ Echo Persian date unless NOECHO is t."
+   (interactive (persian-prompt-for-date))
+   (calendar-goto-date (calendar-gregorian-from-absolute
+                        (calendar-absolute-from-persian date)))
+   (or noecho (calendar-print-persian-date)))
+ 
+ (defun persian-prompt-for-date ()
+   "Ask for a Persian date."
+   (let* ((today (calendar-current-date))
+          (year (calendar-read
+                 "Persian calendar year (not 0): "
+                 '(lambda (x) (/= x 0))
+                 (int-to-string
+                  (extract-calendar-year
+                   (calendar-persian-from-absolute
+                    (calendar-absolute-from-gregorian today))))))
+          (completion-ignore-case t)
+          (month (cdr (assoc
+                       (capitalize
+                        (completing-read
+                         "Persian calendar month name: "
+                         (mapcar 'list
+                                 (append persian-calendar-month-name-array nil))
+                         nil t))
+                       (calendar-make-alist persian-calendar-month-name-array
+                                            1 'capitalize))))
+          (last (persian-calendar-last-day-of-month month year))
+          (day (calendar-read
+                (format "Persian calendar day (1-%d): " last)
+                '(lambda (x) (and (< 0 x) (<= x last))))))
+     (list (list month day year))))
+ 
+ (defun diary-persian-date ()
+   "Persian calendar equivalent of date diary entry."
+  (calendar-persian-date-string (calendar-cursor-to-date t)))
+ 
+ (provide 'cal-persia)
+ 
+ ;;; cal-persia.el ends here
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/cal-tex.el emacs-19.31/lisp/cal-tex.el
*** emacs-19.30/lisp/cal-tex.el	Sat Nov 25 00:36:07 1995
--- emacs-19.31/lisp/cal-tex.el	Wed Jan 24 10:57:21 1996
***************
*** 21,26 ****
  
  ;; 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:
--- 21,27 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 29,44 ****
  ;; based on the user's holiday choices and diary file.
  
! ;;; TO DO
! ;;;
! ;;;     (*)  Add holidays and diary entries to daily calendar.
! ;;;
! ;;;     (*)  Add diary entries to weekly calendar functions.
! ;;;
! ;;;     (*)  Make calendar styles for A4 paper.
! ;;;
! ;;;     (*)  Make daily and monthly styles Filofax paper.
! ;;;
! ;;;     (*)  Improve the LaTeX command that produces the boxes in the monthly
! ;;;          calendar to eliminate slight gap--what causes it?!
  
  ;;; Code:
--- 30,45 ----
  ;; based on the user's holiday choices and diary file.
  
! ;; TO DO
! ;;
! ;;     (*)  Add holidays and diary entries to daily calendar.
! ;;
! ;;     (*)  Add diary entries to weekly calendar functions.
! ;;
! ;;     (*)  Make calendar styles for A4 paper.
! ;;
! ;;     (*)  Make daily and monthly styles Filofax paper.
! ;;
! ;;     (*)  Improve the LaTeX command that produces the boxes in the monthly
! ;;          calendar to eliminate slight gap--what causes it?!
  
  ;;; Code:
*************** Optional ARGS are included."
*** 215,218 ****
--- 216,220 ----
    (insert "{article}\n"
            "\\hbadness 20000
+ \\hfuzz=1000pt
  \\vbadness 20000
  \\marginparwidth 0pt
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/cal-x.el emacs-19.31/lisp/cal-x.el
*** emacs-19.30/lisp/cal-x.el	Thu Nov  9 23:26:27 1995
--- emacs-19.31/lisp/cal-x.el	Mon Apr 29 14:48:07 1996
***************
*** 1,3 ****
! ;;; cal-x.el --- calendar windows in dedicated frames in x-windows
  
  ;; Copyright (C) 1994, 1995 Free Software Foundation, Inc.
--- 1,3 ----
! ;;; cal-x.el --- calendar windows in dedicated frames in X
  
  ;; Copyright (C) 1994, 1995 Free Software Foundation, Inc.
***************
*** 6,10 ****
  ;;      Edward M. Reingold <reingold@cs.uiuc.edu>
  ;; Keywords: calendar
! ;; Human-Keywords: calendar, dedicated frames, x-windows
  
  ;; This file is part of GNU Emacs.
--- 6,10 ----
  ;;      Edward M. Reingold <reingold@cs.uiuc.edu>
  ;; Keywords: calendar
! ;; Human-Keywords: calendar, dedicated frames, X Window System
  
  ;; This file is part of GNU Emacs.
***************
*** 21,30 ****
  
  ;; 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:
  
! ;; This collection of functions implements dedicated frames in x-windows for
  ;; calendar.el.
  
--- 21,31 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
! ;; This collection of functions implements dedicated frames in X for
  ;; calendar.el.
  
***************
*** 43,49 ****
  (defvar diary-frame nil "Frame in which to display the diary.")
    
  (defvar diary-frame-parameters
    '((name . "Diary") (height . 10) (width . 80) (unsplittable . t)
!     (font . "6x13") (auto-lower . t) (auto-raise . t) (minibuffer . nil))
    "Parameters of the diary frame, if the diary is in its own frame.
  Location and color should be set in .Xdefaults.")
--- 44,53 ----
  (defvar diary-frame nil "Frame in which to display the diary.")
    
+ ;; This should not specify the font.  That's up to the user.
+ ;; Certainly it should not specify auto-lower and auto-raise
+ ;; since most users won't like that.
  (defvar diary-frame-parameters
    '((name . "Diary") (height . 10) (width . 80) (unsplittable . t)
!     (minibuffer . nil))
    "Parameters of the diary frame, if the diary is in its own frame.
  Location and color should be set in .Xdefaults.")
*************** Location and color should be set in .Xde
*** 51,62 ****
  (defvar calendar-frame-parameters
    '((name . "Calendar") (minibuffer . nil) (height . 10) (width . 80)
!     (auto-raise . t) (auto-lower . t) (font . "6x13") (unsplittable . t)
!     (vertical-scroll-bars . nil))
    "Parameters of the calendar frame, if the calendar is in a separate frame.
  Location and color should be set in .Xdefaults.")
  
  (defvar calendar-and-diary-frame-parameters
!   '((name . "Calendar") (height . 28) (width . 80) (minibuffer . nil)
!     (font . "6x13") (auto-raise . t) (auto-lower . t))
    "Parameters of the frame that displays both the calendar and the diary.
  Location and color should be set in .Xdefaults.")
--- 55,64 ----
  (defvar calendar-frame-parameters
    '((name . "Calendar") (minibuffer . nil) (height . 10) (width . 80)
!     (unsplittable . t) (vertical-scroll-bars . nil))
    "Parameters of the calendar frame, if the calendar is in a separate frame.
  Location and color should be set in .Xdefaults.")
  
  (defvar calendar-and-diary-frame-parameters
!   '((name . "Calendar") (height . 28) (width . 80) (minibuffer . nil))
    "Parameters of the frame that displays both the calendar and the diary.
  Location and color should be set in .Xdefaults.")
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/calendar.el emacs-19.31/lisp/calendar.el
*** emacs-19.30/lisp/calendar.el	Sat Nov 25 00:35:41 1995
--- emacs-19.31/lisp/calendar.el	Mon May 20 11:35:45 1996
***************
*** 1,6 ****
! ;;; calendar.el --- Calendar functions.  -*-byte-compile-dynamic: t;-*-
  
! ;;; Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995 Free Software
! ;;; Foundation, Inc.
  
  ;; Author: Edward M. Reingold <reingold@cs.uiuc.edu>
--- 1,6 ----
! ;;; calendar.el --- Calendar functions.
  
! ;; Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995 Free
! ;; Software Foundation, Inc.
  
  ;; Author: Edward M. Reingold <reingold@cs.uiuc.edu>
***************
*** 21,26 ****
  
  ;; 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:
--- 21,27 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 51,59 ****
  
  ;;       appt.el                       Appointment notification
! ;;       cal-chinese.el                Chinese calendar
  ;;       cal-coptic.el                 Coptic/Ethiopic calendars
  ;;       cal-dst.el                    Daylight savings time rules
  ;;       cal-hebrew.el                 Hebrew calendar
! ;;       cal-islamic.el                Islamic calendar
  ;;       cal-iso.el                    ISO calendar
  ;;       cal-julian.el                 Julian/astronomical calendars
--- 52,60 ----
  
  ;;       appt.el                       Appointment notification
! ;;       cal-china.el                  Chinese calendar
  ;;       cal-coptic.el                 Coptic/Ethiopic calendars
  ;;       cal-dst.el                    Daylight savings time rules
  ;;       cal-hebrew.el                 Hebrew calendar
! ;;       cal-islam.el                  Islamic calendar
  ;;       cal-iso.el                    ISO calendar
  ;;       cal-julian.el                 Julian/astronomical calendars
***************
*** 61,64 ****
--- 62,66 ----
  ;;       cal-menu.el                   Menu support
  ;;       cal-move.el                   Movement in the calendar
+ ;;       cal-persia.el                 Persian calendar
  ;;       cal-tex.el                    Calendars in LaTeX
  ;;       cal-x.el                      X-windows dedicated frame functions
*************** causes the diary entry \"Vacation\" to a
*** 335,341 ****
  `diary-hebrew-date', `diary-islamic-date', `diary-mayan-date',
  `diary-chinese-date', `diary-coptic-date', `diary-ethiopic-date',
! `diary-yahrzeit', `diary-sunrise-sunset', `diary-phases-of-moon',
! `diary-parasha', `diary-omer', `diary-rosh-hodesh', and
! `diary-sabbath-candles'.  See the documentation for the function
  `list-sexp-diary-entries' for more details.
  
--- 337,343 ----
  `diary-hebrew-date', `diary-islamic-date', `diary-mayan-date',
  `diary-chinese-date', `diary-coptic-date', `diary-ethiopic-date',
! `diary-persian-date', `diary-yahrzeit', `diary-sunrise-sunset',
! `diary-phases-of-moon', `diary-parasha', `diary-omer', `diary-rosh-hodesh',
! and `diary-sabbath-candles'.  See the documentation for the function
  `list-sexp-diary-entries' for more details.
  
*************** somewhat; setting it to nil makes the di
*** 612,616 ****
      (holiday-float 2 1 3 "President's Day")
      (holiday-fixed 3 17 "St. Patrick's Day")
!     (holiday-fixed 4 1 "April Fool's Day")
      (holiday-float 5 0 2 "Mother's Day")
      (holiday-float 5 1 -1 "Memorial Day")
--- 614,618 ----
      (holiday-float 2 1 3 "President's Day")
      (holiday-fixed 3 17 "St. Patrick's Day")
!     (holiday-fixed 4 1 "April Fools' Day")
      (holiday-float 5 0 2 "Mother's Day")
      (holiday-float 5 1 -1 "Memorial Day")
*************** The Gregorian date Sunday, December 31, 
*** 1149,1153 ****
    "The frame set up of the calendar.
  The choices are `one-frame' (calendar and diary together in one separate,
! dediciated frame) or `two-frames' (calendar and diary in separate, dedicated
  frames); with any other value the current frame is used.")
  
--- 1151,1155 ----
    "The frame set up of the calendar.
  The choices are `one-frame' (calendar and diary together in one separate,
! dedicated frame) or `two-frames' (calendar and diary in separate, dedicated
  frames); with any other value the current frame is used.")
  
*************** After preparing the calendar window init
*** 1202,1206 ****
  
  The hooks given by the variable `today-visible-calendar-hook' are run
! everytime the calendar window gets scrolled, if the current date is visible
  in the window.  If it is not visible, the hooks given by the variable
  `today-invisible-calendar-hook' are run.  Thus, for example, setting
--- 1204,1208 ----
  
  The hooks given by the variable `today-visible-calendar-hook' are run
! every time the calendar window gets scrolled, if the current date is visible
  in the window.  If it is not visible, the hooks given by the variable
  `today-invisible-calendar-hook' are run.  Thus, for example, setting
*************** calendar."
*** 1288,1310 ****
  
  (autoload 'calendar-next-calendar-round-date "cal-mayan"
!   "Move cursor to next instance of Mayan Haab/Tzoklin combination."
    t)
  
  (autoload 'calendar-previous-calendar-round-date "cal-mayan"
!   "Move cursor to previous instance of Mayan Haab/Tzoklin combination."
    t)
  
! (autoload 'calendar-goto-chinese-date "cal-chinese"
!    "Move cursor to Chinese date date."
     t)
  
! (autoload 'calendar-print-chinese-date "cal-chinese"
   "Show the Chinese date equivalents of date."
   t)
  
! (autoload 'calendar-chinese-date-string "cal-chinese"
    "String of Chinese date of Gregorian date."
    t)
  
  (autoload 'calendar-julian-from-absolute "cal-julian"
    "Compute the Julian (month day year) corresponding to the absolute DATE.
--- 1290,1327 ----
  
  (autoload 'calendar-next-calendar-round-date "cal-mayan"
!   "Move cursor to next instance of Mayan Haab/Tzolkin combination."
    t)
  
  (autoload 'calendar-previous-calendar-round-date "cal-mayan"
!   "Move cursor to previous instance of Mayan Haab/Tzolkin combination."
    t)
  
! (autoload 'calendar-goto-chinese-date "cal-china"
!    "Move cursor to Chinese date."
     t)
  
! (autoload 'calendar-print-chinese-date "cal-china"
   "Show the Chinese date equivalents of date."
   t)
  
! (autoload 'calendar-chinese-date-string "cal-china"
    "String of Chinese date of Gregorian date."
    t)
  
+ (autoload 'calendar-absolute-from-astro
+   "Absolute date of astronomical (Julian) day number D."
+   "cal-julian")
+ 
+ (autoload 'calendar-astro-from-absolute "cal-julian"
+   "Astronomical (Julian) day number of absolute date D.")
+ 
+ (autoload 'calendar-astro-date-string "cal-julian"
+   "String of astronomical (Julian) day number of Gregorian date."
+   t)
+ 
+ (autoload 'calendar-goto-astro-date "cal-julian"
+    "Move cursor to astronomical (Julian) day number."
+    t)
+ 
  (autoload 'calendar-julian-from-absolute "cal-julian"
    "Compute the Julian (month day year) corresponding to the absolute DATE.
*************** Driven by the variable `calendar-date-di
*** 1334,1342 ****
    t)
  
! (autoload 'calendar-print-islamic-date "cal-islamic"
    "Show the Islamic date equivalents of date."
    t)
  
! (autoload 'calendar-islamic-date-string "cal-islamic"
    "String of Islamic date of Gregorian date."
    t)
--- 1351,1359 ----
    t)
  
! (autoload 'calendar-print-islamic-date "cal-islam"
    "Show the Islamic date equivalents of date."
    t)
  
! (autoload 'calendar-islamic-date-string "cal-islam"
    "String of Islamic date of Gregorian date."
    t)
*************** Driven by the variable `calendar-date-di
*** 1378,1381 ****
--- 1395,1410 ----
    t)
  
+ (autoload 'calendar-goto-persian-date "cal-persia"
+    "Move cursor to Persian date date."
+    t)
+ 
+ (autoload 'calendar-print-persian-date "cal-persia"
+  "Show the Persian date equivalents of date."
+  t)
+ 
+ (autoload 'calendar-persian-date-string "cal-persia"
+   "String of Persian date of Gregorian date."
+   t)
+ 
  (autoload 'show-all-diary-entries "diary-lib"
    "Show all of the diary entries in the diary file.
*************** to the date indicated by point."
*** 1438,1452 ****
    t)
  
! (autoload 'insert-islamic-diary-entry "cal-islamic"
    "Insert a diary entry for the Islamic date corresponding to the date
  indicated by point."
    t)
  
! (autoload 'insert-monthly-islamic-diary-entry "cal-islamic"
    "Insert a monthly diary entry for the day of the Islamic month corresponding
  to the date indicated by point."
    t)
  
! (autoload 'insert-yearly-islamic-diary-entry "cal-islamic"
    "Insert an annual diary entry for the day of the Islamic year corresponding
  to the date indicated by point."
--- 1467,1481 ----
    t)
  
! (autoload 'insert-islamic-diary-entry "cal-islam"
    "Insert a diary entry for the Islamic date corresponding to the date
  indicated by point."
    t)
  
! (autoload 'insert-monthly-islamic-diary-entry "cal-islam"
    "Insert a monthly diary entry for the day of the Islamic month corresponding
  to the date indicated by point."
    t)
  
! (autoload 'insert-yearly-islamic-diary-entry "cal-islam"
    "Insert an annual diary entry for the day of the Islamic year corresponding
  to the date indicated by point."
*************** Holidays are included if `cal-tex-holida
*** 1510,1514 ****
  (autoload 'cal-tex-cursor-year "cal-tex"
    "Make a buffer with LaTeX commands for a year's calendar.
! Optional prefix argument specifies numeber of years.")
  
  (autoload 'cal-tex-cursor-year-landscape "cal-tex"
--- 1539,1543 ----
  (autoload 'cal-tex-cursor-year "cal-tex"
    "Make a buffer with LaTeX commands for a year's calendar.
! Optional prefix argument specifies number of years.")
  
  (autoload 'cal-tex-cursor-year-landscape "cal-tex"
*************** the inserted text.  Value is always t."
*** 1693,1696 ****
--- 1722,1726 ----
    (define-key calendar-mode-map "gk"  'calendar-goto-coptic-date)
    (define-key calendar-mode-map "ge"  'calendar-goto-ethiopic-date)
+   (define-key calendar-mode-map "gp"  'calendar-goto-persian-date)
    (define-key calendar-mode-map "gc"  'calendar-goto-iso-date)
    (define-key calendar-mode-map "gf"  'calendar-goto-french-date)
*************** the inserted text.  Value is always t."
*** 1721,1724 ****
--- 1751,1755 ----
    (define-key calendar-mode-map "pk"  'calendar-print-coptic-date)
    (define-key calendar-mode-map "pe"  'calendar-print-ethiopic-date)
+   (define-key calendar-mode-map "pp"  'calendar-print-persian-date)
    (define-key calendar-mode-map "pc"  'calendar-print-iso-date)
    (define-key calendar-mode-map "pj"  'calendar-print-julian-date)
*************** Defaults to today's date if DATE is not 
*** 2302,2305 ****
--- 2333,2340 ----
  
  (provide 'calendar)
+ 
+ ;;; Local variables:
+ ;;; byte-compile-dynamic: t
+ ;;; End:
  
  ;;; calendar.el ends here
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/case-table.el emacs-19.31/lisp/case-table.el
*** emacs-19.30/lisp/case-table.el	Sat Nov 11 15:39:39 1995
--- emacs-19.31/lisp/case-table.el	Sun Jan 14 02:34:30 1996
***************
*** 20,25 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/cc-compat.el emacs-19.31/lisp/cc-compat.el
*** emacs-19.30/lisp/cc-compat.el	Thu Aug 31 22:44:54 1995
--- emacs-19.31/lisp/cc-compat.el	Thu Feb 15 20:01:43 1996
***************
*** 22,30 ****
  
  ;; 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:
! ;;
  ;; Boring old c-mode.el (BOCM) is confusion and brain melt. cc-mode.el
  ;; is clarity of thought and purity of chi. If you are still unwilling
--- 22,31 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
! 
  ;; Boring old c-mode.el (BOCM) is confusion and brain melt. cc-mode.el
  ;; is clarity of thought and purity of chi. If you are still unwilling
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/cc-mode.el emacs-19.31/lisp/cc-mode.el
*** emacs-19.30/lisp/cc-mode.el	Fri Nov 24 22:09:58 1995
--- emacs-19.31/lisp/cc-mode.el	Wed May 15 10:46:52 1996
***************
*** 1,14 ****
  ;;; cc-mode.el --- major mode for editing C, C++, and Objective-C code
  
! ;; Copyright (C) 1985, 87, 92, 93, 94, 95 Free Software Foundation, Inc.
  
! ;; Authors: 1992-1995 Barry A. Warsaw
  ;;          1987 Dave Detlefs and Stewart Clamen
  ;;          1985 Richard M. Stallman
- ;; Maintainer: cc-mode-help@merlin.cnri.reston.va.us
  ;; Created: a long, long, time ago. adapted from the original c-mode.el
! ;; Barry Warsaw Version:    4.249
  ;; Keywords: c languages oop
  ;; NOTE: Read the commentary below for the right way to submit bug reports!
  
  ;; This file is part of GNU Emacs.
--- 1,15 ----
  ;;; cc-mode.el --- major mode for editing C, C++, and Objective-C code
  
! ;; Copyright (C) 1985, 87, 92, 93, 94, 95, 96 Free Software Foundation, Inc.
  
! ;; Authors: 1992-1996 Barry A. Warsaw
  ;;          1987 Dave Detlefs and Stewart Clamen
  ;;          1985 Richard M. Stallman
  ;; Created: a long, long, time ago. adapted from the original c-mode.el
! ;; Barry Warsaw Version:    4.282
  ;; Keywords: c languages oop
+ 
  ;; NOTE: Read the commentary below for the right way to submit bug reports!
+ ;; NOTE: See the accompanying texinfo manual for details on using this mode!
  
  ;; This file is part of GNU Emacs.
***************
*** 25,30 ****
  
  ;; 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:
--- 26,32 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 37,65 ****
  ;;;    he may fix them for the FSF's sake.
  
! ;; This package provides modes in GNU Emacs for editing C, C++, and
! ;; Objective-C code. It is intended to be a replacement for c-mode.el
! ;; (a.k.a. BOCM -- Boring Old C-Mode), and c++-mode.el (a.k.a
! ;; cplus-md.el and cplus-md1.el), both of which are ancestors of this
! ;; file.  A number of important improvements have been made, briefly:
! ;; complete K&R C, ANSI C, `ARM' C++, and Objective-C support with
! ;; consistent indentation across all modes, more intuitive indentation
! ;; controlling variables, compatibility across all known Emacsen, nice
! ;; new features, and tons of bug fixes.  This package is called
! ;; "cc-mode" to distinguish it from its ancestors, but there really is
! ;; no top-level cc-mode.  Usage and programming details are contained
! ;; in an accompanying texinfo manual.
! 
! ;; To submit bug reports, type "C-c C-b". Please include a code sample
! ;; and exact recipe so I can reproduce your problem.  If you have
! ;; other questions contact me at the following address:
! ;; cc-mode-help@merlin.cnri.reston.va.us.  Please don't send bug
! ;; reports to my personal account, I may not get it for a long time.
  
  ;; YOU CAN IGNORE ALL BYTE-COMPILER WARNINGS. They are the result of
! ;; the multi-Emacsen support.  Emacs 19, XEmacs 19 (formerly
! ;; Lucid), and Emacs 18 all do things differently and there's no
! ;; way to shut the byte-compiler up at the necessary granularity.  Let
! ;; me say this again: YOU CAN IGNORE ALL BYTE-COMPILER WARNINGS (you'd
! ;; be surprised at how many people don't follow this advice :-).
  
  ;; If your Emacs is dumped with c-mode.el and/or c++-mode.el, you will
--- 39,69 ----
  ;;;    he may fix them for the FSF's sake.
  
! ;; This package provides modes in GNU Emacs for editing C, C++, 
! ;; Objective-C, and Java code. It is intended to be a replacement for
! ;; c-mode.el (a.k.a. BOCM -- Boring Old C-Mode), and c++-mode.el
! ;; (a.k.a cplus-md.el and cplus-md1.el), both of which are ancestors
! ;; of this file.  A number of important improvements have been made,
! ;; briefly: complete K&R C, ANSI C, `ARM' C++, Objective-C, and Java
! ;; support with consistent indentation across all modes, more
! ;; intuitive indentation controlling variables, compatibility across
! ;; all known Emacsen, nice new features, and tons of bug fixes.  This
! ;; package is called "cc-mode" to distinguish it from its ancestors,
! ;; but there really is no top-level cc-mode.  Usage and programming
! ;; details are contained in an accompanying texinfo manual.
! 
! ;; To submit bug reports, type "C-c C-b".  These will be sent to
! ;; bug-gnu-emacs@prep.ai.mit.edu and I'll read about them there (this
! ;; is mirrored as the Usenet newsgroup gnu.emacs.bug).  Questions can
! ;; sent to help-gnu-emacs@prep.ai.mit.edu (mirrored as
! ;; gnu.emacs.help).  Please do not send bugs or questions to my
! ;; personal account.
  
  ;; YOU CAN IGNORE ALL BYTE-COMPILER WARNINGS. They are the result of
! ;; the multi-Emacsen support.  Emacs 19 (from the FSF), XEmacs 19
! ;; (formerly Lucid Emacs), and GNU Emacs 18 all do things differently
! ;; and there's no way to shut the byte-compiler up at the necessary
! ;; granularity.  Let me say this again: YOU CAN IGNORE ALL
! ;; BYTE-COMPILER WARNINGS (you'd be surprised at how many people don't
! ;; follow this advice :-).
  
  ;; If your Emacs is dumped with c-mode.el and/or c++-mode.el, you will
***************
*** 73,102 ****
  ;; (makunbound 'c-style-alist)
  
! ;; There are three major mode entry points provided by this package,
  ;; one for editing C++ code, one for editing C code (both K&R and
! ;; ANSI), and one for editing Objective-C code.  To use cc-mode, add
! ;; the following to your .emacs file.  This assumes you will use .cc
! ;; or .C extensions for your C++ source, .c for your C code, and .m
! ;; for your Objective-C code:
  ;;
  ;; (autoload 'c++-mode  "cc-mode" "C++ Editing Mode" t)
  ;; (autoload 'c-mode    "cc-mode" "C Editing Mode" t)
  ;; (autoload 'objc-mode "cc-mode" "Objective-C Editing Mode" t)
  ;; (setq auto-mode-alist
! ;;   (append '(("\\.C$"  . c++-mode)
! ;;             ("\\.cc$" . c++-mode)
! ;;             ("\\.c$"  . c-mode)
! ;;             ("\\.h$"  . c-mode)
! ;;             ("\\.m$"  . objc-mode)
  ;;            ) auto-mode-alist))
- 
- ;; Several Majordomo mailing lists exist for those of you who are
- ;; interested in beta testing new versions: cc-mode-announce for
- ;; announcements of new beta versions only, and cc-mode-victims for
- ;; more technical discussions of the mode.  For more information, send
- ;; the word `help' in a message to one of the following addresses:
  ;;
! ;;       cc-mode-victims-request@merlin.cnri.reston.va.us
! ;;       cc-mode-announce-request@merlin.cnri.reston.va.us
  
  ;; Many, many thanks go out to all the folks on the beta test list.
--- 77,112 ----
  ;; (makunbound 'c-style-alist)
  
! ;; If your Emacs comes with cc-mode already (and as of 18-Jan-1996,
! ;; XEmacs 19.13 and Emacs 19.30 both do), you only need to add the
! ;; following to use the latest version of cc-mode:
! ;;
! ;; (load "cc-mode")
! ;;
! ;; Make sure the new version is earlier on your load-path.
! 
! ;; There are four major mode entry points provided by this package,
  ;; one for editing C++ code, one for editing C code (both K&R and
! ;; ANSI), one for editing Objective-C code, and one for editing Java
! ;; code.  The commands are M-x c-mode, M-x c++-mode, M-x objc-mode,
! ;; and M-x java-mode.
! 
! ;; If you are using an old version of Emacs which does not come
! ;; with cc-mode.el, you will need to do these things
! ;; to use it:
  ;;
  ;; (autoload 'c++-mode  "cc-mode" "C++ Editing Mode" t)
  ;; (autoload 'c-mode    "cc-mode" "C Editing Mode" t)
  ;; (autoload 'objc-mode "cc-mode" "Objective-C Editing Mode" t)
+ ;; (autoload 'java-mode "cc-mode" "Java Editing Mode" t)
  ;; (setq auto-mode-alist
! ;;   (append '(("\\.C$"    . c++-mode)
! ;;             ("\\.cc$"   . c++-mode)
! ;;             ("\\.c$"    . c-mode)
! ;;             ("\\.h$"    . c-mode)
! ;;             ("\\.m$"    . objc-mode)
! ;;             ("\\.java$" . java-mode)
  ;;            ) auto-mode-alist))
  ;;
! ;; You do not need these changes in Emacs versions that come with cc-mode.
  
  ;; Many, many thanks go out to all the folks on the beta test list.
*************** reported and the syntactic symbol is ign
*** 136,140 ****
      (inline-open           . +)
      (inline-close          . 0)
!     (ansi-funcdecl-cont    . -)
      (knr-argdecl-intro     . +)
      (knr-argdecl           . 0)
--- 146,150 ----
      (inline-open           . +)
      (inline-close          . 0)
!     (ansi-funcdecl-cont    . +)
      (knr-argdecl-intro     . +)
      (knr-argdecl           . 0)
*************** useful for Emacs 19.")
*** 435,439 ****
  
  (defvar c-style-alist
!   '(("GNU"
       (c-basic-offset . 2)
       (c-comment-only-line-offset . (0 . 0))
--- 445,449 ----
  
  (defvar c-style-alist
!   '(("gnu"
       (c-basic-offset . 2)
       (c-comment-only-line-offset . (0 . 0))
*************** useful for Emacs 19.")
*** 448,452 ****
  			 ))
       )
!     ("K&R"
       (c-basic-offset . 5)
       (c-comment-only-line-offset . 0)
--- 458,462 ----
  			 ))
       )
!     ("k&r"
       (c-basic-offset . 5)
       (c-comment-only-line-offset . 0)
*************** useful for Emacs 19.")
*** 458,462 ****
  			 ))
       )
!     ("BSD"
       (c-basic-offset . 4)
       (c-comment-only-line-offset . 0)
--- 468,472 ----
  			 ))
       )
!     ("bsd"
       (c-basic-offset . 4)
       (c-comment-only-line-offset . 0)
*************** useful for Emacs 19.")
*** 468,472 ****
  			 ))
       )
!     ("Stroustrup"
       (c-basic-offset . 4)
       (c-comment-only-line-offset . 0)
--- 478,482 ----
  			 ))
       )
!     ("stroustrup"
       (c-basic-offset . 4)
       (c-comment-only-line-offset . 0)
*************** useful for Emacs 19.")
*** 477,481 ****
  			 ))
       )
!     ("Whitesmith"
       (c-basic-offset . 4)
       (c-comment-only-line-offset . 0)
--- 487,491 ----
  			 ))
       )
!     ("whitesmith"
       (c-basic-offset . 4)
       (c-comment-only-line-offset . 0)
*************** useful for Emacs 19.")
*** 488,492 ****
  
       )
!     ("Ellemtel"
       (c-basic-offset . 3)
       (c-comment-only-line-offset . 0)
--- 498,502 ----
  
       )
!     ("ellemtel"
       (c-basic-offset . 3)
       (c-comment-only-line-offset . 0)
*************** useful for Emacs 19.")
*** 502,506 ****
                           (inline-open          . 0)
                           ))
!      ))
    "Styles of Indentation.
  Elements of this alist are of the form:
--- 512,532 ----
                           (inline-open          . 0)
                           ))
!      )
!     ("java"
!      (c-basic-offset . 2)
!      (c-comment-only-line-offset . (0 . 0))
!      (c-offsets-alist . ((statement-block-intro . +)
!  			 (knr-argdecl-intro     . 5)
!  			 (substatement-open     . +)
!  			 (label                 . 0)
!  			 (statement-case-open   . +)
!  			 (statement-cont        . +)
!  			 (arglist-intro . c-lineup-arglist-intro-after-paren)
!  			 (arglist-close . c-lineup-arglist)
!  			 (access-label  . 0)
! 			 ))
! 
!      )
!     )
    "Styles of Indentation.
  Elements of this alist are of the form:
*************** as described in `c-offsets-alist'.  Thes
*** 521,525 ****
  your style, only those that are different from the default.
  
! Note that all styles inherit from the \"CC-MODE\" style, which is
  computed at the time the mode is loaded.")
  
--- 547,551 ----
  your style, only those that are different from the default.
  
! Note that all styles inherit from the `cc-mode' style, which is
  computed at the time the mode is loaded.")
  
*************** as designated in the variable `c-file-of
*** 536,540 ****
    "*Variable interface for setting offsets via File Local Variables.
  In a file's Local Variable section, you can set this variable to an
! association list similiar to the values allowed in `c-offsets-alist'.
  When the file is visited, cc-mode will institute these offset settings
  automatically.
--- 562,566 ----
    "*Variable interface for setting offsets via File Local Variables.
  In a file's Local Variable section, you can set this variable to an
! association list similar to the values allowed in `c-offsets-alist'.
  When the file is visited, cc-mode will institute these offset settings
  automatically.
*************** Note that file offset settings are appli
*** 543,546 ****
--- 569,580 ----
  as designated in the variable `c-file-style'.")
  
+ (defvar c-site-default-style "gnu"
+   "Default style for your site.
+ To change the default style at your site, you can set this variable to
+ any style defined in `c-style-alist'.  However, if cc-mode is usually
+ loaded into your Emacs at compile time, you will need to set this
+ variable in the `site-init.el' file before cc-mode is loaded, then
+ re-dump Emacs.")
+ 
  (defvar c-mode-hook nil
    "*Hook called by `c-mode'.")
*************** as designated in the variable `c-file-st
*** 549,552 ****
--- 583,588 ----
  (defvar objc-mode-hook nil
    "*Hook called by `objc-mode'.")
+ (defvar java-mode-hook nil
+   "*Hook called by `java-mode'.")
  
  (defvar c-mode-common-hook nil
*************** as designated in the variable `c-file-st
*** 567,571 ****
      ["Forward Statement"      c-end-of-statement t]
      )
!   "XEmacs 19 (formerly Lucid) menu for C/C++/ObjC modes.")
  
  
--- 603,657 ----
      ["Forward Statement"      c-end-of-statement t]
      )
!   "XEmacs 19 menu for C/C++/ObjC modes.")
! 
! ;; Sadly we need this for a macro in Emacs 19.
! (eval-when-compile
!   ;; Imenu isn't used in XEmacs, so just ignore load errors.
!   (condition-case ()
!       (require 'imenu)
!     (error nil)))
! 
! (defvar cc-imenu-c++-generic-expression
!   (` 
!    ((nil
!      (, 
!       (concat
!        "^"				; beginning of line is required
!        "\\(template[ \t]*<[^>]+>[ \t]*\\)?" ; there may be a "template <...>"
!        "\\([a-zA-Z0-9_:]+[ \t]+\\)?"	; type specs; there can be no
!        "\\([a-zA-Z0-9_:]+[ \t]+\\)?"	; more than 3 tokens, right?
!         
!        "\\("				; last type spec including */&
!        "[a-zA-Z0-9_:]+"
!        "\\([ \t]*[*&]+[ \t]*\\|[ \t]+\\)" ; either pointer/ref sign or whitespace
!        "\\)?"				; if there is a last type spec
!        "\\("				; name; take that into the imenu entry
!        "[a-zA-Z0-9_:~]+"		; member function, ctor or dtor...
!  					; (may not contain * because then 
!  					; "a::operator char*" would become "char*"!)
!        "\\|"
!        "\\([a-zA-Z0-9_:~]*::\\)?operator"
!        "[^a-zA-Z1-9_][^(]*"		; ...or operator
!        " \\)"
!        "[ \t]*([^)]*)[ \t\n]*[^		;]" ; require something other than a ; after
!  					; the (...) to avoid prototypes.  Can't
!  					; catch cases with () inside the parentheses
!  					; surrounding the parameters
!  					; (like "int foo(int a=bar()) {...}"
!         
!        )) 6)    
!     ("Class" 
!      (, (concat 
!  	 "^"				; beginning of line is required
!  	 "\\(template[ \t]*<[^>]+>[ \t]*\\)?" ; there may be a "template <...>"
!  	 "class[ \t]+"
!  	 "\\([a-zA-Z0-9_]+\\)"		; this is the string we want to get
!  	 "[ \t]*[:{]"
!  	 )) 2)))
!   "Imenu generic expression for C++ mode.  See `imenu-generic-expression'.")
!  
! (defvar cc-imenu-c-generic-expression
!   cc-imenu-c++-generic-expression
!   "Imenu generic expression for C mode.  See `imenu-generic-expression'.")
  
  
*************** as designated in the variable `c-file-st
*** 584,587 ****
--- 670,674 ----
  	(minor (and (boundp 'emacs-minor-version)
  		    emacs-minor-version))
+ 	(re-suite 'old-re)
  	flavor comments)
      ;; figure out version numbers if not already discovered
*************** as designated in the variable `c-file-st
*** 606,624 ****
       ;; I don't know
       (t (error "Cannot recognize major version number: %s" major)))
!     ;; All XEmacs 19's (formerly Lucid) use 8-bit modify-syntax-entry
!     ;; flags, as do all patched (obsolete) Emacs 19, Emacs 18,
!     ;; Epoch 4's.  Only vanilla Emacs 19 uses 1-bit flag.  Lets be
!     ;; as smart as we can about figuring this out.
      (if (eq major 'v19)
  	(let ((table (copy-syntax-table)))
  	  (modify-syntax-entry ?a ". 12345678" table)
! 	  (if (and (vectorp table)
! 		   (= (logand (lsh (aref table ?a) -16) 255) 255))
! 	      (setq comments '8-bit)
! 	    (setq comments '1-bit)))
        (setq comments 'no-dual-comments))
      ;; lets do some minimal sanity checking.
      (if (and (or
! 	      ;; Lemacs before 19.6 had bugs
  	      (and (eq major 'v19) (eq flavor 'XEmacs) (< minor 6))
  	      ;; Emacs 19 before 19.21 has known bugs
--- 693,726 ----
       ;; I don't know
       (t (error "Cannot recognize major version number: %s" major)))
!     ;; Regular expression suites...
!     (if (and (eq major 'v19)
! 	     (or (and (eq flavor 'XEmacs) (>= minor 14))
! 		 (and (eq flavor 'FSF) (>= minor 30))))
! 	(setq re-suite 'new-re))
!     ;; XEmacs 19 uses 8-bit modify-syntax-entry flags, as do all
!     ;; patched Emacs 19, Emacs 18, Epoch 4's.  Only Emacs 19 uses a
!     ;; 1-bit flag.  Let's be as smart as we can about figuring this
!     ;; out.
      (if (eq major 'v19)
  	(let ((table (copy-syntax-table)))
  	  (modify-syntax-entry ?a ". 12345678" table)
! 	  (cond
! 	   ;; XEmacs pre 20 and Emacs pre 19.30 use vectors for syntax tables.
! 	   ((vectorp table)
! 	    (if (= (logand (lsh (aref table ?a) -16) 255) 255)
! 		(setq comments '8-bit)
! 	      (setq comments '1-bit)))
! 	   ;; XEmacs 20 is known to be 8-bit
! 	   ((eq flavor 'XEmacs) (setq comments '8-bit))
! 	   ;; Emacs 19.30 and beyond are known to be 1-bit
! 	   ((eq flavor 'FSF) (setq comments '1-bit))
! 	   ;; Don't know what this is
! 	   (t (error "Couldn't figure out syntax table format."))
! 	   ))
!       ;; Emacs 18 has no support for dual comments
        (setq comments 'no-dual-comments))
      ;; lets do some minimal sanity checking.
      (if (and (or
! 	      ;; Lucid Emacs before 19.6 had bugs
  	      (and (eq major 'v19) (eq flavor 'XEmacs) (< minor 6))
  	      ;; Emacs 19 before 19.21 has known bugs
*************** the main release."
*** 660,666 ****
  	  (print (format
  "You are running a syntax patched Emacs 18 variant.  While this should
! work for you, you may want to consider upgrading to Emacs 19.
! The syntax patches are no longer supported either for syntax.c or cc-mode."))))
!     (list major comments))
    "A list of features extant in the Emacs you are using.
  There are many flavors of Emacs out there, each with different
--- 762,769 ----
  	  (print (format
  "You are running a syntax patched Emacs 18 variant.  While this should
! work for you, you may want to consider upgrading to Emacs 19.  The
! syntax patches are no longer supported either for syntax.c or
! cc-mode."))))
!     (list major comments re-suite))
    "A list of features extant in the Emacs you are using.
  There are many flavors of Emacs out there, each with different
*************** features supporting those needed by cc-m
*** 668,675 ****
  supported list, along with the values for this variable:
  
!  Vanilla Emacs 18/Epoch 4:   (v18 no-dual-comments)
!  Emacs 18/Epoch 4 (patch2):  (v18 8-bit)
!  XEmacs (formerly Lucid) 19: (v19 8-bit)
!  Emacs 19:                   (v19 1-bit).")
  
  (defvar c++-mode-abbrev-table nil
--- 771,782 ----
  supported list, along with the values for this variable:
  
!  Emacs 18/Epoch 4:           (v18 no-dual-comments RS)
!  Emacs 18/Epoch 4 (patch2):  (v18 8-bit RS)
!  XEmacs 19:                  (v19 8-bit RS)
!  Emacs 19:                   (v19 1-bit RS)
! 
! RS is the regular expression suite to use.  XEmacs versions after
! 19.13, and Emacs versions after 19.29 use the `new-re' regex suite.
! All other Emacsen use the `old-re' suite.")
  
  (defvar c++-mode-abbrev-table nil
*************** supported list, along with the values fo
*** 685,688 ****
--- 792,799 ----
  (define-abbrev-table 'objc-mode-abbrev-table ())
  
+ (defvar java-mode-abbrev-table nil
+   "Abbrev table in use in java-mode buffers.")
+ (define-abbrev-table 'java-mode-abbrev-table ())
+ 
  (defun c-mode-fsf-menu (name map)
    ;; Add menu to a keymap.  FSF menus suck.  Don't add them for
*************** supported list, along with the values fo
*** 728,732 ****
      ()
    ;; TBD: should we even worry about naming this keymap. My vote: no,
!   ;; because Emacs and XEmacs (formerly Lucid) do it differently.
    (setq c-mode-map (make-sparse-keymap))
    ;; put standard keybindings into MAP
--- 839,843 ----
      ()
    ;; TBD: should we even worry about naming this keymap. My vote: no,
!   ;; because Emacs and XEmacs do it differently.
    (setq c-mode-map (make-sparse-keymap))
    ;; put standard keybindings into MAP
*************** supported list, along with the values fo
*** 737,741 ****
    (define-key c-mode-map "#"         'c-electric-pound)
    (define-key c-mode-map ":"         'c-electric-colon)
!   ;; Lemacs 19.9 defines these two, the second of which is commented out
    ;; (define-key c-mode-map "\e{" 'c-insert-braces)
    ;; Commented out electric square brackets because nobody likes them.
--- 848,853 ----
    (define-key c-mode-map "#"         'c-electric-pound)
    (define-key c-mode-map ":"         'c-electric-colon)
!   ;; Lucid Emacs 19.9 defined these two, the second of which was
!   ;; commented out...
    ;; (define-key c-mode-map "\e{" 'c-insert-braces)
    ;; Commented out electric square brackets because nobody likes them.
*************** supported list, along with the values fo
*** 745,750 ****
    (define-key c-mode-map "\ea"       'c-beginning-of-statement)
    (define-key c-mode-map "\ee"       'c-end-of-statement)
!   ;; I'd rather use an adaptive fill program instead of this.
!   (define-key c-mode-map "\eq"       'c-fill-paragraph)
    (define-key c-mode-map "\C-c\C-n"  'c-forward-conditional)
    (define-key c-mode-map "\C-c\C-p"  'c-backward-conditional)
--- 857,865 ----
    (define-key c-mode-map "\ea"       'c-beginning-of-statement)
    (define-key c-mode-map "\ee"       'c-end-of-statement)
!   ;; Emacs 19.30 introduces fill-paragraph-function, but it's not in
!   ;; every version of Emacs cc-mode supports.
!   (if (not (boundp 'fill-paragraph-function))
!       ;; I'd rather use an adaptive fill program instead of this.
!       (define-key c-mode-map "\eq"   'c-fill-paragraph))
    (define-key c-mode-map "\C-c\C-n"  'c-forward-conditional)
    (define-key c-mode-map "\C-c\C-p"  'c-backward-conditional)
*************** supported list, along with the values fo
*** 754,758 ****
    ;; these are new keybindings, with no counterpart to BOCM
    (define-key c-mode-map ","         'c-electric-semi&comma)
-   (define-key c-mode-map "/"         'c-electric-slash)
    (define-key c-mode-map "*"         'c-electric-star)
    (define-key c-mode-map "\C-c\C-q"  'c-indent-defun)
--- 869,872 ----
*************** supported list, along with the values fo
*** 769,780 ****
    ;; conflicts with OOBR
    ;;(define-key c-mode-map "\C-c\C-v"  'c-version)
    ;; Emacs 19 defines menus in the mode map. This call will return
    ;; t on Emacs 19, otherwise no-op and return nil.
    (if (and (not (c-mode-fsf-menu "C" c-mode-map))
! 	   ;; in XEmacs (formerly Lucid) 19, we want the menu to popup
! 	   ;; when the 3rd button is hit.  In 19.10 and beyond this is
  	   ;; done automatically if we put the menu on mode-popup-menu
! 	   ;; variable, see c-common-init. RMS decided that this
! 	   ;; feature should not be included in Emacs.
  	   (boundp 'current-menubar)
  	   (not (boundp 'mode-popup-menu)))
--- 883,895 ----
    ;; conflicts with OOBR
    ;;(define-key c-mode-map "\C-c\C-v"  'c-version)
+   ;;
    ;; Emacs 19 defines menus in the mode map. This call will return
    ;; t on Emacs 19, otherwise no-op and return nil.
    (if (and (not (c-mode-fsf-menu "C" c-mode-map))
! 	   ;; in XEmacs 19, we want the menu to popup when the 3rd
! 	   ;; button is hit.  In Lucid Emacs 19.10 and beyond this is
  	   ;; done automatically if we put the menu on mode-popup-menu
! 	   ;; variable, see c-common-init. Emacs 19 uses C-Mouse-3 for
! 	   ;; this, and it works with no special effort.
  	   (boundp 'current-menubar)
  	   (not (boundp 'mode-popup-menu)))
*************** supported list, along with the values fo
*** 787,799 ****
    ;; In Emacs 19, it makes more sense to inherit c-mode-map
    (if (memq 'v19 c-emacs-features)
!       ;; XEmacs (formerly Lucid) and Emacs 19 do this differently
!       (if (not (fboundp 'set-keymap-parent))
! 	  (setq c++-mode-map (cons 'keymap c-mode-map))
  	(setq c++-mode-map (make-sparse-keymap))
  	(set-keymap-parent c++-mode-map c-mode-map))
      ;; Do it the hard way for Emacs 18 -- given by JWZ
      (setq c++-mode-map (nconc (make-sparse-keymap) c-mode-map)))
    ;; add bindings which are only useful for C++
    (define-key c++-mode-map "\C-c:"  'c-scope-operator)
    ;; Emacs 19 defines menus in the mode map. This call will return
    ;; t on Emacs 19, otherwise no-op and return nil.
--- 902,922 ----
    ;; In Emacs 19, it makes more sense to inherit c-mode-map
    (if (memq 'v19 c-emacs-features)
!       ;; XEmacs and Emacs 19 do this differently
!       (cond
!        ;; XEmacs 19.13
!        ((fboundp 'set-keymap-parents)
! 	(setq c++-mode-map (make-sparse-keymap))
! 	(set-keymap-parents c++-mode-map c-mode-map))
!        ((fboundp 'set-keymap-parent)
  	(setq c++-mode-map (make-sparse-keymap))
  	(set-keymap-parent c++-mode-map c-mode-map))
+        (t (setq c++-mode-map (cons 'keymap c-mode-map))))
      ;; Do it the hard way for Emacs 18 -- given by JWZ
      (setq c++-mode-map (nconc (make-sparse-keymap) c-mode-map)))
    ;; add bindings which are only useful for C++
    (define-key c++-mode-map "\C-c:"  'c-scope-operator)
+   (define-key c++-mode-map "/"      'c-electric-slash)
+   (define-key c++-mode-map "<"      'c-electric-lt-gt)
+   (define-key c++-mode-map ">"      'c-electric-lt-gt)
    ;; Emacs 19 defines menus in the mode map. This call will return
    ;; t on Emacs 19, otherwise no-op and return nil.
*************** supported list, along with the values fo
*** 806,824 ****
    ;; In Emacs 19, it makes more sense to inherit c-mode-map
    (if (memq 'v19 c-emacs-features)
!       ;; XEmacs (formerly Lucid) and Emacs 19 do this differently
!       (if (not (fboundp 'set-keymap-parent))
! 	  (setq objc-mode-map (cons 'keymap c-mode-map))
  	(setq objc-mode-map (make-sparse-keymap))
  	(set-keymap-parent objc-mode-map c-mode-map))
      ;; Do it the hard way for Emacs 18 -- given by JWZ
      (setq objc-mode-map (nconc (make-sparse-keymap) c-mode-map)))
    ;; add bindings which are only useful for Objective-C
!   ;;
!   ;; no additional bindings
!   ;;
    ;; Emacs 19 defines menus in the mode map. This call will return
    ;; t on Emacs 19, otherwise no-op and return nil.
    (c-mode-fsf-menu "ObjC" objc-mode-map))
  
  (defun c-populate-syntax-table (table)
    ;; Populate the syntax TABLE
--- 929,975 ----
    ;; In Emacs 19, it makes more sense to inherit c-mode-map
    (if (memq 'v19 c-emacs-features)
!       ;; XEmacs and Emacs 19 do this differently
!       (cond
!        ;; XEmacs 19.13
!        ((fboundp 'set-keymap-parents)
! 	(setq objc-mode-map (make-sparse-keymap))
! 	(set-keymap-parents objc-mode-map c-mode-map))
!        ((fboundp 'set-keymap-parent)
  	(setq objc-mode-map (make-sparse-keymap))
  	(set-keymap-parent objc-mode-map c-mode-map))
+        (t (setq objc-mode-map (cons 'keymap c-mode-map))))
      ;; Do it the hard way for Emacs 18 -- given by JWZ
      (setq objc-mode-map (nconc (make-sparse-keymap) c-mode-map)))
    ;; add bindings which are only useful for Objective-C
!   (define-key objc-mode-map "/"      'c-electric-slash)
    ;; Emacs 19 defines menus in the mode map. This call will return
    ;; t on Emacs 19, otherwise no-op and return nil.
    (c-mode-fsf-menu "ObjC" objc-mode-map))
  
+ (defvar java-mode-map ()
+   "Keymap used in java-mode buffers.")
+ (if java-mode-map
+     ()
+   ;; In Emacs 19, it makes more sense to inherit c-mode-map
+   (if (memq 'v19 c-emacs-features)
+       ;; XEmacs and Emacs 19 do this differently
+       (cond
+        ;; XEmacs 19.13
+        ((fboundp 'set-keymap-parents)
+ 	(setq java-mode-map (make-sparse-keymap))
+ 	(set-keymap-parents java-mode-map c-mode-map))
+        ((fboundp 'set-keymap-parent)
+ 	(setq java-mode-map (make-sparse-keymap))
+ 	(set-keymap-parent java-mode-map c-mode-map))
+        (t (setq java-mode-map (cons 'keymap c-mode-map)))
+        )
+     ;; Do it the hard way for Emacs 18 -- given by JWZ
+     (setq java-mode-map (nconc (make-sparse-keymap) c-mode-map)))
+   ;; add bindings which are only useful for Java
+   (define-key java-mode-map "/"      'c-electric-slash)
+   ;; Emacs 19 defines menus in the mode map. This call will return t
+   ;; on Emacs 19, otherwise no-op and return nil.
+   (c-mode-fsf-menu "Java" java-mode-map))
+ 
  (defun c-populate-syntax-table (table)
    ;; Populate the syntax TABLE
*************** supported list, along with the values fo
*** 840,844 ****
    (cond
     ((memq '8-bit c-emacs-features)
!     ;; XEmacs (formerly Lucid) has the best implementation
      (modify-syntax-entry ?/  ". 1456" table)
      (modify-syntax-entry ?*  ". 23"   table)
--- 991,995 ----
    (cond
     ((memq '8-bit c-emacs-features)
!     ;; XEmacs 19 has the best implementation
      (modify-syntax-entry ?/  ". 1456" table)
      (modify-syntax-entry ?*  ". 23"   table)
*************** supported list, along with the values fo
*** 894,897 ****
--- 1045,1060 ----
    )
  
+ (defvar java-mode-syntax-table nil
+   "Syntax table used in java-mode buffers.")
+ (if java-mode-syntax-table
+     ()
+   (setq java-mode-syntax-table (make-syntax-table))
+   (c-populate-syntax-table java-mode-syntax-table)
+   ;; add extra comment syntax
+   (c-setup-dual-comments java-mode-syntax-table)
+   ;; everyone gets these
+   (modify-syntax-entry ?@ "_" java-mode-syntax-table)
+   )
+ 
  (defvar c-hungry-delete-key nil
    "Internal state of hungry delete key feature.")
*************** supported list, along with the values fo
*** 910,913 ****
--- 1073,1080 ----
  (defvar c-class-key nil
    "Buffer local language-specific class key regexp.")
+ (defvar c-method-key nil
+   "Buffer local language-specific method regexp.")
+ (defvar c-double-slash-is-comments-p nil
+   "Buffer local language-specific comment style flag.")
  (defconst c-protection-key
    "\\<\\(public\\|protected\\|private\\)\\>"
*************** behavior that users are familiar with.")
*** 933,936 ****
--- 1100,1105 ----
  (make-variable-buffer-local 'c-access-key)
  (make-variable-buffer-local 'c-class-key)
+ (make-variable-buffer-local 'c-method-key)
+ (make-variable-buffer-local 'c-double-slash-is-comments-p)
  (make-variable-buffer-local 'c-baseclass-key)
  (make-variable-buffer-local 'c-recognize-knr-p)
*************** The expansion is entirely correct becaus
*** 999,1002 ****
--- 1168,1191 ----
    "Regexp describing a class or protocol declaration for Objective-C.")
  
+ (defconst c-Java-method-key
+   (concat
+    "^\\s *[+-]\\s *"
+    "\\(([^)]*)\\)?"			; return type
+    ;; \\s- in java syntax table does not include \n
+    ;; since it is considered the end of //-comments.
+    "[ \t\n]*" c-symbol-key)
+   "Regexp describing a Java method intro.")
+ (defconst c-Java-access-key
+   (concat c-protection-key)
+   "Regexp describing access specification keywords for Java.")
+ (defconst c-Java-class-key
+   (concat
+    "\\(interface\\|class\\)\\s +"
+    c-symbol-key				;name of the class
+    "\\(\\s *extends\\s *" c-symbol-key "\\)?" ;maybe followed by superclass 
+    ;;"\\(\\s *implements *[^{]+{\\)?"	;and maybe the adopted protocols list
+    )
+   "Regexp describing a class or protocol declaration for Java.")
+ 
  ;; KLUDGE ALERT.  We default these variables to their `C' values so
  ;; that non-cc-mode-ized modes that depend on c-mode will still work
*************** The expansion is entirely correct becaus
*** 1012,1015 ****
--- 1201,1240 ----
  
  ;;;###autoload
+ (defun c-mode ()
+   "Major mode for editing K&R and ANSI C code.
+ To submit a problem report, enter `\\[c-submit-bug-report]' from a
+ c-mode buffer.  This automatically sets up a mail buffer with version
+ information already added.  You just need to add a description of the
+ problem, including a reproducible test case and send the message.
+ 
+ To see what version of cc-mode you are running, enter `\\[c-version]'.
+ 
+ The hook variable `c-mode-hook' is run with no args, if that value is
+ bound and has a non-nil value.  Also the hook `c-mode-common-hook' is
+ run first.
+ 
+ Key bindings:
+ \\{c-mode-map}"
+   (interactive)
+   (kill-all-local-variables)
+   (set-syntax-table c-mode-syntax-table)
+   (setq major-mode 'c-mode
+ 	mode-name "C"
+ 	local-abbrev-table c-mode-abbrev-table)
+   (use-local-map c-mode-map)
+   (c-common-init)
+   (setq comment-start "/* "
+ 	comment-end   " */"
+ 	comment-multi-line t
+ 	c-conditional-key c-C-conditional-key
+ 	c-class-key c-C-class-key
+ 	c-baseclass-key nil
+ 	c-comment-start-regexp c-C-comment-start-regexp
+ 	imenu-generic-expression cc-imenu-c-generic-expression)
+   (run-hooks 'c-mode-common-hook)
+   (run-hooks 'c-mode-hook))
+ (setq c-list-of-mode-names (cons "C" c-list-of-mode-names))
+ 
+ ;;;###autoload
  (defun c++-mode ()
    "Major mode for editing C++ code.
*************** To submit a problem report, enter `\\[c-
*** 1017,1021 ****
  c++-mode buffer.  This automatically sets up a mail buffer with
  version information already added.  You just need to add a description
! of the problem, including a reproducable test case and send the
  message.
  
--- 1242,1246 ----
  c++-mode buffer.  This automatically sets up a mail buffer with
  version information already added.  You just need to add a description
! of the problem, including a reproducible test case, and send the
  message.
  
*************** To see what version of cc-mode you are r
*** 1023,1028 ****
  
  The hook variable `c++-mode-hook' is run with no args, if that
! variable is bound and has a non-nil value.  Also the common hook
! c-mode-common-hook is run first, by this defun, `c-mode', and `objc-mode'.
  
  Key bindings:
--- 1248,1253 ----
  
  The hook variable `c++-mode-hook' is run with no args, if that
! variable is bound and has a non-nil value.  Also the hook
! `c-mode-common-hook' is run first.
  
  Key bindings:
*************** Key bindings:
*** 1042,1046 ****
  	c-comment-start-regexp c-C++-comment-start-regexp
  	c-class-key c-C++-class-key
! 	c-access-key c-C++-access-key)
    (run-hooks 'c-mode-common-hook)
    (run-hooks 'c++-mode-hook))
--- 1267,1275 ----
  	c-comment-start-regexp c-C++-comment-start-regexp
  	c-class-key c-C++-class-key
! 	c-access-key c-C++-access-key
! 	c-double-slash-is-comments-p t
! 	imenu-generic-expression cc-imenu-c++-generic-expression)
!   (make-local-variable 'c-recognize-knr-p)
!   (setq c-recognize-knr-p nil)
    (run-hooks 'c-mode-common-hook)
    (run-hooks 'c++-mode-hook))
*************** Key bindings:
*** 1048,1086 ****
  
  ;;;###autoload
- (defun c-mode ()
-   "Major mode for editing K&R and ANSI C code.
- To submit a problem report, enter `\\[c-submit-bug-report]' from a
- c-mode buffer.  This automatically sets up a mail buffer with version
- information already added.  You just need to add a description of the
- problem, including a reproducable test case and send the message.
- 
- To see what version of cc-mode you are running, enter `\\[c-version]'.
- 
- The hook variable `c-mode-hook' is run with no args, if that value is
- bound and has a non-nil value.  Also the common hook
- c-mode-common-hook is run first, by this defun, `c++-mode', and `objc-mode'.
- 
- Key bindings:
- \\{c-mode-map}"
-   (interactive)
-   (kill-all-local-variables)
-   (set-syntax-table c-mode-syntax-table)
-   (setq major-mode 'c-mode
- 	mode-name "C"
- 	local-abbrev-table c-mode-abbrev-table)
-   (use-local-map c-mode-map)
-   (c-common-init)
-   (setq comment-start "/* "
- 	comment-end   " */"
- 	comment-multi-line t
- 	c-conditional-key c-C-conditional-key
- 	c-class-key c-C-class-key
- 	c-baseclass-key nil
- 	c-comment-start-regexp c-C-comment-start-regexp)
-   (run-hooks 'c-mode-common-hook)
-   (run-hooks 'c-mode-hook))
- (setq c-list-of-mode-names (cons "C" c-list-of-mode-names))
- 
- ;;;###autoload
  (defun objc-mode ()
    "Major mode for editing Objective C code.
--- 1277,1280 ----
*************** To submit a problem report, enter `\\[c-
*** 1088,1092 ****
  objc-mode buffer.  This automatically sets up a mail buffer with
  version information already added.  You just need to add a description
! of the problem, including a reproducable test case and send the
  message.
  
--- 1282,1286 ----
  objc-mode buffer.  This automatically sets up a mail buffer with
  version information already added.  You just need to add a description
! of the problem, including a reproducible test case, and send the
  message.
  
*************** To see what version of cc-mode you are r
*** 1094,1099 ****
  
  The hook variable `objc-mode-hook' is run with no args, if that value
! is bound and has a non-nil value.  Also the common hook
! c-mode-common-hook is run first, by this defun, `c-mode', and `c++-mode'.
  
  Key bindings:
--- 1288,1293 ----
  
  The hook variable `objc-mode-hook' is run with no args, if that value
! is bound and has a non-nil value.  Also the hook `c-mode-common-hook'
! is run first.
  
  Key bindings:
*************** Key bindings:
*** 1114,1122 ****
   	c-class-key c-ObjC-class-key
  	c-baseclass-key nil
! 	c-access-key c-ObjC-access-key)
    (run-hooks 'c-mode-common-hook)
    (run-hooks 'objc-mode-hook))
  (setq c-list-of-mode-names (cons "ObjC" c-list-of-mode-names))
  
  (defun c-common-init ()
    ;; Common initializations for c++-mode and c-mode.
--- 1308,1358 ----
   	c-class-key c-ObjC-class-key
  	c-baseclass-key nil
! 	c-access-key c-ObjC-access-key
! 	c-double-slash-is-comments-p t
! 	c-method-key c-ObjC-method-key)
    (run-hooks 'c-mode-common-hook)
    (run-hooks 'objc-mode-hook))
  (setq c-list-of-mode-names (cons "ObjC" c-list-of-mode-names))
  
+ ;;;###autoload
+ (defun java-mode ()
+   "Major mode for editing Java code.
+ To submit a problem report, enter `\\[c-submit-bug-report]' from an
+ java-mode buffer.  This automatically sets up a mail buffer with
+ version information already added.  You just need to add a description
+ of the problem, including a reproducible test case and send the
+ message.
+ 
+ To see what version of cc-mode you are running, enter `\\[c-version]'.
+ 
+ The hook variable `java-mode-hook' is run with no args, if that value
+ is bound and has a non-nil value.  Also the common hook
+ `c-mode-common-hook' is run first.
+ 
+ Key bindings:
+ \\{java-mode-map}"
+   (interactive)
+   (kill-all-local-variables)
+   (set-syntax-table java-mode-syntax-table)
+   (setq major-mode 'java-mode
+  	mode-name "Java"
+  	local-abbrev-table java-mode-abbrev-table)
+   (use-local-map java-mode-map)
+   (c-common-init)
+   (setq comment-start "// "
+  	comment-end   ""
+  	comment-multi-line nil
+  	c-conditional-key c-C-conditional-key
+  	c-comment-start-regexp c-C++-comment-start-regexp
+   	c-class-key c-Java-class-key
+ 	c-method-key c-Java-method-key
+ 	c-double-slash-is-comments-p t
+  	c-baseclass-key nil
+  	c-access-key c-Java-access-key)
+   (c-set-style "Java")
+   (run-hooks 'c-mode-common-hook)
+   (run-hooks 'java-mode-hook))
+ (setq c-list-of-mode-names (cons "Java" c-list-of-mode-names))
+ 
  (defun c-common-init ()
    ;; Common initializations for c++-mode and c-mode.
*************** Key bindings:
*** 1133,1141 ****
    (make-local-variable 'comment-column)
    (make-local-variable 'comment-start-skip)
    (make-local-variable 'outline-regexp)
    (make-local-variable 'outline-level)
    (make-local-variable 'adaptive-fill-regexp)
    ;; now set their values
!   (setq paragraph-start (concat page-delimiter "\\|$")
  	paragraph-separate paragraph-start
  	paragraph-ignore-fill-prefix t
--- 1369,1386 ----
    (make-local-variable 'comment-column)
    (make-local-variable 'comment-start-skip)
+   (make-local-variable 'comment-multi-line)
    (make-local-variable 'outline-regexp)
    (make-local-variable 'outline-level)
    (make-local-variable 'adaptive-fill-regexp)
+   (make-local-variable 'imenu-generic-expression) ;set in the mode functions
+   ;; Emacs 19.30 and beyond only, AFAIK
+   (if (boundp 'fill-paragraph-function)
+       (progn
+ 	(make-local-variable 'fill-paragraph-function)
+ 	(setq fill-paragraph-function 'c-fill-paragraph)))
    ;; now set their values
!   (setq paragraph-start (if (memq 'new-re c-emacs-features)
! 			    (concat page-delimiter "\\|$")
! 			  (concat "^$\\|" page-delimiter))
  	paragraph-separate paragraph-start
  	paragraph-ignore-fill-prefix t
*************** Key bindings:
*** 1160,1165 ****
      (make-local-variable 'comment-indent-hook)
      (setq comment-indent-hook 'c-comment-indent))
!   ;; put C menu into menubar and on popup menu for XEmacs (formerly
!   ;; Lucid) 19. I think this happens automatically for Emacs 19.
    (if (and (boundp 'current-menubar)
  	   current-menubar
--- 1405,1410 ----
      (make-local-variable 'comment-indent-hook)
      (setq comment-indent-hook 'c-comment-indent))
!   ;; Put C menu into menubar and on popup menu for XEmacs 19. I think
!   ;; this happens automatically for Emacs 19.
    (if (and (boundp 'current-menubar)
  	   current-menubar
*************** Key bindings:
*** 1191,1195 ****
  
  (defun c-postprocess-file-styles ()
!   "Function that post processes relevent file local variables.
  Currently, this function simply applies any style and offset settings
  found in the file's Local Variable list.  It first applies any style
--- 1436,1440 ----
  
  (defun c-postprocess-file-styles ()
!   "Function that post processes relevant file local variables.
  Currently, this function simply applies any style and offset settings
  found in the file's Local Variable list.  It first applies any style
*************** it finds in `c-file-offsets'."
*** 1209,1214 ****
  	c-file-offsets)))
  
! ;; Add the posprocessing function to hack-local-variables-hook.  As of
! ;; 28-Aug-1995, XEmacs 19.12 and Emacs 19.29 support this.
  (and (fboundp 'add-hook)
       (add-hook 'hack-local-variables-hook 'c-postprocess-file-styles))
--- 1454,1459 ----
  	c-file-offsets)))
  
! ;; Add the postprocessing function to hack-local-variables-hook.  As
! ;; of 28-Aug-1995, XEmacs 19.12 and Emacs 19.29 support this.
  (and (fboundp 'add-hook)
       (add-hook 'hack-local-variables-hook 'c-postprocess-file-styles))
*************** global and affect all future `c-mode' bu
*** 1390,1395 ****
  ;; active regions, and auto-newline/hungry delete key
  (defun c-keep-region-active ()
!   ;; do whatever is necessary to keep the region active in Xemacs
!   ;; (formerly Lucid). ignore byte-compiler warnings you might see
    (and (boundp 'zmacs-region-stays)
         (setq zmacs-region-stays t)))
--- 1635,1640 ----
  ;; active regions, and auto-newline/hungry delete key
  (defun c-keep-region-active ()
!   ;; Do whatever is necessary to keep the region active in
!   ;; XEmacs 19. ignore byte-compiler warnings you might see
    (and (boundp 'zmacs-region-stays)
         (setq zmacs-region-stays t)))
*************** If numeric ARG is supplied or point is i
*** 1680,1685 ****
  is inhibited."
    (interactive "P")
!   (let ((indentp (and (memq major-mode '(c++-mode objc-mode))
! 		      (not arg)
  		      (= (preceding-char) ?/)
  		      (= last-command-char ?/)
--- 1925,1929 ----
  is inhibited."
    (interactive "P")
!   (let ((indentp (and (not arg)
  		      (= (preceding-char) ?/)
  		      (= last-command-char ?/)
*************** value of `c-cleanup-list'."
*** 1869,1875 ****
        )))
  
  ;; set up electric character functions to work with pending-del,
  ;; (a.k.a. delsel) mode.  All symbols get the t value except
! ;; c-electric-delete which gets 'supercede.
  (mapcar
   (function
--- 2113,2138 ----
        )))
  
+ (defun c-electric-lt-gt (arg)
+   "Insert a less-than, or greater-than character.
+ When the auto-newline feature is turned on, as evidenced by the \"/a\"
+ or \"/ah\" string on the mode line, the line will be re-indented if
+ the character inserted is the second of a C++ style stream operator
+ and the buffer is in C++ mode.
+ 
+ The line will also not be re-indented if a numeric argument is
+ supplied, or point is inside a literal."
+   (interactive "P")
+   (let ((indentp (and (not arg)
+ 		      (= (preceding-char) last-command-char)
+ 		      (not (c-in-literal))))
+ 	;; shut this up
+ 	(c-echo-syntactic-information-p nil))
+     (self-insert-command (prefix-numeric-value arg))
+     (if indentp
+ 	(c-indent-line))))
+ 
  ;; set up electric character functions to work with pending-del,
  ;; (a.k.a. delsel) mode.  All symbols get the t value except
! ;; c-electric-delete which gets 'supersede.
  (mapcar
   (function
*************** value of `c-cleanup-list'."
*** 1882,1885 ****
--- 2145,2149 ----
     c-electric-star
     c-electric-semi&comma
+    c-electric-lt-gt
     c-electric-colon))
  (put 'c-electric-delete 'delete-selection 'supersede) ; delsel
*************** offset for that syntactic element.  Opti
*** 1989,1992 ****
--- 2253,2257 ----
     stylevars))
  
+ ;;;###autoload
  (defun c-set-style (stylename)
    "Set cc-mode variables to use one of several different indentation styles.
*************** for details of setting up styles."
*** 1998,2009 ****
  					   mode-name)))
  		       (completing-read prompt c-style-alist nil t))))
!   (let ((vars (cdr (assoc stylename c-style-alist)))
! 	(default (cdr (assoc "CC-MODE" c-style-alist))))
      (or vars (error "Invalid indentation style `%s'" stylename))
!     (or default (error "No \"CC-MODE\" style found!"))
!     ;; first reset the style to CC-MODE to give every style a common
      ;; base. Then institute the new style.
      (c-set-style-1 default)
!     (if (not (string= stylename "CC-MODE"))
  	(c-set-style-1 vars)))
    (c-keep-region-active))
--- 2263,2277 ----
  					   mode-name)))
  		       (completing-read prompt c-style-alist nil t))))
!   (let ((vars (cdr (or (assoc (downcase stylename) c-style-alist)
! 		       ;; backwards compatibility
! 		       (assoc (upcase stylename) c-style-alist)
! 		       )))
! 	(default (cdr (assoc "cc-mode" c-style-alist))))
      (or vars (error "Invalid indentation style `%s'" stylename))
!     (or default (error "No `cc-mode' style found!"))
!     ;; first reset the style to `cc-mode' to give every style a common
      ;; base. Then institute the new style.
      (c-set-style-1 default)
!     (if (not (string= stylename "cc-mode"))
  	(c-set-style-1 vars)))
    (c-keep-region-active))
*************** VALUE.  This function also sets the curr
*** 2024,2027 ****
--- 2292,2296 ----
       (list stylename description
  	   (y-or-n-p "Set the style too? "))))
+   (setq style (downcase style))
    (let ((s (assoc style c-style-alist)))
      (if s
*************** Optional prefix ARG means justify paragr
*** 2045,2064 ****
  	    (skip-chars-forward " \t\n")
  	    (and (looking-at comment-start-skip)
! 		 (setq comment-start-place (point))))))
!     (if (and (memq major-mode '(c++-mode objc-mode))
  	     (save-excursion
  	       (beginning-of-line)
  	       (looking-at ".*//")))
  	(let (fill-prefix
- 	      (paragraph-start
  	       ;; Lines containing just a comment start or just an end
! 	       ;; should not be filled into paragraphs they are next to.
! 	       (concat 
! 		paragraph-start
! 		"\\|[ \t]*/\\*[ \t]*$\\|[ \t]*\\*/[ \t]*$\\|[ \t/*]*$"))
! 	      (paragraph-separate
! 	       (concat
! 		paragraph-separate
! 		"\\|[ \t]*/\\*[ \t]*$\\|[ \t]*\\*/[ \t]*$\\|[ \t/*]*$")))
  	  (save-excursion
  	    (beginning-of-line)
--- 2314,2332 ----
  	    (skip-chars-forward " \t\n")
  	    (and (looking-at comment-start-skip)
! 		 (setq comment-start-place (point)))))
! 	 (re1 (if (memq 'new-re c-emacs-features)
! 		  "\\|[ \t]*/\\*[ \t]*$\\|[ \t]*\\*/[ \t]*$\\|[ \t/*]*$"
! 		"\\|^[ \t]*/\\*[ \t]*$\\|^[ \t]*\\*/[ \t]*$\\|^[ \t/*]*$"))
! 	 )
!     (if (and c-double-slash-is-comments-p
  	     (save-excursion
  	       (beginning-of-line)
  	       (looking-at ".*//")))
  	(let (fill-prefix
  	       ;; Lines containing just a comment start or just an end
! 	       ;; should not be filled into paragraphs they are next
! 	       ;; to.
! 	      (paragraph-start (concat paragraph-start re1))
! 	      (paragraph-separate (concat paragraph-separate re1)))
  	  (save-excursion
  	    (beginning-of-line)
*************** Optional prefix ARG means justify paragr
*** 2084,2088 ****
  				  (point)))
  	      (fill-paragraph arg)
! 	      )))
        ;; else C style comments
        (if (or first-line
--- 2352,2356 ----
  				  (point)))
  	      (fill-paragraph arg)
! 	      t)))
        ;; else C style comments
        (if (or first-line
*************** Optional prefix ARG means justify paragr
*** 2146,2159 ****
  					(progn (end-of-line) (point))))))))
  
! 		(paragraph-start
! 		 ;; Lines containing just a comment start or just an end
! 		 ;; should not be filled into paragraphs they are next to.
! 		 (concat 
! 		  paragraph-start
! 		  "\\|[ \t]*/\\*[ \t]*$\\|[ \t]*\\*/[ \t]*$\\|[ \t/*]*$"))
! 		(paragraph-separate
! 		 (concat
! 		  paragraph-separate
! 		  "\\|[ \t]*/\\*[ \t]*$\\|[ \t]*\\*/[ \t]*$\\|[ \t/*]*$"))
  		(chars-to-delete 0))
  	    (save-restriction
--- 2414,2422 ----
  					(progn (end-of-line) (point))))))))
  
! 		;; Lines containing just a comment start or just an end
! 		;; should not be filled into paragraphs they are next
! 		;; to.
! 		(paragraph-start (concat paragraph-start re1))
! 		(paragraph-separate (concat paragraph-separate re1))
  		(chars-to-delete 0))
  	    (save-restriction
*************** Optional prefix ARG means justify paragr
*** 2201,2207 ****
  		    (let ((fill-column (+ fill-column 9999)))
  		      (forward-line -1)
! 		      (fill-region-as-paragraph (point) (point-max)))))))
! 	;; Outside of comments: do ordinary filling.
! 	(fill-paragraph arg)))))
  
  ;; better movement routines for ThisStyleOfVariablesCommonInCPlusPlus
--- 2464,2469 ----
  		    (let ((fill-column (+ fill-column 9999)))
  		      (forward-line -1)
! 		      (fill-region-as-paragraph (point) (point-max))))))
! 	    t)))))
  
  ;; better movement routines for ThisStyleOfVariablesCommonInCPlusPlus
*************** one.  If within a string or comment, or 
*** 2244,2250 ****
  whitespace between), move by sentences instead of statements.
  
! When called from a program, this function takes 2 optional args: the
! repetition count, a buffer position limit which is the farthest back to
! search, and a flag saying whether to do sentence motion when in a comment."
    (interactive (list (prefix-numeric-value current-prefix-arg)
  		     nil t))
--- 2506,2513 ----
  whitespace between), move by sentences instead of statements.
  
! When called from a program, this function takes 3 optional args: the
! repetition count, a buffer position limit which is the farthest back
! to search, and a flag saying whether to do sentence motion when in a
! comment."
    (interactive (list (prefix-numeric-value current-prefix-arg)
  		     nil t))
*************** the next statement if already at end.  I
*** 2283,2289 ****
  move by sentences instead of statements.
  
! When called from a program, this function takes 2 optional args: the
! repetition count, a buffer position limit which is the farthest back to
! search, and a flag saying whether to do sentence motion when in a comment."
    (interactive (list (prefix-numeric-value current-prefix-arg)
  		     nil t))
--- 2546,2553 ----
  move by sentences instead of statements.
  
! When called from a program, this function takes 3 optional args: the
! repetition count, a buffer position limit which is the farthest back
! to search, and a flag saying whether to do sentence motion when in a
! comment."
    (interactive (list (prefix-numeric-value current-prefix-arg)
  		     nil t))
*************** search, and a flag saying whether to do 
*** 2291,2295 ****
    (c-keep-region-active))
  
- 
  (defun c-beginning-of-statement-1 (&optional lim)
    ;; move to the start of the current statement, or the previous
--- 2555,2558 ----
*************** search, and a flag saying whether to do 
*** 2350,2361 ****
  					(<= lim (point))
  					(not (c-in-literal lim))
! ;;;					(looking-at c-conditional-key)
! 					;; backward-up-list could be slow
! 					;; but I don't see any other way.
! 					(save-excursion
! 					  (if (c-safe
! 					       (progn (backward-up-list 1) t))
! 					      (/= (following-char) ?\()
! 					    t))
  					))))
  		     ;; did we find a conditional?
--- 2613,2617 ----
  					(<= lim (point))
  					(not (c-in-literal lim))
! 					(looking-at c-conditional-key)
  					))))
  		     ;; did we find a conditional?
*************** search, and a flag saying whether to do 
*** 2408,2414 ****
  		       nil))
  		   (looking-at c-label-key))))
! 	 ;; CASE 8: ObjC method def
! 	 ((and (eq major-mode 'objc-mode)
! 	       (setq last-begin (c-in-objc-method-def-p)))
  	  (setq donep t))
  	 ;; CASE 9: nothing special
--- 2664,2670 ----
  		       nil))
  		   (looking-at c-label-key))))
! 	 ;; CASE 8: ObjC or Java method def
! 	 ((and c-method-key
! 	       (setq last-begin (c-in-method-def-p)))
  	  (setq donep t))
  	 ;; CASE 9: nothing special
*************** Optional SHUTUP-P if non-nil, inhibits m
*** 2654,2658 ****
  	(goto-char brace)
        (beginning-of-defun))
!     ;; if we're sitting at b-o-b, it might be becase there was no
      ;; least enclosing brace and we were sitting on the defun's open
      ;; brace.
--- 2910,2914 ----
  	(goto-char brace)
        (beginning-of-defun))
!     ;; if we're sitting at b-o-b, it might be because there was no
      ;; least enclosing brace and we were sitting on the defun's open
      ;; brace.
*************** Optional SHUTUP-P if non-nil, inhibits m
*** 2825,2829 ****
  	(set-marker (aref c-progress-info 1) nil)
  	(setq c-progress-info nil)
! 	(message "indenting region... done."))))
  
  
--- 3081,3085 ----
  	(set-marker (aref c-progress-info 1) nil)
  	(setq c-progress-info nil)
! 	(message "indenting region...done"))))
  
  
*************** Optional SHUTUP-P if non-nil, inhibits m
*** 3025,3029 ****
  	  (setq car (car cdr)
  		cdr (cdr cdr)))
!       ;; TBD: is this test relevent???
        (if (consp car)
  	  state				;on error, don't change
--- 3281,3285 ----
  	  (setq car (car cdr)
  		cdr (cdr cdr)))
!       ;; TBD: is this test relevant???
        (if (consp car)
  	  state				;on error, don't change
*************** Optional SHUTUP-P if non-nil, inhibits m
*** 3079,3090 ****
    (back-to-indentation))
  
! (defun c-in-objc-method-def-p ()
    ;; Return nil if we aren't in a method definition, otherwise the
    ;; position of the initial [+-].
    (save-excursion
      (beginning-of-line)
!     (if (looking-at c-ObjC-method-key)
!         (point)
!       nil)))
  
  (defun c-just-after-func-arglist-p (&optional containing)
--- 3335,3347 ----
    (back-to-indentation))
  
! (defun c-in-method-def-p ()
    ;; Return nil if we aren't in a method definition, otherwise the
    ;; position of the initial [+-].
    (save-excursion
      (beginning-of-line)
!     (and c-method-key
! 	 (looking-at c-method-key)
! 	 (point))
!     ))
  
  (defun c-just-after-func-arglist-p (&optional containing)
*************** Optional SHUTUP-P if non-nil, inhibits m
*** 3116,3120 ****
        (and (= (preceding-char) ?\))
  	   ;; check if we are looking at a method def
! 	   (or (not (eq major-mode 'objc-mode))
  	       (progn
  		 (forward-sexp -1)
--- 3373,3377 ----
        (and (= (preceding-char) ?\))
  	   ;; check if we are looking at a method def
! 	   (or (not c-method-key)
  	       (progn
  		 (forward-sexp -1)
*************** Optional SHUTUP-P if non-nil, inhibits m
*** 3153,3157 ****
  	      (if (zerop (setq do-level (1- do-level)))
  		  (setq foundp t)))
! 	     ((< (point) lim)
  	      (setq do-level 0)
  	      (goto-char lim))))
--- 3410,3414 ----
  	      (if (zerop (setq do-level (1- do-level)))
  		  (setq foundp t)))
! 	     ((<= (point) lim)
  	      (setq do-level 0)
  	      (goto-char lim))))
*************** Optional SHUTUP-P if non-nil, inhibits m
*** 3311,3317 ****
  		   ;; make sure we're really looking at the start of a
  		   ;; class definition, and not a forward decl, return
! 		   ;; arg, template arg list, or an ObjC method.
! 		   ((and (eq major-mode 'objc-mode)
! 			 (re-search-forward c-ObjC-method-key search-end t))
  		    (setq foundp nil))
  		   ;; Its impossible to define a regexp for this, and
--- 3568,3574 ----
  		   ;; make sure we're really looking at the start of a
  		   ;; class definition, and not a forward decl, return
! 		   ;; arg, template arg list, or an ObjC or Java method.
! 		   ((and c-method-key
! 			 (re-search-forward c-method-key search-end t))
  		    (setq foundp nil))
  		   ;; Its impossible to define a regexp for this, and
*************** Optional SHUTUP-P if non-nil, inhibits m
*** 3459,3464 ****
  	     (fullstate (c-parse-state))
  	     (state fullstate)
! 	     (in-method-intro-p (and (eq major-mode 'objc-mode)
! 				     (looking-at c-ObjC-method-key)))
  	     literal containing-sexp char-before-ip char-after-ip lim
  	     syntax placeholder c-in-literal-cache inswitch-p
--- 3716,3721 ----
  	     (fullstate (c-parse-state))
  	     (state fullstate)
! 	     (in-method-intro-p (and c-method-key
! 				     (looking-at c-method-key)))
  	     literal containing-sexp char-before-ip char-after-ip lim
  	     syntax placeholder c-in-literal-cache inswitch-p
*************** Optional SHUTUP-P if non-nil, inhibits m
*** 3566,3571 ****
  			 (= char-before-ip ?=))
  		     (save-excursion
! 		       (skip-chars-forward "^;" indent-point)
! 		       (/= (following-char) ?\;))))
  	      (c-add-syntax 'brace-list-open placeholder))
  	     ;; CASE 5A.3: inline defun open
--- 3823,3829 ----
  			 (= char-before-ip ?=))
  		     (save-excursion
! 		       (skip-chars-forward "^;(" indent-point)
! 		       (not (memq (following-char) '(?\; ?\()))
! 		       )))
  	      (c-add-syntax 'brace-list-open placeholder))
  	     ;; CASE 5A.3: inline defun open
*************** Optional SHUTUP-P if non-nil, inhibits m
*** 3604,3612 ****
  	      (c-add-syntax 'knr-argdecl-intro (c-point 'boi))
  	      (and inclass-p (c-add-syntax 'inclass (aref inclass-p 0))))
! 	     ;; CASE 5B.3: nether region after a C++ func decl
  	     (t
  	      (c-add-syntax 'ansi-funcdecl-cont (c-point 'boi))
! 	      (and inclass-p (c-add-syntax 'inclass (aref inclass-p 0))))
! 	     ))
  	   ;; CASE 5C: inheritance line. could be first inheritance
  	   ;; line, or continuation of a multiple inheritance
--- 3862,3871 ----
  	      (c-add-syntax 'knr-argdecl-intro (c-point 'boi))
  	      (and inclass-p (c-add-syntax 'inclass (aref inclass-p 0))))
! 	     ;; CASE 5B.3: Nether region after a C++ func decl, which
! 	     ;; could include a `throw' declaration.
  	     (t
+ 	      (c-beginning-of-statement-1 lim)
  	      (c-add-syntax 'ansi-funcdecl-cont (c-point 'boi))
! 	      )))
  	   ;; CASE 5C: inheritance line. could be first inheritance
  	   ;; line, or continuation of a multiple inheritance
*************** Optional SHUTUP-P if non-nil, inhibits m
*** 3733,3737 ****
  		     (c-backward-syntactic-ws lim))
  		   (and (= (preceding-char) ?\))
! 			(or (not (eq major-mode 'objc-mode))
  			    (progn
  			      (forward-sexp -1)
--- 3992,3996 ----
  		     (c-backward-syntactic-ws lim))
  		   (and (= (preceding-char) ?\))
! 			(or (not c-method-key)
  			    (progn
  			      (forward-sexp -1)
*************** Optional SHUTUP-P if non-nil, inhibits m
*** 3774,3783 ****
  		    (goto-char (aref inclass-p 1))
  		    (c-add-syntax 'inclass (c-point 'boi))))))
! 	   ;; CASE 5I: we are at a method definition continuation line
! 	   ((and (eq major-mode 'objc-mode)
  		 (progn
  		   (c-beginning-of-statement-1 lim)
  		   (beginning-of-line)
! 		   (looking-at c-ObjC-method-key)))
  	    (c-add-syntax 'objc-method-args-cont (point)))
  	   ;; CASE 5J: we are at a topmost continuation line
--- 4033,4043 ----
  		    (goto-char (aref inclass-p 1))
  		    (c-add-syntax 'inclass (c-point 'boi))))))
! 	   ;; CASE 5I: we are at an ObjC or Java method definition
! 	   ;; continuation line.
! 	   ((and c-method-key
  		 (progn
  		   (c-beginning-of-statement-1 lim)
  		   (beginning-of-line)
! 		   (looking-at c-method-key)))
  	    (c-add-syntax 'objc-method-args-cont (point)))
  	   ;; CASE 5J: we are at a topmost continuation line
*************** Optional SHUTUP-P if non-nil, inhibits m
*** 3794,3801 ****
  	  (cond
  	   ;; CASE 6A: we are looking at the arglist closing paren or
! 	   ;; at an Objective-C method call closing bracket.
  	   ((and (/= char-before-ip ?,)
  		 (memq char-after-ip '(?\) ?\])))
! 	    (if (and (eq major-mode 'objc-mode)
  		     (progn
  		       (goto-char (1- containing-sexp))
--- 4054,4061 ----
  	  (cond
  	   ;; CASE 6A: we are looking at the arglist closing paren or
! 	   ;; at an Objective-C or Java method call closing bracket.
  	   ((and (/= char-before-ip ?,)
  		 (memq char-after-ip '(?\) ?\])))
! 	    (if (and c-method-key
  		     (progn
  		       (goto-char (1- containing-sexp))
*************** Optional SHUTUP-P if non-nil, inhibits m
*** 3827,3831 ****
  	   ;; when we are inside a [] bracketed exp, and what precede
  	   ;; the opening bracket is not an identifier.
! 	   ((and (eq major-mode 'objc-mode)
  		 (= (char-after containing-sexp) ?\[)
  		 (save-excursion
--- 4087,4091 ----
  	   ;; when we are inside a [] bracketed exp, and what precede
  	   ;; the opening bracket is not an identifier.
! 	   ((and c-method-key
  		 (= (char-after containing-sexp) ?\[)
  		 (save-excursion
*************** Optional SHUTUP-P if non-nil, inhibits m
*** 3957,3966 ****
  	       ;; CASE 9B.3: catch-all for unknown construct.
  	       (t
! 		;; Even though this isn't right, it's the best I'm
! 		;; going to do for now. Exceptions probably fall
! 		;; through to here, but aren't supported yet.  Also,
! 		;; after the next release, I may call a recognition
! 		;; hook like so: (run-hooks 'c-recognize-hook), but I
! 		;; dunno.
  		(goto-char placeholder)
  		(c-add-syntax 'statement-cont (c-point 'boi))
--- 4217,4224 ----
  	       ;; CASE 9B.3: catch-all for unknown construct.
  	       (t
! 		;; Can and should I add an extensibility hook here?
! 		;; Something like c-recognize-hook so support for
! 		;; unknown constructs could be added.  It's probably a
! 		;; losing proposition, so I dunno.
  		(goto-char placeholder)
  		(c-add-syntax 'statement-cont (c-point 'boi))
*************** Optional SHUTUP-P if non-nil, inhibits m
*** 4107,4110 ****
--- 4365,4375 ----
  	      (goto-char indent-point)
  	      (c-beginning-of-statement-1 safepos)
+ 	      ;; It is possible we're on the brace that opens a nested
+ 	      ;; function.
+ 	      (if (and (= (following-char) ?{)
+ 		       (save-excursion
+ 			 (c-backward-syntactic-ws safepos)
+ 			 (/= (preceding-char) ?\;)))
+ 		  (c-beginning-of-statement-1 safepos))
  	      (c-add-syntax 'statement (c-point 'boi))
  	      (if (= char-after-ip ?{)
*************** definition and conveniently use this com
*** 4539,4555 ****
  (defun c-delete-backslash ()
    (end-of-line)
!   (forward-char -1)
!   (if (looking-at "\\\\")
!       (delete-region (1+ (point))
!                      (progn (skip-chars-backward " \t") (point)))))
  
  ;; defuns for submitting bug reports
  
! (defconst c-version (concat "4.249"
  			    " as included in "
! 			    emacs-version))
! (defconst c-mode-help-address
!   "cc-mode-help@merlin.cnri.reston.va.us, bug-gnu-emacs@prep.ai.mit.edu"
!   "Address for CC mode bug reports.")
  
  (defun c-version ()
--- 4804,4823 ----
  (defun c-delete-backslash ()
    (end-of-line)
!   (or (bolp)
!       (progn
!  	(forward-char -1)
!  	(if (looking-at "\\\\")
!  	    (delete-region (1+ (point))
!  			   (progn (skip-chars-backward " \t") (point)))))))
! 
  
  ;; defuns for submitting bug reports
  
! (defconst c-version (concat "4.282"
  			    " as included in "
! 			    emacs-version)
!   "cc-mode version number.")
! (defconst c-mode-help-address "bug-gnu-emacs@prep.ai.mit.edu"
!   "Address for cc-mode bug reports.")
  
  (defun c-version ()
*************** definition and conveniently use this com
*** 4578,4582 ****
  	      (cond ((eq major-mode 'c++-mode)  "C++")
  		    ((eq major-mode 'c-mode)    "C")
! 		    ((eq major-mode 'objc-mode) "ObjC"))
  	      ")")
        (let ((vars (list
--- 4846,4852 ----
  	      (cond ((eq major-mode 'c++-mode)  "C++")
  		    ((eq major-mode 'c-mode)    "C")
! 		    ((eq major-mode 'objc-mode) "ObjC")
! 		    ((eq major-mode 'java-mode) "Java")
! 		    )
  	      ")")
        (let ((vars (list
*************** definition and conveniently use this com
*** 4618,4622 ****
  
  
! ;; menus for XEmacs (formerly Lucid)
  (defun c-popup-menu (e)
    "Pops up the C/C++/ObjC menu."
--- 4888,4892 ----
  
  
! ;; menus for XEmacs 19
  (defun c-popup-menu (e)
    "Pops up the C/C++/ObjC menu."
*************** definition and conveniently use this com
*** 4627,4631 ****
  
  (defun c-copy-tree (tree)
!   ;; Line XEmacs 19.12's copy-tree
    (if (consp tree)
        (cons (c-copy-tree (car tree))
--- 4897,4901 ----
  
  (defun c-copy-tree (tree)
!   ;; Lift XEmacs 19.12's copy-tree
    (if (consp tree)
        (cons (c-copy-tree (car tree))
*************** definition and conveniently use this com
*** 4651,4661 ****
      ))
  
! ;; dynamically append the default value of most variables. This is
  ;; crucial because future c-set-style calls will always reset the
! ;; variables first to the "CC-MODE" style before instituting the new
  ;; style.  Only do this once!
! (or (assoc "CC-MODE" c-style-alist)
      (progn
!       (c-add-style "CC-MODE"
  		   (mapcar 'c-mapcar-defun
  			   '(c-backslash-column
--- 4921,4931 ----
      ))
  
! ;; Dynamically append the default value of most variables. This is
  ;; crucial because future c-set-style calls will always reset the
! ;; variables first to the `cc-mode' style before instituting the new
  ;; style.  Only do this once!
! (or (assoc "cc-mode" c-style-alist)
      (progn
!       (c-add-style "cc-mode"
  		   (mapcar 'c-mapcar-defun
  			   '(c-backslash-column
*************** definition and conveniently use this com
*** 4674,4681 ****
  			     c-tab-always-indent
  			     c-inhibit-startup-warnings-p
! 			     ))))
!     ;; the default style is now GNU.  This can be overridden in
!     ;; c-mode-common-hook or {c,c++,objc}-mode-hook.
!     (c-set-style "GNU"))
  
  ;; style variables
--- 4944,4951 ----
  			     c-tab-always-indent
  			     c-inhibit-startup-warnings-p
! 			     )))
!       ;; the default style is now GNU.  This can be overridden in
!       ;; c-mode-common-hook or {c,c++,objc}-mode-hook.
!       (c-set-style c-site-default-style)))
  
  ;; style variables
*************** definition and conveniently use this com
*** 4701,4706 ****
  (fset 'mark-c-function       'c-mark-function)
  (fset 'indent-c-exp          'c-indent-exp)
! (fset 'set-c-style           'c-set-style)
! ;; lemacs 19.9 + font-lock + cc-mode - c++-mode lossage
  (fset 'c++-beginning-of-defun 'beginning-of-defun)
  (fset 'c++-end-of-defun 'end-of-defun)
--- 4971,4976 ----
  (fset 'mark-c-function       'c-mark-function)
  (fset 'indent-c-exp          'c-indent-exp)
! ;;;###autoload (fset 'set-c-style           'c-set-style)
! ;; Lucid Emacs 19.9 + font-lock + cc-mode - c++-mode lossage
  (fset 'c++-beginning-of-defun 'beginning-of-defun)
  (fset 'c++-end-of-defun 'end-of-defun)
*************** definition and conveniently use this com
*** 4713,4717 ****
  	    (vars
  	     (list
! 	      (cons 'c++-c-mode-syntax-table 'c-mode-syntaxt-table)
  	      (cons 'c++-tab-always-indent 'c-tab-always-indent)
  	      (cons 'c++-always-arglist-indent-p na)
--- 4983,4987 ----
  	    (vars
  	     (list
! 	      (cons 'c++-c-mode-syntax-table 'c-mode-syntax-table)
  	      (cons 'c++-tab-always-indent 'c-tab-always-indent)
  	      (cons 'c++-always-arglist-indent-p na)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/cdl.el emacs-19.31/lisp/cdl.el
*** emacs-19.30/lisp/cdl.el	Mon Oct 30 11:51:22 1995
--- emacs-19.31/lisp/cdl.el	Sun Jan 14 02:34:30 1996
***************
*** 19,24 ****
  
  ;; 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.
  
  ;;; Code:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Code:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/chistory.el emacs-19.31/lisp/chistory.el
*** emacs-19.30/lisp/chistory.el	Thu Oct 20 15:59:07 1994
--- emacs-19.31/lisp/chistory.el	Sun Jan 14 02:34:30 1996
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/cl-compat.el emacs-19.31/lisp/cl-compat.el
*** emacs-19.30/lisp/cl-compat.el	Mon Oct 30 11:52:15 1995
--- emacs-19.31/lisp/cl-compat.el	Sun Jan 14 02:34:30 1996
***************
*** 20,25 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/cl-extra.el emacs-19.31/lisp/cl-extra.el
*** emacs-19.30/lisp/cl-extra.el	Mon Oct 30 11:52:42 1995
--- emacs-19.31/lisp/cl-extra.el	Tue Apr 16 00:34:16 1996
***************
*** 20,25 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** strings case-insensitively."
*** 84,93 ****
  	((stringp x)
  	 (and (stringp y) (= (length x) (length y))
! 	      (or (equal x y)
! 		  (equal (downcase x) (downcase y)))))   ; lazy but simple!
  	((numberp x)
  	 (and (numberp y) (= x y)))
  	((consp x)
! 	 (while (and (consp x) (consp y) (equalp (cl-pop x) (cl-pop y))))
  	 (and (not (consp x)) (equalp x y)))
  	((vectorp x)
--- 85,95 ----
  	((stringp x)
  	 (and (stringp y) (= (length x) (length y))
! 	      (or (string-equal x y)
! 		  (string-equal (downcase x) (downcase y)))))   ; lazy but simple!
  	((numberp x)
  	 (and (numberp y) (= x y)))
  	((consp x)
! 	 (while (and (consp x) (consp y) (equalp (car x) (car y)))
! 	   (setq x (cdr x) y (cdr y)))
  	 (and (not (consp x)) (equalp x y)))
  	((vectorp x)
*************** If so, return the true (non-nil) value r
*** 370,375 ****
    "Return the integer square root of the argument."
    (if (and (integerp a) (> a 0))
!       (let ((g (cond ((>= a 1000000) 10000) ((>= a 10000) 1000)
! 		     ((>= a 100) 100) (t 10)))
  	    g2)
  	(while (< (setq g2 (/ (+ g (/ a g)) 2)) g)
--- 372,377 ----
    "Return the integer square root of the argument."
    (if (and (integerp a) (> a 0))
!       (let ((g (cond ((<= a 100) 10) ((<= a 10000) 100)
! 		     ((<= a 1000000) 1000) (t a)))
  	    g2)
  	(while (< (setq g2 (/ (+ g (/ a g)) 2)) g)
*************** If so, return the true (non-nil) value r
*** 380,384 ****
  (defun cl-expt (x y)
    "Return X raised to the power of Y.  Works only for integer arguments."
!   (if (<= y 0) (if (= y 0) 1 (if (memq x '(-1 1)) x 0))
      (* (if (= (% y 2) 0) 1 x) (cl-expt (* x x) (/ y 2)))))
  (or (and (fboundp 'expt) (subrp (symbol-function 'expt)))
--- 382,386 ----
  (defun cl-expt (x y)
    "Return X raised to the power of Y.  Works only for integer arguments."
!   (if (<= y 0) (if (= y 0) 1 (if (memq x '(-1 1)) (cl-expt x (- y)) 0))
      (* (if (= (% y 2) 0) 1 x) (cl-expt (* x x) (/ y 2)))))
  (or (and (fboundp 'expt) (subrp (symbol-function 'expt)))
*************** If START or END is negative, it counts f
*** 589,593 ****
    "Make a copy of TREE.
  If TREE is a cons cell, this recursively copies both its car and its cdr.
! Constrast to copy-sequence, which copies only along the cdrs.  With second
  argument VECP, this copies vectors as well as conses."
    (if (consp tree)
--- 591,595 ----
    "Make a copy of TREE.
  If TREE is a cons cell, this recursively copies both its car and its cdr.
! Contrast to copy-sequence, which copies only along the cdrs.  With second
  argument VECP, this copies vectors as well as conses."
    (if (consp tree)
*************** This also does some trivial optimization
*** 889,893 ****
  				     '((quote --cl-rest--)))))))
  		 (list (car form) (list* 'lambda (cadadr form) body))))
! 	   form))
  	((memq (car form) '(defun defmacro))
  	 (list* (car form) (nth 1 form) (cl-macroexpand-body (cddr form) env)))
--- 891,898 ----
  				     '((quote --cl-rest--)))))))
  		 (list (car form) (list* 'lambda (cadadr form) body))))
! 	   (let ((found (assq (cadr form) env)))
! 	     (if (eq (cadr (caddr found)) 'cl-labels-args)
! 		 (cl-macroexpand-all (cadr (caddr (cadddr found))) env)
! 	       form))))
  	((memq (car form) '(defun defmacro))
  	 (list* (car form) (nth 1 form) (cl-macroexpand-body (cddr form) env)))
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/cl-indent.el emacs-19.31/lisp/cl-indent.el
*** emacs-19.30/lisp/cl-indent.el	Wed Jun  9 06:58:28 1993
--- emacs-19.31/lisp/cl-indent.el	Sun Jan 14 02:34:30 1996
***************
*** 3,7 ****
  ;; Copyright (C) 1987 Free Software Foundation, Inc.
  
! ;; Author: Richard Mlynark <mly@eddie.mit.edu>
  ;; Created: July 1987
  ;; Maintainer: FSF
--- 3,7 ----
  ;; Copyright (C) 1987 Free Software Foundation, Inc.
  
! ;; Author: Richard Mlynarik <mly@eddie.mit.edu>
  ;; Created: July 1987
  ;; Maintainer: FSF
***************
*** 21,26 ****
  
  ;; 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:
--- 21,27 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/cl-macs.el emacs-19.31/lisp/cl-macs.el
*** emacs-19.30/lisp/cl-macs.el	Mon Oct 30 11:53:11 1995
--- emacs-19.31/lisp/cl-macs.el	Tue Apr 16 00:34:26 1996
***************
*** 20,25 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** go back to their previous definitions, o
*** 1222,1225 ****
--- 1223,1230 ----
  	  (function
  	   (lambda (x)
+ 	     (if (or (and (fboundp (car x))
+ 			  (eq (car-safe (symbol-function (car x))) 'macro))
+ 		     (cdr (assq (car x) cl-macro-environment)))
+ 		 (error "Use `labels', not `flet', to rebind macro names"))
  	     (let ((func (list 'function*
  			       (list 'lambda (cadr x)
*************** go back to their previous definitions, o
*** 1233,1237 ****
  	 body))
  
! (defmacro labels (&rest args) (cons 'flet args))
  
  ;; The following ought to have a better definition for use with newer
--- 1238,1257 ----
  	 body))
  
! (defmacro labels (bindings &rest body)
!   "(labels ((FUNC ARGLIST BODY...) ...) FORM...): make temporary func bindings.
! This is like `flet', except the bindings are lexical instead of dynamic.
! Unlike `flet', this macro is fully complaint with the Common Lisp standard."
!   (let ((vars nil) (sets nil) (cl-macro-environment cl-macro-environment))
!     (while bindings
!       (let ((var (gensym)))
! 	(cl-push var vars)
! 	(cl-push (list 'function* (cons 'lambda (cdar bindings))) sets)
! 	(cl-push var sets)
! 	(cl-push (list (car (cl-pop bindings)) 'lambda '(&rest cl-labels-args)
! 		       (list 'list* '(quote funcall) (list 'quote var)
! 			     'cl-labels-args))
! 		 cl-macro-environment)))
!     (cl-macroexpand-all (list* 'lexical-let vars (cons (cons 'setq sets) body))
! 			cl-macro-environment)))
  
  ;; The following ought to have a better definition for use with newer
*************** copier, a `NAME-p' predicate, and setf-a
*** 2017,2021 ****
  	 (tag-symbol (intern (format "cl-struct-%s-tags" name)))
  	 (include-descs nil)
- 	 (include-tag-symbol nil)
  	 (side-eff nil)
  	 (type nil)
--- 2037,2040 ----
*************** copier, a `NAME-p' predicate, and setf-a
*** 2049,2055 ****
  					    (lambda (x)
  					      (if (consp x) x (list x))))
! 					   (cdr args))
! 		     include-tag-symbol (intern (format "cl-struct-%s-tags"
! 							include))))
  	      ((eq opt ':print-function)
  	       (setq print-func (car args)))
--- 2068,2072 ----
  					    (lambda (x)
  					      (if (consp x) x (list x))))
! 					   (cdr args))))
  	      ((eq opt ':print-function)
  	       (setq print-func (car args)))
*************** copier, a `NAME-p' predicate, and setf-a
*** 2089,2094 ****
  		named (assq 'cl-tag-slot descs))
  	  (if (cadr inc-type) (setq tag name named t))
! 	  (cl-push (list 'pushnew (list 'quote tag) include-tag-symbol)
! 		   forms))
        (if type
  	  (progn
--- 2106,2115 ----
  		named (assq 'cl-tag-slot descs))
  	  (if (cadr inc-type) (setq tag name named t))
! 	  (let ((incl include))
! 	    (while incl
! 	      (cl-push (list 'pushnew (list 'quote tag)
! 			     (intern (format "cl-struct-%s-tags" incl)))
! 		       forms)
! 	      (setq incl (get incl 'cl-struct-include)))))
        (if type
  	  (progn
*************** copier, a `NAME-p' predicate, and setf-a
*** 2197,2200 ****
--- 2218,2223 ----
  		    (list 'put (list 'quote name) '(quote cl-struct-type)
  			  (list 'quote (list type (eq named t))))
+ 		    (list 'put (list 'quote name) '(quote cl-struct-include)
+ 			  (list 'quote include))
  		    (list 'put (list 'quote name) '(quote cl-struct-print)
  			  print-auto)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/cl-seq.el emacs-19.31/lisp/cl-seq.el
*** emacs-19.30/lisp/cl-seq.el	Mon Oct 30 11:53:59 1995
--- emacs-19.31/lisp/cl-seq.el	Sun Jan 14 02:34:30 1996
***************
*** 20,25 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/cl-specs.el emacs-19.31/lisp/cl-specs.el
*** emacs-19.30/lisp/cl-specs.el	Mon Oct 30 11:51:57 1995
--- emacs-19.31/lisp/cl-specs.el	Sun Jan 14 02:34:30 1996
***************
*** 8,12 ****
  ;; cl-specs.el|Daniel LaLiberte|liberte@cs.uiuc.edu
  ;; |Edebug specs for cl.el
! ;; |$Date: 1995/10/30 16:51:55 $|1.1|
  
  ;; This file is part of GNU Emacs.
--- 8,12 ----
  ;; cl-specs.el|Daniel LaLiberte|liberte@cs.uiuc.edu
  ;; |Edebug specs for cl.el
! ;; |$Date: 1996/01/14 07:34:30 $|1.1|
  
  ;; This file is part of GNU Emacs.
***************
*** 23,28 ****
  
  ;; 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:
--- 23,29 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;;; Commentary:
***************
*** 31,35 ****
  ;; cl.el version 2.03 or later, by Dave Gillespie <daveg@synaptics.com>.
  
! ;; This file need not be byte-compiled, but it shouldnt hurt.
  
  (provide 'cl-specs)
--- 32,36 ----
  ;; cl.el version 2.03 or later, by Dave Gillespie <daveg@synaptics.com>.
  
! ;; This file need not be byte-compiled, but it shouldn't hurt.
  
  (provide 'cl-specs)
***************
*** 413,417 ****
  (def-edebug-spec loop-initial-final
    (&or ["initially" 
! 	;; [&optional &or "do" "doing"]  ;; CLtL2 doesnt allow this.
  	&rest loop-non-atomic-expr]
         ["finally" &or 
--- 414,418 ----
  (def-edebug-spec loop-initial-final
    (&or ["initially" 
! 	;; [&optional &or "do" "doing"]  ;; CLtL2 doesn't allow this.
  	&rest loop-non-atomic-expr]
         ["finally" &or 
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/cl.el emacs-19.31/lisp/cl.el
*** emacs-19.30/lisp/cl.el	Mon Oct 30 11:54:23 1995
--- emacs-19.31/lisp/cl.el	Sun Jan 14 02:34:30 1996
***************
*** 20,25 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/cmacexp.el emacs-19.31/lisp/cmacexp.el
*** emacs-19.30/lisp/cmacexp.el	Wed Oct 25 23:14:41 1995
--- emacs-19.31/lisp/cmacexp.el	Tue May 21 11:42:19 1996
***************
*** 1,8 ****
  ;;; cmacexp.el --- expand C macros in a region
  
! ;; Copyright (C) 1992, 1994 Free Software Foundation, Inc.
  
  ;; Author: Francesco Potorti` <pot@cnuce.cnr.it>
! ;; Version: $Id: cmacexp.el,v 1.20 1995/10/26 03:14:40 rms Exp $
  ;; Adapted-By: ESR
  ;; Keywords: c
--- 1,8 ----
  ;;; cmacexp.el --- expand C macros in a region
  
! ;; Copyright (C) 1992, 1994, 1996 Free Software Foundation, Inc.
  
  ;; Author: Francesco Potorti` <pot@cnuce.cnr.it>
! ;; Version: $Id: cmacexp.el,v 1.25 1996/05/21 15:42:13 kwzh Exp $
  ;; Adapted-By: ESR
  ;; Keywords: c
***************
*** 21,26 ****
  
  ;; 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.
  
  ;; USAGE =============================================================
--- 21,27 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;; USAGE =============================================================
***************
*** 96,100 ****
    "*Non-nil makes `c-macro-expand' prompt for preprocessor arguments.")
  
! (defvar c-macro-preprocessor "/lib/cpp -C"
    "The preprocessor used by the cmacexp package.
  
--- 97,103 ----
    "*Non-nil makes `c-macro-expand' prompt for preprocessor arguments.")
  
! (defvar c-macro-preprocessor
!   ;; Cannot rely on standard directory on MS-DOS to find CPP.
!   (if (eq system-type 'ms-dos) "cpp -C" "/lib/cpp -C")
    "The preprocessor used by the cmacexp package.
  
*************** For use inside Lisp programs, see also `
*** 200,204 ****
  				(window-height)
  			      window-min-height))
! 	    (setq maxheight (/ (screen-height) 2))
  	    (enlarge-window (- (min maxheight
  				    (max minheight
--- 203,207 ----
  				(window-height)
  			      window-min-height))
! 	    (setq maxheight (/ (frame-height) 2))
  	    (enlarge-window (- (min maxheight
  				    (max minheight
*************** Optional arg DISPLAY non-nil means show 
*** 238,242 ****
  		       (if (string= "" c-macro-cppflags) "" " ")
  		       c-macro-cppflags))
! 	(uniquestring "???!!!???!!! start of c-macro expansion ???!!!???!!!")
  	(startlinenum 0)
  	(linenum 0)
--- 241,245 ----
  		       (if (string= "" c-macro-cppflags) "" " ")
  		       c-macro-cppflags))
! 	(uniquestring "??? !!! ??? start of c-macro expansion ??? !!! ???")
  	(startlinenum 0)
  	(linenum 0)
*************** Optional arg DISPLAY non-nil means show 
*** 244,262 ****
  	(startmarker "")
  	(exit-status 0)
! 	(tempname (make-temp-name "/tmp/")))
      (unwind-protect
  	(save-excursion
  	  (save-restriction
  	    (widen)
! 	    (set-buffer outbuf)
! 	    (setq buffer-read-only nil)
! 	    (erase-buffer)
! 	    (set-syntax-table c-mode-syntax-table)
  	    (insert-buffer-substring inbuf 1 end))
  
  	  ;; We have copied inbuf to outbuf.  Point is at end of
! 	  ;; outbuf.  Insert a space at the end, so cpp can correctly
! 	  ;; parse a token ending at END. 
! 	  (insert " ")
  
  	  ;; Save sexp status and line number at START.
--- 247,269 ----
  	(startmarker "")
  	(exit-status 0)
! 	(tempname (make-temp-name (concat
! 				   (or (getenv "TMPDIR") (getenv "TEMP")
! 				       (getenv "TMP") "/tmp")
! 				   "/"))))
      (unwind-protect
  	(save-excursion
  	  (save-restriction
  	    (widen)
!             (let ((in-syntax-table (syntax-table)))
!               (set-buffer outbuf)
!               (setq buffer-read-only nil)
!               (erase-buffer)
!               (set-syntax-table in-syntax-table))
  	    (insert-buffer-substring inbuf 1 end))
  
  	  ;; We have copied inbuf to outbuf.  Point is at end of
! 	  ;; outbuf.  Inset a newline at the end, so cpp can correctly
! 	  ;; parse a token ending at END.
!           (insert "\n")
  
  	  ;; Save sexp status and line number at START.
*************** Optional arg DISPLAY non-nil means show 
*** 306,311 ****
  	  (if display (message mymsg))
  	  (setq exit-status
! 		(call-process-region 1 (point-max) "sh" t t nil "-c"
! 				     (concat cppcommand " 2>" tempname)))
  	  (if display (message (concat mymsg "done")))
  	  (if (= (buffer-size) 0)
--- 313,320 ----
  	  (if display (message mymsg))
  	  (setq exit-status
! 		(call-process-region 1 (point-max)
! 				     shell-file-name
! 				     t (list t tempname) nil "-c"
! 				     cppcommand))
  	  (if display (message (concat mymsg "done")))
  	  (if (= (buffer-size) 0)
*************** Optional arg DISPLAY non-nil means show 
*** 326,336 ****
  
  	  ;; If CPP got errors, show them at the beginning.
! 	  (or (eq exit-status 0)
  	      (progn
  		(goto-char (point-min))
! 		(insert (format "Preprocessor terminated with status %s\n"
! 				exit-status))
! 		(insert-file-contents tempname)
! 		(insert "\n")))
  	  (delete-file tempname)
  
--- 335,357 ----
  
  	  ;; If CPP got errors, show them at the beginning.
! 	  ;; MS-DOS shells don't return the exit code of their children.
! 	  ;; Look at the size of the error message file instead, but
! 	  ;; don't punish those MS-DOS users who have a shell that does
! 	  ;; return an error code.
! 	  (or (and (or (not (boundp 'msdos-shells))
! 		       (not (member (file-name-nondirectory shell-file-name)
! 				    msdos-shells)))
! 		   (eq exit-status 0))
! 	      (zerop (nth 7 (file-attributes (expand-file-name tempname))))
  	      (progn
  		(goto-char (point-min))
! 		;; Put the messages inside a comment, so they won't get in
! 		;; the way of font-lock, highlighting etc.
! 		(insert
! 		 (format "/* Preprocessor terminated with status %s\n\n   Messages from `%s\':\n\n"
! 			 exit-status cppcommand))
! 		(goto-char (+ (point)
! 			      (nth 1 (insert-file-contents tempname))))
! 		(insert "\n\n*/\n")))
  	  (delete-file tempname)
  
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/cmuscheme.el emacs-19.31/lisp/cmuscheme.el
*** emacs-19.30/lisp/cmuscheme.el	Wed Aug 16 10:39:23 1995
--- emacs-19.31/lisp/cmuscheme.el	Sun Jan 14 02:34:30 1996
***************
*** 20,67 ****
  
  ;; 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:
  
! ;;;    This is a customisation of comint-mode (see comint.el)
! ;;;
! ;;; Written by Olin Shivers (olin.shivers@cs.cmu.edu). With bits and pieces
! ;;; lifted from scheme.el, shell.el, clisp.el, newclisp.el, cobol.el, et al..
! ;;; 8/88
! ;;;
! ;;; Please send me bug reports, bug fixes, and extensions, so that I can
! ;;; merge them into the master source.
! ;;;
! ;;; The changelog is at the end of this file.
! ;;;
! ;;; NOTE: MIT Cscheme, when invoked with the -emacs flag, has a special user
! ;;; interface that communicates process state back to the superior emacs by
! ;;; outputting special control sequences. The gnumacs package, xscheme.el, has
! ;;; lots and lots of special purpose code to read these control sequences, and
! ;;; so is very tightly integrated with the cscheme process. The cscheme
! ;;; interrupt handler and debugger read single character commands in cbreak
! ;;; mode; when this happens, xscheme.el switches to special keymaps that bind
! ;;; the single letter command keys to emacs functions that directly send the
! ;;; character to the scheme process.  Cmuscheme mode does *not* provide this
! ;;; functionality. If you are a cscheme user, you may prefer to use the
! ;;; xscheme.el/cscheme -emacs interaction.
! ;;; 
! ;;; Here's a summary of the pros and cons, as I see them.
! ;;; xscheme: Tightly integrated with inferior cscheme process!  A few commands
! ;;;	     not in cmuscheme. But. Integration is a bit of a hack.  Input
! ;;;	     history only keeps the immediately prior input. Bizarre
! ;;;	     keybindings.
! ;;; 
! ;;; cmuscheme: Not tightly integrated with inferior cscheme process.  But.
! ;;;            Carefully integrated functionality with the entire suite of
! ;;;            comint-derived CMU process modes. Keybindings reminiscent of
! ;;;            Zwei and Hemlock. Good input history. A few commands not in
! ;;;            xscheme.
! ;;;  
! ;;; It's a tradeoff. Pay your money; take your choice. If you use a Scheme
! ;;; that isn't Cscheme, of course, there isn't a choice. Xscheme.el is *very*
! ;;; Cscheme-specific; you must use cmuscheme.el.  Interested parties are
! ;;; invited to port xscheme functionality on top of comint mode...
  
  ;;; Code:
--- 20,68 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
! ;;    This is a customisation of comint-mode (see comint.el)
! ;;
! ;; Written by Olin Shivers (olin.shivers@cs.cmu.edu). With bits and pieces
! ;; lifted from scheme.el, shell.el, clisp.el, newclisp.el, cobol.el, et al..
! ;; 8/88
! ;;
! ;; Please send me bug reports, bug fixes, and extensions, so that I can
! ;; merge them into the master source.
! ;;
! ;; The changelog is at the end of this file.
! ;;
! ;; NOTE: MIT Cscheme, when invoked with the -emacs flag, has a special user
! ;; interface that communicates process state back to the superior emacs by
! ;; outputting special control sequences. The gnumacs package, xscheme.el, has
! ;; lots and lots of special purpose code to read these control sequences, and
! ;; so is very tightly integrated with the cscheme process. The cscheme
! ;; interrupt handler and debugger read single character commands in cbreak
! ;; mode; when this happens, xscheme.el switches to special keymaps that bind
! ;; the single letter command keys to emacs functions that directly send the
! ;; character to the scheme process.  Cmuscheme mode does *not* provide this
! ;; functionality. If you are a cscheme user, you may prefer to use the
! ;; xscheme.el/cscheme -emacs interaction.
! ;; 
! ;; Here's a summary of the pros and cons, as I see them.
! ;; xscheme: Tightly integrated with inferior cscheme process!  A few commands
! ;;	     not in cmuscheme. But. Integration is a bit of a hack.  Input
! ;;	     history only keeps the immediately prior input. Bizarre
! ;;	     keybindings.
! ;; 
! ;; cmuscheme: Not tightly integrated with inferior cscheme process.  But.
! ;;            Carefully integrated functionality with the entire suite of
! ;;            comint-derived CMU process modes. Keybindings reminiscent of
! ;;            Zwei and Hemlock. Good input history. A few commands not in
! ;;            xscheme.
! ;;  
! ;; It's a tradeoff. Pay your money; take your choice. If you use a Scheme
! ;; that isn't Cscheme, of course, there isn't a choice. Xscheme.el is *very*
! ;; Cscheme-specific; you must use cmuscheme.el.  Interested parties are
! ;; invited to port xscheme functionality on top of comint mode...
  
  ;;; Code:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/comint.el emacs-19.31/lisp/comint.el
*** emacs-19.30/lisp/comint.el	Fri Oct 20 15:28:51 1995
--- emacs-19.31/lisp/comint.el	Sun Mar 17 10:28:55 1996
***************
*** 20,102 ****
  
  ;; 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:
  
! ;;; Please send me bug reports, bug fixes, and extensions, so that I can
! ;;; merge them into the master source.
! ;;;     - Olin Shivers (shivers@cs.cmu.edu)
! ;;;     - Simon Marshall (simon@gnu.ai.mit.edu)
! 
! ;;; This file defines a general command-interpreter-in-a-buffer package
! ;;; (comint mode). The idea is that you can build specific process-in-a-buffer
! ;;; modes on top of comint mode -- e.g., lisp, shell, scheme, T, soar, ....
! ;;; This way, all these specific packages share a common base functionality, 
! ;;; and a common set of bindings, which makes them easier to use (and
! ;;; saves code, implementation time, etc., etc.).
! 
! ;;; Several packages are already defined using comint mode:
! ;;; - shell.el defines a shell-in-a-buffer mode.
! ;;; - cmulisp.el defines a simple lisp-in-a-buffer mode.
! ;;;
! ;;; - The file cmuscheme.el defines a scheme-in-a-buffer mode.
! ;;; - The file tea.el tunes scheme and inferior-scheme modes for T.
! ;;; - The file soar.el tunes lisp and inferior-lisp modes for Soar.
! ;;; - cmutex.el defines tex and latex modes that invoke tex, latex, bibtex,
! ;;;   previewers, and printers from within emacs.
! ;;; - background.el allows csh-like job control inside emacs.
! ;;; It is pretty easy to make new derived modes for other processes.
! 
! ;;; For documentation on the functionality provided by comint mode, and
! ;;; the hooks available for customising it, see the comments below.
! ;;; For further information on the standard derived modes (shell, 
! ;;; inferior-lisp, inferior-scheme, ...), see the relevant source files.
! 
! ;;; For hints on converting existing process modes (e.g., tex-mode,
! ;;; background, dbx, gdb, kermit, prolog, telnet) to use comint-mode
! ;;; instead of shell-mode, see the notes at the end of this file.
  
  
! ;;; Brief Command Documentation:
! ;;;============================================================================
! ;;; Comint Mode Commands: (common to all derived modes, like shell & cmulisp
! ;;; mode)
! ;;;
! ;;; m-p	    comint-previous-input    	    Cycle backwards in input history
! ;;; m-n	    comint-next-input  	    	    Cycle forwards
! ;;; m-r     comint-previous-matching-input  Previous input matching a regexp
! ;;; m-s     comint-next-matching-input      Next input that matches
! ;;; m-c-l   comint-show-output		    Show last batch of process output
! ;;; return  comint-send-input
! ;;; c-d	    comint-delchar-or-maybe-eof     Delete char unless at end of buff
! ;;; c-c c-a comint-bol                      Beginning of line; skip prompt
! ;;; c-c c-u comint-kill-input	    	    ^u
! ;;; c-c c-w backward-kill-word    	    ^w
! ;;; c-c c-c comint-interrupt-subjob 	    ^c
! ;;; c-c c-z comint-stop-subjob	    	    ^z
! ;;; c-c c-\ comint-quit-subjob	    	    ^\
! ;;; c-c c-o comint-kill-output		    Delete last batch of process output
! ;;; c-c c-r comint-show-output		    Show last batch of process output
! ;;; c-c c-l comint-dynamic-list-input-ring  List input history
! ;;;
! ;;; Not bound by default in comint-mode (some are in shell mode)
! ;;; comint-run				Run a program under comint-mode
! ;;; send-invisible			Read a line w/o echo, and send to proc
! ;;; comint-dynamic-complete-filename	Complete filename at point.
! ;;; comint-dynamic-complete-variable    Complete variable name at point.
! ;;; comint-dynamic-list-filename-completions List completions in help buffer.
! ;;; comint-replace-by-expanded-filename	Expand and complete filename at point;
! ;;;					replace with expanded/completed name.
! ;;; comint-replace-by-expanded-history	Expand history at point;
! ;;;					replace with expanded name.
! ;;; comint-magic-space                  Expand history and add (a) space(s).
! ;;; comint-kill-subjob			No mercy.
! ;;; comint-show-maximum-output          Show as much output as possible.
! ;;; comint-continue-subjob		Send CONT signal to buffer's process
! ;;;					group. Useful if you accidentally
! ;;;					suspend your process (with C-c C-z).
  
! ;;; comint-mode-hook is the comint mode hook. Basically for your keybindings.
  
  ;;; Code:
--- 20,103 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
! ;; Please send me bug reports, bug fixes, and extensions, so that I can
! ;; merge them into the master source.
! ;;     - Olin Shivers (shivers@cs.cmu.edu)
! ;;     - Simon Marshall (simon@gnu.ai.mit.edu)
! 
! ;; This file defines a general command-interpreter-in-a-buffer package
! ;; (comint mode). The idea is that you can build specific process-in-a-buffer
! ;; modes on top of comint mode -- e.g., lisp, shell, scheme, T, soar, ....
! ;; This way, all these specific packages share a common base functionality, 
! ;; and a common set of bindings, which makes them easier to use (and
! ;; saves code, implementation time, etc., etc.).
! 
! ;; Several packages are already defined using comint mode:
! ;; - shell.el defines a shell-in-a-buffer mode.
! ;; - cmulisp.el defines a simple lisp-in-a-buffer mode.
! ;;
! ;; - The file cmuscheme.el defines a scheme-in-a-buffer mode.
! ;; - The file tea.el tunes scheme and inferior-scheme modes for T.
! ;; - The file soar.el tunes lisp and inferior-lisp modes for Soar.
! ;; - cmutex.el defines tex and latex modes that invoke tex, latex, bibtex,
! ;;   previewers, and printers from within emacs.
! ;; - background.el allows csh-like job control inside emacs.
! ;; It is pretty easy to make new derived modes for other processes.
! 
! ;; For documentation on the functionality provided by comint mode, and
! ;; the hooks available for customising it, see the comments below.
! ;; For further information on the standard derived modes (shell, 
! ;; inferior-lisp, inferior-scheme, ...), see the relevant source files.
! 
! ;; For hints on converting existing process modes (e.g., tex-mode,
! ;; background, dbx, gdb, kermit, prolog, telnet) to use comint-mode
! ;; instead of shell-mode, see the notes at the end of this file.
  
  
! ;; Brief Command Documentation:
! ;;============================================================================
! ;; Comint Mode Commands: (common to all derived modes, like shell & cmulisp
! ;; mode)
! ;;
! ;; m-p	    comint-previous-input    	    Cycle backwards in input history
! ;; m-n	    comint-next-input  	    	    Cycle forwards
! ;; m-r     comint-previous-matching-input  Previous input matching a regexp
! ;; m-s     comint-next-matching-input      Next input that matches
! ;; m-c-l   comint-show-output		    Show last batch of process output
! ;; return  comint-send-input
! ;; c-d	    comint-delchar-or-maybe-eof     Delete char unless at end of buff
! ;; c-c c-a comint-bol                      Beginning of line; skip prompt
! ;; c-c c-u comint-kill-input	    	    ^u
! ;; c-c c-w backward-kill-word    	    ^w
! ;; c-c c-c comint-interrupt-subjob 	    ^c
! ;; c-c c-z comint-stop-subjob	    	    ^z
! ;; c-c c-\ comint-quit-subjob	    	    ^\
! ;; c-c c-o comint-kill-output		    Delete last batch of process output
! ;; c-c c-r comint-show-output		    Show last batch of process output
! ;; c-c c-l comint-dynamic-list-input-ring  List input history
! ;;
! ;; Not bound by default in comint-mode (some are in shell mode)
! ;; comint-run				Run a program under comint-mode
! ;; send-invisible			Read a line w/o echo, and send to proc
! ;; comint-dynamic-complete-filename	Complete filename at point.
! ;; comint-dynamic-complete-variable    Complete variable name at point.
! ;; comint-dynamic-list-filename-completions List completions in help buffer.
! ;; comint-replace-by-expanded-filename	Expand and complete filename at point;
! ;;					replace with expanded/completed name.
! ;; comint-replace-by-expanded-history	Expand history at point;
! ;;					replace with expanded name.
! ;; comint-magic-space                  Expand history and add (a) space(s).
! ;; comint-kill-subjob			No mercy.
! ;; comint-show-maximum-output          Show as much output as possible.
! ;; comint-continue-subjob		Send CONT signal to buffer's process
! ;;					group. Useful if you accidentally
! ;;					suspend your process (with C-c C-z).
  
! ;; comint-mode-hook is the comint mode hook. Basically for your keybindings.
  
  ;;; Code:
***************
*** 104,138 ****
  (require 'ring)
  
! ;;; Buffer Local Variables:
! ;;;============================================================================
! ;;; Comint mode buffer local variables:
! ;;;     comint-prompt-regexp    - string       comint-bol uses to match prompt
! ;;;     comint-delimiter-argument-list - list  For delimiters and arguments
! ;;;     comint-last-input-start - marker       Handy if inferior always echoes
! ;;;     comint-last-input-end   - marker       For comint-kill-output command
! ;;;     comint-input-ring-size  - integer      For the input history
! ;;;     comint-input-ring       - ring             mechanism
! ;;;     comint-input-ring-index - number           ...
! ;;;     comint-input-autoexpand - symbol           ...
! ;;;     comint-input-ignoredups - boolean          ...
! ;;;     comint-last-input-match - string           ...
! ;;;     comint-dynamic-complete-functions - hook   For the completion mechanism
! ;;;     comint-completion-fignore - list           ...
! ;;;	comint-file-name-quote-list - list	   ...
! ;;;     comint-get-old-input    - function     Hooks for specific 
! ;;;     comint-input-filter-functions - hook     process-in-a-buffer
! ;;;     comint-output-filter-functions - hook    function modes.
! ;;;     comint-input-filter     - function         ...
! ;;;     comint-input-sender	- function         ...
! ;;;     comint-eol-on-send	- boolean          ...
! ;;;     comint-process-echoes   - boolean          ...
! ;;;     comint-scroll-to-bottom-on-input - symbol For scroll behavior
! ;;;     comint-scroll-to-bottom-on-output - symbol ...
! ;;;     comint-scroll-show-maximum-output - boolean...
! ;;;
! ;;; Comint mode non-buffer local variables:
! ;;;     comint-completion-addsuffix - boolean/cons  For file name completion
! ;;;     comint-completion-autolist  - boolean      behavior
! ;;;     comint-completion-recexact  - boolean      ...
  
  (defvar comint-prompt-regexp "^"
--- 105,139 ----
  (require 'ring)
  
! ;; Buffer Local Variables:
! ;;============================================================================
! ;; Comint mode buffer local variables:
! ;;     comint-prompt-regexp    - string       comint-bol uses to match prompt
! ;;     comint-delimiter-argument-list - list  For delimiters and arguments
! ;;     comint-last-input-start - marker       Handy if inferior always echoes
! ;;     comint-last-input-end   - marker       For comint-kill-output command
! ;;     comint-input-ring-size  - integer      For the input history
! ;;     comint-input-ring       - ring             mechanism
! ;;     comint-input-ring-index - number           ...
! ;;     comint-input-autoexpand - symbol           ...
! ;;     comint-input-ignoredups - boolean          ...
! ;;     comint-last-input-match - string           ...
! ;;     comint-dynamic-complete-functions - hook   For the completion mechanism
! ;;     comint-completion-fignore - list           ...
! ;;	comint-file-name-quote-list - list	   ...
! ;;     comint-get-old-input    - function     Hooks for specific 
! ;;     comint-input-filter-functions - hook     process-in-a-buffer
! ;;     comint-output-filter-functions - hook    function modes.
! ;;     comint-input-filter     - function         ...
! ;;     comint-input-sender	- function         ...
! ;;     comint-eol-on-send	- boolean          ...
! ;;     comint-process-echoes   - boolean          ...
! ;;     comint-scroll-to-bottom-on-input - symbol For scroll behavior
! ;;     comint-scroll-to-bottom-on-output - symbol ...
! ;;     comint-scroll-show-maximum-output - boolean...
! ;;
! ;; Comint mode non-buffer local variables:
! ;;     comint-completion-addsuffix - boolean/cons  For file name completion
! ;;     comint-completion-autolist  - boolean      behavior
! ;;     comint-completion-recexact  - boolean      ...
  
  (defvar comint-prompt-regexp "^"
*************** This variable is buffer-local.")
*** 231,235 ****
  This is used by `comint-watch-for-password-prompt'.")
  
! ;;; Here are the per-interpreter hooks.
  (defvar comint-get-old-input (function comint-get-old-input-default)
    "Function that returns old text in comint mode.
--- 232,236 ----
  This is used by `comint-watch-for-password-prompt'.")
  
! ;; Here are the per-interpreter hooks.
  (defvar comint-get-old-input (function comint-get-old-input-default)
    "Function that returns old text in comint mode.
*************** executed once when the buffer is created
*** 292,296 ****
  (defvar comint-ptyp t
    "Non-nil if communications via pty; false if by pipe.  Buffer local.
! This is to work around a bug in Emacs process signalling.")
  
  (defvar comint-input-ring nil)
--- 293,297 ----
  (defvar comint-ptyp t
    "Non-nil if communications via pty; false if by pipe.  Buffer local.
! This is to work around a bug in Emacs process signaling.")
  
  (defvar comint-input-ring nil)
*************** BUFFER can be either a buffer or the nam
*** 501,506 ****
      (and proc (memq (process-status proc) '(open run stop)))))
  
! ;;; Note that this guy, unlike shell.el's make-shell, barfs if you pass it ()
! ;;; for the second argument (program).
  ;;;###autoload
  (defun make-comint (name program &optional startfile &rest switches)
--- 502,507 ----
      (and proc (memq (process-status proc) '(open run stop)))))
  
! ;; Note that this guy, unlike shell.el's make-shell, barfs if you pass it ()
! ;; for the second argument (program).
  ;;;###autoload
  (defun make-comint (name program &optional startfile &rest switches)
*************** buffer.  The hook `comint-exec-hook' is 
*** 574,579 ****
      buffer)))
  
! ;;; This auxiliary function cranks up the process for comint-exec in
! ;;; the appropriate environment.
  
  (defun comint-exec-1 (name buffer command switches)
--- 575,580 ----
      buffer)))
  
! ;; This auxiliary function cranks up the process for comint-exec in
! ;; the appropriate environment.
  
  (defun comint-exec-1 (name buffer command switches)
*************** buffer.  The hook `comint-exec-hook' is 
*** 582,586 ****
  	  ;; If using termcap, we specify `emacs' as the terminal type
  	  ;; because that lets us specify a width.
! 	  ;; If using terminfo, we specify `unknown' because that is
  	  ;; a defined terminal type.  `emacs' is not a defined terminal type
  	  ;; and there is no way for us to define it here.
--- 583,587 ----
  	  ;; If using termcap, we specify `emacs' as the terminal type
  	  ;; because that lets us specify a width.
! 	  ;; If using terminfo, we specify `dumb' because that is
  	  ;; a defined terminal type.  `emacs' is not a defined terminal type
  	  ;; and there is no way for us to define it here.
*************** buffer.  The hook `comint-exec-hook' is 
*** 588,592 ****
  	  ;; if TERM is not a valid terminal type.
  	  (if (and (boundp 'system-uses-terminfo) system-uses-terminfo)
! 	      (list "TERM=unknown"
  		    (format "COLUMNS=%d" (frame-width)))
  	    (list "TERM=emacs"
--- 589,593 ----
  	  ;; if TERM is not a valid terminal type.
  	  (if (and (boundp 'system-uses-terminfo) system-uses-terminfo)
! 	      (list "TERM=dumb"
  		    (format "COLUMNS=%d" (frame-width)))
  	    (list "TERM=emacs"
*************** buffer.  The hook `comint-exec-hook' is 
*** 600,625 ****
      (apply 'start-process name buffer command switches)))
  
! ;;; Input history processing in a buffer
! ;;; ===========================================================================
! ;;; Useful input history functions, courtesy of the Ergo group.
! 
! ;;; Eleven commands:
! ;;; comint-dynamic-list-input-ring	List history in help buffer.
! ;;; comint-previous-input		Previous input...
! ;;; comint-previous-matching-input	...matching a string.
! ;;; comint-previous-matching-input-from-input ... matching the current input.
! ;;; comint-next-input			Next input...
! ;;; comint-next-matching-input		...matching a string.
! ;;; comint-next-matching-input-from-input     ... matching the current input.
! ;;; comint-backward-matching-input      Backwards input...
! ;;; comint-forward-matching-input       ...matching a string.
! ;;; comint-replace-by-expanded-history	Expand history at point;
! ;;;					replace with expanded history.
! ;;; comint-magic-space			Expand history and insert space.
! ;;;
! ;;; Three functions:
! ;;; comint-read-input-ring              Read into comint-input-ring...
! ;;; comint-write-input-ring             Write to comint-input-ring-file-name.
! ;;; comint-replace-by-expanded-history-before-point Workhorse function.
  
  (defun comint-read-input-ring (&optional silent)
--- 601,626 ----
      (apply 'start-process name buffer command switches)))
  
! ;; Input history processing in a buffer
! ;; ===========================================================================
! ;; Useful input history functions, courtesy of the Ergo group.
! 
! ;; Eleven commands:
! ;; comint-dynamic-list-input-ring	List history in help buffer.
! ;; comint-previous-input		Previous input...
! ;; comint-previous-matching-input	...matching a string.
! ;; comint-previous-matching-input-from-input ... matching the current input.
! ;; comint-next-input			Next input...
! ;; comint-next-matching-input		...matching a string.
! ;; comint-next-matching-input-from-input     ... matching the current input.
! ;; comint-backward-matching-input      Backwards input...
! ;; comint-forward-matching-input       ...matching a string.
! ;; comint-replace-by-expanded-history	Expand history at point;
! ;;					replace with expanded history.
! ;; comint-magic-space			Expand history and insert space.
! ;;
! ;; Three functions:
! ;; comint-read-input-ring              Read into comint-input-ring...
! ;; comint-write-input-ring             Write to comint-input-ring-file-name.
! ;; comint-replace-by-expanded-history-before-point Workhorse function.
  
  (defun comint-read-input-ring (&optional silent)
*************** Argument 0 is the command name."
*** 1098,1104 ****
         (function (lambda (a) a)) (nthcdr n (nreverse (nthcdr m args))) " "))))
  
! ;;;
! ;;; Input processing stuff
! ;;;
  
  (defun comint-send-input () 
--- 1099,1105 ----
         (function (lambda (a) a)) (nthcdr n (nreverse (nthcdr m args))) " "))))
  
! ;;
! ;; Input processing stuff
! ;;
  
  (defun comint-send-input () 
*************** The prompt skip is done by skipping text
*** 1378,1385 ****
    (if (null arg) (comint-skip-prompt)))
  
! ;;; These three functions are for entering text you don't want echoed or
! ;;; saved -- typically passwords to ftp, telnet, or somesuch.
! ;;; Just enter m-x send-invisible and type in your line, or add
! ;;; `comint-watch-for-password-prompt' to `comint-output-filter-functions'.
  
  (defun comint-read-noecho (prompt &optional stars)
--- 1379,1386 ----
    (if (null arg) (comint-skip-prompt)))
  
! ;; These three functions are for entering text you don't want echoed or
! ;; saved -- typically passwords to ftp, telnet, or somesuch.
! ;; Just enter m-x send-invisible and type in your line, or add
! ;; `comint-watch-for-password-prompt' to `comint-output-filter-functions'.
  
  (defun comint-read-noecho (prompt &optional stars)
*************** applications."
*** 1435,1440 ****
  (defun send-invisible (str)
    "Read a string without echoing.
! Then send it to the process running in the current buffer.  A new-line
! is additionally sent.  String is not saved on comint input history list.
  Security bug: your string can still be temporarily recovered with
  \\[view-lossage]."
--- 1436,1441 ----
  (defun send-invisible (str)
    "Read a string without echoing.
! Then send it to the process running in the current buffer.
! The string is sent using `comint-input-sender'.
  Security bug: your string can still be temporarily recovered with
  \\[view-lossage]."
*************** Security bug: your string can still be t
*** 1443,1449 ****
      (if (not proc)
  	(error "Current buffer has no process")
!       (comint-send-string
!        proc (if (stringp str) str (comint-read-noecho "Non-echoed text: " t)))
!       (comint-send-string proc "\n"))))
  
  (defun comint-watch-for-password-prompt (string) 
--- 1444,1449 ----
      (if (not proc)
  	(error "Current buffer has no process")
!       (funcall comint-input-sender proc
!        (if (stringp str) str (comint-read-noecho "Non-echoed text: " t))))))
  
  (defun comint-watch-for-password-prompt (string) 
*************** This function could be in the list `comi
*** 1457,1466 ****
        (send-invisible nil)))
  
! ;;; Low-level process communication
  
  (defalias 'comint-send-string 'process-send-string)
  (defalias 'comint-send-region 'process-send-region)
  
! ;;; Random input hackage
  
  (defun comint-kill-output ()
--- 1457,1466 ----
        (send-invisible nil)))
  
! ;; Low-level process communication
  
  (defalias 'comint-send-string 'process-send-string)
  (defalias 'comint-send-region 'process-send-region)
  
! ;; Random input hackage
  
  (defun comint-kill-output ()
*************** See `comint-prompt-regexp'."
*** 1583,1647 ****
    (comint-next-prompt (- n)))
  
! ;;; Support for source-file processing commands.
! ;;;============================================================================
! ;;; Many command-interpreters (e.g., Lisp, Scheme, Soar) have
! ;;; commands that process files of source text (e.g. loading or compiling
! ;;; files). So the corresponding process-in-a-buffer modes have commands
! ;;; for doing this (e.g., lisp-load-file). The functions below are useful
! ;;; for defining these commands.
! ;;;
! ;;; Alas, these guys don't do exactly the right thing for Lisp, Scheme
! ;;; and Soar, in that they don't know anything about file extensions.
! ;;; So the compile/load interface gets the wrong default occasionally.
! ;;; The load-file/compile-file default mechanism could be smarter -- it
! ;;; doesn't know about the relationship between filename extensions and
! ;;; whether the file is source or executable. If you compile foo.lisp
! ;;; with compile-file, then the next load-file should use foo.bin for
! ;;; the default, not foo.lisp. This is tricky to do right, particularly
! ;;; because the extension for executable files varies so much (.o, .bin,
! ;;; .lbin, .mo, .vo, .ao, ...).
! 
! 
! ;;; COMINT-SOURCE-DEFAULT -- determines defaults for source-file processing
! ;;; commands.
! ;;;
! ;;; COMINT-CHECK-SOURCE -- if FNAME is in a modified buffer, asks you if you
! ;;; want to save the buffer before issuing any process requests to the command
! ;;; interpreter.
! ;;;
! ;;; COMINT-GET-SOURCE -- used by the source-file processing commands to prompt
! ;;; for the file to process.
! 
! ;;; (COMINT-SOURCE-DEFAULT previous-dir/file source-modes)
! ;;;============================================================================
! ;;; This function computes the defaults for the load-file and compile-file
! ;;; commands for tea, soar, cmulisp, and cmuscheme modes. 
! ;;; 
! ;;; - PREVIOUS-DIR/FILE is a pair (directory . filename) from the last 
! ;;; source-file processing command. NIL if there hasn't been one yet.
! ;;; - SOURCE-MODES is a list used to determine what buffers contain source
! ;;; files: if the major mode of the buffer is in SOURCE-MODES, it's source.
! ;;; Typically, (lisp-mode) or (scheme-mode).
! ;;; 
! ;;; If the command is given while the cursor is inside a string, *and*
! ;;; the string is an existing filename, *and* the filename is not a directory,
! ;;; then the string is taken as default. This allows you to just position
! ;;; your cursor over a string that's a filename and have it taken as default.
! ;;;
! ;;; If the command is given in a file buffer whose major mode is in
! ;;; SOURCE-MODES, then the the filename is the default file, and the
! ;;; file's directory is the default directory.
! ;;; 
! ;;; If the buffer isn't a source file buffer (e.g., it's the process buffer),
! ;;; then the default directory & file are what was used in the last source-file
! ;;; processing command (i.e., PREVIOUS-DIR/FILE).  If this is the first time
! ;;; the command has been run (PREVIOUS-DIR/FILE is nil), the default directory
! ;;; is the cwd, with no default file. (\"no default file\" = nil)
! ;;; 
! ;;; SOURCE-REGEXP is typically going to be something like (tea-mode)
! ;;; for T programs, (lisp-mode) for Lisp programs, (soar-mode lisp-mode)
! ;;; for Soar programs, etc.
! ;;; 
! ;;; The function returns a pair: (default-directory . default-file).
  
  (defun comint-source-default (previous-dir/file source-modes)
--- 1583,1647 ----
    (comint-next-prompt (- n)))
  
! ;; Support for source-file processing commands.
! ;;============================================================================
! ;; Many command-interpreters (e.g., Lisp, Scheme, Soar) have
! ;; commands that process files of source text (e.g. loading or compiling
! ;; files). So the corresponding process-in-a-buffer modes have commands
! ;; for doing this (e.g., lisp-load-file). The functions below are useful
! ;; for defining these commands.
! ;;
! ;; Alas, these guys don't do exactly the right thing for Lisp, Scheme
! ;; and Soar, in that they don't know anything about file extensions.
! ;; So the compile/load interface gets the wrong default occasionally.
! ;; The load-file/compile-file default mechanism could be smarter -- it
! ;; doesn't know about the relationship between filename extensions and
! ;; whether the file is source or executable. If you compile foo.lisp
! ;; with compile-file, then the next load-file should use foo.bin for
! ;; the default, not foo.lisp. This is tricky to do right, particularly
! ;; because the extension for executable files varies so much (.o, .bin,
! ;; .lbin, .mo, .vo, .ao, ...).
! 
! 
! ;; COMINT-SOURCE-DEFAULT -- determines defaults for source-file processing
! ;; commands.
! ;;
! ;; COMINT-CHECK-SOURCE -- if FNAME is in a modified buffer, asks you if you
! ;; want to save the buffer before issuing any process requests to the command
! ;; interpreter.
! ;;
! ;; COMINT-GET-SOURCE -- used by the source-file processing commands to prompt
! ;; for the file to process.
! 
! ;; (COMINT-SOURCE-DEFAULT previous-dir/file source-modes)
! ;;============================================================================
! ;; This function computes the defaults for the load-file and compile-file
! ;; commands for tea, soar, cmulisp, and cmuscheme modes. 
! ;; 
! ;; - PREVIOUS-DIR/FILE is a pair (directory . filename) from the last 
! ;; source-file processing command. NIL if there hasn't been one yet.
! ;; - SOURCE-MODES is a list used to determine what buffers contain source
! ;; files: if the major mode of the buffer is in SOURCE-MODES, it's source.
! ;; Typically, (lisp-mode) or (scheme-mode).
! ;; 
! ;; If the command is given while the cursor is inside a string, *and*
! ;; the string is an existing filename, *and* the filename is not a directory,
! ;; then the string is taken as default. This allows you to just position
! ;; your cursor over a string that's a filename and have it taken as default.
! ;;
! ;; If the command is given in a file buffer whose major mode is in
! ;; SOURCE-MODES, then the the filename is the default file, and the
! ;; file's directory is the default directory.
! ;; 
! ;; If the buffer isn't a source file buffer (e.g., it's the process buffer),
! ;; then the default directory & file are what was used in the last source-file
! ;; processing command (i.e., PREVIOUS-DIR/FILE).  If this is the first time
! ;; the command has been run (PREVIOUS-DIR/FILE is nil), the default directory
! ;; is the cwd, with no default file. (\"no default file\" = nil)
! ;; 
! ;; SOURCE-REGEXP is typically going to be something like (tea-mode)
! ;; for T programs, (lisp-mode) for Lisp programs, (soar-mode lisp-mode)
! ;; for Soar programs, etc.
! ;; 
! ;; The function returns a pair: (default-directory . default-file).
  
  (defun comint-source-default (previous-dir/file source-modes)
*************** See `comint-prompt-regexp'."
*** 1654,1664 ****
  
  
! ;;; (COMINT-CHECK-SOURCE fname)
! ;;;============================================================================
! ;;; Prior to loading or compiling (or otherwise processing) a file (in the CMU
! ;;; process-in-a-buffer modes), this function can be called on the filename.
! ;;; If the file is loaded into a buffer, and the buffer is modified, the user
! ;;; is queried to see if he wants to save the buffer before proceeding with
! ;;; the load or compile.
  
  (defun comint-check-source (fname)
--- 1654,1664 ----
  
  
! ;; (COMINT-CHECK-SOURCE fname)
! ;;============================================================================
! ;; Prior to loading or compiling (or otherwise processing) a file (in the CMU
! ;; process-in-a-buffer modes), this function can be called on the filename.
! ;; If the file is loaded into a buffer, and the buffer is modified, the user
! ;; is queried to see if he wants to save the buffer before proceeding with
! ;; the load or compile.
  
  (defun comint-check-source (fname)
*************** See `comint-prompt-regexp'."
*** 1674,1698 ****
  
  
! ;;; (COMINT-GET-SOURCE prompt prev-dir/file source-modes mustmatch-p)
! ;;;============================================================================
! ;;; COMINT-GET-SOURCE is used to prompt for filenames in command-interpreter
! ;;; commands that process source files (like loading or compiling a file).
! ;;; It prompts for the filename, provides a default, if there is one,
! ;;; and returns the result filename.
! ;;; 
! ;;; See COMINT-SOURCE-DEFAULT for more on determining defaults.
! ;;; 
! ;;; PROMPT is the prompt string. PREV-DIR/FILE is the (directory . file) pair
! ;;; from the last source processing command.  SOURCE-MODES is a list of major
! ;;; modes used to determine what file buffers contain source files.  (These
! ;;; two arguments are used for determining defaults). If MUSTMATCH-P is true,
! ;;; then the filename reader will only accept a file that exists.
! ;;; 
! ;;; A typical use:
! ;;; (interactive (comint-get-source "Compile file: " prev-lisp-dir/file
! ;;;                                 '(lisp-mode) t))
  
! ;;; This is pretty stupid about strings. It decides we're in a string
! ;;; if there's a quote on both sides of point on the current line.
  (defun comint-extract-string ()
    "Return string around POINT that starts the current line, or nil." 
--- 1674,1698 ----
  
  
! ;; (COMINT-GET-SOURCE prompt prev-dir/file source-modes mustmatch-p)
! ;;============================================================================
! ;; COMINT-GET-SOURCE is used to prompt for filenames in command-interpreter
! ;; commands that process source files (like loading or compiling a file).
! ;; It prompts for the filename, provides a default, if there is one,
! ;; and returns the result filename.
! ;; 
! ;; See COMINT-SOURCE-DEFAULT for more on determining defaults.
! ;; 
! ;; PROMPT is the prompt string. PREV-DIR/FILE is the (directory . file) pair
! ;; from the last source processing command.  SOURCE-MODES is a list of major
! ;; modes used to determine what file buffers contain source files.  (These
! ;; two arguments are used for determining defaults). If MUSTMATCH-P is true,
! ;; then the filename reader will only accept a file that exists.
! ;; 
! ;; A typical use:
! ;; (interactive (comint-get-source "Compile file: " prev-lisp-dir/file
! ;;                                 '(lisp-mode) t))
  
! ;; This is pretty stupid about strings. It decides we're in a string
! ;; if there's a quote on both sides of point on the current line.
  (defun comint-extract-string ()
    "Return string around POINT that starts the current line, or nil." 
*************** See `comint-prompt-regexp'."
*** 1730,1757 ****
      (list (expand-file-name (substitute-in-file-name ans)))))
  
! ;;; I am somewhat divided on this string-default feature. It seems
! ;;; to violate the principle-of-least-astonishment, in that it makes
! ;;; the default harder to predict, so you actually have to look and see
! ;;; what the default really is before choosing it. This can trip you up.
! ;;; On the other hand, it can be useful, I guess. I would appreciate feedback
! ;;; on this.
! ;;;     -Olin
  
  
! ;;; Simple process query facility.
! ;;; ===========================================================================
! ;;; This function is for commands that want to send a query to the process
! ;;; and show the response to the user. For example, a command to get the
! ;;; arglist for a Common Lisp function might send a "(arglist 'foo)" query
! ;;; to an inferior Common Lisp process.
! ;;; 
! ;;; This simple facility just sends strings to the inferior process and pops
! ;;; up a window for the process buffer so you can see what the process
! ;;; responds with.  We don't do anything fancy like try to intercept what the
! ;;; process responds with and put it in a pop-up window or on the message
! ;;; line. We just display the buffer. Low tech. Simple. Works good.
  
! ;;; Send to the inferior process PROC the string STR. Pop-up but do not select
! ;;; a window for the inferior process so that its response can be seen.
  (defun comint-proc-query (proc str)
    (let* ((proc-buf (process-buffer proc))
--- 1730,1757 ----
      (list (expand-file-name (substitute-in-file-name ans)))))
  
! ;; I am somewhat divided on this string-default feature. It seems
! ;; to violate the principle-of-least-astonishment, in that it makes
! ;; the default harder to predict, so you actually have to look and see
! ;; what the default really is before choosing it. This can trip you up.
! ;; On the other hand, it can be useful, I guess. I would appreciate feedback
! ;; on this.
! ;;     -Olin
  
  
! ;; Simple process query facility.
! ;; ===========================================================================
! ;; This function is for commands that want to send a query to the process
! ;; and show the response to the user. For example, a command to get the
! ;; arglist for a Common Lisp function might send a "(arglist 'foo)" query
! ;; to an inferior Common Lisp process.
! ;; 
! ;; This simple facility just sends strings to the inferior process and pops
! ;; up a window for the process buffer so you can see what the process
! ;; responds with.  We don't do anything fancy like try to intercept what the
! ;; process responds with and put it in a pop-up window or on the message
! ;; line. We just display the buffer. Low tech. Simple. Works good.
  
! ;; Send to the inferior process PROC the string STR. Pop-up but do not select
! ;; a window for the inferior process so that its response can be seen.
  (defun comint-proc-query (proc str)
    (let* ((proc-buf (process-buffer proc))
*************** See `comint-prompt-regexp'."
*** 1775,1802 ****
  
  
! ;;; Filename/command/history completion in a buffer
! ;;; ===========================================================================
! ;;; Useful completion functions, courtesy of the Ergo group.
! 
! ;;; Six commands:
! ;;; comint-dynamic-complete		Complete or expand command, filename,
! ;;;                                     history at point.
! ;;; comint-dynamic-complete-filename	Complete filename at point.
! ;;; comint-dynamic-list-filename-completions List completions in help buffer.
! ;;; comint-replace-by-expanded-filename	Expand and complete filename at point;
! ;;;					replace with expanded/completed name.
! ;;; comint-dynamic-simple-complete	Complete stub given candidates.
! 
! ;;; These are not installed in the comint-mode keymap. But they are
! ;;; available for people who want them. Shell-mode installs them:
! ;;; (define-key shell-mode-map "\t" 'comint-dynamic-complete)
! ;;; (define-key shell-mode-map "\M-?"
! ;;;             'comint-dynamic-list-filename-completions)))
! ;;;
! ;;; Commands like this are fine things to put in load hooks if you
! ;;; want them present in specific modes.
  
  (defvar comint-completion-autolist nil
!   "*If non-nil, automatically list possiblities on partial completion.
  This mirrors the optional behavior of tcsh.")
  
--- 1775,1802 ----
  
  
! ;; Filename/command/history completion in a buffer
! ;; ===========================================================================
! ;; Useful completion functions, courtesy of the Ergo group.
! 
! ;; Six commands:
! ;; comint-dynamic-complete		Complete or expand command, filename,
! ;;                                     history at point.
! ;; comint-dynamic-complete-filename	Complete filename at point.
! ;; comint-dynamic-list-filename-completions List completions in help buffer.
! ;; comint-replace-by-expanded-filename	Expand and complete filename at point;
! ;;					replace with expanded/completed name.
! ;; comint-dynamic-simple-complete	Complete stub given candidates.
! 
! ;; These are not installed in the comint-mode keymap. But they are
! ;; available for people who want them. Shell-mode installs them:
! ;; (define-key shell-mode-map "\t" 'comint-dynamic-complete)
! ;; (define-key shell-mode-map "\M-?"
! ;;             'comint-dynamic-list-filename-completions)))
! ;;
! ;; Commands like this are fine things to put in load hooks if you
! ;; want them present in specific modes.
  
  (defvar comint-completion-autolist nil
!   "*If non-nil, automatically list possibilities on partial completion.
  This mirrors the optional behavior of tcsh.")
  
*************** Typing SPC flushes the help buffer."
*** 2072,2165 ****
  	  (setq unread-command-events (listify-key-sequence key)))))))
  
! ;;; Converting process modes to use comint mode
! ;;; ===========================================================================
! ;;; The code in the Emacs 19 distribution has all been modified to use comint
! ;;; where needed.  However, there are `third-party' packages out there that
! ;;; still use the old shell mode.  Here's a guide to conversion.
! ;;;
! ;;; Renaming variables
! ;;; Most of the work is renaming variables and functions. These are the common
! ;;; ones:
! ;;; Local variables:
! ;;;	last-input-start	comint-last-input-start
! ;;; 	last-input-end		comint-last-input-end
! ;;;	shell-prompt-pattern	comint-prompt-regexp
! ;;;     shell-set-directory-error-hook <no equivalent>
! ;;; Miscellaneous:
! ;;;	shell-set-directory	<unnecessary>
! ;;; 	shell-mode-map		comint-mode-map
! ;;; Commands:
! ;;;	shell-send-input	comint-send-input
! ;;;	shell-send-eof		comint-delchar-or-maybe-eof
! ;;; 	kill-shell-input	comint-kill-input
! ;;;	interrupt-shell-subjob	comint-interrupt-subjob
! ;;;	stop-shell-subjob	comint-stop-subjob
! ;;;	quit-shell-subjob	comint-quit-subjob
! ;;;	kill-shell-subjob	comint-kill-subjob
! ;;;	kill-output-from-shell	comint-kill-output
! ;;;	show-output-from-shell	comint-show-output
! ;;;	copy-last-shell-input	Use comint-previous-input/comint-next-input
! ;;;
! ;;; SHELL-SET-DIRECTORY is gone, its functionality taken over by
! ;;; SHELL-DIRECTORY-TRACKER, the shell mode's comint-input-filter-functions.
! ;;; Comint mode does not provide functionality equivalent to
! ;;; shell-set-directory-error-hook; it is gone.
! ;;;
! ;;; comint-last-input-start is provided for modes which want to munge
! ;;; the buffer after input is sent, perhaps because the inferior
! ;;; insists on echoing the input.  The LAST-INPUT-START variable in
! ;;; the old shell package was used to implement a history mechanism,
! ;;; but you should think twice before using comint-last-input-start
! ;;; for this; the input history ring often does the job better.
! ;;; 
! ;;; If you are implementing some process-in-a-buffer mode, called foo-mode, do
! ;;; *not* create the comint-mode local variables in your foo-mode function.
! ;;; This is not modular.  Instead, call comint-mode, and let *it* create the
! ;;; necessary comint-specific local variables. Then create the
! ;;; foo-mode-specific local variables in foo-mode.  Set the buffer's keymap to
! ;;; be foo-mode-map, and its mode to be foo-mode.  Set the comint-mode hooks
! ;;; (comint-{prompt-regexp, input-filter, input-filter-functions,
! ;;; get-old-input) that need to be different from the defaults.  Call
! ;;; foo-mode-hook, and you're done. Don't run the comint-mode hook yourself;
! ;;; comint-mode will take care of it. The following example, from shell.el,
! ;;; is typical:
! ;;; 
! ;;; (defvar shell-mode-map '())
! ;;; (cond ((not shell-mode-map)
! ;;;        (setq shell-mode-map (copy-keymap comint-mode-map))
! ;;;        (define-key shell-mode-map "\C-c\C-f" 'shell-forward-command)
! ;;;        (define-key shell-mode-map "\C-c\C-b" 'shell-backward-command)
! ;;;        (define-key shell-mode-map "\t" 'comint-dynamic-complete)
! ;;;        (define-key shell-mode-map "\M-?"
! ;;;          'comint-dynamic-list-filename-completions)))
! ;;;
! ;;; (defun shell-mode ()
! ;;;   (interactive)
! ;;;   (comint-mode)
! ;;;   (setq comint-prompt-regexp shell-prompt-pattern)
! ;;;   (setq major-mode 'shell-mode)
! ;;;   (setq mode-name "Shell")
! ;;;   (use-local-map shell-mode-map)
! ;;;   (make-local-variable 'shell-directory-stack)
! ;;;   (setq shell-directory-stack nil)
! ;;;   (add-hook 'comint-input-filter-functions 'shell-directory-tracker)
! ;;;   (run-hooks 'shell-mode-hook))
! ;;;
! ;;;
! ;;; Note that make-comint is different from make-shell in that it
! ;;; doesn't have a default program argument. If you give make-shell
! ;;; a program name of NIL, it cleverly chooses one of explicit-shell-name,
! ;;; $ESHELL, $SHELL, or /bin/sh. If you give make-comint a program argument
! ;;; of NIL, it barfs. Adjust your code accordingly...
! ;;;
! ;;; Completion for comint-mode users
! ;;; 
! ;;; For modes that use comint-mode, comint-dynamic-complete-functions is the
! ;;; hook to add completion functions to.  Functions on this list should return
! ;;; non-nil if completion occurs (i.e., further completion should not occur).
! ;;; You could use comint-dynamic-simple-complete to do the bulk of the
! ;;; completion job.
  
  (provide 'comint)
  
! ;;; comint.el ends here
--- 2072,2165 ----
  	  (setq unread-command-events (listify-key-sequence key)))))))
  
! ;; Converting process modes to use comint mode
! ;; ===========================================================================
! ;; The code in the Emacs 19 distribution has all been modified to use comint
! ;; where needed.  However, there are `third-party' packages out there that
! ;; still use the old shell mode.  Here's a guide to conversion.
! ;;
! ;; Renaming variables
! ;; Most of the work is renaming variables and functions. These are the common
! ;; ones:
! ;; Local variables:
! ;;	last-input-start	comint-last-input-start
! ;; 	last-input-end		comint-last-input-end
! ;;	shell-prompt-pattern	comint-prompt-regexp
! ;;     shell-set-directory-error-hook <no equivalent>
! ;; Miscellaneous:
! ;;	shell-set-directory	<unnecessary>
! ;; 	shell-mode-map		comint-mode-map
! ;; Commands:
! ;;	shell-send-input	comint-send-input
! ;;	shell-send-eof		comint-delchar-or-maybe-eof
! ;; 	kill-shell-input	comint-kill-input
! ;;	interrupt-shell-subjob	comint-interrupt-subjob
! ;;	stop-shell-subjob	comint-stop-subjob
! ;;	quit-shell-subjob	comint-quit-subjob
! ;;	kill-shell-subjob	comint-kill-subjob
! ;;	kill-output-from-shell	comint-kill-output
! ;;	show-output-from-shell	comint-show-output
! ;;	copy-last-shell-input	Use comint-previous-input/comint-next-input
! ;;
! ;; SHELL-SET-DIRECTORY is gone, its functionality taken over by
! ;; SHELL-DIRECTORY-TRACKER, the shell mode's comint-input-filter-functions.
! ;; Comint mode does not provide functionality equivalent to
! ;; shell-set-directory-error-hook; it is gone.
! ;;
! ;; comint-last-input-start is provided for modes which want to munge
! ;; the buffer after input is sent, perhaps because the inferior
! ;; insists on echoing the input.  The LAST-INPUT-START variable in
! ;; the old shell package was used to implement a history mechanism,
! ;; but you should think twice before using comint-last-input-start
! ;; for this; the input history ring often does the job better.
! ;; 
! ;; If you are implementing some process-in-a-buffer mode, called foo-mode, do
! ;; *not* create the comint-mode local variables in your foo-mode function.
! ;; This is not modular.  Instead, call comint-mode, and let *it* create the
! ;; necessary comint-specific local variables. Then create the
! ;; foo-mode-specific local variables in foo-mode.  Set the buffer's keymap to
! ;; be foo-mode-map, and its mode to be foo-mode.  Set the comint-mode hooks
! ;; (comint-{prompt-regexp, input-filter, input-filter-functions,
! ;; get-old-input) that need to be different from the defaults.  Call
! ;; foo-mode-hook, and you're done. Don't run the comint-mode hook yourself;
! ;; comint-mode will take care of it. The following example, from shell.el,
! ;; is typical:
! ;; 
! ;; (defvar shell-mode-map '())
! ;; (cond ((not shell-mode-map)
! ;;        (setq shell-mode-map (copy-keymap comint-mode-map))
! ;;        (define-key shell-mode-map "\C-c\C-f" 'shell-forward-command)
! ;;        (define-key shell-mode-map "\C-c\C-b" 'shell-backward-command)
! ;;        (define-key shell-mode-map "\t" 'comint-dynamic-complete)
! ;;        (define-key shell-mode-map "\M-?"
! ;;          'comint-dynamic-list-filename-completions)))
! ;;
! ;; (defun shell-mode ()
! ;;   (interactive)
! ;;   (comint-mode)
! ;;   (setq comint-prompt-regexp shell-prompt-pattern)
! ;;   (setq major-mode 'shell-mode)
! ;;   (setq mode-name "Shell")
! ;;   (use-local-map shell-mode-map)
! ;;   (make-local-variable 'shell-directory-stack)
! ;;   (setq shell-directory-stack nil)
! ;;   (add-hook 'comint-input-filter-functions 'shell-directory-tracker)
! ;;   (run-hooks 'shell-mode-hook))
! ;;
! ;;
! ;; Note that make-comint is different from make-shell in that it
! ;; doesn't have a default program argument. If you give make-shell
! ;; a program name of NIL, it cleverly chooses one of explicit-shell-name,
! ;; $ESHELL, $SHELL, or /bin/sh. If you give make-comint a program argument
! ;; of NIL, it barfs. Adjust your code accordingly...
! ;;
! ;; Completion for comint-mode users
! ;; 
! ;; For modes that use comint-mode, comint-dynamic-complete-functions is the
! ;; hook to add completion functions to.  Functions on this list should return
! ;; non-nil if completion occurs (i.e., further completion should not occur).
! ;; You could use comint-dynamic-simple-complete to do the bulk of the
! ;; completion job.
  
  (provide 'comint)
  
! ;; comint.el ends here
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/compare-w.el emacs-19.31/lisp/compare-w.el
*** emacs-19.30/lisp/compare-w.el	Sun Nov 20 16:54:54 1994
--- emacs-19.31/lisp/compare-w.el	Sun Jan 14 02:34:30 1996
***************
*** 18,23 ****
  
  ;; 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:
--- 18,24 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/compile.el emacs-19.31/lisp/compile.el
*** emacs-19.30/lisp/compile.el	Mon Nov 13 22:48:02 1995
--- emacs-19.31/lisp/compile.el	Fri Apr 26 15:44:02 1996
***************
*** 1,5 ****
  ;;; compile.el --- run compiler as inferior of Emacs, parse error messages.
  
! ;; Copyright (C) 1985, 86, 87, 93, 94, 1995 Free Software Foundation, Inc.
  
  ;; Author: Roland McGrath <roland@prep.ai.mit.edu>
--- 1,5 ----
  ;;; compile.el --- run compiler as inferior of Emacs, parse error messages.
  
! ;; Copyright (C) 1985, 86, 87, 93, 94, 1995, 1996 Free Software Foundation, Inc.
  
  ;; Author: Roland McGrath <roland@prep.ai.mit.edu>
***************
*** 20,25 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** error messages should be reparsed the ne
*** 50,54 ****
  
  Some other commands (like `diff') use this list to control the error
! message tracking facilites; if you change its structure, you should make
  sure you also change those packages.  Perhaps it is better not to change
  it at all.")
--- 51,55 ----
  
  Some other commands (like `diff') use this list to control the error
! message tracking facilities; if you change its structure, you should make
  sure you also change those packages.  Perhaps it is better not to change
  it at all.")
*************** it at all.")
*** 57,65 ****
    "Value of `compilation-error-list' after errors were parsed.")
  
! (defvar compilation-parse-errors-function 'compilation-parse-errors 
    "Function to call to parse error messages from a compilation.
  It takes args LIMIT-SEARCH and FIND-AT-LEAST.
  If LIMIT-SEARCH is non-nil, don't bother parsing past that location.
! If FIND-AT-LEAST is non-nil, don't bother parsing after finding that 
  many new errors.
  It should read in the source files which have errors and set
--- 58,66 ----
    "Value of `compilation-error-list' after errors were parsed.")
  
! (defvar compilation-parse-errors-function 'compilation-parse-errors
    "Function to call to parse error messages from a compilation.
  It takes args LIMIT-SEARCH and FIND-AT-LEAST.
  If LIMIT-SEARCH is non-nil, don't bother parsing past that location.
! If FIND-AT-LEAST is non-nil, don't bother parsing after finding that
  many new errors.
  It should read in the source files which have errors and set
*************** or when it is used with \\[next-error] o
*** 111,138 ****
      ;; or GNU utilities with column (GNAT 1.82):
      ;;   foo.adb:2:1: Unit name does not match file name
!     ;; 
      ;; We'll insist that the number be followed by a colon or closing
      ;; paren, because otherwise this matches just about anything
      ;; containing a number with spaces around it.
      ("\n\
! \\([^:( \t\n]+\\)[:(][ \t]*\\([0-9]+\\)\\([) \t]\\|\
  :\\([^0-9\n]\\|\\([0-9]+:\\)\\)\\)" 1 2 5)
  
      ;; Borland C++:
      ;;  Error ping.c 15: Unable to open include file 'sys/types.h'
      ;;  Warning ping.c 68: Call to function 'func' with no prototype
!     ("\n\\(Error\\|Warning\\) \\([^:( \t\n]+\\)\
   \\([0-9]+\\)\\([) \t]\\|:[^0-9\n]\\)" 2 3)
  
      ;; 4.3BSD lint pass 2
      ;; 	strcmp: variable # of args. llib-lc(359)  ::  /usr/src/foo/foo.c(8)
!     ("[ \t:]\\([^:( \t\n]+\\)[:(](+[ \t]*\\([0-9]+\\))[:) \t]*$" 1 2)
  
      ;; 4.3BSD lint pass 3
      ;; 	bloofle defined( /users/wolfgang/foo.c(4) ), but never used
      ;; This used to be
!     ;; ("[ \t(]+\\([^:( \t\n]+\\)[:( \t]+\\([0-9]+\\)[:) \t]+" 1 2)
      ;; which is regexp Impressionism - it matches almost anything!
!     ("([ \t]*\\([^:( \t\n]+\\)[:(][ \t]*\\([0-9]+\\))" 1 2)
  
      ;; Ultrix 3.0 f77:
--- 112,151 ----
      ;; or GNU utilities with column (GNAT 1.82):
      ;;   foo.adb:2:1: Unit name does not match file name
!     ;;
      ;; We'll insist that the number be followed by a colon or closing
      ;; paren, because otherwise this matches just about anything
      ;; containing a number with spaces around it.
      ("\n\
! \\([a-zA-Z]?:?[^:( \t\n]+\\)[:(][ \t]*\\([0-9]+\\)\\([) \t]\\|\
  :\\([^0-9\n]\\|\\([0-9]+:\\)\\)\\)" 1 2 5)
  
+     ;; Microsoft C/C++:
+     ;;  keyboard.c(537) : warning C4005: 'min' : macro redefinition
+     ;;  d:\tmp\test.c(23) : error C2143: syntax error : missing ';' before 'if'
+     ("\n\\(\\([a-zA-Z]:\\)?[^:( \t\n-]+\\)[:(][ \t]*\\([0-9]+\\)[:) \t]" 1 3)
+ 
      ;; Borland C++:
      ;;  Error ping.c 15: Unable to open include file 'sys/types.h'
      ;;  Warning ping.c 68: Call to function 'func' with no prototype
!     ("\n\\(Error\\|Warning\\) \\([a-zA-Z]?:?[^:( \t\n]+\\)\
   \\([0-9]+\\)\\([) \t]\\|:[^0-9\n]\\)" 2 3)
  
      ;; 4.3BSD lint pass 2
      ;; 	strcmp: variable # of args. llib-lc(359)  ::  /usr/src/foo/foo.c(8)
!     ("[ \t:]\\([a-zA-Z]?:?[^:( \t\n]+\\)[:(](+[ \t]*\\([0-9]+\\))[:) \t]*$"
!      1 2)
  
      ;; 4.3BSD lint pass 3
      ;; 	bloofle defined( /users/wolfgang/foo.c(4) ), but never used
      ;; This used to be
!     ;; ("[ \t(]+\\([a-zA-Z]?:?[^:( \t\n]+\\)[:( \t]+\\([0-9]+\\)[:) \t]+" 1 2)
      ;; which is regexp Impressionism - it matches almost anything!
!     ("([ \t]*\\([a-zA-Z]?:?[^:( \t\n]+\\)[:(][ \t]*\\([0-9]+\\))" 1 2)
! 
!     ;; MIPS lint pass<n>; looks good for SunPro lint also
!     ;;  TrimMask (255) in solomon.c may be indistinguishable from TrimMasks (93) in solomon.c due to truncation
!     ("[^ ]+ (\\([0-9]+\\)) in \\([^ ]+\\)" 2 1)
!     ;;  name defined but never used: LinInt in cmap_calc.c(199)
!     ("in \\([^(]+\\)(\\([0-9]+\\))$" 1 2)
  
      ;; Ultrix 3.0 f77:
*************** or when it is used with \\[next-error] o
*** 141,152 ****
      ;;  cfe: Warning 835: foo.c, line 2: something
      ("\n\\(cfe\\|fort\\): [^:\n]*: \\([^ \n]*\\), line \\([0-9]+\\):" 2 3)
!     ;;  Error on line 3 of t.f: Execution error unclassifiable statement    
      ;; Unknown who does this:
!     ;;  Line 45 of "foo.c": bloofel undefined
      ;; Absoft FORTRAN 77 Compiler 3.1.3
      ;;  error on line 19 of fplot.f: spelling error?
      ;;  warning on line 17 of fplot.f: data type is undefined for variable d
      ("\\(\n\\|on \\)[Ll]ine[ \t]+\\([0-9]+\\)[ \t]+\
! of[ \t]+\"?\\([^\":\n]+\\)\"?:" 3 2)
  
      ;; Apollo cc, 4.3BSD fc:
--- 154,165 ----
      ;;  cfe: Warning 835: foo.c, line 2: something
      ("\n\\(cfe\\|fort\\): [^:\n]*: \\([^ \n]*\\), line \\([0-9]+\\):" 2 3)
!     ;;  Error on line 3 of t.f: Execution error unclassifiable statement
      ;; Unknown who does this:
!     ;;  Line 45 of "foo.c": bloofle undefined
      ;; Absoft FORTRAN 77 Compiler 3.1.3
      ;;  error on line 19 of fplot.f: spelling error?
      ;;  warning on line 17 of fplot.f: data type is undefined for variable d
      ("\\(\n\\|on \\)[Ll]ine[ \t]+\\([0-9]+\\)[ \t]+\
! of[ \t]+\"?\\([a-zA-Z]?:?[^\":\n]+\\)\"?:" 3 2)
  
      ;; Apollo cc, 4.3BSD fc:
*************** of[ \t]+\"?\\([^\":\n]+\\)\"?:" 3 2)
*** 158,169 ****
      ;; Microtec mcc68k:
      ;;  "foo.c", line 32 pos 1; (E) syntax error; unexpected symbol: "lossage"
!     ;; GNAT (as of July 94): 
      ;;  "foo.adb", line 2(11): warning: file name does not match ...
!     ("\"\\([^,\" \n\t]+\\)\", lines? \\([0-9]+\\)[:., (-]" 1 2)
  
      ;; MIPS RISC CC - the one distributed with Ultrix:
      ;;	ccom: Error: foo.c, line 2: syntax error
      ;; DEC AXP OSF/1 cc
!     ;;  /usr/lib/cmplrs/cc/cfe: Error: foo.c: 1: blah blah 
      ("rror: \\([^,\" \n\t]+\\)[,:] \\(line \\)?\\([0-9]+\\):" 1 3)
  
--- 171,185 ----
      ;; Microtec mcc68k:
      ;;  "foo.c", line 32 pos 1; (E) syntax error; unexpected symbol: "lossage"
!     ;; GNAT (as of July 94):
      ;;  "foo.adb", line 2(11): warning: file name does not match ...
!     ;; IBM AIX xlc compiler:
!     ;;  "src/swapping.c", line 30.34: 1506-342 (W) "/*" detected in comment.
!     ("\"\\([^,\" \n\t]+\\)\", lines? \
! \\([0-9]+\\)\\([\(.]\\([0-9]+\\)\)?\\)?[:., (-]" 1 2 4)
  
      ;; MIPS RISC CC - the one distributed with Ultrix:
      ;;	ccom: Error: foo.c, line 2: syntax error
      ;; DEC AXP OSF/1 cc
!     ;;  /usr/lib/cmplrs/cc/cfe: Error: foo.c: 1: blah blah
      ("rror: \\([^,\" \n\t]+\\)[,:] \\(line \\)?\\([0-9]+\\):" 1 3)
  
*************** of[ \t]+\"?\\([^\":\n]+\\)\"?:" 3 2)
*** 179,183 ****
  
      ;; GNU messages with program name and optional column number.
!     ("\n[^0-9 \n\t:]+:[ \t]*\\([^ \n\t:]+\\):\
  \\([0-9]+\\):\\(\\([0-9]+\\)[: \t]\\)?" 1 2 4)
  
--- 195,199 ----
  
      ;; GNU messages with program name and optional column number.
!     ("\n[a-zA-Z]?:?[^0-9 \n\t:]+:[ \t]*\\([^ \n\t:]+\\):\
  \\([0-9]+\\):\\(\\([0-9]+\\)[: \t]\\)?" 1 2 4)
  
*************** Otherwise, it saves all modified buffers
*** 213,217 ****
  
  (defvar grep-regexp-alist
!   '(("^\\([^:( \t\n]+\\)[:( \t]+\\([0-9]+\\)[:) \t]" 1 2))
    "Regexp used to match grep hits.  See `compilation-error-regexp-alist'.")
  
--- 229,233 ----
  
  (defvar grep-regexp-alist
!   '(("^\\([a-zA-Z]?:?[^:( \t\n]+\\)[:( \t]+\\([0-9]+\\)[:) \t]" 1 2))
    "Regexp used to match grep hits.  See `compilation-error-regexp-alist'.")
  
*************** The head element is the directory the co
*** 260,266 ****
  (defvar compilation-exit-message-function nil "\
  If non-nil, called when a compilation process dies to return a status message.
! This should be a function a two arguments as passed to a process sentinel
! \(see `set-process-sentinel\); it returns a cons (MESSAGE . MODELINE) of the
! strings to write into the compilation buffer, and to put in its mode line.")
  
  ;; History of compile commands.
--- 276,282 ----
  (defvar compilation-exit-message-function nil "\
  If non-nil, called when a compilation process dies to return a status message.
! This should be a function of three arguments: process status, exit status,
! and exit message; it returns a cons (MESSAGE . MODELINE) of the strings to
! write into the compilation buffer, and to put in its mode line.")
  
  ;; History of compile commands.
*************** strings to write into the compilation bu
*** 271,275 ****
  (defvar compilation-mode-font-lock-keywords
    ;; This regexp needs a bit of rewriting.  What is the third grouping for?
!   '(("^\\([^ \n:]*:\\([0-9]+:\\)+\\)\\(.*\\)$" 1 font-lock-function-name-face))
  ;;;  ("^\\([^\n:]*:\\([0-9]+:\\)+\\)\\(.*\\)$" 0 font-lock-keyword-face keep)
    "Additional expressions to highlight in Compilation mode.")
--- 287,292 ----
  (defvar compilation-mode-font-lock-keywords
    ;; This regexp needs a bit of rewriting.  What is the third grouping for?
!   '(("^\\([a-zA-Z]?:?[^ \n:]*:\\([0-9]+:\\)+\\)\\(.*\\)$"
!      1 font-lock-function-name-face))
  ;;;  ("^\\([^\n:]*:\\([0-9]+:\\)+\\)\\(.*\\)$" 0 font-lock-keyword-face keep)
    "Additional expressions to highlight in Compilation mode.")
*************** easily repeat a grep command."
*** 332,345 ****
        (set-buffer buf)
        (set (make-local-variable 'compilation-exit-message-function)
! 	   (lambda (proc msg)
! 	     (let ((code (process-exit-status proc)))
! 	       (if (eq (process-status proc) 'exit)
! 		   (cond ((zerop code)
! 			  '("finished (matches found)\n" . "matched"))
! 			 ((= code 1)
! 			  '("finished with no matches found\n" . "no match"))
! 			 (t
! 			  (cons msg code)))
! 		 (cons msg code))))))))
  
  (defun compile-internal (command error-message
--- 349,361 ----
        (set-buffer buf)
        (set (make-local-variable 'compilation-exit-message-function)
! 	   (lambda (status code msg)
! 	     (if (eq status 'exit)
! 		 (cond ((zerop code)
! 			'("finished (matches found)\n" . "matched"))
! 		       ((= code 1)
! 			'("finished with no matches found\n" . "no match"))
! 		       (t
! 			(cons msg code)))
! 	       (cons msg code)))))))
  
  (defun compile-internal (command error-message
*************** Returns the compilation buffer created."
*** 391,395 ****
  	  (parser (or parser compilation-parse-errors-function))
  	  (thisdir default-directory)
! 	  outwin) 
        (save-excursion
  	;; Clear out the compilation buffer and make it writable.
--- 407,411 ----
  	  (parser (or parser compilation-parse-errors-function))
  	  (thisdir default-directory)
! 	  outwin)
        (save-excursion
  	;; Clear out the compilation buffer and make it writable.
*************** Returns the compilation buffer created."
*** 433,444 ****
  	      (set-process-filter proc 'compilation-filter)
  	      (set-marker (process-mark proc) (point) outbuf)
! 	      (setq compilation-in-progress 
  		    (cons proc compilation-in-progress)))
! 	  ;; No asynchronous processes available
! 	  (message (format "Executing `%s'..." command))
! 	  (sit-for 0) ;; Force redisplay
  	  (let ((status (call-process shell-file-name nil outbuf nil "-c"
! 				      command))))
! 	  (message (format "Executing `%s'...done" command)))))
      ;; Make it so the next C-x ` will use this buffer.
      (setq compilation-last-buffer outbuf)))
--- 449,475 ----
  	      (set-process-filter proc 'compilation-filter)
  	      (set-marker (process-mark proc) (point) outbuf)
! 	      (setq compilation-in-progress
  		    (cons proc compilation-in-progress)))
! 	  ;; No asynchronous processes available.
! 	  (message "Executing `%s'..." command)
! 	  ;; Fake modeline display as if `start-process' were run.
! 	  (setq mode-line-process ":run")
! 	  (force-mode-line-update)
! 	  (sit-for 0)			; Force redisplay
  	  (let ((status (call-process shell-file-name nil outbuf nil "-c"
! 				      command)))
! 	    (cond ((numberp status)
! 		   (compilation-handle-exit 'exit status
! 					    (if (zerop status)
! 						"finished\n"
! 					      (format "\
! exited abnormally with code %d\n"
! 						      status))))
! 		  ((stringp status)
! 		   (compilation-handle-exit 'signal status
! 					    (concat status "\n")))
! 		  (t
! 		   (compilation-handle-exit 'bizarre status status))))
! 	  (message "Executing `%s'...done" command))))
      ;; Make it so the next C-x ` will use this buffer.
      (setq compilation-last-buffer outbuf)))
*************** Returns the compilation buffer created."
*** 505,508 ****
--- 536,540 ----
  `compilation-minor-mode-map' is a cdr of this.")
  
+ ;;;###autoload
  (defun compilation-mode ()
    "Major mode for compilation log buffers.
*************** Compilation major mode are available.")
*** 550,559 ****
    "Toggle compilation minor mode.
  With arg, turn compilation mode on if and only if arg is positive.
! See `compilation-mode'."
    (interactive "P")
    (if (setq compilation-minor-mode (if (null arg)
  				       (null compilation-minor-mode)
  				     (> (prefix-numeric-value arg) 0)))
!       (compilation-setup)))
  
  ;; Called when compilation process changes state.
--- 582,618 ----
    "Toggle compilation minor mode.
  With arg, turn compilation mode on if and only if arg is positive.
! See `compilation-mode'.
! Turning the mode on runs the normal hook `compilation-minor-mode-hook'."
    (interactive "P")
    (if (setq compilation-minor-mode (if (null arg)
  				       (null compilation-minor-mode)
  				     (> (prefix-numeric-value arg) 0)))
!       (progn
! 	(compilation-setup)
! 	(run-hooks 'compilation-minor-mode-hook))))
! 
! ;; Write msg in the current buffer and hack its mode-line-process.
! (defun compilation-handle-exit (process-status exit-status msg)
!   (let ((buffer-read-only nil)
! 	(status (if compilation-exit-message-function
! 		    (funcall compilation-exit-message-function
! 			     process-status exit-status msg)
! 		  (cons msg exit-status)))
! 	(omax (point-max))
! 	(opoint (point)))
!     ;; Record where we put the message, so we can ignore it
!     ;; later on.
!     (goto-char omax)
!     (insert ?\n mode-name " " (car status))
!     (forward-char -1)
!     (insert " at " (substring (current-time-string) 0 19))
!     (forward-char 1)
!     (setq mode-line-process (format ":%s [%s]" process-status (cdr status)))
!     ;; Force mode line redisplay soon.
!     (force-mode-line-update)
!     (if (and opoint (< opoint omax))
! 	(goto-char opoint))
!     (if compilation-finish-function
! 	(funcall compilation-finish-function (current-buffer) msg))))
  
  ;; Called when compilation process changes state.
*************** See `compilation-mode'."
*** 566,571 ****
  	      ;; buffer killed
  	      (set-process-buffer proc nil)
! 	    (let ((obuf (current-buffer))
! 		  omax opoint)
  	      ;; save-excursion isn't the right thing if
  	      ;; process-buffer is current-buffer
--- 625,629 ----
  	      ;; buffer killed
  	      (set-process-buffer proc nil)
! 	    (let ((obuf (current-buffer)))
  	      ;; save-excursion isn't the right thing if
  	      ;; process-buffer is current-buffer
*************** See `compilation-mode'."
*** 575,605 ****
  		    ;; and hack its mode line.
  		    (set-buffer buffer)
! 		    (let ((buffer-read-only nil)
! 			  (status (if compilation-exit-message-function
! 				      (funcall compilation-exit-message-function
! 					       proc msg)
! 				    (cons msg (process-exit-status proc)))))
! 		      (setq omax (point-max)
! 			    opoint (point))
! 		      (goto-char omax)
! 		      ;; Record where we put the message, so we can ignore it
! 		      ;; later on.
! 		      (insert ?\n mode-name " " (car status))
! 		      (forward-char -1)
! 		      (insert " at " (substring (current-time-string) 0 19))
! 		      (forward-char 1)
! 		      (setq mode-line-process
! 			    (format ":%s [%s]"
! 				    (process-status proc) (cdr status)))
! 		      ;; Since the buffer and mode line will show that the
! 		      ;; process is dead, we can delete it now.  Otherwise it
! 		      ;; will stay around until M-x list-processes.
! 		      (delete-process proc)
! 		      ;; Force mode line redisplay soon.
! 		      (force-mode-line-update))
! 		    (if (and opoint (< opoint omax))
! 			(goto-char opoint))
! 		    (if compilation-finish-function
! 			(funcall compilation-finish-function buffer msg)))
  		(set-buffer obuf))))
  	  (setq compilation-in-progress (delq proc compilation-in-progress))
--- 633,643 ----
  		    ;; and hack its mode line.
  		    (set-buffer buffer)
! 		    (compilation-handle-exit (process-status proc)
! 					     (process-exit-status proc)
! 					     msg)
! 		    ;; Since the buffer and mode line will show that the
! 		    ;; process is dead, we can delete it now.  Otherwise it
! 		    ;; will stay around until M-x list-processes.
! 		    (delete-process proc))
  		(set-buffer obuf))))
  	  (setq compilation-in-progress (delq proc compilation-in-progress))
*************** Just inserts the text, but uses `insert-
*** 616,619 ****
--- 654,658 ----
  	    (goto-char (process-mark proc))
  	    (insert-before-markers string)
+ 	    (run-hooks 'compilation-filter-hook)
  	    (set-marker (process-mark proc) (point)))))))
  
*************** Does NOT find the source line like \\[ne
*** 723,727 ****
  				  (compile-reinitialize-errors nil nil 2)
  				  (setq errors compilation-error-list)))
! 			      (error "%s is the last erring file" 
  				     (compilation-error-filedata-file-name
  				      filedata))))))
--- 762,766 ----
  				  (compile-reinitialize-errors nil nil 2)
  				  (setq errors compilation-error-list)))
! 			      (error "%s is the last erring file"
  				     (compilation-error-filedata-file-name
  				      filedata))))))
*************** other kinds of prefix arguments are igno
*** 880,883 ****
--- 919,923 ----
        (current-buffer)
      (if (and compilation-last-buffer (buffer-name compilation-last-buffer)
+ 	     (compilation-buffer-p compilation-last-buffer)
  	     (or (not other-buffer) (not (eq compilation-last-buffer
  					     (current-buffer)))))
*************** Optional first arg MOVE says how many er
*** 956,960 ****
  backwards, if negative); default is 1.  Optional second arg REPARSE, if
  non-nil, says to reparse the error message buffer and reset to the first
! error (plus MOVE - 1).  If optional third argument SILENT is non-nil, return 
  nil instead of raising an error if there are no more errors.
  
--- 996,1000 ----
  backwards, if negative); default is 1.  Optional second arg REPARSE, if
  non-nil, says to reparse the error message buffer and reset to the first
! error (plus MOVE - 1).  If optional third argument SILENT is non-nil, return
  nil instead of raising an error if there are no more errors.
  
*************** The current buffer should be the desired
*** 968,972 ****
  	(set-buffer compilation-last-buffer)
  	;; compilation-error-list points to the "current" error.
! 	(setq next-errors 
  	      (if (> move 0)
  		  (nthcdr (1- move)
--- 1008,1012 ----
  	(set-buffer compilation-last-buffer)
  	;; compilation-error-list points to the "current" error.
! 	(setq next-errors
  	      (if (> move 0)
  		  (nthcdr (1- move)
*************** See variable `compilation-parse-errors-f
*** 1357,1361 ****
  		 (setq alist (car alist))
  	       (error "compilation-parse-errors: impossible regexp match!"))
! 	     
  	     ;; Extract the file name and line number from the error message.
  	     (let ((beginning-of-match (match-beginning 0)) ;looking-at nukes
--- 1397,1401 ----
  		 (setq alist (car alist))
  	       (error "compilation-parse-errors: impossible regexp match!"))
! 
  	     ;; Extract the file name and line number from the error message.
  	     (let ((beginning-of-match (match-beginning 0)) ;looking-at nukes
*************** See variable `compilation-parse-errors-f
*** 1382,1388 ****
  		    (file-name-absolute-p filename)
  		    (setq filename (concat comint-file-name-prefix filename)))
  	       (setq filename (cons filename (cons default-directory
  						   (nthcdr 4 alist))))
! 				     
  
  	       ;; Locate the erring file and line.
--- 1422,1436 ----
  		    (file-name-absolute-p filename)
  		    (setq filename (concat comint-file-name-prefix filename)))
+ 
+ 	       ;; Some compilers (e.g. Sun's java compiler, reportedly)
+ 	       ;; produce bogus file names like "./bar//foo.c" for the file
+ 	       ;; "bar/foo.c"; expand-file-name will collapse these into
+ 	       ;; "/foo.c" and fail to find the appropriate file.  So we look
+ 	       ;; for doubled slashes in the file name and fix them up in the
+ 	       ;; buffer.
+ 	       (setq filename (command-line-normalize-file-name filename))
  	       (setq filename (cons filename (cons default-directory
  						   (nthcdr 4 alist))))
! 
  
  	       ;; Locate the erring file and line.
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/complete.el emacs-19.31/lisp/complete.el
*** emacs-19.30/lisp/complete.el	Mon Oct 30 11:54:58 1995
--- emacs-19.31/lisp/complete.el	Mon May 20 17:03:04 1996
***************
*** 1,3 ****
! ;;; complete.el -- partial completion mechanism plus other goodies
  
  ;; Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
--- 1,3 ----
! ;;; complete.el --- partial completion mechanism plus other goodies
  
  ;; Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
***************
*** 21,26 ****
  
  ;; 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:
--- 21,27 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** See `PC-complete' for details."
*** 257,260 ****
--- 258,270 ----
  (defvar PC-delims-list nil)
  
+ (defvar PC-completion-as-file-name-predicate
+   (function
+    (lambda ()
+      (memq minibuffer-completion-table
+ 	   '(read-file-name-internal read-directory-name-internal))))
+    "A function testing whether a minibuffer completion now will work filename-style.
+ The function takes no arguments, and typically looks at the value
+ of `minibuffer-completion-table' and the minibuffer contents.")
+ 
  (defun PC-do-completion (&optional mode beg end)
    (or beg (setq beg (point-min)))
*************** See `PC-complete' for details."
*** 262,267 ****
    (let* ((table minibuffer-completion-table)
  	 (pred minibuffer-completion-predicate)
! 	 (filename (memq table '(read-file-name-internal
! 				 read-directory-name-internal)))
  	 (dirname nil)
  	 dirlength
--- 272,276 ----
    (let* ((table minibuffer-completion-table)
  	 (pred minibuffer-completion-predicate)
! 	 (filename (funcall PC-completion-as-file-name-predicate))
  	 (dirname nil)
  	 dirlength
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/completion.el emacs-19.31/lisp/completion.el
*** emacs-19.30/lisp/completion.el	Thu Nov 23 00:58:22 1995
--- emacs-19.31/lisp/completion.el	Sat Apr 13 15:44:07 1996
***************
*** 1,3 ****
--- 1,4 ----
  ;;; completion.el --- dynamic word-completion code
+ 
  ;; Copyright (C) 1990, 1993, 1995 Free Software Foundation, Inc.
  
***************
*** 20,280 ****
  
  ;; 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:
! ;;; 
! ;;; What to put in .emacs
! ;;;-----------------------
! ;;; (load "completion")
! ;;; (initialize-completions)
! 
! ;;;---------------------------------------------------------------------------
! ;;; Documentation [Slightly out of date]
! ;;;---------------------------------------------------------------------------
! ;;;  (also check the documentation string of the functions)
! ;;;
! ;;; Introduction
! ;;;---------------
! ;;;  
! ;;;     After you type a few characters, pressing the "complete" key inserts
! ;;; the rest of the word you are likely to type.  
! ;;;
! ;;; This watches all the words that you type and remembers them.  When 
! ;;; typing a new word, pressing "complete" (meta-return) "completes" the
! ;;; word by inserting the most recently used word that begins with the 
! ;;; same characters.  If you press meta-return repeatedly, it cycles
! ;;; through all the words it knows about.
! ;;;
! ;;;  If you like the completion then just continue typing, it is as if you
! ;;; entered the text by hand.  If you want the inserted extra characters 
! ;;; to go away, type control-w or delete.  More options are described below.
! ;;;
! ;;;  The guesses are made in the order of the most recently "used".  Typing
! ;;; in a word and then typing a separator character (such as a space) "uses" 
! ;;; the word.  So does moving a cursor over the word.  If no words are found, 
! ;;; it uses an extended version of the dabbrev style completion.
! ;;;
! ;;;   You automatically save the completions you use to a file between 
! ;;; sessions.  
! ;;;
! ;;;   Completion enables programmers to enter longer, more descriptive 
! ;;; variable names while typing fewer keystrokes than they normally would.
! ;;;
! ;;;
! ;;; Full documentation
! ;;;---------------------
! ;;;
! ;;;   A "word" is any string containing characters with either word or symbol 
! ;;; syntax.  [E.G. Any alphanumeric string with hyphens, underscores, etc.]
! ;;; Unless you change the constants, you must type at least three characters
! ;;; for the word to be recognized.  Only words longer than 6 characters are
! ;;; saved.
! ;;;
! ;;;   When you load this file, completion will be on.  I suggest you use the
! ;;; compiled version (because it is noticeably faster).
! ;;;
! ;;;  M-X completion-mode toggles whether or not new words are added to the
! ;;; database by changing the value of enable-completion.
! ;;;
! ;;;  SAVING/LOADING COMPLETIONS
! ;;;   Completions are automatically saved from one session to another
! ;;; (unless save-completions-flag or enable-completion is nil).
! ;;; Loading this file (or calling initialize-completions) causes EMACS
! ;;; to load a completions database for a saved completions file 
! ;;; (default: ~/.completions).  When you exit, EMACS saves a copy of the
! ;;; completions that you 
! ;;; often use.  When you next start, EMACS loads in the saved completion file.
! ;;;
! ;;;   The number of completions saved depends loosely on 
! ;;; *saved-completions-decay-factor*.  Completions that have never been 
! ;;; inserted via "complete" are not saved.  You are encouraged to experiment
! ;;; with different functions (see compute-completion-min-num-uses).
! ;;;
! ;;;   Some completions are permanent and are always saved out.  These 
! ;;; completions have their num-uses slot set to T.  Use 
! ;;; add-permanent-completion to do this
! ;;;
! ;;;   Completions are saved only if enable-completion is T.  The number of old
! ;;; versions kept of the saved completions file is controlled by 
! ;;; completions-file-versions-kept.
! ;;;
! ;;; COMPLETE KEY OPTIONS
! ;;;   The complete function takes a numeric arguments.  
! ;;;  control-u :: leave the point at the beginning of the completion rather 
! ;;;               than the middle.
! ;;;  a number  :: rotate through the possible completions by that amount
! ;;;  `-'       :: same as -1 (insert previous completion)
! ;;;
! ;;; HOW THE DATABASE IS MAINTAINED
! ;;;  <write>
! ;;;
! ;;; UPDATING THE DATABASE MANUALLY
! ;;;   m-x kill-completion 
! ;;;     kills the completion at point.
! ;;;   m-x add-completion
! ;;;   m-x add-permanent-completion
! ;;;   
! ;;; UPDATING THE DATABASE FROM A SOURCE CODE FILE
! ;;;   m-x add-completions-from-buffer
! ;;;     Parses all the definition names from a C or LISP mode buffer and
! ;;;     adds them to the completion database.
! ;;;
! ;;;   m-x add-completions-from-lisp-file 
! ;;;     Parses all the definition names from a C or Lisp mode file and
! ;;;     adds them to the completion database.
! ;;;
! ;;; UPDATING THE DATABASE FROM A TAGS TABLE
! ;;;   m-x add-completions-from-tags-table
! ;;;     Adds completions from the current tags-table-buffer.
! ;;;
! ;;; HOW A COMPLETION IS FOUND
! ;;;  <write>
! ;;;
! ;;; STRING CASING
! ;;;   Completion is string case independent if case-fold-search has its 
! ;;;  normal default of T.  Also when the completion is inserted the case of the
! ;;;  entry is coerced appropriately.  
! ;;;  [E.G.  APP --> APPROPRIATELY     app --> appropriately  
! ;;;         App --> Appropriately]
! ;;;
! ;;; INITIALIZATION
! ;;;  The form `(initialize-completions)' initializes the completion system by 
! ;;; trying to load in the user's completions.  After the first cal, further 
! ;;; calls have no effect so one should be careful not to put the form in a 
! ;;; site's standard site-init file.
! ;;;
! ;;;---------------------------------------------------------------------------
! ;;;
! ;;;
! 
! ;;;---------------------------------------------------------------------------
! ;;; Functions you might like to call
! ;;;---------------------------------------------------------------------------
! ;;;
! ;;;  add-completion  string &optional num-uses
! ;;;    Adds a new string to the database
! ;;;
! ;;;  add-permanent-completion  string
! ;;;    Adds a new string to the database with num-uses = T
! ;;;
! 
! ;;;  kill-completion string
! ;;;    Kills the completion from the database.
! ;;;
! ;;;  clear-all-completions
! ;;;    Clears the database
! ;;;
! ;;;  list-all-completions
! ;;;    Returns a list of all completions.
! ;;;
! ;;;
! ;;;  next-completion string &optional index
! ;;;    Returns a completion entry that starts with string.
! ;;;
! ;;;  find-exact-completion string
! ;;;    Returns a completion entry that exactly matches string.
! ;;;
! ;;;  complete
! ;;;    Inserts a completion at point
! ;;;
! ;;;  initialize-completions
! ;;;    Loads the completions file and sets up so that exiting emacs will 
! ;;;  save them.
! ;;;
! ;;;  save-completions-to-file &optional filename  
! ;;;  load-completions-from-file &optional filename
! ;;;
! ;;;-----------------------------------------------
! ;;; Other functions
! ;;;-----------------------------------------------
! ;;;
! ;;;  get-completion-list string
! ;;;
! ;;; These things are for manipulating the structure
! ;;;  make-completion string num-uses
! ;;;  completion-num-uses completion 
! ;;;  completion-string completion
! ;;;  set-completion-num-uses completion num-uses
! ;;;  set-completion-string completion string
! ;;;  
! ;;;
! 
! ;;;-----------------------------------------------
! ;;; To Do :: (anybody ?)
! ;;;-----------------------------------------------
! ;;;
! ;;;   Implement Lookup and keyboard interface in C
! ;;;   Add package prefix smarts (for Common Lisp)
! ;;;   Add autoprompting of possible completions after every keystroke (fast
! ;;;      terminals only !)
! ;;;   Add doc. to texinfo
! ;;;
! ;;;
! ;;;-----------------------------------------------
  ;;; Change Log:
! ;;;-----------------------------------------------
! ;;;    Sometime in '84 Brewster implemented a somewhat buggy version for 
! ;;; Symbolics LISPMs.
! ;;;    Jan. '85 Jim became enamored of the idea and implemented a faster, 
! ;;; more robust version.
! ;;;    With input from many users at TMC, (rose, craig, and gls come to mind),
! ;;; the current style of interface was developed. 
! ;;;    9/87, Jim and Brewster took terminals home.  Yuck.  After 
! ;;; complaining for a while Brewester implemented a subset of the current 
! ;;; LISPM version for GNU Emacs.  
! ;;;    8/88  After complaining for a while (and with sufficient 
! ;;; promised rewards), Jim reimplemented a version of GNU completion
! ;;; superior to that of the LISPM version.
! ;;;
! ;;;-----------------------------------------------
! ;;; Acknowledgements
! ;;;-----------------------------------------------
! ;;;  Cliff Lasser (cal@think.com), Kevin Herbert (kph@cisco.com),
! ;;;  eero@media-lab, kgk@cs.brown.edu, jla@ai.mit.edu,
! ;;;
! ;;;-----------------------------------------------
! ;;; Change Log
! ;;;-----------------------------------------------
! ;;; From version 9 to 10
! ;;;  - Allowance for non-integral *completion-version* nos.
! ;;;  - Fix cmpl-apply-as-top-level for keyboard macros
! ;;;  - Fix broken completion merging (in save-completions-to-file)
! ;;;  - More misc. fixes for version 19.0 of emacs
! ;;;
! ;;; From Version 8 to 9
! ;;;  - Ported to version 19.0 of emacs (backcompatible with version 18)
! ;;;  - Added add-completions-from-tags-table (with thanks to eero@media-lab)
! ;;;
! ;;; From Version 7 to 8
! ;;;  - Misc. changes to comments
! ;;;  - new completion key bindings: c-x o, M->, M-<, c-a, c-e
! ;;;  - cdabbrev now checks all the visible window buffers and the "other buffer"
! ;;;  - `%' is now a symbol character rather than a separator (except in C mode)
! ;;;
! ;;; From Version 6 to 7
! ;;;  - Fixed bug with saving out .completion file the first time
! ;;;
! ;;; From Version 5 to 6
! ;;;  - removed statistics recording
! ;;;  - reworked advise to handle autoloads
! ;;;  - Fixed fortran mode support
! ;;;  - Added new cursor motion triggers
! ;;;
! ;;; From Version 4 to 5
! ;;;  - doesn't bother saving if nothing has changed
! ;;;  - auto-save if haven't used for a 1/2 hour
! ;;;  - save period extended to two weeks
! ;;;  - minor fix to capitalization code
! ;;;  - added *completion-auto-save-period* to variables recorded.
! ;;;  - added reenter protection to cmpl-record-statistics-filter
! ;;;  - added backup protection to save-completions-to-file (prevents 
! ;;;    problems with disk full errors)
  
  ;;; Code:
  
! ;;;---------------------------------------------------------------------------
! ;;; User changeable parameters
! ;;;---------------------------------------------------------------------------
  
  (defvar enable-completion t
--- 21,282 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
! 
! ;; What to put in .emacs
! ;;-----------------------
! ;; (load "completion")
! ;; (initialize-completions)
! 
! ;;---------------------------------------------------------------------------
! ;; Documentation [Slightly out of date]
! ;;---------------------------------------------------------------------------
! ;;  (also check the documentation string of the functions)
! ;;
! ;; Introduction
! ;;---------------
! ;;  
! ;;     After you type a few characters, pressing the "complete" key inserts
! ;; the rest of the word you are likely to type.  
! ;;
! ;; This watches all the words that you type and remembers them.  When 
! ;; typing a new word, pressing "complete" (meta-return) "completes" the
! ;; word by inserting the most recently used word that begins with the 
! ;; same characters.  If you press meta-return repeatedly, it cycles
! ;; through all the words it knows about.
! ;;
! ;;  If you like the completion then just continue typing, it is as if you
! ;; entered the text by hand.  If you want the inserted extra characters 
! ;; to go away, type control-w or delete.  More options are described below.
! ;;
! ;;  The guesses are made in the order of the most recently "used".  Typing
! ;; in a word and then typing a separator character (such as a space) "uses" 
! ;; the word.  So does moving a cursor over the word.  If no words are found, 
! ;; it uses an extended version of the dabbrev style completion.
! ;;
! ;;   You automatically save the completions you use to a file between 
! ;; sessions.  
! ;;
! ;;   Completion enables programmers to enter longer, more descriptive 
! ;; variable names while typing fewer keystrokes than they normally would.
! ;;
! ;;
! ;; Full documentation
! ;;---------------------
! ;;
! ;;   A "word" is any string containing characters with either word or symbol 
! ;; syntax.  [E.G. Any alphanumeric string with hyphens, underscores, etc.]
! ;; Unless you change the constants, you must type at least three characters
! ;; for the word to be recognized.  Only words longer than 6 characters are
! ;; saved.
! ;;
! ;;   When you load this file, completion will be on.  I suggest you use the
! ;; compiled version (because it is noticeably faster).
! ;;
! ;;  M-X completion-mode toggles whether or not new words are added to the
! ;; database by changing the value of enable-completion.
! ;;
! ;;  SAVING/LOADING COMPLETIONS
! ;;   Completions are automatically saved from one session to another
! ;; (unless save-completions-flag or enable-completion is nil).
! ;; Loading this file (or calling initialize-completions) causes EMACS
! ;; to load a completions database for a saved completions file 
! ;; (default: ~/.completions).  When you exit, EMACS saves a copy of the
! ;; completions that you 
! ;; often use.  When you next start, EMACS loads in the saved completion file.
! ;;
! ;;   The number of completions saved depends loosely on 
! ;; *saved-completions-decay-factor*.  Completions that have never been 
! ;; inserted via "complete" are not saved.  You are encouraged to experiment
! ;; with different functions (see compute-completion-min-num-uses).
! ;;
! ;;   Some completions are permanent and are always saved out.  These 
! ;; completions have their num-uses slot set to T.  Use 
! ;; add-permanent-completion to do this
! ;;
! ;;   Completions are saved only if enable-completion is T.  The number of old
! ;; versions kept of the saved completions file is controlled by 
! ;; completions-file-versions-kept.
! ;;
! ;; COMPLETE KEY OPTIONS
! ;;   The complete function takes a numeric arguments.  
! ;;  control-u :: leave the point at the beginning of the completion rather 
! ;;               than the middle.
! ;;  a number  :: rotate through the possible completions by that amount
! ;;  `-'       :: same as -1 (insert previous completion)
! ;;
! ;; HOW THE DATABASE IS MAINTAINED
! ;;  <write>
! ;;
! ;; UPDATING THE DATABASE MANUALLY
! ;;   m-x kill-completion 
! ;;     kills the completion at point.
! ;;   m-x add-completion
! ;;   m-x add-permanent-completion
! ;;   
! ;; UPDATING THE DATABASE FROM A SOURCE CODE FILE
! ;;   m-x add-completions-from-buffer
! ;;     Parses all the definition names from a C or LISP mode buffer and
! ;;     adds them to the completion database.
! ;;
! ;;   m-x add-completions-from-lisp-file 
! ;;     Parses all the definition names from a C or Lisp mode file and
! ;;     adds them to the completion database.
! ;;
! ;; UPDATING THE DATABASE FROM A TAGS TABLE
! ;;   m-x add-completions-from-tags-table
! ;;     Adds completions from the current tags-table-buffer.
! ;;
! ;; HOW A COMPLETION IS FOUND
! ;;  <write>
! ;;
! ;; STRING CASING
! ;;   Completion is string case independent if case-fold-search has its 
! ;;  normal default of T.  Also when the completion is inserted the case of the
! ;;  entry is coerced appropriately.  
! ;;  [E.G.  APP --> APPROPRIATELY     app --> appropriately  
! ;;         App --> Appropriately]
! ;;
! ;; INITIALIZATION
! ;;  The form `(initialize-completions)' initializes the completion system by 
! ;; trying to load in the user's completions.  After the first cal, further 
! ;; calls have no effect so one should be careful not to put the form in a 
! ;; site's standard site-init file.
! ;;
! ;;---------------------------------------------------------------------------
! ;;
! ;;
! 
! ;;---------------------------------------------------------------------------
! ;; Functions you might like to call
! ;;---------------------------------------------------------------------------
! ;;
! ;;  add-completion  string &optional num-uses
! ;;    Adds a new string to the database
! ;;
! ;;  add-permanent-completion  string
! ;;    Adds a new string to the database with num-uses = T
! ;;
! 
! ;;  kill-completion string
! ;;    Kills the completion from the database.
! ;;
! ;;  clear-all-completions
! ;;    Clears the database
! ;;
! ;;  list-all-completions
! ;;    Returns a list of all completions.
! ;;
! ;;
! ;;  next-completion string &optional index
! ;;    Returns a completion entry that starts with string.
! ;;
! ;;  find-exact-completion string
! ;;    Returns a completion entry that exactly matches string.
! ;;
! ;;  complete
! ;;    Inserts a completion at point
! ;;
! ;;  initialize-completions
! ;;    Loads the completions file and sets up so that exiting emacs will 
! ;;  save them.
! ;;
! ;;  save-completions-to-file &optional filename  
! ;;  load-completions-from-file &optional filename
! ;;
! ;;-----------------------------------------------
! ;; Other functions
! ;;-----------------------------------------------
! ;;
! ;;  get-completion-list string
! ;;
! ;; These things are for manipulating the structure
! ;;  make-completion string num-uses
! ;;  completion-num-uses completion 
! ;;  completion-string completion
! ;;  set-completion-num-uses completion num-uses
! ;;  set-completion-string completion string
! ;;  
! ;;
! 
! ;;-----------------------------------------------
! ;; To Do :: (anybody ?)
! ;;-----------------------------------------------
! ;;
! ;;   Implement Lookup and keyboard interface in C
! ;;   Add package prefix smarts (for Common Lisp)
! ;;   Add autoprompting of possible completions after every keystroke (fast
! ;;      terminals only !)
! ;;   Add doc. to texinfo
! ;;
! ;;
! ;;-----------------------------------------------
  ;;; Change Log:
! ;;-----------------------------------------------
! ;;    Sometime in '84 Brewster implemented a somewhat buggy version for 
! ;; Symbolics LISPMs.
! ;;    Jan. '85 Jim became enamored of the idea and implemented a faster, 
! ;; more robust version.
! ;;    With input from many users at TMC, (rose, craig, and gls come to mind),
! ;; the current style of interface was developed. 
! ;;    9/87, Jim and Brewster took terminals home.  Yuck.  After 
! ;; complaining for a while Brewster implemented a subset of the current 
! ;; LISPM version for GNU Emacs.  
! ;;    8/88  After complaining for a while (and with sufficient 
! ;; promised rewards), Jim reimplemented a version of GNU completion
! ;; superior to that of the LISPM version.
! ;;
! ;;-----------------------------------------------
! ;; Acknowledgements
! ;;-----------------------------------------------
! ;;  Cliff Lasser (cal@think.com), Kevin Herbert (kph@cisco.com),
! ;;  eero@media-lab, kgk@cs.brown.edu, jla@ai.mit.edu,
! ;;
! ;;-----------------------------------------------
! ;; Change Log
! ;;-----------------------------------------------
! ;; From version 9 to 10
! ;;  - Allowance for non-integral *completion-version* nos.
! ;;  - Fix cmpl-apply-as-top-level for keyboard macros
! ;;  - Fix broken completion merging (in save-completions-to-file)
! ;;  - More misc. fixes for version 19.0 of emacs
! ;;
! ;; From Version 8 to 9
! ;;  - Ported to version 19.0 of emacs (backcompatible with version 18)
! ;;  - Added add-completions-from-tags-table (with thanks to eero@media-lab)
! ;;
! ;; From Version 7 to 8
! ;;  - Misc. changes to comments
! ;;  - new completion key bindings: c-x o, M->, M-<, c-a, c-e
! ;;  - cdabbrev now checks all the visible window buffers and the "other buffer"
! ;;  - `%' is now a symbol character rather than a separator (except in C mode)
! ;;
! ;; From Version 6 to 7
! ;;  - Fixed bug with saving out .completion file the first time
! ;;
! ;; From Version 5 to 6
! ;;  - removed statistics recording
! ;;  - reworked advise to handle autoloads
! ;;  - Fixed fortran mode support
! ;;  - Added new cursor motion triggers
! ;;
! ;; From Version 4 to 5
! ;;  - doesn't bother saving if nothing has changed
! ;;  - auto-save if haven't used for a 1/2 hour
! ;;  - save period extended to two weeks
! ;;  - minor fix to capitalization code
! ;;  - added *completion-auto-save-period* to variables recorded.
! ;;  - added reenter protection to cmpl-record-statistics-filter
! ;;  - added backup protection to save-completions-to-file (prevents 
! ;;    problems with disk full errors)
  
  ;;; Code:
  
! ;;---------------------------------------------------------------------------
! ;; User changeable parameters
! ;;---------------------------------------------------------------------------
  
  (defvar enable-completion t
*************** If nil, no new words added to the databa
*** 286,290 ****
  See also `saved-completions-retention-time'.")
  
! (defvar save-completions-file-name "~/.completions"
    "*The filename to save completions to.")
  
--- 288,292 ----
  See also `saved-completions-retention-time'.")
  
! (defvar save-completions-file-name (convert-standard-filename "~/.completions")
    "*The filename to save completions to.")
  
*************** Definitions from visited files which hav
*** 317,326 ****
  are automatically added to the completion database.")
  
! ;;;(defvar *record-cmpl-statistics-p* nil
! ;;;  "*If non-nil, record completion statistics.")
  
! ;;;(defvar *completion-auto-save-period* 1800
! ;;;  "*The period in seconds to wait for emacs to be idle before autosaving
! ;;;the completions.  Default is a 1/2 hour.")
  
  (defconst completion-min-length nil ;; defined below in eval-when
--- 319,328 ----
  are automatically added to the completion database.")
  
! ;;(defvar *record-cmpl-statistics-p* nil
! ;;  "*If non-nil, record completion statistics.")
  
! ;;(defvar *completion-auto-save-period* 1800
! ;;  "*The period in seconds to wait for emacs to be idle before autosaving
! ;;the completions.  Default is a 1/2 hour.")
  
  (defconst completion-min-length nil ;; defined below in eval-when
*************** Then evaluate RESULT to get return value
*** 375,381 ****
  (completion-eval-when)
   
! ;;;---------------------------------------------------------------------------
! ;;; Internal Variables
! ;;;---------------------------------------------------------------------------
  
  (defvar cmpl-initialized-p nil
--- 377,383 ----
  (completion-eval-when)
   
! ;;---------------------------------------------------------------------------
! ;; Internal Variables
! ;;---------------------------------------------------------------------------
  
  (defvar cmpl-initialized-p nil
*************** Used to decide whether to save completio
*** 391,401 ****
  (defvar completion-string)
  
! ;;;---------------------------------------------------------------------------
! ;;; Low level tools
! ;;;---------------------------------------------------------------------------
! 
! ;;;-----------------------------------------------
! ;;; Misc.
! ;;;-----------------------------------------------
  
  (defun minibuffer-window-selected-p ()
--- 393,403 ----
  (defvar completion-string)
  
! ;;---------------------------------------------------------------------------
! ;; Low level tools
! ;;---------------------------------------------------------------------------
! 
! ;;-----------------------------------------------
! ;; Misc.
! ;;-----------------------------------------------
  
  (defun minibuffer-window-selected-p ()
*************** Used to decide whether to save completio
*** 407,413 ****
    form)
  
! ;;;-----------------------------------------------
! ;;; String case coercion
! ;;;-----------------------------------------------
  
  (defun cmpl-string-case-type (string)
--- 409,415 ----
    form)
  
! ;;-----------------------------------------------
! ;; String case coercion
! ;;-----------------------------------------------
  
  (defun cmpl-string-case-type (string)
*************** Used to decide whether to save completio
*** 428,437 ****
      ))
  
! ;;; Tests -
! ;;; (cmpl-string-case-type "123ABCDEF456") --> :up
! ;;; (cmpl-string-case-type "123abcdef456") --> :down
! ;;; (cmpl-string-case-type "123aBcDeF456") --> :mixed
! ;;; (cmpl-string-case-type "123456")       --> :neither
! ;;; (cmpl-string-case-type "Abcde123")     --> :capitalized
  
  (defun cmpl-coerce-string-case (string case-type)
--- 430,439 ----
      ))
  
! ;; Tests -
! ;; (cmpl-string-case-type "123ABCDEF456") --> :up
! ;; (cmpl-string-case-type "123abcdef456") --> :down
! ;; (cmpl-string-case-type "123aBcDeF456") --> :mixed
! ;; (cmpl-string-case-type "123456")       --> :neither
! ;; (cmpl-string-case-type "Abcde123")     --> :capitalized
  
  (defun cmpl-coerce-string-case (string case-type)
*************** Used to decide whether to save completio
*** 460,468 ****
  	  )))
  
! ;;; Tests -
! ;;; (cmpl-merge-string-cases "AbCdEf456" "abc")     --> AbCdEf456
! ;;; (cmpl-merge-string-cases "abcdef456" "ABC")     --> ABCDEF456
! ;;; (cmpl-merge-string-cases "ABCDEF456" "Abc")     --> Abcdef456
! ;;; (cmpl-merge-string-cases "ABCDEF456" "abc")     --> abcdef456
  
  
--- 462,470 ----
  	  )))
  
! ;; Tests -
! ;; (cmpl-merge-string-cases "AbCdEf456" "abc")     --> AbCdEf456
! ;; (cmpl-merge-string-cases "abcdef456" "ABC")     --> ABCDEF456
! ;; (cmpl-merge-string-cases "ABCDEF456" "Abc")     --> Abcdef456
! ;; (cmpl-merge-string-cases "ABCDEF456" "abc")     --> abcdef456
  
  
*************** Used to decide whether to save completio
*** 473,532 ****
  	(/ (nth 2 time) 3600.0)))))
  
! ;;;---------------------------------------------------------------------------
! ;;; "Symbol" parsing functions
! ;;;---------------------------------------------------------------------------
! ;;; The functions symbol-before-point, symbol-under-point, etc. quickly return
! ;;; an appropriate symbol string.  The strategy is to temporarily change
! ;;; the syntax table to enable fast symbol searching.  There are three classes
! ;;; of syntax in these "symbol" syntax tables ::
! ;;;
! ;;; syntax (?_) - "symbol" chars (e.g. alphanumerics)
! ;;; syntax (?w) - symbol chars to ignore at end of words (e.g. period).  
! ;;; syntax (? ) - everything else
! ;;;
! ;;; Thus by judicious use of scan-sexps and forward-word, we can get
! ;;; the word we want relatively fast and without consing.  
! ;;;
! ;;; Why do we need a separate category for "symbol chars to ignore at ends" ?
! ;;; For example, in LISP we want starting :'s trimmed 
! ;;; so keyword argument specifiers also define the keyword completion.  And,
! ;;; for example, in C we want `.' appearing in a structure ref. to
! ;;; be kept intact in order to store the whole structure ref.; however, if 
! ;;; it appears at the end of a symbol it should be discarded because it is
! ;;; probably used as a period.
! 
! ;;; Here is the default completion syntax ::
! ;;; Symbol chars :: A-Z a-z 0-9 @ / \ * + ~ $ < > %
! ;;; Symbol chars to ignore at ends :: _ : . -
! ;;; Separator chars. :: <tab> <space> ! ^ & ( ) = ` | { } [ ] ; " ' #
! ;;;                     , ? <Everything else>
! 
! ;;; Mode specific differences and notes ::
! ;;;  LISP diffs ->
! ;;;    Symbol chars :: ! & ? = ^
! ;;;
! ;;; C diffs ->
! ;;;   Separator chars :: + * / : %
! ;;;  A note on the hyphen (`-').  Perhaps the hyphen should also be a separator
! ;;; char., however, we wanted to have completion symbols include pointer 
! ;;; references.  For example, "foo->bar" is a symbol as far as completion is
! ;;; concerned.
! ;;;
! ;;; FORTRAN diffs ->
! ;;;   Separator chars :: + - * / :
! ;;;
! ;;; Pathname diffs ->
! ;;;   Symbol chars :: .
! ;;;  Of course there is no pathname "mode" and in fact we have not implemented
! ;;; this table.  However, if there was such a mode, this is what it would look
! ;;; like.
! 
! ;;;-----------------------------------------------
! ;;; Table definitions
! ;;;-----------------------------------------------
  
  (defun cmpl-make-standard-completion-syntax-table ()
!   (let ((table (make-syntax-table)) ;; default syntax is whitespace
  	i)
      ;; alpha chars
      (setq i 0)
--- 475,539 ----
  	(/ (nth 2 time) 3600.0)))))
  
! ;;---------------------------------------------------------------------------
! ;; "Symbol" parsing functions
! ;;---------------------------------------------------------------------------
! ;; The functions symbol-before-point, symbol-under-point, etc. quickly return
! ;; an appropriate symbol string.  The strategy is to temporarily change
! ;; the syntax table to enable fast symbol searching.  There are three classes
! ;; of syntax in these "symbol" syntax tables ::
! ;;
! ;; syntax (?_) - "symbol" chars (e.g. alphanumerics)
! ;; syntax (?w) - symbol chars to ignore at end of words (e.g. period).  
! ;; syntax (? ) - everything else
! ;;
! ;; Thus by judicious use of scan-sexps and forward-word, we can get
! ;; the word we want relatively fast and without consing.  
! ;;
! ;; Why do we need a separate category for "symbol chars to ignore at ends" ?
! ;; For example, in LISP we want starting :'s trimmed 
! ;; so keyword argument specifiers also define the keyword completion.  And,
! ;; for example, in C we want `.' appearing in a structure ref. to
! ;; be kept intact in order to store the whole structure ref.; however, if 
! ;; it appears at the end of a symbol it should be discarded because it is
! ;; probably used as a period.
! 
! ;; Here is the default completion syntax ::
! ;; Symbol chars :: A-Z a-z 0-9 @ / \ * + ~ $ < > %
! ;; Symbol chars to ignore at ends :: _ : . -
! ;; Separator chars. :: <tab> <space> ! ^ & ( ) = ` | { } [ ] ; " ' #
! ;;                     , ? <Everything else>
! 
! ;; Mode specific differences and notes ::
! ;;  LISP diffs ->
! ;;    Symbol chars :: ! & ? = ^
! ;;
! ;; C diffs ->
! ;;   Separator chars :: + * / : %
! ;;  A note on the hyphen (`-').  Perhaps the hyphen should also be a separator
! ;; char., however, we wanted to have completion symbols include pointer 
! ;; references.  For example, "foo->bar" is a symbol as far as completion is
! ;; concerned.
! ;;
! ;; FORTRAN diffs ->
! ;;   Separator chars :: + - * / :
! ;;
! ;; Pathname diffs ->
! ;;   Symbol chars :: .
! ;;  Of course there is no pathname "mode" and in fact we have not implemented
! ;; this table.  However, if there was such a mode, this is what it would look
! ;; like.
! 
! ;;-----------------------------------------------
! ;; Table definitions
! ;;-----------------------------------------------
  
  (defun cmpl-make-standard-completion-syntax-table ()
!   (let ((table (make-syntax-table))
  	i)
+     ;; Default syntax is whitespace.
+     (setq i 0)
+     (while (< i 256)
+       (modify-syntax-entry i " " table)
+       (setq i (1+ i)))
      ;; alpha chars
      (setq i 0)
*************** Used to decide whether to save completio
*** 586,592 ****
  (make-variable-buffer-local 'cmpl-syntax-table)
  
! ;;;-----------------------------------------------
! ;;; Installing the appropriate mode tables
! ;;;-----------------------------------------------
  
  (add-hook 'lisp-mode-hook
--- 593,599 ----
  (make-variable-buffer-local 'cmpl-syntax-table)
  
! ;;-----------------------------------------------
! ;; Installing the appropriate mode tables
! ;;-----------------------------------------------
  
  (add-hook 'lisp-mode-hook
*************** Used to decide whether to save completio
*** 603,615 ****
  	     (completion-setup-fortran-mode)))
  
! ;;;-----------------------------------------------
! ;;; Symbol functions
! ;;;-----------------------------------------------
  (defvar cmpl-symbol-start nil
    "Holds first character of symbol, after any completion symbol function.")
  (defvar cmpl-symbol-end nil
    "Holds last character of symbol, after any completion symbol function.")
! ;;; These are temp. vars. we use to avoid using let.
! ;;;   Why ?  Small speed improvement.
  (defvar cmpl-saved-syntax nil)
  (defvar cmpl-saved-point nil)
--- 610,622 ----
  	     (completion-setup-fortran-mode)))
  
! ;;-----------------------------------------------
! ;; Symbol functions
! ;;-----------------------------------------------
  (defvar cmpl-symbol-start nil
    "Holds first character of symbol, after any completion symbol function.")
  (defvar cmpl-symbol-end nil
    "Holds last character of symbol, after any completion symbol function.")
! ;; These are temp. vars. we use to avoid using let.
! ;;   Why ?  Small speed improvement.
  (defvar cmpl-saved-syntax nil)
  (defvar cmpl-saved-point nil)
*************** Used to decide whether to save completio
*** 619,669 ****
  But only if it is longer than `completion-min-length'."
    (setq cmpl-saved-syntax (syntax-table))
!   (set-syntax-table cmpl-syntax-table)
!   (cond 
!   ;; Cursor is on following-char and after preceding-char
!     ((memq (char-syntax (following-char)) '(?w ?_))     
!      (setq cmpl-saved-point (point)
! 	   cmpl-symbol-start (scan-sexps (1+ cmpl-saved-point) -1)
! 	   cmpl-symbol-end (scan-sexps cmpl-saved-point 1))
!      ;; remove chars to ignore at the start
!      (cond ((= (char-syntax (char-after cmpl-symbol-start)) ?w)
! 	    (goto-char cmpl-symbol-start)
! 	    (forward-word 1)
! 	    (setq cmpl-symbol-start (point))
! 	    (goto-char cmpl-saved-point)
! 	    ))
!      ;; remove chars to ignore at the end
!      (cond ((= (char-syntax (char-after (1- cmpl-symbol-end))) ?w)
! 	    (goto-char cmpl-symbol-end)
! 	    (forward-word -1)
! 	    (setq cmpl-symbol-end (point))
! 	    (goto-char cmpl-saved-point)
! 	    ))
!      ;; restore state
!      (set-syntax-table cmpl-saved-syntax)
!      ;; Return completion if the length is reasonable
!      (if (and (<= (cmpl-read-time-eval completion-min-length)
! 		  (- cmpl-symbol-end cmpl-symbol-start))
! 	      (<= (- cmpl-symbol-end cmpl-symbol-start)
! 		  (cmpl-read-time-eval completion-max-length)))
! 	 (buffer-substring cmpl-symbol-start cmpl-symbol-end))
!      )
!     (t 
!      ;; restore table if no symbol
!      (set-syntax-table cmpl-saved-syntax)
!      nil)
!     ))
! 
! ;;; tests for symbol-under-point
! ;;;  `^' indicates cursor pos. where value is returned
! ;;;  simple-word-test
! ;;;  ^^^^^^^^^^^^^^^^  --> simple-word-test
! ;;;  _harder_word_test_
! ;;;  ^^^^^^^^^^^^^^^^^^ --> harder_word_test
! ;;;  .___.______.
! ;;;  --> nil
! ;;;  /foo/bar/quux.hello
! ;;;  ^^^^^^^^^^^^^^^^^^^ --> /foo/bar/quux.hello
! ;;;
  
  (defun symbol-before-point ()
--- 626,671 ----
  But only if it is longer than `completion-min-length'."
    (setq cmpl-saved-syntax (syntax-table))
!   (unwind-protect
!       (progn
! 	(set-syntax-table cmpl-syntax-table)
! 	(cond 
! 	;; Cursor is on following-char and after preceding-char
! 	  ((memq (char-syntax (following-char)) '(?w ?_))     
! 	   (setq cmpl-saved-point (point)
! 		 cmpl-symbol-start (scan-sexps (1+ cmpl-saved-point) -1)
! 		 cmpl-symbol-end (scan-sexps cmpl-saved-point 1))
! 	   ;; Remove chars to ignore at the start.
! 	   (cond ((= (char-syntax (char-after cmpl-symbol-start)) ?w)
! 		  (goto-char cmpl-symbol-start)
! 		  (forward-word 1)
! 		  (setq cmpl-symbol-start (point))
! 		  (goto-char cmpl-saved-point)
! 		  ))
! 	   ;; Remove chars to ignore at the end.
! 	   (cond ((= (char-syntax (char-after (1- cmpl-symbol-end))) ?w)
! 		  (goto-char cmpl-symbol-end)
! 		  (forward-word -1)
! 		  (setq cmpl-symbol-end (point))
! 		  (goto-char cmpl-saved-point)
! 		  ))
! 	   ;; Return completion if the length is reasonable.
! 	   (if (and (<= (cmpl-read-time-eval completion-min-length)
! 			(- cmpl-symbol-end cmpl-symbol-start))
! 		    (<= (- cmpl-symbol-end cmpl-symbol-start)
! 			(cmpl-read-time-eval completion-max-length)))
! 	       (buffer-substring cmpl-symbol-start cmpl-symbol-end)))))
!     (set-syntax-table cmpl-saved-syntax)))
! 
! ;; tests for symbol-under-point
! ;;  `^' indicates cursor pos. where value is returned
! ;;  simple-word-test
! ;;  ^^^^^^^^^^^^^^^^  --> simple-word-test
! ;;  _harder_word_test_
! ;;  ^^^^^^^^^^^^^^^^^^ --> harder_word_test
! ;;  .___.______.
! ;;  --> nil
! ;;  /foo/bar/quux.hello
! ;;  ^^^^^^^^^^^^^^^^^^^ --> /foo/bar/quux.hello
! ;;
  
  (defun symbol-before-point ()
*************** Returns nil if there isn't one longer th
*** 672,754 ****
    ;; This is called when a word separator is typed so it must be FAST !
    (setq cmpl-saved-syntax (syntax-table))
!   (set-syntax-table cmpl-syntax-table)
!   ;; Cursor is on following-char and after preceding-char
!   (cond ((= (setq cmpl-preceding-syntax (char-syntax (preceding-char))) ?_)
! 	 ;; No chars. to ignore at end
! 	 (setq cmpl-symbol-end (point)
! 	       cmpl-symbol-start (scan-sexps (1+ cmpl-symbol-end) -1)
  	       )
! 	 ;; remove chars to ignore at the start
! 	 (cond ((= (char-syntax (char-after cmpl-symbol-start)) ?w)
! 		(goto-char cmpl-symbol-start)
! 		(forward-word 1)
! 		(setq cmpl-symbol-start (point))
! 		(goto-char cmpl-symbol-end)
! 		))
! 	 ;; restore state
! 	 (set-syntax-table cmpl-saved-syntax)
! 	 ;; return value if long enough
! 	 (if (>= cmpl-symbol-end
! 		 (+ cmpl-symbol-start
! 		    (cmpl-read-time-eval completion-min-length)))
! 	     (buffer-substring cmpl-symbol-start cmpl-symbol-end))
! 	 )
! 	((= cmpl-preceding-syntax ?w)
! 	 ;; chars to ignore at end
! 	 (setq cmpl-saved-point (point)
! 	       cmpl-symbol-start (scan-sexps (1+ cmpl-saved-point) -1))
! 	 ;; take off chars. from end
! 	 (forward-word -1)
! 	 (setq cmpl-symbol-end (point))
! 	 ;; remove chars to ignore at the start
! 	 (cond ((= (char-syntax (char-after cmpl-symbol-start)) ?w)
! 		(goto-char cmpl-symbol-start)
! 		(forward-word 1)
! 		(setq cmpl-symbol-start (point))
! 		))
! 	 ;; restore state
! 	 (goto-char cmpl-saved-point)
! 	 (set-syntax-table cmpl-saved-syntax)
! 	 ;; Return completion if the length is reasonable
! 	 (if (and (<= (cmpl-read-time-eval completion-min-length)
! 		      (- cmpl-symbol-end cmpl-symbol-start))
! 		  (<= (- cmpl-symbol-end cmpl-symbol-start)
! 		      (cmpl-read-time-eval completion-max-length)))
! 	     (buffer-substring cmpl-symbol-start cmpl-symbol-end))
! 	 )
! 	(t 
! 	 ;; restore table if no symbol
! 	 (set-syntax-table cmpl-saved-syntax)
! 	 nil)
! 	))
! 
! ;;; tests for symbol-before-point
! ;;;  `^' indicates cursor pos. where value is returned
! ;;;  simple-word-test
! ;;;  ^ --> nil
! ;;;   ^ --> nil
! ;;;          ^  --> simple-w
! ;;;                  ^ --> simple-word-test
! ;;;  _harder_word_test_
! ;;;                   ^  --> harder_word_test
! ;;;                    ^  --> harder_word_test
! ;;;          ^ --> harder
! ;;;  .___....
! ;;;  --> nil
  
  (defun symbol-under-or-before-point ()
!   ;;; This could be made slightly faster but it is better to avoid
!   ;;; copying all the code.
!   ;;; However, it is only used by the completion string prompter.
!   ;;; If it comes into common use, it could be rewritten.
!   (setq cmpl-saved-syntax (syntax-table))
!   (set-syntax-table cmpl-syntax-table)
!   (cond ((memq (char-syntax (following-char)) '(?w ?_))
! 	 (set-syntax-table cmpl-saved-syntax)
  	 (symbol-under-point))
  	(t
! 	 (set-syntax-table cmpl-saved-syntax)
! 	 (symbol-before-point))
! 	))
  
  
--- 674,752 ----
    ;; This is called when a word separator is typed so it must be FAST !
    (setq cmpl-saved-syntax (syntax-table))
!   (unwind-protect
!       (progn
! 	(set-syntax-table cmpl-syntax-table)
! 	;; Cursor is on following-char and after preceding-char
! 	(cond ((= (setq cmpl-preceding-syntax (char-syntax (preceding-char))) ?_)
! 	       ;; Number of chars to ignore at end.
! 	       (setq cmpl-symbol-end (point)
! 		     cmpl-symbol-start (scan-sexps cmpl-symbol-end -1)
! 		     )
! 	       ;; Remove chars to ignore at the start.
! 	       (cond ((= (char-syntax (char-after cmpl-symbol-start)) ?w)
! 		      (goto-char cmpl-symbol-start)
! 		      (forward-word 1)
! 		      (setq cmpl-symbol-start (point))
! 		      (goto-char cmpl-symbol-end)
! 		      ))
! 	       ;; Return value if long enough.
! 	       (if (>= cmpl-symbol-end
! 		       (+ cmpl-symbol-start
! 			  (cmpl-read-time-eval completion-min-length)))
! 		   (buffer-substring cmpl-symbol-start cmpl-symbol-end))
  	       )
! 	      ((= cmpl-preceding-syntax ?w)
! 	       ;; chars to ignore at end
! 	       (setq cmpl-saved-point (point)
! 		     cmpl-symbol-start (scan-sexps cmpl-saved-point -1))
! 	       ;; take off chars. from end
! 	       (forward-word -1)
! 	       (setq cmpl-symbol-end (point))
! 	       ;; remove chars to ignore at the start
! 	       (cond ((= (char-syntax (char-after cmpl-symbol-start)) ?w)
! 		      (goto-char cmpl-symbol-start)
! 		      (forward-word 1)
! 		      (setq cmpl-symbol-start (point))
! 		      ))
! 	       ;; Restore state.
! 	       (goto-char cmpl-saved-point)
! 	       ;; Return completion if the length is reasonable
! 	       (if (and (<= (cmpl-read-time-eval completion-min-length)
! 			    (- cmpl-symbol-end cmpl-symbol-start))
! 			(<= (- cmpl-symbol-end cmpl-symbol-start)
! 			    (cmpl-read-time-eval completion-max-length)))
! 		   (buffer-substring cmpl-symbol-start cmpl-symbol-end)))))
!     (set-syntax-table cmpl-saved-syntax)))
! 
! ;; tests for symbol-before-point
! ;;  `^' indicates cursor pos. where value is returned
! ;;  simple-word-test
! ;;  ^ --> nil
! ;;   ^ --> nil
! ;;          ^  --> simple-w
! ;;                  ^ --> simple-word-test
! ;;  _harder_word_test_
! ;;                   ^  --> harder_word_test
! ;;                    ^  --> harder_word_test
! ;;          ^ --> harder
! ;;  .___....
! ;;  --> nil
  
  (defun symbol-under-or-before-point ()
!   ;; This could be made slightly faster but it is better to avoid
!   ;; copying all the code.
!   ;; However, it is only used by the completion string prompter.
!   ;; If it comes into common use, it could be rewritten.
!   (cond ((memq (progn
! 		 (setq cmpl-saved-syntax (syntax-table))
! 		 (unwind-protect
! 		     (progn
! 		       (set-syntax-table cmpl-syntax-table)
! 		       (char-syntax (following-char)))
! 		   (set-syntax-table cmpl-saved-syntax)))
! 	       '(?w ?_))
  	 (symbol-under-point))
  	(t
! 	 (symbol-before-point))))
  
  
*************** Returns nil if there isn't one longer th
*** 759,827 ****
    ;; Cursor is on following-char and after preceding-char
    (setq cmpl-saved-syntax (syntax-table))
!   (set-syntax-table cmpl-syntax-table)
!   (cond ((memq (setq cmpl-preceding-syntax (char-syntax (preceding-char)))
! 	       '(?_ ?w))
! 	 (setq cmpl-symbol-end (point)
! 	       cmpl-symbol-start (scan-sexps (1+ cmpl-symbol-end) -1)
! 	       )
! 	 ;; remove chars to ignore at the start
! 	 (cond ((= (char-syntax (char-after cmpl-symbol-start)) ?w)
! 		(goto-char cmpl-symbol-start)
! 		(forward-word 1)
! 		(setq cmpl-symbol-start (point))
! 		(goto-char cmpl-symbol-end)
! 		))
! 	 ;; restore state
! 	 (set-syntax-table cmpl-saved-syntax)
! 	 ;; Return completion if the length is reasonable
! 	 (if (and (<= (cmpl-read-time-eval
! 		       completion-prefix-min-length)
! 		      (- cmpl-symbol-end cmpl-symbol-start))
! 		  (<= (- cmpl-symbol-end cmpl-symbol-start)
! 		      (cmpl-read-time-eval completion-max-length)))
! 	     (buffer-substring cmpl-symbol-start cmpl-symbol-end))
! 	 )
! 	(t 
! 	 ;; restore table if no symbol
! 	 (set-syntax-table cmpl-saved-syntax)
! 	 nil)
! 	))
! 
! ;;; tests for symbol-before-point-for-complete
! ;;;  `^' indicates cursor pos. where value is returned
! ;;;  simple-word-test
! ;;;  ^ --> nil
! ;;;   ^ --> nil
! ;;;          ^  --> simple-w
! ;;;                  ^ --> simple-word-test
! ;;;  _harder_word_test_
! ;;;                   ^  --> harder_word_test
! ;;;                    ^  --> harder_word_test_
! ;;;          ^ --> harder_
! ;;;  .___....
! ;;;  --> nil
  
  
  
! ;;;---------------------------------------------------------------------------
! ;;; Statistics Recording
! ;;;---------------------------------------------------------------------------
! 
! ;;; Note that the guts of this has been turned off.  The guts
! ;;; are in completion-stats.el.
! 
! ;;;-----------------------------------------------
! ;;; Conditionalizing code on *record-cmpl-statistics-p*
! ;;;-----------------------------------------------
! ;;; All statistics code outside this block should use this
  (defmacro cmpl-statistics-block (&rest body))
! ;;;  "Only executes body if we are recording statistics."
! ;;;  (list 'cond
! ;;;	(list* '*record-cmpl-statistics-p* body)
! ;;;	))		 
! 
! ;;;-----------------------------------------------
! ;;; Completion Sources
! ;;;-----------------------------------------------
  
  ;; ID numbers
--- 757,821 ----
    ;; Cursor is on following-char and after preceding-char
    (setq cmpl-saved-syntax (syntax-table))
!   (unwind-protect
!       (progn
! 	(set-syntax-table cmpl-syntax-table)
! 	(cond ((memq (setq cmpl-preceding-syntax (char-syntax (preceding-char)))
! 		     '(?_ ?w))
! 	       (setq cmpl-symbol-end (point)
! 		     cmpl-symbol-start (scan-sexps cmpl-symbol-end -1)
! 		     )
! 	       ;; Remove chars to ignore at the start.
! 	       (cond ((= (char-syntax (char-after cmpl-symbol-start)) ?w)
! 		      (goto-char cmpl-symbol-start)
! 		      (forward-word 1)
! 		      (setq cmpl-symbol-start (point))
! 		      (goto-char cmpl-symbol-end)
! 		      ))
! 	       ;; Return completion if the length is reasonable.
! 	       (if (and (<= (cmpl-read-time-eval
! 			     completion-prefix-min-length)
! 			    (- cmpl-symbol-end cmpl-symbol-start))
! 			(<= (- cmpl-symbol-end cmpl-symbol-start)
! 			    (cmpl-read-time-eval completion-max-length)))
! 		   (buffer-substring cmpl-symbol-start cmpl-symbol-end)))))
!     ;; Restore syntax table.
!     (set-syntax-table cmpl-saved-syntax)))
! 
! ;; tests for symbol-before-point-for-complete
! ;;  `^' indicates cursor pos. where value is returned
! ;;  simple-word-test
! ;;  ^ --> nil
! ;;   ^ --> nil
! ;;          ^  --> simple-w
! ;;                  ^ --> simple-word-test
! ;;  _harder_word_test_
! ;;                   ^  --> harder_word_test
! ;;                    ^  --> harder_word_test_
! ;;          ^ --> harder_
! ;;  .___....
! ;;  --> nil
  
  
  
! ;;---------------------------------------------------------------------------
! ;; Statistics Recording
! ;;---------------------------------------------------------------------------
! 
! ;; Note that the guts of this has been turned off.  The guts
! ;; are in completion-stats.el.
! 
! ;;-----------------------------------------------
! ;; Conditionalizing code on *record-cmpl-statistics-p*
! ;;-----------------------------------------------
! ;; All statistics code outside this block should use this
  (defmacro cmpl-statistics-block (&rest body))
! ;;  "Only executes body if we are recording statistics."
! ;;  (list 'cond
! ;;	(list* '*record-cmpl-statistics-p* body)
! ;;	))		 
! 
! ;;-----------------------------------------------
! ;; Completion Sources
! ;;-----------------------------------------------
  
  ;; ID numbers
*************** Returns nil if there isn't one longer th
*** 838,866 ****
  
  
! ;;;---------------------------------------------------------------------------
! ;;; Completion Method #2: dabbrev-expand style
! ;;;---------------------------------------------------------------------------
! ;;;
! ;;;   This method is used if there are no useful stored completions.  It is 
! ;;; based on dabbrev-expand with these differences :
! ;;;   1) Faster (we don't use regexps)
! ;;;   2) case coercion handled correctly
! ;;; This is called cdabbrev to differentiate it.
! ;;;   We simply search backwards through the file looking for words which
! ;;; start with the same letters we are trying to complete.
! ;;;
  
  (defvar cdabbrev-completions-tried nil)
! ;;;  "A list of all the cdabbrev completions since the last reset.")
  
  (defvar cdabbrev-current-point 0)
! ;;;  "The current point position the cdabbrev search is at.")
  
  (defvar cdabbrev-current-window nil)
! ;;;  "The current window we are looking for cdabbrevs in.  T if looking in
! ;;; (other-buffer), NIL if no more  cdabbrevs.")
  
  (defvar cdabbrev-wrapped-p nil)
! ;;;  "T if the cdabbrev search has wrapped around the file.")
  
  (defvar cdabbrev-abbrev-string "")
--- 832,860 ----
  
  
! ;;---------------------------------------------------------------------------
! ;; Completion Method #2: dabbrev-expand style
! ;;---------------------------------------------------------------------------
! ;;
! ;;   This method is used if there are no useful stored completions.  It is 
! ;; based on dabbrev-expand with these differences :
! ;;   1) Faster (we don't use regexps)
! ;;   2) case coercion handled correctly
! ;; This is called cdabbrev to differentiate it.
! ;;   We simply search backwards through the file looking for words which
! ;; start with the same letters we are trying to complete.
! ;;
  
  (defvar cdabbrev-completions-tried nil)
! ;;  "A list of all the cdabbrev completions since the last reset.")
  
  (defvar cdabbrev-current-point 0)
! ;;  "The current point position the cdabbrev search is at.")
  
  (defvar cdabbrev-current-window nil)
! ;;  "The current window we are looking for cdabbrevs in.  T if looking in
! ;; (other-buffer), NIL if no more  cdabbrevs.")
  
  (defvar cdabbrev-wrapped-p nil)
! ;;  "T if the cdabbrev search has wrapped around the file.")
  
  (defvar cdabbrev-abbrev-string "")
*************** Returns nil if there isn't one longer th
*** 868,878 ****
  (defvar cdabbrev-stop-point)
  
! ;;; Test strings for cdabbrev
! ;;; cdat-upcase   ;;same namestring
! ;;; CDAT-UPCASE   ;;ok
! ;;; cdat2         ;;too short
! ;;; cdat-1-2-3-4  ;;ok
! ;;; a-cdat-1      ;;doesn't start correctly
! ;;; cdat-simple   ;;ok
  
  
--- 862,872 ----
  (defvar cdabbrev-stop-point)
  
! ;; Test strings for cdabbrev
! ;; cdat-upcase   ;;same namestring
! ;; CDAT-UPCASE   ;;ok
! ;; cdat2         ;;too short
! ;; cdat-1-2-3-4  ;;ok
! ;; a-cdat-1      ;;doesn't start correctly
! ;; cdat-simple   ;;ok
  
  
*************** This is sensitive to `case-fold-search'.
*** 1013,1045 ****
  		 (next-cdabbrev))))))
  
! ;;; The following must be eval'd in the minibuffer ::
! ;;; (reset-cdabbrev "cdat")
! ;;; (next-cdabbrev)  --> "cdat-simple"
! ;;; (next-cdabbrev)  --> "cdat-1-2-3-4"
! ;;; (next-cdabbrev)  --> "CDAT-UPCASE"
! ;;; (next-cdabbrev)  --> "cdat-wrapping"
! ;;; (next-cdabbrev)  --> "cdat_start_sym"
! ;;; (next-cdabbrev)  --> nil
! ;;; (next-cdabbrev)  --> nil
! ;;; (next-cdabbrev)  --> nil
! 
! ;;; _cdat_start_sym
! ;;; cdat-wrapping
! 
! 
! ;;;---------------------------------------------------------------------------
! ;;; Completion Database
! ;;;---------------------------------------------------------------------------
! 
! ;;; We use two storage modes for the two search types ::
! ;;;  1) Prefix {cmpl-prefix-obarray} for looking up possible completions
! ;;;      Used by search-completion-next
! ;;;      the value of the symbol is nil or a cons of head and tail pointers
! ;;;  2) Interning {cmpl-obarray} to see if it's in the database
! ;;;      Used by find-exact-completion, completion-in-database-p
! ;;;      The value of the symbol is the completion entry
  
! ;;; bad things may happen if this length is changed due to the way
! ;;; GNU implements obarrays
  (defconst cmpl-obarray-length 511)
  
--- 1007,1039 ----
  		 (next-cdabbrev))))))
  
! ;; The following must be eval'd in the minibuffer ::
! ;; (reset-cdabbrev "cdat")
! ;; (next-cdabbrev)  --> "cdat-simple"
! ;; (next-cdabbrev)  --> "cdat-1-2-3-4"
! ;; (next-cdabbrev)  --> "CDAT-UPCASE"
! ;; (next-cdabbrev)  --> "cdat-wrapping"
! ;; (next-cdabbrev)  --> "cdat_start_sym"
! ;; (next-cdabbrev)  --> nil
! ;; (next-cdabbrev)  --> nil
! ;; (next-cdabbrev)  --> nil
! 
! ;; _cdat_start_sym
! ;; cdat-wrapping
! 
! 
! ;;---------------------------------------------------------------------------
! ;; Completion Database
! ;;---------------------------------------------------------------------------
! 
! ;; We use two storage modes for the two search types ::
! ;;  1) Prefix {cmpl-prefix-obarray} for looking up possible completions
! ;;      Used by search-completion-next
! ;;      the value of the symbol is nil or a cons of head and tail pointers
! ;;  2) Interning {cmpl-obarray} to see if it's in the database
! ;;      Used by find-exact-completion, completion-in-database-p
! ;;      The value of the symbol is the completion entry
  
! ;; bad things may happen if this length is changed due to the way
! ;; GNU implements obarrays
  (defconst cmpl-obarray-length 511)
  
*************** Each symbol is bound to a list of comple
*** 1052,1068 ****
  Each symbol is bound to a single completion entry.")
  
! ;;;-----------------------------------------------
! ;;; Completion Entry Structure Definition
! ;;;-----------------------------------------------
! 
! ;;; A completion entry is a LIST of string, prefix-symbol num-uses, and
! ;;; last-use-time (the time the completion was last used)
! ;;; last-use-time is T if the string should be kept permanently
! ;;; num-uses is incremented everytime the completion is used.
  
! ;;; We chose lists because (car foo) is faster than (aref foo 0) and the 
! ;;; creation time is about the same.
  
! ;;; READER MACROS
  
  (defmacro completion-string (completion-entry)
--- 1046,1062 ----
  Each symbol is bound to a single completion entry.")
  
! ;;-----------------------------------------------
! ;; Completion Entry Structure Definition
! ;;-----------------------------------------------
! 
! ;; A completion entry is a LIST of string, prefix-symbol num-uses, and
! ;; last-use-time (the time the completion was last used)
! ;; last-use-time is T if the string should be kept permanently
! ;; num-uses is incremented every time the completion is used.
  
! ;; We chose lists because (car foo) is faster than (aref foo 0) and the 
! ;; creation time is about the same.
  
! ;; READER MACROS
  
  (defmacro completion-string (completion-entry)
*************** Each symbol is bound to a single complet
*** 1082,1086 ****
    (list 'nth 3 completion-entry))
  
! ;;; WRITER MACROS
  (defmacro set-completion-string (completion-entry string)
    (list 'setcar completion-entry string))
--- 1076,1080 ----
    (list 'nth 3 completion-entry))
  
! ;; WRITER MACROS
  (defmacro set-completion-string (completion-entry string)
    (list 'setcar completion-entry string))
*************** Each symbol is bound to a single complet
*** 1092,1096 ****
    (list 'setcar (list 'cdr (list 'cdr completion-entry)) last-use-time))
  
! ;;; CONSTRUCTOR
  (defun make-completion (string)
    "Returns a list of a completion entry."
--- 1086,1090 ----
    (list 'setcar (list 'cdr (list 'cdr completion-entry)) last-use-time))
  
! ;; CONSTRUCTOR
  (defun make-completion (string)
    "Returns a list of a completion entry."
*************** Each symbol is bound to a single complet
*** 1103,1112 ****
  
  
! ;;;-----------------------------------------------
! ;;; Prefix symbol entry definition
! ;;;-----------------------------------------------
! ;;; A cons of (head . tail)
  
! ;;; READER Macros
  
  (defmacro cmpl-prefix-entry-head (prefix-entry)
--- 1097,1106 ----
  
  
! ;;-----------------------------------------------
! ;; Prefix symbol entry definition
! ;;-----------------------------------------------
! ;; A cons of (head . tail)
  
! ;; READER Macros
  
  (defmacro cmpl-prefix-entry-head (prefix-entry)
*************** Each symbol is bound to a single complet
*** 1116,1120 ****
    (list 'cdr prefix-entry))
  
! ;;; WRITER Macros
  
  (defmacro set-cmpl-prefix-entry-head (prefix-entry new-head)
--- 1110,1114 ----
    (list 'cdr prefix-entry))
  
! ;; WRITER Macros
  
  (defmacro set-cmpl-prefix-entry-head (prefix-entry new-head)
*************** Each symbol is bound to a single complet
*** 1124,1128 ****
    (list 'setcdr prefix-entry new-tail))
  
! ;;; Constructor
  
  (defun make-cmpl-prefix-entry (completion-entry-list)
--- 1118,1122 ----
    (list 'setcdr prefix-entry new-tail))
  
! ;; Constructor
  
  (defun make-cmpl-prefix-entry (completion-entry-list)
*************** Each symbol is bound to a single complet
*** 1130,1136 ****
    (cons completion-entry-list completion-entry-list))
  
! ;;;-----------------------------------------------
! ;;; Completion Database - Utilities
! ;;;-----------------------------------------------
  
  (defun clear-all-completions ()
--- 1124,1130 ----
    (cons completion-entry-list completion-entry-list))
  
! ;;-----------------------------------------------
! ;; Completion Database - Utilities
! ;;-----------------------------------------------
  
  (defun clear-all-completions ()
*************** Each symbol is bound to a single complet
*** 1170,1180 ****
  
  
! ;;;-----------------------------------------------
! ;;; Updating the database
! ;;;-----------------------------------------------
! ;;;
! ;;;   These are the internal functions used to update the datebase
! ;;;
! ;;;
  (defvar completion-to-accept nil)
    ;;"Set to a string that is pending its acceptance."
--- 1164,1174 ----
  
  
! ;;-----------------------------------------------
! ;; Updating the database
! ;;-----------------------------------------------
! ;;
! ;;   These are the internal functions used to update the datebase
! ;;
! ;;
  (defvar completion-to-accept nil)
    ;;"Set to a string that is pending its acceptance."
*************** Each symbol is bound to a single complet
*** 1192,1196 ****
    "Set to T if you want to debug the database.")
  
! ;;; READS
  (defun find-exact-completion (string)
    "Returns the completion entry for string or nil.
--- 1186,1190 ----
    "Set to T if you want to debug the database.")
  
! ;; READS
  (defun find-exact-completion (string)
    "Returns the completion entry for string or nil.
*************** Must be called after `find-exact-complet
*** 1271,1275 ****
    )
  
! ;;; WRITES
  (defun add-completion-to-tail-if-new (string)
    "If STRING is not in the database add it to appropriate prefix list.
--- 1265,1269 ----
    )
  
! ;; WRITES
  (defun add-completion-to-tail-if-new (string)
    "If STRING is not in the database add it to appropriate prefix list.
*************** String must be longer than `completion-p
*** 1400,1449 ****
        ))
  
! ;;; Tests --
! ;;;  - Add and Find -
! ;;; (add-completion-to-head "banana")     --> ("banana" 0 nil 0)
! ;;; (find-exact-completion "banana")      --> ("banana" 0 nil 0)
! ;;; (find-exact-completion "bana")        --> nil
! ;;; (car (find-cmpl-prefix-entry "ban"))  --> (("banana" ...))
! ;;; (cdr (find-cmpl-prefix-entry "ban"))  --> (("banana" ...))
! ;;; (add-completion-to-head "banish")     --> ("banish" 0 nil 0)
! ;;; (find-exact-completion "banish")      --> ("banish" 0 nil 0)
! ;;; (car (find-cmpl-prefix-entry "ban"))  --> (("banish" ...) ("banana" ...))
! ;;; (cdr (find-cmpl-prefix-entry "ban"))  --> (("banana" ...))
! ;;; (add-completion-to-head "banana")     --> ("banana" 0 nil 0)
! ;;; (car (find-cmpl-prefix-entry "ban"))  --> (("banana" ...) ("banish" ...))
! ;;; (cdr (find-cmpl-prefix-entry "ban"))  --> (("banish" ...))
! ;;;
! ;;;  - Deleting -
! ;;; (add-completion-to-head "banner")     --> ("banner" 0 nil 0)
! ;;; (delete-completion "banner")        
! ;;; (find-exact-completion "banner")      --> nil
! ;;; (car (find-cmpl-prefix-entry "ban"))  --> (("banana" ...) ("banish" ...))
! ;;; (cdr (find-cmpl-prefix-entry "ban"))  --> (("banish" ...))
! ;;; (add-completion-to-head "banner")     --> ("banner" 0 nil 0) 
! ;;; (delete-completion "banana")        
! ;;; (car (find-cmpl-prefix-entry "ban"))  --> (("banner" ...) ("banish" ...))
! ;;; (cdr (find-cmpl-prefix-entry "ban"))  --> (("banish" ...))
! ;;; (delete-completion "banner")        
! ;;; (delete-completion "banish")                 
! ;;; (find-cmpl-prefix-entry "ban")        --> nil
! ;;; (delete-completion "banner")          --> error
! ;;;
! ;;; - Tail -
! ;;; (add-completion-to-tail-if-new "banana") --> ("banana" 0 nil 0)
! ;;; (car (find-cmpl-prefix-entry "ban"))     --> (("banana" ...))
! ;;; (cdr (find-cmpl-prefix-entry "ban"))     --> (("banana" ...))
! ;;; (add-completion-to-tail-if-new "banish") --> ("banish" 0 nil 0)
! ;;; (car (find-cmpl-prefix-entry "ban"))     -->(("banana" ...) ("banish" ...))
! ;;; (cdr (find-cmpl-prefix-entry "ban"))     -->(("banish" ...))
! ;;;
! 
! 
! ;;;---------------------------------------------------------------------------
! ;;; Database Update :: Interface level routines
! ;;;---------------------------------------------------------------------------
! ;;; 
! ;;; These lie on top of the database ref. functions but below the standard
! ;;; user interface level
  
  
--- 1394,1443 ----
        ))
  
! ;; Tests --
! ;;  - Add and Find -
! ;; (add-completion-to-head "banana")     --> ("banana" 0 nil 0)
! ;; (find-exact-completion "banana")      --> ("banana" 0 nil 0)
! ;; (find-exact-completion "bana")        --> nil
! ;; (car (find-cmpl-prefix-entry "ban"))  --> (("banana" ...))
! ;; (cdr (find-cmpl-prefix-entry "ban"))  --> (("banana" ...))
! ;; (add-completion-to-head "banish")     --> ("banish" 0 nil 0)
! ;; (find-exact-completion "banish")      --> ("banish" 0 nil 0)
! ;; (car (find-cmpl-prefix-entry "ban"))  --> (("banish" ...) ("banana" ...))
! ;; (cdr (find-cmpl-prefix-entry "ban"))  --> (("banana" ...))
! ;; (add-completion-to-head "banana")     --> ("banana" 0 nil 0)
! ;; (car (find-cmpl-prefix-entry "ban"))  --> (("banana" ...) ("banish" ...))
! ;; (cdr (find-cmpl-prefix-entry "ban"))  --> (("banish" ...))
! ;;
! ;;  - Deleting -
! ;; (add-completion-to-head "banner")     --> ("banner" 0 nil 0)
! ;; (delete-completion "banner")        
! ;; (find-exact-completion "banner")      --> nil
! ;; (car (find-cmpl-prefix-entry "ban"))  --> (("banana" ...) ("banish" ...))
! ;; (cdr (find-cmpl-prefix-entry "ban"))  --> (("banish" ...))
! ;; (add-completion-to-head "banner")     --> ("banner" 0 nil 0) 
! ;; (delete-completion "banana")        
! ;; (car (find-cmpl-prefix-entry "ban"))  --> (("banner" ...) ("banish" ...))
! ;; (cdr (find-cmpl-prefix-entry "ban"))  --> (("banish" ...))
! ;; (delete-completion "banner")        
! ;; (delete-completion "banish")                 
! ;; (find-cmpl-prefix-entry "ban")        --> nil
! ;; (delete-completion "banner")          --> error
! ;;
! ;; - Tail -
! ;; (add-completion-to-tail-if-new "banana") --> ("banana" 0 nil 0)
! ;; (car (find-cmpl-prefix-entry "ban"))     --> (("banana" ...))
! ;; (cdr (find-cmpl-prefix-entry "ban"))     --> (("banana" ...))
! ;; (add-completion-to-tail-if-new "banish") --> ("banish" 0 nil 0)
! ;; (car (find-cmpl-prefix-entry "ban"))     -->(("banana" ...) ("banish" ...))
! ;; (cdr (find-cmpl-prefix-entry "ban"))     -->(("banish" ...))
! ;;
! 
! 
! ;;---------------------------------------------------------------------------
! ;; Database Update :: Interface level routines
! ;;---------------------------------------------------------------------------
! ;; 
! ;; These lie on top of the database ref. functions but below the standard
! ;; user interface level
  
  
*************** Completions added this way will automati
*** 1552,1587 ****
      ))
  
! ;;; Tests --
! ;;;  - Add and Find -
! ;;; (add-completion "banana" 5 10)  
! ;;; (find-exact-completion "banana")  --> ("banana" 5 10 0)
! ;;; (add-completion "banana" 6)     
! ;;; (find-exact-completion "banana")  --> ("banana" 6 10 0)
! ;;; (add-completion "banish")
! ;;; (car (find-cmpl-prefix-entry "ban"))  --> (("banish" ...) ("banana" ...))
! ;;;
! ;;;  - Accepting -
! ;;; (setq completion-to-accept "banana")
! ;;; (accept-completion)                   
! ;;; (find-exact-completion "banana")      --> ("banana" 7 10)
! ;;; (car (find-cmpl-prefix-entry "ban"))  --> (("banana" ...) ("banish" ...))
! ;;; (setq completion-to-accept "banish")
! ;;; (add-completion "banner")           
! ;;; (car (find-cmpl-prefix-entry "ban"))
! ;;;        --> (("banner" ...) ("banish" 1 ...) ("banana" 7 ...))
! ;;;
! ;;;  - Deleting -
! ;;; (kill-completion "banish")          
! ;;; (car (find-cmpl-prefix-entry "ban"))  --> (("banner" ...) ("banana" ...))
! 
! 
! ;;;---------------------------------------------------------------------------
! ;;; Searching the database
! ;;;---------------------------------------------------------------------------
! ;;; Functions outside this block must call completion-search-reset followed
! ;;; by calls to completion-search-next or completion-search-peek
! ;;;
  
! ;;; Status variables
  ;; Commented out to improve loading speed
  (defvar cmpl-test-string "")
--- 1546,1581 ----
      ))
  
! ;; Tests --
! ;;  - Add and Find -
! ;; (add-completion "banana" 5 10)  
! ;; (find-exact-completion "banana")  --> ("banana" 5 10 0)
! ;; (add-completion "banana" 6)     
! ;; (find-exact-completion "banana")  --> ("banana" 6 10 0)
! ;; (add-completion "banish")
! ;; (car (find-cmpl-prefix-entry "ban"))  --> (("banish" ...) ("banana" ...))
! ;;
! ;;  - Accepting -
! ;; (setq completion-to-accept "banana")
! ;; (accept-completion)                   
! ;; (find-exact-completion "banana")      --> ("banana" 7 10)
! ;; (car (find-cmpl-prefix-entry "ban"))  --> (("banana" ...) ("banish" ...))
! ;; (setq completion-to-accept "banish")
! ;; (add-completion "banner")           
! ;; (car (find-cmpl-prefix-entry "ban"))
! ;;        --> (("banner" ...) ("banish" 1 ...) ("banana" 7 ...))
! ;;
! ;;  - Deleting -
! ;; (kill-completion "banish")          
! ;; (car (find-cmpl-prefix-entry "ban"))  --> (("banner" ...) ("banana" ...))
! 
! 
! ;;---------------------------------------------------------------------------
! ;; Searching the database
! ;;---------------------------------------------------------------------------
! ;; Functions outside this block must call completion-search-reset followed
! ;; by calls to completion-search-next or completion-search-peek
! ;;
  
! ;; Status variables
  ;; Commented out to improve loading speed
  (defvar cmpl-test-string "")
*************** If there are no more entries, try cdabbr
*** 1708,1755 ****
      ))
  
! ;;; Tests --
! ;;;  - Add and Find -
! ;;; (add-completion "banana")       
! ;;; (completion-search-reset "ban")  
! ;;; (completion-search-next 0)        --> "banana"
! ;;;
! ;;;  - Discrimination -
! ;;; (add-completion "cumberland")       
! ;;; (add-completion "cumberbund")       
! ;;; cumbering   
! ;;; (completion-search-reset "cumb")
! ;;; (completion-search-peek t)        --> "cumberbund"
! ;;; (completion-search-next 0)        --> "cumberbund"
! ;;; (completion-search-peek t)        --> "cumberland"
! ;;; (completion-search-next 1)        --> "cumberland"
! ;;; (completion-search-peek nil)      --> nil
! ;;; (completion-search-next 2)        --> "cumbering"  {cdabbrev}
! ;;; (completion-search-next 3)        -->  nil or "cumming"{depends on context}
! ;;; (completion-search-next 1)        --> "cumberland"
! ;;; (completion-search-peek t)        --> "cumbering"  {cdabbrev}
! ;;;
! ;;;  - Accepting -
! ;;; (completion-search-next 1)        --> "cumberland"
! ;;; (setq completion-to-accept "cumberland")
! ;;; (completion-search-reset "foo")
! ;;; (completion-search-reset "cum")
! ;;; (completion-search-next 0)        --> "cumberland"
! ;;;
! ;;;  - Deleting -
! ;;; (kill-completion "cumberland")
! ;;; cummings    
! ;;; (completion-search-reset "cum")
! ;;; (completion-search-next 0)        --> "cumberbund"
! ;;; (completion-search-next 1)        --> "cummings"
! ;;;
! ;;;  - Ignoring Capitalization -
! ;;; (completion-search-reset "CuMb")
! ;;; (completion-search-next 0)            --> "cumberbund"
  
  
  
! ;;;-----------------------------------------------
! ;;; COMPLETE
! ;;;-----------------------------------------------
  
  (defun completion-mode ()
--- 1702,1749 ----
      ))
  
! ;; Tests --
! ;;  - Add and Find -
! ;; (add-completion "banana")       
! ;; (completion-search-reset "ban")  
! ;; (completion-search-next 0)        --> "banana"
! ;;
! ;;  - Discrimination -
! ;; (add-completion "cumberland")       
! ;; (add-completion "cumberbund")       
! ;; cumbering   
! ;; (completion-search-reset "cumb")
! ;; (completion-search-peek t)        --> "cumberbund"
! ;; (completion-search-next 0)        --> "cumberbund"
! ;; (completion-search-peek t)        --> "cumberland"
! ;; (completion-search-next 1)        --> "cumberland"
! ;; (completion-search-peek nil)      --> nil
! ;; (completion-search-next 2)        --> "cumbering"  {cdabbrev}
! ;; (completion-search-next 3)        -->  nil or "cumming"{depends on context}
! ;; (completion-search-next 1)        --> "cumberland"
! ;; (completion-search-peek t)        --> "cumbering"  {cdabbrev}
! ;;
! ;;  - Accepting -
! ;; (completion-search-next 1)        --> "cumberland"
! ;; (setq completion-to-accept "cumberland")
! ;; (completion-search-reset "foo")
! ;; (completion-search-reset "cum")
! ;; (completion-search-next 0)        --> "cumberland"
! ;;
! ;;  - Deleting -
! ;; (kill-completion "cumberland")
! ;; cummings    
! ;; (completion-search-reset "cum")
! ;; (completion-search-next 0)        --> "cumberbund"
! ;; (completion-search-next 1)        --> "cummings"
! ;;
! ;;  - Ignoring Capitalization -
! ;; (completion-search-reset "CuMb")
! ;; (completion-search-next 0)            --> "cumberbund"
  
  
  
! ;;-----------------------------------------------
! ;; COMPLETE
! ;;-----------------------------------------------
  
  (defun completion-mode ()
*************** Prefix args ::
*** 1875,1881 ****
  	   ))))
  
! ;;;-----------------------------------------------
! ;;; "Complete" Key Keybindings
! ;;;-----------------------------------------------
  
  (global-set-key "\M-\r" 'complete)
--- 1869,1875 ----
  	   ))))
  
! ;;-----------------------------------------------
! ;; "Complete" Key Keybindings
! ;;-----------------------------------------------
  
  (global-set-key "\M-\r" 'complete)
*************** Prefix args ::
*** 1883,1904 ****
  (define-key function-key-map [C-return] [?\C-\r])
  
! ;;; Tests -
! ;;; (add-completion "cumberland")
! ;;; (add-completion "cumberbund")
! ;;; cum
! ;;; Cumber
! ;;; cumbering
! ;;; cumb
! 
! 
! ;;;---------------------------------------------------------------------------
! ;;; Parsing definitions from files into the database
! ;;;---------------------------------------------------------------------------
! 
! ;;;-----------------------------------------------
! ;;; Top Level functions ::
! ;;;-----------------------------------------------
  
! ;;; User interface
  (defun add-completions-from-file (file)
    "Parse possible completions from a file and add them to data base."
--- 1877,1898 ----
  (define-key function-key-map [C-return] [?\C-\r])
  
! ;; Tests -
! ;; (add-completion "cumberland")
! ;; (add-completion "cumberbund")
! ;; cum
! ;; Cumber
! ;; cumbering
! ;; cumb
! 
! 
! ;;---------------------------------------------------------------------------
! ;; Parsing definitions from files into the database
! ;;---------------------------------------------------------------------------
! 
! ;;-----------------------------------------------
! ;; Top Level functions ::
! ;;-----------------------------------------------
  
! ;; User interface
  (defun add-completions-from-file (file)
    "Parse possible completions from a file and add them to data base."
*************** Prefix args ::
*** 1946,1950 ****
      ))
  
! ;;; Find file hook
  (defun cmpl-find-file-hook ()
    (cond (enable-completion
--- 1940,1944 ----
      ))
  
! ;; Find file hook
  (defun cmpl-find-file-hook ()
    (cond (enable-completion
*************** Prefix args ::
*** 1962,1968 ****
  (add-hook 'find-file-hooks 'cmpl-find-file-hook)
  
! ;;;-----------------------------------------------
! ;;; Tags Table Completions
! ;;;-----------------------------------------------
  
  (defun add-completions-from-tags-table ()
--- 1956,1962 ----
  (add-hook 'find-file-hooks 'cmpl-find-file-hook)
  
! ;;-----------------------------------------------
! ;; Tags Table Completions
! ;;-----------------------------------------------
  
  (defun add-completions-from-tags-table ()
*************** Prefix args ::
*** 1986,1998 ****
  
  
! ;;;-----------------------------------------------
! ;;; Lisp File completion parsing
! ;;;-----------------------------------------------
! ;;;   This merely looks for phrases beginning with (def.... or
! ;;; (package:def ... and takes the next word.
! ;;;
! ;;; We tried using forward-lines and explicit searches but the regexp technique
! ;;; was faster.  (About 100K characters per second)
! ;;;
  (defconst *lisp-def-regexp*
    "\n(\\(\\w*:\\)?def\\(\\w\\|\\s_\\)*\\s +(*"
--- 1980,1992 ----
  
  
! ;;-----------------------------------------------
! ;; Lisp File completion parsing
! ;;-----------------------------------------------
! ;;   This merely looks for phrases beginning with (def.... or
! ;; (package:def ... and takes the next word.
! ;;
! ;; We tried using forward-lines and explicit searches but the regexp technique
! ;; was faster.  (About 100K characters per second)
! ;;
  (defconst *lisp-def-regexp*
    "\n(\\(\\w*:\\)?def\\(\\w\\|\\s_\\)*\\s +(*"
*************** Prefix args ::
*** 2000,2011 ****
    )
  
! ;;; Tests -
! ;;;  (and (string-match *lisp-def-regexp* "\n(defun foo") (match-end 0)) -> 8
! ;;;  (and (string-match *lisp-def-regexp* "\n(si:def foo") (match-end 0)) -> 9
! ;;;  (and (string-match *lisp-def-regexp* "\n(def-bar foo")(match-end 0)) -> 10
! ;;;  (and (string-match *lisp-def-regexp* "\n(defun (foo") (match-end 0)) -> 9
  
! ;;; Parses all the definition names from a Lisp mode buffer and adds them to 
! ;;; the completion database.
  (defun add-completions-from-lisp-buffer ()
    ;;; Benchmarks
--- 1994,2005 ----
    )
  
! ;; Tests -
! ;;  (and (string-match *lisp-def-regexp* "\n(defun foo") (match-end 0)) -> 8
! ;;  (and (string-match *lisp-def-regexp* "\n(si:def foo") (match-end 0)) -> 9
! ;;  (and (string-match *lisp-def-regexp* "\n(def-bar foo")(match-end 0)) -> 10
! ;;  (and (string-match *lisp-def-regexp* "\n(defun (foo") (match-end 0)) -> 9
  
! ;; Parses all the definition names from a Lisp mode buffer and adds them to 
! ;; the completion database.
  (defun add-completions-from-lisp-buffer ()
    ;;; Benchmarks
*************** Prefix args ::
*** 2024,2043 ****
  
  
! ;;;-----------------------------------------------
! ;;; C file completion parsing
! ;;;-----------------------------------------------
! ;;; C :
! ;;;  Looks for #define or [<storage class>] [<type>] <name>{,<name>}
! ;;; or structure, array or pointer defs.
! ;;; It gets most of the definition names.
! ;;;
! ;;; As you might suspect by now, we use some symbol table hackery
! ;;;
! ;;; Symbol separator chars (have whitespace syntax) --> , ; * = (
! ;;; Opening char --> [ {
! ;;; Closing char --> ] }
! ;;; opening and closing must be skipped over
! ;;; Whitespace chars (have symbol syntax)
! ;;; Everything else has word syntax
  
  (defun cmpl-make-c-def-completion-syntax-table ()
--- 2018,2037 ----
  
  
! ;;-----------------------------------------------
! ;; C file completion parsing
! ;;-----------------------------------------------
! ;; C :
! ;;  Looks for #define or [<storage class>] [<type>] <name>{,<name>}
! ;; or structure, array or pointer defs.
! ;; It gets most of the definition names.
! ;;
! ;; As you might suspect by now, we use some symbol table hackery
! ;;
! ;; Symbol separator chars (have whitespace syntax) --> , ; * = (
! ;; Opening char --> [ {
! ;; Closing char --> ] }
! ;; opening and closing must be skipped over
! ;; Whitespace chars (have symbol syntax)
! ;; Everything else has word syntax
  
  (defun cmpl-make-c-def-completion-syntax-table ()
*************** Prefix args ::
*** 2065,2069 ****
  (defconst cmpl-c-def-syntax-table (cmpl-make-c-def-completion-syntax-table))
  
! ;;; Regexps
  (defconst *c-def-regexp*
      ;; This stops on lines with possible definitions
--- 2059,2063 ----
  (defconst cmpl-c-def-syntax-table (cmpl-make-c-def-completion-syntax-table))
  
! ;; Regexps
  (defconst *c-def-regexp*
      ;; This stops on lines with possible definitions
*************** Prefix args ::
*** 2090,2108 ****
  ;  )
  
! ;;; Tests -
! ;;;  (test-c-def-regexp *c-def-regexp* "\n#define foo") -> 10 (9)
! ;;;  (test-c-def-regexp *c-def-regexp* "\nfoo (x, y) {") -> 6 (6)
! ;;;  (test-c-def-regexp *c-def-regexp* "\nint foo (x, y)") -> 10 (5)
! ;;;  (test-c-def-regexp *c-def-regexp* "\n int foo (x, y)") -> nil
! ;;;  (test-c-def-regexp *c-cont-regexp* "oo, bar") -> 4
! ;;;  (test-c-def-regexp *c-cont-regexp* "oo, *bar") -> 5
! ;;;  (test-c-def-regexp *c-cont-regexp* "a [5][6], bar") -> 10
! ;;;  (test-c-def-regexp *c-cont-regexp* "oo(x,y)") -> nil
! ;;;  (test-c-def-regexp *c-cont-regexp* "a [6] ,\t bar") -> 9
! ;;;  (test-c-def-regexp *c-cont-regexp* "oo {trout =1} my_carp;") -> 14
! ;;;  (test-c-def-regexp *c-cont-regexp* "truct_p complex foon") -> nil
  
! ;;; Parses all the definition names from a C mode buffer and adds them to the 
! ;;; completion database.
  (defun add-completions-from-c-buffer ()
    ;; Benchmark --
--- 2084,2102 ----
  ;  )
  
! ;; Tests -
! ;;  (test-c-def-regexp *c-def-regexp* "\n#define foo") -> 10 (9)
! ;;  (test-c-def-regexp *c-def-regexp* "\nfoo (x, y) {") -> 6 (6)
! ;;  (test-c-def-regexp *c-def-regexp* "\nint foo (x, y)") -> 10 (5)
! ;;  (test-c-def-regexp *c-def-regexp* "\n int foo (x, y)") -> nil
! ;;  (test-c-def-regexp *c-cont-regexp* "oo, bar") -> 4
! ;;  (test-c-def-regexp *c-cont-regexp* "oo, *bar") -> 5
! ;;  (test-c-def-regexp *c-cont-regexp* "a [5][6], bar") -> 10
! ;;  (test-c-def-regexp *c-cont-regexp* "oo(x,y)") -> nil
! ;;  (test-c-def-regexp *c-cont-regexp* "a [6] ,\t bar") -> 9
! ;;  (test-c-def-regexp *c-cont-regexp* "oo {trout =1} my_carp;") -> 14
! ;;  (test-c-def-regexp *c-cont-regexp* "truct_p complex foon") -> nil
  
! ;; Parses all the definition names from a C mode buffer and adds them to the 
! ;; completion database.
  (defun add-completions-from-c-buffer ()
    ;; Benchmark --
*************** Prefix args ::
*** 2201,2209 ****
  
  
! ;;;---------------------------------------------------------------------------
! ;;; Init files
! ;;;---------------------------------------------------------------------------
  
! ;;; The version of save-completions-to-file called at kill-emacs time.
  (defun kill-emacs-save-completions ()
    (if (and save-completions-flag enable-completion cmpl-initialized-p)
--- 2195,2203 ----
  
  
! ;;---------------------------------------------------------------------------
! ;; Init files
! ;;---------------------------------------------------------------------------
  
! ;; The version of save-completions-to-file called at kill-emacs time.
  (defun kill-emacs-save-completions ()
    (if (and save-completions-flag enable-completion cmpl-initialized-p)
*************** Prefix args ::
*** 2221,2230 ****
  (defconst saved-cmpl-file-header
      ";;; Completion Initialization file.
! ;;; Version = %s
! ;;; Format is (<string> . <last-use-time>)
! ;;;  <string> is the completion
! ;;;  <last-use-time> is the time the completion was last used
! ;;;    If it is t, the completion will never be pruned from the file.
! ;;;    Otherwise it is in hours since origin.
  \n")
  
--- 2215,2224 ----
  (defconst saved-cmpl-file-header
      ";;; Completion Initialization file.
! ;; Version = %s
! ;; Format is (<string> . <last-use-time>)
! ;;  <string> is the completion
! ;;  <last-use-time> is the time the completion was last used
! ;;    If it is t, the completion will never be pruned from the file.
! ;;    Otherwise it is in hours since origin.
  \n")
  
*************** If file name is not specified, use `save
*** 2329,2340 ****
  	  ))))
  
! ;;;(defun autosave-completions ()
! ;;;  (if (and save-completions-flag enable-completion cmpl-initialized-p
! ;;;	      *completion-auto-save-period*
! ;;;	      (> cmpl-emacs-idle-time *completion-auto-save-period*)
! ;;;	      cmpl-completions-accepted-p)
! ;;;    (save-completions-to-file)))
  
! ;;;(add-hook 'cmpl-emacs-idle-time-hooks 'autosave-completions)
  
  (defun load-completions-from-file (&optional filename no-message-p)
--- 2323,2334 ----
  	  ))))
  
! ;;(defun autosave-completions ()
! ;;  (if (and save-completions-flag enable-completion cmpl-initialized-p
! ;;	      *completion-auto-save-period*
! ;;	      (> cmpl-emacs-idle-time *completion-auto-save-period*)
! ;;	      cmpl-completions-accepted-p)
! ;;    (save-completions-to-file)))
  
! ;;(add-hook 'cmpl-emacs-idle-time-hooks 'autosave-completions)
  
  (defun load-completions-from-file (&optional filename no-message-p)
*************** Also sets up so that exiting emacs will 
*** 2455,2461 ****
  
  
! ;;;-----------------------------------------------
! ;;; Kill EMACS patch
! ;;;-----------------------------------------------
  
  (add-hook 'kill-emacs-hook
--- 2449,2455 ----
  
  
! ;;-----------------------------------------------
! ;; Kill EMACS patch
! ;;-----------------------------------------------
  
  (add-hook 'kill-emacs-hook
*************** Also sets up so that exiting emacs will 
*** 2465,2471 ****
  	      (record-cmpl-kill-emacs))))
  
! ;;;-----------------------------------------------
! ;;; Kill region patch
! ;;;-----------------------------------------------
  
  (defun completion-kill-region (&optional beg end)
--- 2459,2465 ----
  	      (record-cmpl-kill-emacs))))
  
! ;;-----------------------------------------------
! ;; Kill region patch
! ;;-----------------------------------------------
  
  (defun completion-kill-region (&optional beg end)
*************** Patched to remove the most recent comple
*** 2495,2510 ****
  (global-set-key "\C-w" 'completion-kill-region)
  
! ;;;-----------------------------------------------
! ;;; Patches to self-insert-command.
! ;;;-----------------------------------------------
! 
! ;;; Need 2 versions: generic separator chars. and space (to get auto fill
! ;;; to work)
! 
! ;;; All common separators (eg. space "(" ")" """) characters go through a
! ;;; function to add new words to the list of words to complete from:
! ;;;  COMPLETION-SEPARATOR-SELF-INSERT-COMMAND (arg).
! ;;; If the character before this was an alpha-numeric then this adds the 
! ;;; symbol before point to the completion list (using ADD-COMPLETION).
  
  (defun completion-separator-self-insert-command (arg)
--- 2489,2504 ----
  (global-set-key "\C-w" 'completion-kill-region)
  
! ;;-----------------------------------------------
! ;; Patches to self-insert-command.
! ;;-----------------------------------------------
! 
! ;; Need 2 versions: generic separator chars. and space (to get auto fill
! ;; to work)
! 
! ;; All common separators (eg. space "(" ")" """) characters go through a
! ;; function to add new words to the list of words to complete from:
! ;;  COMPLETION-SEPARATOR-SELF-INSERT-COMMAND (arg).
! ;; If the character before this was an alpha-numeric then this adds the 
! ;; symbol before point to the completion list (using ADD-COMPLETION).
  
  (defun completion-separator-self-insert-command (arg)
*************** Patched to remove the most recent comple
*** 2522,2531 ****
    )
  
! ;;;-----------------------------------------------
! ;;; Wrapping Macro
! ;;;-----------------------------------------------
  
! ;;; Note that because of the way byte compiling works, none of 
! ;;; the functions defined with this macro get byte compiled.
  
  (defmacro def-completion-wrapper (function-name type &optional new-name)
--- 2516,2525 ----
    )
  
! ;;-----------------------------------------------
! ;; Wrapping Macro
! ;;-----------------------------------------------
  
! ;; Note that because of the way byte compiling works, none of 
! ;; the functions defined with this macro get byte compiled.
  
  (defmacro def-completion-wrapper (function-name type &optional new-name)
*************** TYPE is the type of the wrapper to be ad
*** 2576,2591 ****
  
  
! ;;;---------------------------------------------------------------------------
! ;;; Patches to standard keymaps insert completions
! ;;;---------------------------------------------------------------------------
! 
! ;;;-----------------------------------------------
! ;;; Separators
! ;;;-----------------------------------------------
! ;;; We've used the completion syntax table given  as a guide.
! ;;;
! ;;; Global separator chars.
! ;;;  We left out <tab> because there are too many special cases for it.  Also,
! ;;; in normal coding it's rarely typed after a word.
  (global-set-key " " 'completion-separator-self-insert-autofilling)
  (global-set-key "!" 'completion-separator-self-insert-command)
--- 2570,2585 ----
  
  
! ;;---------------------------------------------------------------------------
! ;; Patches to standard keymaps insert completions
! ;;---------------------------------------------------------------------------
! 
! ;;-----------------------------------------------
! ;; Separators
! ;;-----------------------------------------------
! ;; We've used the completion syntax table given  as a guide.
! ;;
! ;; Global separator chars.
! ;;  We left out <tab> because there are too many special cases for it.  Also,
! ;; in normal coding it's rarely typed after a word.
  (global-set-key " " 'completion-separator-self-insert-autofilling)
  (global-set-key "!" 'completion-separator-self-insert-command)
*************** TYPE is the type of the wrapper to be ad
*** 2609,2620 ****
  (global-set-key "?" 'completion-separator-self-insert-command)
  
! ;;; We include period and colon even though they are symbol chars because :
! ;;;  - in text we want to pick up the last word in a sentence.
! ;;;  - in C pointer refs. we want to pick up the first symbol
! ;;;  - it won't make a difference for lisp mode (package names are short)
  (global-set-key "." 'completion-separator-self-insert-command)
  (global-set-key ":" 'completion-separator-self-insert-command)
  
! ;;; Lisp Mode diffs
  (define-key lisp-mode-map "!" 'self-insert-command)
  (define-key lisp-mode-map "&" 'self-insert-command)
--- 2603,2614 ----
  (global-set-key "?" 'completion-separator-self-insert-command)
  
! ;; We include period and colon even though they are symbol chars because :
! ;;  - in text we want to pick up the last word in a sentence.
! ;;  - in C pointer refs. we want to pick up the first symbol
! ;;  - it won't make a difference for lisp mode (package names are short)
  (global-set-key "." 'completion-separator-self-insert-command)
  (global-set-key ":" 'completion-separator-self-insert-command)
  
! ;; Lisp Mode diffs
  (define-key lisp-mode-map "!" 'self-insert-command)
  (define-key lisp-mode-map "&" 'self-insert-command)
*************** TYPE is the type of the wrapper to be ad
*** 2624,2628 ****
  (define-key lisp-mode-map "^" 'self-insert-command)
  
! ;;; C mode diffs.
  (defun completion-c-mode-hook ()
    (def-completion-wrapper electric-c-semi :separator)
--- 2618,2626 ----
  (define-key lisp-mode-map "^" 'self-insert-command)
  
! ;; Avoid warnings.
! (defvar c-mode-map)
! (defvar fortran-mode-map)
! 
! ;; C mode diffs.
  (defun completion-c-mode-hook ()
    (def-completion-wrapper electric-c-semi :separator)
*************** TYPE is the type of the wrapper to be ad
*** 2635,2639 ****
    (add-hook 'c-mode-hook 'completion-c-mode-hook))
  
! ;;; FORTRAN mode diffs. (these are defined when fortran is called)
  (defun completion-setup-fortran-mode ()
    (define-key fortran-mode-map "+" 'completion-separator-self-insert-command)
--- 2633,2637 ----
    (add-hook 'c-mode-hook 'completion-c-mode-hook))
  
! ;; FORTRAN mode diffs. (these are defined when fortran is called)
  (defun completion-setup-fortran-mode ()
    (define-key fortran-mode-map "+" 'completion-separator-self-insert-command)
*************** TYPE is the type of the wrapper to be ad
*** 2643,2649 ****
    )
  
! ;;;-----------------------------------------------
! ;;; End of line chars.
! ;;;-----------------------------------------------
  (def-completion-wrapper newline :separator)
  (def-completion-wrapper newline-and-indent :separator)
--- 2641,2647 ----
    )
  
! ;;-----------------------------------------------
! ;; End of line chars.
! ;;-----------------------------------------------
  (def-completion-wrapper newline :separator)
  (def-completion-wrapper newline-and-indent :separator)
*************** TYPE is the type of the wrapper to be ad
*** 2654,2660 ****
  ;;(def-completion-wrapper minibuffer-complete-and-exit :minibuffer)
  
! ;;;-----------------------------------------------
! ;;; Cursor movement
! ;;;-----------------------------------------------
  
  (def-completion-wrapper next-line :under-or-before)
--- 2652,2658 ----
  ;;(def-completion-wrapper minibuffer-complete-and-exit :minibuffer)
  
! ;;-----------------------------------------------
! ;; Cursor movement
! ;;-----------------------------------------------
  
  (def-completion-wrapper next-line :under-or-before)
*************** TYPE is the type of the wrapper to be ad
*** 2674,2685 ****
  (def-completion-wrapper delete-backward-char-untabify :backward)
  
! ;;; Tests --
! ;;; foobarbiz
! ;;; foobar 
! ;;; fooquux 
! ;;; fooper
  
  (cmpl-statistics-block
    (record-completion-file-loaded))
  
  ;;; completion.el ends here
--- 2672,2685 ----
  (def-completion-wrapper delete-backward-char-untabify :backward)
  
! ;; Tests --
! ;; foobarbiz
! ;; foobar 
! ;; fooquux 
! ;; fooper
  
  (cmpl-statistics-block
    (record-completion-file-loaded))
+ 
+ (provide 'completion)
  
  ;;; completion.el ends here
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/cookie1.el emacs-19.31/lisp/cookie1.el
*** emacs-19.30/lisp/cookie1.el	Fri Sep 17 14:50:52 1993
--- emacs-19.31/lisp/cookie1.el	Wed Jan 24 19:24:44 1996
***************
*** 21,26 ****
  
  ;; 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:
--- 21,27 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** and subsequent calls on the same file wo
*** 104,108 ****
  	(symbol-value sym)
        (setq sym (intern phrase-file cookie-cache))
!       (message startmsg)
        (save-excursion
  	(let ((buf (generate-new-buffer "*cookie*"))
--- 105,109 ----
  	(symbol-value sym)
        (setq sym (intern phrase-file cookie-cache))
!       (message "%s" startmsg)
        (save-excursion
  	(let ((buf (generate-new-buffer "*cookie*"))
*************** and subsequent calls on the same file wo
*** 118,122 ****
  				 result))))
  	  (kill-buffer buf)
! 	  (message endmsg)
  	  (set sym (apply 'vector result)))))))
  
--- 119,123 ----
  				 result))))
  	  (kill-buffer buf)
! 	  (message "%s" endmsg)
  	  (set sym (apply 'vector result)))))))
  
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/copyright.el emacs-19.31/lisp/copyright.el
*** emacs-19.30/lisp/copyright.el	Wed Jul 12 13:21:23 1995
--- emacs-19.31/lisp/copyright.el	Sun Jan 14 02:34:30 1996
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 35,41 ****
  
  (defvar copyright-regexp
!   "[Cc]opyright\\s *:?\\s *(C)\\s *\\([1-9][-0-9, ']*[0-9]+\\) "
    "*What your copyright notice looks like.
! Must contain \\( \\) construct matching the years.")
  
  
--- 36,42 ----
  
  (defvar copyright-regexp
!   "\\(\251\\|[Cc]opyright\\s *:?\\s *(C)\\)\\s *\\([1-9][-0-9, ']*[0-9]+\\) "
    "*What your copyright notice looks like.
! The second \\( \\) construct must match the years.")
  
  
*************** When this is `function', only ask when c
*** 49,53 ****
  
  
! ;; when modifiying this, also modify the comment generated by autoinsert.el
  (defconst copyright-current-gpl-version "2"
    "String representing the current version of the GPL or `nil'.")
--- 50,54 ----
  
  
! ;; when modifying this, also modify the comment generated by autoinsert.el
  (defconst copyright-current-gpl-version "2"
    "String representing the current version of the GPL or `nil'.")
*************** copyright, if any, are updated as well."
*** 69,73 ****
  	  (goto-char (point-min))
  	  (if (re-search-forward copyright-regexp copyright-limit t)
! 	      (if (string= (buffer-substring (- (match-end 1) 2) (match-end 1))
  			   (substring copyright-current-year -2))
  		  ()
--- 70,74 ----
  	  (goto-char (point-min))
  	  (if (re-search-forward copyright-regexp copyright-limit t)
! 	      (if (string= (buffer-substring (- (match-end 2) 2) (match-end 2))
  			   (substring copyright-current-year -2))
  		  ()
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/cplus-md.el emacs-19.31/lisp/cplus-md.el
*** emacs-19.30/lisp/cplus-md.el	Wed Nov 15 13:58:51 1995
--- emacs-19.31/lisp/cplus-md.el	Thu Mar 21 09:15:51 1996
***************
*** 1,7 ****
  ;;; cplus-md.el --- C++ code editing commands for Emacs
! ;;; Copyright (C) 1985, 1992, 1994, 1995 Free Software Foundation, Inc.
  
  ;; This file is part of GNU Emacs.
- ;; Keywords: c languages oop
  
  ;; GNU Emacs is free software; you can redistribute it and/or modify
--- 1,10 ----
  ;;; cplus-md.el --- C++ code editing commands for Emacs
! 
! ;; Copyright (C) 1985, 1992, 1994, 1995 Free Software Foundation, Inc.
! 
! ;; Maintainer: Dave Detlefs <dld@cs.cmu.edu>
! ;; Keywords: c
  
  ;; This file is part of GNU Emacs.
  
  ;; GNU Emacs is free software; you can redistribute it and/or modify
***************
*** 16,23 ****
  
  ;; 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.
! ;; Maintainer: Dave Detlefs <dld@cs.cmu.edu>
! ;; Keywords: c
  
  ;;; Commentary:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 124,128 ****
  (if c++-mode-syntax-table
      ()
!   (setq c++-mode-syntax-table (copy-syntax-table c-mode-syntax-table))
    (modify-syntax-entry ?* ". 23b" c++-mode-syntax-table)
    (modify-syntax-entry ?/ ". 124" c++-mode-syntax-table)
--- 126,142 ----
  (if c++-mode-syntax-table
      ()
!   (setq c++-mode-syntax-table (make-syntax-table))
!   (modify-syntax-entry ?\\ "\\" c++-mode-syntax-table)
!   (modify-syntax-entry ?/ ". 14" c++-mode-syntax-table)
!   (modify-syntax-entry ?* ". 23" c++-mode-syntax-table)
!   (modify-syntax-entry ?+ "." c++-mode-syntax-table)
!   (modify-syntax-entry ?- "." c++-mode-syntax-table)
!   (modify-syntax-entry ?= "." c++-mode-syntax-table)
!   (modify-syntax-entry ?% "." c++-mode-syntax-table)
!   (modify-syntax-entry ?< "." c++-mode-syntax-table)
!   (modify-syntax-entry ?> "." c++-mode-syntax-table)
!   (modify-syntax-entry ?& "." c++-mode-syntax-table)
!   (modify-syntax-entry ?| "." c++-mode-syntax-table)
!   (modify-syntax-entry ?\' "\"" c++-mode-syntax-table)
    (modify-syntax-entry ?* ". 23b" c++-mode-syntax-table)
    (modify-syntax-entry ?/ ". 124" c++-mode-syntax-table)
*************** Variables controlling indentation style:
*** 277,281 ****
      ``public:'' or ``private:'', or ``protected:''.
   c++-electric-colon
!     If non-nil at invocation of c++-mode (t is the default) colon electricly
      indents.
   c++-empty-arglist-indent
--- 291,295 ----
      ``public:'' or ``private:'', or ``protected:''.
   c++-electric-colon
!     If non-nil at invocation of c++-mode (t is the default) colon electrically
      indents.
   c++-empty-arglist-indent
*************** no args if that value is non-nil."
*** 307,310 ****
--- 321,326 ----
    (interactive)
    (kill-all-local-variables)
+   ;; This code depends on the old C mode.
+   (require 'c-mode)
    (use-local-map c++-mode-map)
    (set-syntax-table c++-mode-syntax-table)
*************** Returns nil if line starts inside a stri
*** 788,792 ****
  		    (save-excursion
  		      (goto-char (car contain-stack))
! 		      (setq val (+ c-indent-level (current-column))))
  		  (setq val (calculate-c++-indent
  			     (if (car indent-stack)
--- 804,808 ----
  		    (save-excursion
  		      (goto-char (car contain-stack))
! 		      (setq val (calculate-c-indent-after-brace)))
  		  (setq val (calculate-c++-indent
  			     (if (car indent-stack)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/cpp.el emacs-19.31/lisp/cpp.el
*** emacs-19.30/lisp/cpp.el	Wed Apr 19 02:36:02 1995
--- emacs-19.31/lisp/cpp.el	Mon Jan 29 17:52:58 1996
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 48,56 ****
  ;;; Customization:
  
  (defvar cpp-known-face 'invisible
    "*Face used for known cpp symbols.")
  
  (defvar cpp-unknown-face 'highlight
!   "*Face used for unknown cpp cymbols.")
  
  (defvar cpp-face-type 'light 
--- 49,60 ----
  ;;; Customization:
  
+ (defvar cpp-config-file (convert-standard-filename ".cpp.el")
+   "*File name to save cpp configuration.")
+ 
  (defvar cpp-known-face 'invisible
    "*Face used for known cpp symbols.")
  
  (defvar cpp-unknown-face 'highlight
!   "*Face used for unknown cpp symbols.")
  
  (defvar cpp-face-type 'light 
*************** Each entry is a list with the following 
*** 131,135 ****
      ("italic" . 'italic)
      ("underline" . 'underline))
!   "Alist of names and faces to be used for monocrome screens.")
  
  (defvar cpp-face-none-list
--- 135,139 ----
      ("italic" . 'italic)
      ("underline" . 'underline))
!   "Alist of names and faces to be used for monochrome screens.")
  
  (defvar cpp-face-none-list
*************** Each entry is a list with the following 
*** 143,147 ****
  	  cpp-face-mono-list
  	  cpp-face-none-list)
!   "All faces used for highligting text inside cpp conditionals.")
  
  ;;; Parse Buffer:
--- 147,151 ----
  	  cpp-face-mono-list
  	  cpp-face-none-list)
!   "All faces used for highlighting text inside cpp conditionals.")
  
  ;;; Parse Buffer:
*************** A prefix arg suppresses display of that 
*** 277,281 ****
  (defun cpp-parse-error (error)
    ;; Error message issued by the cpp parser.
!   (error (concat error " at line %d") (count-lines (point-min) (point))))
  
  (defun cpp-parse-reset ()
--- 281,285 ----
  (defun cpp-parse-error (error)
    ;; Error message issued by the cpp parser.
!   (error "%s at line %d" error (count-lines (point-min) (point))))
  
  (defun cpp-parse-reset ()
*************** You can also use the keyboard accelerato
*** 507,514 ****
    "Load cpp configuration."
    (interactive)
!   (cond ((file-readable-p ".cpp.el")
! 	 (load-file ".cpp.el"))
! 	((file-readable-p "~/.cpp.el")
! 	 (load-file ".cpp.el")))
    (if (eq major-mode 'cpp-edit-mode)
        (cpp-edit-reset)))
--- 511,518 ----
    "Load cpp configuration."
    (interactive)
!   (cond ((file-readable-p cpp-config-file)
! 	 (load-file cpp-config-file))
! 	((file-readable-p (concat "~/" cpp-config-file))
! 	 (load-file cpp-config-file)))
    (if (eq major-mode 'cpp-edit-mode)
        (cpp-edit-reset)))
*************** You can also use the keyboard accelerato
*** 520,524 ****
    (save-excursion
      (set-buffer cpp-edit-buffer)
!     (let ((buffer (find-file-noselect ".cpp.el")))
        (set-buffer buffer)
        (erase-buffer)
--- 524,528 ----
    (save-excursion
      (set-buffer cpp-edit-buffer)
!     (let ((buffer (find-file-noselect cpp-config-file)))
        (set-buffer buffer)
        (erase-buffer)
*************** You can also use the keyboard accelerato
*** 535,539 ****
        (pp (list 'setq 'cpp-edit-list
  		(list 'quote cpp-edit-list)) buffer)
!       (write-file ".cpp.el"))))
  
  (defun cpp-edit-home ()
--- 539,543 ----
        (pp (list 'setq 'cpp-edit-list
  		(list 'quote cpp-edit-list)) buffer)
!       (write-file cpp-config-file))))
  
  (defun cpp-edit-home ()
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/cust-print.el emacs-19.31/lisp/cust-print.el
*** emacs-19.30/lisp/cust-print.el	Wed Mar 15 23:36:03 1995
--- emacs-19.31/lisp/cust-print.el	Sun Jan 14 02:34:30 1996
***************
*** 10,14 ****
  ;; cust-print|Daniel LaLiberte|liberte@cs.uiuc.edu
  ;; |Handle print-level, print-circle and more.
! ;; |$Date: 1995/03/16 04:36:01 $|$Revision: 2.1.1.2 $|
  
  ;; This file is part of GNU Emacs.
--- 10,14 ----
  ;; cust-print|Daniel LaLiberte|liberte@cs.uiuc.edu
  ;; |Handle print-level, print-circle and more.
! ;; |$Date: 1996/01/14 07:34:30 $|$Revision: 2.1.1.4 $|
  
  ;; This file is part of GNU Emacs.
***************
*** 25,88 ****
  
  ;; 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.
! 
! ;;; ===============================
! ;;; $Header: /home/fsf/rms/e19/lisp/RCS/cust-print.el,v 2.1.1.2 1995/03/16 04:36:01 rms Exp $
! ;;; $Log: cust-print.el,v $
! ;;; Revision 2.1.1.2  1995/03/16  04:36:01  rms
! ;;; Comment change.
! ;;;
! ;;; Revision 2.1.1.1  1994/04/09  22:24:43  liberte
! ;;; Branch for FSF mods.
! ;;;
! ;;; Revision 2.1  1994/04/09  22:19:10  liberte
! ;;; Jumping up to new revision.
! ;;; Simplify definition of defalias for Emacs 18.
! ;;;
! ;;; Revision 2.1  1994/04/09  22:19:10  liberte
! ;;; Jumping up to new revision.
! ;;; Simplify definition of defalias for Emacs 18.
! ;;;
! ;;; Revision 1.14  1994/04/05  21:05:09  liberte
! ;;; Change install- and uninstall- to -install and -uninstall.
! ;;;
! ;;; Revision 1.13  1994/03/24  20:26:05  liberte
! ;;; Change "internal" to "original" throughout.
! ;;;         (add-custom-printer, delete-custom-printer) replace customizers.
! ;;;         (with-custom-print) new
! ;;;         (custom-prin1-to-string) Made it more robust.
! ;;;
! ;;; Revision 1.4  1994/03/23  20:34:29  liberte
! ;;; * Change "emacs" to "original" - I just can't decide. 
! ;;;
! ;;; Revision 1.3  1994/02/21  21:25:36  liberte
! ;;; * Make custom-prin1-to-string more robust when errors occur.
! ;;; * Change "internal" to "emacs".
! ;;;
! ;;; Revision 1.2  1993/11/22  22:36:36  liberte
! ;;; * Simplified and generalized printer customization.
! ;;;     custom-printers is an alist of (PREDICATE . PRINTER) pairs
! ;;;     for any data types.  The PRINTER function should print to
! ;;;     `standard-output'  add-custom-printer and delete-custom-printer
! ;;;     change custom-printers.
! ;;;
! ;;; * Installation function now called install-custom-print.  The
! ;;;     old name is still around for now.
! ;;;
! ;;; * New macro with-custom-print (added earlier) - executes like
! ;;;     progn but with custom-print activated temporarily.
! ;;;
! ;;; * Cleaned up comments for replacements of standardard printers.
! ;;;
! ;;; * Changed custom-prin1-to-string to use a temporary buffer.
! ;;;
! ;;; * Option custom-print-vectors (added earlier) - controls whether
! ;;;     vectors should be printed according to print-length and
! ;;;     print-length.  Emacs doesnt do this, but cust-print would
! ;;;     otherwise do it only if custom printing is required.
! ;;;
! ;;; * Uninterned symbols are treated as non-read-equivalent.
! ;;;
  
  
--- 25,95 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
! 
! ;; ===============================
! ;; $Header: /home/gd/gnu/emacs/19.0/lisp/RCS/cust-print.el,v 2.1.1.4 1996/01/14 07:34:30 erik Exp $
! ;; $Log: cust-print.el,v $
! ;; Revision 2.1.1.4  1996/01/14 07:34:30  erik
! ;; Update FSF's address.
! ;;
! ;; Revision 2.1.1.3  1996/01/05 00:08:36  kwzh
! ;; Comment fixes.
! ;;
! ;; Revision 2.1.1.2  1995/03/16 04:36:01  rms
! ;; Comment change.
! ;;
! ;; Revision 2.1.1.1  1994/04/09  22:24:43  liberte
! ;; Branch for FSF mods.
! ;;
! ;; Revision 2.1  1994/04/09  22:19:10  liberte
! ;; Jumping up to new revision.
! ;; Simplify definition of defalias for Emacs 18.
! ;;
! ;; Revision 2.1  1994/04/09  22:19:10  liberte
! ;; Jumping up to new revision.
! ;; Simplify definition of defalias for Emacs 18.
! ;;
! ;; Revision 1.14  1994/04/05  21:05:09  liberte
! ;; Change install- and uninstall- to -install and -uninstall.
! ;;
! ;; Revision 1.13  1994/03/24  20:26:05  liberte
! ;; Change "internal" to "original" throughout.
! ;;         (add-custom-printer, delete-custom-printer) replace customizers.
! ;;         (with-custom-print) new
! ;;         (custom-prin1-to-string) Made it more robust.
! ;;
! ;; Revision 1.4  1994/03/23  20:34:29  liberte
! ;; * Change "emacs" to "original" - I just can't decide. 
! ;;
! ;; Revision 1.3  1994/02/21  21:25:36  liberte
! ;; * Make custom-prin1-to-string more robust when errors occur.
! ;; * Change "internal" to "emacs".
! ;;
! ;; Revision 1.2  1993/11/22  22:36:36  liberte
! ;; * Simplified and generalized printer customization.
! ;;     custom-printers is an alist of (PREDICATE . PRINTER) pairs
! ;;     for any data types.  The PRINTER function should print to
! ;;     `standard-output'  add-custom-printer and delete-custom-printer
! ;;     change custom-printers.
! ;;
! ;; * Installation function now called install-custom-print.  The
! ;;     old name is still around for now.
! ;;
! ;; * New macro with-custom-print (added earlier) - executes like
! ;;     progn but with custom-print activated temporarily.
! ;;
! ;; * Cleaned up comments for replacements of standard printers.
! ;;
! ;; * Changed custom-prin1-to-string to use a temporary buffer.
! ;;
! ;; * Option custom-print-vectors (added earlier) - controls whether
! ;;     vectors should be printed according to print-length and
! ;;     print-length.  Emacs doesn't do this, but cust-print would
! ;;     otherwise do it only if custom printing is required.
! ;;
! ;; * Uninterned symbols are treated as non-read-equivalent.
! ;;
  
  
***************
*** 142,146 ****
  
  ;;; Code:
- ;;=========================================================
  
  ;; If using cl-packages:
--- 149,152 ----
***************
*** 174,178 ****
  (require 'backquote)
  
! ;; Emacs 18 doesnt have defalias.
  ;; Provide def for byte compiler.
  (eval-and-compile
--- 180,184 ----
  (require 'backquote)
  
! ;; Emacs 18 doesn't have defalias.
  ;; Provide def for byte compiler.
  (eval-and-compile
*************** Any pair that has the same PREDICATE is 
*** 267,271 ****
    ;; Modify the definition of cust-print-use-custom-printer
    (defalias 'cust-print-use-custom-printer
!     ;; We dont really want to require the byte-compiler.
      ;; (byte-compile
       (` (lambda (object)
--- 273,277 ----
    ;; Modify the definition of cust-print-use-custom-printer
    (defalias 'cust-print-use-custom-printer
!     ;; We don't really want to require the byte-compiler.
      ;; (byte-compile
       (` (lambda (object)
*************** This is the custom-print replacement for
*** 386,390 ****
    (let ((buf (get-buffer-create " *custom-print-temp*")))
      ;; We must erase the buffer before printing in case an error 
!     ;; occured during the last prin1-to-string and we are in debugger.
      (save-excursion
        (set-buffer buf)
--- 392,396 ----
    (let ((buf (get-buffer-create " *custom-print-temp*")))
      ;; We must erase the buffer before printing in case an error 
!     ;; occurred during the last prin1-to-string and we are in debugger.
      (save-excursion
        (set-buffer buf)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/custom.el emacs-19.31/lisp/custom.el
*** emacs-19.30/lisp/custom.el	Fri Nov  3 22:48:47 1995
--- emacs-19.31/lisp/custom.el	Tue Mar 26 19:00:58 1996
***************
*** 1,11 ****
  ;;; custom.el --- User friendly customization support.
! ;; Copyright (C) 1995 Free Software Foundation, Inc.
! ;;
  ;; Author: Per Abrahamsen <abraham@iesd.auc.dk>
  ;; Keywords: help
  ;; Version: 0.5
  
  ;;; Commentary:
! ;;
  ;; WARNING: This package is still under construction and not all of
  ;; the features below are implemented.
--- 1,29 ----
  ;;; custom.el --- User friendly customization support.
! 
! ;; Copyright (C) 1995, 1996 Free Software Foundation, Inc.
! 
  ;; Author: Per Abrahamsen <abraham@iesd.auc.dk>
  ;; Keywords: help
  ;; Version: 0.5
  
+ ;; 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, Inc., 59 Temple Place - Suite 330,
+ ;; Boston, MA 02111-1307, USA.
+ 
  ;;; Commentary:
! 
  ;; WARNING: This package is still under construction and not all of
  ;; the features below are implemented.
***************
*** 16,20 ****
  ;; extreme, and to most users emacs lisp definitely count as arcane.
  ;;
! ;; The intension is that authors of emacs lisp packages declare the
  ;; variables intended for user customization with `custom-declare'.
  ;; Custom can then automatically generate a customization buffer with
--- 34,38 ----
  ;; extreme, and to most users emacs lisp definitely count as arcane.
  ;;
! ;; The intent is that authors of emacs lisp packages declare the
  ;; variables intended for user customization with `custom-declare'.
  ;; Custom can then automatically generate a customization buffer with
***************
*** 47,51 ****
  ;;   variable, storing the data in a symbol property.
  ;; - Syntactic sugar for CUSTOM declarations.
! ;; - Use W3 for variable documenation.
  
  ;;; Code:
--- 65,69 ----
  ;;   variable, storing the data in a symbol property.
  ;; - Syntactic sugar for CUSTOM declarations.
! ;; - Use W3 for variable documentation.
  
  ;;; Code:
*************** If called interactively, prompts for a f
*** 245,254 ****
  			 (setq intangible 'intangible)
  		       (setq intangible 'intangible-if-it-had-been-working))
!   "The symbol making text intangible")
  
  (defconst rear-nonsticky (if (string-match "XEmacs" emacs-version)
  			     'end-open
  			   'rear-nonsticky)
!   "The symbol making text proeprties non-sticky in the rear end.")
  
  (defconst front-sticky (if (string-match "XEmacs" emacs-version)
--- 263,272 ----
  			 (setq intangible 'intangible)
  		       (setq intangible 'intangible-if-it-had-been-working))
!   "The symbol making text intangible.")
  
  (defconst rear-nonsticky (if (string-match "XEmacs" emacs-version)
  			     'end-open
  			   'rear-nonsticky)
!   "The symbol making text properties non-sticky in the rear end.")
  
  (defconst front-sticky (if (string-match "XEmacs" emacs-version)
*************** If called interactively, prompts for a f
*** 395,406 ****
  ;; CUSTOM datastructure.  Each CUSTOM describes a group of variables,
  ;; a single variable, or a component of a structured variable.  The
! ;; CUSTOM instances are part of two hiearachies, the first is the
  ;; `part-of' hierarchy in which each CUSTOM is a component of another
  ;; CUSTOM, except for the top level CUSTOM which is contained in
! ;; `custom-data'.  The second hiearachy is a `is-a' type hierarchy
  ;; where each CUSTOM is a leaf in the hierarchy defined by the `type'
  ;; property and `custom-type-properties'.
  
! (defvar custom-file "~/.custom.el"
    "Name of file with customization information.")
  
--- 413,424 ----
  ;; CUSTOM datastructure.  Each CUSTOM describes a group of variables,
  ;; a single variable, or a component of a structured variable.  The
! ;; CUSTOM instances are part of two hierarchies, the first is the
  ;; `part-of' hierarchy in which each CUSTOM is a component of another
  ;; CUSTOM, except for the top level CUSTOM which is contained in
! ;; `custom-data'.  The second hierarchy is a `is-a' type hierarchy
  ;; where each CUSTOM is a leaf in the hierarchy defined by the `type'
  ;; property and `custom-type-properties'.
  
! (defvar custom-file (convert-standard-filename "~/.custom.el")
    "Name of file with customization information.")
  
*************** hierarchy the new entry should be added.
*** 497,500 ****
--- 515,529 ----
  		   (tag . "Off")
  		   (default . nil))))
+     (triggle (type . choice)
+ 	     ;; On/Off/Default.
+ 	     (data ((type . const)
+ 		    (tag . "On ")
+ 		    (default . t))
+ 		   ((type . const)
+ 		    (tag . "Off")
+ 		    (default . nil))
+ 		   ((type . const)
+ 		    (tag . "Def")
+ 		    (default . custom:asis))))
      (choice (type . default)
  	    ;; See `custom-match'.
*************** Select the properties you want this face
*** 604,618 ****
  		       "\n"
  		       ((tag . "Bold")
! 			(default . nil)
! 			(type . toggle))
  		       "              "
  		       ((tag . "Italic")
! 			(default . nil)
! 			(type . toggle))
  		       "             "
  		       ((tag . "Underline")
  			(hidden . t)
! 			(default . nil)
! 			(type . toggle)))
  		 (default . (custom-face-lookup "default" "default" "default"
  						nil nil nil))
--- 633,647 ----
  		       "\n"
  		       ((tag . "Bold")
! 			(default . custom:asis)
! 			(type . triggle))
  		       "              "
  		       ((tag . "Italic")
! 			(default . custom:asis)
! 			(type . triggle))
  		       "             "
  		       ((tag . "Underline")
  			(hidden . t)
! 			(default . custom:asis)
! 			(type . triggle)))
  		 (default . (custom-face-lookup "default" "default" "default"
  						nil nil nil))
*************** Entries in this list take precedence ove
*** 705,708 ****
--- 734,740 ----
    "Special value representing an invalid field.")
  
+ (defconst custom:asis 'custom:asis)
+ ;; Bad, ugly, and horrible kludge.
+ 
  (defun custom-property (custom property)
    "Extract from CUSTOM property PROPERTY."
*************** Entries in this list take precedence ove
*** 730,734 ****
  
  (defun custom-property-set (custom property value)
!   "Set CUSTOM PROPERY to VALUE by side effect.
  CUSTOM must have at least one property already."
    (let ((entry (assq property custom)))
--- 762,766 ----
  
  (defun custom-property-set (custom property value)
!   "Set CUSTOM PROPERTY to VALUE by side effect.
  CUSTOM must have at least one property already."
    (let ((entry (assq property custom)))
*************** position of the error, and the cdr is a 
*** 879,883 ****
  ;; specific editing field in the customization buffer.
  ;;
! ;; Each FIELD can be seen as an instanciation of a CUSTOM.
  
  (defvar custom-field-last nil)
--- 911,915 ----
  ;; specific editing field in the customization buffer.
  ;;
! ;; Each FIELD can be seen as an instantiation of a CUSTOM.
  
  (defvar custom-field-last nil)
*************** START and END are markers to the start a
*** 938,942 ****
  (defun custom-field-accept (field value &optional original)
    "Store a new value into field FIELD, taking it from VALUE.
! If optional ORIGINAL is non-nil, concider VALUE for the original value."
    (let ((inhibit-point-motion-hooks t))
      (funcall (custom-property (custom-field-custom field) 'accept) 
--- 970,974 ----
  (defun custom-field-accept (field value &optional original)
    "Store a new value into field FIELD, taking it from VALUE.
! If optional ORIGINAL is non-nil, consider VALUE for the original value."
    (let ((inhibit-point-motion-hooks t))
      (funcall (custom-property (custom-field-custom field) 'accept) 
*************** If optional ORIGINAL is non-nil, concide
*** 1101,1105 ****
  
  (defun custom-repeat-extract (custom field)
!   "Extract list of childrens values."
    (let ((values (custom-field-value field))
  	(data (custom-data custom))
--- 1133,1137 ----
  
  (defun custom-repeat-extract (custom field)
!   "Extract list of children's values."
    (let ((values (custom-field-value field))
  	(data (custom-data custom))
*************** If optional ORIGINAL is non-nil, concide
*** 1148,1152 ****
  
  (defun custom-pair-extract (custom field)
!   "Extract cons of childrens values."
    (let ((values (custom-field-value field))
  	(data (custom-data custom))
--- 1180,1184 ----
  
  (defun custom-pair-extract (custom field)
!   "Extract cons of children's values."
    (let ((values (custom-field-value field))
  	(data (custom-data custom))
*************** If optional ORIGINAL is non-nil, concide
*** 1169,1173 ****
  
  (defun custom-list-extract (custom field)
!   "Extract list of childrens values."
    (let ((values (custom-field-value field))
  	(data (custom-data custom))
--- 1201,1205 ----
  
  (defun custom-list-extract (custom field)
!   "Extract list of children's values."
    (let ((values (custom-field-value field))
  	(data (custom-data custom))
*************** If optional ORIGINAL is non-nil, concide
*** 1374,1383 ****
  
  (defun custom-choice-extract (custom field)
!   "Extract childs value."
    (let ((value (custom-field-value field)))
      (custom-field-extract (custom-field-custom value) value)))
  
  (defun custom-choice-validate (custom field)
!   "Validate childs value."
    (let ((value (custom-field-value field))
  	(custom (custom-field-custom field)))
--- 1406,1415 ----
  
  (defun custom-choice-extract (custom field)
!   "Extract child's value."
    (let ((value (custom-field-value field)))
      (custom-field-extract (custom-field-custom value) value)))
  
  (defun custom-choice-validate (custom field)
!   "Validate child's value."
    (let ((value (custom-field-value field))
  	(custom (custom-field-custom field)))
*************** FG BG STIPPLE BOLD ITALIC UNDERLINE"
*** 1487,1492 ****
    "Face that should be used for highlighting FIELD containing VALUE."
    (let* ((custom (custom-field-custom field))
! 	 (face (eval (funcall (custom-property custom 'export) 
! 			      custom value))))
      (if (custom-facep face) face nil)))
  
--- 1519,1524 ----
    "Face that should be used for highlighting FIELD containing VALUE."
    (let* ((custom (custom-field-custom field))
! 	 (form (funcall (custom-property custom 'export) custom value))
! 	 (face (apply (car form) (cdr form))))
      (if (custom-facep face) face nil)))
  
*************** FG BG STIPPLE BOLD ITALIC UNDERLINE"
*** 1667,1671 ****
  	   (cons start "Uninitialized field"))
  	  ((and (consp value) (eq (car value) custom-invalid))
! 	   (cons start "Unparseable field content"))
  	  ((custom-valid custom value)
  	   nil)
--- 1699,1703 ----
  	   (cons start "Uninitialized field"))
  	  ((and (consp value) (eq (car value) custom-invalid))
! 	   (cons start "Unparsable field content"))
  	  ((custom-valid custom value)
  	   nil)
*************** If the optional argument SAVE is non-nil
*** 1831,1835 ****
  
  (defvar custom-mode-map nil
!   "Keymap for Custum Mode.")
  (if custom-mode-map
      nil
--- 1863,1867 ----
  
  (defvar custom-mode-map nil
!   "Keymap for Custom Mode.")
  (if custom-mode-map
      nil
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/dabbrev.el emacs-19.31/lisp/dabbrev.el
*** emacs-19.30/lisp/dabbrev.el	Sat Nov 11 00:24:10 1995
--- emacs-19.31/lisp/dabbrev.el	Wed Jan 24 14:01:08 1996
***************
*** 1,3 ****
--- 1,4 ----
  ;;; dabbrev.el --- dynamic abbreviation package
+ 
  ;; Copyright (C) 1985, 1986, 1992, 1994 Free Software Foundation, Inc.
  
***************
*** 8,24 ****
  ;; Keywords: abbrev expand completion
  
! ;; This program 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 of the License, or
! ;; (at your option) any later version.
! ;;
! ;; This program 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 this program; if not, write to the Free Software
! ;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  
  ;;; Commentary:
--- 9,28 ----
  ;; Keywords: abbrev expand completion
  
! ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 42,46 ****
  ;; Set the variables you want special for your mode like this:
  ;; (set (make-local-variable 'dabbrev-case-replace) nil)
! ;; Then you don't interfer with other modes.
  ;;
  ;; If your mode handles buffers that refers to other buffers
--- 46,50 ----
  ;; Set the variables you want special for your mode like this:
  ;; (set (make-local-variable 'dabbrev-case-replace) nil)
! ;; Then you don't interfere with other modes.
  ;;
  ;; If your mode handles buffers that refers to other buffers
***************
*** 91,99 ****
  ;;; Code:
  
! ;;;----------------------------------------------------------------
! ;;;----------------------------------------------------------------
! ;;; Customization variables
! ;;;----------------------------------------------------------------
! ;;;----------------------------------------------------------------
  (defvar dabbrev-backward-only nil
    "*If non-nil, `dabbrev-expand' only looks backwards.")
--- 95,101 ----
  ;;; Code:
  
! ;;----------------------------------------------------------------
! ;; Customization variables
! ;;----------------------------------------------------------------
  (defvar dabbrev-backward-only nil
    "*If non-nil, `dabbrev-expand' only looks backwards.")
***************
*** 107,111 ****
  Example: Set this to \"\\\\$\" for programming languages
  in which variable names may appear with or without a leading `$'.
! (For example, in Makefiles.)
  
  Set this to nil if no characters should be skipped.")
--- 109,113 ----
  Example: Set this to \"\\\\$\" for programming languages
  in which variable names may appear with or without a leading `$'.
! \(For example, in Makefiles.)
  
  Set this to nil if no characters should be skipped.")
*************** It will not even look in the current buf
*** 214,222 ****
  this list.")
  
! ;;;----------------------------------------------------------------
! ;;;----------------------------------------------------------------
! ;;; Internal variables
! ;;;----------------------------------------------------------------
! ;;;----------------------------------------------------------------
  
  ;; Last obarray of completions in `dabbrev-completion'
--- 216,222 ----
  this list.")
  
! ;;----------------------------------------------------------------
! ;; Internal variables
! ;;----------------------------------------------------------------
  
  ;; Last obarray of completions in `dabbrev-completion'
*************** this list.")
*** 259,267 ****
  (defvar dabbrev--abbrev-char-regexp nil)
  
! ;;;----------------------------------------------------------------
! ;;;----------------------------------------------------------------
! ;;; Macros
! ;;;----------------------------------------------------------------
! ;;;----------------------------------------------------------------
  
  ;;; Get the buffer that mini-buffer was activated from
--- 259,265 ----
  (defvar dabbrev--abbrev-char-regexp nil)
  
! ;;----------------------------------------------------------------
! ;; Macros
! ;;----------------------------------------------------------------
  
  ;;; Get the buffer that mini-buffer was activated from
*************** this list.")
*** 283,291 ****
         (nreverse dabbrev-result))))
  
! ;;;----------------------------------------------------------------
! ;;;----------------------------------------------------------------
! ;;; Exported functions
! ;;;----------------------------------------------------------------
! ;;;----------------------------------------------------------------
  
  ;;;###autoload
--- 281,287 ----
         (nreverse dabbrev-result))))
  
! ;;----------------------------------------------------------------
! ;; Exported functions
! ;;----------------------------------------------------------------
  
  ;;;###autoload
*************** See also `dabbrev-abbrev-char-regexp' an
*** 520,528 ****
        (setq dabbrev--last-abbrev-location (point-marker))))))
  
! ;;;----------------------------------------------------------------
! ;;;----------------------------------------------------------------
! ;;; Local functions
! ;;;----------------------------------------------------------------
! ;;;----------------------------------------------------------------
  
  ;;; Checks if OTHER-BUFFER has the same major mode as current buffer.
--- 516,522 ----
        (setq dabbrev--last-abbrev-location (point-marker))))))
  
! ;;----------------------------------------------------------------
! ;; Local functions
! ;;----------------------------------------------------------------
  
  ;;; Checks if OTHER-BUFFER has the same major mode as current buffer.
*************** See also `dabbrev-abbrev-char-regexp' an
*** 772,776 ****
  ;;; ABBREV is string to find as prefix of word.  Second arg, REVERSE,
  ;;; is t for reverse search, nil for forward.  Variable dabbrev-limit
! ;;; controls the maximum search region size.  Third argment IGNORE-CASE
  ;;; non-nil means treat case as insignificant while looking for a match
  ;;; and when comparing with previous matches.  Also if that's non-nil
--- 766,770 ----
  ;;; ABBREV is string to find as prefix of word.  Second arg, REVERSE,
  ;;; is t for reverse search, nil for forward.  Variable dabbrev-limit
! ;;; controls the maximum search region size.  Third argument IGNORE-CASE
  ;;; non-nil means treat case as insignificant while looking for a match
  ;;; and when comparing with previous matches.  Also if that's non-nil
*************** See also `dabbrev-abbrev-char-regexp' an
*** 840,844 ****
  (provide 'dabbrev)
  
! ;; dabbrev.el ends here
! 
! 
--- 834,836 ----
  (provide 'dabbrev)
  
! ;;; dabbrev.el ends here
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/debug.el emacs-19.31/lisp/debug.el
*** emacs-19.30/lisp/debug.el	Mon Mar 20 00:08:38 1995
--- emacs-19.31/lisp/debug.el	Sun Jan 14 02:34:30 1996
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** first will be printed into the backtrace
*** 144,148 ****
  		    ;; Debugger entered for an error.
  		    ((eq (car debugger-args) 'error)
! 		     (insert "Signalling: ")
  		     (prin1 (nth 1 debugger-args) (current-buffer))
  		     (insert ?\n))
--- 145,149 ----
  		    ;; Debugger entered for an error.
  		    ((eq (car debugger-args) 'error)
! 		     (insert "Signaling: ")
  		     (prin1 (nth 1 debugger-args) (current-buffer))
  		     (insert ?\n))
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/decipher.el emacs-19.31/lisp/decipher.el
*** emacs-19.30/lisp/decipher.el	Wed Dec 31 19:00:00 1969
--- emacs-19.31/lisp/decipher.el	Fri Feb 23 18:50:19 1996
***************
*** 0 ****
--- 1,1050 ----
+ ;;; decipher.el --- Cryptanalyze monoalphabetic substitution ciphers
+ ;;
+ ;; Copyright (C) 1995, 1996 Free Software Foundation, Inc.
+ ;;
+ ;; Author: Christopher J. Madsen <ac608@yfn.ysu.edu>
+ ;; Keywords: games
+ ;;
+ ;; 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.
+ 
+ ;;; Quick Start:
+ ;;
+ ;; To decipher a message, type or load it into a buffer and type
+ ;; `M-x decipher'.  This will format the buffer and place it into
+ ;; Decipher mode.  You can save your work to a file with the normal
+ ;; Emacs save commands; when you reload the file it will automatically
+ ;; enter Decipher mode.
+ ;;
+ ;; I'm not going to discuss how to go about breaking a cipher; try
+ ;; your local library for a book on cryptanalysis.  One book you might
+ ;; find is:
+ ;;   Cryptanalysis:  A study of ciphers and their solution
+ ;;   Helen Fouche Gaines
+ ;;   ISBN 0-486-20097-3
+ 
+ ;;; Commentary:
+ ;;
+ ;; This package is designed to help you crack simple substitution
+ ;; ciphers where one letter stands for another.  It works for ciphers
+ ;; with or without word divisions.  (You must set the variable
+ ;; decipher-ignore-spaces for ciphers without word divisions.)
+ ;;
+ ;; First, some quick definitions:
+ ;;   ciphertext   The encrypted message (what you start with)
+ ;;   plaintext    The decrypted message (what you are trying to get)
+ ;;
+ ;; Decipher mode displays ciphertext in uppercase and plaintext in
+ ;; lowercase.  You must enter the plaintext in lowercase; uppercase
+ ;; letters are interpreted as commands.  The ciphertext may be entered
+ ;; in mixed case; `M-x decipher' will convert it to uppercase.
+ ;;
+ ;; Decipher mode depends on special characters in the first column of
+ ;; each line.  The command `M-x decipher' inserts these characters for
+ ;; you.  The characters and their meanings are:
+ ;;   (   The plaintext & ciphertext alphabets on the first line
+ ;;   )   The ciphertext & plaintext alphabets on the second line
+ ;;   :   A line of ciphertext (with plaintext below)
+ ;;   >   A line of plaintext  (with ciphertext above)
+ ;;   %   A comment
+ ;; Each line in the buffer MUST begin with one of these characters (or
+ ;; be left blank).  In addition, comments beginning with `%!' are reserved
+ ;; for checkpoints; see decipher-make-checkpoint & decipher-restore-checkpoint
+ ;; for more information.
+ ;;
+ ;; While the cipher message may contain digits or punctuation, Decipher
+ ;; mode will ignore these characters.
+ ;;
+ ;; The buffer is made read-only so it can't be modified by normal
+ ;; Emacs commands.
+ ;;
+ ;; Decipher supports Font Lock mode.  To use it, you can also add
+ ;;     (add-hook 'decipher-mode-hook 'turn-on-font-lock)
+ ;; See the variable `decipher-font-lock-keywords' if you want to customize
+ ;; the faces used.  I'd like to thank Simon Marshall for his help in making
+ ;; Decipher work well with Font Lock.
+ 
+ ;;; Things To Do:
+ ;;
+ ;; Email me if you have any suggestions or would like to help.
+ ;; But be aware that I work on Decipher only sporadically.
+ ;;
+ ;; 1. The consonant-line shortcut
+ ;; 2. More functions for analyzing ciphertext
+ 
+ ;;;===================================================================
+ ;;; Variables:
+ ;;;===================================================================
+ 
+ (eval-when-compile
+   (require 'cl))
+ 
+ (defvar decipher-force-uppercase t
+   "*Non-nil means to convert ciphertext to uppercase.
+ Nil means the case of the ciphertext is preserved.
+ This variable must be set before typing `\\[decipher]'.")
+ 
+ (defvar decipher-ignore-spaces nil
+   "*Non-nil means to ignore spaces and punctuation when counting digrams.
+ You should set this to `nil' if the cipher message is divided into words,
+ or `t' if it is not.
+ This variable is buffer-local.")
+ (make-variable-buffer-local 'decipher-ignore-spaces)
+ 
+ (defvar decipher-undo-limit 5000
+   "The maximum number of entries in the undo list.
+ When the undo list exceeds this number, 100 entries are deleted from
+ the tail of the list.")
+ 
+ ;; End of user modifiable variables
+ ;;--------------------------------------------------------------------
+ 
+ (defvar decipher-font-lock-keywords
+   '(("^:.*"  . font-lock-keyword-face)
+     ("^>.*"  . font-lock-string-face)
+     ("^%!.*" . font-lock-reference-face)
+     ("^%.*"  . font-lock-comment-face)
+     ("\\`(\\([a-z]+\\) +\\([A-Z]+\\)"
+      (1 font-lock-string-face)
+      (2 font-lock-keyword-face))
+     ("^)\\([A-Z ]+\\)\\([a-z ]+\\)"
+      (1 font-lock-keyword-face)
+      (2 font-lock-string-face)))
+   "Expressions to fontify in Decipher mode.
+ Ciphertext uses `font-lock-keyword-face', plaintext uses
+ `font-lock-string-face', comments use `font-lock-comment-face', and
+ checkpoints use `font-lock-reference-face'.  You can customize the
+ display by changing these variables.  For best results, I recommend
+ that all faces use the same background color.
+ For example, to display ciphertext in the `bold' face, use
+   (add-hook 'decipher-mode-hook
+             (lambda () (set (make-local-variable 'font-lock-keyword-face)
+                             'bold)))
+ in your `.emacs' file.")
+ 
+ (defvar decipher-mode-map nil
+   "Keymap for Decipher mode.")
+ (if (not decipher-mode-map)
+     (progn
+       (setq decipher-mode-map (make-keymap))
+       (suppress-keymap decipher-mode-map)
+       (define-key decipher-mode-map "A" 'decipher-show-alphabet)
+       (define-key decipher-mode-map "C" 'decipher-complete-alphabet)
+       (define-key decipher-mode-map "D" 'decipher-digram-list)
+       (define-key decipher-mode-map "F" 'decipher-frequency-count)
+       (define-key decipher-mode-map "M" 'decipher-make-checkpoint)
+       (define-key decipher-mode-map "N" 'decipher-adjacency-list)
+       (define-key decipher-mode-map "R" 'decipher-restore-checkpoint)
+       (define-key decipher-mode-map "U" 'decipher-undo)
+       (define-key decipher-mode-map " " 'decipher-keypress)
+       (substitute-key-definition 'undo  'decipher-undo
+                                  decipher-mode-map global-map)
+       (substitute-key-definition 'advertised-undo  'decipher-undo
+                                  decipher-mode-map global-map)
+       (let ((key ?a))
+         (while (<= key ?z)
+           (define-key decipher-mode-map (vector key) 'decipher-keypress)
+           (incf key)))))
+ 
+ (defvar decipher-stats-mode-map nil
+   "Keymap for Decipher-Stats mode.")
+ (if (not decipher-stats-mode-map)
+     (progn
+       (setq decipher-stats-mode-map (make-keymap))
+       (suppress-keymap decipher-stats-mode-map)
+       (define-key decipher-stats-mode-map "D" 'decipher-digram-list)
+       (define-key decipher-stats-mode-map "F" 'decipher-frequency-count)
+       (define-key decipher-stats-mode-map "N" 'decipher-adjacency-list)
+       ))
+ 
+ (defvar decipher-mode-syntax-table nil
+   "Decipher mode syntax table")
+ 
+ (if decipher-mode-syntax-table
+     ()
+   (let ((table (make-syntax-table))
+         (c ?0))
+     (while (<= c ?9)
+       (modify-syntax-entry c "_" table) ;Digits are not part of words
+       (incf c))
+     (setq decipher-mode-syntax-table table)))
+ 
+ (defvar decipher-alphabet nil)
+ ;; This is an alist containing entries (PLAIN-CHAR . CIPHER-CHAR),
+ ;; where PLAIN-CHAR runs from ?a to ?z and CIPHER-CHAR is an uppercase
+ ;; letter or space (which means no mapping is known for that letter).
+ ;; This *must* contain entries for all lowercase characters.
+ (make-variable-buffer-local 'decipher-alphabet)
+ 
+ (defvar decipher-stats-buffer nil
+   "The buffer which displays statistics for this ciphertext.
+ Do not access this variable directly, use the function
+ `decipher-stats-buffer' instead.")
+ (make-variable-buffer-local 'decipher-stats-buffer)
+ 
+ (defvar decipher-undo-list-size 0
+   "The number of entries in the undo list.")
+ (make-variable-buffer-local 'decipher-undo-list-size)
+ 
+ (defvar decipher-undo-list nil
+   "The undo list for this buffer.
+ Each element is either a cons cell (PLAIN-CHAR . CIPHER-CHAR) or a
+ list of such cons cells.")
+ (make-variable-buffer-local 'decipher-undo-list)
+ 
+ (defvar decipher-pending-undo-list nil)
+ 
+ ;; The following variables are used by the analysis functions
+ ;; and are defined here to avoid byte-compiler warnings.
+ ;; Don't mess with them unless you know what you're doing.
+ (defvar decipher-char nil
+   "See the functions decipher-loop-with-breaks and decipher-loop-no-breaks.")
+ (defvar decipher--prev-char)
+ (defvar decipher--digram)
+ (defvar decipher--digram-list)
+ (defvar decipher--before)
+ (defvar decipher--after)
+ (defvar decipher--freqs)
+ 
+ ;;;===================================================================
+ ;;; Code:
+ ;;;===================================================================
+ ;; Main entry points:
+ ;;--------------------------------------------------------------------
+ 
+ ;;;###autoload
+ (defun decipher ()
+   "Format a buffer of ciphertext for cryptanalysis and enter Decipher mode."
+   (interactive)
+   ;; Make sure the buffer ends in a newline:
+   (goto-char (point-max))
+   (or (bolp)
+       (insert "\n"))
+   ;; See if it's already in decipher format:
+   (goto-char (point-min))
+   (if (looking-at "^(abcdefghijklmnopqrstuvwxyz   \
+ ABCDEFGHIJKLMNOPQRSTUVWXYZ   -\\*-decipher-\\*-\n)")
+       (message "Buffer is already formatted, entering Decipher mode...")
+     ;; Add the alphabet at the beginning of the file
+     (insert "(abcdefghijklmnopqrstuvwxyz   \
+ ABCDEFGHIJKLMNOPQRSTUVWXYZ   -*-decipher-*-\n)\n\n")
+     ;; Add lines for the solution:
+     (let (begin)
+       (while (not (eobp))
+         (if (looking-at "^%")
+             (forward-line)              ;Leave comments alone
+           (delete-horizontal-space)
+           (if (eolp)
+               (forward-line)            ;Just leave blank lines alone
+             (insert ":")                ;Mark ciphertext line
+             (setq begin (point))
+             (forward-line)
+             (if decipher-force-uppercase
+                 (upcase-region begin (point))) ;Convert ciphertext to uppercase
+             (insert ">\n")))))          ;Mark plaintext line
+     (delete-blank-lines)                ;Remove any blank lines
+     (delete-blank-lines))               ; at end of buffer
+   (goto-line 4)
+   (decipher-mode))
+ 
+ ;;;###autoload
+ (defun decipher-mode ()
+   "Major mode for decrypting monoalphabetic substitution ciphers.
+ Lower-case letters enter plaintext.
+ Upper-case letters are commands.
+ 
+ The buffer is made read-only so that normal Emacs commands cannot
+ modify it.
+ 
+ The most useful commands are:
+ \\<decipher-mode-map>
+ \\[decipher-digram-list]  Display a list of all digrams & their frequency
+ \\[decipher-frequency-count]  Display the frequency of each ciphertext letter
+ \\[decipher-adjacency-list]\
+   Show adjacency list for current letter (lists letters appearing next to it)
+ \\[decipher-make-checkpoint]  Save the current cipher alphabet (checkpoint)
+ \\[decipher-restore-checkpoint]  Restore a saved cipher alphabet (checkpoint)"
+   (interactive)
+   (kill-all-local-variables)
+   (setq buffer-undo-list  t             ;Disable undo
+         indent-tabs-mode  nil           ;Do not use tab characters
+         major-mode       'decipher-mode
+         mode-name        "Decipher")
+   (if decipher-force-uppercase
+       (setq case-fold-search nil))      ;Case is significant when searching
+   (use-local-map decipher-mode-map)
+   (set-syntax-table decipher-mode-syntax-table)
+   (decipher-read-alphabet)
+   (set (make-local-variable 'font-lock-defaults)
+        '(decipher-font-lock-keywords t))
+   ;; Make the buffer writable when we exit Decipher mode:
+   (make-local-hook 'change-major-mode-hook)
+   (add-hook 'change-major-mode-hook
+             (lambda () (setq buffer-read-only nil
+                              buffer-undo-list nil))
+             nil t)
+   (run-hooks 'decipher-mode-hook)
+   (setq buffer-read-only t))
+ (put 'decipher-mode 'mode-class 'special)
+ 
+ ;;--------------------------------------------------------------------
+ ;; Normal key handling:
+ ;;--------------------------------------------------------------------
+ 
+ (defmacro decipher-last-command-char ()
+   ;; Return the char which ran this command (for compatibility with XEmacs)
+   (if (fboundp 'event-to-character)
+       '(event-to-character last-command-event)
+     'last-command-event))
+ 
+ (defun decipher-keypress ()
+   "Enter a plaintext or ciphertext character."
+   (interactive)
+   (let ((decipher-function 'decipher-set-map)
+         buffer-read-only)               ;Make buffer writable
+     (save-excursion
+       (or (save-excursion
+             (beginning-of-line)
+             (let ((first-char (following-char)))
+               (cond
+                ((= ?: first-char)
+                 t)
+                ((= ?> first-char)
+                 nil)
+                ((= ?\( first-char)
+                 (setq decipher-function 'decipher-alphabet-keypress)
+                 t)
+                ((= ?\) first-char)
+                 (setq decipher-function 'decipher-alphabet-keypress)
+                 nil)
+                (t
+                 (error "Bad location")))))
+           (let (goal-column)
+             (previous-line 1)))
+       (let ((char-a (following-char))
+             (char-b (decipher-last-command-char)))
+         (or (and (not (= ?w (char-syntax char-a)))
+                  (= char-b ?\ )) ;Spacebar just advances on non-letters
+             (funcall decipher-function char-a char-b)))))
+   (forward-char))
+ 
+ (defun decipher-alphabet-keypress (a b)
+   ;; Handle keypresses in the alphabet lines.
+   ;; A is the character in the alphabet row (which starts with '(')
+   ;; B is the character pressed
+   (cond ((and (>= a ?A) (<= a ?Z))
+          ;; If A is uppercase, then it is in the ciphertext alphabet:
+          (decipher-set-map a b))
+         ((and (>= a ?a) (<= a ?z))
+          ;; If A is lowercase, then it is in the plaintext alphabet:
+          (if (= b ?\ )
+              ;; We are clearing the association (if any):
+              (if (/= ?\  (setq b (cdr (assoc a decipher-alphabet))))
+                  (decipher-set-map b ?\ ))
+            ;; Associate the plaintext char with the char pressed:
+            (decipher-set-map b a)))
+         (t
+          ;; If A is not a letter, that's a problem:
+          (error "Bad character"))))
+ 
+ ;;--------------------------------------------------------------------
+ ;; Undo:
+ ;;--------------------------------------------------------------------
+ 
+ (defun decipher-undo ()
+   "Undo a change in Decipher mode."
+   (interactive)
+   ;; If we don't get all the way thru, make last-command indicate that
+   ;; for the following command.
+   (setq this-command t)
+   (or (eq major-mode 'decipher-mode)
+       (error "This buffer is not in Decipher mode"))
+   (or (eq last-command 'decipher-undo)
+       (setq decipher-pending-undo-list decipher-undo-list))
+   (or decipher-pending-undo-list
+       (error "No further undo information"))
+   (let ((undo-rec (pop decipher-pending-undo-list))
+         buffer-read-only                ;Make buffer writable
+         redo-map redo-rec undo-map)
+     (or (consp (car undo-rec))
+         (setq undo-rec (list undo-rec)))
+     (while (setq undo-map (pop undo-rec))
+       (setq redo-map (decipher-get-undo (cdr undo-map) (car undo-map)))
+       (if redo-map
+           (setq redo-rec
+                 (if (consp (car redo-map))
+                     (append redo-map redo-rec)
+                   (cons redo-map redo-rec))))
+       (decipher-set-map (cdr undo-map) (car undo-map) t))
+     (decipher-add-undo redo-rec))
+   (setq this-command 'decipher-undo)
+   (message "Undo!"))
+ 
+ (defun decipher-add-undo (undo-rec)
+   "Add UNDO-REC to the undo list."
+   (if undo-rec
+       (progn
+         (push undo-rec decipher-undo-list)
+         (incf decipher-undo-list-size)
+         (if (> decipher-undo-list-size decipher-undo-limit)
+             (let ((new-size (- decipher-undo-limit 100)))
+               ;; Truncate undo list to NEW-SIZE elements:
+               (setcdr (nthcdr (1- new-size) decipher-undo-list) nil)
+               (setq decipher-undo-list-size new-size))))))
+ 
+ (defun decipher-get-undo (cipher-char plain-char)
+   ;; Return an undo record that will undo the result of
+   ;;   (decipher-set-map CIPHER-CHAR PLAIN-CHAR)
+   ;; We must use copy-list because the original cons cells will be
+   ;; modified using setcdr.
+   (let ((cipher-map (copy-list (rassoc cipher-char decipher-alphabet)))
+         (plain-map  (copy-list (assoc  plain-char  decipher-alphabet))))
+     (cond ((equal ?\  plain-char)
+            cipher-map)
+           ((equal cipher-char (cdr plain-map))
+            nil)                         ;We aren't changing anything
+           ((equal ?\  (cdr plain-map))
+            (or cipher-map (cons ?\  cipher-char)))
+           (cipher-map
+            (list plain-map cipher-map))
+           (t
+            plain-map))))
+ 
+ ;;--------------------------------------------------------------------
+ ;; Mapping ciphertext and plaintext:
+ ;;--------------------------------------------------------------------
+ 
+ (defun decipher-set-map (cipher-char plain-char &optional no-undo)
+   ;; Associate a ciphertext letter with a plaintext letter
+   ;; CIPHER-CHAR must be an uppercase or lowercase letter
+   ;; PLAIN-CHAR must be a lowercase letter (or a space)
+   ;; NO-UNDO if non-nil means do not record undo information
+   ;; Any existing associations for CIPHER-CHAR or PLAIN-CHAR will be erased.
+   (setq cipher-char (upcase cipher-char))
+   (or (and (>= cipher-char ?A) (<= cipher-char ?Z))
+       (error "Bad character"))          ;Cipher char must be uppercase letter
+   (or no-undo
+       (decipher-add-undo (decipher-get-undo cipher-char plain-char)))
+   (let ((cipher-string (char-to-string cipher-char))
+         (plain-string  (char-to-string plain-char))
+         case-fold-search                ;Case is significant
+         mapping bound)
+     (save-excursion
+       (goto-char (point-min))
+       (if (setq mapping (rassoc cipher-char decipher-alphabet))
+           (progn
+             (setcdr mapping ?\ )
+             (search-forward-regexp (concat "^([a-z]*"
+                                            (char-to-string (car mapping))))
+             (decipher-insert ?\ )
+             (beginning-of-line)))
+       (if (setq mapping (assoc plain-char decipher-alphabet))
+           (progn
+             (if (/= ?\  (cdr mapping))
+                 (decipher-set-map (cdr mapping) ?\  t))
+             (setcdr mapping cipher-char)
+             (search-forward-regexp (concat "^([a-z]*" plain-string))
+             (decipher-insert cipher-char)
+             (beginning-of-line)))
+       (search-forward-regexp (concat "^([a-z]+   [A-Z]*" cipher-string))
+       (decipher-insert plain-char)
+       (setq case-fold-search t          ;Case is not significant
+             cipher-string    (downcase cipher-string))
+       (let ((font-lock-fontify-region-function 'ignore))
+         ;; insert-and-inherit will pick the right face automatically
+         (while (search-forward-regexp "^:" nil t)
+           (setq bound (save-excursion (end-of-line) (point)))
+           (while (search-forward cipher-string bound 'end)
+             (decipher-insert plain-char)))))))
+ 
+ (defun decipher-insert (char)
+   ;; Insert CHAR in the row below point.  It replaces any existing
+   ;; character in that position.
+   (let ((col (1- (current-column))))
+     (save-excursion
+       (forward-line)
+       (or (= ?\> (following-char))
+           (= ?\) (following-char))
+           (error "Bad location"))
+       (move-to-column col t)
+       (or (eolp)
+           (delete-char 1))
+       (insert-and-inherit char))))
+ 
+ ;;--------------------------------------------------------------------
+ ;; Checkpoints:
+ ;;--------------------------------------------------------------------
+ ;; A checkpoint is a comment of the form:
+ ;;   %!ABCDEFGHIJKLMNOPQRSTUVWXYZ! Description
+ ;; Such comments are usually placed at the end of the buffer following
+ ;; this header (which is inserted by decipher-make-checkpoint):
+ ;;   %---------------------------
+ ;;   % Checkpoints:
+ ;;   % abcdefghijklmnopqrstuvwxyz
+ ;; but this is not required; checkpoints can be placed anywhere.
+ ;;
+ ;; The description is optional; all that is required is the alphabet.
+ 
+ (defun decipher-make-checkpoint (desc)
+   "Checkpoint the current cipher alphabet.
+ This records the current alphabet so you can return to it later.
+ You may have any number of checkpoints.
+ Type `\\[decipher-restore-checkpoint]' to restore a checkpoint."
+   (interactive "sCheckpoint description: ")
+   (or (stringp desc)
+       (setq desc ""))
+   (let (alphabet
+         buffer-read-only                ;Make buffer writable
+         mapping)
+     (goto-char (point-min))
+     (re-search-forward "^)")
+     (move-to-column 27 t)
+     (setq alphabet (buffer-substring-no-properties (- (point) 26) (point)))
+     (if (re-search-forward "^%![A-Z ]+!" nil 'end)
+        nil ; Add new checkpoint with others
+       (if (re-search-backward "^% *Local Variables:" nil t)
+           ;; Add checkpoints before local variables list:
+           (progn (forward-line -1)
+                  (or (looking-at "^ *$")
+                      (progn (forward-line) (insert ?\n) (forward-line -1)))))
+       (insert "\n%" (make-string 69 ?\-)
+               "\n% Checkpoints:\n% abcdefghijklmnopqrstuvwxyz\n"))
+     (beginning-of-line)
+     (insert "%!" alphabet "! " desc ?\n)))
+ 
+ (defun decipher-restore-checkpoint ()
+   "Restore the cipher alphabet from a checkpoint.
+ If point is not on a checkpoint line, moves to the first checkpoint line.
+ If point is on a checkpoint, restores that checkpoint.
+ 
+ Type `\\[decipher-make-checkpoint]' to make a checkpoint."
+   (interactive)
+   (beginning-of-line)
+   (if (looking-at "%!\\([A-Z ]+\\)!")
+       ;; Restore this checkpoint:
+       (let ((alphabet (match-string 1))
+             buffer-read-only)           ;Make buffer writable
+         (goto-char (point-min))
+         (re-search-forward "^)")
+         (or (eolp)
+             (delete-region (point) (progn (end-of-line) (point))))
+         (insert alphabet)
+         (decipher-resync))
+     ;; Move to the first checkpoint:
+     (goto-char (point-min))
+     (if (re-search-forward "^%![A-Z ]+!" nil t)
+         (message "Select the checkpoint to restore and type `%s'"
+                  (substitute-command-keys "\\[decipher-restore-checkpoint]"))
+       (error "No checkpoints in this buffer"))))
+ 
+ ;;--------------------------------------------------------------------
+ ;; Miscellaneous commands:
+ ;;--------------------------------------------------------------------
+ 
+ (defun decipher-complete-alphabet ()
+   "Complete the cipher alphabet.
+ This fills any blanks in the cipher alphabet with the unused letters
+ in alphabetical order.  Use this when you have a keyword cipher and
+ you have determined the keyword."
+   (interactive)
+   (let ((cipher-char ?A)
+         (ptr decipher-alphabet)
+         buffer-read-only                ;Make buffer writable
+         plain-map undo-rec)
+     (while (setq plain-map (pop ptr))
+       (if (equal ?\  (cdr plain-map))
+           (progn
+             (while (rassoc cipher-char decipher-alphabet)
+               ;; Find the next unused letter
+               (incf cipher-char))
+             (push (cons ?\  cipher-char) undo-rec)
+             (decipher-set-map cipher-char (car plain-map) t))))
+     (decipher-add-undo undo-rec)))
+ 
+ (defun decipher-show-alphabet ()
+   "Display the current cipher alphabet in the message line."
+   (interactive)
+   (message
+    (mapconcat (lambda (a)
+                 (concat
+                  (char-to-string (car a))
+                  (char-to-string (cdr a))))
+               decipher-alphabet
+               "")))
+ 
+ (defun decipher-resync ()
+   "Reprocess the buffer using the alphabet from the top.
+ This regenerates all deciphered plaintext and clears the undo list.
+ You should use this if you edit the ciphertext."
+   (interactive)
+   (message "Reprocessing buffer...")
+   (let (alphabet
+         buffer-read-only                ;Make buffer writable
+         mapping)
+     (save-excursion
+       (decipher-read-alphabet)
+       (setq alphabet decipher-alphabet)
+       (goto-char (point-min))
+       (and (re-search-forward "^).+" nil t)
+            (replace-match ")" nil nil))
+       (while (re-search-forward "^>.+" nil t)
+         (replace-match ">" nil nil))
+       (decipher-read-alphabet)
+       (while (setq mapping (pop alphabet))
+         (or (equal ?\  (cdr mapping))
+             (decipher-set-map (cdr mapping) (car mapping))))))
+   (setq decipher-undo-list       nil
+         decipher-undo-list-size  0)
+   (message "Reprocessing buffer...done"))
+ 
+ ;;--------------------------------------------------------------------
+ ;; Miscellaneous functions:
+ ;;--------------------------------------------------------------------
+ 
+ (defun decipher-read-alphabet ()
+   "Build the decipher-alphabet from the alphabet line in the buffer."
+   (save-excursion
+     (goto-char (point-min))
+     (search-forward-regexp "^)")
+     (move-to-column 27 t)
+     (setq decipher-alphabet nil)
+     (let ((plain-char ?z))
+       (while (>= plain-char ?a)
+         (backward-char)
+         (push (cons plain-char (following-char)) decipher-alphabet)
+         (decf plain-char)))))
+ 
+ ;;;===================================================================
+ ;;; Analyzing ciphertext:
+ ;;;===================================================================
+ 
+ (defun decipher-frequency-count ()
+   "Display the frequency count in the statistics buffer."
+   (interactive)
+   (decipher-analyze)
+   (decipher-display-regexp "^A" "^[A-Z][A-Z]"))
+ 
+ (defun decipher-digram-list ()
+   "Display the list of digrams in the statistics buffer."
+   (interactive)
+   (decipher-analyze)
+   (decipher-display-regexp "[A-Z][A-Z] +[0-9]" "^$"))
+ 
+ (defun decipher-adjacency-list (cipher-char)
+   "Display the adjacency list for the letter at point.
+ The adjacency list shows all letters which come next to CIPHER-CHAR.
+ 
+ An adjacency list (for the letter X) looks like this:
+        1 1         1     1   1       3 2 1             3   8
+ X: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z *  11   14   9%
+      1 1                 1       2   1   1     2       5   7
+ This says that X comes before D once, and after B once.  X begins 5
+ words, and ends 3 words (`*' represents a space).  X comes before 8
+ different letters, after 7 differerent letters, and is next to a total
+ of 11 different letters.  It occurs 14 times, making up 9% of the
+ ciphertext."
+   (interactive (list (upcase (following-char))))
+   (decipher-analyze)
+   (let (start end)
+     (save-excursion
+       (set-buffer (decipher-stats-buffer))
+       (goto-char (point-min))
+       (or (re-search-forward (format "^%c: " cipher-char) nil t)
+           (error "Character `%c' is not used in ciphertext." cipher-char))
+       (forward-line -1)
+       (setq start (point))
+       (forward-line 3)
+       (setq end (point)))
+     (decipher-display-range start end)))
+ 
+ ;;--------------------------------------------------------------------
+ (defun decipher-analyze ()
+   "Perform frequency analysis on the current buffer if necessary."
+   (cond
+    ;; If this is the statistics buffer, do nothing:
+    ((eq major-mode 'decipher-stats-mode))
+    ;; If this is the Decipher buffer, see if the stats buffer exists:
+    ((eq major-mode 'decipher-mode)
+     (or (and (bufferp decipher-stats-buffer)
+              (buffer-name decipher-stats-buffer))
+         (decipher-analyze-buffer)))
+    ;; Otherwise:
+    (t (error "This buffer is not in Decipher mode"))))
+ 
+ ;;--------------------------------------------------------------------
+ (defun decipher-display-range (start end)
+   "Display text between START and END in the statistics buffer.
+ START and END are positions in the statistics buffer.  Makes the
+ statistics buffer visible and sizes the window to just fit the
+ displayed text, but leaves the current window selected."
+   (let ((stats-buffer (decipher-stats-buffer))
+         (current-window (selected-window))
+         (pop-up-windows t))
+     (or (eq (current-buffer) stats-buffer)
+         (pop-to-buffer stats-buffer))
+     (goto-char start)
+     (or (one-window-p t)
+         (enlarge-window (- (1+ (count-lines start end)) (window-height))))
+     (recenter 0)
+     (select-window current-window)))
+ 
+ (defun decipher-display-regexp (start-regexp end-regexp)
+   "Display text between two regexps in the statistics buffer.
+ 
+ START-REGEXP matches the first line to display.
+ END-REGEXP matches the line after that which ends the display.
+ The ending line is included in the display unless it is blank."
+   (let (start end)
+     (save-excursion
+       (set-buffer (decipher-stats-buffer))
+       (goto-char (point-min))
+       (re-search-forward start-regexp)
+       (beginning-of-line)
+       (setq start (point))
+       (re-search-forward end-regexp)
+       (beginning-of-line)
+       (or (looking-at "^ *$")
+           (forward-line 1))
+       (setq end (point)))
+     (decipher-display-range start end)))
+ 
+ ;;--------------------------------------------------------------------
+ (defun decipher-loop-with-breaks (func)
+   "Loop through ciphertext, calling FUNC once for each letter & word division.
+ 
+ FUNC is called with no arguments, and its return value is unimportant.
+ It may examine `decipher-char' to see the current ciphertext
+ character.  `decipher-char' contains either an uppercase letter or a space.
+ 
+ FUNC is called exactly once between words, with `decipher-char' set to
+ a space.
+ 
+ See `decipher-loop-no-breaks' if you do not care about word divisions."
+   (let ((decipher-char ?\ )
+         (decipher--loop-prev-char ?\ ))
+     (save-excursion
+       (goto-char (point-min))
+       (funcall func)              ;Space marks beginning of first word
+       (while (search-forward-regexp "^:" nil t)
+         (while (not (eolp))
+           (setq decipher-char (upcase (following-char)))
+           (or (and (>= decipher-char ?A) (<= decipher-char ?Z))
+               (setq decipher-char ?\ ))
+           (or (and (equal decipher-char ?\ )
+                    (equal decipher--loop-prev-char ?\ ))
+               (funcall func))
+           (setq decipher--loop-prev-char decipher-char)
+           (forward-char))
+         (or (equal decipher-char ?\ )
+             (progn
+               (setq decipher-char ?\ ;
+                     decipher--loop-prev-char ?\ )
+               (funcall func)))))))
+ 
+ (defun decipher-loop-no-breaks (func)
+   "Loop through ciphertext, calling FUNC once for each letter.
+ 
+ FUNC is called with no arguments, and its return value is unimportant.
+ It may examine `decipher-char' to see the current ciphertext letter.
+ `decipher-char' contains an uppercase letter.
+ 
+ Punctuation and spacing in the ciphertext are ignored.
+ See `decipher-loop-with-breaks' if you care about word divisions."
+   (let (decipher-char)
+     (save-excursion
+       (goto-char (point-min))
+       (while (search-forward-regexp "^:" nil t)
+         (while (not (eolp))
+           (setq decipher-char (upcase (following-char)))
+           (and (>= decipher-char ?A)
+                (<= decipher-char ?Z)
+                (funcall func))
+           (forward-char))))))
+ 
+ ;;--------------------------------------------------------------------
+ ;; Perform the analysis:
+ ;;--------------------------------------------------------------------
+ 
+ (defun decipher-insert-frequency-counts (freq-list total)
+   "Insert frequency counts in current buffer.
+ Each element of FREQ-LIST is a list (LETTER FREQ ...).
+ TOTAL is the total number of letters in the ciphertext."
+   (let ((i 4) temp-list)
+     (while (> i 0)
+       (setq temp-list freq-list)
+       (while temp-list
+         (insert (caar temp-list)
+                 (format "%4d%3d%%  "
+                         (cadar temp-list)
+                         (/ (* 100 (cadar temp-list)) total)))
+         (setq temp-list (nthcdr 4 temp-list)))
+       (insert ?\n)
+       (setq freq-list (cdr freq-list)
+             i         (1- i)))))
+ 
+ (defun decipher--analyze ()
+   ;; Perform frequency analysis on ciphertext.
+   ;;
+   ;; This function is called repeatedly with decipher-char set to each
+   ;; character of ciphertext.  It uses decipher--prev-char to remember
+   ;; the previous ciphertext character.
+   ;;
+   ;; It builds several data structures, which must be initialized
+   ;; before the first call to decipher--analyze.  The arrays are
+   ;; indexed with A = 0, B = 1, ..., Z = 25, SPC = 26 (if used).
+   ;;   decipher--after: (initialize to zeros)
+   ;;     A vector of 26 vectors of 27 integers.  The first vector
+   ;;     represents the number of times A follows each character, the
+   ;;     second vector represents B, and so on.
+   ;;   decipher--before: (initialize to zeros)
+   ;;     The same as decipher--after, but representing the number of
+   ;;     times the character precedes each other character.
+   ;;   decipher--digram-list: (initialize to nil)
+   ;;     An alist with an entry for each digram (2-character sequence)
+   ;;     encountered.  Each element is a cons cell (DIGRAM . FREQ),
+   ;;     where DIGRAM is a 2 character string and FREQ is the number
+   ;;     of times it occurs.
+   ;;   decipher--freqs: (initialize to zeros)
+   ;;     A vector of 26 integers, counting the number of occurrences
+   ;;     of the corresponding characters.
+   (setq decipher--digram (format "%c%c" decipher--prev-char decipher-char))
+   (incf (cdr (or (assoc decipher--digram decipher--digram-list)
+                  (car (push (cons decipher--digram 0)
+                             decipher--digram-list)))))
+   (and (>= decipher--prev-char ?A)
+        (incf (aref (aref decipher--before (- decipher--prev-char ?A))
+                    (if (equal decipher-char ?\ )
+                        26
+                      (- decipher-char ?A)))))
+   (and (>= decipher-char ?A)
+        (incf (aref decipher--freqs (- decipher-char ?A)))
+        (incf (aref (aref decipher--after (- decipher-char ?A))
+                    (if (equal decipher--prev-char ?\ )
+                        26
+                      (- decipher--prev-char ?A)))))
+   (setq decipher--prev-char decipher-char))
+ 
+ (defun decipher--digram-counts (counts)
+   "Generate the counts for an adjacency list."
+   (let ((total 0))
+     (concat
+      (mapconcat (lambda (x)
+                   (cond ((> x 99) (incf total) "XX")
+                         ((> x 0)  (incf total) (format "%2d" x))
+                         (t        "  ")))
+                 counts
+                 "")
+      (format "%4d" (if (> (aref counts 26) 0)
+                        (1- total)    ;Don't count space
+                      total)))))
+ 
+ (defun decipher--digram-total (before-count after-count)
+   "Count the number of different letters a letter appears next to."
+   ;; We do not include spaces (word divisions) in this count.
+   (let ((total 0)
+         (i 26))
+     (while (>= (decf i) 0)
+       (if (or (> (aref before-count i) 0)
+               (> (aref after-count  i) 0))
+           (incf total)))
+     total))
+ 
+ (defun decipher-analyze-buffer ()
+   "Perform frequency analysis and store results in statistics buffer.
+ Creates the statistics buffer if it doesn't exist."
+   (let ((decipher--prev-char (if decipher-ignore-spaces ?\  ?\*))
+         (decipher--before (make-vector 26 nil))
+         (decipher--after  (make-vector 26 nil))
+         (decipher--freqs   (make-vector 26 0))
+         (total-chars  0)
+         decipher--digram decipher--digram-list freq-list)
+     (message "Scanning buffer...")
+     (let ((i 26))
+       (while (>= (decf i) 0)
+         (aset decipher--before i (make-vector 27 0))
+         (aset decipher--after  i (make-vector 27 0))))
+     (if decipher-ignore-spaces
+         (progn
+           (decipher-loop-no-breaks 'decipher--analyze)
+           ;; The first character of ciphertext was marked as following a space:
+           (let ((i 26))
+             (while (>= (decf i) 0)
+               (aset (aref decipher--after  i) 26 0))))
+       (decipher-loop-with-breaks 'decipher--analyze))
+     (message "Processing results...")
+     (setcdr (last decipher--digram-list 2) nil)   ;Delete the phony "* " digram
+     ;; Sort the digram list by frequency and alphabetical order:
+     (setq decipher--digram-list (sort (sort decipher--digram-list
+                                   (lambda (a b) (string< (car a) (car b))))
+                             (lambda (a b) (> (cdr a) (cdr b)))))
+     ;; Generate the frequency list:
+     ;;   Each element is a list of 3 elements (LETTER FREQ DIFFERENT),
+     ;;   where LETTER is the ciphertext character, FREQ is the number
+     ;;   of times it occurs, and DIFFERENT is the number of different
+     ;;   letters it appears next to.
+     (let ((i 26))
+       (while (>= (decf i) 0)
+         (setq freq-list
+               (cons (list (+ i ?A)
+                           (aref decipher--freqs i)
+                           (decipher--digram-total (aref decipher--before i)
+                                                   (aref decipher--after  i)))
+                     freq-list)
+               total-chars (+ total-chars (aref decipher--freqs i)))))
+     (save-excursion
+       ;; Switch to statistics buffer, creating it if necessary:
+       (set-buffer (decipher-stats-buffer t))
+       ;; This can't happen, but it never hurts to double-check:
+       (or (eq major-mode 'decipher-stats-mode)
+           (error "Buffer %s is not in Decipher-Stats mode" (buffer-name)))
+       (setq buffer-read-only nil)
+       (erase-buffer)
+       ;; Display frequency counts for letters A-Z:
+       (decipher-insert-frequency-counts freq-list total-chars)
+       (insert ?\n)
+       ;; Display frequency counts for letters in order of frequency:
+       (setq freq-list (sort freq-list
+                             (lambda (a b) (> (second a) (second b)))))
+       (decipher-insert-frequency-counts freq-list total-chars)
+       ;; Display letters in order of frequency:
+       (insert ?\n (mapconcat (lambda (a) (char-to-string (car a)))
+                              freq-list nil)
+               "\n\n")
+       ;; Display list of digrams in order of frequency:
+       (let* ((rows (floor (+ (length decipher--digram-list) 9) 10))
+              (i rows)
+              temp-list)
+         (while (> i 0)
+           (setq temp-list decipher--digram-list)
+           (while temp-list
+             (insert (caar temp-list)
+                     (format "%3d   "
+                             (cdar temp-list)))
+             (setq temp-list (nthcdr rows temp-list)))
+           (delete-horizontal-space)
+           (insert ?\n)
+           (setq decipher--digram-list (cdr decipher--digram-list)
+                 i           (1- i))))
+       ;; Display adjacency list for each letter, sorted in descending
+       ;; order of the number of adjacent letters:
+       (setq freq-list (sort freq-list
+                             (lambda (a b) (> (third a) (third b)))))
+       (let ((temp-list freq-list)
+             entry i)
+         (while (setq entry (pop temp-list))
+           (if (equal 0 (second entry))
+               nil                       ;This letter was not used
+             (setq i (- (car entry) ?A))
+             (insert ?\n "  "
+                     (decipher--digram-counts (aref decipher--before i)) ?\n
+                     (car entry)
+                     ": A B C D E F G H I J K L M N O P Q R S T U V W X Y Z *"
+                     (format "%4d %4d %3d%%\n  "
+                             (third entry) (second entry)
+                             (/ (* 100 (second entry)) total-chars))
+                     (decipher--digram-counts (aref decipher--after  i)) ?\n))))
+       (setq buffer-read-only t)
+       (set-buffer-modified-p nil)
+       ))
+   (message nil))
+ 
+ ;;====================================================================
+ ;; Statistics Buffer:
+ ;;====================================================================
+ 
+ (defun decipher-stats-mode ()
+   "Major mode for displaying ciphertext statistics."
+   (interactive)
+   (kill-all-local-variables)
+   (setq buffer-read-only  t
+         buffer-undo-list  t             ;Disable undo
+         case-fold-search  nil           ;Case is significant when searching
+         indent-tabs-mode  nil           ;Do not use tab characters
+         major-mode       'decipher-stats-mode
+         mode-name        "Decipher-Stats")
+   (use-local-map decipher-stats-mode-map)
+   (run-hooks 'decipher-stats-mode-hook))
+ (put 'decipher-stats-mode 'mode-class 'special)
+ 
+ ;;--------------------------------------------------------------------
+ 
+ (defun decipher-display-stats-buffer ()
+   "Make the statistics buffer visible, but do not select it."
+   (let ((stats-buffer (decipher-stats-buffer))
+         (current-window (selected-window)))
+     (or (eq (current-buffer) stats-buffer)
+         (progn
+           (pop-to-buffer stats-buffer)
+           (select-window current-window)))))
+ 
+ (defun decipher-stats-buffer (&optional create)
+   "Return the buffer used for decipher statistics.
+ If CREATE is non-nil, create the buffer if it doesn't exist.
+ This is guaranteed to return a buffer in Decipher-Stats mode;
+ if it can't, it signals an error."
+   (cond
+    ;; We may already be in the statistics buffer:
+    ((eq major-mode 'decipher-stats-mode)
+     (current-buffer))
+    ;; See if decipher-stats-buffer exists:
+    ((and (bufferp decipher-stats-buffer)
+          (buffer-name decipher-stats-buffer))
+     (or (save-excursion
+           (set-buffer decipher-stats-buffer)
+           (eq major-mode 'decipher-stats-mode))
+         (error "Buffer %s is not in Decipher-Stats mode"
+                (buffer-name decipher-stats-buffer)))
+     decipher-stats-buffer)
+    ;; Create a new buffer if requested:
+    (create
+     (let ((stats-name (concat "*" (buffer-name) "*")))
+       (setq decipher-stats-buffer
+             (if (eq 'decipher-stats-mode
+                     (cdr-safe (assoc 'major-mode
+                                      (buffer-local-variables
+                                       (get-buffer stats-name)))))
+                 ;; We just lost track of the statistics buffer:
+                 (get-buffer stats-name)
+               (generate-new-buffer stats-name))))
+     (save-excursion
+       (set-buffer decipher-stats-buffer)
+       (decipher-stats-mode))
+     decipher-stats-buffer)
+    ;; Give up:
+    (t (error "No statistics buffer"))))
+ 
+ ;;====================================================================
+ 
+ (provide 'decipher)
+ 
+ ;;;(defun decipher-show-undo-list ()
+ ;;;  "Display the undo list (for debugging purposes)."
+ ;;;  (interactive)
+ ;;;  (with-output-to-temp-buffer "*Decipher Undo*"
+ ;;;    (let ((undo-list decipher-undo-list)
+ ;;;          undo-rec undo-map)
+ ;;;      (save-excursion
+ ;;;        (set-buffer "*Decipher Undo*")
+ ;;;        (while (setq undo-rec (pop undo-list))
+ ;;;          (or (consp (car undo-rec))
+ ;;;              (setq undo-rec (list undo-rec)))
+ ;;;          (insert ?\()
+ ;;;          (while (setq undo-map (pop undo-rec))
+ ;;;            (insert (cdr undo-map) (car undo-map) ?\ ))
+ ;;;          (delete-backward-char 1)
+ ;;;          (insert ")\n"))))))
+ 
+ ;;; decipher.el ends here
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/delsel.el emacs-19.31/lisp/delsel.el
*** emacs-19.30/lisp/delsel.el	Tue Sep 12 16:57:20 1995
--- emacs-19.31/lisp/delsel.el	Sun Jan 14 02:34:30 1996
***************
*** 1,5 ****
  ;;; delsel.el --- delete selection if you insert
  
! ;;; Copyright (C) 1992 Free Software Foundation, Inc.
  
  ;; Author: Matthieu Devin <devin@lucid.com>
--- 1,5 ----
  ;;; delsel.el --- delete selection if you insert
  
! ;; Copyright (C) 1992 Free Software Foundation, Inc.
  
  ;; Author: Matthieu Devin <devin@lucid.com>
***************
*** 7,31 ****
  ;; Last change  18-Feb-93, devin.
  
! ;;; 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:
  
! ;;; This file makes the active region be pending delete, meaning that
! ;;; text inserted while the region is active will replace the region contents.
! ;;; This is a popular behavior of personal computers text editors.
  
  ;;; Code:
--- 7,32 ----
  ;; Last change  18-Feb-93, devin.
  
! ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
! ;; This file makes the active region be pending delete, meaning that
! ;; text inserted while the region is active will replace the region contents.
! ;; This is a popular behavior of personal computers text editors.
  
  ;;; Code:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/derived.el emacs-19.31/lisp/derived.el
*** emacs-19.30/lisp/derived.el	Sun Oct 22 01:19:27 1995
--- emacs-19.31/lisp/derived.el	Mon May 20 17:01:31 1996
***************
*** 1,3 ****
! ;;; derived.el -- allow inheritance of major modes.
  ;;; (formerly mode-clone.el)
  
--- 1,3 ----
! ;;; derived.el --- allow inheritance of major modes.
  ;;; (formerly mode-clone.el)
  
***************
*** 20,25 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** be automatic inheritance."
*** 331,339 ****
    "Merge an old syntax table into a new one.
  Where the new table already has an entry, nothing is copied from the old one."
!   (map-char-table
!    (function (lambda (key value)
! 	       (or (char-table-range new key)
! 		   (set-char-table-range new key value))))
!    old))
  
  ;; Merge an old abbrev table into a new one.
--- 332,336 ----
    "Merge an old syntax table into a new one.
  Where the new table already has an entry, nothing is copied from the old one."
!   (set-char-table-parent new old))
  
  ;; Merge an old abbrev table into a new one.
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/desktop.el emacs-19.31/lisp/desktop.el
*** emacs-19.30/lisp/desktop.el	Wed Oct  4 22:32:27 1995
--- emacs-19.31/lisp/desktop.el	Tue Mar  5 11:40:37 1996
***************
*** 20,25 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 85,88 ****
--- 86,90 ----
  ;;            kifer@sbkifer.cs.sunysb.edu (M. Kifer) for a bug hunt.
  ;;            treese@lcs.mit.edu (Win Treese)        for ange-ftp tips.
+ ;;            pot@cnuce.cnr.it (Francesco Potorti`)  for misc. tips.
  ;; ---------------------------------------------------------------------------
  ;; TODO:
*************** The variables are saved only when they r
*** 145,149 ****
  
  ;; We skip .log files because they are normally temporary.
! ;;         (ftp) files because they require passwords and whatsnot.
  ;;         TAGS files to save time (tags-file-name is saved instead).
  (defvar desktop-buffers-not-to-save
--- 147,151 ----
  
  ;; We skip .log files because they are normally temporary.
! ;;         (ftp) files because they require passwords and whatnot.
  ;;         TAGS files to save time (tags-file-name is saved instead).
  (defvar desktop-buffers-not-to-save
*************** The variables are saved only when they r
*** 156,159 ****
--- 158,174 ----
    "Regexp identifying files whose buffers are to be excluded from saving.")
  
+ (defvar desktop-buffer-major-mode nil
+   "When desktop creates a buffer, this holds the desired Major mode.")
+ 
+ (defvar desktop-buffer-file-name nil
+   "When desktop creates a buffer, this holds the file name to visit.")
+ 
+ (defvar desktop-buffer-name nil
+   "When desktop creates a buffer, this holds the desired buffer name.")
+ 
+ (defvar desktop-buffer-misc nil
+   "When desktop creates a buffer, this holds a list of misc info.
+ It is used by the `desktop-buffer-handlers' functions.")
+ 
  (defvar desktop-buffer-handlers
    '(desktop-buffer-dired
*************** The variables are saved only when they r
*** 163,171 ****
      desktop-buffer-file)
    "*List of functions to call in order to create a buffer.
! The functions are called without explicit parameters but may access
! the the major mode as `mam', the file name as `fn', the buffer name as
! `bn', the default directory as `dd'.  If some function returns non-nil
! no further functions are called.  If the function returns t then the
! buffer is considered created.")
  
  (defvar desktop-create-buffer-form "(desktop-create-buffer 205"
--- 178,186 ----
      desktop-buffer-file)
    "*List of functions to call in order to create a buffer.
! The functions are called without explicit parameters but can use the
! variables `desktop-buffer-major-mode', `desktop-buffer-file-name',
! `desktop-buffer-name'.
! If one function returns non-nil, no further functions are called.
! If the function returns t then the buffer is considered created.")
  
  (defvar desktop-create-buffer-form "(desktop-create-buffer 205"
*************** the like shorter.")
*** 216,219 ****
--- 231,245 ----
  	   (signal (car err) (cdr err)))))))
  ;; ----------------------------------------------------------------------------
+ (defun desktop-list* (&rest args)
+   (if (null (cdr args))
+       (car args)
+     (setq args (nreverse args))
+     (let ((value (cons (nth 1 args) (car args))))
+       (setq args (cdr (cdr args)))
+       (while args
+ 	(setq value (cons (car args) value))
+ 	(setq args (cdr args)))
+       value)))
+ 
  (defun desktop-internal-v2s (val)
    "Convert VALUE to a pair (QUOTE . TXT); (eval (read TXT)) gives VALUE.
*************** QUOTE may be `may' (value may be quoted)
*** 253,256 ****
--- 279,283 ----
      (let ((p val)
  	  newlist
+ 	  use-list*
  	  anynil)
        (while (consp p)
*************** QUOTE may be `may' (value may be quoted)
*** 262,281 ****
  	  (let ((last (desktop-internal-v2s p))
  		(el (car newlist)))
! 	    (setcar newlist
! 		    (if (or anynil (setq anynil (null (car last))))
! 			(cons nil
! 			      (concat "(cons "
! 				      (if (eq (car el) 'must) "'" "")
! 				      (cdr el)
! 				      " "
! 				      (if (eq (car last) 'must) "'" "")
! 				      (cdr last)
! 				      ")"))
! 		      (cons 'must
! 			    (concat (cdr el) " . " (cdr last)))))))
        (setq newlist (nreverse newlist))
        (if anynil
  	  (cons nil
! 		(concat "(list "
  			(mapconcat (lambda (el)
  				     (if (eq (car el) 'must)
--- 289,301 ----
  	  (let ((last (desktop-internal-v2s p))
  		(el (car newlist)))
! 	    (or anynil (setq anynil (null (car last))))
! 	    (or anynil
! 		(setq newlist (cons '(must . ".") newlist)))
! 	    (setq use-list* t)
! 	    (setq newlist (cons last newlist))))
        (setq newlist (nreverse newlist))
        (if anynil
  	  (cons nil
! 		(concat (if use-list* "(desktop-list* "  "(list ")
  			(mapconcat (lambda (el)
  				     (if (eq (car el) 'must)
*************** MODE is the major mode."
*** 438,455 ****
  ;; ----------------------------------------------------------------------------
  (defun desktop-read ()
!   "Read the Desktop file and the files it specifies."
    (interactive)
!   (let ((filename))
!     (if (file-exists-p (concat "./" desktop-basefilename))
! 	(setq desktop-dirname (expand-file-name "./"))
!       (if (file-exists-p (concat "~/" desktop-basefilename))
! 	  (setq desktop-dirname (expand-file-name "~/"))
! 	(setq desktop-dirname nil)))
!     (if desktop-dirname
! 	(progn
! 	  (load (concat desktop-dirname desktop-basefilename) t t t)
! 	  (run-hooks 'desktop-delay-hook)
! 	  (message "Desktop loaded."))
!       (desktop-clear))))
  ;; ----------------------------------------------------------------------------
  (defun desktop-load-default ()
--- 458,481 ----
  ;; ----------------------------------------------------------------------------
  (defun desktop-read ()
!   "Read the Desktop file and the files it specifies.
! This is a no-op when Emacs is running in batch mode."
    (interactive)
!   (if noninteractive
!       nil
!     (let ((dirs '("./" "~/")))
!       (while (and dirs
! 		  (not (file-exists-p (expand-file-name
! 				       desktop-basefilename
! 				       (car dirs)))))
! 	(setq dirs (cdr dirs)))
!       (setq desktop-dirname (and dirs (expand-file-name (car dirs))))
!       (if desktop-dirname
! 	  (progn
! 	    (load (expand-file-name desktop-basefilename desktop-dirname)
! 		  t t t)
! 	    (run-hooks 'desktop-delay-hook)
! 	    (setq desktop-delay-hook nil)
! 	    (message "Desktop loaded."))
! 	(desktop-clear)))))
  ;; ----------------------------------------------------------------------------
  (defun desktop-load-default ()
*************** to provide correct modes for autoloaded 
*** 465,478 ****
  ;;
  (defun desktop-buffer-info () "Load an info file."
!   (if (eq 'Info-mode mam)
        (progn
  	(require 'info)
! 	(Info-find-node (nth 0 misc) (nth 1 misc))
  	t)))
  ;; ----------------------------------------------------------------------------
  (defun desktop-buffer-rmail () "Load an RMAIL file."
!   (if (eq 'rmail-mode mam)
        (condition-case error
! 	  (progn (rmail-input fn) t)
  	(file-locked
  	 (kill-buffer (current-buffer))
--- 491,504 ----
  ;;
  (defun desktop-buffer-info () "Load an info file."
!   (if (eq 'Info-mode desktop-buffer-major-mode)
        (progn
  	(require 'info)
! 	(Info-find-node (nth 0 desktop-buffer-misc) (nth 1 desktop-buffer-misc))
  	t)))
  ;; ----------------------------------------------------------------------------
  (defun desktop-buffer-rmail () "Load an RMAIL file."
!   (if (eq 'rmail-mode desktop-buffer-major-mode)
        (condition-case error
! 	  (progn (rmail-input desktop-buffer-file-name) t)
  	(file-locked
  	 (kill-buffer (current-buffer))
*************** to provide correct modes for autoloaded 
*** 480,514 ****
  ;; ----------------------------------------------------------------------------
  (defun desktop-buffer-mh () "Load a folder in the mh system."
!   (if (eq 'mh-folder-mode mam)
        (progn
  	(require 'mh-e)
  	(mh-find-path)
! 	(mh-visit-folder bn)
  	t)))
  ;; ----------------------------------------------------------------------------
  (defun desktop-buffer-dired () "Load a directory using dired."
!   (if (eq 'dired-mode mam)
!       (if (file-directory-p (file-name-directory (car misc)))
  	  (progn
! 	    (dired (car misc))
! 	    (mapcar 'dired-insert-subdir (cdr misc))
  	    t)
! 	(message "Directory %s no longer exists." (car misc))
  	(sit-for 1)
  	'ignored)))
  ;; ----------------------------------------------------------------------------
  (defun desktop-buffer-file () "Load a file."
!   (if fn
!       (if (or (file-exists-p fn)
  	      (and desktop-missing-file-warning
  		   (y-or-n-p (format
  			      "File \"%s\" no longer exists. Re-create? "
! 			      fn))))
! 	  (progn (find-file fn) t)
  	'ignored)))
  ;; ----------------------------------------------------------------------------
  ;; Create a buffer, load its file, set is mode, ...;  called from Desktop file
  ;; only.
! (defun desktop-create-buffer (ver fn bn mam mim pt mk ro misc &optional locals)
    (let ((hlist desktop-buffer-handlers)
  	(result)
--- 506,542 ----
  ;; ----------------------------------------------------------------------------
  (defun desktop-buffer-mh () "Load a folder in the mh system."
!   (if (eq 'mh-folder-mode desktop-buffer-major-mode)
        (progn
  	(require 'mh-e)
  	(mh-find-path)
! 	(mh-visit-folder desktop-buffer-name)
  	t)))
  ;; ----------------------------------------------------------------------------
  (defun desktop-buffer-dired () "Load a directory using dired."
!   (if (eq 'dired-mode desktop-buffer-major-mode)
!       (if (file-directory-p (file-name-directory (car desktop-buffer-misc)))
  	  (progn
! 	    (dired (car desktop-buffer-misc))
! 	    (mapcar 'dired-insert-subdir (cdr desktop-buffer-misc))
  	    t)
! 	(message "Directory %s no longer exists." (car desktop-buffer-misc))
  	(sit-for 1)
  	'ignored)))
  ;; ----------------------------------------------------------------------------
  (defun desktop-buffer-file () "Load a file."
!   (if desktop-buffer-file-name
!       (if (or (file-exists-p desktop-buffer-file-name)
  	      (and desktop-missing-file-warning
  		   (y-or-n-p (format
  			      "File \"%s\" no longer exists. Re-create? "
! 			      desktop-buffer-file-name))))
! 	  (progn (find-file desktop-buffer-file-name) t)
  	'ignored)))
  ;; ----------------------------------------------------------------------------
  ;; Create a buffer, load its file, set is mode, ...;  called from Desktop file
  ;; only.
! (defun desktop-create-buffer (ver desktop-buffer-file-name desktop-buffer-name
! 				  desktop-buffer-major-mode
! 				  mim pt mk ro desktop-buffer-misc &optional locals)
    (let ((hlist desktop-buffer-handlers)
  	(result)
*************** to provide correct modes for autoloaded 
*** 520,525 ****
      (if (eq result t)
  	(progn
! 	  (if (not (equal (buffer-name) bn))
! 	      (rename-buffer bn))
  	  (auto-fill-mode (if (nth 0 mim) 1 0))
  	  (goto-char pt)
--- 548,553 ----
      (if (eq result t)
  	(progn
! 	  (if (not (equal (buffer-name) desktop-buffer-name))
! 	      (rename-buffer desktop-buffer-name))
  	  (auto-fill-mode (if (nth 0 mim) 1 0))
  	  (goto-char pt)
*************** to provide correct modes for autoloaded 
*** 545,550 ****
  
  ;; Backward compatibility -- update parameters to 205 standards.
! (defun desktop-buffer (fn bn mam mim pt mk ro tl fc cfs cr misc)
!   (desktop-create-buffer 205 fn bn mam (cdr mim) pt mk ro misc
  			 (list (cons 'truncate-lines tl)
  			       (cons 'fill-column fc)
--- 573,582 ----
  
  ;; Backward compatibility -- update parameters to 205 standards.
! (defun desktop-buffer (desktop-buffer-file-name desktop-buffer-name
! 		       desktop-buffer-major-mode
! 		       mim pt mk ro tl fc cfs cr desktop-buffer-misc)
!   (desktop-create-buffer 205 desktop-buffer-file-name desktop-buffer-name
! 			 desktop-buffer-major-mode (cdr mim) pt mk ro
! 			 desktop-buffer-misc
  			 (list (cons 'truncate-lines tl)
  			       (cons 'fill-column fc)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/diary-lib.el emacs-19.31/lisp/diary-lib.el
*** emacs-19.30/lisp/diary-lib.el	Sat Nov 25 00:34:39 1995
--- emacs-19.31/lisp/diary-lib.el	Mon May 20 11:38:29 1996
***************
*** 1,6 ****
  ;;; diary-lib.el --- diary functions.
  
! ;; Copyright (C) 1989, 1990, 1992, 1993, 1994, 1995 Free Software Foundation,
! ;; Inc.
  
  ;; Author: Edward M. Reingold <reingold@cs.uiuc.edu>
--- 1,6 ----
  ;;; diary-lib.el --- diary functions.
  
! ;; Copyright (C) 1989, 1990, 1992, 1993, 1994, 1995 Free Software
! ;; Foundation, Inc.
  
  ;; Author: Edward M. Reingold <reingold@cs.uiuc.edu>
***************
*** 20,25 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** The holidays are those in the list `cale
*** 104,107 ****
--- 105,112 ----
    t)
  
+ (autoload 'diary-iso-date "cal-iso"
+   "ISO calendar equivalent of date diary entry."
+   t)
+ 
  (autoload 'diary-julian-date "cal-julian"
    "Julian calendar equivalent of date diary entry."
*************** The holidays are those in the list `cale
*** 112,132 ****
    t)
  
! (autoload 'diary-chinese-date "cal-chinese"
    "Chinese calendar equivalent of date diary entry."
    t)
  
! (autoload 'diary-islamic-date "cal-islamic"
    "Islamic calendar equivalent of date diary entry."
    t)
  
! (autoload 'list-islamic-diary-entries "cal-islamic"
    "Add any Islamic date entries from the diary file to `diary-entries-list'."
    t)
  
! (autoload 'mark-islamic-diary-entries "cal-islamic"
    "Mark days in the calendar window that have Islamic date diary entries."
    t)
  
! (autoload 'mark-islamic-calendar-date-pattern "cal-islamic"
     "Mark dates in calendar window that conform to Islamic date MONTH/DAY/YEAR."
    t)
--- 117,137 ----
    t)
  
! (autoload 'diary-chinese-date "cal-china"
    "Chinese calendar equivalent of date diary entry."
    t)
  
! (autoload 'diary-islamic-date "cal-islam"
    "Islamic calendar equivalent of date diary entry."
    t)
  
! (autoload 'list-islamic-diary-entries "cal-islam"
    "Add any Islamic date entries from the diary file to `diary-entries-list'."
    t)
  
! (autoload 'mark-islamic-diary-entries "cal-islam"
    "Mark days in the calendar window that have Islamic date diary entries."
    t)
  
! (autoload 'mark-islamic-calendar-date-pattern "cal-islam"
     "Mark dates in calendar window that conform to Islamic date MONTH/DAY/YEAR."
    t)
*************** The holidays are those in the list `cale
*** 172,175 ****
--- 177,184 ----
    t)
  
+ (autoload 'diary-persian-date "cal-persia"
+   "Persian calendar equivalent of date diary entry."
+   t)
+ 
  (autoload 'diary-phases-of-moon "lunar" "Moon phases diary entry." t)
  
*************** These hooks have the following distinct 
*** 230,234 ****
          (message "Preparing diary...")
          (save-excursion
!           (let ((diary-buffer (get-file-buffer d-file)))
              (set-buffer (if diary-buffer
                              diary-buffer
--- 239,243 ----
          (message "Preparing diary...")
          (save-excursion
!           (let ((diary-buffer (find-buffer-visiting d-file)))
              (set-buffer (if diary-buffer
                              diary-buffer
*************** These hooks have the following distinct 
*** 308,312 ****
                                  (point) ?\^M ?\n t)
                               (add-to-diary-list
!                                date (buffer-substring entry-start (point)))))))
                       (setq d (cdr d)))
                     (or entry-found
--- 317,323 ----
                                  (point) ?\^M ?\n t)
                               (add-to-diary-list
!                                date
!                                (buffer-substring-no-properties
!                                 entry-start (point)))))))
                       (setq d (cdr d)))
                     (or entry-found
*************** changing the variable `diary-include-str
*** 347,351 ****
            nil t)
      (let ((diary-file (substitute-in-file-name
!                        (buffer-substring (match-beginning 2) (match-end 2))))
            (diary-list-include-blanks nil)
            (list-diary-entries-hook 'include-other-diary-files)
--- 358,363 ----
            nil t)
      (let ((diary-file (substitute-in-file-name
!                        (buffer-substring-no-properties
!                         (match-beginning 2) (match-end 2))))
            (diary-list-include-blanks nil)
            (list-diary-entries-hook 'include-other-diary-files)
*************** changing the variable `diary-include-str
*** 358,362 ****
                          (append diary-entries-list
                                  (list-diary-entries original-date number)))
!                 (kill-buffer (get-file-buffer diary-file)))
              (beep)
              (message "Can't read included diary file %s" diary-file)
--- 370,374 ----
                          (append diary-entries-list
                                  (list-diary-entries original-date number)))
!                 (kill-buffer (find-buffer-visiting diary-file)))
              (beep)
              (message "Can't read included diary file %s" diary-file)
*************** changing the variable `diary-include-str
*** 378,382 ****
                   (string-equal (car (cdr (car diary-entries-list))) "")))
          (if (<= (length msg) (frame-width))
!             (message msg)
            (set-buffer (get-buffer-create holiday-buffer))
            (setq buffer-read-only nil)
--- 390,394 ----
                   (string-equal (car (cdr (car diary-entries-list))) "")))
          (if (<= (length msg) (frame-width))
!             (message "%s" msg)
            (set-buffer (get-buffer-create holiday-buffer))
            (setq buffer-read-only nil)
*************** changing the variable `diary-include-str
*** 393,397 ****
                 (if holiday-list ": " "")
                 (mapconcat 'identity holiday-list "; ")))
!       (display-buffer (get-file-buffer d-file))
        (message "Preparing diary...done"))))
  
--- 405,409 ----
                 (if holiday-list ": " "")
                 (mapconcat 'identity holiday-list "; ")))
!       (display-buffer (find-buffer-visiting d-file))
        (message "Preparing diary...done"))))
  
*************** changing the variable `diary-include-str
*** 400,404 ****
  This function is provided for optional use as the `diary-display-hook'."
    (save-excursion;; Turn off selective-display in the diary file's buffer.
!     (set-buffer (get-file-buffer (substitute-in-file-name diary-file)))
      (let ((diary-modified (buffer-modified-p)))
        (subst-char-in-region (point-min) (point-max) ?\^M ?\n t)
--- 412,416 ----
  This function is provided for optional use as the `diary-display-hook'."
    (save-excursion;; Turn off selective-display in the diary file's buffer.
!     (set-buffer (find-buffer-visiting (substitute-in-file-name diary-file)))
      (let ((diary-modified (buffer-modified-p)))
        (subst-char-in-region (point-min) (point-max) ?\^M ?\n t)
*************** This function is provided for optional u
*** 415,419 ****
                            (mapconcat 'identity holiday-list "; "))))
          (if (<= (length msg) (frame-width))
!             (message msg)
            (set-buffer (get-buffer-create holiday-buffer))
            (setq buffer-read-only nil)
--- 427,431 ----
                            (mapconcat 'identity holiday-list "; "))))
          (if (<= (length msg) (frame-width))
!             (message "%s" msg)
            (set-buffer (get-buffer-create holiday-buffer))
            (setq buffer-read-only nil)
*************** This function is provided for optional u
*** 471,479 ****
                    (insert (if (= (point) (point-min)) "" ?\n) date-string)
                    (if date-holiday-list (insert ":  "))
!                   (let ((l (current-column)))
!                     (insert (mapconcat 'identity date-holiday-list
!                                        (concat "\n" (make-string l ? )))))
!                   (let ((l (current-column)))
!                     (insert ?\n (make-string l ?=) ?\n)))))
            (if (< 0 (length (car (cdr (car entry-list)))))
                (insert (car (cdr (car entry-list))) ?\n))
--- 483,495 ----
                    (insert (if (= (point) (point-min)) "" ?\n) date-string)
                    (if date-holiday-list (insert ":  "))
!                   (let* ((l (current-column))
!                          (longest 0))
!                     (insert (mapconcat '(lambda (x)
!                                           (if (< longest (length x))
!                                               (setq longest (length x)))
!                                           x)
!                                        date-holiday-list
!                                        (concat "\n" (make-string l ? ))))
!                     (insert ?\n (make-string (+ l longest) ?=) ?\n)))))
            (if (< 0 (length (car (cdr (car entry-list)))))
                (insert (car (cdr (car entry-list))) ?\n))
*************** the actual printing."
*** 514,518 ****
          (run-hooks 'print-diary-entries-hook))
      (let ((diary-buffer
!            (get-file-buffer (substitute-in-file-name diary-file))))
        (if diary-buffer
            (let ((temp-buffer (get-buffer-create "*Printable Diary Entries*"))
--- 530,534 ----
          (run-hooks 'print-diary-entries-hook))
      (let ((diary-buffer
!            (find-buffer-visiting (substitute-in-file-name diary-file))))
        (if diary-buffer
            (let ((temp-buffer (get-buffer-create "*Printable Diary Entries*"))
*************** is created."
*** 547,551 ****
          (if (file-readable-p d-file)
              (save-excursion
!               (let ((diary-buffer (get-file-buffer d-file)))
                  (set-buffer (if diary-buffer
                                  diary-buffer
--- 563,567 ----
          (if (file-readable-p d-file)
              (save-excursion
!               (let ((diary-buffer (find-buffer-visiting d-file)))
                  (set-buffer (if diary-buffer
                                  diary-buffer
*************** After the entries are marked, the hooks 
*** 640,654 ****
                        (let* ((dd-name
                                (if d-name-pos
!                                   (buffer-substring
                                     (match-beginning d-name-pos)
                                     (match-end d-name-pos))))
                               (mm-name
                                (if m-name-pos
!                                   (buffer-substring
                                     (match-beginning m-name-pos)
                                     (match-end m-name-pos))))
                               (mm (string-to-int
                                    (if m-pos
!                                       (buffer-substring
                                         (match-beginning m-pos)
                                         (match-end m-pos))
--- 656,670 ----
                        (let* ((dd-name
                                (if d-name-pos
!                                   (buffer-substring-no-properties
                                     (match-beginning d-name-pos)
                                     (match-end d-name-pos))))
                               (mm-name
                                (if m-name-pos
!                                   (buffer-substring-no-properties
                                     (match-beginning m-name-pos)
                                     (match-end m-name-pos))))
                               (mm (string-to-int
                                    (if m-pos
!                                       (buffer-substring-no-properties
                                         (match-beginning m-pos)
                                         (match-end m-pos))
*************** After the entries are marked, the hooks 
*** 656,665 ****
                               (dd (string-to-int
                                    (if d-pos
!                                       (buffer-substring
                                         (match-beginning d-pos)
                                         (match-end d-pos))
                                      "")))
                               (y-str (if y-pos
!                                         (buffer-substring
                                           (match-beginning y-pos)
                                           (match-end y-pos))))
--- 672,681 ----
                               (dd (string-to-int
                                    (if d-pos
!                                       (buffer-substring-no-properties
                                         (match-beginning d-pos)
                                         (match-end d-pos))
                                      "")))
                               (y-str (if y-pos
!                                         (buffer-substring-no-properties
                                           (match-beginning y-pos)
                                           (match-end y-pos))))
*************** is marked.  See the documentation for th
*** 745,749 ****
              (line-start))
          (forward-sexp)
!         (setq sexp (buffer-substring sexp-start (point)))
          (save-excursion
            (re-search-backward "\^M\\|\n\\|\\`")
--- 761,765 ----
              (line-start))
          (forward-sexp)
!         (setq sexp (buffer-substring-no-properties sexp-start (point)))
          (save-excursion
            (re-search-backward "\^M\\|\n\\|\\`")
*************** is marked.  See the documentation for th
*** 761,765 ****
              (re-search-forward "\^M\\|\n" nil t))
            (backward-char 1)
!           (setq entry (buffer-substring entry-start (point)))
            (while (string-match "[\^M]" entry)
              (aset entry (match-beginning 0) ?\n )))
--- 777,781 ----
              (re-search-forward "\^M\\|\n" nil t))
            (backward-char 1)
!           (setq entry (buffer-substring-no-properties entry-start (point)))
            (while (string-match "[\^M]" entry)
              (aset entry (match-beginning 0) ?\n )))
*************** changing the variable `diary-include-str
*** 787,791 ****
            nil t)
      (let ((diary-file (substitute-in-file-name
!                        (buffer-substring (match-beginning 2) (match-end 2))))
            (mark-diary-entries-hook 'mark-included-diary-files))
        (if (file-exists-p diary-file)
--- 803,808 ----
            nil t)
      (let ((diary-file (substitute-in-file-name
!                        (buffer-substring-no-properties
!                         (match-beginning 2) (match-end 2))))
            (mark-diary-entries-hook 'mark-included-diary-files))
        (if (file-exists-p diary-file)
*************** changing the variable `diary-include-str
*** 793,797 ****
                (progn
                  (mark-diary-entries)
!                 (kill-buffer (get-file-buffer diary-file)))
              (beep)
              (message "Can't read included diary file %s" diary-file)
--- 810,814 ----
                (progn
                  (mark-diary-entries)
!                 (kill-buffer (find-buffer-visiting diary-file)))
              (beep)
              (message "Can't read included diary file %s" diary-file)
*************** A number of built-in functions are avail
*** 1034,1038 ****
        %%(diary-omer)
                    Diary entries giving the omer count will be made every day
!                   from Passover to Shavuoth.  Note that since there is no text,
                    it makes sense only if the fancy diary display is used.
  
--- 1051,1055 ----
        %%(diary-omer)
                    Diary entries giving the omer count will be made every day
!                   from Passover to Shavuot.  Note that since there is no text,
                    it makes sense only if the fancy diary display is used.
  
*************** best if they are nonmarking."
*** 1052,1056 ****
              (line-start))
          (forward-sexp)
!         (setq sexp (buffer-substring sexp-start (point)))
          (save-excursion
            (re-search-backward "\^M\\|\n\\|\\`")
--- 1069,1073 ----
              (line-start))
          (forward-sexp)
!         (setq sexp (buffer-substring-no-properties sexp-start (point)))
          (save-excursion
            (re-search-backward "\^M\\|\n\\|\\`")
*************** best if they are nonmarking."
*** 1068,1072 ****
              (re-search-forward "\^M\\|\n" nil t))
            (backward-char 1)
!           (setq entry (buffer-substring entry-start (point)))
            (while (string-match "[\^M]" entry)
              (aset entry (match-beginning 0) ?\n )))
--- 1085,1089 ----
              (re-search-forward "\^M\\|\n" nil t))
            (backward-char 1)
!           (setq entry (buffer-substring-no-properties entry-start (point)))
            (while (string-match "[\^M]" entry)
              (aset entry (match-beginning 0) ?\n )))
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/diff.el emacs-19.31/lisp/diff.el
*** emacs-19.30/lisp/diff.el	Tue Oct 25 18:02:47 1994
--- emacs-19.31/lisp/diff.el	Sun Jan 14 02:34:30 1996
***************
*** 1,5 ****
  ;;; diff.el --- Run `diff' in compilation-mode.
  
! ;; Copyright (C) 1992, 1994 Free Software Foundation, Inc.
  
  ;; Keywords: unix, tools
--- 1,5 ----
  ;;; diff.el --- Run `diff' in compilation-mode.
  
! ;; Copyright (C) 1992, 1994, 1996 Free Software Foundation, Inc.
  
  ;; Keywords: unix, tools
***************
*** 18,23 ****
  
  ;; 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:
--- 18,24 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 42,46 ****
      ;; -u format: @@ -OLDSTART,OLDEND +NEWSTART,NEWEND @@
      ("^@@ -\\([0-9]+\\),[0-9]+ \\+\\([0-9]+\\),[0-9]+ @@$" 1 2)
!   
      ;; -c format: *** OLDSTART,OLDEND ****
      ("^\\*\\*\\* \\([0-9]+\\),[0-9]+ \\*\\*\\*\\*$" 1 nil)
--- 43,47 ----
      ;; -u format: @@ -OLDSTART,OLDEND +NEWSTART,NEWEND @@
      ("^@@ -\\([0-9]+\\),[0-9]+ \\+\\([0-9]+\\),[0-9]+ @@$" 1 2)
! 
      ;; -c format: *** OLDSTART,OLDEND ****
      ("^\\*\\*\\* \\([0-9]+\\),[0-9]+ \\*\\*\\*\\*$" 1 nil)
***************
*** 58,62 ****
      ("^[adc]\\([0-9]+\\)\\( [0-9]+\\)?$" 1)
      )
!   "Alist (REGEXP OLD-IDX NEW-IDX) of regular expressions to match difference 
  sections in \\[diff] output.  If REGEXP matches, the OLD-IDX'th
  subexpression gives the line number in the old file, and NEW-IDX'th
--- 59,63 ----
      ("^[adc]\\([0-9]+\\)\\( [0-9]+\\)?$" 1)
      )
!   "Alist (REGEXP OLD-IDX NEW-IDX) of regular expressions to match difference
  sections in \\[diff] output.  If REGEXP matches, the OLD-IDX'th
  subexpression gives the line number in the old file, and NEW-IDX'th
*************** With prefix arg, prompt for diff switche
*** 221,224 ****
--- 222,237 ----
  				  'diff-parse-differences))
  	  (pop-to-buffer buf)
+ 	  ;; Avoid frightening people with "abnormally terminated"
+ 	  ;; if diff finds differences.
+ 	  (set (make-local-variable 'compilation-exit-message-function)
+ 	       (lambda (status code msg)
+ 		 (cond ((not (eq status 'exit))
+ 			(cons msg code))
+ 		       ((zerop code)
+ 			'("finished (no differences)\n" . "no differences"))
+ 		       ((= code 1)
+ 			'("finished\n" . "differences found"))
+ 		       (t
+ 			(cons msg code)))))
  	  (set (make-local-variable 'diff-old-file) old)
  	  (set (make-local-variable 'diff-new-file) new)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/dired-aux.el emacs-19.31/lisp/dired-aux.el
*** emacs-19.30/lisp/dired-aux.el	Tue Aug 29 12:19:59 1995
--- emacs-19.31/lisp/dired-aux.el	Sat May  4 01:29:25 1996
***************
*** 18,23 ****
  
  ;; 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:
--- 18,24 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** output files usually are created there i
*** 400,404 ****
  ;  "Run PROGRAM with output to current buffer unless DISCARD is t.
  ;Remaining arguments are strings passed as command arguments to PROGRAM."
!   (apply 'call-process program nil (not discard) nil arguments))
  
  (defun dired-check-process (msg program &rest arguments)
--- 401,411 ----
  ;  "Run PROGRAM with output to current buffer unless DISCARD is t.
  ;Remaining arguments are strings passed as command arguments to PROGRAM."
!   ;; Look for a handler for default-directory in case it is a remote file name.
!   (let ((handler
! 	 (find-file-name-handler (directory-file-name default-directory)
! 				 'dired-call-process)))
!     (if handler (apply handler 'dired-call-process
! 		       program discard arguments)
!       (apply 'call-process program nil (not discard) nil arguments))))
  
  (defun dired-check-process (msg program &rest arguments)
*************** and use this command with a prefix argum
*** 508,511 ****
--- 515,537 ----
        from-file)))
  
+ (defvar dired-compress-file-suffixes
+   '(("\\.gz\\'" "" "gunzip")
+     ("\\.tgz\\'" ".tar" "gunzip")
+     ("\\.Z\\'" "" "uncompress")
+     ;; For .z, try gunzip.  It might be an old gzip file,
+     ;; or it might be from compact? pack? (which?) but gunzip handles both.
+     ("\\.z\\'" "" "gunzip")
+     ;; This item controls naming for compression.
+     ("\\.tar\\'" ".tgz" nil))
+   "Control changes in file name suffixes for compression and uncompression.
+ Each element specifies one transformation rule, and has the form:
+   (REGEXP NEW-SUFFIX PROGRAM)
+ The rule applies when the old file name matches REGEXP.
+ The new file name is computed by deleting the part that matches REGEXP
+  (as well as anything after that), then adding NEW-SUFFIX in its place.
+ If PROGRAM is non-nil, the rule is an uncompression rule,
+ and uncompression is done by running PROGRAM.
+ Otherwise, the rule is a compression rule, and compression is done with gzip.")
+ 
  ;;;###autoload
  (defun dired-compress-file (file)
*************** and use this command with a prefix argum
*** 513,550 ****
    ;; Return the name of the compressed or uncompressed file.
    ;; Return nil if no change in files.
!   (let ((handler (find-file-name-handler file 'dired-compress-file)))
      (cond (handler
  	   (funcall handler 'dired-compress-file file))
  	  ((file-symlink-p file)
  	   nil)
! 	  ((let (case-fold-search)
! 	     (string-match "\\.Z$" file))
! 	   (if (not (dired-check-process (concat "Uncompressing " file)
! 					 "uncompress" file))
! 	       (substring file 0 -2)))
! 	  ((let (case-fold-search)
! 	     (string-match "\\.gz$" file))
  	   (if (not (dired-check-process (concat "Uncompressing " file)
! 					 "gunzip" file))
! 	       (substring file 0 -3)))
! 	  ;; For .z, try gunzip.  It might be an old gzip file,
! 	  ;; or it might be from compact? pack? (which?) but gunzip handles
! 	  ;; both.
! 	  ((let (case-fold-search)
! 	     (string-match "\\.z$" file))
! 	   (if (not (dired-check-process (concat "Uncompressing " file)
! 					 "gunzip" file))
! 	       (substring file 0 -2)))
  	  (t
  	   ;;; Try gzip; if we don't have that, use compress.
  	   (condition-case nil
  	       (if (not (dired-check-process (concat "Compressing " file)
  					     "gzip" "-f" file))
! 		   (cond ((file-exists-p (concat file ".gz"))
! 			  (concat file ".gz"))
! 			 (t (concat file ".z"))))
  	     (file-error
  	      (if (not (dired-check-process (concat "Compressing " file)
  					    "compress" "-f" file))
  		  (concat file ".Z"))))))))
  
--- 539,585 ----
    ;; Return the name of the compressed or uncompressed file.
    ;; Return nil if no change in files.
!   (let ((handler (find-file-name-handler file 'dired-compress-file))
! 	suffix newname
! 	(suffixes dired-compress-file-suffixes))
!     ;; See if any suffix rule matches this file name.
!     (while suffixes
!       (let (case-fold-search)
! 	(if (string-match (car (car suffixes)) file)
! 	    (setq suffix (car suffixes) suffixes nil))
! 	(setq suffixes (cdr suffixes))))
!     ;; If so, compute desired new name.
!     (if suffix	
! 	(setq newname (concat (substring file 0 (match-beginning 0))
! 			      (nth 1 suffix))))
      (cond (handler
  	   (funcall handler 'dired-compress-file file))
  	  ((file-symlink-p file)
  	   nil)
! 	  ((and suffix (nth 2 suffix))
! 	   ;; We found an uncompression rule.
  	   (if (not (dired-check-process (concat "Uncompressing " file)
! 					 (nth 2 suffix) file))
! 	       newname))
  	  (t
+ 	   ;;; We don't recognize the file as compressed, so compress it.
  	   ;;; Try gzip; if we don't have that, use compress.
  	   (condition-case nil
  	       (if (not (dired-check-process (concat "Compressing " file)
  					     "gzip" "-f" file))
! 		   (let ((out-name
! 			  (if (file-exists-p (concat file ".gz"))
! 			      (concat file ".gz")
! 			    (concat file ".z"))))
! 		     ;; Rename the compressed file to NEWNAME
! 		     ;; if it hasn't got that name already.
! 		     (if (and newname (not (equal newname out-name)))
! 			 (progn
! 			   (rename-file out-name newname t)
! 			   newname)
! 		       out-name)))
  	     (file-error
  	      (if (not (dired-check-process (concat "Compressing " file)
  					    "compress" "-f" file))
+ 		  ;; Don't use NEWNAME with `compress'.
  		  (concat file ".Z"))))))))
  
*************** Special value `always' suppresses confir
*** 891,902 ****
    ;; `dired-overwrite-confirmed' and `overwrite-backup-query' are fluid vars
    ;; from dired-create-files.
!   (if (and dired-backup-overwrite
! 	   dired-overwrite-confirmed
! 	   (or (eq 'always dired-backup-overwrite)
! 	       (dired-query 'overwrite-backup-query
! 			(format "Make backup for existing file `%s'? " to))))
!       (let ((backup (car (find-backup-file-name to))))
! 	(rename-file to backup 0)	; confirm overwrite of old backup
! 	(dired-relist-entry backup))))
  
  ;;;###autoload
--- 926,939 ----
    ;; `dired-overwrite-confirmed' and `overwrite-backup-query' are fluid vars
    ;; from dired-create-files.
!   (let (backup)
!     (if (and dired-backup-overwrite
! 	     dired-overwrite-confirmed
! 	     (setq backup (car (find-backup-file-name to)))
! 	     (or (eq 'always dired-backup-overwrite)
! 		 (dired-query 'overwrite-backup-query
! 			      (format "Make backup for existing file `%s'? " to))))
! 	(progn
! 	  (rename-file to backup 0)	; confirm overwrite of old backup
! 	  (dired-relist-entry backup)))))
  
  ;;;###autoload
*************** Special value `always' suppresses confir
*** 1009,1013 ****
  ;; exists.  If oldfile is removed by FILE-CREATOR (i.e, it is a
  ;; rename), it is FILE-CREATOR's responsibility to update dired
! ;; buffers.  FILE-CREATOR must abort by signalling a file-error if it
  ;; could not create newfile.  The error is caught and logged.
  
--- 1046,1050 ----
  ;; exists.  If oldfile is removed by FILE-CREATOR (i.e, it is a
  ;; rename), it is FILE-CREATOR's responsibility to update dired
! ;; buffers.  FILE-CREATOR must abort by signaling a file-error if it
  ;; could not create newfile.  The error is caught and logged.
  
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/dired-x.el emacs-19.31/lisp/dired-x.el
*** emacs-19.30/lisp/dired-x.el	Tue Sep 12 19:23:18 1995
--- emacs-19.31/lisp/dired-x.el	Sun Jan 14 02:34:30 1996
***************
*** 23,135 ****
  
  ;; 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:
  
! ;;; This is Sebastian Kremer's excellent dired-x.el (Dired Extra), version
! ;;; 1.191, hacked up for GNU Emacs 19.  Redundant or conflicting material
! ;;; has been removed or renamed in order to work properly with dired of
! ;;; GNU Emacs 19.  All suggestions or comments are most welcomed.
! 
! ;;;  
! ;;; Please, PLEASE, *PLEASE* see the info pages.
! ;;; 
!  
! ;;; BUGS: Type M-x dired-x-submit-report and a report will be generated.
! 
! ;;; INSTALLATION: In your ~/.emacs,
! ;;;
! ;;; (add-hook 'dired-load-hook
! ;;;           (function (lambda ()
! ;;;                       (load "dired-x")
! ;;;                       ;; Set global variables here.  For example:
! ;;;                       ;; (setq dired-guess-shell-gnutar "gtar")
! ;;;                       )))
! ;;; (add-hook 'dired-mode-hook
! ;;;           (function (lambda ()
! ;;;                       ;; Set buffer-local variables here.  For example:
! ;;;                       ;; (setq dired-omit-files-p t)
! ;;;                       )))
! ;;;
! ;;; At load time dired-x.el will install itself, redefine some functions, and
! ;;; bind some dired keys.  *Please* see the info pages for more details.
! 
! ;;; CAUTION: If you are using a version of GNU Emacs earlier than 19.20 than
! ;;; you may have to edit dired.el.  The copy of dired.el in GNU Emacs versions
! ;;; earlier than 19.20 incorrectly had the call to run-hooks *before* the call
! ;;; to provide.  In such a case, it is possible that byte-compiling and/or
! ;;; loading dired can cause an infinite loop.  To prevent this, make sure the
! ;;; line of code
! ;;;  
! ;;;         (run-hooks 'dired-load-hook) 
! ;;;  
! ;;; is the *last* executable line in the file dired.el.  That is, make sure it
! ;;; comes *after* the line
! ;;;  
! ;;;         (provide 'dired) 
! ;;; 
! ;;; *Please* see the info pages for more details. 
! 
! ;;; User defined variables:
! ;;;
! ;;;      dired-bind-vm
! ;;;      dired-vm-read-only-folders
! ;;;      dired-bind-jump
! ;;;      dired-bind-info
! ;;;      dired-bind-man
! ;;;      dired-x-hands-off-my-keys 
! ;;;      dired-find-subdir
! ;;;      dired-enable-local-variables
! ;;;      dired-local-variables-file
! ;;;      dired-guess-shell-gnutar
! ;;;      dired-guess-shell-gzip-quiet
! ;;;      dired-guess-shell-znew-switches
! ;;;      dired-guess-shell-alist-user
! ;;;      dired-clean-up-buffers-too
! ;;;      dired-omit-files-p
! ;;;      dired-omit-files
! ;;;      dired-omit-extensions
! ;;;
! ;;; To find out more about these variables, load this file, put your cursor at
! ;;; the end of any of the variable names, and hit C-h v [RET].  *Please* see
! ;;; the info pages for more details.
! 
! ;;; When loaded this code redefines the following functions of GNU Emacs
! ;;;
! ;;;   Function                         Found in this file of GNU Emacs
! ;;;   --------                         -------------------------------
! ;;;   dired-clean-up-after-deletion    ../lisp/dired.el
! ;;;   dired-find-buffer-nocreate       ../lisp/dired.el
! ;;;   dired-initial-position           ../lisp/dired.el
! ;;;
! ;;;   dired-add-entry                  ../lisp/dired-aux.el
! ;;;   dired-read-shell-command         ../lisp/dired-aux.el
! ;;;
! ;;; One drawback is that dired-x.el will load dired-aux.el as soon as dired is
! ;;; loaded.  Thus, the advantage of separating out non-essential dired stuff
! ;;; into dired-aux.el and only loading when necessary will be lost.  Please
! ;;; note also that some of the comments in dired.el and dired-aux.el are
! ;;; Kremer's that referred to the old dired-x.el.  This now should be referring
! ;;; to this program.  (This is also a good reason to call this dired-x.el
! ;;; instead of dired-x19.el.)
  
  
! ;;;; Code:
  
! ;;; LOAD.
  
! ;;; This is a no-op if dired-x is being loaded via `dired-load-hook'.  It is
! ;;; here in case the user has autoloaded dired-x via the dired-jump key binding
! ;;; (instead of autoloading to dired as is suggested in the info-pages).
  
  (require 'dired)
  
! ;;; We will redefine some functions and also need some macros so we need to
! ;;; load dired stuff of GNU Emacs.
  
  (require 'dired-aux)
  
! ;;;; User-defined variables.
  
  (defvar dired-bind-vm nil
--- 23,136 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
! ;; This is Sebastian Kremer's excellent dired-x.el (Dired Extra), version
! ;; 1.191, hacked up for GNU Emacs 19.  Redundant or conflicting material
! ;; has been removed or renamed in order to work properly with dired of
! ;; GNU Emacs 19.  All suggestions or comments are most welcomed.
! 
! ;;  
! ;; Please, PLEASE, *PLEASE* see the info pages.
! ;; 
! 
! ;; BUGS: Type M-x dired-x-submit-report and a report will be generated.
! 
! ;; INSTALLATION: In your ~/.emacs,
! ;;
! ;; (add-hook 'dired-load-hook
! ;;           (function (lambda ()
! ;;                       (load "dired-x")
! ;;                       ;; Set global variables here.  For example:
! ;;                       ;; (setq dired-guess-shell-gnutar "gtar")
! ;;                       )))
! ;; (add-hook 'dired-mode-hook
! ;;           (function (lambda ()
! ;;                       ;; Set buffer-local variables here.  For example:
! ;;                       ;; (setq dired-omit-files-p t)
! ;;                       )))
! ;;
! ;; At load time dired-x.el will install itself, redefine some functions, and
! ;; bind some dired keys.  *Please* see the info pages for more details.
! 
! ;; CAUTION: If you are using a version of GNU Emacs earlier than 19.20 than
! ;; you may have to edit dired.el.  The copy of dired.el in GNU Emacs versions
! ;; earlier than 19.20 incorrectly had the call to run-hooks *before* the call
! ;; to provide.  In such a case, it is possible that byte-compiling and/or
! ;; loading dired can cause an infinite loop.  To prevent this, make sure the
! ;; line of code
! ;;  
! ;;         (run-hooks 'dired-load-hook) 
! ;;  
! ;; is the *last* executable line in the file dired.el.  That is, make sure it
! ;; comes *after* the line
! ;;  
! ;;         (provide 'dired) 
! ;; 
! ;; *Please* see the info pages for more details. 
! 
! ;; User defined variables:
! ;;
! ;;      dired-bind-vm
! ;;      dired-vm-read-only-folders
! ;;      dired-bind-jump
! ;;      dired-bind-info
! ;;      dired-bind-man
! ;;      dired-x-hands-off-my-keys 
! ;;      dired-find-subdir
! ;;      dired-enable-local-variables
! ;;      dired-local-variables-file
! ;;      dired-guess-shell-gnutar
! ;;      dired-guess-shell-gzip-quiet
! ;;      dired-guess-shell-znew-switches
! ;;      dired-guess-shell-alist-user
! ;;      dired-clean-up-buffers-too
! ;;      dired-omit-files-p
! ;;      dired-omit-files
! ;;      dired-omit-extensions
! ;;
! ;; To find out more about these variables, load this file, put your cursor at
! ;; the end of any of the variable names, and hit C-h v [RET].  *Please* see
! ;; the info pages for more details.
! 
! ;; When loaded this code redefines the following functions of GNU Emacs
! ;;
! ;;   Function                         Found in this file of GNU Emacs
! ;;   --------                         -------------------------------
! ;;   dired-clean-up-after-deletion    ../lisp/dired.el
! ;;   dired-find-buffer-nocreate       ../lisp/dired.el
! ;;   dired-initial-position           ../lisp/dired.el
! ;;
! ;;   dired-add-entry                  ../lisp/dired-aux.el
! ;;   dired-read-shell-command         ../lisp/dired-aux.el
! ;;
! ;; One drawback is that dired-x.el will load dired-aux.el as soon as dired is
! ;; loaded.  Thus, the advantage of separating out non-essential dired stuff
! ;; into dired-aux.el and only loading when necessary will be lost.  Please
! ;; note also that some of the comments in dired.el and dired-aux.el are
! ;; Kremer's that referred to the old dired-x.el.  This now should be referring
! ;; to this program.  (This is also a good reason to call this dired-x.el
! ;; instead of dired-x19.el.)
  
  
! ;;; Code:
  
! ;; LOAD.
  
! ;; This is a no-op if dired-x is being loaded via `dired-load-hook'.  It is
! ;; here in case the user has autoloaded dired-x via the dired-jump key binding
! ;; (instead of autoloading to dired as is suggested in the info-pages).
  
  (require 'dired)
  
! ;; We will redefine some functions and also need some macros so we need to
! ;; load dired stuff of GNU Emacs.
  
  (require 'dired-aux)
  
! ;;; User-defined variables.
  
  (defvar dired-bind-vm nil
*************** to nil: a pipe using `zcat' or `gunzip -
*** 203,207 ****
    "*t says offer to kill buffers visiting files and dirs deleted in dired.")
  
! ;;;; KEY BINDINGS.
  
  (define-key dired-mode-map "\M-o" 'dired-omit-toggle)
--- 204,208 ----
    "*t says offer to kill buffers visiting files and dirs deleted in dired.")
  
! ;;; KEY BINDINGS.
  
  (define-key dired-mode-map "\M-o" 'dired-omit-toggle)
*************** to nil: a pipe using `zcat' or `gunzip -
*** 230,234 ****
  
  
! ;;;; Install into appropriate hooks.
  
  (add-hook 'dired-mode-hook 'dired-extra-startup)
--- 231,235 ----
  
  
! ;;; Install into appropriate hooks.
  
  (add-hook 'dired-mode-hook 'dired-extra-startup)
*************** See also functions
*** 286,292 ****
  
  
! ;;;; BUFFER CLEANING.
  
! ;;; REDEFINE.
  (defun dired-clean-up-after-deletion (fn)
  
--- 287,293 ----
  
  
! ;;; BUFFER CLEANING.
  
! ;; REDEFINE.
  (defun dired-clean-up-after-deletion (fn)
  
*************** See also functions
*** 320,324 ****
  
  
! ;;;; EXTENSION MARKING FUNCTIONS.
  
  ;;; Mark files with some extension.
--- 321,325 ----
  
  
! ;;; EXTENSION MARKING FUNCTIONS.
  
  ;;; Mark files with some extension.
*************** See variables `dired-texinfo-unclean-ext
*** 396,400 ****
                                  (list ".dvi"))))
  
! ;;;; JUMP.
  
  ;;;###autoload
--- 397,401 ----
                                  (list ".dvi"))))
  
! ;;; JUMP.
  
  ;;;###autoload
*************** buffer and try again."
*** 436,440 ****
    (dired-jump t))
  
! ;;;; TOGGLE.
  ;;; Toggle marked files with unmarked files.
  
--- 437,441 ----
    (dired-jump t))
  
! ;;; TOGGLE.
  ;;; Toggle marked files with unmarked files.
  
*************** As always, hidden subdirs are not affect
*** 463,467 ****
  
  
! ;;;; COPY NAMES OF MARKED FILES INTO KILL-RING.
  
  (defun dired-copy-filename-as-kill (&optional arg)
--- 464,468 ----
  
  
! ;;; COPY NAMES OF MARKED FILES INTO KILL-RING.
  
  (defun dired-copy-filename-as-kill (&optional arg)
*************** You can then feed the file name(s) to ot
*** 492,496 ****
  
  
! ;;;; OMITTING.
  
  ;;; Enhanced omitting of lines from directory listings.
--- 493,497 ----
  
  
! ;;; OMITTING.
  
  ;;; Enhanced omitting of lines from directory listings.
*************** Second optional argument LOCALP is as in
*** 640,644 ****
  
  
! ;;;; VIRTUAL DIRED MODE.
  
  ;;; For browsing `ls -lR' listings in a dired-like fashion.
--- 641,645 ----
  
  
! ;;; VIRTUAL DIRED MODE.
  
  ;;; For browsing `ls -lR' listings in a dired-like fashion.
*************** Also useful for `auto-mode-alist' (which
*** 765,769 ****
  
  
! ;;;; SMART SHELL.
  
  ;;; An Emacs buffer can have but one working directory, stored in the
--- 766,770 ----
  
  
! ;;; SMART SHELL.
  
  ;;; An Emacs buffer can have but one working directory, stored in the
*************** cases in variable `default-directory-ali
*** 799,803 ****
  
  
! ;;;; LOCAL VARIABLES FOR DIRED BUFFERS.
  
  ;;; Brief Description:
--- 800,804 ----
  
  
! ;;; LOCAL VARIABLES FOR DIRED BUFFERS.
  
  ;;; Brief Description:
*************** cases in variable `default-directory-ali
*** 820,824 ****
  ;;;   Dired Buffer.
  
! (defvar dired-local-variables-file ".dired"
    "Filename, as string, containing local dired buffer variables to be hacked.
  If this file found in current directory, then it will be inserted into dired
--- 821,825 ----
  ;;;   Dired Buffer.
  
! (defvar dired-local-variables-file (convert-standard-filename ".dired")
    "Filename, as string, containing local dired buffer variables to be hacked.
  If this file found in current directory, then it will be inserted into dired
*************** dired."
*** 870,874 ****
  
  
! ;;;; GUESS SHELL COMMAND.
  
  ;;; Brief Description:
--- 871,875 ----
  
  
! ;;; GUESS SHELL COMMAND.
  
  ;;; Brief Description:
*************** dired."
*** 891,895 ****
  ;;;
  ;;; * Return this command to `dired-guess-shell-command' which prompts user
! ;;;   with it.  The list of commands are temporaily put into the history list.
  ;;;   If a command is used successfully then it is stored permanently in
  ;;;   `dired-shell-command-history'.
--- 892,896 ----
  ;;;
  ;;; * Return this command to `dired-guess-shell-command' which prompts user
! ;;;   with it.  The list of commands is temporarily put into the history list.
  ;;;   If a command is used successfully then it is stored permanently in
  ;;;   `dired-shell-command-history'.
*************** You can set this variable in your ~/.ema
*** 1114,1118 ****
  
  
! ;;;; RELATIVE SYMBOLIC LINKS.
  
  (defvar dired-keep-marker-relsymlink ?S
--- 1115,1119 ----
  
  
! ;;; RELATIVE SYMBOLIC LINKS.
  
  (defvar dired-keep-marker-relsymlink ?S
*************** results in
*** 1145,1149 ****
                    ;; string-match.
                    ;; E.g., consider the case of linking "/tmp/a/abc"
!                   ;; to "/tmp/abc" erronously giving "/tmp/a" instead
                    ;; of "/tmp/" as common initial component
                    (string-equal (substring file1 0 next)
--- 1146,1150 ----
                    ;; string-match.
                    ;; E.g., consider the case of linking "/tmp/a/abc"
!                   ;; to "/tmp/abc" erroneously giving "/tmp/a" instead
                    ;; of "/tmp/" as common initial component
                    (string-equal (substring file1 0 next)
*************** for more info."
*** 1197,1201 ****
  
  
! ;;;; VISIT ALL MARKED FILES SIMULTANEOUSLY.
  
  ;;; Brief Description:
--- 1198,1202 ----
  
  
! ;;; VISIT ALL MARKED FILES SIMULTANEOUSLY.
  
  ;;; Brief Description:
*************** To display just marked files, type \\[de
*** 1279,1283 ****
  
  
! ;;;; MISCELLANEOUS COMMANDS.
  
  ;;; Run man on files.
--- 1280,1284 ----
  
  
! ;;; MISCELLANEOUS COMMANDS.
  
  ;;; Run man on files.
*************** See also variable `dired-vm-read-only-fo
*** 1335,1339 ****
  
  
! ;;;; MISCELLANEOUS INTERNAL FUNCTIONS.
  
  (or (fboundp 'dired-old-find-buffer-nocreate)
--- 1336,1340 ----
  
  
! ;;; MISCELLANEOUS INTERNAL FUNCTIONS.
  
  (or (fboundp 'dired-old-find-buffer-nocreate)
*************** PREDICATE is a lisp expression that can 
*** 1415,1419 ****
      inode  [integer] the inode of the file (only for ls -i output)
      s      [integer] the size of the file for ls -s output
!                      (ususally in blocks or, with -k, in KByte)
      mode   [string]  file permission bits, e.g. \"-rw-r--r--\"
      nlink  [integer] number of links to file
--- 1416,1420 ----
      inode  [integer] the inode of the file (only for ls -i output)
      s      [integer] the size of the file for ls -s output
!                      (usually in blocks or, with -k, in KByte)
      mode   [string]  file permission bits, e.g. \"-rw-r--r--\"
      nlink  [integer] number of links to file
*************** to mark all zero length files."
*** 1498,1502 ****
  
  
! ;;;; FIND FILE AT POINT.
  
  (defvar dired-x-hands-off-my-keys t
--- 1499,1503 ----
  
  
! ;;; FIND FILE AT POINT.
  
  (defvar dired-x-hands-off-my-keys t
*************** to test if that file exists.  Use minibu
*** 1610,1614 ****
  
  
! ;;;; BUG REPORTS
  
  ;;; This section is provided for reports.  It uses Barry A. Warsaw's
--- 1611,1615 ----
  
  
! ;;; BUG REPORTS
  
  ;;; This section is provided for reports.  It uses Barry A. Warsaw's
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/dired.el emacs-19.31/lisp/dired.el
*** emacs-19.30/lisp/dired.el	Tue Sep 12 19:14:38 1995
--- emacs-19.31/lisp/dired.el	Fri Apr  5 14:10:39 1996
***************
*** 1,5 ****
  ;;; dired.el --- directory-browsing commands
  
! ;; Copyright (C) 1985, 1986, 1992, 1993, 1994 Free Software Foundation, Inc.
  
  ;; Author: Sebastian Kremer <sk@thp.uni-koeln.de>
--- 1,5 ----
  ;;; dired.el --- directory-browsing commands
  
! ;; Copyright (C) 1985, 86, 92, 93, 94, 95, 1996 Free Software Foundation, Inc.
  
  ;; Author: Sebastian Kremer <sk@thp.uni-koeln.de>
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** may contain even `F', `b', `i' and `s'. 
*** 48,52 ****
  ;;;###autoload
  (defvar dired-chown-program
!   (if (memq system-type '(hpux dgux usg-unix-v irix linux))
        "chown" "/etc/chown")
    "Name of chown command (usually `chown' or `/etc/chown').")
--- 49,53 ----
  ;;;###autoload
  (defvar dired-chown-program
!   (if (memq system-type '(hpux dgux usg-unix-v irix linux lignux))
        "chown" "/etc/chown")
    "Name of chown command (usually `chown' or `/etc/chown').")
*************** may contain even `F', `b', `i' and `s'. 
*** 60,64 ****
  (defvar dired-ls-F-marks-symlinks nil
    "*Informs dired about how `ls -lF' marks symbolic links.
! Set this to t if `insert-directory-program' with `-lF' marks the symbolic link
  itself with a trailing @ (usually the case under Ultrix).
  
--- 61,66 ----
  (defvar dired-ls-F-marks-symlinks nil
    "*Informs dired about how `ls -lF' marks symbolic links.
! Set this to t if `ls' (or whatever program is specified by
! `insert-directory-program') with `-lF' marks the symbolic link
  itself with a trailing @ (usually the case under Ultrix).
  
*************** Optional second argument SWITCHES specif
*** 346,350 ****
  Dired displays a list of files in DIRNAME (which may also have
  shell wildcards appended to select certain files).  If DIRNAME is a cons,
! its first element is taken as the directory name and the resr as an explicit
  list of files to make directory entries for.
  \\<dired-mode-map>\
--- 348,352 ----
  Dired displays a list of files in DIRNAME (which may also have
  shell wildcards appended to select certain files).  If DIRNAME is a cons,
! its first element is taken as the directory name and the rest as an explicit
  list of files to make directory entries for.
  \\<dired-mode-map>\
*************** If DIRNAME is already in a dired buffer,
*** 385,388 ****
--- 387,392 ----
      (setq dirname (abbreviate-file-name
  		   (expand-file-name (directory-file-name dirname))))
+     (if find-file-visit-truename
+ 	(setq dirname (file-truename dirname)))
      (if (file-directory-p dirname)
  	(setq dirname (file-name-as-directory dirname)))
*************** If DIRNAME is already in a dired buffer,
*** 435,441 ****
  			      (= (nth 1 (nth 5 attributes)) (cdr modtime)))))
  		   nil
! 		 (message
! 		  (substitute-command-keys
! 		   "Directory has changed on disk; type \\[revert-buffer] to update Dired")))))
        ;; Else a new buffer
        (setq default-directory
--- 439,445 ----
  			      (= (nth 1 (nth 5 attributes)) (cdr modtime)))))
  		   nil
! 		 (message "%s"
! 			  (substitute-command-keys
! 			   "Directory has changed on disk; type \\[revert-buffer] to update Dired")))))
        ;; Else a new buffer
        (setq default-directory
*************** If DIRNAME is already in a dired buffer,
*** 563,567 ****
--- 567,583 ----
    ;; list).
    (let ((opoint (point))
+ 	(process-environment (copy-sequence process-environment))
  	end)
+     ;; This makes sure that month names come out in English
+     ;; so we can find the start of the file name.
+     ;; But if the user has customized the way of finding the file name,
+     ;; this is not necessary.
+     (if (and (equal dired-move-to-filename-regexp
+ 		    dired-standard-move-to-filename-regexp)
+ 	     ;; It also isn't necessary if we'd use the C locale anyway.
+ 	     (not (equal (or (getenv "LC_ALL") (getenv "LC_TIME")
+ 			     (getenv "LANGUAGE") "C")
+ 			 "C")))
+ 	(setq process-environment (cons "LC_ALL=C" process-environment)))
      (if (consp dir-or-list)
  	;; In this case, use the file names in the cdr
*************** Optional arg NO-ERROR-IF-NOT-FILEP means
*** 1186,1190 ****
  			 ;; This is not needed for GNU ls, though.
  			 (or (dired-string-replace-match
! 			      "\\([^\\]\\)\"" file "\\1\\\\\"")
  			     file)
  			 "\"")))))
--- 1202,1206 ----
  			 ;; This is not needed for GNU ls, though.
  			 (or (dired-string-replace-match
! 			      "\\([^\\]\\|\\`\\)\"" file "\\1\\\\\"" nil t)
  			     file)
  			 "\"")))))
*************** Optional arg GLOBAL means to replace all
*** 1243,1246 ****
--- 1259,1266 ----
    "Regular expression to match a month abbreviation followed by a number.")
  
+ (defconst dired-standard-move-to-filename-regexp
+   "\\(Jan\\|Feb\\|Mar\\|Apr\\|May\\|Jun\\|Jul\\|Aug\\|Sep\\|Oct\\|Nov\\|Dec\\)[ ]+[0-9]+ [ 0-9][0-9][:0-9][0-9][ 0-9] "
+   "Regular expression to match a month abbreviation followed by a number.")
+ 
  ;; Move to first char of filename on this line.
  ;; Returns position (point) or nil if no filename on this line."
*************** A prefix argument says to unflag those f
*** 2013,2031 ****
  With prefix argument, unflag these files."
    (interactive "P")
!   (let ((dired-marker-char (if unflag-p ?\040 dired-del-marker)))
      (dired-mark-if
!      ;; It is less than general to check for ~ here,
       ;; but it's the only way this runs fast enough.
       (and (save-excursion (end-of-line)
! 			  (or
! 			   (eq (preceding-char) ?~)
! 			   ;; Handle executables in case of -F option.
! 			   ;; We need not worry about the other kinds
! 			   ;; of markings that -F makes, since they won't
! 			   ;; appear on real backup files.
! 			   (if (eq (preceding-char) ?*)
! 			       (progn
! 				 (forward-char -1)
! 				 (eq (preceding-char) ?~)))))
  	  (not (looking-at dired-re-dir))
  	  (let ((fn (dired-get-filename t t)))
--- 2033,2049 ----
  With prefix argument, unflag these files."
    (interactive "P")
!   (let ((dired-marker-char (if unflag-p ?\  dired-del-marker)))
      (dired-mark-if
!      ;; Don't call backup-file-name-p unless the last character looks like
!      ;; it might be the end of a backup file name.  This isn't very general,
       ;; but it's the only way this runs fast enough.
       (and (save-excursion (end-of-line)
! 			  ;; Handle executables in case of -F option.
! 			  ;; We need not worry about the other kinds
! 			  ;; of markings that -F makes, since they won't
! 			  ;; appear on real backup files.
! 			  (if (eq (preceding-char) ?*)
! 			      (forward-char -1))
! 			  (eq (preceding-char) ?~))
  	  (not (looking-at dired-re-dir))
  	  (let ((fn (dired-get-filename t t)))
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/disass.el emacs-19.31/lisp/disass.el
*** emacs-19.30/lisp/disass.el	Mon Oct 30 14:20:48 1995
--- emacs-19.31/lisp/disass.el	Mon Apr  8 11:36:21 1996
***************
*** 1,5 ****
  ;;; disass.el --- disassembler for compiled Emacs Lisp code
  
! ;;; Copyright (C) 1986, 1991 Free Software Foundation, Inc.
  
  ;; Author: Doug Cutting <doug@csli.stanford.edu>
--- 1,5 ----
  ;;; disass.el --- disassembler for compiled Emacs Lisp code
  
! ;; Copyright (C) 1986, 1991 Free Software Foundation, Inc.
  
  ;; Author: Doug Cutting <doug@csli.stanford.edu>
***************
*** 21,26 ****
  
  ;; 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:
--- 21,27 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** redefine OBJECT if it is a symbol."
*** 104,109 ****
  	   (setq args (car obj))	;save arg list
  	   (setq obj (cdr obj)))
! 	  (t
! 	   (setq args (aref obj 0))))
      (if (zerop indent) ; not a nested function
  	(progn
--- 105,111 ----
  	   (setq args (car obj))	;save arg list
  	   (setq obj (cdr obj)))
! 	  ((byte-code-function-p obj)
! 	   (setq args (aref obj 0)))
!           (t (error "Compilation failed")))
      (if (zerop indent) ; not a nested function
  	(progn
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/disp-table.el emacs-19.31/lisp/disp-table.el
*** emacs-19.30/lisp/disp-table.el	Tue Oct 10 22:39:44 1995
--- emacs-19.31/lisp/disp-table.el	Sun Jan 14 02:34:30 1996
***************
*** 21,26 ****
  
  ;; 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.
  
  ;;; Code:
--- 21,27 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Code:
***************
*** 48,52 ****
  (defun display-table-slot (display-table slot)
    "Return the value of the extra slot in DISPLAY-TABLE named SLOT.
! SLOT may be a number from 0 to 5 inclusive, or a slot name (symbol)."
    (let ((slot-number
  	 (if (numberp slot) slot
--- 49,55 ----
  (defun display-table-slot (display-table slot)
    "Return the value of the extra slot in DISPLAY-TABLE named SLOT.
! SLOT may be a number from 0 to 5 inclusive, or a slot name (symbol).
! Valid symbols are `truncation', `wrap', `escape', `control',
! `selective-display', and `vertical-border'."
    (let ((slot-number
  	 (if (numberp slot) slot
*************** SLOT may be a number from 0 to 5 inclusi
*** 59,63 ****
    "Set the value of the extra slot in DISPLAY-TABLE named SLOT to VALUE.
  SLOT may be a number from 0 to 5 inclusive, or a name (symbol).
! See `display-table-slot-name-alist' for the names and numbers."
    (let ((slot-number
  	 (if (numberp slot) slot
--- 62,67 ----
    "Set the value of the extra slot in DISPLAY-TABLE named SLOT to VALUE.
  SLOT may be a number from 0 to 5 inclusive, or a name (symbol).
! Valid symbols are `truncation', `wrap', `escape', `control',
! `selective-display', and `vertical-border'."
    (let ((slot-number
  	 (if (numberp slot) slot
*************** With prefix argument, enable European ch
*** 182,188 ****
  	  (and (null arg)
  	       (char-table-p standard-display-table)
! 	       (equal (aref standard-display-table 160) [160])))
        (standard-display-default 160 255)
!     (standard-display-8bit 160 255)))
  
  (provide 'disp-table)
--- 186,196 ----
  	  (and (null arg)
  	       (char-table-p standard-display-table)
! 	       ;; Test 161, because 160 displays as a space.
! 	       (equal (aref standard-display-table 161) [161])))
        (standard-display-default 160 255)
!     (standard-display-8bit 160 255)
!     ;; Make non-line-break space display as a plain space.
!     ;; Most X fonts do the wrong thing for code 160.
!     (aset standard-display-table 160 [32])))
  
  (provide 'disp-table)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/dissociate.el emacs-19.31/lisp/dissociate.el
*** emacs-19.30/lisp/dissociate.el	Tue Jul 26 11:51:24 1994
--- emacs-19.31/lisp/dissociate.el	Sun Jan 14 02:34:30 1996
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/docref.el emacs-19.31/lisp/docref.el
*** emacs-19.30/lisp/docref.el	Mon Oct 30 11:55:41 1995
--- emacs-19.31/lisp/docref.el	Sun Jan 14 02:34:30 1996
***************
*** 1,3 ****
--- 1,4 ----
  ;;; docref.el --- Simple cross references for Elisp documentation strings
+ 
  ;; Copyright (C) 1994 Free Software Foundation, Inc.
  
***************
*** 20,32 ****
  
  ;; 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:
! ;;
  ;; This package allows you to use a simple form of cross references in
  ;; your Emacs Lisp documentation strings. Cross-references look like
  ;; \\(type@[label@]data), where type defines a method for retrieving
! ;; reference informatin, data is used by a method routine as an argument,
  ;; and label "represents" the reference in text. If label is absent, data
  ;; is used instead.
--- 21,34 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
! 
  ;; This package allows you to use a simple form of cross references in
  ;; your Emacs Lisp documentation strings. Cross-references look like
  ;; \\(type@[label@]data), where type defines a method for retrieving
! ;; reference information, data is used by a method routine as an argument,
  ;; and label "represents" the reference in text. If label is absent, data
  ;; is used instead.
*************** highlight them with face defined by \\(v
*** 128,132 ****
  
  Cross-reference has the following format: \\ (TYPE[@LABEL]@DATA), where
! TYPE defines method used to retrive xref data (like reading from file or
  calling \\(f@describe-function)), DATA is an argument to this method
  \(like file name or function name), and LABEL is displayed in text using
--- 130,134 ----
  
  Cross-reference has the following format: \\ (TYPE[@LABEL]@DATA), where
! TYPE defines method used to retrieve xref data (like reading from file or
  calling \\(f@describe-function)), DATA is an argument to this method
  \(like file name or function name), and LABEL is displayed in text using
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/doctor.el emacs-19.31/lisp/doctor.el
*** emacs-19.30/lisp/doctor.el	Tue May  3 19:40:30 1994
--- emacs-19.31/lisp/doctor.el	Tue Apr 23 11:30:15 1996
***************
*** 1,5 ****
  ;;; doctor.el --- psychological help for frustrated users.
  
! ;; Copyright (C) 1985, 1987, 1994 Free Software Foundation, Inc.
  
  ;; Maintainer: FSF
--- 1,6 ----
  ;;; doctor.el --- psychological help for frustrated users.
+ ;;; (censored version--see below)
  
! ;; Copyright (C) 1985, 1987, 1994, 1996 Free Software Foundation, Inc.
  
  ;; Maintainer: FSF
***************
*** 19,24 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 28,31 ****
--- 30,43 ----
  ;; of pseudo-AI.
  
+ ;; This file has been censored by the Communications Decency Act.
+ ;; Some of its features were removed.  The law was promoted as a ban
+ ;; on pornography, but it bans far more than that.  The doctor program
+ ;; did not contain pornography, but part of it was prohibited
+ ;; nonetheless.
+ 
+ ;; For information on US government censorship of the Internet, and
+ ;; what you can do to bring back freedom of the press, see the web
+ ;; site http://www.vtw.org/
+ 
  ;;; Code:
  
*************** reads the sentence before point, and pri
*** 68,71 ****
--- 80,85 ----
    (turn-on-auto-fill)
    (doctor-type '(i am the psychotherapist \.
+ 		 for your protection, i have been censored according to
+ 		 the Communications Decency Act \.
  		 ($ please) ($ describe) your ($ problems) \.
  		 each time you are finished talking, type \R\E\T twice \.))
*************** reads the sentence before point, and pri
*** 224,228 ****
    (setq feelings-about
  	'((feelings about)
! 	  (aprehensions toward)
  	  (thoughts on)
  	  (emotions toward)))
--- 238,242 ----
    (setq feelings-about
  	'((feelings about)
! 	  (apprehensions toward)
  	  (thoughts on)
  	  (emotions toward)))
*************** reads the sentence before point, and pri
*** 603,607 ****
  (doctor-put-meaning pc 'mach)
  (doctor-put-meaning bitching 'foul)
- (doctor-put-meaning shit 'foul)
  (doctor-put-meaning bastard 'foul)
  (doctor-put-meaning damn 'foul)
--- 617,620 ----
*************** reads the sentence before point, and pri
*** 678,682 ****
  (doctor-put-meaning angry 'mood)
  (doctor-put-meaning mad 'mood)
- (doctor-put-meaning pissed 'mood)
  (doctor-put-meaning jealous 'mood)
  (doctor-put-meaning afraid 'fear)
--- 691,694 ----
*************** reads the sentence before point, and pri
*** 692,697 ****
  (doctor-put-meaning dick 'sexnoun)
  (doctor-put-meaning dicks 'sexnoun)
- (doctor-put-meaning cunt 'sexnoun)
- (doctor-put-meaning cunts 'sexnoun)
  (doctor-put-meaning prostitute 'sexnoun)
  (doctor-put-meaning condom 'sexnoun)
--- 704,707 ----
*************** reads the sentence before point, and pri
*** 751,759 ****
  (doctor-put-meaning whiskey 'alcohol)
  (doctor-put-meaning scotch 'alcohol)
- (doctor-put-meaning fuck 'sexverb)
- (doctor-put-meaning fucked 'sexverb)
  (doctor-put-meaning screw 'sexverb)
  (doctor-put-meaning screwing 'sexverb)
- (doctor-put-meaning fucking 'sexverb)
  (doctor-put-meaning rape 'sexverb)
  (doctor-put-meaning raped 'sexverb)
--- 761,766 ----
*************** reads the sentence before point, and pri
*** 762,766 ****
  (doctor-put-meaning kisses 'sexverb)
  (doctor-put-meaning screws 'sexverb)
- (doctor-put-meaning fucks 'sexverb)
  (doctor-put-meaning because 'conj)
  (doctor-put-meaning but 'conj)
--- 769,772 ----
*************** Otherwise call the Doctor to parse prece
*** 880,884 ****
    (cond
     ((equal sent '(foo))
!     (doctor-type '(bar! ($ please)($ continue))))
     ((member sent howareyoulst)
      (doctor-type '(i\'m ok \.  ($ describe) yourself \.)))
--- 886,890 ----
    (cond
     ((equal sent '(foo))
!     (doctor-type '(bar! ($ please)($ continue) \.)))
     ((member sent howareyoulst)
      (doctor-type '(i\'m ok \.  ($ describe) yourself \.)))
*************** the subject noun, and return the portion
*** 1076,1081 ****
  		explain explained explains
  		fart farts feel feels felt fight fights find finds finding
! 		forget forgets forgot fought found fuck fucked
! 		fucking fucks
  		gave get gets getting give gives go goes going gone got gotten
  		had harm harms has hate hated hates have having
--- 1082,1086 ----
  		explain explained explains
  		fart farts feel feels felt fight fights find finds finding
! 		forget forgets forgot fought found
  		gave get gets getting give gives go goes going gone got gotten
  		had harm harms has hate hated hates have having
*************** the subject noun, and return the portion
*** 1218,1222 ****
  		bad beautiful best better but certain clear
  		ever every fantastic fun funny
! 		good great gross growdy however if ignorant
  		less linked losing lusing many more much
  		never nice obnoxious often poor pretty real related rich
--- 1223,1227 ----
  		bad beautiful best better but certain clear
  		ever every fantastic fun funny
! 		good great grody gross however if ignorant
  		less linked losing lusing many more much
  		never nice obnoxious often poor pretty real related rich
*************** Hack on previous word, setting global va
*** 1621,1625 ****
  (defun doctor-strangelove ()
    (interactive)
!   (insert "Mein fuhrer!!\n")
    (doctor-read-print))
  
--- 1626,1630 ----
  (defun doctor-strangelove ()
    (interactive)
!   (insert "Mein fuehrer!!\n")
    (doctor-read-print))
  
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/dos-fns.el emacs-19.31/lisp/dos-fns.el
*** emacs-19.30/lisp/dos-fns.el	Fri Nov 10 12:53:01 1995
--- emacs-19.31/lisp/dos-fns.el	Sat May 18 16:07:57 1996
***************
*** 1,5 ****
  ;;; dos-fns.el --- MS-Dos specific functions.
  
! ;; Copyright (C) 1991, 1993 Free Software Foundation, Inc.
  
  ;; Maintainer: Morten Welinder (terra@diku.dk)
--- 1,5 ----
  ;;; dos-fns.el --- MS-Dos specific functions.
  
! ;; Copyright (C) 1991, 1993, 1995, 1996 Free Software Foundation, Inc.
  
  ;; Maintainer: Morten Welinder (terra@diku.dk)
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 43,46 ****
--- 44,97 ----
    '(("^\\(\\([a-zA-Z]:\\)?[^:( \t\n]+\\)[:( \t]+\\([0-9]+\\)[:) \t]" 1 3)))
  
+ ;; This overrides a trivial definition in files.el.
+ (defun convert-standard-filename (filename)
+   "Convert a standard file's name to something suitable for the current OS.
+ This function's standard definition is trivial; it just returns the argument.
+ However, on some systems, the function is redefined
+ with a definition that really does change some file names."
+   (if (or (msdos-long-file-names)
+ 	  (not (stringp filename))
+ 	  (member (file-name-nondirectory filename) '("" "." "..")))
+       filename
+     (let* ((dir (file-name-directory filename))
+ 	   (string (copy-sequence (file-name-nondirectory filename)))
+ 	   (lastchar (aref string (1- (length string))))
+ 	   i firstdot)
+       ;; Change a leading period to a leading underscore.
+       (if (= (aref string 0) ?.)
+ 	  (aset string 0 ?_))
+       ;; Get rid of invalid characters.
+       (while (setq i (string-match
+ 		      "[^-a-zA-Z0-9_.%~^$!#&{}@`'()\200-\376]"
+ 		      string))
+ 	(aset string i ?_))
+       ;; If we don't have a period,
+       ;; and we have a dash or underscore that isn't the first char,
+       ;; change that to a period.
+       (if (and (not (string-match "\\." string))
+ 	       (setq i (string-match "[-_]" string 1)))
+ 	  (aset string i ?\.))
+       ;; If we don't have a period in the first 8 chars, insert one.
+       (if (> (or (string-match "\\." string)
+ 		 (length string))
+ 	     8)
+ 	  (setq string
+ 		(concat (substring string 0 8)
+ 			"."
+ 			(substring string 8))))
+       (setq firstdot (or (string-match "\\." string) (1- (length string))))
+       ;; Truncate to 3 chars after the first period.
+       (if (> (length string) (+ firstdot 4))
+ 	  (setq string (substring string 0 (+ firstdot 4))))
+       ;; Change all periods except the first one into underscores.
+       (while (string-match "\\." string (1+ firstdot))
+ 	(setq i (string-match "\\." string (1+ firstdot)))
+ 	(aset string i ?_))
+       ;; If the last character of the original filename was `~',
+       ;; make sure the munged name ends with it also.
+       (if (equal lastchar ?~)
+ 	  (aset string (1- (length string)) lastchar))
+       (concat dir string))))
+ 
  (defvar file-name-buffer-file-type-alist
    '(
*************** against the file name, and TYPE is nil f
*** 153,154 ****
--- 204,292 ----
    "Select FRAME for input events."
    (selected-frame))
+ 
+ ;; Support for printing under MS-DOS, see lpr.el and ps-print.el.
+ (defvar dos-printer "PRN"
+   "*The name of a local MS-DOS device to which data is sent for printing.
+ \(Note that PostScript files are sent to `dos-ps-printer', which see.\)
+ 
+ Typical non-default settings would be \"LPT1\" to \"LPT3\" for
+ parallel printers, or \"COM1\" to \"COM4\" or \"AUX\" for serial
+ printers.  You can also set it to a name of a file, in which
+ case the output gets appended to that file.
+ If you want to discard the printed output, set this to \"NUL\".")
+ 
+ (defun dos-print-region-function (start end
+ 					&optional lpr-prog
+ 					delete-text buf display rest)
+   "MS-DOS-specific function to print the region on a printer.
+ Writes the region to the device or file which is a value of
+ `dos-printer' \(which see\).  Ignores any arguments beyond
+ START and END."
+ 
+   (write-region start end dos-printer t 0)
+   ;; Make each print-out start on a new page, but don't waste
+   ;; paper if there was a form-feed at the end of this file.
+   (if (not (char-equal (char-after (1- end)) ?\C-l))
+       (write-region "\f" nil dos-printer t 0)))
+ 
+ ;; Set this to nil if you have a port of the `lpr' program and
+ ;; you want to use it for printing.  If the default setting is
+ ;; in effect, `lpr-command' and its switches are ignored when
+ ;; printing with `lpr-xxx' and `print-xxx'.
+ (setq print-region-function 'dos-print-region-function)
+ 
+ ;; Set this to nil if you have a port of the `pr' program
+ ;; (e.g., from GNU Textutils), or if you have an `lpr'
+ ;; program (see above) that can print page headers.
+ ;; If `lpr-headers-switches' is non-nil (the default) and
+ ;; `print-region-function' is set to `dos-print-region-function',
+ ;; then requests to print page headers will be silently
+ ;; ignored, and `print-buffer' and `print-region' produce
+ ;; the same output as `lpr-buffer' and `lpr-region', accordingly.
+ (setq lpr-headers-switches "(page headers are not supported)")
+ 
+ (defvar dos-ps-printer "PRN"
+   "*Method for printing PostScript files under MS-DOS.
+ 
+ If the value is a string, then it is taken as the name of the
+ device to which PostScript files are written.  By default it
+ is the default printer device; typical non-default settings
+ would be \"LPT1\" to \"LPT3\" for parallel printers, or \"COM1\"
+ to \"COM4\" or \"AUX\" for serial printers.  You can also set it
+ to a name of a file, in which case the output gets appended
+ to that file.  \(Note that `ps-print' package already has
+ facilities for printing to a file, so you might as well use
+ them instead of changing the setting of this variable.\)  If
+ you want to silently discard the printed output, set this to \"NUL\".
+ 
+ If the value is anything but a string, PostScript files will be
+ piped to the program given by `ps-lpr-command', with switches
+ given by `ps-lpr-switches', which see.")
+ 
+ (setq ps-lpr-command "gs")
+ 
+ (setq ps-lpr-switches '("-q" "-dNOPAUSE" "-sDEVICE=epson" "-r240x60"
+ 			  "-sOutputFile=LPT1" "-"))
+ 
+ ;; Backward compatibility for obsolescent functions which
+ ;; set screen size.
+ 
+ (defun mode25 ()
+   "Changes the number of screen rows to 25."
+   (interactive)
+   (set-frame-size (selected-frame) 80 25))
+ 
+ (defun mode4350 ()
+   "Changes the number of rows to 43 or 50.
+ Emacs always tries to set the screen height to 50 rows first.
+ If this fails, it will try to set it to 43 rows, on the assumption
+ that your video hardware might not support 50-line mode."
+   (interactive)
+   (set-frame-size (selected-frame) 80 50)
+   (if (eq (frame-height (selected-frame)) 50)
+       nil  ; the original built-in function returned nil
+     (set-frame-size (selected-frame) 80 43)))
+ 
+ (provide 'dos-fns)
+ 
+ ; dos-fns.el ends here
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/double.el emacs-19.31/lisp/double.el
*** emacs-19.30/lisp/double.el	Mon Oct 30 11:56:11 1995
--- emacs-19.31/lisp/double.el	Sun Jan 14 02:34:30 1996
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 34,38 ****
  ;; keys on a US keyboard to generate characters according to the local
  ;; keyboard convention when pressed once, and according to US keyboard
! ;; convetion when pressed twice. 
  ;;
  ;; To use this mode, you must define the variable `double-map' and
--- 35,39 ----
  ;; keys on a US keyboard to generate characters according to the local
  ;; keyboard convention when pressed once, and according to US keyboard
! ;; convention when pressed twice. 
  ;;
  ;; To use this mode, you must define the variable `double-map' and
***************
*** 43,49 ****
  ;; using ISO Latin 1 on a US keyboard.
  ;;
! ;; Imprtant node: While I would like to hear comments, bug reports,
  ;; suggestions, please do @strong{not} expect me to put other mappings
! ;; that the default into this file.  There are billions and billions
  ;; of such mappings, and just supporting the most common would
  ;; increase the size of this nice small file manyfold.
--- 44,50 ----
  ;; using ISO Latin 1 on a US keyboard.
  ;;
! ;; Important node: While I would like to hear comments, bug reports,
  ;; suggestions, please do @strong{not} expect me to put other mappings
! ;; than the default into this file.  There are billions and billions
  ;; of such mappings, and just supporting the most common would
  ;; increase the size of this nice small file manyfold.
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/dunnet.el emacs-19.31/lisp/dunnet.el
*** emacs-19.30/lisp/dunnet.el	Thu Sep 14 11:23:34 1995
--- emacs-19.31/lisp/dunnet.el	Sun Mar  3 18:43:12 1996
***************
*** 1,9 ****
  ;;; dunnet.el --- Text adventure for Emacs
  
  ;; Author: Ron Schnell <ronnie@media.mit.edu>
  ;; Created: 25 Jul 1992
  ;; Version: 2.0
  ;; Keywords: games
- ;; Copyright (C) 1992, 1993 Free Software Foundation, Inc.
  
  ;; This file is part of GNU Emacs.
--- 1,10 ----
  ;;; dunnet.el --- Text adventure for Emacs
  
+ ;; Copyright (C) 1992, 1993 Free Software Foundation, Inc.
+ 
  ;; Author: Ron Schnell <ronnie@media.mit.edu>
  ;; Created: 25 Jul 1992
  ;; Version: 2.0
  ;; Keywords: games
  
  ;; This file is part of GNU Emacs.
***************
*** 20,25 ****
  
  ;; 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:
--- 21,27 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 30,43 ****
  ;;; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
  ;;;  The log file should be set for your system, and it must
! ;;;  be writeable by all.
  
  
!       (defvar dun-log-file "/usr/local/dunnet.score"
! 	"Name of file to store score information for dunnet.")
  
  (if nil
      (eval-and-compile (setq byte-compile-warnings nil)))
  
! (require 'cl)
  
  ;;;; Mode definitions for interactive mode
--- 32,46 ----
  ;;; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
  ;;;  The log file should be set for your system, and it must
! ;;;  be writable by all.
  
  
! (defvar dun-log-file "/usr/local/dunnet.score"
!   "Name of file to store score information for dunnet.")
  
  (if nil
      (eval-and-compile (setq byte-compile-warnings nil)))
  
! (eval-when-compile
!  (require 'cl))
  
  ;;;; Mode definitions for interactive mode
***************
*** 47,50 ****
--- 50,55 ----
    (interactive)
    (text-mode)
+   (make-local-variable 'scroll-step)
+   (setq scroll-step 2)
    (use-local-map dungeon-mode-map)
    (setq major-mode 'dungeon-mode)
***************
*** 86,89 ****
--- 91,96 ----
    (interactive)
    (switch-to-buffer "*dungeon*")
+   (insert "This version of Dunnet has been censored for your protection
+ in accord with the Communications Decency Act.\n\n")
    (dun-mode)
    (setq dun-dead nil)
*************** huge rocks sliding down from the ceiling
*** 791,795 ****
    (if (= dun-sauna-level 0)
        (dun-mprincl 
!        "The termperature has returned to normal room termperature."))
    (if (= dun-sauna-level 1)
        (dun-mprincl "It is now luke warm in here.  You begin to sweat."))
--- 798,802 ----
    (if (= dun-sauna-level 0)
        (dun-mprincl 
!        "The temperature has returned to normal room temperature."))
    (if (= dun-sauna-level 1)
        (dun-mprincl "It is now luke warm in here.  You begin to sweat."))
*************** If you have questions or comments, pleas
*** 928,932 ****
      (dun-replace dun-room-objects urinal nil)))
  
! (defun dun-piss (args)
    (if (not (= dun-current-room bathroom))
        (dun-mprincl "You can't do that here, don't even bother trying.")
--- 935,939 ----
      (dun-replace dun-room-objects urinal nil)))
  
! (defun dun-urinate (args)
    (if (not (= dun-current-room bathroom))
        (dun-mprincl "You can't do that here, don't even bother trying.")
*************** A hole leads north."
*** 1925,1929 ****
  		     (score . dun-score) (help . dun-help) (quit . dun-quit) 
  		     (read . dun-examine) (verbose . dun-long) 
! 		     (urinate . dun-piss) (piss . dun-piss)
  		     (flush . dun-flush) (sleep . dun-sleep) (lie . dun-sleep) 
  		     (x . dun-examine) (break . dun-break) (drive . dun-drive)
--- 1932,1936 ----
  		     (score . dun-score) (help . dun-help) (quit . dun-quit) 
  		     (read . dun-examine) (verbose . dun-long) 
! 		     (urinate . dun-urinate)
  		     (flush . dun-flush) (sleep . dun-sleep) (lie . dun-sleep) 
  		     (x . dun-examine) (break . dun-break) (drive . dun-drive)
*************** nil
*** 2421,2426 ****
  		  nil (list obj-platinum) nil nil nil nil nil nil nil nil))
  
- (setq scroll-step 2)
- 
  (setq dun-room-shorts nil)
  (dolist (x dun-rooms)
--- 2428,2431 ----
*************** treasures for points?" "4" "four")
*** 2588,2592 ****
  Welcome to Unix\n
  Please clean up your directories.  The filesystem is getting full.
! Our tcp/ip link to gamma is a little flakey, but seems to work.
  The current version of ftp can only send files from the current
  directory, and deletes them after they are sent!  Be careful.
--- 2593,2597 ----
  Welcome to Unix\n
  Please clean up your directories.  The filesystem is getting full.
! Our tcp/ip link to gamma is a little flaky, but seems to work.
  The current version of ftp can only send files from the current
  directory, and deletes them after they are sent!  Be careful.
*************** drwxr-xr-x  3 root     staff          20
*** 2876,2880 ****
    
  (defun dun-cd (args)
!   (let (tcdpath tcdroom path-elemants room-check)
      (if (not (car args))
  	(dun-mprincl "Usage: cd <path>")
--- 2881,2885 ----
    
  (defun dun-cd (args)
!   (let (tcdpath tcdroom path-elements room-check)
      (if (not (car args))
  	(dun-mprincl "Usage: cd <path>")
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/easymenu.el emacs-19.31/lisp/easymenu.el
*** emacs-19.30/lisp/easymenu.el	Sat May 20 00:27:24 1995
--- emacs-19.31/lisp/easymenu.el	Sun Jan 14 02:34:30 1996
***************
*** 19,28 ****
  
  ;; 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.
! 
! ;;; This is compatible with easymenu.el by Per Abrahamsen
! ;;; but it is much simpler as it doesn't try to support other Emacs versions.
! ;;; The code was mostly derived from lmenu.el.
  
  ;;; Code:
--- 19,31 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
! 
! ;;; Commentary:
! 
! ;; This is compatible with easymenu.el by Per Abrahamsen
! ;; but it is much simpler as it doesn't try to support other Emacs versions.
! ;; The code was mostly derived from lmenu.el.
  
  ;;; Code:
*************** whenever this expression's value is non-
*** 68,72 ****
  NAME is a string; the name of an argument to CALLBACK.
  
!    :style 
     
  STYLE is a symbol describing the type of menu item.  The following are
--- 71,75 ----
  NAME is a string; the name of an argument to CALLBACK.
  
!    :style STYLE
     
  STYLE is a symbol describing the type of menu item.  The following are
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/ebuff-menu.el emacs-19.31/lisp/ebuff-menu.el
*** emacs-19.30/lisp/ebuff-menu.el	Mon Jul 17 16:54:13 1995
--- emacs-19.31/lisp/ebuff-menu.el	Wed Jan 24 19:25:36 1996
***************
*** 18,23 ****
  
  ;; 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:
--- 18,24 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** Does not execute select, save, or delete
*** 239,243 ****
    (interactive)
    (ding)
!   (message (if (and (eq (key-binding "\C-c\C-c") 'Electric-buffer-menu-quit)
  		    (eq (key-binding " ") 'Electric-buffer-menu-select)
  		    (eq (key-binding (char-to-string help-char)) 'Helper-help)
--- 240,245 ----
    (interactive)
    (ding)
!   (message "%s"
! 	   (if (and (eq (key-binding "\C-c\C-c") 'Electric-buffer-menu-quit)
  		    (eq (key-binding " ") 'Electric-buffer-menu-select)
  		    (eq (key-binding (char-to-string help-char)) 'Helper-help)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/echistory.el emacs-19.31/lisp/echistory.el
*** emacs-19.30/lisp/echistory.el	Fri May  6 21:54:32 1994
--- emacs-19.31/lisp/echistory.el	Sun Jan 14 02:34:30 1996
***************
*** 19,24 ****
  
  ;; 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.
  
  ;;; Code:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Code:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/edebug.el emacs-19.31/lisp/edebug.el
*** emacs-19.30/lisp/edebug.el	Sun Oct 15 12:10:04 1995
--- emacs-19.31/lisp/edebug.el	Wed Mar 20 08:31:01 1996
***************
*** 9,13 ****
  ;; edebug|Daniel LaLiberte|liberte@cs.uiuc.edu
  ;; |A source level debugger for Emacs Lisp.
! ;; |$Date: 1995/08/27 17:52:46 $|$Revision: 3.5.1.22 $|~/modes/edebug.el|
  
  ;; This file is part of GNU Emacs.
--- 9,13 ----
  ;; edebug|Daniel LaLiberte|liberte@cs.uiuc.edu
  ;; |A source level debugger for Emacs Lisp.
! ;; |$Date: 1996/03/20 13:30:16 $|$Revision: 3.6 $|~/modes/edebug.el|
  
  ;; This file is part of GNU Emacs.
***************
*** 24,88 ****
  
  ;; 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:
  
! ;;; This minor mode allows programmers to step through Emacs Lisp
! ;;; source code while executing functions.  You can also set
! ;;; breakpoints, trace (stopping at each expression), evaluate
! ;;; expressions as if outside Edebug, reevaluate and display a list of
! ;;; expressions, trap errors normally caught by debug, and display a
! ;;; debug style backtrace.
! 
! ;;;; Installation
! ;;; =============
! 
! ;;; Put edebug.el in some directory in your load-path and
! ;;; byte-compile it.  Also read the beginning of edebug-epoch.el, 
! ;;; cl-specs.el, and edebug-cl-read.el if they apply to you.
! 
! ;;; Unless you are using Emacs 19 which is already set up to use Edebug,
! ;;; put the following forms in your .emacs file.
! ;;; (define-key emacs-lisp-mode-map "\C-xx" 'edebug-eval-top-level-form)
! ;;; (autoload 'edebug-eval-top-level-form "edebug")
! 
! ;;; If you wish to change the default edebug global command prefix, change:
! ;;; (setq edebug-global-prefix "\C-xX")
! 
! ;;; Other options, are described in the manual.
! 
! ;;; In previous versions of Edebug, users were directed to set
! ;;; `debugger' to `edebug-debug'.  This is no longer necessary
! ;;; since Edebug automatically sets it whenever Edebug is active.
! 
! ;;;; Minimal Instructions
! ;;; =====================
! 
! ;;; First evaluate a defun with C-xx, then run the function.  Step
! ;;; through the code with SPC, mark breakpoints with b, go until a
! ;;; breakpoint is reached with g, and quit execution with q.  Use the
! ;;; "?" command in edebug to describe other commands.  See edebug.tex
! ;;; or the Emacs 19 Lisp Reference Manual for more instructions.
! 
! ;;; Send me your enhancements, ideas, bugs, or fixes.
! ;;; For bugs, you can call edebug-submit-bug-report if you have reporter.el.
! ;;; There is an edebug mailing list if you want to keep up
! ;;; with the latest developments. Requests to: edebug-request@cs.uiuc.edu
! 
! ;;; Daniel LaLiberte   217-398-4114
! ;;; University of Illinois, Urbana-Champaign
! ;;; Department of Computer Science
! ;;; 1304 W Springfield
! ;;; Urbana, IL  61801
  
! ;;; uiucdcs!liberte
! ;;; liberte@cs.uiuc.edu
! 
! ;;; ===============================
! ;;; For the early revision history, see edebug-history.
  
  (defconst edebug-version
!   (let ((raw-version "$Revision: 3.5.1.22 $"))
      (substring raw-version (string-match "[0-9.]*" raw-version)
  	       (match-end 0))))
--- 24,90 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
! 
! ;;; Commentary:
! 
! ;; This minor mode allows programmers to step through Emacs Lisp
! ;; source code while executing functions.  You can also set
! ;; breakpoints, trace (stopping at each expression), evaluate
! ;; expressions as if outside Edebug, reevaluate and display a list of
! ;; expressions, trap errors normally caught by debug, and display a
! ;; debug style backtrace.
! 
! ;;; Installation
! ;; =============
! 
! ;; Put edebug.el in some directory in your load-path and
! ;; byte-compile it.  Also read the beginning of edebug-epoch.el, 
! ;; cl-specs.el, and edebug-cl-read.el if they apply to you.
! 
! ;; Unless you are using Emacs 19 which is already set up to use Edebug,
! ;; put the following forms in your .emacs file.
! ;; (define-key emacs-lisp-mode-map "\C-xx" 'edebug-eval-top-level-form)
! ;; (autoload 'edebug-eval-top-level-form "edebug")
! 
! ;; If you wish to change the default edebug global command prefix, change:
! ;; (setq edebug-global-prefix "\C-xX")
! 
! ;; Other options, are described in the manual.
! 
! ;; In previous versions of Edebug, users were directed to set
! ;; `debugger' to `edebug-debug'.  This is no longer necessary
! ;; since Edebug automatically sets it whenever Edebug is active.
! 
! ;;; Minimal Instructions
! ;; =====================
! 
! ;; First evaluate a defun with C-xx, then run the function.  Step
! ;; through the code with SPC, mark breakpoints with b, go until a
! ;; breakpoint is reached with g, and quit execution with q.  Use the
! ;; "?" command in edebug to describe other commands.  See edebug.tex
! ;; or the Emacs 19 Lisp Reference Manual for more instructions.
! 
! ;; Send me your enhancements, ideas, bugs, or fixes.
! ;; For bugs, you can call edebug-submit-bug-report if you have reporter.el.
! ;; There is an edebug mailing list if you want to keep up
! ;; with the latest developments. Requests to: edebug-request@cs.uiuc.edu
! 
! ;; Daniel LaLiberte   217-398-4114
! ;; University of Illinois, Urbana-Champaign
! ;; Department of Computer Science
! ;; 1304 W Springfield
! ;; Urbana, IL  61801
  
! ;; uiucdcs!liberte
! ;; liberte@cs.uiuc.edu
  
! ;; For the early revision history, see edebug-history.
  
! ;;; Code:
  
  (defconst edebug-version
!   (let ((raw-version "$Revision: 3.6 $"))
      (substring raw-version (string-match "[0-9.]*" raw-version)
  	       (match-end 0))))
***************
*** 90,100 ****
  (require 'backquote)
  
! ;; Emacs 18 doesnt have defalias.
  (eval-and-compile
    (or (fboundp 'defalias) (fset 'defalias 'fset)))
  
  
! ;;;; Bug reporting
! ;;; ==============
  
  (defconst edebug-maintainer-address "liberte@cs.uiuc.edu")
--- 92,101 ----
  (require 'backquote)
  
! ;; Emacs 18 doesn't have defalias.
  (eval-and-compile
    (or (fboundp 'defalias) (fset 'defalias 'fset)))
  
  
! ;;; Bug reporting
  
  (defconst edebug-maintainer-address "liberte@cs.uiuc.edu")
***************
*** 124,130 ****
  	       ))))
  
! 
! ;;;; Options
! ;;; ===============================
  
  (defvar edebug-setup-hook nil
--- 125,129 ----
  	       ))))
  
! ;;; Options
  
  (defvar edebug-setup-hook nil
*************** After execution is resumed, the error is
*** 248,254 ****
  If the result is non-nil, then break.  Errors are ignored.")
  
! 
! ;;;; Form spec utilities.
! ;;; ===============================
  
  ;;;###autoload
--- 247,251 ----
  If the result is non-nil, then break.  Errors are ignored.")
  
! ;;; Form spec utilities.
  
  ;;;###autoload
*************** Both SYMBOL and SPEC are unevaluated. Th
*** 275,281 ****
      ))
  
! 
! ;;;; Utilities
! ;;; ===============================
  
  ;; Define edebug-gensym - from old cl.el
--- 272,276 ----
      ))
  
! ;;; Utilities
  
  ;; Define edebug-gensym - from old cl.el
*************** A lambda list keyword is a symbol that s
*** 326,330 ****
  (defun edebug-window-list ()
    "Return a list of windows, in order of `next-window'."
!   ;; This doesnt work for epoch.
    (let* ((first-window (selected-window))
  	 (window-list (list first-window))
--- 321,325 ----
  (defun edebug-window-list ()
    "Return a list of windows, in order of `next-window'."
!   ;; This doesn't work for epoch.
    (let* ((first-window (selected-window))
  	 (window-list (list first-window))
*************** Return the result of the last expression
*** 399,404 ****
  	   (narrow-to-region edebug:s-r-beg edebug:s-r-end))))))
  
! ;;;; Display
! ;;; ============
  
  (defconst edebug-trace-buffer "*edebug-trace*"
--- 394,398 ----
  	   (narrow-to-region edebug:s-r-beg edebug:s-r-end))))))
  
! ;;; Display
  
  (defconst edebug-trace-buffer "*edebug-trace*"
*************** Return the result of the last expression
*** 422,426 ****
      ;;      (message "next window: %s" (next-window)) (sit-for 1)
      (if (eq (get-buffer-window edebug-trace-buffer) (next-window))
! 	;; Dont select trace window
  	nil
        (select-window (next-window))))
--- 416,420 ----
      ;;      (message "next window: %s" (next-window)) (sit-for 1)
      (if (eq (get-buffer-window edebug-trace-buffer) (next-window))
! 	;; Don't select trace window
  	nil
        (select-window (next-window))))
*************** Return the result of the last expression
*** 494,503 ****
  
  
! ;;;; Redefine read and eval functions
! ;;; =================================
! ;;; read is redefined to maybe instrument forms.
! ;;; eval-defun is redefined to check edebug-all-forms and edebug-all-defs.
  
! ;;; Use the Lisp version of eval-region.
  (require 'eval-reg "eval-reg")
  
--- 488,496 ----
  
  
! ;;; Redefine read and eval functions
! ;; read is redefined to maybe instrument forms.
! ;; eval-defun is redefined to check edebug-all-forms and edebug-all-defs.
  
! ;; Use the Lisp version of eval-region.
  (require 'eval-reg "eval-reg")
  
*************** STREAM or the value of `standard-input' 
*** 518,522 ****
  
  This version, from Edebug, maybe instruments the expression. But the
! STREAM must be the current buffer to do so.  Whether it instuments is
  also dependent on the values of `edebug-all-defs' and
  `edebug-all-forms'."
--- 511,515 ----
  
  This version, from Edebug, maybe instruments the expression. But the
! STREAM must be the current buffer to do so.  Whether it instruments is
  also dependent on the values of `edebug-all-defs' and
  `edebug-all-forms'."
*************** also dependent on the values of `edebug-
*** 529,532 ****
--- 522,527 ----
      (defalias 'edebug-original-eval-defun (symbol-function 'eval-defun)))
  
+ ;; We should somehow arrange to be able to do this
+ ;; without actually replacing the eval-defun command.
  (defun edebug-eval-defun (edebug-it)
    "Evaluate the top-level form containing point, or after point.
*************** argument.  If instrumenting, it prints: 
*** 538,548 ****
  Otherwise, it prints in the minibuffer."
    (interactive "P")
!   (let ((edebugging (not (eq (not edebug-it) (not edebug-all-defs))))
! 	(edebug-result))
!     (setq edebug-result
! 	  (eval
! 	   (let ((edebug-all-forms edebugging)
! 		 (edebug-all-defs (eq edebug-all-defs (not edebug-it))))
! 	     (edebug-read-top-level-form))))
      (if (not edebugging)
  	(princ edebug-result)
--- 533,546 ----
  Otherwise, it prints in the minibuffer."
    (interactive "P")
!   (let* ((edebugging (not (eq (not edebug-it) (not edebug-all-defs))))
! 	 (edebug-result)
! 	 (form
! 	  (let ((edebug-all-forms edebugging)
! 		(edebug-all-defs (eq edebug-all-defs (not edebug-it))))
! 	    (edebug-read-top-level-form))))
!     (if (and (eq (car form) 'defvar)
! 	     (cdr-safe (cdr-safe form)))
! 	(setq form (cons 'defconst (cdr form))))
!     (setq edebug-result (eval form))
      (if (not edebugging)
  	(princ edebug-result)
*************** or if an error occurs, leave point after
*** 561,565 ****
    (interactive)
    (eval 
!    ;; Bind edebug-all-forms only while reading, not while evaling
     ;; but this causes problems while edebugging edebug.
     (let ((edebug-all-forms t)
--- 559,563 ----
    (interactive)
    (eval 
!    ;; Bind edebug-all-forms only while reading, not while evalling
     ;; but this causes problems while edebugging edebug.
     (let ((edebug-all-forms t)
*************** or if an error occurs, leave point after
*** 612,620 ****
  
  
! ;;;; Edebug internal data
! ;;; ===============================
  
! ;;; The internal data that is needed for edebugging is kept in the
! ;;; buffer-local variable `edebug-form-data'. 
  
  (make-variable-buffer-local 'edebug-form-data)
--- 610,617 ----
  
  
! ;;; Edebug internal data
  
! ;; The internal data that is needed for edebugging is kept in the
! ;; buffer-local variable `edebug-form-data'. 
  
  (make-variable-buffer-local 'edebug-form-data)
*************** or if an error occurs, leave point after
*** 697,704 ****
  	(setq edebug-form-data (delq entry edebug-form-data)))))
  
! 
! ;;;; Parser utilities
! ;;; ===============================
! 
  
  (defun edebug-syntax-error (&rest args)
--- 694,698 ----
  	(setq edebug-form-data (delq entry edebug-form-data)))))
  
! ;;; Parser utilities
  
  (defun edebug-syntax-error (&rest args)
*************** or if an error occurs, leave point after
*** 718,721 ****
--- 712,717 ----
      (aset table ?\) 'rparen)
      (aset table ?\' 'quote)
+     (aset table ?\` 'backquote)
+     (aset table ?\, 'comma)
      (aset table ?\" 'string)
      (aset table ?\? 'char)
*************** or if an error occurs, leave point after
*** 725,734 ****
      (aset table ?\# 'hash)
      ;; We treat numbers as symbols, because of confusion with -, -1, and 1-.
!     ;; We dont care about any other chars since they wont be seen.
      table))
  
  (defun edebug-next-token-class ()
    ;; Move to the next token and return its class.  We only care about
!   ;; lparen, rparen, dot, quote, string, char, vector, or symbol.
    (edebug-skip-whitespace)
    (aref edebug-read-syntax-table (following-char)))
--- 721,731 ----
      (aset table ?\# 'hash)
      ;; We treat numbers as symbols, because of confusion with -, -1, and 1-.
!     ;; We don't care about any other chars since they won't be seen.
      table))
  
  (defun edebug-next-token-class ()
    ;; Move to the next token and return its class.  We only care about
!   ;; lparen, rparen, dot, quote, backquote, comma, string, char, vector,
!   ;; or symbol.
    (edebug-skip-whitespace)
    (aref edebug-read-syntax-table (following-char)))
*************** or if an error occurs, leave point after
*** 767,776 ****
       ((eq class 'quote) (forward-char 1)
        (list 'quote (edebug-read-sexp)))
       (t ; anything else, just read it.
        (edebug-original-read (current-buffer))))))
  
! 
! ;;;; Offsets for reader
! ;;; ==============================
  
  ;; Define a structure to represent offset positions of expressions.
--- 764,775 ----
       ((eq class 'quote) (forward-char 1)
        (list 'quote (edebug-read-sexp)))
+      ((eq class 'backquote)
+       (list '\` (edebug-read-sexp)))
+      ((eq class 'comma)
+       (list '\, (edebug-read-sexp)))
       (t ; anything else, just read it.
        (edebug-original-read (current-buffer))))))
  
! ;;; Offsets for reader
  
  ;; Define a structure to represent offset positions of expressions.
*************** or if an error occurs, leave point after
*** 847,852 ****
  
  
! ;;;; Reader for Emacs Lisp.
! ;;; ==========================================
  ;; Uses edebug-next-token-class (and edebug-skip-whitespace) above.
  
--- 846,851 ----
  
  
! ;;; Reader for Emacs Lisp.
! 
  ;; Uses edebug-next-token-class (and edebug-skip-whitespace) above.
  
*************** or if an error occurs, leave point after
*** 856,859 ****
--- 855,860 ----
      (string . edebug-read-string)
      (quote . edebug-read-quote)
+     (backquote . edebug-read-backquote)
+     (comma . edebug-read-comma)
      (lbracket . edebug-read-vector)
      (hash . edebug-read-function)
*************** or if an error occurs, leave point after
*** 892,895 ****
--- 893,932 ----
     (edebug-read-storing-offsets stream)))
  
+ (defun edebug-read-backquote (stream)
+   ;; Turn `thing into (\` thing)
+   (let ((opoint (point)))
+     (forward-char 1)
+     ;; Generate the same structure of offsets we would have
+     ;; if the resulting list appeared verbatim in the input text.
+     (edebug-storing-offsets opoint
+       (list
+        (edebug-storing-offsets opoint  '\`)
+        (edebug-read-storing-offsets stream)))))
+ 
+ (defvar edebug-read-backquote-new nil
+   "Non-nil if reading the inside of a new-style backquote with no parens around it.
+ Value of nil means reading the inside of an old-style backquote construct
+ which is surrounded by an extra set of parentheses.
+ This controls how we read comma constructs.")
+ 
+ (defun edebug-read-comma (stream)
+   ;; Turn ,thing into (\, thing).  Handle ,@ and ,. also.
+   (let ((opoint (point)))
+     (forward-char 1)
+     (let ((symbol '\,))
+       (cond ((eq (following-char) ?\.)
+ 	     (setq symbol '\,\.)
+ 	     (forward-char 1))
+ 	    ((eq (following-char) ?\@)
+ 	     (setq symbol '\,@)
+ 	     (forward-char 1)))
+       ;; Generate the same structure of offsets we would have
+       ;; if the resulting list appeared verbatim in the input text.
+       (if edebug-read-backquote-new
+ 	  (list
+ 	   (edebug-storing-offsets opoint symbol)
+ 	   (edebug-read-storing-offsets stream))
+ 	(edebug-storing-offsets opoint symbol)))))
+ 
  (defun edebug-read-function (stream)
    ;; Turn #'thing into (function thing)
*************** or if an error occurs, leave point after
*** 907,911 ****
        (let ((elements))
  	(while (not (memq (edebug-next-token-class) '(rparen dot)))
! 	  (setq elements (cons (edebug-read-storing-offsets stream) elements)))
  	(setq elements (nreverse elements))
  	(if (eq 'dot (edebug-next-token-class))
--- 944,959 ----
        (let ((elements))
  	(while (not (memq (edebug-next-token-class) '(rparen dot)))
! 	  (if (eq (edebug-next-token-class) 'backquote)
! 	      (let ((edebug-read-backquote-new (not (null elements)))
! 		    (opoint (point)))
! 		(if edebug-read-backquote-new
! 		    (setq elements (cons (edebug-read-backquote stream) elements))
! 		  (forward-char 1)	; Skip backquote.
! 		  ;; Call edebug-storing-offsets here so that we
! 		  ;; produce the same offsets we would have had
! 		  ;; if the backquote were an ordinary symbol.
! 		  (setq elements (cons (edebug-storing-offsets opoint '\`)
! 				       elements))))
! 	    (setq elements (cons (edebug-read-storing-offsets stream) elements))))
  	(setq elements (nreverse elements))
  	(if (eq 'dot (edebug-next-token-class))
*************** or if an error occurs, leave point after
*** 932,939 ****
      ))
  
! 
! 
! ;;;; Cursors for traversal of list and vector elements with offsets.
! ;;;====================================================================
  
  (defvar edebug-dotted-spec nil)
--- 980,984 ----
      ))
  
! ;;; Cursors for traversal of list and vector elements with offsets.
  
  (defvar edebug-dotted-spec nil)
*************** or if an error occurs, leave point after
*** 1012,1038 ****
      offset))
  
! ;;;; The Parser
! ;;; ===============================
  
! ;;; The top level function for parsing forms is
! ;;; edebug-read-and-maybe-wrap-form; it calls all the rest.  It checks the
! ;;; syntax a bit and leaves point at any error it finds, but otherwise
! ;;; should appear to work like eval-defun.
! 
! ;;; The basic plan is to surround each expression with a call to
! ;;; the edebug debugger together with indexes into a table of positions of
! ;;; all expressions.  Thus an expression "exp" becomes:
! 
! ;;; (edebug-after (edebug-before 1) 2 exp)
! 
! ;;; When this is evaluated, first point is moved to the beginning of
! ;;; exp at offset 1 of the current function.  The expression is
! ;;; evaluated, which may cause more edebug calls, and then point is
! ;;; moved to offset 2 after the end of exp.
! 
! ;;; The highest level expressions of the function are wrapped in a call to
! ;;; edebug-enter, which supplies the function name and the actual
! ;;; arguments to the function.  See functions edebug-enter, edebug-before,
! ;;; and edebug-after for more details.
  
  ;; Dynamically bound vars, left unbound, but globally declared.
--- 1057,1082 ----
      offset))
  
! ;;; The Parser
  
! ;; The top level function for parsing forms is
! ;; edebug-read-and-maybe-wrap-form; it calls all the rest.  It checks the
! ;; syntax a bit and leaves point at any error it finds, but otherwise
! ;; should appear to work like eval-defun.
! 
! ;; The basic plan is to surround each expression with a call to
! ;; the edebug debugger together with indexes into a table of positions of
! ;; all expressions.  Thus an expression "exp" becomes:
! 
! ;; (edebug-after (edebug-before 1) 2 exp)
! 
! ;; When this is evaluated, first point is moved to the beginning of
! ;; exp at offset 1 of the current function.  The expression is
! ;; evaluated, which may cause more edebug calls, and then point is
! ;; moved to offset 2 after the end of exp.
! 
! ;; The highest level expressions of the function are wrapped in a call to
! ;; edebug-enter, which supplies the function name and the actual
! ;; arguments to the function.  See functions edebug-enter, edebug-before,
! ;; and edebug-after for more details.
  
  ;; Dynamically bound vars, left unbound, but globally declared.
*************** or if an error occurs, leave point after
*** 1065,1069 ****
  	edebug-top-window-data
  	edebug-def-name;; make sure it is locally nil
! 	;; I dont like these here!!
  	edebug-&optional
  	edebug-&rest
--- 1109,1113 ----
  	edebug-top-window-data
  	edebug-def-name;; make sure it is locally nil
! 	;; I don't like these here!!
  	edebug-&optional
  	edebug-&rest
*************** or if an error occurs, leave point after
*** 1089,1093 ****
  	defining-form-p
  	def-name
! 	;; These offset things dont belong here, but to support recursive
  	;; calls to edebug-read, they need to be here.
  	edebug-offsets
--- 1133,1137 ----
  	defining-form-p
  	def-name
! 	;; These offset things don't belong here, but to support recursive
  	;; calls to edebug-read, they need to be here.
  	edebug-offsets
*************** or if an error occurs, leave point after
*** 1183,1187 ****
        (, (if edebug-inside-func  
  	     (` (list (,@ 
! 		       ;; Doesnt work with more than one def-body!!
  		       ;; But the list will just be reversed.
  		       (nreverse edebug-def-args))))
--- 1227,1231 ----
        (, (if edebug-inside-func  
  	     (` (list (,@ 
! 		       ;; Doesn't work with more than one def-body!!
  		       ;; But the list will just be reversed.
  		       (nreverse edebug-def-args))))
*************** or if an error occurs, leave point after
*** 1212,1216 ****
    ;; Also increment the offset index for subsequent use.
    ;; if (not edebug-stop-before-symbols) and form is a symbol,
!   ;; then dont call edebug-before.
    (list 'edebug-after 
  	(list 'edebug-before before-index)
--- 1256,1260 ----
    ;; Also increment the offset index for subsequent use.
    ;; if (not edebug-stop-before-symbols) and form is a symbol,
!   ;; then don't call edebug-before.
    (list 'edebug-after 
  	(list 'edebug-before before-index)
*************** expressions; a `progn' form will be retu
*** 1401,1405 ****
  	 ((symbolp form)
  	  (cond
! 	   ;; Check for constant symbols that dont get wrapped.
  	   ((or (memq form '(t nil))
  		(and (fboundp 'edebug-keywordp) (edebug-keywordp form)))
--- 1445,1449 ----
  	 ((symbolp form)
  	  (cond
! 	   ;; Check for constant symbols that don't get wrapped.
  	   ((or (memq form '(t nil))
  		(and (fboundp 'edebug-keywordp) (edebug-keywordp form)))
*************** expressions; a `progn' form will be retu
*** 1490,1496 ****
        ))
  
! 
! ;;;; Matching of specs.
! ;;; ===================
  
  (defvar edebug-after-dotted-spec nil)
--- 1534,1538 ----
        ))
  
! ;;; Matching of specs.
  
  (defvar edebug-after-dotted-spec nil)
*************** expressions; a `progn' form will be retu
*** 1500,1505 ****
  
  
! ;;;; Failure to match 
! ;;; ==================
  ;; This throws to no-match, if there are higher alternatives.
  ;; Otherwise it signals an error.  The place of the error is found
--- 1542,1547 ----
  
  
! ;;; Failure to match 
! 
  ;; This throws to no-match, if there are higher alternatives.
  ;; Otherwise it signals an error.  The place of the error is found
*************** expressions; a `progn' form will be retu
*** 1589,1593 ****
  
  ;; Define specs for all the symbol specs with functions used to process them.
! ;; Perhaps we shouldnt be doing this with edebug-form-specs since the
  ;; user may want to define macros or functions with the same names.
  ;; We could use an internal obarray for these primitive specs.
--- 1631,1635 ----
  
  ;; Define specs for all the symbol specs with functions used to process them.
! ;; Perhaps we shouldn't be doing this with edebug-form-specs since the
  ;; user may want to define macros or functions with the same names.
  ;; We could use an internal obarray for these primitive specs.
*************** expressions; a `progn' form will be retu
*** 1707,1711 ****
  		       edebug-best-error
  		       edebug-error-point)
! 		   ;; Doesnt support e.g. &or symbolp &rest form
  		   (edebug-match-one-spec cursor (car specs)))))
  	;; Match failed, so reset and try again.
--- 1749,1753 ----
  		       edebug-best-error
  		       edebug-error-point)
! 		   ;; Doesn't support e.g. &or symbolp &rest form
  		   (edebug-match-one-spec cursor (car specs)))))
  	;; Match failed, so reset and try again.
*************** expressions; a `progn' form will be retu
*** 1736,1740 ****
    ;; Following specs must look like (<name> <spec>) ...
    ;; where <name> is the name of a keyword, and spec is its spec.
!   ;; This really doesnt save much over the expanded form and takes time.
    (edebug-match-&rest 
     cursor
--- 1778,1782 ----
    ;; Following specs must look like (<name> <spec>) ...
    ;; where <name> is the name of a keyword, and spec is its spec.
!   ;; This really doesn't save much over the expanded form and takes time.
    (edebug-match-&rest 
     cursor
*************** expressions; a `progn' form will be retu
*** 1840,1844 ****
  (defun edebug-match-&define (cursor specs)
    ;; Match a defining form.
!   ;; Normally, &define is interpretted specially other places.
    ;; This should only be called inside of a spec list to match the remainder
    ;; of the current list.  e.g. ("lambda" &define args def-body)
--- 1882,1886 ----
  (defun edebug-match-&define (cursor specs)
    ;; Match a defining form.
!   ;; Normally, &define is interpreted specially other places.
    ;; This should only be called inside of a spec list to match the remainder
    ;; of the current list.  e.g. ("lambda" &define args def-body)
*************** expressions; a `progn' form will be retu
*** 1962,1966 ****
  
  
! ;;;;* Emacs special forms and some functions.
  
  ;; quote expects only one argument, although it allows any number.
--- 2004,2008 ----
  
  
! ;;;* Emacs special forms and some functions.
  
  ;; quote expects only one argument, although it allows any number.
*************** expressions; a `progn' form will be retu
*** 1979,1983 ****
    (&define name lambda-list def-body))
  
! (def-edebug-spec arglist lambda-list)  ;; denegrated - use lambda-list.
  
  (def-edebug-spec lambda-list
--- 2021,2025 ----
    (&define name lambda-list def-body))
  
! (def-edebug-spec arglist lambda-list)  ;; deprecated - use lambda-list.
  
  (def-edebug-spec lambda-list
*************** expressions; a `progn' form will be retu
*** 2080,2084 ****
  
  
- ;;====================
  ;; Some miscellaneous specs for macros in public packages.
  ;; Send me yours.
--- 2122,2125 ----
*************** expressions; a `progn' form will be retu
*** 2098,2104 ****
  	   def-body))
  
! 
! ;;;; The debugger itself
! ;;; ===============================
  
  (defvar edebug-active nil)  ;; Non-nil when edebug is active
--- 2139,2143 ----
  	   def-body))
  
! ;;; The debugger itself
  
  (defvar edebug-active nil)  ;; Non-nil when edebug is active
*************** expressions; a `progn' form will be retu
*** 2167,2171 ****
  
  ;;; Handling signals
- ;;; =================
  
  (if (not (fboundp 'edebug-original-signal))
--- 2206,2209 ----
*************** error is signaled again."
*** 2196,2200 ****
  
  ;;; Entering Edebug
- ;;; ==================
  
  (defun edebug-enter (edebug-function edebug-args edebug-body)
--- 2234,2237 ----
*************** MSG is printed after `::::} '."
*** 2513,2518 ****
  
  	  ;; First move the edebug buffer point to edebug-point
! 	  ;; so that window start doesnt get changed when we display it.
! 	  ;; I dont know if this is going to help.
  	  ;;(set-buffer edebug-buffer)
  	  ;;(goto-char edebug-point)
--- 2550,2555 ----
  
  	  ;; First move the edebug buffer point to edebug-point
! 	  ;; so that window start doesn't get changed when we display it.
! 	  ;; I don't know if this is going to help.
  	  ;;(set-buffer edebug-buffer)
  	  ;;(goto-char edebug-point)
*************** MSG is printed after `::::} '."
*** 2609,2613 ****
  		  (progn
  		    ;; (setq edebug-execution-mode 'step)
! 		    ;; (edebug-overlay-arrow)	; this doesnt always show up.
  		    (edebug-recursive-edit))) ; <---------- Recursive edit
  
--- 2646,2650 ----
  		  (progn
  		    ;; (setq edebug-execution-mode 'step)
! 		    ;; (edebug-overlay-arrow)	; This doesn't always show up.
  		    (edebug-recursive-edit))) ; <---------- Recursive edit
  
*************** MSG is printed after `::::} '."
*** 2655,2659 ****
  			  ;; Unrestore edebug-buffer's window-point.
  			  ;; Needed in addition to setting the buffer point
! 			  ;; - otherwise quitting doesnt leave point as is.
  			  ;; But this causes point to not be restored at times.
  			  ;; Also, it may not be a visible window.
--- 2692,2696 ----
  			  ;; Unrestore edebug-buffer's window-point.
  			  ;; Needed in addition to setting the buffer point
! 			  ;; - otherwise quitting doesn't leave point as is.
  			  ;; But this causes point to not be restored at times.
  			  ;; Also, it may not be a visible window.
*************** MSG is printed after `::::} '."
*** 2675,2680 ****
  	    ;; Restore point, and mark.
  	    ;; Needed even if restoring windows because
! 	    ;; that doesnt restore point and mark in the current buffer.
! 	    ;; But dont restore point if edebug-buffer is current buffer.
  	    (if (not (eq edebug-buffer edebug-outside-buffer))
  		(goto-char edebug-outside-point))
--- 2712,2717 ----
  	    ;; Restore point, and mark.
  	    ;; Needed even if restoring windows because
! 	    ;; that doesn't restore point and mark in the current buffer.
! 	    ;; But don't restore point if edebug-buffer is current buffer.
  	    (if (not (eq edebug-buffer edebug-outside-buffer))
  		(goto-char edebug-outside-point))
*************** MSG is printed after `::::} '."
*** 2891,2895 ****
  
  ;;; Display related functions
- ;;; ===============================
  
  (defun edebug-adjust-window (old-start)
--- 2928,2931 ----
*************** The default is one second."
*** 3064,3070 ****
  	     (if already-displaying "off" "on"))))
  
- 
  ;;; Breakpoint related functions
- ;;; ===============================
  
  (defun edebug-find-stop-point ()
--- 3100,3104 ----
*************** The default is one second."
*** 3130,3134 ****
  			    (aref offset-vector (car breakpoint))))
  	      
! 	      (message (concat (if (nth 2 breakpoint)
  				   "Temporary " "")
  			       (if (car (cdr breakpoint))
--- 3164,3169 ----
  			    (aref offset-vector (car breakpoint))))
  	      
! 	      (message "%s"
! 		       (concat (if (nth 2 breakpoint)
  				   "Temporary " "")
  			       (if (car (cdr breakpoint))
*************** With prefix argument, make it a temporar
*** 3225,3229 ****
  
  ;;; Mode switching functions
- ;;; ===============================
  
  (defun edebug-set-mode (mode shortmsg msg)
--- 3260,3263 ----
*************** This is useful for exiting even if unwin
*** 3450,3454 ****
  
  
- ;;; -----------------------------------------------------------------
  ;;; The following initial mode setting definitions are not used yet.
  
--- 3484,3487 ----
*************** edebug-mode."
*** 3496,3502 ****
        )))
  
- 
  ;;; Evaluation of expressions
- ;;; ===============================
  
  (def-edebug-spec edebug-outside-excursion t)
--- 3529,3533 ----
*************** Return the result of the last expression
*** 3606,3611 ****
  			  (car (cdr edebug-err))))))
  
! ;;;; Printing
! ;;; =========
  ;; Replace printing functions.
  
--- 3637,3642 ----
  			  (car (cdr edebug-err))))))
  
! ;;; Printing
! 
  ;; Replace printing functions.
  
*************** Return the result of the last expression
*** 3689,3694 ****
    (message "%s" edebug-previous-result))
  
! ;;;; Read, Eval and Print
! ;;; =====================
  
  (defun edebug-eval-expression (edebug-expr)
--- 3720,3724 ----
    (message "%s" edebug-previous-result))
  
! ;;; Read, Eval and Print
  
  (defun edebug-eval-expression (edebug-expr)
*************** print value into current buffer."
*** 3723,3729 ****
      ))
  
! 
! ;;;; Edebug Minor Mode 
! ;;; ===============================
  
  ;; Global GUD bindings for all emacs-lisp-mode buffers.
--- 3753,3757 ----
      ))
  
! ;;; Edebug Minor Mode 
  
  ;; Global GUD bindings for all emacs-lisp-mode buffers.
*************** edebug-global-break-condition
*** 3888,3894 ****
    (use-local-map edebug-mode-map))
  
  
- ;;;; edebug eval list mode
- ;;; ===============================================
  ;; A list of expressions and their evaluations is displayed in *edebug*.
  
--- 3916,3921 ----
    (use-local-map edebug-mode-map))
  
+ ;;; edebug eval list mode
  
  ;; A list of expressions and their evaluations is displayed in *edebug*.
  
*************** Global commands prefixed by global-edebu
*** 4025,4031 ****
    (use-local-map edebug-eval-mode-map))
  
! 
! ;;;; Interface with standard debugger.
! ;;; ========================================
  
  ;; (setq debugger 'edebug) ; to use the edebug debugger
--- 4052,4056 ----
    (use-local-map edebug-eval-mode-map))
  
! ;;; Interface with standard debugger.
  
  ;; (setq debugger 'edebug) ; to use the edebug debugger
*************** show where we last were.  Otherwise call
*** 4106,4111 ****
  
  
! ;;;; Trace display
! ;; ===============================
  
  (defun edebug-trace-display (buf-name fmt &rest args)
--- 4131,4135 ----
  
  
! ;;; Trace display
  
  (defun edebug-trace-display (buf-name fmt &rest args)
*************** You must include newlines in FMT to brea
*** 4142,4147 ****
  
  
! ;;;; Frequency count and coverage
! ;;; ==============================
  
  (defun edebug-display-freq-count ()
--- 4166,4170 ----
  
  
! ;;; Frequency count and coverage
  
  (defun edebug-display-freq-count ()
*************** It is removed when you hit any char."
*** 4226,4231 ****
  
  
! ;;;; Menus
! ;;;=========
  
  (defun edebug-toggle (variable)
--- 4249,4253 ----
  
  
! ;;; Menus
  
  (defun edebug-toggle (variable)
*************** It is removed when you hit any char."
*** 4294,4299 ****
  
  
! ;;;; Emacs version specific code
! ;;;=============================
  ;;; The default for all above is Emacs 18, because it is easier to compile
  ;;; Emacs 18 code in Emacs 19 than vice versa.  This default will
--- 4316,4321 ----
  
  
! ;;; Emacs version specific code
! 
  ;;; The default for all above is Emacs 18, because it is easier to compile
  ;;; Emacs 18 code in Emacs 19 than vice versa.  This default will
*************** Print result in minibuffer."
*** 4405,4410 ****
  
  
! ;;;; Byte-compiler
! ;;; ====================
  ;; Extension for bytecomp to resolve undefined function references.
  ;; Requires new byte compiler.
--- 4427,4432 ----
  
  
! ;;; Byte-compiler
! 
  ;; Extension for bytecomp to resolve undefined function references.
  ;; Requires new byte compiler.
*************** Print result in minibuffer."
*** 4476,4480 ****
       ;; CL
       cl-macroexpand-all
!      ;; And believe it or not, the byte compiler doesnt know about:
       byte-compile-resolve-functions
       ))
--- 4498,4502 ----
       ;; CL
       cl-macroexpand-all
!      ;; And believe it or not, the byte compiler doesn't know about:
       byte-compile-resolve-functions
       ))
*************** Print result in minibuffer."
*** 4490,4495 ****
  
  
! ;;;; Autoloading of Edebug accessories
! ;;;===================================
  
  (if (featurep 'cl)
--- 4512,4516 ----
  
  
! ;;; Autoloading of Edebug accessories
  
  (if (featurep 'cl)
*************** Print result in minibuffer."
*** 4509,4514 ****
  
  
! ;;;; Finalize Loading
! ;;;===================
  
  ;;; Finally, hook edebug into the rest of Emacs.
--- 4530,4534 ----
  
  
! ;;; Finalize Loading
  
  ;;; Finally, hook edebug into the rest of Emacs.
*************** Print result in minibuffer."
*** 4521,4524 ****
  
  ;;; edebug.el ends here
- 
- 
--- 4541,4542 ----
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/ediff-diff.el emacs-19.31/lisp/ediff-diff.el
*** emacs-19.30/lisp/ediff-diff.el	Fri Oct 13 23:09:52 1995
--- emacs-19.31/lisp/ediff-diff.el	Mon May  6 19:16:44 1996
***************
*** 1,4 ****
  ;;; ediff-diff.el --- diff-related utilities
! ;;; Copyright (C) 1994, 1995 Free Software Foundation, Inc.
  
  ;; Author: Michael Kifer <kifer@cs.sunysb.edu>
--- 1,5 ----
  ;;; ediff-diff.el --- diff-related utilities
! 
! ;; Copyright (C) 1994, 1995 Free Software Foundation, Inc.
  
  ;; Author: Michael Kifer <kifer@cs.sunysb.edu>
***************
*** 17,22 ****
  
  ;; 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.
  
  (require 'ediff-init)
--- 18,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
! 
! ;;; Code:
  
  (require 'ediff-init)
***************
*** 25,28 ****
--- 29,33 ----
  (defvar ediff-shell
    (cond ((eq system-type 'emx) "cmd") ; OS/2
+ 	((eq system-type 'ms-dos) shell-file-name) ; no standard name on MS-DOS
  	((memq system-type '(vax-vms axp-vms)) "*dcl*") ; VMS
  	(t  "sh")) ; UNIX
*************** Lines that do not match are assumed to b
*** 82,86 ****
  ;;; Fine differences 
  
! (ediff-defvar-local ediff-auto-refine (if (ediff-window-display-p) 'on 'nix)
    "If `on', Ediff auto-highlights fine diffs for the current diff region.
  If `off', auto-highlighting is not used. If `nix', no fine diffs are shown
--- 87,91 ----
  ;;; Fine differences 
  
! (ediff-defvar-local ediff-auto-refine (if (ediff-has-face-support-p) 'on 'nix)
    "If `on', Ediff auto-highlights fine diffs for the current diff region.
  If `off', auto-highlighting is not used. If `nix', no fine diffs are shown
*************** one optional arguments, diff-number to r
*** 130,136 ****
  ;; ediff-setup-diff-regions3, which takes 4 arguments.
  (defun ediff-setup-diff-regions (file-A file-B file-C)
!   ;; Force all minibuffers to display ediff's messages.
!   ;; When xemacs implements minibufferless frames, this won't be necessary
!   (if ediff-xemacs-p (setq synchronize-minibuffers t))
  						  
    (or (ediff-buffer-live-p ediff-diff-buffer)
--- 135,141 ----
  ;; ediff-setup-diff-regions3, which takes 4 arguments.
  (defun ediff-setup-diff-regions (file-A file-B file-C)
! ;;;  ;; Force all minibuffers to display ediff's messages.
! ;;;  ;; When xemacs implements minibufferless frames, this won't be necessary
! ;;;  (if ediff-xemacs-p (setq synchronize-minibuffers t))
  						  
    (or (ediff-buffer-live-p ediff-diff-buffer)
*************** one optional arguments, diff-number to r
*** 146,151 ****
    (ediff-convert-diffs-to-overlays
     (ediff-extract-diffs
!     ediff-diff-buffer ediff-word-mode ediff-narrow-bounds))
!   )
       
  ;; If file-A/B/C is nil, do 2-way comparison with the non-nil buffers
--- 151,155 ----
    (ediff-convert-diffs-to-overlays
     (ediff-extract-diffs
!     ediff-diff-buffer ediff-word-mode ediff-narrow-bounds)))
       
  ;; If file-A/B/C is nil, do 2-way comparison with the non-nil buffers
*************** one optional arguments, diff-number to r
*** 157,163 ****
  	     (ediff-unique-buffer-name "*ediff-fine-diff" "*"))))
    
!   (let (diff3-job diff-program ok-regexp diff-list)
      (setq diff3-job ediff-3way-job
  	  diff-program (if diff3-job ediff-diff3-program ediff-diff-program)
  	  ok-regexp (if diff3-job
  			ediff-diff3-ok-lines-regexp
--- 161,168 ----
  	     (ediff-unique-buffer-name "*ediff-fine-diff" "*"))))
    
!   (let (diff3-job diff-program diff-options ok-regexp diff-list)
      (setq diff3-job ediff-3way-job
  	  diff-program (if diff3-job ediff-diff3-program ediff-diff-program)
+ 	  diff-options (if diff3-job ediff-diff3-options ediff-diff-options)
  	  ok-regexp (if diff3-job
  			ediff-diff3-ok-lines-regexp
*************** one optional arguments, diff-number to r
*** 166,169 ****
--- 171,175 ----
      (ediff-message-if-verbose "Refining difference region %d ..." (1+ reg-num))
      (ediff-exec-process diff-program ediff-fine-diff-buffer 'synchronize
+ 			diff-options
  			;; The shuffle below is because we can compare 3-way
  			;; or in several 2-way fashions, like fA fC, fA fB,
*************** one optional arguments, diff-number to r
*** 176,180 ****
    
      (ediff-prepare-error-list ok-regexp ediff-fine-diff-buffer)
!     ;;(ediff-message-if-verbose
      ;; "Refining difference region %d ... done" (1+ reg-num))
      
--- 182,187 ----
    
      (ediff-prepare-error-list ok-regexp ediff-fine-diff-buffer)
!     (ediff-message-if-verbose
!      "")
      ;; "Refining difference region %d ... done" (1+ reg-num))
      
*************** one optional arguments, diff-number to r
*** 461,473 ****
        (setq overlay (ediff-make-bullet-proof-overlay begin end buff))
        
-       ;; Priorities of overlays should be equal in all ediff control
-       ;; panel buffers. Otherwise it won't work due to Emacs
-       ;; bug, as insert-in-front-hooks will be called 
-       ;; only on behalf of the buffer with higher priority.
        (ediff-overlay-put overlay 'priority ediff-shadow-overlay-priority)
        (ediff-overlay-put overlay 'ediff-diff-num current-diff)
!       (ediff-overlay-put 
!        overlay 'insert-in-front-hooks '(ediff-insert-in-front))
!       (if (and (ediff-window-display-p)
  	       ediff-use-faces ediff-highlight-all-diffs)
  	  (ediff-set-overlay-face
--- 468,474 ----
        (setq overlay (ediff-make-bullet-proof-overlay begin end buff))
        
        (ediff-overlay-put overlay 'priority ediff-shadow-overlay-priority)
        (ediff-overlay-put overlay 'ediff-diff-num current-diff)
!       (if (and (ediff-has-face-support-p)
  	       ediff-use-faces ediff-highlight-all-diffs)
  	  (ediff-set-overlay-face
*************** one optional arguments, diff-number to r
*** 500,504 ****
    
    (if (< ediff-number-of-differences 1)
!       (error "No differences found"))
        
    (if ediff-word-mode
--- 501,505 ----
    
    (if (< ediff-number-of-differences 1)
!       (error "Sorry, it is not my job to munch identical variants..."))
        
    (if ediff-word-mode
*************** one optional arguments, diff-number to r
*** 666,673 ****
  ;; if fine diff vector is not set for diff N, then do nothing
  (defun ediff-set-fine-diff-properties (n &optional default)
!   (or (not (ediff-window-display-p))
        (< n 0)
        (>= n ediff-number-of-differences)
!       ;; in a window system, set faces and priorities of fine overlays
        (progn
  	(ediff-set-fine-diff-properties-in-one-buffer 'A n default)
--- 667,674 ----
  ;; if fine diff vector is not set for diff N, then do nothing
  (defun ediff-set-fine-diff-properties (n &optional default)
!   (or (not (ediff-has-face-support-p))
        (< n 0)
        (>= n ediff-number-of-differences)
!       ;; when faces are supported, set faces and priorities of fine overlays
        (progn
  	(ediff-set-fine-diff-properties-in-one-buffer 'A n default)
*************** one optional arguments, diff-number to r
*** 964,970 ****
  (defun ediff-setup-diff-regions3 (file-A file-B file-C)
    
!   ;; force all minibuffers to display ediff's messages.
!   ;; when xemacs implements minibufferless frames, this won't be necessary
!   (if ediff-xemacs-p (setq synchronize-minibuffers t))
  						  
    (or (ediff-buffer-live-p ediff-diff-buffer)
--- 965,971 ----
  (defun ediff-setup-diff-regions3 (file-A file-B file-C)
    
! ;;;  ;; force all minibuffers to display ediff's messages.
! ;;;  ;; when xemacs implements minibufferless frames, this won't be necessary
! ;;;  (if ediff-xemacs-p (setq synchronize-minibuffers t))
  						  
    (or (ediff-buffer-live-p ediff-diff-buffer)
*************** one optional arguments, diff-number to r
*** 985,992 ****
     
  
! ;; Execute PROGRAM asynchronously, unless OS/2 or unless SYNCH is non-nil.
! ;; BUFFER must be a buffer object, and must be alive.
! ;; All arguments in ARGS must be strings. The first arg may be a blank string,
! ;; in which case we delete it from ARGS list. We also delete nil from args.
  (defun ediff-exec-process (program buffer synch &rest args)
    (let ((data (match-data)))
--- 986,993 ----
     
  
! ;; Execute PROGRAM asynchronously, unless OS/2, Windows-*, or DOS, or unless
! ;; SYNCH is non-nil.  BUFFER must be a buffer object, and must be alive.  All
! ;; arguments in ARGS must be strings. The first arg may be a blank string, in
! ;; which case we delete it from ARGS list. We also delete nil from args.
  (defun ediff-exec-process (program buffer synch &rest args)
    (let ((data (match-data)))
*************** one optional arguments, diff-number to r
*** 1002,1007 ****
  	    (erase-buffer)
  	    (setq default-directory directory)
! 	    (if (or (eq system-type 'emx) synch)
! 		;; In OS/2 do it synchronously, since OS/2 doesn't let us
  		;; delete files used by other processes. Thus, in ediff-buffers
  		;; and similar functions, we can't delete temp files because
--- 1003,1009 ----
  	    (erase-buffer)
  	    (setq default-directory directory)
! 	    (if (or (memq system-type '(emx ms-dos windows-nt windows-95))
! 		    synch)
! 		;; In OS/2 (emx) do it synchronously, since OS/2 doesn't let us
  		;; delete files used by other processes. Thus, in ediff-buffers
  		;; and similar functions, we can't delete temp files because
*************** one optional arguments, diff-number to r
*** 1009,1012 ****
--- 1011,1017 ----
  		;; custom diffs. So, we have to wait till custom diff
  		;; subprocess is done.
+ 		;; Similarly for Windows-*
+ 		;; In DOS, must synchronize because DOS doesn't have
+ 		;; asynchronous processes.
  		(apply 'call-process program nil buffer nil args)
  	      ;; On other systems, do it asynchronously.
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/ediff-hook.el emacs-19.31/lisp/ediff-hook.el
*** emacs-19.30/lisp/ediff-hook.el	Mon Nov 20 18:00:43 1995
--- emacs-19.31/lisp/ediff-hook.el	Fri Feb 16 01:28:45 1996
***************
*** 1,4 ****
  ;;; ediff-hook.el --- setup for Ediff's menus and autoloads
! ;;; Copyright (C) 1995 Free Software Foundation, Inc.
  
  ;; Author: Michael Kifer <kifer@cs.sunysb.edu>
--- 1,5 ----
  ;;; ediff-hook.el --- setup for Ediff's menus and autoloads
! 
! ;; Copyright (C) 1995 Free Software Foundation, Inc.
  
  ;; Author: Michael Kifer <kifer@cs.sunysb.edu>
***************
*** 17,28 ****
  
  ;; 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.
  
  
  ;;;   These must be placed in menu-bar.el in Emacs
  ;;
  ;;      (define-key menu-bar-tools-menu [eregistry]
! ;;	'("List Ediff Sessions" . ediff-show-registry))
  ;;      (define-key menu-bar-tools-menu [epatch]
  ;;	'("Apply Patch" . menu-bar-epatch-menu))
--- 18,33 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
+ ;;; Code:
  
  ;;;   These must be placed in menu-bar.el in Emacs
  ;;
+ ;;      (define-key menu-bar-tools-menu [ediff-doc]
+ ;;	 '("Ediff Manual..." . ediff-documentation))
  ;;      (define-key menu-bar-tools-menu [eregistry]
! ;;	'("List Ediff Sessions..." . ediff-show-registry))
  ;;      (define-key menu-bar-tools-menu [epatch]
  ;;	'("Apply Patch" . menu-bar-epatch-menu))
***************
*** 44,101 ****
  	(add-menu-button
  	 '("Tools")
! 	 ["List Ediff Sessions" ediff-show-registry t] "OO-Browser...")
  	(add-menu-button
  	 '("Tools")
! 	 ["---" nil nil] "OO-Browser...")
  	)))
  
  
- 
  ;; explicit string-match is needed: ediff-xemacs-p is not defined at build time
  (cond ((string-match "XEmacs" emacs-version)
         (defvar ediff-menu
  	 '("Compare"
! 	   ["Two Files ..."  ediff-files t]
! 	   ["Two Buffers ..." ediff-buffers t]
! 	   ["Three Files ..."  ediff-files3 t]
! 	   ["Three Buffers ..." ediff-buffers3 t]
  	   "---"
! 	   ["Two Directories ..." ediff-directories t]
! 	   ["Three Directories ..." ediff-directories3 t]
  	   "---"
! 	   ["File with Revision ..."  ediff-revision t]
! 	   ["Directory Revisions ..."  ediff-directory-revisions t]
  	   "---"
! 	   ["Windows Word-by-word ..." ediff-windows-wordwise t]
! 	   ["Windows Line-by-line ..." ediff-windows-linewise t]
  	   "---"
! 	   ["Regions Word-by-word ..." ediff-regions-wordwise t]
! 	   ["Regions Line-by-line ..." ediff-regions-linewise t]))
         (defvar ediff-merge-menu
  	 '("Merge"
! 	   ["Files ..."  ediff-merge-files t]
! 	   ["Files with Ancestor ..." ediff-merge-files-with-ancestor t]
! 	   ["Buffers ..."  ediff-merge-buffers t]
! 	   ["Buffers with Ancestor ..."
  	    ediff-merge-buffers-with-ancestor t]
  	   "---"
! 	   ["Directories ..."  ediff-merge-directories t]
! 	   ["Directories with Ancestor ..."
  	    ediff-merge-directories-with-ancestor t]
  	   "---"
! 	   ["Revisions ..."  ediff-merge-revisions t]
! 	   ["Revisions with Ancestor ..."
  	    ediff-merge-revisions-with-ancestor t]
! 	   ["Directory Revisions ..." ediff-merge-directory-revisions t]
! 	   ["Directory Revisions with Ancestor ..."
! 	    ediff-merge-directory-revisions-with-ancestor t]))
         (defvar epatch-menu
  	 '("Apply Patch"
! 	   ["To a file ..."  ediff-patch-file t]
! 	   ["To a buffer ..." ediff-patch-buffer t]))
  
         ;; put these menus before Object-Oriented-Browser in Tools menu
         (add-hook 'before-init-hook 'ediff-xemacs-init-menus)
-        ;; this `if' is to be deleted before going into distribution
         (if (not purify-flag)
  	   (ediff-xemacs-init-menus))
--- 49,110 ----
  	(add-menu-button
  	 '("Tools")
! 	 ["List Ediff Sessions..." ediff-show-registry t] "OO-Browser...")
! 	(add-menu-button
! 	 '("Tools")
! 	 ["Ediff Manual..." ediff-documentation t] "OO-Browser...")
  	(add-menu-button
  	 '("Tools")
! 	 ["-------" nil nil] "OO-Browser...")
  	)))
  
  
  ;; explicit string-match is needed: ediff-xemacs-p is not defined at build time
  (cond ((string-match "XEmacs" emacs-version)
         (defvar ediff-menu
  	 '("Compare"
! 	   ["Two Files..."  ediff-files t]
! 	   ["Two Buffers..." ediff-buffers t]
! 	   ["Three Files..."  ediff-files3 t]
! 	   ["Three Buffers..." ediff-buffers3 t]
  	   "---"
! 	   ["Two Directories..." ediff-directories t]
! 	   ["Three Directories..." ediff-directories3 t]
  	   "---"
! 	   ["File with Revision..."  ediff-revision t]
! 	   ["Directory Revisions..."  ediff-directory-revisions t]
  	   "---"
! 	   ["Windows Word-by-word..." ediff-windows-wordwise t]
! 	   ["Windows Line-by-line..." ediff-windows-linewise t]
  	   "---"
! 	   ["Regions Word-by-word..." ediff-regions-wordwise t]
! 	   ["Regions Line-by-line..." ediff-regions-linewise t]
! 	   ))
         (defvar ediff-merge-menu
  	 '("Merge"
! 	   ["Files..."  ediff-merge-files t]
! 	   ["Files with Ancestor..." ediff-merge-files-with-ancestor t]
! 	   ["Buffers..."  ediff-merge-buffers t]
! 	   ["Buffers with Ancestor..."
  	    ediff-merge-buffers-with-ancestor t]
  	   "---"
! 	   ["Directories..."  ediff-merge-directories t]
! 	   ["Directories with Ancestor..."
  	    ediff-merge-directories-with-ancestor t]
  	   "---"
! 	   ["Revisions..."  ediff-merge-revisions t]
! 	   ["Revisions with Ancestor..."
  	    ediff-merge-revisions-with-ancestor t]
! 	   ["Directory Revisions..." ediff-merge-directory-revisions t]
! 	   ["Directory Revisions with Ancestor..."
! 	    ediff-merge-directory-revisions-with-ancestor t]
! 	   ))
         (defvar epatch-menu
  	 '("Apply Patch"
! 	   ["To a file..."  ediff-patch-file t]
! 	   ["To a buffer..." ediff-patch-buffer t]
! 	   ))
  
         ;; put these menus before Object-Oriented-Browser in Tools menu
         (add-hook 'before-init-hook 'ediff-xemacs-init-menus)
         (if (not purify-flag)
  	   (ediff-xemacs-init-menus))
***************
*** 115,186 ****
         ;; define ediff-menu
         (define-key menu-bar-ediff-menu [window]
! 	 '("This Window And Next Window" . compare-windows))
         (define-key menu-bar-ediff-menu [ediff-dir-revision]
! 	 '("Directory Revisions ..." . ediff-directory-revisions))
         (define-key menu-bar-ediff-menu [ediff-revision]
! 	 '("File with Revision ..." . ediff-revision))
         (define-key menu-bar-ediff-menu [separator-ediff-directories] '("--"))
         (define-key menu-bar-ediff-menu [ediff-directories3]
! 	 '("Three Directories ..." . ediff-directories3))
         (define-key menu-bar-ediff-menu [ediff-directories]
! 	 '("Two Directories ..." . ediff-directories))
         (define-key menu-bar-ediff-menu [separator-ediff-files] '("--"))
         (define-key menu-bar-ediff-menu [ediff-buffers3]
! 	 '("Three Buffers ..." . ediff-buffers3))
         (define-key menu-bar-ediff-menu [ediff-files3]
! 	 '("Three Files ..." . ediff-files3))
         (define-key menu-bar-ediff-menu [ediff-buffers]
! 	 '("Two Buffers ..." . ediff-buffers))
         (define-key menu-bar-ediff-menu [ediff-files]
! 	 '("Two Files ..." . ediff-files))
!        (define-key menu-bar-ediff-menu [separator-ediff-regions] '("--"))
!        (define-key menu-bar-ediff-menu [ediff-regions-linewise]
! 	 '("Regions Line-by-line ..." . ediff-regions-linewise))
!        (define-key menu-bar-ediff-menu [ediff-regions-wordwise]
! 	 '("Regions Word-by-word ..." . ediff-regions-wordwise))
!        (define-key menu-bar-ediff-menu [separator-ediff-windows] '("--"))
!        (define-key menu-bar-ediff-menu [ediff-windows-linewise]
! 	 '("Windows Line-by-line ..." . ediff-windows-linewise))
!        (define-key menu-bar-ediff-menu [ediff-windows-wordwise]
! 	 '("Windows Word-by-word ..." . ediff-windows-wordwise))
  
         ;; define merge menu
         (define-key
  	 menu-bar-ediff-merge-menu [ediff-merge-dir-revisions-with-ancestor]
! 	 '("Directory Revisions with Ancestor ..."
  	   . ediff-merge-directory-revisions-with-ancestor))
         (define-key
  	 menu-bar-ediff-merge-menu [ediff-merge-dir-revisions]
! 	 '("Directory Revisions ..." . ediff-merge-directory-revisions))
         (define-key
  	 menu-bar-ediff-merge-menu [ediff-merge-revisions-with-ancestor]
! 	 '("Revisions with Ancestor ..."
  	   . ediff-merge-revisions-with-ancestor))
         (define-key menu-bar-ediff-merge-menu [ediff-merge-revisions]
! 	 '("Revisions ..." . ediff-merge-revisions))
         (define-key menu-bar-ediff-merge-menu [separator-ediff-merge] '("--"))
         (define-key
  	 menu-bar-ediff-merge-menu [ediff-merge-directories-with-ancestor]
! 	 '("Directories with Ancestor ..."
  	   . ediff-merge-directories-with-ancestor))
         (define-key menu-bar-ediff-merge-menu [ediff-merge-directories]
! 	 '("Directories ..." . ediff-merge-directories))
         (define-key 
  	 menu-bar-ediff-merge-menu [separator-ediff-merge-dirs] '("--"))
         (define-key
  	 menu-bar-ediff-merge-menu [ediff-merge-buffers-with-ancestor]
! 	 '("Buffers with Ancestor ..." . ediff-merge-buffers-with-ancestor))
         (define-key menu-bar-ediff-merge-menu [ediff-merge-buffers]
! 	 '("Buffers ..." . ediff-merge-buffers))
         (define-key menu-bar-ediff-merge-menu [ediff-merge-files-with-ancestor]
! 	 '("Files with Ancestor ..." . ediff-merge-files-with-ancestor))
         (define-key menu-bar-ediff-merge-menu [ediff-merge-files]
! 	 '("Files ..." . ediff-merge-files))
  
         ;; define epatch menu
         (define-key menu-bar-epatch-menu [ediff-patch-buffer]
! 	 '("To a Buffer ..." . ediff-patch-buffer))
         (define-key menu-bar-epatch-menu [ediff-patch-file]
! 	 '("To a File ..." . ediff-patch-file)))
        
        ) ; cond
--- 124,195 ----
         ;; define ediff-menu
         (define-key menu-bar-ediff-menu [window]
! 	 '("This Window and Next Window" . compare-windows))
!        (define-key menu-bar-ediff-menu [ediff-windows-linewise]
! 	 '("Windows Line-by-line..." . ediff-windows-linewise))
!        (define-key menu-bar-ediff-menu [ediff-windows-wordwise]
! 	 '("Windows Word-by-word..." . ediff-windows-wordwise))
!        (define-key menu-bar-ediff-menu [separator-ediff-windows] '("--"))
!        (define-key menu-bar-ediff-menu [ediff-regions-linewise]
! 	 '("Regions Line-by-line..." . ediff-regions-linewise))
!        (define-key menu-bar-ediff-menu [ediff-regions-wordwise]
! 	 '("Regions Word-by-word..." . ediff-regions-wordwise))
!        (define-key menu-bar-ediff-menu [separator-ediff-regions] '("--"))
         (define-key menu-bar-ediff-menu [ediff-dir-revision]
! 	 '("Directory Revisions..." . ediff-directory-revisions))
         (define-key menu-bar-ediff-menu [ediff-revision]
! 	 '("File with Revision..." . ediff-revision))
         (define-key menu-bar-ediff-menu [separator-ediff-directories] '("--"))
         (define-key menu-bar-ediff-menu [ediff-directories3]
! 	 '("Three Directories..." . ediff-directories3))
         (define-key menu-bar-ediff-menu [ediff-directories]
! 	 '("Two Directories..." . ediff-directories))
         (define-key menu-bar-ediff-menu [separator-ediff-files] '("--"))
         (define-key menu-bar-ediff-menu [ediff-buffers3]
! 	 '("Three Buffers..." . ediff-buffers3))
         (define-key menu-bar-ediff-menu [ediff-files3]
! 	 '("Three Files..." . ediff-files3))
         (define-key menu-bar-ediff-menu [ediff-buffers]
! 	 '("Two Buffers..." . ediff-buffers))
         (define-key menu-bar-ediff-menu [ediff-files]
! 	 '("Two Files..." . ediff-files))
  
         ;; define merge menu
         (define-key
  	 menu-bar-ediff-merge-menu [ediff-merge-dir-revisions-with-ancestor]
! 	 '("Directory Revisions with Ancestor..."
  	   . ediff-merge-directory-revisions-with-ancestor))
         (define-key
  	 menu-bar-ediff-merge-menu [ediff-merge-dir-revisions]
! 	 '("Directory Revisions..." . ediff-merge-directory-revisions))
         (define-key
  	 menu-bar-ediff-merge-menu [ediff-merge-revisions-with-ancestor]
! 	 '("Revisions with Ancestor..."
  	   . ediff-merge-revisions-with-ancestor))
         (define-key menu-bar-ediff-merge-menu [ediff-merge-revisions]
! 	 '("Revisions..." . ediff-merge-revisions))
         (define-key menu-bar-ediff-merge-menu [separator-ediff-merge] '("--"))
         (define-key
  	 menu-bar-ediff-merge-menu [ediff-merge-directories-with-ancestor]
! 	 '("Directories with Ancestor..."
  	   . ediff-merge-directories-with-ancestor))
         (define-key menu-bar-ediff-merge-menu [ediff-merge-directories]
! 	 '("Directories..." . ediff-merge-directories))
         (define-key 
  	 menu-bar-ediff-merge-menu [separator-ediff-merge-dirs] '("--"))
         (define-key
  	 menu-bar-ediff-merge-menu [ediff-merge-buffers-with-ancestor]
! 	 '("Buffers with Ancestor..." . ediff-merge-buffers-with-ancestor))
         (define-key menu-bar-ediff-merge-menu [ediff-merge-buffers]
! 	 '("Buffers..." . ediff-merge-buffers))
         (define-key menu-bar-ediff-merge-menu [ediff-merge-files-with-ancestor]
! 	 '("Files with Ancestor..." . ediff-merge-files-with-ancestor))
         (define-key menu-bar-ediff-merge-menu [ediff-merge-files]
! 	 '("Files..." . ediff-merge-files))
  
         ;; define epatch menu
         (define-key menu-bar-epatch-menu [ediff-patch-buffer]
! 	 '("To a Buffer..." . ediff-patch-buffer))
         (define-key menu-bar-epatch-menu [ediff-patch-file]
! 	 '("To a File..." . ediff-patch-file)))
        
        ) ; cond
***************
*** 266,270 ****
    ;; misc
    (autoload 'ediff-show-registry
!     "ediff-mult"
      "Display the registry of active Ediff sessions"
      t)
--- 275,279 ----
    ;; misc
    (autoload 'ediff-show-registry
!     "ediff-meta"
      "Display the registry of active Ediff sessions"
      t)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/ediff-init.el emacs-19.31/lisp/ediff-init.el
*** emacs-19.30/lisp/ediff-init.el	Fri Nov 10 13:44:51 1995
--- emacs-19.31/lisp/ediff-init.el	Fri Feb 16 01:28:47 1996
***************
*** 1,4 ****
  ;;; ediff-init.el --- Macros, variables, and defsubsts used by Ediff
! ;;; Copyright (C) 1994, 1995 Free Software Foundation, Inc.
  
  ;; Author: Michael Kifer <kifer@cs.sunysb.edu>
--- 1,5 ----
  ;;; ediff-init.el --- Macros, variables, and defsubsts used by Ediff
! 
! ;; Copyright (C) 1994, 1995 Free Software Foundation, Inc.
  
  ;; Author: Michael Kifer <kifer@cs.sunysb.edu>
***************
*** 17,23 ****
  
  ;; 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.
  
  
  ;; Is it XEmacs?
--- 18,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
+ ;;; Code:
  
  ;; Is it XEmacs?
***************
*** 31,36 ****
      (device-type (selected-device))))
  ;; in XEmacs: device-type is tty on tty and stream in batch.
! (defsubst ediff-window-display-p ()
!   (and (ediff-device-type) (not (memq (ediff-device-type) '(tty stream)))))
  
  ;;; Macros
--- 34,49 ----
      (device-type (selected-device))))
  ;; in XEmacs: device-type is tty on tty and stream in batch.
! (defun ediff-window-display-p ()
!   (and (ediff-device-type) (not (memq (ediff-device-type) '(tty pc stream)))))
! 
! ;; test if supports faces
! ;; ediff-force-faces is for those devices that support faces, but we don't know
! ;; this yet
! (defun ediff-has-face-support-p ()
!   (cond ((ediff-window-display-p))
! 	(ediff-force-faces)
! 	(ediff-emacs-p (memq (ediff-device-type) '(pc)))
! 	(ediff-xemacs-p (memq (ediff-device-type) '(tty pc)))))
!   
  
  ;;; Macros
***************
*** 144,149 ****
  	     (set-buffer StartBuffer))
  	 (or (eq this-command 'ediff-quit)
! 	     (error
! 	      "You've killed an essential Ediff buffer---Please quit Ediff"))
  	 ))))
  	 
--- 157,161 ----
  	     (set-buffer StartBuffer))
  	 (or (eq this-command 'ediff-quit)
! 	     (error ediff-KILLED-VITAL-BUFFER))
  	 ))))
  	 
***************
*** 224,232 ****
        ))
  (defsubst ediff-collect-diffs-metajob (&optional metajob)
!   (or (ediff-revision-metajob metajob)
!       (memq ediff-metajob-name
! 	    '(ediff-directories
! 	      ;; add more here
! 	      ediff-directory-revisions))))
  (defsubst ediff-metajob3 (&optional metajob)
    (memq (or metajob ediff-metajob-name)
--- 236,249 ----
        ))
  (defsubst ediff-collect-diffs-metajob (&optional metajob)
!   (memq (or metajob ediff-metajob-name)
! 	'(ediff-directories
! 	  ediff-directory-revisions
! 	  ediff-merge-directories
! 	  ediff-merge-directories-with-ancestor
! 	  ediff-merge-directory-revisions
! 	  ediff-merge-directory-revisions-with-ancestor
! 	  ;; add more here
! 	  )))
! 
  (defsubst ediff-metajob3 (&optional metajob)
    (memq (or metajob ediff-metajob-name)
*************** n,SPC -next diff     |     h -hiliting  
*** 333,337 ****
    v/V -scroll up/dn  | #f/#h -focus/hide regions | wx -save buf X
    </> -scroll lt/rt  |     X -read-only in buf X | wd -save diff output
!                      |     m -wide display       |  ~ -swap buffers
  "
    "Help message usually used for 2-way comparison.
--- 350,354 ----
    v/V -scroll up/dn  | #f/#h -focus/hide regions | wx -save buf X
    </> -scroll lt/rt  |     X -read-only in buf X | wd -save diff output
!     ~ -swap variants |     m -wide display       |  
  "
    "Help message usually used for 2-way comparison.
*************** n,SPC -next diff     |     h -hiliting  
*** 347,351 ****
    v/V -scroll up/dn  | #f/#h -focus/hide regions | wx -save buf X
    </> -scroll lt/rt  |     X -read-only in buf X | wd -save diff output
!                      |     m -wide display       |  ~ -swap buffers
  "
    "Help message when comparing windows or regions line-by-line.
--- 364,368 ----
    v/V -scroll up/dn  | #f/#h -focus/hide regions | wx -save buf X
    </> -scroll lt/rt  |     X -read-only in buf X | wd -save diff output
!     ~ -swap variants |     m -wide display       |  
  "
    "Help message when comparing windows or regions line-by-line.
*************** n,SPC -next diff     |     h -hiliting  
*** 361,365 ****
    v/V -scroll up/dn  | #f/#h -focus/hide regions | wx -save buf X
    </> -scroll lt/rt  |     X -read-only in buf X | wd -save diff output
!                      |     m -wide display       |  ~ -swap buffers
  "
    "Help message when comparing windows or regions word-by-word.
--- 378,382 ----
    v/V -scroll up/dn  | #f/#h -focus/hide regions | wx -save buf X
    </> -scroll lt/rt  |     X -read-only in buf X | wd -save diff output
!     ~ -swap variants |     m -wide display       |  
  "
    "Help message when comparing windows or regions word-by-word.
*************** n,SPC -next diff     |     h -hiliting  
*** 375,379 ****
    v/V -scroll up/dn  |     X -read-only in buf X | wx -save buf X
    </> -scroll lt/rt  |     m -wide display       | wd -save diff output
!     / -ancestor buff |     s -shrink window C    |  ~ -swap buffers
                       |     $ -show clashes only  |  & -merge w/new default
  "
--- 392,396 ----
    v/V -scroll up/dn  |     X -read-only in buf X | wx -save buf X
    </> -scroll lt/rt  |     m -wide display       | wd -save diff output
!     ~ -swap variants |     s -shrink window C    |  / -show ancestor buff 
                       |     $ -show clashes only  |  & -merge w/new default
  "
*************** produce the brief help message. This fun
*** 400,405 ****
  See `ediff-brief-help-message-function' for more.")
  
! (defvar ediff-prefer-long-help-message nil
!   "*If t, Ediff starts with a long help message. Short help msg otherwise.")
  
  ;; The actual help message.
--- 417,422 ----
  See `ediff-brief-help-message-function' for more.")
  
! (defvar ediff-use-long-help-message nil
!   "*If t, Ediff displays a long help message. Short help message otherwise.")
  
  ;; The actual help message.
*************** start up with different help messages fo
*** 410,413 ****
--- 427,436 ----
  the value of this variable and the variables `ediff-help-message-*' in
  `ediff-startup-hook'.") 
+ 
+ ;; Error messages
+ (defconst ediff-KILLED-VITAL-BUFFER
+   "You have killed a vital Ediff buffer---you must leave Ediff now!")
+ (defconst ediff-NO-DIFFERENCES
+   "Sorry, it is not my job to munch identical variants...")
   
  ;; Selective browsing
*************** Must end with newline.")
*** 482,487 ****
    
  (ediff-defvar-local ediff-use-faces t 
!   "If t, differences are highlighted using faces on a window system.
! If nil, they are highlighted using ASCII flags, ediff-before-flag
  and ediff-after-flag.  On a non-window system, differences are always
  highlighted using ASCII flags.
--- 505,510 ----
    
  (ediff-defvar-local ediff-use-faces t 
!   "If t, differences are highlighted using faces, if device supports faces.
! If nil, differences are highlighted using ASCII flags, ediff-before-flag
  and ediff-after-flag.  On a non-window system, differences are always
  highlighted using ASCII flags.
*************** This variable can be set either in .emac
*** 489,492 ****
--- 512,520 ----
  Use `setq-default' if setting it in .emacs")
  
+ (defvar ediff-force-faces nil
+   "If t, Ediff will think that it is running on a display that supports faces.
+ This is provided as a temporary relief for users of face-capable displays
+ that Ediff doesn't know about.")
+ 
  
  ;; this indicates that diff regions are word-size, so fine diffs are
*************** Actually, Ediff restores the scope of vi
*** 520,524 ****
    "*Nil means that non-modified variant buffers should be removed after some
  interrogation.
! Supplying a prefix agument to the quit command `q' temporarily reverses the
  meaning of this variable.")
  
--- 548,552 ----
    "*Nil means that non-modified variant buffers should be removed after some
  interrogation.
! Supplying a prefix argument to the quit command `q' temporarily reverses the
  meaning of this variable.")
  
*************** ediff-toggle-hilit. Use `setq-default' t
*** 568,572 ****
  ;; Buffer-local variables to be saved then restored during Ediff sessions
  (defconst ediff-protected-variables '(buffer-read-only 
! 				      synchronize-minibuffers
  				      mode-line-format))
  
--- 596,600 ----
  ;; Buffer-local variables to be saved then restored during Ediff sessions
  (defconst ediff-protected-variables '(buffer-read-only 
! ;;;				      synchronize-minibuffers
  				      mode-line-format))
  
*************** ediff-toggle-hilit. Use `setq-default' t
*** 634,641 ****
  (defvar ediff-version-control-package 'vc
    "Version control package used.
! Currently, Ediff supports vc.el, rcs.el, and generic-sc.el. The standard Emacs
! interface to RCS, CVS, SCCS, etc., is vc.el. However, some people find the
! other two packages more convenient. Set this variable `rcs' or `generic-sc' if
! you are such a person.")
  
  
--- 662,669 ----
  (defvar ediff-version-control-package 'vc
    "Version control package used.
! Currently, Ediff supports vc.el, rcs.el, pcl-cvs.el, and generic-sc.el. The
! standard Emacs interface to RCS, CVS, SCCS, etc., is vc.el. However, some
! people find the other two packages more convenient. Set this variable to the
! appropriate symbol: `rcs', `pcl-cvs', or `generic-sc' if you so desire.")
  
  
*************** you are such a person.")
*** 645,658 ****
        (fset 'ediff-overlayp (symbol-function 'extentp))
        (fset 'ediff-make-overlay (symbol-function 'make-extent))
!       (fset 'ediff-delete-overlay (symbol-function 'delete-extent))
!       (fset 'ediff-overlay-buffer (symbol-function 'extent-buffer))
!       (fset 'ediff-overlay-get (symbol-function 'extent-property)))
    (fset 'ediff-read-event (symbol-function 'read-event))
    (fset 'ediff-overlayp (symbol-function 'overlayp))
    (fset 'ediff-overlayp (symbol-function 'overlayp))
    (fset 'ediff-make-overlay (symbol-function 'make-overlay))
!   (fset 'ediff-delete-overlay (symbol-function 'delete-overlay))
!   (fset 'ediff-overlay-buffer (symbol-function 'overlay-buffer))
!   (fset 'ediff-overlay-get (symbol-function 'overlay-get)))
    
  ;; Check the current version against the major and minor version numbers
--- 673,682 ----
        (fset 'ediff-overlayp (symbol-function 'extentp))
        (fset 'ediff-make-overlay (symbol-function 'make-extent))
!       (fset 'ediff-delete-overlay (symbol-function 'delete-extent)))
    (fset 'ediff-read-event (symbol-function 'read-event))
    (fset 'ediff-overlayp (symbol-function 'overlayp))
    (fset 'ediff-overlayp (symbol-function 'overlayp))
    (fset 'ediff-make-overlay (symbol-function 'make-overlay))
!   (fset 'ediff-delete-overlay (symbol-function 'delete-overlay)))
    
  ;; Check the current version against the major and minor version numbers
*************** you are such a person.")
*** 726,744 ****
  
    
! (if (ediff-window-display-p)
      (if ediff-xemacs-p
  	(progn
- 	  (fset 'ediff-display-pixel-width
- 		(symbol-function 'device-pixel-width))
- 	  (fset 'ediff-display-pixel-height
- 		(symbol-function 'device-pixel-height))
  	  (fset 'ediff-valid-color-p (symbol-function 'valid-color-name-p))
  	  (fset 'ediff-get-face (symbol-function 'get-face)))
        ;; Temporary fix for OS/2 port of Emacs
        ;; pm-win.el in PM-Emacs should be fixed.
-       (fset 'ediff-display-pixel-width 
- 	    (symbol-function 'x-display-pixel-width))
-       (fset 'ediff-display-pixel-height
- 	    (symbol-function 'x-display-pixel-height))
        (if (eq (ediff-device-type) 'pm)
  	  (fset 'ediff-valid-color-p 
--- 750,760 ----
  
    
! (if (ediff-has-face-support-p)
      (if ediff-xemacs-p
  	(progn
  	  (fset 'ediff-valid-color-p (symbol-function 'valid-color-name-p))
  	  (fset 'ediff-get-face (symbol-function 'get-face)))
        ;; Temporary fix for OS/2 port of Emacs
        ;; pm-win.el in PM-Emacs should be fixed.
        (if (eq (ediff-device-type) 'pm)
  	  (fset 'ediff-valid-color-p 
*************** you are such a person.")
*** 746,753 ****
  	(fset 'ediff-valid-color-p (symbol-function 'x-color-defined-p)))
        (fset 'ediff-get-face (symbol-function 'internal-get-face))))
        
  
  (defun ediff-make-current-diff-overlay (type)
!   (if (ediff-window-display-p)
        (let ((overlay (intern (format "ediff-current-diff-overlay-%S" type)))
  	    (buffer (ediff-get-buffer type))
--- 762,781 ----
  	(fset 'ediff-valid-color-p (symbol-function 'x-color-defined-p)))
        (fset 'ediff-get-face (symbol-function 'internal-get-face))))
+ 
+ (if (ediff-window-display-p)
+     (if ediff-xemacs-p
+ 	(progn
+ 	  (fset 'ediff-display-pixel-width
+ 		(symbol-function 'device-pixel-width))
+ 	  (fset 'ediff-display-pixel-height
+ 		(symbol-function 'device-pixel-height)))
+       (fset 'ediff-display-pixel-width 
+ 	    (symbol-function 'x-display-pixel-width))
+       (fset 'ediff-display-pixel-height
+ 	    (symbol-function 'x-display-pixel-height))))
        
  
  (defun ediff-make-current-diff-overlay (type)
!   (if (ediff-has-face-support-p)
        (let ((overlay (intern (format "ediff-current-diff-overlay-%S" type)))
  	    (buffer (ediff-get-buffer type))
*************** you are such a person.")
*** 785,789 ****
  (defun ediff-set-face (ground face color)
    "Set face foreground/background."
!   (if (ediff-window-display-p)
        (if (ediff-valid-color-p color)
  	  (if (eq ground 'foreground)
--- 813,817 ----
  (defun ediff-set-face (ground face color)
    "Set face foreground/background."
!   (if (ediff-has-face-support-p)
        (if (ediff-valid-color-p color)
  	  (if (eq ground 'foreground)
*************** you are such a person.")
*** 812,821 ****
  	       (copy-face 'secondary-selection face))))
      ))
        
- (add-to-list 'facemenu-unlisted-faces 'ediff-current-diff-face-A)
  (defvar ediff-current-diff-face-A
!   (if (ediff-window-display-p)
        (progn
  	(make-face 'ediff-current-diff-face-A)
  	(or (face-differs-from-default-p 'ediff-current-diff-face-A)
  	    (cond ((ediff-color-display-p)
--- 840,853 ----
  	       (copy-face 'secondary-selection face))))
      ))
+ 
+ (defun ediff-hide-face (face)
+   (if (and (ediff-has-face-support-p) ediff-emacs-p)
+       (add-to-list 'facemenu-unlisted-faces face)))
        
  (defvar ediff-current-diff-face-A
!   (if (ediff-has-face-support-p)
        (progn
  	(make-face 'ediff-current-diff-face-A)
+ 	(ediff-hide-face 'ediff-current-diff-face-A)
  	(or (face-differs-from-default-p 'ediff-current-diff-face-A)
  	    (cond ((ediff-color-display-p)
*************** you are such a person.")
*** 832,840 ****
    "Face for highlighting the selected difference in buffer A.")
  
- (add-to-list 'facemenu-unlisted-faces 'ediff-current-diff-face-B)
  (defvar ediff-current-diff-face-B
!   (if (ediff-window-display-p)
        (progn
  	(make-face 'ediff-current-diff-face-B)
  	(or (face-differs-from-default-p 'ediff-current-diff-face-B)
  	    (cond ((ediff-color-display-p)
--- 864,872 ----
    "Face for highlighting the selected difference in buffer A.")
  
  (defvar ediff-current-diff-face-B
!   (if (ediff-has-face-support-p)
        (progn
  	(make-face 'ediff-current-diff-face-B)
+ 	(ediff-hide-face 'ediff-current-diff-face-B)
  	(or (face-differs-from-default-p 'ediff-current-diff-face-B)
  	    (cond ((ediff-color-display-p)
*************** you are such a person.")
*** 852,860 ****
      
  
- (add-to-list 'facemenu-unlisted-faces 'ediff-current-diff-face-C)
  (defvar ediff-current-diff-face-C
!   (if (ediff-window-display-p)
        (progn
  	(make-face 'ediff-current-diff-face-C)
  	(or (face-differs-from-default-p 'ediff-current-diff-face-C)
  	    (cond ((ediff-color-display-p)
--- 884,892 ----
      
  
  (defvar ediff-current-diff-face-C
!   (if (ediff-has-face-support-p)
        (progn
  	(make-face 'ediff-current-diff-face-C)
+ 	(ediff-hide-face 'ediff-current-diff-face-C)
  	(or (face-differs-from-default-p 'ediff-current-diff-face-C)
  	    (cond ((ediff-color-display-p)
*************** you are such a person.")
*** 871,879 ****
    "Face for highlighting the selected difference in buffer C.")
  
- (add-to-list 'facemenu-unlisted-faces 'ediff-current-diff-face-Ancestor)
  (defvar ediff-current-diff-face-Ancestor
!   (if (ediff-window-display-p)
        (progn
  	(make-face 'ediff-current-diff-face-Ancestor)
  	(or (face-differs-from-default-p 'ediff-current-diff-face-Ancestor)
  	    (copy-face 
--- 903,911 ----
    "Face for highlighting the selected difference in buffer C.")
  
  (defvar ediff-current-diff-face-Ancestor
!   (if (ediff-has-face-support-p)
        (progn
  	(make-face 'ediff-current-diff-face-Ancestor)
+ 	(ediff-hide-face 'ediff-current-diff-face-Ancestor)
  	(or (face-differs-from-default-p 'ediff-current-diff-face-Ancestor)
  	    (copy-face 
*************** you are such a person.")
*** 881,889 ****
    "Face for highlighting the selected difference in the ancestor buffer.")
  
- (add-to-list 'facemenu-unlisted-faces 'ediff-fine-diff-face-A)
  (defvar ediff-fine-diff-face-A
!   (if (ediff-window-display-p)
        (progn
  	(make-face 'ediff-fine-diff-face-A)
  	(or (face-differs-from-default-p 'ediff-fine-diff-face-A)
  	    (cond ((ediff-color-display-p)
--- 913,921 ----
    "Face for highlighting the selected difference in the ancestor buffer.")
  
  (defvar ediff-fine-diff-face-A
!   (if (ediff-has-face-support-p)
        (progn
  	(make-face 'ediff-fine-diff-face-A)
+ 	(ediff-hide-face 'ediff-fine-diff-face-A)
  	(or (face-differs-from-default-p 'ediff-fine-diff-face-A)
  	    (cond ((ediff-color-display-p)
*************** you are such a person.")
*** 896,904 ****
    "Face for highlighting the refinement of the selected diff in buffer A.")
  
- (add-to-list 'facemenu-unlisted-faces 'ediff-fine-diff-face-B)
  (defvar ediff-fine-diff-face-B
!   (if (ediff-window-display-p)
        (progn
  	(make-face 'ediff-fine-diff-face-B)
  	(or (face-differs-from-default-p 'ediff-fine-diff-face-B)
  	    (cond ((ediff-color-display-p)
--- 928,936 ----
    "Face for highlighting the refinement of the selected diff in buffer A.")
  
  (defvar ediff-fine-diff-face-B
!   (if (ediff-has-face-support-p)
        (progn
  	(make-face 'ediff-fine-diff-face-B)
+ 	(ediff-hide-face 'ediff-fine-diff-face-B)
  	(or (face-differs-from-default-p 'ediff-fine-diff-face-B)
  	    (cond ((ediff-color-display-p)
*************** you are such a person.")
*** 909,917 ****
    "Face for highlighting the refinement of the selected diff in buffer B.")
      
- (add-to-list 'facemenu-unlisted-faces 'ediff-fine-diff-face-C)
  (defvar ediff-fine-diff-face-C
!   (if (ediff-window-display-p)
        (progn
  	(make-face 'ediff-fine-diff-face-C)
  	(or (face-differs-from-default-p 'ediff-fine-diff-face-C)
  	    (cond ((ediff-color-display-p)
--- 941,949 ----
    "Face for highlighting the refinement of the selected diff in buffer B.")
      
  (defvar ediff-fine-diff-face-C
!   (if (ediff-has-face-support-p)
        (progn
  	(make-face 'ediff-fine-diff-face-C)
+ 	(ediff-hide-face 'ediff-fine-diff-face-C)
  	(or (face-differs-from-default-p 'ediff-fine-diff-face-C)
  	    (cond ((ediff-color-display-p)
*************** you are such a person.")
*** 923,931 ****
    "Face for highlighting the refinement of the selected diff in buffer C.")
  
- (add-to-list 'facemenu-unlisted-faces 'ediff-fine-diff-face-Ancestor)
  (defvar ediff-fine-diff-face-Ancestor
!   (if (ediff-window-display-p)
        (progn
  	(make-face 'ediff-fine-diff-face-Ancestor)
  	(or (face-differs-from-default-p 'ediff-fine-diff-face-Ancestor)
  	    (copy-face
--- 955,963 ----
    "Face for highlighting the refinement of the selected diff in buffer C.")
  
  (defvar ediff-fine-diff-face-Ancestor
!   (if (ediff-has-face-support-p)
        (progn
  	(make-face 'ediff-fine-diff-face-Ancestor)
+ 	(ediff-hide-face 'ediff-fine-diff-face-Ancestor)
  	(or (face-differs-from-default-p 'ediff-fine-diff-face-Ancestor)
  	    (copy-face
*************** Presently, this is not used, as differen
*** 935,943 ****
  ancestor buffer.")
      
- (add-to-list 'facemenu-unlisted-faces 'ediff-even-diff-face-A)
  (defvar ediff-even-diff-face-A
!   (if (ediff-window-display-p)
        (progn
  	(make-face 'ediff-even-diff-face-A)
  	(or (face-differs-from-default-p 'ediff-even-diff-face-A)
  	    (cond ((ediff-color-display-p)
--- 967,975 ----
  ancestor buffer.")
      
  (defvar ediff-even-diff-face-A
!   (if (ediff-has-face-support-p)
        (progn
  	(make-face 'ediff-even-diff-face-A)
+ 	(ediff-hide-face 'ediff-even-diff-face-A)
  	(or (face-differs-from-default-p 'ediff-even-diff-face-A)
  	    (cond ((ediff-color-display-p)
*************** ancestor buffer.")
*** 951,959 ****
    "Face used to highlight even-numbered differences in buffer A.")
        
- (add-to-list 'facemenu-unlisted-faces 'ediff-even-diff-face-B)
  (defvar ediff-even-diff-face-B
!   (if (ediff-window-display-p)
        (progn
  	(make-face 'ediff-even-diff-face-B)
  	(or (face-differs-from-default-p 'ediff-even-diff-face-B)
  	    (cond ((ediff-color-display-p)
--- 983,991 ----
    "Face used to highlight even-numbered differences in buffer A.")
        
  (defvar ediff-even-diff-face-B
!   (if (ediff-has-face-support-p)
        (progn
  	(make-face 'ediff-even-diff-face-B)
+ 	(ediff-hide-face 'ediff-even-diff-face-B)
  	(or (face-differs-from-default-p 'ediff-even-diff-face-B)
  	    (cond ((ediff-color-display-p)
*************** ancestor buffer.")
*** 967,975 ****
    "Face used to highlight even-numbered differences in buffer B.")
      
- (add-to-list 'facemenu-unlisted-faces 'ediff-even-diff-face-C)
  (defvar ediff-even-diff-face-C
!   (if (ediff-window-display-p)
        (progn
  	(make-face 'ediff-even-diff-face-C)
  	(or (face-differs-from-default-p 'ediff-even-diff-face-C)
  	    (copy-face 'ediff-even-diff-face-A 'ediff-even-diff-face-C))
--- 999,1007 ----
    "Face used to highlight even-numbered differences in buffer B.")
      
  (defvar ediff-even-diff-face-C
!   (if (ediff-has-face-support-p)
        (progn
  	(make-face 'ediff-even-diff-face-C)
+ 	(ediff-hide-face 'ediff-even-diff-face-C)
  	(or (face-differs-from-default-p 'ediff-even-diff-face-C)
  	    (copy-face 'ediff-even-diff-face-A 'ediff-even-diff-face-C))
*************** ancestor buffer.")
*** 977,985 ****
    "Face used to highlight even-numbered differences in buffer C.")
  
- (add-to-list 'facemenu-unlisted-faces 'ediff-even-diff-face-Ancestor)
  (defvar ediff-even-diff-face-Ancestor
!   (if (ediff-window-display-p)
        (progn
  	(make-face 'ediff-even-diff-face-Ancestor)
  	(or (face-differs-from-default-p 'ediff-even-diff-face-Ancestor)
  	    (copy-face 'ediff-even-diff-face-C 'ediff-even-diff-face-Ancestor))
--- 1009,1017 ----
    "Face used to highlight even-numbered differences in buffer C.")
  
  (defvar ediff-even-diff-face-Ancestor
!   (if (ediff-has-face-support-p)
        (progn
  	(make-face 'ediff-even-diff-face-Ancestor)
+ 	(ediff-hide-face 'ediff-even-diff-face-Ancestor)
  	(or (face-differs-from-default-p 'ediff-even-diff-face-Ancestor)
  	    (copy-face 'ediff-even-diff-face-C 'ediff-even-diff-face-Ancestor))
*************** ancestor buffer.")
*** 987,995 ****
    "Face highlighting even-numbered differences in the ancestor buffer.")
    
- (add-to-list 'facemenu-unlisted-faces 'ediff-odd-diff-face-A)
  (defvar ediff-odd-diff-face-A
!   (if (ediff-window-display-p)
        (progn
  	(make-face 'ediff-odd-diff-face-A)
  	(or (face-differs-from-default-p 'ediff-odd-diff-face-A)
  	    (cond ((ediff-color-display-p)
--- 1019,1027 ----
    "Face highlighting even-numbered differences in the ancestor buffer.")
    
  (defvar ediff-odd-diff-face-A
!   (if (ediff-has-face-support-p)
        (progn
  	(make-face 'ediff-odd-diff-face-A)
+ 	(ediff-hide-face 'ediff-odd-diff-face-A)
  	(or (face-differs-from-default-p 'ediff-odd-diff-face-A)
  	    (cond ((ediff-color-display-p)
*************** ancestor buffer.")
*** 1003,1011 ****
    "Face used to highlight odd-numbered differences in buffer A.")
        
- (add-to-list 'facemenu-unlisted-faces 'ediff-odd-diff-face-B)
  (defvar ediff-odd-diff-face-B
!   (if (ediff-window-display-p)
        (progn
  	(make-face 'ediff-odd-diff-face-B)
  	(or (face-differs-from-default-p 'ediff-odd-diff-face-B)
  	    (cond ((ediff-color-display-p)
--- 1035,1043 ----
    "Face used to highlight odd-numbered differences in buffer A.")
        
  (defvar ediff-odd-diff-face-B
!   (if (ediff-has-face-support-p)
        (progn
  	(make-face 'ediff-odd-diff-face-B)
+ 	(ediff-hide-face 'ediff-odd-diff-face-B)
  	(or (face-differs-from-default-p 'ediff-odd-diff-face-B)
  	    (cond ((ediff-color-display-p)
*************** ancestor buffer.")
*** 1019,1027 ****
    "Face used to highlight odd-numbered differences in buffer B.")
      
- (add-to-list 'facemenu-unlisted-faces 'ediff-odd-diff-face-C)
  (defvar ediff-odd-diff-face-C
!   (if (ediff-window-display-p)
        (progn
  	(make-face 'ediff-odd-diff-face-C)
  	(or (face-differs-from-default-p 'ediff-odd-diff-face-C)
  	    (copy-face 'ediff-odd-diff-face-A 'ediff-odd-diff-face-C))
--- 1051,1059 ----
    "Face used to highlight odd-numbered differences in buffer B.")
      
  (defvar ediff-odd-diff-face-C
!   (if (ediff-has-face-support-p)
        (progn
  	(make-face 'ediff-odd-diff-face-C)
+ 	(ediff-hide-face 'ediff-odd-diff-face-C)
  	(or (face-differs-from-default-p 'ediff-odd-diff-face-C)
  	    (copy-face 'ediff-odd-diff-face-A 'ediff-odd-diff-face-C))
*************** ancestor buffer.")
*** 1029,1037 ****
    "Face used to highlight odd-numbered differences in buffer C.")
  
- (add-to-list 'facemenu-unlisted-faces 'ediff-odd-diff-face-Ancestor )
  (defvar ediff-odd-diff-face-Ancestor 
!   (if (ediff-window-display-p)
        (progn
  	(make-face 'ediff-odd-diff-face-Ancestor)
  	(or (face-differs-from-default-p 'ediff-odd-diff-face-Ancestor)
  	    (copy-face 'ediff-odd-diff-face-C 'ediff-odd-diff-face-Ancestor))
--- 1061,1069 ----
    "Face used to highlight odd-numbered differences in buffer C.")
  
  (defvar ediff-odd-diff-face-Ancestor 
!   (if (ediff-has-face-support-p)
        (progn
  	(make-face 'ediff-odd-diff-face-Ancestor)
+ 	(ediff-hide-face 'ediff-odd-diff-face-Ancestor)
  	(or (face-differs-from-default-p 'ediff-odd-diff-face-Ancestor)
  	    (copy-face 'ediff-odd-diff-face-C 'ediff-odd-diff-face-Ancestor))
*************** Instead, C-h jumps to previous differenc
*** 1105,1111 ****
      (setq d (if (and env (> (length env) 0))
  		env
! 	      (if (memq system-type '(vax-vms axp-vms))
! 		  "SYS$SCRATCH:"
! 		"/tmp")))
      ;; The following is to make sure we get something to which we can
      ;; add directory levels on VMS.
--- 1137,1143 ----
      (setq d (if (and env (> (length env) 0))
  		env
! 	      (cond ((memq system-type '(vax-vms axp-vms)) "SYS$SCRATCH:")
!  		    ((eq system-type 'ms-dos) "c:/")
!  		    (t "/tmp"))))
      ;; The following is to make sure we get something to which we can
      ;; add directory levels on VMS.
*************** Do not start with `~/' or `~user-name/'.
*** 1124,1127 ****
--- 1156,1162 ----
  More precisely, a regexp to match any one such character.")
  
+ ;; needed to simulate frame-char-width in XEmacs.
+ (defvar ediff-H-glyph (if ediff-xemacs-p (make-glyph "H")))
+ 
    
  (ediff-defvar-local ediff-temp-file-A nil
*************** More precisely, a regexp to match any on
*** 1138,1149 ****
        (funcall ediff-ange-ftp-ftp-name file-name)))
  
- ;;(defun ediff-frame-has-menubar ()
- ;;  (and (ediff-window-display-p)
- ;;       (if ediff-xemacs-p
- ;;	   current-menubar
- ;;	 (let ((lines (cdr (assq 'menu-bar-lines
- ;;				 (frame-parameters (selected-frame))))))
- ;;	   (or (eq lines t) (and (numberp lines) (< 0 lines))))
- ;;	 )))
      
  (defsubst ediff-frame-unsplittable-p (frame)
--- 1173,1176 ----
*************** More precisely, a regexp to match any on
*** 1284,1288 ****
  	    ;; sessions that are not part of a group (this is done in
  	    ;; ediff-recenter). The condition below affects only terminating
! 	    ;; sessions in session groups (in whhich case mouse is warped into
  	    ;; a meta buffer).
  	    (and (eq ediff-grab-mouse 'maybe)
--- 1311,1315 ----
  	    ;; sessions that are not part of a group (this is done in
  	    ;; ediff-recenter). The condition below affects only terminating
! 	    ;; sessions in session groups (in which case mouse is warped into
  	    ;; a meta buffer).
  	    (and (eq ediff-grab-mouse 'maybe)
*************** More precisely, a regexp to match any on
*** 1294,1301 ****
    (setq ediff-mouse-pixel-position (mouse-pixel-position)))
  
! ;; This is actually not easy to find out since emacs and xemacs behave
! ;; differently when mouse is not in any frame. Also, this is sensitive to
! ;; when the user grabbed mouse.
! ;; Not used for now.
  (defun ediff-user-grabbed-mouse ()
    (if ediff-mouse-pixel-position
--- 1321,1327 ----
    (setq ediff-mouse-pixel-position (mouse-pixel-position)))
  
! ;; It is not easy to find out when the user grabs the mouse, since emacs and
! ;; xemacs behave differently when mouse is not in any frame. Also, this is
! ;; sensitive to when the user grabbed mouse.  Not used for now.
  (defun ediff-user-grabbed-mouse ()
    (if ediff-mouse-pixel-position
*************** More precisely, a regexp to match any on
*** 1308,1320 ****
  	     (not (and (< (abs (- (car (cdr ediff-mouse-pixel-position))
  				  (car (cdr (mouse-pixel-position)))))
! 			  ediff-mouse-pixel-threshhold)
  		       (< (abs (- (cdr (cdr ediff-mouse-pixel-position))
  				  (cdr (cdr (mouse-pixel-position)))))
! 			  ediff-mouse-pixel-threshhold))))
  	    (t nil))))
      
  (defsubst ediff-frame-char-height (frame)
    (if ediff-xemacs-p
!       (/ (frame-pixel-height frame) (frame-height frame))
      (frame-char-height frame)))
      
--- 1334,1346 ----
  	     (not (and (< (abs (- (car (cdr ediff-mouse-pixel-position))
  				  (car (cdr (mouse-pixel-position)))))
! 			  ediff-mouse-pixel-threshold)
  		       (< (abs (- (cdr (cdr ediff-mouse-pixel-position))
  				  (cdr (cdr (mouse-pixel-position)))))
! 			  ediff-mouse-pixel-threshold))))
  	    (t nil))))
      
  (defsubst ediff-frame-char-height (frame)
    (if ediff-xemacs-p
!       (glyph-height ediff-H-glyph (selected-window frame))
      (frame-char-height frame)))
      
*************** More precisely, a regexp to match any on
*** 1322,1325 ****
--- 1348,1365 ----
  (defsubst ediff-empty-overlay-p (overl)
    (= (ediff-overlay-start overl) (ediff-overlay-end overl)))
+ 
+ ;; like overlay-buffer in Emacs. In XEmacs, returns nil if the extent is
+ ;; dead. Otherwise, works like extent-buffer
+ (defun ediff-overlay-buffer (overl)
+   (if ediff-emacs-p
+       (overlay-buffer overl)
+     (and (extent-live-p overl) (extent-buffer overl))))
+ 
+ ;; like overlay-get in Emacs. In XEmacs, returns nil if the extent is
+ ;; dead. Otherwise, like extent-property
+ (defun ediff-overlay-get (overl property)
+   (if ediff-emacs-p
+       (overlay-get overl property)
+     (and (extent-live-p overl) (extent-property overl property))))
    
  ;; t if diff region is empty.
*************** More precisely, a regexp to match any on
*** 1349,1353 ****
  ;; temporarily uses DIR to abbreviate file name
  ;; if DIR is nil, use default-directory
! (defsubst ediff-abbreviate-file-name (file &optional dir)
    (cond ((stringp dir)
  	 (let ((directory-abbrev-alist (list (cons dir ""))))
--- 1389,1393 ----
  ;; temporarily uses DIR to abbreviate file name
  ;; if DIR is nil, use default-directory
! (defun ediff-abbreviate-file-name (file &optional dir)
    (cond ((stringp dir)
  	 (let ((directory-abbrev-alist (list (cons dir ""))))
*************** More precisely, a regexp to match any on
*** 1442,1445 ****
--- 1482,1486 ----
    (if ediff-verbose-p
        (apply 'message string args)))
+ 
       
  (provide 'ediff-init)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/ediff-merg.el emacs-19.31/lisp/ediff-merg.el
*** emacs-19.30/lisp/ediff-merg.el	Fri Oct 13 23:10:05 1995
--- emacs-19.31/lisp/ediff-merg.el	Fri Feb 16 01:28:50 1996
***************
*** 1,4 ****
  ;;; ediff-merg.el --- merging utilities
! ;;; Copyright (C) 1994, 1995 Free Software Foundation, Inc.
  
  ;; Author: Michael Kifer <kifer@cs.sunysb.edu>
--- 1,5 ----
  ;;; ediff-merg.el --- merging utilities
! 
! ;; Copyright (C) 1994, 1995 Free Software Foundation, Inc.
  
  ;; Author: Michael Kifer <kifer@cs.sunysb.edu>
***************
*** 17,32 ****
  
  ;; 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.
  
  
  (require 'ediff-init)
  
! (defvar ediff-default-variant 'default-A
    "*The variant to be used as a default for buffer C in merging.
  Valid values are the symbols `default-A', `default-B', and `combined'.")
  
  (defvar ediff-combination-pattern 
!   '("#ifdef NEW /* variant A */" "#else /* variant B */" "#endif /* NEW */")
    "*Pattern to be used for combining difference regions in buffers A and B.
  The value is (STRING1 STRING2 STRING3). The combined text will look like this:
--- 18,35 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
+ ;;; Code:
  
  (require 'ediff-init)
  
! (defvar ediff-default-variant 'combined
    "*The variant to be used as a default for buffer C in merging.
  Valid values are the symbols `default-A', `default-B', and `combined'.")
  
  (defvar ediff-combination-pattern 
!   '("<<<<<<<<<<<<<< variant A" ">>>>>>>>>>>>>> variant B" "======= end of combination")
    "*Pattern to be used for combining difference regions in buffers A and B.
  The value is (STRING1 STRING2 STRING3). The combined text will look like this:
*************** skiped over. Nil means show all regions.
*** 138,142 ****
  			 (not (string=
  			       (ediff-make-combined-diff reg-A reg-B) reg-C)))
! 		    ;; was prefered--ignore
  		    (string-match "prefer" state-of-merge))
  		(setq do-not-copy t))
--- 141,145 ----
  			 (not (string=
  			       (ediff-make-combined-diff reg-A reg-B) reg-C)))
! 		    ;; was preferred--ignore
  		    (string-match "prefer" state-of-merge))
  		(setq do-not-copy t))
*************** Used only for merging jobs."
*** 211,217 ****
  (defun ediff-combine-diffs (n &optional batch-invocation)
    "Combine Nth diff regions of buffers A and B and place the combination in C.
! Combining is done using the list in variable `ediff-combination-pattern'."
    (interactive "P")
!   (setq n (if n (1- n) ediff-current-difference))
    
    (let (regA regB reg-combined)
--- 214,222 ----
  (defun ediff-combine-diffs (n &optional batch-invocation)
    "Combine Nth diff regions of buffers A and B and place the combination in C.
! N is a prefix argument. If nil, combine the current difference regions.
! Combining is done according to the specifications in variable
! `ediff-combination-pattern'."
    (interactive "P")
!   (setq n (if (numberp n) (1- n) ediff-current-difference))
    
    (let (regA regB reg-combined)
*************** Combining is done using the list in vari
*** 222,226 ****
      
      (ediff-copy-diff n nil 'C batch-invocation reg-combined))
!     (or batch-invocation (ediff-recenter)))
      
  
--- 227,231 ----
      
      (ediff-copy-diff n nil 'C batch-invocation reg-combined))
!     (or batch-invocation (ediff-jump-to-difference (1+ n))))
      
  
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/ediff-mult.el emacs-19.31/lisp/ediff-mult.el
*** emacs-19.30/lisp/ediff-mult.el	Fri Nov 24 17:23:26 1995
--- emacs-19.31/lisp/ediff-mult.el	Fri Feb 16 01:28:52 1996
***************
*** 1,4 ****
  ;;; ediff-mult.el --- support for multi-file/multi-buffer processing in Ediff
! ;;; Copyright (C) 1995 Free Software Foundation, Inc.
  
  ;; Author: Michael Kifer <kifer@cs.sunysb.edu>
--- 1,5 ----
  ;;; ediff-mult.el --- support for multi-file/multi-buffer processing in Ediff
! 
! ;; Copyright (C) 1995 Free Software Foundation, Inc.
  
  ;; Author: Michael Kifer <kifer@cs.sunysb.edu>
***************
*** 17,26 ****
  
  ;; 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.
  
! ;;; Notes:
! ;;
! ;; Users are strongly encourage to add functionality to this file.
  ;; In particular, epatch needs to be enhanced to work with multi-file
  ;; patches. The present file contains all the infrastructure needed for that.
--- 18,28 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
! ;;; Commentary:
! 
! ;; Users are strongly encouraged to add functionality to this file.
  ;; In particular, epatch needs to be enhanced to work with multi-file
  ;; patches. The present file contains all the infrastructure needed for that.
***************
*** 44,48 ****
  ;;	   developer. The only thing is that it must be a list of lists.
  ;;	   Also, keep in mind that the function ediff-prepare-meta-buffer
! ;;	   (which see) prepends nil in fron of each list (i.e., the above list
  ;;	   will become ((nil obj1 obj2 ...) (nil ...) ...).
  ;;	   Ediff expects that your function (in 2 above) will arrange to
--- 46,50 ----
  ;;	   developer. The only thing is that it must be a list of lists.
  ;;	   Also, keep in mind that the function ediff-prepare-meta-buffer
! ;;	   (which see) prepends nil in front of each list (i.e., the above list
  ;;	   will become ((nil obj1 obj2 ...) (nil ...) ...).
  ;;	   Ediff expects that your function (in 2 above) will arrange to
***************
*** 80,83 ****
--- 82,87 ----
  ;; ediff-dir-action.
  
+ ;;; Code:
+ 
  (require 'ediff-init)
  
*************** Moves in circular fashion. With numeric 
*** 297,303 ****
  ;; where num encodes the set of dirs where the file is found:
  ;; 2 - only dir1; 3 - only dir2; 5 - only dir3; 6 - dir1&2; 10 - dir1&3; etc.
! (defun ediff-intersect-directories (jobname diff-var regexp dir1 dir2
! 					    &optional dir3 comparison-func)
!   (require 'cl)
    (setq comparison-func (or comparison-func 'string=))
    (let (lis1 lis2 lis3 common auxdir1 auxdir2 auxdir3 difflist)
--- 301,307 ----
  ;; where num encodes the set of dirs where the file is found:
  ;; 2 - only dir1; 3 - only dir2; 5 - only dir3; 6 - dir1&2; 10 - dir1&3; etc.
! (defun ediff-intersect-directories (jobname
! 				    diff-var regexp dir1 dir2
! 				    &optional dir3 comparison-func)
    (setq comparison-func (or comparison-func 'string=))
    (let (lis1 lis2 lis3 common auxdir1 auxdir2 auxdir3 difflist)
*************** Moves in circular fashion. With numeric 
*** 315,319 ****
  	  lis1 (delete ".." lis1))
  
!     (setq common (intersection lis1 lis2 ':test comparison-func))
      ;; get rid of files that are directories in dir1 but not dir2
      (mapcar (function (lambda (elt)
--- 319,323 ----
  	  lis1 (delete ".." lis1))
  
!     (setq common (ediff-intersection lis1 lis2 comparison-func))
      ;; get rid of files that are directories in dir1 but not dir2
      (mapcar (function (lambda (elt)
*************** Moves in circular fashion. With numeric 
*** 323,327 ****
  	    common)
      ;; intersect with the third dir
!     (if lis3 (setq common (intersection common lis3 ':test comparison-func)))
      (if (ediff-comparison-metajob3 jobname)
  	(mapcar (function (lambda (elt)
--- 327,331 ----
  	    common)
      ;; intersect with the third dir
!     (if lis3 (setq common (ediff-intersection common lis3 comparison-func)))
      (if (ediff-comparison-metajob3 jobname)
  	(mapcar (function (lambda (elt)
*************** Moves in circular fashion. With numeric 
*** 331,347 ****
  		common))
  
!     ;; trying to avoid side effects of sorting
!     (setq common (sort (copy-list common) 'string-lessp))
  
      ;; compute difference list
!     (setq difflist (set-difference
! 		    (union (union lis1 lis2 ':test comparison-func)
! 			   lis3
! 			   ':test comparison-func)
  		    common
! 		    ':test comparison-func)
  	  difflist (delete "."  difflist)
! 	  ;; copy-list needed because sort sorts it by side effects
! 	  difflist (sort (copy-list (delete ".." difflist)) 'string-lessp))
  
      (setq difflist (mapcar (function (lambda (elt) (cons elt 1))) difflist))
--- 335,352 ----
  		common))
  
!     ;; copying is needed because sort sorts via side effects
!     (setq common (sort (ediff-copy-list common) 'string-lessp))
  
      ;; compute difference list
!     (setq difflist (ediff-set-difference
! 		    (ediff-union (ediff-union lis1 lis2 comparison-func)
! 				 lis3
! 				 comparison-func)
  		    common
! 		    comparison-func)
  	  difflist (delete "."  difflist)
! 	  ;; copying is needed because sort sorts via side effects
! 	  difflist (sort (ediff-copy-list (delete ".." difflist))
! 			 'string-lessp))
  
      (setq difflist (mapcar (function (lambda (elt) (cons elt 1))) difflist))
*************** Moves in circular fashion. With numeric 
*** 374,378 ****
  ;; display subdirectories, too, since we may visit them recursively.
  (defun ediff-get-directory-files-under-revision (jobname regexp dir1)
-   (require 'cl)
    (let (lis1 elt common auxdir1)
      (setq auxdir1 (file-name-as-directory dir1)
--- 379,382 ----
*************** Moves in circular fashion. With numeric 
*** 386,390 ****
  	     (setq common (cons elt common)))
  	    ((file-exists-p (concat auxdir1 elt ",v"))
! 	     (setq common (cons elt common))))
        ) ; while
  
--- 390,397 ----
  	     (setq common (cons elt common)))
  	    ((file-exists-p (concat auxdir1 elt ",v"))
! 	     (setq common (cons elt common)))
! 	    ((file-exists-p (concat auxdir1 "RCS/" elt ",v"))
! 	     (setq common (cons elt common)))
! 	    ) ; cond
        ) ; while
  
*************** Moves in circular fashion. With numeric 
*** 392,397 ****
  	  common (delete ".." common))
  
!     ;; trying to avoid side effects of sorting
!     (setq common (sort (copy-list common) 'string-lessp))
  
      ;; return result
--- 399,404 ----
  	  common (delete ".." common))
  
!     ;; copying is needed because sort sorts via side effects
!     (setq common (sort (ediff-copy-list common) 'string-lessp))
  
      ;; return result
*************** Useful commands:
*** 939,943 ****
  	(ediff-eval-in-buffer session-buf
  	  (if (eq ediff-control-buffer session-buf) ; individual session
! 	      (setq custom-diff-buf ediff-custom-diff-buffer))))
  
      (or (ediff-buffer-live-p meta-diff-buff)
--- 946,952 ----
  	(ediff-eval-in-buffer session-buf
  	  (if (eq ediff-control-buffer session-buf) ; individual session
! 	      (progn
! 		(ediff-compute-custom-diffs-maybe)
! 		(setq custom-diff-buf ediff-custom-diff-buffer)))))
  
      (or (ediff-buffer-live-p meta-diff-buff)
*************** Useful commands:
*** 950,954 ****
  	     (insert-buffer custom-diff-buf)
  	     (insert "\n")))
! 	  ((eq metajob 'ediff-directories)
  	   ;; get diffs by calling shell command on ediff-custom-diff-program
  	   (save-excursion
--- 959,965 ----
  	     (insert-buffer custom-diff-buf)
  	     (insert "\n")))
! 	  ((memq metajob '(ediff-directories 
! 			   ediff-merge-directories
! 			   ediff-merge-directories-with-ancestor))
  	   ;; get diffs by calling shell command on ediff-custom-diff-program
  	   (save-excursion
*************** Useful commands:
*** 967,974 ****
  	     (insert "\n")))
  	  (t
! 	   (error
! 	    "Session %d is marked but inactive--can't make its diff"
! 	    sessionNum)))
! 	  ))
  
  (defun ediff-collect-custom-diffs ()
--- 978,983 ----
  	     (insert "\n")))
  	  (t
! 	   (error "Can't make context diff for Session %d" sessionNum )))
!     ))
  
  (defun ediff-collect-custom-diffs ()
*************** all marked sessions must be active."
*** 1182,1189 ****
  		 (set-window-buffer (selected-window) meta-buf)))
  	))
!     (if (ediff-window-display-p)
  	(progn
! 	  (setq frame
! 		(window-frame (ediff-get-visible-buffer-window meta-buf)))
  	  (raise-frame frame)
  	  (ediff-reset-mouse frame)))
--- 1191,1199 ----
  		 (set-window-buffer (selected-window) meta-buf)))
  	))
!     (if (and (ediff-window-display-p)
! 	     (window-live-p 
! 	      (setq wind (ediff-get-visible-buffer-window meta-buf))))
  	(progn
! 	  (setq frame (window-frame wind))
  	  (raise-frame frame)
  	  (ediff-reset-mouse frame)))
*************** all marked sessions must be active."
*** 1210,1214 ****
    (let (wind frame)
      ;; for some reason, point moves in ediff-registry-buffer, so we preserve it
!     ;; explicity
      (ediff-eval-in-buffer ediff-registry-buffer
        (save-excursion
--- 1220,1224 ----
    (let (wind frame)
      ;; for some reason, point moves in ediff-registry-buffer, so we preserve it
!     ;; explicitly
      (ediff-eval-in-buffer ediff-registry-buffer
        (save-excursion
*************** If this is a session registry buffer the
*** 1319,1323 ****
  	     (beep)
  	     (message
! 	      "Group has active sessions, panel not deleted")))
        (ediff-cleanup-meta-buffer parent-buf)
        (ediff-kill-buffer-carefully dir-diffs-buffer)
--- 1329,1333 ----
  	     (beep)
  	     (message
! 	      "Session group suspended, not deleted (has active sessions)")))
        (ediff-cleanup-meta-buffer parent-buf)
        (ediff-kill-buffer-carefully dir-diffs-buffer)
*************** If this is a session registry buffer the
*** 1339,1343 ****
      
  
! ;; obtain information on a meta record where the user clicked or typed
  ;; BUF is the buffer where this happened and POINT is the position
  ;; If optional NOERROR arg is given, don't report error and return nil if no
--- 1349,1353 ----
      
  
! ;; Obtain information on a meta record where the user clicked or typed
  ;; BUF is the buffer where this happened and POINT is the position
  ;; If optional NOERROR arg is given, don't report error and return nil if no
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/ediff-util.el emacs-19.31/lisp/ediff-util.el
*** emacs-19.30/lisp/ediff-util.el	Mon Nov 20 17:03:55 1995
--- emacs-19.31/lisp/ediff-util.el	Wed Feb 21 15:21:35 1996
***************
*** 1,4 ****
  ;;; ediff-util.el --- the core commands and utilities of ediff
! ;;; Copyright (C) 1994, 1995 Free Software Foundation, Inc.
  
  ;; Author: Michael Kifer <kifer@cs.sunysb.edu>
--- 1,5 ----
  ;;; ediff-util.el --- the core commands and utilities of ediff
! 
! ;; Copyright (C) 1994, 1995 Free Software Foundation, Inc.
  
  ;; Author: Michael Kifer <kifer@cs.sunysb.edu>
***************
*** 17,23 ****
  
  ;; 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.
! 
  
  ;;; Code:
--- 18,24 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Code:
*************** to invocation.")
*** 138,153 ****
  	 (define-key ediff-mode-map "/" 'ediff-show-ancestor)
  	 ;; In merging, we allow only A->C and B->C copying.
! 	 (define-key ediff-mode-map "a" (function
! 					 (lambda (arg)
! 					   (interactive "P")
! 					   (ediff-diff-to-diff arg "ac"))))
! 	 (define-key ediff-mode-map "b" (function
! 					 (lambda (arg)
! 					   (interactive "P")
! 					   (ediff-diff-to-diff arg "bc"))))
! 	 (define-key ediff-mode-map "r" (function
! 					 (lambda (arg)
! 					   (interactive "P")
! 					   (ediff-restore-diff arg ?c))))
  	 (define-key ediff-mode-map "s" 'ediff-shrink-window-C)
  	 (define-key ediff-mode-map "+" 'ediff-combine-diffs)
--- 139,145 ----
  	 (define-key ediff-mode-map "/" 'ediff-show-ancestor)
  	 ;; In merging, we allow only A->C and B->C copying.
! 	 (define-key ediff-mode-map "a" 'ediff-copy-A-to-C)
! 	 (define-key ediff-mode-map "b" 'ediff-copy-B-to-C)
! 	 (define-key ediff-mode-map "r" 'ediff-restore-diff-in-merge-buffer)
  	 (define-key ediff-mode-map "s" 'ediff-shrink-window-C)
  	 (define-key ediff-mode-map "+" 'ediff-combine-diffs)
*************** to invocation.")
*** 155,165 ****
  	 (define-key ediff-mode-map "&" 'ediff-re-merge))
  	(ediff-3way-comparison-job
! 	 (define-key ediff-mode-map "ab" 'ediff-diff-to-diff)
! 	 (define-key ediff-mode-map "ba" 'ediff-diff-to-diff)
! 	 (define-key ediff-mode-map "ac" 'ediff-diff-to-diff)
! 	 (define-key ediff-mode-map "bc" 'ediff-diff-to-diff)
  	 (define-key ediff-mode-map "c" nil)
! 	 (define-key ediff-mode-map "ca" 'ediff-diff-to-diff)
! 	 (define-key ediff-mode-map "cb" 'ediff-diff-to-diff)
  	 (define-key ediff-mode-map "ra" 'ediff-restore-diff)
  	 (define-key ediff-mode-map "rb" 'ediff-restore-diff)
--- 147,157 ----
  	 (define-key ediff-mode-map "&" 'ediff-re-merge))
  	(ediff-3way-comparison-job
! 	 (define-key ediff-mode-map "ab" 'ediff-copy-A-to-B)
! 	 (define-key ediff-mode-map "ba" 'ediff-copy-B-to-A)
! 	 (define-key ediff-mode-map "ac" 'ediff-copy-A-to-C)
! 	 (define-key ediff-mode-map "bc" 'ediff-copy-B-to-C)
  	 (define-key ediff-mode-map "c" nil)
! 	 (define-key ediff-mode-map "ca" 'ediff-copy-C-to-A)
! 	 (define-key ediff-mode-map "cb" 'ediff-copy-C-to-B)
  	 (define-key ediff-mode-map "ra" 'ediff-restore-diff)
  	 (define-key ediff-mode-map "rb" 'ediff-restore-diff)
*************** to invocation.")
*** 167,178 ****
  	 (define-key ediff-mode-map "C"  'ediff-toggle-read-only))
  	(t ; 2-way comparison
! 	 (define-key ediff-mode-map "a" (function
! 					 (lambda (arg)
! 					   (interactive "P")
! 					   (ediff-diff-to-diff arg "ab"))))
! 	 (define-key ediff-mode-map "b" (function
! 					 (lambda (arg)
! 					   (interactive "P")
! 					   (ediff-diff-to-diff arg "ba"))))
  	 (define-key ediff-mode-map "ra" 'ediff-restore-diff)
  	 (define-key ediff-mode-map "rb" 'ediff-restore-diff))
--- 159,164 ----
  	 (define-key ediff-mode-map "C"  'ediff-toggle-read-only))
  	(t ; 2-way comparison
! 	 (define-key ediff-mode-map "a"  'ediff-copy-A-to-B)
! 	 (define-key ediff-mode-map "b"  'ediff-copy-B-to-A)
  	 (define-key ediff-mode-map "ra" 'ediff-restore-diff)
  	 (define-key ediff-mode-map "rb" 'ediff-restore-diff))
*************** to invocation.")
*** 208,213 ****
  (require 'ediff-wind)
  
! (or (boundp 'synchronize-minibuffers)
!     (defvar synchronize-minibuffers nil))
  
  ;; Common startup entry for all Ediff functions
--- 194,200 ----
  (require 'ediff-wind)
  
! ;; No longer needed: XEmacs has surrogate minibuffers now.
! ;;(or (boundp 'synchronize-minibuffers)
! ;;    (defvar synchronize-minibuffers nil))
  
  ;; Common startup entry for all Ediff functions
*************** to invocation.")
*** 241,245 ****
  	    ediff-word-mode-job (ediff-word-mode-job))
  	
!       (make-local-variable 'ediff-prefer-long-help-message)
        (make-local-variable 'ediff-prefer-iconified-control-frame)
        (make-local-variable 'ediff-split-window-function)
--- 228,232 ----
  	    ediff-word-mode-job (ediff-word-mode-job))
  	
!       (make-local-variable 'ediff-use-long-help-message)
        (make-local-variable 'ediff-prefer-iconified-control-frame)
        (make-local-variable 'ediff-split-window-function)
*************** to invocation.")
*** 254,264 ****
  	  (setq ediff-keep-variants t))
  
!       ;; XEmacs has local-pre-command-hook
!       (if ediff-emacs-p
! 	  (make-local-variable 'pre-command-hook))
! 
!       (if ediff-emacs-p
! 	  (add-hook 'pre-command-hook 'ediff-spy-after-mouse)
! 	(add-hook 'local-pre-command-hook 'ediff-spy-after-mouse))
        (setq ediff-mouse-pixel-position (mouse-pixel-position))
        
--- 241,247 ----
  	  (setq ediff-keep-variants t))
  
!       (make-local-hook 'pre-command-hook)
!       (if (ediff-window-display-p)
! 	  (add-hook 'pre-command-hook 'ediff-spy-after-mouse))
        (setq ediff-mouse-pixel-position (mouse-pixel-position))
        
*************** to invocation.")
*** 490,494 ****
    (save-excursion
      (goto-char (point-min))
!     (if ediff-prefer-long-help-message
  	(next-line 1))
      (end-of-line)
--- 473,477 ----
    (save-excursion
      (goto-char (point-min))
!     (if ediff-use-long-help-message
  	(next-line 1))
      (end-of-line)
*************** to invocation.")
*** 546,550 ****
  	       ediff-brief-message-string)
  	      ))
!   (setq ediff-help-message (if ediff-prefer-long-help-message
  			       ediff-long-help-message
  			     ediff-brief-help-message))
--- 529,533 ----
  	       ediff-brief-message-string)
  	      ))
!   (setq ediff-help-message (if ediff-use-long-help-message
  			       ediff-long-help-message
  			     ediff-brief-help-message))
*************** Reestablish the default three-window dis
*** 703,711 ****
    (ediff-barf-if-not-control-buffer)
    
!   ;; force all minibuffer to display ediff's messages.
!   ;; when xemacs implements minibufferless frames, this won't be necessary
!   (if ediff-xemacs-p (setq synchronize-minibuffers t))
    
-   (setq ediff-disturbed-overlays nil) ; clear after use
    (let (buffer-read-only)
      (if (and (ediff-buffer-live-p ediff-buffer-A)
--- 686,692 ----
    (ediff-barf-if-not-control-buffer)
    
! ;;  ;; No longer needed: XEmacs has surrogate minibuffers now.
! ;;  (if ediff-xemacs-p (setq synchronize-minibuffers t))
    
    (let (buffer-read-only)
      (if (and (ediff-buffer-live-p ediff-buffer-A)
*************** Reestablish the default three-window dis
*** 716,722 ****
  	 ediff-buffer-A ediff-buffer-B ediff-buffer-C ediff-control-buffer)
        (or (eq this-command 'ediff-quit)
! 	  (message
! 	   "You've killed an essential Ediff buffer---Please quit Ediff"
! 	   (beep 1)))
        ))
    
--- 697,702 ----
  	 ediff-buffer-A ediff-buffer-B ediff-buffer-C ediff-control-buffer)
        (or (eq this-command 'ediff-quit)
! 	  (message ediff-KILLED-VITAL-BUFFER
! 		   (beep 1)))
        ))
    
*************** Reestablish the default three-window dis
*** 734,738 ****
  		       ediff-toggle-wide-display ediff-toggle-multiframe))
  	       ;; Or one of the movement cmds and prev cmd was an Ediff cmd
! 	       ;; This avoids rasing frames unnecessarily.
  	       (and (memq this-command
  			  '(ediff-next-difference
--- 714,718 ----
  		       ediff-toggle-wide-display ediff-toggle-multiframe))
  	       ;; Or one of the movement cmds and prev cmd was an Ediff cmd
! 	       ;; This avoids raising frames unnecessarily.
  	       (and (memq this-command
  			  '(ediff-next-difference
*************** Reestablish the default three-window dis
*** 751,755 ****
    (if (and (ediff-window-display-p)
  	   (frame-live-p ediff-control-frame)
! 	   (not ediff-prefer-long-help-message)
  	   (not (ediff-frame-iconified-p ediff-control-frame)))
        (raise-frame ediff-control-frame))
--- 731,735 ----
    (if (and (ediff-window-display-p)
  	   (frame-live-p ediff-control-frame)
! 	   (not ediff-use-long-help-message)
  	   (not (ediff-frame-iconified-p ediff-control-frame)))
        (raise-frame ediff-control-frame))
*************** Reestablish the default three-window dis
*** 773,780 ****
  	  
  	  (ediff-eval-in-buffer control-buf
! 	    (ediff-recenter-ancestor) ; it checks if ancestor is alive
  	    
  	    (if (and (ediff-multiframe-setup-p)
! 		     (not ediff-prefer-long-help-message)
  		     (not (ediff-frame-iconified-p ediff-control-frame)))
  		;; never grab mouse on quit in this place
--- 753,760 ----
  	  
  	  (ediff-eval-in-buffer control-buf
! 	    (ediff-recenter-ancestor) ; check if ancestor is alive
  	    
  	    (if (and (ediff-multiframe-setup-p)
! 		     (not ediff-use-long-help-message)
  		     (not (ediff-frame-iconified-p ediff-control-frame)))
  		;; never grab mouse on quit in this place
*************** On a dumb terminal, switches between ASC
*** 870,874 ****
    (interactive)
    (ediff-barf-if-not-control-buffer)
!   (if (not (ediff-window-display-p))
        (if (eq ediff-highlighting-style 'ascii)
  	  (progn
--- 850,854 ----
    (interactive)
    (ediff-barf-if-not-control-buffer)
!   (if (not (ediff-has-face-support-p))
        (if (eq ediff-highlighting-style 'ascii)
  	  (progn
*************** In both cases, operates on the currrent 
*** 951,959 ****
    (let (buffer-read-only)
      (erase-buffer)
!     (setq ediff-prefer-long-help-message (not ediff-prefer-long-help-message))
      (ediff-set-help-message))
    ;; remember the icon status of the control frame when the user requested
    ;; full control message
!   (if (and ediff-prefer-long-help-message (ediff-multiframe-setup-p))
        (setq ediff-prefer-iconified-control-frame
  	    (ediff-frame-iconified-p ediff-control-frame)))
--- 931,939 ----
    (let (buffer-read-only)
      (erase-buffer)
!     (setq ediff-use-long-help-message (not ediff-use-long-help-message))
      (ediff-set-help-message))
    ;; remember the icon status of the control frame when the user requested
    ;; full control message
!   (if (and ediff-use-long-help-message (ediff-multiframe-setup-p))
        (setq ediff-prefer-iconified-control-frame
  	    (ediff-frame-iconified-p ediff-control-frame)))
*************** of the current buffer."
*** 971,979 ****
    (interactive)
    (ediff-barf-if-not-control-buffer)
!   (let ((ctl-buf (if (null buf) (current-buffer))))
      (or buf (ediff-recenter))
      (or buf
! 	(setq buf
! 	      (ediff-get-buffer (ediff-char-to-buftype last-command-char))))
  	      
      (ediff-eval-in-buffer buf     ; eval in buf A/B/C
--- 951,959 ----
    (interactive)
    (ediff-barf-if-not-control-buffer)
!   (let ((ctl-buf (if (null buf) (current-buffer)))
! 	(buf-type (ediff-char-to-buftype last-command-char)))
      (or buf (ediff-recenter))
      (or buf
! 	(setq buf (ediff-get-buffer buf-type)))
  	      
      (ediff-eval-in-buffer buf     ; eval in buf A/B/C
*************** of the current buffer."
*** 1009,1014 ****
  		   (ediff-eval-in-buffer ctl-buf
  		     (ediff-change-saved-variable
! 		      'buffer-read-only nil
! 		      (ediff-char-to-buftype last-command-char))))
  		  (t
  		   (setq toggle-ro-cmd 'toggle-read-only)
--- 989,993 ----
  		   (ediff-eval-in-buffer ctl-buf
  		     (ediff-change-saved-variable
! 		      'buffer-read-only nil buf-type)))
  		  (t
  		   (setq toggle-ro-cmd 'toggle-read-only)
*************** of the current buffer."
*** 1041,1054 ****
  ;; able to read such a file anyway).
  ;; FILE is a string representing file name
! (defsubst ediff-file-checked-out-p (file)
    (and (stringp file)
         (file-exists-p file)
         (file-writable-p file)
!        (file-exists-p (concat file ",v"))))
! (defsubst ediff-file-checked-in-p (file)
    (and (stringp file)
         (file-exists-p file)
         (not (file-writable-p file))
!        (file-exists-p (concat file ",v"))))
        
  (defun ediff-swap-buffers ()
--- 1020,1039 ----
  ;; able to read such a file anyway).
  ;; FILE is a string representing file name
! (defun ediff-file-checked-out-p (file)
    (and (stringp file)
         (file-exists-p file)
         (file-writable-p file)
!        (or
! 	(file-exists-p (concat file ",v"))
! 	(file-exists-p (concat "RCS/" file ",v")))
!        ))
! (defun ediff-file-checked-in-p (file)
    (and (stringp file)
         (file-exists-p file)
         (not (file-writable-p file))
!        (or
! 	(file-exists-p (concat file ",v"))
! 	(file-exists-p (concat "RCS/" file ",v")))
!        ))
        
  (defun ediff-swap-buffers ()
*************** of the current buffer."
*** 1063,1067 ****
  	    (focus-regexp ediff-regexp-focus-A)
  	    (wide-visibility-p (eq ediff-visible-bounds ediff-wide-bounds))
! 	    (overlay (if (ediff-window-display-p)
  			 ediff-current-diff-overlay-A)))
  	(if ediff-3way-comparison-job
--- 1048,1052 ----
  	    (focus-regexp ediff-regexp-focus-A)
  	    (wide-visibility-p (eq ediff-visible-bounds ediff-wide-bounds))
! 	    (overlay (if (ediff-has-face-support-p)
  			 ediff-current-diff-overlay-A)))
  	(if ediff-3way-comparison-job
*************** of the current buffer."
*** 1112,1116 ****
  	;; The following is needed for XEmacs, since there one can't move
  	;; overlay to another buffer. In Emacs, this swap is redundant.
! 	(if (ediff-window-display-p)
  	    (if ediff-3way-comparison-job
  		(setq ediff-current-diff-overlay-A ediff-current-diff-overlay-C
--- 1097,1101 ----
  	;; The following is needed for XEmacs, since there one can't move
  	;; overlay to another buffer. In Emacs, this swap is redundant.
! 	(if (ediff-has-face-support-p)
  	    (if ediff-3way-comparison-job
  		(setq ediff-current-diff-overlay-A ediff-current-diff-overlay-C
*************** Used in ediff-windows/regions only."
*** 1219,1224 ****
    (interactive)
    (if (eq ediff-buffer-A ediff-buffer-B)
!       (error
!        "Buffers A and B are the same. Can't narrow to two different regions"))
    (if (eq ediff-visible-bounds ediff-wide-bounds)
        (setq ediff-visible-bounds ediff-narrow-bounds)
--- 1204,1208 ----
    (interactive)
    (if (eq ediff-buffer-A ediff-buffer-B)
!       (error ediff-NO-DIFFERENCES))
    (if (eq ediff-visible-bounds ediff-wide-bounds)
        (setq ediff-visible-bounds ediff-narrow-bounds)
*************** Used in ediff-windows/regions only."
*** 1255,1259 ****
  	 (ediff-overlay-start overl-B) (ediff-overlay-end overl-B)))
        
!       (if ediff-3way-job
  	  (ediff-eval-in-buffer ediff-buffer-C
  	    (narrow-to-region
--- 1239,1243 ----
  	 (ediff-overlay-start overl-B) (ediff-overlay-end overl-B)))
        
!       (if ediff-3way-comparison-job
  	  (ediff-eval-in-buffer ediff-buffer-C
  	    (narrow-to-region
*************** Used in ediff-windows/regions only."
*** 1277,1281 ****
  		(or (not ediff-3way-job) ediff-buffer-C)
  		))
!       (error "You've killed an essential Ediff buffer---Please quit Ediff"))
  	
    (let* ((wind (selected-window))
--- 1261,1265 ----
  		(or (not ediff-3way-job) ediff-buffer-C)
  		))
!       (error ediff-KILLED-VITAL-BUFFER))
  	
    (let* ((wind (selected-window))
*************** Used in ediff-windows/regions only."
*** 1308,1312 ****
    "Vertically scroll buffers A, B \(and C if appropriate\).
  With optional argument ARG, scroll ARG lines; otherwise scroll by nearly
! the height of window-A."
    (interactive "P")
    (ediff-barf-if-not-control-buffer)
--- 1292,1296 ----
    "Vertically scroll buffers A, B \(and C if appropriate\).
  With optional argument ARG, scroll ARG lines; otherwise scroll by nearly
! the one half of the height of window-A."
    (interactive "P")
    (ediff-barf-if-not-control-buffer)
*************** the height of window-A."
*** 1320,1324 ****
  		    (ediff-buffer-live-p ediff-buffer-C))
  		))
!       (error "You've killed an essential Ediff buffer---Please quit Ediff"))
        
    (ediff-operate-on-windows
--- 1304,1308 ----
  		    (ediff-buffer-live-p ediff-buffer-C))
  		))
!       (error ediff-KILLED-VITAL-BUFFER))
        
    (ediff-operate-on-windows
*************** the width of the A/B/C windows."
*** 1364,1368 ****
  		    (ediff-buffer-live-p ediff-buffer-C))
  		))
!       (error "You've killed an essential Ediff buffer---Please quit Ediff"))
      
    (ediff-operate-on-windows
--- 1348,1352 ----
  		    (ediff-buffer-live-p ediff-buffer-C))
  		))
!       (error ediff-KILLED-VITAL-BUFFER))
      
    (ediff-operate-on-windows
*************** the width of the A/B/C windows."
*** 1421,1425 ****
  				(point)))
  		       ;; `end' may be beyond the window bottom, so check
! 		       ;; that we are making progres
  		       (< prev-point (point)))
  	    (setq prev-point (point))
--- 1405,1409 ----
  				(point)))
  		       ;; `end' may be beyond the window bottom, so check
! 		       ;; that we are making progress
  		       (< prev-point (point)))
  	    (setq prev-point (point))
*************** With a prefix argument, go back that man
*** 1566,1570 ****
  	   (< difference-number (1+ ediff-number-of-differences)))
        (ediff-unselect-and-select-difference difference-number)
!     (error "Bad difference number, %d" difference-number)))
        
  (defun ediff-jump-to-difference-at-point ()
--- 1550,1555 ----
  	   (< difference-number (1+ ediff-number-of-differences)))
        (ediff-unselect-and-select-difference difference-number)
!     (error "Bad difference number, %d. Valid numbers are 1 to %d"
! 	   (1+ difference-number) ediff-number-of-differences)))
        
  (defun ediff-jump-to-difference-at-point ()
*************** invoked this command."
*** 1610,1615 ****
  
  (defun ediff-diff-to-diff (arg &optional keys)
!   "Copy buffer-X'th diff to buffer Y \(X,Y are A, B, or C\).
! If numerical prefix argument, copy this diff specified in the arg.
  Otherwise, copy the difference given by `ediff-current-difference'.
  This command assumes it is bound to a 2-character key sequence, `ab', `ba',
--- 1595,1600 ----
  
  (defun ediff-diff-to-diff (arg &optional keys)
!   "Copy buffer-X'th difference region to buffer Y \(X,Y are A, B, or C\).
! If numerical prefix argument, copy the difference specified in the arg.
  Otherwise, copy the difference given by `ediff-current-difference'.
  This command assumes it is bound to a 2-character key sequence, `ab', `ba',
*************** determine the source and the target buff
*** 1623,1627 ****
    (ediff-barf-if-not-control-buffer)
    (or keys (setq keys (this-command-keys)))
!   (if arg
        (ediff-jump-to-difference arg))
    (let* ((key1 (aref keys 0))
--- 1608,1612 ----
    (ediff-barf-if-not-control-buffer)
    (or keys (setq keys (this-command-keys)))
!   (if (numberp arg)
        (ediff-jump-to-difference arg))
    (let* ((key1 (aref keys 0))
*************** determine the source and the target buff
*** 1636,1639 ****
--- 1621,1661 ----
      (ediff-recenter)))
  
+ (defun ediff-copy-A-to-B (arg)
+   "Copy ARGth difference region from buffer A to B.
+ ARG is a prefix argument. If nil, copy the current difference region."
+   (interactive "P")
+   (ediff-diff-to-diff arg "ab"))
+ 
+ (defun ediff-copy-B-to-A (arg)
+   "Copy ARGth difference region from buffer B to A.
+ ARG is a prefix argument. If nil, copy the current difference region."
+   (interactive "P")
+   (ediff-diff-to-diff arg "ba"))
+ 
+ (defun ediff-copy-A-to-C (arg)
+   "Copy ARGth difference region from buffer A to buffer C.
+ ARG is a prefix argument. If nil, copy the current difference region."
+   (interactive "P")
+   (ediff-diff-to-diff arg "ac"))
+ 
+ (defun ediff-copy-B-to-C (arg)
+   "Copy ARGth difference region from buffer B to buffer C.
+ ARG is a prefix argument. If nil, copy the current difference region."
+   (interactive "P")
+   (ediff-diff-to-diff arg "bc"))
+ 
+ (defun ediff-copy-C-to-B (arg)
+   "Copy ARGth difference region from buffer C to B.
+ ARG is a prefix argument. If nil, copy the current difference region."
+   (interactive "P")
+   (ediff-diff-to-diff arg "cb"))
+ 
+ (defun ediff-copy-C-to-A (arg)
+   "Copy ARGth difference region from buffer C to A.
+ ARG is a prefix argument. If nil, copy the current difference region."
+   (interactive "P")
+   (ediff-diff-to-diff arg "ca"))
+ 
+ 
  
  ;; Copy diff N from FROM-BUF-TYPE \(given as A, B or C\) to TO-BUF-TYPE.
*************** determine the source and the target buff
*** 1665,1672 ****
  			 reg-to-delete-beg reg-to-delete-end))
      
-     (setq ediff-disturbed-overlays nil) ; clear before use
-     
      (if (string= reg-to-delete reg-to-copy)
! 	(setq saved-p nil)     ; refuse to copy identical buffers
        ;; seems ok to copy
        (if (or batch-invocation (ediff-test-save-region n to-buf-type))
--- 1687,1692 ----
  			 reg-to-delete-beg reg-to-delete-end))
      
      (if (string= reg-to-delete reg-to-copy)
! 	(setq saved-p nil) ; don't copy identical buffers
        ;; seems ok to copy
        (if (or batch-invocation (ediff-test-save-region n to-buf-type))
*************** determine the source and the target buff
*** 1676,1703 ****
  		  ;; to prevent flags from interfering if buffer is writable
  		  (let ((inhibit-read-only (null buffer-read-only)))
- 		    ;; these two insert a dummy char to overcome a bug in
- 		    ;; XEmacs, which sometimes prevents 0-length extents
- 		    ;; from sensing insertion at its end-points.
- 		    ;; (need to check if 19.12 still has the bug)
- 		    (if ediff-xemacs-p
- 			(progn
- 			  (goto-char reg-to-delete-end)
- 			  (insert-before-markers "@")))
  		    
  		    (goto-char reg-to-delete-end)
! 		    (insert-before-markers reg-to-copy)
  		    
! 		    ;; delete the dummy char "@"
! 		    (if ediff-xemacs-p
! 			(delete-char 1))
! 		    
! 		    (if ediff-xemacs-p
! 			(if (> reg-to-delete-end reg-to-delete-beg)
! 			    (kill-region reg-to-delete-beg
! 					 reg-to-delete-end))
! 		      (if (> reg-to-delete-end reg-to-delete-beg)
! 			  (kill-region reg-to-delete-beg reg-to-delete-end)
! 			(ediff-move-disturbed-overlays reg-to-delete-beg)
! 			))
  		    ))
  		(or batch-invocation
--- 1696,1705 ----
  		  ;; to prevent flags from interfering if buffer is writable
  		  (let ((inhibit-read-only (null buffer-read-only)))
  		    
  		    (goto-char reg-to-delete-end)
! 		    (insert reg-to-copy)
  		    
! 		    (if (> reg-to-delete-end reg-to-delete-beg)
! 			(kill-region reg-to-delete-beg reg-to-delete-end))
  		    ))
  		(or batch-invocation
*************** determine the source and the target buff
*** 1789,1824 ****
        (if (> ediff-number-of-differences 0)
  	  (error "Nothing saved for diff %d in buffer %S" (1+ n) buf-type)
! 	(error "No differences found")))
      
      (setq reg-beg (ediff-get-diff-posn buf-type 'beg n ediff-control-buffer))
      (setq reg-end (ediff-get-diff-posn buf-type 'end n ediff-control-buffer))
-     (setq ediff-disturbed-overlays nil) ; clear before use
      
      (condition-case conds
  	(ediff-eval-in-buffer buf
  	  (let ((inhibit-read-only (null buffer-read-only)))
- 	    ;; these two insert a dummy char to overcome a bug in XEmacs,
- 	    ;; which sometimes prevents 0-length extents from sensing
- 	    ;; insertion at its end-points.
- 	    ;; (need to check if 19.12 still has the bug)
- 	    (if ediff-xemacs-p
- 		(progn
- 		  (goto-char reg-end)
- 		  (insert-before-markers "@")))
  	    
  	    (goto-char reg-end)
! 	    (insert-before-markers saved-diff)
  	    
! 	    ;; delete dummy char
! 	    (if ediff-xemacs-p
! 		(delete-char 1))
! 	    
! 	    (if ediff-xemacs-p
! 		(if (> reg-end reg-beg)
! 		    (kill-region reg-beg reg-end))
! 	      (if (> reg-end reg-beg)
! 		  (kill-region reg-beg reg-end)
! 		(ediff-move-disturbed-overlays reg-beg)
! 		))
  	    
  	    (setq recovered t)
--- 1791,1808 ----
        (if (> ediff-number-of-differences 0)
  	  (error "Nothing saved for diff %d in buffer %S" (1+ n) buf-type)
! 	(error ediff-NO-DIFFERENCES)))
      
      (setq reg-beg (ediff-get-diff-posn buf-type 'beg n ediff-control-buffer))
      (setq reg-end (ediff-get-diff-posn buf-type 'end n ediff-control-buffer))
      
      (condition-case conds
  	(ediff-eval-in-buffer buf
  	  (let ((inhibit-read-only (null buffer-read-only)))
  	    
  	    (goto-char reg-end)
! 	    (insert saved-diff)
  	    
! 	    (if (> reg-end reg-beg)
! 		(kill-region reg-beg reg-end))
  	    
  	    (setq recovered t)
*************** determine the source and the target buff
*** 1852,1862 ****
  (defun ediff-restore-diff  (arg &optional key)
    "Restore ARGth diff from `ediff-killed-diffs-alist'.
! ARG is a prefix argument.  If ARG is nil, restore current-difference.
! 
  If the second optional argument, a character, is given, use it to
  determine the target buffer instead of last-command-char"
    (interactive "P")
    (ediff-barf-if-not-control-buffer)
!   (if arg
        (ediff-jump-to-difference arg))
    (ediff-pop-diff ediff-current-difference 
--- 1836,1845 ----
  (defun ediff-restore-diff  (arg &optional key)
    "Restore ARGth diff from `ediff-killed-diffs-alist'.
! ARG is a prefix argument.  If ARG is nil, restore the current-difference.
  If the second optional argument, a character, is given, use it to
  determine the target buffer instead of last-command-char"
    (interactive "P")
    (ediff-barf-if-not-control-buffer)
!   (if (numberp arg)
        (ediff-jump-to-difference arg))
    (ediff-pop-diff ediff-current-difference 
*************** determine the target buffer instead of l
*** 1865,1868 ****
--- 1848,1858 ----
    (let (ediff-verbose-p)
      (ediff-recenter)))
+ 
+ (defun ediff-restore-diff-in-merge-buffer (arg)
+   "Restore ARGth diff in the merge buffer.
+ ARG is a prefix argument. If nil, restore the current diff."
+   (interactive "P")
+   (ediff-restore-diff arg ?c))
+   
    
  (defun ediff-toggle-regexp-match ()
*************** the number seen by the user."
*** 1990,2012 ****
  	     (regex-C ediff-regexp-focus-C)
  	     (reg-A-match (ediff-eval-in-buffer ediff-buffer-A
! 			    (goto-char (ediff-get-diff-posn 'A 'beg n ctl-buf))
! 			    (re-search-forward
! 			     regex-A
! 			     (ediff-get-diff-posn 'A 'end n ctl-buf)
! 			     t)))
  	     (reg-B-match (ediff-eval-in-buffer ediff-buffer-B
! 			    (goto-char (ediff-get-diff-posn 'B 'beg n ctl-buf))
! 			    (re-search-forward
! 			     regex-B
! 			     (ediff-get-diff-posn 'B 'end n ctl-buf)
! 			     t)))
  	     (reg-C-match (if ediff-3way-comparison-job
  			      (ediff-eval-in-buffer ediff-buffer-C
! 				(goto-char
! 				 (ediff-get-diff-posn 'C 'beg n ctl-buf))
! 				(re-search-forward
! 				 regex-C
! 				 (ediff-get-diff-posn 'C 'end n ctl-buf)
! 				 t)))))
  	(not (eval (if ediff-3way-comparison-job
  		       (list ediff-focus-regexp-connective
--- 1980,2002 ----
  	     (regex-C ediff-regexp-focus-C)
  	     (reg-A-match (ediff-eval-in-buffer ediff-buffer-A
! 			    (save-restriction
! 			      (narrow-to-region
! 			       (ediff-get-diff-posn 'A 'beg n ctl-buf)
! 			       (ediff-get-diff-posn 'A 'end n ctl-buf))
! 			      (goto-char (point-min))
! 			      (re-search-forward regex-A nil t))))
  	     (reg-B-match (ediff-eval-in-buffer ediff-buffer-B
! 			    (save-restriction
! 			      (narrow-to-region
! 			       (ediff-get-diff-posn 'B 'beg n ctl-buf)
! 			       (ediff-get-diff-posn 'B 'end n ctl-buf))
! 			      (re-search-forward regex-B nil t))))
  	     (reg-C-match (if ediff-3way-comparison-job
  			      (ediff-eval-in-buffer ediff-buffer-C
! 				(save-restriction
! 				  (narrow-to-region
! 				   (ediff-get-diff-posn 'C 'beg n ctl-buf)
! 				   (ediff-get-diff-posn 'C 'end n ctl-buf))
! 				  (re-search-forward regex-C nil t))))))
  	(not (eval (if ediff-3way-comparison-job
  		       (list ediff-focus-regexp-connective
*************** the number seen by the user."
*** 2031,2053 ****
  	     (regex-C ediff-regexp-hide-C)
  	     (reg-A-match (ediff-eval-in-buffer ediff-buffer-A
! 			    (goto-char (ediff-get-diff-posn 'A 'beg n ctl-buf))
! 			    (re-search-forward
! 			     regex-A
! 			     (ediff-get-diff-posn 'A 'end n ctl-buf)
! 			     t)))
  	     (reg-B-match (ediff-eval-in-buffer ediff-buffer-B
! 			    (goto-char (ediff-get-diff-posn 'B 'beg n ctl-buf))
! 			    (re-search-forward
! 			     regex-B
! 			     (ediff-get-diff-posn 'B 'end n ctl-buf)
! 			     t)))
  	     (reg-C-match (if ediff-3way-comparison-job
  			      (ediff-eval-in-buffer ediff-buffer-C
! 				(goto-char
! 				 (ediff-get-diff-posn 'C 'beg n ctl-buf))
! 				(re-search-forward
! 				 regex-C
! 				 (ediff-get-diff-posn 'C 'end n ctl-buf)
! 				 t)))))
  	(eval (if ediff-3way-comparison-job
  		  (list ediff-hide-regexp-connective
--- 2021,2045 ----
  	     (regex-C ediff-regexp-hide-C)
  	     (reg-A-match (ediff-eval-in-buffer ediff-buffer-A
! 			    (save-restriction
! 			      (narrow-to-region
! 			       (ediff-get-diff-posn 'A 'beg n ctl-buf)
! 			       (ediff-get-diff-posn 'A 'end n ctl-buf))
! 			      (goto-char (point-min))
! 			      (re-search-forward regex-A nil t))))
  	     (reg-B-match (ediff-eval-in-buffer ediff-buffer-B
! 			    (save-restriction
! 			      (narrow-to-region
! 			       (ediff-get-diff-posn 'B 'beg n ctl-buf)
! 			       (ediff-get-diff-posn 'B 'end n ctl-buf))
! 			      (goto-char (point-min))
! 			      (re-search-forward regex-B nil t))))
  	     (reg-C-match (if ediff-3way-comparison-job
  			      (ediff-eval-in-buffer ediff-buffer-C
! 				(save-restriction
! 				  (narrow-to-region
! 				   (ediff-get-diff-posn 'C 'beg n ctl-buf)
! 				   (ediff-get-diff-posn 'C 'end n ctl-buf))
! 				  (goto-char (point-min))
! 				  (re-search-forward regex-C nil t))))))
  	(eval (if ediff-3way-comparison-job
  		  (list ediff-hide-regexp-connective
*************** temporarily reverses the meaning of this
*** 2196,2200 ****
      (ediff-kill-buffer-carefully ediff-debug-buffer)
  
-     ;;(redraw-display)
      (if (and (ediff-window-display-p) (frame-live-p ctl-frame))
  	(delete-frame ctl-frame))
--- 2188,2191 ----
*************** Hit \\[ediff-recenter] to reset the wind
*** 2378,2388 ****
  			 (t (1+ ediff-current-difference)))))
  
!     (cond (ediff-ignore-similar-regions
! 	   (princ "\nSkipping regions that differ only in white space & line breaks"))
! 	  (t 
! 	   (princ "\nNot skipping regions that differ in white space & line breaks")))
      
      (cond ((eq ediff-skip-diff-region-function 'ediff-show-all-diffs)
! 	   (princ "\nSelective browsing by regexp is off.\n"))
  	  ((eq ediff-skip-diff-region-function
  	       ediff-hide-regexp-matches-function)
--- 2369,2382 ----
  			 (t (1+ ediff-current-difference)))))
  
!     (princ
!      (format "\n%s regions that differ only in white space & line breaks"
! 	     (if ediff-ignore-similar-regions
! 		 "Skipping" "Not skipping")))
!     (if (and ediff-merge-job ediff-show-clashes-only)
! 	(princ
! 	 "\nFocusing on regions where both buffers differ from the ancestor"))
      
      (cond ((eq ediff-skip-diff-region-function 'ediff-show-all-diffs)
! 	   (princ "\nSelective browsing by regexp is off\n"))
  	  ((eq ediff-skip-diff-region-function
  	       ediff-hide-regexp-matches-function)
*************** Hit \\[ediff-recenter] to reset the wind
*** 2414,2442 ****
        (select-window ediff-control-window)))
      
- (defun ediff-documentation ()
-   "Jump to Ediff's Info file."
-   (interactive)
-   (let ((ctl-window ediff-control-window)
- 	(ctl-buf ediff-control-buffer))
- 
-     (ediff-skip-unsuitable-frames)
-     (condition-case nil
- 	(progn
- 	  (pop-to-buffer (get-buffer-create "*info*"))
- 	  (info "ediff.info")
- 	  (message "Type `i' to search for a specific topic"))
-       (error (beep 1)
- 	     (with-output-to-temp-buffer " *ediff-info*"
- 	       (princ (format "
- The Info file for Ediff does not seem to be installed.
- 
- This file is part of the distribution of %sEmacs.
- Please contact your system administrator. "
- 			      (if ediff-xemacs-p "X" ""))))
- 	     (if (window-live-p ctl-window)
- 		 (progn
- 		   (select-window ctl-window)
- 		   (set-window-buffer ctl-window ctl-buf)))))))
-     
  
  
--- 2408,2411 ----
*************** Please contact your system administrator
*** 2452,2456 ****
  	   (ediff-valid-difference-p n))
        (progn
! 	(if (and (ediff-window-display-p) ediff-use-faces)
  	    (progn
  	      (ediff-highlight-diff n)
--- 2421,2425 ----
  	   (ediff-valid-difference-p n))
        (progn
! 	(if (and (ediff-has-face-support-p) ediff-use-faces)
  	    (progn
  	      (ediff-highlight-diff n)
*************** Please contact your system administrator
*** 2479,2483 ****
    (if (ediff-valid-difference-p n)
        (progn 
! 	(cond ((and (ediff-window-display-p) ediff-use-faces)
  	       (ediff-unhighlight-diff))
  	      ((eq ediff-highlighting-style 'ascii)
--- 2448,2452 ----
    (if (ediff-valid-difference-p n)
        (progn 
! 	(cond ((and (ediff-has-face-support-p) ediff-use-faces)
  	       (ediff-unhighlight-diff))
  	      ((eq ediff-highlighting-style 'ascii)
*************** Please contact your system administrator
*** 2578,2593 ****
      f)) 
    
! ;; If `prefix' is given, then it is used as a prefix for the temp file
! ;; name. Otherwise, `ediff_' is used. If `file' is given, use this
  ;; file and don't create a new one.
  ;; Also, save buffer from START to END in the file.
  ;; START defaults to (point-min), END to (point-max)
  (defun ediff-make-temp-file (buff &optional prefix given-file start end)
!   (let ((f (or given-file
! 	       (make-temp-name (concat
! 				ediff-temp-file-prefix
! 				(if prefix
! 				    (concat prefix "_")
! 				    "ediff_"))))))
      ;; create the file
      (ediff-eval-in-buffer buff
--- 2547,2579 ----
      f)) 
    
! ;; If PREFIX is given, then it is used as a prefix for the temp file
! ;; name. Otherwise, `ediff_' is used. If FILE is given, use this
  ;; file and don't create a new one.
+ ;; On MS-DOS, make sure the prefix isn't longer than 7 characters, or
+ ;; else `make-temp-name' isn't guaranteed to return a unique filename.
  ;; Also, save buffer from START to END in the file.
  ;; START defaults to (point-min), END to (point-max)
  (defun ediff-make-temp-file (buff &optional prefix given-file start end)
!   (let ((p (or prefix "ediff"))
! 	f)
!     (if (and (eq system-type 'ms-dos) (> (length p) 7))
! 	(setq p (substring p 0 7)))
! 
!     (setq f (concat ediff-temp-file-prefix p)
! 	  f (cond (given-file)
! 		  ((find-file-name-handler f 'find-file-noselect)
! 		   ;; to thwart file handlers in write-region, e.g., if file
! 		   ;; name ends with .Z or .gz
! 		   ;; This is needed so that patches produced by ediff will
! 		   ;; have more meaningful names
! 		   (make-temp-name f))
! 		  ;; Prefix is most often the same as the file name for the
! 		  ;; variant. Here we are trying to use the original file name
! 		  ;; but in the temp directory.
! 		  ((and prefix (not (file-exists-p f))) f)
! 		  ;; If a file with the orig name exists, add some random stuff
! 		  ;; to it.
! 		  (t (make-temp-name f))))
!     
      ;; create the file
      (ediff-eval-in-buffer buff
*************** Please contact your system administrator
*** 2617,2621 ****
  ;; to do what is necessary to make them the same.
  ;; If file has file handlers (indicated by the optional arg), then we
! ;; offer to instead of saving. This is one difference with Emerge. 
  ;; Another is that we always offer to revert obsolete files, whether they
  ;; are modified or not.
--- 2603,2607 ----
  ;; to do what is necessary to make them the same.
  ;; If file has file handlers (indicated by the optional arg), then we
! ;; offer to revert instead of saving. This is one difference with Emerge. 
  ;; Another is that we always offer to revert obsolete files, whether they
  ;; are modified or not.
*************** Please contact your system administrator
*** 2649,2695 ****
  
  
- 
- ;; It would be nice to use these two functions as hooks instead of
- ;; ediff-insert-in-front and ediff-move-disturbed-overlays.
- ;; However, Emacs has a bug that causes BEG and END, below, to be
- ;; the same, i.e., the end of inserted text is not passed correctly.
- ;; Since the overlay doesn't move when these hooks run, 
- ;; there is no way to correctly determine the new (desired) position of
- ;; the overlay end.
- ;; Either this bug is fixed, or (better) use sticky overlays when they will
- ;; be implemented in Emacs, like they are in XEmacs.
- ;;(defun ediff-capture-inserts-in-front (overl flag beg end &optional len)
- ;;  (if (and flag (ediff-overlay-get overl 'ediff-diff-num))
- ;;      (ediff-move-overlay overl beg (ediff-overlay-end overl))
- ;;    ))
- ;;
- ;;(defun ediff-capture-inserts-behind (overl flag beg end &optional len)
- ;;  (if (and flag (ediff-overlay-get overl 'ediff-diff-num))
- ;;      (ediff-move-overlay overl (ediff-overlay-start overl) (point))
- ;;  ))
-   
- ;; to be deleted in due time
- ;; Capture overlays that had insertions in the front.
- ;; Called when overlay OVERL gets insertion in front.
- (defun ediff-insert-in-front (overl &optional flag beg end length)
-   (if (ediff-overlay-get overl 'ediff-diff-num)
-       (setq ediff-disturbed-overlays
- 	    (cons overl ediff-disturbed-overlays))))
-   
-   
- ;; to be deleted in due time
- ;; We can't move overlays directly in insert-in-front-hooks
- ;; because when diff is highlighted  with ascii flags, they will  disturb
- ;; overlays and so they will be included in them, which we don't want.
- (defun  ediff-move-disturbed-overlays (posn)  
-   (mapcar (function (lambda (overl)
- 		       (ediff-move-overlay overl
- 					   posn
- 					   (ediff-overlay-end overl))
- 		       ))
- 	  ediff-disturbed-overlays)
-   (setq ediff-disturbed-overlays nil))
-   
-   
  (defun ediff-save-buffer (arg)
    "Safe way of saving buffers A, B, C, and the diff output.
--- 2635,2638 ----
*************** Without an argument, it saves customized
*** 2721,2734 ****
  
  (defun ediff-compute-custom-diffs-maybe ()
!   (or ediff-3way-job
!       (let ((file-A (ediff-make-temp-file ediff-buffer-A))
! 	    (file-B (ediff-make-temp-file ediff-buffer-B)))
! 	(or (ediff-buffer-live-p ediff-custom-diff-buffer)
! 	    (setq ediff-custom-diff-buffer
! 		  (get-buffer-create
! 		   (ediff-unique-buffer-name "*ediff-custom-diff" "*"))))
! 	(ediff-exec-process
! 	 ediff-custom-diff-program ediff-custom-diff-buffer 'synchronize
! 	 ediff-custom-diff-options file-A file-B))))
  
  (defun ediff-show-diff-output (arg)
--- 2664,2687 ----
  
  (defun ediff-compute-custom-diffs-maybe ()
!   (let ((buf-A-file-name (buffer-file-name ediff-buffer-A))
! 	(buf-B-file-name (buffer-file-name ediff-buffer-B))
! 	file-A file-B)
!     (if (stringp buf-A-file-name)
! 	(setq buf-A-file-name (file-name-nondirectory buf-A-file-name)))
!     (if (stringp buf-B-file-name)
! 	(setq buf-B-file-name (file-name-nondirectory buf-B-file-name)))
!     (setq file-A (ediff-make-temp-file ediff-buffer-A buf-A-file-name)
! 	  file-B (ediff-make-temp-file ediff-buffer-B buf-B-file-name))
! 			 
!     (or (ediff-buffer-live-p ediff-custom-diff-buffer)
! 	(setq ediff-custom-diff-buffer
! 	      (get-buffer-create
! 	       (ediff-unique-buffer-name "*ediff-custom-diff" "*"))))
!     (ediff-exec-process
!      ediff-custom-diff-program ediff-custom-diff-buffer 'synchronize
!      ediff-custom-diff-options file-A file-B)
!     (delete-file file-A)
!     (delete-file file-B)
!     ))
  
  (defun ediff-show-diff-output (arg)
*************** buffer."
*** 2842,2852 ****
        (if (or (< n 0) (>= n ediff-number-of-differences))
  	  (if (> ediff-number-of-differences 0)
! 	      (error "There is no diff %d. Valid diffs are 1 to %d"
  		     (1+ n) ediff-number-of-differences)
! 	    (error "No differences found")))
        (setq diff-overlay (ediff-get-diff-overlay n buf-type)))
      (if (not (ediff-buffer-live-p (ediff-overlay-buffer diff-overlay)))
! 	(error
! 	 "You have killed an essential Ediff buffer---Please exit Ediff"))
      (if (eq pos 'beg)
  	(ediff-overlay-start diff-overlay)
--- 2795,2804 ----
        (if (or (< n 0) (>= n ediff-number-of-differences))
  	  (if (> ediff-number-of-differences 0)
! 	      (error "Bad difference number, %d. Valid numbers are 1 to %d"
  		     (1+ n) ediff-number-of-differences)
! 	    (error ediff-NO-DIFFERENCES)))
        (setq diff-overlay (ediff-get-diff-overlay n buf-type)))
      (if (not (ediff-buffer-live-p (ediff-overlay-buffer diff-overlay)))
! 	(error ediff-KILLED-VITAL-BUFFER))
      (if (eq pos 'beg)
  	(ediff-overlay-start diff-overlay)
*************** buffer."
*** 2900,2904 ****
  	(ediff-set-overlay-face
  	 overlay
! 	 (if (and (ediff-window-display-p)
  		  ediff-use-faces ediff-highlight-all-diffs)
  	     (ediff-background-face buf-type ediff-current-difference)))
--- 2852,2856 ----
  	(ediff-set-overlay-face
  	 overlay
! 	 (if (and (ediff-has-face-support-p)
  		  ediff-use-faces ediff-highlight-all-diffs)
  	     (ediff-background-face buf-type ediff-current-difference)))
*************** buffer."
*** 2907,2911 ****
  (defun ediff-unhighlight-diffs-totally-in-one-buffer (buf-type)
    (ediff-unselect-and-select-difference -1)
!   (if (and (ediff-window-display-p) ediff-use-faces)
        (let* ((inhibit-quit t)
  	     (current-diff-overlay-var
--- 2859,2863 ----
  (defun ediff-unhighlight-diffs-totally-in-one-buffer (buf-type)
    (ediff-unselect-and-select-difference -1)
!   (if (and (ediff-has-face-support-p) ediff-use-faces)
        (let* ((inhibit-quit t)
  	     (current-diff-overlay-var
*************** Checks if overlay's buffer exists."
*** 3003,3027 ****
  	  (or (number-or-marker-p end)
  	      (setq end (eval end)))
! 	  (setq overl (ediff-make-overlay beg end buff))
  	  
! 	  (if ediff-xemacs-p
! 	      (progn
! 		;; take precautions against detached extents
! 		(ediff-overlay-put overl 'detachable nil) 
! 		;; chars inserted at both ends will be inside extent
! 		(ediff-overlay-put overl 'start-open nil)
! 		(ediff-overlay-put overl 'end-open nil))
! 	    (ediff-overlay-put overl 'evaporate nil)  ; don't detach
! 	    ;; doesn't work since emacs buggily doesn't call these functions
! 	    ;; after the change
! 	    ;;(ediff-overlay-put overl 'insert-in-front-hooks
! 	    ;;		         '(ediff-capture-inserts-in-front))
! 	    ;;(ediff-overlay-put overl 'insert-behind-hooks
! 	    ;;  	         '(ediff-capture-inserts-behind))
! 
! 	    ;; These two are not yet implemented in Emacs
! 	    (ediff-overlay-put overl 'rear-sticky t)
! 	    (ediff-overlay-put overl 'front-sticky t)
! 	    )
  	  (ediff-overlay-put overl 'ediff-diff-num 0)
  	  overl))))
--- 2955,2971 ----
  	  (or (number-or-marker-p end)
  	      (setq end (eval end)))
! 	  (setq overl 
! 		(if ediff-xemacs-p
! 		    (make-extent beg end buff)
! 		  ;; don't advance front, but advance rear
! 		  (make-overlay beg end buff nil 'rear-advance)))
  	  
! 	  (if ediff-emacs-p
! 	      (ediff-overlay-put overl 'evaporate nil)  ; don't detach
! 	    (ediff-overlay-put overl 'detachable nil)  ; don't detach
! 	    ;; don't advance front, but advance rear
! 	    (ediff-overlay-put overl 'start-open nil) 
! 	    (ediff-overlay-put overl 'end-open nil))
! 
  	  (ediff-overlay-put overl 'ediff-diff-num 0)
  	  overl))))
*************** Mail anyway? (y or n) ")
*** 3285,3288 ****
--- 3229,3237 ----
      ))
  
+ ;; save BUFFER in FILE. used in hooks.
+ (defun ediff-save-buffer-in-file (buffer file)
+   (ediff-eval-in-buffer buffer
+     (write-file file)))
+ 
  
  ;;; Debug
*************** Mail anyway? (y or n) ")
*** 3309,3317 ****
    (interactive)
    (ediff-barf-if-not-control-buffer)
!   (if ediff-emacs-p
!       (make-local-variable 'post-command-hook))
!   (let ((pre-hook (if ediff-emacs-p 'pre-command-hook 'local-pre-command-hook))
! 	(post-hook
! 	 (if ediff-emacs-p 'post-command-hook 'local-post-command-hook)))
      (if (not (equal ediff-command-begin-time '(0 0 0)))
  	(progn (remove-hook pre-hook 'ediff-save-time)
--- 3258,3264 ----
    (interactive)
    (ediff-barf-if-not-control-buffer)
!   (make-local-hook 'post-command-hook)
!   (let ((pre-hook 'pre-command-hook)
! 	(post-hook 'post-command-hook))
      (if (not (equal ediff-command-begin-time '(0 0 0)))
  	(progn (remove-hook pre-hook 'ediff-save-time)
*************** Mail anyway? (y or n) ")
*** 3360,3363 ****
--- 3307,3367 ----
      (ediff-print-diff-vector (intern "ediff-difference-vector-Ancestor"))
      ))
+ 
+ 
+ ;;; General utilities
+ 
+ ;; this uses comparison-func to decide who is a member
+ (defun ediff-member (elt lis comparison-func)
+   (while (and lis (not (funcall comparison-func (car lis) elt)))
+     (setq lis (cdr lis)))
+   lis)
+ 
+ ;; this uses comparison-func to decide who is a member, and this determines how
+ ;; intersection looks like
+ (defun ediff-intersection (lis1 lis2 comparison-func)
+   (let ((result (list 'a)))
+     (while lis1
+       (if (ediff-member (car lis1) lis2 comparison-func)
+ 	  (nconc result (list (car lis1))))
+       (setq lis1 (cdr lis1)))
+     (cdr result)))
+     
+ 
+ ;; eliminates duplicates using comparison-func
+ (defun ediff-union (lis1 lis2 comparison-func)
+   (let ((result (list 'a)))
+     (while lis1
+       (or (ediff-member (car lis1) (cdr result) comparison-func)
+ 	  (nconc result (list (car lis1))))
+       (setq lis1 (cdr lis1)))
+     (while lis2
+       (or (ediff-member (car lis2) (cdr result) comparison-func)
+ 	  (nconc result (list (car lis2))))
+       (setq lis2 (cdr lis2)))
+     (cdr result)))
+ 
+ ;; eliminates duplicates using comparison-func
+ (defun ediff-set-difference (lis1 lis2 comparison-func)
+   (let ((result (list 'a)))
+     (while lis1
+       (or (ediff-member (car lis1) (cdr result) comparison-func)
+ 	  (ediff-member (car lis1) lis2 comparison-func)
+ 	  (nconc result (list (car lis1))))
+       (setq lis1 (cdr lis1)))
+     (cdr result)))
+ 
+ (defun ediff-copy-list (list)
+   (if (consp list)
+       ;;;(let ((res nil))
+       ;;;  (while (consp list) (push (pop list) res))
+       ;;;  (prog1 (nreverse res) (setcdr res list)))
+       (let (res elt)
+ 	(while (consp list)
+ 	  (setq elt (car list)
+ 		res (cons elt res)
+ 		list (cdr list)))
+ 	(nreverse res))
+     (car list)))
+     
  
  ;; don't report error if version control package wasn't found
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/ediff-vers.el emacs-19.31/lisp/ediff-vers.el
*** emacs-19.30/lisp/ediff-vers.el	Wed Dec 31 19:00:00 1969
--- emacs-19.31/lisp/ediff-vers.el	Fri Feb 16 01:36:08 1996
***************
*** 0 ****
--- 1,351 ----
+ ;;; ediff-vers.el --- version control interface to Ediff
+ 
+ ;;; Copyright (C) 1994, 1995 Free Software Foundation, Inc.
+ 
+ ;; Author: Michael Kifer <kifer@cs.sunysb.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, Inc., 59 Temple Place - Suite 330,
+ ;; Boston, MA 02111-1307, USA.
+ 
+ 
+ ;;; Code:
+       
+ ;; VC.el support
+ (defun vc-ediff-internal (rev1 rev2 &optional startup-hooks)
+ ;; Run Ediff on versions of the current buffer.
+ ;; If REV2 is "" then compare current buffer with REV1.
+ ;; If the current buffer is named `F', the version is named `F.~REV~'.
+ ;; If `F.~REV~' already exists, it is used instead of being re-created.
+   (let (file1 file2 rev1buf rev2buf)
+     (save-excursion
+       (vc-version-other-window rev1)
+       (setq rev1buf (current-buffer)
+ 	    file1 (buffer-file-name)))
+     (save-excursion
+       (or (string= rev2 "") 		; use current buffer
+ 	  (vc-version-other-window rev2))
+       (setq rev2buf (current-buffer)
+ 	    file2 (buffer-file-name)))
+     (setq startup-hooks
+ 	  (cons (` (lambda ()
+ 		     (delete-file (, file1))
+ 		     (or (, (string= rev2 "")) (delete-file (, file2)))
+ 		     ))
+ 		startup-hooks))
+     (ediff-buffers
+      rev1buf rev2buf
+      startup-hooks
+      'ediff-revision)))
+     
+ ;; RCS.el support
+ (defun rcs-ediff-view-revision (&optional rev)
+ ;; View previous RCS revision of current file.
+ ;; With prefix argument, prompts for a revision name.
+   (interactive (list (if current-prefix-arg 
+ 			 (read-string "Revision: "))))
+   (let* ((filename (buffer-file-name (current-buffer)))
+ 	 (switches (append '("-p")
+ 			   (if rev (list (concat "-r" rev)) nil)))
+ 	 (buff (concat (file-name-nondirectory filename) ".~" rev "~")))
+     (message "Working ...")
+     (setq filename (expand-file-name filename))
+     (with-output-to-temp-buffer buff
+       (let ((output-buffer (ediff-rcs-get-output-buffer filename buff)))
+ 	(delete-windows-on output-buffer)
+ 	(save-excursion
+ 	  (set-buffer output-buffer)
+ 	  (apply 'call-process "co" nil t nil
+ 		 ;; -q: quiet (no diagnostics)
+ 		 (append switches rcs-default-co-switches
+ 			 (list "-q" filename))))) 
+       (message "")
+       buff)))    
+       
+ (defun ediff-rcs-get-output-buffer (file name)
+   ;; Get a buffer for RCS output for FILE, make it writable and clean it up.
+   ;; Optional NAME is name to use instead of `*RCS-output*'.
+   ;; This is a modified version from rcs.el v1.1. I use it here to make
+   ;; Ediff immune to changes in rcs.el
+   (let* ((default-major-mode 'fundamental-mode) ; no frills!
+ 	 (buf (get-buffer-create name)))
+     (save-excursion
+       (set-buffer buf)
+       (setq buffer-read-only nil
+ 	    default-directory (file-name-directory (expand-file-name file)))
+       (erase-buffer))
+     buf))
+ 
+ (defun rcs-ediff-internal (rev1 rev2 &optional startup-hooks)
+ ;; Run Ediff on versions of the current buffer.
+ ;; If REV2 is "" then use current buffer.
+   (let ((rev2buf (if (string= rev2 "")
+ 		     (current-buffer)
+ 		   (rcs-ediff-view-revision rev2)))
+ 	(rev1buf (rcs-ediff-view-revision rev1)))
+ 	
+     ;; rcs.el doesn't create temp version files, so we don't have to delete
+     ;; anything in startup hooks to ediff-buffers
+     (ediff-buffers rev1buf rev2buf startup-hooks 'ediff-revision)
+     ))
+ 
+ 
+ ;; GENERIC-SC.el support
+ 
+ (defun generic-sc-get-latest-rev ()
+   (cond ((eq sc-mode 'CCASE)
+ 	 (eval "main/LATEST"))
+ 	(t (eval ""))))
+ 
+ (defun generic-sc-ediff-internal (rev1 rev2 &optional startup-hooks)
+ ;; Run Ediff on versions of the current buffer.
+ ;; If REV2 is "" then compare current buffer with REV1.
+ ;; If the current buffer is named `F', the version is named `F.~REV~'.
+ ;; If `F.~REV~' already exists, it is used instead of being re-created.
+   (let (rev1buf rev2buf)
+     (save-excursion
+       (if (or (not rev1) (string= rev1 ""))
+ 	  (setq rev1 (generic-sc-get-latest-rev)))
+       (sc-visit-previous-revision rev1)
+       (setq rev1buf (current-buffer)))
+     (save-excursion
+       (or (string= rev2 "") 		; use current buffer
+ 	  (sc-visit-previous-revision rev2))
+       (setq rev2buf (current-buffer)))
+     (ediff-buffers rev1buf rev2buf startup-hooks 'ediff-revision)))
+ 
+ 
+ ;;; Merge with Version Control
+ 
+ (defun vc-ediff-merge-internal (rev1 rev2 ancestor-rev &optional startup-hooks)
+ ;; If ANCESTOR-REV non-nil, merge with ancestor
+   (let (buf1 buf2 ancestor-buf)
+     (save-excursion
+       (vc-version-other-window rev1)
+       (setq buf1 (current-buffer)))
+     (save-excursion
+       (or (string= rev2 "")
+ 	  (vc-version-other-window rev2))
+       (setq buf2 (current-buffer)))
+     (if ancestor-rev
+ 	(save-excursion
+ 	  (or (string= ancestor-rev "")
+ 	      (vc-version-other-window ancestor-rev))
+ 	  (setq ancestor-buf (current-buffer))))
+     (setq startup-hooks 
+ 	  (cons 
+ 	   (` (lambda () 
+ 		(delete-file (, (buffer-file-name buf1)))
+ 		(or (, (string= rev2 ""))
+ 		    (delete-file (, (buffer-file-name buf2))))
+ 		(or (, (string= ancestor-rev ""))
+ 		    (, (not ancestor-rev))
+ 		    (delete-file (, (buffer-file-name ancestor-buf))))
+ 		))
+ 	   startup-hooks))
+     (if ancestor-rev
+ 	(ediff-merge-buffers-with-ancestor
+ 	 buf1 buf2 ancestor-buf
+ 	 startup-hooks 'ediff-merge-revisions-with-ancestor)
+       (ediff-merge-buffers buf1 buf2 startup-hooks 'ediff-merge-revisions))
+     ))
+ 
+ (defun rcs-ediff-merge-internal (rev1 rev2 ancestor-rev
+ 				      &optional startup-hooks)
+   ;; If ANCESTOR-REV non-nil, merge with ancestor
+   (let (buf1 buf2 ancestor-buf)
+     (setq buf1 (rcs-ediff-view-revision rev1)
+ 	  buf2 (if (string= rev2 "")
+ 		   (current-buffer)
+ 		 (rcs-ediff-view-revision rev2))
+ 	  ancestor-buf (if ancestor-rev
+ 			   (if (string= ancestor-rev "")
+ 			       (current-buffer)
+ 			     (rcs-ediff-view-revision ancestor-rev))))
+     ;; rcs.el doesn't create temp version files, so we don't have to delete
+     ;; anything in startup hooks to ediff-buffers
+     (if ancestor-rev
+ 	(ediff-merge-buffers-with-ancestor
+ 	 buf1 buf2 ancestor-buf
+ 	 startup-hooks 'ediff-merge-revisions-with-ancestor)
+       (ediff-merge-buffers buf1 buf2 startup-hooks 'ediff-merge-revisions))))
+ 
+ (defun generic-sc-ediff-merge-internal (rev1 rev2 ancestor-rev
+ 					     &optional startup-hooks)
+   ;; If ANCESTOR-REV non-nil, merge with ancestor
+   (let (buf1 buf2 ancestor-buf)
+     (save-excursion
+       (if (string= rev1 "")
+ 	  (setq rev1 (generic-sc-get-latest-rev)))
+       (sc-visit-previous-revision rev1)
+       (setq buf1 (current-buffer)))
+     (save-excursion
+       (or (string= rev2 "")
+ 	  (sc-visit-previous-revision rev2))
+       (setq buf2 (current-buffer)))
+     (if ancestor-rev
+ 	(save-excursion
+ 	  (or (string= ancestor-rev "")
+ 	      (sc-visit-previous-revision ancestor-rev))
+ 	  (setq ancestor-buf (current-buffer))))
+     (if ancestor-rev
+ 	(ediff-merge-buffers-with-ancestor
+ 	 buf1 buf2 ancestor-buf
+ 	 startup-hooks 'ediff-merge-revisions-with-ancestor)
+       (ediff-merge-buffers buf1 buf2 startup-hooks 'ediff-merge-revisions))))
+ 
+ 
+ ;; PCL-CVS.el support
+ 
+ (defun pcl-cvs-ediff-internal (rev1 rev2 &optional startup-hooks)
+ ;; Run Ediff on a pair of revisions of the current buffer.
+ ;; If REV1 is "", use the latest revision.
+ ;; If REV2 is "", use the current buffer as the second file to compare.
+   (let ((orig-buf (current-buffer))
+ 	orig-file-name buf1 buf2 file1 file2)
+     
+     (or (setq orig-file-name (buffer-file-name (current-buffer)))
+ 	(error "Current buffer is not visiting any file"))
+     (if (string= rev1 "") (setq rev1 nil)) ; latest revision
+     (setq buf1 (ediff-pcl-cvs-view-revision orig-file-name rev1)
+ 	  buf2 (if (string= rev2 "")
+ 		   orig-buf
+ 		 (ediff-pcl-cvs-view-revision orig-file-name rev2))
+ 	  file1 (buffer-file-name buf1)
+ 	  file2 (buffer-file-name buf2))
+     (setq startup-hooks
+ 	  (cons (` (lambda ()
+ 		     (delete-file (, file1))
+ 		     (or (, (string= rev2 "")) (delete-file (, file2)))
+ 		     ))
+ 		startup-hooks))
+     (ediff-buffers buf1 buf2 startup-hooks 'ediff-revision)))
+ 
+ ;; This function is the standard Ediff's interface to pcl-cvs.
+ ;; Works like with other interfaces: runs ediff on versions of the file in the
+ ;; current buffer.
+ (defun pcl-cvs-ediff-merge-internal (rev1 rev2 ancestor-rev
+ 					  &optional startup-hooks)
+ ;; Ediff-merge appropriate revisions of the selected file.
+ ;; If REV1 is "" then use the latest revision.
+ ;; If REV2 is "" then merge current buffer's file with REV1.
+ ;; If ANCESTOR-REV is "" then use current buffer's file as ancestor.
+ ;; If ANCESTOR-REV is nil, then merge without the ancestor.
+   (let ((orig-buf (current-buffer))
+ 	orig-file-name buf1 buf2 ancestor-buf)
+ 
+     (or (setq orig-file-name (buffer-file-name (current-buffer)))
+ 	(error "Current buffer is not visiting any file"))
+     (if (string= rev1 "") (setq rev1 nil)) ; latest revision
+ 
+     (setq buf1 (ediff-pcl-cvs-view-revision orig-file-name rev1))
+     (setq buf2 (if (string= rev2 "")
+ 		   orig-buf
+ 		 (ediff-pcl-cvs-view-revision orig-file-name rev2)))
+     (if (stringp ancestor-rev)
+ 	(setq ancestor-buf
+ 	      (if (string= ancestor-rev "")
+ 		  orig-buf
+ 		(ediff-pcl-cvs-view-revision orig-file-name ancestor-rev))))
+ 
+     (setq startup-hooks 
+ 	  (cons 
+ 	   (` (lambda () 
+ 		(delete-file (, (buffer-file-name buf1)))
+ 		(or (, (string= rev2 ""))
+ 		    (delete-file (, (buffer-file-name buf2))))
+ 		(or (, (string= ancestor-rev ""))
+ 		    (, (not ancestor-rev))
+ 		    (delete-file (, (buffer-file-name ancestor-buf))))
+ 		))
+ 	   startup-hooks))
+ 
+     (if ancestor-buf
+ 	(ediff-merge-buffers-with-ancestor
+ 	 buf1 buf2 ancestor-buf startup-hooks 
+ 	 'ediff-merge-revisions-with-ancestor)
+       (ediff-merge-buffers
+        buf1 buf2 startup-hooks 'ediff-merge-revisions))
+     ))
+ 
+ (defun ediff-pcl-cvs-view-revision (file rev)
+ ;; if rev = "", get the latest revision
+   (let ((temp-name (make-temp-name
+ 		    (concat ediff-temp-file-prefix
+ 			    "ediff_" rev))))
+     (cvs-kill-buffer-visiting temp-name)
+     (if rev
+ 	(message "Retrieving revision %s..." rev)
+       (message "Retrieving latest revision..."))
+     (let ((res (call-process cvs-shell nil nil nil "-c"
+ 			     (concat cvs-program " update -p "
+ 				     (if rev
+ 					 (concat "-r " rev " ")
+ 				       "")
+ 				     file
+ 				     " > " temp-name))))
+       (if (and res (not (and (integerp res) (zerop res))))
+ 	  (error "Failed to retrieve revision: %s" res))
+ 
+       (if rev
+ 	  (message "Retrieving revision %s... Done." rev)
+ 	(message "Retrieving latest revision... Done."))
+       (find-file-noselect temp-name))))
+ 
+ 
+ (defun cvs-run-ediff-on-file-descriptor (tin)
+ ;; This is a replacement for cvs-emerge-mode
+ ;; Run after cvs-update.
+ ;; Ediff-merge appropriate revisions of the selected file.
+   (let* ((fileinfo (tin-cookie cvs-cookie-handle tin))
+ 	 (type (cvs-fileinfo->type fileinfo))
+ 	 (tmp-file
+ 	  (cvs-retrieve-revision-to-tmpfile fileinfo))
+ 	 ancestor-file)
+     
+     (or (memq type '(MERGED CONFLICT MODIFIED))
+ 	(error
+ 	 "Can only merge `Modified', `Merged' or `Conflict' files"))
+     
+     (cond ((memq type '(MERGED CONFLICT))
+ 	   (setq ancestor-file
+ 		 (cvs-retrieve-revision-to-tmpfile
+ 		  fileinfo
+ 		  ;; revision
+ 		  (cvs-fileinfo->base-revision fileinfo)))
+ 	   (ediff-merge-buffers-with-ancestor
+ 	    (find-file-noselect tmp-file)
+ 	    (find-file-noselect (cvs-fileinfo->backup-file fileinfo))
+ 	    (find-file-noselect ancestor-file)
+ 	    nil ; startup-hooks
+ 	    'ediff-merge-revisions-with-ancestor))
+ 	  ((eq type 'MODIFIED)
+ 	   (ediff-merge-buffers
+ 	    (find-file-noselect tmp-file)
+ 	    (find-file-noselect (cvs-fileinfo->full-path fileinfo))
+ 	    nil ; startup-hooks
+ 	    'ediff-merge-revisions)))
+     (if (stringp tmp-file) (delete-file tmp-file))
+     (if (stringp ancestor-file) (delete-file ancestor-file))))
+ 
+ ;;; Local Variables:
+ ;;; eval: (put 'ediff-defvar-local 'lisp-indent-hook 'defun)
+ ;;; eval: (put 'ediff-eval-in-buffer 'lisp-indent-hook 1)
+ ;;; End:
+ 
+ (provide 'ediff-vers)
+ 
+ ;;; ediff-vers.el ends here
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/ediff-wind.el emacs-19.31/lisp/ediff-wind.el
*** emacs-19.30/lisp/ediff-wind.el	Thu Oct  5 20:48:42 1995
--- emacs-19.31/lisp/ediff-wind.el	Fri Feb 16 01:28:58 1996
***************
*** 1,4 ****
  ;;; ediff-wind.el --- window manipulation utilities
! ;;; Copyright (C) 1994, 1995 Free Software Foundation, Inc.
  
  ;; Author: Michael Kifer <kifer@cs.sunysb.edu>
--- 1,5 ----
  ;;; ediff-wind.el --- window manipulation utilities
! 
! ;; Copyright (C) 1994, 1995 Free Software Foundation, Inc.
  
  ;; Author: Michael Kifer <kifer@cs.sunysb.edu>
***************
*** 17,23 ****
  
  ;; 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.
  
  
  (require 'ediff-init)
--- 18,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
+ ;;; Code:
  
  (require 'ediff-init)
*************** In this case, Ediff will use those frame
*** 83,109 ****
  
  (defconst ediff-control-frame-parameters
!   (if (ediff-window-display-p)
!       (list 
!        '(name . "Ediff")
!        ;;'(unsplittable . t)
!        '(minibuffer . nil)
!        '(user-position . t)	      ; Emacs only
!        '(vertical-scroll-bars . nil)  ; Emacs only
!        '(scrollbar-width . 0)         ; XEmacs only
!        '(menu-bar-lines . 0)          ; Emacs only
!        '(visibility . nil)	      ; doesn't work for XEmacs yet
!        ;; don't lower and auto-raise
!        '(auto-lower . nil)
!        '(auto-raise . t)
!        ;; this blocks queries from  window manager as to where to put
!        ;; ediff's control frame. we put the frame outside the display,
!        ;; so the initial frame won't jump all over the screen
!        (cons 'top  (if (fboundp 'ediff-display-pixel-height)
! 		       (1+ (ediff-display-pixel-height))
! 		     3000))
!        (cons 'left (if (fboundp 'ediff-display-pixel-width)
! 		       (1+ (ediff-display-pixel-width))
! 		     3000))
!        ))
    "Frame parameters for displaying Ediff Control Panel.
  Do not specify width and height here. These are computed automatically.")
--- 86,111 ----
  
  (defconst ediff-control-frame-parameters
!   (list 
!    '(name . "Ediff")
!    ;;'(unsplittable . t)
!    '(minibuffer . nil)
!    '(user-position . t)	      ; Emacs only
!    '(vertical-scroll-bars . nil)  ; Emacs only
!    '(scrollbar-width . 0)         ; XEmacs only
!    '(menu-bar-lines . 0)          ; Emacs only
!    '(visibility . nil)	      ; doesn't work for XEmacs yet
!    ;; don't lower and auto-raise
!    '(auto-lower . nil)
!    '(auto-raise . t)
!    ;; this blocks queries from  window manager as to where to put
!    ;; ediff's control frame. we put the frame outside the display,
!    ;; so the initial frame won't jump all over the screen
!    (cons 'top  (if (fboundp 'ediff-display-pixel-height)
! 		   (1+ (ediff-display-pixel-height))
! 		 3000))
!    (cons 'left (if (fboundp 'ediff-display-pixel-width)
! 		   (1+ (ediff-display-pixel-width))
! 		 3000))
!    )
    "Frame parameters for displaying Ediff Control Panel.
  Do not specify width and height here. These are computed automatically.")
*************** Do not specify width and height here. Th
*** 114,118 ****
  
  ;; not used for now
! (defvar ediff-mouse-pixel-threshhold 30
    "If the user moves mouse more than this many pixels, Ediff won't warp mouse into control window.")
  
--- 116,120 ----
  
  ;; not used for now
! (defvar ediff-mouse-pixel-threshold 30
    "If the user moves mouse more than this many pixels, Ediff won't warp mouse into control window.")
  
*************** the frame used for the wide display.")
*** 177,181 ****
    "*If t, keep control panel iconified when help message is off.
  This has effect only on a windowing system.
! If t, hiting `?' to toggle control panel off iconifies it.
  
  This is only useful in Emacs and only for certain kinds of window managers,
--- 179,183 ----
    "*If t, keep control panel iconified when help message is off.
  This has effect only on a windowing system.
! If t, hitting `?' to toggle control panel off iconifies it.
  
  This is only useful in Emacs and only for certain kinds of window managers,
*************** into icons, regardless of the window man
*** 264,268 ****
    ;; skip dedicated and unsplittable frames
    (ediff-destroy-control-frame control-buffer)
!   (let ((window-min-height 2)
  	split-window-function 
  	merge-window-share merge-window-lines
--- 266,270 ----
    ;; skip dedicated and unsplittable frames
    (ediff-destroy-control-frame control-buffer)
!   (let ((window-min-height 1)
  	split-window-function 
  	merge-window-share merge-window-lines
*************** into icons, regardless of the window man
*** 317,321 ****
    ;; skip dedicated and unsplittable frames
    (ediff-destroy-control-frame control-buffer)
!   (let ((window-min-height 2)
  	split-window-function wind-width-or-height
  	three-way-comparison
--- 319,323 ----
    ;; skip dedicated and unsplittable frames
    (ediff-destroy-control-frame control-buffer)
!   (let ((window-min-height 1)
  	split-window-function wind-width-or-height
  	three-way-comparison
*************** into icons, regardless of the window man
*** 384,388 ****
  
      
! ;; dispatch the appropriate window setup function
  (defun ediff-setup-windows-multiframe (buf-A buf-B buf-C control-buf)
    (ediff-eval-in-buffer control-buf
--- 386,390 ----
  
      
! ;; dispatch an appropriate window setup function
  (defun ediff-setup-windows-multiframe (buf-A buf-B buf-C control-buf)
    (ediff-eval-in-buffer control-buf
*************** into icons, regardless of the window man
*** 406,410 ****
    (ediff-skip-unsuitable-frames 'ok-unsplittable)
    
!   (let* ((window-min-height 2)
  	 (wind-A (ediff-get-visible-buffer-window buf-A))
  	 (wind-B (ediff-get-visible-buffer-window buf-B))
--- 408,412 ----
    (ediff-skip-unsuitable-frames 'ok-unsplittable)
    
!   (let* ((window-min-height 1)
  	 (wind-A (ediff-get-visible-buffer-window buf-A))
  	 (wind-B (ediff-get-visible-buffer-window buf-B))
*************** into icons, regardless of the window man
*** 484,488 ****
      (if use-same-frame
  	(let ((curr-frame (selected-frame))
! 	      (window-min-height 2))
  	  ;; avoid dedicated and non-splittable windows
  	  (ediff-skip-unsuitable-frames)
--- 486,490 ----
      (if use-same-frame
  	(let ((curr-frame (selected-frame))
! 	      (window-min-height 1))
  	  ;; avoid dedicated and non-splittable windows
  	  (ediff-skip-unsuitable-frames)
*************** into icons, regardless of the window man
*** 581,585 ****
    (ediff-skip-unsuitable-frames 'ok-unsplittable)
    
!   (let* ((window-min-height 2)
  	 (wind-A (ediff-get-visible-buffer-window buf-A))
  	 (wind-B (ediff-get-visible-buffer-window buf-B))
--- 583,587 ----
    (ediff-skip-unsuitable-frames 'ok-unsplittable)
    
!   (let* ((window-min-height 1)
  	 (wind-A (ediff-get-visible-buffer-window buf-A))
  	 (wind-B (ediff-get-visible-buffer-window buf-B))
*************** into icons, regardless of the window man
*** 752,755 ****
--- 754,759 ----
  		     (window-dedicated-p (selected-window))
  		     (ediff-frame-iconified-p (selected-frame))
+ 		     (< (frame-height (selected-frame))
+ 			(* 3 window-min-height))
  		     (if ok-unsplittable
  			 nil
*************** into icons, regardless of the window man
*** 767,771 ****
  ;; Prepare or refresh control frame
  (defun ediff-setup-control-frame (ctl-buffer designated-minibuffer-frame)
!   (let ((window-min-height 2)
  	ctl-frame-iconified-p dont-iconify-ctl-frame deiconify-ctl-frame
  	ctl-frame old-ctl-frame lines user-grabbed-mouse
--- 771,775 ----
  ;; Prepare or refresh control frame
  (defun ediff-setup-control-frame (ctl-buffer designated-minibuffer-frame)
!   (let ((window-min-height 1)
  	ctl-frame-iconified-p dont-iconify-ctl-frame deiconify-ctl-frame
  	ctl-frame old-ctl-frame lines user-grabbed-mouse
*************** into icons, regardless of the window man
*** 778,795 ****
    
      (setq old-ctl-frame (ediff-eval-in-buffer ctl-buffer ediff-control-frame))
-     ;; Delete the old ctl frame and get a new ctl frame.
-     ;; The old ctl frame is deleted to let emacs reset default minibuffer
-     ;; frame or when the ctl frame needs to be moved.
-     ;; The old frame isn't reused, since ediff-setup-control-frame is called
-     ;; very rarely, so the overhead is minimal.
-     (if (frame-live-p old-ctl-frame) (delete-frame old-ctl-frame))
-     ;;(redraw-display)
-     ;; new ctl frame should be created while ctl-buff is current, so that
-     ;; the local default-minibuffer-frame will be consulted and
-     ;; that ediff-control-frame-parameters will have the right value.
      (ediff-eval-in-buffer ctl-buffer
!       (let ((default-minibuffer-frame designated-minibuffer-frame))
! 	(setq ctl-frame (make-frame ediff-control-frame-parameters)
! 	      ediff-control-frame ctl-frame)))
      
      (setq ctl-frame-iconified-p (ediff-frame-iconified-p ctl-frame))
--- 782,790 ----
    
      (setq old-ctl-frame (ediff-eval-in-buffer ctl-buffer ediff-control-frame))
      (ediff-eval-in-buffer ctl-buffer
!       (setq ctl-frame (if (frame-live-p old-ctl-frame)
! 			  old-ctl-frame
! 			(make-frame ediff-control-frame-parameters))
! 	    ediff-control-frame ctl-frame))
      
      (setq ctl-frame-iconified-p (ediff-frame-iconified-p ctl-frame))
*************** into icons, regardless of the window man
*** 815,825 ****
      
      ;; 1 more line for the modeline
!     (setq lines (if ediff-xemacs-p
! 		    (+ 2 (count-lines (point-min) (point-max)))
! 		  (1+ (count-lines (point-min) (point-max))))
  	  fheight lines
  	  fwidth (+ (ediff-help-message-line-length) 2)
  	  adjusted-parameters (append (list
  				       '(visibility . t)
  				       (cons 'width fwidth)
  				       (cons 'height fheight))
--- 810,822 ----
      
      ;; 1 more line for the modeline
!     (setq lines (1+ (count-lines (point-min) (point-max)))
  	  fheight lines
  	  fwidth (+ (ediff-help-message-line-length) 2)
  	  adjusted-parameters (append (list
  				       '(visibility . t)
+ 				       ;; possibly change surrogate minibuffer
+ 				       (cons 'minibuffer
+ 					     (minibuffer-window
+ 					      designated-minibuffer-frame))
  				       (cons 'width fwidth)
  				       (cons 'height fheight))
*************** into icons, regardless of the window man
*** 827,831 ****
  				       ediff-control-frame-position-function
  				       ctl-buffer fwidth fheight)))
!     (if ediff-prefer-long-help-message
  	(setq adjusted-parameters
  	      (cons '(auto-raise . nil) adjusted-parameters)))
--- 824,828 ----
  				       ediff-control-frame-position-function
  				       ctl-buffer fwidth fheight)))
!     (if ediff-use-long-help-message
  	(setq adjusted-parameters
  	      (cons '(auto-raise . nil) adjusted-parameters)))
*************** into icons, regardless of the window man
*** 844,852 ****
  	  ))
      
!     ;; Under OS/2 (emx) we have to call modify frame parameters twice, in
!     ;; order to make sure that at least once we do it for non-iconified
!     ;; frame. If appears that in the OS/2 port of Emacs, one can't modify
!     ;; frame parameters of iconified frames.
!     (if (eq system-type 'emx)
  	(modify-frame-parameters ctl-frame adjusted-parameters))
        
--- 841,850 ----
  	  ))
      
!     ;; Under OS/2 (emx) we have to call modify frame parameters twice, in order
!     ;; to make sure that at least once we do it for non-iconified frame. If
!     ;; appears that in the OS/2 port of Emacs, one can't modify frame
!     ;; parameters of iconified frames. As a precaution, we do likewise for
!     ;; windows-nt.
!     (if (memq system-type '(emx windows-nt windows-95))
  	(modify-frame-parameters ctl-frame adjusted-parameters))
        
*************** into icons, regardless of the window man
*** 874,886 ****
      ;; resynch so the cursor will move to control frame
      ;; per RMS suggestion
!     (let ((count 7))
!       (sit-for .1)
!       (while (and (not (frame-visible-p ctl-frame)) (> count 0))
! 	(setq count (1- count))
! 	(sit-for .3)))
  
      (or (ediff-frame-iconified-p ctl-frame)
  	;; don't warp the mouse, unless ediff-grab-mouse = t
! 	(ediff-reset-mouse ctl-frame (not (eq ediff-grab-mouse t))))
  	
      (if ediff-xemacs-p
--- 872,887 ----
      ;; resynch so the cursor will move to control frame
      ;; per RMS suggestion
!     (if (ediff-window-display-p)
! 	(let ((count 7))
! 	  (sit-for .1)
! 	  (while (and (not (frame-visible-p ctl-frame)) (> count 0))
! 	    (setq count (1- count))
! 	    (sit-for .3))))
  
      (or (ediff-frame-iconified-p ctl-frame)
  	;; don't warp the mouse, unless ediff-grab-mouse = t
! 	(ediff-reset-mouse ctl-frame
! 			   (or (eq this-command 'ediff-quit)
! 			       (not (eq ediff-grab-mouse t)))))
  	
      (if ediff-xemacs-p
*************** into icons, regardless of the window man
*** 930,934 ****
  	    ctl-frame-left
  	    (+ frame-A-left
! 	       (if ediff-prefer-long-help-message
  		   (* (ediff-frame-char-width ctl-frame)
  		      (+ ediff-wide-control-frame-rightward-shift
--- 931,935 ----
  	    ctl-frame-left
  	    (+ frame-A-left
! 	       (if ediff-use-long-help-message
  		   (* (ediff-frame-char-width ctl-frame)
  		      (+ ediff-wide-control-frame-rightward-shift
*************** into icons, regardless of the window man
*** 939,945 ****
  			  ediff-narrow-control-frame-leftward-shift
  			  horizontal-adjustment))))))
-       ;; keep ctl frame within the visible bounds
-       (setq ctl-frame-top (max ctl-frame-top 1)
- 	    ctl-frame-left (max ctl-frame-left 1))
        (setq ctl-frame-top
  	    (min ctl-frame-top
--- 940,943 ----
*************** into icons, regardless of the window man
*** 951,954 ****
--- 949,955 ----
  		 (- (ediff-display-pixel-width)
  		    (* ctl-frame-width (ediff-frame-char-width ctl-frame)))))
+       ;; keep ctl frame within the visible bounds
+       (setq ctl-frame-top (max ctl-frame-top 1)
+ 	    ctl-frame-left (max ctl-frame-left 1))
        
        (list (cons 'top ctl-frame-top)
*************** into icons, regardless of the window man
*** 958,962 ****
  (defun ediff-xemacs-select-frame-hook ()
    (if (and (equal (selected-frame) ediff-control-frame)
! 	   (not ediff-prefer-long-help-message))
        (raise-frame ediff-control-frame)))
  	
--- 959,963 ----
  (defun ediff-xemacs-select-frame-hook ()
    (if (and (equal (selected-frame) ediff-control-frame)
! 	   (not ediff-use-long-help-message))
        (raise-frame ediff-control-frame)))
  	
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/ediff.el emacs-19.31/lisp/ediff.el
*** emacs-19.30/lisp/ediff.el	Mon Nov 20 17:03:00 1995
--- emacs-19.31/lisp/ediff.el	Fri Feb 16 01:29:00 1996
***************
*** 1,4 ****
  ;;; ediff.el --- a comprehensive visual interface to diff & patch
! ;;; Copyright (C) 1994, 1995 Free Software Foundation, Inc.
  
  ;; Author: Michael Kifer <kifer@cs.sunysb.edu>
--- 1,5 ----
  ;;; ediff.el --- a comprehensive visual interface to diff & patch
! 
! ;; Copyright (C) 1994, 1995 Free Software Foundation, Inc.
  
  ;; Author: Michael Kifer <kifer@cs.sunysb.edu>
***************
*** 6,11 ****
  ;; Keywords: comparing, merging, patching, version control.
  
! (defconst ediff-version "2.47" "The current version of Ediff")
! (defconst ediff-date "October 11, 1995" "Date of last update")  
  
  ;; This file is part of GNU Emacs.
--- 7,12 ----
  ;; Keywords: comparing, merging, patching, version control.
  
! (defconst ediff-version "2.54" "The current version of Ediff")
! (defconst ediff-date "February 14, 1996" "Date of last update")  
  
  ;; This file is part of GNU Emacs.
***************
*** 22,30 ****
  
  ;; 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:
- ;;  ----------
  
  ;; Never read that diff output again!
--- 23,31 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
  ;; Never read that diff output again!
***************
*** 73,77 ****
  
  ;;; Bugs:
- ;;  -----
  
  ;;  1. The undo command doesn't restore deleted regions well. That is, if
--- 74,77 ----
***************
*** 86,90 ****
  ;;  2. On a monochrome display, the repertoire of faces with which to
  ;;  highlight fine differences is limited. By default, Ediff is using
! ;;  underlining. However, if the region is already underlied by some other
  ;;  overlays, there is no simple way to temporarily remove that residual
  ;;  underlining. This problem occurs when a buffer is highlighted with
--- 86,90 ----
  ;;  2. On a monochrome display, the repertoire of faces with which to
  ;;  highlight fine differences is limited. By default, Ediff is using
! ;;  underlining. However, if the region is already underlined by some other
  ;;  overlays, there is no simple way to temporarily remove that residual
  ;;  underlining. This problem occurs when a buffer is highlighted with
***************
*** 95,99 ****
  ;;  buffer used by Ediff) or you can execute them interactively, at any time
  ;;  and on any buffer.
- ;;
  
  
--- 95,98 ----
***************
*** 105,109 ****
  ;; helped. Improved defaults in Ediff file-name reading commands.
  
- 
  ;;; Code:
  
--- 104,107 ----
***************
*** 134,138 ****
  ;;;###autoload
  (defun ediff-patch-file (source-filename &optional startup-hooks job-name)
!   "Run Ediff by patching FILE-TP-PATCH."
    ;; This now returns the control buffer
    (interactive 
--- 132,136 ----
  ;;;###autoload
  (defun ediff-patch-file (source-filename &optional startup-hooks job-name)
!   "Run Ediff by patching SOURCE-FILENAME."
    ;; This now returns the control buffer
    (interactive 
***************
*** 166,170 ****
  	 (true-source-filename source-filename)
  	 (target-filename source-filename)
! 	 target-buf buf-to-patch file-name-magic-p ctl-buf)
  	  
      ;; if the user didn't specify a backup extension, use
--- 164,168 ----
  	 (true-source-filename source-filename)
  	 (target-filename source-filename)
! 	 target-buf buf-to-patch file-name-magic-p ctl-buf backup-style)
  	  
      ;; if the user didn't specify a backup extension, use
***************
*** 172,180 ****
      (if (string= backup-extension "")
  	(setq backup-extension ediff-backup-extension))
  					
      ;; Make a temp file, if source-filename has a magic file handler (or if
      ;; it is handled via auto-mode-alist and similar magic).
      ;; Check if there is a buffer visiting source-filename and if they are in
!     ;; synch; arrange for the deletion of temp file.
      (ediff-find-file 'true-source-filename 'buf-to-patch
  		     'ediff-last-dir-patch 'startup-hooks)
--- 170,181 ----
      (if (string= backup-extension "")
  	(setq backup-extension ediff-backup-extension))
+     (if (string-match "-V" ediff-patch-options)
+ 	(error
+ 	 "Ediff doesn't take the -V option in `ediff-patch-options'--sorry"))
  					
      ;; Make a temp file, if source-filename has a magic file handler (or if
      ;; it is handled via auto-mode-alist and similar magic).
      ;; Check if there is a buffer visiting source-filename and if they are in
!     ;; sync; arrange for the deletion of temp file.
      (ediff-find-file 'true-source-filename 'buf-to-patch
  		     'ediff-last-dir-patch 'startup-hooks)
***************
*** 194,198 ****
      (ediff-eval-in-buffer ediff-patch-diagnostics
        (message "Applying patch ... ")
!       ;;(sit-for 0)
        ;; always pass patch the -f option, so it won't ask any questions
        (shell-command-on-region 
--- 195,201 ----
      (ediff-eval-in-buffer ediff-patch-diagnostics
        (message "Applying patch ... ")
!       ;; fix environment for gnu patch, so it won't make numbered extensions
!       (setq backup-style (getenv "VERSION_CONTROL"))
!       (setenv "VERSION_CONTROL" nil)
        ;; always pass patch the -f option, so it won't ask any questions
        (shell-command-on-region 
***************
*** 202,206 ****
  	       backup-extension
  	       (expand-file-name true-source-filename))
!        t))
      ;;(message "Applying patch ... done")(sit-for 0)
      (switch-to-buffer ediff-patch-diagnostics)
--- 205,211 ----
  	       backup-extension
  	       (expand-file-name true-source-filename))
!        t)
!       ;; restore environment for gnu patch
!       (setenv "VERSION_CONTROL" backup-style))
      ;;(message "Applying patch ... done")(sit-for 0)
      (switch-to-buffer ediff-patch-diagnostics)
***************
*** 257,262 ****
      ctl-buf))
    
  (defun ediff-set-read-only-in-buf-A ()
-   "Used as a startup hook to set `_orig' patch file read-only."
    (ediff-eval-in-buffer ediff-buffer-A
      (toggle-read-only 1)))
--- 262,267 ----
      ctl-buf))
    
+ ;; Used as a startup hook to set `_orig' patch file read-only.
  (defun ediff-set-read-only-in-buf-A ()
    (ediff-eval-in-buffer ediff-buffer-A
      (toggle-read-only 1)))
***************
*** 369,381 ****
  
  
  (defun ediff-find-file (file-var buffer-name &optional last-dir hooks-var)
-   "Visit FILE and arrange its buffer to Ediff's liking. 
- FILE is actually a variable symbol that must contain a true file name.
- BUFFER-NAME is a variable symbol, which will get the buffer object into which
- FILE is read.  LAST-DIR is the directory variable symbol where FILE's
- directory name should be returned. HOOKS is a variable symbol that will be
- assigned the hook to be executed after `ediff-startup' is finished.
- `ediff-find-file' arranges that the temp files it might create will be
- deleted."
    (let* ((file (symbol-value file-var))
  	 (file-magic (find-file-name-handler file 'find-file-noselect))
--- 374,387 ----
  
  
+ ;; Visit FILE and arrange its buffer to Ediff's liking. 
+ ;; FILE is actually a variable symbol that must contain a true file name.
+ ;; BUFFER-NAME is a variable symbol, which will get the buffer object into
+ ;; which FILE is read.
+ ;; LAST-DIR is the directory variable symbol where FILE's
+ ;; directory name should be returned. HOOKS-VAR is a variable symbol that will
+ ;; be assigned the hook to be executed after `ediff-startup' is finished.
+ ;; `ediff-find-file' arranges that the temp files it might create will be
+ ;; deleted.
  (defun ediff-find-file (file-var buffer-name &optional last-dir hooks-var)
    (let* ((file (symbol-value file-var))
  	 (file-magic (find-file-name-handler file 'find-file-noselect))
*************** deleted."
*** 386,390 ****
  	   (error "File `%s' is a directory" file)))
  	
!     ;; some of the command, below, require full file name
      (setq file (expand-file-name file))
    
--- 392,396 ----
  	   (error "File `%s' is a directory" file)))
  	
!     ;; some of the commands, below, require full file name
      (setq file (expand-file-name file))
    
*************** deleted."
*** 515,520 ****
  	(setq buf-C-file-name (file-name-nondirectory buf-C-file-name)))
  	
!     (setq file-A (ediff-make-temp-file buf-A buf-A-file-name))
!     (setq file-B (ediff-make-temp-file buf-B buf-B-file-name))
      (if buf-C-is-alive
  	(setq file-C (ediff-make-temp-file buf-C buf-C-file-name)))
--- 521,526 ----
  	(setq buf-C-file-name (file-name-nondirectory buf-C-file-name)))
  	
!     (setq file-A (ediff-make-temp-file buf-A buf-A-file-name)
! 	  file-B (ediff-make-temp-file buf-B buf-B-file-name))
      (if buf-C-is-alive
  	(setq file-C (ediff-make-temp-file buf-C buf-C-file-name)))
*************** If WIND-B is nil, use window next to WIN
*** 834,838 ****
      (save-excursion
        (save-window-excursion
! 	(sit-for 0) ; synch before using window-start/end -- a precaution
  	(select-window wind-A)
  	(setq beg-A (window-start)
--- 840,844 ----
      (save-excursion
        (save-window-excursion
! 	(sit-for 0) ; sync before using window-start/end -- a precaution
  	(select-window wind-A)
  	(setq beg-A (window-start)
*************** The file is the optional FILE argument o
*** 1154,1160 ****
  buffer."
    (interactive)
-   (ediff-load-version-control)
    (if (stringp file) (find-file file))
!   (let (rev1 rev2 buf1 buf2)
      (setq rev1
  	  (read-string
--- 1160,1165 ----
  buffer."
    (interactive)
    (if (stringp file) (find-file file))
!   (let (rev1 rev2)
      (setq rev1
  	  (read-string
*************** buffer."
*** 1169,1204 ****
  	    (if (stringp file)
  		(file-name-nondirectory file) "current buffer"))))
!     (cond ((eq ediff-version-control-package 'vc)
! 	   (save-excursion
! 	     (vc-version-other-window rev1)
! 	     (setq buf1 (current-buffer)))
! 	   (save-excursion
! 	     (or (string= rev2 "")
! 		 (vc-version-other-window rev2))
! 	     (setq buf2 (current-buffer)))
! 	   (setq startup-hooks 
! 		 (cons 
! 		  (` (lambda () 
! 		       (delete-file (, (buffer-file-name buf1)))
! 		       (or (, (string= rev2 ""))
! 			   (delete-file (, (buffer-file-name buf2))))))
! 		  startup-hooks)))
! 	  ((eq ediff-version-control-package 'rcs)
! 	   (setq buf1 (rcs-ediff-view-revision rev1)
! 		 buf2 (if (string= rev2 "")
! 			  (current-buffer)
! 			(rcs-ediff-view-revision rev2))))
! 	  ((eq ediff-version-control-package 'generic-sc)
! 	   (save-excursion
! 	     (if (string= rev1 "")
! 		 (setq rev1 (generic-sc-get-latest-rev)))
! 	     (sc-visit-previous-revision rev1)
! 	     (setq buf1 (current-buffer)))
! 	   (save-excursion
! 	     (or (string= rev2 "")
! 		 (sc-visit-previous-revision rev2))
! 	     (setq buf2 (current-buffer))))
! 	  ) ; cond
!     (ediff-merge-buffers buf1 buf2 startup-hooks 'ediff-merge-revisions)))
      
  
--- 1174,1182 ----
  	    (if (stringp file)
  		(file-name-nondirectory file) "current buffer"))))
!     (ediff-load-version-control)
!     ;; ancestor-revision=nil
!     (funcall
!      (intern (format "%S-ediff-merge-internal" ediff-version-control-package))
!      rev1 rev2 nil startup-hooks)))
      
  
*************** The file is the the optional FILE argume
*** 1209,1215 ****
  buffer."
    (interactive)
-   (ediff-load-version-control)
    (if (stringp file) (find-file file))
!   (let (rev1 rev2 ancestor-rev buf1 buf2 ancestor-buf)
      (setq rev1
  	  (read-string
--- 1187,1192 ----
  buffer."
    (interactive)
    (if (stringp file) (find-file file))
!   (let (rev1 rev2 ancestor-rev)
      (setq rev1
  	  (read-string
*************** buffer."
*** 1230,1280 ****
  	    (if (stringp file)
  		(file-name-nondirectory file) "current buffer"))))
!     (cond ((eq ediff-version-control-package 'vc)
! 	   (save-excursion
! 	     (vc-version-other-window rev1)
! 	     (setq buf1 (current-buffer)))
! 	   (save-excursion
! 	     (or (string= rev2 "")
! 		 (vc-version-other-window rev2))
! 	     (setq buf2 (current-buffer)))
! 	   (save-excursion
! 	     (or (string= ancestor-rev "")
! 		 (vc-version-other-window ancestor-rev))
! 	     (setq ancestor-buf (current-buffer)))
! 	   (setq startup-hooks 
! 		 (cons
! 		  (` (lambda () 
! 		       (delete-file (, (buffer-file-name buf1)))
! 		       (or (, (string= rev2 ""))
! 			   (delete-file (, (buffer-file-name buf2))))
! 		       (or (, (string= ancestor-rev ""))
! 			   (delete-file (, (buffer-file-name ancestor-buf))))))
! 		  startup-hooks)))
! 	  ((eq ediff-version-control-package 'rcs)
! 	   (setq buf1 (rcs-ediff-view-revision rev1)
! 		 buf2 (if (string= rev2 "")
! 			  (current-buffer)
! 			(rcs-ediff-view-revision rev2))
! 		 ancestor-buf (if (string= ancestor-rev "")
! 				  (current-buffer)
! 				(rcs-ediff-view-revision ancestor-rev))))
! 	  ((eq ediff-version-control-package 'generic-sc)
! 	   (save-excursion
! 	     (if (string= rev1 "")
! 		 (setq rev1 (generic-sc-get-latest-rev)))
! 	     (sc-visit-previous-revision rev1)
! 	     (setq buf1 (current-buffer)))
! 	   (save-excursion
! 	     (or (string= rev2 "")
! 		 (sc-visit-previous-revision rev2))
! 	     (setq buf2 (current-buffer)))
! 	   (save-excursion
! 	     (or (string= ancestor-rev "")
! 		 (sc-visit-previous-revision ancestor-rev))
! 	     (setq ancestor-buf (current-buffer))))
! 	  ) ; cond
!     (ediff-merge-buffers-with-ancestor
!      buf1 buf2 ancestor-buf
!      startup-hooks 'ediff-merge-revisions-with-ancestor)))
       
       
--- 1207,1226 ----
  	    (if (stringp file)
  		(file-name-nondirectory file) "current buffer"))))
!     (ediff-load-version-control)
!     (funcall
!      (intern (format "%S-ediff-merge-internal" ediff-version-control-package))
!      rev1 rev2 ancestor-rev startup-hooks)))
! 
! ;;;###autoload
! (defun run-ediff-from-cvs-buffer (pos)
!   "Run Ediff-merge on appropriate revisions of the selected file.
! First run after `M-x cvs-update'. Then place the cursor on a lide describing a
! file and then run `run-ediff-from-cvs-buffer'."
!   (interactive "d")
!   (ediff-load-version-control)
!   (let ((tin (tin-locate cvs-cookie-handle pos)))
!     (if tin
! 	(cvs-run-ediff-on-file-descriptor tin)
!       (error "There is no file to merge"))))
       
       
*************** buffer. Use `vc.el' or `rcs.el' dependin
*** 1375,1378 ****
--- 1321,1325 ----
  ;; Is SILENT is non-nil, don't report error if package is not found.
  (defun ediff-load-version-control (&optional silent)
+   (require 'ediff-vers)
    (or (featurep ediff-version-control-package)
        (if (locate-library (symbol-name ediff-version-control-package))
*************** buffer. Use `vc.el' or `rcs.el' dependin
*** 1384,1486 ****
  		   ediff-version-control-package)))))
  
-       
- (defun vc-ediff-internal (rev1 rev2 &optional startup-hooks)
-   "Run Ediff on versions of the current buffer.
- If REV2 is \"\" then compare current buffer with REV1.
- If the current buffer is named `F', the version is named `F.~REV~'.
- If `F.~REV~' already exists, it is used instead of being re-created."
-   (let (file1 file2 rev1buf rev2buf)
-     (save-excursion
-       (vc-version-other-window rev1)
-       (setq rev1buf (current-buffer)
- 	    file1 (buffer-file-name)))
-     (save-excursion
-       (or (string= rev2 "") 		; use current buffer
- 	  (vc-version-other-window rev2))
-       (setq rev2buf (current-buffer)
- 	    file2 (buffer-file-name)))
-     (setq startup-hooks
- 	  (cons (` (lambda ()
- 		     (delete-file (, file1))
- 		     (or (, (string= rev2 "")) (delete-file (, file2)))
- 		     ))
- 		startup-hooks))
-     (ediff-buffers
-      rev1buf rev2buf
-      startup-hooks
-      'ediff-revision)))
-     
- (defun rcs-ediff-view-revision (&optional rev)
-   "View previous RCS revision of current file.
- With prefix argument, prompts for a revision name." 
-   (interactive (list (if current-prefix-arg 
- 			 (read-string "Revision: "))))
-   (let* ((filename (buffer-file-name (current-buffer)))
- 	 (switches (append '("-p")
- 			   (if rev (list (concat "-r" rev)) nil)))
- 	 (buff (concat (file-name-nondirectory filename) ".~" rev "~")))
-     (message "Working ...")
-     (setq filename (expand-file-name filename))
-     (with-output-to-temp-buffer buff
-       (let ((output-buffer (ediff-rcs-get-output-buffer filename buff)))
- 	(delete-windows-on output-buffer)
- 	(save-excursion
- 	  (set-buffer output-buffer)
- 	  (apply 'call-process "co" nil t nil
- 		 ;; -q: quiet (no diagnostics)
- 		 (append switches rcs-default-co-switches
- 			 (list "-q" filename))))) 
-       (message "")
-       buff)))    
-       
- (defun ediff-rcs-get-output-buffer (file name)
-   ;; Get a buffer for RCS output for FILE, make it writable and clean it up.
-   ;; Optional NAME is name to use instead of `*RCS-output*'.
-   ;; This is a modified version from rcs.el v1.1. I use it here to make
-   ;; Ediff immune to changes in rcs.el
-   (let* ((default-major-mode 'fundamental-mode) ; no frills!
- 	 (buf (get-buffer-create name)))
-     (save-excursion
-       (set-buffer buf)
-       (setq buffer-read-only nil
- 	    default-directory (file-name-directory (expand-file-name file)))
-       (erase-buffer))
-     buf))
- 
- (defun rcs-ediff-internal (rev1 rev2 &optional startup-hooks)
-   "Run Ediff on versions of the current buffer.
- If REV2 is \"\" then use current buffer."
-   (let ((rev2buf (if (string= rev2 "")
- 		     (current-buffer)
- 		   (rcs-ediff-view-revision rev2)))
- 	(rev1buf (rcs-ediff-view-revision rev1)))
- 	
-     ;; rcs.el doesn't create temp version files, so we don't have to delete
-     ;; anything in startup hooks to ediff-buffers
-     (ediff-buffers rev1buf rev2buf startup-hooks 'ediff-revision)
-     ))
- 
- (defun generic-sc-get-latest-rev ()
-   (cond ((eq sc-mode 'CCASE)
- 	 (eval "main/LATEST"))
- 	(t (eval "")))
-   )
- 
- (defun generic-sc-ediff-internal (rev1 rev2 &optional startup-hooks)
-   "Run Ediff on versions of the current buffer.
- If REV2 is \"\" then compare current buffer with REV1.
- If the current buffer is named `F', the version is named `F.~REV~'.
- If `F.~REV~' already exists, it is used instead of being re-created."
-   (let (rev1buf rev2buf)
-     (save-excursion
-       (if (or (not rev1) (string= rev1 ""))
- 	  (setq rev1 (generic-sc-get-latest-rev)))
-       (sc-visit-previous-revision rev1)
-       (setq rev1buf (current-buffer)))
-     (save-excursion
-       (or (string= rev2 "") 		; use current buffer
- 	  (sc-visit-previous-revision rev2))
-       (setq rev2buf (current-buffer)))
-     (ediff-buffers rev1buf rev2buf startup-hooks 'ediff-revision)))
  
  ;;;###autoload
--- 1331,1334 ----
*************** When called interactively, displays the 
*** 1493,1496 ****
--- 1341,1378 ----
      (format "Ediff %s of %s" ediff-version ediff-date)))
  
+ 
+ ;;;###autoload
+ (defun ediff-documentation ()
+   "Jump to Ediff's Info file."
+   (interactive)
+   (let ((ctl-window ediff-control-window)
+ 	(ctl-buf ediff-control-buffer))
+ 
+     (ediff-skip-unsuitable-frames)
+     (condition-case nil
+ 	(progn
+ 	  (pop-to-buffer (get-buffer-create "*info*"))
+ 	  (info (if ediff-xemacs-p "ediff.info" "ediff"))
+ 	  (message "Type `i' to search for a specific topic"))
+       (error (beep 1)
+ 	     (with-output-to-temp-buffer " *ediff-info*"
+ 	       (princ (format "
+ The Info file for Ediff does not seem to be installed.
+ 
+ This file is part of the distribution of %sEmacs.
+ Please contact your system administrator. "
+ 			      (if ediff-xemacs-p "X" ""))))
+ 	     (if (window-live-p ctl-window)
+ 		 (progn
+ 		   (select-window ctl-window)
+ 		   (set-window-buffer ctl-window ctl-buf)))))))
+     
+ 
+ 
+ 
+ ;;; Local Variables:
+ ;;; eval: (put 'ediff-defvar-local 'lisp-indent-hook 'defun)
+ ;;; eval: (put 'ediff-eval-in-buffer 'lisp-indent-hook 1)
+ ;;; End:
  
  (provide 'ediff)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/edmacro.el emacs-19.31/lisp/edmacro.el
*** emacs-19.30/lisp/edmacro.el	Sun Aug 27 13:50:21 1995
--- emacs-19.31/lisp/edmacro.el	Fri Feb  2 01:13:29 1996
***************
*** 21,26 ****
  
  ;; 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:
--- 21,27 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** Default nil means to write characters ab
*** 88,91 ****
--- 89,96 ----
    (define-key edmacro-mode-map "\C-c\C-q" 'edmacro-insert-key))
  
+ (defvar edmacro-store-hook)
+ (defvar edmacro-finish-hook)
+ (defvar edmacro-original-buffer)
+ 
  ;;;###autoload
  (defun edit-kbd-macro (keys &optional prefix finish-hook store-hook)
*************** With a prefix argument, format the macro
*** 112,115 ****
--- 117,122 ----
  	    ((eq cmd 'execute-extended-command)
  	     (setq cmd (read-command "Name of keyboard macro to edit: "))
+ 	     (if (string-equal cmd "")
+ 		 (error "No command name given"))
  	     (setq mac (symbol-function cmd)))
  	    ((eq cmd 'view-lossage)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/edt-lk201.el emacs-19.31/lisp/edt-lk201.el
*** emacs-19.30/lisp/edt-lk201.el	Mon Oct 30 11:57:05 1995
--- emacs-19.31/lisp/edt-lk201.el	Sun Jan 14 02:34:30 1996
***************
*** 20,25 ****
  
  ;; 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.
  
  ;;; Usage:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Usage:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/edt-mapper.el emacs-19.31/lisp/edt-mapper.el
*** emacs-19.30/lisp/edt-mapper.el	Mon Oct 30 11:57:43 1995
--- emacs-19.31/lisp/edt-mapper.el	Sun Jan 14 02:34:30 1996
***************
*** 20,25 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/edt-pc.el emacs-19.31/lisp/edt-pc.el
*** emacs-19.30/lisp/edt-pc.el	Mon Oct 30 11:58:20 1995
--- emacs-19.31/lisp/edt-pc.el	Sun Jan 14 02:34:30 1996
***************
*** 20,25 ****
  
  ;; 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.
  
  ;;; Usage:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Usage:
***************
*** 39,43 ****
  ;;
  ;; The PC keypad keys are mapped to the corresponding DEC LK-201
! ;; keypad keys according to the corresponding physical possition on
  ;; the keyboard.  Thus, the physical position of the PC keypad key
  ;; determines its function, not the PC keycap name.
--- 40,44 ----
  ;;
  ;; The PC keypad keys are mapped to the corresponding DEC LK-201
! ;; keypad keys according to the corresponding physical position on
  ;; the keyboard.  Thus, the physical position of the PC keypad key
  ;; determines its function, not the PC keycap name.
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/edt-vt100.el emacs-19.31/lisp/edt-vt100.el
*** emacs-19.30/lisp/edt-vt100.el	Mon Oct 30 11:59:04 1995
--- emacs-19.31/lisp/edt-vt100.el	Sun Jan 14 02:34:30 1996
***************
*** 20,25 ****
  
  ;; 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.
  
  ;;; Usage:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Usage:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/edt.el emacs-19.31/lisp/edt.el
*** emacs-19.30/lisp/edt.el	Mon Oct 30 11:59:34 1995
--- emacs-19.31/lisp/edt.el	Wed Jan 24 19:26:40 1996
***************
*** 20,25 ****
  
  ;; 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.
  
  ;;; Usage:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Usage:
*************** Accepts a positive prefix argument for t
*** 400,404 ****
  
  (defun edt-find-forward (&optional find)
!   "Find first occurance of a string in forward direction and save it."
    (interactive)
    (if (not find)
--- 401,405 ----
  
  (defun edt-find-forward (&optional find)
!   "Find first occurrence of a string in forward direction and save it."
    (interactive)
    (if (not find)
*************** Accepts a positive prefix argument for t
*** 408,412 ****
  
  (defun edt-find-backward (&optional find)
!   "Find first occurance of a string in the backward direction and save it."
    (interactive)
    (if (not find)
--- 409,413 ----
  
  (defun edt-find-backward (&optional find)
!   "Find first occurrence of a string in the backward direction and save it."
    (interactive)
    (if (not find)
*************** Accepts a positive prefix argument for t
*** 415,419 ****
  
  (defun edt-find ()
!   "Find first occurance of string in current direction and save it."
    (interactive)
    (set 'search-last-string (read-string "Search: "))
--- 416,420 ----
  
  (defun edt-find ()
!   "Find first occurrence of string in current direction and save it."
    (interactive)
    (set 'search-last-string (read-string "Search: "))
*************** Accepts a positive prefix argument for t
*** 428,432 ****
  
  (defun edt-find-next-forward ()
!   "Find next occurance of a string in forward direction."
    (interactive)
    (forward-char 1)
--- 429,433 ----
  
  (defun edt-find-next-forward ()
!   "Find next occurrence of a string in forward direction."
    (interactive)
    (forward-char 1)
*************** Accepts a positive prefix argument for t
*** 438,442 ****
  
  (defun edt-find-next-backward ()
!   "Find next occurance of a string in backward direction."
    (interactive)
    (if (eq (search-backward search-last-string nil t) nil)
--- 439,443 ----
  
  (defun edt-find-next-backward ()
!   "Find next occurrence of a string in backward direction."
    (interactive)
    (if (eq (search-backward search-last-string nil t) nil)
*************** Accepts a positive prefix argument for t
*** 445,449 ****
  
  (defun edt-find-next ()
!   "Find next occurance of a string in current direction."
    (interactive)
    (if (equal edt-direction-string edt-forward-string)
--- 446,450 ----
  
  (defun edt-find-next ()
!   "Find next occurrence of a string in current direction."
    (interactive)
    (if (equal edt-direction-string edt-forward-string)
*************** Accepts a positive prefix argument for t
*** 1185,1189 ****
    (interactive)
    (set 'time-string (current-time-string))
!   (message time-string))
  
  ;;;
--- 1186,1190 ----
    (interactive)
    (set 'time-string (current-time-string))
!   (message "%s" time-string))
  
  ;;;
*************** and the cursor is left to rest at the be
*** 1408,1412 ****
  Optional second argument NOT-YES changes default to negative.
  Like emacs y-or-n-p, also accepts space as y and DEL as n."
!   (message (format "%s[%s]" prompt (if not-yes "n" "y")))
    (let ((doit t))
      (while doit
--- 1409,1413 ----
  Optional second argument NOT-YES changes default to negative.
  Like emacs y-or-n-p, also accepts space as y and DEL as n."
!   (message "%s[%s]" prompt (if not-yes "n" "y"))
    (let ((doit t))
      (while doit
*************** Like emacs y-or-n-p, also accepts space 
*** 1420,1425 ****
  	      (t
  	       (setq doit t) (beep)
! 	       (message (format "Please answer y or n.  %s[%s]"
! 				prompt (if not-yes "n" "y"))))))))
    edt-last-answer)
  
--- 1421,1426 ----
  	      (t
  	       (setq doit t) (beep)
! 	       (message "Please answer y or n.  %s[%s]"
! 			prompt (if not-yes "n" "y")))))))
    edt-last-answer)
  
*************** If FILE is nil, try to load a default fi
*** 1483,1487 ****
    (interactive)
    ;; If using MS-DOS, need to load edt-pc.el
!   (if (string-equal system-type "ms-dos")
        (setq edt-term "pc")
      (setq edt-term (getenv "TERM")))
--- 1484,1488 ----
    (interactive)
    ;; If using MS-DOS, need to load edt-pc.el
!   (if (eq system-type 'ms-dos)
        (setq edt-term "pc")
      (setq edt-term (getenv "TERM")))
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/ehelp.el emacs-19.31/lisp/ehelp.el
*** emacs-19.30/lisp/ehelp.el	Thu Nov  2 15:33:38 1995
--- emacs-19.31/lisp/ehelp.el	Fri Apr  5 11:04:11 1996
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 42,45 ****
--- 43,48 ----
    "Keymap defining commands available in `electric-help-mode'.")
  
+ (defvar electric-help-form-to-execute nil)
+ 
  (put 'electric-help-undefined 'suppress-keymap t)
  (if electric-help-map
***************
*** 86,90 ****
    (setq mode-line-buffer-identification '(" Help:  %b"))
    (use-local-map electric-help-map)
!   (setq mouse-leave-buffer-hook '(electric-help-retain))
    ;; this is done below in with-electric-help
    ;(run-hooks 'electric-help-mode-hook)
--- 89,94 ----
    (setq mode-line-buffer-identification '(" Help:  %b"))
    (use-local-map electric-help-map)
!   (add-hook 'mouse-leave-buffer-hook 'electric-help-retain)
!   (view-mode -1)
    ;; this is done below in with-electric-help
    ;(run-hooks 'electric-help-mode-hook)
*************** BUFFER is put into `default-major-mode' 
*** 120,124 ****
  	(config (current-window-configuration))
          (bury nil)
!         (to-be-executed nil))
      (unwind-protect
           (save-excursion
--- 124,128 ----
  	(config (current-window-configuration))
          (bury nil)
!         (electric-help-form-to-execute nil))
      (unwind-protect
           (save-excursion
*************** BUFFER is put into `default-major-mode' 
*** 131,135 ****
                   (enlarge-window (- minheight (window-height))))
               (electric-help-mode)
!              (or noerase (erase-buffer)))
             (let ((standard-output buffer))
               (if (not (funcall thunk))
--- 135,141 ----
                   (enlarge-window (- minheight (window-height))))
               (electric-help-mode)
! 	     (setq buffer-read-only nil)
! 	     (or noerase
! 		 (erase-buffer)))
             (let ((standard-output buffer))
               (if (not (funcall thunk))
*************** BUFFER is put into `default-major-mode' 
*** 141,144 ****
--- 147,151 ----
             (set-buffer buffer)
             (run-hooks 'electric-help-mode-hook)
+ 	   (setq buffer-read-only t)
             (if (eq (car-safe (electric-help-command-loop))
                     'retain)
*************** BUFFER is put into `default-major-mode' 
*** 159,168 ****
              ;; must do this outside of save-window-excursion
              (bury-buffer buffer)))
!       (eval to-be-executed))))
  
  (defun electric-help-command-loop ()
    (catch 'exit
      (if (pos-visible-in-window-p (point-max))
! 	(progn (message (substitute-command-keys "<<< Press Space to bury the help buffer, Press \\[electric-help-retain] to retain it >>>"))
  	       (if (equal (setq unread-command-events (list (read-event)))
  			  '(?\ ))
--- 166,175 ----
              ;; must do this outside of save-window-excursion
              (bury-buffer buffer)))
!       (eval electric-help-form-to-execute))))
  
  (defun electric-help-command-loop ()
    (catch 'exit
      (if (pos-visible-in-window-p (point-max))
! 	(progn (message "%s" (substitute-command-keys "<<< Press Space to bury the help buffer, Press \\[electric-help-retain] to retain it >>>"))
  	       (if (equal (setq unread-command-events (list (read-event)))
  			  '(?\ ))
*************** will select it.)"
*** 226,233 ****
    ;; Make sure that we don't throw twice, even if two events cause
    ;; calling this function:
!   (if mouse-leave-buffer-hook
!     (progn
!       (setq mouse-leave-buffer-hook nil)
!       (throw 'exit '(retain)))))
  
  
--- 233,240 ----
    ;; Make sure that we don't throw twice, even if two events cause
    ;; calling this function:
!   (if (memq 'electric-help-retain mouse-leave-buffer-hook)
!       (progn
! 	(remove-hook 'mouse-leave-buffer-hook 'electric-help-retain)
! 	(throw 'exit '(retain)))))
  
  
*************** will select it.)"
*** 311,315 ****
  (defun electric-help-execute-extended (prefixarg)
    (interactive "p")
!   (setq to-be-executed '(execute-extended-command nil))
    (electric-help-retain))
  
--- 318,322 ----
  (defun electric-help-execute-extended (prefixarg)
    (interactive "p")
!   (setq electric-help-form-to-execute '(execute-extended-command nil))
    (electric-help-retain))
  
*************** will select it.)"
*** 318,322 ****
  (defun electric-help-ctrl-x-prefix (prefixarg)
    (interactive "p")
!   (setq to-be-executed '(progn (message nil) (setq unread-command-char ?\C-x)))
    (electric-help-retain))
  
--- 325,329 ----
  (defun electric-help-ctrl-x-prefix (prefixarg)
    (interactive "p")
!   (setq electric-help-form-to-execute '(progn (message nil) (setq unread-command-char ?\C-x)))
    (electric-help-retain))
  
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/electric.el emacs-19.31/lisp/electric.el
*** emacs-19.30/lisp/electric.el	Sat Oct 21 18:21:59 1995
--- emacs-19.31/lisp/electric.el	Thu Apr  4 17:05:38 1996
***************
*** 20,25 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 67,72 ****
        (setq cmd (read-key-sequence prompt-string))
        (setq last-command-char (aref cmd (1- (length cmd)))
! 	    this-command (key-binding cmd)
  	    cmd this-command)
        (if (or (prog1 quit-flag (setq quit-flag nil))
  	      (eq last-input-char ?\C-g))
--- 68,75 ----
        (setq cmd (read-key-sequence prompt-string))
        (setq last-command-char (aref cmd (1- (length cmd)))
! 	    this-command (key-binding cmd t)
  	    cmd this-command)
+       ;; This makes universal-argument-other-key work.
+       (setq universal-argument-num-events 0)
        (if (or (prog1 quit-flag (setq quit-flag nil))
  	      (eq last-input-char ?\C-g))
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/elp.el emacs-19.31/lisp/elp.el
*** emacs-19.30/lisp/elp.el	Wed Dec 28 19:10:08 1994
--- emacs-19.31/lisp/elp.el	Fri Mar 22 09:17:17 1996
***************
*** 23,28 ****
  
  ;; 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:
--- 23,29 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** For example, to instrument all ELP funct
*** 300,306 ****
  				     (lambda (sym)
  				       (and (fboundp sym)
! 					    (not (eq (car-safe
! 						      (symbol-function sym))
! 						     'macro)))))))))
  
  (defun elp-restore-list (&optional list)
--- 301,307 ----
  				     (lambda (sym)
  				       (and (fboundp sym)
! 					    (not (memq (car-safe
! 							(symbol-function sym))
! 						       '(macro keymap autoload))))))))))
  
  (defun elp-restore-list (&optional list)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/emacs-lock.el emacs-19.31/lisp/emacs-lock.el
*** emacs-19.30/lisp/emacs-lock.el	Mon Oct 30 12:00:30 1995
--- emacs-19.31/lisp/emacs-lock.el	Sun Jan 14 02:34:30 1996
***************
*** 1,26 ****
  ;;; emacs-lock.el --- prevents you from exiting emacs if a buffer is locked
  ;; Copyright (C) 1994 Free Software Foundation, Inc
! ;;
  ;; Author: Tom Wurgler <twurgler@goodyear.com>
  ;; Created: 12/8/94
  ;; Version: 1.3
  ;; Keywords: 
! ;;
! ;; This program 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 of the License, or
! ;; (at your option) any later version.
! ;;
! ;; This program 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; if not, write to the Free Software
! ;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  
  ;;; Commentary:
! ;;
  ;; This code sets a buffer-local variable to t if toggle-emacs-lock is run,
  ;; then if the user attempts to exit emacs, the locked buffer name will be
--- 1,30 ----
  ;;; emacs-lock.el --- prevents you from exiting emacs if a buffer is locked
+ 
  ;; Copyright (C) 1994 Free Software Foundation, Inc
! 
  ;; Author: Tom Wurgler <twurgler@goodyear.com>
  ;; Created: 12/8/94
  ;; Version: 1.3
  ;; Keywords: 
! 
! ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
! 
  ;; This code sets a buffer-local variable to t if toggle-emacs-lock is run,
  ;; then if the user attempts to exit emacs, the locked buffer name will be
***************
*** 29,34 ****
  ;; program and exiting emacs would abort that program, you may want to lock
  ;; that buffer, then if you forget about it after a while, you won't
! ;; accidently exit emacs.  To unlock the buffer, just goto the buffer and
  ;; run toggle-emacs-lock again.
  
  (defvar lock-emacs-from-exiting nil
--- 33,40 ----
  ;; program and exiting emacs would abort that program, you may want to lock
  ;; that buffer, then if you forget about it after a while, you won't
! ;; accidentally exit emacs.  To unlock the buffer, just goto the buffer and
  ;; run toggle-emacs-lock again.
+ 
+ ;;; Code:
  
  (defvar lock-emacs-from-exiting nil
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/emacsbug.el emacs-19.31/lisp/emacsbug.el
*** emacs-19.30/lisp/emacsbug.el	Wed Oct 18 21:07:43 1995
--- emacs-19.31/lisp/emacsbug.el	Sun Mar 17 10:30:31 1996
***************
*** 21,26 ****
  
  ;; 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:
--- 21,27 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 38,42 ****
  
  (defvar bug-gnu-emacs "bug-gnu-emacs@prep.ai.mit.edu"
!   "Address of site maintaining mailing list for GNU Emacs bugs.")
  
  (defvar report-emacs-bug-orig-text nil
--- 39,46 ----
  
  (defvar bug-gnu-emacs "bug-gnu-emacs@prep.ai.mit.edu"
!   "Address of mailing list for GNU Emacs bugs.")
! 
! (defvar report-emacs-bug-pretest-address "emacs-pretest-bug@gnu.ai.mit.edu"
!   "Address of mailing list for GNU Emacs pretest bugs.")
  
  (defvar report-emacs-bug-orig-text nil
***************
*** 48,81 ****
  Prompts for bug subject.  Leaves you in a mail buffer."
    (interactive "sBug Subject: ")
!   (mail nil bug-gnu-emacs topic)
!   (goto-char (point-min))
!   (re-search-forward (concat "^" (regexp-quote mail-header-separator) "\n"))
!   (insert "In " (emacs-version) "\n")
!   (if (and system-configuration-options
! 	   (not (equal system-configuration-options "")))
!       (insert "configured using `configure "
! 	      system-configuration-options "'\n"))
!   (insert "\n")
!   ;; This is so the user has to type something
!   ;; in order to send easily.
!   (use-local-map (nconc (make-sparse-keymap) (current-local-map)))
!   (define-key (current-local-map) "\C-c\C-i" 'report-emacs-bug-info)
!   (with-output-to-temp-buffer "*Bug Help*"
!     (princ (substitute-command-keys
! 	    "Type \\[mail-send-and-exit] to send the bug report.\n"))
!     (terpri)
!     (princ (substitute-command-keys
! 	    "Type \\[report-emacs-bug-info] to visit in Info the Emacs Manual section
  about when and how to write a bug report,
  and what information to supply so that the bug can be fixed.
  Type SPC to scroll through this section and its subsections.")))
!   ;; Make it less likely people will send empty messages.
!   (make-local-variable 'mail-send-hook)
!   (add-hook 'mail-send-hook 'report-emacs-bug-hook)
!   (save-excursion
!     (goto-char (point-max))
!     (skip-chars-backward " \t\n")
!     (make-local-variable 'report-emacs-bug-orig-text)
!     (setq report-emacs-bug-orig-text (buffer-substring (point-min) (point)))))
  
  (defun report-emacs-bug-info ()
--- 52,130 ----
  Prompts for bug subject.  Leaves you in a mail buffer."
    (interactive "sBug Subject: ")
!   (if (mail nil
! 	    (if (string-match "\\..*\\..*\\." emacs-version)
! 		;; If there are four numbers in emacs-version,
! 		;; this is a pretest version.
! 		report-emacs-bug-pretest-address
! 	      bug-gnu-emacs)
! 	    topic)
!       (let (user-point)
! 	;; The rest of this does not execute
! 	;; if the user was asked to confirm and said no.
! 	(goto-char (point-min))
! 	(re-search-forward (concat "^" (regexp-quote mail-header-separator) "\n"))
! 	(insert "In " (emacs-version) "\n")
! 	(if (and system-configuration-options
! 		 (not (equal system-configuration-options "")))
! 	    (insert "configured using `configure "
! 		    system-configuration-options "'\n"))
! 	(insert "\n")
! 	(insert "Please describe exactly what actions triggered the bug\n"
! 		"and the precise symptoms of the bug:\n\n") 
! 	(setq user-point (point))
! 	(insert "\n\n\n"
! 		"Recent input:\n")
! 	(let ((before-keys (point)))
! 	  (insert (mapconcat (lambda (key)
! 			       (if (or (integerp key)
! 				       (symbolp key)
! 				       (listp key))
! 				   (single-key-description key)
! 				 (prin1-to-string key nil)))
! 			     (recent-keys)
! 			     " "))
! 	  (save-restriction
! 	    (narrow-to-region before-keys (point))
! 	    (goto-char before-keys)
! 	    (while (progn (move-to-column 50) (not (eobp)))
! 	      (search-forward " " nil t)
! 	      (insert "\n"))))
! 	(let ((message-buf (get-buffer "*Messages*")))
! 	  (if message-buf
! 	      (progn
! 		(insert "\n\nRecent messages:\n")
! 		(insert-buffer-substring message-buf
! 					 (save-excursion
! 					   (set-buffer message-buf)
! 					   (goto-char (point-max))
! 					   (forward-line -10)
! 					   (point))
! 					 (save-excursion
! 					   (set-buffer message-buf)
! 					   (point-max))))))
! 	;; This is so the user has to type something
! 	;; in order to send easily.
! 	(use-local-map (nconc (make-sparse-keymap) (current-local-map)))
! 	(define-key (current-local-map) "\C-c\C-i" 'report-emacs-bug-info)
! 	(with-output-to-temp-buffer "*Bug Help*"
! 	  (princ (substitute-command-keys
! 		  "Type \\[mail-send-and-exit] to send the bug report.\n"))
! 	  (princ (substitute-command-keys
! 		  "Type \\[kill-buffer] RET to cancel (don't send it).\n"))
! 	  (terpri)
! 	  (princ (substitute-command-keys
! 		  "Type \\[report-emacs-bug-info] to visit in Info the Emacs Manual section
  about when and how to write a bug report,
  and what information to supply so that the bug can be fixed.
  Type SPC to scroll through this section and its subsections.")))
! 	;; Make it less likely people will send empty messages.
! 	(make-local-variable 'mail-send-hook)
! 	(add-hook 'mail-send-hook 'report-emacs-bug-hook)
! 	(save-excursion
! 	  (goto-char (point-max))
! 	  (skip-chars-backward " \t\n")
! 	  (make-local-variable 'report-emacs-bug-orig-text)
! 	  (setq report-emacs-bug-orig-text (buffer-substring (point-min) (point))))
! 	(goto-char user-point))))
  
  (defun report-emacs-bug-info ()
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/emerge.el emacs-19.31/lisp/emerge.el
*** emacs-19.30/lisp/emerge.el	Tue Apr 25 16:38:11 1995
--- emacs-19.31/lisp/emerge.el	Sun Feb 25 17:46:32 1996
***************
*** 3,7 ****
  ;;; The author has placed this file in the public domain.
  
! ;; Author: Dale R. Worley <drw@math.mit.edu>
  ;; Version: 5fsf
  ;; Keywords: unix, tools
--- 3,7 ----
  ;;; The author has placed this file in the public domain.
  
! ;; Author: Dale R. Worley <worley@world.std.com>
  ;; Version: 5fsf
  ;; Keywords: unix, tools
***************
*** 29,51 ****
  ;;;###autoload
  (define-key menu-bar-emerge-menu [emerge-merge-directories]
!   '("Merge Directories ..." . emerge-merge-directories))
  ;;;###autoload
  (define-key menu-bar-emerge-menu [emerge-revisions-with-ancestor]
!   '("Revisions with Ancestor ..." . emerge-revisions-with-ancestor))
  ;;;###autoload
  (define-key menu-bar-emerge-menu [emerge-revisions]
!   '("Revisions ..." . emerge-revisions))
  ;;;###autoload
  (define-key menu-bar-emerge-menu [emerge-files-with-ancestor]
!   '("Files with Ancestor ..." . emerge-files-with-ancestor))
  ;;;###autoload
  (define-key menu-bar-emerge-menu [emerge-files]
!   '("Files ..." . emerge-files))
  ;;;###autoload
  (define-key menu-bar-emerge-menu [emerge-buffers-with-ancestor]
!   '("Buffers with Ancestor ..." . emerge-buffers-with-ancestor))
  ;;;###autoload
  (define-key menu-bar-emerge-menu [emerge-buffers]
!   '("Buffers ..." . emerge-buffers))
  
  ;;; Macros
--- 29,51 ----
  ;;;###autoload
  (define-key menu-bar-emerge-menu [emerge-merge-directories]
!   '("Merge Directories..." . emerge-merge-directories))
  ;;;###autoload
  (define-key menu-bar-emerge-menu [emerge-revisions-with-ancestor]
!   '("Revisions with Ancestor..." . emerge-revisions-with-ancestor))
  ;;;###autoload
  (define-key menu-bar-emerge-menu [emerge-revisions]
!   '("Revisions..." . emerge-revisions))
  ;;;###autoload
  (define-key menu-bar-emerge-menu [emerge-files-with-ancestor]
!   '("Files with Ancestor..." . emerge-files-with-ancestor))
  ;;;###autoload
  (define-key menu-bar-emerge-menu [emerge-files]
!   '("Files..." . emerge-files))
  ;;;###autoload
  (define-key menu-bar-emerge-menu [emerge-buffers-with-ancestor]
!   '("Buffers with Ancestor..." . emerge-buffers-with-ancestor))
  ;;;###autoload
  (define-key menu-bar-emerge-menu [emerge-buffers]
!   '("Buffers..." . emerge-buffers))
  
  ;;; Macros
*************** Do not start with `~/' or `~user-name/'.
*** 269,273 ****
  
  (defvar emerge-combine-versions-template
!   "#ifdef NEW\n%b#else /* NEW */\n%a#endif /* NEW */\n"
    "*Template for `emerge-combine-versions' to combine the two versions.
  The template is inserted as a string, with the following interpolations:
--- 269,273 ----
  
  (defvar emerge-combine-versions-template
!   "#ifdef NEW\n%b#else /* not NEW */\n%a#endif /* not NEW */\n"
    "*Template for `emerge-combine-versions' to combine the two versions.
  The template is inserted as a string, with the following interpolations:
*************** to the left margin, if they are in windo
*** 1742,1746 ****
  ;; anything.
  ;; If not, recenter the region to make it so.
! ;; If that isn't possible, remove context lines balancedly from top and botton
  ;; so the entire region shows.
  ;; If that isn't possible, show the top of the region.
--- 1742,1746 ----
  ;; anything.
  ;; If not, recenter the region to make it so.
! ;; If that isn't possible, remove context lines balancedly from top and bottom
  ;; so the entire region shows.
  ;; If that isn't possible, show the top of the region.
*************** keymap.  Leaves merge in fast mode."
*** 2848,2852 ****
  ;; the variables).  A list element can also be a list of two functions,
  ;; the first of which (when called with no arguments) gets the value, and
! ;; the second (when called with a value as an argment) sets the value.
  ;; A "function" is anything that funcall can handle as an argument.
  
--- 2848,2852 ----
  ;; the variables).  A list element can also be a list of two functions,
  ;; the first of which (when called with no arguments) gets the value, and
! ;; the second (when called with a value as an argument) sets the value.
  ;; A "function" is anything that funcall can handle as an argument.
  
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/enriched.el emacs-19.31/lisp/enriched.el
*** emacs-19.30/lisp/enriched.el	Fri Nov 10 13:03:39 1995
--- emacs-19.31/lisp/enriched.el	Wed May 15 10:55:22 1996
***************
*** 1,3 ****
--- 1,4 ----
  ;;; enriched.el --- read and save files in text/enriched format
+ 
  ;; Copyright (c) 1994, 1995 Free Software Foundation, Inc.
  
***************
*** 11,39 ****
  ;; 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:
! ;;
  ;; This file implements reading, editing, and saving files with
! ;; text-properties such as faces, levels of indentation, and true line breaks
! ;; distinguished from newlines just used to fit text into the window.
! ;;
  ;; The file format used is the MIME text/enriched format, which is a
! ;; standard format defined in internet RFC 1563.  All standard annotations are
! ;; supported except for <smaller> and <bigger>, which are currently not
  ;; possible to display.
! ;; 
  ;; A separate file, enriched.doc, contains further documentation and other
! ;; important information about this code.  It also serves as an example file
! ;; in text/enriched format.  It should be in the etc directory of your emacs
! ;; distribution.
  
  (provide 'enriched)
--- 12,43 ----
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
! 
  ;; This file implements reading, editing, and saving files with
! ;; text-properties such as faces, levels of indentation, and true line
! ;; breaks distinguished from newlines just used to fit text into the window.
! 
  ;; The file format used is the MIME text/enriched format, which is a
! ;; standard format defined in internet RFC 1563.  All standard annotations
! ;; are supported except for <smaller> and <bigger>, which are currently not
  ;; possible to display.
! 
  ;; A separate file, enriched.doc, contains further documentation and other
! ;; important information about this code.  It also serves as an example
! ;; file in text/enriched format.  It should be in the etc directory of your
! ;; emacs distribution.
! 
! ;;; Code:
  
  (provide 'enriched)
*************** Any property that is neither on this lis
*** 146,150 ****
  
  (defvar enriched-mode nil
!   "True if `enriched-mode' is in use.")
  (make-variable-buffer-local 'enriched-mode)
  
--- 150,154 ----
  
  (defvar enriched-mode nil
!   "True if Enriched mode is in use.")
  (make-variable-buffer-local 'enriched-mode)
  
*************** Any property that is neither on this lis
*** 154,161 ****
  		minor-mode-alist)))
  
! (defvar enriched-mode-hooks nil
!   "Functions to run when entering `enriched-mode'.
  If you set variables in this hook, you should arrange for them to be restored
! to their old values if enriched-mode is left.  One way to do this is to add
  them and their old values to `enriched-old-bindings'.")
  
--- 158,165 ----
  		minor-mode-alist)))
  
! (defvar enriched-mode-hook nil
!   "Functions to run when entering Enriched mode.
  If you set variables in this hook, you should arrange for them to be restored
! to their old values if you leave Enriched mode.  One way to do this is to add
  them and their old values to `enriched-old-bindings'.")
  
*************** The value is a list of \(VAR VALUE VAR V
*** 177,183 ****
  These are files with embedded formatting information in the MIME standard
  text/enriched format.
! Turning the mode on runs `enriched-mode-hooks'.
  
! More information about enriched-mode is available in the file 
  etc/enriched.doc  in the Emacs distribution directory.
  
--- 181,187 ----
  These are files with embedded formatting information in the MIME standard
  text/enriched format.
! Turning the mode on runs `enriched-mode-hook'.
  
! More information about Enriched mode is available in the file 
  etc/enriched.doc  in the Emacs distribution directory.
  
*************** Commands:
*** 205,209 ****
  		       (cons 'text/enriched buffer-file-format)))
  	     ;; Save old variable values before we change them.
! 	     ;; These will be restored if we exit enriched-mode.
  	     (setq enriched-old-bindings
  		   (list 'buffer-display-table buffer-display-table
--- 209,213 ----
  		       (cons 'text/enriched buffer-file-format)))
  	     ;; Save old variable values before we change them.
! 	     ;; These will be restored if we exit Enriched mode.
  	     (setq enriched-old-bindings
  		   (list 'buffer-display-table buffer-display-table
*************** Commands:
*** 227,231 ****
  			 (plist-put default-text-properties
  				    'front-sticky sticky))))
! 	     (run-hooks 'enriched-mode-hooks)))
      (set-buffer-modified-p mod)
      (force-mode-line-update)))
--- 231,235 ----
  			 (plist-put default-text-properties
  				    'front-sticky sticky))))
! 	     (run-hooks 'enriched-mode-hook)))
      (set-buffer-modified-p mod)
      (force-mode-line-update)))
*************** Commands:
*** 236,240 ****
  
  (defvar enriched-mode-map nil
!   "Keymap for `enriched-mode'.")
  
  (if (null enriched-mode-map)
--- 240,244 ----
  
  (defvar enriched-mode-map nil
!   "Keymap for Enriched mode.")
  
  (if (null enriched-mode-map)
*************** Return value is \(begin end name positiv
*** 426,431 ****
        ;; A single < that does not start an annotation is an error,
        ;; which we note and then ignore.
!       (message (format "Warning: malformed annotation in file at %s" 
! 		       (1- (point))))))
    (if (not (eobp))
        (let* ((beg (match-beginning 0))
--- 430,435 ----
        ;; A single < that does not start an annotation is an error,
        ;; which we note and then ignore.
!       (message "Warning: malformed annotation in file at %s" 
! 	       (1- (point)))))
    (if (not (eobp))
        (let* ((beg (match-beginning 0))
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/env.el emacs-19.31/lisp/env.el
*** emacs-19.30/lisp/env.el	Sun Sep 10 00:30:27 1995
--- emacs-19.31/lisp/env.el	Sun Jan 14 02:34:30 1996
***************
*** 1,31 ****
  ;;; env.el --- functions to manipulate environment variables.
  
! ;;; Copyright 1991, 1994 Free Software Foundation, Inc.
  
  ;; Maintainer: FSF
  ;; Keywords: processes, unix
  
! ;;; 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:
  
! ;; UNIX processes inherit a list of name-to-string associations from
! ;; their parents called their `environment'; these are commonly used
! ;; to control program options.  This package permits you to set
! ;; environment variables to be passed to any sub-process run under Emacs.
  
  ;;; Code:
--- 1,32 ----
  ;;; env.el --- functions to manipulate environment variables.
  
! ;; Copyright (C) 1991, 1994 Free Software Foundation, Inc.
  
  ;; Maintainer: FSF
  ;; Keywords: processes, unix
  
! ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
! ;; UNIX processes inherit a list of name-to-string associations from their
! ;; parents called their `environment'; these are commonly used to control
! ;; program options.  This package permits you to set environment variables
! ;; to be passed to any sub-process run under Emacs.
  
  ;;; Code:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/etags.el emacs-19.31/lisp/etags.el
*** emacs-19.30/lisp/etags.el	Fri Nov 17 17:26:41 1995
--- emacs-19.31/lisp/etags.el	Mon May  6 20:04:25 1996
***************
*** 20,25 ****
  
  ;; 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.
  
  ;;; Code:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Code:
*************** of the format-parsing tags function vari
*** 137,142 ****
    "Function of to go to the location in the buffer specified by a tag.
  One argument, the tag info returned by `snarf-tag-function'.")
- (defvar find-tag-file-order nil
-   "Function which checks for complete and correct match, for file name as tag.")
  (defvar find-tag-regexp-search-function nil
    "Search function passed to `find-tag-in-order' for finding a regexp tag.")
--- 138,141 ----
*************** file the tag was in."
*** 228,232 ****
  	    (setq computed (cons (car tables) computed)
  		  table-buffer (get-file-buffer (car tables)))
! 	    (if (and table-buffer 
  		     ;; There is a buffer visiting the file.  Now make sure
  		     ;; it is initialized as a tag table buffer.
--- 227,231 ----
  	    (setq computed (cons (car tables) computed)
  		  table-buffer (get-file-buffer (car tables)))
! 	    (if (and table-buffer
  		     ;; There is a buffer visiting the file.  Now make sure
  		     ;; it is initialized as a tag table buffer.
*************** Returns non-nil iff it is a valid table.
*** 365,369 ****
  	  (let ((tags-file-name (car tables)))
  	    (visit-tags-table-buffer 'same)
! 	    (if (member this-file (tags-table-files))
  		;; Found it.
  		(setq found tables))))
--- 364,369 ----
  	  (let ((tags-file-name (car tables)))
  	    (visit-tags-table-buffer 'same)
! 	    (if (member this-file (mapcar 'expand-file-name
! 					  (tags-table-files)))
  		;; Found it.
  		(setq found tables))))
*************** Returns non-nil iff it is a valid table.
*** 388,392 ****
  	  ;; The last element we found in the computed list before FOUND
  	  ;; that appears in the user's list will be the table that
! 	  ;; included the one we found.  
  	  could-be))))
  
--- 388,392 ----
  	  ;; The last element we found in the computed list before FOUND
  	  ;; that appears in the user's list will be the table that
! 	  ;; included the one we found.
  	  could-be))))
  
*************** Returns t if it visits a tags table, or 
*** 424,428 ****
  	 ;; Use the ambient value of tags-file-name.
  	 (or tags-file-name
! 	     (error (substitute-command-keys
  		     (concat "No tags table in use!  "
  			     "Use \\[visit-tags-table] to select one.")))))
--- 424,429 ----
  	 ;; Use the ambient value of tags-file-name.
  	 (or tags-file-name
! 	     (error "%s"
! 		    (substitute-command-keys
  		     (concat "No tags table in use!  "
  			     "Use \\[visit-tags-table] to select one.")))))
*************** Returns t if it visits a tags table, or 
*** 455,459 ****
  		;; do it below.
  		(and buffer-file-name
! 		     (or 
  		      ;; First check only tables already in buffers.
  		      (tags-table-including buffer-file-name t)
--- 456,460 ----
  		;; do it below.
  		(and buffer-file-name
! 		     (or
  		      ;; First check only tables already in buffers.
  		      (tags-table-including buffer-file-name t)
*************** File name returned is relative to tags t
*** 596,601 ****
  (defun tags-table-files ()
    "Return a list of files in the current tags table.
! Assumes the tags table is the current buffer.
! File names returned are absolute."
    (or tags-table-files
        (setq tags-table-files
--- 597,603 ----
  (defun tags-table-files ()
    "Return a list of files in the current tags table.
! Assumes the tags table is the current buffer.  The file names are returned
! as they appeared in the `etags' command that created the table, usually
! without directory names."
    (or tags-table-files
        (setq tags-table-files
*************** See documentation of variable `tags-file
*** 718,723 ****
    ;; Save the current buffer's value of `find-tag-hook' before selecting the
    ;; tags table buffer.
!   (let ((local-find-tag-hook find-tag-hook)
! 	(search-tag))
      (if (eq '- next-p)
  	;; Pop back to a previous location.
--- 720,724 ----
    ;; Save the current buffer's value of `find-tag-hook' before selecting the
    ;; tags table buffer.
!   (let ((local-find-tag-hook find-tag-hook))
      (if (eq '- next-p)
  	;; Pop back to a previous location.
*************** See documentation of variable `tags-file
*** 745,749 ****
        (let ((marker (make-marker)))
  	(save-excursion
- 	  (setq search-tag (if next-p last-tag tagname))
  	  (set-buffer
  	   ;; find-tag-in-order does the real work.
--- 746,749 ----
*************** See documentation of variable `tags-file
*** 755,761 ****
  	    (if regexp-p
  		find-tag-regexp-tag-order
! 	      (if (string-match "\\b.*\\.\\w*" search-tag)
! 		  find-tag-file-order
! 		find-tag-tag-order))
  	    (if regexp-p
  		find-tag-regexp-next-line-after-failure-p
--- 755,759 ----
  	    (if regexp-p
  		find-tag-regexp-tag-order
! 	      find-tag-tag-order)
  	    (if regexp-p
  		find-tag-regexp-next-line-after-failure-p
*************** See documentation of variable `tags-file
*** 887,895 ****
    (let (file				;name of file containing tag
  	tag-info			;where to find the tag in FILE
- 	tags-table-file			;name of tags file
  	(first-table t)
  	(tag-order order)
  	goto-func
- 	match-type
  	)
      (save-excursion
--- 885,891 ----
*************** See documentation of variable `tags-file
*** 898,903 ****
  
        ;; Get a qualified match.
!       (setq match-type 
! 	    (catch 'qualified-match-found
  
  	;; Iterate over the list of tags tables.
--- 894,898 ----
  
        ;; Get a qualified match.
!       (catch 'qualified-match-found
  
  	;; Iterate over the list of tags tables.
*************** See documentation of variable `tags-file
*** 911,920 ****
  	       ;; Start at beginning of tags file.
  	       (goto-char (point-min)))
- 	  (or first-table
- 	      (goto-char (point-min)))
  
  	  (setq first-table nil)
  
- 	  (setq tags-table-file buffer-file-name)
  	  ;; Iterate over the list of ordering predicates.
  	  (while order
--- 906,912 ----
*************** See documentation of variable `tags-file
*** 935,940 ****
  	;; We throw out on match, so only get here if there were no matches.
  	(error "No %stags %s %s" (if first-search "" "more ")
! 	       matching pattern)))
!       
        ;; Found a tag; extract location info.
        (beginning-of-line)
--- 927,932 ----
  	;; We throw out on match, so only get here if there were no matches.
  	(error "No %stags %s %s" (if first-search "" "more ")
! 	       matching pattern))
! 
        ;; Found a tag; extract location info.
        (beginning-of-line)
*************** See documentation of variable `tags-file
*** 952,959 ****
        (widen)
        (push-mark)
!       (if (eq match-type 'tag-filename-match-p)
! 	  (goto-char (point-min))
! 	(funcall goto-func tag-info))
!       
        ;; Return the buffer where the tag was found.
        (current-buffer))))
--- 944,949 ----
        (widen)
        (push-mark)
!       (funcall goto-func tag-info)
! 
        ;; Return the buffer where the tag was found.
        (current-buffer))))
*************** See documentation of variable `tags-file
*** 979,988 ****
  		 (find-tag-regexp-next-line-after-failure-p . t)
  		 (find-tag-search-function . search-forward)
! 		 (find-tag-tag-order . (tag-filename-match-p
  					tag-exact-match-p
  					tag-symbol-match-p
  					tag-word-match-p
  					tag-any-match-p))
- 		 (find-tag-file-order . (tag-filename-match-p))
  		 (find-tag-next-line-after-failure-p . nil)
  		 (list-tags-function . etags-list-tags)
--- 969,977 ----
  		 (find-tag-regexp-next-line-after-failure-p . t)
  		 (find-tag-search-function . search-forward)
! 		 (find-tag-tag-order . (tag-exact-file-name-match-p
  					tag-exact-match-p
  					tag-symbol-match-p
  					tag-word-match-p
  					tag-any-match-p))
  		 (find-tag-next-line-after-failure-p . nil)
  		 (list-tags-function . etags-list-tags)
*************** See documentation of variable `tags-file
*** 1032,1052 ****
  (defun etags-snarf-tag ()
    (let (tag-text line startpos)
!     (search-forward "\177")
!     (setq tag-text (buffer-substring (1- (point))
! 				     (save-excursion (beginning-of-line)
! 						     (point))))
!     ;; Skip explicit tag name if present.
!     (search-forward "\001" (save-excursion (forward-line 1) (point)) t)
!     (if (looking-at "[0-9]")
! 	(setq line (string-to-int (buffer-substring
! 				   (point)
! 				   (progn (skip-chars-forward "0-9")
! 					  (point))))))
!     (search-forward ",")
!     (if (looking-at "[0-9]")
! 	(setq startpos (string-to-int (buffer-substring
! 				       (point)
! 				       (progn (skip-chars-forward "0-9")
! 					      (point))))))
      ;; Leave point on the next line of the tags file.
      (forward-line 1)
--- 1021,1052 ----
  (defun etags-snarf-tag ()
    (let (tag-text line startpos)
!     (if (save-excursion
! 	  (forward-line -1)
! 	  (looking-at "\f\n"))
! 	;; The match was for a source file name, not any tag within a file.
! 	;; Give text of t, meaning to go exactly to the location we specify,
! 	;; the beginning of the file.
! 	(setq tag-text t
! 	      line nil
! 	      startpos 1)
! 
!       ;; Find the end of the tag and record the whole tag text.
!       (search-forward "\177")
!       (setq tag-text (buffer-substring (1- (point))
! 				       (save-excursion (beginning-of-line)
! 						       (point))))
!       ;; Skip explicit tag name if present.
!       (search-forward "\001" (save-excursion (forward-line 1) (point)) t)
!       (if (looking-at "[0-9]")
! 	  (setq line (string-to-int (buffer-substring
! 				     (point)
! 				     (progn (skip-chars-forward "0-9")
! 					    (point))))))
!       (search-forward ",")
!       (if (looking-at "[0-9]")
! 	  (setq startpos (string-to-int (buffer-substring
! 					 (point)
! 					 (progn (skip-chars-forward "0-9")
! 						(point)))))))
      ;; Leave point on the next line of the tags file.
      (forward-line 1)
*************** See documentation of variable `tags-file
*** 1055,1059 ****
  ;; TAG-INFO is a cons (TEXT LINE . POSITION) where TEXT is the initial part
  ;; of a line containing the tag and POSITION is the character position of
! ;; TEXT within the file (starting from 1); LINE is the line number.  Either
  ;; LINE or POSITION may be nil; POSITION is used if present.  If the tag
  ;; isn't exactly at the given position then look around that position using
--- 1055,1061 ----
  ;; TAG-INFO is a cons (TEXT LINE . POSITION) where TEXT is the initial part
  ;; of a line containing the tag and POSITION is the character position of
! ;; TEXT within the file (starting from 1); LINE is the line number.  If
! ;; TEXT is t, it means the tag refers to exactly LINE or POSITION
! ;; (whichever is present, LINE having preference, no searching.  Either
  ;; LINE or POSITION may be nil; POSITION is used if present.  If the tag
  ;; isn't exactly at the given position then look around that position using
*************** See documentation of variable `tags-file
*** 1061,1103 ****
  (defun etags-goto-tag-location (tag-info)
    (let ((startpos (cdr (cdr tag-info)))
! 	;; This constant is 1/2 the initial search window.
! 	;; There is no sense in making it too small,
! 	;; since just going around the loop once probably
! 	;; costs about as much as searching 2000 chars.
! 	(offset 1000)
! 	(found nil)
! 	(pat (concat (if (eq selective-display t)
! 			 "\\(^\\|\^m\\)" "^")
! 		     (regexp-quote (car tag-info)))))
!     ;; The character position in the tags table is 0-origin.
!     ;; Convert it to a 1-origin Emacs character position.
!     (if startpos (setq startpos (1+ startpos)))
!     ;; If no char pos was given, try the given line number.
!     (or startpos
! 	(if (car (cdr tag-info))
! 	    (setq startpos (progn (goto-line (car (cdr tag-info)))
! 				  (point)))))
!     (or startpos
! 	(setq startpos (point-min)))
!     ;; First see if the tag is right at the specified location.
!     (goto-char startpos)
!     (setq found (looking-at pat))
!     (while (and (not found)
! 		(progn
! 		  (goto-char (- startpos offset))
! 		  (not (bobp))))
!       (setq found
! 	    (re-search-forward pat (+ startpos offset) t)
! 	    offset (* 3 offset)))	; expand search window
!     (or found
! 	(re-search-forward pat nil t)
! 	(error "Rerun etags: `%s' not found in %s"
! 	       pat buffer-file-name)))
!   ;; Position point at the right place
!   ;; if the search string matched an extra Ctrl-m at the beginning.
!   (and (eq selective-display t)
!        (looking-at "\^m")
!        (forward-char 1))
!   (beginning-of-line))
  
  (defun etags-list-tags (file)
--- 1063,1111 ----
  (defun etags-goto-tag-location (tag-info)
    (let ((startpos (cdr (cdr tag-info)))
! 	offset found pat)
!     (if (eq (car tag-info) t)
! 	;; Direct file tag.
! 	(cond (line (goto-line line))
! 	      (position (goto-char position))
! 	      (t (error "etags.el BUG: bogus direct file tag")))
!       ;; This constant is 1/2 the initial search window.
!       ;; There is no sense in making it too small,
!       ;; since just going around the loop once probably
!       ;; costs about as much as searching 2000 chars.
!       (setq offset 1000
! 	    found nil
! 	    pat (concat (if (eq selective-display t)
! 			    "\\(^\\|\^m\\)" "^")
! 			(regexp-quote (car tag-info))))
!       ;; The character position in the tags table is 0-origin.
!       ;; Convert it to a 1-origin Emacs character position.
!       (if startpos (setq startpos (1+ startpos)))
!       ;; If no char pos was given, try the given line number.
!       (or startpos
! 	  (if (car (cdr tag-info))
! 	      (setq startpos (progn (goto-line (car (cdr tag-info)))
! 				    (point)))))
!       (or startpos
! 	  (setq startpos (point-min)))
!       ;; First see if the tag is right at the specified location.
!       (goto-char startpos)
!       (setq found (looking-at pat))
!       (while (and (not found)
! 		  (progn
! 		    (goto-char (- startpos offset))
! 		    (not (bobp))))
! 	(setq found
! 	      (re-search-forward pat (+ startpos offset) t)
! 	      offset (* 3 offset)))	; expand search window
!       (or found
! 	  (re-search-forward pat nil t)
! 	  (error "Rerun etags: `%s' not found in %s"
! 		 pat buffer-file-name)))
!     ;; Position point at the right place
!     ;; if the search string matched an extra Ctrl-m at the beginning.
!     (and (eq selective-display t)
! 	 (looking-at "\^m")
! 	 (forward-char 1))
!     (beginning-of-line)))
  
  (defun etags-list-tags (file)
*************** See documentation of variable `tags-file
*** 1139,1145 ****
        (skip-chars-backward "^," beg)
        (or (looking-at "include$")
! 	  ;; Expand in the default-directory of the tags table buffer.
! 	  (setq files (cons (expand-file-name (buffer-substring beg (1- (point))))
! 			    files))))
      (nreverse files)))
  
--- 1147,1151 ----
        (skip-chars-backward "^," beg)
        (or (looking-at "include$")
! 	  (setq files (cons (buffer-substring beg (1- (point))) files))))
      (nreverse files)))
  
*************** See documentation of variable `tags-file
*** 1219,1226 ****
  		       (looking-at "\\b"))))
  
! (defun tag-filename-match-p (tag)
    (and (looking-at ",")
         (save-excursion (backward-char (1+ (length tag)))
! 		       (looking-at "\\b"))))
  
  ;; t if point is in a tag line with a tag containing TAG as a substring.
--- 1225,1232 ----
  		       (looking-at "\\b"))))
  
! (defun tag-exact-file-name-match-p (tag)
    (and (looking-at ",")
         (save-excursion (backward-char (1+ (length tag)))
! 		       (looking-at "\f\n"))))
  
  ;; t if point is in a tag line with a tag containing TAG as a substring.
*************** if the file was newly read in, the value
*** 1259,1264 ****
  	   ;; Visit the tags table buffer to get its list of files.
  	   (visit-tags-table-buffer)
! 	   ;; Copy the list so we can setcdr below.
! 	   (setq next-file-list (copy-sequence (tags-table-files)))
  	   ;; Iterate over all the tags table files, collecting
  	   ;; a complete list of referenced file names.
--- 1265,1271 ----
  	   ;; Visit the tags table buffer to get its list of files.
  	   (visit-tags-table-buffer)
! 	   ;; Copy the list so we can setcdr below, and expand the file
! 	   ;; names while we are at it, in this buffer's default directory.
! 	   (setq next-file-list (mapcar 'expand-file-name (tags-table-files)))
  	   ;; Iterate over all the tags table files, collecting
  	   ;; a complete list of referenced file names.
*************** if the file was newly read in, the value
*** 1272,1277 ****
  	       ;; list later returned by (tags-table-files).
  	       (if tail
! 		   (setcdr tail (copy-sequence (tags-table-files)))
! 		 (setq next-file-list (copy-sequence (tags-table-files))))))))
  	(t
  	 ;; Initialize the list by evalling the argument.
--- 1279,1285 ----
  	       ;; list later returned by (tags-table-files).
  	       (if tail
! 		   (setcdr tail (mapcar 'expand-file-name (tags-table-files)))
! 		 (setq next-file-list (mapcar 'expand-file-name
! 					      (tags-table-files))))))))
  	(t
  	 ;; Initialize the list by evalling the argument.
*************** if the file was newly read in, the value
*** 1302,1306 ****
  
  (defvar tags-loop-scan
!   '(error (substitute-command-keys
  	   "No \\[tags-search] or \\[tags-query-replace] in progress."))
    "Form for `tags-loop-continue' to eval to scan one file.
--- 1310,1315 ----
  
  (defvar tags-loop-scan
!   '(error "%s"
! 	  (substitute-command-keys
  	   "No \\[tags-search] or \\[tags-query-replace] in progress."))
    "Form for `tags-loop-continue' to eval to scan one file.
*************** See documentation of variable `tags-file
*** 1398,1413 ****
    (tags-loop-continue (or file-list-form t)))
  
  ;;;###autoload
! (defun list-tags (filename &optional next-match)
!   "Gives the list of functions available in file \"filename\"
! Searches only in \"tags-file-name\"."
!   (interactive "sFunctions in File: ")
!   (let (file-list)
!     (setq file-list (tags-locate-file-in-tags-table filename
! 						    (if next-match next-match nil)))
!     (if file-list
! 	(tags-list-functions-in-file (nth 1 (car file-list))
! 				     (nth 2 (car file-list)))
!       (message (format "%s not found in tags table" filename)))))
  
  ;;;###autoload
--- 1407,1443 ----
    (tags-loop-continue (or file-list-form t)))
  
+ (defun tags-complete-tags-table-file (string predicate what)
+   (save-excursion
+     ;; If we need to ask for the tag table, allow that.
+     (let ((enable-recursive-minibuffers t))
+       (visit-tags-table-buffer))
+     (if (eq what t)
+ 	(all-completions string (mapcar 'list (tags-table-files))
+ 			 predicate)
+       (try-completion string (mapcar 'list (tags-table-files))
+ 		      predicate))))
+ 
  ;;;###autoload
! (defun list-tags (file &optional next-match)
!   "Display list of tags in file FILE.
! This searches only the first table in the list, and no included tables.
! FILE should be as it appeared in the `etags' command, usually without a
! directory specification."
!   (interactive (list (completing-read "List tags in file: "
! 				      'tags-complete-tags-table-file
! 				      nil t nil)))
!   (with-output-to-temp-buffer "*Tags List*"
!     (princ "Tags in file ")
!     (princ file)
!     (terpri)
!     (save-excursion
!       (let ((first-time t)
! 	    (gotany nil))
! 	(while (visit-tags-table-buffer (not first-time))
! 	  (setq first-time nil)
! 	  (if (funcall list-tags-function file)
! 	      (setq gotany t)))
! 	(or gotany
! 	    (error "File %s not in current tags tables" file))))))
  
  ;;;###autoload
*************** see the doc of that variable if you want
*** 1502,1506 ****
    (setq selective-display t
  	selective-display-ellipses nil))
!   
  (defun select-tags-table-select ()
    "Select the tags table named on this line."
--- 1532,1536 ----
    (setq selective-display t
  	selective-display-ellipses nil))
! 
  (defun select-tags-table-select ()
    "Select the tags table named on this line."
*************** see the doc of that variable if you want
*** 1517,1526 ****
    (kill-buffer (current-buffer))
    (or (one-window-p)
!       (delete-window)))  
  
  ;;;###autoload
  (defun complete-tag ()
    "Perform tags completion on the text around point.
! Completes to the set of names listed in the current tags table.  
  The string to complete is chosen in the same way as the default
  for \\[find-tag] (which see)."
--- 1547,1556 ----
    (kill-buffer (current-buffer))
    (or (one-window-p)
!       (delete-window)))
  
  ;;;###autoload
  (defun complete-tag ()
    "Perform tags completion on the text around point.
! Completes to the set of names listed in the current tags table.
  The string to complete is chosen in the same way as the default
  for \\[find-tag] (which see)."
*************** for \\[find-tag] (which see)."
*** 1528,1532 ****
    (or tags-table-list
        tags-file-name
!       (error (substitute-command-keys
  	      "No tags table loaded.  Try \\[visit-tags-table].")))
    (let ((pattern (funcall (or find-tag-default-function
--- 1558,1563 ----
    (or tags-table-list
        tags-file-name
!       (error "%s"
! 	     (substitute-command-keys
  	      "No tags table loaded.  Try \\[visit-tags-table].")))
    (let ((pattern (funcall (or find-tag-default-function
*************** for \\[find-tag] (which see)."
*** 1557,1630 ****
  ;;;###autoload (define-key esc-map "\t" 'complete-tag)
  
- (defun tags-list-functions-in-file (pos tag-file)
-    "Lists the functions for the given file.  Backend for `list-tags'."
-    (let ((tag-buf (find-file-noselect tag-file))
-        (result-buf (get-buffer-create "*Tags Function List*"))
-        function
-        beg
-        map)
-      (save-excursion
-        (set-buffer result-buf)
-        (erase-buffer)
-        (set-buffer tag-buf)
-        (goto-char pos)
-        (forward-line 1)
-        (beginning-of-line)
-        ; C-l marks end of information of a file in TAGS.
-        (while (and (not (looking-at "^\C-l")) (not (eobp)))
-        ; skip mere #defines, typedefs and struct definitions
-        (if (not (or (looking-at "^#define\\s-+[a-zA-Z0-9_]+\\s-+")
-                     (looking-at "^typedef\\s-+")
-                     (looking-at "^\\s-*}")))
-            (progn
-              (setq beg (point))
-              (skip-chars-forward "^\C-?(")
-              (setq function (buffer-substring beg (point)))
-              (save-excursion
-                (set-buffer result-buf)
-                (insert (concat function "\n")))))
-        (forward-line 1)
-        (beginning-of-line)))
-      (switch-to-buffer "*Tags Function List*")
-      (goto-char 1)
-      (set-buffer-modified-p nil)
-      (setq buffer-read-only t)))
- 
- (defun tags-locate-file-in-tags-table (filename first-search)
-   "This function is used to locate `filename' in `tags-table-list'.
-  Its internally used by the functions `find-file-from-tags' and
-  `tags-list-tags-in-file'.  If `first-search' is t, search continues from where 
-  it left off last time.  Else, its a fresh search."
-   (let (tag-list current-tags-buffer beg file found-file-list next-tag-file)
-     (setq tag-list tags-table-list)
-     (catch 'found-file
-       (setq found-file-list nil
- 	    next-tag-file nil)
-       (while tag-list
- 	(setq current-tags-buffer (find-file-noselect (car tag-list)))
- 	(save-excursion
- 	  (set-buffer current-tags-buffer)
- 	  (if (or next-tag-file
- 		  (not first-search))
- 	      (goto-char (point-min)))
- 	  (if (search-forward filename nil t)
- 	      (if (tag-filename-match-p filename)
- 		  (progn
- 		    (beginning-of-line)
- 		    (setq beg (point))
- 		    (skip-chars-forward "^,")
- 		    (or (looking-at ",include$")
- 			(setq file (expand-file-name (buffer-substring beg
- 								       (point)))))
- 		    (if (string-match filename (file-name-nondirectory file))
- 			(progn
- 			  (setq found-file-list (cons (list file (point)
- 							    (buffer-file-name))
- 						      found-file-list))
- 			  (throw 'found-file found-file-list))))))
- 	  (setq tag-list (cdr tag-list))
- 	  (setq next-tag-file 't)))
-       (throw 'found-file found-file-list))))
- 
  (provide 'etags)
  
--- 1588,1591 ----
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/eval-reg.el emacs-19.31/lisp/eval-reg.el
*** emacs-19.30/lisp/eval-reg.el	Wed Mar 15 23:31:11 1995
--- emacs-19.31/lisp/eval-reg.el	Mon Jan 15 00:51:40 1996
***************
*** 1,5 ****
  ;;; eval-reg.el --- Redefine eval-region, and subrs that use it, in Lisp
  
! ;; Copyright (C) 1994 Daniel LaLiberte
  
  ;; Author: Daniel LaLiberte <liberte@cs.uiuc.edu>
--- 1,5 ----
  ;;; eval-reg.el --- Redefine eval-region, and subrs that use it, in Lisp
  
! ;; Copyright (C) 1994, 1996 Daniel LaLiberte
  
  ;; Author: Daniel LaLiberte <liberte@cs.uiuc.edu>
***************
*** 20,45 ****
  ;; 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:
  
! ;;; eval-region, eval-buffer, and eval-current-buffer are redefined in
! ;;; Lisp to allow customizations by Lisp code.  eval-region calls
! ;;; `read', `eval', and `prin1', so Lisp replacements of these
! ;;; functions will affect eval-region and anything else that calls it.
! ;;; eval-buffer and eval-current-buffer are redefined in Lisp to call
! ;;; eval-region on the buffer.  
! 
! ;;; Because of dynamic binding, all local variables are protected from
! ;;; being seen by eval by giving them funky names.  But variables in
! ;;; routines that call eval-region are similarly exposed.
! 
! ;;; Perhaps this should be one of several files in an `elisp' package
! ;;; that replaces Emacs Lisp subroutines with Lisp versions of the
! ;;; same.
! 
! ;;; Eval-region may be installed, after loading, by calling:
! ;;; (elisp-eval-region-install).  Installation can be undone with:
! ;;; (elisp-eval-region-uninstall).
  
  '(defpackage "elisp-eval-region"
--- 20,48 ----
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
! ;;; Commentary:
  
! ;; eval-region, eval-buffer, and eval-current-buffer are redefined in
! ;; Lisp to allow customizations by Lisp code.  eval-region calls
! ;; `read', `eval', and `prin1', so Lisp replacements of these
! ;; functions will affect eval-region and anything else that calls it.
! ;; eval-buffer and eval-current-buffer are redefined in Lisp to call
! ;; eval-region on the buffer.  
! 
! ;; Because of dynamic binding, all local variables are protected from
! ;; being seen by eval by giving them funky names.  But variables in
! ;; routines that call eval-region are similarly exposed.
! 
! ;; Perhaps this should be one of several files in an `elisp' package
! ;; that replaces Emacs Lisp subroutines with Lisp versions of the
! ;; same.
! 
! ;; Eval-region may be installed, after loading, by calling:
! ;; (elisp-eval-region-install).  Installation can be undone with:
! ;; (elisp-eval-region-uninstall).
! 
! ;;; Code:
  
  '(defpackage "elisp-eval-region"
*************** This version, from `eval-reg.el', allows
*** 131,135 ****
  eval, and the printer."
  
!   ;; Because this doesnt narrow to the region, one other difference 
    ;; concerns inserting whitespace after the expression being evaluated.
  
--- 134,138 ----
  eval, and the printer."
  
!   ;; Because this doesn't narrow to the region, one other difference 
    ;; concerns inserting whitespace after the expression being evaluated.
  
*************** eval, and the printer."
*** 139,143 ****
      (let ((elisp-pnt (point))
  	  (elisp-buf (current-buffer));; Outside buffer
! 	  (elisp-inside-buf (current-buffer));; Buffer current while evaling
  	  ;; Mark the end because it may move.
  	  (elisp-end-marker (set-marker (make-marker) elisp-end))
--- 142,146 ----
      (let ((elisp-pnt (point))
  	  (elisp-buf (current-buffer));; Outside buffer
! 	  (elisp-inside-buf (current-buffer));; Buffer current while evalling
  	  ;; Mark the end because it may move.
  	  (elisp-end-marker (set-marker (make-marker) elisp-end))
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/executable.el emacs-19.31/lisp/executable.el
*** emacs-19.30/lisp/executable.el	Fri Aug 25 17:21:07 1995
--- emacs-19.31/lisp/executable.el	Fri Mar  1 00:26:23 1996
***************
*** 1,4 ****
  ;;; executable.el --- base functionality for executable interpreter scripts
! ;; Copyright (C) 1994, 1995 by Free Software Foundation, Inc.
  
  ;; Author: Daniel.Pfeiffer@Informatik.START.dbp.de, fax (+49 69) 7588-2389
--- 1,5 ----
  ;;; executable.el --- base functionality for executable interpreter scripts
! 
! ;; Copyright (C) 1994, 1995, 1996 by Free Software Foundation, Inc.
  
  ;; Author: Daniel.Pfeiffer@Informatik.START.dbp.de, fax (+49 69) 7588-2389
***************
*** 18,23 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 27,37 ****
  ;; have one.
  
! ;; This is support code for the likes of sh-, awk-, perl-, tcl- or
! ;; makefile-mode.  Those mode-setting commands can call the like of
! ;; `(executable-set-magic "sh")' or `(executable-set-magic "perl" "-f")'.
! ;; Unless the file name matches `executable-magicless-file-regexp' this will
! ;; search $PATH if the given interpreter isn't absolute, and then insert a
! ;; first line like `#! /bin/sh' or `#! /usr/local/bin/perl -f'.
! ;; Also it makes the file executable as soon as it's saved, if it wasn't.
  
  ;;; Code:
--- 29,53 ----
  ;; have one.
  
! ;; Unless it has a magic number, a Unix file with executable mode is passed to
! ;; a new instance of the running shell (or to a Bourne shell if a csh is
! ;; running and the file starts with `:').  Only a shell can start such a file,
! ;; exec() cannot, which is why it is important to have a magic number in every
! ;; executable script.  Such a magic number is made up by the characters `#!'
! ;; the filename of an interpreter (in COFF, ELF or somesuch format) and one
! ;; optional argument.
! 
! ;; This library is for certain major modes like sh-, awk-, perl-, tcl- or
! ;; makefile-mode to insert or update a suitable #! line at the beginning of
! ;; the file, if the file does not already have one and the file is not a
! ;; default file of that interpreter (like .profile or makefile).  It also
! ;; makes the file executable if it wasn't, as soon as it's saved.
! 
! ;; It also allows debugging scripts, with an adaptation of compile, as far
! ;; as interpreters give out meaningful error messages.
! 
! ;; Modes that use this should nconc `executable-map' to the end of their own
! ;; keymap and `executable-font-lock-keywords' to the end of their own font
! ;; lock keywords.  Their mode-setting commands should call
! ;; `executable-set-magic'.
  
  ;;; Code:
*************** Typical values are 73 (+x) or -493 (rwxr
*** 71,84 ****
  (defvar executable-command nil)
  
- 
- ;; Autoload cookie deleted here because it made loaddefs.el fail to load.
- ;; -rms
- (or (assoc "tail" interpreter-mode-alist)
-     (nconc interpreter-mode-alist
- 	   '(("tail" . text-mode)
- 	     ("more" . text-mode)
- 	     ("less" . text-mode)
- 	     ("pg" . text-mode))))
- 
  (defvar executable-self-display "tail"
    "*Command you use with argument `+2' to make text files self-display.
--- 87,90 ----
*************** This can be included in `font-lock-keywo
*** 112,128 ****
  See `compilation-error-regexp-alist'.")
  
! ;; The C function openp() slightly modified would do the trick fine
! (defun executable (command)
!   "If COMMAND is an executable in $PATH its full name is returned.  Else nil."
    (let ((list exec-path)
! 	path)
      (while list
!       (setq list (if (and (setq path (expand-file-name command (car list)))
! 			  (file-executable-p path)
! 			  (not (file-directory-p path)))
  		     nil
! 		   (setq path nil)
  		   (cdr list))))
!     path))
  
  
--- 118,135 ----
  See `compilation-error-regexp-alist'.")
  
! ;; The C function openp slightly modified would do the trick fine
! (defun executable-find (command)
!   "Search for COMMAND in $PATH and return the absolute file name.
! Return nil if COMMAND is not found anywhere in $PATH."
    (let ((list exec-path)
! 	file)
      (while list
!       (setq list (if (and (setq file (expand-file-name command (car list)))
! 			  (file-executable-p file)
! 			  (not (file-directory-p file)))
  		     nil
! 		   (setq file nil)
  		   (cdr list))))
!     file))
  
  
*************** to find the next error."
*** 159,163 ****
  
  ;;;###autoload
! (defun executable-set-magic (interpreter &optional argument)
    "Set this buffer's interpreter to INTERPRETER with optional ARGUMENT.
  The variables `executable-magicless-file-regexp', `executable-prefix',
--- 166,171 ----
  
  ;;;###autoload
! (defun executable-set-magic (interpreter &optional argument
! 					 no-query-flag insert-flag)
    "Set this buffer's interpreter to INTERPRETER with optional ARGUMENT.
  The variables `executable-magicless-file-regexp', `executable-prefix',
*************** The variables `executable-magicless-file
*** 165,173 ****
  when and how magic numbers are inserted or replaced and scripts made
  executable."
!   (interactive "sName or path of interpreter: \nsArgument for %s: ")
    (setq interpreter (if (file-name-absolute-p interpreter)
  			interpreter
! 		      (or (executable interpreter)
! 			  (error "Cannot find %s." interpreter)))
  	argument (concat interpreter
  			 (and argument (string< "" argument) " ")
--- 173,184 ----
  when and how magic numbers are inserted or replaced and scripts made
  executable."
!   (interactive
!    (let* ((name (read-string "Name or file name of interpreter: "))
! 	  (arg (read-string (format "Argument for %s: " name))))
!      (list name arg (eq executable-query 'function) t)))
    (setq interpreter (if (file-name-absolute-p interpreter)
  			interpreter
! 		      (or (executable-find interpreter)
! 			  (error "Interpreter %s not recognized" interpreter)))
  	argument (concat interpreter
  			 (and argument (string< "" argument) " ")
*************** executable."
*** 177,210 ****
  	  (string-match executable-magicless-file-regexp
  			buffer-file-name))
!       (not (or (eq this-command 'executable-set-magic)
! 	       executable-insert))
        (> (point-min) 1)
!       (let ((point (point-marker))
! 	    (buffer-modified-p (buffer-modified-p)))
! 	(goto-char (point-min))
! 	(make-local-hook 'after-save-hook)
! 	(add-hook 'after-save-hook 'executable-chmod nil t)
! 	(if (looking-at "#![ \t]*\\(.*\\)$")
! 	    (and (goto-char (match-beginning 1))
! 		 (not (string= argument
! 			       (buffer-substring (point) (match-end 1))))
! 		 (save-window-excursion
! 		   ;; make buffer visible before question or message
! 		   (switch-to-buffer (current-buffer))
! 		   (if (or (not executable-query)
! 			   (and (eq executable-query 'function)
! 				(eq this-command 'executable-set-magic)))
! 		       (message "%s Magic number ``%s'' replaced." this-command
! 				(buffer-substring (point-min) (match-end 1)))
! 		     (y-or-n-p (concat "Replace magic number by ``"
! 				       executable-prefix argument "''? "))))
! 		 (not (delete-region (point) (match-end 1)))
! 		 (insert argument))
! 	  (insert executable-prefix argument ?\n))
! 	(or (< (marker-position point) (point))
! 	    (goto-char point))
! 	(or (eq this-command 'executable-set-magic))
! 	    (eq executable-insert t)
! 	    (set-buffer-modified-p buffer-modified-p)))
    interpreter)
  
--- 188,219 ----
  	  (string-match executable-magicless-file-regexp
  			buffer-file-name))
!       (not (or insert-flag executable-insert))
        (> (point-min) 1)
!       (save-excursion
! 	(let ((point (point-marker))
! 	      (buffer-modified-p (buffer-modified-p)))
! 	  (goto-char (point-min))
! 	  (make-local-hook 'after-save-hook)
! 	  (add-hook 'after-save-hook 'executable-chmod nil t)
! 	  (if (looking-at "#![ \t]*\\(.*\\)$")
! 	      (and (goto-char (match-beginning 1))
! 		   (not (string= argument
! 				 (buffer-substring (point) (match-end 1))))
! 		   (or (not executable-query) no-query-flag
! 		       (save-window-excursion
! 			 ;; Make buffer visible before question.
! 			 (switch-to-buffer (current-buffer))
! 			 (y-or-n-p (concat "Replace magic number by `"
! 					   executable-prefix argument "'? "))))
! 		   (progn
! 		     (replace-match argument t t nil 1)
! 		     (message "Magic number changed to `%s'"
! 			      (concat executable-prefix argument))))
! 	    (insert executable-prefix argument ?\n)
! 	    (message "Magic number changed to `%s'"
! 		     (concat executable-prefix argument)))
! 	  (or insert-flag
! 	      (eq executable-insert t)
! 	      (set-buffer-modified-p buffer-modified-p)))))
    interpreter)
  
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/f90.el emacs-19.31/lisp/f90.el
*** emacs-19.30/lisp/f90.el	Mon Oct 30 12:01:56 1995
--- emacs-19.31/lisp/f90.el	Fri May 17 17:01:58 1996
***************
*** 1,15 ****
  ;;; f90.el --- Fortran-90 mode (free format)
! ;; Copyright (C) 1995 Free Software Foundation, Inc.
  
  ;; Author: Torbj\"orn Einarsson <T.Einarsson@clab.ericsson.se>
! ;; Created: Sep. 21, 1995
  ;; Keywords: fortran, f90, languages
  
! ;; This program 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 of the License, or
! ;; (at your option) any later version.
  
! ;; This program 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
--- 1,18 ----
  ;;; f90.el --- Fortran-90 mode (free format)
! 
! ;; Copyright (C) 1995, 1996 Free Software Foundation, Inc.
  
  ;; Author: Torbj\"orn Einarsson <T.Einarsson@clab.ericsson.se>
! ;; Created: Apr. 18, 1996
  ;; Keywords: fortran, f90, languages
  
! ;; 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
***************
*** 17,24 ****
  
  ;; You should have received a copy of the GNU General Public License
! ;; along with this program; if not, write to the Free Software
! ;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  
  ;;; Commentary:
  ;; Smart mode for editing F90 programs in FREE FORMAT.
  ;; Knows about continuation lines, named structured statements, and other
--- 20,29 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
+ 
  ;; Smart mode for editing F90 programs in FREE FORMAT.
  ;; Knows about continuation lines, named structured statements, and other
***************
*** 113,116 ****
--- 118,122 ----
  ;; 7) f77 do-loops do 10 i=.. ; ; 10 continue are not correctly indented.
  ;;    You are urged to use f90-do loops (with labels if you wish).
+ ;; 8) The highlighting mode under XEmacs is not as complete as under Emacs.
  
  ;; List of user commands
***************
*** 135,140 ****
  ;; of this code is built.
  
- 
  ;;; Code:
  (defconst bug-f90-mode "T.Einarsson@clab.ericsson.se"
    "Address of mailing list for F90 mode bugs.")
--- 141,146 ----
  ;; of this code is built.
  
  ;;; Code:
+ 
  (defconst bug-f90-mode "T.Einarsson@clab.ericsson.se"
    "Address of mailing list for F90 mode bugs.")
*************** whether to blink the matching beginning.
*** 197,203 ****
    ;;"exit" "external" "forall" "format" "function" "goto" "if" "implicit"
    ;;"include" "inquire" "integer" "intent" "interface" "intrinsic" "logical"
!   ;;"module" "namelist" "none" "nullify" "only" "open" "optional" "parameter"
    ;;"pause" "pointer" "precision" "print" "private" "procedure" "program"
!   ;;"public" "read" "real" "recursive" "return" "rewind" "save" "select"
    ;;"sequence" "stop" "subroutine" "target" "then" "type" "use" "where"
    ;;"while" "write")
--- 203,209 ----
    ;;"exit" "external" "forall" "format" "function" "goto" "if" "implicit"
    ;;"include" "inquire" "integer" "intent" "interface" "intrinsic" "logical"
!   ;;"module" "namelist" "none" "nullify" "only" "open" "operator" "optional" "parameter"
    ;;"pause" "pointer" "precision" "print" "private" "procedure" "program"
!   ;;"public" "read" "real" "recursive" "result" "return" "rewind" "save" "select"
    ;;"sequence" "stop" "subroutine" "target" "then" "type" "use" "where"
    ;;"while" "write")
*************** whether to blink the matching beginning.
*** 210,216 ****
     "mat\\)\\|unction\\)\\|goto\\|i\\(f\\|mplicit\\|n\\(clude\\|quire\\|t\\("
     "e\\(ger\\|nt\\|rface\\)\\|rinsic\\)\\)\\)\\|logical\\|module\\|n\\("
!    "amelist\\|one\\|ullify\\)\\|o\\(nly\\|p\\(en\\|tional\\)\\)\\|p\\(a\\("
     "rameter\\|use\\)\\|ointer\\|r\\(ecision\\|i\\(nt\\|vate\\)\\|o\\("
!    "cedure\\|gram\\)\\)\\|ublic\\)\\|re\\(a[dl]\\|cursive\\|turn\\|wind\\)\\|"
     "s\\(ave\\|e\\(lect\\|quence\\)\\|top\\|ubroutine\\)\\|t\\(arget\\|hen\\|"
     "ype\\)\\|use\\|w\\(h\\(ere\\|ile\\)\\|rite\\)\\)\\>")
--- 216,222 ----
     "mat\\)\\|unction\\)\\|goto\\|i\\(f\\|mplicit\\|n\\(clude\\|quire\\|t\\("
     "e\\(ger\\|nt\\|rface\\)\\|rinsic\\)\\)\\)\\|logical\\|module\\|n\\("
!    "amelist\\|one\\|ullify\\)\\|o\\(nly\\|p\\(en\\|erator\\|tional\\)\\)\\|p\\(a\\("
     "rameter\\|use\\)\\|ointer\\|r\\(ecision\\|i\\(nt\\|vate\\)\\|o\\("
!    "cedure\\|gram\\)\\)\\|ublic\\)\\|re\\(a[dl]\\|cursive\\|sult\\|turn\\|wind\\)\\|"
     "s\\(ave\\|e\\(lect\\|quence\\)\\|top\\|ubroutine\\)\\|t\\(arget\\|hen\\|"
     "ype\\)\\|use\\|w\\(h\\(ere\\|ile\\)\\|rite\\)\\)\\>")
*************** whether to blink the matching beginning.
*** 218,232 ****
  
  (defconst f90-keywords-level-3-re
!  ;; ("allocate" "allocatable" "assign" "assignment" "backspace" "close"
!  ;; "deallocate" "endfile" "entry" "equivalence" "external" "inquire" "intent"
!  ;; "intrinsic" "only" "open" "optional" "parameter" "pause" "pointer" "print"
!  ;; "private" "public" "read" "recursive" "rewind" "save" "select" "sequence"
!  ;; "target"  "write")
    (concat
     "\\<\\(a\\(llocat\\(able\\|e\\)\\|ssign\\(\\|ment\\)\\)\\|backspace\\|"
!    "close\\|deallocate\\|e\\(n\\(dfile\\|try\\)\\|quivalence\\|xternal\\)\\|"
!    "in\\(quire\\|t\\(ent\\|rinsic\\)\\)\\|o\\(nly\\|p\\(en\\|tional\\)\\)\\|"
     "p\\(a\\(rameter\\|use\\)\\|ointer\\|ri\\(nt\\|vate\\)\\|ublic\\)\\|re\\("
!    "ad\\|cursive\\|wind\\)\\|s\\(ave\\|e\\(lect\\|quence\\)\\)\\|target\\|"
     "write\\)\\>")
  "Keyword-regexp for font-lock level >= 3.")
--- 224,241 ----
  
  (defconst f90-keywords-level-3-re
!   ;; ("allocate" "allocatable" "assign" "assignment" "backspace" "close"
!   ;; "deallocate" "dimension" "endfile" "entry" "equivalence" "external"
!   ;; "inquire" "intent" "intrinsic" "nullify" "only" "open" "operator"
!   ;; "optional" "parameter" "pause" "pointer" "print" "private" "public"
!   ;; "read" "recursive" "result" "rewind" "save" "select" "sequence"
!   ;; "target"  "write")
    (concat
     "\\<\\(a\\(llocat\\(able\\|e\\)\\|ssign\\(\\|ment\\)\\)\\|backspace\\|"
!    "close\\|d\\(eallocate\\|imension\\)\\|e\\(n\\(dfile\\|try\\)\\|"
!    "quivalence\\|xternal\\)\\|"
!    "in\\(quire\\|t\\(ent\\|rinsic\\)\\)\\|nullify\\|"
!    "o\\(nly\\|p\\(en\\|erator\\|tional\\)\\)\\|"
     "p\\(a\\(rameter\\|use\\)\\|ointer\\|ri\\(nt\\|vate\\)\\|ublic\\)\\|re\\("
!    "ad\\|cursive\\|sult\\|wind\\)\\|s\\(ave\\|e\\(lect\\|quence\\)\\)\\|target\\|"
     "write\\)\\>")
  "Keyword-regexp for font-lock level >= 3.")
*************** whether to blink the matching beginning.
*** 249,253 ****
    ;; "sqrt" "sum" "system_clock" "tan" "tanh" "tiny" "transfer" "transpose"
    ;; "trim" "ubound" "unpack" "verify")
!   ;; A left paranthesis to avoid highlighting non-procedures.
    ;; Real is taken out here to avoid highlighting declarations.
    (concat
--- 258,262 ----
    ;; "sqrt" "sum" "system_clock" "tan" "tanh" "tiny" "transfer" "transpose"
    ;; "trim" "ubound" "unpack" "verify")
!   ;; A left parenthesis to avoid highlighting non-procedures.
    ;; Real is taken out here to avoid highlighting declarations.
    (concat
*************** whether to blink the matching beginning.
*** 380,384 ****
         '("\\<\\(exit\\|cycle\\)[ \t]*\\(\\sw+\\)2\\>" 
  	 2 font-lock-doc-string-face)
!        '("\\<\\(case\\)[ \t]+\\(default\\|(\\)" . 1)
         '("\\<\\(do\\|go *to\\)\\>[ \t]*\\([0-9]+\\)"
  	 1 font-lock-keyword-face)
--- 389,393 ----
         '("\\<\\(exit\\|cycle\\)[ \t]*\\(\\sw+\\)2\\>" 
  	 2 font-lock-doc-string-face)
!        '("\\<\\(case\\)[ \t]*\\(default\\|(\\)" . 1)
         '("\\<\\(do\\|go *to\\)\\>[ \t]*\\([0-9]+\\)"
  	 1 font-lock-keyword-face)
*************** whether to blink the matching beginning.
*** 403,407 ****
         '("\\<\\(exit\\|cycle\\)[ \t]*\\(\\sw+\\)?\\>" 
  	 (1 font-lock-keyword-face) (2 font-lock-reference-face nil t))
!        '("\\<\\(case\\)[ \t]+\\(default\\|(\\)" . 1)
         '("\\<\\(do\\|go *to\\)\\>[ \t]*\\([0-9]+\\)"
  	 (1 font-lock-keyword-face) (2 font-lock-reference-face))
--- 412,416 ----
         '("\\<\\(exit\\|cycle\\)[ \t]*\\(\\sw+\\)?\\>" 
  	 (1 font-lock-keyword-face) (2 font-lock-reference-face nil t))
!        '("\\<\\(case\\)[ \t]*\\(default\\|(\\)" . 1)
         '("\\<\\(do\\|go *to\\)\\>[ \t]*\\([0-9]+\\)"
  	 (1 font-lock-keyword-face) (2 font-lock-reference-face))
*************** program\\|select\\|subroutine\\|type\\|w
*** 554,558 ****
    "\\(program\\|module\\|subroutine\\|function\\)")
  (defconst f90-else-like-re 
!   "\\(else\\([ \t]*if\\|where\\)?\\|case[ \t]*\\(default\\|(\\)\\)\\>")
  (defconst f90-end-if-re 
    "end[ \t]*\\(if\\|select\\|where\\|forall\\)\\>")
--- 563,567 ----
    "\\(program\\|module\\|subroutine\\|function\\)")
  (defconst f90-else-like-re 
!   "\\(else\\([ \t]*if\\|where\\)?\\|case[ \t]*\\(default\\|(\\)\\)")
  (defconst f90-end-if-re 
    "end[ \t]*\\(if\\|select\\|where\\|forall\\)\\>")
*************** program\\|select\\|subroutine\\|type\\|w
*** 573,577 ****
      "program[ \t]+\\(\\sw+\\)\\|"
      "module[ \t]+\\(\\sw+\\)[ \t]*\\(!\\|$\\)\\|"
!     "\\(recursive[ \t]*\\)?subroutine[ \t]+\\(\\sw+\\)\\|"
      ; avoid end function, but allow for most other things
      "\\([^!]*\\([^e!].[^ \t!]\\|.[^n!][^ \t!]\\|..[^d \t!]\\)"
--- 582,587 ----
      "program[ \t]+\\(\\sw+\\)\\|"
      "module[ \t]+\\(\\sw+\\)[ \t]*\\(!\\|$\\)\\|"
!     "\\(pure\\|recursive\\|extrinsic([^)]+)\\)?[ \t]*"
!     "subroutine[ \t]+\\(\\sw+\\)\\|"
      ; avoid end function, but allow for most other things
      "\\([^!]*\\([^e!].[^ \t!]\\|.[^n!][^ \t!]\\|..[^d \t!]\\)"
*************** Variables controlling indentation style 
*** 708,712 ****
   f90-startup-message
      Set to nil to inhibit message first time F90 mode is used. (default t)
!  f90-keywords
      List of keywords used for highlighting/upcase-keywords etc.
  
--- 718,722 ----
   f90-startup-message
      Set to nil to inhibit message first time F90 mode is used. (default t)
!  f90-keywords-re
      List of keywords used for highlighting/upcase-keywords etc.
  
*************** Name is non-nil only for type."
*** 905,912 ****
  	 (looking-at "\\(module\\)[ \t]+\\(\\sw+\\)\\>"))
      (list (f90-match-piece 1) (f90-match-piece 2)))
!    ((looking-at "\\(recursive[ \t]*\\)?\\(subroutine\\)[ \t]+\\(\\sw+\\)")
      (list (f90-match-piece 2) (f90-match-piece 3)))
     ((and (not (looking-at "end[ \t]*function"))
! 	 (looking-at ".*\\(function\\)[ \t]+\\(\\sw+\\)"))
      (list (f90-match-piece 1) (f90-match-piece 2)))))
  
--- 915,924 ----
  	 (looking-at "\\(module\\)[ \t]+\\(\\sw+\\)\\>"))
      (list (f90-match-piece 1) (f90-match-piece 2)))
!    ((looking-at (concat
! 		 "\\(pure\\|recursive\\|extrinsic([^)]+)\\)?[ \t]*"
! 		 "\\(subroutine\\)[ \t]+\\(\\sw+\\)"))
      (list (f90-match-piece 2) (f90-match-piece 3)))
     ((and (not (looking-at "end[ \t]*function"))
! 	 (looking-at "[^!\"\&\\n]*\\(function\\)[ \t]+\\(\\sw+\\)"))
      (list (f90-match-piece 1) (f90-match-piece 2)))))
  
*************** If run in the middle of a line, the line
*** 1320,1331 ****
        (if program
  	  (progn
! 	    (message (concat "Indenting " (car program) " "
! 			     (car (cdr program))"."))
  	    (f90-indent-region (point) (mark))
! 	    (message (concat "Indenting " (car program) " "
! 			     (car (cdr program)) "...done.")))
! 	(message "Indenting the whole file.")
  	(f90-indent-region (point) (mark))
! 	(message (concat "Indenting the whole file...done."))))))
  
  ;; autofill and break-line
--- 1332,1343 ----
        (if program
  	  (progn
! 	    (message "Indenting %s %s..."
! 		     (car program) (car (cdr program)))
  	    (f90-indent-region (point) (mark))
! 	    (message "Indenting %s %s...done"
! 		     (car program) (car (cdr program))))
! 	(message "Indenting the whole file...")
  	(f90-indent-region (point) (mark))
! 	(message "Indenting the whole file...done")))))
  
  ;; autofill and break-line
*************** Leave point at the end of line."
*** 1482,1488 ****
  	  (save-excursion
  	    (beginning-of-line)
! 	    (while (and (not (zerop count))
! 			(re-search-backward 
! 			 (concat "\\(" f90-blocks-re "\\)") nil t))
  	      (beginning-of-line) (skip-chars-forward " \t0-9")
  	      (cond ((setq matching-beg
--- 1494,1510 ----
  	  (save-excursion
  	    (beginning-of-line)
! 	    (while 
! 		(and (not (zerop count))
! 		     (let ((stop nil) notexist)
! 		       (while (not stop)
! 			 (setq notexist
! 			       (not (re-search-backward 
! 				     (concat "\\(" f90-blocks-re "\\)") nil t)))
! 			 (if notexist
! 			     (setq stop t)
! 			   (setq stop
! 				 (not (or (f90-in-string)
! 					  (f90-in-comment))))))
! 		       (not notexist)))
  	      (beginning-of-line) (skip-chars-forward " \t0-9")
  	      (cond ((setq matching-beg
*************** Leave point at the end of line."
*** 1502,1510 ****
  	      (if (eq f90-smart-end 'blink)
  		  (if (< (point) top-of-window)
! 		      (message (concat 
! 				"Matches " (what-line) ": "
! 				(buffer-substring
! 				 (progn (beginning-of-line) (point))
! 				 (progn (end-of-line) (point)))))
  		    (sit-for 1)))
  	      (setq beg-block (car matching-beg))
--- 1524,1532 ----
  	      (if (eq f90-smart-end 'blink)
  		  (if (< (point) top-of-window)
! 		      (message "Matches %d: %s"
! 			       (what-line)
! 			       (buffer-substring
! 				(progn (beginning-of-line) (point))
! 				(progn (end-of-line) (point))))
  		    (sit-for 1)))
  	      (setq beg-block (car matching-beg))
*************** Any other key combination is executed no
*** 1529,1536 ****
    (let (e c)
      (insert last-command-char)
!     (setq e (next-command-event)
! 	  c (if (string-match "XEmacs" emacs-version)
! 		(event-to-character e)
! 	      (read-event)))
      ;; insert char if not equal to `?'
      (if (or (= c ??) (eq c help-char))
--- 1551,1559 ----
    (let (e c)
      (insert last-command-char)
!     (if (string-match "XEmacs" emacs-version)
! 	(progn
! 	  (setq e (next-command-event))
! 	  (setq c (event-to-character e)))
!       (setq c (read-event)))
      ;; insert char if not equal to `?'
      (if (or (= c ??) (eq c help-char))
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/facemenu.el emacs-19.31/lisp/facemenu.el
*** emacs-19.30/lisp/facemenu.el	Fri Nov 10 13:41:48 1995
--- emacs-19.31/lisp/facemenu.el	Wed Mar 27 23:39:44 1996
***************
*** 1,4 ****
  ;;; facemenu.el --- create a face menu for interactively adding fonts to text
! ;; Copyright (c) 1994, 1995 Free Software Foundation, Inc.
  
  ;; Author: Boris Goldowsky <boris@gnu.ai.mit.edu>
--- 1,5 ----
  ;;; facemenu.el --- create a face menu for interactively adding fonts to text
! 
! ;; Copyright (c) 1994, 1995, 1996 Free Software Foundation, Inc.
  
  ;; Author: Boris Goldowsky <boris@gnu.ai.mit.edu>
***************
*** 18,25 ****
  
  ;; 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:
  ;; This file defines a menu of faces (bold, italic, etc) which allows you to
  ;; set the face used for a region of the buffer.  Some faces also have
--- 19,28 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
+ 
  ;; This file defines a menu of faces (bold, italic, etc) which allows you to
  ;; set the face used for a region of the buffer.  Some faces also have
*************** requested in `facemenu-keybindings'.")
*** 239,242 ****
--- 242,261 ----
  (defalias 'facemenu-keymap facemenu-keymap)
  
+ 
+ (defvar facemenu-add-face-function nil
+   "Function called at beginning of text to change or `nil'.
+ This function is passed the FACE to set and END of text to change, and must
+ return a string which is inserted.  It may set `facemenu-end-add-face'.")
+ 
+ (defvar facemenu-end-add-face nil
+   "String to insert or function called at end of text to change or `nil'.
+ This function is passed the FACE to set, and must return a string which is
+ inserted.")
+ 
+ (defvar facemenu-remove-face-function nil
+   "When non-`nil' function called to remove faces.
+ This function is passed the START and END of text to change.
+ May also be `t' meaning to use `facemenu-add-face-function'.")
+ 
  ;;; Internal Variables
  
*************** typing a character to insert cancels the
*** 281,285 ****
  	    (end (or end (region-end))))
  	(facemenu-add-face face start end))
!     (facemenu-self-insert-face face)))
  
  ;;;###autoload
--- 300,304 ----
  	    (end (or end (region-end))))
  	(facemenu-add-face face start end))
!     (facemenu-add-face face)))
  
  ;;;###autoload
*************** typing a character to insert cancels the
*** 334,346 ****
    (if start 
        (facemenu-add-face face start end)
!     (facemenu-self-insert-face face)))
! 
! (defun facemenu-self-insert-face (face)
!   (setq self-insert-face (if (eq last-command self-insert-face-command)
! 			     (cons face (if (listp self-insert-face)
! 					    self-insert-face
! 					  (list self-insert-face)))
! 			   face)
! 	self-insert-face-command this-command))
  
  ;;;###autoload
--- 353,357 ----
    (if start 
        (facemenu-add-face face start end)
!     (facemenu-add-face face)))
  
  ;;;###autoload
*************** These special properties include `invisi
*** 397,409 ****
    "Pop up a buffer listing text-properties at LOCATION."
    (interactive "d")
!   (let ((props (text-properties-at p)))
      (if (null props)
  	(message "None")
!       (with-output-to-temp-buffer "*Text Properties*"
! 	(princ (format "Text properties at %d:\n\n" p))
! 	(while props
! 	  (princ (format "%-20s %S\n"
! 			 (car props) (car (cdr props))))
! 	  (setq props (cdr (cdr props))))))))
  
  ;;;###autoload
--- 408,440 ----
    "Pop up a buffer listing text-properties at LOCATION."
    (interactive "d")
!   (let ((props (text-properties-at p))
! 	category
! 	str)
      (if (null props)
  	(message "None")
!       (if (and (not (cdr (cdr props)))
! 	       (not (eq (car props) 'category))
! 	       (< (length (setq str (format "Text property at %d:  %s  %S"
! 					    p (car props) (car (cdr props)))))
! 		  (frame-width)))
! 	  (message "%s" str)
! 	(with-output-to-temp-buffer "*Text Properties*"
! 	  (princ (format "Text properties at %d:\n\n" p))
! 	  (while props
! 	    (if (eq (car props) 'category)
! 		(setq category (car (cdr props))))
! 	    (princ (format "%-20s %S\n"
! 			   (car props) (car (cdr props))))
! 	    (setq props (cdr (cdr props))))
! 	  (if category
! 	      (progn
! 		(setq props (symbol-plist category))
! 		(princ (format "\nCategory %s:\n\n" category))
! 		(while props
! 		  (princ (format "%-20s %S\n"
! 				 (car props) (car (cdr props))))
! 		  (if (eq (car props) 'category)
! 		      (setq category (car (cdr props))))
! 		  (setq props (cdr (cdr props)))))))))))
  
  ;;;###autoload
*************** These special properties include `invisi
*** 412,416 ****
    (let ((col (completing-read (or prompt "Color: ") 
  			      (or facemenu-color-alist
! 				  (if (or (eq window-system 'x) (eq window-system 'win32))
  				      (mapcar 'list (x-defined-colors))))
  			      nil t)))
--- 443,447 ----
    (let ((col (completing-read (or prompt "Color: ") 
  			      (or facemenu-color-alist
! 				  (if window-system
  				      (mapcar 'list (x-defined-colors))))
  			      nil t)))
*************** colors to display.  Otherwise, this comm
*** 426,430 ****
  of colors that the current display can handle."
    (interactive)
!   (if (and (null list) (or (eq window-system 'x) (eq window-system 'win32)))
        (progn
  	(setq list (x-defined-colors))
--- 457,461 ----
  of colors that the current display can handle."
    (interactive)
!   (if (and (null list) window-system)
        (progn
  	(setq list (x-defined-colors))
*************** determine the correct answer."
*** 462,490 ****
    (cond ((equal a b) t)
  	((and (or (eq window-system 'x) (eq window-system 'win32))
! 	      (equal (x-color-values a) (x-color-values b))))))
  
! (defun facemenu-add-face (face start end)
    "Add FACE to text between START and END.
! For each section of that region that has a different face property, FACE will
! be consed onto it, and other faces that are completely hidden by that will be
! removed from the list.
  
  As a special case, if FACE is `default', then the region is left with NO face
  text property.  Otherwise, selecting the default face would not have any
! effect."
!   (interactive "*xFace:\nr")
!   (if (eq face 'default)
!       (remove-text-properties start end '(face default))
!     (let ((part-start start) part-end)
!       (while (not (= part-start end))
! 	(setq part-end (next-single-property-change part-start 'face nil end))
! 	(let ((prev (get-text-property part-start 'face)))
! 	  (put-text-property part-start part-end 'face
! 			     (if (null prev)
! 				 face
! 			       (facemenu-active-faces
! 				(cons face
! 				      (if (listp prev) prev (list prev)))))))
! 	(setq part-start part-end)))))
  
  (defun facemenu-active-faces (face-list &optional frame)
--- 493,554 ----
    (cond ((equal a b) t)
  	((and (or (eq window-system 'x) (eq window-system 'win32))
! 	      (equal (x-color-values a) (x-color-values b))))
! 	((eq window-system 'pc)
! 	 (and (x-color-defined-p a) (x-color-defined-p b)
! 	      (eq (msdos-color-translate a) (msdos-color-translate b))))))
  
! (defun facemenu-add-face (face &optional start end)
    "Add FACE to text between START and END.
! If START is `nil' or START to END is empty, add FACE to next typed character
! instead.  For each section of that region that has a different face property,
! FACE will be consed onto it, and other faces that are completely hidden by
! that will be removed from the list.
! If `facemenu-add-face-function' and maybe `facemenu-end-add-face' are non-`nil'
! they are used to set the face information.
  
  As a special case, if FACE is `default', then the region is left with NO face
  text property.  Otherwise, selecting the default face would not have any
! effect.  See `facemenu-remove-face-function'."
!   (interactive "*xFace: \nr")
!   (if (and (eq face 'default)
! 	   (not (eq facemenu-remove-face-function t)))
!       (if facemenu-remove-face-function
! 	  (funcall facemenu-remove-face-function start end)
! 	(if (and start (< start end))
! 	    (remove-text-properties start end '(face default))
! 	  (setq self-insert-face 'default
! 		self-insert-face-command this-command)))
!     (if facemenu-add-face-function
! 	(save-excursion
! 	  (if end (goto-char end))
! 	  (save-excursion
! 	    (if start (goto-char start))
! 	    (insert-before-markers
! 	     (funcall facemenu-add-face-function face end)))
! 	  (if facemenu-end-add-face
! 	      (insert (if (stringp facemenu-end-add-face)
! 			  facemenu-end-add-face
! 			(funcall facemenu-end-add-face face)))))
!       (if (and start (< start end))
! 	  (let ((part-start start) part-end)
! 	    (while (not (= part-start end))
! 	      (setq part-end (next-single-property-change part-start 'face
! 							  nil end))
! 	      (let ((prev (get-text-property part-start 'face)))
! 		(put-text-property part-start part-end 'face
! 				   (if (null prev)
! 				       face
! 				     (facemenu-active-faces
! 				      (cons face
! 					    (if (listp prev)
! 						prev
! 					      (list prev)))))))
! 	      (setq part-start part-end)))
! 	(setq self-insert-face (if (eq last-command self-insert-face-command)
! 				   (cons face (if (listp self-insert-face)
! 						  self-insert-face
! 						(list self-insert-face)))
! 				 face)
! 	      self-insert-face-command this-command)))))
  
  (defun facemenu-active-faces (face-list &optional frame)
*************** or nil if given a bad color."
*** 521,528 ****
  	    (cond ((string-match "^fg:" name)
  		   (set-face-foreground face color)
! 		   (and (or (eq window-system 'x) (eq window-system 'win32)) (x-color-defined-p color)))
  		  ((string-match "^bg:" name)
  		   (set-face-background face color)
! 		   (and (or (eq window-system 'x) (eq window-system 'win32)) (x-color-defined-p color)))
  		  (t))))
        symbol))
--- 585,594 ----
  	    (cond ((string-match "^fg:" name)
  		   (set-face-foreground face color)
! 		   (and window-system
! 			(x-color-defined-p color)))
  		  ((string-match "^bg:" name)
  		   (set-face-background face color)
! 		   (and window-system
! 			(x-color-defined-p color)))
  		  (t))))
        symbol))
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/faces.el emacs-19.31/lisp/faces.el
*** emacs-19.30/lisp/faces.el	Mon Nov 20 18:15:58 1995
--- emacs-19.31/lisp/faces.el	Mon Mar 25 10:09:30 1996
***************
*** 1,5 ****
  ;;; faces.el --- Lisp interface to the c "face" structure
  
! ;; Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
  
  ;; This file is part of GNU Emacs.
--- 1,5 ----
  ;;; faces.el --- Lisp interface to the c "face" structure
  
! ;; Copyright (C) 1992, 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
  
  ;; This file is part of GNU Emacs.
***************
*** 16,21 ****
  
  ;; 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:
--- 16,22 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** FRAME specifies the frame and thus the d
*** 139,143 ****
  	 (g (nth 1 values))
  	 (b (nth 2 values)))
!     (and (< (abs (- r g)) (/ (max 1 (abs r) (abs g)) 20))
  	 (< (abs (- g b)) (/ (max 1 (abs g) (abs b)) 20))
  	 (< (abs (- b r)) (/ (max 1 (abs b) (abs r)) 20)))))
--- 140,145 ----
  	 (g (nth 1 values))
  	 (b (nth 2 values)))
!     (and values
! 	 (< (abs (- r g)) (/ (max 1 (abs r) (abs g)) 20))
  	 (< (abs (- g b)) (/ (max 1 (abs g) (abs b)) 20))
  	 (< (abs (- b r)) (/ (max 1 (abs b) (abs r)) 20)))))
*************** in that frame; otherwise change each fra
*** 151,155 ****
    ;; if the display does not support a gray color.
    (if (and frame (not (eq frame t)) color
! 	   ;; Check for supportedness for foreground, not for background!
  	   ;; face-color-supported-p is smart enough to know
  	   ;; that grays are "supported" as background
--- 153,157 ----
    ;; if the display does not support a gray color.
    (if (and frame (not (eq frame t)) color
! 	   ;; Check for support for foreground, not for background!
  	   ;; face-color-supported-p is smart enough to know
  	   ;; that grays are "supported" as background
*************** in that frame; otherwise change each fra
*** 204,234 ****
  
  (defun modify-face (face foreground background stipple
! 			 bold-p italic-p underline-p)
    "Change the display attributes for face FACE.
! FOREGROUND and BACKGROUND should be color strings or nil.
! STIPPLE should be a stipple pattern name or nil.
  BOLD-P, ITALIC-P, and UNDERLINE-P specify whether the face should be set bold,
! in italic, and underlined, respectively.  (Yes if non-nil.)
! If called interactively, prompts for a face and face attributes."
    (interactive
     (let* ((completion-ignore-case t)
! 	  (face	       (symbol-name (read-face-name "Modify face: ")))
! 	  (colors      (mapcar 'list x-colors))
! 	  (stipples    (mapcar 'list
! 			       (apply 'nconc
! 				      (mapcar 'directory-files
! 					      x-bitmap-file-path))))
! 	  (foreground  (modify-face-read-string
! 			face (face-foreground (intern face))
! 			"foreground" colors))
! 	  (background  (modify-face-read-string
! 			face (face-background (intern face))
! 			"background" colors))
! 	  (stipple     (modify-face-read-string
! 			face (face-stipple (intern face))
! 			"stipple" stipples))
! 	  (bold-p      (y-or-n-p (concat "Set face " face " bold ")))
! 	  (italic-p    (y-or-n-p (concat "Set face " face " italic ")))
! 	  (underline-p (y-or-n-p (concat "Set face " face " underline "))))
       (message "Face %s: %s" face
        (mapconcat 'identity
--- 206,243 ----
  
  (defun modify-face (face foreground background stipple
! 		    bold-p italic-p underline-p &optional frame)
    "Change the display attributes for face FACE.
! If the optional FRAME argument is provided, change only
! in that frame; otherwise change each frame.
! 
! FOREGROUND and BACKGROUND should be a colour name string (or list of strings to
! try) or nil.  STIPPLE should be a stipple pattern name string or nil.
! If nil, means do not change the display attribute corresponding to that arg.
! 
  BOLD-P, ITALIC-P, and UNDERLINE-P specify whether the face should be set bold,
! in italic, and underlined, respectively.  If neither nil or t, means do not
! change the display attribute corresponding to that arg.
! 
! If called interactively, prompts for a face name and face attributes."
    (interactive
     (let* ((completion-ignore-case t)
! 	  (face		(symbol-name (read-face-name "Modify face: ")))
! 	  (colors	(mapcar 'list x-colors))
! 	  (stipples	(mapcar 'list (apply 'nconc
! 					    (mapcar 'directory-files
! 						    x-bitmap-file-path))))
! 	  (foreground	(modify-face-read-string
! 			 face (face-foreground (intern face))
! 			 "foreground" colors))
! 	  (background	(modify-face-read-string
! 			 face (face-background (intern face))
! 			 "background" colors))
! 	  (stipple	(modify-face-read-string
! 			 face (face-stipple (intern face))
! 			 "stipple" stipples))
! 	  (bold-p	(y-or-n-p (concat "Set face " face " bold ")))
! 	  (italic-p	(y-or-n-p (concat "Set face " face " italic ")))
! 	  (underline-p	(y-or-n-p (concat "Set face " face " underline ")))
! 	  (all-frames-p	(y-or-n-p (concat "Modify face " face " in all frames "))))
       (message "Face %s: %s" face
        (mapconcat 'identity
*************** If called interactively, prompts for a f
*** 240,250 ****
  	      (and underline-p "underline"))) ", "))
       (list (intern face) foreground background stipple
! 	   bold-p italic-p underline-p)))
!   (condition-case nil (set-face-foreground face foreground) (error nil))
!   (condition-case nil (set-face-background face background) (error nil))
!   (condition-case nil (set-face-stipple face stipple) (error nil))
!   (funcall (if bold-p 'make-face-bold 'make-face-unbold) face nil t)
!   (funcall (if italic-p 'make-face-italic 'make-face-unitalic) face nil t)
!   (set-face-underline-p face underline-p)
    (and (interactive-p) (redraw-display)))
  
--- 249,269 ----
  	      (and underline-p "underline"))) ", "))
       (list (intern face) foreground background stipple
! 	   bold-p italic-p underline-p
! 	   (if all-frames-p nil (selected-frame)))))
!   (condition-case nil
!       (face-try-color-list 'set-face-foreground face foreground frame)
!     (error nil))
!   (condition-case nil
!       (face-try-color-list 'set-face-background face background frame)
!     (error nil))
!   (condition-case nil
!       (set-face-stipple face stipple frame)
!     (error nil))
!   (cond ((eq bold-p nil) (make-face-unbold face frame t))
! 	((eq bold-p t) (make-face-bold face frame t)))
!   (cond ((eq italic-p nil) (make-face-unitalic face frame t))
! 	((eq italic-p t) (make-face-italic face frame t)))
!   (if (memq underline-p '(nil t))
!       (set-face-underline-p face underline-p frame))
    (and (interactive-p) (redraw-display)))
  
*************** also the same size as FACE on FRAME, or 
*** 630,663 ****
  
  (defun x-frob-font-weight (font which)
!   (cond ((string-match x-font-regexp font)
! 	 (concat (substring font 0 (match-beginning x-font-regexp-weight-subnum))
! 		 which
! 		 (substring font (match-end x-font-regexp-weight-subnum)
! 			    (match-beginning x-font-regexp-adstyle-subnum))
! 		 ;; Replace the ADD_STYLE_NAME field with *
! 		 ;; because the info in it may not be the same
! 		 ;; for related fonts.
! 		 "*"
! 		 (substring font (match-end x-font-regexp-adstyle-subnum))))
! 	((or (string-match x-font-regexp-head font)
! 	     (string-match x-font-regexp-weight font))
! 	 (concat (substring font 0 (match-beginning 1)) which
! 		 (substring font (match-end 1))))))
  
  (defun x-frob-font-slant (font which)
!   (cond ((string-match x-font-regexp font)
! 	 (concat (substring font 0 (match-beginning x-font-regexp-slant-subnum))
! 		 which
! 		 (substring font (match-end x-font-regexp-slant-subnum)
! 			    (match-beginning x-font-regexp-adstyle-subnum))
! 		 ;; Replace the ADD_STYLE_NAME field with *
! 		 ;; because the info in it may not be the same
! 		 ;; for related fonts.
! 		 "*"
! 		 (substring font (match-end x-font-regexp-adstyle-subnum))))
! 	((or (string-match x-font-regexp-head font)
! 	     (string-match x-font-regexp-slant font))
! 	 (concat (substring font 0 (match-beginning 1)) which
! 		 (substring font (match-end 1))))))
  
  (defun x-make-font-bold (font)
--- 649,690 ----
  
  (defun x-frob-font-weight (font which)
!   (let ((case-fold-search t))
!     (cond ((string-match x-font-regexp font)
! 	   (concat (substring font 0
! 			      (match-beginning x-font-regexp-weight-subnum))
! 		   which
! 		   (substring font (match-end x-font-regexp-weight-subnum)
! 			      (match-beginning x-font-regexp-adstyle-subnum))
! 		   ;; Replace the ADD_STYLE_NAME field with *
! 		   ;; because the info in it may not be the same
! 		   ;; for related fonts.
! 		   "*"
! 		   (substring font (match-end x-font-regexp-adstyle-subnum))))
! 	  ((string-match x-font-regexp-head font)
! 	   (concat (substring font 0 (match-beginning 1)) which
! 		   (substring font (match-end 1))))
! 	  ((string-match x-font-regexp-weight font)
! 	   (concat (substring font 0 (match-beginning 1)) which
! 		   (substring font (match-end 1)))))))
  
  (defun x-frob-font-slant (font which)
!   (let ((case-fold-search t))
!     (cond ((string-match x-font-regexp font)
! 	   (concat (substring font 0
! 			      (match-beginning x-font-regexp-slant-subnum))
! 		   which
! 		   (substring font (match-end x-font-regexp-slant-subnum)
! 			      (match-beginning x-font-regexp-adstyle-subnum))
! 		   ;; Replace the ADD_STYLE_NAME field with *
! 		   ;; because the info in it may not be the same
! 		   ;; for related fonts.
! 		   "*"
! 		   (substring font (match-end x-font-regexp-adstyle-subnum))))
! 	  ((string-match x-font-regexp-head font)
! 	   (concat (substring font 0 (match-beginning 2)) which
! 		   (substring font (match-end 2))))
! 	  ((string-match x-font-regexp-slant font)
! 	   (concat (substring font 0 (match-beginning 1)) which
! 		   (substring font (match-end 1)))))))
  
  (defun x-make-font-bold (font)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/fast-lock.el emacs-19.31/lisp/fast-lock.el
*** emacs-19.30/lisp/fast-lock.el	Thu Oct 26 09:34:03 1995
--- emacs-19.31/lisp/fast-lock.el	Fri Jan 26 03:26:26 1996
***************
*** 1,9 ****
  ;;; fast-lock.el --- Automagic text properties caching for fast Font Lock mode.
  
! ;; Copyright (C) 1994, 1995 Free Software Foundation, Inc.
  
  ;; Author: Simon Marshall <simon@gnu.ai.mit.edu>
  ;; Keywords: faces files
! ;; Version: 3.08
  
  ;;; This file is part of GNU Emacs.
--- 1,9 ----
  ;;; fast-lock.el --- Automagic text properties caching for fast Font Lock mode.
  
! ;; Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc.
  
  ;; Author: Simon Marshall <simon@gnu.ai.mit.edu>
  ;; Keywords: faces files
! ;; Version: 3.09
  
  ;;; This file is part of GNU Emacs.
***************
*** 20,25 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 64,154 ****
  ;;
  ;; 0.02--1.00:
! ;; - Changed name from turbo-prop to fast-lock.  Automagic for font-lock only.
! ;; - Made `fast-lock-mode' a minor mode, like G. Dinesh Dutt's fss-mode.
  ;; 1.00--1.01:
! ;; - Turn on `fast-lock-mode' only if `buffer-file-name' or `interactive-p'.
! ;; - Made `fast-lock-file-name' use `buffer-name' if `buffer-file-name' is nil.
! ;; - Moved save-all conditions to `fast-lock-save-cache'.
! ;; - Added `fast-lock-save-text-properties' to `kill-buffer-hook'.
! ;; 1.01--2.00: complete rewrite---not worth the space to document.
! ;; - Changed structure of text properties cache and threw out file mod checks.
  ;; 2.00--2.01:
  ;; - Made `condition-case' forms understand `quit'. 
! ;; - Made `fast-lock' require `font-lock'.
! ;; - Made `fast-lock-cache-name' chase links (from Ben Liblit).
  ;; 2.01--3.00:
! ;; - Changed structure of cache to include `font-lock-keywords' (from rms).
! ;; - Changed `fast-lock-cache-mechanisms' to `fast-lock-cache-directories'.
! ;; - Removed `fast-lock-read-others'.
! ;; - Made `fast-lock-read-cache' ignore cache owner.
! ;; - Made `fast-lock-save-cache-external' create cache directory.
! ;; - Made `fast-lock-save-cache-external' save `font-lock-keywords'.
! ;; - Made `fast-lock-cache-data' check `font-lock-keywords'.
! ;; 3.00--3.01: incorporated port of 2.00 to Lucid, made by Barry Warsaw.
! ;; - Package now provides itself.
! ;; - Lucid: Use `font-lock-any-extents-p' for `font-lock-any-properties-p'.
! ;; - Lucid: Use `list-faces' for `face-list'.
! ;; - Lucid: Added `set-text-properties'.
! ;; - Lucid: Made `turn-on-fast-lock' pass 1 not t to `fast-lock-mode'.
! ;; - Removed test for `fast-lock-mode' from `fast-lock-read-cache'.
! ;; - Lucid: Added Lucid-specific `fast-lock-get-face-properties'.
! ;; 3.01--3.02: now works with Lucid Emacs, thanks to Barry Warsaw.
! ;; - Made `fast-lock-cache-name' map ":" to ";" for OS/2 (from Serganova Vera).
! ;; - Made `fast-lock-cache-name' use abbreviated file name (from Barry Warsaw).
! ;; - Lucid: Separated handlers for `error' and `quit' for `condition-case'.
  ;; 3.02--3.03:
! ;; - Changed `fast-lock-save-cache-external' to `fast-lock-save-cache-data'.
! ;; - Lucid: Added Lucid-specific `fast-lock-set-face-properties'.
  ;; 3.03--3.04:
! ;; - Corrected `subrp' test of Lucid code.
! ;; - Replaced `font-lock-any-properties-p' with `text-property-not-all'.
! ;; - Lucid: Made `fast-lock-set-face-properties' put `text-prop' on extents.
! ;; - Made `fast-lock-cache-directories' a regexp alist (from Colin Rafferty).
! ;; - Made `fast-lock-cache-directory' to return a usable cache file directory.
  ;; 3.04--3.05:
! ;; - Lucid: Fix for XEmacs 19.11 `text-property-not-all'.
! ;; - Replaced `subrp' test of Lucid code with `emacs-version' `string-match'.
! ;; - Made `byte-compile-warnings' omit `unresolved' on compilation.
! ;; - Made `fast-lock-save-cache-data' use a buffer (from Rick Sladkey).
! ;; - Reverted to old `fast-lock-get-face-properties' (from Rick Sladkey).
! ;; 3.05--3.06: incorporated hack of 3.03, made by Jonathan Stigelman (Stig).
! ;; - Reverted to 3.04 version of `fast-lock-get-face-properties'.
! ;; - XEmacs: Removed `list-faces' `defalias'.
! ;; - Made `fast-lock-mode' and `turn-on-fast-lock' succeed `autoload' cookies.
! ;; - Added `lazy-lock-submit-bug-report'.
! ;; - Renamed `fast-lock-save-size' to `fast-lock-minimum-size'.
! ;; - Made `fast-lock-save-cache' output a message if no save ever attempted.
! ;; - Made `fast-lock-save-cache-data' output a message if save attempted.
! ;; - Made `fast-lock-cache-data' output a message if load attempted.
! ;; - Made `fast-lock-save-cache-data' do `condition-case' not `unwind-protect'.
! ;; - Made `fast-lock-save-cache' and `fast-lock-read-cache' return nothing.
! ;; - Made `fast-lock-save-cache' check `buffer-modified-p' (Stig).
! ;; - Added `fast-lock-save-events'.
! ;; - Added `fast-lock-after-save-hook' to `after-save-hook' (Stig).
! ;; - Added `fast-lock-kill-buffer-hook' to `kill-buffer-hook'.
! ;; - Changed `fast-lock-save-caches' to `fast-lock-kill-emacs-hook'.
! ;; - Added `fast-lock-kill-emacs-hook' to `kill-emacs-hook'.
! ;; - Made `fast-lock-save-cache' check `verify-visited-file-modtime' (Stig).
! ;; - Made `visited-file-modtime' be the basis of the timestamp (Stig).
! ;; - Made `fast-lock-save-cache-1' and `fast-lock-cache-data' use/reformat it.
! ;; - Added `fast-lock-cache-filename' to keep track of the cache file name.
! ;; - Added `fast-lock-after-fontify-buffer'.
! ;; - Added `fast-lock-save-faces' list of faces to save (idea from Stig/Tibor).
! ;; - Made `fast-lock-get-face-properties' functions use it.
! ;; - XEmacs: Made `fast-lock-set-face-properties' do extents the Font Lock way.
! ;; - XEmacs: Removed fix for `text-property-not-all' (19.11 support dropped).
! ;; - Made `fast-lock-mode' ensure `font-lock-mode' is on.
! ;; - Made `fast-lock-save-cache' do `cdr-safe' not `cdr' (from Dave Foster).
! ;; - Made `fast-lock-save-cache' do `set-buffer' first (from Dave Foster).
! ;; - Made `fast-lock-save-cache' loop until saved or quit (from Georg Nikodym).
! ;; - Made `fast-lock-cache-data' check `buffer-modified-p'.
! ;; - Made `fast-lock-cache-data' do `font-lock-compile-keywords' if necessary.
! ;; - XEmacs: Made `font-lock-compile-keywords' `defalias'.
  ;; 3.06--3.07:
! ;; - XEmacs: Add `fast-lock-after-fontify-buffer' to the Font Lock hook.
! ;; - Made `fast-lock-cache-name' explain the use of `directory-abbrev-alist'.
! ;; - Made `fast-lock-mode' use `buffer-file-truename' not `buffer-file-name'.
  ;; 3.07--3.08:
! ;; - Made `fast-lock-read-cache' set `fast-lock-cache-filename'.
  
  (require 'font-lock)
--- 65,159 ----
  ;;
  ;; 0.02--1.00:
! ;; - Changed name from turbo-prop to fast-lock.  Automagic for font-lock only
! ;; - Made `fast-lock-mode' a minor mode, like G. Dinesh Dutt's fss-mode
  ;; 1.00--1.01:
! ;; - Turn on `fast-lock-mode' only if `buffer-file-name' or `interactive-p'
! ;; - Made `fast-lock-file-name' use `buffer-name' if `buffer-file-name' is nil
! ;; - Moved save-all conditions to `fast-lock-save-cache'
! ;; - Added `fast-lock-save-text-properties' to `kill-buffer-hook'
! ;; 1.01--2.00: complete rewrite---not worth the space to document
! ;; - Changed structure of text properties cache and threw out file mod checks
  ;; 2.00--2.01:
  ;; - Made `condition-case' forms understand `quit'. 
! ;; - Made `fast-lock' require `font-lock'
! ;; - Made `fast-lock-cache-name' chase links (from Ben Liblit)
  ;; 2.01--3.00:
! ;; - Changed structure of cache to include `font-lock-keywords' (from rms)
! ;; - Changed `fast-lock-cache-mechanisms' to `fast-lock-cache-directories'
! ;; - Removed `fast-lock-read-others'
! ;; - Made `fast-lock-read-cache' ignore cache owner
! ;; - Made `fast-lock-save-cache-external' create cache directory
! ;; - Made `fast-lock-save-cache-external' save `font-lock-keywords'
! ;; - Made `fast-lock-cache-data' check `font-lock-keywords'
! ;; 3.00--3.01: incorporated port of 2.00 to Lucid, made by Barry Warsaw
! ;; - Package now provides itself
! ;; - Lucid: Use `font-lock-any-extents-p' for `font-lock-any-properties-p'
! ;; - Lucid: Use `list-faces' for `face-list'
! ;; - Lucid: Added `set-text-properties'
! ;; - Lucid: Made `turn-on-fast-lock' pass 1 not t to `fast-lock-mode'
! ;; - Removed test for `fast-lock-mode' from `fast-lock-read-cache'
! ;; - Lucid: Added Lucid-specific `fast-lock-get-face-properties'
! ;; 3.01--3.02: now works with Lucid Emacs, thanks to Barry Warsaw
! ;; - Made `fast-lock-cache-name' map ":" to ";" for OS/2 (from Serganova Vera)
! ;; - Made `fast-lock-cache-name' use abbreviated file name (from Barry Warsaw)
! ;; - Lucid: Separated handlers for `error' and `quit' for `condition-case'
  ;; 3.02--3.03:
! ;; - Changed `fast-lock-save-cache-external' to `fast-lock-save-cache-data'
! ;; - Lucid: Added Lucid-specific `fast-lock-set-face-properties'
  ;; 3.03--3.04:
! ;; - Corrected `subrp' test of Lucid code
! ;; - Replaced `font-lock-any-properties-p' with `text-property-not-all'
! ;; - Lucid: Made `fast-lock-set-face-properties' put `text-prop' on extents
! ;; - Made `fast-lock-cache-directories' a regexp alist (from Colin Rafferty)
! ;; - Made `fast-lock-cache-directory' to return a usable cache file directory
  ;; 3.04--3.05:
! ;; - Lucid: Fix for XEmacs 19.11 `text-property-not-all'
! ;; - Replaced `subrp' test of Lucid code with `emacs-version' `string-match'
! ;; - Made `byte-compile-warnings' omit `unresolved' on compilation
! ;; - Made `fast-lock-save-cache-data' use a buffer (from Rick Sladkey)
! ;; - Reverted to old `fast-lock-get-face-properties' (from Rick Sladkey)
! ;; 3.05--3.06: incorporated hack of 3.03, made by Jonathan Stigelman (Stig)
! ;; - Reverted to 3.04 version of `fast-lock-get-face-properties'
! ;; - XEmacs: Removed `list-faces' `defalias'
! ;; - Made `fast-lock-mode' and `turn-on-fast-lock' succeed `autoload' cookies
! ;; - Added `fast-lock-submit-bug-report'
! ;; - Renamed `fast-lock-save-size' to `fast-lock-minimum-size'
! ;; - Made `fast-lock-save-cache' output a message if no save ever attempted
! ;; - Made `fast-lock-save-cache-data' output a message if save attempted
! ;; - Made `fast-lock-cache-data' output a message if load attempted
! ;; - Made `fast-lock-save-cache-data' do `condition-case' not `unwind-protect'
! ;; - Made `fast-lock-save-cache' and `fast-lock-read-cache' return nothing
! ;; - Made `fast-lock-save-cache' check `buffer-modified-p' (Stig)
! ;; - Added `fast-lock-save-events'
! ;; - Added `fast-lock-after-save-hook' to `after-save-hook' (Stig)
! ;; - Added `fast-lock-kill-buffer-hook' to `kill-buffer-hook'
! ;; - Changed `fast-lock-save-caches' to `fast-lock-kill-emacs-hook'
! ;; - Added `fast-lock-kill-emacs-hook' to `kill-emacs-hook'
! ;; - Made `fast-lock-save-cache' check `verify-visited-file-modtime' (Stig)
! ;; - Made `visited-file-modtime' be the basis of the timestamp (Stig)
! ;; - Made `fast-lock-save-cache-1' and `fast-lock-cache-data' use/reformat it
! ;; - Added `fast-lock-cache-filename' to keep track of the cache file name
! ;; - Added `fast-lock-after-fontify-buffer'
! ;; - Added `fast-lock-save-faces' list of faces to save (idea from Stig/Tibor)
! ;; - Made `fast-lock-get-face-properties' functions use it
! ;; - XEmacs: Made `fast-lock-set-face-properties' do extents the Font Lock way
! ;; - XEmacs: Removed fix for `text-property-not-all' (19.11 support dropped)
! ;; - Made `fast-lock-mode' ensure `font-lock-mode' is on
! ;; - Made `fast-lock-save-cache' do `cdr-safe' not `cdr' (from Dave Foster)
! ;; - Made `fast-lock-save-cache' do `set-buffer' first (from Dave Foster)
! ;; - Made `fast-lock-save-cache' loop until saved or quit (from Georg Nikodym)
! ;; - Made `fast-lock-cache-data' check `buffer-modified-p'
! ;; - Made `fast-lock-cache-data' do `font-lock-compile-keywords' if necessary
! ;; - XEmacs: Made `font-lock-compile-keywords' `defalias'
  ;; 3.06--3.07:
! ;; - XEmacs: Add `fast-lock-after-fontify-buffer' to the Font Lock hook
! ;; - Made `fast-lock-cache-name' explain the use of `directory-abbrev-alist'
! ;; - Made `fast-lock-mode' use `buffer-file-truename' not `buffer-file-name'
  ;; 3.07--3.08:
! ;; - Made `fast-lock-read-cache' set `fast-lock-cache-filename'
! ;; 3.08--3.09:
! ;; - Made `fast-lock-save-cache' cope if `fast-lock-minimum-size' is a list
! ;; - Made `fast-lock-mode' respect the value of `font-lock-inhibit-thing-lock'
! ;; - Added `fast-lock-after-unfontify-buffer'
  
  (require 'font-lock)
***************
*** 162,166 ****
    (interactive)
    (let ((reporter-prompt-for-summary-p t))
!     (reporter-submit-bug-report "simon@gnu.ai.mit.edu" "fast-lock 3.08"
       '(fast-lock-cache-directories fast-lock-minimum-size
         fast-lock-save-others fast-lock-save-events fast-lock-save-faces)
--- 167,171 ----
    (interactive)
    (let ((reporter-prompt-for-summary-p t))
!     (reporter-submit-bug-report "simon@gnu.ai.mit.edu" "fast-lock 3.09"
       '(fast-lock-cache-directories fast-lock-minimum-size
         fast-lock-save-others fast-lock-save-events fast-lock-save-faces)
*************** home directory hierarchy, or otherwise t
*** 204,208 ****
    "If non-nil, the minimum size for buffers.
  Only buffers more than this can have associated Font Lock cache files saved.
! If nil, means size is irrelevant.")
  
  (defvar fast-lock-save-events '(kill-buffer kill-emacs)
--- 209,218 ----
    "If non-nil, the minimum size for buffers.
  Only buffers more than this can have associated Font Lock cache files saved.
! If nil, means cache files are never created.
! If a list, each element should be a cons pair of the form (MAJOR-MODE . SIZE),
! where MAJOR-MODE is a symbol or t (meaning the default).  For example:
!  ((c++-mode . 25600) (c-mode . 25600) (rmail-mode . 1048576))
! means that the minimum size is 25K for buffers in `c++-mode' or `c-mode', one
! megabyte for buffers in `rmail-mode', and size is irrelevant otherwise.")
  
  (defvar fast-lock-save-events '(kill-buffer kill-emacs)
*************** Font Lock cache files saved.  Ownership 
*** 223,227 ****
        '(font-lock-string-face font-lock-doc-string-face font-lock-type-face
  	font-lock-function-name-face font-lock-comment-face
! 	font-lock-keyword-face font-lock-preprocessor-face)
      ;; For Emacs 19.30 I don't think this is generally necessary.
      nil)
--- 233,238 ----
        '(font-lock-string-face font-lock-doc-string-face font-lock-type-face
  	font-lock-function-name-face font-lock-comment-face
! 	font-lock-keyword-face font-lock-reference-face
! 	font-lock-preprocessor-face)
      ;; For Emacs 19.30 I don't think this is generally necessary.
      nil)
*************** Use \\[fast-lock-submit-bug-report] to s
*** 263,266 ****
--- 274,278 ----
    (set (make-local-variable 'fast-lock-mode)
         (and buffer-file-truename
+ 	    (not (memq 'fast-lock-mode font-lock-inhibit-thing-lock))
  	    (if arg (> (prefix-numeric-value arg) 0) (not fast-lock-mode))))
    (if (and fast-lock-mode (not font-lock-mode))
*************** See `fast-lock-mode'."
*** 327,331 ****
    (save-excursion
      (and buffer (set-buffer buffer))
!     (let ((file-timestamp (visited-file-modtime)) (saved nil))
        (if (and fast-lock-mode
  	       ;;
--- 339,347 ----
    (save-excursion
      (and buffer (set-buffer buffer))
!     (let ((min-size (if (not (consp fast-lock-minimum-size))
! 			fast-lock-minimum-size
! 		      (cdr (or (assq major-mode fast-lock-minimum-size)
! 			       (assq t fast-lock-minimum-size)))))
! 	  (file-timestamp (visited-file-modtime)) (saved nil))
        (if (and fast-lock-mode
  	       ;;
*************** See `fast-lock-mode'."
*** 344,349 ****
  	       ;;
  	       ;; Only save if user's restrictions are satisfied.
! 	       (or (not fast-lock-minimum-size)
! 		   (<= fast-lock-minimum-size (buffer-size)))
  	       (or fast-lock-save-others
  		   (eq (user-uid) (nth 2 (file-attributes buffer-file-name))))
--- 360,364 ----
  	       ;;
  	       ;; Only save if user's restrictions are satisfied.
! 	       (and min-size (>= (buffer-size) min-size))
  	       (or fast-lock-save-others
  		   (eq (user-uid) (nth 2 (file-attributes buffer-file-name))))
*************** See `fast-lock-mode'."
*** 375,378 ****
--- 390,396 ----
    ;; Flag so that a cache will be saved later even if the file is never saved.
    (setq fast-lock-cache-timestamp nil))
+ 
+ (defalias 'fast-lock-after-unfontify-buffer
+   'ignore)
  
  ;; Miscellaneous Functions:
*************** See `fast-lock-get-face-properties' for 
*** 625,628 ****
--- 643,650 ----
  	      'fast-lock-after-fontify-buffer))
  
+ (or (boundp 'font-lock-inhibit-thing-lock)
+     (defvar font-lock-inhibit-thing-lock nil
+       "List of Font Lock mode related modes that should not be turned on."))
+ 
  (or (fboundp 'font-lock-compile-keywords)
      (defalias 'font-lock-compile-keywords 'identity))
*************** See `fast-lock-get-face-properties' for 
*** 637,645 ****
  (add-hook 'kill-emacs-hook 'fast-lock-kill-emacs-hook)
  
- ;; Maybe save on the modeline?
- ;;(setcdr (assq 'font-lock-mode minor-mode-alist) '(" Fast"))
- 
  (or (assq 'fast-lock-mode minor-mode-alist)
!     (setq minor-mode-alist (cons '(fast-lock-mode " Fast") minor-mode-alist)))
  
  ;; Provide ourselves:
--- 659,664 ----
  (add-hook 'kill-emacs-hook 'fast-lock-kill-emacs-hook)
  
  (or (assq 'fast-lock-mode minor-mode-alist)
!     (setq minor-mode-alist (append minor-mode-alist '((fast-lock-mode nil)))))
  
  ;; Provide ourselves:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/ffap.el emacs-19.31/lisp/ffap.el
*** emacs-19.30/lisp/ffap.el	Sun Nov 12 18:55:44 1995
--- emacs-19.31/lisp/ffap.el	Sun Mar 24 09:19:39 1996
***************
*** 1,6 ****
! ;;; ffap.el -- find-file-at-point,
! ;; Copyright (C) 1994, 1995 Free Software Foundation, Inc.
  
! ;;; Author: Michelangelo Grigni <mic@mathcs.emory.edu>
  
  ;; This file is part of GNU Emacs.
--- 1,10 ----
! ;;; ffap.el --- find file or url at point
  
! ;; Copyright (C) 1995, 1996 Free Software Foundation, Inc.
! 
! ;; Author: Michelangelo Grigni <mic@mathcs.emory.edu>
! ;; Created: 29 Mar 1993
! ;; Keywords: files, hypermedia, matching, mouse
! ;; X-Latest: ftp://ftp.mathcs.emory.edu:/pub/mic/emacs/
  
  ;; This file is part of GNU Emacs.
***************
*** 17,206 ****
  
  ;; 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:
  
- ;; A replacement for find-file {C-x C-f}: finds file or URL,
- ;; guessing default from text at point.  Many features!
- ;; Send bugs or suggestions with M-x ffap-bug.
- 
- ;; See ftp://ftp.mathcs.emory.edu:/pub/mic/emacs/ for most recent version:
- ;;    ffap.el.gz       -- this file, compressed with gzip
- ;;    ffap-xe.el       -- support code for XEmacs 19.*
- ;;    COPYING.gz       -- GNU General Public License, version 2
- ;;    README           -- description of these and other files
- ;;
- ;; For the last version sent to elisp-archive@cis.ohio-state.edu, see:
- ;;    ftp://ftp.cis.ohio-state.edu/pub/gnu/emacs/elisp-archive/misc/ffap.el.Z
- ;;    (mirrored in gatekeeper.dec.com:/pub/GNU/elisp-archive/misc/)
  
! ;;; Description:
! ;;
! ;; Command find-file-at-point (== ffap) replaces find-file.  With a
! ;; prefix, it behaves exactly like find-file.  Without a prefix, it
! ;; first tries to guess a default file or URL based on the text around
! ;; the point (set `ffap-require-prefix' to swap these behaviors).
! ;; This is a quick way to fetch URL and file references in many
! ;; situations, such as in mail or news messages, README's, and
! ;; MANIFEST's.
! ;;
! ;; Some related commands are ffap-at-mouse, ffap-next, ffap-menu,
! ;; ffap-other-window, ffap-other-frame.
  ;;
! ;; This package is about user convenience.  It adds nothing to the
! ;; elisp programmer's repertoire.
  
  
! ;;; Installation:
  
! ;; Quick Setup:
! ;;
! ;; For a basic installation, just install ffap.el somewhere in your
! ;; `load-path', byte-compile it, and add the following two lines near
! ;; the end of your ~/.emacs (or equivalent) file:
! ;;
! ;; (require 'ffap)                      ; load this file
! ;; (global-set-key "\C-x\C-f" 'find-file-at-point)
! ;;
! ;; Other Packages: ffap notices the presence of several other packages
! ;; when it is loaded.  In particular, if you use ange-ftp, efs, w3,
! ;; complete, or ff-paths (version < 3.00), it is best to load or
! ;; autoload them before loading ffap (ffap does not need any of them).
! ;; If you use ff-paths version >= 3.00, load it after ffap.
  
! ;; Fancier Setup:
! ;;
! ;; ffap has many options.  The next comment block contains some
! ;; fancier code that you might want to adapt for your .emacs.  For
! ;; even more features, look at the documentation (M-x apropos ffap),
! ;; and perhaps check the comments in the "User Variables" and "Peanut
! ;; Gallery" sections of this file.
  
! ;; ;; Before loading ffap:
! ;;
! ;; (setq ffap-url-regexp nil)           ; to disable all URL features
! ;;
! ;; ;; Loading ffap:
! ;; (require 'ffap)                      ; as in "Quick Setup" above
! ;;
! ;; After loading ffap:
! ;;
! ;; (global-set-key "\C-x\C-f" 'find-file-at-point) ; as in "Quick Setup"
! ;; (global-set-key "\C-x4f" 'ffap-other-window) ; or \C-f
! ;; (global-set-key "\C-x5f" 'ffap-other-frame) ; or \C-f
! ;;
! ;; (setq ffap-alist                     ; remove something in `ffap-alist'
! ;;	 (delete (assoc 'c-mode ffap-alist) ffap-alist))
! ;;
! ;; (setq ffap-alist                     ; add something to `ffap-alist'
! ;;	 (cons
! ;;	  (cons "^[Yy][Ss][Nn][0-9]+$"
! ;;		(defun ffap-ysn (name)
! ;;		  (concat
! ;;		   "http://snorri.chem.washington.edu/ysnarchive/issuefiles/"
! ;;		   (substring name 3) ".html")))
! ;;	  ffap-alist))
! ;;
! ;;
! ;; Before or after loading ffap:
! ;;
! ;; (setq ffap-alist nil)                ; disable all `ffap-alist' actions
! ;;
! ;; (setq ffap-require-prefix t)         ; without prefix, ffap == find-file
! ;;
! ;; (setq ffap-machine-p-known 'accept)  ; to avoid pinging
! ;;
! ;; ;; Choose a mouse binding appropriate for your emacs version:
! ;; (global-set-key [S-mouse-1] 'ffap-at-mouse) ; Emacs 19
! ;; (global-set-key [(meta button1)] 'ffap-at-mouse) ; XEmacs
! ;; (and window-system 			; Emacs 18 (from .emacs)
! ;;      (setq window-setup-hook
! ;;            '(lambda nil (define-key mouse-map x-button-s-left
! ;;                           'ffap-at-mouse))))
! ;;
! ;; ;; Use Netscape instead of w3 to fetch URL's.  Mosaic is very similar.
! ;; (if (eq window-system 'x)
! ;;     (progn
! ;;       ;; Get browse-url at http://wombat.doc.ic.ac.uk/emacs/browse-url.el,
! ;;	 ;; or get a (probably out of date) copy from the ftp site above.
! ;;	 (autoload 'browse-url-netscape "browse-url" nil t)
! ;;	 (setq ffap-url-fetcher 'browse-url-netscape)))
! ;; ;; Or for a hairier ffap-url-fetcher, get ffap-url.el (same ftp site).
! ;;
! ;; ;; Support for gnus, vm, rmail (see hook definitions for bindings):
! ;; (add-hook 'gnus-summary-mode-hook 'ffap-gnus-hook)
! ;; (add-hook 'gnus-article-mode-hook 'ffap-gnus-hook)
! ;; (add-hook 'vm-mode-hook 'ffap-ro-mode-hook)
! ;; (add-hook 'rmail-mode-hook 'ffap-ro-mode-hook)
  
- 
- ;;; Related packages:
- ;;
- ;; If you have hyperbole, you may not need this package, although ffap
- ;; is smaller and smarter at this particular task.  Also note that w3
- ;; (ftp.cs.indiana.edu:/pub/elisp/w3/README) offers a similar command
- ;; w3-follow-url-at-point.
- ;;
- ;; The browse-url package (above) notices URL's and hands them off to
- ;; w3 or an external WWW browser.  Package |~/misc/goto-address.el.gz|
- ;; by Eric J. Ding <ericding@mit.edu> notices URL's and mail
- ;; addresses, and can pre-fontify a buffer to highlight them.  Gnus5
- ;; (ding) and vm also provide similar support in their messages.
- 
- 
- ;;; Examples:
- ;;
- ;; Try M-x find-file-at-point (maybe {C-x C-f}) on these examples.
- ;; These local file examples use ordinary find-file:
- ;;
- ;;    ffap.el, /etc/motd, $MAIL     -- find local or absolute files
- ;;    .emacs book.sty info/cl pwd.h -- search paths depending on filename
- ;;    (require 'rmail)              -- search paths depending on major-mode
- ;;    file:/etc/motd                -- depends on `ffap-url-unwrap-local'
- ;;
- ;; These remote file examples work if you have ange-ftp or efs:
- ;;
- ;;    ftp:/pub                      -- no ping (always works)
- ;;    ftp.x.org:README              -- no ping, a nice recursive example
- ;;    anonymous@ftp.x.org:/README   -- synonym
- ;;    ftp.x.org://README            -- synonym
- ;;    ftp://ftp.x.org/README        -- depends on `ffap-url-unwrap-remote'
- ;;    ftp.mathcs.emory.edu          -- depends on `ffap-machine-p-known'
- ;;    mic@ftp:/                     -- depends on `ffap-machine-p-local'
- ;;    ftp.mathcs.emory.edu:/        -- depends on `ffap-ftp-sans-slash-regexp'
- ;;
- ;; These URL examples use `ffap-url-fetcher' (default w3-fetch):
- ;;
- ;;    http://www.cc.emory.edu
- ;;    http://www.cs.indiana.edu/elisp/w3/docs.html
- ;;    http://info.cern.ch/default.html
- ;;    news:news.newusers.questions
- ;;    mailto:mic@mathcs.emory.edu
- ;;    mic@mathcs.emory.edu          -- same as previous
- ;;    <mic@mathcs.emory.edu>        -- same as previous
- ;;    <root>                        -- mailto:root
- ;;    <mic.9@mathcs.emory.edu>      -- see `ffap-foo@bar-prefix'
- ;;    file:/etc/motd                -- see `ffap-url-unwrap-local'
- ;;    ftp://ftp.x.org/README        -- see `ffap-url-unwrap-remote'
- ;;
- ;; Multiline gopher blocks (as in .gopherrc and usenet of yesteryear):
- ;;
- ;;    Type=1
- ;;    Name=Electronic Texts (ffap ignores this)
- ;;    Path=
- ;;    Host=etext.archive.umich.edu
- ;;    Port=70
  
  
- ;;; Code:
- 
- (provide 'ffap)
- 
  ;;; User Variables:
  
  ;; This function is used inside defvars:
  (defun ffap-soft-value (name &optional default)
!   ;; Avoid interning.  Bug: (ffap-soft-value "nil" 5) --> 5
    (let ((sym (intern-soft name)))
      (if (and sym (boundp sym)) (symbol-value sym) default)))
--- 21,110 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  
! ;;; Commentary:
  ;;
! ;; Command find-file-at-point replaces find-file.  With a prefix, it
! ;; behaves exactly like find-file.  Without a prefix, it first tries
! ;; to guess a default file or url from the text around the point
! ;; (`ffap-require-prefix' swaps these behaviors).  This is useful for
! ;; following references in situations such as mail or news buffers,
! ;; README's, MANIFEST's, and so on.  Submit bugs or suggestions with
! ;; M-x ffap-bug.
! ;;
! ;; For the default installation, byte-compile ffap.el somewhere in
! ;; your `load-path' and add these two lines to your .emacs file:
! ;;
! ;; (require 'ffap)                      ; load the package
! ;; (ffap-bindings)                      ; do default key bindings
! ;;
! ;; ffap-bindings makes the following global key bindings:
! ;;
! ;; C-x C-f       find-file-at-point (abbreviated as ffap)
! ;; C-x 4 f       ffap-other-window
! ;; C-x 5 f       ffap-other-frame
! ;; S-mouse-3     ffap-at-mouse
! ;;
! ;; ffap-bindings also adds hooks to make the following local bindings
! ;; in vm, gnus, and rmail:
! ;;
! ;; M-l         ffap-next, or ffap-gnus-next in gnus
! ;; M-m         ffap-menu, or ffap-gnus-menu in gnus
! ;;
! ;; If you do not like these bindings, modify the variable
! ;; `ffap-bindings', or write your own.
! ;;
! ;; If you use ange-ftp, browse-url, complete, efs, or w3, it is best
! ;; to load or autoload them before ffap.  If you use ff-paths, load it
! ;; afterwards.  Try apropos {C-h a ffap RET} to get a list of the many
! ;; option variables.  In particular, if ffap is slow, try these:
! ;;
! ;; (setq ffap-alist nil)                ; faster, dumber prompting
! ;; (setq ffap-machine-p-known 'accept)  ; no pinging
! ;; (setq ffap-url-regexp nil)           ; disable url features in ffap
! ;;
! ;; ffap uses w3 (if found) or else browse-url to fetch url's.  For
! ;; a hairier `ffap-url-fetcher', try ffap-url.el (same ftp site).
! ;; Also, you can add `ffap-menu-rescan' to various hooks to fontify
! ;; the file and url references within a buffer.
! 
! ;;; Todo list:
! ;; * recognize paths inside /usr/bin:/bin:/etc, ./ffap.el:80:
! ;; * let "/path/file#key" jump to key (offset or regexp) in /path/file
! ;; * find file of symbol if TAGS is loaded (like above)
! ;; * break up long menus into multiple panes (like imenu?)
! ;; * notice node in "(dired)Virtual Dired" (handle the space?)
! ;; * notice "machine.dom blah blah blah path/file" (how?)
! ;; * if w3 becomes standard, could rewrite to use its functions
! ;; * regexp options for ffap-string-at-point, like font-lock (MCOOK)
! ;; * v19: could replace `ffap-locate-file' with a quieter `locate-library'
! ;; * support for custom.el
! ;; + handle "$(HOME)" in Makefiles?
! ;; + modify `font-lock-keywords' to do fontification
  
  
! ;;; Code:
  
! (provide 'ffap)
  
! ;; Versions: This file is tested with Emacs 19.30.  It mostly works
! ;; with XEmacs, but get ffap-xe.el for the popup menu.  Emacs 18 is
! ;; now abandoned (get ffap-15.el instead).
  
! (defvar ffap-xemacs (and (string-match "X[Ee]macs" emacs-version) t)
!   "Whether ffap thinks it is running under XEmacs.")
  
  
  
  ;;; User Variables:
  
  ;; This function is used inside defvars:
  (defun ffap-soft-value (name &optional default)
!   "Return value of symbol with NAME, if it is interned.
! Otherwise return nil (or the optional DEFAULT value)."
!   ;; Bug: (ffap-soft-value "nil" 5) --> 5
    (let ((sym (intern-soft name)))
      (if (and sym (boundp sym)) (symbol-value sym) default)))
*************** Nil also disables the generation of such
*** 220,227 ****
  
  (defvar ffap-url-unwrap-local t
!   "*If set, convert local \"file:\" URL to path before prompting.")
  
  (defvar ffap-url-unwrap-remote t
!   "*Convert remote \"file:\" or \"ftp:\" URL to path before prompting.
  This is ignored if `ffap-ftp-regexp' is nil.")
  
--- 124,131 ----
  
  (defvar ffap-url-unwrap-local t
!   "*If non-nil, convert \"file:\" url to local path before prompting.")
  
  (defvar ffap-url-unwrap-remote t
!   "*If non-nil, convert \"ftp:\" url to remote path before prompting.
  This is ignored if `ffap-ftp-regexp' is nil.")
  
*************** This is ignored if `ffap-ftp-regexp' is 
*** 231,236 ****
        nil
      "anonymous")
!   "*User name in ftp paths generated by ffap (see host-to-ftp-path).
! Nil to fall back on `efs-default-user' or `ange-ftp-default-user'.")
  
  (defvar ffap-rfs-regexp
--- 135,140 ----
        nil
      "anonymous")
!   "*User name in ftp paths generated by `ffap-host-to-path'.
! Nil to rely on `efs-default-user' or `ange-ftp-default-user'.")
  
  (defvar ffap-rfs-regexp
*************** Nil to fall back on `efs-default-user' o
*** 238,242 ****
    "\\`/\\(afs\\|net\\)/."
    ;; afs only: (and (file-exists-p "/afs") "\\`/afs/.")
!   "*Paths matching this are remote file-system paths.  Nil to disable.")
  
  (defvar ffap-url-regexp
--- 142,146 ----
    "\\`/\\(afs\\|net\\)/."
    ;; afs only: (and (file-exists-p "/afs") "\\`/afs/.")
!   "*Matching paths are treated as remote.  Nil to disable.")
  
  (defvar ffap-url-regexp
*************** Nil to fall back on `efs-default-user' o
*** 250,256 ****
     "\\)."				; require one more character
     )
!    "Regexp matching URL's, or nil to disable.")
  
! (defvar ffap-foo@bar-prefix "mailto"
    "*Presumed url prefix type of strings like \"<foo.9z@bar>\".
  Sensible values are nil, \"news\", or \"mailto\".")
--- 154,160 ----
     "\\)."				; require one more character
     )
!    "Regexp matching url's.  Nil to disable url features in ffap.")
  
! (defvar ffap-foo-at-bar-prefix "mailto"
    "*Presumed url prefix type of strings like \"<foo.9z@bar>\".
  Sensible values are nil, \"news\", or \"mailto\".")
*************** Sensible values are nil, \"news\", or \"
*** 258,319 ****
  
  ;;; Peanut Gallery:
! 
  ;; Users of ffap occasionally suggest new features.  If I consider
  ;; those features interesting but not clear winners (a matter of
  ;; personal taste) I try to leave options to enable them.  Read
! ;; through this section, and for any features you like, put an
! ;; appropriate form in your ~/.emacs file.
  
  (defvar ffap-dired-wildcards nil	; "[*?][^/]*$"
!   ;; From RHOGEE, 07 Jul 1994.
!   ;; Disabled: dired is still available by "C-x C-d <pattern>", and
!   ;; valid filenames may contain wildcard characters.
    "*A regexp matching filename wildcard characters, or nil.
! If find-file-at-point gets a filename matching this pattern,
! it passes it on to dired instead of find-file.")
  
  (defvar ffap-newfile-prompt nil		; t
!   ;; From RHOGEE, 11 Jul 1994.
!   ;; Disabled: this is better handled by `find-file-not-found-hooks'.
!   "*Whether find-file-at-point prompts about a nonexistent file.")
  
  (defvar ffap-require-prefix nil
!   ;; From RHOGEE, 20 Oct 1994.
!   ;; This is nil so that neophytes notice ffap.  Experts instead may
!   ;; prefer to disable ffap most of the time.
!   "*If set, reverses the prefix argument to find-file-at-point.")
! 
! (defvar ffap-file-finder
!   ;; From RHOGEE, 20 Oct 1994.
!   ;; This allows compatibility with ff-paths version < 3.00.
!   ;; For ff-paths version >= 3.00, just load it after ffap.
!   (if (commandp 'find-file-using-paths)
!       'find-file-using-paths
!     ;; Try to overcome load-order dependency:
!     (eval-after-load
!      "ff-paths"
!      '(and (commandp 'find-file-using-paths)
! 	   (setq ffap-file-finder find-file-using-paths)))
!     'find-file)
!   "*The command symbol called by find-file-at-point to find a file.
! Probably find-file, or find-file-using-paths if you use ff-paths
! with version < 3.00.")
  (put 'ffap-file-finder 'risky-local-variable t)
  
! (defvar ffap-url-fetcher 'w3-fetch
!   "*A function of one argument, called by ffap to fetch URL's.
! The default is w3-fetch from the w3 package.  If you prefer Mosaic or
! Netscape, install http://wombat.doc.ic.ac.uk/emacs/browse-url.el, and
! add one of the following lines to your setup:
! 
! \(setq ffap-url-fetcher 'browse-url-netscape\)
! \(setq ffap-url-fetcher 'browse-url-mosaic\)
! 
! Or for something hairier \(choose fetch method based on url type and
! prompting\) get ffap-url.el wherever you ffap.el."
!   ;; Big old `lambda' examples deleted. Some remote-control references:
    ;; http://www.ncsa.uiuc.edu/SDG/Software/XMosaic/remote-control.html
    ;; http://home.netscape.com/newsref/std/x-remote.html
!   )
  (put 'ffap-url-fetcher 'risky-local-variable t)
  
--- 162,205 ----
  
  ;;; Peanut Gallery:
! ;;
  ;; Users of ffap occasionally suggest new features.  If I consider
  ;; those features interesting but not clear winners (a matter of
  ;; personal taste) I try to leave options to enable them.  Read
! ;; through this section for features that you like, put an appropriate
! ;; enabler in your .emacs file.
  
  (defvar ffap-dired-wildcards nil	; "[*?][^/]*$"
!   ;; Suggestion from RHOGEE, 07 Jul 1994.  Disabled, dired is still
!   ;; available by "C-x C-d <pattern>", and valid filenames may
!   ;; sometimes contain wildcard characters.
    "*A regexp matching filename wildcard characters, or nil.
! If `find-file-at-point' gets a filename matching this pattern,
! it passes it on to `dired' instead of `find-file'.")
  
  (defvar ffap-newfile-prompt nil		; t
!   ;; Suggestion from RHOGEE, 11 Jul 1994.  Disabled, I think this is
!   ;; better handled by `find-file-not-found-hooks'.
!   "*Whether `find-file-at-point' prompts about a nonexistent file.")
  
  (defvar ffap-require-prefix nil
!   ;; Suggestion from RHOGEE, 20 Oct 1994.
!   "*If set, reverses the prefix argument to `find-file-at-point'.
! This is nil so neophytes notice ffap.  Experts may prefer to disable
! ffap most of the time.")
! 
! (defvar ffap-file-finder 'find-file
!   "*The command called by `find-file-at-point' to find a file.")
  (put 'ffap-file-finder 'risky-local-variable t)
  
! (defvar ffap-url-fetcher
!   (cond ((fboundp 'w3-fetch) 'w3-fetch)
! 	((fboundp 'browse-url-netscape) 'browse-url-netscape)
! 	(t 'w3-fetch))
!   ;; Remote control references:
    ;; http://www.ncsa.uiuc.edu/SDG/Software/XMosaic/remote-control.html
    ;; http://home.netscape.com/newsref/std/x-remote.html
!   "*A function of one argument, called by ffap to fetch an URL.
! Reasonable choices are `w3-fetch' or `browse-url-netscape'.
! For a fancier alternative, get ffap-url.el.")
  (put 'ffap-url-fetcher 'risky-local-variable t)
  
*************** prompting\) get ffap-url.el wherever you
*** 321,327 ****
  ;;; Command ffap-next:
  ;;
! ;; Original ffap-next-url (URL's only) from RPECK 30 Mar 1995.
! ;; Since then, broke up into ffap-next-guess (noninteractive) and
! ;; ffap-next (a command), now work on files as well as url's.
  
  (defvar ffap-next-regexp
--- 207,213 ----
  ;;; Command ffap-next:
  ;;
! ;; Original ffap-next-url (URL's only) from RPECK 30 Mar 1995.  Since
! ;; then, broke it up into ffap-next-guess (noninteractive) and
! ;; ffap-next (a command).  It now work on files as well as url's.
  
  (defvar ffap-next-regexp
*************** prompting\) get ffap-url.el wherever you
*** 333,342 ****
    ;; much more time-consuming than regexp searching:
    "[/:.~a-zA-Z]/\\|@[a-zA-Z][-a-zA-Z0-9]*\\."
!   "*Regular expression governing search of ffap-next.")
  
  (defvar ffap-next-guess nil "Last value returned by `ffap-next-guess'.")
  (defun ffap-next-guess (&optional back lim)
    "Move point to next file or url, and return it as a string.
! If nothing found, leaves point at limit and returns nil.
  Optional BACK argument makes search backwards.
  Optional LIM argument limits the search.
--- 219,228 ----
    ;; much more time-consuming than regexp searching:
    "[/:.~a-zA-Z]/\\|@[a-zA-Z][-a-zA-Z0-9]*\\."
!   "*Regular expression governing movements of `ffap-next'.")
  
  (defvar ffap-next-guess nil "Last value returned by `ffap-next-guess'.")
  (defun ffap-next-guess (&optional back lim)
    "Move point to next file or url, and return it as a string.
! If nothing is found, leave point at limit and return nil.
  Optional BACK argument makes search backwards.
  Optional LIM argument limits the search.
*************** Optional argument WRAP says to try wrapp
*** 359,363 ****
  Interactively: use a single prefix to search backwards,
  double prefix to wrap forward, triple to wrap backwards.
! Actual search is done by ffap-next-guess."
    (interactive
     (cdr (assq (prefix-numeric-value current-prefix-arg)
--- 245,249 ----
  Interactively: use a single prefix to search backwards,
  double prefix to wrap forward, triple to wrap backwards.
! Actual search is done by `ffap-next-guess'."
    (interactive
     (cdr (assq (prefix-numeric-value current-prefix-arg)
*************** Actual search is done by ffap-next-guess
*** 378,382 ****
  
  (defun ffap-next-url (&optional back wrap)
!   "Just like ffap-next, but searches with `ffap-url-regexp'."
    (interactive)
    (let ((ffap-next-regexp ffap-url-regexp))
--- 264,268 ----
  
  (defun ffap-next-url (&optional back wrap)
!   "Like `ffap-next', but search with `ffap-url-regexp'."
    (interactive)
    (let ((ffap-next-regexp ffap-url-regexp))
*************** Actual search is done by ffap-next-guess
*** 386,444 ****
  
  
- ;;; Hooks for GNUS, VM, Rmail:
- ;;
- ;; See "Installation" above for suggested use of these hooks.
- ;; If you do not like these bindings, just write hooks with
- ;; whatever bindings you would prefer.
- ;;
- ;; Any suggestions of more "memorable" bindings? -- Mic
- 
- (defun ffap-ro-mode-hook nil
-   "Binds ffap-gnus-next and ffap-gnus-menu to M-l and M-m, resp."
-   (local-set-key "\M-l" 'ffap-next)
-   (local-set-key "\M-m" 'ffap-menu)
-   )
- 
- (defun ffap-gnus-hook nil
-   "Binds ffap-gnus-next and ffap-gnus-menu to L and M, resp."
-   (set (make-local-variable 'ffap-foo@bar-prefix) "news") ; message-id's
-   ;; Note lowercase l and m are taken:
-   (local-set-key "L" 'ffap-gnus-next)
-   (local-set-key "M" 'ffap-gnus-menu))
- 
- (defun ffap-gnus-wrapper (form)		; used by both commands below
-   (and (eq (current-buffer) (get-buffer gnus-summary-buffer))
-        (gnus-summary-select-article))	; get article of current line
-   ;; Preserve selected buffer, but do not do save-window-excursion,
-   ;; since we want to see any window created by form.  Temporarily
-   ;; select the article buffer, so we see any point movement.
-   (let ((sb (window-buffer (selected-window))))
-     (gnus-configure-windows 'article)
-     (pop-to-buffer gnus-article-buffer)
-     (widen)
-     ;; Skip headers at first, for ffap-gnus-next (which wraps around)
-     (if (eq (point) (point-min)) (search-forward "\n\n" nil t))
-     (unwind-protect
- 	(eval form)
-       (pop-to-buffer sb))))
- 
- (defun ffap-gnus-next nil
-   "Run ffap-next in the GNUS article buffer."
-   (interactive) (ffap-gnus-wrapper '(ffap-next nil t)))
- 
- (defun ffap-gnus-menu nil
-   "Run ffap-menu in the GNUS article buffer."
-   (interactive) (ffap-gnus-wrapper '(ffap-menu)))
- 
- 
  ;;; Remote machines and paths:
  
! (fset 'ffap-replace-path-component
!       (if (or (featurep 'efs)
! 	      (and
! 	       (boundp 'file-name-handler-alist) ; v19
! 	       (rassq 'efs-file-handler-function file-name-handler-alist)))
! 	  'efs-replace-path-component
! 	'ange-ftp-replace-name-component))
  
  (defun ffap-file-exists-string (file)
--- 272,292 ----
  
  
  ;;; Remote machines and paths:
  
! (defun ffap-replace-path-component (fullname name)
!   "In remote FULLNAME, replace path with NAME.  May return nil."
!   ;; Use ange-ftp or efs if loaded, but do not load them otherwise.
!   (let (found)
!     (mapcar
!      (function (lambda (sym) (and (fboundp sym) (setq found sym))))
!      '(
!        efs-replace-path-component
!        ange-ftp-replace-path-component
!        ange-ftp-replace-name-component
!        ))
!     (and found
! 	 (fset 'ffap-replace-path-component found)
! 	 (funcall found fullname name))))
! ;; (ffap-replace-path-component "/who@foo.com:/whatever" "/new")
  
  (defun ffap-file-exists-string (file)
*************** Actual search is done by ffap-next-guess
*** 447,452 ****
    ;; just returns nil or t.
    "Return FILE \(maybe modified\) if it exists, else nil."
!   (let ((exists (file-exists-p file)))
!     (and exists (if (stringp exists) exists file))))
  
  ;; I cannot decide a "best" strategy here, so these are variables.  In
--- 295,301 ----
    ;; just returns nil or t.
    "Return FILE \(maybe modified\) if it exists, else nil."
!   (and file				; quietly reject nil
!        (let ((exists (file-exists-p file)))
! 	 (and exists (if (stringp exists) exists file)))))
  
  ;; I cannot decide a "best" strategy here, so these are variables.  In
*************** Actual search is done by ffap-next-guess
*** 454,526 ****
  ;; machine, try setting these all to accept or reject.
  (defvar ffap-machine-p-local 'reject	; this happens often
!   "A symbol, one of: ping, accept, reject.
! This is what ffap-machine-p does with hostnames that have no domain.")
  (defvar ffap-machine-p-known 'ping	; 'accept for speed
!   "A symbol, one of: ping, accept, reject.
! This is what ffap-machine-p does with hostnames that have a known domain
! \(see lisp/mail-extr.el for the list of known domains\).")
  (defvar ffap-machine-p-unknown 'reject
!   "A symbol, one of: ping, accept, reject.
! This is what ffap-machine-p does with hostnames that have an unknown domain
! \(see lisp/mail-extr.el for the list of known domains\).")
! 
! (defvar ffap-machine-p-known-domains
!   '("com" "edu" "net" "org" "mil" "gov" "us" "arpa") ; USA USA...
!   ;; This variable is mainly for emacs18.
!   "Top-level domains known to ffap.  Ignored if mail-extr is loadable.")
! 
! (defun ffap-machine-p (host &optional service quiet)
!   "Indicate whether HOST is the name of a real machine.
! The variables ffap-machine-p-local, ffap-machine-p-known, and ffap-machine-p-unknown
! control ffap-machine-p depending on HOST's domain \(none/known/unknown\).
! Pinging is done using open-network-stream to decide HOST existence.
! Optional SERVICE specifies the service used \(default \"discard\"\).
  Optional QUIET flag suppresses the \"Pinging...\" message.
  Returned values:
! A t value means that HOST answered.
! A symbol \(accept\) means the relevant variable told us to accept.
! A string means the machine exists, but does not respond for some reason."
!   ;; Try some:
!   ;; (ffap-machine-p "ftp")
!   ;; (ffap-machine-p "nonesuch")
!   ;; (ffap-machine-p "ftp.mathcs.emory.edu")
!   ;; (ffap-machine-p "foo.bonk")
!   ;; (ffap-machine-p "foo.bonk.com")
!   ;; (ffap-machine-p "cs" 5678)
!   ;; (ffap-machine-p "gopher.house.gov")
!   ;; Not known to 19.28
!   ;; (ffap-
    (if (or (string-match "[^-a-zA-Z0-9.]" host) ; Illegal chars (?)
! 	  (not (string-match "[^0-9]" host))) ; all numeric! reject it
        nil
      (let* ((domain
  	    (and (string-match "\\.[^.]*$" host)
  		 (downcase (substring host (1+ (match-beginning 0))))))
! 	   (domain-name			; t, "Country", "Local", or nil
! 	    (cond
! 	     ((not domain) "Local")
! 	     ;; common non-country domains (some imply US though):
! 	     ;;	t)
! 	     (t
! 	      ;; Use domain-name properties from v19 lisp/mail-extr.el;
! 	      ;; bbdb/mail-extr also puts this in `all-top-level-domains'.
! 	      (if (or (featurep 'mail-extr)
! 		      (and (load "mail-extr" t t)
! 			   ;; It became a feature between 19.22 and 19.28
! 			   (provide 'mail-extr)))
! 		  (get (intern-soft
! 			domain
! 			(condition-case nil
! 			    mail-extr-all-top-level-domains
! 			  ;; Before 19.28, the symbols were in `obarray':
! 			  (error obarray)))
! 		       'domain-name)
! 		;; Emacs18 does not have mail-extr:
! 		(and (member domain ffap-machine-p-known-domains) t))
! 	      )))
! 	   (strategy
! 	    (cond ((not domain) ffap-machine-p-local)
! 		  ((not domain-name) ffap-machine-p-unknown)
! 		  (ffap-machine-p-known))))
        (cond
         ((eq strategy 'accept) 'accept)
--- 303,356 ----
  ;; machine, try setting these all to accept or reject.
  (defvar ffap-machine-p-local 'reject	; this happens often
!   "*A symbol, one of: ping, accept, reject.
! What `ffap-machine-p' does with hostnames that have no domain.")
  (defvar ffap-machine-p-known 'ping	; 'accept for speed
!   "*A symbol, one of: ping, accept, reject.
! What `ffap-machine-p' does with hostnames that have a known domain
! \(see mail-extr.el for the known domains\).")
  (defvar ffap-machine-p-unknown 'reject
!   "*A symbol, one of: ping, accept, reject.
! What `ffap-machine-p' does with hostnames that have an unknown domain
! \(see mail-extr.el for the known domains\).")
! 
! (defun ffap-what-domain (domain)
!   ;; Like what-domain in mail-extr.el, returns string or nil.
!   (require 'mail-extr)
!   (defvar mail-extr-all-top-level-domains
!     (ffap-soft-value "all-top-level-domains" obarray)) ; XEmacs, old Emacs
!   (get (intern-soft (downcase domain) mail-extr-all-top-level-domains)
!        'domain-name))
! 
! (defun ffap-machine-p (host &optional service quiet strategy)
!   "Decide whether HOST is the name of a real, reachable machine.
! Depending on the domain (none, known, or unknown), follow the strategy
! named by the variable `ffap-machine-p-local', `ffap-machine-p-known',
! or `ffap-machine-p-unknown'.  Pinging uses `open-network-stream'.
! Optional SERVICE specifies the port used \(default \"discard\"\).
  Optional QUIET flag suppresses the \"Pinging...\" message.
+ Optional STRATEGY overrides the three variables above.
  Returned values:
!  t      means that HOST answered.
! 'accept means the relevant variable told us to accept.
! \"mesg\"  means HOST exists, but does not respond for some reason."
!   ;; Try some (Emory local):
!   ;; (ffap-machine-p "ftp" nil nil 'ping)
!   ;; (ffap-machine-p "nonesuch" nil nil 'ping)
!   ;; (ffap-machine-p "ftp.mathcs.emory.edu" nil nil 'ping)
!   ;; (ffap-machine-p "mathcs" 5678 nil 'ping)
!   ;; (ffap-machine-p "foo.bonk" nil nil 'ping)
!   ;; (ffap-machine-p "foo.bonk.com" nil nil 'ping)
    (if (or (string-match "[^-a-zA-Z0-9.]" host) ; Illegal chars (?)
! 	  (not (string-match "[^0-9]" host))) ; 1: a number? 2: quick reject
        nil
      (let* ((domain
  	    (and (string-match "\\.[^.]*$" host)
  		 (downcase (substring host (1+ (match-beginning 0))))))
! 	   (what-domain (if domain (ffap-what-domain domain) "Local")))
!       (or strategy
! 	  (setq strategy
! 		(cond ((not domain) ffap-machine-p-local)
! 		      ((not what-domain) ffap-machine-p-unknown)
! 		      (t ffap-machine-p-known))))
        (cond
         ((eq strategy 'accept) 'accept)
*************** A string means the machine exists, but d
*** 529,534 ****
         (t
  	(or quiet
! 	    (if (stringp domain-name)
! 		(message "Pinging %s (%s)..." host domain-name)
  	      (message "Pinging %s ..." host)))
  	(condition-case error
--- 359,364 ----
         (t
  	(or quiet
! 	    (if (stringp what-domain)
! 		(message "Pinging %s (%s)..." host what-domain)
  	      (message "Pinging %s ..." host)))
  	(condition-case error
*************** A string means the machine exists, but d
*** 554,558 ****
  	       (if (equal (nth 2 error) "permission denied")
  		   nil			; host does not exist
! 		 ;; Other errors mean host exists:
  		 (nth 2 error)))
  	      ;; Could be "Unknown service":
--- 384,388 ----
  	       (if (equal (nth 2 error) "permission denied")
  		   nil			; host does not exist
! 		 ;; Other errors mean the host exists:
  		 (nth 2 error)))
  	      ;; Could be "Unknown service":
*************** A string means the machine exists, but d
*** 562,573 ****
    "If FILENAME looks remote, return it \(maybe slightly improved\)."
    ;; (ffap-file-remote-p "/user@foo.bar.com:/pub")
!   ;; (ffap-file-remote-p "/foo.dom://path")
    (or (and ffap-ftp-regexp
  	   (string-match ffap-ftp-regexp filename)
! 	   ;; Convert "/host://path" to "/host:/path", to handle a dieing
  	   ;; practice of advertising ftp paths as "host.dom://path".
  	   (if (string-match "//" filename)
! 	       (concat (substring filename 0 (match-beginning 0))
! 		       (substring filename (1- (match-end 0))))
  	     filename))
        (and ffap-rfs-regexp
--- 392,405 ----
    "If FILENAME looks remote, return it \(maybe slightly improved\)."
    ;; (ffap-file-remote-p "/user@foo.bar.com:/pub")
!   ;; (ffap-file-remote-p "/cssun.mathcs.emory.edu://path")
!   ;; (ffap-file-remote-p "/ffap.el:80")
    (or (and ffap-ftp-regexp
  	   (string-match ffap-ftp-regexp filename)
! 	   ;; Convert "/host.com://path" to "/host:/path", to handle a dieing
  	   ;; practice of advertising ftp paths as "host.dom://path".
  	   (if (string-match "//" filename)
! 	       ;; (replace-match "/" nil nil filename)
! 	       (concat (substring filename 0 (1+ (match-beginning 0)))
! 		       (substring filename (match-end 0)))
  	     filename))
        (and ffap-rfs-regexp
*************** A string means the machine exists, but d
*** 576,589 ****
  
  (defun ffap-machine-at-point nil
!   "Return machine name from around point if it exists, or nil."
!   (let ((mach (ffap-string-at-point "-a-zA-Z0-9." nil ".")))
      (and (ffap-machine-p mach) mach)))
  
  (defun ffap-fixup-machine (mach)
!   ;; Convert a machine into an URL, an ftp path, or nil.
    (cond
     ((not (and ffap-url-regexp (stringp mach))) nil)
     ((string-match "\\`gopher[-.]" mach)	; or "info"?
      (concat "gopher://" mach "/"))
     ((and (string-match "\\`w\\(ww\\|eb\\)[-.]" mach))
      (concat "http://" mach "/"))
--- 408,431 ----
  
  (defun ffap-machine-at-point nil
!   "Return machine name at point if it exists, or nil."
!   (let ((mach (ffap-string-at-point 'machine)))
      (and (ffap-machine-p mach) mach)))
  
+ (defsubst ffap-host-to-path (host)
+   "Convert HOST to something like \"/anonymous@HOST:\".
+ Looks at `ffap-ftp-default-user', returns \"\" for \"localhost\"."
+   (if (equal host "localhost") ""
+     (concat "/"
+ 	    ffap-ftp-default-user (and ffap-ftp-default-user "@")
+ 	    host ":")))
+ 
  (defun ffap-fixup-machine (mach)
!   ;; Convert a hostname into an url, an ftp path, or nil.
    (cond
     ((not (and ffap-url-regexp (stringp mach))) nil)
+    ;; gopher.well.com
     ((string-match "\\`gopher[-.]" mach)	; or "info"?
      (concat "gopher://" mach "/"))
+    ;; www.ncsa.uiuc.edu
     ((and (string-match "\\`w\\(ww\\|eb\\)[-.]" mach))
      (concat "http://" mach "/"))
*************** A string means the machine exists, but d
*** 592,604 ****
     ))
  
- (defun ffap-host-to-path (host)
-   "Convert \"HOST\" to \"/anonymous@HOST:\" (or \"\" for \"localhost\").
- Variable `ffap-ftp-default-user' overrides or suppresses \"anonymous\"."
-   (if (equal host "localhost")
-       ""
-     (if ffap-ftp-default-user
- 	(concat "/" ffap-ftp-default-user "@" host ":")
-       (concat "/" host ":"))))
- 
  (defun ffap-newsgroup-p (string)
    "Return STRING if it looks like a newsgroup name, else nil."
--- 434,437 ----
*************** Variable `ffap-ftp-default-user' overrid
*** 616,620 ****
  	     (and (intern-soft string (symbol-value htb))
  		  (setq ret string htbs nil))
! 	     ;; If we made it this far, GNUS is running, so ignore "heads":
  	     (setq heads nil))
  	 (error nil)))
--- 449,453 ----
  	     (and (intern-soft string (symbol-value htb))
  		  (setq ret string htbs nil))
! 	     ;; If we made it this far, gnus is running, so ignore "heads":
  	     (setq heads nil))
  	 (error nil)))
*************** Variable `ffap-ftp-default-user' overrid
*** 624,638 ****
  		(member head heads)
  		(setq ret string))))
!      ;; Ever any need to modify string as a newsgroup name?
       ret)))
  (defvar ffap-newsgroup-regexp "^[a-z]+\\.[-+a-z_0-9.]+$"
!   "ffap-newsgroup-p quickly rejects strings that do not match this.")
  (defvar ffap-newsgroup-heads		; entirely inadequate
    '("alt" "comp" "gnu" "misc" "news" "sci" "soc" "talk")
!   "Used by ffap-newsgroup-p if GNUS is not running.")
  
! (defun ffap-url-p (string)
!   "If STRING looks like an URL, return it (maybe improved), else nil."
!   ;; Does it look like an URL?  Ignore case.
    (let ((case-fold-search t))
      (and ffap-url-regexp (string-match ffap-url-regexp string)
--- 457,470 ----
  		(member head heads)
  		(setq ret string))))
!      ;; Is there ever a need to modify string as a newsgroup name?
       ret)))
  (defvar ffap-newsgroup-regexp "^[a-z]+\\.[-+a-z_0-9.]+$"
!   "Strings not matching this fail `ffap-newsgroup-p'.")
  (defvar ffap-newsgroup-heads		; entirely inadequate
    '("alt" "comp" "gnu" "misc" "news" "sci" "soc" "talk")
!   "Used by `ffap-newsgroup-p' if gnus is not running.")
  
! (defsubst ffap-url-p (string)
!   "If STRING looks like an url, return it (maybe improved), else nil."
    (let ((case-fold-search t))
      (and ffap-url-regexp (string-match ffap-url-regexp string)
*************** Variable `ffap-ftp-default-user' overrid
*** 640,657 ****
  	 string)))
  
! ;; Broke these two out of ffap-fixup-url, for sake of ffap-url package.
! (defun ffap-url-unwrap-local (url)
!   "Return unwrapped local file URL, or nil.  Ignores ffap-* variables."
    (and (string-match "\\`\\(file\\|ftp\\):/?\\([^/]\\|\\'\\)" url)
         (substring url (1+ (match-end 1)))))
! (defun ffap-url-unwrap-remote (url)
!   "Return unwrapped remote file URL, or nil.  Ignores ffap-* variables."
    (and (string-match "\\`\\(ftp\\|file\\)://\\([^:/]+\\):?\\(/.*\\)" url)
         (concat
  	(ffap-host-to-path (substring url (match-beginning 2) (match-end 2)))
  	(substring url (match-beginning 3) (match-end 3)))))
  
  (defun ffap-fixup-url (url)
!   "Given URL, clean it up and return it.  May become a file name."
    (cond
     ((not (stringp url)) nil)
--- 472,490 ----
  	 string)))
  
! ;; Broke these out of ffap-fixup-url, for use of ffap-url package.
! (defsubst ffap-url-unwrap-local (url)
!   "Return URL as a local file, or nil.  Ignores `ffap-url-regexp'."
    (and (string-match "\\`\\(file\\|ftp\\):/?\\([^/]\\|\\'\\)" url)
         (substring url (1+ (match-end 1)))))
! (defsubst ffap-url-unwrap-remote (url)
!   "Return URL as a remote file, or nil.  Ignores `ffap-url-regexp'."
    (and (string-match "\\`\\(ftp\\|file\\)://\\([^:/]+\\):?\\(/.*\\)" url)
         (concat
  	(ffap-host-to-path (substring url (match-beginning 2) (match-end 2)))
  	(substring url (match-beginning 3) (match-end 3)))))
+ ;; Test: (ffap-url-unwrap-remote "ftp://foo.com/bar.boz")
  
  (defun ffap-fixup-url (url)
!   "Clean up URL and return it, maybe as a file name."
    (cond
     ((not (stringp url)) nil)
*************** Variable `ffap-ftp-default-user' overrid
*** 671,684 ****
  ;; Search actions depending on the major-mode or extensions of the
  ;; current name.  Note all the little defun's could be broken out, at
! ;; some loss of locality.  I have had a vote for eliminating this
! ;; from ffap (featuritis)
  
  ;; First, some helpers for functions in `ffap-alist':
  
  (defun ffap-list-env (env &optional empty)
    ;; Replace this with parse-colon-path (lisp/files.el)?
!   "Directory list parsed from \":\"-separated ENVinronment variable.
  Optional EMPTY is default if (getenv ENV) is undefined, and is also
! substituted for the first empty-string component, if there is one."
    ;; Derived from psg-list-env in RHOGEE's ff-paths and
    ;; bib-cite packages.  The `empty' argument is intended to mimic
--- 504,519 ----
  ;; Search actions depending on the major-mode or extensions of the
  ;; current name.  Note all the little defun's could be broken out, at
! ;; some loss of locality.  A good example of featuritis.
  
  ;; First, some helpers for functions in `ffap-alist':
  
+ (defvar path-separator ":")		; for XEmacs 19.13
+ 
  (defun ffap-list-env (env &optional empty)
    ;; Replace this with parse-colon-path (lisp/files.el)?
!   "Directory list parsed from path envinronment variable ENV.
  Optional EMPTY is default if (getenv ENV) is undefined, and is also
! substituted for the first empty-string component, if there is one.
! Uses `path-separator' to separate the path into directories."
    ;; Derived from psg-list-env in RHOGEE's ff-paths and
    ;; bib-cite packages.  The `empty' argument is intended to mimic
*************** substituted for the first empty-string c
*** 687,692 ****
    (if (or empty (getenv env))		; should return something
        (let ((start 0) match dir ret)
! 	(setq env (concat (getenv env) ":")) ; note undefined --> ":"
! 	(while (setq match (string-match ":" env start))
  	  (setq dir (substring env start match) start (1+ match))
  	  ;;(and (file-directory-p dir) (not (member dir ret)) ...)
--- 522,527 ----
    (if (or empty (getenv env))		; should return something
        (let ((start 0) match dir ret)
! 	(setq env (concat (getenv env) path-separator))
! 	(while (setq match (string-match path-separator env start))
  	  (setq dir (substring env start match) start (1+ match))
  	  ;;(and (file-directory-p dir) (not (member dir ret)) ...)
*************** substituted for the first empty-string c
*** 700,707 ****
  
  (defun ffap-reduce-path (path)
!   "Remove duplicates or non-dirs from PATH."
    (let (ret tem)
      (while path
        (setq tem path path (cdr path))
        (or (member (car tem) ret)
  	  (not (file-directory-p (car tem)))
--- 535,543 ----
  
  (defun ffap-reduce-path (path)
!   "Remove duplicates and non-directories from PATH list."
    (let (ret tem)
      (while path
        (setq tem path path (cdr path))
+       (if (equal (car tem) ".") (setcar tem ""))
        (or (member (car tem) ret)
  	  (not (file-directory-p (car tem)))
*************** substituted for the first empty-string c
*** 725,743 ****
  
  (defvar ffap-locate-jka-suffixes t
!   "List of compression suffixes that ffap-locate-file tries.
! If not a list, it will be initialized by ffap-locate-file,
! and it will become nil unless you are using jka-compr.
! You might set this to nil or a list like '(\".gz\" \".z\" \".Z\").")
  
  (defun ffap-locate-file (file &optional nosuffix path)
!   ;; If this package is only working in v19 now, maybe should
!   ;; replace this with a quiet version of locate-library.
!   "A generic path-searching function, defaults mimic `load' behavior.
! Returns path of an existing FILE that (load FILE) would load, or nil.
! Optional second argument NOSUFFIX, if t, is like the fourth argument
! for load, i.e. don't try adding suffixes \".elc\" and \".el\".
! If a list, it is taken as a list of suffixes to try instead.
! Optional third argument PATH specifies a different search path, it
! defaults to `load-path'."
    (or path (setq path load-path))
    (if (file-name-absolute-p file)
--- 561,576 ----
  
  (defvar ffap-locate-jka-suffixes t
!   "List of compression suffixes tried by `ffap-locate-file'.
! If not a list, it is initialized by `ffap-locate-file',
! and it becomes nil unless you are using jka-compr.
! Typical values are nil or '(\".gz\" \".z\" \".Z\").")
  
  (defun ffap-locate-file (file &optional nosuffix path)
!   "A generic path-searching function, mimics `load' by default.
! Returns path to file that \(load FILE\) would load, or nil.
! Optional NOSUFFIX, if nil or t, is like the fourth argument
! for load: whether to try the suffixes (\".elc\" \".el\" \"\").
! If a nonempty list, it is a list of suffixes to try instead.
! Optional PATH is a list of directories instead of `load-path'."
    (or path (setq path load-path))
    (if (file-name-absolute-p file)
*************** defaults to `load-path'."
*** 749,757 ****
  	  (nosuffix '(""))
  	  (t '(".elc" ".el" "")))))
!     ;; Compensate for modern (19.28) jka-compr, that no longer searches
!     ;; for foo.gz when you asked for foo:
      (or (listp ffap-locate-jka-suffixes)
  	(setq ffap-locate-jka-suffixes
! 	      (and (featurep 'jka-compr) ; an early version was jka-compr19
  		   (not (featurep 'jka-aux))
  		   jka-compr-file-name-handler-entry
--- 582,589 ----
  	  (nosuffix '(""))
  	  (t '(".elc" ".el" "")))))
!     ;; Modern (>19.27) jka-compr doesn't try foo.gz when you want foo.
      (or (listp ffap-locate-jka-suffixes)
  	(setq ffap-locate-jka-suffixes
! 	      (and (featurep 'jka-compr)
  		   (not (featurep 'jka-aux))
  		   jka-compr-file-name-handler-entry
*************** defaults to `load-path'."
*** 759,765 ****
  			 (car jka-compr-file-name-handler-entry)
  			 "foo"))
! 		   ;; Hard to do cleverly across various jka-compr versions:
  		   '(".gz" ".Z"))))
!     (if ffap-locate-jka-suffixes
  	(setq suffixes-to-try
  	      (apply
--- 591,597 ----
  			 (car jka-compr-file-name-handler-entry)
  			 "foo"))
! 		   ;; Hard to do this cleverly across jka-compr versions:
  		   '(".gz" ".Z"))))
!     (if ffap-locate-jka-suffixes	; so nil behaves like '("")
  	(setq suffixes-to-try
  	      (apply
*************** defaults to `load-path'."
*** 816,820 ****
     (cons 'c-mode
  	 (progn
! 	   ;; Need better default here:
  	   (defvar ffap-c-path '("/usr/include" "/usr/local/include"))
  	   (defun ffap-c-mode (name)
--- 648,652 ----
     (cons 'c-mode
  	 (progn
! 	   ;; Need better defaults here!
  	   (defvar ffap-c-path '("/usr/include" "/usr/local/include"))
  	   (defun ffap-c-mode (name)
*************** defaults to `load-path'."
*** 827,851 ****
  	 (progn
  	   (defvar ffap-tex-path
! 	     (ffap-reduce-path
! 	      (append
! 	       (list ".")
! 	       (ffap-list-env "TEXINPUTS")
!  	       ;; (ffap-list-env "BIBINPUTS")
! 	       (ffap-add-subdirs
! 		(ffap-list-env "TEXINPUTS_SUBDIR"
! 			       (ffap-soft-value
! 				"TeX-macro-global"
! 				'("/usr/local/lib/tex/macros"
! 				  "/usr/local/lib/tex/inputs")
! 				)))))
! 	     "*Where ffap-tex-mode looks for tex files.")
  	   (defun ffap-tex-mode (name)
  	     (ffap-locate-file name '(".tex" "") ffap-tex-path))))
     (cons 'latex-mode
  	   (defun ffap-latex-mode (name)
  	     ;; Any real need for "" here?
! 	     (ffap-locate-file name '(".sty" ".tex" "") ffap-tex-path)))
!    (cons "\\.\\(tex\\|sty\\|doc\\)\\'"
  	 (defun ffap-tex (name)
  	   (ffap-locate-file name t ffap-tex-path)))
     (cons "\\.bib\\'"
--- 659,694 ----
  	 (progn
  	   (defvar ffap-tex-path
! 	     t				; delayed initialization
! 	     "Path where `ffap-tex-mode' looks for tex files.
! If t, `ffap-tex-init' will initialize this when needed.")
! 	   (defun ffap-tex-init nil
! 	     ;; Compute ffap-tex-path if it is now t.
! 	     (and (eq t ffap-tex-path)
! 		  (message "Initializing ffap-tex-path ...")
! 		  (setq ffap-tex-path
! 			(ffap-reduce-path
! 			 (append
! 			  (list ".")
! 			  (ffap-list-env "TEXINPUTS")
! 			  ;; (ffap-list-env "BIBINPUTS")
! 			  (ffap-add-subdirs
! 			   (ffap-list-env "TEXINPUTS_SUBDIR"
! 					  (ffap-soft-value
! 					   "TeX-macro-global"
! 					   '("/usr/local/lib/tex/macros"
! 					     "/usr/local/lib/tex/inputs")
! 					   ))))))))
  	   (defun ffap-tex-mode (name)
+ 	     (ffap-tex-init)
  	     (ffap-locate-file name '(".tex" "") ffap-tex-path))))
     (cons 'latex-mode
  	   (defun ffap-latex-mode (name)
+ 	     (ffap-tex-init)
  	     ;; Any real need for "" here?
! 	     (ffap-locate-file name '(".cls" ".sty" ".tex" "")
! 			       ffap-tex-path)))
!    (cons "\\.\\(tex\\|sty\\|doc\\|cls\\)\\'"
  	 (defun ffap-tex (name)
+ 	   (ffap-tex-init)
  	   (ffap-locate-file name t ffap-tex-path)))
     (cons "\\.bib\\'"
*************** defaults to `load-path'."
*** 889,902 ****
  	     (format ffap-rfc-path
  		     (substring name (match-beginning 1) (match-end 1))))))
     )
!   "Alist of \(KEY . FUNCTION\), applied to text around point.
  
- If ffap-file-at-point has a string NAME (maybe \"\") which is not an
- existing filename, it looks for pairs with a matching KEY:
-   * if KEY is a symbol, it should equal `major-mode'.
-   * if KEY is a string, it should match NAME as a regular expression.
- If KEY matches, ffap-file-at-point calls \(FUNCTION NAME\).
- FUNCTION should return a file, url, or nil \(nil means keep looking
- for more KEY matches\).  Note URL's are ok despite the function name.")
  (put 'ffap-alist 'risky-local-variable t)
  
--- 732,760 ----
  	     (format ffap-rfc-path
  		     (substring name (match-beginning 1) (match-end 1))))))
+    (cons "\\`[^/]*\\'"
+ 	 (defun ffap-dired (name)
+ 	   (let ((pt (point)) dir try)
+ 	     (save-excursion
+ 	       (and (progn
+ 		      (beginning-of-line)
+ 		      (looking-at " *[-d]r[-w][-x][-r][-w][-x][-r][-w][-x] "))
+ 		    (re-search-backward "^ *$" nil t)
+ 		    (re-search-forward "^ *\\([^ \t\n:]*\\):\n *total " pt t)
+ 		    (file-exists-p
+ 		     (setq try
+ 			   (expand-file-name
+ 			    name
+ 			    (buffer-substring
+ 			     (match-beginning 1) (match-end 1)))))
+ 		    try)))))
     )
!   "Alist of \(KEY . FUNCTION\) pairs parsed by `ffap-file-at-point'.
! If string NAME at point (maybe \"\") is not a file or url, these pairs
! specify actions to try creating such a string.  A pair matches if either
!   KEY is a symbol, and it equals `major-mode', or
!   KEY is a string, it should matches NAME as a regexp.
! On a match, \(FUNCTION NAME\) is called and should return a file, an
! url, or nil. If nil, search the alist for further matches.")
  
  (put 'ffap-alist 'risky-local-variable t)
  
*************** for more KEY matches\).  Note URL's are 
*** 906,958 ****
  (defvar ffap-string-at-point-mode-alist
    '(
      ;; Slightly controversial decisions:
      ;; * strip trailing "@" and ":"
      ;; * no commas (good for latex)
!     (t "--:$+<>@-Z_a-z~" "<@" "@>;.,!?:")
!     (math-mode ",-:$+<>@-Z_a-z~`" "<" "@>;.,!?`:") ; allow backquote
!     ;; Note: you are better off using "C-c C-c" in compilation buffers:
!     ;; Maybe handle "$HOME", or "$(HOME)/bin/foo" in makefile-mode?
      )
!   "Alist of \(MODE CHARS BEG END\), where MODE is a major-mode or t.
! The data are arguments to ffap-string-at-point, used to guess the
! filename at point.  The `t' entry is the default.")
  
  (defvar ffap-string-at-point-region '(1 1)
!   "List (BEG END), last region returned by ffap-string-at-point.")
  
  (defvar ffap-string-at-point nil
    ;; Added at suggestion of RHOGEE (for ff-paths), 7/24/95.
!   "Last string returned by ffap-string-at-point.")
! (defun ffap-string-at-point (&optional chars begpunct endpunct)
!   "Return maximal string of CHARS (a string) around point.
! Optional BEGPUNCT chars before point are stripped from the beginning;
! Optional ENDPUNCT chars after point are stripped from the end.
! Without arguments, uses `ffap-string-at-point-mode-alist'.
! Also sets `ffap-string-at-point' and `ffap-string-at-point-region'."
!   (if chars
!       (let* ((pt (point))
! 	     (str
! 	      (buffer-substring
! 	       (save-excursion
! 		 (skip-chars-backward chars)
! 		 (and begpunct (skip-chars-forward begpunct pt))
! 		 (setcar ffap-string-at-point-region (point)))
! 	       (save-excursion
! 		 (skip-chars-forward chars)
! 		 (and endpunct (skip-chars-backward endpunct pt))
! 		 (setcar (cdr ffap-string-at-point-region) (point))))))
! 	(set-text-properties 0 (length str) nil str)
! 	(setq ffap-string-at-point str))
!     ;; Get default args from `ffap-string-at-point-mode-alist'
!     (apply 'ffap-string-at-point
! 	   (cdr (or (assq major-mode ffap-string-at-point-mode-alist)
! 		    (assq t ffap-string-at-point-mode-alist)
! 		    ;; avoid infinite loop!
! 		    (error "ffap-string-at-point: bad alist")
! 		    )))))
  
  (defun ffap-string-around nil
    ;; Sometimes useful to decide how to treat a string.
!   "Return string of two characters around last ffap-string-at-point."
    (save-excursion
      (format "%c%c"
--- 764,824 ----
  (defvar ffap-string-at-point-mode-alist
    '(
+     ;; The default, used when the `major-mode' is not found.
      ;; Slightly controversial decisions:
      ;; * strip trailing "@" and ":"
      ;; * no commas (good for latex)
!     (file "--:$+<>@-Z_a-z~" "<@" "@>;.,!?:")
!     ;; An url, or maybe a email/news message-id:
!     (url "--:?$+@-Z_a-z~#,%" "^A-Za-z0-9" ":;.,!?")
!     ;; Find a string that does *not* contain a colon:
!     (nocolon "--9$+<>@-Z_a-z~" "<@" "@>;.,!?")
!     ;; A machine:
!     (machine "-a-zA-Z0-9." "" ".")
!     ;; Mathematica paths: allow backquotes
!     (math-mode ",-:$+<>@-Z_a-z~`" "<" "@>;.,!?`:")
      )
!   "Alist of \(MODE CHARS BEG END\), where MODE is a symbol,
! possibly a `major-mode' or some symbol internal to ffap
! \(such as 'file, 'url, 'machine, and 'nocolon\).
! `ffap-string-at-point' uses the data fields as follows:
! 1. find a maximal string of CHARS around point,
! 2. strip BEG chars before point from the beginning,
! 3. Strip END chars after point from the end.")
  
  (defvar ffap-string-at-point-region '(1 1)
!   "List (BEG END), last region returned by `ffap-string-at-point'.")
  
  (defvar ffap-string-at-point nil
    ;; Added at suggestion of RHOGEE (for ff-paths), 7/24/95.
!   "Last string returned by `ffap-string-at-point'.")
! 
! (defun ffap-string-at-point (&optional mode)
!   "Return a string of characters from around point.
! MODE (defaults to `major-mode') is a symbol used to lookup string
! syntax parameters in `ffap-string-at-point-mode-alist'.
! If MODE is not found, we fall back on the symbol 'file.
! Sets `ffap-string-at-point' and `ffap-string-at-point-region'."
!   (let* ((args
! 	  (cdr
! 	   (or (assq (or mode major-mode) ffap-string-at-point-mode-alist)
! 	       (assq 'file ffap-string-at-point-mode-alist))))
! 	 (pt (point))
! 	 (str
! 	  (buffer-substring
! 	   (save-excursion
! 	     (skip-chars-backward (car args))
! 	     (skip-chars-forward (nth 1 args) pt)
! 	     (setcar ffap-string-at-point-region (point)))
! 	   (save-excursion
! 	     (skip-chars-forward (car args))
! 	     (skip-chars-backward (nth 2 args) pt)
! 	     (setcar (cdr ffap-string-at-point-region) (point))))))
!     (or ffap-xemacs (set-text-properties 0 (length str) nil str))
!     (setq ffap-string-at-point str)))
  
  (defun ffap-string-around nil
    ;; Sometimes useful to decide how to treat a string.
!   "Return string of two chars around last `ffap-string-at-point'.
! Assumes the buffer has not changed."
    (save-excursion
      (format "%c%c"
*************** Also sets `ffap-string-at-point' and `ff
*** 965,974 ****
  	    )))
  
  (defun ffap-url-at-point nil
!   "Return URL from around point if it exists, or nil."
!   ;; Could use url-get-url-at-point instead ... how do they compare?
!   ;; Both handle "URL:", ignore non-relative links, trim punctuation.
!   ;; The other will actually look back if point is in whitespace, but
!   ;; I would rather ffap be non-rabid in such situations.
    (and
     ffap-url-regexp
--- 831,851 ----
  	    )))
  
+ (defun ffap-copy-string-as-kill (&optional mode)
+   ;; Requested by MCOOK.  Useful?
+   "Call `ffap-string-at-point', and copy result to `kill-ring'."
+   (interactive)
+   (let ((str (ffap-string-at-point mode)))
+     (if (equal "" str)
+ 	(message "No string found around point.")
+       (kill-new str)
+       ;; Older: (apply 'copy-region-as-kill ffap-string-at-point-region)
+       (message "Copied to kill ring: %s"  str))))
+ 
  (defun ffap-url-at-point nil
!   "Return url from around point if it exists, or nil."
!   ;; Could use w3's url-get-url-at-point instead.  Both handle "URL:",
!   ;; ignore non-relative links, trim punctuation.  The other will
!   ;; actually look back if point is in whitespace, but I would rather
!   ;; ffap be non-rabid in such situations.
    (and
     ffap-url-regexp
*************** Also sets `ffap-string-at-point' and `ff
*** 982,988 ****
  	   (nth 2 tem)))
      ;; Is there a reason not to strip trailing colon?
!     (let ((name (ffap-string-at-point
! 		 ;; Allow leading digits for email/news id's:
! 		 "--:?$+@-Z_a-z~#,%" "^A-Za-z0-9" ":;.,!?")))
        ;; (case-fold-search t), why?
        (cond
--- 859,863 ----
  	   (nth 2 tem)))
      ;; Is there a reason not to strip trailing colon?
!     (let ((name (ffap-string-at-point 'url)))
        ;; (case-fold-search t), why?
        (cond
*************** Also sets `ffap-string-at-point' and `ff
*** 991,1000 ****
  	     ;; "foo@bar": could be "mailto" or "news" (a Message-ID).
  	     ;; If not adorned with "<>", it must be "mailto".
! 	     ;;	Otherwise could be either, so consult `ffap-foo@bar-prefix'.
  	     (let ((prefix (if (and (equal (ffap-string-around) "<>")
  				    ;; At least a couple of odd characters:
  				    (string-match "[$.0-9].*[$.0-9].*@" name))
  			       ;; Could be news:
! 			       ffap-foo@bar-prefix
  			     "mailto")))
  	       (and prefix (setq name (concat prefix ":" name))))))
--- 866,875 ----
  	     ;; "foo@bar": could be "mailto" or "news" (a Message-ID).
  	     ;; If not adorned with "<>", it must be "mailto".
! 	     ;;	Otherwise could be either, so consult `ffap-foo-at-bar-prefix'.
  	     (let ((prefix (if (and (equal (ffap-string-around) "<>")
  				    ;; At least a couple of odd characters:
  				    (string-match "[$.0-9].*[$.0-9].*@" name))
  			       ;; Could be news:
! 			       ffap-foo-at-bar-prefix
  			     "mailto")))
  	       (and prefix (setq name (concat prefix ":" name))))))
*************** Also sets `ffap-string-at-point' and `ff
*** 1013,1022 ****
    "^.*\\<\\(Type\\|Name\\|Path\\|Host\\|Port\\) *= *\\(.*\\) *$"
    "Regexp Matching a line in a gopher bookmark (maybe indented).
! Two subexpressions are the KEY and VALUE.")
  
  (defun ffap-gopher-at-point nil
    "If point is inside a gopher bookmark block, return its url."
!   ;; We could use gopher-parse-bookmark from gopher.el, but it is not
!   ;; so robust, and w3 users are better off without gopher.el anyway.
    (save-excursion
      (beginning-of-line)
--- 888,896 ----
    "^.*\\<\\(Type\\|Name\\|Path\\|Host\\|Port\\) *= *\\(.*\\) *$"
    "Regexp Matching a line in a gopher bookmark (maybe indented).
! The two subexpressions are the KEY and VALUE.")
  
  (defun ffap-gopher-at-point nil
    "If point is inside a gopher bookmark block, return its url."
!   ;; `gopher-parse-bookmark' from gopher.el is not so robust
    (save-excursion
      (beginning-of-line)
*************** Two subexpressions are the KEY and VALUE
*** 1049,1056 ****
    (and
     ffap-ftp-regexp
!    ;; Note: by now, we know it is not an URL.
     ;; Icky regexp avoids: default: 123: foo::bar cs:pub
     ;; It does match on: mic@cs: cs:/pub mathcs.emory.edu: (point at end)
-    ;; Todo: handle foo.com://path
     "\\`\\([^:@]+@[^:@]+:\\|[^@.:]+\\.[^@:]+:\\|[^:]+:[~/]\\)\\([^:]\\|\\'\\)")
    "Strings matching this are coerced to ftp paths by ffap.
--- 923,929 ----
    (and
     ffap-ftp-regexp
!    ;; Note: by now, we know it is not an url.
     ;; Icky regexp avoids: default: 123: foo::bar cs:pub
     ;; It does match on: mic@cs: cs:/pub mathcs.emory.edu: (point at end)
     "\\`\\([^:@]+@[^:@]+:\\|[^@.:]+\\.[^@:]+:\\|[^:]+:[~/]\\)\\([^:]\\|\\'\\)")
    "Strings matching this are coerced to ftp paths by ffap.
*************** That is, ffap just prepends \"/\".  Set 
*** 1061,1075 ****
  Existence test is skipped for names that look remote.
  If the filename is not obvious, it also tries `ffap-alist',
! which may actually result in an URL rather than a filename."
!   ;; Note: this function does not need to look for URL's, just
    ;; filenames.  On the other hand, it is responsible for converting
!   ;; a pseudo-URL "site.dom://path" to an ftp path "/site.dom:/path"
    (let* ((case-fold-search t)		; url prefixes are case-insensitive
  	 (data (match-data))
! 	 (string (ffap-string-at-point)) ; use its mode-alist
  	 (name
! 	  (condition-case nil
! 	      (substitute-in-file-name string)
! 	    (error string)))
  	 (abs (file-name-absolute-p name))
  	 (default-directory default-directory))
--- 934,950 ----
  Existence test is skipped for names that look remote.
  If the filename is not obvious, it also tries `ffap-alist',
! which may actually result in an url rather than a filename."
!   ;; Note: this function does not need to look for url's, just
    ;; filenames.  On the other hand, it is responsible for converting
!   ;; a pseudo-url "site.com://path" to an ftp path
    (let* ((case-fold-search t)		; url prefixes are case-insensitive
  	 (data (match-data))
! 	 (string (ffap-string-at-point)) ; uses mode alist
  	 (name
! 	  (or (condition-case nil
! 		  (and (not (string-match "//" string)) ; foo.com://bar
! 		       (substitute-in-file-name string))
! 		(error nil))
! 	      string))
  	 (abs (file-name-absolute-p name))
  	 (default-directory default-directory))
*************** which may actually result in an URL rath
*** 1091,1094 ****
--- 966,973 ----
  	 ;; Ok, not remote, try the existence test even if it is absolute:
  	 ((and abs (ffap-file-exists-string name)))
+ 	 ;; If it contains a colon, get rid of it (and return if exists)
+ 	 ((and (string-match path-separator name)
+ 	       (setq name (ffap-string-at-point 'nocolon))
+ 	       (ffap-file-exists-string name)))
  	 ;; File does not exist, try the alist:
  	 ((let ((alist ffap-alist) tem try case-fold-search)
*************** which may actually result in an URL rath
*** 1134,1174 ****
  ;;; ffap-read-file-or-url:
  ;;
! ;; Want to read filenames with completion as in read-file-name, but
! ;; also allow URL's which read-file-name-internal would truncate at
! ;; the "//" string.  Solution here is to replace read-file-name-internal
! ;; with another function that does not attempt to complete url's.
! 
! ;; We implement a pretty clean completion semantics to work with
! ;; packages like complete.el and exit-minibuffer.el.  Even for
! ;; complete.el (v19.22), we still need to make a small patch (it has a
! ;; hardwired list of `minibuffer-completion-table' values which it
! ;; considers to deal with filenames, this ought to be a variable).
  
  (defun ffap-read-file-or-url (prompt guess)
!   "Read a file or url from minibuffer, with PROMPT and initial GUESS."
    (or guess (setq guess default-directory))
!   (let ((filep (not (ffap-url-p guess))) dir)
      ;; Tricky: guess may have or be a local directory, like "w3/w3.elc"
      ;; or "w3/" or "../el/ffap.el" or "../../../"
!     (if filep
  	(progn
  	  (or (ffap-file-remote-p guess)
  	      (setq guess (abbreviate-file-name (expand-file-name guess))))
  	  (setq dir (file-name-directory guess))))
!     (apply
!      'completing-read
!      prompt
!      'ffap-read-file-or-url-internal
!      dir
!      nil
!      (if (and dir) (cons guess (length dir)) guess)
!      (list 'file-name-history)
!      )))
! 
! (defvar url-global-history-completion-list nil)	; variable in w3/url.el
  
  (defun ffap-read-url-internal (string dir action)
!   ;; Complete URL's from history, always treat given url as acceptable.
!   (let ((hist url-global-history-completion-list))
      (cond
       ((not action)
--- 1013,1051 ----
  ;;; ffap-read-file-or-url:
  ;;
! ;; We want to complete filenames as in read-file-name, but also url's
! ;; which read-file-name-internal would truncate at the "//" string.
! ;; The solution here is to replace read-file-name-internal with
! ;; `ffap-read-file-or-url-internal', which checks the minibuffer
! ;; contents before attempting to complete filenames.
  
  (defun ffap-read-file-or-url (prompt guess)
!   "Read file or url from minibuffer, with PROMPT and initial GUESS."
    (or guess (setq guess default-directory))
!   (let (dir)
      ;; Tricky: guess may have or be a local directory, like "w3/w3.elc"
      ;; or "w3/" or "../el/ffap.el" or "../../../"
!     (or (ffap-url-p guess)
  	(progn
  	  (or (ffap-file-remote-p guess)
  	      (setq guess (abbreviate-file-name (expand-file-name guess))))
  	  (setq dir (file-name-directory guess))))
!     (setq guess
! 	  (completing-read
! 	   prompt
! 	   'ffap-read-file-or-url-internal
! 	   dir
! 	   nil
! 	   (if dir (cons guess (length dir)) guess)
! 	   (list 'file-name-history)
! 	   ))
!     ;; Do file substitution like (interactive "F"), suggested by MCOOK.
!     (or (ffap-url-p guess) (setq guess (substitute-in-file-name guess)))
!     ;; Should not do it on url's, where $ is a common (VMS?) character.
!     ;; Note: upcoming url.el package ought to handle this automatically.
!     guess))
  
  (defun ffap-read-url-internal (string dir action)
!   "Complete url's from history, treating given string as valid."
!   (let ((hist (ffap-soft-value "url-global-history-hash-table")))
      (cond
       ((not action)
*************** which may actually result in an URL rath
*** 1176,1181 ****
       ((eq action t)
        (or (all-completions string hist) (list string)))
!      ;; lambda?
!      (t string))))
  
  (defun ffap-read-file-or-url-internal (string dir action)
--- 1053,1059 ----
       ((eq action t)
        (or (all-completions string hist) (list string)))
!      ;; action == lambda, documented where?  Tests whether string is a
!      ;; valid "match".  Let us always say yes.
!      (t t))))
  
  (defun ffap-read-file-or-url-internal (string dir action)
*************** which may actually result in an URL rath
*** 1184,1207 ****
      (read-file-name-internal string dir action)))
  
! ;; Unfortunately, for complete.el to work correctly, we need to vary
! ;; the value it sees of minibuffer-completion-table, depending on the
! ;; current minibuffer contents!  It would be nice if it were written a
! ;; little more easily.  I consider this a bug in complete.el, since
! ;; the builtin emacs functions do not have this problem.
  (and
   (featurep 'complete)
!  (require 'advice)
!  (defadvice PC-do-completion (around ffap-fix act)
!    "Work with ffap.el."
!    (let ((minibuffer-completion-table minibuffer-completion-table)
! 	 ;; (minibuffer-completion-predicate minibuffer-completion-predicate)
! 	 )
!      (and (eq minibuffer-completion-table 'ffap-read-file-or-url-internal)
! 	  (setq minibuffer-completion-table
! 		(if (ffap-url-p (buffer-string))
! 		    ;; List would work better with icomplete ...
! 		    'ffap-read-url-internal
! 		  'read-file-name-internal)))
!      ad-do-it)))
  
  
--- 1062,1096 ----
      (read-file-name-internal string dir action)))
  
! ;; The rest of this page is just to work with package complete.el.
! ;; This code assumes that you load ffap.el after complete.el.
! ;;
! ;; We must inform complete about whether our completion function
! ;; will do filename style completion.  For earlier versions of
! ;; complete.el, this requires a defadvice.  For recent versions
! ;; there may be a special variable for this purpose.
! 
! (defun ffap-complete-as-file-p nil
!   ;; Will `minibuffer-completion-table' complete the minibuffer
!   ;; contents as a filename?  Assumes the minibuffer is current.
!   ;; Note: t and non-nil mean somewhat different reasons.
!   (if (eq minibuffer-completion-table 'ffap-read-file-or-url-internal)
!       (not (ffap-url-p (buffer-string))) ; t
!     (memq minibuffer-completion-table
! 	  '(read-file-name-internal read-directory-name-internal)) ; list
!     ))
! 
  (and
   (featurep 'complete)
!  (if (boundp 'PC-completion-as-file-name-predicate)
!      ;; modern version of complete.el, just set the variable:
!      (setq PC-completion-as-file-name-predicate 'ffap-complete-as-file-p)
!    (require 'advice)
!    (defadvice PC-do-completion (around ffap-fix act)
!      "Work with ffap."
!      (let ((minibuffer-completion-table
! 	    (if (eq t (ffap-complete-as-file-p))
! 		'read-file-name-internal
! 	      minibuffer-completion-table)))
!        ad-do-it))))
  
  
*************** which may actually result in an URL rath
*** 1213,1241 ****
    "If non-nil, ffap highlights the current buffer substring.")
  
! (defvar ffap-overlay nil "Overlay used by ffap-highlight.")
  
  (defun ffap-highlight (&optional remove)
!   "If `ffap-highlight' is set, highlight the guess in the buffer.
! That is, the last buffer substring found by ffap-string-at-point.
  Optional argument REMOVE means to remove any such highlighting.
! Uses the face `ffap' if it is defined, else `highlight'."
    (cond
!    (remove (and ffap-overlay (delete-overlay ffap-overlay)))
     ((not ffap-highlight) nil)
!    (ffap-overlay
!     (move-overlay ffap-overlay
  		  (car ffap-string-at-point-region)
  		  (nth 1 ffap-string-at-point-region)
  		  (current-buffer)))
     (t
!     (setq ffap-overlay (apply 'make-overlay ffap-string-at-point-region))
!     (overlay-put ffap-overlay 'face
  		 (if (internal-find-face 'ffap nil)
  		     'ffap 'highlight)))))
  
  ;;; The big enchilada:
  
  (defun ffap-guesser nil
!   "Return file or URL or nil, guessed from text around point."
    (or (and ffap-url-regexp
  	   (ffap-fixup-url (or (ffap-url-at-point)
--- 1102,1131 ----
    "If non-nil, ffap highlights the current buffer substring.")
  
! (defvar ffap-highlight-overlay nil "Overlay used by `ffap-highlight'.")
  
  (defun ffap-highlight (&optional remove)
!   "If `ffap-highlight' is set, highlight the guess in this buffer.
! That is, the last buffer substring found by `ffap-string-at-point'.
  Optional argument REMOVE means to remove any such highlighting.
! Uses the face `ffap' if it is defined, or else `highlight'."
    (cond
!    (remove (and ffap-highlight-overlay (delete-overlay ffap-highlight-overlay)))
     ((not ffap-highlight) nil)
!    (ffap-highlight-overlay
!     (move-overlay ffap-highlight-overlay
  		  (car ffap-string-at-point-region)
  		  (nth 1 ffap-string-at-point-region)
  		  (current-buffer)))
     (t
!     (setq ffap-highlight-overlay (apply 'make-overlay ffap-string-at-point-region))
!     (overlay-put ffap-highlight-overlay 'face
  		 (if (internal-find-face 'ffap nil)
  		     'ffap 'highlight)))))
+ 
  
  ;;; The big enchilada:
  
  (defun ffap-guesser nil
!   "Return file or url or nil, guessed from text around point."
    (or (and ffap-url-regexp
  	   (ffap-fixup-url (or (ffap-url-at-point)
*************** Uses the face `ffap' if it is defined, e
*** 1246,1250 ****
  (defun ffap-prompter (&optional guess)
    ;; Does guess and prompt step for find-file-at-point.
!   ;; Extra complication just to do the temporary highlighting.
    (unwind-protect
        (ffap-read-file-or-url
--- 1136,1140 ----
  (defun ffap-prompter (&optional guess)
    ;; Does guess and prompt step for find-file-at-point.
!   ;; Extra complication for the temporary highlighting.
    (unwind-protect
        (ffap-read-file-or-url
*************** Uses the face `ffap' if it is defined, e
*** 1252,1256 ****
         (prog1
  	   (setq guess (or guess (ffap-guesser)))
! 	 (and guess (ffap-highlight))))
      (ffap-highlight t)))
  
--- 1142,1147 ----
         (prog1
  	   (setq guess (or guess (ffap-guesser)))
! 	 (and guess (ffap-highlight))
! 	 ))
      (ffap-highlight t)))
  
*************** Uses the face `ffap' if it is defined, e
*** 1259,1267 ****
    "Find FILENAME (or url), guessing default from text around point.
  If `ffap-dired-wildcards' is set, wildcard patterns are passed to dired.
! See also the functions ffap-file-at-point, ffap-url-at-point.
  With a prefix, this command behaves *exactly* like `ffap-file-finder'.
  If `ffap-require-prefix' is set, the prefix meaning is reversed.
  
! See ftp://ftp.mathcs.emory.edu/pub/mic/emacs/ for most recent version."
    (interactive)
    (if (and (interactive-p)
--- 1150,1158 ----
    "Find FILENAME (or url), guessing default from text around point.
  If `ffap-dired-wildcards' is set, wildcard patterns are passed to dired.
! See also the functions `ffap-file-at-point', `ffap-url-at-point'.
  With a prefix, this command behaves *exactly* like `ffap-file-finder'.
  If `ffap-require-prefix' is set, the prefix meaning is reversed.
  
! See <ftp://ftp.mathcs.emory.edu/pub/mic/emacs/> for latest version."
    (interactive)
    (if (and (interactive-p)
*************** See ftp://ftp.mathcs.emory.edu/pub/mic/e
*** 1269,1279 ****
  	     current-prefix-arg))
        ;; Do exactly the ffap-file-finder command, even the prompting:
!       (call-interactively ffap-file-finder)
      (or filename (setq filename (ffap-prompter)))
      (cond
       ((ffap-url-p filename)
!       (funcall ffap-url-fetcher filename))
       ;; This junk more properly belongs in a modified ffap-file-finder:
!      ((and ffap-dired-wildcards (string-match ffap-dired-wildcards filename))
        (dired filename))
       ((or (not ffap-newfile-prompt)
--- 1160,1173 ----
  	     current-prefix-arg))
        ;; Do exactly the ffap-file-finder command, even the prompting:
!       (let (current-prefix-arg)		; we already interpreted it
! 	(call-interactively ffap-file-finder))
      (or filename (setq filename (ffap-prompter)))
      (cond
       ((ffap-url-p filename)
!       (let (current-prefix-arg)		; w3 2.3.25 bug, reported by KPC
! 	(funcall ffap-url-fetcher filename)))
       ;; This junk more properly belongs in a modified ffap-file-finder:
!      ((and ffap-dired-wildcards
! 	   (string-match ffap-dired-wildcards filename))
        (dired filename))
       ((or (not ffap-newfile-prompt)
*************** See ftp://ftp.mathcs.emory.edu/pub/mic/e
*** 1289,1293 ****
  
  ;; M-x shortcut:
! (fset 'ffap 'find-file-at-point)
  
  
--- 1183,1188 ----
  
  ;; M-x shortcut:
! ;;###autoload
! (defalias 'ffap 'find-file-at-point)
  
  
*************** See ftp://ftp.mathcs.emory.edu/pub/mic/e
*** 1298,1316 ****
  
  (defvar ffap-menu-regexp nil
!   "*If non-nil, overrides `ffap-next-regexp' during ffap-menu.
  Make this more restrictive for faster menu building.
  For example, try \":/\" for url (and some ftp) references.")
  
  (defvar ffap-menu-alist nil
!   "Buffer local menu of files and urls cached by ffap-menu.")
  (make-variable-buffer-local 'ffap-menu-alist)
  
  ;;;###autoload
  (defun ffap-menu (&optional rescan)
!   "Puts up a menu of files and urls mentioned in the buffer.
! Sets mark, jumps to choice, and tries to fetch it.
! Menu is cached in `ffap-menu-alist', but will always be rebuilt
! with the optional RESCAN argument (a prefix interactively).
! Searches buffer with `ffap-menu-regexp' (see `ffap-next-regexp')."
    (interactive "P")
    ;; (require 'imenu) -- no longer used, but roughly emulated
--- 1193,1221 ----
  
  (defvar ffap-menu-regexp nil
!   "*If non-nil, overrides `ffap-next-regexp' during `ffap-menu'.
  Make this more restrictive for faster menu building.
  For example, try \":/\" for url (and some ftp) references.")
  
  (defvar ffap-menu-alist nil
!   "Buffer local cache of menu presented by `ffap-menu'.")
  (make-variable-buffer-local 'ffap-menu-alist)
  
+ (defvar ffap-menu-text-plist
+   (and window-system
+        ;; These choices emulate goto-addr:
+        (if ffap-xemacs
+ 	   '(face bold highlight t) ; keymap <map>
+ 	 '(face bold mouse-face highlight) ; keymap <mousy-map>
+ 	 ))
+   "Text properties applied to strings found by `ffap-menu-rescan'.
+ These properties may be used to fontify the menu references.")
+ 
  ;;;###autoload
  (defun ffap-menu (&optional rescan)
!   "Put up a menu of files and urls mentioned in this buffer.
! Then set mark, jump to choice, and try to fetch it.  The menu is
! cached in `ffap-menu-alist', and rebuilt by `ffap-menu-rescan'.
! The optional RESCAN argument \(a prefix, interactively\) forces
! a rebuild.  Searches with `ffap-menu-regexp'."
    (interactive "P")
    ;; (require 'imenu) -- no longer used, but roughly emulated
*************** Arguments are TITLE, ALIST, and CONT (a 
*** 1347,1357 ****
  This uses either a menu or the minibuffer depending on invocation.
  The TITLE string is used as either the prompt or menu title.
! Each (string . data) entry in ALIST defines a choice (data is ignored).
  Once the user makes a choice, function CONT is applied to the entry.
  Always returns nil."
    ;; Bug: minibuffer prompting assumes the strings are unique.
-   ;; Todo: break up long menus into multiple panes (like imenu).
    (let ((choice
! 	 (if (and (fboundp 'x-popup-menu) ; 19 or XEmacs 19.13
  		  (boundp 'last-nonmenu-event) ; not in XEmacs 19.13
  		  (listp last-nonmenu-event))
--- 1252,1261 ----
  This uses either a menu or the minibuffer depending on invocation.
  The TITLE string is used as either the prompt or menu title.
! Each \(string . data\) ALIST entry defines a choice \(data is ignored\).
  Once the user makes a choice, function CONT is applied to the entry.
  Always returns nil."
    ;; Bug: minibuffer prompting assumes the strings are unique.
    (let ((choice
! 	 (if (and (fboundp 'x-popup-menu) ; Emacs 19 or XEmacs 19.13
  		  (boundp 'last-nonmenu-event) ; not in XEmacs 19.13
  		  (listp last-nonmenu-event))
*************** Always returns nil."
*** 1363,1379 ****
  			   (function (lambda (i) (cons (car i) i)))
  			   alist))))
! 	   ;; Automatically popup completion help, one way or another:
! 	   (let ((minibuffer-setup-hook 'minibuffer-completion-help)
! 		 (unread-command-char -1))
! 	     ;; BUG: this code assumes that "" is not a valid choice
! 	     (completing-read
! 	      (format "%s (default %s): " title (car (car alist)))
! 	      alist nil t
! 	      ;; Let first be default:
! 	      ;; (if ffap-v18 (car (car alist))
! 	      ;;   (cons (car (car alist)) 0))
! 	      ;; No, then you do not get all completions!
! 	      nil
! 	      )))))
      ;; Defaulting: convert "" to (car (car alist))
      (and (equal choice "") (setq choice (car (car alist))))
--- 1267,1282 ----
  			   (function (lambda (i) (cons (car i) i)))
  			   alist))))
! 	   ;; Immediately popup completion buffer:
! 	   (prog1
! 	       (let ((minibuffer-setup-hook 'minibuffer-completion-help))
! 		 ;; BUG: this code assumes that "" is not a valid choice
! 		 (completing-read
! 		  (format "%s (default %s): " title (car (car alist)))
! 		  alist nil t
! 		  ;; (cons (car (car alist)) 0)
! 		  nil
! 		  ))
! 	     ;; Redraw original screen:
! 	     (sit-for 0)))))
      ;; Defaulting: convert "" to (car (car alist))
      (and (equal choice "") (setq choice (car (car alist))))
*************** Always returns nil."
*** 1383,1389 ****
  
  (defun ffap-menu-rescan nil
    (interactive)
    (let ((ffap-next-regexp (or ffap-menu-regexp ffap-next-regexp))
! 	(range (- (point-max) (point-min))) item)
      (setq ffap-menu-alist nil)
      (save-excursion
--- 1286,1300 ----
  
  (defun ffap-menu-rescan nil
+   "Search buffer for `ffap-menu-regexp' to build `ffap-menu-alist'.
+ Applies `ffap-menu-text-plist' text properties at all matches."
    (interactive)
    (let ((ffap-next-regexp (or ffap-menu-regexp ffap-next-regexp))
! 	(range (- (point-max) (point-min))) item
! 	buffer-read-only		; to set text-properties
! 	;; Avoid repeated searches of the *mode-alist:
! 	(major-mode (if (assq major-mode ffap-string-at-point-mode-alist)
! 			major-mode
! 		      'file))
! 	)
      (setq ffap-menu-alist nil)
      (save-excursion
*************** Always returns nil."
*** 1391,1394 ****
--- 1302,1307 ----
        (while (setq item (ffap-next-guess))
  	(setq ffap-menu-alist (cons (cons item (point)) ffap-menu-alist))
+ 	(add-text-properties (car ffap-string-at-point-region) (point)
+ 			     ffap-menu-text-plist)
  	(message "Scanning...%2d%% <%s>"
  		 (/ (* 100 (- (point) (point-min))) range) item))))
*************** Always returns nil."
*** 1412,1425 ****
  ;;; Mouse Support:
  ;;
! ;; I suggest a mouse binding, something like:
! ;; (global-set-key [S-mouse-1] 'ffap-at-mouse)
  
  (defvar ffap-at-mouse-fallback 'ffap-menu
!   "Invoked by ffap-at-mouse if no file or url found at point.
  A command symbol, or nil for nothing.")
  (put 'ffap-at-mouse-fallback 'risky-local-variable t)
  
  (defun ffap-at-mouse (e)
!   "Find file or URL guessed from text around mouse point.
  If none is found, call `ffap-at-mouse-fallback'."
    (interactive "e")
--- 1325,1337 ----
  ;;; Mouse Support:
  ;;
! ;; See the suggested binding in ffap-bindings (near eof).
  
  (defvar ffap-at-mouse-fallback 'ffap-menu
!   "Invoked by `ffap-at-mouse' if no file or url at click.
  A command symbol, or nil for nothing.")
  (put 'ffap-at-mouse-fallback 'risky-local-variable t)
  
  (defun ffap-at-mouse (e)
!   "Find file or url guessed from text around mouse point.
  If none is found, call `ffap-at-mouse-fallback'."
    (interactive "e")
*************** If none is found, call `ffap-at-mouse-fa
*** 1448,1455 ****
  
  ;;; ffap-other-* commands
! ;; Suggested by KPC.  Possible bindings for C-x 4 C-f, C-x 5 C-f.
  
  (defun ffap-other-window nil
!   "Like ffap, but put buffer in another window."
    (interactive)
    (switch-to-buffer-other-window
--- 1360,1367 ----
  
  ;;; ffap-other-* commands
! ;; Suggested by KPC.
  
  (defun ffap-other-window nil
!   "Like `ffap', but put buffer in another window."
    (interactive)
    (switch-to-buffer-other-window
*************** If none is found, call `ffap-at-mouse-fa
*** 1457,1461 ****
  
  (defun ffap-other-frame nil
!   "Like ffap, but put buffer in another frame."
    (interactive)
    (switch-to-buffer-other-frame
--- 1369,1373 ----
  
  (defun ffap-other-frame nil
!   "Like `ffap', but put buffer in another frame."
    (interactive)
    (switch-to-buffer-other-frame
*************** If none is found, call `ffap-at-mouse-fa
*** 1463,1500 ****
  
  
! ;;; ffap-bug:
  (defun ffap-bug nil
!   ;; Tested with Emacs 19.28 reporter.el
!   "Submit a bug report for ffap."
    (interactive)
    (require 'reporter)
    (let ((reporter-prompt-for-summary-p t))
      (reporter-submit-bug-report
!      "mic@mathcs.emory.edu" "ffap "
!      (mapcar 'intern (all-completions "ffap-" obarray 'boundp))
!      )))
  (fset 'ffap-submit-bug 'ffap-bug)	; another likely name
  
  
! ;;; Todo, End.
  ;;
! ;; * w3 may eventually make URL's part of the filesystem!
! ;;   this package (prompt & completion) could become much simpler
! ;; * improve minibuffer-completion-help display of long completions
! ;; * notice "machine.dom blah blah blah path/file" (how?)
! ;; * check X selections (x-get-selection PRIMARY/SECONDARY LENGTH/TEXT)
! ;; * let "/path/file#key" jump to key (anchor or regexp) in /path/file
! ;; * notice node in "(dired)Virtual Dired" (how to handle space?)
! ;; * try find-tag on symbol if TAGS is loaded (need above)
! ;;
! ;; For information on URL/URI syntax, try:
! ;; <http://ds.internic.net/rfc/rfc1630.txt>
! ;; <http://www.w3.org/hypertext/WWW/Protocols/Overview.html>
! ;; <http://info.cern.ch/hypertext/WWW/Addressing/Addressing.html>
! 
! ;; Local Variables?
! ;; foo: bar
! ;; End:
  
  
  ;;; ffap.el ends here
--- 1375,1493 ----
  
  
! ;;; Bug Reporter:
! 
  (defun ffap-bug nil
!   "Submit a bug report for the ffap package."
!   ;; Important: keep the version string here in synch with that at top
!   ;; of file!  Could use lisp-mnt from Emacs 19, but that would depend
!   ;; on being able to find the ffap.el source file.
    (interactive)
    (require 'reporter)
    (let ((reporter-prompt-for-summary-p t))
      (reporter-submit-bug-report
!      "Michelangelo Grigni <mic@mathcs.emory.edu>"
!      "ffap 1.6"
!      (mapcar 'intern (all-completions "ffap-" obarray 'boundp)))))
! 
  (fset 'ffap-submit-bug 'ffap-bug)	; another likely name
  
  
! ;;; Hooks for Gnus, VM, Rmail:
  ;;
! ;; If you do not like these bindings, write versions with whatever
! ;; bindings you would prefer.
  
+ (defun ffap-ro-mode-hook nil
+   "Bind `ffap-next' and `ffap-menu' to M-l and M-m, resp."
+   (local-set-key "\M-l" 'ffap-next)
+   (local-set-key "\M-m" 'ffap-menu)
+   )
+ 
+ (defun ffap-gnus-hook nil
+   "Bind `ffap-gnus-next' and `ffap-gnus-menu' to M-l and M-m, resp."
+   (set (make-local-variable 'ffap-foo-at-bar-prefix) "news") ; message-id's
+   ;; Note "l", "L", "m", "M" are taken:
+   (local-set-key "\M-l" 'ffap-gnus-next)
+   (local-set-key "\M-m" 'ffap-gnus-menu))
  
+ (defun ffap-gnus-wrapper (form)		; used by both commands below
+   (and (eq (current-buffer) (get-buffer gnus-summary-buffer))
+        (gnus-summary-select-article))	; get article of current line
+   ;; Preserve selected buffer, but do not do save-window-excursion,
+   ;; since we want to see any window created by the form.  Temporarily
+   ;; select the article buffer, so we can see any point movement.
+   (let ((sb (window-buffer (selected-window))))
+     (gnus-configure-windows 'article)
+     (pop-to-buffer gnus-article-buffer)
+     (widen)
+     ;; Skip headers for ffap-gnus-next (which will wrap around)
+     (if (eq (point) (point-min)) (search-forward "\n\n" nil t))
+     (unwind-protect
+ 	(eval form)
+       (pop-to-buffer sb))))
+ 
+ (defun ffap-gnus-next nil
+   "Run `ffap-next' in the gnus article buffer."
+   (interactive) (ffap-gnus-wrapper '(ffap-next nil t)))
+ 
+ (defun ffap-gnus-menu nil
+   "Run `ffap-menu' in the gnus article buffer."
+   (interactive) (ffap-gnus-wrapper '(ffap-menu)))
+ 
+ 
+ ;;; ffap-bindings: offer default global bindings
+ 
+ (defvar ffap-bindings
+   (nconc
+    (cond
+     ((not (eq window-system 'x))
+      nil)
+     ;; GNU coding standards say packages should not bind S-mouse-*.
+     ;; Is it ok to simply suggest such a binding to the user?
+     (ffap-xemacs
+      '((global-set-key '(shift button3) 'ffap-at-mouse)))
+     (t
+      '((global-set-key [S-down-mouse-3] 'ffap-at-mouse))))
+    '(
+      (global-set-key "\C-x\C-f" 'find-file-at-point)
+      (global-set-key "\C-x4f"   'ffap-other-window)
+      (global-set-key "\C-x5f"   'ffap-other-frame)
+      (add-hook 'gnus-summary-mode-hook 'ffap-gnus-hook)
+      (add-hook 'gnus-article-mode-hook 'ffap-gnus-hook)
+      (add-hook 'vm-mode-hook 'ffap-ro-mode-hook)
+      (add-hook 'rmail-mode-hook 'ffap-ro-mode-hook)
+      ;; (setq dired-x-hands-off-my-keys t) ; the default
+      ))
+   "List of forms evaluated by function `ffap-bindings'.
+ A reasonable ffap installation needs just these two lines:
+   (require 'ffap)
+   (ffap-bindings)
+ These are only suggestions, they may be modified or ignored.")
+ 
+ (defun ffap-bindings nil
+   "Evaluate the forms in variable `ffap-bindings'."
+   (eval (cons 'progn ffap-bindings)))
+ 
+ ;; Example modifications:
+ ;;
+ ;; (setq ffap-alist                   ; remove a feature in `ffap-alist'
+ ;;	 (delete (assoc 'c-mode ffap-alist) ffap-alist))
+ ;;
+ ;; (setq ffap-alist                   ; add something to `ffap-alist'
+ ;;	 (cons
+ ;;	  (cons "^[Yy][Ss][Nn][0-9]+$"
+ ;;		(defun ffap-ysn (name)
+ ;;		  (concat
+ ;;		   "http://snorri.chem.washington.edu/ysnarchive/issuefiles/"
+ ;;		   (substring name 3) ".html")))
+ ;;	  ffap-alist))
+ 
+ 
+ ;;; XEmacs:
+ ;; Extended suppport in another file, for copyright reasons.
+ (or (not ffap-xemacs)
+     (load "ffap-xe" t t)
+     (message "ffap warning: ffap-xe.el not found"))
+ 
+ 
  ;;; ffap.el ends here
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/files.el emacs-19.31/lisp/files.el
*** emacs-19.30/lisp/files.el	Fri Nov 10 14:10:34 1995
--- emacs-19.31/lisp/files.el	Tue May 21 13:18:29 1996
***************
*** 1,5 ****
  ;;; files.el --- file input and output commands for Emacs
  
! ;; Copyright (C) 1985, 86, 87, 92, 93, 94, 1995 Free Software Foundation, Inc.
  
  ;; Maintainer: FSF
--- 1,6 ----
  ;;; files.el --- file input and output commands for Emacs
  
! ;; Copyright (C) 1985, 86, 87, 92, 93,
! ;;		 94, 95, 1996 Free Software Foundation, Inc.
  
  ;; Maintainer: FSF
***************
*** 18,23 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** and the rest are not called.
*** 195,200 ****
  These hooks are considered to pertain to the visited file.
  So this list is cleared if you change the visited file name.
! See also `write-contents-hooks'.
! Don't make this variable buffer-local; instead, use `local-write-file-hooks'.")
  ;;; However, in case someone does make it local...
  (put 'write-file-hooks 'permanent-local t)
--- 197,203 ----
  These hooks are considered to pertain to the visited file.
  So this list is cleared if you change the visited file name.
! 
! Don't make this variable buffer-local; instead, use `local-write-file-hooks'.
! See also `write-contents-hooks'.")
  ;;; However, in case someone does make it local...
  (put 'write-file-hooks 'permanent-local t)
*************** Don't make this variable buffer-local; i
*** 203,207 ****
    "Just like `write-file-hooks', except intended for per-buffer use.
  The functions in this list are called before the ones in
! `write-file-hooks'.")
  (make-variable-buffer-local 'local-write-file-hooks)
  (put 'local-write-file-hooks 'permanent-local t)
--- 206,215 ----
    "Just like `write-file-hooks', except intended for per-buffer use.
  The functions in this list are called before the ones in
! `write-file-hooks'.
! 
! This variable is meant to be used for hooks that have to do with a
! particular visited file.  Therefore, it is a permanent local, so that
! changing the major mode does not clear it.  However, calling
! `set-visited-file-name' does clear it.")
  (make-variable-buffer-local 'local-write-file-hooks)
  (put 'local-write-file-hooks 'permanent-local t)
*************** The functions in this list are called be
*** 211,218 ****
  If one of them returns non-nil, the file is considered already written
  and the rest are not called.
! These hooks are considered to pertain to the buffer's contents,
! not to the particular visited file; thus, `set-visited-file-name' does
! not clear this variable, but changing the major mode does clear it.
  See also `write-file-hooks'.")
  
  (defconst enable-local-variables t
--- 219,234 ----
  If one of them returns non-nil, the file is considered already written
  and the rest are not called.
! 
! This variable is meant to be used for hooks that pertain to the
! buffer's contents, not to the particular visited file; thus,
! `set-visited-file-name' does not clear this variable; but changing the
! major mode does clear it.
! 
! This variable automatically becomes buffer-local whenever it is set.
! If you use `add-hooks' to add elements to the list, use nil for the
! LOCAL argument.
! 
  See also `write-file-hooks'.")
+ (make-variable-buffer-local 'write-contents-hooks)
  
  (defconst enable-local-variables t
*************** and ignores this variable.")
*** 253,256 ****
--- 269,279 ----
  	  (inhibit-file-name-operation op))
        (apply op args))))
+ 
+ (defun convert-standard-filename (filename)
+   "Convert a standard file's name to something suitable for the current OS.
+ This function's standard definition is trivial; it just returns the argument.
+ However, on some systems, the function is redefined
+ with a definition that really does change some file names."
+   filename)
  
  (defun pwd ()
*************** Type \\[describe-variable] directory-abb
*** 624,628 ****
  		(concat "^" (abbreviate-file-name (expand-file-name "~"))
  			"\\(/\\|$\\)"))))
! 						  
      ;; If FILENAME starts with the abbreviated homedir,
      ;; make it start with `~' instead.
--- 647,651 ----
  		(concat "^" (abbreviate-file-name (expand-file-name "~"))
  			"\\(/\\|$\\)"))))
! 
      ;; If FILENAME starts with the abbreviated homedir,
      ;; make it start with `~' instead.
*************** Type \\[describe-variable] directory-abb
*** 631,638 ****
  	     (not (and (= (match-end 0) 1)
  		       (= (aref filename 0) ?/)))
! 	     (not (and (or (eq system-type 'ms-dos) 
  			   (eq system-type 'windows-nt))
  		       (save-match-data
! 			 (string-match "^[a-zA-Z]:/$" filename)))))
  	(setq filename
  	      (concat "~"
--- 654,663 ----
  	     (not (and (= (match-end 0) 1)
  		       (= (aref filename 0) ?/)))
! 	     ;; MS-DOS root directories can come with a drive letter;
! 	     ;; Novell Netware allows drive letters beyond `Z:'.
! 	     (not (and (or (eq system-type 'ms-dos)
  			   (eq system-type 'windows-nt))
  		       (save-match-data
! 			 (string-match "^[a-zA-`]:/$" filename)))))
  	(setq filename
  	      (concat "~"
*************** find-file-hooks, etc.
*** 691,695 ****
  	(format-alist nil)
  	(after-insert-file-functions nil)
! 	(find-buffer-file-type-function 
  	 (if (fboundp 'find-buffer-file-type)
  	     (symbol-function 'find-buffer-file-type)
--- 716,720 ----
  	(format-alist nil)
  	(after-insert-file-functions nil)
! 	(find-buffer-file-type-function
  	 (if (fboundp 'find-buffer-file-type)
  	     (symbol-function 'find-buffer-file-type)
*************** The buffer is not selected, just returne
*** 716,720 ****
  			      (abbreviate-file-name (file-truename filename))
  			    filename))
! 	(error "%s is a directory." filename))
      (let* ((buf (get-file-buffer filename))
  	   (truename (abbreviate-file-name (file-truename filename)))
--- 741,745 ----
  			      (abbreviate-file-name (file-truename filename))
  			    filename))
! 	(error "%s is a directory" filename))
      (let* ((buf (get-file-buffer filename))
  	   (truename (abbreviate-file-name (file-truename filename)))
*************** The buffer is not selected, just returne
*** 806,810 ****
  	  (if rawfile
  	      nil
! 	    (after-find-file error (not nowarn)))))
        buf)))
  
--- 831,836 ----
  	  (if rawfile
  	      nil
! 	    (after-find-file error (not nowarn))
! 	    (setq buf (current-buffer)))))
        buf)))
  
*************** The buffer is not selected, just returne
*** 812,816 ****
  
  (defun after-find-file (&optional error warn noauto
! 				  after-find-file-from-revert-buffer)
    "Called after finding a file and by the default revert function.
  Sets buffer mode, parses local variables.
--- 838,843 ----
  
  (defun after-find-file (&optional error warn noauto
! 				  after-find-file-from-revert-buffer
! 				  nomodes)
    "Called after finding a file and by the default revert function.
  Sets buffer mode, parses local variables.
*************** NOAUTO means don't mess with auto-save m
*** 821,825 ****
  Fourth arg AFTER-FIND-FILE-FROM-REVERT-BUFFER non-nil
   means this call was from `revert-buffer'.
! Finishes by calling the functions in `find-file-hooks'."
    (setq buffer-read-only (not (file-writable-p buffer-file-name)))
    (if noninteractive
--- 848,854 ----
  Fourth arg AFTER-FIND-FILE-FROM-REVERT-BUFFER non-nil
   means this call was from `revert-buffer'.
! Fifth arg NOMODES non-nil means don't alter the file's modes.
! Finishes by calling the functions in `find-file-hooks'
! unless NOMODES is non-nil."
    (setq buffer-read-only (not (file-writable-p buffer-file-name)))
    (if noninteractive
*************** Finishes by calling the functions in `fi
*** 834,838 ****
  			    (file-newer-than-file-p (make-auto-save-file-name)
  						    buffer-file-name))
! 		       "Auto save file is newer; consider M-x recover-file"
  		     (setq not-serious t)
  		     (if error "(New file)" nil)))
--- 863,868 ----
  			    (file-newer-than-file-p (make-auto-save-file-name)
  						    buffer-file-name))
! 		       (format "%s has auto save data; consider M-x recover-file"
! 			       (file-name-nondirectory buffer-file-name))
  		     (setq not-serious t)
  		     (if error "(New file)" nil)))
*************** Finishes by calling the functions in `fi
*** 855,860 ****
      (if (and auto-save-default (not noauto))
  	(auto-save-mode t)))
!   (normal-mode t)
!   (run-hooks 'find-file-hooks))
  
  (defun normal-mode (&optional find-file)
--- 885,892 ----
      (if (and auto-save-default (not noauto))
  	(auto-save-mode t)))
!   (if nomodes
!       nil
!     (normal-mode t)
!     (run-hooks 'find-file-hooks)))
  
  (defun normal-mode (&optional find-file)
*************** run `normal-mode' explicitly."
*** 881,966 ****
  		    (prin1-to-string err)))))
  
! (defvar auto-mode-alist (mapcar 'purecopy
! 				'(("\\.text\\'" . text-mode)
! 				  ("\\.c\\'" . c-mode)
! 				  ("\\.h\\'" . c-mode)
! 				  ("\\.tex\\'" . tex-mode)
! 				  ("\\.ltx\\'" . latex-mode)
! 				  ("\\.el\\'" . emacs-lisp-mode)
! 				  ("\\.mm\\'" . nroff-mode)
! 				  ("\\.me\\'" . nroff-mode)
! 				  ("\\.ms\\'" . nroff-mode)
! 				  ("\\.man\\'" . nroff-mode)
! 				  ("\\.scm\\'" . scheme-mode)
! 				  ("\\.l\\'" . lisp-mode)
! 				  ("\\.lisp\\'" . lisp-mode)
! 				  ("\\.f\\'" . fortran-mode)
! 				  ("\\.for\\'" . fortran-mode)
! 				  ("\\.p\\'" . pascal-mode)
! 				  ("\\.pas\\'" . pascal-mode)
! 				  ("\\.mss\\'" . scribe-mode)
! 				  ("\\.ad[abs]\\'" . ada-mode)
! 				  ("\\.icn\\'" . icon-mode)
! 				  ("\\.pl\\'" . perl-mode)
! 				  ("\\.cc\\'" . c++-mode)
! 				  ("\\.hh\\'" . c++-mode)
! 				  ("\\.C\\'" . c++-mode)
! 				  ("\\.H\\'" . c++-mode)
! 				  ("\\.cpp\\'" . c++-mode)
! 				  ("\\.cxx\\'" . c++-mode)
! 				  ("\\.hxx\\'" . c++-mode)
! 				  ("\\.c\\+\\+\\'" . c++-mode)
! 				  ("\\.h\\+\\+\\'" . c++-mode)
! 				  ("\\.mk\\'" . makefile-mode)
! 				  ("[Mm]akefile\\(.in\\)?\\'" . makefile-mode)
  ;;; Less common extensions come here
  ;;; so more common ones above are found faster.
! 				  ("\\.texinfo\\'" . texinfo-mode)
! 				  ("\\.texi\\'" . texinfo-mode)
! 				  ("\\.s\\'" . asm-mode)
! 				  ("ChangeLog\\'" . change-log-mode)
! 				  ("change.log\\'" . change-log-mode)
! 				  ("changelo\\'" . change-log-mode)
! 				  ("ChangeLog.[0-9]+\\'" . change-log-mode)
! 				  ("\\$CHANGE_LOG\\$\\.TXT" . change-log-mode)
! 				  ("\\.scm\\.[0-9]*\\'" . scheme-mode)
  ;;; The following should come after the ChangeLog pattern
  ;;; for the sake of ChangeLog.1, etc.
  ;;; and after the .scm.[0-9] pattern too.
! 				  ("\\.[12345678]\\'" . nroff-mode)
! 				  ("\\.TeX\\'" . tex-mode)
! 				  ("\\.sty\\'" . latex-mode)
! 				  ("\\.cls\\'" . latex-mode) ;LaTeX 2e class
! 				  ("\\.bbl\\'" . latex-mode)
! 				  ("\\.bib\\'" . bibtex-mode)
! 				  ("\\.article\\'" . text-mode)
! 				  ("\\.letter\\'" . text-mode)
! 				  ("\\.tcl\\'" . tcl-mode)
! 				  ("\\.f90\\'" . f90-mode)
! 				  ("\\.lsp\\'" . lisp-mode)
! 				  ("\\.awk\\'" . awk-mode)
! 				  ("\\.prolog\\'" . prolog-mode)
! 				  ("\\.tar\\'" . tar-mode)
! 				  ("\\.\\(arc\\|zip\\|lzh\\|zoo\\)\\'" . archive-mode)
! 				  ;; Mailer puts message to be edited in
! 				  ;; /tmp/Re.... or Message
! 				  ("^/tmp/Re" . text-mode)
! 				  ("/Message[0-9]*\\'" . text-mode)
! 				  ("/drafts/[0-9]+\\'" . mh-letter-mode)
! 				  ;; some news reader is reported to use this
! 				  ("^/tmp/fol/" . text-mode)
! 				  ("\\.y\\'" . c-mode)
! 				  ("\\.lex\\'" . c-mode)
! 				  ("\\.oak\\'" . scheme-mode)
! 				  ("\\.sgm\\'" . sgml-mode)
! 				  ("\\.sgml\\'" . sgml-mode)
! 				  ("\\.dtd\\'" . sgml-mode)
! 				  ;; .emacs following a directory delimiter
! 				  ;; in either Unix or VMS syntax.
! 				  ("[]>:/]\\..*emacs\\'" . emacs-lisp-mode)
! 				  ;; _emacs following a directory delimiter
! 				  ;; in MsDos syntax
! 				  ("[:/]_emacs\\'" . emacs-lisp-mode)
! 				  ("\\.ml\\'" . lisp-mode)))
    "\
  Alist of filename patterns vs corresponding major mode functions.
--- 913,1009 ----
  		    (prin1-to-string err)))))
  
! (defvar auto-mode-alist
!   '(("\\.te?xt\\'" . text-mode)
!     ("\\.c\\'" . c-mode)
!     ("\\.h\\'" . c-mode)
!     ("\\.tex\\'" . tex-mode)
!     ("\\.ltx\\'" . latex-mode)
!     ("\\.el\\'" . emacs-lisp-mode)
!     ("\\.mm\\'" . nroff-mode)
!     ("\\.me\\'" . nroff-mode)
!     ("\\.ms\\'" . nroff-mode)
!     ("\\.man\\'" . nroff-mode)
!     ("\\.scm\\'" . scheme-mode)
!     ("\\.l\\'" . lisp-mode)
!     ("\\.lisp\\'" . lisp-mode)
!     ("\\.f\\'" . fortran-mode)
!     ("\\.F\\'" . fortran-mode)
!     ("\\.for\\'" . fortran-mode)
!     ("\\.p\\'" . pascal-mode)
!     ("\\.pas\\'" . pascal-mode)
!     ("\\.mss\\'" . scribe-mode)
!     ("\\.ad[abs]\\'" . ada-mode)
!     ("\\.icn\\'" . icon-mode)
!     ("\\.pl\\'" . perl-mode)
!     ("\\.cc\\'" . c++-mode)
!     ("\\.hh\\'" . c++-mode)
!     ("\\.C\\'" . c++-mode)
!     ("\\.H\\'" . c++-mode)
!     ("\\.cpp\\'" . c++-mode)
!     ("\\.cxx\\'" . c++-mode)
!     ("\\.hxx\\'" . c++-mode)
!     ("\\.c\\+\\+\\'" . c++-mode)
!     ("\\.h\\+\\+\\'" . c++-mode)
!     ("\\.java\\'" . java-mode)
!     ("\\.mk\\'" . makefile-mode)
!     ("\\(M\\|m\\|GNUm\\)akefile\\(.in\\)?\\'" . makefile-mode)
  ;;; Less common extensions come here
  ;;; so more common ones above are found faster.
!     ("\\.texinfo\\'" . texinfo-mode)
!     ("\\.te?xi\\'" . texinfo-mode)
!     ("\\.s\\'" . asm-mode)
!     ("\\.S\\'" . asm-mode)
!     ("\\.asm\\'" . asm-mode)
!     ("ChangeLog\\'" . change-log-mode)
!     ("change.log\\'" . change-log-mode)
!     ("changelo\\'" . change-log-mode)
!     ("ChangeLog.[0-9]+\\'" . change-log-mode)
!     ("\\$CHANGE_LOG\\$\\.TXT" . change-log-mode)
!     ("\\.scm\\.[0-9]*\\'" . scheme-mode)
!     ("\\.[ck]?sh\\'\\|\\.shar\\'\\|/\\.z?profile\\'" . sh-mode)
!     ("/\\.\\(bash_profile\\|z?login\\|bash_login\\|z?logout\\)\\'" . sh-mode)
!     ("/\\.\\(bash_logout\\|[kz]shrc\\|bashrc\\|t?cshrc\\|esrc\\)\\'" . sh-mode)
!     ("/\\.\\([kz]shenv\\|xinitrc\\|startxrc\\|xsession\\)\\'" . sh-mode)
  ;;; The following should come after the ChangeLog pattern
  ;;; for the sake of ChangeLog.1, etc.
  ;;; and after the .scm.[0-9] pattern too.
!     ("\\.[12345678]\\'" . nroff-mode)
!     ("\\.TeX\\'" . tex-mode)
!     ("\\.sty\\'" . latex-mode)
!     ("\\.cls\\'" . latex-mode)		;LaTeX 2e class
!     ("\\.bbl\\'" . latex-mode)
!     ("\\.bib\\'" . bibtex-mode)
!     ("\\.article\\'" . text-mode)
!     ("\\.letter\\'" . text-mode)
!     ("\\.tcl\\'" . tcl-mode)
!     ("\\.exp\\'" . tcl-mode)
!     ("\\.itcl\\'" . tcl-mode)
!     ("\\.itk\\'" . tcl-mode)
!     ("\\.f90\\'" . f90-mode)
!     ("\\.lsp\\'" . lisp-mode)
!     ("\\.awk\\'" . awk-mode)
!     ("\\.prolog\\'" . prolog-mode)
!     ("\\.tar\\'" . tar-mode)
!     ("\\.\\(arc\\|zip\\|lzh\\|zoo\\)\\'" . archive-mode)
!     ;; Mailer puts message to be edited in
!     ;; /tmp/Re.... or Message
!     ("\\`/tmp/Re" . text-mode)
!     ("/Message[0-9]*\\'" . text-mode)
!     ("/drafts/[0-9]+\\'" . mh-letter-mode)
!     ;; some news reader is reported to use this
!     ("\\`/tmp/fol/" . text-mode)
!     ("\\.y\\'" . c-mode)
!     ("\\.lex\\'" . c-mode)
!     ("\\.oak\\'" . scheme-mode)
!     ("\\.sgml?\\'" . sgml-mode)
!     ("\\.dtd\\'" . sgml-mode)
!     ("\\.s?html?\\'" . html-mode)
!     ;; .emacs following a directory delimiter
!     ;; in either Unix or VMS syntax.
!     ("[]>:/]\\..*emacs\\'" . emacs-lisp-mode)
!     ;; _emacs following a directory delimiter
!     ;; in MsDos syntax
!     ("[:/]_emacs\\'" . emacs-lisp-mode)
!     ("\\.ml\\'" . lisp-mode))
    "\
  Alist of filename patterns vs corresponding major mode functions.
*************** REGEXP and search the list again for ano
*** 976,979 ****
--- 1019,1023 ----
  (defconst interpreter-mode-alist
    '(("perl" . perl-mode)
+     ("perl5" . perl-mode)
      ("wish" . tcl-mode)
      ("wishx" . tcl-mode)
*************** REGEXP and search the list again for ano
*** 981,987 ****
      ("tclsh" . tcl-mode)
      ("awk" . awk-mode)
      ("nawk" . awk-mode)
      ("gawk" . awk-mode)
!     ("scm" . scheme-mode))
    "Alist mapping interpreter names to major modes.
  This alist applies to files whose first line starts with `#!'.
--- 1025,1053 ----
      ("tclsh" . tcl-mode)
      ("awk" . awk-mode)
+     ("mawk" . awk-mode)
      ("nawk" . awk-mode)
      ("gawk" . awk-mode)
!     ("scm" . scheme-mode)
!     ("ash" . sh-mode)
!     ("bash" . sh-mode)
!     ("csh" . sh-mode)
!     ("dtksh" . sh-mode)
!     ("es" . sh-mode)
!     ("itcsh" . sh-mode)
!     ("jsh" . sh-mode)
!     ("ksh" . sh-mode)
!     ("oash" . sh-mode)
!     ("pdksh" . sh-mode)
!     ("rc" . sh-mode)
!     ("sh" . sh-mode)
!     ("sh5" . sh-mode)
!     ("tcsh" . sh-mode)
!     ("wksh" . sh-mode)
!     ("wsh" . sh-mode)
!     ("zsh" . sh-mode)
!     ("tail" . text-mode)
!     ("more" . text-mode)
!     ("less" . text-mode)
!     ("pg" . text-mode))
    "Alist mapping interpreter names to major modes.
  This alist applies to files whose first line starts with `#!'.
*************** If `enable-local-variables' is nil, this
*** 1092,1096 ****
  		  (mode nil))
  	      ;; Find first matching alist entry.
! 	      (let ((case-fold-search 
  		     (memq system-type '(vax-vms windows-nt))))
  		(while (and (not mode) alist)
--- 1158,1162 ----
  		  (mode nil))
  	      ;; Find first matching alist entry.
! 	      (let ((case-fold-search
  		     (memq system-type '(vax-vms windows-nt))))
  		(while (and (not mode) alist)
*************** If `enable-local-variables' is nil, this
*** 1109,1118 ****
  		;; If we can't deduce a mode from the file name,
  		;; look for an interpreter specified in the first line.
  		(let ((interpreter
  		       (save-excursion
  			 (goto-char (point-min))
! 			 (if (looking-at "#! *\\([^ \t\n]+\\)")
! 			     (buffer-substring (match-beginning 1)
! 					       (match-end 1))
  			   "")))
  		      elt)
--- 1175,1186 ----
  		;; If we can't deduce a mode from the file name,
  		;; look for an interpreter specified in the first line.
+ 		;; As a special case, allow for things like "#!/bin/env perl",
+ 		;; which finds the interpreter anywhere in $PATH.
  		(let ((interpreter
  		       (save-excursion
  			 (goto-char (point-min))
! 			 (if (looking-at "#![ \t]?\\([^ \t\n]*/bin/env[ \t]\\)?\\([^ \t\n]+\\)")
! 			     (buffer-substring (match-beginning 2)
! 					       (match-end 2))
  			   "")))
  		      elt)
*************** If `enable-local-variables' is nil, this
*** 1162,1166 ****
  		 (skip-chars-forward " \t;")))
  	     (setq result (nreverse result))))
!       
        (if (and result
  	       (or (eq enable-local-variables t)
--- 1230,1234 ----
  		 (skip-chars-forward " \t;")))
  	     (setq result (nreverse result))))
! 
        (if (and result
  	       (or (eq enable-local-variables t)
*************** in order to initialize other data struct
*** 1206,1210 ****
  			  (y-or-n-p (format "Set local variables as specified at end of %s? "
   					    (if buffer-file-name
!  						(file-name-nondirectory 
   						 buffer-file-name)
   					      (concat "buffer "
--- 1274,1278 ----
  			  (y-or-n-p (format "Set local variables as specified at end of %s? "
   					    (if buffer-file-name
!  						(file-name-nondirectory
   						 buffer-file-name)
   					      (concat "buffer "
*************** in order to initialize other data struct
*** 1305,1309 ****
  			    (symbol-name var))
  	      (not (get var 'safe-local-variable))))
! 	 ;; Permit evaling a put of a harmless property
  	 ;; if the args do nothing tricky.
  	 (if (or (and (eq var 'eval)
--- 1373,1377 ----
  			    (symbol-name var))
  	      (not (get var 'safe-local-variable))))
! 	 ;; Permit evalling a put of a harmless property.
  	 ;; if the args do nothing tricky.
  	 (if (or (and (eq var 'eval)
*************** if you wish to pass an empty string as t
*** 1360,1363 ****
--- 1428,1436 ----
  	  (if find-file-visit-truename
  	      (setq filename truename))))
+     (let ((buffer (and filename (find-buffer-visiting filename))))
+       (and buffer (not (eq buffer (current-buffer)))
+ 	   (not (y-or-n-p (message "A buffer is visiting %s; proceed? "
+ 				   filename)))
+ 	   (error "Aborted")))
      (or (equal filename buffer-file-name)
  	(progn
*************** If the buffer is already visiting a file
*** 1429,1434 ****
  a directory name as FILENAME, to write a file of the same
  old name in that directory.
  If optional second arg CONFIRM is non-nil,
! ask for confirmation for overwriting an existing file."
  ;;  (interactive "FWrite file: ")
    (interactive
--- 1502,1509 ----
  a directory name as FILENAME, to write a file of the same
  old name in that directory.
+ 
  If optional second arg CONFIRM is non-nil,
! ask for confirmation for overwriting an existing file.
! Interactively, confirmation is required unless you supply a prefix argument."
  ;;  (interactive "FWrite file: ")
    (interactive
*************** ask for confirmation for overwriting an 
*** 1440,1444 ****
  					  (buffer-local-variables)))
  			       nil nil (buffer-name)))
! 	 t))
    (or (null filename) (string-equal filename "")
        (progn
--- 1515,1519 ----
  					  (buffer-local-variables)))
  			       nil nil (buffer-name)))
! 	 (not current-prefix-arg)))
    (or (null filename) (string-equal filename "")
        (progn
*************** the modes of the new file to agree with 
*** 1513,1518 ****
  		    (file-error
  		     ;; If trouble writing the backup, write it in ~.
! 		     (setq backupname (expand-file-name "~/%backup%~"))
! 		     (message "Cannot write backup file; backing up in ~/%%backup%%~")
  		     (sleep-for 1)
  		     (condition-case ()
--- 1588,1596 ----
  		    (file-error
  		     ;; If trouble writing the backup, write it in ~.
! 		     (setq backupname (expand-file-name
! 				       (convert-standard-filename
! 					"~/%backup%~")))
! 		     (message "Cannot write backup file; backing up in %s"
! 			      (file-name-nondirectory backupname))
  		     (sleep-for 1)
  		     (condition-case ()
*************** The extension, in a file name, is the pa
*** 1590,1599 ****
    "Create the non-numeric backup file name for FILE.
  This is a separate function so you can redefine it for customization."
!   (if (eq system-type 'ms-dos)
        (let ((fn (file-name-nondirectory file)))
  	(concat (file-name-directory file)
! 		(if (string-match "\\([^.]*\\)\\(\\..*\\)?" fn)
! 		    (substring fn 0 (match-end 1)))
! 		".bak"))
      (concat file "~")))
  
--- 1668,1680 ----
    "Create the non-numeric backup file name for FILE.
  This is a separate function so you can redefine it for customization."
!   (if (and (eq system-type 'ms-dos)
! 	   (not (msdos-long-file-names)))
        (let ((fn (file-name-nondirectory file)))
  	(concat (file-name-directory file)
! 		(or
! 		 (and (string-match "\\`[^.]+\\'" fn)
! 		      (concat (match-string 0 fn) ".~"))
! 		 (and (string-match "\\`[^.]+\\.\\(..?\\)?" fn)
! 		      (concat (match-string 0 fn) "~")))))
      (concat file "~")))
  
*************** This is a separate function so you can r
*** 1602,1608 ****
  This is a separate function so you can redefine it for customization.
  You may need to redefine `file-name-sans-versions' as well."
!   (if (eq system-type 'ms-dos)
!       (string-match "\\.bak$" file)
!     (string-match "~$" file)))
  
  ;; This is used in various files.
--- 1683,1687 ----
  This is a separate function so you can redefine it for customization.
  You may need to redefine `file-name-sans-versions' as well."
!     (string-match "~\\'" file))
  
  ;; This is used in various files.
*************** If the value is nil, don't make a backup
*** 1686,1693 ****
  By default, makes the previous version into a backup file
   if previously requested or if this is the first save.
! With 1 or 3 \\[universal-argument]'s, marks this version
   to become a backup when the next save is done.
! With 2 or 3 \\[universal-argument]'s,
   unconditionally makes the previous version into a backup file.
  With argument of 0, never makes the previous version into a backup file.
  
--- 1765,1776 ----
  By default, makes the previous version into a backup file
   if previously requested or if this is the first save.
! With 1 \\[universal-argument], marks this version
   to become a backup when the next save is done.
! With 2 \\[universal-argument]'s,
   unconditionally makes the previous version into a backup file.
+ With 3 \\[universal-argument]'s, marks this version
+  to become a backup when the next save is done,
+  and unconditionally makes the previous version into a backup file.
+ 
  With argument of 0, never makes the previous version into a backup file.
  
*************** After saving the buffer, run `after-save
*** 1825,1829 ****
      (or buffer-backed-up
  	(setq setmodes (backup-buffer)))
!     (let ((dir (file-name-directory buffer-file-name))) 
        (if (and file-precious-flag
  	       (file-writable-p dir))
--- 1908,1912 ----
      (or buffer-backed-up
  	(setq setmodes (backup-buffer)))
!     (let ((dir (file-name-directory buffer-file-name)))
        (if (and file-precious-flag
  	       (file-writable-p dir))
*************** After saving the buffer, run `after-save
*** 1838,1842 ****
  	    ;; Find the temporary name to write under.
  	    (while nogood
! 	      (setq tempname (format "%s#tmp#%d" dir i))
  	      (setq nogood (file-exists-p tempname))
  	      (setq i (1+ i)))
--- 1921,1930 ----
  	    ;; Find the temporary name to write under.
  	    (while nogood
! 	      (setq tempname (format
! 			      (if (and (eq system-type 'ms-dos)
! 				       (not (msdos-long-file-names)))
! 				  "%s#%d.tm#" ; MSDOS limits files to 8+3
! 				"%s#tmp#%d")
! 			      dir i))
  	      (setq nogood (file-exists-p tempname))
  	      (setq i (1+ i)))
*************** After saving the buffer, run `after-save
*** 1849,1853 ****
  	      ;; If writing the temp file fails,
  	      ;; delete the temp file.
! 	      (or succeed 
  		  (progn
  		    (delete-file tempname)
--- 1937,1941 ----
  	      ;; If writing the temp file fails,
  	      ;; delete the temp file.
! 	      (or succeed
  		  (progn
  		    (delete-file tempname)
*************** Optional second argument EXITING means a
*** 1879,1926 ****
    (interactive "P")
    (save-window-excursion
!     (let ((files-done
! 	   (map-y-or-n-p
! 	    (function
! 	     (lambda (buffer)
! 	       (and (buffer-modified-p buffer)
! 		    (not (buffer-base-buffer buffer))
! 		    (or
! 		     (buffer-file-name buffer)
! 		     (and exiting
! 			  (progn
! 			    (set-buffer buffer)
! 			    (and buffer-offer-save (> (buffer-size) 0)))))
! 		    (if arg
! 			t
! 		      (if (buffer-file-name buffer)
! 			  (format "Save file %s? "
! 				  (buffer-file-name buffer))
! 			(format "Save buffer %s? "
! 				(buffer-name buffer)))))))
! 	    (function
! 	     (lambda (buffer)
! 	       (set-buffer buffer)
! 	       (save-buffer)))
! 	    (buffer-list)
! 	    '("buffer" "buffers" "save")
! 	    (list (list ?\C-r (lambda (buf)
! 				(view-buffer buf)
! 				(setq view-exit-action
! 				      '(lambda (ignore)
! 					 (exit-recursive-edit)))
! 				(recursive-edit)
! 				;; Return nil to ask about BUF again.
! 				nil)
! 			"display the current buffer"))))
! 	  (abbrevs-done
! 	   (and save-abbrevs abbrevs-changed
! 		(progn
! 		  (if (or arg
! 			  (y-or-n-p (format "Save abbrevs in %s? " abbrev-file-name)))
! 		      (write-abbrev-file nil))
! 		  ;; Don't keep bothering user if he says no.
! 		  (setq abbrevs-changed nil)
! 		  t))))
!       (or (> files-done 0) abbrevs-done
  	  (message "(No files need saving)")))))
  
--- 1967,2017 ----
    (interactive "P")
    (save-window-excursion
!     (let* ((queried nil)
! 	   (files-done
! 	    (map-y-or-n-p
! 	     (function
! 	      (lambda (buffer)
! 		(and (buffer-modified-p buffer)
! 		     (not (buffer-base-buffer buffer))
! 		     (or
! 		      (buffer-file-name buffer)
! 		      (and exiting
! 			   (progn
! 			     (set-buffer buffer)
! 			     (and buffer-offer-save (> (buffer-size) 0)))))
! 		     (if arg
! 			 t
! 		       (setq queried t)
! 		       (if (buffer-file-name buffer)
! 			   (format "Save file %s? "
! 				   (buffer-file-name buffer))
! 			 (format "Save buffer %s? "
! 				 (buffer-name buffer)))))))
! 	     (function
! 	      (lambda (buffer)
! 		(set-buffer buffer)
! 		(save-buffer)))
! 	     (buffer-list)
! 	     '("buffer" "buffers" "save")
! 	     (list (list ?\C-r (lambda (buf)
! 				 (view-buffer buf)
! 				 (setq view-exit-action
! 				       '(lambda (ignore)
! 					  (exit-recursive-edit)))
! 				 (recursive-edit)
! 				 ;; Return nil to ask about BUF again.
! 				 nil)
! 			 "display the current buffer"))))
! 	   (abbrevs-done
! 	    (and save-abbrevs abbrevs-changed
! 		 (progn
! 		   (if (or arg
! 			   (y-or-n-p (format "Save abbrevs in %s? "
! 					     abbrev-file-name)))
! 		       (write-abbrev-file nil))
! 		   ;; Don't keep bothering user if he says no.
! 		   (setq abbrevs-changed nil)
! 		   t))))
!       (or queried (> files-done 0) abbrevs-done
  	  (message "(No files need saving)")))))
  
*************** saying what text to write."
*** 1974,1984 ****
  	 (dir  (file-name-directory    filename))
  	 (comp (file-name-all-completions file dir))
! 	 newest)
      (while comp
!       (setq file (concat dir (car comp))
  	    comp (cdr comp))
!       (if (and (backup-file-name-p file)
! 	       (or (null newest) (file-newer-than-file-p file newest)))
! 	  (setq newest file)))
      newest))
  
--- 2065,2079 ----
  	 (dir  (file-name-directory    filename))
  	 (comp (file-name-all-completions file dir))
!          (newest nil)
!          tem)
      (while comp
!       (setq tem (car comp)
  	    comp (cdr comp))
!       (cond ((and (backup-file-name-p tem)
!                   (string= (file-name-sans-versions tem) file))
!              (setq tem (concat dir tem))
!              (if (or (null newest)
!                      (file-newer-than-file-p tem newest))
!                  (setq newest tem)))))
      newest))
  
*************** or multiple mail buffers, etc."
*** 2009,2013 ****
  Interactively, the default choice of directory to create
  is the current default directory for file names.
! That is useful when you have visited a file in a nonexistint directory.
  
  Noninteractively, the second (optional) argument PARENTS says whether
--- 2104,2108 ----
  Interactively, the default choice of directory to create
  is the current default directory for file names.
! That is useful when you have visited a file in a nonexistent directory.
  
  Noninteractively, the second (optional) argument PARENTS says whether
*************** to create parent directories if they don
*** 2025,2029 ****
  	      create-list)
  	  (while (not (file-exists-p dir))
! 	    (setq create-list (cons dir create-list)	    
  		  dir (directory-file-name (file-name-directory dir))))
  	  (while create-list
--- 2120,2124 ----
  	      create-list)
  	  (while (not (file-exists-p dir))
! 	    (setq create-list (cons dir create-list)
  		  dir (directory-file-name (file-name-directory dir))))
  	  (while create-list
*************** If `revert-buffer-function' is used to o
*** 2057,2061 ****
  mechanism, this hook is not used.")
  
! (defun revert-buffer (&optional ignore-auto noconfirm)
    "Replace the buffer text with the text of the visited file on disk.
  This undoes all changes since the file was visited or saved.
--- 2152,2156 ----
  mechanism, this hook is not used.")
  
! (defun revert-buffer (&optional ignore-auto noconfirm preserve-modes)
    "Replace the buffer text with the text of the visited file on disk.
  This undoes all changes since the file was visited or saved.
*************** beginning and `after-revert-hook' at the
*** 2137,2141 ****
  	       (setq buffer-file-truename
  		     (abbreviate-file-name (file-truename buffer-file-name)))
! 	       (after-find-file nil nil t t)
  	       ;; Run after-revert-hook as it was before we reverted.
  	       (setq-default revert-buffer-internal-hook global-hook)
--- 2232,2236 ----
  	       (setq buffer-file-truename
  		     (abbreviate-file-name (file-truename buffer-file-name)))
! 	       (after-find-file nil nil t t preserve-modes)
  	       ;; Run after-revert-hook as it was before we reverted.
  	       (setq-default revert-buffer-internal-hook global-hook)
*************** beginning and `after-revert-hook' at the
*** 2153,2157 ****
    ;; only rarely.
    ;; Not just because users often use the default.
!   (interactive "fRecover file: ")
    (setq file (expand-file-name file))
    (if (auto-save-file-name-p (file-name-nondirectory file))
--- 2248,2252 ----
    ;; only rarely.
    ;; Not just because users often use the default.
!   (interactive "FRecover file: ")
    (setq file (expand-file-name file))
    (if (auto-save-file-name-p (file-name-nondirectory file))
*************** To choose one, move point to the proper 
*** 2185,2189 ****
  Then you'll be asked about a number of files to recover."
    (interactive)
!   (dired (concat auto-save-list-file-prefix "*"))
    (goto-char (point-min))
    (or (looking-at "Move to the session you want to recover,")
--- 2280,2285 ----
  Then you'll be asked about a number of files to recover."
    (interactive)
!   (let ((ls-lisp-support-shell-wildcards t))
!     (dired (concat auto-save-list-file-prefix "*")))
    (goto-char (point-min))
    (or (looking-at "Move to the session you want to recover,")
*************** This command is used in the special Dire
*** 2259,2263 ****
  			       (condition-case nil
  				   (save-excursion (recover-file file))
! 				 (error 
  				  "Failed to recover `%s'" file)))
  			     files
--- 2355,2359 ----
  			       (condition-case nil
  				   (save-excursion (recover-file file))
! 				 (error
  				  "Failed to recover `%s'" file)))
  			     files
*************** before calling this function.  You can r
*** 2326,2333 ****
  See also `auto-save-file-name-p'."
    (if buffer-file-name
!       (concat (file-name-directory buffer-file-name)
! 	      "#"
! 	      (file-name-nondirectory buffer-file-name)
! 	      "#")
  
      ;; Deal with buffers that don't have any associated files.  (Mail
--- 2422,2436 ----
  See also `auto-save-file-name-p'."
    (if buffer-file-name
!       (if (and (eq system-type 'ms-dos)
! 	       (not (msdos-long-file-names)))
! 	  (let ((fn (file-name-nondirectory buffer-file-name)))
! 		(string-match "\\`\\([^.]+\\)\\(\\.\\(..?\\)?.?\\|\\)\\'" fn)
! 	    (concat (file-name-directory buffer-file-name)
! 		    "#" (match-string 1 fn) 
! 		    "." (match-string 3 fn) "#"))
! 	(concat (file-name-directory buffer-file-name)
! 		"#"
! 		(file-name-nondirectory buffer-file-name)
! 		"#"))
  
      ;; Deal with buffers that don't have any associated files.  (Mail
*************** FILENAME should lack slashes.  You can r
*** 2358,2361 ****
--- 2461,2531 ----
    (string-match "^#.*#$" filename))
  
+ (defun wildcard-to-regexp (wildcard)
+   "Given a shell file name pattern WILDCARD, return an equivalent regexp.
+ The generated regexp will match a filename iff the filename
+ matches that wildcard according to shell rules.  Only wildcards known
+ by `sh' are supported."
+   (let* ((i (string-match "[[.*+\\^$?]" wildcard))
+ 	 ;; Copy the initial run of non-special characters.
+ 	 (result (substring wildcard 0 i))
+ 	 (len (length wildcard)))
+     ;; If no special characters, we're almost done.
+     (if i
+ 	(while (< i len)
+ 	  (let ((ch (aref wildcard i))
+ 		j)
+ 	    (setq
+ 	     result
+ 	     (concat result
+ 		     (cond
+ 		      ((eq ch ?\[)	; [...] maps to regexp char class
+ 		       (progn
+ 			 (setq i (1+ i))
+ 			 (concat
+ 			  (cond
+ 			   ((eq (aref wildcard i) ?!) ; [!...] -> [^...]
+ 			    (progn
+ 			      (setq i (1+ i))
+ 			      (if (eq (aref wildcard i) ?\])
+ 				  (progn
+ 				    (setq i (1+ i))
+ 				    "[^]")
+ 				"[^")))
+ 			   ((eq (aref wildcard i) ?^)
+ 			    ;; Found "[^".  Insert a `\0' character
+ 			    ;; (which cannot happen in a filename)
+ 			    ;; into the character class, so that `^'
+ 			    ;; is not the first character after `[',
+ 			    ;; and thus non-special in a regexp.
+ 			    (progn
+ 			      (setq i (1+ i))
+ 			      "[\000^"))
+ 			   ((eq (aref wildcard i) ?\])
+ 			    ;; I don't think `]' can appear in a
+ 			    ;; character class in a wildcard, but
+ 			    ;; let's be general here.
+ 			    (progn
+ 			      (setq i (1+ i))
+ 			      "[]"))
+ 			   (t "["))
+ 			  (prog1	; copy everything upto next `]'.
+ 			      (substring wildcard
+ 					 i
+ 					 (setq j (string-match
+ 						  "]" wildcard i)))
+ 			    (setq i (if j (1- j) (1- len)))))))
+ 		      ((eq ch ?.)  "\\.")
+ 		      ((eq ch ?*)  "[^\000]*")
+ 		      ((eq ch ?+)  "\\+")
+ 		      ((eq ch ?^)  "\\^")
+ 		      ((eq ch ?$)  "\\$")
+ 		      ((eq ch ?\\) "\\\\") ; probably cannot happen...
+ 		      ((eq ch ??)  "[^\000]")
+ 		      (t (char-to-string ch)))))
+ 	    (setq i (1+ i)))))
+     ;; Shell wildcards should match the entire filename,
+     ;; not its part.  Make the regexp say so.
+     (concat "\\`" result "\\'")))
+ 
  (defconst list-directory-brief-switches
    (if (eq system-type 'vax-vms) "" "-CF")
*************** and `list-directory-verbose-switches'."
*** 2390,2394 ****
        (save-excursion
  	(set-buffer "*Directory*")
! 	(setq default-directory (file-name-directory dirname))
  	(let ((wildcard (not (file-directory-p dirname))))
  	  (insert-directory dirname switches wildcard (not wildcard)))))))
--- 2560,2567 ----
        (save-excursion
  	(set-buffer "*Directory*")
! 	(setq default-directory
! 	      (if (file-directory-p dirname)
! 		  (file-name-as-directory dirname)
! 		(file-name-directory dirname)))
  	(let ((wildcard (not (file-directory-p dirname))))
  	  (insert-directory dirname switches wildcard (not wildcard)))))))
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/fill.el emacs-19.31/lisp/fill.el
*** emacs-19.30/lisp/fill.el	Sat Nov 18 11:42:37 1995
--- emacs-19.31/lisp/fill.el	Tue Mar 19 15:03:48 1996
***************
*** 1,5 ****
  ;;; fill.el --- fill commands for Emacs
  
! ;; Copyright (C) 1985, 1986, 1992, 1994, 1995 Free Software Foundation, Inc.
  
  ;; Keywords: wp
--- 1,5 ----
  ;;; fill.el --- fill commands for Emacs
  
! ;; Copyright (C) 1985, 86, 92, 94, 95, 1996 Free Software Foundation, Inc.
  
  ;; Keywords: wp
***************
*** 18,23 ****
  
  ;; 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:
--- 18,24 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** A value of nil means that any change in 
*** 42,46 ****
  
  (defvar fill-paragraph-function nil
!   "Mode-specific function to fill a paragraph.")
  
  (defun set-fill-prefix ()
--- 43,48 ----
  
  (defvar fill-paragraph-function nil
!   "Mode-specific function to fill a paragraph, or nil if there is none.
! If the function returns nil, then `fill-paragraph' does its normal work.")
  
  (defun set-fill-prefix ()
*************** number equals or exceeds the local fill-
*** 100,104 ****
  (defun canonically-space-region (beg end)
    "Remove extra spaces between words in region.
! Puts one space between words in region; two between sentences.
  Remove indentation from each line."
    (interactive "r")
--- 102,107 ----
  (defun canonically-space-region (beg end)
    "Remove extra spaces between words in region.
! Leave one space between words, two at end of sentences or after colons
! (depending on values of `sentence-end-double-space' and `colon-double-space').
  Remove indentation from each line."
    (interactive "r")
*************** Remove indentation from each line."
*** 129,137 ****
      (while (and (< (point) end)
  		(re-search-forward "[.?!][])}\"']*$" end t))
!       (insert-and-inherit ? ))))
  
  (defun fill-context-prefix (from to &optional first-line-regexp)
    "Compute a fill prefix from the text between FROM and TO.
! This uses the variables `adapive-fill-prefix' and `adaptive-fill-function'.
  If FIRST-LINE-REGEXP is non-nil, then when taking a prefix from the
  first line, insist it must match FIRST-LINE-REGEXP."
--- 132,143 ----
      (while (and (< (point) end)
  		(re-search-forward "[.?!][])}\"']*$" end t))
!       ;; We insert before markers in case a caller such as
!       ;; do-auto-fill has done a save-excursion with point at the end
!       ;; of the line and wants it to stay at the end of the line.
!       (insert-before-markers-and-inherit ? ))))
  
  (defun fill-context-prefix (from to &optional first-line-regexp)
    "Compute a fill prefix from the text between FROM and TO.
! This uses the variables `adaptive-fill-prefix' and `adaptive-fill-function'.
  If FIRST-LINE-REGEXP is non-nil, then when taking a prefix from the
  first line, insist it must match FIRST-LINE-REGEXP."
*************** first line, insist it must match FIRST-L
*** 149,154 ****
  	(setq at-second t))
        (move-to-left-margin)
!       (let ((start (point))
! 	    (eol (save-excursion (end-of-line) (point))))
  	(setq result
  	      (if (not (looking-at paragraph-start))
--- 155,159 ----
  	(setq at-second t))
        (move-to-left-margin)
!       (let ((start (point)))
  	(setq result
  	      (if (not (looking-at paragraph-start))
*************** first line, insist it must match FIRST-L
*** 162,166 ****
  	     result)))))
  
! (defun fill-region-as-paragraph (from to &optional justify nosqueeze)
    "Fill the region as one paragraph.
  It removes any paragraph breaks in the region and extra newlines at the end,
--- 167,172 ----
  	     result)))))
  
! (defun fill-region-as-paragraph (from to &optional justify
! 				      nosqueeze squeeze-after)
    "Fill the region as one paragraph.
  It removes any paragraph breaks in the region and extra newlines at the end,
*************** function, but with a prefix arg, does fu
*** 173,178 ****
  
  From a program, optional third arg JUSTIFY can specify any type of
! justification, and fourth arg NOSQUEEZE non-nil means not to make spaces
! between words canonical before filling.
  
  If `sentence-end-double-space' is non-nil, then period followed by one
--- 179,185 ----
  
  From a program, optional third arg JUSTIFY can specify any type of
! justification.  Fourth arg NOSQUEEZE non-nil means not to make spaces
! between words canonical before filling.  Fifth arg SQUEEZE-AFTER, if non-nil,
! means don't canonicalize spaces before that position.
  
  If `sentence-end-double-space' is non-nil, then period followed by one
*************** space does not end a sentence, so don't 
*** 197,200 ****
--- 204,208 ----
    
      ;; Delete all but one soft newline at end of region.
+     ;; And leave TO before that one.
      (goto-char to)
      (while (and (> (point) from) (eq ?\n (char-after (1- (point)))))
*************** space does not end a sentence, so don't 
*** 264,268 ****
  		     (forward-line 1))
  		   (goto-char from)
! 		   (and (looking-at fpre) (goto-char (match-end 0)))
  		   (setq from (point)))))
  	  ;; Remove indentation from lines other than the first.
--- 272,277 ----
  		     (forward-line 1))
  		   (goto-char from)
! 		   (if (looking-at fpre)
! 		       (goto-char (match-end 0)))
  		   (setq from (point)))))
  	  ;; Remove indentation from lines other than the first.
*************** space does not end a sentence, so don't 
*** 284,288 ****
  	  (if (and nosqueeze (not (eq justify 'full)))
  	      nil
! 	    (canonically-space-region (point) (point-max))
  	    (goto-char (point-max))
  	    (delete-horizontal-space)
--- 293,297 ----
  	  (if (and nosqueeze (not (eq justify 'full)))
  	      nil
! 	    (canonically-space-region (or squeeze-after (point)) (point-max))
  	    (goto-char (point-max))
  	    (delete-horizontal-space)
*************** space does not end a sentence, so don't 
*** 313,317 ****
  		      (skip-chars-backward "^ \n" linebeg)))
  		;; If the left margin and fill prefix by themselves
! 		;; pass the fill-column, keep at least one word.
  		;; This handles ALL BUT the first line of the paragraph.
  		(if (if (zerop prefixcol)
--- 322,328 ----
  		      (skip-chars-backward "^ \n" linebeg)))
  		;; If the left margin and fill prefix by themselves
! 		;; pass the fill-column. or if they are zero
! 		;; but we have no room for even one word,
! 		;; keep at least one word anyway.
  		;; This handles ALL BUT the first line of the paragraph.
  		(if (if (zerop prefixcol)
*************** space does not end a sentence, so don't 
*** 362,379 ****
  			(skip-chars-forward "^ \t\n")
  			(setq first nil))))
! 		;; Replace whitespace here with one newline, then indent to left
! 		;; margin.
! 		(skip-chars-backward " \t")
! 		(insert ?\n)
! 		;; Give newline the properties of the space(s) it replaces
! 		(set-text-properties (1- (point)) (point)
! 				     (text-properties-at (point)))
! 		(indent-to-left-margin)
! 		;; Insert the fill prefix after indentation.
! 		;; Set prefixcol so whitespace in the prefix won't get lost.
! 		(and fill-prefix (not (equal fill-prefix ""))
! 		     (progn
! 		       (insert-and-inherit fill-prefix)
! 		       (setq prefixcol (current-column)))))
  	      ;; Justify the line just ended, if desired.
  	      (if justify
--- 373,393 ----
  			(skip-chars-forward "^ \t\n")
  			(setq first nil))))
! 		;; Check again to see if we got to the end of the paragraph.
! 		(if (save-excursion (skip-chars-forward " \t") (eobp))
! 		    (or nosqueeze (delete-horizontal-space))
! 		  ;; Replace whitespace here with one newline, then indent to left
! 		  ;; margin.
! 		  (skip-chars-backward " \t")
! 		  (insert ?\n)
! 		  ;; Give newline the properties of the space(s) it replaces
! 		  (set-text-properties (1- (point)) (point)
! 				       (text-properties-at (point)))
! 		  (indent-to-left-margin)
! 		  ;; Insert the fill prefix after indentation.
! 		  ;; Set prefixcol so whitespace in the prefix won't get lost.
! 		  (and fill-prefix (not (equal fill-prefix ""))
! 		       (progn
! 			 (insert-and-inherit fill-prefix)
! 			 (setq prefixcol (current-column))))))
  	      ;; Justify the line just ended, if desired.
  	      (if justify
*************** otherwise it is made canonical."
*** 712,716 ****
    "Remove justification whitespace from current line.
  If the line is centered or right-justified, this function removes any
! indentation past the left margin.  If the line is full-jusitified, it removes
  extra spaces between words.  It does nothing in other justification modes."
    (let ((justify (current-justification)))
--- 726,730 ----
    "Remove justification whitespace from current line.
  If the line is centered or right-justified, this function removes any
! indentation past the left margin.  If the line is full-justified, it removes
  extra spaces between words.  It does nothing in other justification modes."
    (let ((justify (current-justification)))
*************** extra spaces between words.  It does not
*** 738,742 ****
    "Remove justification whitespace from region.
  For centered or right-justified regions, this function removes any indentation
! past the left margin from each line.  For full-jusitified lines, it removes 
  extra spaces between words.  It does nothing in other justification modes.
  Arguments BEGIN and END are optional; default is the whole buffer."
--- 752,756 ----
    "Remove justification whitespace from region.
  For centered or right-justified regions, this function removes any indentation
! past the left margin from each line.  For full-justified lines, it removes 
  extra spaces between words.  It does nothing in other justification modes.
  Arguments BEGIN and END are optional; default is the whole buffer."
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/find-dired.el emacs-19.31/lisp/find-dired.el
*** emacs-19.30/lisp/find-dired.el	Fri Jun 30 20:01:14 1995
--- emacs-19.31/lisp/find-dired.el	Sun Jan 14 02:34:30 1996
***************
*** 1,5 ****
  ;;; find-dired.el --- run a `find' command and dired the output
  
! ;;; Copyright (C) 1992, 1994, 1995 Free Software Foundation, Inc.
  
  ;; Author: Roland McGrath <roland@gnu.ai.mit.edu>,
--- 1,5 ----
  ;;; find-dired.el --- run a `find' command and dired the output
  
! ;; Copyright (C) 1992, 1994, 1995 Free Software Foundation, Inc.
  
  ;; Author: Roland McGrath <roland@gnu.ai.mit.edu>,
***************
*** 7,25 ****
  ;; Keywords: unix
  
! ;;; This program 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.
! ;;;
! ;;; This program 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.
! ;;;
! ;;; A copy of the GNU General Public License can be obtained from this
! ;;; program's author (send electronic mail to roland@ai.mit.edu) or from
! ;;; the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA
! ;;; 02139, USA.
! ;;;
  
  ;;; Code:
--- 7,26 ----
  ;; Keywords: unix
  
! ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Code:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/find-file.el emacs-19.31/lisp/find-file.el
*** emacs-19.30/lisp/find-file.el	Sat Aug 26 16:43:31 1995
--- emacs-19.31/lisp/find-file.el	Sun Jan 14 02:34:30 1996
***************
*** 6,24 ****
  ;; Copyright (C) 1994, 1995 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.
  
  ;;; Commentary:
--- 6,25 ----
  ;; Copyright (C) 1994, 1995 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** Arguments: (search-dirs fname-stub &opti
*** 517,522 ****
        nil)
  
!      ((bufferp (get-buffer filename))
!       (ff-switch-to-buffer filename other-window)
        filename)
                 
--- 518,523 ----
        nil)
  
!      ((bufferp (get-file-buffer filename))
!       (ff-switch-to-buffer (get-file-buffer filename) other-window)
        filename)
                 
*************** Arguments: (search-dirs fname-stub &opti
*** 644,648 ****
  
  (defun ff-string-match (regexp string &optional start)
!   "Like string-match (which see), but set `case-fold-search' temporarily.
  The value used comes from `ff-case-fold-search'."
    (let ((case-fold-search ff-case-fold-search))
--- 645,649 ----
  
  (defun ff-string-match (regexp string &optional start)
!   "Like `string-match', but set `case-fold-search' temporarily.
  The value used comes from `ff-case-fold-search'."
    (let ((case-fold-search ff-case-fold-search))
*************** The value used comes from `ff-case-fold-
*** 668,672 ****
  (defun ff-treat-as-special ()
    "Returns the file to look for if the construct was special, else nil.
! The construct is defined in the variable `ff-special-constructs' (which see)."
    (let* (fname
           (list ff-special-constructs)
--- 669,673 ----
  (defun ff-treat-as-special ()
    "Returns the file to look for if the construct was special, else nil.
! The construct is defined in the variable `ff-special-constructs'."
    (let* (fname
           (list ff-special-constructs)
*************** called before `ff-post-load-hooks'."
*** 736,750 ****
  
  (defun ff-find-file (file &optional in-other-window new-file)
!   "Like `find-file' (which see), but may put the file in another window."
    (ff-switch-file 'find-file 
                    'find-file-other-window 
                    file in-other-window new-file))
  
! (defun ff-switch-to-buffer (file &optional in-other-window)
!   "Like `switch-to-buffer' (which see), but may put the buffer in another window."
  
    (ff-switch-file 'switch-to-buffer 
                    'switch-to-buffer-other-window 
!                   file in-other-window nil))
  
  (cond 
--- 737,751 ----
  
  (defun ff-find-file (file &optional in-other-window new-file)
!   "Like `find-file', but may show the file in another window."
    (ff-switch-file 'find-file 
                    'find-file-other-window 
                    file in-other-window new-file))
  
! (defun ff-switch-to-buffer (buffer-or-name &optional in-other-window)
!   "Like `switch-to-buffer', but may show the buffer in another window."
  
    (ff-switch-file 'switch-to-buffer 
                    'switch-to-buffer-other-window 
!                   buffer-or-name in-other-window nil))
  
  (cond 
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/find-gc.el emacs-19.31/lisp/find-gc.el
*** emacs-19.30/lisp/find-gc.el	Mon Mar 22 00:37:20 1993
--- emacs-19.31/lisp/find-gc.el	Sun Jan 14 02:34:30 1996
***************
*** 18,29 ****
  
  ;; 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:
  
! ;;; Produce in unsafe-list the set of all functions that may invoke GC.
! ;;; This expects the Emacs sources to live in emacs-source-directory.
! ;;; It creates a temporary working directory /tmp/esrc.
  
  ;;; Code:
--- 18,30 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
! ;; Produce in unsafe-list the set of all functions that may invoke GC.
! ;; This expects the Emacs sources to live in emacs-source-directory.
! ;; It creates a temporary working directory /tmp/esrc.
  
  ;;; Code:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/finder-inf.el emacs-19.31/lisp/finder-inf.el
*** emacs-19.30/lisp/finder-inf.el	Tue Oct 31 04:04:31 1995
--- emacs-19.31/lisp/finder-inf.el	Sat May 25 20:04:17 1996
***************
*** 7,16 ****
  
  (setq finder-package-info '(
-     ("default.el"
-         nil
-         nil)
-     ("po-mode.el"
-         nil
-         nil)
      ("abbrev.el"
          "abbrev mode commands for Emacs"
--- 7,10 ----
***************
*** 20,24 ****
          (abbrev))
      ("ada-mode.el"
!         nil
          nil)
      ("add-log.el"
--- 14,18 ----
          (abbrev))
      ("ada-mode.el"
!         "An Emacs major-mode for editing Ada source."
          nil)
      ("add-log.el"
***************
*** 29,33 ****
          (extensions  lisp  tools))
      ("allout.el"
!         nil
          (outline mode))
      ("ange-ftp.el"
--- 23,27 ----
          (extensions  lisp  tools))
      ("allout.el"
!         "Extensive outline mode for use alone and with other modes."
          (outline mode))
      ("ange-ftp.el"
***************
*** 38,42 ****
          (calendar))
      ("apropos.el"
!         "faster apropos commands."
          (help))
      ("arc-mode.el"
--- 32,36 ----
          (calendar))
      ("apropos.el"
!         "apropos commands for users and programmers."
          (help))
      ("arc-mode.el"
***************
*** 53,58 ****
          (extensions))
      ("auto-show.el"
!         nil
!         nil)
      ("autoinsert.el"
          "automatic mode-dependent insertion of text into new files"
--- 47,52 ----
          (extensions))
      ("auto-show.el"
!         "perform automatic horizontal scrolling as point moves"
!         (scroll display minor-mode))
      ("autoinsert.el"
          "automatic mode-dependent insertion of text into new files"
***************
*** 62,66 ****
          (maint))
      ("avoid.el"
!         nil
          (mouse))
      ("awk-mode.el"
--- 56,60 ----
          (maint))
      ("avoid.el"
!         "make mouse pointer stay out of the way of editing"
          (mouse))
      ("awk-mode.el"
***************
*** 68,72 ****
          (unix  languages))
      ("backquote.el"
!         nil
          (extensions  internal))
      ("bib-mode.el"
--- 62,66 ----
          (unix  languages))
      ("backquote.el"
!         "implement the ` Lisp construct"
          (extensions  internal))
      ("bib-mode.el"
***************
*** 85,88 ****
--- 79,85 ----
          "set bookmarks, maybe annotate them, jump to them later."
          (bookmarks  placeholders  annotations))
+     ("browse-url.el"
+         "ask a WWW browser to load a URL"
+         (hypertext))
      ("buff-menu.el"
          "buffer menu main function and support functions."
***************
*** 97,106 ****
          "compilation of Lisp code into byte code."
          (internal))
-     ("bytecpat.el"
-         nil
-         nil)
      ("c-mode.el"
          "C code editing commands for Emacs"
          (c))
      ("cal-dst.el"
          "calendar functions for daylight savings rules."
--- 94,106 ----
          "compilation of Lisp code into byte code."
          (internal))
      ("c-mode.el"
          "C code editing commands for Emacs"
          (c))
+     ("cal-china.el"
+         "calendar functions for the Chinese calendar."
+         (calendar))
+     ("cal-coptic.el"
+         "calendar functions for the Coptic/Ethiopic calendars."
+         (calendar))
      ("cal-dst.el"
          "calendar functions for daylight savings rules."
***************
*** 109,112 ****
--- 109,124 ----
          "calendar functions for the French Revolutionary calendar."
          (calendar))
+     ("cal-hebrew.el"
+         "calendar functions for the Hebrew calendar."
+         (calendar))
+     ("cal-islam.el"
+         "calendar functions for the Islamic calendar."
+         (calendar))
+     ("cal-iso.el"
+         "calendar functions for the ISO calendar."
+         (calendar))
+     ("cal-julian.el"
+         "calendar functions for the Julian calendar."
+         (calendar))
      ("cal-mayan.el"
          "calendar functions for the Mayan calendars."
***************
*** 115,132 ****
          "calendar functions for menu bar and popup menu support"
          (calendar))
      ("cal-x.el"
!         "calendar windows in dedicated frames in x-windows"
          (calendar))
      ("calendar.el"
!         "Calendar functions.  -*-byte-compile-dynamic: t;-*-"
          (calendar))
      ("case-table.el"
          "code to extend the character set and support case tables."
          (i18n))
      ("cc-mode.el"
          "major mode for editing C, C++, and Objective-C code"
          (c languages oop))
      ("cdl.el"
!         nil
          (data))
      ("chistory.el"
--- 127,156 ----
          "calendar functions for menu bar and popup menu support"
          (calendar))
+     ("cal-move.el"
+         "calendar functions for movement in the calendar"
+         (calendar))
+     ("cal-persia.el"
+         "calendar functions for the Persian calendar."
+         (calendar))
+     ("cal-tex.el"
+         "calendar functions for printing calendars with LaTeX."
+         (calendar))
      ("cal-x.el"
!         "calendar windows in dedicated frames in X"
          (calendar))
      ("calendar.el"
!         "Calendar functions."
          (calendar))
      ("case-table.el"
          "code to extend the character set and support case tables."
          (i18n))
+     ("cc-compat.el"
+         "cc-mode compatibility with c-mode.el confusion"
+         (c languages oop))
      ("cc-mode.el"
          "major mode for editing C, C++, and Objective-C code"
          (c languages oop))
      ("cdl.el"
!         "Common Data Language (CDL) utility functions for Gnu Emacs"
          (data))
      ("chistory.el"
***************
*** 134,141 ****
          nil)
      ("cl-compat.el"
!         nil
          (extensions))
      ("cl-extra.el"
!         nil
          (extensions))
      ("cl-indent.el"
--- 158,165 ----
          nil)
      ("cl-compat.el"
!         "Common Lisp extensions for GNU Emacs Lisp (compatibility)"
          (extensions))
      ("cl-extra.el"
!         "Common Lisp extensions for GNU Emacs Lisp (part two)"
          (extensions))
      ("cl-indent.el"
***************
*** 143,156 ****
          (lisp  tools))
      ("cl-macs.el"
!         nil
          (extensions))
      ("cl-seq.el"
!         nil
          (extensions))
      ("cl-specs.el"
!         nil
          (lisp  tools  maint))
      ("cl.el"
!         nil
          (extensions))
      ("cmacexp.el"
--- 167,180 ----
          (lisp  tools))
      ("cl-macs.el"
!         "Common Lisp extensions for GNU Emacs Lisp (part four)"
          (extensions))
      ("cl-seq.el"
!         "Common Lisp extensions for GNU Emacs Lisp (part three)"
          (extensions))
      ("cl-specs.el"
!         "Edebug specs for cl.el"
          (lisp  tools  maint))
      ("cl.el"
!         "Common Lisp extensions for GNU Emacs Lisp"
          (extensions))
      ("cmacexp.el"
***************
*** 170,174 ****
          (tools  processes))
      ("complete.el"
!         nil
          (abbrev))
      ("completion.el"
--- 194,198 ----
          (tools  processes))
      ("complete.el"
!         "partial completion mechanism plus other goodies"
          (abbrev))
      ("completion.el"
***************
*** 178,184 ****
          "retrieve random phrases from fortune cookie files"
          (games))
      ("cplus-md.el"
          "C++ code editing commands for Emacs"
!         (c languages oop))
      ("cpp.el"
          "Highlight or hide text according to cpp conditionals."
--- 202,211 ----
          "retrieve random phrases from fortune cookie files"
          (games))
+     ("copyright.el"
+         "update the copyright notice in current buffer"
+         (maint  tools))
      ("cplus-md.el"
          "C++ code editing commands for Emacs"
!         (c))
      ("cpp.el"
          "Highlight or hide text according to cpp conditionals."
***************
*** 187,190 ****
--- 214,220 ----
          "handles print-level and print-circle."
          (extensions))
+     ("custom.el"
+         "User friendly customization support."
+         (help))
      ("dabbrev.el"
          "dynamic abbreviation package"
***************
*** 193,208 ****
          "debuggers and related commands for Emacs"
          (lisp  tools  maint))
      ("delsel.el"
          "delete selection if you insert"
          nil)
      ("derived.el"
!         nil
          nil)
      ("desktop.el"
          "save partial status of Emacs when killed"
          (customization))
-     ("diary-ins.el"
-         "calendar functions for adding diary entries."
-         (diary  calendar))
      ("diary-lib.el"
          "diary functions."
--- 223,241 ----
          "debuggers and related commands for Emacs"
          (lisp  tools  maint))
+     ("decipher.el"
+         "Cryptanalyze monoalphabetic substitution ciphers"
+         (games))
+     ("default.el"
+         nil
+         nil)
      ("delsel.el"
          "delete selection if you insert"
          nil)
      ("derived.el"
!         "allow inheritance of major modes."
          nil)
      ("desktop.el"
          "save partial status of Emacs when killed"
          (customization))
      ("diary-lib.el"
          "diary functions."
***************
*** 230,234 ****
          (games))
      ("docref.el"
!         nil
          (docs  help  lisp))
      ("doctor.el"
--- 263,267 ----
          (games))
      ("docref.el"
!         "Simple cross references for Elisp documentation strings"
          (docs  help  lisp))
      ("doctor.el"
***************
*** 239,243 ****
          (internal))
      ("double.el"
!         nil
          (i18n))
      ("dunnet.el"
--- 272,276 ----
          (internal))
      ("double.el"
!         "Support for keyboard remapping with double clicking"
          (i18n))
      ("dunnet.el"
***************
*** 259,271 ****
          "diff-related utilities"
          nil)
      ("ediff-init.el"
!         "Macros, variables and defsubsts used by Ediff"
          nil)
      ("ediff-merg.el"
          "merging utilities"
          nil)
      ("ediff-util.el"
          "the core commands and utilities of ediff"
          nil)
      ("ediff-wind.el"
          "window manipulation utilities"
--- 292,313 ----
          "diff-related utilities"
          nil)
+     ("ediff-hook.el"
+         "setup for Ediff's menus and autoloads"
+         nil)
      ("ediff-init.el"
!         "Macros, variables, and defsubsts used by Ediff"
          nil)
      ("ediff-merg.el"
          "merging utilities"
          nil)
+     ("ediff-mult.el"
+         "support for multi-file/multi-buffer processing in Ediff"
+         nil)
      ("ediff-util.el"
          "the core commands and utilities of ediff"
          nil)
+     ("ediff-vers.el"
+         "version control interface to Ediff"
+         nil)
      ("ediff-wind.el"
          "window manipulation utilities"
***************
*** 278,294 ****
          (abbrev))
      ("edt-lk201.el"
!         nil
          (emulations))
      ("edt-mapper.el"
!         nil
          (emulations))
      ("edt-pc.el"
!         nil
          (emulations))
      ("edt-vt100.el"
!         nil
          (emulations))
      ("edt.el"
!         nil
          (emulations))
      ("ehelp.el"
--- 320,336 ----
          (abbrev))
      ("edt-lk201.el"
!         "Enhanced EDT Keypad Mode Emulation for LK-201 Keyboards"
          (emulations))
      ("edt-mapper.el"
!         "Create an EDT LK-201 Map File for X-Windows Emacs"
          (emulations))
      ("edt-pc.el"
!         "Enhanced EDT Keypad Mode Emulation for PC 101 Keyboards"
          (emulations))
      ("edt-vt100.el"
!         "Enhanced EDT Keypad Mode Emulation for VT Series Terminals"
          (emulations))
      ("edt.el"
!         "Enhanced EDT Keypad Mode Emulation for GNU Emacs 19"
          (emulations))
      ("ehelp.el"
***************
*** 300,307 ****
      ("elp.el"
          "Emacs Lisp Profiler"
!         (     emacs lisp profile timing))
      ("emacs-lock.el"
!         nil
!         ())
      ("emacsbug.el"
          "command to report Emacs bugs to appropriate mailing list."
--- 342,349 ----
      ("elp.el"
          "Emacs Lisp Profiler"
!         (emacs lisp profile timing))
      ("emacs-lock.el"
!         "prevents you from exiting emacs if a buffer is locked"
!         nil)
      ("emacsbug.el"
          "command to report Emacs bugs to appropriate mailing list."
***************
*** 311,315 ****
          (unix  tools))
      ("enriched.el"
!         nil
          (wp  faces))
      ("env.el"
--- 353,357 ----
          (unix  tools))
      ("enriched.el"
!         "read and save files in text/enriched format"
          (wp  faces))
      ("env.el"
***************
*** 322,330 ****
          "Redefine eval-region, and subrs that use it, in Lisp"
          (lisp))
      ("f90.el"
!         nil
          (fortran  f90  languages))
      ("facemenu.el"
!         nil
          (faces))
      ("faces.el"
--- 364,375 ----
          "Redefine eval-region, and subrs that use it, in Lisp"
          (lisp))
+     ("executable.el"
+         "base functionality for executable interpreter scripts"
+         (languages  unix))
      ("f90.el"
!         "Fortran-90 mode (free format)"
          (fortran  f90  languages))
      ("facemenu.el"
!         "create a face menu for interactively adding fonts to text"
          (faces))
      ("faces.el"
***************
*** 334,337 ****
--- 379,385 ----
          "Automagic text properties caching for fast Font Lock mode."
          (faces files))
+     ("ffap.el"
+         "find file or url at point"
+         (files  hypermedia  matching  mouse))
      ("files.el"
          "file input and output commands for Emacs"
***************
*** 367,384 ****
          "Folding extensions for outline-mode and outline-minor-mode."
          (folding  outline))
      ("font-lock.el"
!         nil
          (languages  faces))
      ("format.el"
!         nil
          nil)
      ("forms-d2.el"
!         nil
          nil)
      ("forms-pass.el"
!         nil
          nil)
      ("forms.el"
!         nil
          nil)
      ("fortran.el"
--- 415,435 ----
          "Folding extensions for outline-mode and outline-minor-mode."
          (folding  outline))
+     ("follow.el"
+         "Minor mode, Synchronize windows showing the same buffer."
+         (display  window  minor-mode))
      ("font-lock.el"
!         "Electric font lock mode"
          (languages  faces))
      ("format.el"
!         "read and save files in multiple formats"
          nil)
      ("forms-d2.el"
!         "demo forms-mode"
          nil)
      ("forms-pass.el"
!         "passwd file demo for forms-mode"
          nil)
      ("forms.el"
!         "Forms mode: edit a file as a form to fill in"
          nil)
      ("fortran.el"
***************
*** 388,412 ****
          "multi-frame management independent of window systems."
          (internal))
!     ("gnus-uu.el"
!         "extract, view or save (uu)encoded files from gnus"
          (news))
!     ("gnus.el"
!         "NNTP-based News Reader for GNU Emacs"
          (news))
!     ("gnusmail.el"
!         "mail reply commands for GNUS newsreader"
          (news))
!     ("gnusmisc.el"
!         "miscellaneous commands for GNUS newsreader"
          (news))
!     ("gnuspost.el"
!         "post news commands for GNUS newsreader"
          (news))
      ("gomoku.el"
          "Gomoku game between you and Emacs"
          (games))
      ("gud.el"
!         "Grand Unified Debugger mode for gdb, sdb, dbx, or xdb"
          (unix  tools))
      ("hanoi.el"
          "towers of hanoi in GNUmacs"
--- 439,493 ----
          "multi-frame management independent of window systems."
          (internal))
!     ("gnus-cache.el"
!         "cache interface for Gnus"
          (news))
!     ("gnus-cite.el"
!         "parse citations in articles for Gnus"
!         (news  mail))
!     ("gnus-cus.el"
!         "User friendly customization of Gnus"
!         (help  news))
!     ("gnus-edit.el"
!         "Gnus SCORE file editing"
!         (news  help))
!     ("gnus-ems.el"
!         "functions for making Gnus work under different Emacsen"
          (news))
!     ("gnus-kill.el"
!         "kill commands for Gnus"
          (news))
!     ("gnus-mh.el"
!         "mh-e interface for Gnus"
          (news))
!     ("gnus-msg.el"
!         "mail and post interface for Gnus"
!         (news))
!     ("gnus-score.el"
!         "scoring code for Gnus"
!         (news))
!     ("gnus-uu.el"
!         "extract (uu)encoded files in Gnus"
!         nil)
!     ("gnus-vis.el"
!         "display-oriented parts of Gnus"
!         (news))
!     ("gnus-vm.el"
!         "vm interface for Gnus"
!         (news  mail))
!     ("gnus.el"
!         "a newsreader for GNU Emacs"
          (news))
      ("gomoku.el"
          "Gomoku game between you and Emacs"
          (games))
+     ("goto-addr.el"
+         "click to browse URL or to send to e-mail address"
+         (mh-e  www  mouse  mail))
      ("gud.el"
!         "Grand Unified Debugger mode for gdb, sdb, dbx, or xdb under Emacs"
          (unix  tools))
+     ("gulp.el"
+         "Ask for updates for Lisp packages"
+         (maintenance))
      ("hanoi.el"
          "towers of hanoi in GNUmacs"
***************
*** 429,435 ****
      ("hideshow.el"
          "minor mode cmds to selectively display blocks of code"
!         nil)
      ("hilit19.el"
!         nil
          (faces))
      ("hippie-exp.el"
--- 510,516 ----
      ("hideshow.el"
          "minor mode cmds to selectively display blocks of code"
!         (c c++ lisp tools editing))
      ("hilit19.el"
!         "customizable highlighting for Emacs19"
          (faces))
      ("hippie-exp.el"
***************
*** 440,445 ****
          (holidays  calendar))
      ("icomplete.el"
!         nil
!         nil)
      ("icon.el"
          "mode for editing Icon code"
--- 521,526 ----
          (holidays  calendar))
      ("icomplete.el"
!         "minibuffer completion incremental feedback"
!         (help  abbrev))
      ("icon.el"
          "mode for editing Icon code"
***************
*** 467,471 ****
          nil)
      ("iso-acc.el"
!         nil
          (i18n))
      ("iso-ascii.el"
--- 548,552 ----
          nil)
      ("iso-acc.el"
!         "minor mode providing electric accent keys"
          (i18n))
      ("iso-ascii.el"
***************
*** 473,477 ****
          (i18n))
      ("iso-cvt.el"
!         nil
          (tex  iso  latin  i18n))
      ("iso-insert.el"
--- 554,558 ----
          (i18n))
      ("iso-cvt.el"
!         "translate to ISO 8859-1 from/to net/TeX conventions"
          (tex  iso  latin  i18n))
      ("iso-insert.el"
***************
*** 487,492 ****
          "keyboard input definitions for ISO 8859/1."
          (i18n))
      ("ispell.el"
!         nil
          nil)
      ("ispell4.el"
--- 568,576 ----
          "keyboard input definitions for ISO 8859/1."
          (i18n))
+     ("iso02-syn.el"
+         "set up case-conversion and syntax tables for ISO 8859-2"
+         (i18n))
      ("ispell.el"
!         "spell checking using Ispell"
          nil)
      ("ispell4.el"
***************
*** 494,498 ****
          (wp))
      ("jka-compr.el"
!         nil
          (data))
      ("kermit.el"
--- 578,582 ----
          (wp))
      ("jka-compr.el"
!         "reading/writing/loading compressed files"
          (data))
      ("kermit.el"
***************
*** 560,573 ****
          (mail))
      ("mailalias.el"
!         "expand mailing address aliases defined in ~/.mailrc."
          (mail))
      ("mailpost.el"
          "RMAIL coupler to /usr/uci/post mailer"
          (mail))
!     ("makefile.el"
          "makefile editing commands for Emacs"
          (unix  tools))
      ("makeinfo.el"
!         nil
          nil)
      ("makesum.el"
--- 644,657 ----
          (mail))
      ("mailalias.el"
!         "expand and complete mailing address aliases"
          (mail))
      ("mailpost.el"
          "RMAIL coupler to /usr/uci/post mailer"
          (mail))
!     ("make-mode.el"
          "makefile editing commands for Emacs"
          (unix  tools))
      ("makeinfo.el"
!         "run makeinfo conveniently"
          nil)
      ("makesum.el"
***************
*** 576,580 ****
      ("man.el"
          "browse UNIX manual pages"
!         nil)
      ("map-ynp.el"
          "General-purpose boolean question-asker."
--- 660,664 ----
      ("man.el"
          "browse UNIX manual pages"
!         (help))
      ("map-ynp.el"
          "General-purpose boolean question-asker."
***************
*** 610,616 ****
          "mh-e code needed for both sending and reading"
          nil)
-     ("mhspool.el"
-         "MH folder access using NNTP for GNU Emacs"
-         (mail  news))
      ("misc.el"
          "basic editing commands for Emacs"
--- 694,697 ----
***************
*** 620,624 ****
          (emulations))
      ("mldrag.el"
!         nil
          (mouse))
      ("mlsupport.el"
--- 701,705 ----
          (emulations))
      ("mldrag.el"
!         "mode line and vertical line dragging to resize windows"
          (mouse))
      ("mlsupport.el"
***************
*** 628,636 ****
          "Modula-2 editing support package"
          (languages))
      ("mouse-sel.el"
          "Multi-click selection support for Emacs 19"
          (mouse))
      ("mouse.el"
!         "window system-independent mouse support."
          (hardware))
      ("mpuz.el"
--- 709,720 ----
          "Modula-2 editing support package"
          (languages))
+     ("morse.el"
+         "Convert text to morse code and back."
+         nil)
      ("mouse-sel.el"
          "Multi-click selection support for Emacs 19"
          (mouse))
      ("mouse.el"
!         "window system-independent mouse support"
          (hardware))
      ("mpuz.el"
***************
*** 640,648 ****
          "Customizable buffer-selection with multiple menus."
          (mouse buffer menu ))
      ("nnspool.el"
!         "spool access using NNTP for GNU Emacs"
          (news))
      ("nntp.el"
!         "NNTP (RFC977) Interface for GNU Emacs"
          (news))
      ("noutline.el"
--- 724,768 ----
          "Customizable buffer-selection with multiple menus."
          (mouse buffer menu ))
+     ("nnbabyl.el"
+         "rmail mbox access for Gnus"
+         (news  mail))
+     ("nndir.el"
+         "single directory newsgroup access for Gnus"
+         (news))
+     ("nndoc.el"
+         "single file access for Gnus"
+         (news))
+     ("nneething.el"
+         "random file access for Gnus"
+         (news  mail))
+     ("nnfolder.el"
+         "mail folder access for Gnus"
+         (news  mail))
+     ("nnheader.el"
+         "header access macros for Gnus and its backends"
+         (news))
+     ("nnkiboze.el"
+         "select virtual news access for Gnus"
+         (news))
+     ("nnmail.el"
+         "mail support functions for the Gnus mail backends"
+         (news  mail))
+     ("nnmbox.el"
+         "mail mbox access for Gnus"
+         (news  mail))
+     ("nnmh.el"
+         "mhspool access for Gnus"
+         (news  mail))
+     ("nnml.el"
+         "mail spool access for Gnus"
+         (news  mail))
      ("nnspool.el"
!         "spool access for GNU Emacs"
          (news))
      ("nntp.el"
!         "nntp access for Gnus"
!         (news))
!     ("nnvirtual.el"
!         "virtual newsgroups access for Gnus"
          (news))
      ("noutline.el"
***************
*** 674,677 ****
--- 794,800 ----
          (languages  faces))
      ("pascal.el"
+         "major mode for editing pascal source in Emacs"
+         (languages))
+     ("patcomp.el"
          nil
          nil)
***************
*** 680,684 ****
          (internal))
      ("pc-mode.el"
!         nil
          nil)
      ("perl-mode.el"
--- 803,810 ----
          (internal))
      ("pc-mode.el"
!         "emulate certain key bindings used on PCs."
!         (emulations))
!     ("pc-select.el"
!         "emulate mark, cut, copy and paste from motif"
          nil)
      ("perl-mode.el"
***************
*** 689,693 ****
          nil)
      ("pp.el"
!         nil
          nil)
      ("profile.el"
--- 815,819 ----
          nil)
      ("pp.el"
!         "pretty printer for Emacs Lisp"
          nil)
      ("profile.el"
***************
*** 701,705 ****
          (print  postscript))
      ("rcompile.el"
!         nil
          (tools  processes))
      ("rect.el"
--- 827,831 ----
          (print  postscript))
      ("rcompile.el"
!         "run a compilation on a remote machine"
          (tools  processes))
      ("rect.el"
***************
*** 714,718 ****
      ("regi.el"
          "REGular expression Interpreting engine"
!         (     extensions  matching))
      ("register.el"
          "register commands for Emacs."
--- 840,844 ----
      ("regi.el"
          "REGular expression Interpreting engine"
!         (extensions  matching))
      ("register.el"
          "register commands for Emacs."
***************
*** 800,811 ****
          (processes))
      ("sgml-mode.el"
!         "SGML-editing mode"
!         (wp))
      ("sh-script.el"
          "shell-script editing commands for Emacs"
!         (shell programming))
      ("shadowfile.el"
!         nil
!         nil)
      ("shell.el"
          "specialized comint.el for running the shell."
--- 926,940 ----
          (processes))
      ("sgml-mode.el"
!         "SGML- and HTML-editing modes"
!         (wp  hypermedia  comm  languages))
      ("sh-script.el"
          "shell-script editing commands for Emacs"
!         (languages  unix))
!     ("shadow.el"
!         "Locate Emacs Lisp file shadowings."
!         (lisp))
      ("shadowfile.el"
!         "automatic file copying for Emacs 19"
!         (comm))
      ("shell.el"
          "specialized comint.el for running the shell."
***************
*** 817,831 ****
          "SIMULA 87 code editing commands for Emacs"
          (languages))
      ("skeleton.el"
!         "Metalanguage for writing statement skeletons"
!         (shell programming))
      ("solar.el"
          "calendar functions for solar events."
          (calendar))
      ("sort.el"
          "commands to sort text in an Emacs buffer."
          (unix))
      ("soundex.el"
!         nil
          (matching))
      ("spell.el"
--- 946,972 ----
          "SIMULA 87 code editing commands for Emacs"
          (languages))
+     ("site-init.el"
+         nil
+         nil)
+     ("site-load.el"
+         nil
+         nil)
+     ("site-start.el"
+         nil
+         nil)
      ("skeleton.el"
!         "Lisp language extension for writing statement skeletons"
!         (extensions  abbrev  languages  tools))
      ("solar.el"
          "calendar functions for solar events."
          (calendar))
+     ("solitaire.el"
+         "game of solitaire in Emacs Lisp"
+         (games))
      ("sort.el"
          "commands to sort text in an Emacs buffer."
          (unix))
      ("soundex.el"
!         "implement Soundex algorithm"
          (matching))
      ("spell.el"
***************
*** 866,873 ****
          (unix))
      ("tcl-mode.el"
!         nil
          (languages  processes  tools))
      ("tcp.el"
!         nil
          nil)
      ("telnet.el"
--- 1007,1014 ----
          (unix))
      ("tcl-mode.el"
!         "a major-mode for editing tcl/tk scripts"
          (languages  processes  tools))
      ("tcp.el"
!         "TCP/IP stream emulation for GNU Emacs"
          nil)
      ("telnet.el"
***************
*** 881,885 ****
          nil)
      ("term.el"
!         nil
          nil)
      ("terminal.el"
--- 1022,1026 ----
          nil)
      ("term.el"
!         "general command interpreter in a window stuff"
          nil)
      ("terminal.el"
***************
*** 890,900 ****
          (tex))
      ("texinfmt.el"
!         nil
          nil)
      ("texinfo.el"
!         nil
          nil)
      ("texnfo-upd.el"
!         nil
          (maint  tex  docs))
      ("text-mode.el"
--- 1031,1041 ----
          (tex))
      ("texinfmt.el"
!         "format Texinfo files into Info files."
          nil)
      ("texinfo.el"
!         "major mode for editing Texinfo files"
          nil)
      ("texnfo-upd.el"
!         "utilities for updating nodes and menus in Texinfo files"
          (maint  tex  docs))
      ("text-mode.el"
***************
*** 911,921 ****
          nil)
      ("timer.el"
!         "run a function with args at some time in future"
          nil)
      ("timezone.el"
!         nil
!         nil)
      ("tmm.el"
!         nil
          nil)
      ("tpu-edt.el"
--- 1052,1062 ----
          nil)
      ("timer.el"
!         "run a function with args at some time in future."
          nil)
      ("timezone.el"
!         "time zone package for GNU Emacs"
!         (news))
      ("tmm.el"
!         "text mode access to menu-bar"
          nil)
      ("tpu-edt.el"
***************
*** 926,930 ****
          (emulations))
      ("tpu-mapper.el"
!         nil
          (emulations))
      ("tq.el"
--- 1067,1071 ----
          (emulations))
      ("tpu-mapper.el"
!         "Create a TPU-edt X-windows keymap file"
          (emulations))
      ("tq.el"
***************
*** 949,952 ****
--- 1090,1096 ----
          "digest-cracking support for the RMAIL mail reader"
          (mail))
+     ("uniquify.el"
+         "unique buffer names dependent on file name"
+         nil)
      ("unrmail.el"
          "convert Rmail files to mailbox files."
***************
*** 955,961 ****
          "editing commands in GNU Emacs that turned out not to be used."
          (emulations))
-     ("upd-copyr.el"
-         "update the copyright notice in a GNU Emacs Lisp file"
-         (maint))
      ("userlock.el"
          "handle file access contention between multiple users"
--- 1099,1102 ----
***************
*** 980,993 ****
          (emulations))
      ("viper-ex.el"
!         nil
          nil)
      ("viper-keym.el"
!         nil
          nil)
      ("viper-macs.el"
!         nil
          nil)
      ("viper-mous.el"
!         nil
          nil)
      ("viper-util.el"
--- 1121,1134 ----
          (emulations))
      ("viper-ex.el"
!         "functions implementing the Ex commands for Viper"
          nil)
      ("viper-keym.el"
!         "Viper keymaps"
          nil)
      ("viper-macs.el"
!         "functions implementing keyboard macros for Viper"
          nil)
      ("viper-mous.el"
!         "mouse support for Viper"
          nil)
      ("viper-util.el"
***************
*** 996,1000 ****
      ("viper.el"
          "A full-featured Vi emulator for GNU Emacs 19 and XEmacs 19,"
!         nil)
      ("vms-patch.el"
          "override parts of files.el for VMS."
--- 1137,1141 ----
      ("viper.el"
          "A full-featured Vi emulator for GNU Emacs 19 and XEmacs 19,"
!         (emulations))
      ("vms-patch.el"
          "override parts of files.el for VMS."
***************
*** 1006,1012 ****
          "run asynchronous VMS subprocesses under Emacs"
          (vms))
-     ("vmsx.el"
-         "run asynchronous VMS subprocesses under Emacs"
-         (vms))
      ("vt-control.el"
          "Common VTxxx control functions"
--- 1147,1150 ----
***************
*** 1019,1023 ****
          nil)
      ("winnt.el"
!         nil
          nil)
      ("ws-mode.el"
--- 1157,1161 ----
          nil)
      ("winnt.el"
!         "Lisp routines for Windows NT."
          nil)
      ("ws-mode.el"
***************
*** 1033,1117 ****
          "run Scheme under Emacs"
          (languages  lisp))
-     ("yow.el"
-         "quote random zippyisms"
-         (games))
-     ("browse-url.el"
-         "ask a WWW browser to load a URL"
-         (hypertext))
-     ("cal-chinese.el"
-         "calendar functions for the Chinese calendar."
-         (calendar))
-     ("cal-coptic.el"
-         "calendar functions for the Coptic/Ethiopic calendars."
-         (calendar))
-     ("cal-hebrew.el"
-         "calendar functions for the Hebrew calendar."
-         (calendar))
-     ("cal-islamic.el"
-         "calendar functions for the Islamic calendar."
-         (calendar))
-     ("cal-iso.el"
-         "calendar functions for the ISO calendar."
-         (calendar))
-     ("cal-julian.el"
-         "calendar functions for the Julian calendar."
-         (calendar))
-     ("cal-move.el"
-         "calendar functions for movement in the calendar"
-         (calendar))
-     ("cal-tex.el"
-         "calendar functions for printing calendars with LaTeX."
-         (calendar))
-     ("cc-compat.el"
-         "cc-mode compatibility with c-mode.el confusion"
-         (c languages oop))
-     ("copyright.el"
-         "update the copyright notice in current buffer"
-         (maint  tools))
-     ("diary.el"
-         "diary functions."
-         (calendar))
-     ("ediff-hook.el"
-         "setup for Ediff's menus and autoloads"
-         nil)
-     ("ediff-meta.el"
-         "support for multi-file/multi-buffer processing in Ediff"
-         nil)
-     ("executable.el"
-         "base functionality for executable interpreter scripts"
-         (languages  unix))
-     ("goto-addr.el"
-         "click to browse URL or to send to e-mail address"
-         (mh-e  www  mouse  mail))
-     ("iso02-acc.el"
-         "electric accent keys for Eastern Europe (ISO latin2)"
-         nil)
-     ("iso02-syn.el"
-         "set up case-conversion and syntax tables for ISO 8859-2"
-         (i18n))
-     ("morse.el"
-         "Convert text to morse code and back."
-         nil)
-     ("pc-select.el"
-         "emulate mark, cut, copy and paste from motif"
-         nil)
-     ("site-load.el"
-         nil
-         nil)
-     ("site-start.el"
-         nil
-         nil)
-     ("solitaire.el"
-         "game of solitaire in Emacs Lisp"
-         (games))
-     ("subdirs.el"
-         nil
-         nil)
-     ("uniquify.el"
-         "unique buffer names dependent on pathname"
-         nil)
      ("xt-mouse.el"
          "Support the mouse when emacs run in an xterm."
          (mouse  terminals))
  ))
  
--- 1171,1180 ----
          "run Scheme under Emacs"
          (languages  lisp))
      ("xt-mouse.el"
          "Support the mouse when emacs run in an xterm."
          (mouse  terminals))
+     ("yow.el"
+         "quote random zippyisms"
+         (games))
  ))
  
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/finder.el emacs-19.31/lisp/finder.el
*** emacs-19.30/lisp/finder.el	Sat Nov 18 10:50:24 1995
--- emacs-19.31/lisp/finder.el	Sun Feb 25 17:58:57 1996
***************
*** 21,26 ****
  
  ;; 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:
--- 21,27 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 40,44 ****
  (require 'lisp-mnt)
  (require 'finder-inf)
- (require 'picture)
  
  ;; Local variable in finder buffer.
--- 41,44 ----
*************** arguments compiles from `load-path'."
*** 115,158 ****
        (insert "\n(setq finder-package-info '(\n")
        (mapcar
!        (function
! 	(lambda (d)
! 	  (mapcar
! 	   (function
! 	    (lambda (f) 
! 	      (if (and (string-match "^[^=].*\\.el$" f)
! 		       (not (member f processed)))
! 		  (let (summary keystart keywords)
! 		    (setq processed (cons f processed))
! 		    (save-excursion
! 		      (set-buffer (get-buffer-create "*finder-scratch*"))
! 		      (buffer-disable-undo (current-buffer))
! 		      (erase-buffer)
! 		      (insert-file-contents
! 		       (concat (file-name-as-directory (or d ".")) f))
! 		      (setq summary (lm-synopsis))
! 		      (setq keywords (lm-keywords)))
! 		    (insert
! 		     (format "    (\"%s\"\n        " f))
! 		    (prin1 summary (current-buffer))
! 		    (insert
! 		     "\n        ")
! 		    (setq keystart (point))
! 		    (insert
! 		     (if keywords (format "(%s)" keywords) "nil")
! 		     ")\n")
! 		    (subst-char-in-region keystart (point) ?, ? )
! 		    )
! 		)))
! 	   (directory-files (or d ".")))
! 	  ))
         (or dirs load-path))
        (insert "))\n\n(provide 'finder-inf)\n\n;;; finder-inf.el ends here\n")
        (kill-buffer "*finder-scratch*")
        (eval-current-buffer) ;; So we get the new keyword list immediately
!       (basic-save-buffer)
!       )))
  
  ;;; Now the retrieval code
  
  (defun finder-list-keywords ()
    "Display descriptions of the keywords in the Finder buffer."
--- 115,172 ----
        (insert "\n(setq finder-package-info '(\n")
        (mapcar
!        (lambda (d)
! 	 (mapcar
! 	  (lambda (f) 
! 	    (if (and (string-match "^[^=].*\\.el$" f)
! 		     (not (member f processed)))
! 		(let (summary keystart keywords)
! 		  (setq processed (cons f processed))
! 		  (save-excursion
! 		    (set-buffer (get-buffer-create "*finder-scratch*"))
! 		    (buffer-disable-undo (current-buffer))
! 		    (erase-buffer)
! 		    (insert-file-contents
! 		     (concat (file-name-as-directory (or d ".")) f))
! 		    (setq summary (lm-synopsis))
! 		    (setq keywords (lm-keywords)))
! 		  (insert
! 		   (format "    (\"%s\"\n        " f))
! 		  (prin1 summary (current-buffer))
! 		  (insert
! 		   "\n        ")
! 		  (setq keystart (point))
! 		  (insert
! 		   (if keywords (format "(%s)" keywords) "nil")
! 		   ")\n")
! 		  (subst-char-in-region keystart (point) ?, ? )
! 		  )))
! 	  (directory-files (or d "."))))
         (or dirs load-path))
        (insert "))\n\n(provide 'finder-inf)\n\n;;; finder-inf.el ends here\n")
        (kill-buffer "*finder-scratch*")
        (eval-current-buffer) ;; So we get the new keyword list immediately
!       (basic-save-buffer))))
! 
! (defun finder-compile-keywords-make-dist ()
!   "Regenerate `finder-inf.el' for the Emacs distribution."
!   (finder-compile-keywords default-directory))
  
  ;;; Now the retrieval code
  
+ (defun finder-insert-at-column (column &rest strings)
+   "Insert list of STRINGS, at column COLUMN."
+   (if (> (current-column) column) (insert "\n"))
+   (move-to-column column)
+   (let ((col (current-column)))
+     (if (< col column)
+ 	(indent-to column)
+       (if (and (/= col column)
+ 	       (= (preceding-char) ?\t))
+ 	  (let (indent-tabs-mode)
+ 	    (delete-char -1)
+             (indent-to col)
+             (move-to-column column)))))
+   (apply 'insert strings))
+ 
  (defun finder-list-keywords ()
    "Display descriptions of the keywords in the Finder buffer."
*************** arguments compiles from `load-path'."
*** 161,169 ****
    (erase-buffer)
    (mapcar
!    (function (lambda (assoc)
! 	       (let ((keyword (car assoc)))
! 		 (insert (symbol-name keyword))
! 		 (insert-at-column 14 (concat (cdr assoc) "\n"))
! 		 (cons (symbol-name keyword) keyword))))
     finder-known-keywords)
    (goto-char (point-min))
--- 175,183 ----
    (erase-buffer)
    (mapcar
!    (lambda (assoc)
!      (let ((keyword (car assoc)))
!        (insert (symbol-name keyword))
!        (finder-insert-at-column 14 (concat (cdr assoc) "\n"))
!        (cons (symbol-name keyword) keyword)))
     finder-known-keywords)
    (goto-char (point-min))
*************** arguments compiles from `load-path'."
*** 182,193 ****
      (setq finder-headmark (point))
      (mapcar
!      (function (lambda (x)
! 		 (if (memq id (car (cdr (cdr x))))
! 		     (progn
! 		       (insert (car x))
! 		       (insert-at-column 16
! 					 (concat (car (cdr x)) "\n"))
! 		       ))
! 		 ))
       finder-package-info)
      (goto-char (point-min))
--- 196,204 ----
      (setq finder-headmark (point))
      (mapcar
!      (lambda (x)
!        (if (memq id (car (cdr (cdr x))))
! 	   (progn
! 	     (insert (car x))
! 	     (finder-insert-at-column 16 (concat (car (cdr x)) "\n")))))
       finder-package-info)
      (goto-char (point-min))
*************** arguments compiles from `load-path'."
*** 232,237 ****
      (set-buffer-modified-p nil)
      (shrink-window-if-larger-than-buffer)
!     (finder-summary)
!     ))
  
  (defun finder-current-item ()
--- 243,247 ----
      (set-buffer-modified-p nil)
      (shrink-window-if-larger-than-buffer)
!     (finder-summary)))
  
  (defun finder-current-item ()
*************** arguments compiles from `load-path'."
*** 270,280 ****
    (setq major-mode 'finder-mode)
    (make-local-variable 'finder-headmark)
!   (setq finder-headmark nil)
! )
  
  (defun finder-summary ()
    "Summarize basic Finder commands."
    (interactive)
!   (message
     (substitute-command-keys
      "\\<finder-mode-map>\\[finder-select] = select, \\[finder-list-keywords] = to finder directory, \\[finder-exit] = quit, \\[finder-summary] = help")))
--- 280,289 ----
    (setq major-mode 'finder-mode)
    (make-local-variable 'finder-headmark)
!   (setq finder-headmark nil))
  
  (defun finder-summary ()
    "Summarize basic Finder commands."
    (interactive)
!   (message "%s"
     (substitute-command-keys
      "\\<finder-mode-map>\\[finder-select] = select, \\[finder-list-keywords] = to finder directory, \\[finder-exit] = quit, \\[finder-summary] = help")))
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/float-sup.el emacs-19.31/lisp/float-sup.el
*** emacs-19.30/lisp/float-sup.el	Mon Sep 21 08:06:04 1992
--- emacs-19.31/lisp/float-sup.el	Sun Jan 14 02:34:30 1996
***************
*** 18,23 ****
  
  ;; 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.
  
  ;;; Code:
--- 18,24 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Code:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/float.el emacs-19.31/lisp/float.el
*** emacs-19.30/lisp/float.el	Wed Jun  9 07:23:00 1993
--- emacs-19.31/lisp/float.el	Sun Jan 14 02:34:30 1996
***************
*** 20,25 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/flow-ctrl.el emacs-19.31/lisp/flow-ctrl.el
*** emacs-19.30/lisp/flow-ctrl.el	Mon Oct 16 18:01:19 1995
--- emacs-19.31/lisp/flow-ctrl.el	Wed Jan 24 19:31:48 1996
***************
*** 1,5 ****
  ;;; flow-ctrl.el --- help for lusers on cu(1) or ttys with wired-in ^S/^Q flow control
  
! ;;; Copyright (C) 1990, 1991, 1994 Free Software Foundation, Inc.
  
  ;; Author Kevin Gallagher
--- 1,5 ----
  ;;; flow-ctrl.el --- help for lusers on cu(1) or ttys with wired-in ^S/^Q flow control
  
! ;; Copyright (C) 1990, 1991, 1994 Free Software Foundation, Inc.
  
  ;; Author Kevin Gallagher
***************
*** 21,44 ****
  
  ;; 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:
  
! ;;;; Terminals that use XON/XOFF flow control can cause problems with
! ;;;; GNU Emacs users.  This file contains Emacs Lisp code that makes it
! ;;;; easy for a user to deal with this problem, when using such a
! ;;;; terminal. 
! ;;;;      
! ;;;; To invoke these adjustments, a user need only invoke the function
! ;;;; enable-flow-control-on with a list of terminal types in his/her own
! ;;;; .emacs file.  As arguments, give it the names of one or more terminal
! ;;;; types in use by that user which require flow control adjustments.
! ;;;; Here's an example: 
! ;;;; 
! ;;;;	(enable-flow-control-on "vt200" "vt300" "vt101" "vt131")
  
! ;;; Portability note: This uses (getenv "TERM"), and therefore probably
! ;;; won't work outside of UNIX-like environments.
  
  ;;; Code:
--- 21,45 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
! ;; Terminals that use XON/XOFF flow control can cause problems with
! ;; GNU Emacs users.  This file contains Emacs Lisp code that makes it
! ;; easy for a user to deal with this problem, when using such a
! ;; terminal. 
! ;;      
! ;; To invoke these adjustments, a user need only invoke the function
! ;; enable-flow-control-on with a list of terminal types in his/her own
! ;; .emacs file.  As arguments, give it the names of one or more terminal
! ;; types in use by that user which require flow control adjustments.
! ;; Here's an example: 
! ;; 
! ;;	(enable-flow-control-on "vt200" "vt300" "vt101" "vt131")
  
! ;; Portability note: This uses (getenv "TERM"), and therefore probably
! ;; won't work outside of UNIX-like environments.
  
  ;;; Code:
*************** With arg, enable flow control mode if ar
*** 95,106 ****
      (aset keyboard-translate-table flow-control-c-q-replacement ?\^q)
      (aset keyboard-translate-table ?\^q flow-control-c-q-replacement)
!     (message (concat 
! 	      "XON/XOFF adjustment for " 
! 	      (getenv "TERM") 
! 	      ": use "
! 	      (single-key-description flow-control-c-s-replacement)
! 	      " for C-s, and use "
! 	      (single-key-description flow-control-c-q-replacement)
! 	      " for C-q"))
      (sleep-for 2)))			; Give user a chance to see message.
  
--- 96,103 ----
      (aset keyboard-translate-table flow-control-c-q-replacement ?\^q)
      (aset keyboard-translate-table ?\^q flow-control-c-q-replacement)
!     (message "XON/XOFF adjustment for %s: use %s for C-s, and use %s for C-q"
! 	     (getenv "TERM") 
! 	     (single-key-description flow-control-c-s-replacement)
! 	     (single-key-description flow-control-c-q-replacement))
      (sleep-for 2)))			; Give user a chance to see message.
  
*************** to get the effect of a C-q."
*** 114,124 ****
    (let ((term (getenv "TERM"))
  	hyphend)
      (if term
! 	(progn
! 	  ;; Strip off hyphen and what follows
! 	  (while (setq hyphend (string-match "[-_][^-_]+$" term))
! 	    (setq term (substring term 0 hyphend)))
! 	  (and (member term losing-terminal-types)
! 	       (enable-flow-control))))))
  
  (provide 'flow-ctrl)
--- 111,124 ----
    (let ((term (getenv "TERM"))
  	hyphend)
+     ;; Look for TERM in LOSING-TERMINAL-TYPES.
+     ;; If we don't find it literally, try stripping off words
+     ;; from the end, one by one.
+     (while (and term (not (member term losing-terminal-types)))
+       ;; Strip off last hyphen and what follows, then try again.
+       (if (setq hyphend (string-match "[-_][^-_]+$" term))
+ 	  (setq term (substring term 0 hyphend))
+ 	(setq term nil)))
      (if term
! 	(enable-flow-control))))
  
  (provide 'flow-ctrl)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/foldout.el emacs-19.31/lisp/foldout.el
*** emacs-19.30/lisp/foldout.el	Sun May 22 05:25:53 1994
--- emacs-19.31/lisp/foldout.el	Sun Jan 14 02:34:30 1996
***************
*** 21,26 ****
  
  ;; 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:
--- 21,27 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/follow.el emacs-19.31/lisp/follow.el
*** emacs-19.30/lisp/follow.el	Wed Dec 31 19:00:00 1969
--- emacs-19.31/lisp/follow.el	Thu Apr 11 14:19:17 1996
***************
*** 0 ****
--- 1,2430 ----
+ ;;; follow.el --- Minor mode, Synchronize windows showing the same buffer.
+ 
+ ;; Copyright (C) 1995, 1996 Free Software Foundation, Inc.
+ 
+ ;; Author: Anders Lindgren <andersl@csd.uu.se>
+ ;; Maintainer: Anders Lindgren <andersl@csd.uu.se>
+ ;; Created: 25 May 1995
+ ;; Version: 1.6
+ ;; Keywords: display, window, minor-mode
+ ;; Date: 20 Feb 1996
+ 
+ ;; 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, Inc., 59 Temple Place - Suite 330,
+ ;; Boston, MA 02111-1307, USA.
+ 
+ ;;; Commentary:
+ 
+ ;;{{{ Documentation
+ 
+ ;; `Follow mode' is a minor mode for Emacs 19 and XEmacs which
+ ;; combines windows into one tall virtual window.
+ ;;
+ ;; The feeling of a "virtual window" has been accomplished by the use
+ ;; of two major techniques:
+ ;;
+ ;; * The windows always displays adjacent sections of the buffer. 
+ ;;   This means that whenever one window is moved, all the
+ ;;   others will follow.  (Hence the name Follow Mode.)
+ ;;
+ ;; * Should the point (cursor) end up outside a window, another 
+ ;;   window displaying that point is selected, if possible.  This 
+ ;;   makes it possible to walk between windows using normal cursor 
+ ;;   movement commands.
+ ;;
+ ;; Follow mode comes to its prime when used on a large screen and two
+ ;; side-by-side window are used. The user can, with the help of Follow
+ ;; mode, use two full-height windows as though they would have been
+ ;; one. Imagine yourself editing a large function, or section of text,
+ ;; and beeing able to use 144 lines instead of the normal 72... (your
+ ;; mileage may vary).
+ 
+ ;; The latest version, and a demonstration, are avaiable at:
+ ;;
+ ;;	ftp://ftp.csd.uu.se/pub/users/andersl/emacs/follow.el
+ ;;	http://www.csd.uu.se/~andersl/follow.shtml
+ 
+ ;; `Follow mode' can be used together with Emacs 19 and XEmacs.
+ ;; It has been tested together with Emacs 19.27, 19.28, 19.29,
+ ;; 19.30, XEmacs 19.12, and 19.13.
+ 
+ 
+ ;; To test this package, make sure `follow' is loaded, or will be
+ ;; autoloaded when activated (see below). Then do the following:
+ ;;
+ ;; * Find your favorite file (preferably a long one.)
+ ;;
+ ;; * Resize Emacs so that it will be wide enough for two full sized
+ ;;   columns.  Delete the other windows and split with the commands
+ ;;   `C-x 1 C-x 3'.
+ ;;
+ ;; * Give the command:
+ ;;	M-x follow-mode <RETURN>
+ ;;
+ ;; * Now the display should look something like (assuming the text "71"
+ ;;   is on line 71):
+ ;;
+ ;;		    +----------+----------+
+ ;;		    |1         |73        |
+ ;;		    |2         |74        |
+ ;;		    |3         |75        |
+ ;;		         ...        ...   
+ ;;		    |71        |143       |
+ ;;		    |72        |144       |
+ ;;		    +----------+----------+
+ ;;
+ ;;   As you can see, the right-hand window starts at line 73, the line
+ ;;   immediately below the end of the left-hand window. As long as
+ ;;   `follow-mode' is active, the two windows will follow eachother!
+ ;;
+ ;; * Play around and enjoy! Scroll one window and watch the other.
+ ;;   Jump to the beginning or end. Press `Cursor down' at the last
+ ;;   line of the left-hand window. Enter new lines into the
+ ;;   text. Enter long lines spanning several lines, or several
+ ;;   windows.
+ ;;
+ ;; * Should you find `Follow' mode annoying, just type
+ ;;	M-x follow-mode <RETURN> 
+ ;;   to turn it off.
+ 
+ 
+ ;; Installation:
+ ;;
+ ;; To fully install this, add this file to your Emacs Lisp directory and
+ ;; compile it with M-x byte-compile-file.  Then add the following to the
+ ;; appropriate init file (normally your `~/.emacs' file):
+ ;;
+ ;; (autoload 'follow-mode "follow"
+ ;;   "Synchronize windows showing the same buffer, minor mode." t)
+ 
+ 
+ ;; The command `follow-delete-other-windows-and-split' maximises the
+ ;; visible area of the current buffer.
+ ;;
+ ;; I recommend adding it, and `follow-mode', to hotkeys in the global
+ ;; key map.  To do so, add the following lines (replacing `[f7]' and
+ ;; `[f8]' with your favorite keys) to the init file:
+ ;;
+ ;; (autoload 'follow-mode "follow"
+ ;;   "Synchronize windows showing the same buffer, minor mode." t)
+ ;; (global-set-key [f8] 'follow-mode)
+ ;;
+ ;; (autoload 'follow-delete-other-windows-and-split "follow"
+ ;;   "Delete other windows, split the frame in two, and enter Follow Mode." t)
+ ;; (global-set-key [f7] 'follow-delete-other-windows-and-split)
+ 
+ 
+ ;; There exists two system variables which controls the appearence of
+ ;; lines which are wider than the window containing them.  The default
+ ;; is to truncate long lines whenever a window isn't as wide as the
+ ;; frame.
+ ;;
+ ;; To make sure lines are never truncated, please place the following
+ ;; lines in your init file:
+ ;;
+ ;; (setq truncate-lines nil)
+ ;; (setq truncate-partial-width-windows nil)
+ 
+ 
+ ;; Since the display of XEmacs is pixel-oriented, a line could be
+ ;; clipped in half at the bottom of the window.
+ ;;
+ ;; To make XEmacs avoid clipping (normal) lines, please place the
+ ;; following line in your init-file:
+ ;;
+ ;; (setq pixel-vertical-clip-threshold 30)
+ 
+ 
+ ;; The correct way to cofigurate Follow mode, or any other mode for
+ ;; that matter, is to create one (or more) function which does
+ ;; whatever you would like to do.  The function is then added to
+ ;; a hook.
+ ;;
+ ;; When `Follow' mode is activated, functions stored in the hook
+ ;; `follow-mode-hook' are called.  When it is deactivated
+ ;; `follow-mode-off-hook' is runed.
+ ;;
+ ;; The keymap `follow-key-map' contains key bindings activated by
+ ;; `follow-mode'.
+ ;;
+ ;; Example:
+ ;; (add-hook 'follow-mode-hook 'my-follow-mode-hook)
+ ;;
+ ;; (defun my-follow-mode-hook ()
+ ;;    (define-key follow-mode-map "\C-ca" 'your-favorite-function)
+ ;;    (define-key follow-mode-map "\C-cb" 'another-function))
+ 
+ 
+ ;; Usage:
+ ;;
+ ;; To activate give the command:  M-x follow-mode
+ ;; and press return. To deactivate, do it again.
+ ;;
+ ;; Some special commands have been developed to make life even easier:
+ ;;	follow-scroll-up			 C-c . C-v
+ ;;		Scroll text in a Follow Mode window chain up.
+ ;;
+ ;;	follow-scroll-down			 C-c . v
+ ;;		Like `follow-scroll-up', but in the other direction.
+ ;;
+ ;;	follow-delete-other-windows-and-split	 C-c . 1
+ ;;		Maximise the visible area of the current buffer,
+ ;;		and enter Follow Mode. 	This is a very convenient
+ ;;		way to start Follow Mode, hence it is recomended
+ ;;		that this command is added to the global keymap.
+ ;;
+ ;;	follow-recenter				 C-c . C-l
+ ;;		Place the point in the center of the middle window,
+ ;;		or a specified number of lines from either top or bottom.
+ ;;
+ ;;	follow-switch-to-buffer			 C-c . b
+ ;;		Switch buffer in all windows displaying the current buffer
+ ;;		in this frame.
+ ;;
+ ;;	follow-switch-to-buffer-all		 C-c . C-b
+ ;;		Switch buffer in all windows in the active frame.
+ ;;
+ ;;	follow-switch-to-current-buffer-all
+ ;;		Show the current buffer in all windows on the current
+ ;;		frame and turn on `follow-mode'.
+ ;;
+ ;;	follow-first-window			 C-c . <
+ ;;		Select the first window in the frame showing the same buffer.
+ ;;
+ ;;	follow-last-window			 C-c . >
+ ;;		Select the last window in the frame showing the same buffer.
+ ;;
+ ;;	follow-next-window			 C-c . n
+ ;;		Select the next window in the frame showing the same buffer.
+ ;;
+ ;;	follow-previous-window			 C-c . p
+ ;;		Select the previous window showing the same buffer.
+ 
+ 
+ ;; Well, it seems ok, but what if I really want to look at two different
+ ;; positions in the text? Here are two simple methods to use:
+ ;;
+ ;; 1) Use multiple frames; `follow' mode only affects windows displayed
+ ;;    in the same frame. (My apoligies to you who can't use frames.)
+ ;;
+ ;; 2) Bind `follow-mode' to key so you can turn it off whenever
+ ;;    you want to view two locations. Of course, `follow' mode can
+ ;;    be reactivated by hitting the same key again.
+ ;;
+ ;;    Example from my ~/.emacs:
+ ;;	(global-set-key [f8] 'follow-mode)
+ 
+ 
+ ;; Implementation: 
+ ;;
+ ;; In an ideal world, follow mode would have been implemented in the
+ ;; kernal of the display routines, making sure that the windows (in
+ ;; follow mode) ALWAYS are aligned. On planet earth, however, we must
+ ;; accept a solution where we ALMOST ALWAYS can make sure that the
+ ;; windows are aligned.
+ ;;
+ ;; Follow mode does this in three places:
+ ;; 1) After each user command.
+ ;; 2) After a process output has been perfomed.
+ ;; 3) When a scrollbar has been moved.
+ ;;
+ ;; This will cover most situations. (Let me know if there are other
+ ;; situations which should be covered.)
+ ;;
+ ;; However, only the selected window is checked, for the reason of
+ ;; efficiency and code complexity. (i.e. it is possible to make a
+ ;; non-selected windows unaligned. It will, however, pop right back
+ ;; when it is selected.)
+ 
+ ;;}}}
+ ;;{{{ Change Log
+ 
+ ;;; Change log:
+ ;;	25-May-95 andersl  * File created.
+ ;;	26-May-95 andersl  * It works!
+ ;;	27-May-95 andersl  * Avoids hitting the head in the roof.
+ ;;		           * follow-scroll-up, -scroll-down, and -recenter.
+ ;;		           * V0.1 Sent to Ohio.
+ ;;	28-May-95 andersl  * Scroll-bar support added.
+ ;;	30-May-95 andersl  * Code adopted to standard style.
+ ;;			   * Minor mode keymap.
+ ;;	 2-Jun-95 andersl  * Processor output.
+ ;;	 3-Jun-95 andersl  * V0.4
+ ;;	 5-Jun-95 andersl  * V0.5. Copyright notice corrected.
+ ;;			     (The old one stated that I had copyright, but
+ ;;			     that Emacs could be freely distributed ;-)  )
+ ;;	 6-Jun-95 andersl  * Lucid support added. (no longer valid.)
+ ;;	 7-Jun-95 andersl  * Menu bar added.
+ ;;			   * Bug fix, (at-window 0 0) => (frame-first-window)
+ ;;	15-Jun-95 andersl  * 0.8 Major rework. looong lines and outline mode.
+ ;;	18-Jun-95 andersl  * 0.9 Allow a tail window to be selected, but pick
+ ;;			     a better one when edited.
+ ;;	26-Jun-95 andersl  * Inlineing.
+ ;;      02-Jul-95 andersl  * compute-motion imitated with a ugly workaround,
+ ;;			     Works with XEmacs again!
+ ;;	15-Jul-95 andersl  * find-file hook.
+ ;;                         * submit-feedback.
+ ;;                         * Survives major mode changes.
+ ;;                         * Region spanning multiple windows looks 
+ ;;			       resonabely good.
+ ;;	19-Jul-95 andersl  * New process-filter handling.
+ ;;	 1-Aug-95 andersl  * XEmacs scrollbar support.
+ ;;			   * Emacs 19 `window-size-change' support.
+ ;;			   * `save-window-excursion' removed, it triggered
+ ;;			     a redraw!
+ ;;	 5-Aug-95 andersl  * `follow-switch-to-current-buffer-all' added.
+ ;;	16-Nov-95 andersl  * V1.0 released!
+ ;;	17-Nov-95 andersl  * Byte compiler silencer for XEmacs broken.
+ ;;			   * fkey-end-of-buffer treated the same way 
+ ;;			     end-of-buffer is.
+ ;;			   * follow-mode-off-hook added. 
+ ;;			     (Suggested by David Hughes, thanks!)
+ ;;	20-Nov-95 andersl  * Bug in menu code corrected.
+ ;;			     (Reported by Robert E. Brown, thanks!)
+ ;;	 5-Dec-95 andersl  * `follow-avoid-tail-recenter' added to the
+ ;;			     post-command-idle-hook to avoid recentering
+ ;;			     caused by `paren' et. al.
+ ;;	 7-Dec-95 andersl  * `follow-avoid-tail-recenter' called by
+ ;;			     `window-scroll-functions'.
+ ;;	18-Dec-95 andersl  * All processes intercepted.
+ ;;	20-Dec-95 andersl  * `follow-recenter' accepts arguments.
+ ;;                         * `move-overlay' advices, drag-region works.
+ ;;	 2-Jan-96 andersl  * XEmacs: isearch fixed.
+ ;;                         * `follow-calc-win-end' created.
+ ;;       8-Jan-96 andersl  * XEmacs: `window-end' with `guarantee'
+ ;;                           argument used in `follow-calc-win-end'.
+ ;;       9-Jan-96 andersl  * `follow-end-of-buffer' added. 
+ ;;                           Code in post hook removed.
+ ;;                         * XEmacs: Post hook is always executed
+ ;;			     after a mouse button event.
+ ;;      22-Jan-96 andersl  * 1.5 released.
+ ;;
+ 
+ ;;}}}
+ ;;{{{ LCD Entry
+ 
+ ;;; LCD Archive Entry:
+ ;; follow|Anders Lindgren|andersl@csd.uu.se|
+ ;; Combines windows into tall virtual window, minor mode.
+ ;; 20-Feb-1996|1.6|~/modes/follow.el.Z|
+ 
+ ;;}}}
+ 
+ ;;; Code:
+ 
+ ;;{{{ Preliminaries
+ 
+ ;; Make the compiler shut up!
+ ;; There are two strategies:
+ ;; 1) Shut warnings off completely.
+ ;; 2) Handle each warning separately.
+ ;;
+ ;; Since I would like to see real errors, I've selected the latter
+ ;; method.
+ ;;
+ ;; The problem with undefined variables and functions has been solved
+ ;; by using `set', `symbol-value' and `symbol-function' rather than
+ ;; `setq' and direct references to variables and functions.
+ ;;
+ ;; For example:
+ ;;	(if (boundp 'foo)   ... (symbol-value 'foo) )
+ ;;	(set 'foo ...)   <-- XEmacs doesn't fall for this one.
+ ;;	(funcall (symbol-function 'set) 'bar ...)
+ ;;
+ ;; Note: When this file is interpreted, `eval-when-compile' is
+ ;; evaluted (really smart...)  Since it doesn't hurt to evaluate it,
+ ;; but it is a bit annoying, we test if the byte-compiler has been
+ ;; loaded.  This can, of course, lead to some occasional unintended
+ ;; evaluation...
+ ;;
+ ;; Should someone come up with a better solution, please let me
+ ;; know.
+ 
+ (eval-when-compile
+   (if (or (featurep 'bytecomp)
+ 	  (featurep 'byte-compile))
+       (cond ((string-match "XEmacs" emacs-version)
+ 	     ;; Make XEmacs shut up!  I'm using standard Emacs
+ 	     ;; functions, they are NOT obsolete!
+ 	     (if (eq (get 'force-mode-line-update 'byte-compile)
+ 		     'byte-compile-obsolete)
+ 		 (put 'force-mode-line-update 'byte-compile 'nil))
+ 	     (if (eq (get 'frame-first-window 'byte-compile)
+ 		     'byte-compile-obsolete)
+ 		 (put 'frame-first-window 'byte-compile 'nil))))))
+ 
+ ;;}}}
+ ;;{{{ Variables
+ 
+ (defvar follow-mode nil
+   "Variable indicating if Follow mode is active.")
+ 
+ (defvar follow-mode-hook nil
+   "*Hooks to run when follow-mode is turned on.")
+ 
+ (defvar follow-mode-off-hook nil
+   "*Hooks to run when follow-mode is turned off.")
+ 
+ (defvar follow-mode-version "follow.el (Release 1.6)"
+   "The current version of Follow mode.")
+ 
+ (defvar follow-mode-map nil
+   "*Minor mode keymap for Follow mode.")
+ 
+ (defvar follow-mode-line-text " Follow"
+   "*Text shown in the mode line when Follow mode is active.  
+ Defaults to \" Follow\".  Examples of other values
+ are \" Fw\", or simply \"\".")
+ 
+ (defvar follow-auto nil
+   "*Non-nil activates Follow mode whenever a file is loaded.")
+ 
+ (defvar follow-mode-prefix "\C-c."
+   "*Prefix key to use for follow commands in Follow mode.
+ The value of this variable is checked as part of loading Follow mode.
+ After that, changing the prefix key requires manipulating keymaps.")
+ 
+ (defvar follow-intercept-processes t
+   "*When non-nil, Follow Mode will monitor process output.")
+ 
+ (defvar follow-emacs-version-xemacs-p 
+   (string-match "XEmacs" emacs-version)
+   "Non-nil when running under XEmacs.")
+ 
+ (defvar follow-avoid-tail-recenter-p 
+   (not follow-emacs-version-xemacs-p)
+   "*When non-nil, patch emacs so that tail windows won't be recentered.
+ 
+ A \"tail window\" is a window which displays only the end of 
+ the buffer.  Normally it is practical for the user that empty
+ windows are recentered automatically.  However, when using 
+ Follow Mode it breaks the display when the end is displayed 
+ in a window \"above\" the last window.  This is for 
+ example the case when displaying a short page in info.
+ 
+ Must be set before Follow Mode is loaded.
+ 
+ Please note that it is not possible to fully prevent Emacs from
+ recentering empty windows.  Please report if you find a repeatable
+ situation in which Emacs recenters empty windows.
+ 
+ XEmacs, as of 19.12, does not recenter windows, good!")
+ 
+ (defvar follow-cache-command-list
+   '(next-line previous-line forward-char backward-char)
+   "List of commands which don't require recalculation.
+ 
+ In order to be able to use the cache, a command should not change the
+ contents of the buffer, nor should it change selected window or current
+ buffer.
+ 
+ The commands in this list are checked at load time.
+ 
+ To mark other commands as suitable for caching, set the symbol
+ property `follow-mode-use-cache' to non-nil.")
+ 
+ (defvar follow-debug nil
+   "*Non-nil when debugging Follow mode.")
+ 
+ 
+ ;; Internal variables:
+ 
+ (defvar follow-internal-force-redisplay nil
+   "True when Follow mode should redisplay the windows.")
+ 
+ (defvar follow-process-filter-alist '()
+   "The original filters for processes intercepted by Follow mode.")
+ 
+ (defvar follow-active-menu nil
+   "The menu visible when Follow mode is active.")
+ 
+ (defvar follow-deactive-menu nil
+   "The menu visible when Follow mode is deactivated.")
+ 
+ (defvar follow-inside-post-command-hook nil
+   "Non-nil when inside Follow modes `post-command-hook'. 
+ Used by `follow-window-size-change'.")
+ 
+ (defvar follow-windows-start-end-cache nil
+   "Cache used by `follow-window-start-end'.")
+ 
+ ;;}}}
+ ;;{{{ Bug report
+ 
+ (eval-when-compile (require 'reporter))
+ 
+ (defun follow-submit-feedback ()
+   "Sumbit feedback on Follow mode to the author: andersl@csd.uu.se"
+   (interactive)
+   (require 'reporter)
+   (and (y-or-n-p "Do you really want to submit a report on Follow mode? ")
+        (reporter-submit-bug-report
+ 	"Anders Lindgren <andersl@csd.uu.se>"
+ 	follow-mode-version
+ 	'(post-command-hook 
+ 	  post-command-idle-hook
+ 	  pre-command-hook
+ 	  window-size-change-functions
+ 	  window-scroll-functions
+ 	  follow-mode-hook
+ 	  follow-mode-off-hook
+ 	  follow-auto 
+ 	  follow-intercept-processes
+ 	  follow-avoid-tail-recenter-p
+ 	  follow-process-filter-alist)
+ 	nil
+ 	nil
+ 	(concat 
+ 	 "Hi Anders!\n\n"
+ 	 "(I have read the section on how to report bugs in the "
+ 	 "Emacs manual.)\n\n"
+ 	 "Even though I know you are busy, I thought you might "
+ 	 "want to know...\n\n"))))
+ 
+ ;;}}}
+ ;;{{{ Debug messages
+ 
+ ;; This inline function must be as small as possible!
+ ;; Maybe we should define a macro which expands to nil if
+ ;; the varible is not set.
+ 
+ (defsubst follow-debug-message (&rest args)
+   "Like message, but only active when `follow-debug' is non-nil."
+   (if (and (boundp 'follow-debug) follow-debug)
+       (apply 'message args)))
+ 
+ ;;}}}
+ 
+ ;;{{{ Keymap/Menu
+ 
+ ;;; Define keys for the follow-mode minor mode map and replace some
+ ;;; functions in the global map.  All `follow' mode special functions
+ ;;; can be found on (the somewhat cumbersome) "C-c . <key>"
+ ;;; (Control-C dot <key>). (As of Emacs 19.29 the keys
+ ;;; C-c <punctuation character> are reserved for minor modes.)
+ ;;;
+ ;;; To change the prefix, redefine `follow-mode-prefix' before
+ ;;; `follow' is loaded, or see the section on `follow-mode-hook'
+ ;;; above for an example of how to bind the keys the way you like.
+ ;;;
+ ;;; Please note that the keymap is defined the first time this file is
+ ;;; loaded.  Also note that the only legal way to manipulate the
+ ;;; keymap is to use `define-key'.  Don't change it using `setq' or
+ ;;; similar!
+ 
+ 
+ (if follow-mode-map
+     nil
+   (setq follow-mode-map (make-sparse-keymap))
+   (let ((map (make-sparse-keymap)))
+     (define-key map "\C-v"	'follow-scroll-up)
+     (define-key map "\M-v"	'follow-scroll-down)
+     (define-key map "v"		'follow-scroll-down)
+     (define-key map "1"		'follow-delete-other-windows-and-split)
+     (define-key map "b"		'follow-switch-to-buffer)
+     (define-key map "\C-b"	'follow-switch-to-buffer-all)
+     (define-key map "\C-l"	'follow-recenter)
+     (define-key map "<"		'follow-first-window)
+     (define-key map ">"		'follow-last-window)
+     (define-key map "n"		'follow-next-window)
+     (define-key map "p"		'follow-previous-window)
+ 
+     (define-key follow-mode-map follow-mode-prefix map)
+ 
+     ;; Replace the standard `end-of-buffer', when in Follow Mode.  (I
+     ;; don't see the point in trying to replace every function which
+     ;; could be enhanced in Follow mode.  End-of-buffer is a special
+     ;; case since it is very simple to define and it greatly enhances
+     ;; the look and feel of Follow mode.)
+     ;;
+     ;; (The function `substitute-key-definition' does not work
+     ;; in all versions of Emacs.)
+     (mapcar
+      (function 
+       (lambda (pair)
+ 	(let ((old (car pair))
+ 	      (new (cdr pair)))
+ 	  (mapcar (function (lambda (key) 
+ 			      (define-key follow-mode-map key new)))
+ 		  (where-is-internal old global-map)))))
+      '((end-of-buffer      . follow-end-of-buffer)
+        (fkey-end-of-buffer . follow-end-of-buffer)))
+ 
+     ;;;
+     ;;; The menu.
+     ;;;
+ 
+     (if (not follow-emacs-version-xemacs-p)
+ 
+ 	;;
+ 	;; Emacs 19
+ 	;;
+ 	(let ((menumap (funcall (symbol-function 'make-sparse-keymap)	
+ 			"Follow"))
+ 	      (count 0)
+ 	      id)
+ 	  (mapcar 
+ 	   (function 
+ 	    (lambda (item)
+ 	      (setq id 
+ 		    (or (cdr item)
+ 			(progn
+ 			  (setq count (+ count 1))
+ 			  (intern (format "separator-%d" count)))))
+ 	      (define-key menumap (vector id) item)
+ 	      (or (eq id 'follow-mode)
+ 		  (put id 'menu-enable 'follow-mode))))
+ 	   ;; In reverse order:
+ 	   '(("Toggle Follow mode" . follow-mode)
+ 	     ("--")
+ 	     ("Recenter"           . follow-recenter)
+ 	     ("--")
+ 	     ("Previous Window"    . follow-previous-window)
+ 	     ("Next Windows"       . follow-next-window)
+ 	     ("Last Window"        . follow-last-window)
+ 	     ("First Window"       . follow-first-window)
+ 	     ("--")
+ 	     ("Switch To Buffer (all windows)"
+ 	                           . follow-switch-to-buffer-all)
+ 	     ("Switch To Buffer"   . follow-switch-to-buffer)
+ 	     ("--")
+ 	     ("Delete Other Windows and Split"
+ 	                           . follow-delete-other-windows-and-split)
+ 	     ("--")
+ 	     ("Scroll Down"        . follow-scroll-down)
+ 	     ("Scroll Up"          . follow-scroll-up)))
+ 	  
+ 	  ;; If there is a `tools' meny, we use it. However, we can't add a
+ 	  ;; minor-mode specific item to it (it's broken), so we make the
+ 	  ;; contents ghosted when not in use, and add ourselves to the
+ 	  ;; global map.  If no `tools' menu is present, just make a
+ 	  ;; top-level menu visible when the mode is activated.
+ 	  
+ 	  (let ((tools-map (lookup-key (current-global-map) [menu-bar tools]))
+ 		(last nil))
+ 	    (if (sequencep tools-map)
+ 		(progn
+ 		  ;; Find the last entry in the menu and store it in `last'.
+ 		  (mapcar (function
+ 			   (lambda (x) 
+ 			     (setq last (or (cdr-safe 
+ 					     (cdr-safe 
+ 					      (cdr-safe x))) 
+ 					    last))))
+ 			  tools-map)
+ 		  (if last
+ 		      (progn
+ 			(funcall (symbol-function 'define-key-after)
+ 				  tools-map [separator-follow] '("--") last)
+ 			(funcall (symbol-function 'define-key-after)
+ 				 tools-map [follow] (cons "Follow" menumap)
+ 				 'separator-follow))
+ 		    ;; Didn't find the last item, Adding to the top of
+ 		    ;; tools.  (This will probably never happend...)
+ 		    (define-key (current-global-map) [menu-bar tools follow]
+ 		      (cons "Follow" menumap))))
+ 	      ;; No tools menu, add "Follow" to the menubar.
+ 	      (define-key follow-mode-map [menu-bar follow]
+ 		(cons "Follow" menumap)))))
+ 
+       ;;
+       ;; XEmacs.
+       ;;
+ 
+       ;; place the menu in the `Tools' menu.
+       (let ((menu '("Follow"
+ 		    :filter follow-menu-filter
+ 		    ["Scroll Up" follow-scroll-up t]
+ 		    ["Scroll Down" follow-scroll-down t]
+ 		    ["Delete Other Windows and Split"
+ 		     follow-delete-other-windows-and-split t]
+ 		    ["Switch To Buffer" follow-switch-to-buffer t]
+ 		    ["Switch To Buffer (all windows)" 
+ 		     follow-switch-to-buffer-all t]
+ 		    ["First Window" follow-first-window t]
+ 		    ["Last Window" follow-last-window t]
+ 		    ["Next Windows" follow-next-window t]
+ 		    ["Previous Window" follow-previous-window t]
+ 		    ["Recenter" follow-recenter t]
+ 		    ["Deactivate" follow-mode t])))
+ 
+ 	;; Why not just `(set-buffer-menubar current-menubar)'?  The
+ 	;; question is a very good question.  The reason is that under
+ 	;; Emacs 19, neither `set-buffer-menubar' nor
+ 	;; `current-menubar' is defined, hence the byte-compiler will
+ 	;; warn.
+ 	(funcall (symbol-function 'set-buffer-menubar)
+ 		 (symbol-value 'current-menubar))
+ 	(funcall (symbol-function 'add-submenu) '("Tools") menu))
+ 
+       ;; When the mode is not activated, only one item is visible:
+       ;; "Activate".
+       (defun follow-menu-filter (menu)
+ 	(if follow-mode
+ 	    menu
+ 	  '(["Activate          " follow-mode t]))))))
+ 
+ 
+ ;;; Register the follow mode keymap.
+ (or (assq 'follow-mode minor-mode-map-alist)
+     (setq minor-mode-map-alist
+ 	  (cons (cons 'follow-mode follow-mode-map) minor-mode-map-alist)))
+ 
+ ;;}}}
+ ;;{{{ Cache
+ 
+ (let ((cmds follow-cache-command-list))
+   (while cmds
+     (put (car cmds) 'follow-mode-use-cache t)
+     (setq cmds (cdr cmds))))
+ 
+ ;;}}}
+ 
+ ;;{{{ The mode
+ 
+ ;;;###autoload
+ (defun turn-on-follow-mode ()
+   "Turn on Follow mode. Please see the function `follow-mode'."
+   (interactive)
+   (follow-mode 1))
+ 
+ 
+ ;;;###autoload
+ (defun turn-off-follow-mode ()
+   "Turn off Follow mode. Please see the function `follow-mode'."
+   (interactive)
+   (follow-mode -1))
+ 
+ 
+ ;;;###autoload
+ (defun follow-mode (arg) 
+   "Minor mode which combines windows into one tall virtual window.
+ 
+ The feeling of a \"virtual window\" has been accomplished by the use
+ of two major techniques:
+ 
+ * The windows always displays adjacent sections of the buffer. 
+   This means that whenever one window is moved, all the
+   others will follow.  (Hence the name Follow Mode.)
+ 
+ * Should the point (cursor) end up outside a window, another 
+   window displaying that point is selected, if possible.  This 
+   makes it possible to walk between windows using normal cursor 
+   movement commands.
+ 
+ Follow mode comes to its prime when used on a large screen and two
+ side-by-side window are used. The user can, with the help of Follow
+ mode, use two full-height windows as though they would have been
+ one. Imagine yourself editing a large function, or section of text,
+ and beeing able to use 144 lines instead of the normal 72... (your
+ mileage may vary).
+ 
+ To split one large window into two side-by-side windows, the commands
+ `\\[split-window-horizontally]' or \
+ `M-x follow-delete-other-windows-and-split' can be used.
+ 
+ Only windows displayed in the same frame follow each-other.
+ 
+ If the variable `follow-intercept-processes' is non-nil, Follow mode
+ will listen to the output of processes and redisplay accordingly.
+ \(This is the default.)
+ 
+ When Follow mode is switched on, the hook `follow-mode-hook'
+ is called.  When turned off, `follow-mode-off-hook' is called.
+ 
+ Keys specific to Follow mode:
+ \\{follow-mode-map}"
+   (interactive "P")
+   (make-local-variable 'follow-mode)
+   (put 'follow-mode 'permanent-local t)
+   (let ((follow-mode-orig follow-mode))
+     (setq follow-mode
+ 	  (if (null arg)
+ 	      (not follow-mode)
+ 	    (> (prefix-numeric-value arg) 0)))
+     (if (and follow-mode follow-intercept-processes)
+ 	(follow-intercept-process-output))
+     (cond ((and follow-mode (not follow-mode-orig)) ; On
+ 	   ;; XEmacs: If this is non-nil, the window will scroll before
+ 	   ;; the point will have a chance to get into the next window.
+ 	   (if (boundp 'scroll-on-clipped-lines)
+ 	       (set 'scroll-on-clipped-lines nil))
+ 	   (force-mode-line-update)
+ 	   (add-hook 'post-command-hook 'follow-post-command-hook t)
+ 	   (if (boundp 'post-command-idle-hook)
+ 	       (add-hook 'post-command-idle-hook 
+ 			 'follow-avoid-tail-recenter t))
+ 	   (run-hooks 'follow-mode-hook))
+ 
+ 	  ((and (not follow-mode) follow-mode-orig) ; Off
+ 	   (force-mode-line-update)
+ 	   (run-hooks 'follow-mode-off-hook)))))
+ 
+ 
+ ;; Register follow-mode as a minor mode.
+ 
+ (if (fboundp 'add-minor-mode)
+     ;; XEmacs
+     (funcall (symbol-function 'add-minor-mode)
+ 	     'follow-mode 'follow-mode-line-text)
+   (or (assq 'follow-mode minor-mode-alist)
+       (setq minor-mode-alist
+ 	    (cons '(follow-mode follow-mode-line-text) minor-mode-alist))))
+ 
+ ;;}}}
+ ;;{{{ Find file hook
+ 
+ ;; This will start follow-mode whenever a new file is loaded, if
+ ;; the variable `follow-auto' is non-nil.
+ 
+ (add-hook 'find-file-hooks 'follow-find-file-hook t)
+ 
+ (defun follow-find-file-hook ()
+   "Find-file hook for Follow Mode.  See the variable `follow-auto'."
+   (if follow-auto (follow-mode t)))
+ 
+ ;;}}}
+ 
+ ;;{{{ User functions
+ 
+ ;;;
+ ;;; User functions usable when in Follow mode.
+ ;;;
+ 
+ ;;{{{ Scroll
+ 
+ ;; `scroll-up' and `-down', but for windows in Follow Mode.
+ ;;
+ ;; Almost like the real thing, excpet when the cursor ends up outside
+ ;; the top or bottom...  In our case however, we end up outside the
+ ;; window and hence we are recenterd.  Should we let `recenter' handle
+ ;; the point position we would never leave the selected window.  To do
+ ;; it ourselves we would need to do our own redisplay, which is easier
+ ;; said than done.  (Why didn't I do a real display abstraction from
+ ;; the beginning?)
+ ;;
+ ;; We must sometimes set `follow-internal-force-redisplay', otherwise
+ ;; our post-command-hook will move our windows back into the old
+ ;; position...  (This would also be corrected if we would have had a
+ ;; good redisplay abstraction.)
+ 
+ (defun follow-scroll-up (&optional arg)
+   "Scroll text in a Follow Mode window chain up.
+ 
+ If called with no ARG, the `next-screen-context-lines' last lines of
+ the bottom window in the chain will be visible in the top window.
+ 
+ If called with an argument, scroll ARG lines up.
+ Negative ARG means scroll downward.
+ 
+ Works like `scroll-up' when not in Follow Mode."
+   (interactive "P")
+   (cond ((not (and (boundp 'follow-mode) follow-mode))
+ 	 (scroll-up arg))
+ 	(arg
+ 	 (save-excursion (scroll-up arg))
+ 	 (setq follow-internal-force-redisplay t))
+ 	(t
+ 	 (let* ((windows (follow-all-followers))
+ 		(end (window-end (car (reverse windows)))))
+ 	   (if (eq end (point-max))
+ 	       (signal 'end-of-buffer nil)
+ 	     (select-window (car windows))
+ 	     (goto-char end)
+ 	     (vertical-motion (- next-screen-context-lines))
+ 	     (set-window-start (car windows) (point)))))))
+ 
+ 
+ (defun follow-scroll-down (&optional arg)
+   "Scroll text in a Follow Mode window chain down.
+ 
+ If called with no ARG, the `next-screen-context-lines' top lines of
+ the top window in the chain will be visible in the bottom window.
+ 
+ If called with an argument, scroll ARG lines down.
+ Negative ARG means scroll upward.
+ 
+ Works like `scroll-up' when not in Follow Mode."
+   (interactive "P")
+   (cond ((not (and (boundp 'follow-mode) follow-mode))
+ 	 (scroll-up arg))
+ 	(arg
+ 	 (save-excursion (scroll-down arg)))
+ 	(t
+ 	 (let* ((windows (follow-all-followers))
+ 		(win (car (reverse windows)))
+ 		(start (window-start (car windows))))
+ 	   (if (eq start (point-min))
+ 	       (signal 'beginning-of-buffer nil)
+ 	     (select-window win)
+ 	     (goto-char start)
+ 	     (vertical-motion (- (- (window-height win) 
+ 				    1 
+ 				    next-screen-context-lines)))
+ 	     (set-window-start win (point))
+ 	     (goto-char start)
+ 	     (vertical-motion (- next-screen-context-lines 1))
+ 	     (setq follow-internal-force-redisplay t))))))
+ 
+ ;;}}}
+ ;;{{{ Buffer
+ 
+ ;;;###autoload
+ (defun follow-delete-other-windows-and-split (&optional arg)
+   "Create two side by side windows and enter Follow Mode.
+ 
+ Execute this command to display as much as possible of the text
+ in the selected window.  All other windows, in the current 
+ frame, are deleted and the selected window is split in two
+ side-by-side windows. Follow Mode is activated, hence the 
+ two windows always will display two successive pages.
+ \(If one window is moved, the other one will follow.)
+ 
+ If ARG is positive, the leftmost window is selected.  If it negative,
+ the rightmost is selected.  If ARG is nil, the leftmost window is
+ selected if the original window is the first one in the frame.
+ 
+ To bind this command to a hotkey, place the following line
+ in your `~/.emacs' file, replacing [f7] by your favourite key:
+     (global-set-key [f7] 'follow-delete-other-windows-and-split)"
+   (interactive "P")
+   (let ((other (or (and (null arg) 
+ 			(not (eq (selected-window)
+ 				 (frame-first-window (selected-frame)))))
+ 		   (and arg
+ 			(< (prefix-numeric-value arg) 0))))
+ 	(start (window-start)))
+     (delete-other-windows)
+     (split-window-horizontally)
+     (if other 
+ 	(progn
+ 	  (other-window 1)
+ 	  (set-window-start (selected-window) start)
+ 	  (setq follow-internal-force-redisplay t)))
+     (follow-mode 1)))
+ 
+ (defun follow-switch-to-buffer (buffer)
+   "Show BUFFER in all windows in the current Follow Mode window chain."
+   (interactive "BSwitch to Buffer: ")
+   (let ((orig-window (selected-window))
+ 	(windows (follow-all-followers)))
+     (while windows
+       (select-window (car windows))
+       (switch-to-buffer buffer)
+       (setq windows (cdr windows)))
+     (select-window orig-window)))
+ 
+ 
+ (defun follow-switch-to-buffer-all (&optional buffer)
+   "Show BUFFER in all windows on this frame.
+ Defaults to current buffer."
+   (interactive (list (read-buffer "Switch to Buffer: " 
+ 				  (current-buffer))))
+   (or buffer (setq buffer (current-buffer)))
+   (let ((orig-window (selected-window)))
+     (walk-windows 
+      (function 
+       (lambda (win)
+ 	(select-window win)
+ 	(switch-to-buffer buffer))))
+     (select-window orig-window)
+     (follow-redisplay)))
+ 
+ 
+ (defun follow-switch-to-current-buffer-all ()
+   "Show current buffer in all windows on this frame, and enter Follow Mode.
+ 
+ To bind this command to a hotkey place the following line 
+ in your `~/.emacs' file:
+ 	(global-set-key [f7] 'follow-switch-to-current-buffer-all)"
+   (interactive)
+   (or (and (boundp 'follow-mode) follow-mode)
+       (follow-mode 1))
+   (follow-switch-to-buffer-all))
+ 
+ ;;}}}
+ ;;{{{ Movement
+ 
+ ;; Note, these functions are not very useful, atleast not unless you
+ ;; rebind the rather cumbersome key sequence `C-c . p'.
+ 
+ (defun follow-next-window ()
+   "Select the next window showing the same buffer."
+   (interactive)
+   (let ((succ (cdr (follow-split-followers (follow-all-followers)))))
+     (if succ
+ 	(select-window (car succ))
+       (error "%s" "No more windows"))))
+ 
+ 
+ (defun follow-previous-window ()
+   "Select the previous window showing the same buffer."
+   (interactive)
+   (let ((pred (car (follow-split-followers (follow-all-followers)))))
+     (if pred
+ 	(select-window (car pred))
+       (error "%s" "No more windows"))))
+ 
+ 
+ (defun follow-first-window ()
+   "Select the first window in the frame showing the same buffer."
+   (interactive)
+   (select-window (car (follow-all-followers))))
+ 
+ 
+ (defun follow-last-window ()
+   "Select the last window in the frame showing the same buffer."
+   (interactive)
+   (select-window (car (reverse (follow-all-followers)))))
+ 
+ ;;}}}
+ ;;{{{ Redraw
+ 
+ (defun follow-recenter (&optional arg)
+   "Recenter the middle window around the point,
+ and rearrange all other windows around the middle window.
+ 
+ With a positive argument, place the current line ARG lines
+ from the top.  With a negative, place it -ARG lines from the
+ bottom."
+   (interactive "P")
+   (if arg
+       (let ((p (point))
+ 	    (arg (prefix-numeric-value arg)))
+ 	(if (>= arg 0)
+ 	    ;; Recenter relative to the top.
+ 	    (progn
+ 	      (follow-first-window)
+ 	      (goto-char p)
+ 	      (recenter arg))
+ 	  ;; Recenter relative to the bottom.
+ 	  (follow-last-window)
+ 	  (goto-char p)
+ 	  (recenter arg)
+ 	  ;; Otherwise, our post-command-hook will move the window
+ 	  ;; right back.
+ 	  (setq follow-internal-force-redisplay t)))
+     ;; Recenter in the middle.
+     (let* ((dest (point))
+ 	   (windows (follow-all-followers))
+ 	   (win (nth (/ (- (length windows) 1) 2) windows)))
+       (select-window win)
+       (goto-char dest)
+       (recenter)
+       ;;(setq follow-internal-force-redisplay t)
+       )))
+ 
+ 
+ (defun follow-redraw ()
+   "Arrange windows displaying the same buffer in successor order.
+ This function can be called even if the buffer is not in Follow mode.
+ 
+ Hopefully, there should be no reason to call this function when in
+ Follow mode since the windows should always be aligned."
+   (interactive)
+   (sit-for 0)
+   (follow-redisplay))
+ 
+ ;;}}}
+ ;;{{{ End of buffer
+ 
+ (defun follow-end-of-buffer (&optional arg)
+   "Move point to the end of the buffer. Follow Mode style.
+ 
+ If the end is not visible, it will be displayed in the last possible
+ window in the Follow Mode window chain.
+ 
+ The mark is left at the previous position. With arg N, put point N/10
+ of the way from the true end."
+   (interactive "P")
+   (let ((followers (follow-all-followers))
+ 	(pos (point)))
+     (cond (arg
+ 	   (select-window (car (reverse followers))))
+ 	  ((follow-select-if-end-visible 
+ 	    (follow-windows-start-end followers)))
+ 	  (t
+ 	   (select-window (car (reverse followers)))))
+     (goto-char pos)
+     (end-of-buffer arg)))
+ 
+ ;;}}}
+ 
+ ;;}}}
+ 
+ ;;{{{ Display
+ 
+ ;;;; The display routines
+ 
+ ;;{{{ Information gathering functions
+ 
+ (defun follow-all-followers (&optional testwin)
+   "Return all windows displaying the same buffer as the TESTWIN.
+ The list contains only windows displayed in the same frame as TESTWIN.
+ If TESTWIN is nil the selected window is used."
+   (or (and testwin (window-live-p testwin))
+       (setq testwin (selected-window)))
+   (let* ((top (frame-first-window (window-frame testwin)))
+ 	 (win top)
+ 	 (done nil)
+ 	 (windows '())
+ 	 (buffer (window-buffer testwin)))
+     (while (and (not done) win)
+       (if (eq (window-buffer win) buffer)
+ 	  (setq windows (cons win windows)))
+       (setq win (next-window win 'not))
+       (if (eq win top)
+ 	  (setq done t)))
+     (nreverse windows)))
+ 
+ 
+ (defun follow-split-followers (windows &optional win)
+   "Split the WINDOWS into the sets: predecessors and successors.
+ Return `(PRED . SUCC)' where `PRED' and `SUCC' are ordered starting 
+ from the selected window."
+   (or win 
+       (setq win (selected-window)))
+   (let ((pred '()))
+     (while (not (eq (car windows) win))
+       (setq pred (cons (car windows) pred))
+       (setq windows (cdr windows)))
+     (cons pred (cdr windows))))
+ 
+ 
+ ;; Try to optimize this function for speed!
+ 
+ (defun follow-calc-win-end (&optional win)
+   "Calculate the presumed window end for WIN.
+ 
+ Actually, the position returned is the start of the next
+ window, normally is the end plus one.
+ 
+ If WIN is nil, the selected window is used.
+ 
+ Returns (end-pos end-of-buffer-p)"
+   (if follow-emacs-version-xemacs-p
+       ;; XEmacs can calculate the end of the window by using
+       ;; the 'guarantee options. GOOD!
+       (let ((end (window-end win t)))
+ 	(if (= end (funcall (symbol-function 'point-max)
+ 			    (window-buffer win)))
+ 	    (list end t)
+ 	  (list (+ end 1) nil))) 
+     ;; Emacs 19: We have to calculate the end by ourselves.
+     ;; This code works on both XEmacs and Emacs 19, but now
+     ;; that XEmacs has got custom-written code, this could
+     ;; be optimized for Emacs 19.
+     (let ((orig-win (and win (selected-window)))
+ 	  height
+ 	  buffer-end-p)
+       (if win (select-window win))
+       (prog1
+ 	  (save-excursion
+ 	    (goto-char (window-start))
+ 	    (setq height (- (window-height) 1))
+ 	    (setq buffer-end-p
+ 		  (if (bolp)
+ 		      (not (= height (vertical-motion height)))
+ 		    (save-restriction
+ 		      ;; Fix a mis-feature in `vertical-motion':
+ 		      ;; The start of the window is assumed to
+ 		      ;; coinside with the start of a line.
+ 		      (narrow-to-region (point) (point-max))
+ 		      (not (= height (vertical-motion height))))))
+ 	    (list (point) buffer-end-p))
+ 	(if orig-win
+ 	    (select-window orig-win))))))
+ 
+ 
+ ;; Can't use `save-window-excursion' since it triggers a redraw.
+ (defun follow-calc-win-start (windows pos win)
+   "Calculate where WIN will start if the first in WINDOWS start at POS.
+ 
+ If WIN is nil the point below all windows is returned."
+   (let (start)
+     (while (and windows (not (eq (car windows) win)))
+       (setq start (window-start (car windows)))
+       (set-window-start (car windows) pos 'noforce)
+       (setq pos (car (inline (follow-calc-win-end (car windows)))))
+       (set-window-start (car windows) start 'noforce)
+       (setq windows (cdr windows)))
+     pos))
+ 
+ 
+ ;; The result from `follow-windows-start-end' is cached when using
+ ;; a handful simple commands, like cursor movement commands.
+ 
+ (defsubst follow-cache-valid-p (windows)
+   "Test if the cached value of `follow-windows-start-end' can be used.
+ Note that this handles the case when the cache has been set to nil."
+   (let ((res t)
+ 	(cache follow-windows-start-end-cache))
+     (while (and res windows cache)
+       (setq res (and (eq (car windows)
+ 			 (car (car cache)))
+ 		     (eq (window-start (car windows))
+ 			 (car (cdr (car cache))))))
+       (setq windows (cdr windows))
+       (setq cache (cdr cache)))
+     (and res (null windows) (null cache))))
+ 
+ 
+ (defsubst follow-invalidate-cache ()
+   "Force `follow-windows-start-end' to recalculate the end of the window."
+   (setq follow-windows-start-end-cache nil))
+ 
+ 
+ ;; Build a list of windows and their start and end positions.
+ ;; Useful to avoid calculating start/end position whenever they are needed.
+ ;; The list has the format:
+ ;; ((Win Start End End-of-buffer-visible-p) ...)
+ 
+ ;; Used to have a `save-window-excursion', but it obviously triggered
+ ;; redraws of the display. Check if I used it for anything.
+ 
+ 
+ (defun follow-windows-start-end (windows)
+   "Builds a list of (WIN START END BUFFER-END-P) for every window in WINDOWS."
+   (if (follow-cache-valid-p windows)
+       follow-windows-start-end-cache
+     (let ((win-start-end '())
+ 	  (orig-win (selected-window)))
+       (while windows
+ 	(select-window (car windows))
+ 	(setq win-start-end 
+ 	      (cons (cons (car windows) 
+ 			  (cons (window-start)
+ 				(follow-calc-win-end)))
+ 		    win-start-end))
+ 	(setq windows (cdr windows)))
+       (select-window orig-win)
+       (setq follow-windows-start-end-cache (nreverse win-start-end))
+       follow-windows-start-end-cache)))
+ 
+ 
+ (defsubst follow-pos-visible (pos win win-start-end)
+   "Non-nil when POS is visible in WIN."
+   (let ((wstart-wend-bend (cdr (assq win win-start-end))))
+     (and (>= pos (car wstart-wend-bend))
+ 	 (or (< pos (car (cdr wstart-wend-bend)))
+ 	     (nth 2 wstart-wend-bend)))))
+ 
+ 
+ ;; By `aligned' we mean that for all adjecent windows, the end of the
+ ;; first is equal with the start of the successor.  The first window
+ ;; should start at a full screen line.
+ 
+ (defsubst follow-windows-aligned-p (win-start-end)
+   "Non-nil if the follower WINDOWS are alinged."
+   (let ((res t)) 
+     (save-excursion
+        (goto-char (window-start (car (car win-start-end))))
+        (if (bolp)
+ 	   nil
+ 	 (vertical-motion 0 (car (car win-start-end)))
+ 	 (setq res (eq (point) (window-start (car (car win-start-end)))))))
+     (while (and res (cdr win-start-end))
+       ;; At least two followers left
+       (setq res (eq (car (cdr (cdr (car win-start-end))))
+ 		    (car (cdr (car (cdr win-start-end))))))
+       (setq win-start-end (cdr win-start-end)))
+     res))
+ 
+ 
+ ;; Check if the point is visible in all windows. (So that
+ ;; no one will be recentered.)
+ 
+ (defun follow-point-visible-all-windows-p (win-start-end)
+   "Non-nil when the window-point is visible in all windows."
+   (let ((res t))
+     (while (and res win-start-end)
+       (setq res (follow-pos-visible (window-point (car (car win-start-end)))
+ 				    (car (car win-start-end))
+ 				    win-start-end))
+       (setq win-start-end (cdr win-start-end)))
+     res))
+ 
+ 
+ ;; Make sure WIN always starts at the beginning of an whole screen
+ ;; line. If WIN is not aligned the start is updated which probably
+ ;; will lead to a redisplay of the screen later on.
+ ;;
+ ;; This is used with the first window in a follow chain.  The reason
+ ;; is that we want to detect that the point is outside the window.
+ ;; (Without the update, the start of the window will move as the
+ ;; user presses BackSpace, and the other window redisplay routines
+ ;; will move the start of the window in the wrong direction.)
+ 
+ (defun follow-update-window-start (win)
+   "Make sure that the start of WIN starts at a full screen line."
+   (save-excursion
+     (goto-char (window-start win))
+     (if (bolp)
+ 	nil
+       (vertical-motion 0 win)
+       (if (eq (point) (window-start win))
+ 	  nil
+ 	(vertical-motion 1 win)
+ 	(set-window-start win (point) 'noforce)))))
+ 
+ ;;}}}
+ ;;{{{ Selection functions
+ 
+ ;; Make a window in WINDOWS selected if it currently
+ ;; is displaying the position DEST.
+ ;;
+ ;; We don't select a window if it just has been moved.
+ 
+ (defun follow-select-if-visible (dest win-start-end)
+   "Select and return a window, if DEST is visible in it.
+ Return the selected window."
+   (let ((win nil))
+     (while (and (not win) win-start-end)
+       ;; Don't select a window which was just moved. This makes it
+       ;; possible to later select the last window after a `end-of-buffer'
+       ;; command.
+       (if (follow-pos-visible dest (car (car win-start-end)) win-start-end)
+ 	  (progn
+ 	    (setq win (car (car win-start-end)))
+ 	    (select-window win)))
+       (setq win-start-end (cdr win-start-end)))
+     win))
+ 
+ 
+ ;; Lets select a window showing the end. Make sure we only select it if it
+ ;; it wasn't just moved here. (i.e. M-> shall not unconditionally place
+ ;; the point in the selected window.)
+ ;;
+ ;; (Compability cludge: in Emacs 19 `window-end' is equal to `point-max';
+ ;; in XEmacs, it is equal to `point-max + 1'. Should I really bother
+ ;; checking `window-end' now when I check `end-of-buffer' explicitylt?)
+ 
+ (defun follow-select-if-end-visible (win-start-end)
+   "Select and return a window, if end is visible in it."
+   (let ((win nil))
+     (while (and (not win) win-start-end)
+       ;; Don't select a window which was just moved. This makes it
+       ;; possible to later select the last window after a `end-of-buffer'
+       ;; command.
+       (if (and (eq (point-max) (nth 2 (car win-start-end)))
+ 	       (nth 3 (car win-start-end))
+ 	       (eq (point-max) (min (point-max)
+ 				    (window-end (car (car win-start-end))))))
+ 	  (progn
+ 	    (setq win (car (car win-start-end)))
+ 	    (select-window win)))
+       (setq win-start-end (cdr win-start-end)))
+     win))
+ 
+ 
+ ;; Select a window which will display the point if the windows would
+ ;; be redisplayed with the first window fixed. This is useful for
+ ;; example when the user has pressed return at the bottom of a window
+ ;; as the point is not visible in any window.
+ 
+ (defun follow-select-if-visible-from-first (dest windows)
+   "Select and return a window with DEST, if WINDOWS are redrawn from top."
+   (let ((win nil)
+ 	end-pos-end-p)
+     (save-excursion
+       (goto-char (window-start (car windows)))
+       ;; Make sure the line start in the beginning of a real screen
+       ;; line.
+       (vertical-motion 0 (car windows))    
+       (if (< dest (point))
+ 	  ;; Above the start, not visible.
+ 	  nil
+ 	;; At or below the start. Check the windows.
+ 	(save-window-excursion
+ 	  (while (and (not win) windows)
+ 	    (set-window-start (car windows) (point) 'noforce)
+ 	    (setq end-pos-end-p (follow-calc-win-end (car windows)))
+ 	    (goto-char (car end-pos-end-p))
+ 	    ;; Visible, if dest above end, or if eob is visible inside
+ 	    ;; the window.
+ 	    (if (or (car (cdr end-pos-end-p))
+ 		    (< dest (point)))
+ 		  (setq win (car windows))
+ 		(setq windows (cdr windows)))))))
+     (if win 
+ 	(select-window win))
+     win))
+ 
+ 
+ ;;}}}
+ ;;{{{ Redisplay 
+ 
+ ;; Redraw all the windows on the screen, starting with the top window.
+ ;; The window used as as marker is WIN, or the selcted window if WIN
+ ;; is nil.
+ 
+ (defun follow-redisplay (&optional windows win)
+   "Reposition the WINDOWS around WIN.
+ Should the point be too close to the roof we redisplay everything
+ from the top. WINDOWS should contain a list of windows to
+ redisplay, it is assumed that WIN is a member of the list. 
+ Should WINDOWS be nil, the windows displaying the
+ same buffer as WIN, in the current frame, are used.
+ Should WIN be nil, the selected window is used." 
+   (or win
+       (setq win (selected-window)))
+   (or windows 
+       (setq windows (follow-all-followers win)))
+   (follow-downward windows (follow-calculate-first-window-start windows win)))
+ 
+ 
+ ;; Redisplay a chain of windows. Start every window directly after the
+ ;; end of the previous window, to make sure long lines are displayed
+ ;; correctly.
+ 
+ (defun follow-downward (windows pos)
+   "Redisplay all WINDOWS starting at POS."
+   (while windows
+     (set-window-start (car windows) pos)
+     (setq pos (car (follow-calc-win-end (car windows))))
+     (setq windows (cdr windows))))
+ 
+ 
+ ;;(defun follow-downward (windows pos)
+ ;;  "Redisplay all WINDOWS starting at POS."
+ ;;  (let (p)
+ ;;    (while windows
+ ;;      (setq p (window-point (car windows)))
+ ;;      (set-window-start (car windows) pos)
+ ;;      (set-window-point (car windows) (max p pos))
+ ;;      (setq pos (car (follow-calc-win-end (car windows))))
+ ;;      (setq windows (cdr windows)))))
+ 
+ 
+ ;; Return the start of the first window.
+ ;;
+ ;; First, estimate the position. It the value is not perfect (i.e. we
+ ;; have somewhere splited a line between windows) we try to enhance
+ ;; the value.
+ ;;
+ ;; The guess is always perfect if no long lines is split between
+ ;; windows.
+ ;;
+ ;; The worst case peformace of probably very bad, but it is very
+ ;; unlikely that we ever will miss the correct start by more than one
+ ;; or two lines.
+ 
+ (defun follow-calculate-first-window-start (windows &optional win start)
+   "Calculate the start of the first window.
+ 
+ WINDOWS is a chain of windows to work with.  WIN is the window
+ to recenter around.  It is assumed that WIN starts at position 
+ START."
+   (or win 
+       (setq win (selected-window)))
+   (or start 
+       (setq start (window-start win)))
+   (let ((guess (follow-estimate-first-window-start windows win start)))
+     (if (car guess)
+ 	(cdr guess)
+       ;; The guess wasn't exact, try to enhance it.
+       (let ((win-start (follow-calc-win-start windows (cdr guess) win)))
+ 	(cond ((= win-start start) 
+ 	       (follow-debug-message "exact")
+ 	       (cdr guess))
+ 	      ((< win-start start)
+ 	       (follow-debug-message "above")
+ 	       (follow-calculate-first-window-start-from-above 
+ 		windows (cdr guess) win start))
+ 	      (t
+ 	       (follow-debug-message "below")
+ 	       (follow-calculate-first-window-start-from-below 
+ 		windows (cdr guess) win start)))))))
+ 
+ 
+ ;; `exact' is disabled due to XEmacs and fonts of variable
+ ;; height.
+ (defun follow-estimate-first-window-start (windows win start)
+   "Estimate the position of the first window.
+ 
+ Returns (EXACT . POS). If EXACT is non-nil, POS is the starting
+ position of the first window. Otherwise it is a good guess."
+   (let ((pred (car (follow-split-followers windows win)))
+ 	(exact nil))
+     (save-excursion
+       (goto-char start)
+       ;(setq exact (bolp))
+       (vertical-motion 0 win)
+       (while pred
+ 	(vertical-motion (- 1 (window-height (car pred))) (car pred))
+ 	(if (not (bolp))
+ 	  (setq exact nil))
+ 	(setq pred (cdr pred)))
+       (cons exact (point)))))
+ 
+ 
+ ;; Find the starting point, start at GUESS and search downward.
+ ;; The returned point is always a point below GUESS.
+ 
+ (defun follow-calculate-first-window-start-from-above 
+        (windows guess win start)
+   (save-excursion
+     (let ((done nil)
+ 	  win-start
+ 	  res)
+       (goto-char guess)
+       (while (not done)
+ 	(if (not (= (vertical-motion 1 (car windows)) 1))
+ 	    ;; Hit bottom! (Can we really do this?)
+ 	    ;; We'll keep it, since it ensures termination.
+ 	    (progn
+ 	      (setq done t)
+ 	      (setq res (point-max)))
+ 	  (setq win-start (follow-calc-win-start windows (point) win))
+ 	  (if (>= win-start start)
+ 	      (progn 
+ 		(setq done t)
+ 		(setq res (point))))))
+       res)))
+ 
+ 
+ ;; Find the starting point, start at GUESS and search upward.  Return
+ ;; a point on the same line as GUESS, or above.
+ ;;
+ ;; (Is this ever used? I must make sure it works just in case it is
+ ;; ever called.)
+ 
+ (defun follow-calculate-first-window-start-from-below
+        (windows guess &optional win start)
+   (setq win (or win (selected-window)))
+   (setq start (or start (window-start win)))
+   (save-excursion
+     (let ((done nil)
+ 	  win-start
+ 	  res)
+       ;; Always calculate what happend when no line is displayed in the first
+       ;; window. (The `previous' res is needed below!)
+       (goto-char guess)
+       (vertical-motion 0 (car windows))
+       (setq res (point))
+       (while (not done)
+ 	(if (not (= (vertical-motion -1 (car windows)) -1))
+ 	    ;; Hit roof!
+ 	    (progn
+ 	      (setq done t)
+ 	      (setq res (point-min)))
+ 	  (setq win-start (follow-calc-win-start windows (point) win))
+ 	  (cond ((= win-start start)	; Perfect match, use this value
+ 		 (setq done t)
+ 		 (setq res (point)))
+ 		((< win-start start)	; Walked to far, use preious result
+ 		 (setq done t))
+ 		(t			; Store result for next iteration
+ 		 (setq res (point))))))
+       res)))
+ 
+ ;;}}}
+ ;;{{{ Avoid tail recenter
+ 
+ ;; This sets the window internal flag `force_start'. The effect is that
+ ;; windows only displaying the tail isn't recentered.
+ ;; Has to be called before every redisplay... (Great isn't it?)
+ ;;
+ ;; XEmacs doesn't recenter the tail, GOOD!
+ ;;
+ ;; A window displaying only the tail, is a windows whose
+ ;; window-start position is equal to (point-max) of the buffer it
+ ;; displays.
+ ;;
+ ;; This function is also added to `post-command-idle-hook', introduced
+ ;; in Emacs 19.30.  This is needed since the vaccine injected by the
+ ;; call from `post-command-hook' only works until the next redisplay.
+ ;; It is possible that the functions in the `post-command-idle-hook'
+ ;; can cause a redisplay, and hence a new vaccine is needed.
+ ;;
+ ;; Sometimes, calling this function could actually cause a redisplay,
+ ;; especially if it is placed in the debug filter section.  I must
+ ;; investigate this further...
+ 
+ (defun follow-avoid-tail-recenter (&rest rest)
+   "Make sure windows displaying the end of a buffer aren't recentered.
+ 
+ This is done by reading and rewriting the start positon of 
+ non-first windows in Follow Mode."
+   (if follow-avoid-tail-recenter-p
+       (let* ((orig-buffer (current-buffer))
+ 	    (top (frame-first-window (selected-frame)))
+ 	    (win top)
+ 	    (who '())			; list of (buffer . frame)
+ 	    start
+ 	    pair)			; (buffer . frame)
+ 	;; If the only window in the frame is a minibuffer
+ 	;; window, `next-window' will never find it again...
+ 	(if (window-minibuffer-p top)
+ 	    nil
+ 	  (while  ;; look, no body!
+ 	      (progn
+ 		(setq start (window-start win))
+ 		(set-buffer (window-buffer win))
+ 		(setq pair (cons (window-buffer win) (window-frame win)))
+ 		(if (member pair who)
+ 		    (if (and (boundp 'follow-mode) follow-mode 
+ 			     (eq (point-max) start))
+ 			;; Write the same window start back, but don't
+ 			;; set the NOFORCE flag.
+ 			(set-window-start win start))
+ 		  (setq who (cons pair who)))
+ 		(setq win (next-window win 'not t))
+ 		(not (eq win top))))  ;; Loop while this is true.
+ 	  (set-buffer orig-buffer)))))
+ 
+ ;;}}}
+ 
+ ;;}}}
+ ;;{{{ Post Command Hook
+ 
+ ;;; The magic little box. This function is called after every command.
+ 
+ ;; This is not as complicated as it seems. It is simply a list of common
+ ;; display situations and the actions to take, plus commands for redrawing
+ ;; the screen if it should be unaligned.
+ ;;
+ ;; We divide the check into two parts; whether we are at the end or not.
+ ;; This is due to the fact that the end can actaually be visible
+ ;; in several window even though they are aligned.
+ 
+ (defun follow-post-command-hook ()
+   "Ensure that the windows in Follow mode are adjecent after each command."
+   (setq follow-inside-post-command-hook t)
+   (if (or (not (input-pending-p))
+ 	  ;; Sometimes, in XEmacs, mouse events are not handled
+ 	  ;; properly by `input-pending-p'.  A typical example is
+ 	  ;; when clicking on a node in `info'.
+ 	  (and (boundp 'current-mouse-event)
+ 	       (symbol-value 'current-mouse-event)
+ 	       (fboundp 'button-event-p)
+ 	       (funcall (symbol-function 'button-event-p)
+ 			(symbol-value 'current-mouse-event))))
+       ;; Work in the selected window, not in the current buffer.
+       (let ((orig-buffer (current-buffer))
+ 	    (win (selected-window)))
+ 	(set-buffer (window-buffer win))
+ 	(or (and (symbolp this-command) 
+ 		 (get this-command 'follow-mode-use-cache))
+ 	    (follow-invalidate-cache))
+ 	(if (and (boundp 'follow-mode) follow-mode
+ 		 (not (window-minibuffer-p win)))
+ 	    ;; The buffer shown in the selected window is in follow
+ 	    ;; mode, lets find the current state of the display and
+ 	    ;; cache the result for speed (i.e. `aligned' and `visible'.)
+ 	    (let* ((windows (inline (follow-all-followers win)))
+ 		   (dest (point))
+ 		   (win-start-end (inline
+ 				    (follow-update-window-start (car windows))
+ 				    (follow-windows-start-end windows)))
+ 		   (aligned (follow-windows-aligned-p win-start-end))
+ 		   (visible (follow-pos-visible dest win win-start-end)))
+ 	      (if (not (and aligned visible))
+ 		  (follow-invalidate-cache))
+ 	      (inline (follow-avoid-tail-recenter))
+ 	      ;; Select a window to display the point.
+ 	      (or follow-internal-force-redisplay
+ 		  (progn
+ 		    (if (eq dest (point-max))
+ 			;; We're at the end, we have be be careful since
+ 			;; the display can be aligned while `dest' can
+ 			;; be visible in several windows.
+ 			(cond
+ 			 ;; Select the current window, but only when
+ 			 ;; the display is correct. (When inserting
+ 			 ;; character in a tail window, the display is
+ 			 ;; not correct, as they are shown twice.)
+ 			 ;;
+ 			 ;; Never stick to the current window after a
+ 			 ;; deletion.  The reason is cosmetic, when
+ 			 ;; typing `DEL' in a window showing only the
+ 			 ;; end of the file, character are removed
+ 			 ;; from the window above, which is very
+ 			 ;; unintuitive.
+ 			 ((and visible
+ 			       aligned
+ 			       (not (memq this-command 
+ 					  '(backward-delete-char
+ 					    delete-backward-char
+ 					    backward-delete-char-untabify
+ 					    kill-region))))
+ 			  (follow-debug-message "Max: same"))
+ 			 ;; If the end is visible, and the window
+ 			 ;; doesn't seems like it just has been moved,
+ 			 ;; select it.
+ 			 ((follow-select-if-end-visible win-start-end)
+ 			  (follow-debug-message "Max: end visible")
+ 			  (setq visible t)
+ 			  (setq aligned nil)
+ 			  (goto-char dest))
+ 			 ;; Just show the end...
+ 			 (t
+ 			  (follow-debug-message "Max: default")
+ 			  (select-window (car (reverse windows)))
+ 			  (goto-char dest)
+ 			  (setq visible nil)
+ 			  (setq aligned nil)))
+ 		      
+ 		      ;; We're not at the end, here life is much simpler.
+ 		      (cond
+ 		       ;; This is the normal case! 
+ 		       ;; It should be optimized for speed.
+ 		       ((and visible aligned)
+ 			(follow-debug-message "same"))
+ 		       ;; Pick a position in any window.  If the
+ 		       ;; display is ok, this will pick the `correct'
+ 		       ;; window.  If the display is wierd do this
+ 		       ;; anyway, this will be the case after a delete
+ 		       ;; at the beginning of the window.
+ 		       ((follow-select-if-visible dest win-start-end)
+ 			(follow-debug-message "visible")
+ 			(setq visible t)
+ 			(goto-char dest))
+ 		       ;; Not visible anywhere else, lets pick this one.
+ 		       ;; (Is this case used?)
+ 		       (visible
+ 			(follow-debug-message "visible in selected."))
+ 		       ;; Far out!
+ 		       ((eq dest (point-min))
+ 			(follow-debug-message "min")
+ 			(select-window (car windows))
+ 			(goto-char dest)
+ 			(set-window-start (selected-window) (point-min))
+ 			(setq win-start-end (follow-windows-start-end windows))
+ 			(follow-invalidate-cache)
+ 			(setq visible t)
+ 			(setq aligned nil))
+ 		       ;; If we can position the cursor without moving the first
+ 		       ;; window, do it. This is the case which catches `RET'
+ 		       ;; at the bottom of a window.
+ 		       ((follow-select-if-visible-from-first dest windows)
+ 			(follow-debug-message "Below first")
+ 			(setq visible t)		  
+ 			(setq aligned t)
+ 			(follow-redisplay windows (car windows))
+ 			(goto-char dest))
+ 		       ;; None of the above. For simplicity, we stick to the
+ 		       ;; selected window.
+ 		       (t
+ 			(follow-debug-message "None")
+ 			(setq visible nil)
+ 			(setq aligned nil))))
+ 		    ;; If a new window has been selected, make sure that the
+ 		    ;; old is not scrolled when the point is outside the
+ 		    ;; window.
+ 		    (or (eq win (selected-window))
+ 			(let ((p (window-point win)))
+ 			  (set-window-start win (window-start win) nil)
+ 			  (set-window-point win p)))))
+ 	      ;; Make sure the point is visible in the selected window.
+ 	      ;; (This could lead to a scroll.)
+ 	      (if (or visible
+ 		      (follow-pos-visible dest win win-start-end))
+ 		  nil
+ 		(sit-for 0)
+ 		(follow-avoid-tail-recenter)
+ 		(setq win-start-end (follow-windows-start-end windows))
+ 		(follow-invalidate-cache)
+ 		(setq aligned nil))
+ 	      ;; Redraw the windows whenever needed.
+ 	      (if (or follow-internal-force-redisplay
+ 		      (not (or aligned
+ 			       (follow-windows-aligned-p win-start-end)))
+ 		      (not (inline (follow-point-visible-all-windows-p 
+ 				    win-start-end))))
+ 		  (progn
+ 		    (setq follow-internal-force-redisplay nil)
+ 		    (follow-redisplay windows (selected-window))
+ 		    (setq win-start-end (follow-windows-start-end windows))
+ 		    (follow-invalidate-cache)
+ 		    ;; When the point ends up in another window. This
+ 		    ;; happends when dest is in the beginning of the
+ 		    ;; file and the selected window is not the first.
+ 		    ;; It can also, in rare situations happend when
+ 		    ;; long lines are used and there is a big
+ 		    ;; difference between the width of the windows.
+ 		    ;; (When scrolling one line in a wide window which
+ 		    ;; will cause a move larger that an entire small
+ 		    ;; window.)
+ 		    (if (follow-pos-visible dest win win-start-end)
+ 			nil
+ 		      (follow-select-if-visible dest win-start-end)
+ 		      (goto-char dest))))
+ 	      
+ 	      ;; If the region is visible, make it look good when spanning
+ 	      ;; multiple windows.
+ 	      (if (or (and (boundp 'mark-active) (symbol-value 'mark-active))
+ 		      (and (fboundp 'region-active-p) 
+ 			   (funcall (symbol-function 'region-active-p))))
+ 		  (follow-maximize-region 
+ 		   (selected-window) windows win-start-end))
+ 
+ 	      (inline (follow-avoid-tail-recenter))
+ 	      ;; DEBUG
+ 	      ;;(if (not (follow-windows-aligned-p 
+ 	      ;;           (follow-windows-start-end windows)))
+ 	      ;;    (message "follow-mode: windows still unaligend!"))
+ 	      ;; END OF DEBUG
+ 	      )				; Matches (let*
+ 	  ;; Buffer not in follow mode:
+ 	  ;; We still must update the windows displaying the tail so that
+ 	  ;; Emacs won't recenter them.
+ 	  (follow-avoid-tail-recenter))
+ 	(set-buffer orig-buffer)))
+   (setq follow-inside-post-command-hook nil))
+ 
+ ;;}}}
+ ;;{{{ The region
+ 
+ ;; Tries to make the highlighted area representing the region look
+ ;; good when spanning several windows. 
+ ;;
+ ;; Not perfect, as the point can't be placed at window end, only at
+ ;; end-1. Whis will highlight a little bit in windows above
+ ;; the current.
+ 
+ (defun follow-maximize-region (win windows win-start-end)
+   "Make a highlighted region stretching multiple windows look good
+ when in Follow mode."
+   (let* ((all (follow-split-followers windows win))
+ 	 (pred (car all))
+ 	 (succ (cdr all))
+ 	 data)
+     (while pred
+       (setq data (assq (car pred) win-start-end))
+       (set-window-point (car pred) (max (nth 1 data) (- (nth 2 data) 1)))
+       (setq pred (cdr pred)))
+     (while succ
+       (set-window-point (car succ) (nth 1 (assq (car succ) win-start-end)))
+       (setq succ (cdr succ)))))
+ 
+ ;;}}}
+ ;;{{{ Scroll bar
+ 
+ ;;;; Scroll-bar support code.
+ 
+ ;;; Why is it needed? Well, if the selected window is in follow mode,
+ ;;; all its follower stick to it blindly. If one of them is scrolled,
+ ;;; it immediately returns to the original position when the mouse is
+ ;;; released. If the selected window is not a follower of the dragged
+ ;;; window the windows will be unaligned.
+ 
+ ;;; The advices doesn't get compiled. Aestetically, this might be a
+ ;;; problem but in practical life it isn't.
+ 
+ ;;; Discussion: Now when the other windows in the chain follow the
+ ;;; dragged, should we really select it?
+ 
+ (cond ((fboundp 'scroll-bar-drag)
+        ;;;
+        ;;; Emacs 19 style scrollbars.
+        ;;;
+ 
+        ;; Select the dragged window if it is a follower of the
+        ;; selected window.
+        ;;
+        ;; Generate advices of the form:
+        ;; (defadvice scroll-bar-drag (after follow-scroll-bar-drag activate)
+        ;;   "Adviced by `follow-mode'."
+        ;;   (follow-redraw-after-event (ad-get-arg 0)))
+        (let ((cmds '(scroll-bar-drag
+ 		     scroll-bar-drag-1	; Executed at every move.
+ 		     scroll-bar-scroll-down
+ 		     scroll-bar-scroll-up
+ 		     scroll-bar-set-window-start)))
+ 	 (while cmds
+ 	   (eval
+ 	    (` (defadvice (, (intern (symbol-name (car cmds))))
+ 		 (after 
+ 		  (, (intern (concat "follow-" (symbol-name (car cmds))))) 
+ 		  activate)
+ 		 "Adviced by Follow Mode."
+ 		 (follow-redraw-after-event (ad-get-arg 0)))))
+ 	   (setq cmds (cdr cmds))))
+     
+     
+        (defun follow-redraw-after-event (event)
+ 	 "Adviced by Follow mode."
+ 	 (condition-case nil
+ 	     (let* ((orig-win (selected-window))
+ 		    (win (nth 0 (funcall 
+ 				 (symbol-function 'event-start) event)))
+ 		    (fmode (assq 'follow-mode 
+ 				 (buffer-local-variables 
+ 				  (window-buffer win)))))
+ 	       (if (and fmode (cdr fmode))
+ 		   ;; The selected window is in follow-mode
+ 		   (progn
+ 		     ;; Recenter around the dragged window.
+ 		     (select-window win)
+ 		     (follow-redisplay)
+ 		     (select-window orig-win))))
+ 	   (error nil))))
+ 
+ 
+       ((fboundp 'scrollbar-vertical-drag)
+        ;;;
+        ;;; XEmacs style scrollbars.
+        ;;;
+ 
+        ;; Advice all scrollbar functions on the form:
+        ;;
+        ;; (defadvice scrollbar-line-down 
+        ;;	(after follow-scrollbar-line-down activate)
+        ;;   (follow-xemacs-scrollbar-support (ad-get-arg 0)))
+ 
+       (let ((cmds '(scrollbar-line-down	; Window
+ 		    scrollbar-line-up
+ 		    scrollbar-page-down	; Object
+ 		    scrollbar-page-up
+ 		    scrollbar-to-bottom	; Window
+ 		    scrollbar-to-top
+ 		    scrollbar-vertical-drag ; Object
+ 		    )))
+ 	
+ 	(while cmds
+ 	  (eval
+ 	   (` (defadvice (, (intern (symbol-name (car cmds))))
+ 		(after 
+ 		 (, (intern (concat "follow-" (symbol-name (car cmds))))) 
+ 		 activate)
+ 		"Adviced by `follow-mode'."
+ 		(follow-xemacs-scrollbar-support (ad-get-arg 0)))))
+ 	  (setq cmds (cdr cmds))))
+ 
+ 
+       (defun follow-xemacs-scrollbar-support (window)
+ 	"Redraw windows showing the same buffer as shown in WINDOW.
+ WINDOW is either the dragged window, or a cons containing the
+ window as its first element. This is called while the user drags
+ the scrollbar.
+ 
+ WINDOW can be an object or a window."
+ 	(condition-case nil
+ 	    (progn
+ 	      (if (consp window)
+ 		  (setq window (car window)))
+ 	      (let ((fmode (assq 'follow-mode 
+ 				 (buffer-local-variables 
+ 				  (window-buffer window))))
+ 		    (orig-win (selected-window)))
+ 		(if (and fmode (cdr fmode))
+ 		    (progn
+ 		      ;; Recenter around the dragged window.
+ 		      (select-window window)
+ 		      (follow-redisplay)
+ 		      (select-window orig-win)))))
+ 	  (error nil)))))
+ 
+ ;;}}}
+ ;;{{{ Process output
+ 
+ ;;; The following sections installs a spy which listens to process
+ ;;; output and tries to reposition the windows whose buffers are in
+ ;;; Follow mode.  We play safe as much as possible...
+ ;;;
+ ;;; When follow-mode is activated all active processes are
+ ;;; intercepted.  All new processes which change their filter function
+ ;;; using `set-process-filter' are also intercepted.  The reason is
+ ;;; that a process can cause a redisplay recentering "tail" windows.
+ ;;; Note that it doesn't hurt to spy on more processes than needed.
+ ;;;
+ ;;; Technically, we set the process filter to `follow-generic-filter'.
+ ;;; The original filter is stored in `follow-process-filter-alist'.
+ ;;; Our generic filter calls the original filter, or inserts the
+ ;;; output into the buffer, if the buffer originally didn't have an
+ ;;; output filter.  It also makes sure that the windows connected to
+ ;;; the buffer are aligned.
+ ;;;
+ ;;; Discussion: How to we find processes which doesn't call
+ ;;; `set-process-filter'?  (How often are processes created in a
+ ;;; buffer after Follow mode are activated?)
+ ;;;
+ ;;; Discussion: Should we also advice `process-filter' to make our
+ ;;; filter invisible to others?
+ 
+ ;;{{{ Advice for `set-process-filter'
+ 
+ ;; Do not call this with 'follow-generic-filter as the name of the
+ ;; filter...
+ 
+ (defadvice set-process-filter (before follow-set-process-filter activate)
+   "Follow Mode listens to calls to this function to make 
+ sure process output will be displayed correctly in buffers
+ in which the mode is activated.
+ 
+ Follow Mode inserts it's own process filter to do it's 
+ magic stuff before the real process filter is called."
+   (if follow-intercept-processes
+       (progn
+ 	(setq follow-process-filter-alist
+ 	      (delq (assq (ad-get-arg 0) follow-process-filter-alist)
+ 		    follow-process-filter-alist))
+ 	(follow-tidy-process-filter-alist)
+ 	(cond ((eq (ad-get-arg 1) t))
+ 	      ((eq (ad-get-arg 1) nil)
+ 	       (ad-set-arg 1 'follow-generic-filter))
+ 	      (t
+ 	       (setq follow-process-filter-alist 
+ 		     (cons (cons (ad-get-arg 0) (ad-get-arg 1)) 
+ 			   follow-process-filter-alist))
+ 	       (ad-set-arg 1 'follow-generic-filter))))))
+ 
+ 
+ (defun follow-call-set-process-filter (proc filter)
+   "Call original `set-process-filter' without the Follow mode advice."
+   (ad-disable-advice 'set-process-filter 'before
+ 		     'follow-set-process-filter)
+   (ad-activate 'set-process-filter)
+   (prog1 
+       (set-process-filter proc filter)
+     (ad-enable-advice 'set-process-filter 'before
+ 		      'follow-set-process-filter)
+     (ad-activate 'set-process-filter)))
+ 
+ 
+ (defadvice process-filter (after follow-process-filter activate)
+   "Normally when Follow mode is activated all processes has the
+ process filter set to `follow-generic-filter'.  With this advice,
+ the original process filter is returned."
+   (cond ((eq ad-return-value 'follow-generic-filter)
+ 	 (setq ad-return-value
+ 	       (cdr-safe (assq (ad-get-arg 0) 
+ 			       follow-process-filter-alist))))))
+ 
+ 
+ (defun follow-call-process-filter (proc)
+   "Call original `process-filter' without the Follow mode advice."
+   (ad-disable-advice 'process-filter 'after
+ 		     'follow-process-filter)
+   (ad-activate 'process-filter)
+   (prog1 
+       (process-filter proc)
+     (ad-enable-advice 'process-filter 'after 
+ 		      'follow-process-filter)
+     (ad-activate 'process-filter)))
+   
+ 
+ (defun follow-tidy-process-filter-alist ()
+   "Remove old processes from `follow-process-filter-alist'."
+   (let ((alist follow-process-filter-alist)
+ 	(ps (process-list))
+ 	(new ()))
+     (while alist
+       (if (and (not (memq (process-status (car (car alist))) 
+ 			  '(exit signal closed nil)))
+ 	       (memq (car (car alist)) ps))
+ 	  (setq new (cons (car alist) new)))
+       (setq alist (cdr alist)))
+     (setq follow-process-filter-alist new)))
+ 
+ ;;}}}
+ ;;{{{ Start/stop interception of processes.
+ 
+ ;; Normally, all new processed are intercepted by our `set-process-filter'.
+ ;; This is needed to intercept old processed which were started before we were
+ ;; loaded, and processes we have forgotten by calling
+ ;; `follow-stop-intercept-process-output'.
+ 
+ (defun follow-intercept-process-output ()
+   "Intercept all active processes.
+ 
+ This is needed so that Follow Mode can track all display events in the
+ system.  (See `follow-mode')"
+   (interactive)
+   (let ((list (process-list)))
+     (while list
+       (if (eq (process-filter (car list)) 'follow-generic-filter)
+ 	  nil
+ 	;; The custom `set-process-filter' defined above.
+ 	(set-process-filter (car list) (process-filter (car list))))
+       (setq list (cdr list))))
+   (setq follow-intercept-processes t))
+ 
+ 
+ (defun follow-stop-intercept-process-output ()
+   "Stop Follow Mode from spying on processes.
+ 
+ All current spypoints are removed and no new will be added.
+ 
+ The effect is that Follow mode won't be able to handle buffers 
+ connected to processes.  
+ 
+ The only reason to call this function is if the Follow mode spy filter
+ would interfere with some other package.  If this happens, please
+ report this using the `follow-submit-feedback' function."
+   (interactive)
+   (follow-tidy-process-filter-alist)
+   (let ((list (process-list)))
+     (while list
+       (if (eq (process-filter (car list)) 'follow-generic-filter)
+ 	  (progn
+ 	    (follow-call-set-process-filter 
+ 	     (car list) 
+ 	     (cdr-safe (assq (car list) follow-process-filter-alist)))
+ 	    (setq follow-process-filter-alist 
+ 		  (delq (assq (car list) follow-process-filter-alist)
+ 			follow-process-filter-alist))))
+       (setq list (cdr list))))
+   (setq follow-intercept-processes nil))
+ 
+ ;;}}}
+ ;;{{{ The filter
+ 
+ ;;; The following section is a naive method to make buffers with
+ ;;; process output to work with Follow mode. Whenever the start of the
+ ;;; window displaying the buffer is moved, we moves it back to it's
+ ;;; original position and try to select a new window.  (If we fail,
+ ;;; the normal redisplay functions of Emacs will scroll it right
+ ;;; back!)
+ 
+ (defun follow-generic-filter (proc output)
+   "Process output filter for process connected to buffers in Follow mode."
+   (let* ((old-buffer (current-buffer))
+ 	 (orig-win (selected-window))
+ 	 (buf (process-buffer proc))
+ 	 (win (and buf (if (eq buf (window-buffer orig-win))
+ 			   orig-win
+ 			 (get-buffer-window buf t))))
+ 	 (return-to-orig-win (and win (not (eq win orig-win))))
+ 	 (orig-window-start (and win (window-start win))))
+ 
+     ;; If input is pending, the `sit-for' below won't redraw the
+     ;; display. In that case, calling `follow-avoid-tail-recenter' may
+     ;; provoke the process hadnling code to sceduling a redisplay.
+     ;(or (input-pending-p)
+     ; (follow-avoid-tail-recenter))
+ 
+     ;; Output the `output'.
+     (let ((filter (cdr-safe (assq proc follow-process-filter-alist))))
+       (cond 
+        ;; Call the original filter function
+        (filter
+ 	(funcall filter proc output))
+ 
+        ;; No filter, but we've got a buffer. Just output into it.
+        (buf
+ 	(set-buffer buf)
+ 	(if (not (marker-buffer (process-mark proc)))
+ 	    (set-marker (process-mark proc) (point-max)))
+ 	(let ((moving (= (point) (process-mark proc)))
+ 	      (odeactivate (and (boundp 'deactivate-mark)
+ 				(symbol-value 'deactivate-mark)))
+ 	      (old-buffer-read-only buffer-read-only))
+ 	  (setq buffer-read-only nil)
+ 	  (save-excursion
+ 	    (goto-char (process-mark proc))
+ 	    ;; `insert-before-markers' just in case the users next
+ 	    ;; command is M-y.
+ 	    (insert-before-markers output)
+ 	    (set-marker (process-mark proc) (point)))
+ 	  (if moving (goto-char (process-mark proc)))
+ 	  (if (boundp 'deactivate-mark)
+ 	      ;; This could really be
+ 	      ;;    (setq deactivate-mark odeactivate)
+ 	      ;; but this raises an error when compiling on XEmacs.
+ 	      (funcall (symbol-function 'set)
+ 		       'deactivate-mark odeactivate))
+ 	  (setq buffer-read-only old-buffer-read-only)))))
+ 
+     ;; If we're in follow mode, do our stuff.  Select a new window and
+     ;; redisplay.  (Actually, it is redundant to check `buf', but I
+     ;; feel it's more correct.)
+     (if (and buf win (window-live-p win))
+ 	(progn
+ 	  (set-buffer buf)
+ 	  (if (and (boundp 'follow-mode) follow-mode)
+ 	      (progn 
+ 		(select-window win)
+ 		(let* ((windows (follow-all-followers win))
+ 		       (win-start-end (follow-windows-start-end windows))
+ 		       (new-window-start (window-start win))
+ 		       (new-window-point (window-point win)))
+ 		  (cond
+ 		   ;; The window was moved. Move it back and
+ 		   ;; select a new.  If no better could be found,
+ 		   ;; we stick the the new start position.  This
+ 		   ;; is used when the original process filter
+ 		   ;; tries to position the cursor at the bottom
+ 		   ;; of the window.  Example: `lyskom'.
+ 		   ((not (eq orig-window-start new-window-start))
+ 		    (follow-debug-message "filter: Moved")
+ 		    (set-window-start win orig-window-start)
+ 		    (follow-redisplay windows win)
+ 		    (setq win-start-end (follow-windows-start-end windows))
+ 		    (follow-select-if-visible new-window-point 
+ 					      win-start-end)
+ 		    (goto-char new-window-point)
+ 		    (if (eq win (selected-window))
+ 			(set-window-start win new-window-start))
+ 		    (setq win-start-end (follow-windows-start-end windows)))
+ 		   ;; Stick to this window, if point is visible in it.
+ 		   ((pos-visible-in-window-p new-window-point)
+ 		    (follow-debug-message "filter: Visible in window"))
+ 		   ;; Avoid redisplaying the first window. If the
+ 		   ;; point is visible at a window below,
+ 		   ;; redisplay and select it.
+ 		   ((follow-select-if-visible-from-first 
+ 		     new-window-point windows)
+ 		    (follow-debug-message "filter: Seen from first")
+ 		    (follow-redisplay windows (car windows))
+ 		    (goto-char new-window-point)
+ 		    (setq win-start-end
+ 			  (follow-windows-start-end windows)))
+ 		   ;; None of the above. We stick to the current window.
+ 		   (t 
+ 		    (follow-debug-message "filter: nothing")))
+ 
+ 		  ;; Here we have slected a window. Make sure the
+ 		  ;; windows are aligned and the point is visible
+ 		  ;; in the selected window.
+ 		  (if (and (not (follow-pos-visible 
+ 				 (point) (selected-window) win-start-end))
+ 			   (not return-to-orig-win))
+ 		      (progn
+ 			(sit-for 0)
+ 			(setq win-start-end 
+ 			      (follow-windows-start-end windows))))
+ 
+ 		  (if (or follow-internal-force-redisplay
+ 			  (not (follow-windows-aligned-p win-start-end)))
+ 		      (follow-redisplay windows)))))))
+ 
+     ;; return to the original window.
+     (if return-to-orig-win
+ 	(select-window orig-win))
+     (set-buffer old-buffer))
+   
+   (follow-invalidate-cache)
+ 
+   ;; Normally, if the display has been changed, it is redrawn.  All
+   ;; windows showing only the end of a buffer is unconditionally
+   ;; recentered, we can't prevent it by calling
+   ;; `follow-avoid-tail-recenter'.
+   ;;
+   ;; By performing a redisplay on our own, Emacs need not perform
+   ;; the above described redisplay.  (However, bu performing it when
+   ;; there are input available just seems to make things worse.)
+   (if (and follow-avoid-tail-recenter-p
+ 	   (not (input-pending-p)))
+       (sit-for 0)))
+ 
+ ;;}}}
+ 
+ ;;}}}
+ ;;{{{ Window size change
+ 
+ ;; In Emacs 19.29, the functions in `window-size-change-functions' are
+ ;; called every time a window in a frame changes size. Most notably, it
+ ;; is called after the frame has been resized.
+ ;;
+ ;; We basically call our post-command-hook for every buffer which is
+ ;; visible in any window in the resized frame, which is in follow-mode.
+ ;;
+ ;; Since this function can be called indirectly from
+ ;; `follow-post-command-hook' we have a potential infinite loop.  We
+ ;; handle this problem by simply not doing anything at all in this
+ ;; situation.  The variable `follow-inside-post-command-hook' contains
+ ;; information about whether the execution actually is inside the
+ ;; post-command-hook or not.
+ 
+ (if (boundp 'window-size-change-functions)
+     (add-hook 'window-size-change-functions 'follow-window-size-change))
+ 
+ 
+ (defun follow-window-size-change (frame)
+   "Redraw all windows in FRAME, when in Follow mode."
+   ;; Below, we call `post-command-hook'. This makes sure that we
+   ;; doesn't start a mutally recursive endless loop.
+   (if follow-inside-post-command-hook
+       nil
+     (let ((buffers '())
+ 	  (orig-window (selected-window))
+ 	  (orig-buffer (current-buffer))
+ 	  (orig-frame (selected-frame))
+ 	  windows
+ 	  buf)
+       (select-frame frame)
+       (unwind-protect
+ 	  (walk-windows 
+ 	   (function 
+ 	    (lambda (win)
+ 	      (setq buf (window-buffer win))
+ 	      (if (memq buf buffers)
+ 		  nil
+ 		(set-buffer buf)
+ 		(if (and (boundp 'follow-mode)
+ 			 follow-mode)
+ 		    (progn
+ 		      (setq windows (follow-all-followers win))
+ 		      (if (memq orig-window windows)
+ 			  (progn
+ 			    ;; Make sure we're redrawing around the
+ 			    ;; selected window.
+ 			    ;;
+ 			    ;; We must be really careful not to do this
+ 			    ;; when we are (indirectly) called by
+ 			    ;; `post-command-hook'.
+ 			    (select-window orig-window)
+ 			    (follow-post-command-hook)
+ 			    (setq orig-window (selected-window)))
+ 			(follow-redisplay windows win))
+ 		      (setq buffers (cons buf buffers))))))))
+ 	(select-frame orig-frame)
+ 	(set-buffer orig-buffer)
+ 	(select-window orig-window)))))
+ 
+ ;;}}}
+ 
+ ;;{{{ XEmacs isearch
+ 
+ ;; In XEmacs, isearch often finds matches in other windows than the
+ ;; currently selected.  However, when exiting the old window
+ ;; configuration is restored, with the exception of the beginning of
+ ;; the start of the window for the selected window.  This is not much
+ ;; help for us.
+ ;;
+ ;; We overwrite the stored window configuration with the current,
+ ;; unless we are in `slow-search-mode', i.e. only a few lines
+ ;; of text is visible.
+ 
+ (if follow-emacs-version-xemacs-p
+     (defadvice isearch-done (before follow-isearch-done activate)
+       (if (and (boundp 'follow-mode)
+ 	       follow-mode
+ 	       (boundp 'isearch-window-configuration)
+ 	       isearch-window-configuration
+ 	       (boundp 'isearch-slow-terminal-mode)
+ 	       (not isearch-slow-terminal-mode))
+ 	  (let ((buf (current-buffer)))
+ 	    (setq isearch-window-configuration 
+ 		  (current-window-configuration))
+ 	    (set-buffer buf)))))
+ 
+ ;;}}}
+ ;;{{{ Tail window handling
+ 
+ ;;; In Emacs (not XEmacs) windows showing nothing are sometimes 
+ ;;; recentered.  When in Follow Mode, this is not desireable for
+ ;;; non-first windows in the window chain.  This section tries to
+ ;;; make the windows stay where they should be.
+ ;;;
+ ;;; If the display is updated, all windows starting at (point-max) are
+ ;;; going to be recentered at the next redisplay, unless we do a
+ ;;; read-and-write cycle to update the `force' flag inside the windows.
+ ;;;
+ ;;; In 19.30, a new varible `window-scroll-functions' is called every
+ ;;; time a window is recentered.  It is not perfect for our situation,
+ ;;; since when it is called for a tail window, it is to late.  However,
+ ;;; if it is called for another window, we can try to update our
+ ;;; windows.
+ ;;;
+ ;;; By patching `sit-for' we can make sure that to catch all explicit
+ ;;; updates initiated by lisp programs.  Internal calls, on the other
+ ;;; hand, are not handled.
+ ;;;
+ ;;; Please note that the function `follow-avoid-tail-recenter' is also
+ ;;; called from other places, e.g. `post-command-hook' and
+ ;;; `post-command-idle-hook'.
+ 
+ ;; If this function is called it is to late for this window, but
+ ;; we might save other windows from beeing recentered.
+ 
+ (if (and follow-avoid-tail-recenter-p (boundp 'window-scroll-functions))
+     (add-hook 'window-scroll-functions 'follow-avoid-tail-recenter t))
+ 
+ 
+ ;;  This prevents all packages which calls `sit-for' directly
+ ;;  to recenter tail windows.
+ 
+ (if follow-avoid-tail-recenter-p
+     (defadvice sit-for (before follow-sit-for activate)
+       "Adviced by Follow Mode.
+ 
+ Avoid to recenter windows displaying only the end of a file as when
+ displaying a short file in two windows, using Follow Mode."
+       (follow-avoid-tail-recenter)))
+ 
+ 
+ ;;  Without this advice, `mouse-drag-region' would start to recenter
+ ;;  tail windows.
+ 
+ (if (and follow-avoid-tail-recenter-p
+ 	 (fboundp 'move-overlay))
+     (defadvice move-overlay (before follow-move-overlay activate)
+       "Adviced by Follow Mode.  Don't recenter windows showing only 
+ the end of a buffer.  This prevents `mouse-drag-region' from
+ messing things up."
+       (follow-avoid-tail-recenter)))
+ 
+ ;;}}}
+ ;;{{{ profile support
+ 
+ ;; The following (non-evaluated) section can be used to
+ ;; profile this package using `elp'.
+ ;;
+ ;; Invalid indentation on purpose!
+ 
+ (cond (nil
+ (setq elp-function-list
+       '(window-end 
+ 	vertical-motion 
+ 	; sit-for  ;; elp can't handle advices...
+ 	follow-mode
+ 	follow-all-followers
+ 	follow-split-followers 
+ 	follow-redisplay
+ 	follow-downward
+ 	follow-calculate-first-window-start
+ 	follow-estimate-first-window-start
+ 	follow-calculate-first-window-start-from-above
+ 	follow-calculate-first-window-start-from-below
+ 	follow-calc-win-end
+ 	follow-calc-win-start
+ 	follow-pos-visible
+ 	follow-windows-start-end
+ 	follow-cache-valid-p
+ 	follow-select-if-visible
+ 	follow-select-if-visible-from-first
+ 	follow-windows-aligned-p
+ 	follow-point-visible-all-windows-p
+ 	follow-avoid-tail-recenter
+ 	follow-update-window-start
+ 	follow-post-command-hook
+ 	))))
+ 
+ ;;}}}
+ 
+ ;;{{{ The end
+ 
+ ;;;
+ ;;; We're done!
+ ;;;
+ 
+ (provide 'follow)
+ 
+ ;;}}}
+ 
+ ;; /------------------------------------------------------------------------\
+ ;; | "I [..] am rarely happier then when spending an entire day programming |
+ ;; | my computer to perform automatically a task that it would otherwise    |
+ ;; | take me a good ten seconds to do by hand. Ten seconds, I tell myself,  |
+ ;; | is ten seconds. Time is valuable and ten seconds' worth of it is well  |
+ ;; | worth the investment of a day's happy activity working out a way to    |
+ ;; | save it".             -- Douglas Adams, "Last Chance to See"           |
+ ;; \------------------------------------------------------------------------/
+ 
+ ;;; follow.el ends here
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/font-lock.el emacs-19.31/lisp/font-lock.el
*** emacs-19.30/lisp/font-lock.el	Fri Nov 24 19:13:19 1995
--- emacs-19.31/lisp/font-lock.el	Thu Mar  7 08:37:25 1996
***************
*** 1,5 ****
  ;;; font-lock.el --- Electric font lock mode
  
! ;; Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
  
  ;; Author: jwz, then rms, then sm <simon@gnu.ai.mit.edu>
--- 1,5 ----
  ;;; font-lock.el --- Electric font lock mode
  
! ;; Copyright (C) 1992, 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
  
  ;; Author: jwz, then rms, then sm <simon@gnu.ai.mit.edu>
***************
*** 20,25 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 36,43 ****
  ;; every insertion or deletion.
  ;;
! ;; To turn Font Lock mode on automatically, add this to your .emacs file:
  ;;
  ;;  (add-hook 'emacs-lisp-mode-hook 'turn-on-font-lock)
  ;;
  ;; Fontification for a particular mode may be available in a number of levels
  ;; of decoration.  The higher the level, the more decoration, but the more time
--- 37,48 ----
  ;; every insertion or deletion.
  ;;
! ;; To turn Font Lock mode on automatically, add this to your ~/.emacs file:
  ;;
  ;;  (add-hook 'emacs-lisp-mode-hook 'turn-on-font-lock)
  ;;
+ ;; Or if you want to turn Font Lock mode on in many modes:
+ ;;
+ ;;  (global-font-lock-mode t)
+ ;;
  ;; Fontification for a particular mode may be available in a number of levels
  ;; of decoration.  The higher the level, the more decoration, but the more time
***************
*** 68,76 ****
  ;; So, here are my opinions/advice/guidelines:
  ;; 
  ;; - Use the same face for the same conceptual object, across all modes.
  ;;   i.e., (b) above, all modes that have items that can be thought of as, say,
  ;;   keywords, should be highlighted with the same face, etc.
- ;; - Keep the faces distinct from each other as far as possible.
- ;;   i.e., (a) above.
  ;; - Make the face attributes fit the concept as far as possible.
  ;;   i.e., function names might be a bold colour such as blue, comments might
--- 73,84 ----
  ;; So, here are my opinions/advice/guidelines:
  ;; 
+ ;; - Highlight conceptual objects, such as function and variable names, and
+ ;;   different objects types differently, i.e., (a) and (b) above, highlight
+ ;;   function names differently to variable names.
+ ;; - Keep the faces distinct from each other as far as possible.
+ ;;   i.e., (a) above.
  ;; - Use the same face for the same conceptual object, across all modes.
  ;;   i.e., (b) above, all modes that have items that can be thought of as, say,
  ;;   keywords, should be highlighted with the same face, etc.
  ;; - Make the face attributes fit the concept as far as possible.
  ;;   i.e., function names might be a bold colour such as blue, comments might
***************
*** 90,94 ****
  ;;;###autoload
  (defvar font-lock-maximum-decoration nil
!   "*If non-nil, the maximum decoration level for fontifying.
  If nil, use the default decoration (typically the minimum available).
  If t, use the maximum decoration available.
--- 98,102 ----
  ;;;###autoload
  (defvar font-lock-maximum-decoration nil
!   "*Maximum decoration level for fontification.
  If nil, use the default decoration (typically the minimum available).
  If t, use the maximum decoration available.
*************** available for buffers in `c-mode', and l
*** 102,106 ****
  ;;;###autoload
  (defvar font-lock-maximum-size (* 250 1024)
!   "*If non-nil, the maximum size for buffers for fontifying.
  Only buffers less than this can be fontified when Font Lock mode is turned on.
  If nil, means size is irrelevant.
--- 110,114 ----
  ;;;###autoload
  (defvar font-lock-maximum-size (* 250 1024)
!   "*Maximum size of a buffer for buffer fontification.
  Only buffers less than this can be fontified when Font Lock mode is turned on.
  If nil, means size is irrelevant.
*************** Each element should be of the form:
*** 143,151 ****
   (MATCHER . HIGHLIGHT)
   (MATCHER HIGHLIGHT ...)
  
  where HIGHLIGHT should be either MATCH-HIGHLIGHT or MATCH-ANCHORED.
  
  For highlighting single items, typically only MATCH-HIGHLIGHT is required.
! However, if an item or (typically) items is to be hightlighted following the
  instance of another item (the anchor) then MATCH-ANCHORED may be required.
  
--- 151,164 ----
   (MATCHER . HIGHLIGHT)
   (MATCHER HIGHLIGHT ...)
+  (eval . FORM)
  
  where HIGHLIGHT should be either MATCH-HIGHLIGHT or MATCH-ANCHORED.
  
+ FORM is an expression, whose value should be a keyword element, evaluated when
+ the keyword is (first) used in a buffer.  This feature can be used to provide a
+ keyword that can only be generated when Font Lock mode is actually turned on.
+ 
  For highlighting single items, typically only MATCH-HIGHLIGHT is required.
! However, if an item or (typically) items are to be highlighted following the
  instance of another item (the anchor) then MATCH-ANCHORED may be required.
  
*************** be overwritten.  If `keep', only parts n
*** 164,168 ****
  If `prepend' or `append', existing fontification is merged with the new, in
  which the new or existing fontification, respectively, takes precedence.
! If LAXMATCH is non-nil, no error is signalled if there is no MATCH in MATCHER.
  
  For example, an element of the form highlights (if not already highlighted):
--- 177,181 ----
  If `prepend' or `append', existing fontification is merged with the new, in
  which the new or existing fontification, respectively, takes precedence.
! If LAXMATCH is non-nil, no error is signaled if there is no MATCH in MATCHER.
  
  For example, an element of the form highlights (if not already highlighted):
*************** The value should be like the `cdr' of an
*** 223,231 ****
  	 '((c-font-lock-keywords c-font-lock-keywords-1
  	    c-font-lock-keywords-2 c-font-lock-keywords-3)
! 	   nil nil ((?_ . "w")) beginning-of-defun))
  	(c++-mode-defaults
  	 '((c++-font-lock-keywords c++-font-lock-keywords-1 
  	    c++-font-lock-keywords-2 c++-font-lock-keywords-3)
! 	   nil nil ((?_ . "w") (?~ . "w")) beginning-of-defun))
  	(lisp-mode-defaults
  	 '((lisp-font-lock-keywords
--- 236,246 ----
  	 '((c-font-lock-keywords c-font-lock-keywords-1
  	    c-font-lock-keywords-2 c-font-lock-keywords-3)
! 	   nil nil ((?_ . "w")) beginning-of-defun
! 	   (font-lock-mark-block-function . mark-defun)))
  	(c++-mode-defaults
  	 '((c++-font-lock-keywords c++-font-lock-keywords-1 
  	    c++-font-lock-keywords-2 c++-font-lock-keywords-3)
! 	   nil nil ((?_ . "w") (?~ . "w")) beginning-of-defun
! 	   (font-lock-mark-block-function . mark-defun)))
  	(lisp-mode-defaults
  	 '((lisp-font-lock-keywords
*************** The value should be like the `cdr' of an
*** 235,239 ****
  	    (?> . "w") (?= . "w") (?! . "w") (?? . "w") (?$ . "w") (?% . "w")
  	    (?_ . "w") (?& . "w") (?~ . "w") (?^ . "w") (?/ . "w"))
! 	   beginning-of-defun))
  	(scheme-mode-defaults
  	 '(scheme-font-lock-keywords nil t
--- 250,254 ----
  	    (?> . "w") (?= . "w") (?! . "w") (?? . "w") (?$ . "w") (?% . "w")
  	    (?_ . "w") (?& . "w") (?~ . "w") (?^ . "w") (?/ . "w"))
! 	   beginning-of-defun (font-lock-mark-block-function . mark-defun)))
  	(scheme-mode-defaults
  	 '(scheme-font-lock-keywords nil t
*************** The value should be like the `cdr' of an
*** 241,247 ****
  	    (?> . "w") (?= . "w") (?! . "w") (?? . "w") (?$ . "w") (?% . "w")
  	    (?_ . "w") (?& . "w") (?~ . "w") (?^ . "w") (?/ . "w"))
! 	   beginning-of-defun))
  	;; For TeX modes we could use `backward-paragraph' for the same reason.
! 	(tex-mode-defaults '(tex-font-lock-keywords nil nil ((?$ . "\""))))
  	)
      (list
--- 256,267 ----
  	    (?> . "w") (?= . "w") (?! . "w") (?? . "w") (?$ . "w") (?% . "w")
  	    (?_ . "w") (?& . "w") (?~ . "w") (?^ . "w") (?/ . "w"))
! 	   beginning-of-defun (font-lock-mark-block-function . mark-defun)))
  	;; For TeX modes we could use `backward-paragraph' for the same reason.
! 	;; But we don't, because paragraph breaks are arguably likely enough to
! 	;; occur within a genuine syntactic block to make it too risky.
! 	;; However, we do specify a MARK-BLOCK function as that cannot result
! 	;; in a mis-fontification even if it might not fontify enough.  --sm.
! 	(tex-mode-defaults '(tex-font-lock-keywords nil nil ((?$ . "\"")) nil
! 			     (font-lock-mark-block-function . mark-paragraph)))
  	)
      (list
*************** The value should be like the `cdr' of an
*** 264,268 ****
  Each item should be a list of the form:
  
!  (MAJOR-MODE . (KEYWORDS KEYWORDS-ONLY CASE-FOLD SYNTAX-ALIST SYNTAX-BEGIN))
  
  where MAJOR-MODE is a symbol.  KEYWORDS may be a symbol (a variable or function
--- 284,289 ----
  Each item should be a list of the form:
  
!  (MAJOR-MODE . (KEYWORDS KEYWORDS-ONLY CASE-FOLD SYNTAX-ALIST SYNTAX-BEGIN
!                 ...))
  
  where MAJOR-MODE is a symbol.  KEYWORDS may be a symbol (a variable or function
*************** These item elements are used by Font Loc
*** 285,289 ****
  `font-lock-keywords', `font-lock-keywords-only',
  `font-lock-keywords-case-fold-search', `font-lock-syntax-table' and
! `font-lock-beginning-of-syntax-function', respectively.")
  
  (defvar font-lock-keywords-only nil
--- 306,325 ----
  `font-lock-keywords', `font-lock-keywords-only',
  `font-lock-keywords-case-fold-search', `font-lock-syntax-table' and
! `font-lock-beginning-of-syntax-function', respectively.
! 
! Further item elements are alists of the form (VARIABLE . VALUE) and are in no
! particular order.  Each VARIABLE is made buffer-local before set to VALUE.
! 
! Currently, appropriate variables include `font-lock-mark-block-function'.
! If this is non-nil, it should be a function with no args used to mark any
! enclosing block of text, for fontification via \\[font-lock-fontify-block].
! Typical values are `mark-defun' for programming modes or `mark-paragraph' for
! textual modes (i.e., the mode-dependent function is known to put point and mark
! around a text block relevant to that mode).
! 
! Other variables include those for buffer-specialised fontification functions,
! `font-lock-fontify-buffer-function', `font-lock-unfontify-buffer-function',
! `font-lock-fontify-region-function', `font-lock-unfontify-region-function' and
! `font-lock-inhibit-thing-lock'.")
  
  (defvar font-lock-keywords-only nil
*************** This is normally set via `font-lock-defa
*** 304,316 ****
  (defvar font-lock-beginning-of-syntax-function nil
    "*Non-nil means use this function to move back outside of a syntactic block.
  If this is nil, the beginning of the buffer is used (in the worst case).
  This is normally set via `font-lock-defaults'.")
  
! ;; These record the parse state at a particular position, always the start of a
! ;; line.  Used to make `font-lock-fontify-syntactically-region' faster.
! (defvar font-lock-cache-position nil)
! (defvar font-lock-cache-state nil)
! (make-variable-buffer-local 'font-lock-cache-position)
! (make-variable-buffer-local 'font-lock-cache-state)
  
  (defvar font-lock-mode nil)		; For the modeline.
--- 340,378 ----
  (defvar font-lock-beginning-of-syntax-function nil
    "*Non-nil means use this function to move back outside of a syntactic block.
+ When called with no args it should leave point at the beginning of any
+ enclosing syntactic block.
  If this is nil, the beginning of the buffer is used (in the worst case).
  This is normally set via `font-lock-defaults'.")
  
! (defvar font-lock-mark-block-function nil
!   "*Non-nil means use this function to mark a block of text.
! When called with no args it should leave point at the beginning of any
! enclosing textual block and mark at the end.
! This is normally set via `font-lock-defaults'.")
! 
! (defvar font-lock-fontify-buffer-function 'font-lock-default-fontify-buffer
!   "Function to use for fontifying the buffer.
! This is normally set via `font-lock-defaults'.")
! 
! (defvar font-lock-unfontify-buffer-function 'font-lock-default-unfontify-buffer
!   "Function to use for unfontifying the buffer.
! This is used when turning off Font Lock mode.
! This is normally set via `font-lock-defaults'.")
! 
! (defvar font-lock-fontify-region-function 'font-lock-default-fontify-region
!   "Function to use for fontifying a region.
! It should take two args, the beginning and end of the region, and an optional
! third arg VERBOSE.  If non-nil, the function should print status messages.
! This is normally set via `font-lock-defaults'.")
! 
! (defvar font-lock-unfontify-region-function 'font-lock-default-unfontify-region
!   "Function to use for unfontifying a region.
! It should take two args, the beginning and end of the region.
! This is normally set via `font-lock-defaults'.")
! 
! (defvar font-lock-inhibit-thing-lock nil
!   "List of Font Lock mode related modes that should not be turned on.
! Currently, valid mode names as `fast-lock-mode' and `lazy-lock-mode'.
! This is normally set via `font-lock-defaults'.")
  
  (defvar font-lock-mode nil)		; For the modeline.
*************** This is normally set via `font-lock-defa
*** 322,326 ****
    "Function or functions to run on entry to Font Lock mode.")
  
! ;; User functions.
  
  ;;;###autoload
--- 384,388 ----
    "Function or functions to run on entry to Font Lock mode.")
  
! ;; User commands.
  
  ;;;###autoload
*************** the major mode's hook.  For example, put
*** 341,347 ****
   (add-hook 'c-mode-hook 'turn-on-font-lock)
  
! Or for any visited file with the following in your ~/.emacs:
  
!  (add-hook 'find-file-hooks 'turn-on-font-lock)
  
  The default Font Lock mode faces and their attributes are defined in the
--- 403,411 ----
   (add-hook 'c-mode-hook 'turn-on-font-lock)
  
! Alternatively, you can use Global Font Lock mode to automagically turn on Font
! Lock mode in buffers whose major mode supports it, or in buffers whose major
! mode is one of `font-lock-global-modes'.  For example, put in your ~/.emacs:
  
!  (global-font-lock-mode t)
  
  The default Font Lock mode faces and their attributes are defined in the
*************** Where modes support different levels of 
*** 355,368 ****
  When you turn Font Lock mode on/off the buffer is fontified/defontified, though
  fontification occurs only if the buffer is less than `font-lock-maximum-size'.
! To fontify a buffer without turning on Font Lock mode, and regardless of buffer
! size, you can use \\[font-lock-fontify-buffer]."
    (interactive "P")
!   (let ((on-p (if arg (> (prefix-numeric-value arg) 0) (not font-lock-mode)))
! 	(maximum-size (if (not (consp font-lock-maximum-size))
! 			  font-lock-maximum-size
! 			(cdr (or (assq major-mode font-lock-maximum-size)
! 				 (assq t font-lock-maximum-size))))))
!     (if (equal (buffer-name) " *Compiler Input*") ; hack for bytecomp...
! 	(setq on-p nil))
      (if (not on-p)
  	(remove-hook 'after-change-functions 'font-lock-after-change-function
--- 419,438 ----
  When you turn Font Lock mode on/off the buffer is fontified/defontified, though
  fontification occurs only if the buffer is less than `font-lock-maximum-size'.
! 
! To fontify a buffer, without turning on Font Lock mode and regardless of buffer
! size, you can use \\[font-lock-fontify-buffer].
! 
! To fontify a block (the function or paragraph containing point, or a number of
! lines around point), perhaps because modification on the current line caused
! syntactic change on other lines, you can use \\[font-lock-fontify-block]."
    (interactive "P")
!   ;; Don't turn on Font Lock mode if we don't have a display (we're running a
!   ;; batch job) or if the buffer is invisible (the name starts with a space).
!   (let ((maximum-size (font-lock-value-in-major-mode font-lock-maximum-size))
! 	(on-p (and (not noninteractive)
! 		   (not (eq (aref (buffer-name) 0) ?\ ))
! 		   (if arg
! 		       (> (prefix-numeric-value arg) 0)
! 		     (not font-lock-mode)))))
      (if (not on-p)
  	(remove-hook 'after-change-functions 'font-lock-after-change-function
*************** size, you can use \\[font-lock-fontify-b
*** 374,380 ****
      (cond (on-p
  	   (font-lock-set-defaults)
  	   (make-local-hook 'before-revert-hook)
  	   (make-local-hook 'after-revert-hook)
- 	   ;; If buffer is reverted, must clean up the state.
  	   (add-hook 'before-revert-hook 'font-lock-revert-setup nil t)
  	   (add-hook 'after-revert-hook 'font-lock-revert-cleanup nil t)
--- 444,450 ----
      (cond (on-p
  	   (font-lock-set-defaults)
+ 	   ;; If buffer is reverted, must clean up the state.
  	   (make-local-hook 'before-revert-hook)
  	   (make-local-hook 'after-revert-hook)
  	   (add-hook 'before-revert-hook 'font-lock-revert-setup nil t)
  	   (add-hook 'after-revert-hook 'font-lock-revert-cleanup nil t)
*************** size, you can use \\[font-lock-fontify-b
*** 382,405 ****
  	   (cond (font-lock-fontified
  		  nil)
! 		 ((or (null maximum-size) (<= (buffer-size) maximum-size))
  		  (font-lock-fontify-buffer))
  		 (font-lock-verbose
  		  (message "Fontifying %s... buffer too big." (buffer-name)))))
  	  (font-lock-fontified
! 	   (setq font-lock-fontified nil)
  	   (remove-hook 'before-revert-hook 'font-lock-revert-setup t)
  	   (remove-hook 'after-revert-hook 'font-lock-revert-cleanup t)
! 	   (font-lock-unfontify-region (point-min) (point-max))
! 	   (font-lock-thing-lock-cleanup))
  	  (t
  	   (remove-hook 'before-revert-hook 'font-lock-revert-setup t)
  	   (remove-hook 'after-revert-hook 'font-lock-revert-cleanup t)
! 	   (font-lock-thing-lock-cleanup)))
      (force-mode-line-update)))
  
  ;;;###autoload
  (defun turn-on-font-lock ()
!   "Unconditionally turn on Font Lock mode."
!   (font-lock-mode 1))
  
  ;;;###autoload
--- 452,582 ----
  	   (cond (font-lock-fontified
  		  nil)
! 		 ((or (null maximum-size) (<= (buffer-size) maximum-size)
! 		      (not (eq font-lock-fontify-buffer-function
! 			       (default-value
! 				 'font-lock-fontify-buffer-function))))
  		  (font-lock-fontify-buffer))
  		 (font-lock-verbose
  		  (message "Fontifying %s... buffer too big." (buffer-name)))))
  	  (font-lock-fontified
! 	   (font-lock-unfontify-buffer)
  	   (remove-hook 'before-revert-hook 'font-lock-revert-setup t)
  	   (remove-hook 'after-revert-hook 'font-lock-revert-cleanup t)
! 	   (font-lock-thing-lock-cleanup)
! 	   (font-lock-unset-defaults))
  	  (t
  	   (remove-hook 'before-revert-hook 'font-lock-revert-setup t)
  	   (remove-hook 'after-revert-hook 'font-lock-revert-cleanup t)
! 	   (font-lock-thing-lock-cleanup)
! 	   (font-lock-unset-defaults)))
      (force-mode-line-update)))
  
  ;;;###autoload
  (defun turn-on-font-lock ()
!   "Turn on Font Lock mode conditionally.
! Turn on only if the buffer mode supports it and the terminal can display it."
!   (if (and window-system
! 	   (not font-lock-mode)
! 	   (or font-lock-defaults (assq major-mode font-lock-defaults-alist)))
!       (font-lock-mode t)))
! 
! ;; Code for Global Font Lock mode.
! 
! ;; A few people have hassled in the past for a way to make it easier to turn on
! ;; Font Lock mode, perhaps the same way hilit19.el/hl319.el does.  I've always
! ;; balked at that way, as I see it as just re-moulding the same problem in
! ;; another form.  That is; some person would still have to keep track of which
! ;; modes (which may not even be distributed with Emacs) support Font Lock mode.
! ;; The list would always be out of date.  And that person might have to be me.
! 
! ;; In the latest of these discussions the following hack came to mind.  It is a
! ;; gross hack, but it generally works.  We use the convention that major modes
! ;; start by calling the function `kill-all-local-variables', which in turn runs
! ;; functions on the hook variable `change-major-mode-hook'.  We attach our
! ;; function `font-lock-change-major-mode' to that hook.  Of course, when this
! ;; hook is run, the major mode is in the process of being changed and we do not
! ;; know what the final major mode will be.  So, `font-lock-change-major-mode'
! ;; only (a) notes the name of the current buffer, and (b) adds our function
! ;; `turn-on-font-lock-if-enabled' to the hook variable `post-command-hook'.
! ;; By the time the functions on `post-command-hook' are run, the new major mode
! ;; is assumed to be in place.
! 
! ;; Naturally this requires that (a) major modes run `kill-all-local-variables',
! ;; as they are supposed to do, and (b) the major mode is in place after the
! ;; command that ran `kill-all-local-variables' has finished.  Arguably, any
! ;; major mode that does not follow the convension (a) is broken, and I can't
! ;; think of any reason why (b) would not be met.  I don't know of any major
! ;; modes that do not follow the convension (a), but I'm sure there are some
! ;; obscure ones out there somewhere.  Even if it works, it is still not clean.
! 
! ;; Probably the cleanest solution is to have each major mode function run some
! ;; hook, e.g., `major-mode-hook', but maybe implementing that change is
! ;; impractical.  I am personally against making `setq' a macro or be advised
! ;; (space'n'speed), or have a special function such as `set-major-mode' (a
! ;; `major-mode-hook' is simpler), but maybe someone can come up with another
! ;; solution? --sm.
! 
! (defvar font-lock-buffers nil)		; For remembering buffers.
! (defvar change-major-mode-hook nil)	; Make sure it's not void.
! 
! ;;;###autoload
! (defvar font-lock-global-modes t
!   "*Modes for which Font Lock mode is automatically turned on.
! Global Font Lock mode is controlled by the `global-font-lock-mode' command.
! If nil, means no modes have Font Lock mode automatically turned on.
! If t, all modes that support Font Lock mode have it automatically turned on.
! If a list, each element should be a major mode symbol name such as `c-mode'.
! Font Lock is automatically turned on if the buffer major mode supports it and
! is in this list.  The sense of the list is negated if it begins with `not'.")
! 
! ;;;###autoload
! (defun global-font-lock-mode (&optional arg message)
!   "Toggle Global Font Lock mode.
! With prefix ARG, turn Global Font Lock mode on if and only if ARG is positive.
! Displays a message saying whether the mode is on or off if MESSAGE is non-nil.
! Returns the new status of Global Font Lock mode (non-nil means on).
! 
! When Global Font Lock mode is enabled, Font Lock mode is automagically
! turned on in a buffer if its major mode is one of `font-lock-global-modes'."
!   (interactive "P\np")
!   (let ((off-p (if arg
! 		   (<= (prefix-numeric-value arg) 0)
! 		 (memq 'font-lock-change-major-mode change-major-mode-hook))))
!     (if off-p
! 	(remove-hook 'change-major-mode-hook 'font-lock-change-major-mode)
!       (add-hook 'change-major-mode-hook 'font-lock-change-major-mode)
!       (add-hook 'post-command-hook 'turn-on-font-lock-if-enabled)
!       (setq font-lock-buffers (buffer-list)))
!     (if message
! 	(message "Global Font Lock mode is now %s." (if off-p "OFF" "ON")))
!     (not off-p)))
! 
! (defun font-lock-change-major-mode ()
!   ;; Gross hack warning: Delicate readers should avert eyes now.
!   ;; Something is running `kill-all-local-variables', which generally means the
!   ;; major mode is being changed.  Run `turn-on-font-lock-if-enabled' after the
!   ;; current command has finished.
!   (add-hook 'post-command-hook 'turn-on-font-lock-if-enabled)
!   (add-to-list 'font-lock-buffers (current-buffer)))
! 
! (defun turn-on-font-lock-if-enabled ()
!   ;; Gross hack warning: Delicate readers should avert eyes now.
!   ;; Turn on Font Lock mode if it's one of `font-lock-global-modes'.
!   (remove-hook 'post-command-hook 'turn-on-font-lock-if-enabled)
!   (while font-lock-buffers
!     (if (buffer-live-p (car font-lock-buffers))
! 	(save-excursion
! 	  (set-buffer (car font-lock-buffers))
! 	  (if (or (eq font-lock-global-modes t)
! 		  (if (eq (car-safe font-lock-global-modes) 'not)
! 		      (not (memq major-mode (cdr font-lock-global-modes)))
! 		    (memq major-mode font-lock-global-modes)))
! 	      (let (inhibit-quit)
! 		(turn-on-font-lock)))))
!     (setq font-lock-buffers (cdr font-lock-buffers))))
! 
! ;; End of Global Font Lock mode.
! 
! ;; Fontification functions.
  
  ;;;###autoload
*************** size, you can use \\[font-lock-fontify-b
*** 407,439 ****
    "Fontify the current buffer the way `font-lock-mode' would."
    (interactive)
!   (let ((verbose (and (or font-lock-verbose (interactive-p))
! 		      (not (zerop (buffer-size))))))
!     (set (make-local-variable 'font-lock-fontified) nil)
      (if verbose (message "Fontifying %s..." (buffer-name)))
!     ;; Turn it on to run hooks and get the right `font-lock-keywords' etc.
!     (or font-lock-mode (font-lock-set-defaults))
!     (condition-case nil
! 	(save-excursion
! 	  (save-match-data
! 	    (font-lock-fontify-region (point-min) (point-max) verbose)
! 	    (setq font-lock-fontified t)))
!       ;; We don't restore the old fontification, so it's best to unfontify.
!       (quit (font-lock-unfontify-region (point-min) (point-max))))
      (if verbose (message "Fontifying %s... %s." (buffer-name)
! 			 (if font-lock-fontified "done" "aborted")))
!     (font-lock-after-fontify-buffer)))
! 
! ;; Fontification functions.
  
  ;; We use this wrapper.  However, `font-lock-fontify-region' used to be the
  ;; name used for `font-lock-fontify-syntactically-region', so a change isn't
  ;; back-compatible.  But you shouldn't be calling these directly, should you?
! (defun font-lock-fontify-region (beg end &optional loudly)
    (let ((modified (buffer-modified-p))
  	(buffer-undo-list t) (inhibit-read-only t)
  	(old-syntax-table (syntax-table))
  	buffer-file-name buffer-file-truename)
      (unwind-protect
! 	(progn
  	  ;; Use the fontification syntax table, if any.
  	  (if font-lock-syntax-table (set-syntax-table font-lock-syntax-table))
--- 584,637 ----
    "Fontify the current buffer the way `font-lock-mode' would."
    (interactive)
!   (let ((font-lock-verbose (or font-lock-verbose (interactive-p))))
!     (funcall font-lock-fontify-buffer-function)))
! 
! (defun font-lock-unfontify-buffer ()
!   (funcall font-lock-unfontify-buffer-function))
! 
! (defun font-lock-fontify-region (beg end &optional loudly)
!   (funcall font-lock-fontify-region-function beg end loudly))
! 
! (defun font-lock-unfontify-region (beg end)
!   (funcall font-lock-unfontify-region-function beg end))
! 
! (defun font-lock-default-fontify-buffer ()
!   (let ((verbose (and font-lock-verbose (> (buffer-size) 0))))
      (if verbose (message "Fontifying %s..." (buffer-name)))
!     ;; Make sure we have the right `font-lock-keywords' etc.
!     (if (not font-lock-mode) (font-lock-set-defaults))
!     ;; Make sure we fontify etc. in the whole buffer.
!     (save-restriction
!       (widen)
!       (condition-case nil
! 	  (save-excursion
! 	    (save-match-data
! 	      (font-lock-fontify-region (point-min) (point-max) verbose)
! 	      (font-lock-after-fontify-buffer)
! 	      (setq font-lock-fontified t)))
! 	;; We don't restore the old fontification, so it's best to unfontify.
! 	(quit (font-lock-unfontify-buffer))))
      (if verbose (message "Fontifying %s... %s." (buffer-name)
! 			 (if font-lock-fontified "done" "aborted")))))
! 
! (defun font-lock-default-unfontify-buffer ()
!   (save-restriction
!     (widen)
!     (font-lock-unfontify-region (point-min) (point-max))
!     (font-lock-after-unfontify-buffer)
!     (setq font-lock-fontified nil)))
  
  ;; We use this wrapper.  However, `font-lock-fontify-region' used to be the
  ;; name used for `font-lock-fontify-syntactically-region', so a change isn't
  ;; back-compatible.  But you shouldn't be calling these directly, should you?
! (defun font-lock-default-fontify-region (beg end loudly)
    (let ((modified (buffer-modified-p))
  	(buffer-undo-list t) (inhibit-read-only t)
  	(old-syntax-table (syntax-table))
+ 	before-change-functions after-change-functions
  	buffer-file-name buffer-file-truename)
      (unwind-protect
! 	(save-restriction
! 	  (widen)
  	  ;; Use the fontification syntax table, if any.
  	  (if font-lock-syntax-table (set-syntax-table font-lock-syntax-table))
*************** size, you can use \\[font-lock-fontify-b
*** 455,461 ****
  ;	  (font-lock-fontify-keywords-region beg end))
  
! (defun font-lock-unfontify-region (beg end)
    (let ((modified (buffer-modified-p))
  	(buffer-undo-list t) (inhibit-read-only t)
  	buffer-file-name buffer-file-truename)
      (remove-text-properties beg end '(face nil))
--- 653,660 ----
  ;	  (font-lock-fontify-keywords-region beg end))
  
! (defun font-lock-default-unfontify-region (beg end)
    (let ((modified (buffer-modified-p))
  	(buffer-undo-list t) (inhibit-read-only t)
+ 	before-change-functions after-change-functions
  	buffer-file-name buffer-file-truename)
      (remove-text-properties beg end '(face nil))
*************** size, you can use \\[font-lock-fontify-b
*** 470,476 ****
--- 669,707 ----
         (progn (goto-char beg) (beginning-of-line) (point))
         (progn (goto-char end) (forward-line 1) (point))))))
+ 
+ (defun font-lock-fontify-block (&optional arg)
+   "Fontify some lines the way `font-lock-fontify-buffer' would.
+ The lines could be a function or paragraph, or a specified number of lines.
+ If ARG is given, fontify that many lines before and after point, or 16 lines if
+ no ARG is given and `font-lock-mark-block-function' is nil.
+ If `font-lock-mark-block-function' non-nil and no ARG is given, it is used to
+ delimit the region to fontify."
+   (interactive "P")
+   (let (font-lock-beginning-of-syntax-function deactivate-mark)
+     ;; Make sure we have the right `font-lock-keywords' etc.
+     (if (not font-lock-mode) (font-lock-set-defaults))
+     (save-excursion
+       (save-match-data
+ 	(condition-case error-data
+ 	    (if (or arg (not font-lock-mark-block-function))
+ 		(let ((lines (if arg (prefix-numeric-value arg) 16)))
+ 		  (font-lock-fontify-region
+ 		   (save-excursion (forward-line (- lines)) (point))
+ 		   (save-excursion (forward-line lines) (point))))
+ 	      (funcall font-lock-mark-block-function)
+ 	      (font-lock-fontify-region (point) (mark)))
+ 	  ((error quit) (message "Fontifying block... %s" error-data)))))))
+ 
+ (define-key facemenu-keymap "\M-g" 'font-lock-fontify-block)
  
  ;; Syntactic fontification functions.
  
+ ;; These record the parse state at a particular position, always the start of a
+ ;; line.  Used to make `font-lock-fontify-syntactically-region' faster.
+ (defvar font-lock-cache-position nil)
+ (defvar font-lock-cache-state nil)
+ (make-variable-buffer-local 'font-lock-cache-position)
+ (make-variable-buffer-local 'font-lock-cache-state)
+ 
  (defun font-lock-fontify-syntactically-region (start end &optional loudly)
    "Put proper face on each string and comment between START and END.
*************** START should be at the beginning of a li
*** 484,579 ****
  	state prev prevstate)
      (if loudly (message "Fontifying %s... (syntactically...)" (buffer-name)))
!     (save-restriction
!       (widen)
!       (goto-char start)
!       ;;
!       ;; Find the state at the `beginning-of-line' before `start'.
!       (if (eq start font-lock-cache-position)
! 	  ;; Use the cache for the state of `start'.
! 	  (setq state font-lock-cache-state)
! 	;; Find the state of `start'.
! 	(if (null font-lock-beginning-of-syntax-function)
! 	    ;; Use the state at the previous cache position, if any, or
! 	    ;; otherwise calculate from `point-min'.
! 	    (if (or (null font-lock-cache-position)
! 		    (< start font-lock-cache-position))
! 		(setq state (parse-partial-sexp (point-min) start))
! 	      (setq state (parse-partial-sexp font-lock-cache-position start
! 					      nil nil font-lock-cache-state)))
! 	  ;; Call the function to move outside any syntactic block.
! 	  (funcall font-lock-beginning-of-syntax-function)
! 	  (setq state (parse-partial-sexp (point) start)))
! 	;; Cache the state and position of `start'.
! 	(setq font-lock-cache-state state
! 	      font-lock-cache-position start))
!       ;;
!       ;; If the region starts inside a string, show the extent of it.
!       (if (nth 3 state)
! 	  (let ((beg (point)))
! 	    (while (and (re-search-forward "\\s\"" end 'move)
! 			(nth 3 (parse-partial-sexp beg (point)
! 						   nil nil state))))
! 	    (put-text-property beg (point) 'face font-lock-string-face)
! 	    (setq state (parse-partial-sexp beg (point) nil nil state))))
!       ;;
!       ;; Likewise for a comment.
!       (if (or (nth 4 state) (nth 7 state))
! 	  (let ((beg (point)))
! 	    (save-restriction
! 	      (narrow-to-region (point-min) end)
! 	      (condition-case nil
! 		  (progn
! 		    (re-search-backward comstart (point-min) 'move)
! 		    (forward-comment 1)
! 		    ;; forward-comment skips all whitespace,
! 		    ;; so go back to the real end of the comment.
! 		    (skip-chars-backward " \t"))
! 		(error (goto-char end))))
! 	    (put-text-property beg (point) 'face font-lock-comment-face)
! 	    (setq state (parse-partial-sexp beg (point) nil nil state))))
!       ;;
!       ;; Find each interesting place between here and `end'.
!       (while (and (< (point) end)
! 		  (setq prev (point) prevstate state)
! 		  (re-search-forward synstart end t)
! 		  (progn
! 		    ;; Clear out the fonts of what we skip over.
! 		    (remove-text-properties prev (point) '(face nil))
! 		    ;; Verify the state at that place
! 		    ;; so we don't get fooled by \" or \;.
! 		    (setq state (parse-partial-sexp prev (point)
! 						    nil nil state))))
! 	(let ((here (point)))
! 	  (if (or (nth 4 state) (nth 7 state))
  	      ;;
! 	      ;; We found a real comment start.
  	      (let ((beg (match-beginning 0)))
! 		(goto-char beg)
! 		(save-restriction
! 		  (narrow-to-region (point-min) end)
! 		  (condition-case nil
! 		      (progn
! 			(forward-comment 1)
! 			;; forward-comment skips all whitespace,
! 			;; so go back to the real end of the comment.
! 			(skip-chars-backward " \t"))
! 		    (error (goto-char end))))
! 		(put-text-property beg (point) 'face
! 				   font-lock-comment-face)
! 		(setq state (parse-partial-sexp here (point) nil nil state)))
! 	    (if (nth 3 state)
! 		;;
! 		;; We found a real string start.
! 		(let ((beg (match-beginning 0)))
! 		  (while (and (re-search-forward "\\s\"" end 'move)
! 			      (nth 3 (parse-partial-sexp here (point)
! 							 nil nil state))))
! 		  (put-text-property beg (point) 'face font-lock-string-face)
! 		  (setq state (parse-partial-sexp here (point)
! 						  nil nil state))))))
! 	;;
! 	;; Make sure `prev' is non-nil after the loop
! 	;; only if it was set on the very last iteration.
! 	(setq prev nil)))
      ;;
      ;; Clean up.
--- 715,806 ----
  	state prev prevstate)
      (if loudly (message "Fontifying %s... (syntactically...)" (buffer-name)))
!     (goto-char start)
!     ;;
!     ;; Find the state at the `beginning-of-line' before `start'.
!     (if (eq start font-lock-cache-position)
! 	;; Use the cache for the state of `start'.
! 	(setq state font-lock-cache-state)
!       ;; Find the state of `start'.
!       (if (null font-lock-beginning-of-syntax-function)
! 	  ;; Use the state at the previous cache position, if any, or
! 	  ;; otherwise calculate from `point-min'.
! 	  (if (or (null font-lock-cache-position)
! 		  (< start font-lock-cache-position))
! 	      (setq state (parse-partial-sexp (point-min) start))
! 	    (setq state (parse-partial-sexp font-lock-cache-position start
! 					    nil nil font-lock-cache-state)))
! 	;; Call the function to move outside any syntactic block.
! 	(funcall font-lock-beginning-of-syntax-function)
! 	(setq state (parse-partial-sexp (point) start)))
!       ;; Cache the state and position of `start'.
!       (setq font-lock-cache-state state
! 	    font-lock-cache-position start))
!     ;;
!     ;; If the region starts inside a string, show the extent of it.
!     (if (nth 3 state)
! 	(let ((beg (point)))
! 	  (while (and (re-search-forward "\\s\"" end 'move)
! 		      (nth 3 (parse-partial-sexp beg (point) nil nil state))))
! 	  (put-text-property beg (point) 'face font-lock-string-face)
! 	  (setq state (parse-partial-sexp beg (point) nil nil state))))
!     ;;
!     ;; Likewise for a comment.
!     (if (or (nth 4 state) (nth 7 state))
! 	(let ((beg (point)))
! 	  (save-restriction
! 	    (narrow-to-region (point-min) end)
! 	    (condition-case nil
! 		(progn
! 		  (re-search-backward comstart (point-min) 'move)
! 		  (forward-comment 1)
! 		  ;; forward-comment skips all whitespace,
! 		  ;; so go back to the real end of the comment.
! 		  (skip-chars-backward " \t"))
! 	      (error (goto-char end))))
! 	  (put-text-property beg (point) 'face font-lock-comment-face)
! 	  (setq state (parse-partial-sexp beg (point) nil nil state))))
!     ;;
!     ;; Find each interesting place between here and `end'.
!     (while (and (< (point) end)
! 		(setq prev (point) prevstate state)
! 		(re-search-forward synstart end t)
! 		(progn
! 		  ;; Clear out the fonts of what we skip over.
! 		  (remove-text-properties prev (point) '(face nil))
! 		  ;; Verify the state at that place
! 		  ;; so we don't get fooled by \" or \;.
! 		  (setq state (parse-partial-sexp prev (point)
! 						  nil nil state))))
!       (let ((here (point)))
! 	(if (or (nth 4 state) (nth 7 state))
! 	    ;;
! 	    ;; We found a real comment start.
! 	    (let ((beg (match-beginning 0)))
! 	      (goto-char beg)
! 	      (save-restriction
! 		(narrow-to-region (point-min) end)
! 		(condition-case nil
! 		    (progn
! 		      (forward-comment 1)
! 		      ;; forward-comment skips all whitespace,
! 		      ;; so go back to the real end of the comment.
! 		      (skip-chars-backward " \t"))
! 		  (error (goto-char end))))
! 	      (put-text-property beg (point) 'face font-lock-comment-face)
! 	      (setq state (parse-partial-sexp here (point) nil nil state)))
! 	  (if (nth 3 state)
  	      ;;
! 	      ;; We found a real string start.
  	      (let ((beg (match-beginning 0)))
! 		(while (and (re-search-forward "\\s\"" end 'move)
! 			    (nth 3 (parse-partial-sexp here (point)
! 						       nil nil state))))
! 		(put-text-property beg (point) 'face font-lock-string-face)
! 		(setq state (parse-partial-sexp here (point)
! 						nil nil state))))))
!       ;;
!       ;; Make sure `prev' is non-nil after the loop
!       ;; only if it was set on the very last iteration.
!       (setq prev nil))
      ;;
      ;; Clean up.
*************** START should be at the beginning of a li
*** 752,756 ****
  	 (lazy-lock-mode -1))))
  
! ;; Do something special for these packages after fontifying.  I prefer a hook.
  (defun font-lock-after-fontify-buffer ()
    (cond ((and (boundp 'fast-lock-mode) fast-lock-mode)
--- 979,983 ----
  	 (lazy-lock-mode -1))))
  
! ;; Do something special for these packages after fontifying; I prefer a hook.
  (defun font-lock-after-fontify-buffer ()
    (cond ((and (boundp 'fast-lock-mode) fast-lock-mode)
*************** START should be at the beginning of a li
*** 759,762 ****
--- 986,996 ----
  	 (lazy-lock-after-fontify-buffer))))
  
+ ;; Do something special for these packages after unfontifying; I prefer a hook.
+ (defun font-lock-after-unfontify-buffer ()
+   (cond ((and (boundp 'fast-lock-mode) fast-lock-mode)
+ 	 (fast-lock-after-unfontify-buffer))
+ 	((and (boundp 'lazy-lock-mode) lazy-lock-mode)
+ 	 (lazy-lock-after-unfontify-buffer))))
+ 
  ;; If the buffer is about to be reverted, it won't be fontified afterward.
  (defun font-lock-revert-setup ()
*************** START should be at the beginning of a li
*** 765,769 ****
  ;; If the buffer has just been reverted, normally that turns off
  ;; Font Lock mode.  So turn the mode back on if necessary.
! (defalias 'font-lock-revert-cleanup 'turn-on-font-lock)
  
  (defun font-lock-compile-keywords (&optional keywords)
--- 999,1004 ----
  ;; If the buffer has just been reverted, normally that turns off
  ;; Font Lock mode.  So turn the mode back on if necessary.
! (defalias 'font-lock-revert-cleanup
!   'turn-on-font-lock)
  
  (defun font-lock-compile-keywords (&optional keywords)
*************** START should be at the beginning of a li
*** 772,832 ****
    (let ((keywords (or keywords font-lock-keywords)))
      (setq font-lock-keywords 
!      (if (eq (car-safe keywords) t)
! 	 keywords
!        (cons t
! 	(mapcar
! 	 (function (lambda (item)
! 	    (cond ((nlistp item)
! 		   (list item '(0 font-lock-keyword-face)))
! 		  ((numberp (cdr item))
! 		   (list (car item) (list (cdr item) 'font-lock-keyword-face)))
! 		  ((symbolp (cdr item))
! 		   (list (car item) (list 0 (cdr item))))
! 		  ((nlistp (nth 1 item))
! 		   (list (car item) (cdr item)))
! 		  (t
! 		   item))))
! 	 keywords))))))
  
  (defun font-lock-choose-keywords (keywords level)
    ;; Return LEVELth element of KEYWORDS.  A LEVEL of nil is equal to a
    ;; LEVEL of 0, a LEVEL of t is equal to (1- (length KEYWORDS)).
!   (let ((level (if (not (consp level))
! 		   level
! 		 (cdr (or (assq major-mode level) (assq t level))))))
!     (cond ((symbolp keywords)
! 	   keywords)
! 	  ((numberp level)
! 	   (or (nth level keywords) (car (reverse keywords))))
! 	  ((eq level t)
! 	   (car (reverse keywords)))
! 	  (t
! 	   (car keywords)))))
  
  (defun font-lock-set-defaults ()
    "Set fontification defaults appropriately for this mode.
! Sets `font-lock-keywords', `font-lock-keywords-only', `font-lock-syntax-table',
! `font-lock-beginning-of-syntax-function' and
! `font-lock-keywords-case-fold-search' using `font-lock-defaults' (or, if nil,
! using `font-lock-defaults-alist') and `font-lock-maximum-decoration'."
    ;; Set face defaults.
    (font-lock-make-faces)
    ;; Set fontification defaults.
!   (or font-lock-keywords
        (let* ((defaults (or font-lock-defaults
  			   (cdr (assq major-mode font-lock-defaults-alist))))
! 	     (keywords (font-lock-choose-keywords
! 			(nth 0 defaults) font-lock-maximum-decoration)))
! 	;; Keywords?
  	(setq font-lock-keywords (if (fboundp keywords)
  				     (funcall keywords)
  				   (eval keywords)))
! 	;; Syntactic?
  	(if (nth 1 defaults)
  	    (set (make-local-variable 'font-lock-keywords-only) t))
! 	;; Case fold?
  	(if (nth 2 defaults)
  	    (set (make-local-variable 'font-lock-keywords-case-fold-search) t))
! 	;; Syntax table?
  	(if (nth 3 defaults)
  	    (let ((slist (nth 3 defaults)))
--- 1007,1072 ----
    (let ((keywords (or keywords font-lock-keywords)))
      (setq font-lock-keywords 
! 	  (if (eq (car-safe keywords) t)
! 	      keywords
! 	    (cons t (mapcar 'font-lock-compile-keyword keywords))))))
! 
! (defun font-lock-compile-keyword (keyword)
!   (cond ((nlistp keyword)		; Just MATCHER
! 	 (list keyword '(0 font-lock-keyword-face)))
! 	((eq (car keyword) 'eval)	; Specified (eval . FORM)
! 	 (font-lock-compile-keyword (eval (cdr keyword))))
! 	((numberp (cdr keyword))	; Specified (MATCHER . MATCH)
! 	 (list (car keyword) (list (cdr keyword) 'font-lock-keyword-face)))
! 	((symbolp (cdr keyword))	; Specified (MATCHER . FACENAME)
! 	 (list (car keyword) (list 0 (cdr keyword))))
! 	((nlistp (nth 1 keyword))	; Specified (MATCHER . HIGHLIGHT)
! 	 (list (car keyword) (cdr keyword)))
! 	(t				; Hopefully (MATCHER HIGHLIGHT ...)
! 	 keyword)))
! 
! (defun font-lock-value-in-major-mode (alist)
!   ;; Return value in ALIST for `major-mode', or ALIST if it is not an alist.
!   ;; Alist structure is ((MAJOR-MODE . VALUE)) where MAJOR-MODE may be t.
!   (if (consp alist)
!       (cdr (or (assq major-mode alist) (assq t alist)))
!     alist))
  
  (defun font-lock-choose-keywords (keywords level)
    ;; Return LEVELth element of KEYWORDS.  A LEVEL of nil is equal to a
    ;; LEVEL of 0, a LEVEL of t is equal to (1- (length KEYWORDS)).
!   (cond ((symbolp keywords)
! 	 keywords)
! 	((numberp level)
! 	 (or (nth level keywords) (car (reverse keywords))))
! 	((eq level t)
! 	 (car (reverse keywords)))
! 	(t
! 	 (car keywords))))
  
  (defun font-lock-set-defaults ()
    "Set fontification defaults appropriately for this mode.
! Sets various variables using `font-lock-defaults' (or, if nil, using
! `font-lock-defaults-alist') and `font-lock-maximum-decoration'."
    ;; Set face defaults.
    (font-lock-make-faces)
    ;; Set fontification defaults.
!   (make-local-variable 'font-lock-fontified)
!   (if (member font-lock-keywords '(nil (t)))
        (let* ((defaults (or font-lock-defaults
  			   (cdr (assq major-mode font-lock-defaults-alist))))
! 	     (keywords
! 	      (font-lock-choose-keywords (nth 0 defaults)
! 	       (font-lock-value-in-major-mode font-lock-maximum-decoration))))
! 	;; Regexp fontification?
  	(setq font-lock-keywords (if (fboundp keywords)
  				     (funcall keywords)
  				   (eval keywords)))
! 	;; Syntactic fontification?
  	(if (nth 1 defaults)
  	    (set (make-local-variable 'font-lock-keywords-only) t))
! 	;; Case fold during regexp fontification?
  	(if (nth 2 defaults)
  	    (set (make-local-variable 'font-lock-keywords-case-fold-search) t))
! 	;; Syntax table for regexp and syntactic fontification?
  	(if (nth 3 defaults)
  	    (let ((slist (nth 3 defaults)))
*************** using `font-lock-defaults-alist') and `f
*** 837,847 ****
  				     font-lock-syntax-table)
  		(setq slist (cdr slist)))))
! 	;; Syntax function?
  	(if (nth 4 defaults)
  	    (set (make-local-variable 'font-lock-beginning-of-syntax-function)
! 		 (nth 4 defaults))))))
  
  ;; Colour etc. support.
  
  (defvar font-lock-display-type nil
    "A symbol indicating the display Emacs is running under.
--- 1077,1114 ----
  				     font-lock-syntax-table)
  		(setq slist (cdr slist)))))
! 	;; Syntax function for syntactic fontification?
  	(if (nth 4 defaults)
  	    (set (make-local-variable 'font-lock-beginning-of-syntax-function)
! 		 (nth 4 defaults)))
! 	;; Variable alist?
! 	(let ((alist (nthcdr 5 defaults)))
! 	  (while alist
! 	    (set (make-local-variable (car (car alist))) (cdr (car alist)))
! 	    (setq alist (cdr alist)))))))
! 
! (defun font-lock-unset-defaults ()
!   "Unset fontification defaults.  See `font-lock-set-defaults'."
!   (setq font-lock-keywords			nil
! 	font-lock-keywords-only			nil
! 	font-lock-keywords-case-fold-search	nil
! 	font-lock-syntax-table			nil
! 	font-lock-beginning-of-syntax-function	nil)
!   (let* ((defaults (or font-lock-defaults
! 		       (cdr (assq major-mode font-lock-defaults-alist))))
! 	 (alist (nthcdr 5 defaults)))
!     (while alist
!       (set (car (car alist)) (default-value (car (car alist))))
!       (setq alist (cdr alist)))))
  
  ;; Colour etc. support.
  
+ ;; This section of code is crying out for revision.
+ 
+ ;; To begin with, `display-type' and `background-mode' are `frame-parameters'
+ ;; so we don't have to calculate them here anymore.  But all the face stuff
+ ;; should be frame-local (and thus display-local) anyway.  Because we're not
+ ;; sure what support Emacs is going to have for general frame-local face
+ ;; attributes, we leave this section of code as it is.  For now.  --sm.
+ 
  (defvar font-lock-display-type nil
    "A symbol indicating the display Emacs is running under.
*************** the face is also set; its value is the f
*** 1041,1045 ****
  		 ;; Any whitespace and declared object.
  		 "[ \t'\(]*"
! 		 "\\([^ \t\n\)]+\\)?")
  	 '(1 font-lock-keyword-face)
  	 '(8 (cond ((match-beginning 3) font-lock-variable-name-face)
--- 1308,1312 ----
  		 ;; Any whitespace and declared object.
  		 "[ \t'\(]*"
! 		 "\\(\\sw+\\)?")
  	 '(1 font-lock-keyword-face)
  	 '(8 (cond ((match-beginning 3) font-lock-variable-name-face)
*************** the face is also set; its value is the f
*** 1048,1052 ****
  	     nil t))
     )
!  "Subdued level highlighting Lisp modes.")
  
  (defconst lisp-font-lock-keywords-2
--- 1315,1319 ----
  	     nil t))
     )
!  "Subdued level highlighting for Lisp modes.")
  
  (defconst lisp-font-lock-keywords-2
*************** the face is also set; its value is the f
*** 1056,1076 ****
      ;; Control structures.  ELisp and CLisp combined.
  ;      (make-regexp
! ;       '("cond" "if" "while" "let\\*?" "prog[nv12*]?" "catch" "throw"
  ;	 "save-restriction" "save-excursion" "save-window-excursion"
  ;	 "save-selected-window" "save-match-data" "unwind-protect"
  ;	 "condition-case" "track-mouse"
  ;	 "eval-after-load" "eval-and-compile" "eval-when-compile"
! ;	 "when" "unless" "do" "flet" "labels" "return" "return-from"))
      (cons
       (concat
        "(\\("
!       "\\(c\\(atch\\|ond\\(\\|ition-case\\)\\)\\|do\\|"
        "eval-\\(a\\(fter-load\\|nd-compile\\)\\|when-compile\\)\\|flet\\|"
!       "if\\|l\\(abels\\|et\\*?\\)\\|prog[nv12*]?\\|return\\(\\|-from\\)\\|"
!       "save-\\(excursion\\|match-data\\|restriction\\|selected-window\\|"
!       "window-excursion\\)\\|t\\(hrow\\|rack-mouse\\)\\|"
!       "un\\(less\\|wind-protect\\)\\|wh\\(en\\|ile\\)\\)"
        "\\)\\>") 1)
      ;;
      ;; Words inside \\[] tend to be for `substitute-command-keys'.
      '("\\\\\\\\\\[\\(\\sw+\\)]" 1 font-lock-reference-face prepend)
--- 1323,1349 ----
      ;; Control structures.  ELisp and CLisp combined.
  ;      (make-regexp
! ;       '("cond" "if" "while" "let\\*?" "prog[nv12*]?" "inline" "catch" "throw"
  ;	 "save-restriction" "save-excursion" "save-window-excursion"
  ;	 "save-selected-window" "save-match-data" "unwind-protect"
  ;	 "condition-case" "track-mouse"
  ;	 "eval-after-load" "eval-and-compile" "eval-when-compile"
! ;	 "when" "unless" "do" "flet" "labels" "return" "return-from"
! ;	 "with-output-to-temp-buffer" "with-timeout"))
      (cons
       (concat
        "(\\("
!       "c\\(atch\\|ond\\(\\|ition-case\\)\\)\\|do\\|"
        "eval-\\(a\\(fter-load\\|nd-compile\\)\\|when-compile\\)\\|flet\\|"
!       "i\\(f\\|nline\\)\\|l\\(abels\\|et\\*?\\)\\|prog[nv12*]?\\|"
!       "return\\(\\|-from\\)\\|save-\\(excursion\\|match-data\\|restriction\\|"
!       "selected-window\\|window-excursion\\)\\|t\\(hrow\\|rack-mouse\\)\\|"
!       "un\\(less\\|wind-protect\\)\\|"
!       "w\\(h\\(en\\|ile\\)\\|ith-\\(output-to-temp-buffer\\|timeout\\)\\)"
        "\\)\\>") 1)
      ;;
+     ;; Feature symbols as references.
+     '("(\\(featurep\\|provide\\|require\\)\\>[ \t']*\\(\\sw+\\)?"
+       (1 font-lock-keyword-face) (2 font-lock-reference-face nil t))
+     ;;
      ;; Words inside \\[] tend to be for `substitute-command-keys'.
      '("\\\\\\\\\\[\\(\\sw+\\)]" 1 font-lock-reference-face prepend)
*************** the face is also set; its value is the f
*** 1083,1087 ****
      ;;
      ;; ELisp and CLisp `&' keywords as types.
!     '("\\<\\&\\(optional\\|rest\\|whole\\)\\>" . font-lock-type-face)
      ))
    "Gaudy level highlighting for Lisp modes.")
--- 1356,1360 ----
      ;;
      ;; ELisp and CLisp `&' keywords as types.
!     '("\\<\\&\\sw+\\>" . font-lock-type-face)
      ))
    "Gaudy level highlighting for Lisp modes.")
*************** the face is also set; its value is the f
*** 1222,1226 ****
     ;;
     ;; Fontify function macro names.
!    '("^#[ \t]*define[ \t]+\\(\\(\\sw+\\)(\\)" 2 font-lock-function-name-face)
     ;;
     ;; Fontify symbol names in #if ... defined preprocessor directives.
--- 1495,1499 ----
     ;;
     ;; Fontify function macro names.
!    '("^#[ \t]*define[ \t]+\\(\\sw+\\)(" 1 font-lock-function-name-face)
     ;;
     ;; Fontify symbol names in #if ... defined preprocessor directives.
*************** the face is also set; its value is the f
*** 1230,1234 ****
     ;;
     ;; Fontify otherwise as symbol names, and the preprocessor directive names.
!    '("^\\(#[ \t]*[a-z]+\\)\\>[ \t]*\\(\\sw+\\)?"
       (1 font-lock-reference-face) (2 font-lock-variable-name-face nil t))
     ))
--- 1503,1507 ----
     ;;
     ;; Fontify otherwise as symbol names, and the preprocessor directive names.
!    '("^#[ \t]*\\(\\sw+\\)\\>[ \t]*\\(\\sw+\\)?"
       (1 font-lock-reference-face) (2 font-lock-variable-name-face nil t))
     ))
*************** the face is also set; its value is the f
*** 1247,1251 ****
      ;;
      ;; Fontify case/goto keywords and targets, and case default/goto tags.
!     '("\\<\\(case\\|goto\\)\\>[ \t]*\\([^ \t\n:;]+\\)?"
        (1 font-lock-keyword-face) (2 font-lock-reference-face nil t))
      '("^[ \t]*\\(\\sw+\\)[ \t]*:" 1 font-lock-reference-face)
--- 1520,1524 ----
      ;;
      ;; Fontify case/goto keywords and targets, and case default/goto tags.
!     '("\\<\\(case\\|goto\\)\\>[ \t]*\\(\\sw+\\)?"
        (1 font-lock-keyword-face) (2 font-lock-reference-face nil t))
      '("^[ \t]*\\(\\sw+\\)[ \t]*:" 1 font-lock-reference-face)
*************** the face is also set; its value is the f
*** 1318,1322 ****
      ;;
      ;; Fontify case/goto keywords and targets, and case default/goto tags.
!     '("\\<\\(case\\|goto\\)\\>[ \t]*\\([^ \t\n:;]+\\)?"
        (1 font-lock-keyword-face) (2 font-lock-reference-face nil t))
      '("^[ \t]*\\(\\sw+\\)[ \t]*:[^:]" 1 font-lock-reference-face)
--- 1591,1595 ----
      ;;
      ;; Fontify case/goto keywords and targets, and case default/goto tags.
!     '("\\<\\(case\\|goto\\)\\>[ \t]*\\(\\sw+\\)?"
        (1 font-lock-keyword-face) (2 font-lock-reference-face nil t))
      '("^[ \t]*\\(\\sw+\\)[ \t]*:[^:]" 1 font-lock-reference-face)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/format.el emacs-19.31/lisp/format.el
*** emacs-19.30/lisp/format.el	Mon Oct 30 16:55:54 1995
--- emacs-19.31/lisp/format.el	Wed Jan 31 19:19:27 1996
***************
*** 1,3 ****
--- 1,4 ----
  ;;; format.el --- read and save files in multiple formats
+ 
  ;; Copyright (c) 1994, 1995 Free Software Foundation
  
***************
*** 10,60 ****
  ;; 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:
! ;; This file defines a unified mechanism for saving & loading files stored in
! ;; different formats.  `format-alist' contains information that directs
  ;; Emacs to call an encoding or decoding function when reading or writing
  ;; files that match certain conditions.  
  ;;
! ;; When a file is visited, its format is determined by matching the beginning
! ;; of the file against regular expressions stored in `format-alist'.  If this
! ;; fails, you can manually translate the buffer using `format-decode-buffer'.
! ;; In either case, the formats used are listed in the variable
! ;; `buffer-file-format', and become the default format for saving the buffer.
! ;; To save a buffer in a different format, change this variable, or use
! ;; `format-write-file'.
  ;;
  ;; Auto-save files are normally created in the same format as the visited
! ;; file, but the variable `auto-save-file-format' can be set to a particularly
! ;; fast or otherwise preferred format to be used for auto-saving (or nil to do
! ;; no encoding on auto-save files, but then you risk losing any
! ;; text-properties in the buffer).
  ;;
! ;; You can manually translate a buffer into or out of a particular format with
! ;; the functions `format-encode-buffer' and `format-decode-buffer'.
! ;; To translate just the region use the functions `format-encode-region' and
! ;; `format-decode-region'.  
  ;;
! ;; You can define a new format by writing the encoding and decoding functions,
! ;; and adding an entry to `format-alist'.  See enriched.el for an example of
! ;; how to implement a file format.  There are various functions defined
! ;; in this file that may be useful for writing the encoding and decoding
! ;; functions:
! ;;  * `format-annotate-region' and `format-deannotate-region' allow a single
! ;;     alist of information to be used for encoding and decoding.  The alist
! ;;     defines a correspondence between strings in the file ("annotations")
! ;;     and text-properties in the buffer.
  ;;  * `format-replace-strings' is similarly useful for doing simple
  ;;     string->string translations in a reversible manner.
  
  (put 'buffer-file-format 'permanent-local t)
  
--- 11,65 ----
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
! 
! ;; This file defines a unified mechanism for saving & loading files stored
! ;; in different formats.  `format-alist' contains information that directs
  ;; Emacs to call an encoding or decoding function when reading or writing
  ;; files that match certain conditions.  
  ;;
! ;; When a file is visited, its format is determined by matching the
! ;; beginning of the file against regular expressions stored in
! ;; `format-alist'.  If this fails, you can manually translate the buffer
! ;; using `format-decode-buffer'.  In either case, the formats used are
! ;; listed in the variable `buffer-file-format', and become the default
! ;; format for saving the buffer.  To save a buffer in a different format,
! ;; change this variable, or use `format-write-file'.
  ;;
  ;; Auto-save files are normally created in the same format as the visited
! ;; file, but the variable `auto-save-file-format' can be set to a
! ;; particularly fast or otherwise preferred format to be used for
! ;; auto-saving (or nil to do no encoding on auto-save files, but then you
! ;; risk losing any text-properties in the buffer).
  ;;
! ;; You can manually translate a buffer into or out of a particular format
! ;; with the functions `format-encode-buffer' and `format-decode-buffer'.
! ;; To translate just the region use the functions `format-encode-region'
! ;; and `format-decode-region'.  
  ;;
! ;; You can define a new format by writing the encoding and decoding
! ;; functions, and adding an entry to `format-alist'.  See enriched.el for
! ;; an example of how to implement a file format.  There are various
! ;; functions defined in this file that may be useful for writing the
! ;; encoding and decoding functions:
! ;;  * `format-annotate-region' and `format-deannotate-region' allow a
! ;;     single alist of information to be used for encoding and decoding.
! ;;     The alist defines a correspondence between strings in the file
! ;;     ("annotations") and text-properties in the buffer.
  ;;  * `format-replace-strings' is similarly useful for doing simple
  ;;     string->string translations in a reversible manner.
  
+ ;;; Code:
+ 
  (put 'buffer-file-format 'permanent-local t)
  
*************** to write these unknown annotations back 
*** 469,473 ****
  	      ;; If one is open, but not on the top of the stack, close
  	      ;; the things in between as well.  Set `found' when the real
! 	      ;; oneis closed.
  		(while (not found)
  		  (let* ((top (car open-ans)) ; first on stack: should match.
--- 474,478 ----
  	      ;; If one is open, but not on the top of the stack, close
  	      ;; the things in between as well.  Set `found' when the real
! 	      ;; one is closed.
  		(while (not found)
  		  (let* ((top (car open-ans)) ; first on stack: should match.
*************** to write these unknown annotations back 
*** 496,501 ****
  						  ans))
  				    nil	; multiple ans not satisfied
! 				  ;; Yes, use the current property name &
! 				  ;; value.  Set loop variables to nil so loop
  				  ;; will exit.
  				  (setq alist nil aalist nil matched t
--- 501,519 ----
  						  ans))
  				    nil	; multiple ans not satisfied
! 				  ;; Yes, all set.
! 				  ;; If there are multiple annotations going
! 				  ;; into one text property, adjust the 
! 				  ;; begin points of the other annotations
! 				  ;; so that we don't get double marking.
! 				  (let ((to-reset ans)
! 					this-one)
! 				    (while to-reset
! 				      (setq this-one
! 					    (assoc (car to-reset) 
! 						   (cdr open-ans)))
! 				      (if this-one
! 					  (setcdr this-one (list loc)))
! 				      (setq to-reset (cdr to-reset))))
! 				  ;; Set loop variables to nil so loop
  				  ;; will exit.
  				  (setq alist nil aalist nil matched t
*************** Annotations to open and to close are ret
*** 760,764 ****
  (defun format-annotate-atomic-property-change (prop-alist old new)
    "Internal function annotate a single property change.
! PROP-ALIST is the relevant segement of a TRANSLATIONS list.
  OLD and NEW are the values."
    (cond
--- 778,782 ----
  (defun format-annotate-atomic-property-change (prop-alist old new)
    "Internal function annotate a single property change.
! PROP-ALIST is the relevant segment of a TRANSLATIONS list.
  OLD and NEW are the values."
    (cond
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/forms.el emacs-19.31/lisp/forms.el
*** emacs-19.30/lisp/forms.el	Thu Nov 16 15:05:41 1995
--- emacs-19.31/lisp/forms.el	Fri Mar  1 16:13:31 1996
***************
*** 1,5 ****
  ;;; forms.el --- Forms mode: edit a file as a form to fill in
  
! ;; Copyright (C) 1991, 1994, 1995 Free Software Foundation, Inc.
  
  ;; Author: Johan Vromans <jvromans@squirrel.nl>
--- 1,5 ----
  ;;; forms.el --- Forms mode: edit a file as a form to fill in
  
! ;; Copyright (C) 1991, 1994, 1995, 1996 Free Software Foundation, Inc.
  
  ;; Author: Johan Vromans <jvromans@squirrel.nl>
***************
*** 18,284 ****
  
  ;; 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:
  
! ;;; Visit a file using a form.
! ;;;
! ;;; === Naming conventions
! ;;;
! ;;; The names of all variables and functions start with 'forms-'.
! ;;; Names which start with 'forms--' are intended for internal use, and
! ;;; should *NOT* be used from the outside.
! ;;;
! ;;; All variables are buffer-local, to enable multiple forms visits 
! ;;; simultaneously.
! ;;; Variable `forms--mode-setup' is local to *ALL* buffers, for it 
! ;;; controls if forms-mode has been enabled in a buffer.
! ;;;
! ;;; === How it works ===
! ;;;
! ;;; Forms mode means visiting a data file which is supposed to consist
! ;;; of records each containing a number of fields.  The records are
! ;;; separated by a newline, the fields are separated by a user-defined
! ;;; field separater (default: TAB).
! ;;; When shown, a record is transferred to an Emacs buffer and
! ;;; presented using a user-defined form.  One record is shown at a
! ;;; time.
! ;;;
! ;;; Forms mode is a composite mode.  It involves two files, and two
! ;;; buffers.
! ;;; The first file, called the control file, defines the name of the
! ;;; data file and the forms format.  This file buffer will be used to
! ;;; present the forms.
! ;;; The second file holds the actual data.  The buffer of this file
! ;;; will be buried, for it is never accessed directly.
! ;;;
! ;;; Forms mode is invoked using M-x forms-find-file control-file .
! ;;; Alternativily `forms-find-file-other-window' can be used.
! ;;;
! ;;; You may also visit the control file, and switch to forms mode by hand
! ;;; with M-x forms-mode .
! ;;;
! ;;; Automatic mode switching is supported if you specify 
! ;;; "-*- forms -*-" in the first line of the control file.
! ;;; 
! ;;; The control file is visited, evaluated using `eval-current-buffer',
! ;;; and should set at least the following variables:
! ;;;
! ;;;	forms-file				[string]
! ;;;			The name of the data file.
! ;;;
! ;;;	forms-number-of-fields			[integer]
! ;;;			The number of fields in each record.
! ;;;
! ;;;	forms-format-list			[list]
! ;;;			Formatting instructions.
! ;;;
! ;;; `forms-format-list' should be a list, each element containing
! ;;;
! ;;;   - a string, e.g. "hello".  The string is inserted in the forms
! ;;;	"as is".
! ;;;   
! ;;;   - an integer, denoting a field number.
! ;;;	The contents of this field are inserted at this point.
! ;;;     Fields are numbered starting with number one.
! ;;;   
! ;;;   - a function call, e.g. (insert "text").
! ;;;	This function call is dynamically evaluated and should return a
! ;;;     string.  It should *NOT* have side-effects on the forms being
! ;;;     constructed.  The current fields are available to the function
! ;;;     in the variable `forms-fields', they should *NOT* be modified.
! ;;;   
! ;;;   - a lisp symbol, that must evaluate to one of the above.
! ;;;
! ;;; Optional variables which may be set in the control file:
! ;;;
! ;;;	forms-field-sep				[string, default TAB]
! ;;;			The field separator used to separate the
! ;;;			fields in the data file.  It may be a string.
! ;;;
! ;;;	forms-read-only				[bool, default nil]
! ;;;			Non-nil means that the data file is visited
! ;;;			read-only (view mode) as opposed to edit mode.
! ;;;			If no write access to the data file is
! ;;;			possible, view mode is enforced. 
! ;;;
! ;;;     forms-check-number-of-fields            [bool, default t]
! ;;;                   If non-nil, a warning will be issued whenever
! ;;;                   a record is found that does not have the number
! ;;;                   of fields specified by `forms-number-of-fields'.
! ;;;
! ;;;	forms-multi-line			[string, default "^K"]
! ;;;			If non-null the records of the data file may
! ;;;			contain fields that can span multiple lines in
! ;;;			the form.
! ;;;			This variable denotes the separator character
! ;;;			to be used for this purpose.  Upon display, all
! ;;;			occurrencies of this character are translated
! ;;;			to newlines.  Upon storage they are translated
! ;;;			back to the separator character.
! ;;;
! ;;;	forms-forms-scroll			[bool, default nil]
! ;;;			Non-nil means: rebind locally the commands that
! ;;;			perform `scroll-up' or `scroll-down' to use
! ;;;			`forms-next-field' resp. `forms-prev-field'.
! ;;;
! ;;;	forms-forms-jump			[bool, default nil]
! ;;;			Non-nil means: rebind locally the commands that
! ;;;			perform `beginning-of-buffer' or `end-of-buffer'
! ;;;			to perform `forms-first-field' resp. `forms-last-field'.
! ;;;
! ;;;	forms-read-file-filter			[symbol, default nil]
! ;;;			If not nil: this should be the name of a 
! ;;;			function that is called after the forms data file
! ;;;			has been read.  It can be used to transform
! ;;;			the contents of the file into a format more suitable
! ;;;			for forms-mode processing.
! ;;;
! ;;;	forms-write-file-filter			[symbol, default nil]
! ;;;			If not nil: this should be the name of a 
! ;;;			function that is called before the forms data file
! ;;;			is written (saved) to disk.  It can be used to undo
! ;;;			the effects of `forms-read-file-filter', if any.
! ;;;
! ;;;	forms-new-record-filter			[symbol, default nil]
! ;;;			If not nil: this should be the name of a 
! ;;;			function that is called when a new
! ;;;			record is created.  It can be used to fill in
! ;;;			the new record with default fields, for example.
! ;;;
! ;;;	forms-modified-record-filter		[symbol, default nil]
! ;;;			If not nil: this should be the name of a 
! ;;;			function that is called when a record has
! ;;;			been modified.  It is called after the fields
! ;;;			are parsed.  It can be used to register
! ;;;			modification dates, for example.
! ;;;
! ;;;	forms-use-text-properties		[bool, see text for default]
! ;;;			This variable controls if forms mode should use
! ;;;			text properties to protect the form text from being
! ;;;			modified (using text-property `read-only').
! ;;;			Also, the read-write fields are shown using a
! ;;;			distinct face, if possible.
! ;;;			As of emacs 19.29, the `intangible' text property
! ;;;			is used to prevent moving into read-only fields.
! ;;;			This variable defaults to t if running Emacs 19
! ;;;			with text properties.
! ;;;			The default face to show read-write fields is
! ;;;			copied from face `region'.
! ;;;
! ;;;	forms-ro-face 				[symbol, default 'default]
! ;;;			This is the face that is used to show
! ;;;			read-only text on the screen.If used, this
! ;;;			variable should be set to a symbol that is a
! ;;;			valid face.
! ;;;			E.g.
! ;;;			  (make-face 'my-face)
! ;;;			  (setq forms-ro-face 'my-face)
! ;;;
! ;;;	forms-rw-face				[symbol, default 'region]
! ;;;			This is the face that is used to show
! ;;;			read-write text on the screen.
! ;;;
! ;;; After evaluating the control file, its buffer is cleared and used
! ;;; for further processing.
! ;;; The data file (as designated by `forms-file') is visited in a buffer
! ;;; `forms--file-buffer' which will not normally be shown.
! ;;; Great malfunctioning may be expected if this file/buffer is modified
! ;;; outside of this package while it is being visited!
! ;;;
! ;;; Normal operation is to transfer one line (record) from the data file,
! ;;; split it into fields (into `forms--the-record-list'), and display it
! ;;; using the specs in `forms-format-list'.
! ;;; A format routine `forms--format' is built upon startup to format 
! ;;; the records according to `forms-format-list'.
! ;;;
! ;;; When a form is changed the record is updated as soon as this form
! ;;; is left.  The contents of the form are parsed using information
! ;;; obtained from `forms-format-list', and the fields which are
! ;;; deduced from the form are modified.  Fields not shown on the forms
! ;;; retain their origional values.  The newly formed record then
! ;;; replaces the contents of the old record in `forms--file-buffer'.
! ;;; A parse routine `forms--parser' is built upon startup to parse
! ;;; the records.
! ;;;
! ;;; Two exit functions exist: `forms-exit' and `forms-exit-no-save'.
! ;;; `forms-exit' saves the data to the file, if modified.
! ;;; `forms-exit-no-save` does not.  However, if `forms-exit-no-save'
! ;;; is executed and the file buffer has been modified, Emacs will ask
! ;;; questions anyway.
! ;;;
! ;;; Other functions provided by forms mode are:
! ;;;
! ;;;	paging (forward, backward) by record
! ;;;	jumping (first, last, random number)
! ;;;	searching
! ;;;	creating and deleting records
! ;;;	reverting the form (NOT the file buffer)
! ;;;	switching edit <-> view mode v.v.
! ;;;	jumping from field to field
! ;;;
! ;;; As an documented side-effect: jumping to the last record in the
! ;;; file (using forms-last-record) will adjust forms--total-records if
! ;;; needed.
! ;;;
! ;;; The forms buffer can be in on eof two modes: edit mode or view
! ;;; mode.  View mode is a read-only mode, you cannot modify the
! ;;; contents of the buffer.
! ;;;
! ;;; Edit mode commands:
! ;;; 
! ;;; TAB		 forms-next-field
! ;;; \C-c TAB	 forms-next-field
! ;;; \C-c <	 forms-first-record
! ;;; \C-c >	 forms-last-record
! ;;; \C-c ?	 describe-mode
! ;;; \C-c \C-k	 forms-delete-record
! ;;; \C-c \C-q	 forms-toggle-read-only
! ;;; \C-c \C-o	 forms-insert-record
! ;;; \C-c \C-l	 forms-jump-record
! ;;; \C-c \C-n	 forms-next-record
! ;;; \C-c \C-p	 forms-prev-record
! ;;; \C-c \C-r	 forms-search-backward
! ;;; \C-c \C-s	 forms-search-forward
! ;;; \C-c \C-x	 forms-exit
! ;;; 
! ;;; Read-only mode commands:
! ;;; 
! ;;; SPC 	 forms-next-record
! ;;; DEL	 forms-prev-record
! ;;; ?	 describe-mode
! ;;; \C-q forms-toggle-read-only
! ;;; l	 forms-jump-record
! ;;; n	 forms-next-record
! ;;; p	 forms-prev-record
! ;;; r	 forms-search-backward
! ;;; s	 forms-search-forward
! ;;; x	 forms-exit
! ;;; 
! ;;; Of course, it is also possible to use the \C-c prefix to obtain the
! ;;; same command keys as in edit mode.
! ;;; 
! ;;; The following bindings are available, independent of the mode: 
! ;;; 
! ;;; [next]	  forms-next-record
! ;;; [prior]	  forms-prev-record
! ;;; [begin]	  forms-first-record
! ;;; [end]	  forms-last-record
! ;;; [S-TAB]	  forms-prev-field
! ;;; [backtab] forms-prev-field
! ;;;
! ;;; For convenience, TAB is always bound to `forms-next-field', so you
! ;;; don't need the C-c prefix for this command.
! ;;;
! ;;; As mentioned above (see `forms-forms-scroll' and `forms-forms-jump')
! ;;; the bindings of standard functions `scroll-up', `scroll-down',
! ;;; `beginning-of-buffer' and `end-of-buffer' can be locally replaced with
! ;;; forms mode functions next/prev record and first/last
! ;;; record.
! ;;;
! ;;; `local-write-file hook' is defined to save the actual data file
! ;;; instead of the buffer data, `revert-file-hook' is defined to
! ;;; revert a forms to original.
  
  ;;; Code:
--- 18,288 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
! ;; Visit a file using a form.
! ;;
! ;; === Naming conventions
! ;;
! ;; The names of all variables and functions start with 'forms-'.
! ;; Names which start with 'forms--' are intended for internal use, and
! ;; should *NOT* be used from the outside.
! ;;
! ;; All variables are buffer-local, to enable multiple forms visits 
! ;; simultaneously.
! ;; Variable `forms--mode-setup' is local to *ALL* buffers, for it 
! ;; controls if forms-mode has been enabled in a buffer.
! ;;
! ;; === How it works ===
! ;;
! ;; Forms mode means visiting a data file which is supposed to consist
! ;; of records each containing a number of fields.  The records are
! ;; separated by a newline, the fields are separated by a user-defined
! ;; field separator (default: TAB).
! ;; When shown, a record is transferred to an Emacs buffer and
! ;; presented using a user-defined form.  One record is shown at a
! ;; time.
! ;;
! ;; Forms mode is a composite mode.  It involves two files, and two
! ;; buffers.
! ;; The first file, called the control file, defines the name of the
! ;; data file and the forms format.  This file buffer will be used to
! ;; present the forms.
! ;; The second file holds the actual data.  The buffer of this file
! ;; will be buried, for it is never accessed directly.
! ;;
! ;; Forms mode is invoked using M-x forms-find-file control-file .
! ;; Alternatively `forms-find-file-other-window' can be used.
! ;;
! ;; You may also visit the control file, and switch to forms mode by hand
! ;; with M-x forms-mode .
! ;;
! ;; Automatic mode switching is supported if you specify 
! ;; "-*- forms -*-" in the first line of the control file.
! ;; 
! ;; The control file is visited, evaluated using `eval-current-buffer',
! ;; and should set at least the following variables:
! ;;
! ;;	forms-file				[string]
! ;;			The name of the data file.
! ;;
! ;;	forms-number-of-fields			[integer]
! ;;			The number of fields in each record.
! ;;
! ;;	forms-format-list			[list]
! ;;			Formatting instructions.
! ;;
! ;; `forms-format-list' should be a list, each element containing
! ;;
! ;;   - a string, e.g. "hello".  The string is inserted in the forms
! ;;	"as is".
! ;;   
! ;;   - an integer, denoting a field number.
! ;;	The contents of this field are inserted at this point.
! ;;     Fields are numbered starting with number one.
! ;;   
! ;;   - a function call, e.g. (insert "text").
! ;;	This function call is dynamically evaluated and should return a
! ;;     string.  It should *NOT* have side-effects on the forms being
! ;;     constructed.  The current fields are available to the function
! ;;     in the variable `forms-fields', they should *NOT* be modified.
! ;;   
! ;;   - a lisp symbol, that must evaluate to one of the above.
! ;;
! ;; Optional variables which may be set in the control file:
! ;;
! ;;	forms-field-sep				[string, default TAB]
! ;;			The field separator used to separate the
! ;;			fields in the data file.  It may be a string.
! ;;
! ;;	forms-read-only				[bool, default nil]
! ;;			Non-nil means that the data file is visited
! ;;			read-only (view mode) as opposed to edit mode.
! ;;			If no write access to the data file is
! ;;			possible, view mode is enforced. 
! ;;
! ;;	forms-check-number-of-fields            [bool, default t]
! ;;			If non-nil, a warning will be issued whenever
! ;;			a record is found that does not have the number
! ;;			of fields specified by `forms-number-of-fields'.
! ;;
! ;;	forms-multi-line			[string, default "^K"]
! ;;			If non-null the records of the data file may
! ;;			contain fields that can span multiple lines in
! ;;			the form.
! ;;			This variable denotes the separator character
! ;;			to be used for this purpose.  Upon display, all
! ;;			occurrences of this character are translated
! ;;			to newlines.  Upon storage they are translated
! ;;			back to the separator character.
! ;;
! ;;	forms-forms-scroll			[bool, default nil]
! ;;			Non-nil means: rebind locally the commands that
! ;;			perform `scroll-up' or `scroll-down' to use
! ;;			`forms-next-field' resp. `forms-prev-field'.
! ;;
! ;;	forms-forms-jump			[bool, default nil]
! ;;			Non-nil means: rebind locally the commands that
! ;;
! ;;	forms-insert-after			[bool, default nil]
! ;;			Non-nil means: inserts of new records go after
! ;;			current record, also initial position is at last
! ;;			record.
! ;;
! ;;	forms-read-file-filter			[symbol, default nil]
! ;;			If not nil: this should be the name of a 
! ;;			function that is called after the forms data file
! ;;			has been read.  It can be used to transform
! ;;			the contents of the file into a format more suitable
! ;;			for forms-mode processing.
! ;;
! ;;	forms-write-file-filter			[symbol, default nil]
! ;;			If not nil: this should be the name of a 
! ;;			function that is called before the forms data file
! ;;			is written (saved) to disk.  It can be used to undo
! ;;			the effects of `forms-read-file-filter', if any.
! ;;
! ;;	forms-new-record-filter			[symbol, default nil]
! ;;			If not nil: this should be the name of a 
! ;;			function that is called when a new
! ;;			record is created.  It can be used to fill in
! ;;			the new record with default fields, for example.
! ;;
! ;;	forms-modified-record-filter		[symbol, default nil]
! ;;			If not nil: this should be the name of a 
! ;;			function that is called when a record has
! ;;			been modified.  It is called after the fields
! ;;			are parsed.  It can be used to register
! ;;			modification dates, for example.
! ;;
! ;;	forms-use-text-properties		[bool, see text for default]
! ;;			This variable controls if forms mode should use
! ;;			text properties to protect the form text from being
! ;;			modified (using text-property `read-only').
! ;;			Also, the read-write fields are shown using a
! ;;			distinct face, if possible.
! ;;			As of emacs 19.29, the `intangible' text property
! ;;			is used to prevent moving into read-only fields.
! ;;			This variable defaults to t if running Emacs 19
! ;;			with text properties.
! ;;			The default face to show read-write fields is
! ;;			copied from face `region'.
! ;;
! ;;	forms-ro-face 				[symbol, default 'default]
! ;;			This is the face that is used to show
! ;;			read-only text on the screen.If used, this
! ;;			variable should be set to a symbol that is a
! ;;			valid face.
! ;;			E.g.
! ;;			  (make-face 'my-face)
! ;;			  (setq forms-ro-face 'my-face)
! ;;
! ;;	forms-rw-face				[symbol, default 'region]
! ;;			This is the face that is used to show
! ;;			read-write text on the screen.
! ;;
! ;; After evaluating the control file, its buffer is cleared and used
! ;; for further processing.
! ;; The data file (as designated by `forms-file') is visited in a buffer
! ;; `forms--file-buffer' which will not normally be shown.
! ;; Great malfunctioning may be expected if this file/buffer is modified
! ;; outside of this package while it is being visited!
! ;;
! ;; Normal operation is to transfer one line (record) from the data file,
! ;; split it into fields (into `forms--the-record-list'), and display it
! ;; using the specs in `forms-format-list'.
! ;; A format routine `forms--format' is built upon startup to format 
! ;; the records according to `forms-format-list'.
! ;;
! ;; When a form is changed the record is updated as soon as this form
! ;; is left.  The contents of the form are parsed using information
! ;; obtained from `forms-format-list', and the fields which are
! ;; deduced from the form are modified.  Fields not shown on the forms
! ;; retain their original values.  The newly formed record then
! ;; replaces the contents of the old record in `forms--file-buffer'.
! ;; A parse routine `forms--parser' is built upon startup to parse
! ;; the records.
! ;;
! ;; Two exit functions exist: `forms-exit' and `forms-exit-no-save'.
! ;; `forms-exit' saves the data to the file, if modified.
! ;; `forms-exit-no-save` does not.  However, if `forms-exit-no-save'
! ;; is executed and the file buffer has been modified, Emacs will ask
! ;; questions anyway.
! ;;
! ;; Other functions provided by forms mode are:
! ;;
! ;;	paging (forward, backward) by record
! ;;	jumping (first, last, random number)
! ;;	searching
! ;;	creating and deleting records
! ;;	reverting the form (NOT the file buffer)
! ;;	switching edit <-> view mode v.v.
! ;;	jumping from field to field
! ;;
! ;; As an documented side-effect: jumping to the last record in the
! ;; file (using forms-last-record) will adjust forms--total-records if
! ;; needed.
! ;;
! ;; The forms buffer can be in on eof two modes: edit mode or view
! ;; mode.  View mode is a read-only mode, you cannot modify the
! ;; contents of the buffer.
! ;;
! ;; Edit mode commands:
! ;; 
! ;; TAB		 forms-next-field
! ;; \C-c TAB	 forms-next-field
! ;; \C-c <	 forms-first-record
! ;; \C-c >	 forms-last-record
! ;; \C-c ?	 describe-mode
! ;; \C-c \C-k	 forms-delete-record
! ;; \C-c \C-q	 forms-toggle-read-only
! ;; \C-c \C-o	 forms-insert-record
! ;; \C-c \C-l	 forms-jump-record
! ;; \C-c \C-n	 forms-next-record
! ;; \C-c \C-p	 forms-prev-record
! ;; \C-c \C-r	 forms-search-backward
! ;; \C-c \C-s	 forms-search-forward
! ;; \C-c \C-x	 forms-exit
! ;; 
! ;; Read-only mode commands:
! ;; 
! ;; SPC 	 forms-next-record
! ;; DEL	 forms-prev-record
! ;; ?	 describe-mode
! ;; \C-q forms-toggle-read-only
! ;; l	 forms-jump-record
! ;; n	 forms-next-record
! ;; p	 forms-prev-record
! ;; r	 forms-search-backward
! ;; s	 forms-search-forward
! ;; x	 forms-exit
! ;; 
! ;; Of course, it is also possible to use the \C-c prefix to obtain the
! ;; same command keys as in edit mode.
! ;; 
! ;; The following bindings are available, independent of the mode: 
! ;; 
! ;; [next]	  forms-next-record
! ;; [prior]	  forms-prev-record
! ;; [begin]	  forms-first-record
! ;; [end]	  forms-last-record
! ;; [S-TAB]	  forms-prev-field
! ;; [backtab] forms-prev-field
! ;;
! ;; For convenience, TAB is always bound to `forms-next-field', so you
! ;; don't need the C-c prefix for this command.
! ;;
! ;; As mentioned above (see `forms-forms-scroll' and `forms-forms-jump')
! ;; the bindings of standard functions `scroll-up', `scroll-down',
! ;; `beginning-of-buffer' and `end-of-buffer' can be locally replaced with
! ;; forms mode functions next/prev record and first/last
! ;; record.
! ;;
! ;; `local-write-file hook' is defined to save the actual data file
! ;; instead of the buffer data, `revert-file-hook' is defined to
! ;; revert a forms to original.
  
  ;;; Code:
***************
*** 289,296 ****
  (provide 'forms-mode)			;;; for compatibility
  
! (defconst forms-version (substring "$Revision: 2.23 $" 11 -2)
    "The version number of forms-mode (as string).  The complete RCS id is:
  
!   $Id: forms.el,v 2.23 1995/11/16 20:04:57 jvromans Exp $")
  
  (defvar forms-mode-hooks nil
--- 293,300 ----
  (provide 'forms-mode)			;;; for compatibility
  
! (defconst forms-version (substring "$Revision: 2.29 $" 11 -2)
    "The version number of forms-mode (as string).  The complete RCS id is:
  
!   $Id: forms.el,v 2.29 1996/03/01 21:13:01 jvromans Exp $")
  
  (defvar forms-mode-hooks nil
*************** The contents may NOT be modified.")
*** 355,358 ****
--- 359,366 ----
  Defaults to t if this emacs is capable of handling text properties.")
  
+ (defvar forms-insert-after nil
+   "*Non-nil means: inserts of new records go after current record.
+ Also, initial position is at last record.")
+ 
  (defvar forms-ro-face 'default
    "The face (a symbol) that is used to display read-only text on the screen.")
*************** Commands:                        Equival
*** 463,466 ****
--- 471,475 ----
  	(make-local-variable 'forms-forms-scroll)
  	(make-local-variable 'forms-forms-jump)
+ 	(make-local-variable 'forms-insert-after)
  	(make-local-variable 'forms-use-text-properties)
  
*************** Commands:                        Equival
*** 669,674 ****
  	 "GNU Emacs Forms Mode version " forms-version "\n\n"
  	 (if (file-exists-p forms-file)
! 	     (concat "No records available in file \"" forms-file "\".\n\n")
! 	   (format "Creating new file \"%s\"\nwith %d field%s per record.\n\n"
  		   forms-file forms-number-of-fields
  		   (if (= 1 forms-number-of-fields) "" "s")))
--- 678,683 ----
  	 "GNU Emacs Forms Mode version " forms-version "\n\n"
  	 (if (file-exists-p forms-file)
! 	     (concat "No records available in file `" forms-file "'\n\n")
! 	   (format "Creating new file `%s'\nwith %d field%s per record\n\n"
  		   forms-file forms-number-of-fields
  		   (if (= 1 forms-number-of-fields) "" "s")))
*************** Commands:                        Equival
*** 685,688 ****
--- 694,701 ----
      )
  
+   (if forms-insert-after
+       (forms-last-record)
+     (forms-first-record))
+ 
    ;; user customising
    ;;(message "forms: proceeding setup (user hooks)...")
*************** Commands:                        Equival
*** 702,706 ****
    ;; `forms--parser-using-text-properties' to extract the fields data
    ;; from the form on the screen.
!   ;; Upon completion, `forms-format-list' is garanteed correct, so
    ;; `forms--make-format' and `forms--make-parser' do not need to perform
    ;; any checks.
--- 715,719 ----
    ;; `forms--parser-using-text-properties' to extract the fields data
    ;; from the form on the screen.
!   ;; Upon completion, `forms-format-list' is guaranteed correct, so
    ;; `forms--make-format' and `forms--make-parser' do not need to perform
    ;; any checks.
*************** Commands:                        Equival
*** 774,779 ****
  	  (or (fboundp (car-safe el))
  	      (error (concat "Forms format error: "
! 			     "not a function "
! 			     (prin1-to-string (car-safe el)))))
  
  	  ;; Shift.
--- 787,792 ----
  	  (or (fboundp (car-safe el))
  	      (error (concat "Forms format error: "
! 			     "not a function %S")
! 		     (car-safe el)))
  
  	  ;; Shift.
*************** Commands:                        Equival
*** 786,791 ****
  	 (t
  	  (error (concat "Forms format error: "
! 			 "invalid element "
! 			 (prin1-to-string el)))))
  
  	;; Advance to next element of the list.
--- 799,804 ----
  	 (t
  	  (error (concat "Forms format error: "
! 			 "invalid element %S")
! 		 el)))
  
  	;; Advance to next element of the list.
*************** Commands:                        Equival
*** 1279,1283 ****
      (cons "Forms" (make-sparse-keymap "Forms")))
    (define-key map [menu-bar forms menu-forms-exit]
!     '("Exit" . forms-exit))
    (define-key map [menu-bar forms menu-forms-sep1]
      '("----"))
--- 1292,1296 ----
      (cons "Forms" (make-sparse-keymap "Forms")))
    (define-key map [menu-bar forms menu-forms-exit]
!     '("Exit Forms Mode" . forms-exit))
    (define-key map [menu-bar forms menu-forms-sep1]
      '("----"))
*************** Commands:                        Equival
*** 1415,1419 ****
  (defun forms--help ()
    "Initial help for Forms mode."
!   (message (substitute-command-keys (concat
    "\\[forms-next-record]:next"
    "   \\[forms-prev-record]:prev"
--- 1428,1432 ----
  (defun forms--help ()
    "Initial help for Forms mode."
!   (message "%s" (substitute-command-keys (concat
    "\\[forms-next-record]:next"
    "   \\[forms-prev-record]:prev"
*************** As a side effect: re-calculates the numb
*** 1707,1711 ****
    "Toggles read-only mode of a forms mode buffer.
  With an argument, enables read-only mode if the argument is positive.
! Otherwise enables edit mode if the visited file is writeable."
  
    (interactive "P")
--- 1720,1724 ----
    "Toggles read-only mode of a forms mode buffer.
  With an argument, enables read-only mode if the argument is positive.
! Otherwise enables edit mode if the visited file is writable."
  
    (interactive "P")
*************** Otherwise enables edit mode if the visit
*** 1724,1728 ****
  	    (progn
  	      (setq forms-read-only t)
! 	      (message "No write access to \"%s\"" forms-file)
  	      (beep))
  	  (setq forms-read-only nil))
--- 1737,1741 ----
  	    (progn
  	      (setq forms-read-only t)
! 	      (message "No write access to `%s'" forms-file)
  	      (beep))
  	  (setq forms-read-only nil))
*************** Otherwise enables edit mode if the visit
*** 1750,1754 ****
  With ARG: store the record after the current one.
  If `forms-new-record-filter' contains the name of a function, 
! it is called to fill (some of) the fields with default values."
  
    (interactive "P")
--- 1763,1769 ----
  With ARG: store the record after the current one.
  If `forms-new-record-filter' contains the name of a function, 
! it is called to fill (some of) the fields with default values.
! If `forms-insert-after is non-nil, the default behavior is to insert
! after the current record."
  
    (interactive "P")
*************** it is called to fill (some of) the field
*** 1757,1762 ****
        (error ""))
  
!   (let ((ln (if arg (1+ forms--current-record) forms--current-record))
!         the-list the-record)
  
      (forms--checkmod)
--- 1772,1781 ----
        (error ""))
  
!   (let (ln the-list the-record)
! 
!     (if (or (and arg forms-insert-after)
! 	    (and (not arg) (not forms-insert-after)))
! 	(setq ln forms--current-record)
!       (setq ln (1+ forms--current-record)))
  
      (forms--checkmod)
*************** it is called to fill (some of) the field
*** 1833,1837 ****
  	      (progn
  		(goto-char here)
! 		(message (concat "\"" regexp "\" not found."))
  		nil)
  	    (setq the-record (forms--get-record))
--- 1852,1856 ----
  	      (progn
  		(goto-char here)
! 		(message "\"%s\" not found" regexp)
  		nil)
  	    (setq the-record (forms--get-record))
*************** it is called to fill (some of) the field
*** 1865,1869 ****
  	      (progn
  		(goto-char here)
! 		(message (concat "\"" regexp "\" not found."))
  		nil)
  	    (setq the-record (forms--get-record))
--- 1884,1888 ----
  	      (progn
  		(goto-char here)
! 		(message "\"%s\" not found" regexp)
  		nil)
  	    (setq the-record (forms--get-record))
*************** Calls `forms-write-file-filter' before w
*** 1985,1989 ****
    "Take a quoted list of symbols, and set their values to sequential numbers.
  The first symbol gets number 1, the second 2 and so on.
! It returns the higest number.
  
  Usage: (setq forms-number-of-fields
--- 2004,2008 ----
    "Take a quoted list of symbols, and set their values to sequential numbers.
  The first symbol gets number 1, the second 2 and so on.
! It returns the highest number.
  
  Usage: (setq forms-number-of-fields
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/fortran.el emacs-19.31/lisp/fortran.el
*** emacs-19.30/lisp/fortran.el	Thu Oct 26 09:30:28 1995
--- emacs-19.31/lisp/fortran.el	Sun Jan 14 02:34:30 1996
***************
*** 1,5 ****
  ;;; fortran.el --- Fortran mode for GNU Emacs
  
! ;;; Copyright (c) 1986, 1993, 1994, 1995 Free Software Foundation, Inc.
  
  ;; Author: Michael D. Prange <prange@erl.mit.edu>
--- 1,5 ----
  ;;; fortran.el --- Fortran mode for GNU Emacs
  
! ;; Copyright (c) 1986, 1993, 1994, 1995 Free Software Foundation, Inc.
  
  ;; Author: Michael D. Prange <prange@erl.mit.edu>
***************
*** 21,26 ****
  
  ;; 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:
--- 21,27 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 37,54 ****
  ;; Gary Sabot and Richard Stallman.
  
! ;;; This file may be used with GNU Emacs version 18.xx if the following
! ;;; variable and function substitutions are made.
! ;;;  Replace:
! ;;;   frame-width                           with screen-width
! ;;;   auto-fill-function                    with auto-fill-hook
! ;;;   comment-indent-function               with comment-indent-hook
! ;;;   (setq unread-command-events (list c)) with (setq unread-command-char c)
  
! ;;; Bugs to bug-fortran-mode@erl.mit.edu
! 
! (defconst fortran-mode-version "version 1.30.6")
  
  ;;; Code:
  
  ;;;###autoload
  (defvar fortran-tab-mode-default nil
--- 38,55 ----
  ;; Gary Sabot and Richard Stallman.
  
! ;; This file may be used with GNU Emacs version 18.xx if the following
! ;; variable and function substitutions are made.
! ;;  Replace:
! ;;   frame-width                           with screen-width
! ;;   auto-fill-function                    with auto-fill-hook
! ;;   comment-indent-function               with comment-indent-hook
! ;;   (setq unread-command-events (list c)) with (setq unread-command-char c)
  
! ;; Bugs to bug-fortran-mode@erl.mit.edu
  
  ;;; Code:
  
+ (defconst fortran-mode-version "version 1.30.6")
+ 
  ;;;###autoload
  (defvar fortran-tab-mode-default nil
*************** file before the end or the first `fortra
*** 1587,1589 ****
  
  ;;; fortran.el ends here
- 
--- 1588,1589 ----
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/frame.el emacs-19.31/lisp/frame.el
*** emacs-19.30/lisp/frame.el	Fri Jun 16 04:20:09 1995
--- emacs-19.31/lisp/frame.el	Tue Feb 27 19:08:44 1996
***************
*** 1,24 ****
  ;;; frame.el --- multi-frame management independent of window systems.
  
! ;;;; Copyright (C) 1993, 1994 Free Software Foundation, Inc.
  
  ;; Maintainer: FSF
  ;; Keywords: internal
  
! ;;; 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.
  
  ;;; Code:
--- 1,25 ----
  ;;; frame.el --- multi-frame management independent of window systems.
  
! ;; Copyright (C) 1993, 1994 Free Software Foundation, Inc.
  
  ;; Maintainer: FSF
  ;; Keywords: internal
  
! ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Code:
*************** These supersede the values given in `def
*** 118,122 ****
      (if (> i 0)
  	(delete-frame frame t)
!       (kill-emacs))))
  
  ;;;; Arrangement of frames at startup
--- 119,124 ----
      (if (> i 0)
  	(delete-frame frame t)
!       ;; Gildea@x.org says it is ok to ask questions before terminating.
!       (save-buffers-kill-emacs))))
  
  ;;;; Arrangement of frames at startup
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/gnus-cache.el emacs-19.31/lisp/gnus-cache.el
*** emacs-19.30/lisp/gnus-cache.el	Fri Nov  3 22:49:05 1995
--- emacs-19.31/lisp/gnus-cache.el	Sun Jan 14 02:34:30 1996
***************
*** 1,3 ****
--- 1,4 ----
  ;;; gnus-cache.el --- cache interface for Gnus
+ 
  ;; Copyright (C) 1995 Free Software Foundation, Inc.
  
***************
*** 18,23 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 174,179 ****
  
  (defun gnus-cache-enter-remove-article (article)
!   (setq gnus-cache-removeable-articles
! 	(cons article gnus-cache-removeable-articles)))
  
  (defsubst gnus-cache-possibly-remove-article 
--- 176,181 ----
  
  (defun gnus-cache-enter-remove-article (article)
!   (setq gnus-cache-removable-articles
! 	(cons article gnus-cache-removable-articles)))
  
  (defsubst gnus-cache-possibly-remove-article 
***************
*** 195,199 ****
  
  (defun gnus-cache-possibly-remove-articles ()
!   (let ((articles gnus-cache-removeable-articles)
  	(cache-articles (gnus-cache-articles-in-group gnus-newsgroup-name))
  	article)
--- 197,201 ----
  
  (defun gnus-cache-possibly-remove-articles ()
!   (let ((articles gnus-cache-removable-articles)
  	(cache-articles (gnus-cache-articles-in-group gnus-newsgroup-name))
  	article)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/gnus-cite.el emacs-19.31/lisp/gnus-cite.el
*** emacs-19.30/lisp/gnus-cite.el	Fri Nov  3 22:49:15 1995
--- emacs-19.31/lisp/gnus-cite.el	Sun Jan 14 02:34:30 1996
***************
*** 1,3 ****
--- 1,4 ----
  ;;; gnus-cite.el --- parse citations in articles for Gnus
+ 
  ;; Copyright (C) 1995 Free Software Foundation, Inc.
  
***************
*** 18,23 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** See also the documentation for `gnus-art
*** 453,462 ****
    ;;
    ;; If AFTER is non-nil, only citations after the attribution line
!   ;; will be concidered.
    ;;
    ;; If FUN is non-nil, it will be called with the arguments (WROTE
    ;; PREFIX TAG) and expected to return a regular expression.  Only
    ;; citations whose prefix matches the regular expression will be
!   ;; concidered. 
    ;; 
    ;; WROTE is the attribution line number.
--- 455,464 ----
    ;;
    ;; If AFTER is non-nil, only citations after the attribution line
!   ;; will be considered.
    ;;
    ;; If FUN is non-nil, it will be called with the arguments (WROTE
    ;; PREFIX TAG) and expected to return a regular expression.  Only
    ;; citations whose prefix matches the regular expression will be
!   ;; considered. 
    ;; 
    ;; WROTE is the attribution line number.
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/gnus-cus.el emacs-19.31/lisp/gnus-cus.el
*** emacs-19.30/lisp/gnus-cus.el	Fri Nov  3 22:49:24 1995
--- emacs-19.31/lisp/gnus-cus.el	Tue Mar 26 19:14:06 1996
***************
*** 1,5 ****
  ;;; gnus-cus.el --- User friendly customization of Gnus
  ;; Copyright (C) 1995 Free Software Foundation, Inc.
! ;;
  ;; Author: Per Abrahamsen <abraham@iesd.auc.dk>
  ;; Keywords: help, news
--- 1,6 ----
  ;;; gnus-cus.el --- User friendly customization of Gnus
+ 
  ;; Copyright (C) 1995 Free Software Foundation, Inc.
! 
  ;; Author: Per Abrahamsen <abraham@iesd.auc.dk>
  ;; Keywords: help, news
***************
*** 19,24 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 33,37 ****
  (defun gnus-make-face (color)
    ;; Create entry for face with COLOR.
!   (custom-face-lookup color nil nil nil nil nil))
  
  (defvar gnus-face-light-name-list
--- 35,39 ----
  (defun gnus-make-face (color)
    ;; Create entry for face with COLOR.
!   (custom-face-lookup color nil nil 'custom:asis 'custom:asis 'custom:asis))
  
  (defvar gnus-face-light-name-list
***************
*** 50,54 ****
    '((tag . "GNUS")
      (doc . "\
! The coffe-brewing, all singing, all dancing, kitchen sink newsreader.")
      (type . group)
      (data ((tag . "Visual")
--- 52,56 ----
    '((tag . "GNUS")
      (doc . "\
! The coffee-brewing, all singing, all dancing, kitchen sink newsreader.")
      (type . group)
      (data ((tag . "Visual")
*************** underscore will be displayed as a single
*** 126,130 ****
  technique was developed for old line printers (think about it), and is
  still in use on some newsgroups, in particular the ClariNet
! hierearchy.
  ")
  				      (type . const)
--- 128,132 ----
  technique was developed for old line printers (think about it), and is
  still in use on some newsgroups, in particular the ClariNet
! hierarchy.
  ")
  				      (type . const)
*************** used for decoding and displaying the fac
*** 154,158 ****
  				     ((tag . "Unquote Printable")
  				      (doc . "\
! Tranform MIME quoted printable into 8-bit characters.
  
  Quoted printable is often seen by strings like `=EF' where you would
--- 156,160 ----
  				     ((tag . "Unquote Printable")
  				      (doc . "\
! Transform MIME quoted printable into 8-bit characters.
  
  Quoted printable is often seen by strings like `=EF' where you would
*************** Highlight headers, signature, and button
*** 201,205 ****
  				     ((tag . "Highlight Headers")
  				      (doc . "\
! Highlight headers as specified by `Article Header Highligting'.
  ")
  				      (type . const)
--- 203,207 ----
  				     ((tag . "Highlight Headers")
  				      (doc . "\
! Highlight headers as specified by `Article Header Highlighting'.
  ")
  				      (type . const)
*************** alone.")
*** 328,363 ****
  				      (list (list "From" nil 
  						  (custom-face-lookup 
! 						   "dark blue" nil nil t t nil))
  					    (list "Subject" nil 
  						  (custom-face-lookup
! 						   "pink" nil nil t t nil))
  					    (list "Newsgroups:.*," nil
  						  (custom-face-lookup
! 						   "yellow" nil nil t t nil))
  					    (list "" 
  						  (custom-face-lookup
! 						   "cyan" nil nil t nil nil)
  						  (custom-face-lookup
  						   "forestgreen"
! 						   nil nil nil t nil))))
  				     (t
  				      (list (list "From" nil 
  						  (custom-face-lookup
  						   "RoyalBlue"
! 						   nil nil t t nil))
  					    (list "Subject" nil 
  						  (custom-face-lookup
  						   "firebrick"
! 						   nil nil t t nil))
  					    (list "Newsgroups:.*," nil
  						  (custom-face-lookup
! 						   "indianred" nil nil t t nil))
  					    (list ""
  						  (custom-face-lookup
  						   "DarkGreen"
! 						   nil nil t nil nil)
  						  (custom-face-lookup
  						   "DarkGreen"
! 						   nil nil nil t nil))))))
  		  (data ((type . repeat)
  			 (header . nil)
--- 330,366 ----
  				      (list (list "From" nil 
  						  (custom-face-lookup 
! 						   "dark blue" nil nil t t 
! 						   'custom:asis))
  					    (list "Subject" nil 
  						  (custom-face-lookup
! 						   "pink" nil nil t t 'custom:asis))
  					    (list "Newsgroups:.*," nil
  						  (custom-face-lookup
! 						   "yellow" nil nil t t 'custom:asis))
  					    (list "" 
  						  (custom-face-lookup
! 						   "cyan" nil nil t 'custom:asis 'custom:asis)
  						  (custom-face-lookup
  						   "forestgreen"
! 						   nil nil 'custom:asis t 'custom:asis))))
  				     (t
  				      (list (list "From" nil 
  						  (custom-face-lookup
  						   "RoyalBlue"
! 						   nil nil t t 'custom:asis))
  					    (list "Subject" nil 
  						  (custom-face-lookup
  						   "firebrick"
! 						   nil nil t t 'custom:asis))
  					    (list "Newsgroups:.*," nil
  						  (custom-face-lookup
! 						   "indianred" nil nil t t 'custom:asis))
  					    (list ""
  						  (custom-face-lookup
  						   "DarkGreen"
! 						   nil nil t 'custom:asis 'custom:asis)
  						  (custom-face-lookup
  						   "DarkGreen"
! 						   nil nil nil t 'custom:asis))))))
  		  (data ((type . repeat)
  			 (header . nil)
*************** Face used for highlighting the current a
*** 424,428 ****
  		 ((tag . "Summary Line Highlighting")
  		  (doc . "\
! Controls the higlighting of summary buffer lines. 
  
  Below is a list of `Form'/`Face' pairs.  When deciding how a a
--- 427,431 ----
  		 ((tag . "Summary Line Highlighting")
  		  (doc . "\
! Controls the highlighting of summary buffer lines. 
  
  Below is a list of `Form'/`Face' pairs.  When deciding how a a
*************** mark:    The article's mark.")
*** 448,477 ****
  				     ((eq gnus-background-mode 'dark)
  				      (list (cons '(= mark gnus-canceled-mark)
! 						  (custom-face-lookup "yellow" "black" nil nil nil nil))
  					    (cons '(and (> score default) 
  							(or (= mark gnus-dormant-mark)
  							    (= mark gnus-ticked-mark)))
! 						  (custom-face-lookup "pink" nil nil t nil nil))
  					    (cons '(and (< score default) 
  							(or (= mark gnus-dormant-mark)
  							    (= mark gnus-ticked-mark)))
! 						  (custom-face-lookup "pink" nil nil nil t nil))
  					    (cons '(or (= mark gnus-dormant-mark)
  						       (= mark gnus-ticked-mark))
! 						  (custom-face-lookup "pink" nil nil nil nil nil))
  
  					    (cons '(and (> score default) (= mark gnus-ancient-mark))
! 						  (custom-face-lookup "dark blue" nil nil t nil nil))
  					    (cons '(and (< score default) (= mark gnus-ancient-mark))
! 						  (custom-face-lookup "SkyBlue" nil nil nil t nil))
  					    (cons '(= mark gnus-ancient-mark)
! 						  (custom-face-lookup "SkyBlue" nil nil nil nil nil))
  
  					    (cons '(and (> score default) (= mark gnus-unread-mark))
! 						  (custom-face-lookup "white" nil nil t nil nil))
  					    (cons '(and (< score default) (= mark gnus-unread-mark))
! 						  (custom-face-lookup "white" nil nil nil t nil))
  					    (cons '(= mark gnus-unread-mark)
! 						  (custom-face-lookup "white" nil nil nil nil nil))
  
  					    (cons '(> score default) 'bold)
--- 451,480 ----
  				     ((eq gnus-background-mode 'dark)
  				      (list (cons '(= mark gnus-canceled-mark)
! 						  (custom-face-lookup "yellow" "black" nil 'custom:asis 'custom:asis 'custom:asis))
  					    (cons '(and (> score default) 
  							(or (= mark gnus-dormant-mark)
  							    (= mark gnus-ticked-mark)))
! 						  (custom-face-lookup "pink" nil nil t 'custom:asis 'custom:asis))
  					    (cons '(and (< score default) 
  							(or (= mark gnus-dormant-mark)
  							    (= mark gnus-ticked-mark)))
! 						  (custom-face-lookup "pink" nil nil 'custom:asis t 'custom:asis))
  					    (cons '(or (= mark gnus-dormant-mark)
  						       (= mark gnus-ticked-mark))
! 						  (custom-face-lookup "pink" nil nil 'custom:asis 'custom:asis 'custom:asis))
  
  					    (cons '(and (> score default) (= mark gnus-ancient-mark))
! 						  (custom-face-lookup "dark blue" nil nil t 'custom:asis 'custom:asis))
  					    (cons '(and (< score default) (= mark gnus-ancient-mark))
! 						  (custom-face-lookup "SkyBlue" nil nil 'custom:asis t 'custom:asis))
  					    (cons '(= mark gnus-ancient-mark)
! 						  (custom-face-lookup "SkyBlue" nil nil 'custom:asis 'custom:asis 'custom:asis))
  
  					    (cons '(and (> score default) (= mark gnus-unread-mark))
! 						  (custom-face-lookup "white" nil nil t 'custom:asis 'custom:asis))
  					    (cons '(and (< score default) (= mark gnus-unread-mark))
! 						  (custom-face-lookup "white" nil nil 'custom:asis t 'custom:asis))
  					    (cons '(= mark gnus-unread-mark)
! 						  (custom-face-lookup "white" nil nil 'custom:asis 'custom:asis 'custom:asis))
  
  					    (cons '(> score default) 'bold)
*************** mark:    The article's mark.")
*** 479,509 ****
  				     (t
  				      (list (cons '(= mark gnus-canceled-mark)
! 						  (custom-face-lookup "yellow" "black" nil nil nil nil))
  					    (cons '(and (> score default) 
  							(or (= mark gnus-dormant-mark)
  							    (= mark gnus-ticked-mark)))
! 						  (custom-face-lookup "firebrick" nil nil t nil nil))
  					    (cons '(and (< score default) 
  							(or (= mark gnus-dormant-mark)
  							    (= mark gnus-ticked-mark)))
! 						  (custom-face-lookup "firebrick" nil nil nil t nil))
  					    (cons '(or (= mark gnus-dormant-mark)
  						       (= mark gnus-ticked-mark))
! 						  (custom-face-lookup "firebrick" nil nil nil nil nil))
  
  					    (cons '(and (> score default) (= mark gnus-ancient-mark))
! 						  (custom-face-lookup "RoyalBlue" nil nil t nil nil))
  					    (cons '(and (< score default) (= mark gnus-ancient-mark))
! 						  (custom-face-lookup "RoyalBlue" nil nil nil t nil))
  					    (cons '(= mark gnus-ancient-mark)
! 						  (custom-face-lookup "RoyalBlue" nil nil nil nil nil))
  
  					    (cons '(and (> score default) (/= mark gnus-unread-mark))
! 						  (custom-face-lookup "DarkGreen" nil nil t nil nil))
  					    (cons '(and (< score default) (/= mark gnus-unread-mark))
! 						  (custom-face-lookup "DarkGreen" nil nil nil t nil))
  					    (cons '(/= mark gnus-unread-mark)
! 						  (custom-face-lookup "DarkGreen" nil nil nil nil nil))
! 
  					    (cons '(> score default) 'bold)
  					    (cons '(< score default) 'italic)))))
--- 482,511 ----
  				     (t
  				      (list (cons '(= mark gnus-canceled-mark)
! 						  (custom-face-lookup "yellow" "black" nil 'custom:asis 'custom:asis 'custom:asis))
  					    (cons '(and (> score default) 
  							(or (= mark gnus-dormant-mark)
  							    (= mark gnus-ticked-mark)))
! 						  (custom-face-lookup "firebrick" nil nil t 'custom:asis 'custom:asis))
  					    (cons '(and (< score default) 
  							(or (= mark gnus-dormant-mark)
  							    (= mark gnus-ticked-mark)))
! 						  (custom-face-lookup "firebrick" nil nil 'custom:asis t 'custom:asis))
  					    (cons '(or (= mark gnus-dormant-mark)
  						       (= mark gnus-ticked-mark))
! 						  (custom-face-lookup "firebrick" nil nil 'custom:asis 'custom:asis 'custom:asis))
  
  					    (cons '(and (> score default) (= mark gnus-ancient-mark))
! 						  (custom-face-lookup "RoyalBlue" nil nil t 'custom:asis 'custom:asis))
  					    (cons '(and (< score default) (= mark gnus-ancient-mark))
! 						  (custom-face-lookup "RoyalBlue" nil nil 'custom:asis t 'custom:asis))
  					    (cons '(= mark gnus-ancient-mark)
! 						  (custom-face-lookup "RoyalBlue" nil nil 'custom:asis 'custom:asis 'custom:asis))
  
  					    (cons '(and (> score default) (/= mark gnus-unread-mark))
! 						  (custom-face-lookup "DarkGreen" nil nil t 'custom:asis 'custom:asis))
  					    (cons '(and (< score default) (/= mark gnus-unread-mark))
! 						  (custom-face-lookup "DarkGreen" nil nil 'custom:asis t 'custom:asis))
  					    (cons '(/= mark gnus-unread-mark)
! 						  (custom-face-lookup "DarkGreen" nil nil 'custom:asis 'custom:asis 'custom:asis))
  					    (cons '(> score default) 'bold)
  					    (cons '(< score default) 'italic)))))
*************** mark:    The article's mark.")
*** 525,529 ****
  
  (defun gnus-custom-import-cite-face-list (custom alist)
!   ;; Backward compatible groking of light and dark.
    (cond ((eq alist 'light)
  	 (setq alist (mapcar 'gnus-make-face gnus-face-light-name-list)))
--- 527,531 ----
  
  (defun gnus-custom-import-cite-face-list (custom alist)
!   ;; Backward compatible grokking of light and dark.
    (cond ((eq alist 'light)
  	 (setq alist (mapcar 'gnus-make-face gnus-face-light-name-list)))
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/gnus-edit.el emacs-19.31/lisp/gnus-edit.el
*** emacs-19.30/lisp/gnus-edit.el	Fri Nov  3 22:49:37 1995
--- emacs-19.31/lisp/gnus-edit.el	Sun Jan 14 02:34:30 1996
***************
*** 1,11 ****
  ;;; gnus-edit.el --- Gnus SCORE file editing
  ;; Copyright (C) 1995 Free Software Foundation, Inc.
! ;;
  ;; Author: Per Abrahamsen <abraham@iesd.auc.dk>
  ;; Keywords: news, help
  ;; Version: 0.2
  
  ;;; Commentary:
! ;;
  ;; Type `M-x gnus-score-customize RET' to invoke.
  
--- 1,29 ----
  ;;; gnus-edit.el --- Gnus SCORE file editing
+ 
  ;; Copyright (C) 1995 Free Software Foundation, Inc.
! 
  ;; Author: Per Abrahamsen <abraham@iesd.auc.dk>
  ;; Keywords: news, help
  ;; Version: 0.2
  
+ ;; 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, Inc., 59 Temple Place - Suite 330,
+ ;; Boston, MA 02111-1307, USA.
+ 
  ;;; Commentary:
! 
  ;; Type `M-x gnus-score-customize RET' to invoke.
  
*************** field."))
*** 269,273 ****
  When you have finished reading a group GNUS can automatically create
  new score entries based on which articles you read and which you
! skipped.  This is normally controled by the two global variables
  `gnus-use-adaptive-scoring' and `gnus-default-adaptive-score-alist',
  The first determines whether adaptive scoring should be enabled or
--- 287,291 ----
  When you have finished reading a group GNUS can automatically create
  new score entries based on which articles you read and which you
! skipped.  This is normally controlled by the two global variables
  `gnus-use-adaptive-scoring' and `gnus-default-adaptive-score-alist',
  The first determines whether adaptive scoring should be enabled or
*************** not, while the second determines what sc
*** 276,280 ****
  You can overwrite the setting of `gnus-use-adaptive-scoring' by
  selecting `Enable' or `Disable' by pressing the `Adapt' button.
! Selecting `Custom' will allow you to specify the exact adaption
  rules (overwriting `gnus-default-adaptive-score-alist').")
  	   (type . choice)
--- 294,298 ----
  You can overwrite the setting of `gnus-use-adaptive-scoring' by
  selecting `Enable' or `Disable' by pressing the `Adapt' button.
! Selecting `Custom' will allow you to specify the exact adaptation
  rules (overwriting `gnus-default-adaptive-score-alist').")
  	   (type . choice)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/gnus-ems.el emacs-19.31/lisp/gnus-ems.el
*** emacs-19.30/lisp/gnus-ems.el	Fri Nov  3 22:49:49 1995
--- emacs-19.31/lisp/gnus-ems.el	Sun Apr 21 11:23:13 1996
***************
*** 1,3 ****
--- 1,4 ----
  ;;; gnus-ems.el --- functions for making Gnus work under different Emacsen
+ 
  ;; Copyright (C) 1995 Free Software Foundation, Inc.
  
***************
*** 18,26 ****
  
  ;; 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:
  
  ;;; Code:
  
--- 19,37 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
+ ;;; This file has been censored by the Communications Decency Act.
+ ;;; That law was passed under the guise of a ban on pornography, but
+ ;;; it bans far more than that.  This file did not contain pornography,
+ ;;; but it was censored nonetheless.
+ 
+ ;;; For information on US government censorship of the Internet, and
+ ;;; what you can do to bring back freedom of the press, see the web
+ ;;; site http://www.vtw.org/
+ 
  ;;; Code:
  
*************** pounce directly on the real variables th
*** 206,211 ****
  	(setq mode-motion-hook 'mode-motion-highlight-line)))
  
!      ((and (not (string-match "28.9" emacs-version)) 
! 	   (not (string-match "29" emacs-version)))
        ;; Remove the `intangible' prop.
        (let ((props (and (boundp 'gnus-hidden-properties) 
--- 217,221 ----
  	(setq mode-motion-hook 'mode-motion-highlight-line)))
  
!      ((< emacs-minor-version 30)
        ;; Remove the `intangible' prop.
        (let ((props (and (boundp 'gnus-hidden-properties) 
*************** NOTE: This command only works with newsg
*** 363,367 ****
  	b)
      (or (gnus-summary-goto-subject article)
! 	(error (format "No such article: %d" article)))
      (or gnus-newsgroup-headers-hashtb-by-number
  	(gnus-make-headers-hashtable-by-number))
--- 373,377 ----
  	b)
      (or (gnus-summary-goto-subject article)
! 	(error "No such article: %d" article))
      (or gnus-newsgroup-headers-hashtb-by-number
  	(gnus-make-headers-hashtable-by-number))
*************** NOTE: This command only works with newsg
*** 413,420 ****
  			  'gnus-level 0
  			  'gnus-pseudo (car pslist)))
! 	  ;; Fucking XEmacs redisplay bug with truncated lines.
  	  (goto-char b)
  	  (sit-for 0)
! 	  ;; Grumble.. Fucking XEmacs stickyness of text properties.
  	  (remove-text-properties
  	   (1+ b) (1+ (gnus-point-at-eol))
--- 423,430 ----
  			  'gnus-level 0
  			  'gnus-pseudo (car pslist)))
! 	  ;; Fire-trucking XEmacs redisplay bug with truncated lines.
  	  (goto-char b)
  	  (sit-for 0)
! 	  ;; Grumble.. fire-trucking XEmacs stickiness of text properties.
  	  (remove-text-properties
  	   (1+ b) (1+ (gnus-point-at-eol))
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/gnus-kill.el emacs-19.31/lisp/gnus-kill.el
*** emacs-19.30/lisp/gnus-kill.el	Fri Nov  3 22:49:59 1995
--- emacs-19.31/lisp/gnus-kill.el	Thu Feb 15 10:54:19 1996
***************
*** 1,3 ****
--- 1,4 ----
  ;;; gnus-kill.el --- kill commands for Gnus
+ 
  ;; Copyright (C) 1995 Free Software Foundation, Inc.
  
***************
*** 19,24 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** If NEWSGROUP is nil, the global kill fil
*** 214,218 ****
  (defun gnus-kill-file-kill-by-thread ()
    "Kill by author."
!   (interactive "p")
    (gnus-kill-file-enter-kill
     "References" 
--- 216,220 ----
  (defun gnus-kill-file-kill-by-thread ()
    "Kill by author."
!   (interactive)
    (gnus-kill-file-enter-kill
     "References" 
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/gnus-mh.el emacs-19.31/lisp/gnus-mh.el
*** emacs-19.30/lisp/gnus-mh.el	Fri Nov  3 22:50:08 1995
--- emacs-19.31/lisp/gnus-mh.el	Sun Jan 14 02:34:30 1996
***************
*** 1,3 ****
--- 1,4 ----
  ;;; gnus-mh.el --- mh-e interface for Gnus
+ 
  ;; Copyright (C) 1994,95 Free Software Foundation, Inc.
  
***************
*** 19,24 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/gnus-msg.el emacs-19.31/lisp/gnus-msg.el
*** emacs-19.30/lisp/gnus-msg.el	Fri Nov  3 22:50:22 1995
--- emacs-19.31/lisp/gnus-msg.el	Tue Feb 20 14:21:02 1996
***************
*** 1,3 ****
--- 1,4 ----
  ;;; gnus-msg.el --- mail and post interface for Gnus
+ 
  ;; Copyright (C) 1995 Free Software Foundation, Inc.
  
***************
*** 19,24 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** header line with the old Message-ID."
*** 410,413 ****
--- 412,416 ----
  			       nil gnus-article-copy)))))
  
+ ;;;###autoload
  (defun gnus-post-news (post &optional group header article-buffer yank subject)
    "Begin editing a new USENET news article to be posted.
*************** will attempt to use the foreign server t
*** 580,584 ****
  
  	;; Correct newsgroups field: change sequence of spaces to comma and 
! 	;; eliminate spaces around commas.  Eliminate imbedded line breaks.
  	(goto-char (point-min))
  	(if (re-search-forward "^Newsgroups: +" nil t)
--- 583,587 ----
  
  	;; Correct newsgroups field: change sequence of spaces to comma and 
! 	;; eliminate spaces around commas.  Eliminate embedded line breaks.
  	(goto-char (point-min))
  	(if (re-search-forward "^Newsgroups: +" nil t)
*************** Headers in `gnus-required-headers' will 
*** 1134,1148 ****
      (let ((from (mail-fetch-field "from"))
  	  (sender (mail-fetch-field "sender")))
!       (if (and from 
  	       (not (string=
! 		     (downcase (car (gnus-extract-address-components from)))
  		     (downcase (gnus-inews-real-user-address))))
  	       (or (null sender)
! 		   (not 
  		    (string=
! 		     (downcase (car (gnus-extract-address-components sender)))
  		     (downcase (gnus-inews-real-user-address))))))
  	  (progn
! 	    (goto-char (point-min))    
  	    (and (re-search-forward "^Sender:" nil t)
  		 (progn
--- 1137,1153 ----
      (let ((from (mail-fetch-field "from"))
  	  (sender (mail-fetch-field "sender")))
!       (if (and from
  	       (not (string=
! 		     (downcase
! 		      (car (cdr (gnus-extract-address-components from))))
  		     (downcase (gnus-inews-real-user-address))))
  	       (or (null sender)
! 		   (not
  		    (string=
! 		     (downcase
! 		      (car (cdr (gnus-extract-address-components sender))))
  		     (downcase (gnus-inews-real-user-address))))))
  	  (progn
! 	    (goto-char (point-min))
  	    (and (re-search-forward "^Sender:" nil t)
  		 (progn
*************** domain is undefined, the domain name is 
*** 1353,1357 ****
  ;; or string boundary), or modify the newsreader name to "Ding".
  (defun gnus-inews-unique-id ()
!   ;; Dont use microseconds from (current-time), they may be unsupported.
    ;; Instead we use this randomly inited counter.
    (setq gnus-unique-id-char
--- 1358,1362 ----
  ;; or string boundary), or modify the newsreader name to "Ding".
  (defun gnus-inews-unique-id ()
!   ;; Don't use microseconds from (current-time), they may be unsupported.
    ;; Instead we use this randomly inited counter.
    (setq gnus-unique-id-char
*************** mailer."
*** 1558,1562 ****
  
  	(auto-save-mode auto-save-default)
! 	(use-local-map (copy-keymap mail-mode-map))
  	(local-set-key "\C-c\C-c" 'gnus-mail-send-and-exit)
  
--- 1563,1567 ----
  
  	(auto-save-mode auto-save-default)
! 	(use-local-map (copy-keymap (current-local-map)))
  	(local-set-key "\C-c\C-c" 'gnus-mail-send-and-exit)
  
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/gnus-score.el emacs-19.31/lisp/gnus-score.el
*** emacs-19.30/lisp/gnus-score.el	Fri Nov  3 22:50:39 1995
--- emacs-19.31/lisp/gnus-score.el	Sun Jan 14 02:34:30 1996
***************
*** 1,3 ****
--- 1,4 ----
  ;;; gnus-score.el --- scoring code for Gnus
+ 
  ;; Copyright (C) 1995 Free Software Foundation, Inc.
  
***************
*** 19,24 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** SCORE is the score to add."
*** 911,915 ****
                  (progn
                    ;; Insert the line, with a text property on the
!                   ;; terminating newline refering to the articles with
                    ;; this line.
                    (insert last ?\n)
--- 913,917 ----
                  (progn
                    ;; Insert the line, with a text property on the
!                   ;; terminating newline referring to the articles with
                    ;; this line.
                    (insert last ?\n)
*************** SCORE is the score to add."
*** 1253,1257 ****
  (defun gnus-score-string (score-list header now expire &optional trace)
    ;; Score ARTICLES according to HEADER in SCORE-LIST.
!   ;; Update matches entries to NOW and remove unmatched entried older
    ;; than EXPIRE.
    
--- 1255,1259 ----
  (defun gnus-score-string (score-list header now expire &optional trace)
    ;; Score ARTICLES according to HEADER in SCORE-LIST.
!   ;; Update matching entries to NOW and remove unmatched entries older
    ;; than EXPIRE.
    
*************** SCORE is the score to add."
*** 1282,1286 ****
  	    (progn
  	      ;; Insert the line, with a text property on the
! 	      ;; terminating newline refering to the articles with
  	      ;; this line.
  	      (insert last ?\n)
--- 1284,1288 ----
  	    (progn
  	      ;; Insert the line, with a text property on the
! 	      ;; terminating newline referring to the articles with
  	      ;; this line.
  	      (insert last ?\n)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/gnus-uu.el emacs-19.31/lisp/gnus-uu.el
*** emacs-19.30/lisp/gnus-uu.el	Fri Nov  3 22:51:01 1995
--- emacs-19.31/lisp/gnus-uu.el	Sun Jan 14 02:34:30 1996
***************
*** 1,3 ****
--- 1,4 ----
  ;;; gnus-uu.el --- extract (uu)encoded files in Gnus
+ 
  ;; Copyright (C) 1985,86,87,93,94,95 Free Software Foundation, Inc.
  
***************
*** 20,25 ****
  
  ;; 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:
--- 21,27 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** Default is \"/tmp/\".")
*** 181,185 ****
  
  (defvar gnus-uu-do-not-unpack-archives nil 
!   "*Non-nil means that gnus-uu won't peek inside archives looking for files to dispay. 
  Default is nil.")
  
--- 183,187 ----
  
  (defvar gnus-uu-do-not-unpack-archives nil 
!   "*Non-nil means that gnus-uu won't peek inside archives looking for files to display. 
  Default is nil.")
  
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/gnus-vis.el emacs-19.31/lisp/gnus-vis.el
*** emacs-19.30/lisp/gnus-vis.el	Fri Nov  3 22:51:14 1995
--- emacs-19.31/lisp/gnus-vis.el	Sun Jan 14 02:34:30 1996
***************
*** 1,3 ****
--- 1,4 ----
  ;;; gnus-vis.el --- display-oriented parts of Gnus
+ 
  ;; Copyright (C) 1995 Free Software Foundation, Inc.
  
***************
*** 19,24 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/gnus-vm.el emacs-19.31/lisp/gnus-vm.el
*** emacs-19.30/lisp/gnus-vm.el	Fri Nov  3 22:51:24 1995
--- emacs-19.31/lisp/gnus-vm.el	Sun Jan 14 02:34:30 1996
***************
*** 1,3 ****
--- 1,4 ----
  ;;; gnus-vm.el --- vm interface for Gnus
+ 
  ;; Copyright (C) 1994,95 Free Software Foundation, Inc.
  
***************
*** 18,23 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/gnus.el emacs-19.31/lisp/gnus.el
*** emacs-19.30/lisp/gnus.el	Fri Nov 17 20:50:31 1995
--- emacs-19.31/lisp/gnus.el	Thu Apr 18 15:36:06 1996
***************
*** 1,4 ****
  ;;; gnus.el --- a newsreader for GNU Emacs
! ;; Copyright (C) 1987,88,89,90,93,94,95 Free Software Foundation, Inc.
  
  ;; Author: Masanobu UMEDA <umerin@flab.flab.fujitsu.junet>
--- 1,5 ----
  ;;; gnus.el --- a newsreader for GNU Emacs
! 
! ;; Copyright (C) 1987,88,89,90,93,94,95,96 Free Software Foundation, Inc.
  
  ;; Author: Masanobu UMEDA <umerin@flab.flab.fujitsu.junet>
***************
*** 19,24 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** beginning of a line.")
*** 709,712 ****
--- 711,717 ----
  	      (if gnus-carpal [summary-carpal 4]) 
  	      [article 1.0]))
+     (pipe ([summary 0.25 point] 
+ 	   (if gnus-carpal [summary-carpal 4]) 
+ 	   [pipe 1.0]))
      (server ([server 1.0 point]
  	     (if gnus-carpal [server-carpal 2])))
*************** beginning of a line.")
*** 737,741 ****
    "Window configuration for all possible Gnus buffers.
  This variable is a list of lists.  Each of these lists has a NAME and
! a RULE.  The NAMEs are commonsense names like `group', which names a
  rule used when displaying the group buffer; `summary', which names a
  rule for what happens when you enter a group and do not display an
--- 742,746 ----
    "Window configuration for all possible Gnus buffers.
  This variable is a list of lists.  Each of these lists has a NAME and
! a RULE.  The NAMEs are common-sense names like `group', which names a
  rule used when displaying the group buffer; `summary', which names a
  rule for what happens when you enter a group and do not display an
*************** buffer configuration.")
*** 756,759 ****
--- 761,765 ----
      (server . gnus-server-buffer)
      (browse . "*Gnus Browse Server*")
+     (pipe . "*Shell Command Output*")
      (edit-group . gnus-group-edit-buffer)
      (edit-server . gnus-server-edit-buffer)
*************** with some simple extensions.
*** 974,984 ****
  %S  The subject")
  
! (defvar gnus-summary-mode-line-format "Gnus  %G/%A %Z"
    "*The format specification for the summary mode line.")
  
! (defvar gnus-article-mode-line-format "Gnus  %G/%A %S"
    "*The format specification for the article mode line.")
  
! (defvar gnus-group-mode-line-format "Gnus  List of groups   {%M:%S}  "
    "*The format specification for the group mode line.")
  
--- 980,990 ----
  %S  The subject")
  
! (defvar gnus-summary-mode-line-format "Gnus: %b [%A] %Z"
    "*The format specification for the summary mode line.")
  
! (defvar gnus-article-mode-line-format "Gnus: %b %S"
    "*The format specification for the article mode line.")
  
! (defvar gnus-group-mode-line-format "Gnus: %b {%M:%S}  "
    "*The format specification for the group mode line.")
  
*************** If this variable is nil, screen refresh 
*** 1014,1018 ****
  
  ;; Added by Keinonen Kari <kk85613@cs.tut.fi>.
! (defvar gnus-mode-non-string-length 21
    "*Max length of mode-line non-string contents.
  If this is nil, Gnus will take space as is needed, leaving the rest
--- 1020,1024 ----
  
  ;; Added by Keinonen Kari <kk85613@cs.tut.fi>.
! (defvar gnus-mode-non-string-length nil
    "*Max length of mode-line non-string contents.
  If this is nil, Gnus will take space as is needed, leaving the rest
*************** It is meant to be used for highlighting 
*** 1195,1198 ****
--- 1201,1207 ----
  is not run if `gnus-visual' is nil.")
  
+ (defun gnus-parse-headers-hook nil
+   "*A hook called before parsing the headers.")
+ 
  (defvar gnus-exit-group-hook nil
    "*A hook called when exiting (not quitting) summary mode.")
*************** variable (string, integer, character, et
*** 1337,1340 ****
--- 1346,1350 ----
  	(list ?e 'unselected ?d)
  	(list ?u 'user-defined ?s)
+ 	(list ?b 'buffer-name ?s)
  	(list ?s '(gnus-current-score-file-nondirectory) ?s)))
  
*************** variable (string, integer, character, et
*** 1342,1345 ****
--- 1352,1356 ----
    (list (list ?S 'news-server ?s)
  	(list ?M 'news-method ?s)
+ 	(list ?b '(buffer-name) ?s)
  	(list ?u 'user-defined ?s)))
  
*************** gnus-newsrc-hashtb should be kept so tha
*** 1518,1522 ****
  (defvar rmail-default-rmail-file)
  
! (defvar gnus-cache-removeable-articles nil)
  
  (defconst gnus-summary-local-variables 
--- 1529,1533 ----
  (defvar rmail-default-rmail-file)
  
! (defvar gnus-cache-removable-articles nil)
  
  (defconst gnus-summary-local-variables 
*************** gnus-newsrc-hashtb should be kept so tha
*** 1541,1545 ****
      gnus-newsgroup-history gnus-newsgroup-ancient
      (gnus-newsgroup-adaptive . gnus-use-adaptive-scoring)
!     gnus-cache-removeable-articles)
    "Variables that are buffer-local to the summary buffers.")
  
--- 1552,1556 ----
      gnus-newsgroup-history gnus-newsgroup-ancient
      (gnus-newsgroup-adaptive . gnus-use-adaptive-scoring)
!     gnus-cache-removable-articles)
    "Variables that are buffer-local to the summary buffers.")
  
*************** Thank you for your help in stamping out 
*** 1841,1845 ****
  ;; (eval '(gnus-read-init-file 'inhibit))
  
! ;;; Load the compatability functions. 
  
  (require 'gnus-cus)
--- 1852,1856 ----
  ;; (eval '(gnus-read-init-file 'inhibit))
  
! ;;; Load the compatibility functions. 
  
  (require 'gnus-cus)
*************** the first newsgroup."
*** 2257,2261 ****
  (defun gnus-newsgroup-directory-form (newsgroup)
    "Make hierarchical directory name from NEWSGROUP name."
!   (let ((newsgroup (gnus-newsgroup-saveable-name newsgroup))
  	(len (length newsgroup))
  	idx)
--- 2268,2272 ----
  (defun gnus-newsgroup-directory-form (newsgroup)
    "Make hierarchical directory name from NEWSGROUP name."
!   (let ((newsgroup (gnus-newsgroup-savable-name newsgroup))
  	(len (length newsgroup))
  	idx)
*************** the first newsgroup."
*** 2272,2276 ****
      newsgroup))
  
! (defun gnus-newsgroup-saveable-name (group)
    ;; Replace any slashes in a group name (eg. an ange-ftp nndoc group)
    ;; with dots.
--- 2283,2287 ----
      newsgroup))
  
! (defun gnus-newsgroup-savable-name (group)
    ;; Replace any slashes in a group name (eg. an ange-ftp nndoc group)
    ;; with dots.
*************** If optional argument RE-ONLY is non-nil,
*** 2526,2530 ****
  
  	;; Go through the rules and eval the elements that are to be
! 	;; evaled.  
  	(while hor
  	  (if (setq val (if (vectorp (car hor)) (car hor) (eval (car hor))))
--- 2537,2541 ----
  
  	;; Go through the rules and eval the elements that are to be
! 	;; evalled.  
  	(while hor
  	  (if (setq val (if (vectorp (car hor)) (car hor) (eval (car hor))))
*************** If optional argument RE-ONLY is non-nil,
*** 2564,2568 ****
  	      hor (car rule))
  
! 	;; We then go through these heighs and create windows for them.
  	(while heights
  	  (setq height (car heights)
--- 2575,2579 ----
  	      hor (car rule))
  
! 	;; We then go through these heights and create windows for them.
  	(while heights
  	  (setq height (car heights)
*************** If optional argument RE-ONLY is non-nil,
*** 2597,2601 ****
    (let (invisible hor jump-buffer val buffer)
      ;; Go through the rules and eval the elements that are to be
!     ;; evaled.  
      (while (and rule (not invisible))
        (setq hor (car rule)
--- 2608,2612 ----
    (let (invisible hor jump-buffer val buffer)
      ;; Go through the rules and eval the elements that are to be
!     ;; evalled.  
      (while (and rule (not invisible))
        (setq hor (car rule)
*************** that that variable is buffer-local to th
*** 2819,2823 ****
    (if (<= level gnus-verbose)
        (apply 'message args)
!     ;; We have to do this format thingie here even if the result isn't
      ;; shown - the return value has to be the same as the return value
      ;; from `message'.
--- 2830,2834 ----
    (if (<= level gnus-verbose)
        (apply 'message args)
!     ;; We have to do this format thingy here even if the result isn't
      ;; shown - the return value has to be the same as the return value
      ;; from `message'.
*************** that that variable is buffer-local to th
*** 2840,2843 ****
--- 2851,2864 ----
    (nth 1 (assoc 'quit-config (gnus-find-method-for-group group))))
  
+ (defun gnus-simplify-mode-line ()
+   "Make mode lines a bit simpler."
+   (setq mode-line-modified "-- ")
+   (if (listp mode-line-format)
+       (progn
+ 	(make-local-variable 'mode-line-format)
+ 	(setq mode-line-format (copy-sequence mode-line-format))
+ 	(and (equal (nth 3 mode-line-format) "   ")
+ 	     (setcar (nthcdr 3 mode-line-format) "")))))
+ 
  ;;; List and range functions
  
*************** Note: LIST has to be sorted over `<'."
*** 3076,3079 ****
--- 3097,3101 ----
  (defvar gnus-group-mark-map nil)
  (defvar gnus-group-list-map nil)
+ (defvar gnus-group-help-map nil)
  (defvar gnus-group-sub-map nil)
  (put 'gnus-group-mode 'mode-class 'special)
*************** Note: LIST has to be sorted over `<'."
*** 3132,3136 ****
    (define-key gnus-group-mode-map "q" 'gnus-group-exit)
    (define-key gnus-group-mode-map "Q" 'gnus-group-quit)
-   (define-key gnus-group-mode-map "\M-f" 'gnus-group-fetch-faq)
    (define-key gnus-group-mode-map "?" 'gnus-group-describe-briefly)
    (define-key gnus-group-mode-map "\C-c\C-i" 'gnus-info-find-node)
--- 3154,3157 ----
*************** Note: LIST has to be sorted over `<'."
*** 3182,3185 ****
--- 3203,3210 ----
    (define-key gnus-group-list-map "M" 'gnus-group-list-all-matching)
  
+   (define-prefix-command 'gnus-group-help-map)
+   (define-key gnus-group-mode-map "H" 'gnus-group-help-map)
+   (define-key gnus-group-help-map "f" 'gnus-group-fetch-faq)
+ 
    (define-prefix-command 'gnus-group-sub-map)
    (define-key gnus-group-mode-map "S" 'gnus-group-sub-map)
*************** The following commands are available:
*** 3212,3220 ****
    (if gnus-visual (gnus-group-make-menu-bar))
    (kill-all-local-variables)
!   (setq mode-line-modified "-- ")
!   (make-local-variable 'mode-line-format)
!   (setq mode-line-format (copy-sequence mode-line-format))
!   (and (equal (nth 3 mode-line-format) "   ")
!        (setcar (nthcdr 3 mode-line-format) ""))
    (setq major-mode 'gnus-group-mode)
    (setq mode-name "Group")
--- 3237,3241 ----
    (if gnus-visual (gnus-group-make-menu-bar))
    (kill-all-local-variables)
!   (gnus-simplify-mode-line)
    (setq major-mode 'gnus-group-mode)
    (setq mode-name "Group")
*************** As opposed to `gnus', this command will 
*** 3266,3269 ****
--- 3287,3295 ----
  
  ;;;###autoload
+ (defun read-news (&optional arg dont-connect)
+   "Read network news.  This is an alias for the `gnus' command."
+   (gnus arg dont-connect))
+ 
+ ;;;###autoload
  (defun gnus (&optional arg dont-connect)
    "Read network news.
*************** listed." 
*** 3446,3450 ****
  	  (gnus-group-search-forward nil nil nil t)
  	;; Find the right group to put point on. If the current group
! 	;; has disapeared in the new listing, try to find the next
  	;; one. If no next one can be found, just leave point at the
  	;; first newsgroup in the buffer.
--- 3472,3476 ----
  	  (gnus-group-search-forward nil nil nil t)
  	;; Find the right group to put point on. If the current group
! 	;; has disappeared in the new listing, try to find the next
  	;; one. If no next one can be found, just leave point at the
  	;; first newsgroup in the buffer.
*************** If REGEXP, only list groups matching REG
*** 3490,3494 ****
  		   (eq unread t)	; We list unactivated groups
  		   (> unread 0)		; We list groups with unread articles
! 		   (cdr (assq 'tick (nth 3 info)))) ; And groups with tickeds
  	       (gnus-group-insert-group-line 
  		nil group (car (cdr info)) (nth 3 info) unread (nth 4 info)))))
--- 3516,3520 ----
  		   (eq unread t)	; We list unactivated groups
  		   (> unread 0)		; We list groups with unread articles
! 		   (cdr (assq 'tick (nth 3 info)))) ; And ticked groups
  	       (gnus-group-insert-group-line 
  		nil group (car (cdr info)) (nth 3 info) unread (nth 4 info)))))
*************** If REGEXP, only list groups matching REG
*** 3510,3514 ****
  
  (defun gnus-group-prepare-flat-list-dead (groups level mark regexp)
!   ;; List zombies and killed lists somehwat faster, which was
    ;; suggested by Jack Vinson <vinson@unagi.cis.upenn.edu>. It does
    ;; this by ignoring the group format specification altogether.
--- 3536,3540 ----
  
  (defun gnus-group-prepare-flat-list-dead (groups level mark regexp)
!   ;; List zombies and killed lists somewhat faster, which was
    ;; suggested by Jack Vinson <vinson@unagi.cis.upenn.edu>. It does
    ;; this by ignoring the group format specification altogether.
*************** If REGEXP, only list groups matching REG
*** 3573,3577 ****
        (or entry
  	  (error "Trying to change non-existent group %s" method-only-group))
!       ;; We have recevied parts of the actual group info - either the
        ;; select method or the group parameters.  We first check
        ;; whether we have to extend the info, and if so, do that.
--- 3599,3603 ----
        (or entry
  	  (error "Trying to change non-existent group %s" method-only-group))
!       ;; We have received parts of the actual group info - either the
        ;; select method or the group parameters.  We first check
        ;; whether we have to extend the info, and if so, do that.
*************** If VISIBLE-ONLY is non-nil, the group wo
*** 3781,3784 ****
--- 3807,3811 ----
  	     (news-method (car gnus-select-method))
  	     (max-len 60)
+ 	     header			;Dummy binding for user-defined specs.
  	     (mode-string (eval gformat)))
  	(setq mode-string (eval gformat))
*************** ADDRESS."
*** 4242,4246 ****
    "Create the Gnus documentation group."
    (interactive)
!   (let ((path (cons (concat installation-directory "etc/") load-path))
  	(name (gnus-group-prefixed-name "gnus-help" '(nndoc "gnus-help")))
  	file)
--- 4269,4275 ----
    "Create the Gnus documentation group."
    (interactive)
!   (let ((path (if installation-directory
! 		  (cons (concat installation-directory "etc/") load-path)
! 	        (cons data-directory load-path)))
  	(name (gnus-group-prefixed-name "gnus-help" '(nndoc "gnus-help")))
  	file)
*************** buffer.  
*** 5151,5159 ****
    (kill-all-local-variables)
    (if gnus-visual (gnus-browse-make-menu-bar))
!   (setq mode-line-modified "-- ")
!   (make-local-variable 'mode-line-format)
!   (setq mode-line-format (copy-sequence mode-line-format))
!   (and (equal (nth 3 mode-line-format) "   ")
!        (setcar (nthcdr 3 mode-line-format) ""))
    (setq major-mode 'gnus-browse-mode)
    (setq mode-name "Browse Server")
--- 5180,5184 ----
    (kill-all-local-variables)
    (if gnus-visual (gnus-browse-make-menu-bar))
!   (gnus-simplify-mode-line)
    (setq major-mode 'gnus-browse-mode)
    (setq mode-name "Browse Server")
*************** The following commands are available:
*** 5636,5644 ****
        (setq locals (cdr locals))))
    (gnus-make-thread-indent-array)
!   (setq mode-line-modified "-- ")
!   (make-local-variable 'mode-line-format)
!   (setq mode-line-format (copy-sequence mode-line-format))
!   (and (equal (nth 3 mode-line-format) "   ")
!        (setcar (nthcdr 3 mode-line-format) ""))
    (setq major-mode 'gnus-summary-mode)
    (setq mode-name "Summary")
--- 5661,5665 ----
        (setq locals (cdr locals))))
    (gnus-make-thread-indent-array)
!   (gnus-simplify-mode-line)
    (setq major-mode 'gnus-summary-mode)
    (setq mode-name "Summary")
*************** If NO-ARTICLE is non-nil, no article is 
*** 6039,6043 ****
  	(if (not (get-buffer-window gnus-group-buffer))
  	    ()
! 	  ;; gotta use windows, because recenter does wierd stuff if
  	  ;; the current buffer ain't the displayed window.
   	  (let ((owin (selected-window))) 
--- 6060,6064 ----
  	(if (not (get-buffer-window gnus-group-buffer))
  	    ()
! 	  ;; gotta use windows, because recenter does weird stuff if
  	  ;; the current buffer ain't the displayed window.
   	  (let ((owin (selected-window))) 
*************** If NO-ARTICLE is non-nil, no article is 
*** 6107,6111 ****
    ;; This function takes the dependencies already made by 
    ;; `gnus-get-newsgroup-headers' and builds the trees. First we go
!   ;; through the dependecies in the hash table and finds all the
    ;; roots. Roots do not refer back to any valid articles.
    (gnus-message 6 "Threading...")
--- 6128,6132 ----
    ;; This function takes the dependencies already made by 
    ;; `gnus-get-newsgroup-headers' and builds the trees. First we go
!   ;; through the dependencies in the hash table and finds all the
    ;; roots. Roots do not refer back to any valid articles.
    (gnus-message 6 "Threading...")
*************** If NO-ARTICLE is non-nil, no article is 
*** 6161,6165 ****
    ;; This function takes the dependencies already made by 
    ;; `gnus-get-newsgroup-headers' and builds the trees. First we go
!   ;; through the dependecies in the hash table and finds all the
    ;; roots. Roots do not refer back to any valid articles.
    (gnus-message 6 "Threading...")
--- 6182,6186 ----
    ;; This function takes the dependencies already made by 
    ;; `gnus-get-newsgroup-headers' and builds the trees. First we go
!   ;; through the dependencies in the hash table and finds all the
    ;; roots. Roots do not refer back to any valid articles.
    (gnus-message 6 "Threading...")
*************** Unscored articles will be counted as hav
*** 6486,6490 ****
  THREADS is either a list of `(PARENT [(CHILD1 [(GRANDCHILD ...]...) ...])'  
  or a straight list of headers."
!   (message "Generating summary...")
    (let ((level 0)
  	thread header number subject stack state gnus-tmp-gathered)
--- 6507,6511 ----
  THREADS is either a list of `(PARENT [(CHILD1 [(GRANDCHILD ...]...) ...])'  
  or a straight list of headers."
!   (gnus-message 5 "Generating summary...")
    (let ((level 0)
  	thread header number subject stack state gnus-tmp-gathered)
*************** or a straight list of headers."
*** 6612,6616 ****
  	(setq level (1+ level))
  	(setq threads (cdr (car thread))))))
!   (message "Generating summary...done"))
  
  
--- 6633,6637 ----
  	(setq level (1+ level))
  	(setq threads (cdr (car thread))))))
!   (gnus-message 5 "Generating summary...done"))
  
  
*************** If READ-ALL is non-nil, all articles in 
*** 6861,6870 ****
  	     ;; Make sure that all ticked articles are a subset of the
  	     ;; unread/unselected articles.
! 	     (while m
! 	       (if (or (memq (car m) gnus-newsgroup-unreads)
! 		       (memq (car m) gnus-newsgroup-unselected))
! 		   (setq prev m)
! 		 (setcdr prev (cdr m)))
! 	       (setq m (cdr m))))
  	    ((eq 'score (car prev))
  	     ;; Scored articles should be a subset of
--- 6882,6892 ----
  	     ;; Make sure that all ticked articles are a subset of the
  	     ;; unread/unselected articles.
! 	     ;;(while m
! 	     ;;  (if (or (memq (car m) gnus-newsgroup-unreads)
! 	     ;;  (memq (car m) gnus-newsgroup-unselected))
! 	     ;; (setq prev m)
! 	     ;; (setcdr prev (cdr m)))
! 	     ;; (setq m (cdr m)))
! 	     )
  	    ((eq 'score (car prev))
  	     ;; Scored articles should be a subset of
*************** If WHERE is `summary', the summary mode 
*** 6972,6975 ****
--- 6994,7001 ----
  			      gnus-article-mode-line-format-spec
  			    gnus-summary-mode-line-format-spec))
+ 		 (buffer-name (if (eq where 'article)
+ 				  (buffer-name
+ 				   (get-buffer gnus-article-buffer))
+ 				(buffer-name)))
  		 (group-name gnus-newsgroup-name)
  		 (article-number (or gnus-current-article 0))
*************** The resulting hash table is returned, or
*** 7105,7109 ****
  		  ;; Gnus believes possible. So we re-activate this
  		  ;; group as well. This might mean doing the
! 		  ;; crossposting thingie will *increase* the number
  		  ;; of articles in some groups. Tsk, tsk.
  		  (setq active (or (gnus-activate-group group) active))))
--- 7131,7135 ----
  		  ;; Gnus believes possible. So we re-activate this
  		  ;; group as well. This might mean doing the
! 		  ;; crossposting thingy will *increase* the number
  		  ;; of articles in some groups. Tsk, tsk.
  		  (setq active (or (gnus-activate-group group) active))))
*************** The resulting hash table is returned, or
*** 7176,7179 ****
--- 7202,7207 ----
      (save-excursion
        (set-buffer nntp-server-buffer)
+       ;; Allow the user to mangle the headers before parsing them.
+       (run-hooks 'gnus-parse-headers-hook)
        (goto-char (point-min))
        ;; Search to the beginning of the next header. Error messages
*************** list of headers that match SEQUENCE (see
*** 7313,7316 ****
--- 7341,7346 ----
      (save-excursion
        (set-buffer nntp-server-buffer)
+       ;; Allow the user to mangle the headers before parsing them.
+       (run-hooks 'gnus-parse-headers-hook)
        (goto-char (point-min))
        (while (and sequence (not (eobp)))
*************** and `request-accept' functions. (Ie. mai
*** 8819,8823 ****
  		(gnus-request-move-article 
  		 (car articles)		; Article to move
! 		 gnus-newsgroup-name	; From newsgrouo
  		 (nth 1 (gnus-find-method-for-group 
  			 gnus-newsgroup-name)) ; Server
--- 8849,8853 ----
  		(gnus-request-move-article 
  		 (car articles)		; Article to move
! 		 gnus-newsgroup-name	; From newsgroup
  		 (nth 1 (gnus-find-method-for-group 
  			 gnus-newsgroup-name)) ; Server
*************** functions. (Ie. mail newsgroups at prese
*** 8960,8964 ****
  		   (car articles) gnus-newsgroup-name)
  		  (gnus-request-accept-article
! 		   (if select-method (quote select-method) to-newsgroup)
  		   (not (cdr articles)))))
  	  (let* ((entry 
--- 8990,8994 ----
  		   (car articles) gnus-newsgroup-name)
  		  (gnus-request-accept-article
! 		   (if select-method (list 'quote select-method) to-newsgroup)
  		   (not (cdr articles)))))
  	  (let* ((entry 
*************** functions. (Ie. mail newsgroups at prese
*** 9044,9048 ****
  	(or total (setq gnus-newsgroup-expirable es))
  	;; We go through the old list of expirable, and mark all
! 	;; really expired articles as non-existant.
  	(or (eq es expirable)		;If nothing was expired, we don't mark.
  	    (let ((gnus-use-cache nil))
--- 9074,9078 ----
  	(or total (setq gnus-newsgroup-expirable es))
  	;; We go through the old list of expirable, and mark all
! 	;; really expired articles as nonexistent.
  	(or (eq es expirable)		;If nothing was expired, we don't mark.
  	    (let ((gnus-use-cache nil))
*************** the actual number of articles marked is 
*** 9432,9436 ****
  (defun gnus-summary-set-process-mark (article)
    "Set the process mark on ARTICLE and update the summary line."
!   (setq gnus-newsgroup-processable (cons article gnus-newsgroup-processable))
    (let ((buffer-read-only nil))
      (if (gnus-summary-goto-subject article)
--- 9462,9468 ----
  (defun gnus-summary-set-process-mark (article)
    "Set the process mark on ARTICLE and update the summary line."
!   (setq gnus-newsgroup-processable 
! 	(cons article 
! 	      (delq article gnus-newsgroup-processable)))
    (let ((buffer-read-only nil))
      (if (gnus-summary-goto-subject article)
*************** even ticked and dormant ones."
*** 9758,9762 ****
    (gnus-set-global-variables)
    (let ((buffer-read-only nil)
! 	(orig-article (gnus-summary-article-number))
  	(marks (concat "^[" marks "]")))
      (goto-char (point-min))
--- 9790,9797 ----
    (gnus-set-global-variables)
    (let ((buffer-read-only nil)
! 	(orig-article 
! 	 (let ((gnus-summary-check-current t))
! 	   (gnus-summary-search-forward t)
! 	   (gnus-summary-article-number)))
  	(marks (concat "^[" marks "]")))
      (goto-char (point-min))
*************** Argument REVERSE means reverse order."
*** 10232,10241 ****
      (lambda ()
        (let* ((header (gnus-get-header-by-num (gnus-summary-article-number)))
! 	     (extract (funcall
! 		       gnus-extract-address-components
! 		       (mail-header-from header))))
! 	(concat (or (car extract) (cdr extract))
! 		"\r" (int-to-string (mail-header-number header))
! 		"\r" (mail-header-subject header))))
      'gnus-thread-sort-by-author)
     reverse))
--- 10267,10278 ----
      (lambda ()
        (let* ((header (gnus-get-header-by-num (gnus-summary-article-number)))
! 	     extract)
! 	(if (not (vectorp header))
! 	    ""
! 	  (setq extract (funcall gnus-extract-address-components
! 				 (mail-header-from header)))
! 	  (concat (or (car extract) (cdr extract))
! 		  "\r" (int-to-string (mail-header-number header))
! 		  "\r" (mail-header-subject header)))))
      'gnus-thread-sort-by-author)
     reverse))
*************** Argument REVERSE means reverse order."
*** 10251,10261 ****
      (lambda ()
        (let* ((header (gnus-get-header-by-num (gnus-summary-article-number)))
! 	     (extract (funcall
! 		       gnus-extract-address-components
! 		       (mail-header-from header))))
! 	(concat 
! 	 (downcase (gnus-simplify-subject (gnus-summary-subject-string) t))
! 	 "\r" (int-to-string (mail-header-number header))
! 	 "\r" (or (car extract) (cdr extract)))))
      'gnus-thread-sort-by-subject)
     reverse))
--- 10288,10300 ----
      (lambda ()
        (let* ((header (gnus-get-header-by-num (gnus-summary-article-number)))
! 	     extract)
! 	(if (not (vectorp header))
! 	    ""
! 	  (setq extract (funcall gnus-extract-address-components
! 				 (mail-header-from header)))
! 	  (concat 
! 	   (downcase (gnus-simplify-subject (gnus-summary-subject-string) t))
! 	   "\r" (int-to-string (mail-header-number header))
! 	   "\r" (or (car extract) (cdr extract))))))
      'gnus-thread-sort-by-subject)
     reverse))
*************** The variable `gnus-default-article-saver
*** 10369,10373 ****
  	  (if (assq 'name header)
  	      (gnus-copy-file (cdr (assq 'name header)))
! 	    (gnus-message 1 "Article %d is unsaveable" (car articles)))))
        (gnus-summary-remove-process-mark (car articles))
        (setq articles (cdr articles)))
--- 10408,10412 ----
  	  (if (assq 'name header)
  	      (gnus-copy-file (cdr (assq 'name header)))
! 	    (gnus-message 1 "Article %d is unsavable" (car articles)))))
        (gnus-summary-remove-process-mark (car articles))
        (setq articles (cdr articles)))
*************** pipe those articles instead."
*** 10384,10388 ****
    (gnus-set-global-variables)
    (let ((gnus-default-article-saver 'gnus-summary-save-in-pipe))
!     (gnus-summary-save-article arg)))
  
  (defun gnus-summary-save-article-mail (&optional arg)
--- 10423,10428 ----
    (gnus-set-global-variables)
    (let ((gnus-default-article-saver 'gnus-summary-save-in-pipe))
!     (gnus-summary-save-article arg))
!   (gnus-configure-windows 'pipe))
  
  (defun gnus-summary-save-article-mail (&optional arg)
*************** is initialized from the SAVEDIR environm
*** 10672,10676 ****
  (put 'gnus-article-mode 'mode-class 'special)
  
! (defvar gnus-boogaboo nil)
  
  (if gnus-article-mode-map
--- 10712,10716 ----
  (put 'gnus-article-mode 'mode-class 'special)
  
! (defvar gnus-bugaboo nil)
  
  (if gnus-article-mode-map
*************** is initialized from the SAVEDIR environm
*** 10717,10721 ****
  ;;	  "VD" "Vk" "VK" "Vsn" "Vsa" "Vss" "Vsd" "Vsi"
  	  )))
!     (while (and gnus-boogaboo commands) ; disabled
        (define-key gnus-article-mode-map (car commands) 
  	'gnus-article-summary-command)
--- 10757,10761 ----
  ;;	  "VD" "Vk" "VK" "Vsn" "Vsa" "Vss" "Vsd" "Vsi"
  	  )))
!     (while (and gnus-bugaboo commands) ; disabled
        (define-key gnus-article-mode-map (car commands) 
  	'gnus-article-summary-command)
*************** is initialized from the SAVEDIR environm
*** 10725,10729 ****
  ;;			"Zc" "ZC" "ZE" "ZQ" "ZZ" "Zn" "ZR" "ZG" "ZN" "ZP" 
  			 "=" "n"  "^" "\M-^")))
!     (while (and gnus-boogaboo commands) ; disabled
        (define-key gnus-article-mode-map (car commands) 
  	'gnus-article-summary-command-nosave)
--- 10765,10769 ----
  ;;			"Zc" "ZC" "ZE" "ZQ" "ZZ" "Zn" "ZR" "ZG" "ZN" "ZP" 
  			 "=" "n"  "^" "\M-^")))
!     (while (and gnus-bugaboo commands) ; disabled
        (define-key gnus-article-mode-map (car commands) 
  	'gnus-article-summary-command-nosave)
*************** The following commands are available:
*** 10749,10757 ****
    (if gnus-visual (gnus-article-make-menu-bar))
    (kill-all-local-variables)
!   (setq mode-line-modified "-- ")
!   (make-local-variable 'mode-line-format)
!   (setq mode-line-format (copy-sequence mode-line-format))
!   (and (equal (nth 3 mode-line-format) "   ")
!        (setcar (nthcdr 3 mode-line-format) ""))
    (setq mode-name "Article")
    (setq major-mode 'gnus-article-mode)
--- 10789,10793 ----
    (if gnus-visual (gnus-article-make-menu-bar))
    (kill-all-local-variables)
!   (gnus-simplify-mode-line)
    (setq mode-name "Article")
    (setq major-mode 'gnus-article-mode)
*************** The following commands are available:
*** 10854,10858 ****
  	  ;; There may be some overlays that we have to kill...
  	  (insert "i")
! 	  (let ((overlays (overlays-at (point-min))))
  	    (while overlays
  	      (delete-overlay (car overlays))
--- 10890,10895 ----
  	  ;; There may be some overlays that we have to kill...
  	  (insert "i")
! 	  (let ((overlays (and (fboundp 'overlays-at)
! 			       (overlays-at (point-min)))))
  	    (while overlays
  	      (delete-overlay (car overlays))
*************** If ALL-HEADERS is non-nil, no headers ar
*** 11005,11009 ****
  (defun gnus-article-hide-headers-if-wanted ()
    "Hide unwanted headers if `gnus-have-all-headers' is nil.
! Provided for backwards compatability."
    (or (save-excursion (set-buffer gnus-summary-buffer) gnus-have-all-headers)
        (gnus-article-hide-headers)))
--- 11042,11046 ----
  (defun gnus-article-hide-headers-if-wanted ()
    "Hide unwanted headers if `gnus-have-all-headers' is nil.
! Provided for backwards compatibility."
    (or (save-excursion (set-buffer gnus-summary-buffer) gnus-have-all-headers)
        (gnus-article-hide-headers)))
*************** If NEWSGROUP is nil, return the global k
*** 11602,11606 ****
  	((gnus-use-long-file-name 'not-kill)
  	 ;; Append ".KILL" to newsgroup name.
! 	 (expand-file-name (concat (gnus-newsgroup-saveable-name newsgroup)
  				   "." gnus-kill-file-name)
  			   (or gnus-kill-files-directory "~/News")))
--- 11639,11643 ----
  	((gnus-use-long-file-name 'not-kill)
  	 ;; Append ".KILL" to newsgroup name.
! 	 (expand-file-name (concat (gnus-newsgroup-savable-name newsgroup)
  				   "." gnus-kill-file-name)
  			   (or gnus-kill-files-directory "~/News")))
*************** is returned insted of the status string.
*** 11924,11927 ****
--- 11961,11966 ----
  
  (defun gnus-request-accept-article (group &optional last)
+   (goto-char (point-max))
+   (or (bolp) (insert "\n"))
    (let ((func (if (symbolp group) group
  		(car (gnus-find-method-for-group group)))))
*************** If LEVEL is non-nil, the news will be se
*** 12057,12061 ****
      ;; Find new newsgroups and treat them.
      (if (and init gnus-check-new-newsgroups gnus-read-active-file (not level)
! 	     (gnus-server-opened gnus-select-method))
  	(gnus-find-new-newsgroups))
  
--- 12096,12100 ----
      ;; Find new newsgroups and treat them.
      (if (and init gnus-check-new-newsgroups gnus-read-active-file (not level)
! 	     (gnus-check-server gnus-select-method))
  	(gnus-find-new-newsgroups))
  
*************** The `-n' option line from .newsrc is res
*** 12117,12121 ****
  
  (defun gnus-matches-options-n (group)
!   ;; Returns `subscribe' if the group is to be uncoditionally
    ;; subscribed, `ignore' if it is to be ignored, and nil if there is
    ;; no match for the group.
--- 12156,12160 ----
  
  (defun gnus-matches-options-n (group)
!   ;; Returns `subscribe' if the group is to be unconditionally
    ;; subscribed, `ignore' if it is to be ignored, and nil if there is
    ;; no match for the group.
*************** Returns whether the updating was success
*** 12683,12686 ****
--- 12722,12731 ----
  	(setq dormant (cdr dormant)))
        (setq unread (sort (append unselected unread) '<))
+       ;; Weed out duplicates.
+       (let ((un unread))
+ 	(while (cdr un)
+ 	  (if (eq (car un) (car (cdr un)))
+ 	      (setcdr un (cdr (cdr un)))
+ 	    (setq un (cdr un)))))
        ;; Compute the ranges of read articles by looking at the list of
        ;; unread articles.  
*************** If FORCE is non-nil, the .newsrc file is
*** 13145,13149 ****
  	    (eq symbol Options-symbol))
  	(setq gnus-newsrc-options
! 	      ;; This concatting is quite inefficient, but since our
  	      ;; thorough studies show that approx 99.37% of all
  	      ;; .newsrc files only contain a single options line, we
--- 13190,13194 ----
  	    (eq symbol Options-symbol))
  	(setq gnus-newsrc-options
! 	      ;; This concating is quite inefficient, but since our
  	      ;; thorough studies show that approx 99.37% of all
  	      ;; .newsrc files only contain a single options line, we
*************** If FORCE is non-nil, the .newsrc file is
*** 13381,13384 ****
--- 13426,13431 ----
  	     ;; Quickly loadable .newsrc.
  	     (set-buffer (get-buffer-create " *Gnus-newsrc*"))
+ 	     (make-local-variable 'version-control)
+ 	     (setq version-control 'never)
  	     (setq buffer-file-name (concat gnus-current-startup-file ".eld"))
  	     (gnus-add-current-to-buffer-list)
*************** If FORCE is non-nil, the .newsrc file is
*** 13455,13458 ****
--- 13502,13507 ----
  	      (insert "\n")))
  	(setq newsrc (cdr newsrc)))
+       (make-local-variable 'version-control)
+       (setq version-control 'never)
        ;; It has been reported that sometime the modtime on the .newsrc
        ;; file seems to be off. We really do want to overwrite it, so
*************** The following commands are available:
*** 13596,13604 ****
    (if gnus-visual (gnus-server-make-menu-bar))
    (kill-all-local-variables)
!   (setq mode-line-modified "-- ")
!   (make-local-variable 'mode-line-format)
!   (setq mode-line-format (copy-sequence mode-line-format))
!   (and (equal (nth 3 mode-line-format) "   ")
!        (setcar (nthcdr 3 mode-line-format) ""))
    (setq major-mode 'gnus-server-mode)
    (setq mode-name "Server")
--- 13645,13649 ----
    (if gnus-visual (gnus-server-make-menu-bar))
    (kill-all-local-variables)
!   (gnus-simplify-mode-line)
    (setq major-mode 'gnus-server-mode)
    (setq mode-name "Server")
*************** GROUP using BNews sys file syntax."
*** 13971,13975 ****
  	(while (re-search-forward "[/:]" nil t)
  	  (replace-match "." t t))
! 	;; Cludge to get rid of "nntp+" problems.
  	(goto-char (point-min))
  	(and (looking-at "nn[a-z]+\\+")
--- 14016,14020 ----
  	(while (re-search-forward "[/:]" nil t)
  	  (replace-match "." t t))
! 	;; Kludge to get rid of "nntp+" problems.
  	(goto-char (point-min))
  	(and (looking-at "nn[a-z]+\\+")
*************** GROUP using BNews sys file syntax."
*** 14015,14019 ****
  			(gnus-replace-chars-in-string group ?. ?/ ?: ?/)
  			"/" gnus-score-file-suffix)))))
! 	;; The localest score file might already be there, but it's
  	;; supposed to be the very last file, so we delete it from the
  	;; list if it's already there, and add it to the head of the
--- 14060,14064 ----
  			(gnus-replace-chars-in-string group ?. ?/ ?: ?/)
  			"/" gnus-score-file-suffix)))))
! 	;; The local score file might already be there, but it's
  	;; supposed to be the very last file, so we delete it from the
  	;; list if it's already there, and add it to the head of the
*************** The list is determined from the variable
*** 14104,14108 ****
       ((gnus-use-long-file-name 'not-score)
        ;; Append ".SCORE" to newsgroup name.
!       (expand-file-name (concat (gnus-newsgroup-saveable-name newsgroup)
  				"." suffix)
  			(or gnus-kill-files-directory "~/News")))
--- 14149,14153 ----
       ((gnus-use-long-file-name 'not-score)
        ;; Append ".SCORE" to newsgroup name.
!       (expand-file-name (concat (gnus-newsgroup-savable-name newsgroup)
  				"." suffix)
  			(or gnus-kill-files-directory "~/News")))
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/gomoku.el emacs-19.31/lisp/gomoku.el
*** emacs-19.30/lisp/gomoku.el	Thu May  4 14:54:14 1995
--- emacs-19.31/lisp/gomoku.el	Fri Apr  5 14:37:48 1996
***************
*** 1,8 ****
  ;;; gomoku.el --- Gomoku game between you and Emacs
  
! ;; Copyright (C) 1988, 1994 Free Software Foundation, Inc.
  
  ;; Author: Philippe Schnoebelen <phs@lifia.imag.fr>
! ;; Adapted-By: ESR
  ;; Keywords: games
  
--- 1,8 ----
  ;;; gomoku.el --- Gomoku game between you and Emacs
  
! ;; Copyright (C) 1988, 1994, 1996 Free Software Foundation, Inc.
  
  ;; Author: Philippe Schnoebelen <phs@lifia.imag.fr>
! ;; Adapted-By: ESR, Daniel.Pfeiffer@Informatik.START.dbp.de
  ;; Keywords: games
  
***************
*** 20,34 ****
  
  ;; 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:
  
- ;;; Gomoku game between you and GNU Emacs.  Last modified on 13 Sep 1988
- ;;;
- ;;; Written by Ph. Schnoebelen (phs@lifia.imag.fr), 1987, 1988
- ;;; with precious advices from J.-F. Rit.
- ;;; This has been tested with GNU Emacs 18.50.
- 
  ;; RULES:
  ;;
--- 20,29 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
  ;; RULES:
  ;;
***************
*** 84,119 ****
    (setq gomoku-mode-map (make-sparse-keymap))
  
!   ;; Key bindings for cursor motion. Arrow keys are just "function"
!   ;; keys, see below.
!   (define-key gomoku-mode-map "y" 'gomoku-move-nw)		; Y
!   (define-key gomoku-mode-map "u" 'gomoku-move-ne)		; U
!   (define-key gomoku-mode-map "b" 'gomoku-move-sw)		; B
!   (define-key gomoku-mode-map "n" 'gomoku-move-se)		; N
!   (define-key gomoku-mode-map "h" 'gomoku-move-left)		; H
!   (define-key gomoku-mode-map "l" 'gomoku-move-right)		; L
!   (define-key gomoku-mode-map "j" 'gomoku-move-down)		; J
!   (define-key gomoku-mode-map "k" 'gomoku-move-up)		; K
!   (define-key gomoku-mode-map "\C-n" 'gomoku-move-down)		; C-N
!   (define-key gomoku-mode-map "\C-p" 'gomoku-move-up)		; C-P
!   (define-key gomoku-mode-map "\C-f" 'gomoku-move-right)	; C-F
!   (define-key gomoku-mode-map "\C-b" 'gomoku-move-left)		; C-B
  
    ;; Key bindings for entering Human moves.
-   ;; If you have a mouse, you may also bind some mouse click ...
    (define-key gomoku-mode-map "X" 'gomoku-human-plays)		; X
    (define-key gomoku-mode-map "x" 'gomoku-human-plays)		; x
    (define-key gomoku-mode-map "\C-m" 'gomoku-human-plays)	; RET
!   (define-key gomoku-mode-map "\C-c\C-p" 'gomoku-human-plays)	; C-C C-P
!   (define-key gomoku-mode-map "\C-c\C-b" 'gomoku-human-takes-back) ; C-C C-B
!   (define-key gomoku-mode-map "\C-c\C-r" 'gomoku-human-resigns)	; C-C C-R
!   (define-key gomoku-mode-map "\C-c\C-e" 'gomoku-emacs-plays)	; C-C C-E
! 
!   (define-key gomoku-mode-map [up] 'gomoku-move-up)
!   (define-key gomoku-mode-map [down] 'gomoku-move-down)
!   (define-key gomoku-mode-map [left] 'gomoku-move-left)
!   (define-key gomoku-mode-map [right] 'gomoku-move-right)
    (define-key gomoku-mode-map [kp-enter] 'gomoku-human-plays)
!   (define-key gomoku-mode-map [mouse-2] 'gomoku-click)
!   (define-key gomoku-mode-map [insert] 'gomoku-human-plays))
  
  (defun gomoku-mode ()
--- 79,160 ----
    (setq gomoku-mode-map (make-sparse-keymap))
  
!   ;; Key bindings for cursor motion.
!   (define-key gomoku-mode-map "y" 'gomoku-move-nw)		; y
!   (define-key gomoku-mode-map "u" 'gomoku-move-ne)		; u
!   (define-key gomoku-mode-map "b" 'gomoku-move-sw)		; b
!   (define-key gomoku-mode-map "n" 'gomoku-move-se)		; n
!   (define-key gomoku-mode-map "h" 'backward-char)		; h
!   (define-key gomoku-mode-map "l" 'forward-char)		; l
!   (define-key gomoku-mode-map "j" 'gomoku-move-down)		; j
!   (define-key gomoku-mode-map "k" 'gomoku-move-up)		; k
! 
!   (define-key gomoku-mode-map [kp-7] 'gomoku-move-nw)
!   (define-key gomoku-mode-map [kp-9] 'gomoku-move-ne)
!   (define-key gomoku-mode-map [kp-1] 'gomoku-move-sw)
!   (define-key gomoku-mode-map [kp-3] 'gomoku-move-se)
!   (define-key gomoku-mode-map [kp-4] 'backward-char)
!   (define-key gomoku-mode-map [kp-6] 'forward-char)
!   (define-key gomoku-mode-map [kp-2] 'gomoku-move-down)
!   (define-key gomoku-mode-map [kp-8] 'gomoku-move-up)
! 
!   (define-key gomoku-mode-map "\C-n" 'gomoku-move-down)		; C-n
!   (define-key gomoku-mode-map "\C-p" 'gomoku-move-up)		; C-p
  
    ;; Key bindings for entering Human moves.
    (define-key gomoku-mode-map "X" 'gomoku-human-plays)		; X
    (define-key gomoku-mode-map "x" 'gomoku-human-plays)		; x
+   (define-key gomoku-mode-map " " 'gomoku-human-plays)		; SPC
    (define-key gomoku-mode-map "\C-m" 'gomoku-human-plays)	; RET
!   (define-key gomoku-mode-map "\C-c\C-p" 'gomoku-human-plays)	; C-c C-p
!   (define-key gomoku-mode-map "\C-c\C-b" 'gomoku-human-takes-back) ; C-c C-b
!   (define-key gomoku-mode-map "\C-c\C-r" 'gomoku-human-resigns)	; C-c C-r
!   (define-key gomoku-mode-map "\C-c\C-e" 'gomoku-emacs-plays)	; C-c C-e
! 
    (define-key gomoku-mode-map [kp-enter] 'gomoku-human-plays)
!   (define-key gomoku-mode-map [insert] 'gomoku-human-plays)
!   (define-key gomoku-mode-map [down-mouse-1] 'gomoku-click)
!   (define-key gomoku-mode-map [drag-mouse-1] 'gomoku-click)
!   (define-key gomoku-mode-map [mouse-1] 'gomoku-click)
!   (define-key gomoku-mode-map [down-mouse-2] 'gomoku-click)
!   (define-key gomoku-mode-map [mouse-2] 'gomoku-mouse-play)
!   (define-key gomoku-mode-map [drag-mouse-2] 'gomoku-mouse-play)
! 
!   (substitute-key-definition 'previous-line 'gomoku-move-up
! 			     gomoku-mode-map (current-global-map))
!   (substitute-key-definition 'next-line 'gomoku-move-down
! 			     gomoku-mode-map (current-global-map))
!   (substitute-key-definition 'beginning-of-line 'gomoku-beginning-of-line
! 			     gomoku-mode-map (current-global-map))
!   (substitute-key-definition 'end-of-line 'gomoku-end-of-line
! 			     gomoku-mode-map (current-global-map))
!   (substitute-key-definition 'undo 'gomoku-human-takes-back
! 			     gomoku-mode-map (current-global-map))
!   (substitute-key-definition 'advertised-undo 'gomoku-human-takes-back
! 			     gomoku-mode-map (current-global-map)))
! 
! (defvar gomoku-emacs-won ()
!   "*For making font-lock use the winner's face for the line.")
! 
! (defvar gomoku-font-lock-O-face
!   (if window-system
!       (list (facemenu-get-face 'fg:red) 'bold))
!   "*Face to use for Emacs' O.")
! 
! (defvar gomoku-font-lock-X-face
!   (if window-system
!       (list (facemenu-get-face 'fg:green) 'bold))
!   "*Face to use for your X.")
! 
! (defvar gomoku-font-lock-keywords
!   '(("O" . gomoku-font-lock-O-face)
!     ("X" . gomoku-font-lock-X-face)
!     ("[-|/\\]" 0 (if gomoku-emacs-won
! 		     gomoku-font-lock-O-face
! 		   gomoku-font-lock-X-face)))
!   "*Font lock rules for Gomoku.")
! 
! (put 'gomoku-mode 'front-sticky
!      (put 'gomoku-mode 'rear-nonsticky '(intangible)))
! (put 'gomoku-mode 'intangible 1)
  
  (defun gomoku-mode ()
*************** Other useful commands:
*** 128,132 ****
  \\{gomoku-mode-map}
  Entry to this mode calls the value of `gomoku-mode-hook' if that value
! is non-nil."
    (interactive)
    (setq major-mode 'gomoku-mode
--- 169,173 ----
  \\{gomoku-mode-map}
  Entry to this mode calls the value of `gomoku-mode-hook' if that value
! is non-nil.  One interesting value is `turn-on-font-lock'."
    (interactive)
    (setq major-mode 'gomoku-mode
*************** is non-nil."
*** 134,137 ****
--- 175,181 ----
    (gomoku-display-statistics)
    (use-local-map gomoku-mode-map)
+   (make-local-variable 'font-lock-defaults)
+   (setq font-lock-defaults '(gomoku-font-lock-keywords t))
+   (toggle-read-only t)
    (run-hooks 'gomoku-mode-hook))
  
*************** is non-nil."
*** 267,272 ****
  
  
! ;; As we choosed values 0, 1 and 6 to denote empty, X and O squares, the
! ;; contents of a qtuple is uniquely determined by the sum of its elements and
  ;; we just have to set up a translation table.
  
--- 311,316 ----
  
  
! ;; As we chose values 0, 1 and 6 to denote empty, X and O squares, the
! ;; contents of a qtuple are uniquely determined by the sum of its elements and
  ;; we just have to set up a translation table.
  
*************** that DVAL has been added on SQUARE."
*** 531,535 ****
  	gomoku-vector-length (1+ (* (+ m 2) (1+ n)))
  	gomoku-draw-limit    (/ (* 7 n m) 10))
!   (setq gomoku-game-history	     nil
  	gomoku-number-of-moves	     0
  	gomoku-number-of-human-moves 0
--- 575,580 ----
  	gomoku-vector-length (1+ (* (+ m 2) (1+ n)))
  	gomoku-draw-limit    (/ (* 7 n m) 10))
!   (setq gomoku-emacs-won	     nil
! 	gomoku-game-history	     nil
  	gomoku-number-of-moves	     0
  	gomoku-number-of-human-moves 0
*************** that DVAL has been added on SQUARE."
*** 592,655 ****
  (defun gomoku-terminate-game (result)
    "Terminate the current game with RESULT."
!   (let (message)
!     (cond
!      ((eq result 'emacs-won)
!       (setq gomoku-number-of-emacs-wins (1+ gomoku-number-of-emacs-wins))
!       (setq message
! 	    (cond ((< gomoku-number-of-moves 20)
! 		   "This was a REALLY QUICK win.")
! 		  (gomoku-human-refused-draw
! 		   "I won... Too bad you refused my offer of a draw !")
! 		  (gomoku-human-took-back
! 		   "I won... Taking moves back will not help you !")
! 		  ((not gomoku-emacs-played-first)
! 		   "I won... Playing first did not help you much !")
! 		  ((and (zerop gomoku-number-of-human-wins)
! 			(zerop gomoku-number-of-draws)
! 			(> gomoku-number-of-emacs-wins 1))
! 		   "I'm becoming tired of winning...")
! 		  (t
! 		   "I won."))))
!      ((eq result 'human-won)
!       (setq gomoku-number-of-human-wins (1+ gomoku-number-of-human-wins))
!       (setq message
! 	    (cond
! 	     (gomoku-human-took-back
! 	      "OK, you won this one.  I, for one, never take my moves back...")
! 	     (gomoku-emacs-played-first
! 	      "OK, you won this one... so what ?")
! 	     (t
! 	      "OK, you won this one.  Now, let me play first just once."))))
!      ((eq result 'human-resigned)
!       (setq gomoku-number-of-emacs-wins (1+ gomoku-number-of-emacs-wins))
!       (setq message "So you resign.  That's just one more win for me."))
!      ((eq result 'nobody-won)
!       (setq gomoku-number-of-draws (1+ gomoku-number-of-draws))
!       (setq message
! 	    (cond
! 	     (gomoku-human-took-back
! 	      "This is a draw.  I, for one, never take my moves back...")
! 	     (gomoku-emacs-played-first
! 	      "This is a draw.  Just chance, I guess.")
! 	     (t
! 	      "This is a draw.  Now, let me play first just once."))))
!      ((eq result 'draw-agreed)
!       (setq gomoku-number-of-draws (1+ gomoku-number-of-draws))
!       (setq message
! 	    (cond
! 	     (gomoku-human-took-back
! 	      "Draw agreed.  I, for one, never take my moves back...")
! 	     (gomoku-emacs-played-first
! 	      "Draw agreed.  You were lucky.")
! 	     (t
! 	      "Draw agreed.  Now, let me play first just once."))))
!      ((eq result 'crash-game)
!       (setq message
! 	    "Sorry, I have been interrupted and cannot resume that game...")))
! 
!     (gomoku-display-statistics)
!     (if message (message message))
!     (ding)
!     (setq gomoku-game-in-progress nil)))
  
  (defun gomoku-crash-game ()
--- 637,692 ----
  (defun gomoku-terminate-game (result)
    "Terminate the current game with RESULT."
!   (message
!    (cond
!     ((eq result 'emacs-won)
!      (setq gomoku-number-of-emacs-wins (1+ gomoku-number-of-emacs-wins))
!      (cond ((< gomoku-number-of-moves 20)
! 	    "This was a REALLY QUICK win.")
! 	   (gomoku-human-refused-draw
! 	    "I won... Too bad you refused my offer of a draw !")
! 	   (gomoku-human-took-back
! 	    "I won... Taking moves back will not help you !")
! 	   ((not gomoku-emacs-played-first)
! 	    "I won... Playing first did not help you much !")
! 	   ((and (zerop gomoku-number-of-human-wins)
! 		 (zerop gomoku-number-of-draws)
! 		 (> gomoku-number-of-emacs-wins 1))
! 	    "I'm becoming tired of winning...")
! 	   ("I won.")))
!     ((eq result 'human-won)
!      (setq gomoku-number-of-human-wins (1+ gomoku-number-of-human-wins))
!      (concat "OK, you won this one."
! 	     (cond
! 	      (gomoku-human-took-back
! 	       "  I, for one, never take my moves back...")
! 	      (gomoku-emacs-played-first
! 	       ".. so what ?")
! 	      ("  Now, let me play first just once."))))
!     ((eq result 'human-resigned)
!      (setq gomoku-number-of-emacs-wins (1+ gomoku-number-of-emacs-wins))
!      "So you resign.  That's just one more win for me.")
!     ((eq result 'nobody-won)
!      (setq gomoku-number-of-draws (1+ gomoku-number-of-draws))
!      (concat "This is a draw.  "
! 	     (cond
! 	      (gomoku-human-took-back
! 	       "I, for one, never take my moves back...")
! 	      (gomoku-emacs-played-first
! 	       "Just chance, I guess.")
! 	      ("Now, let me play first just once."))))
!     ((eq result 'draw-agreed)
!      (setq gomoku-number-of-draws (1+ gomoku-number-of-draws))
!      (concat "Draw agreed.  "
! 	     (cond
! 	      (gomoku-human-took-back
! 	       "I, for one, never take my moves back...")
! 	      (gomoku-emacs-played-first
! 	       "You were lucky.")
! 	      ("Now, let me play first just once."))))
!     ((eq result 'crash-game)
!      "Sorry, I have been interrupted and cannot resume that game...")))
!   (gomoku-display-statistics)
!   ;;(ding)
!   (setq gomoku-game-in-progress nil))
  
  (defun gomoku-crash-game ()
*************** that DVAL has been added on SQUARE."
*** 669,672 ****
--- 706,710 ----
  If a game is in progress, this command allow you to resume it.
  If optional arguments N and M are given, an N by M board is used.
+ If prefix arg is given for N, M is prompted for.
  
  You and Emacs play in turn by marking a free square.  You mark it with X
*************** You play by moving the cursor over the s
*** 677,686 ****
  \\<gomoku-mode-map>\\[gomoku-human-plays].
  Use \\[describe-mode] for more info."
!   (interactive)
    (gomoku-switch-to-window)
    (cond
     (gomoku-emacs-is-computing
      (gomoku-crash-game))
!    ((not gomoku-game-in-progress)
      (let ((max-width (gomoku-max-width))
  	  (max-height (gomoku-max-height)))
--- 715,727 ----
  \\<gomoku-mode-map>\\[gomoku-human-plays].
  Use \\[describe-mode] for more info."
!   (interactive (if current-prefix-arg
! 		   (list (prefix-numeric-value current-prefix-arg)
! 			 (eval (read-minibuffer "Height: ")))))
    (gomoku-switch-to-window)
    (cond
     (gomoku-emacs-is-computing
      (gomoku-crash-game))
!    ((or (not gomoku-game-in-progress)
! 	(<= gomoku-number-of-moves 2))
      (let ((max-width (gomoku-max-width))
  	  (max-height (gomoku-max-height)))
*************** Use \\[describe-mode] for more info."
*** 694,699 ****
  	     (error "I cannot display %d columns in that window" n)))
        (if (and (> m max-height)
! 	       (not (equal m gomoku-saved-board-height))
! 	       ;; Use EQUAL because SAVED-BOARD-HEIGHT may be nil
  	       (not (y-or-n-p (format "Do you really want %d rows " m))))
  	  (setq m max-height)))
--- 735,740 ----
  	     (error "I cannot display %d columns in that window" n)))
        (if (and (> m max-height)
! 	       (not (eq m gomoku-saved-board-height))
! 	       ;; Use EQ because SAVED-BOARD-HEIGHT may be nil
  	       (not (y-or-n-p (format "Do you really want %d rows " m))))
  	  (setq m max-height)))
*************** Use \\[describe-mode] for more info."
*** 727,732 ****
  	     (gomoku-play-move square 6)
  	     (cond ((>= score gomoku-winning-threshold)
  		    (gomoku-find-filled-qtuple square 6)
- 		    (gomoku-cross-winning-qtuple)
  		    (gomoku-terminate-game 'emacs-won))
  		   ((zerop score)
--- 768,773 ----
  	     (gomoku-play-move square 6)
  	     (cond ((>= score gomoku-winning-threshold)
+ 		    (setq gomoku-emacs-won t) ; for font-lock
  		    (gomoku-find-filled-qtuple square 6)
  		    (gomoku-terminate-game 'emacs-won))
  		   ((zerop score)
*************** Use \\[describe-mode] for more info."
*** 739,747 ****
  		    (gomoku-prompt-for-move)))))))))
  
  (defun gomoku-click (click)
    "Play at the square where you click."
    (interactive "e")
!   (mouse-set-point click)
!   (gomoku-human-plays))
  
  (defun gomoku-human-plays ()
--- 780,820 ----
  		    (gomoku-prompt-for-move)))))))))
  
+ ;; For small square dimensions this is approximate, since though measured in
+ ;; pixels, event's (X . Y) is a character's top-left corner.
  (defun gomoku-click (click)
+   "Position at the square where you click."
+   (interactive "e")
+   (and (windowp (posn-window (setq click (event-end click))))
+        (numberp (posn-point click))
+        (select-window (posn-window click))
+        (setq click (posn-col-row click))
+        (gomoku-goto-xy
+ 	(min (max (/ (+ (- (car click)
+ 			   gomoku-x-offset
+ 			   1)
+ 			(window-hscroll)
+ 			gomoku-square-width
+ 			(% gomoku-square-width 2)
+ 			(/ gomoku-square-width 2))
+ 		     gomoku-square-width)
+ 		  1)
+ 	     gomoku-board-width)
+ 	(min (max (/ (+ (- (cdr click)
+ 			   gomoku-y-offset
+ 			   1)
+ 			(let ((inhibit-point-motion-hooks t))
+ 			  (count-lines 1 (window-start)))
+ 			gomoku-square-height
+ 			(% gomoku-square-height 2)
+ 			(/ gomoku-square-height 2))
+ 		     gomoku-square-height)
+ 		  1)
+ 	     gomoku-board-height))))
+   
+ (defun gomoku-mouse-play (click)
    "Play at the square where you click."
    (interactive "e")
!   (if (gomoku-click click)
!       (gomoku-human-plays)))
  
  (defun gomoku-human-plays ()
*************** If the game is finished, this command re
*** 771,775 ****
  			 ;; we confirm with GOMOKU-FIND-FILLED-QTUPLE.
  			 (gomoku-find-filled-qtuple square 1))
- 		    (gomoku-cross-winning-qtuple)
  		    (gomoku-terminate-game 'human-won))
  		   (t
--- 844,847 ----
*************** If the game is finished, this command re
*** 833,843 ****
    (if (y-or-n-p "Another game ")
        (gomoku gomoku-board-width gomoku-board-height)
!   (message "Chicken !")))
  
  (defun gomoku-offer-a-draw ()
    "Offer a draw and return T if Human accepted it."
    (or (y-or-n-p "I offer you a draw. Do you accept it ")
!       (prog1 (setq gomoku-human-refused-draw t)
! 	nil)))
  
  ;;;
--- 905,914 ----
    (if (y-or-n-p "Another game ")
        (gomoku gomoku-board-width gomoku-board-height)
!     (message "Chicken !")))
  
  (defun gomoku-offer-a-draw ()
    "Offer a draw and return T if Human accepted it."
    (or (y-or-n-p "I offer you a draw. Do you accept it ")
!       (not (setq gomoku-human-refused-draw t))))
  
  ;;;
*************** If the game is finished, this command re
*** 874,901 ****
  	 gomoku-square-height)))
  
- (defun gomoku-point-x ()
-   "Return the board column where point is, or nil if it is not a board column."
-   (let ((col (- (current-column) gomoku-x-offset)))
-     (if (and (>= col 0)
- 	     (zerop (% col gomoku-square-width))
- 	     (<= (setq col (1+ (/ col gomoku-square-width)))
- 		 gomoku-board-width))
- 	col)))
- 
  (defun gomoku-point-y ()
!   "Return the board row where point is, or nil if it is not a board row."
!   (let ((row (- (count-lines 1 (point)) gomoku-y-offset 1)))
!     (if (and (>= row 0)
! 	     (zerop (% row gomoku-square-height))
! 	     (<= (setq row (1+ (/ row gomoku-square-height)))
! 		 gomoku-board-height))
! 	row)))
  
  (defun gomoku-point-square ()
!   "Return the index of the square point is on, or nil if not on the board."
!   (let (x y)
!     (and (setq x (gomoku-point-x))
! 	 (setq y (gomoku-point-y))
! 	 (gomoku-xy-to-index x y))))
  
  (defun gomoku-goto-square (index)
--- 945,960 ----
  	 gomoku-square-height)))
  
  (defun gomoku-point-y ()
!   "Return the board row where point is."
!   (let ((inhibit-point-motion-hooks t))
!     (1+ (/ (- (count-lines 1 (point)) gomoku-y-offset (if (bolp) 0 1))
! 	   gomoku-square-height))))
  
  (defun gomoku-point-square ()
!   "Return the index of the square point is on."
!   (let ((inhibit-point-motion-hooks t))
!     (gomoku-xy-to-index (1+ (/ (- (current-column) gomoku-x-offset)
! 			       gomoku-square-width))
! 			(gomoku-point-y))))
  
  (defun gomoku-goto-square (index)
*************** If the game is finished, this command re
*** 905,956 ****
  (defun gomoku-goto-xy (x y)
    "Move point to square at X, Y coords."
!   (goto-line (+ 1 gomoku-y-offset (* gomoku-square-height (1- y))))
    (move-to-column (+ gomoku-x-offset (* gomoku-square-width (1- x)))))
  
  (defun gomoku-plot-square (square value)
!   "Draw 'X', 'O' or '.' on SQUARE (depending on VALUE), leave point there."
!   (gomoku-goto-square square)
!   (gomoku-put-char (cond ((= value 1) ?X)
! 			 ((= value 6) ?O)
! 			 (t	      ?.)))
!   (sit-for 0))	; Display NOW
! 
! (defun gomoku-put-char (char)
!   "Draw CHAR on the Gomoku screen."
!   (let ((inhibit-read-only t))
!     (insert char)
      (delete-char 1)
!     (backward-char 1)))
  
  (defun gomoku-init-display (n m)
    "Display an N by M Gomoku board."
    (buffer-disable-undo (current-buffer))
!   (let ((inhibit-read-only t))
      (erase-buffer)
!     (let (string1 string2 string3 string4)
!       ;; We do not use gomoku-plot-square which would be too slow for
!       ;; initializing the display. Rather we build STRING1 for lines where
!       ;; board squares are to be found, and STRING2 for empty lines. STRING1 is
!       ;; like STRING2 except for dots every DX squares. Empty lines are filled
!       ;; with spaces so that cursor moving up and down remains on the same
!       ;; column.
!       (setq string1 (concat (make-string (1- gomoku-square-width) ? ) ".")
! 	    string1 (apply 'concat
! 			   (make-list (1- n) string1))
! 	    string1 (concat (make-string gomoku-x-offset ? ) "." string1 "\n")
! 	    string2 (make-string (+ 1 gomoku-x-offset
! 				    (* (1- n) gomoku-square-width))
! 				 ? )
! 	    string2 (concat string2 "\n")
! 	    string3 (apply 'concat
! 			   (make-list (1- gomoku-square-height) string2))
! 	    string3 (concat string3 string1)
! 	    string3 (apply 'concat
! 			   (make-list (1- m) string3))
! 	    string4 (apply 'concat
! 			   (make-list gomoku-y-offset string2)))
!       (insert string4 string1 string3))
!     (gomoku-goto-xy (/ (1+ n) 2) (/ (1+ m) 2)) ; center of the board
!     (sit-for 0)))			; Display NOW
  
  (defun gomoku-display-statistics ()
--- 964,1038 ----
  (defun gomoku-goto-xy (x y)
    "Move point to square at X, Y coords."
!   (let ((inhibit-point-motion-hooks t))
!     (goto-line (+ 1 gomoku-y-offset (* gomoku-square-height (1- y)))))
    (move-to-column (+ gomoku-x-offset (* gomoku-square-width (1- x)))))
  
  (defun gomoku-plot-square (square value)
!   "Draw 'X', 'O' or '.' on SQUARE depending on VALUE, leave point there."
!   (or (= value 1)
!       (gomoku-goto-square square))
!   (let ((inhibit-read-only t)
! 	(inhibit-point-motion-hooks t))
!     (insert-and-inherit (cond ((= value 1) ?X)
! 			      ((= value 6) ?O)
! 			      (?.)))
!     (and window-system
! 	 (zerop value)
! 	 (put-text-property (1- (point)) (point) 'mouse-face 'highlight))
      (delete-char 1)
!     (backward-char 1))
!   (sit-for 0))	; Display NOW
  
  (defun gomoku-init-display (n m)
    "Display an N by M Gomoku board."
    (buffer-disable-undo (current-buffer))
!   (let ((inhibit-read-only t)
! 	(point 1) opoint
! 	(intangible t)
! 	(i m) j x)
!     ;; Try to minimize number of chars (because of text properties)
!     (setq tab-width
! 	  (if (zerop (% gomoku-x-offset gomoku-square-width))
! 	      gomoku-square-width
! 	    (max (/ (+ (% gomoku-x-offset gomoku-square-width)
! 		       gomoku-square-width 1) 2) 2)))
      (erase-buffer)
!     (newline gomoku-y-offset)
!     (while (progn
! 	     (setq j n
! 		   x (- gomoku-x-offset gomoku-square-width))
! 	     (while (>= (setq j (1- j)) 0)
! 	       (insert-char ?\t (/ (- (setq x (+ x gomoku-square-width))
! 				      (current-column))
! 				   tab-width))
! 	       (insert-char ?  (- x (current-column)))
! 	       (if (setq intangible (not intangible))
! 		   (put-text-property point (point) 'intangible 2))
! 	       (and (zerop j)
! 		    (= i (- m 2))
! 		    (progn
! 		      (while (>= i 3)
! 			(append-to-buffer (current-buffer) opoint (point))
! 			(setq i (- i 2)))
! 		      (goto-char (point-max))))
! 	       (setq point (point))
! 	       (insert ?.)
! 	       (if window-system
! 		   (put-text-property point (point)
! 				      'mouse-face 'highlight)))
! 	     (> (setq i (1- i)) 0))
!       (if (= i (1- m))
! 	  (setq opoint point))
!       (insert-char ?\n gomoku-square-height))
!     (or (eq (char-after 1) ?.)
! 	(put-text-property 1 2 'point-entered
! 			   (lambda (x x) (if (bobp) (forward-char)))))
!     (or intangible
! 	(put-text-property point (point) 'intangible 2))
!     (put-text-property point (point) 'point-entered
! 		       (lambda (x x) (if (eobp) (backward-char))))
!     (put-text-property (point-min) (point) 'category 'gomoku-mode))
!   (gomoku-goto-xy (/ (1+ n) 2) (/ (1+ m) 2)) ; center of the board
!   (sit-for 0))				; Display NOW
  
  (defun gomoku-display-statistics ()
*************** If the game is finished, this command re
*** 959,972 ****
    ;; This is certainly not the cleanest way out ...
    (setq mode-line-process
! 	(cond
! 	 ((not (zerop gomoku-number-of-draws))
! 	  (format ": Won %d, lost %d, drew %d"
! 		  gomoku-number-of-human-wins
! 		  gomoku-number-of-emacs-wins
! 		  gomoku-number-of-draws))
! 	 (t
! 	  (format ": Won %d, lost %d"
! 		  gomoku-number-of-human-wins
! 		  gomoku-number-of-emacs-wins))))
    (force-mode-line-update))
  
--- 1041,1050 ----
    ;; This is certainly not the cleanest way out ...
    (setq mode-line-process
! 	(format ": Won %d, lost %d%s"
! 		gomoku-number-of-human-wins
! 		gomoku-number-of-emacs-wins
! 		(if (zerop gomoku-number-of-draws)
! 		    ""
! 		  (format ", drew %d" gomoku-number-of-draws))))
    (force-mode-line-update))
  
*************** If the game is finished, this command re
*** 976,984 ****
    (let ((buff (get-buffer "*Gomoku*")))
      (if buff				; Buffer exists:
!       (switch-to-buffer buff)		;   no problem.
!      (if gomoku-game-in-progress
! 	 (gomoku-crash-game))		;   buffer has been killed or something
!      (switch-to-buffer "*Gomoku*")	; Anyway, start anew.
!      (gomoku-mode))))
  
  ;;;
--- 1054,1062 ----
    (let ((buff (get-buffer "*Gomoku*")))
      (if buff				; Buffer exists:
! 	(switch-to-buffer buff)		;   no problem.
!       (if gomoku-game-in-progress
! 	  (gomoku-crash-game))		;   buffer has been killed or something
!       (switch-to-buffer "*Gomoku*")	; Anyway, start anew.
!       (gomoku-mode))))
  
  ;;;
*************** If the game is finished, this command re
*** 991,1007 ****
  ;; who won. The solution is to scan the board along all four directions.
  
- (defvar gomoku-winning-qtuple-beg nil
-   "First square of the winning qtuple.")
- 
- (defvar gomoku-winning-qtuple-end nil
-   "Last square of the winning qtuple.")
- 
- (defvar gomoku-winning-qtuple-dx nil
-   "Direction of the winning qtuple (along the X axis).")
- 
- (defvar gomoku-winning-qtuple-dy nil
-   "Direction of the winning qtuple (along the Y axis).")
- 
- 
  (defun gomoku-find-filled-qtuple (square value)
    "Return T if SQUARE belongs to a qtuple filled with VALUEs."
--- 1069,1072 ----
*************** If the game is finished, this command re
*** 1013,1071 ****
  (defun gomoku-check-filled-qtuple (square value dx dy)
    "Return T if SQUARE belongs to a qtuple filled  with VALUEs along DX, DY."
-   ;; And record it in the WINNING-QTUPLE-... variables.
    (let ((a 0) (b 0)
  	(left square) (right square)
! 	(depl (gomoku-xy-to-index dx dy))
! 	a+4)
      (while (and (> a -4)		; stretch tuple left
  		(= value (aref gomoku-board (setq left (- left depl)))))
        (setq a (1- a)))
!     (setq a+4 (+ a 4))
!     (while (and (< b a+4)		; stretch tuple right
  		(= value (aref gomoku-board (setq right (+ right depl)))))
        (setq b (1+ b)))
!     (cond ((= b a+4)			; tuple length = 5 ?
! 	   (setq gomoku-winning-qtuple-beg (+ square (* a depl))
! 		 gomoku-winning-qtuple-end (+ square (* b depl))
! 		 gomoku-winning-qtuple-dx dx
! 		 gomoku-winning-qtuple-dy dy)
  	   t))))
  
- (defun gomoku-cross-winning-qtuple ()
-   "Cross winning qtuple, as found by `gomoku-find-filled-qtuple'."
-   (gomoku-cross-qtuple gomoku-winning-qtuple-beg
- 		       gomoku-winning-qtuple-end
- 		       gomoku-winning-qtuple-dx
- 		       gomoku-winning-qtuple-dy))
- 
  (defun gomoku-cross-qtuple (square1 square2 dx dy)
    "Cross every square between SQUARE1 and SQUARE2 in the DX, DY direction."
    (save-excursion			; Not moving point from last square
!     (let ((depl (gomoku-xy-to-index dx dy)))
        ;; WARNING: this function assumes DEPL > 0 and SQUARE2 > SQUARE1
!       (while (not (= square1 square2))
  	(gomoku-goto-square square1)
  	(setq square1 (+ square1 depl))
  	(cond
! 	  ((and (= dx 1) (= dy 0))	; Horizontal
! 	   (let ((n 1))
! 	     (while (< n gomoku-square-width)
! 	       (setq n (1+ n))
! 	       (forward-char 1)
! 	       (gomoku-put-char ?-))))
! 	  ((and (= dx 0) (= dy 1))	; Vertical
! 	   (let ((n 1))
  	     (while (< n gomoku-square-height)
  	       (setq n (1+ n))
! 	       (next-line 1)
! 	       (gomoku-put-char ?|))))
! 	  ((and (= dx -1) (= dy 1))	; 1st Diagonal
! 	   (backward-char (/ gomoku-square-width 2))
! 	   (next-line (/ gomoku-square-height 2))
! 	   (gomoku-put-char ?/))
! 	  ((and (= dx 1) (= dy 1))	; 2nd Diagonal
! 	   (forward-char (/ gomoku-square-width 2))
! 	   (next-line (/ gomoku-square-height 2))
! 	   (gomoku-put-char ?\\))))))
    (sit-for 0))				; Display NOW
  
--- 1078,1128 ----
  (defun gomoku-check-filled-qtuple (square value dx dy)
    "Return T if SQUARE belongs to a qtuple filled  with VALUEs along DX, DY."
    (let ((a 0) (b 0)
  	(left square) (right square)
! 	(depl (gomoku-xy-to-index dx dy)))
      (while (and (> a -4)		; stretch tuple left
  		(= value (aref gomoku-board (setq left (- left depl)))))
        (setq a (1- a)))
!     (while (and (< b (+ a 4))		; stretch tuple right
  		(= value (aref gomoku-board (setq right (+ right depl)))))
        (setq b (1+ b)))
!     (cond ((= b (+ a 4))		; tuple length = 5 ?
! 	   (gomoku-cross-qtuple (+ square (* a depl)) (+ square (* b depl))
! 				dx dy)
  	   t))))
  
  (defun gomoku-cross-qtuple (square1 square2 dx dy)
    "Cross every square between SQUARE1 and SQUARE2 in the DX, DY direction."
    (save-excursion			; Not moving point from last square
!     (let ((depl (gomoku-xy-to-index dx dy))
! 	  (inhibit-read-only t)
! 	  (inhibit-point-motion-hooks t))
        ;; WARNING: this function assumes DEPL > 0 and SQUARE2 > SQUARE1
!       (while (/= square1 square2)
  	(gomoku-goto-square square1)
  	(setq square1 (+ square1 depl))
  	(cond
! 	  ((= dy 0)			; Horizontal
! 	   (forward-char 1)
! 	   (insert-char ?- (1- gomoku-square-width) t)
! 	   (delete-region (point) (progn
! 				    (skip-chars-forward " \t")
! 				    (point))))
! 	  ((= dx 0)			; Vertical
! 	   (let ((n 1)
! 		 (column (current-column)))
  	     (while (< n gomoku-square-height)
  	       (setq n (1+ n))
! 	       (forward-line 1)
! 	       (indent-to column)
! 	       (insert-and-inherit ?|))))
! 	  ((= dx -1)			; 1st Diagonal
! 	   (indent-to (prog1 (- (current-column) (/ gomoku-square-width 2))
! 			(forward-line (/ gomoku-square-height 2))))
! 	   (insert-and-inherit ?/))
! 	  (t				; 2nd Diagonal
! 	   (indent-to (prog1 (+ (current-column) (/ gomoku-square-width 2))
! 			(forward-line (/ gomoku-square-height 2))))
! 	   (insert-and-inherit ?\\))))))
    (sit-for 0))				; Display NOW
  
*************** If the game is finished, this command re
*** 1073,1107 ****
  ;;; CURSOR MOTION.
  ;;;
! (defun gomoku-move-left ()
!   "Move point backward one column on the Gomoku board."
!   (interactive)
!   (let ((x (gomoku-point-x)))
!     (backward-char (cond ((null x) 1)
! 			 ((> x 1) gomoku-square-width)
! 			 (t 0)))))
! 
! (defun gomoku-move-right ()
!   "Move point forward one column on the Gomoku board."
!   (interactive)
!   (let ((x (gomoku-point-x)))
!     (forward-char (cond ((null x) 1)
! 			((< x gomoku-board-width) gomoku-square-width)
! 			(t 0)))))
! 
  (defun gomoku-move-down ()
    "Move point down one row on the Gomoku board."
    (interactive)
!   (let ((y (gomoku-point-y)))
!     (next-line (cond ((null y) 1)
! 		     ((< y gomoku-board-height) gomoku-square-height)
! 		     (t 0)))))
  
  (defun gomoku-move-up ()
    "Move point up one row on the Gomoku board."
    (interactive)
!   (let ((y (gomoku-point-y)))
!     (previous-line (cond ((null y) 1)
! 			 ((> y 1) gomoku-square-height)
! 			 (t 0)))))
  
  (defun gomoku-move-ne ()
--- 1130,1145 ----
  ;;; CURSOR MOTION.
  ;;;
! ;; previous-line and next-line don't work right with intangible newlines
  (defun gomoku-move-down ()
    "Move point down one row on the Gomoku board."
    (interactive)
!   (if (< (gomoku-point-y) gomoku-board-height)
!       (next-line gomoku-square-height)))
  
  (defun gomoku-move-up ()
    "Move point up one row on the Gomoku board."
    (interactive)
!   (if (> (gomoku-point-y) 1)
!       (previous-line gomoku-square-height)))
  
  (defun gomoku-move-ne ()
*************** If the game is finished, this command re
*** 1109,1113 ****
    (interactive)
    (gomoku-move-up)
!   (gomoku-move-right))
  
  (defun gomoku-move-se ()
--- 1147,1151 ----
    (interactive)
    (gomoku-move-up)
!   (forward-char))
  
  (defun gomoku-move-se ()
*************** If the game is finished, this command re
*** 1115,1119 ****
    (interactive)
    (gomoku-move-down)
!   (gomoku-move-right))
  
  (defun gomoku-move-nw ()
--- 1153,1157 ----
    (interactive)
    (gomoku-move-down)
!   (forward-char))
  
  (defun gomoku-move-nw ()
*************** If the game is finished, this command re
*** 1121,1125 ****
    (interactive)
    (gomoku-move-up)
!   (gomoku-move-left))
  
  (defun gomoku-move-sw ()
--- 1159,1163 ----
    (interactive)
    (gomoku-move-up)
!   (backward-char))
  
  (defun gomoku-move-sw ()
*************** If the game is finished, this command re
*** 1127,1131 ****
    (interactive)
    (gomoku-move-down)
!   (gomoku-move-left))
  
  (provide 'gomoku)
--- 1165,1180 ----
    (interactive)
    (gomoku-move-down)
!   (backward-char))
! 
! (defun gomoku-beginning-of-line ()
!   "Move point to first square on the Gomoku board row."
!   (interactive)
!   (move-to-column gomoku-x-offset))
! 
! (defun gomoku-end-of-line ()
!   "Move point to last square on the Gomoku board row."
!   (interactive)
!   (move-to-column (+ gomoku-x-offset
! 		     (* gomoku-square-width (1- gomoku-board-width)))))
  
  (provide 'gomoku)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/goto-addr.el emacs-19.31/lisp/goto-addr.el
*** emacs-19.30/lisp/goto-addr.el	Tue Nov 14 16:22:25 1995
--- emacs-19.31/lisp/goto-addr.el	Mon Apr 15 23:56:08 1996
***************
*** 1,3 ****
--- 1,4 ----
  ;;; goto-addr.el --- click to browse URL or to send to e-mail address
+ 
  ;; Copyright (C) 1995 Free Software Foundation, Inc.
  
***************
*** 20,25 ****
  
  ;; 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:
--- 21,27 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 29,33 ****
  ;; your choice using the browse-url package, or if it's an e-mail
  ;; address, to send an e-mail to that address.  By default, we bind to
! ;; the [S-mouse-2] and the [C-c return] key sequences.
  
  ;; INSTALLATION
--- 31,35 ----
  ;; your choice using the browse-url package, or if it's an e-mail
  ;; address, to send an e-mail to that address.  By default, we bind to
! ;; the [mouse-2] and the [C-c return] key sequences.
  
  ;; INSTALLATION
***************
*** 41,60 ****
  ;; To use mh-e to send mail, add the following to your .emacs file:
  ;;
! ;; (setq goto-address-mail-method 'goto-address-send-using-mhe)
  ;;
- ;; To rebind, for example, the mouse click method to [mouse-2] in
- ;; mh-show-mode, add the following (instead of the first add-hook example
- ;; above) to your .emacs file:
- ;;
- ;; (defun my-goto-address ()
- ;;   (goto-address)
- ;;   (local-unset-key [S-mouse-2])
- ;;   (local-set-key [mouse-2] 'goto-address-at-mouse))
- ;;
- ;; (add-hook 'mh-show-mode-hook 'my-goto-address)
- ;;
- ;; [mouse-2] is not the default mouse binding because I use goto-address in
- ;; some editable buffers, where [mouse-2] means mouse-yank-at-click, as well
- ;; as in some modes where [mouse-2] is bound to other useful functions.
  
  ;; BUG REPORTS
--- 43,58 ----
  ;; To use mh-e to send mail, add the following to your .emacs file:
  ;;
! ;; (setq goto-address-mail-method 'goto-address-send-using-mh-e)
! ;;
! ;; The mouse click method is bound to [mouse-2] on highlighted URL's or
! ;; e-mail addresses only; it functions normally everywhere else.  To bind
! ;; another mouse click to the function, add the following to your .emacs
! ;; (for example):
! ;;
! ;; (setq goto-address-highlight-keymap
! ;;   (let ((m (make-sparse-keymap)))
! ;;     (define-key m [S-mouse-2] 'goto-address-at-mouse)
! ;;     m))
  ;;
  
  ;; BUG REPORTS
*************** But only if `goto-address-highlight-p' i
*** 101,105 ****
    "*Function to compose mail.
  Two pre-made functions are `goto-address-send-using-mail' (sendmail);
! and `goto-address-send-using-mhe' (MH-E).")
  
  (defun goto-address-fontify ()
--- 99,109 ----
    "*Function to compose mail.
  Two pre-made functions are `goto-address-send-using-mail' (sendmail);
! and `goto-address-send-using-mh-e' (MH-E).")
! 
! (defvar goto-address-highlight-keymap
!   (let ((m (make-sparse-keymap)))
!     (define-key m [mouse-2] 'goto-address-at-mouse)
!     m)
!   "keymap to hold goto-addr's mouse key defs under highlighted URLs.")
  
  (defun goto-address-fontify ()
*************** and `goto-address-fontify-p'."
*** 115,128 ****
  	  (progn
  	    (while (re-search-forward goto-address-url-regexp nil t)
! 	      (progn
! 		(goto-char (match-end 0))
  		(and goto-address-fontify-p
! 		     (put-text-property (match-beginning 0) (match-end 0)
! 					'face 'bold))
! 		(put-text-property (match-beginning 0) (match-end 0)
! 				   'mouse-face 'highlight)))
  	    (goto-char (point-min))
  	    (while (re-search-forward goto-address-mail-regexp nil t)
! 	      (progn
  		(goto-char (match-end 0))
  		(and goto-address-fontify-p
--- 119,134 ----
  	  (progn
  	    (while (re-search-forward goto-address-url-regexp nil t)
!               (let ((s (match-beginning 0))
!                     (e (match-end 0)))
! 		(goto-char e)
  		(and goto-address-fontify-p
! 		     (put-text-property s e 'face 'bold))
! 		(put-text-property s e 'mouse-face 'highlight)
! 		(put-text-property
! 		 s e 'local-map goto-address-highlight-keymap)))
  	    (goto-char (point-min))
  	    (while (re-search-forward goto-address-mail-regexp nil t)
!               (let ((s (match-beginning 0))
!                     (e (match-end 0)))
  		(goto-char (match-end 0))
  		(and goto-address-fontify-p
*************** and `goto-address-fontify-p'."
*** 130,134 ****
  					'face 'italic))
  		(put-text-property (match-beginning 0) (match-end 0)
! 			       'mouse-face 'secondary-selection)))))
        (and (buffer-modified-p)
  	   (not modified)
--- 136,142 ----
  					'face 'italic))
  		(put-text-property (match-beginning 0) (match-end 0)
! 				   'mouse-face 'secondary-selection)
! 		(put-text-property
! 		 s e 'local-map goto-address-highlight-keymap)))))
        (and (buffer-modified-p)
  	   (not modified)
*************** and `goto-address-fontify-p'."
*** 138,141 ****
--- 146,150 ----
  ;;; snarfed from browse-url.el
  
+ ;;;###autoload
  (defun goto-address-at-mouse (event)
    "Send to the e-mail address or load the URL clicked with the mouse.
*************** there, then load the URL at or before th
*** 157,160 ****
--- 166,170 ----
  	  (funcall goto-address-mail-method address))))))
  
+ ;;;###autoload
  (defun goto-address-at-point ()
    "Send to the e-mail address or load the URL at point.
*************** address.  If no e-mail address found, re
*** 185,189 ****
        "")))
  
! (defun goto-address-send-using-mhe (to)
    (mh-find-path)
    (let ((cc (mh-read-address "Cc: "))
--- 195,200 ----
        "")))
  
! (defun goto-address-send-using-mh-e (to)
!   (require 'mh-comp)
    (mh-find-path)
    (let ((cc (mh-read-address "Cc: "))
*************** address.  If no e-mail address found, re
*** 193,196 ****
--- 204,209 ----
      (mh-send-sub to cc subject config)))
  
+ (fset 'goto-address-send-using-mhe 'goto-address-send-using-mh-e)
+ 
  (defun goto-address-send-using-mail (to)
    (mail-other-window nil to)
*************** address.  If no e-mail address found, re
*** 203,212 ****
  Allows user to use mouse/keyboard command to click to go to a URL
  or to send e-mail.
! By default, goto-address binds to S-mouse-2 and C-c RET.
  
  Also fontifies the buffer appropriately (see `goto-address-fontify-p' and
  `goto-address-highlight-p' for more information)."
    (interactive)
-   (local-set-key [S-mouse-2] 'goto-address-at-mouse)
    (local-set-key "\C-c\r" 'goto-address-at-point)
    (if goto-address-highlight-p
--- 216,224 ----
  Allows user to use mouse/keyboard command to click to go to a URL
  or to send e-mail.
! By default, goto-address binds to mouse-2 and C-c RET.
  
  Also fontifies the buffer appropriately (see `goto-address-fontify-p' and
  `goto-address-highlight-p' for more information)."
    (interactive)
    (local-set-key "\C-c\r" 'goto-address-at-point)
    (if goto-address-highlight-p
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/gud.el emacs-19.31/lisp/gud.el
*** emacs-19.30/lisp/gud.el	Fri Oct 20 18:29:47 1995
--- emacs-19.31/lisp/gud.el	Thu May  9 22:39:31 1996
***************
*** 1,4 ****
! ;;; gud.el --- Grand Unified Debugger mode for gdb, sdb, dbx, or xdb
! ;;;            under Emacs
  
  ;; Author: Eric S. Raymond <esr@snark.thyrsus.com>
--- 1,3 ----
! ;;; gud.el --- Grand Unified Debugger mode for gdb, sdb, dbx, or xdb under Emacs
  
  ;; Author: Eric S. Raymond <esr@snark.thyrsus.com>
***************
*** 21,26 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** available with older versions of GDB."
*** 414,424 ****
  	(cond 
  	 ;; System V Release 3.2 uses this format
! 	 ((string-match "\\(^0x\\w* in \\|^\\|\n\\)\\([^:\n]*\\):\\([0-9]*\\):.*\n"
  			gud-marker-acc start)
  	  (setq gud-last-frame
  		(cons
! 		 (substring gud-marker-acc (match-beginning 2) (match-end 2))
  		 (string-to-int 
! 		  (substring gud-marker-acc (match-beginning 3) (match-end 3))))))
  	 ;; System V Release 4.0 quite often clumps two lines together
  	 ((string-match "^\\(BREAKPOINT\\|STEPPED\\) process [0-9]+ function [^ ]+ in \\(.+\\)\n\\([0-9]+\\):" 
--- 414,424 ----
  	(cond 
  	 ;; System V Release 3.2 uses this format
! 	 ((string-match "\\(^\\|\n\\)\\*?\\(0x\\w* in \\)?\\([^:\n]*\\):\\([0-9]*\\):.*\n"
  			gud-marker-acc start)
  	  (setq gud-last-frame
  		(cons
! 		 (substring gud-marker-acc (match-beginning 3) (match-end 3))
  		 (string-to-int 
! 		  (substring gud-marker-acc (match-beginning 4) (match-end 4))))))
  	 ;; System V Release 4.0 quite often clumps two lines together
  	 ((string-match "^\\(BREAKPOINT\\|STEPPED\\) process [0-9]+ function [^ ]+ in \\(.+\\)\n\\([0-9]+\\):" 
*************** available with older versions of GDB."
*** 452,461 ****
  
      ;; If we have an incomplete line, store it in gud-marker-acc.
!     ;; Otherwise clear gud-marker-acc. to avoid an
!     ;; unnecessary concat when this function runs next.
!     (setq gud-marker-acc 
! 	  (if (= start (length gud-marker-acc))
! 	      (substring gud-marker-acc start)
! 	    nil)))
    string)
  
--- 452,456 ----
  
      ;; If we have an incomplete line, store it in gud-marker-acc.
!     (setq gud-marker-acc (substring gud-marker-acc (or start 0))))
    string)
  
*************** This works in IRIX 4, 5 and 6.")
*** 727,731 ****
      (let ((realf (gud-dbx-file-name f)))
        (if realf
! 	  (let ((buf (find-file-noselect f)))
  	    (set-buffer buf)
  	    (gud-make-debug-menu)
--- 722,726 ----
      (let ((realf (gud-dbx-file-name f)))
        (if realf
! 	  (let ((buf (find-file-noselect realf)))
  	    (set-buffer buf)
  	    (gud-make-debug-menu)
*************** and source-file directory for your debug
*** 1061,1066 ****
  
     You start it up with one of the commands M-x gdb, M-x sdb, M-x dbx,
! or M-x xdb.  Each entry point finishes by executing a hook; `gdb-mode-hook',
! `sdb-mode-hook', `dbx-mode-hook' or `xdb-mode-hook' respectively.
  
  After startup, the following commands are available in both the GUD
--- 1056,1062 ----
  
     You start it up with one of the commands M-x gdb, M-x sdb, M-x dbx,
! M-x perldb, or M-x xdb.  Each entry point finishes by executing a
! hook; `gdb-mode-hook', `sdb-mode-hook', `dbx-mode-hook',
! `perldb-mode-hook', or `xdb-mode-hook' respectively.
  
  After startup, the following commands are available in both the GUD
*************** It is saved for when this flag is not se
*** 1230,1242 ****
  	    (setq gud-filter-pending-text
  		  (concat (or gud-filter-pending-text "") string))
! 	  (save-excursion
! 	    ;; If we have to ask a question during the processing,
! 	    ;; defer any additional text that comes from the debugger
! 	    ;; during that time.
! 	    (let ((gud-filter-defer-flag t))
! 	      ;; Process now any text we previously saved up.
! 	      (if gud-filter-pending-text
! 		  (setq string (concat gud-filter-pending-text string)
! 			gud-filter-pending-text nil))
  	      (set-buffer (process-buffer proc))
  	      ;; If we have been so requested, delete the debugger prompt.
--- 1226,1239 ----
  	    (setq gud-filter-pending-text
  		  (concat (or gud-filter-pending-text "") string))
! 
! 	  ;; If we have to ask a question during the processing,
! 	  ;; defer any additional text that comes from the debugger
! 	  ;; during that time.
! 	  (let ((gud-filter-defer-flag t))
! 	    ;; Process now any text we previously saved up.
! 	    (if gud-filter-pending-text
! 		(setq string (concat gud-filter-pending-text string)
! 		      gud-filter-pending-text nil))
! 	    (save-excursion
  	      (set-buffer (process-buffer proc))
  	      ;; If we have been so requested, delete the debugger prompt.
*************** It is saved for when this flag is not se
*** 1254,1271 ****
  		    (and gud-last-frame
  			 (>= (point) (process-mark proc))
! 			 (get-buffer-window (current-buffer)))))
! 	    (if process-window
! 		(save-selected-window
! 		  (select-window process-window)
! 		  (gud-display-frame)))
! 
! 	    ;; Let the comint filter do the actual insertion.
! 	    ;; That lets us inherit various comint features.
! 	    (comint-output-filter proc output)
  
! 	    ;; If we deferred text that arrived during this processing,
! 	    ;; handle it now.
! 	    (if gud-filter-pending-text
! 		(gud-filter proc "")))))))
  
  (defun gud-sentinel (proc msg)
--- 1251,1279 ----
  		    (and gud-last-frame
  			 (>= (point) (process-mark proc))
! 			 (get-buffer-window (current-buffer))))
  
! 	      ;; Let the comint filter do the actual insertion.
! 	      ;; That lets us inherit various comint features.
! 	      (comint-output-filter proc output)))
! 
! 	  ;; Put the arrow on the source line.
! 	  ;; This must be outside of the save-excursion
! 	  ;; in case the source file is our current buffer.
! 	  (if process-window
! 	      (save-selected-window
! 		(select-window process-window)
! 		(gud-display-frame))
! 	    ;; We have to be in the proper buffer, (process-buffer proc),
! 	    ;; but not in a save-excursion, because that would restore point.
! 	    (let ((old-buf (current-buffer)))
! 	      (set-buffer (process-buffer proc))
! 	      (unwind-protect
! 		  (gud-display-frame)
! 		(set-buffer old-buf))))
! 
! 	  ;; If we deferred text that arrived during this processing,
! 	  ;; handle it now.
! 	  (if gud-filter-pending-text
! 	      (gud-filter proc ""))))))
  
  (defun gud-sentinel (proc msg)
*************** Obeying it means displaying in another w
*** 1323,1334 ****
  (defun gud-display-line (true-file line)
    (let* ((last-nonmenu-event t)	 ; Prevent use of dialog box for questions.
! 	 (buffer (gud-find-file true-file))
  	 (window (display-buffer buffer))
  	 (pos))
- ;;;    (if (equal buffer (current-buffer))
- ;;;	nil
- ;;;      (setq buffer-read-only nil))
      (save-excursion
- ;;;      (setq buffer-read-only t)
        (set-buffer buffer)
        (save-restriction
--- 1331,1342 ----
  (defun gud-display-line (true-file line)
    (let* ((last-nonmenu-event t)	 ; Prevent use of dialog box for questions.
! 	 (buffer
! 	  (save-excursion
! 	    (or (eq (current-buffer) gud-comint-buffer)
! 		(set-buffer gud-comint-buffer))
! 	    (gud-find-file true-file)))
  	 (window (display-buffer buffer))
  	 (pos))
      (save-excursion
        (set-buffer buffer)
        (save-restriction
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/gulp.el emacs-19.31/lisp/gulp.el
*** emacs-19.30/lisp/gulp.el	Wed Dec 31 19:00:00 1969
--- emacs-19.31/lisp/gulp.el	Fri May 10 01:55:04 1996
***************
*** 0 ****
--- 1,151 ----
+ ;;; gulp.el --- Ask for updates for Lisp packages
+ 
+ ;; Copyright (C) 1996 Free Software Foundation, Inc.
+ 
+ ;; Author: Sam Shteingold <shteingd@math.ucla.edu>
+ ;; Maintainer: FSF
+ ;; Keywords: maintenance
+ 
+ ;; 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:
+ 
+ ;; Search the emacs/{version}/lisp directory for *.el files, extract the
+ ;; name of the author or maintainer and send him e-mail requesting
+ ;; update.
+ 
+ ;;; Code:
+ 
+ (defvar gulp-discard "^;+ *Maintainer: *FSF *$"
+   "*The regexp matching the packages not requiring the request for updates.")
+ 
+ (defvar gulp-tmp-buffer "*gulp*" "The name of the temporary buffer.")
+ 
+ (defvar gulp-max-len 2000
+   "*Distance into a Lisp source file to scan for keywords.")
+ 
+ (defvar gulp-request-header
+   (concat
+    "This message was created automatically.
+ A new version of GNU Emacs, "
+    (format "%d.%d" emacs-major-version (+ emacs-minor-version 1))
+    ", is entering the pretest state,
+ and it is high time to submit the updates to the various emacs packages.
+ You're listed as the maintainer of the following package(s):\n\n")
+   "*The starting text of a gulp message.")
+ 
+ (defvar gulp-request-end
+   (concat
+    "\nIf you have any changes since the version in the previous release ("
+    (format "%d.%d" emacs-major-version emacs-minor-version)
+    "),
+ please send them to me ASAP.
+ 
+ Thanks.")
+   "*The closing text in a gulp message.")
+ 
+ (defun gulp-send-requests (dir &optional time)
+   "Send requests for updates to the authors of Lisp packages in directory DIR.
+ For each maintainer, the message consists of `gulp-request-header',
+ followed by the list of packages (with modification times if the optional
+ prefix argument TIME is non-nil), concluded with `gulp-request-end'.
+ 
+ You can't edit the messages, but you can confirm whether to send each one.
+ 
+ The list of addresses for which you decided not to send mail
+ is left in the `*gulp*' buffer at the end."
+   (interactive "DRequest updates for Lisp directory: \nP")
+   (save-excursion
+     (set-buffer (get-buffer-create gulp-tmp-buffer))
+     (let ((m-p-alist (gulp-create-m-p-alist
+ 		      (directory-files dir nil "^[^=].*\\.el$" t)
+ 		      dir))
+ 	  ;; Temporarily inhibit undo in the *gulp* buffer.
+ 	  (buffer-undo-list t)
+ 	  mail-setup-hook msg node)
+       (while (setq node (car m-p-alist))
+ 	(setq msg (gulp-create-message (cdr node) time))
+ 	(setq mail-setup-hook
+ 	      '(lambda () 
+ 		 (mail-subject)
+ 		 (insert "It's time for Emacs updates again")
+ 		 (goto-char (point-max))
+ 		 (insert msg)))
+ 	(mail nil (car node))
+ 	(if (y-or-n-p "Send? ") (mail-send)
+ 	  (kill-this-buffer)
+ 	  (set-buffer gulp-tmp-buffer)
+ 	  (insert (format "%s\n\n" node)))
+ 	(setq m-p-alist (cdr m-p-alist))))
+     (set-buffer gulp-tmp-buffer)
+     (setq buffer-undo-list nil)))
+ 
+ 
+ (defun gulp-create-message (rec time)
+   "Return the message string for REC, which is a list like (FILE TIME)."
+   (let (node (str gulp-request-header))
+     (while (setq node (car rec))
+       (setq str (concat str "\t" (car node)
+ 			(if time (concat "\tLast modified:\t" (cdr node)))
+ 			"\n"))
+       (setq rec (cdr rec)))
+     (concat str gulp-request-end)))
+ 
+ 
+ (defun gulp-create-m-p-alist (flist dir)
+   "Create the maintainer/package alist for files in FLIST in DIR.
+ That is a list of elements, each of the form (MAINTAINER PACKAGES...)."
+   (save-excursion
+     (let (mplist filen node mnt-tm mnt tm)
+       (get-buffer-create gulp-tmp-buffer)
+       (set-buffer gulp-tmp-buffer)
+       (setq buffer-undo-list t)
+       (while flist
+ 	(setq fl-tm (gulp-maintainer (setq filen (car flist)) dir))
+ 	(if (setq tm (cdr fl-tm) mnt (car fl-tm));; there is a definite maintainer
+ 	    (if (setq node (assoc mnt mplist));; this is not a new maintainer
+ 		(setq mplist (cons (cons mnt (cons (cons filen tm) (cdr node)))
+ 				   (delete node mplist)))
+ 	      (setq mplist (cons (list mnt (cons filen (cdr fl-tm))) mplist))))
+ 	(message "%s -- %s" filen fl-tm)
+ 	(setq flist (cdr flist)))
+       (erase-buffer)
+       mplist)))
+ 
+ (defun gulp-maintainer (filenm dir)
+   "Return a list (MAINTAINER TIMESTAMP) for the package FILENM in directory DIR."
+   (save-excursion
+     (let* ((fl (concat dir filenm)) mnt
+ 	   (timest (format-time-string "%Y-%m-%d %a %T %Z"
+ 				       (elt (file-attributes fl) 5))))
+       (set-buffer gulp-tmp-buffer)
+       (erase-buffer)
+       (insert-file-contents fl nil 0 gulp-max-len)
+       (goto-char 1)
+       (if (re-search-forward gulp-discard nil t)
+ 	  (setq mnt nil) ;; do nothing, return nil
+ 	(goto-char 1)
+ 	(if (and (re-search-forward "^;+ *Maintainer: \\(.*\\)$" nil t)
+ 		 (> (length (setq mnt (match-string 1))) 0))
+ 	    () ;; found!
+ 	  (goto-char 1)
+ 	  (if (re-search-forward "^;+ *Author: \\(.*\\)$" nil t)
+ 	      (setq mnt (match-string 1))))
+ 	(if (= (length mnt) 0) (setq mnt nil))) ;; "^;; Author: $" --> nil
+       (cons mnt timest))))
+ 
+ ;;; gulp.el ends here
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/hanoi.el emacs-19.31/lisp/hanoi.el
*** emacs-19.30/lisp/hanoi.el	Tue Apr 25 16:45:34 1995
--- emacs-19.31/lisp/hanoi.el	Thu Feb 15 19:10:47 1996
***************
*** 54,103 ****
  (defun hanoi (nrings)
    "Towers of Hanoi diversion.  Argument is number of rings."
!   (interactive
!    (list (if (null current-prefix-arg)
! 	     3
! 	     (prefix-numeric-value current-prefix-arg))))  
!   (if (<= nrings 0) (error "Negative number of rings"))
    (let* (floor-row
  	 fly-row
! 	 (window-height (window-height (selected-window)))
  	 (window-width (window-width (selected-window)))
  
! 	 ;; This is the unit of spacing to use between poles.  It
! 	 ;; must be even.  We round down, since rounding up might
! 	 ;; cause us to draw off the edge of the window.
! 	 (pole-spacing (logand (/ window-width 6) (lognot 1))))
!     (let (
! 	  ;; The poles are (1+ NRINGS) rows high; we also want an
! 	  ;; empty row at the top for the flying rings, a base, and a
! 	  ;; blank line underneath that.
! 	  (h (+ nrings 4))
! 
! 	  ;; If we have NRINGS rings, we label them with the numbers 0
! 	  ;; through NRINGS-1.  The width of ring i is 2i+3; it pokes
! 	  ;; out i spaces on either side of the pole.  Rather than
! 	  ;; checking if the window is wide enough to accommodate this,
! 	  ;; we make sure pole-spacing is large enough, since that
! 	  ;; works even when we have decremented pole-spacing to make
! 	  ;; it even.
! 	  (w (1+ nrings)))
!       (if (not (and (>= window-height h)
! 		    (> pole-spacing w)))
! 	  (progn
! 	    (delete-other-windows)
! 	    (if (not (and (>= (setq window-height
! 				    (window-height (selected-window)))
! 			      h)
! 			  (> (setq pole-spacing
! 				   (logand (/ window-width 6) (lognot 1)))
! 			     w)))
! 		(error "Screen is too small (need at least %dx%d)" w h))))
!       (setq floor-row (if (> (- window-height 3) h)
! 			  (- window-height 3) window-height)))
      (let ((fly-row (- floor-row nrings 1))
  	  ;; pole: column . fill height
! 	  (pole-1 (cons pole-spacing floor-row))
! 	  (pole-2 (cons (* 3 pole-spacing) floor-row))
! 	  (pole-3 (cons (* 5 pole-spacing) floor-row))
  	  (rings (make-vector nrings nil)))
        ;; construct the ring list
--- 54,84 ----
  (defun hanoi (nrings)
    "Towers of Hanoi diversion.  Argument is number of rings."
!   (interactive "p")
!   (if (<= nrings 1) (setq nrings 7))
    (let* (floor-row
  	 fly-row
! 	 (window-height (1- (window-height (selected-window))))
  	 (window-width (window-width (selected-window)))
  
! 	 ;; This is half the spacing to use between poles.
! 	 (pole-spacing (/ window-width 6)))
!     (if (not (and (> window-height (1+ nrings))
! 		  (> pole-spacing nrings)))
! 	(progn
! 	  (delete-other-windows)
! 	  (if (not (and (> (setq window-height
! 				 (1- (window-height (selected-window))))
! 			   (1+ nrings))
! 			(> (setq pole-spacing (/ window-width 6))
! 			   nrings)))
! 	      (error "Window is too small (need at least %dx%d)"
! 		     (* 6 (1+ nrings)) (+ 2 nrings)))))
!     (setq floor-row (if (> (- window-height 3) (1+ nrings))
! 			(- window-height 3) window-height))
      (let ((fly-row (- floor-row nrings 1))
  	  ;; pole: column . fill height
! 	  (pole-1 (cons (1- pole-spacing) floor-row))
! 	  (pole-2 (cons (1- (* 3 pole-spacing)) floor-row))
! 	  (pole-3 (cons (1- (* 5 pole-spacing)) floor-row))
  	  (rings (make-vector nrings nil)))
        ;; construct the ring list
***************
*** 106,110 ****
  	  ;; ring: [pole-number string empty-string]
  	  (aset rings i (vector nil
! 				(make-string (+ i i 3) (+ ?0 i))
  				(make-string (+ i i 3) ?\  )))
  	  (setq i (1+ i))))
--- 87,91 ----
  	  ;; ring: [pole-number string empty-string]
  	  (aset rings i (vector nil
! 				(make-string (+ i i 3) (+ ?0 (% i 10)))
  				(make-string (+ i i 3) ?\  )))
  	  (setq i (1+ i))))
***************
*** 125,129 ****
        (let ((n 1))
  	(while (< n 6)
! 	  (hanoi-topos fly-row (* n pole-spacing))
  	  (setq n (+ n 2))
  	  (let ((i fly-row))
--- 106,110 ----
        (let ((n 1))
  	(while (< n 6)
! 	  (hanoi-topos fly-row (1- (* n pole-spacing)))
  	  (setq n (+ n 2))
  	  (let ((i fly-row))
***************
*** 150,157 ****
        (setq buffer-read-only t)
        (sit-for 0)
!       ;;
!       ;; do it!
!       ;;
!       (hanoi0 (1- nrings) pole-1 pole-2 pole-3)
        (goto-char (point-min))
        (message "Done")
--- 131,139 ----
        (setq buffer-read-only t)
        (sit-for 0)
!       ;; Disable display of line and column numbers, for speed.
!       (let ((line-number-mode nil)
! 	    (column-number-mode nil))
! 	;; do it!
! 	(hanoi0 (1- nrings) pole-1 pole-2 pole-3))
        (goto-char (point-min))
        (message "Done")
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/help-macro.el emacs-19.31/lisp/help-macro.el
*** emacs-19.30/lisp/help-macro.el	Wed Jun 28 22:48:37 1995
--- emacs-19.31/lisp/help-macro.el	Wed Jan 24 19:32:14 1996
***************
*** 20,29 ****
  
  ;; 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:
! ;;
! ;; 	This file supplies the macro make-help-screen which constructs
  ;; single character dispatching with browsable help such as that provided
  ;; by help-for-help. This can be used to make many modes easier to use; for
--- 20,30 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
! 
! ;; This file supplies the macro make-help-screen which constructs
  ;; single character dispatching with browsable help such as that provided
  ;; by help-for-help. This can be used to make many modes easier to use; for
*************** and then returns."
*** 91,95 ****
  		  (substitute-command-keys (, help-line))))
  	     (if three-step-help
! 		 (message line-prompt))
  	     (let* ((help-screen (documentation (quote (, fname))))
  		    ;; We bind overriding-local-map for very small
--- 92,96 ----
  		  (substitute-command-keys (, help-line))))
  	     (if three-step-help
! 		 (message "%s" line-prompt))
  	     (let* ((help-screen (documentation (quote (, fname))))
  		    ;; We bind overriding-local-map for very small
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/help.el emacs-19.31/lisp/help.el
*** emacs-19.30/lisp/help.el	Mon Oct 30 19:43:09 1995
--- emacs-19.31/lisp/help.el	Mon Mar 18 01:44:13 1996
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** describes the minor mode."
*** 334,339 ****
  		(while (and indicator (symbolp indicator))
  		  (setq indicator (symbol-value indicator)))
! 		(princ (format "%s minor mode (indicator%s):\n"
! 			       pretty-minor-mode indicator))
  		(princ (documentation minor-mode))
  		(princ "\n\n"))))
--- 335,343 ----
  		(while (and indicator (symbolp indicator))
  		  (setq indicator (symbol-value indicator)))
! 		(princ (format "%s minor mode (%s):\n"
! 			       pretty-minor-mode
! 			       (if indicator
! 				   (format "indicator%s" indicator)
! 				 "no indicator")))
  		(princ (documentation minor-mode))
  		(princ "\n\n"))))
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/helper.el emacs-19.31/lisp/helper.el
*** emacs-19.30/lisp/helper.el	Sat May  6 02:53:16 1995
--- emacs-19.31/lisp/helper.el	Sun Jan 14 02:34:30 1996
***************
*** 20,29 ****
  
  ;; 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.
  
  ;;; Code:
  
! ; hey, here's a helping hand.
  
  ;; Bind this to a string for <blank> in "... Other keys <blank>".
--- 20,30 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Code:
  
! ;; hey, here's a helping hand.
  
  ;; Bind this to a string for <blank> in "... Other keys <blank>".
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/hexl.el emacs-19.31/lisp/hexl.el
*** emacs-19.30/lisp/hexl.el	Mon Nov 20 00:32:17 1995
--- emacs-19.31/lisp/hexl.el	Sun Mar 31 20:40:08 1996
***************
*** 20,25 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 54,60 ****
  
  (defvar hexl-program "hexl"
!   "The program that will hexlify and de-hexlify its stdin.
  `hexl-program' will always be concatenated with `hexl-options'
! and \"-de\" when dehexlfying a buffer.")
  
  (defvar hexl-iso ""
--- 55,61 ----
  
  (defvar hexl-program "hexl"
!   "The program that will hexlify and dehexlify its stdin.
  `hexl-program' will always be concatenated with `hexl-options'
! and \"-de\" when dehexlifying a buffer.")
  
  (defvar hexl-iso ""
*************** and \"-de\" when dehexlfying a buffer.")
*** 81,84 ****
--- 82,88 ----
  (defvar hexl-mode-old-mode-name)
  (defvar hexl-mode-old-major-mode)
+ (defvar hexl-mode-old-write-contents-hooks)
+ (defvar hexl-mode-old-require-final-newline)
+ (defvar hexl-mode-old-syntax-table)
  
  ;; routines
*************** You can use \\[hexl-find-file] to visit 
*** 158,163 ****
    (interactive "p")
    (if (eq major-mode 'hexl-mode)
!       (error "You are already in hexl mode.")
!     (kill-all-local-variables)
      (make-local-variable 'hexl-mode-old-local-map)
      (setq hexl-mode-old-local-map (current-local-map))
--- 162,169 ----
    (interactive "p")
    (if (eq major-mode 'hexl-mode)
!       (error "You are already in hexl mode")
! 
!     ;; We do not turn off the old major mode; instead we just
!     ;; override most of it.  That way, we can restore it perfectly.
      (make-local-variable 'hexl-mode-old-local-map)
      (setq hexl-mode-old-local-map (current-local-map))
*************** You can use \\[hexl-find-file] to visit 
*** 172,188 ****
      (setq major-mode 'hexl-mode)
  
      (make-local-variable 'write-contents-hooks)
      (add-hook 'write-contents-hooks 'hexl-save-buffer)
  
      (make-local-hook 'after-revert-hook)
      (add-hook 'after-revert-hook 'hexl-after-revert-hook nil t)
  
!     (make-local-variable 'hexl-max-address)
! 
!     (make-local-variable 'change-major-mode-hook)
!     (add-hook 'change-major-mode-hook 'hexl-maybe-dehexlify-buffer)
  
!     (make-local-variable 'require-final-newline)
!     (setq require-final-newline nil)
  
      (let ((modified (buffer-modified-p))
--- 178,203 ----
      (setq major-mode 'hexl-mode)
  
+     (make-local-variable 'hexl-mode-old-syntax-table)
+     (setq hexl-mode-old-syntax-table (syntax-table))
+     (set-syntax-table (standard-syntax-table))
+ 
+     (make-local-variable 'hexl-mode-old-write-contents-hooks)
+     (setq hexl-mode-old-write-contents-hooks write-contents-hooks)
      (make-local-variable 'write-contents-hooks)
      (add-hook 'write-contents-hooks 'hexl-save-buffer)
  
+     (make-local-variable 'hexl-mode-old-require-final-newline)
+     (setq hexl-mode-old-require-final-newline require-final-newline)
+     (make-local-variable 'require-final-newline)
+     (setq require-final-newline nil)
+ 
+     ;; Add hooks to rehexlify or dehexlify on various events.
      (make-local-hook 'after-revert-hook)
      (add-hook 'after-revert-hook 'hexl-after-revert-hook nil t)
  
!     (make-local-hook 'change-major-mode-hook)
!     (add-hook 'change-major-mode-hook 'hexl-maybe-dehexlify-buffer nil t)
  
!     (make-local-variable 'hexl-max-address)
  
      (let ((modified (buffer-modified-p))
*************** With arg, don't unhexlify buffer."
*** 255,263 ****
  	    (original-point (1+ (hexl-current-address))))
  	(dehexlify-buffer)
! 	(remove-hook 'write-contents-hook 'hexl-save-buffer)
  	(set-buffer-modified-p modified)
  	(goto-char original-point)))
    (setq mode-name hexl-mode-old-mode-name)
    (use-local-map hexl-mode-old-local-map)
    (setq major-mode hexl-mode-old-major-mode)
    (force-mode-line-update))
--- 270,285 ----
  	    (original-point (1+ (hexl-current-address))))
  	(dehexlify-buffer)
! 	(remove-hook 'write-contents-hooks 'hexl-save-buffer)
  	(set-buffer-modified-p modified)
  	(goto-char original-point)))
+ 
+   (remove-hook 'after-revert-hook 'hexl-after-revert-hook t)
+   (remove-hook 'change-major-mode-hook 'hexl-maybe-dehexlify-buffer t)
+ 
+   (setq write-contents-hooks hexl-mode-old-write-contents-hooks)
+   (setq require-final-newline hexl-mode-old-require-final-newline)
    (setq mode-name hexl-mode-old-mode-name)
    (use-local-map hexl-mode-old-local-map)
+   (set-syntax-table hexl-mode-old-syntax-table)
    (setq major-mode hexl-mode-old-major-mode)
    (force-mode-line-update))
*************** Ask the user for confirmation."
*** 271,275 ****
  	    (original-point (1+ (hexl-current-address))))
  	(dehexlify-buffer)
! 	(remove-hook 'write-contents-hook 'hexl-save-buffer)
  	(set-buffer-modified-p modified)
  	(goto-char original-point))))
--- 293,297 ----
  	    (original-point (1+ (hexl-current-address))))
  	(dehexlify-buffer)
! 	(remove-hook 'write-contents-hooks 'hexl-save-buffer)
  	(set-buffer-modified-p modified)
  	(goto-char original-point))))
*************** With prefix arg N, puts point N bytes of
*** 497,506 ****
  
  (defun hexl-beginning-of-1k-page ()
!   "Goto to beginning of 1k boundry."
    (interactive)
    (hexl-goto-address (logand (hexl-current-address) -1024)))
  
  (defun hexl-end-of-1k-page ()
!   "Goto to end of 1k boundry."
    (interactive)
    (hexl-goto-address (let ((address (logior (hexl-current-address) 1023)))
--- 519,528 ----
  
  (defun hexl-beginning-of-1k-page ()
!   "Go to beginning of 1k boundary."
    (interactive)
    (hexl-goto-address (logand (hexl-current-address) -1024)))
  
  (defun hexl-end-of-1k-page ()
!   "Go to end of 1k boundary."
    (interactive)
    (hexl-goto-address (let ((address (logior (hexl-current-address) 1023)))
*************** With prefix arg N, puts point N bytes of
*** 510,519 ****
  
  (defun hexl-beginning-of-512b-page ()
!   "Goto to beginning of 512 byte boundry."
    (interactive)
    (hexl-goto-address (logand (hexl-current-address) -512)))
  
  (defun hexl-end-of-512b-page ()
!   "Goto to end of 512 byte boundry."
    (interactive)
    (hexl-goto-address (let ((address (logior (hexl-current-address) 511)))
--- 532,541 ----
  
  (defun hexl-beginning-of-512b-page ()
!   "Go to beginning of 512 byte boundary."
    (interactive)
    (hexl-goto-address (logand (hexl-current-address) -512)))
  
  (defun hexl-end-of-512b-page ()
!   "Go to end of 512 byte boundary."
    (interactive)
    (hexl-goto-address (let ((address (logior (hexl-current-address) 511)))
*************** You may also type up to 3 octal digits, 
*** 533,547 ****
  ;;;###autoload
  (defun hexlify-buffer ()
!   "Convert a binary buffer to hexl format."
    (interactive)
    (let ((binary-process-output nil) ; for Ms-Dos
! 	(binary-process-input t))
      (shell-command-on-region (point-min) (point-max) hexlify-command t)))
  
  (defun dehexlify-buffer ()
!   "Convert a hexl format buffer to binary."
    (interactive)
    (let ((binary-process-output t) ; for Ms-Dos
! 	(binary-process-input nil))
      (shell-command-on-region (point-min) (point-max) dehexlify-command t)))
  
--- 555,581 ----
  ;;;###autoload
  (defun hexlify-buffer ()
!   "Convert a binary buffer to hexl format.
! This discards the buffer's undo information."
    (interactive)
+   (and buffer-undo-list
+        (or (y-or-n-p "Converting to hexl format discards undo info; ok? ")
+ 	   (error "Aborted")))
+   (setq buffer-undo-list nil)
    (let ((binary-process-output nil) ; for Ms-Dos
! 	(binary-process-input t)
! 	(buffer-undo-list t))
      (shell-command-on-region (point-min) (point-max) hexlify-command t)))
  
  (defun dehexlify-buffer ()
!   "Convert a hexl format buffer to binary.
! This discards the buffer's undo information."
    (interactive)
+   (and buffer-undo-list
+        (or (y-or-n-p "Converting from hexl format discards undo info; ok? ")
+ 	   (error "Aborted")))
+   (setq buffer-undo-list nil)
    (let ((binary-process-output t) ; for Ms-Dos
! 	(binary-process-input nil)
! 	(buffer-undo-list t))
      (shell-command-on-region (point-min) (point-max) dehexlify-command t)))
  
*************** You may also type up to 3 octal digits, 
*** 563,567 ****
        (if (and (>= ch ?a) (<= ch ?f))
  	  (- ch (- ?a 10))
! 	(error (format "Invalid hex digit `%c'." ch))))))
  
  (defun hexl-oct-char-to-integer (character)
--- 597,601 ----
        (if (and (>= ch ?a) (<= ch ?f))
  	  (- ch (- ?a 10))
! 	(error "Invalid hex digit `%c'." ch)))))
  
  (defun hexl-oct-char-to-integer (character)
*************** You may also type up to 3 octal digits, 
*** 569,573 ****
    (if (and (>= character ?0) (<= character ?7))
        (- character ?0)
!     (error (format "Invalid octal digit `%c'." character))))
  
  (defun hexl-printable-character (ch)
--- 603,607 ----
    (if (and (>= character ?0) (<= character ?7))
        (- character ?0)
!     (error "Invalid octal digit `%c'." character)))
  
  (defun hexl-printable-character (ch)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/hideif.el emacs-19.31/lisp/hideif.el
*** emacs-19.30/lisp/hideif.el	Wed Oct 25 23:13:23 1995
--- emacs-19.31/lisp/hideif.el	Sun May  5 13:27:14 1996
***************
*** 1,5 ****
  ;;; hide-ifdef-mode.el --- hides selected code within ifdef.
  
! ;;; Copyright (C) 1988, 1994 Free Software Foundation, Inc.
  
  ;; Author: Dan LaLiberte <liberte@a.cs.uiuc.edu>
--- 1,5 ----
  ;;; hide-ifdef-mode.el --- hides selected code within ifdef.
  
! ;; Copyright (C) 1988, 1994 Free Software Foundation, Inc.
  
  ;; Author: Dan LaLiberte <liberte@a.cs.uiuc.edu>
***************
*** 20,110 ****
  
  ;; 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:
  
! ;;; To initialize, toggle the hide-ifdef minor mode with
! ;;;
! ;;; M-x hide-ifdef-mode
! ;;;
! ;;; This will set up key bindings and call hide-ifdef-mode-hook if it
! ;;; has a value.  To explicitly hide ifdefs using a buffer-local
! ;;; define list (default empty), type
! ;;;
! ;;; M-x hide-ifdefs  or C-c @ h
! ;;;
! ;;; Hide-ifdef suppresses the display of code that the preprocessor wouldn't
! ;;; pass through.  The support of constant expressions in #if lines is 
! ;;; limited to identifiers, parens, and the operators: &&, ||, !, and
! ;;; "defined".  Please extend this.
! ;;;
! ;;; The hidden code is marked by ellipses (...).  Be
! ;;; cautious when editing near ellipses, since the hidden text is
! ;;; still in the buffer, and you can move the point into it and modify
! ;;; text unawares.  If you don't want to see the ellipses, set 
! ;;; selective-display-ellipses to nil.  But this can be dangerous.
! ;;; You can make your buffer read-only while hide-ifdef-hiding by setting
! ;;; hide-ifdef-read-only to a non-nil value.  You can toggle this 
! ;;; variable with hide-ifdef-toggle-read-only (C-c @ C-q).
! ;;;
! ;;; You can undo the effect of hide-ifdefs by typing
! ;;;
! ;;; M-x show-ifdefs  or C-c @ s
! ;;;
! ;;; Use M-x hide-ifdef-define (C-c @ d) to define a symbol.
! ;;; Use M-x hide-ifdef-undef (C-c @ u) to undefine a symbol.
! ;;;
! ;;; If you define or undefine a symbol while hide-ifdef-mode is in effect,
! ;;; the display will be updated.  Only the define list for the current
! ;;; buffer will be affected.  You can save changes to the local define
! ;;; list with hide-ifdef-set-define-alist.  This adds entries 
! ;;; to hide-ifdef-define-alist.
! ;;;
! ;;; If you have defined a hide-ifdef-mode-hook, you can set
! ;;; up a list of symbols that may be used by hide-ifdefs as in the
! ;;; following example:
! ;;;
! ;;; (setq hide-ifdef-mode-hook
! ;;;      '(lambda ()
! ;;;	 (if (not hide-ifdef-define-alist)
! ;;;	     (setq hide-ifdef-define-alist
! ;;;		  '((list1 ONE TWO)
! ;;;		    (list2 TWO THREE)
! ;;;		    )))
! ;;;	 (hide-ifdef-use-define-alist 'list2) ; use list2 by default
! ;;;	 ))
! ;;;
! ;;; You can call hide-ifdef-use-define-alist (C-c @ u) at any time to specify
! ;;; another list to use.
! ;;;
! ;;; To cause ifdefs to be hidden as soon as hide-ifdef-mode is called,
! ;;; set hide-ifdef-initially to non-nil.
! ;;;
! ;;; If you set hide-ifdef-lines to t, hide-ifdefs hides all the #ifdef lines.
! ;;; In the absence of highlighting, that might be a bad idea.  If you set
! ;;; hide-ifdef-lines to nil (the default), the surrounding preprocessor
! ;;; lines will be displayed.  That can be confusing in its own
! ;;; right.  Other variations on display are possible, but not much
! ;;; better.
! ;;;
! ;;; You can explicitly hide or show individual ifdef blocks irrespective
! ;;; of the define list by using hide-ifdef-block and show-ifdef-block.
! ;;;
! ;;; You can move the point between ifdefs with forward-ifdef, backward-ifdef,
! ;;; up-ifdef, down-ifdef, next-ifdef, and previous-ifdef.
! ;;;
! ;;; If you have minor-mode-alist in your mode line (the default) two labels
! ;;; may appear.  "Ifdef" will appear when hide-ifdef-mode is active.  "Hiding"
! ;;; will appear when text may be hidden ("hide-ifdef-hiding" is non-nil).
! ;;;
! ;;; Written by Brian Marick, at Gould, Computer Systems Division, Urbana IL.
! ;;; Extensively modified by Daniel LaLiberte (while at Gould).
! ;;;
! ;;; You may freely modify and distribute this, but keep a record
! ;;; of modifications and send comments to:
! ;;; 	 liberte@a.cs.uiuc.edu  or  ihnp4!uiucdcs!liberte
! ;;; I will continue to upgrade hide-ifdef-mode
! ;;; with your contributions.
  
  ;;; Code:
--- 20,111 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
! ;; To initialize, toggle the hide-ifdef minor mode with
! ;;
! ;; M-x hide-ifdef-mode
! ;;
! ;; This will set up key bindings and call hide-ifdef-mode-hook if it
! ;; has a value.  To explicitly hide ifdefs using a buffer-local
! ;; define list (default empty), type
! ;;
! ;; M-x hide-ifdefs  or C-c @ h
! ;;
! ;; Hide-ifdef suppresses the display of code that the preprocessor wouldn't
! ;; pass through.  The support of constant expressions in #if lines is 
! ;; limited to identifiers, parens, and the operators: &&, ||, !, and
! ;; "defined".  Please extend this.
! ;;
! ;; The hidden code is marked by ellipses (...).  Be
! ;; cautious when editing near ellipses, since the hidden text is
! ;; still in the buffer, and you can move the point into it and modify
! ;; text unawares.  If you don't want to see the ellipses, set 
! ;; selective-display-ellipses to nil.  But this can be dangerous.
! ;; You can make your buffer read-only while hide-ifdef-hiding by setting
! ;; hide-ifdef-read-only to a non-nil value.  You can toggle this 
! ;; variable with hide-ifdef-toggle-read-only (C-c @ C-q).
! ;;
! ;; You can undo the effect of hide-ifdefs by typing
! ;;
! ;; M-x show-ifdefs  or C-c @ s
! ;;
! ;; Use M-x hide-ifdef-define (C-c @ d) to define a symbol.
! ;; Use M-x hide-ifdef-undef (C-c @ u) to undefine a symbol.
! ;;
! ;; If you define or undefine a symbol while hide-ifdef-mode is in effect,
! ;; the display will be updated.  Only the define list for the current
! ;; buffer will be affected.  You can save changes to the local define
! ;; list with hide-ifdef-set-define-alist.  This adds entries 
! ;; to hide-ifdef-define-alist.
! ;;
! ;; If you have defined a hide-ifdef-mode-hook, you can set
! ;; up a list of symbols that may be used by hide-ifdefs as in the
! ;; following example:
! ;;
! ;; (setq hide-ifdef-mode-hook
! ;;      '(lambda ()
! ;;	 (if (not hide-ifdef-define-alist)
! ;;	     (setq hide-ifdef-define-alist
! ;;		  '((list1 ONE TWO)
! ;;		    (list2 TWO THREE)
! ;;		    )))
! ;;	 (hide-ifdef-use-define-alist 'list2) ; use list2 by default
! ;;	 ))
! ;;
! ;; You can call hide-ifdef-use-define-alist (C-c @ u) at any time to specify
! ;; another list to use.
! ;;
! ;; To cause ifdefs to be hidden as soon as hide-ifdef-mode is called,
! ;; set hide-ifdef-initially to non-nil.
! ;;
! ;; If you set hide-ifdef-lines to t, hide-ifdefs hides all the #ifdef lines.
! ;; In the absence of highlighting, that might be a bad idea.  If you set
! ;; hide-ifdef-lines to nil (the default), the surrounding preprocessor
! ;; lines will be displayed.  That can be confusing in its own
! ;; right.  Other variations on display are possible, but not much
! ;; better.
! ;;
! ;; You can explicitly hide or show individual ifdef blocks irrespective
! ;; of the define list by using hide-ifdef-block and show-ifdef-block.
! ;;
! ;; You can move the point between ifdefs with forward-ifdef, backward-ifdef,
! ;; up-ifdef, down-ifdef, next-ifdef, and previous-ifdef.
! ;;
! ;; If you have minor-mode-alist in your mode line (the default) two labels
! ;; may appear.  "Ifdef" will appear when hide-ifdef-mode is active.  "Hiding"
! ;; will appear when text may be hidden ("hide-ifdef-hiding" is non-nil).
! ;;
! ;; Written by Brian Marick, at Gould, Computer Systems Division, Urbana IL.
! ;; Extensively modified by Daniel LaLiberte (while at Gould).
! ;;
! ;; You may freely modify and distribute this, but keep a record
! ;; of modifications and send comments to:
! ;; 	 liberte@a.cs.uiuc.edu  or  ihnp4!uiucdcs!liberte
! ;; I will continue to upgrade hide-ifdef-mode
! ;; with your contributions.
  
  ;;; Code:
***************
*** 123,127 ****
  ;; Set up the submap that goes after the prefix key.
  (if hide-ifdef-mode-submap
!     ()				; dont redefine it.
    (setq hide-ifdef-mode-submap (make-sparse-keymap))
    (define-key hide-ifdef-mode-submap "d" 'hide-ifdef-define)
--- 124,128 ----
  ;; Set up the submap that goes after the prefix key.
  (if hide-ifdef-mode-submap
!     ()				; Don't redefine it.
    (setq hide-ifdef-mode-submap (make-sparse-keymap))
    (define-key hide-ifdef-mode-submap "d" 'hide-ifdef-define)
***************
*** 184,188 ****
  (defun hide-ifdef-mode (arg)
    "Toggle Hide-Ifdef mode.  This is a minor mode, albeit a large one.
! With ARG, turn Hide-Ifdef mode on iff arg is positive.
  In Hide-Ifdef mode, code within #ifdef constructs that the C preprocessor
  would eliminate may be hidden from view.  Several variables affect
--- 185,189 ----
  (defun hide-ifdef-mode (arg)
    "Toggle Hide-Ifdef mode.  This is a minor mode, albeit a large one.
! With ARG, turn Hide-Ifdef mode on if arg is positive, off otherwise.
  In Hide-Ifdef mode, code within #ifdef constructs that the C preprocessor
  would eliminate may be hidden from view.  Several variables affect
*************** hide-ifdef-read-only
*** 240,249 ****
  	    (hide-ifdefs)
  	  (show-ifdefs))
! 	(message "Enter hide-ifdef-mode.")
  	)
       ; else end hide-ifdef-mode
      (if hide-ifdef-hiding
  	(show-ifdefs))
!     (message "Exit hide-ifdef-mode.")
      ))
    
--- 241,250 ----
  	    (hide-ifdefs)
  	  (show-ifdefs))
! 	(message "Enter Hide-Ifdef mode")
  	)
       ; else end hide-ifdef-mode
      (if hide-ifdef-hiding
  	(show-ifdefs))
!     (message "Exit Hide-Ifdef mode")
      ))
    
*************** hide-ifdef-read-only
*** 251,256 ****
  ;; from outline.el with docstring fixed.
  (defun hif-outline-flag-region (from to flag)
!   "Hides or shows lines from FROM to TO, according to FLAG.  If FLAG
! is \\n (newline character) then text is shown, while if FLAG is \\^M
  \(control-M) the text is hidden."
    (let ((modp (buffer-modified-p)))
--- 252,257 ----
  ;; from outline.el with docstring fixed.
  (defun hif-outline-flag-region (from to flag)
!   "Hides or shows lines from FROM to TO, according to FLAG.
! If FLAG is \\n (newline character) then text is shown, while if FLAG is \\^M
  \(control-M) the text is hidden."
    (let ((modp (buffer-modified-p)))
*************** is \\n (newline character) then text is 
*** 267,270 ****
--- 268,279 ----
    (hif-outline-flag-region (point-min) (point-max) ?\n))
  
+ ;; By putting this on after-revert-hook, we arrange that it only
+ ;; does anything when revert-buffer avoids turning off the mode.
+ ;; (That can happen in VC.)
+ (defun hif-before-revert-function ()
+   (and hide-ifdef-mode hide-ifdef-hiding
+        (hide-ifdefs t)))
+ (add-hook 'after-revert-hook 'hif-before-revert-function)
+ 
  (defun hide-ifdef-region (start end)
    "START is the start of a #if or #else form.  END is the ending part.
*************** Everything including these lines is made
*** 282,287 ****
  ;===%%SF%% evaluation (Start)  ===
  
  (defvar hide-ifdef-evaluator 'eval
!   "The evaluator is given a canonical form and returns T if text under
  that form should be displayed.")
  
--- 291,299 ----
  ;===%%SF%% evaluation (Start)  ===
  
+ ;; It is not useful to set this to anything but `eval'.
+ ;; In fact, the variable might as well be eliminated.
  (defvar hide-ifdef-evaluator 'eval
!   "The function to use to evaluate a form.
! The evaluator is given a canonical form and returns t if text under
  that form should be displayed.")
  
*************** that form should be displayed.")
*** 420,424 ****
  
  (defun hif-expr ()
!   "Parse and expression of the form
         expr : term | expr '||' term."
    (let ((result (hif-term)))
--- 432,436 ----
  
  (defun hif-expr ()
!   "Parse an expression as found in #if.
         expr : term | expr '||' term."
    (let ((result (hif-term)))
*************** that form should be displayed.")
*** 429,434 ****
  
  (defun hif-term ()
!   "Parse a term of the form
!        term : eq-expr | term '&&' eq-expr."
    (let ((result (hif-eq-expr)))
      (while (eq token 'and)
--- 441,445 ----
  
  (defun hif-term ()
!   "Parse a term : eq-expr | term '&&' eq-expr."
    (let ((result (hif-eq-expr)))
      (while (eq token 'and)
*************** that form should be displayed.")
*** 438,443 ****
  
  (defun hif-eq-expr ()
!   "Parse a term of the form
!        eq-expr : math | eq-expr '=='|'!=' math."
    (let ((result (hif-math))
  	(eq-token nil))
--- 449,453 ----
  
  (defun hif-eq-expr ()
!   "Parse an eq-expr : math | eq-expr '=='|'!=' math."
    (let ((result (hif-math))
  	(eq-token nil))
*************** that form should be displayed.")
*** 449,453 ****
  
  (defun hif-math ()
!   "Parse an expression of the form
         math : factor | math '+|-' factor."
    (let ((result (hif-factor))
--- 459,463 ----
  
  (defun hif-math ()
!   "Parse an expression with + or - and simpler things.
         math : factor | math '+|-' factor."
    (let ((result (hif-factor))
*************** that form should be displayed.")
*** 460,465 ****
    
  (defun hif-factor ()
!   "Parse a factor of the form
!        factor : '!' factor | '(' expr ')' | 'defined(' id ')' | id."
    (cond
      ((eq token 'not)
--- 470,474 ----
    
  (defun hif-factor ()
!   "Parse a factor: '!' factor | '(' expr ')' | 'defined(' id ')' | id."
    (cond
      ((eq token 'not)
*************** that form should be displayed.")
*** 521,526 ****
  
  (defun hif-canonicalize ()
!   "When at beginning of #ifX, returns a canonical (evaluatable)
!        form for the expression."
    (save-excursion
      (let ((negate (looking-at hif-ifndef-regexp)))
--- 530,534 ----
  
  (defun hif-canonicalize ()
!   "When at beginning of #ifX, returns a Lisp expression for its condition."
    (save-excursion
      (let ((negate (looking-at hif-ifndef-regexp)))
*************** that form should be displayed.")
*** 537,542 ****
  
  (defun hif-find-any-ifX ()
!   "Position at beginning of next #if, #ifdef, or #ifndef, including one on
! this line."
  ;  (message "find ifX at %d" (point))
    (prog1
--- 545,549 ----
  
  (defun hif-find-any-ifX ()
!   "Move to next #if..., or #ifndef, at point or after."
  ;  (message "find ifX at %d" (point))
    (prog1
*************** this line."
*** 546,551 ****
  
  (defun hif-find-next-relevant ()
!   "Position at beginning of next #ifdef, #ifndef, #else, #endif,
! NOT including one on this line."
  ;  (message "hif-find-next-relevant at %d" (point))
    (end-of-line)
--- 553,557 ----
  
  (defun hif-find-next-relevant ()
!   "Move to next #if..., #else, or #endif, after the current line."
  ;  (message "hif-find-next-relevant at %d" (point))
    (end-of-line)
*************** NOT including one on this line."
*** 555,560 ****
  
  (defun hif-find-previous-relevant ()
!   "Position at beginning of previous #ifdef, #ifndef, #else, #endif,
! NOT including one on this line."
  ;  (message "hif-find-previous-relevant at %d" (point))
    (beginning-of-line)
--- 561,565 ----
  
  (defun hif-find-previous-relevant ()
!   "Move to previous #if..., #else, or #endif, before the current line."
  ;  (message "hif-find-previous-relevant at %d" (point))
    (beginning-of-line)
*************** Point is left unchanged."
*** 816,821 ****
  
  (defun hif-possibly-hide ()
!   "Called at #ifX expression, this hides those parts that should be
! hidden, according to judgement of `hide-ifdef-evaluator'."
  ;  (message "hif-possibly-hide") (sit-for 1)
      (let ((test (hif-canonicalize))
--- 821,826 ----
  
  (defun hif-possibly-hide ()
!   "Called at #ifX expression, this hides those parts that should be hidden.
! It uses the judgement of `hide-ifdef-evaluator'."
  ;  (message "hif-possibly-hide") (sit-for 1)
      (let ((test (hif-canonicalize))
*************** hidden, according to judgement of `hide-
*** 852,857 ****
  
  (defun hide-ifdef-guts ()
!   "Does the work of `hide-ifdefs', except for the work that's pointless
! to redo on a recursive entry."
  ;  (message "hide-ifdef-guts")
    (save-excursion
--- 857,862 ----
  
  (defun hide-ifdef-guts ()
!   "Does most of the work of `hide-ifdefs'.
! It does not do the work that's pointless to redo on a recursive entry."
  ;  (message "hide-ifdef-guts")
    (save-excursion
*************** to redo on a recursive entry."
*** 867,872 ****
  ;;;###autoload
  (defvar hide-ifdef-initially nil
!   "*Non-nil if `hide-ifdefs' should be called when Hide-Ifdef mode
! is first activated.")
  
  ;;;###autoload
--- 872,876 ----
  ;;;###autoload
  (defvar hide-ifdef-initially nil
!   "*Non-nil means call `hide-ifdefs' when Hide-Ifdef mode is first activated.")
  
  ;;;###autoload
*************** is first activated.")
*** 879,883 ****
  ;;;###autoload
  (defvar hide-ifdef-lines nil
!   "*Set to t if you don't want to see the #ifX, #else, and #endif lines.")
  
  (defun hide-ifdef-toggle-read-only ()
--- 883,887 ----
  ;;;###autoload
  (defvar hide-ifdef-lines nil
!   "*Non-nil means hide the #ifX, #else, and #endif lines.")
  
  (defun hide-ifdef-toggle-read-only ()
*************** is first activated.")
*** 892,896 ****
  
  (defun hide-ifdef-toggle-outside-read-only ()
!   "Replacement for `toggle-read-only' within Hide Ifdef mode."
    (interactive)
    (setq hif-outside-read-only (not hif-outside-read-only))
--- 896,900 ----
  
  (defun hide-ifdef-toggle-outside-read-only ()
!   "Replacement for `toggle-read-only' within Hide-Ifdef mode."
    (interactive)
    (setq hif-outside-read-only (not hif-outside-read-only))
*************** is first activated.")
*** 917,921 ****
  
  
! (defun hide-ifdefs ()
    "Hide the contents of some #ifdefs.  
  Assume that defined symbols have been added to `hide-ifdef-env'.  
--- 921,925 ----
  
  
! (defun hide-ifdefs (&optional nomsg)
    "Hide the contents of some #ifdefs.  
  Assume that defined symbols have been added to `hide-ifdef-env'.  
*************** Turn off hiding by calling `show-ifdefs'
*** 927,930 ****
--- 931,935 ----
    (interactive)
    (message "Hiding...")
+   (setq hif-outside-read-only buffer-read-only)
    (if (not hide-ifdef-mode)
        (hide-ifdef-mode 1)) ; turn on hide-ifdef-mode
*************** Turn off hiding by calling `show-ifdefs'
*** 936,944 ****
      (hide-ifdef-guts))
    (setq buffer-read-only (or hide-ifdef-read-only hif-outside-read-only))
!   (message "Hiding done"))
  
  
  (defun show-ifdefs ()
!   "Cancel the effects of `hide-ifdef'.  The contents of all #ifdefs is shown."
    (interactive)
    (setq buffer-read-only hif-outside-read-only)
--- 941,950 ----
      (hide-ifdef-guts))
    (setq buffer-read-only (or hide-ifdef-read-only hif-outside-read-only))
!   (or nomsg
!       (message "Hiding done")))
  
  
  (defun show-ifdefs ()
!   "Cancel the effects of `hide-ifdef': show the contents of all #ifdefs."
    (interactive)
    (setq buffer-read-only hif-outside-read-only)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/hideshow.el emacs-19.31/lisp/hideshow.el
*** emacs-19.30/lisp/hideshow.el	Tue May 30 19:00:51 1995
--- emacs-19.31/lisp/hideshow.el	Sat Mar  2 01:33:33 1996
***************
*** 1,72 ****
  ;;; hideshow.el --- minor mode cmds to selectively display blocks of code
  
! ;;; Copyright (C) 1994,1995 Free Software Foundation
  
! ;;; Author: Thien-Thi Nguyen <ttn@netcom.com>
! ;;; Version: 3.4
! ;;; Keywords: C C++ lisp tools editing
! ;;; Time-of-Day-Author-Most-Likely-to-be-Recalcitrant: early morning
! 
! ;;; 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 of the License, 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 this program; if not, write to the Free Software Foundation, Inc.,
! ;;; 675 Mass Ave, Cambridge, MA 02139, USA.
! 
! ;;; LCD Archive Entry:
! ;;; hideshow|Thien-Thi Nguyen|ttn@netcom.com|
! ;;; minor mode commands to selectively display blocks of code|
! ;;; 18-Oct-1994|3.4|~/modes/hideshow.el.Z|
  
  ;;; Commentary:
  
! ;;; This file provides `hs-minor-mode'.  When active, six commands:
! ;;;   hs-{hide,show}-{all,block}, hs-show-region and hs-minor-mode
! ;;; are available.  They implement block hiding and showing.  Blocks are
! ;;; defined in mode-specific way.  In c-mode or c++-mode, they are simply
! ;;; curly braces, while in lisp-ish modes they are parens.  Multi-line
! ;;; comments (c-mode) can also be hidden.  The command M-x hs-minor-mode
! ;;; toggles the minor mode or sets it (similar to outline minor mode).
! ;;; See documentation for each command for more info.
! ;;;
! ;;; The variable `hs-unbalance-handler-method' controls hideshow's behavior
! ;;; in the case of "unbalanced parentheses".  See doc for more info.
! 
! ;;; Suggested usage:
! 
! ;;; (load-library "hideshow")
! ;;; (defun my-hs-setup () "enables hideshow and binds some commands"
! ;;;   (hs-minor-mode 1)
! ;;;   (define-key hs-minor-mode-map "\C-ch" 'hs-hide-block)
! ;;;   (define-key hs-minor-mode-map "\C-cs" 'hs-show-block)
! ;;;   (define-key hs-minro-mode-map "\C-cH" 'hs-hide-all)
! ;;;   (define-key hs-minro-mode-map "\C-cS" 'hs-show-all)
! ;;;   (define-key hs-minor-mode-map "\C-cR" 'hs-show-region))
! ;;; (add-hook 'X-mode-hook 'my-hs-setup t)   ; other modes similarly
! ;;;
! ;;; where X = {emacs-lisp,c,c++,perl,...}.  See the doc for the variable
! ;;; `hs-special-modes-alist' if you'd like to use hideshow w/ other modes.
! 
! ;;; Etc:
! 
! ;;; Bug reports and fixes welcome (comments, too).  Thanks go to
! ;;;	Dean Andrews <adahome@ix.netcom.com>
! ;;;	Preston F. Crow <preston.f.crow@dartmouth.edu>
! ;;;	Gael Marziou <gael@gnlab030.grenoble.hp.com>
! ;;;	Keith Sheffield <sheff@edcsgw2.cr.usgs.gov>
! ;;;	Jan Djarv <jan.djarv@sa.erisoft.se>
! ;;;	Lars Lindberg <qhslali@aom.ericsson.se>
! ;;;	Alf-Ivar Holm <alfh@ifi.uio.no>
! ;;; for valuable feedback, code and bug reports.
  
  ;;; Code:
--- 1,73 ----
  ;;; hideshow.el --- minor mode cmds to selectively display blocks of code
  
! ;; Copyright (C) 1994,1995,1996 Free Software Foundation
  
! ;; Author: Thien-Thi Nguyen <ttn@netcom.com>
! ;; Version: 3.4
! ;; Keywords: C C++ lisp tools editing
! ;; Time-of-Day-Author-Most-Likely-to-be-Recalcitrant: early morning
! 
! ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
! 
! ;; LCD Archive Entry:
! ;; hideshow|Thien-Thi Nguyen|ttn@netcom.com|
! ;; minor mode commands to selectively display blocks of code|
! ;; 18-Oct-1994|3.4|~/modes/hideshow.el.Z|
  
  ;;; Commentary:
  
! ;; This file provides `hs-minor-mode'.  When active, six commands:
! ;;   hs-{hide,show}-{all,block}, hs-show-region and hs-minor-mode
! ;; are available.  They implement block hiding and showing.  Blocks are
! ;; defined in mode-specific way.  In c-mode or c++-mode, they are simply
! ;; curly braces, while in lisp-ish modes they are parens.  Multi-line
! ;; comments (c-mode) can also be hidden.  The command M-x hs-minor-mode
! ;; toggles the minor mode or sets it (similar to outline minor mode).
! ;; See documentation for each command for more info.
! ;;
! ;; The variable `hs-unbalance-handler-method' controls hideshow's behavior
! ;; in the case of "unbalanced parentheses".  See doc for more info.
! 
! ;; Suggested usage:
! 
! ;; (load-library "hideshow")
! ;; (defun my-hs-setup () "enables hideshow and binds some commands"
! ;;   (hs-minor-mode 1)
! ;;   (define-key hs-minor-mode-map "\C-ch" 'hs-hide-block)
! ;;   (define-key hs-minor-mode-map "\C-cs" 'hs-show-block)
! ;;   (define-key hs-minro-mode-map "\C-cH" 'hs-hide-all)
! ;;   (define-key hs-minro-mode-map "\C-cS" 'hs-show-all)
! ;;   (define-key hs-minor-mode-map "\C-cR" 'hs-show-region))
! ;; (add-hook 'X-mode-hook 'my-hs-setup t)   ; other modes similarly
! ;;
! ;; where X = {emacs-lisp,c,c++,perl,...}.  See the doc for the variable
! ;; `hs-special-modes-alist' if you'd like to use hideshow w/ other modes.
! 
! ;; Etc:
! 
! ;; Bug reports and fixes welcome (comments, too).  Thanks go to
! ;;	Dean Andrews <adahome@ix.netcom.com>
! ;;	Preston F. Crow <preston.f.crow@dartmouth.edu>
! ;;	Gael Marziou <gael@gnlab030.grenoble.hp.com>
! ;;	Keith Sheffield <sheff@edcsgw2.cr.usgs.gov>
! ;;	Jan Djarv <jan.djarv@sa.erisoft.se>
! ;;	Lars Lindberg <qhslali@aom.ericsson.se>
! ;;	Alf-Ivar Holm <alfh@ifi.uio.no>
! ;; for valuable feedback, code and bug reports.
  
  ;;; Code:
***************
*** 78,88 ****
  (defvar hs-unbalance-handler-method 'top-level
    "*Symbol representing how \"unbalanced parentheses\" should be handled.
! This error is usually signalled by hs-show-block.  One of four values:
  `top-level', `next-line', `signal' or `ignore'.  Default is `top-level'.
  
  - `top-level' -- Show top-level block containing the currently troublesome
! block.
  - `next-line' -- Use the fact that, for an already hidden block, its end
! will be on the next line.  Attempt to show this block.
  - `signal' -- Pass the error through, stopping execution.
  - `ignore' -- Ignore the error, continuing execution.
--- 79,89 ----
  (defvar hs-unbalance-handler-method 'top-level
    "*Symbol representing how \"unbalanced parentheses\" should be handled.
! This error is usually signaled by `hs-show-block'.  One of four values:
  `top-level', `next-line', `signal' or `ignore'.  Default is `top-level'.
  
  - `top-level' -- Show top-level block containing the currently troublesome
!                  block.
  - `next-line' -- Use the fact that, for an already hidden block, its end
! 		 will be on the next line.  Attempt to show this block.
  - `signal' -- Pass the error through, stopping execution.
  - `ignore' -- Ignore the error, continuing execution.
*************** For example:
*** 110,118 ****
  Note that the regexps should not contain leading or trailing whitespace.")
  
! (defvar hs-hide-hooks nil
!   "*Hooks called at the end of hs-hide-all and hs-hide-block.")
  
! (defvar hs-show-hooks nil
!   "*Hooks called at the end of hs-show-all, hs-show-block and hs-show-region.")
  
  (defvar hs-minor-mode-prefix "\C-c"
--- 111,120 ----
  Note that the regexps should not contain leading or trailing whitespace.")
  
! (defvar hs-hide-hook nil
!   "*Hooks called at the end of `hs-hide-all' and `hs-hide-block'.")
  
! (defvar hs-show-hook nil
!   "*Hooks called at the end of commands to show text.
! These commands include `hs-show-all', `hs-show-block' and `hs-show-region'.")
  
  (defvar hs-minor-mode-prefix "\C-c"
*************** is necessary.")
*** 172,177 ****
  (defun hs-flag-region (from to flag)
    "Hides or shows lines from FROM to TO, according to FLAG.
! If FLAG is \\n (newline character) then text is shown, while if FLAG
! is \\^M \(control-M) the text is hidden."
    (let ((modp (buffer-modified-p))
  	buffer-read-only)		; nothing is immune
--- 174,179 ----
  (defun hs-flag-region (from to flag)
    "Hides or shows lines from FROM to TO, according to FLAG.
! If FLAG is `?\\n' (the newline character) then show the text;
! if FLAG is `?\\^M' \(control-M) then hide the text."
    (let ((modp (buffer-modified-p))
  	buffer-read-only)		; nothing is immune
*************** is \\^M \(control-M) the text is hidden.
*** 225,229 ****
  
  (defun hs-safety-is-job-n ()
!   "Warns if selective-display or selective-display-ellipses is nil."
    (let ((str ""))
      (or selective-display
--- 227,231 ----
  
  (defun hs-safety-is-job-n ()
!   "Warn if `selective-display' or `selective-display-ellipses' is nil."
    (let ((str ""))
      (or selective-display
*************** the buffer position of the start and the
*** 301,306 ****
  (defun hs-hide-all ()
    "Hides all top-level blocks, displaying only first and last lines.
! When done, point is repositioned at the beginning of the line, and
! hs-hide-hooks is called.  See documentation for `run-hooks'."
    (interactive)
    (hs-life-goes-on
--- 303,308 ----
  (defun hs-hide-all ()
    "Hides all top-level blocks, displaying only first and last lines.
! It moves point to the beginning of the line, and it runs the normal hook
! `hs-hide-hook'.  See documentation for `run-hooks'."
    (interactive)
    (hs-life-goes-on
*************** hs-hide-hooks is called.  See documentat
*** 320,329 ****
     (beginning-of-line)
     (message "hiding all blocks ... done")
!    (run-hooks 'hs-hide-hooks)))
  
  (defun hs-show-all ()
    "Shows all top-level blocks.
! When done, point is unchanged, and hs-show-hooks is called.  See
! documentation for `run-hooks'."
    (interactive)
    (hs-life-goes-on
--- 322,331 ----
     (beginning-of-line)
     (message "hiding all blocks ... done")
!    (run-hooks 'hs-hide-hook)))
  
  (defun hs-show-all ()
    "Shows all top-level blocks.
! This does not change point; it runs the normal hook `hs-show-hook'.
! See documentation for `run-hooks'."
    (interactive)
    (hs-life-goes-on
*************** documentation for `run-hooks'."
*** 331,335 ****
     (hs-flag-region (point-min) (point-max) ?\n)
     (message "showing all blocks ... done")
!    (run-hooks 'hs-show-hooks)))
  
  ;;;###autoload
--- 333,337 ----
     (hs-flag-region (point-min) (point-max) ?\n)
     (message "showing all blocks ... done")
!    (run-hooks 'hs-show-hook)))
  
  ;;;###autoload
*************** documentation for `run-hooks'."
*** 338,342 ****
  Block is defined as a sexp for lispish modes, mode-specific otherwise.
  Comments are blocks, too.  Upon completion, point is at repositioned and
! hs-hide-hooks is called.  See documentation for `run-hooks'."
    (interactive "P")
    (hs-life-goes-on
--- 340,344 ----
  Block is defined as a sexp for lispish modes, mode-specific otherwise.
  Comments are blocks, too.  Upon completion, point is at repositioned and
! the normal hook `hs-hide-hook' is run.  See documentation for `run-hooks'."
    (interactive "P")
    (hs-life-goes-on
*************** hs-hide-hooks is called.  See documentat
*** 346,350 ****
  		(message "can't hide a single-line comment"))
  	       ((< (count-lines (car c-reg) (nth 1 c-reg)) 2)
! 		(message "not enougn comment lines to hide"))
  	       (t
  		(goto-char (nth 1 c-reg))
--- 348,352 ----
  		(message "can't hide a single-line comment"))
  	       ((< (count-lines (car c-reg) (nth 1 c-reg)) 2)
! 		(message "not enough comment lines to hide"))
  	       (t
  		(goto-char (nth 1 c-reg))
*************** hs-hide-hooks is called.  See documentat
*** 353,357 ****
  		(goto-char (if end (nth 1 c-reg) (car c-reg)))
  		(hs-safety-is-job-n)
! 		(run-hooks 'hs-hide-hooks)))
         (if (or (looking-at hs-block-start-regexp)
  	       (hs-find-block-beginning))
--- 355,359 ----
  		(goto-char (if end (nth 1 c-reg) (car c-reg)))
  		(hs-safety-is-job-n)
! 		(run-hooks 'hs-hide-hook)))
         (if (or (looking-at hs-block-start-regexp)
  	       (hs-find-block-beginning))
*************** hs-hide-hooks is called.  See documentat
*** 359,368 ****
  	     (hs-hide-block-at-point end)
  	     (hs-safety-is-job-n)
! 	     (run-hooks 'hs-hide-hooks)))))))
  
  (defun hs-show-block (&optional end)
    "Selects a block and shows it.  With prefix arg, reposition at end.
! Upon completion, point is repositioned hs-show-hooks are called.  See
! documetation for `hs-hide-block' and `run-hooks'."
    (interactive "P")
    (hs-life-goes-on
--- 361,370 ----
  	     (hs-hide-block-at-point end)
  	     (hs-safety-is-job-n)
! 	     (run-hooks 'hs-hide-hook)))))))
  
  (defun hs-show-block (&optional end)
    "Selects a block and shows it.  With prefix arg, reposition at end.
! Upon completion, point is repositioned and the normal hook
! `hs-show-hook' is run.  See documentation for `hs-hide-block' and `run-hooks'."
    (interactive "P")
    (hs-life-goes-on
*************** documetation for `hs-hide-block' and `ru
*** 379,387 ****
  	     (hs-show-block-at-point end)
  	     (hs-safety-is-job-n)
! 	     (run-hooks 'hs-show-hooks)))))))
  
  (defun hs-show-region (beg end)
    "Shows all lines from BEG to END, without doing any block analysis.
! Note: hs-show-region is intended for use when when hs-show-block signals
  `unbalanced parentheses' and so is an emergency measure only.  You may
  become very confused if you use this command indiscriminately."
--- 381,389 ----
  	     (hs-show-block-at-point end)
  	     (hs-safety-is-job-n)
! 	     (run-hooks 'hs-show-hook)))))))
  
  (defun hs-show-region (beg end)
    "Shows all lines from BEG to END, without doing any block analysis.
! Note:` hs-show-region' is intended for use when when `hs-show-block' signals
  `unbalanced parentheses' and so is an emergency measure only.  You may
  become very confused if you use this command indiscriminately."
*************** become very confused if you use this com
*** 390,394 ****
     (hs-flag-region beg end ?\n)
     (hs-safety-is-job-n)
!    (run-hooks 'hs-show-hooks)))
  
  ;;;###autoload
--- 392,396 ----
     (hs-flag-region beg end ?\n)
     (hs-safety-is-job-n)
!    (run-hooks 'hs-show-hook)))
  
  ;;;###autoload
*************** become very confused if you use this com
*** 397,404 ****
  With ARG, turn hideshow minor mode on if ARG is positive, off otherwise.
  When hideshow minor mode is on, the menu bar is augmented with hideshow
! commands and the hideshow commands are enabled.  The variables\n
! \tselective-display\n\tselective-display-ellipses\n
! are set to t.  Lastly, the hooks set in hs-minor-mode-hook are called.
! See documentation for `run-hooks'.\n
  Turning hideshow minor mode off reverts the menu bar and the
  variables to default values and disables the hideshow commands."
--- 399,406 ----
  With ARG, turn hideshow minor mode on if ARG is positive, off otherwise.
  When hideshow minor mode is on, the menu bar is augmented with hideshow
! commands and the hideshow commands are enabled.  The variables
! `selective-display' and `selective-display-ellipses' are set to t.
! Last, the normal hook `hs-minor-mode-hook' is run; see the doc for `run-hooks'.
! 
  Turning hideshow minor mode off reverts the menu bar and the
  variables to default values and disables the hideshow commands."
*************** variables to default values and disables
*** 435,439 ****
  ;; keymaps and menus
  (if (not hs-minor-mode-map)
!   (setq hs-minor-mode-map (make-sparse-keymap))
    (cond
     ((eq hs-emacs-type 'lucid)
--- 437,441 ----
  ;; keymaps and menus
  (if (not hs-minor-mode-map)
!     (setq hs-minor-mode-map (make-sparse-keymap))
    (cond
     ((eq hs-emacs-type 'lucid)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/hilit19.el emacs-19.31/lisp/hilit19.el
*** emacs-19.30/lisp/hilit19.el	Fri Nov  3 21:26:16 1995
--- emacs-19.31/lisp/hilit19.el	Sun Jan 14 02:34:30 1996
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 267,271 ****
  ;; (hilit-lookup-face-create) incorporated patch which improves it's behavior
  ;; with more than one frame...  Still can't have bold on the same face in two
! ;; differrent fonts sizes at the same time...
  ;;
  ;; Revision 2.2  1993/07/27  02:02:59  stig
--- 268,272 ----
  ;; (hilit-lookup-face-create) incorporated patch which improves it's behavior
  ;; with more than one frame...  Still can't have bold on the same face in two
! ;; different fonts sizes at the same time...
  ;;
  ;; Revision 2.2  1993/07/27  02:02:59  stig
*************** your init file.")
*** 441,445 ****
  	  "  [ ] I've used the force and read the source, but I'M CONFUSED\n"
  	  "  [ ] a PATCH. (output of 'diff -uw old.el new.el' or 'diff -cw')\n"
! 	  "  [ ] a SERIOUS AND REPRODUCABLE BUG that is not an EMACS bug\n"
  	  "     - I *swear* that it's not already mentioned in the KNOWN BUGS\n"
  	  "     - I HAVE CHECKED ftp.hackvan.com:/pub/stig/src/elisp/hilit19.el.gz\n"
--- 442,446 ----
  	  "  [ ] I've used the force and read the source, but I'M CONFUSED\n"
  	  "  [ ] a PATCH. (output of 'diff -uw old.el new.el' or 'diff -cw')\n"
! 	  "  [ ] a SERIOUS AND REPRODUCIBLE BUG that is not an EMACS bug\n"
  	  "     - I *swear* that it's not already mentioned in the KNOWN BUGS\n"
  	  "     - I HAVE CHECKED ftp.hackvan.com:/pub/stig/src/elisp/hilit19.el.gz\n"
*************** your init file.")
*** 473,477 ****
      (named-param  DarkGoldenrod	    Goldenrod	       underline)
  	
!     ;; and anotherone for LaTeX
      (crossref	  DarkGoldenrod	    Goldenrod	       underline)
      (formula	  Goldenrod	    DarkGoldenrod      underline)
--- 474,478 ----
      (named-param  DarkGoldenrod	    Goldenrod	       underline)
  	
!     ;; and another one for LaTeX
      (crossref	  DarkGoldenrod	    Goldenrod	       underline)
      (formula	  Goldenrod	    DarkGoldenrod      underline)
*************** See the documentation for hilit-lookup-f
*** 562,566 ****
  (defun hilit-lookup-face-create (face &optional force)
    "Get a FACE, or create it if it doesn't exist.  In order for it to
! properly create the face, the followwing naming convention must be used:
      [reverse-](fgcolor[/bgcolor])[-bold][-italic][-underline]
  Example: (hilit-lookup-face-create 'comment-face) might create and return 'red
--- 563,567 ----
  (defun hilit-lookup-face-create (face &optional force)
    "Get a FACE, or create it if it doesn't exist.  In order for it to
! properly create the face, the following naming convention must be used:
      [reverse-](fgcolor[/bgcolor])[-bold][-italic][-underline]
  Example: (hilit-lookup-face-create 'comment-face) might create and return 'red
*************** the entire buffer is forced."
*** 897,901 ****
  ;; ; Sure, it sucks to type.  Oh, well.
  ;; (defun hilit-wysiwyg-replace ()
! ;;   "Replace overstruck text with normal text that's been overlayed with the 
  ;; appropriate text attribute.  Suitable for a find-file hook."
  ;;   (save-excursion
--- 898,902 ----
  ;; ; Sure, it sucks to type.  Oh, well.
  ;; (defun hilit-wysiwyg-replace ()
! ;;   "Replace overstruck text with normal text that's been overlaid with the 
  ;; appropriate text attribute.  Suitable for a find-file hook."
  ;;   (save-excursion
*************** number of backslashes."
*** 1500,1504 ****
  ;;         "This is a somewhat long -
  ;;          string, written on three -
! ;;          succesive lines"
  ;; in order to insert a double quote in a string, you have to escape it
  ;; with a \), bu also a character set constant (named a charset), which
--- 1501,1505 ----
  ;;         "This is a somewhat long -
  ;;          string, written on three -
! ;;          successive lines"
  ;; in order to insert a double quote in a string, you have to escape it
  ;; with a \), bu also a character set constant (named a charset), which
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/hippie-exp.el emacs-19.31/lisp/hippie-exp.el
*** emacs-19.30/lisp/hippie-exp.el	Sun Oct 15 04:53:39 1995
--- emacs-19.31/lisp/hippie-exp.el	Wed Jan 24 19:32:28 1996
***************
*** 1,4 ****
--- 1,6 ----
  ;;; hippie-exp.el --- expand text trying various ways to find its expansion.
  
+ ;; Copyright (C) 1992 Free Software Foundation, Inc.
+ 
  ;; Author: Anders Holst <aho@sans.kth.se>
  ;; Last change: 6 August 1995
***************
*** 6,11 ****
  ;; Keywords: abbrev
  
- ;; Copyright (C) 1992 Free Software Foundation, Inc.
- ;;
  ;; This file is part of GNU Emacs.
  
--- 8,11 ----
***************
*** 21,29 ****
  
  ;; 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:
! ;;  
  ;;  `hippie-expand' is a single function for a lot of different kinds
  ;;  of completions and expansions.  Called repeatedly it tries all
--- 21,30 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
! 
  ;;  `hippie-expand' is a single function for a lot of different kinds
  ;;  of completions and expansions.  Called repeatedly it tries all
*************** undoes the expansion." 
*** 248,254 ****
  	    (if (and hippie-expand-verbose
  		     (not (window-minibuffer-p (selected-window))))
! 		(message (concat "Using "
! 				 (prin1-to-string (nth he-num 
! 				   hippie-expand-try-functions-list)))))))
        (if (and (>= he-num 0)
  	       (eq (marker-buffer he-string-beg) (current-buffer)))
--- 249,255 ----
  	    (if (and hippie-expand-verbose
  		     (not (window-minibuffer-p (selected-window))))
! 		(message "Using %s"
! 			 (prin1-to-string (nth he-num 
! 				   hippie-expand-try-functions-list))))))
        (if (and (>= he-num 0)
  	       (eq (marker-buffer he-string-beg) (current-buffer)))
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/holidays.el emacs-19.31/lisp/holidays.el
*** emacs-19.30/lisp/holidays.el	Wed Sep 20 22:46:18 1995
--- emacs-19.31/lisp/holidays.el	Mon Feb 26 13:57:40 1996
***************
*** 1,5 ****
  ;;; holidays.el --- holiday functions for the calendar package
  
! ;;; Copyright (C) 1989, 1990, 1992, 1993, 1994 Free Software Foundation, Inc.
  
  ;; Author: Edward M. Reingold <reingold@cs.uiuc.edu>
--- 1,5 ----
  ;;; holidays.el --- holiday functions for the calendar package
  
! ;; Copyright (C) 1989, 1990, 1992, 1993, 1994 Free Software Foundation, Inc.
  
  ;; Author: Edward M. Reingold <reingold@cs.uiuc.edu>
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 73,81 ****
    t)
  
! (autoload 'holiday-islamic "cal-islamic"
    "Holiday on MONTH, DAY (Islamic) called STRING."
    t)
  
! (autoload 'holiday-chinese-new-year "cal-chinese"
    "Date of Chinese New Year."
    t)
--- 74,82 ----
    t)
  
! (autoload 'holiday-islamic "cal-islam"
    "Holiday on MONTH, DAY (Islamic) called STRING."
    t)
  
! (autoload 'holiday-chinese-new-year "cal-china"
    "Date of Chinese New Year."
    t)
*************** The holidays are those in the list calen
*** 127,131 ****
          (message "No holidays known for %s" date-string)
        (if (<= (length msg) (frame-width))
!           (message msg)
          (set-buffer (get-buffer-create holiday-buffer))
          (setq buffer-read-only nil)
--- 128,132 ----
          (message "No holidays known for %s" date-string)
        (if (<= (length msg) (frame-width))
!           (message "%s" msg)
          (set-buffer (get-buffer-create holiday-buffer))
          (setq buffer-read-only nil)
*************** date.  If date is nil, or if the date is
*** 331,335 ****
                    "Pentecost (Whitsunday)")
              (list (calendar-gregorian-from-absolute (+ abs-easter 50))
!                   "Whitmunday")
              (list (calendar-gregorian-from-absolute (+ abs-easter 56))
                    "Trinity Sunday")
--- 332,336 ----
                    "Pentecost (Whitsunday)")
              (list (calendar-gregorian-from-absolute (+ abs-easter 50))
!                   "Whitmonday")
              (list (calendar-gregorian-from-absolute (+ abs-easter 56))
                    "Trinity Sunday")
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/icomplete.el emacs-19.31/lisp/icomplete.el
*** emacs-19.30/lisp/icomplete.el	Mon Oct 30 12:10:31 1995
--- emacs-19.31/lisp/icomplete.el	Sun Jan 14 02:34:30 1996
***************
*** 21,58 ****
  
  ;; 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:
  
! ;;; Loading this package implements a more fine-grained minibuffer
! ;;; completion feedback scheme.  Prospective completions are concisely
! ;;; indicated within the minibuffer itself, with each successive
! ;;; keystroke.
! 
! ;;; See 'icomplete-completions' docstring for a description of the
! ;;; icomplete display format.
! 
! ;;; See the `icomplete-minibuffer-setup-hook' docstring for a means to
! ;;; customize icomplete setup for interoperation with other
! ;;; minibuffer-oriented packages.
! 
! ;;; To activate icomplete mode, simply load the package.  You can
! ;;; subsequently deactivate it by invoking the function icomplete-mode
! ;;; with a negative prefix-arg (C-U -1 ESC-x icomplete-mode).  Also,
! ;;; you can prevent activation of the mode during package load by
! ;;; first setting the variable `icomplete-mode' to nil.  Icompletion
! ;;; can be enabled any time after the package is loaded by invoking
! ;;; icomplete-mode without a prefix arg.
! 
! ;;; Thanks to everyone for their suggestions for refinements of this
! ;;; package.  I particularly have to credit Michael Cook, who
! ;;; implemented an incremental completion style in his 'iswitch'
! ;;; functions that served as a model for icomplete.  Some other
! ;;; contributors: Noah Freidman (restructuring as minor mode), Colin
! ;;; Rafferty (lemacs reconciliation), Lars Lindberg, RMS, and
! ;;; others.
  
! ;;; klm.
  
  ;;; Code:
--- 21,59 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
! ;; Loading this package implements a more fine-grained minibuffer
! ;; completion feedback scheme.  Prospective completions are concisely
! ;; indicated within the minibuffer itself, with each successive
! ;; keystroke.
! 
! ;; See 'icomplete-completions' docstring for a description of the
! ;; icomplete display format.
! 
! ;; See the `icomplete-minibuffer-setup-hook' docstring for a means to
! ;; customize icomplete setup for interoperation with other
! ;; minibuffer-oriented packages.
! 
! ;; To activate icomplete mode, simply load the package.  You can
! ;; subsequently deactivate it by invoking the function icomplete-mode
! ;; with a negative prefix-arg (C-U -1 ESC-x icomplete-mode).  Also,
! ;; you can prevent activation of the mode during package load by
! ;; first setting the variable `icomplete-mode' to nil.  Icompletion
! ;; can be enabled any time after the package is loaded by invoking
! ;; icomplete-mode without a prefix arg.
! 
! ;; Thanks to everyone for their suggestions for refinements of this
! ;; package.  I particularly have to credit Michael Cook, who
! ;; implemented an incremental completion style in his 'iswitch'
! ;; functions that served as a model for icomplete.  Some other
! ;; contributors: Noah Freidman (restructuring as minor mode), Colin
! ;; Rafferty (lemacs reconciliation), Lars Lindberg, RMS, and
! ;; others.
  
! ;; klm.
  
  ;;; Code:
*************** Conditions are:
*** 130,134 ****
     and not in the middle of macro execution,
     and minibuffer-completion-table is not a symbol (which would
!        indicate some non-standard, non-simple completion mechansm,
         like file-name and other custom-func completions)."
  
--- 131,135 ----
     and not in the middle of macro execution,
     and minibuffer-completion-table is not a symbol (which would
!        indicate some non-standard, non-simple completion mechanism,
         like file-name and other custom-func completions)."
  
*************** one of \(), \[], or \{} pairs.  The choi
*** 215,221 ****
    \[...] - a single prospect is identified but matching is optional, or
    \{...} - multiple prospects, separated by commas, are indicated, and
!           further input is required to distingish a single one.
  
! The displays for disambiguous matches have ` [Matched]' appended
  \(whether complete or not), or ` \[No matches]', if no eligible
  matches exist."
--- 216,222 ----
    \[...] - a single prospect is identified but matching is optional, or
    \{...} - multiple prospects, separated by commas, are indicated, and
!           further input is required to distinguish a single one.
  
! The displays for unambiguous matches have ` [Matched]' appended
  \(whether complete or not), or ` \[No matches]', if no eligible
  matches exist."
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/icon.el emacs-19.31/lisp/icon.el
*** emacs-19.30/lisp/icon.el	Mon Aug 21 10:30:31 1995
--- emacs-19.31/lisp/icon.el	Sun Jan 14 02:34:30 1996
***************
*** 20,25 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/ielm.el emacs-19.31/lisp/ielm.el
*** emacs-19.30/lisp/ielm.el	Thu Jun 29 19:13:21 1995
--- emacs-19.31/lisp/ielm.el	Sun Jan 14 02:34:30 1996
***************
*** 1,3 ****
--- 1,4 ----
  ;;; ielm.el --- interaction mode for Emacs Lisp
+ 
  ;; Copyright (C) 1994 Free Software Foundation, Inc.
  
***************
*** 19,24 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** This variable is buffer-local.")
*** 88,92 ****
    (concat
     "*** Welcome to IELM version "
!    (substring "$Revision: 1.5 $" 11 -2)
     " ***  Type (describe-mode) for help.\n"
     "IELM has ABSOLUTELY NO WARRANTY; type (describe-no-warranty) for details.\n")
--- 90,94 ----
    (concat
     "*** Welcome to IELM version "
!    (substring "$Revision: 1.7 $" 11 -2)
     " ***  Type (describe-mode) for help.\n"
     "IELM has ABSOLUTELY NO WARRANTY; type (describe-no-warranty) for details.\n")
*************** This variable is buffer-local.")
*** 146,150 ****
       ;; the buffer has been modified
       (not (= btick (buffer-modified-tick))) 
!      ;; a completions buffer has been modifed or created
       (if cbuffer
  	 (not (= ctick (buffer-modified-tick cbuffer)))
--- 148,152 ----
       ;; the buffer has been modified
       (not (= btick (buffer-modified-tick))) 
!      ;; a completions buffer has been modified or created
       (if cbuffer
  	 (not (= ctick (buffer-modified-tick cbuffer)))
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/imenu.el emacs-19.31/lisp/imenu.el
*** emacs-19.30/lisp/imenu.el	Fri Nov 24 19:25:57 1995
--- emacs-19.31/lisp/imenu.el	Sun Mar 17 10:34:47 1996
***************
*** 1,5 ****
  ;;; imenu.el --- Framework for mode-specific buffer indexes.
  
! ;; Copyright (C) 1994, 1995 Free Software Foundation, Inc.
  
  ;; Author: Ake Stenhoff <etxaksf@aom.ericsson.se>
--- 1,5 ----
  ;;; imenu.el --- Framework for mode-specific buffer indexes.
  
! ;; Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc.
  
  ;; Author: Ake Stenhoff <etxaksf@aom.ericsson.se>
***************
*** 7,27 ****
  ;; Created: 8 Feb 1994
  ;; Keywords: tools
! ;;
! ;; This program 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.
! ;;
! ;; This program 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 this program; if not, write to the Free Software
! ;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  
  ;;; Commentary:
! ;;
  ;; Purpose of this package:
  ;;   To present a framework for mode-specific buffer indexes.
--- 7,30 ----
  ;; Created: 8 Feb 1994
  ;; Keywords: tools
! 
! ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
! 
  ;; Purpose of this package:
  ;;   To present a framework for mode-specific buffer indexes.
***************
*** 54,57 ****
--- 57,61 ----
  
  ;;; Code
+ 
  (eval-when-compile (require 'cl))
  
*************** element should come before the second.  
*** 95,99 ****
  
  (defvar imenu-max-items 25
!   "*Maximum number of elements in an index mouse-menu.")
  
  (defvar imenu-scanning-message "Scanning buffer for index (%3d%%)"
--- 99,103 ----
  
  (defvar imenu-max-items 25
!   "*Maximum number of elements in an mouse menu for Imenu.")
  
  (defvar imenu-scanning-message "Scanning buffer for index (%3d%%)"
*************** Used for making mouse-menu titles and fo
*** 114,120 ****
  with name concatenation.")
  
- (defvar imenu-submenu-name-format "%s..."
-   "*The format for making a submenu name.")
- 
  ;;;###autoload
  (defvar imenu-generic-expression nil
--- 118,121 ----
*************** For emacs-lisp-mode for example PATTERN 
*** 146,149 ****
--- 147,151 ----
  The variable is buffer-local.")
  
+ ;;;###autoload
  (make-variable-buffer-local 'imenu-generic-expression)
  
*************** This function is called after the functi
*** 279,289 ****
      (imenu-progress-message prev-pos 100)
      (and index-var-alist
! 	 (push (cons (imenu-create-submenu-name "Variables") index-var-alist)
  	       index-alist))
      (and index-type-alist
!  	 (push (cons (imenu-create-submenu-name "Types") index-type-alist)
    	       index-alist))
      (and index-unknown-alist
! 	 (push (cons (imenu-create-submenu-name "Syntax-unknown") index-unknown-alist)
  	       index-alist))
      index-alist))
--- 281,291 ----
      (imenu-progress-message prev-pos 100)
      (and index-var-alist
! 	 (push (cons "Variables" index-var-alist)
  	       index-alist))
      (and index-type-alist
!  	 (push (cons "Types" index-type-alist)
    	       index-alist))
      (and index-unknown-alist
! 	 (push (cons "Syntax-unknown" index-unknown-alist)
  	       index-alist))
      index-alist))
*************** This function is called after the functi
*** 335,338 ****
--- 337,344 ----
  (make-variable-buffer-local 'imenu--index-alist)
  
+ ;; The latest buffer index used to update the menu bar menu.
+ (defvar imenu--last-menubar-index-alist nil)
+ (make-variable-buffer-local 'imenu--last-menubar-index-alist)
+ 
  ;; History list for 'jump-to-function-in-buffer'.
  ;; Making this buffer local caused it not to work!
*************** This function is called after the functi
*** 365,376 ****
        (/ (* 100 (1- pos)) (max total 1)))))
  
- ;;;
- ;;; Function for suporting general looking submenu names.
- ;;; Uses `imenu-submenu-name-format' for creating the name.
- ;;; NAME is the base of the new submenu name.
- ;;;
- (defun imenu-create-submenu-name (name)
-    (format imenu-submenu-name-format name))
- 
  ;; Split LIST into sublists of max length N.
  ;; Example (imenu--split '(1 2 3 4 5 6 7 8) 3)-> '((1 2 3) (4 5 6) (7 8))
--- 371,374 ----
*************** This function is called after the functi
*** 394,407 ****
      (nreverse result)))
  
! ;;;
! ;;; Split a menu in to several menus.
! ;;;
  (defun imenu--split-menu (menulist title)
!   (cons "Index menu"
! 	(mapcar
! 	 (function
! 	  (lambda (menu)
! 	    (cons (format "(%s)" title) menu)))
! 	 (imenu--split menulist imenu-max-items))))
  
  ;;;
--- 392,419 ----
      (nreverse result)))
  
! ;;; Split the alist MENULIST into a nested alist, if it is long enough.
! ;;; In any case, add TITLE to the front of the alist.
  (defun imenu--split-menu (menulist title)
!   (if (> (length menulist) imenu-max-items)
!       (let ((count 0))
! 	(cons title
! 	      (mapcar
! 	       (function
! 		(lambda (menu)
! 		  (cons (format "(%s-%d)" title (setq count (1+ count)))
! 			menu)))
! 	       (imenu--split menulist imenu-max-items))))
!     (cons title menulist)))
! 
! ;;; Split up each long alist that are nested within ALIST
! ;;; into nested alists.
! (defun imenu--split-submenus (alist)
!   (mapcar (function (lambda (elt)
! 		      (if (and (consp elt)
! 			       (stringp (car elt))
! 			       (listp (cdr elt)))
! 			  (imenu--split-menu (cdr elt) (car elt))
! 			elt)))
! 	  alist))
  
  ;;;
*************** This function is called after the functi
*** 411,415 ****
  ;;;
  
! (defun imenu--make-index-alist ()
    ;; Create a list for this buffer only when needed.
    (or (and imenu--index-alist
--- 423,427 ----
  ;;;
  
! (defun imenu--make-index-alist (&optional noerror)
    ;; Create a list for this buffer only when needed.
    (or (and imenu--index-alist
*************** This function is called after the functi
*** 421,426 ****
  	    (save-excursion
  	      (funcall imenu-create-index-function))))
!   (or imenu--index-alist
        (error "No items suitable for an index found in this buffer"))
    ;; Add a rescan option to the index.
    (cons imenu--rescan-item imenu--index-alist))
--- 433,440 ----
  	    (save-excursion
  	      (funcall imenu-create-index-function))))
!   (or imenu--index-alist noerror
        (error "No items suitable for an index found in this buffer"))
+   (or imenu--index-alist
+       (setq imenu--index-alist (list nil)))
    ;; Add a rescan option to the index.
    (cons imenu--rescan-item imenu--index-alist))
*************** This function is called after the functi
*** 447,451 ****
         t))
  
! (defun imenu--create-keymap-2 (alist counter)
    (let ((map nil))
      (mapcar
--- 461,465 ----
         t))
  
! (defun imenu--create-keymap-2 (alist counter &optional commands)
    (let ((map nil))
      (mapcar
*************** This function is called after the functi
*** 454,461 ****
  	(cond
  	 ((listp (cdr item))
! 	  (append (list (incf counter) (car item) 'keymap (car item))
! 		  (imenu--create-keymap-2 (cdr item) (+ counter 10))))
  	 (t
! 	  (let ((end (cons '(nil) t)))
  	    (cons (car item)
  		  (cons (car item) end))))
--- 468,478 ----
  	(cond
  	 ((listp (cdr item))
! 	  (append (list (setq counter (1+ counter))
! 			(car item) 'keymap (car item))
! 		  (imenu--create-keymap-2 (cdr item) (+ counter 10) commands)))
  	 (t
! 	  (let ((end (if commands `(lambda () (interactive)
! 				     (imenu--menubar-select ',item))
! 		       (cons '(nil) t))))
  	    (cons (car item)
  		  (cons (car item) end))))
*************** This function is called after the functi
*** 463,468 ****
       alist)))
  
! (defun imenu--create-keymap-1 (title alist)
!   (append (list 'keymap title) (imenu--create-keymap-2 alist 0)))
  
  
--- 480,488 ----
       alist)))
  
! ;; If COMMANDS is non-nil, make a real keymap
! ;; with a real command used as the definition.
! ;; If it is nil, make something suitable for x-popup-menu.
! (defun imenu--create-keymap-1 (title alist &optional commands)
!   (append (list 'keymap title) (imenu--create-keymap-2 alist 0 commands)))
  
  
*************** pattern.
*** 612,629 ****
  			  (setq found t)
  			  (push 
! 			   (cons (buffer-substring beg end) beg)
  			   (cdr 
! 			    (or (if (not (stringp menu-title)) index-alist) 
! 				(assoc 
! 				 (imenu-create-submenu-name menu-title) 
! 				 index-alist)
  				(car (push 
! 				      (cons 
! 				       (imenu-create-submenu-name menu-title) 
! 				       '()) 
  				      index-alist))))))))))
! 	    patterns))))
!       (imenu-progress-message prev-pos 100 t)
!       (delete 'dummy index-alist)))
  
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
--- 632,645 ----
  			  (setq found t)
  			  (push 
! 			   (cons (buffer-substring-no-properties beg end) beg)
  			   (cdr 
! 			    (or (assoc menu-title index-alist)
  				(car (push 
! 				      (cons menu-title '()) 
  				      index-alist))))))))))
! 	   patterns))))
!     (imenu-progress-message prev-pos 100 t)
!     (let ((main-element (assq nil index-alist)))
!       (nconc (delq main-element (delq 'dummy index-alist)) main-element))))
  
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
*************** INDEX-ALIST is the buffer index and EVEN
*** 681,684 ****
--- 697,701 ----
  
  Returns t for rescan and otherwise a position number."
+   (setq index-alist (imenu--split-submenus index-alist))
    (let* ((menu 	(imenu--split-menu
  		 (if imenu-sort-function
*************** Returns t for rescan and otherwise a pos
*** 698,701 ****
--- 715,721 ----
  						(cdr menu)
  					      (cdr (cadr menu))))))
+ 
+     (or imenu-use-keymap-menu
+ 	(setq menu (list "Imenu" (delq nil menu))))
      (setq position (x-popup-menu event menu))
      (if imenu-use-keymap-menu
*************** The returned value is on the form (INDEX
*** 770,780 ****
  ;;;###autoload
  (defun imenu-add-to-menubar (name)
!   "Adds an \"imenu\" entry to the menubar for the current local keymap.
! NAME is the string naming the menu to be added.
! See 'imenu' for more information."
!   (interactive "sMenu name: ")
!   (and window-system
!        (define-key (current-local-map) [menu-bar index]
! 	 (cons name 'imenu))))
  
  ;;;###autoload
--- 790,847 ----
  ;;;###autoload
  (defun imenu-add-to-menubar (name)
!   "Adds an `imenu' entry to the menu bar for the current buffer.
! NAME is a string used to name the menu bar item.
! See the command `imenu' for more information."
!   (interactive "sImenu menu item name: ")
!   (let ((newmap (make-sparse-keymap))
! 	(menu-bar (lookup-key (current-local-map) [menu-bar])))
!     (define-key newmap [menu-bar]
!       (append (make-sparse-keymap) menu-bar))
!     (define-key newmap [menu-bar index]
!       (cons name (nconc (make-sparse-keymap "Imenu")
! 			(make-sparse-keymap))))
!     (use-local-map (append newmap (current-local-map))))
!   (add-hook 'menu-bar-update-hook 'imenu-update-menubar))
! 
! (defvar imenu-buffer-menubar nil)
! 
! (defun imenu-update-menubar ()
!   (and (current-local-map)
!        (keymapp (lookup-key (current-local-map) [menu-bar index]))
!        (let ((index-alist (imenu--make-index-alist t)))
! 	 ;; Don't bother updating if the index-alist has not changed
! 	 ;; since the last time we did it.
! 	 (or (equal index-alist imenu--last-menubar-index-alist)
! 	     (let (menu menu1 old)
! 	       (setq imenu--last-menubar-index-alist index-alist)
! 	       (setq index-alist (imenu--split-submenus index-alist))
! 	       (setq menu (imenu--split-menu
! 			   (if imenu-sort-function
! 			       (sort
! 				(let ((res nil)
! 				      (oldlist index-alist))
! 				  ;; Copy list method from the cl package `copy-list'
! 				  (while (consp oldlist) (push (pop oldlist) res))
! 				  (prog1 (nreverse res) (setcdr res oldlist)))
! 				imenu-sort-function)
! 			     index-alist)
! 			   (buffer-name)))
! 	       (setq menu1 (imenu--create-keymap-1 (car menu) 
! 						   (if (< 1 (length (cdr menu)))
! 						       (cdr menu)
! 						     (cdr (car (cdr menu))))
! 						   t))
! 	       (setq old (lookup-key (current-local-map) [menu-bar index]))
! 	       (if (keymapp old)
! 		   (setcdr (nthcdr 2 old) menu1)))))))
! 
! (defun imenu--menubar-select (item)
!   "Use Imenu to select the function or variable named in this menu item."
!   (if (equal item '("*Rescan*" . -99))
!       (progn
! 	(imenu--cleanup)
! 	(setq imenu--index-alist nil)
! 	(imenu-update-menubar))
!     (imenu item)))
  
  ;;;###autoload
*************** See `imenu-choose-buffer-index' for more
*** 785,789 ****
     (list (save-restriction 
  	   (widen)
! 	   (imenu-choose-buffer-index))))
    (and index-item
         (progn
--- 852,859 ----
     (list (save-restriction 
  	   (widen)
! 	   (car (imenu-choose-buffer-index)))))
!   ;; Convert a string to an alist element.
!   (if (stringp index-item)
!       (setq index-item (assoc index-item (imenu--make-index-alist))))
    (and index-item
         (progn
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/indent.el emacs-19.31/lisp/indent.el
*** emacs-19.30/lisp/indent.el	Fri Nov 17 17:42:52 1995
--- emacs-19.31/lisp/indent.el	Mon Apr 29 14:12:08 1996
***************
*** 18,23 ****
  
  ;; 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:
--- 18,24 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** Function to indent current line.")
*** 43,57 ****
    (interactive "P")
    (if (eq indent-line-function 'indent-to-left-margin)
!       (insert-tab)
      (if prefix-arg
  	(funcall indent-line-function prefix-arg)
        (funcall indent-line-function))))
  
! (defun insert-tab ()
!   (if abbrev-mode
!       (expand-abbrev))
!   (if indent-tabs-mode
!       (insert ?\t)
!     (indent-to (* tab-width (1+ (/ (current-column) tab-width))))))
  
  (defun indent-rigidly (start end arg)
--- 44,59 ----
    (interactive "P")
    (if (eq indent-line-function 'indent-to-left-margin)
!       (insert-tab prefix-arg)
      (if prefix-arg
  	(funcall indent-line-function prefix-arg)
        (funcall indent-line-function))))
  
! (defun insert-tab (&optional prefix-arg)
!   (let ((count (prefix-numeric-value prefix-arg)))
!     (if abbrev-mode
! 	(expand-abbrev))
!     (if indent-tabs-mode
! 	(insert-char ?\t count)
!       (indent-to (* tab-width (+ count (/ (current-column) tab-width)))))))
  
  (defun indent-rigidly (start end arg)
*************** line, but does not move past any whitesp
*** 264,268 ****
  		  (point) (min (point-max) (+ (length fill-prefix) (point)))))
  	  (forward-char (length fill-prefix)))
!     (if (and adaptive-fill-mode 
  	     (looking-at adaptive-fill-regexp))
  	(goto-char (match-end 0))))
--- 266,270 ----
  		  (point) (min (point-max) (+ (length fill-prefix) (point)))))
  	  (forward-char (length fill-prefix)))
!     (if (and adaptive-fill-mode adaptive-fill-regexp
  	     (looking-at adaptive-fill-regexp))
  	(goto-char (match-end 0))))
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/inf-lisp.el emacs-19.31/lisp/inf-lisp.el
*** emacs-19.30/lisp/inf-lisp.el	Fri Nov 24 19:26:03 1995
--- emacs-19.31/lisp/inf-lisp.el	Tue Mar 19 15:49:05 1996
***************
*** 1,61 ****
  ;;; inf-lisp.el --- an inferior-lisp mode
! ;;; Copyright (C) 1988, 1993, 1994 Free Software Foundation, Inc.
  
  ;; Author: Olin Shivers <shivers@cs.cmu.edu>
  ;; Keywords: processes, lisp
  
! ;;; 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:
  
! ;;; Hacked from tea.el by Olin Shivers (shivers@cs.cmu.edu). 8/88
  
! ;;; This file defines a a lisp-in-a-buffer package (inferior-lisp
! ;;; mode) built on top of comint mode.  This version is more
! ;;; featureful, robust, and uniform than the Emacs 18 version.  The
! ;;; key bindings are also more compatible with the bindings of Hemlock
! ;;; and Zwei (the Lisp Machine emacs).
! 
! ;;; Since this mode is built on top of the general command-interpreter-in-
! ;;; a-buffer mode (comint mode), it shares a common base functionality, 
! ;;; and a common set of bindings, with all modes derived from comint mode.
! ;;; This makes these modes easier to use.
! 
! ;;; For documentation on the functionality provided by comint mode, and
! ;;; the hooks available for customising it, see the file comint.el.
! ;;; For further information on inferior-lisp mode, see the comments below.
! 
! ;;; Needs fixin:
! ;;; The load-file/compile-file default mechanism could be smarter -- it
! ;;; doesn't know about the relationship between filename extensions and
! ;;; whether the file is source or executable. If you compile foo.lisp
! ;;; with compile-file, then the next load-file should use foo.bin for
! ;;; the default, not foo.lisp. This is tricky to do right, particularly
! ;;; because the extension for executable files varies so much (.o, .bin,
! ;;; .lbin, .mo, .vo, .ao, ...).
! ;;;
! ;;; It would be nice if inferior-lisp (and inferior scheme, T, ...) modes
! ;;; had a verbose minor mode wherein sending or compiling defuns, etc.
! ;;; would be reflected in the transcript with suitable comments, e.g.
! ;;; ";;; redefining fact". Several ways to do this. Which is right?
! ;;;
! ;;; When sending text from a source file to a subprocess, the process-mark can 
! ;;; move off the window, so you can lose sight of the process interactions.
! ;;; Maybe I should ensure the process mark is in the window when I send
! ;;; text to the process? Switch selectable?
  
  ;;; Code:
--- 1,63 ----
  ;;; inf-lisp.el --- an inferior-lisp mode
! 
! ;; Copyright (C) 1988, 1993, 1994 Free Software Foundation, Inc.
  
  ;; Author: Olin Shivers <shivers@cs.cmu.edu>
  ;; Keywords: processes, lisp
  
! ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
! ;; Hacked from tea.el by Olin Shivers (shivers@cs.cmu.edu). 8/88
  
! ;; This file defines a a lisp-in-a-buffer package (inferior-lisp
! ;; mode) built on top of comint mode.  This version is more
! ;; featureful, robust, and uniform than the Emacs 18 version.  The
! ;; key bindings are also more compatible with the bindings of Hemlock
! ;; and Zwei (the Lisp Machine emacs).
! 
! ;; Since this mode is built on top of the general command-interpreter-in-
! ;; a-buffer mode (comint mode), it shares a common base functionality, 
! ;; and a common set of bindings, with all modes derived from comint mode.
! ;; This makes these modes easier to use.
! 
! ;; For documentation on the functionality provided by comint mode, and
! ;; the hooks available for customising it, see the file comint.el.
! ;; For further information on inferior-lisp mode, see the comments below.
! 
! ;; Needs fixin:
! ;; The load-file/compile-file default mechanism could be smarter -- it
! ;; doesn't know about the relationship between filename extensions and
! ;; whether the file is source or executable. If you compile foo.lisp
! ;; with compile-file, then the next load-file should use foo.bin for
! ;; the default, not foo.lisp. This is tricky to do right, particularly
! ;; because the extension for executable files varies so much (.o, .bin,
! ;; .lbin, .mo, .vo, .ao, ...).
! ;;
! ;; It would be nice if inferior-lisp (and inferior scheme, T, ...) modes
! ;; had a verbose minor mode wherein sending or compiling defuns, etc.
! ;; would be reflected in the transcript with suitable comments, e.g.
! ;; ";;; redefining fact". Several ways to do this. Which is right?
! ;;
! ;; When sending text from a source file to a subprocess, the process-mark can 
! ;; move off the window, so you can lose sight of the process interactions.
! ;; Maybe I should ensure the process mark is in the window when I send
! ;; text to the process? Switch selectable?
  
  ;;; Code:
*************** With argument, positions cursor at end o
*** 360,364 ****
    (interactive "P")
    (if (get-buffer inferior-lisp-buffer)
!       (pop-to-buffer inferior-lisp-buffer)
      (error "No current inferior Lisp buffer"))
    (cond (eob-p
--- 362,371 ----
    (interactive "P")
    (if (get-buffer inferior-lisp-buffer)
!       (let ((pop-up-frames
! 	     ;; Be willing to use another frame
! 	     ;; that already has the window in it.
! 	     (or pop-up-frames
! 		 (get-buffer-window inferior-lisp-buffer t))))
! 	(pop-to-buffer inferior-lisp-buffer))
      (error "No current inferior Lisp buffer"))
    (cond (eob-p
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/info.el emacs-19.31/lisp/info.el
*** emacs-19.30/lisp/info.el	Tue Nov 21 16:11:20 1995
--- emacs-19.31/lisp/info.el	Mon May  6 20:51:13 1996
***************
*** 19,28 ****
  
  ;; 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:
  
! ;;; Note that nowadays we expect info files to be made using makeinfo.
  
  ;;; Code:
--- 19,29 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
! ;; Note that nowadays we expect info files to be made using makeinfo.
  
  ;;; Code:
*************** It is better to write a Texinfo file and
*** 39,45 ****
  because that gives you a printed manual as well.")
  
! (defvar Info-enable-active-nodes t
    "Non-nil allows Info to execute Lisp code associated with nodes.
  The Lisp code is executed when the node is selected.")
  
  (defvar Info-fontify t
--- 40,47 ----
  because that gives you a printed manual as well.")
  
! (defvar Info-enable-active-nodes nil
    "Non-nil allows Info to execute Lisp code associated with nodes.
  The Lisp code is executed when the node is selected.")
+ (put 'Info-enable-active-nodes 'risky-local-variable t)
  
  (defvar Info-fontify t
*************** be last in the list.")
*** 159,165 ****
  	   ext-left)
        ;; SUFFIX starts with a dot.  If FILENAME already has one,
!       ;; get rid of the one in SUFFIX.
        (or (and (<= ext-len 0)
  	       (not (eq (aref filename (1- (length filename))) ?.)))
  	  (setq suffix (substring suffix 1)))
        ;; How many chars of that extension should we keep?
--- 161,168 ----
  	   ext-left)
        ;; SUFFIX starts with a dot.  If FILENAME already has one,
!       ;; get rid of the one in SUFFIX (unless suffix is empty).
        (or (and (<= ext-len 0)
  	       (not (eq (aref filename (1- (length filename))) ?.)))
+ 	  (= (length suffix) 0)
  	  (setq suffix (substring suffix 1)))
        ;; How many chars of that extension should we keep?
*************** the default is the top-level directory o
*** 218,222 ****
  
  In interactive use, a prefix argument directs this command
! to read a file name from the minibuffer."
    (interactive (if current-prefix-arg
  		   (list (read-file-name "Info file name: " nil nil t))))
--- 221,229 ----
  
  In interactive use, a prefix argument directs this command
! to read a file name from the minibuffer.
! 
! The search path for Info files is in the variable `Info-directory-list'.
! The top-level Info directory is made by combining all the files named `dir' 
! in all the directories in that path."
    (interactive (if current-prefix-arg
  		   (list (read-file-name "Info file name: " nil nil t))))
*************** In standalone mode, \\<Info-mode-map>\\[
*** 254,258 ****
        (let (temp temp-downcase found)
  	(setq filename (substitute-in-file-name filename))
! 	(if (string= (downcase (file-name-nondirectory filename)) "dir")
  	    (setq found t)
  	  (let ((dirs (if (string-match "^\\./" filename)
--- 261,265 ----
        (let (temp temp-downcase found)
  	(setq filename (substitute-in-file-name filename))
! 	(if (string= (downcase filename) "dir")
  	    (setq found t)
  	  (let ((dirs (if (string-match "^\\./" filename)
*************** In standalone mode, \\<Info-mode-map>\\[
*** 370,374 ****
  			    (setq guesspos
  				  (Info-read-subfile guesspos))))
! 		    (error "No such node: \"%s\"" nodename))))
  	    (goto-char (max (point-min) (- guesspos 1000)))
  	    ;; Now search from our advised position (or from beg of buffer)
--- 377,381 ----
  			    (setq guesspos
  				  (Info-read-subfile guesspos))))
! 		    (error "No such node: %s" nodename))))
  	    (goto-char (max (point-min) (- guesspos 1000)))
  	    ;; Now search from our advised position (or from beg of buffer)
*************** In standalone mode, \\<Info-mode-map>\\[
*** 461,465 ****
        
        (or buffers
! 	  (error "Can't find the info directory node"))
        ;; Distinguish the dir file that comes with Emacs from all the
        ;; others.  Yes, that is really what this is supposed to do.
--- 468,472 ----
        
        (or buffers
! 	  (error "Can't find the Info directory node"))
        ;; Distinguish the dir file that comes with Emacs from all the
        ;; others.  Yes, that is really what this is supposed to do.
*************** In standalone mode, \\<Info-mode-map>\\[
*** 792,796 ****
       (if (eq errorname t)
  	 nil
!        (error (concat "Node has no " (capitalize (or errorname name))))))))
  
  ;; Return the node name in the buffer following point.
--- 799,803 ----
       (if (eq errorname t)
  	 nil
!        (error "Node has no %s" (capitalize (or errorname name)))))))
  
  ;; Return the node name in the buffer following point.
*************** previous node or back up to the parent n
*** 1237,1241 ****
        (scroll-down))))
  
! (defun Info-next-reference ()
    "Move cursor to the next cross-reference or menu item in the node."
    (interactive)
--- 1244,1248 ----
        (scroll-down))))
  
! (defun Info-next-reference (&optional recur)
    "Move cursor to the next cross-reference or menu item in the node."
    (interactive)
*************** previous node or back up to the parent n
*** 1252,1258 ****
      (goto-char (match-beginning 0))
      (if (looking-at "\\* Menu:")
! 	(Info-next-reference))))
  
! (defun Info-prev-reference ()
    "Move cursor to the previous cross-reference or menu item in the node."
    (interactive)
--- 1259,1267 ----
      (goto-char (match-beginning 0))
      (if (looking-at "\\* Menu:")
! 	(if recur
! 	    (error "No cross references in this node")
! 	  (Info-next-reference t)))))
  
! (defun Info-prev-reference (&optional recur)
    "Move cursor to the previous cross-reference or menu item in the node."
    (interactive)
*************** previous node or back up to the parent n
*** 1268,1272 ****
      (goto-char (match-beginning 0))
      (if (looking-at "\\* Menu:")
! 	(Info-prev-reference))))
  
  (defun Info-index (topic)
--- 1277,1283 ----
      (goto-char (match-beginning 0))
      (if (looking-at "\\* Menu:")
! 	(if recur
! 	    (error "No cross references in this node")
! 	  (Info-prev-reference t)))))
  
  (defun Info-index (topic)
*************** Give a blank topic name to go to the Ind
*** 1323,1328 ****
  	  (or matches
  	      (progn
! 		(Info-last)
! 		(error "No \"%s\" in index" topic)))
  	  ;; Here it is a feature that assoc is case-sensitive.
  	  (while (setq found (assoc topic matches))
--- 1334,1339 ----
  	  (or matches
  	      (progn
! 		(Info-goto-node orignode)
! 		(error "No `%s' in index" topic)))
  	  ;; Here it is a feature that assoc is case-sensitive.
  	  (while (setq found (assoc topic matches))
*************** Give a blank topic name to go to the Ind
*** 1349,1364 ****
      (forward-line 3)  ; don't search in headers
      (let ((name (car (car Info-index-alternatives))))
!       (if (or (re-search-forward (format
! 				  "\\(Function\\|Command\\): %s\\( \\|$\\)"
! 				  (regexp-quote name)) nil t)
! 	      (search-forward (format "`%s'" name) nil t)
! 	      (and (string-match "\\`.*\\( (.*)\\)\\'" name)
! 		   (search-forward
! 		    (format "`%s'" (substring name 0 (match-beginning 1)))
! 		    nil t))
! 	      (search-forward name nil t))
! 	  (beginning-of-line)
! 	(goto-char (point-min)))))
!   (message "Found \"%s\" in %s.  %s"
  	   (car (car Info-index-alternatives))
  	   (nth 2 (car Info-index-alternatives))
--- 1360,1365 ----
      (forward-line 3)  ; don't search in headers
      (let ((name (car (car Info-index-alternatives))))
!       (Info-find-index-name name)))
!   (message "Found `%s' in %s.  %s"
  	   (car (car Info-index-alternatives))
  	   (nth 2 (car Info-index-alternatives))
*************** Give a blank topic name to go to the Ind
*** 1367,1370 ****
--- 1368,1385 ----
  	     "(Only match)")))
  
+ (defun Info-find-index-name (name)
+   "Move point to the place within the current node where NAME is defined."
+   (if (or (re-search-forward (format
+ 			      "[a-zA-Z]+: %s\\( \\|$\\)"
+ 			      (regexp-quote name)) nil t)
+ 	  (search-forward (format "`%s'" name) nil t)
+ 	  (and (string-match "\\`.*\\( (.*)\\)\\'" name)
+ 	       (search-forward
+ 		(format "`%s'" (substring name 0 (match-beginning 1)))
+ 		nil t))
+ 	  (search-forward name nil t))
+       (beginning-of-line)
+     (goto-char (point-min))))
+ 
  (defun Info-undefined ()
    "Make command be undefined in Info."
*************** START is a regular expression which will
*** 1406,1410 ****
      beginning of the tokens delimited string
  ALL is a regular expression with a single
!     parenthized subpattern which is the token to be
      returned. E.g. '{\(.*\)}' would return any string
      enclosed in braces around POS.
--- 1421,1425 ----
      beginning of the tokens delimited string
  ALL is a regular expression with a single
!     parenthesized subpattern which is the token to be
      returned. E.g. '{\(.*\)}' would return any string
      enclosed in braces around POS.
*************** Allowed only if variable `Info-enable-ed
*** 1632,1636 ****
        (error "Editing info nodes is not enabled"))
    (Info-edit-mode)
!   (message (substitute-command-keys
  	    "Editing: Type \\<Info-edit-map>\\[Info-cease-edit] to return to info")))
  
--- 1647,1651 ----
        (error "Editing info nodes is not enabled"))
    (Info-edit-mode)
!   (message "%s" (substitute-command-keys
  	    "Editing: Type \\<Info-edit-map>\\[Info-cease-edit] to return to info")))
  
*************** the variable `Info-file-list-for-emacs'.
*** 1730,1739 ****
  		;; the history.
  		(setq Info-history (nconc (cdr where) Info-history))
! 		(message (substitute-command-keys
! 			  "Found %d other entr%s.  Use \\[Info-last] to see %s.")
  			 (1- num-matches)
  			 (if (> num-matches 2) "ies" "y")
  			 (if (> num-matches 2) "them" "it")))))
!       (error "Couldn't find documentation for %s." command))))
  
  ;;;###autoload
--- 1745,1754 ----
  		;; the history.
  		(setq Info-history (nconc (cdr where) Info-history))
! 		(message "Found %d other entr%s.  Use %s to see %s."
  			 (1- num-matches)
  			 (if (> num-matches 2) "ies" "y")
+ 			 (substitute-command-keys "\\[Info-last]")
  			 (if (> num-matches 2) "them" "it")))))
!       (error "Couldn't find documentation for %s" command))))
  
  ;;;###autoload
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/informat.el emacs-19.31/lisp/informat.el
*** emacs-19.30/lisp/informat.el	Tue Oct 24 12:43:32 1995
--- emacs-19.31/lisp/informat.el	Sun Jan 14 02:34:30 1996
***************
*** 19,24 ****
  
  ;; 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.
  
  ;;; Code:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Code:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/isearch.el emacs-19.31/lisp/isearch.el
*** emacs-19.30/lisp/isearch.el	Thu Oct 19 18:22:47 1995
--- emacs-19.31/lisp/isearch.el	Thu Apr  4 11:38:30 1996
***************
*** 19,28 ****
  
  ;; 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:
  
- ;;;====================================================================
  ;; Instructions
  
--- 19,28 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
  ;; Instructions
  
***************
*** 66,108 ****
  ;;; Change Log:
  
! ;;; Changes before those recorded in ChangeLog:
  
! ;;; Revision 1.4  92/09/14  16:26:02  liberte
! ;;; Added prefix args to isearch-forward, etc. to switch between
! ;;;    string and regular expression searching.
! ;;; Added some support for lemacs.
! ;;; Added general isearch-highlight option - but only for lemacs so far.
! ;;; Added support for frame switching in emacs 19.
! ;;; Added word search option to isearch-edit-string.
! ;;; Renamed isearch-quit to isearch-abort.
! ;;; Numerous changes to comments and doc strings.
! ;;; 
! ;;; Revision 1.3  92/06/29  13:10:08  liberte
! ;;; Moved modal isearch-mode handling into isearch-mode.
! ;;; Got rid of buffer-local isearch variables.
! ;;; isearch-edit-string used by ring adjustments, completion, and
! ;;; nonincremental searching.  C-s and C-r are additional exit commands.
! ;;; Renamed all regex to regexp.
! ;;; Got rid of found-start and found-point globals.
! ;;; Generalized handling of upper-case chars.
!  
! ;;; Revision 1.2  92/05/27  11:33:57  liberte
! ;;; Emacs version 19 has a search ring, which is supported here.
! ;;; Other fixes found in the version 19 isearch are included here.
! ;;;
! ;;; Also see variables search-caps-disable-folding,
! ;;; search-nonincremental-instead, search-whitespace-regexp, and
! ;;; commands isearch-toggle-regexp, isearch-edit-string.
! ;;;
! ;;; semi-modal isearching is supported.
! 
! ;;; Changes for 1.1
! ;;; 3/18/92 Fixed invalid-regexp.
! ;;; 3/18/92 Fixed yanking in regexps.
  
  ;;; Code:
  
  
- ;;;========================================================================
  ;;; Some additional options and constants.
  
--- 66,107 ----
  ;;; Change Log:
  
! ;; Changes before those recorded in ChangeLog:
  
! ;; Revision 1.4  92/09/14  16:26:02  liberte
! ;; Added prefix args to isearch-forward, etc. to switch between
! ;;    string and regular expression searching.
! ;; Added some support for lemacs.
! ;; Added general isearch-highlight option - but only for lemacs so far.
! ;; Added support for frame switching in emacs 19.
! ;; Added word search option to isearch-edit-string.
! ;; Renamed isearch-quit to isearch-abort.
! ;; Numerous changes to comments and doc strings.
! ;; 
! ;; Revision 1.3  92/06/29  13:10:08  liberte
! ;; Moved modal isearch-mode handling into isearch-mode.
! ;; Got rid of buffer-local isearch variables.
! ;; isearch-edit-string used by ring adjustments, completion, and
! ;; nonincremental searching.  C-s and C-r are additional exit commands.
! ;; Renamed all regex to regexp.
! ;; Got rid of found-start and found-point globals.
! ;; Generalized handling of upper-case chars.
! 
! ;; Revision 1.2  92/05/27  11:33:57  liberte
! ;; Emacs version 19 has a search ring, which is supported here.
! ;; Other fixes found in the version 19 isearch are included here.
! ;;
! ;; Also see variables search-caps-disable-folding,
! ;; search-nonincremental-instead, search-whitespace-regexp, and
! ;; commands isearch-toggle-regexp, isearch-edit-string.
! ;;
! ;; semi-modal isearching is supported.
! 
! ;; Changes for 1.1
! ;; 3/18/92 Fixed invalid-regexp.
! ;; 3/18/92 Fixed yanking in regexps.
  
  ;;; Code:
  
  
  ;;; Some additional options and constants.
  
*************** You might want to use something like \"[
*** 146,150 ****
    "Function(s) to call after terminating an incremental search.")
  
- ;;;==================================================================
  ;;; Search ring.
  
--- 145,148 ----
*************** nil if none yet.")
*** 170,174 ****
  Default value, nil, means edit the string instead.")
  
- ;;;====================================================
  ;;; Define isearch-mode keymap.
  
--- 168,171 ----
*************** Default value, nil, means edit the strin
*** 280,284 ****
        ))
  
- ;;;========================================================
  ;; Internal variables declared globally for byte-compiler.
  ;; These are all set with setq while isearching
--- 277,280 ----
*************** Default value, nil, means edit the strin
*** 299,302 ****
--- 295,299 ----
  (defvar isearch-wrapped nil)	; Searching restarted from the top (bottom).
  (defvar isearch-barrier 0)
+ (defvar isearch-just-started nil)
  
  ; case-fold-search while searching.
*************** Default value, nil, means edit the strin
*** 331,335 ****
  
  
- ;;;==============================================================
  ;; Minor-mode-alist changes - kind of redundant with the
  ;; echo area, but if isearching in multiple windows, it can be useful.
--- 328,331 ----
*************** Default value, nil, means edit the strin
*** 347,351 ****
  (define-key esc-map "\C-r" 'isearch-backward-regexp)
  
- ;;;===============================================================
  ;;; Entry points to isearch-mode.
  ;;; These four functions should replace those in loaddefs.el
--- 343,346 ----
*************** is treated as a regexp.  See \\[isearch-
*** 428,432 ****
  
  
- ;;;==================================================================
  ;; isearch-mode only sets up incremental search for the minor mode.
  ;; All the work is done by the isearch-mode commands.
--- 423,426 ----
*************** is treated as a regexp.  See \\[isearch-
*** 464,471 ****
--- 458,467 ----
  	isearch-other-end nil
  	isearch-small-window nil
+ 	isearch-just-started t
  
  	isearch-opoint (point)
  	search-ring-yank-pointer nil
  	regexp-search-ring-yank-pointer nil)
+   (looking-at "")
    (setq isearch-window-configuration
  	(if isearch-slow-terminal-mode (current-window-configuration) nil))
*************** is treated as a regexp.  See \\[isearch-
*** 480,484 ****
    (run-hooks 'isearch-mode-hook)
  
!   (setq mouse-leave-buffer-hook '(isearch-done))
  
    ;; isearch-mode can be made modal (in the sense of not returning to 
--- 476,480 ----
    (run-hooks 'isearch-mode-hook)
  
!   (add-hook 'mouse-leave-buffer-hook 'isearch-done)
  
    ;; isearch-mode can be made modal (in the sense of not returning to 
*************** is treated as a regexp.  See \\[isearch-
*** 491,495 ****
  
  
- ;;;====================================================
  ;; Some high level utilities.  Others below.
  
--- 487,490 ----
*************** is treated as a regexp.  See \\[isearch-
*** 531,535 ****
  
  (defun isearch-done (&optional nopush edit)
!   (setq mouse-leave-buffer-hook nil)
    ;; Called by all commands that terminate isearch-mode.
    ;; If NOPUSH is non-nil, we don't push the string on the search ring.
--- 526,530 ----
  
  (defun isearch-done (&optional nopush edit)
!   (remove-hook 'mouse-leave-buffer-hook 'isearch-done)
    ;; Called by all commands that terminate isearch-mode.
    ;; If NOPUSH is non-nil, we don't push the string on the search ring.
*************** is treated as a regexp.  See \\[isearch-
*** 553,557 ****
  	    (progn
  	      (push-mark isearch-opoint t)
! 	      (or executing-macro (> (minibuffer-depth) 0)
  		  (message "Mark saved where search started"))))))
  
--- 548,552 ----
  	    (progn
  	      (push-mark isearch-opoint t)
! 	      (or executing-kbd-macro (> (minibuffer-depth) 0)
  		  (message "Mark saved where search started"))))))
  
*************** REGEXP says which ring to use."
*** 585,589 ****
  	      (setcdr (nthcdr (1- search-ring-max) search-ring) nil))))))
  
- ;;;=======================================================
  ;;; Switching buffers should first terminate isearch-mode.
  ;;; This is done quite differently for each variant of emacs.
--- 580,583 ----
*************** REGEXP says which ring to use."
*** 597,604 ****
    (handle-switch-frame (car (cdr (isearch-last-command-char)))))
  
- ;;;========================================================
- 
  
- ;;;====================================================
  ;; Commands active while inside of the isearch minor mode.
  
--- 591,595 ----
*************** If first char entered is \\[isearch-yank
*** 727,732 ****
  	;; Empty isearch-string means use default.
  	(if (= 0 (length isearch-string))
! 	    (setq isearch-string (car (if isearch-regexp regexp-search-ring
! 					search-ring)))
  	  ;; This used to set the last search string,
  	  ;; but I think it is not right to do that here.
--- 718,725 ----
  	;; Empty isearch-string means use default.
  	(if (= 0 (length isearch-string))
! 	    (setq isearch-string (or (car (if isearch-regexp
! 					      regexp-search-ring
! 					    search-ring))
! 				     ""))
  	  ;; This used to set the last search string,
  	  ;; but I think it is not right to do that here.
*************** If first char entered is \\[isearch-yank
*** 770,776 ****
  
  (defun isearch-abort ()
!   "Abort incremental search mode if searching is successful, signalling quit.
  Otherwise, revert to previous successful search and continue searching.
! Use `isearch-exit' to quit without signalling."
    (interactive)
  ;;  (ding)  signal instead below, if quitting
--- 763,769 ----
  
  (defun isearch-abort ()
!   "Abort incremental search mode if searching is successful, signaling quit.
  Otherwise, revert to previous successful search and continue searching.
! Use `isearch-exit' to quit without signaling."
    (interactive)
  ;;  (ding)  signal instead below, if quitting
*************** Use `isearch-exit' to quit without signa
*** 816,820 ****
    (if (equal isearch-string "")
        (setq isearch-success t)
!     (if (and isearch-success (equal (match-end 0) (match-beginning 0)))
  	;; If repeating a search that found
  	;; an empty string, ensure we advance.
--- 809,814 ----
    (if (equal isearch-string "")
        (setq isearch-success t)
!     (if (and isearch-success (equal (match-end 0) (match-beginning 0))
! 	     (not isearch-just-started))
  	;; If repeating a search that found
  	;; an empty string, ensure we advance.
*************** If no previous match was done, just beep
*** 937,942 ****
      (if (and (not isearch-forward) (not isearch-adjusted)
  	     (condition-case ()
! 		 (looking-at (if isearch-regexp isearch-string
! 			       (regexp-quote isearch-string)))
  	       (error nil))
  	       (or isearch-yank-flag
--- 931,937 ----
      (if (and (not isearch-forward) (not isearch-adjusted)
  	     (condition-case ()
! 		 (let ((case-fold-search isearch-case-fold-search))
! 		   (looking-at (if isearch-regexp isearch-string
! 				 (regexp-quote isearch-string))))
  	       (error nil))
  	       (or isearch-yank-flag
*************** and the meta character is unread so that
*** 1010,1014 ****
      (cond ((and (= (length key) 1)
  		(let ((lookup (lookup-key function-key-map key)))
! 		  (not (or (null lookup) (integerp lookup)))))
  	   ;; Handle a function key that translates into something else.
  	   ;; If the key has a global definition too,
--- 1005,1010 ----
      (cond ((and (= (length key) 1)
  		(let ((lookup (lookup-key function-key-map key)))
! 		  (not (or (null lookup) (integerp lookup)
! 			   (keymapp lookup)))))
  	   ;; Handle a function key that translates into something else.
  	   ;; If the key has a global definition too,
*************** If you want to search for just a space, 
*** 1118,1122 ****
  
  
- ;;===========================================================
  ;; Search Ring
  
--- 1114,1117 ----
*************** If you want to search for just a space, 
*** 1217,1221 ****
        t)
       ((or completion ; not nil, must be a string
! 	  (= 0 (length isearch-string))) ; shouldnt have to say this
        (if (equal completion isearch-string)  ;; no extension?
  	  (if completion-auto-help
--- 1212,1216 ----
        t)
       ((or completion ; not nil, must be a string
! 	  (= 0 (length isearch-string))) ; shouldn't have to say this
        (if (equal completion isearch-string)  ;; no extension?
  	  (if completion-auto-help
*************** If there is no completion possible, say 
*** 1250,1254 ****
  
  
- ;;;==============================================================
  ;; The search status stack (and isearch window-local variables, not used).
  ;; Need a structure for this.
--- 1245,1248 ----
*************** If there is no completion possible, say 
*** 1284,1288 ****
  
  
- ;;;==================================================================
  ;; Message string
  
--- 1278,1281 ----
*************** If there is no completion possible, say 
*** 1335,1339 ****
  
  
- ;;;========================================================
  ;;; Searching
  
--- 1328,1331 ----
*************** If there is no completion possible, say 
*** 1360,1363 ****
--- 1352,1356 ----
  		      (if isearch-forward 'search-forward 'search-backward)))
  	       isearch-string nil t))
+ 	(setq isearch-just-started nil)
  	(if isearch-success
  	    (setq isearch-other-end
*************** If there is no completion possible, say 
*** 1388,1392 ****
  
  
- ;;;========================================================
  ;;; Highlighting
  
--- 1381,1384 ----
*************** If there is no completion possible, say 
*** 1406,1410 ****
        (delete-overlay isearch-overlay)))
  
- ;;;===========================================================
  ;;; General utilities
  
--- 1398,1401 ----
*************** If there is no completion possible, say 
*** 1412,1416 ****
  (defun isearch-no-upper-case-p (string regexp-flag)
    "Return t if there are no upper case chars in STRING.
! If REGEXP-FLAG is non-nil, disregard letters preceeded by `\\' (but not `\\\\')
  since they have special meaning in a regexp."
    (let ((case-fold-search nil))
--- 1403,1407 ----
  (defun isearch-no-upper-case-p (string regexp-flag)
    "Return t if there are no upper case chars in STRING.
! If REGEXP-FLAG is non-nil, disregard letters preceded by `\\' (but not `\\\\')
  since they have special meaning in a regexp."
    (let ((case-fold-search nil))
*************** since they have special meaning in a reg
*** 1420,1424 ****
  
  
- ;;;=================================================
  ;; Portability functions to support various Emacs versions.
  
--- 1411,1414 ----
*************** since they have special meaning in a reg
*** 1437,1441 ****
--- 1427,1433 ----
  
  ;; General function to unread characters or events.
+ ;; Also insert them in a keyboard macro being defined.
  (defun isearch-unread (&rest char-or-events)
+   (mapcar 'store-kbd-macro-event char-or-events)
    (setq unread-command-events
  	(append char-or-events unread-command-events)))
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/iso-acc.el emacs-19.31/lisp/iso-acc.el
*** emacs-19.30/lisp/iso-acc.el	Fri Oct  6 11:12:57 1995
--- emacs-19.31/lisp/iso-acc.el	Mon May 20 17:02:14 1996
***************
*** 1,4 ****
! ;;; iso-acc.el -- minor mode providing electric accent keys
! ;;; Copyright (C) 1993, 1994 Free Software Foundation, Inc.
  
  ;; Author: Johan Vromans <jv@mh.nl>
--- 1,5 ----
! ;;; iso-acc.el --- minor mode providing electric accent keys
! 
! ;; Copyright (C) 1993, 1994, 1996 Free Software Foundation, Inc.
  
  ;; Author: Johan Vromans <jv@mh.nl>
***************
*** 20,25 ****
  
  ;; 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:
--- 21,27 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 57,61 ****
  
  ;; If you want only some of these characters to serve as accents,
! ;; set iso-accents-enable to the list of characters that should be special.
  
  ;;; Code:
--- 59,64 ----
  
  ;; If you want only some of these characters to serve as accents,
! ;; add a language to `iso-languages' which specifies the accent characters
! ;; that you want, then select the language with `iso-accents-customize'.
  
  ;;; Code:
***************
*** 65,122 ****
  (defvar iso-languages
    '(("portuguese"
!      (?' ?` ?^ ?\" ?~)
!      (((?' ?A) ?\301) ((?' ?E) ?\311) ((?' ?I) ?\315) ((?' ?O) ?\323)
!       ((?' ?U) ?\332) ((?' ?C) ?\307) ((?' ?a) ?\341) ((?' ?e) ?\351)
!       ((?' ?i) ?\355) ((?' ?o) ?\363) ((?' ?u) ?\372) ((?' ?c) ?\347)
!       ((?' ? ) ?') ((?` ?A) ?\300) ((?` ?a) ?\340) ((?` ? ) ?`)
!       ((?^ ?A) ?\302) ((?^ ?E) ?\312) ((?^ ?O) ?\324) ((?^ ?a) ?\342)
!       ((?^ ?e) ?\352) ((?^ ?o) ?\364) ((?^ ? ) ?^) ((?\" ?U) ?\334)
!       ((?\" ?u) ?\374) ((?\" ? ) ?\") ((?\~ ?A) ?\303) ((?\~ ?O) ?\325)
!       ((?\~ ?a) ?\343) ((?\~ ?o) ?\365) ((?\~ ?\ ) ?\~)))
      ("french"
!      (?' ?` ?^ ?\" ?~)
!      (((?' ?A) ?\301) ((?' ?E) ?\311) ((?' ?I) ?\315) ((?' ?O) ?\323)
!       ((?' ?U) ?\332) ((?' ?C) ?\307) ((?' ?a) ?\341) ((?' ?e) ?\351)
!       ((?' ?i) ?\355) ((?' ?o) ?\363) ((?' ?u) ?\372) ((?' ?c) ?\347)
!       ((?' ? ) ?') ((?` ?A) ?\300) ((?` ?E) ?\310) ((?` ?a) ?\340)
!       ((?` ?e) ?\350) ((?` ? ) ?`) ((?^ ?A) ?\302) ((?^ ?E) ?\312)
!       ((?^ ?I) ?\316) ((?^ ?O) ?\324) ((?^ ?U) ?\333) ((?^ ?a) ?\342)
!       ((?^ ?e) ?\352) ((?^ ?i) ?\356) ((?^ ?o) ?\364) ((?^ ?u) ?\373)
!       ((?^ ? ) ?^) ((?\" ?U) ?\334) ((?\" ?u) ?\374) ((?\" ? ) ?\")
!       ((?\~ ?A) ?\303) ((?\~ ?O) ?\325) ((?\~ ?a) ?\343) ((?\~ ?o) ?\365)
!       ((?\~ ?\ ) ?\~)))
!     ("default"
!      (?' ?` ?^ ?\" ?~ ?/)
!      (((?' ?A) ?\301) ((?' ?E) ?\311) ((?' ?I) ?\315) ((?' ?O) ?\323)
!       ((?' ?U) ?\332) ((?' ?Y) ?\335) ((?' ?a) ?\341) ((?' ?e) ?\351)
!       ((?' ?i) ?\355) ((?' ?o) ?\363) ((?' ?u) ?\372) ((?' ?y) ?\375)
!       ((?' ?') ?\264) ((?' ? ) ?') ((?` ?A) ?\300) ((?` ?E) ?\310)
!       ((?` ?I) ?\314) ((?` ?O) ?\322) ((?` ?U) ?\331) ((?` ?a) ?\340)
!       ((?` ?e) ?\350) ((?` ?i) ?\354) ((?` ?o) ?\362) ((?` ?u) ?\371)
!       ((?` ? ) ?`) ((?` ?`) ?`) ((?^ ?A) ?\302) ((?^ ?E) ?\312)
!       ((?^ ?I) ?\316) ((?^ ?O) ?\324) ((?^ ?U) ?\333) ((?^ ?a) ?\342)
!       ((?^ ?e) ?\352) ((?^ ?i) ?\356) ((?^ ?o) ?\364) ((?^ ?u) ?\373)
!       ((?^ ? ) ?^) ((?^ ?^) ?^) ((?\" ?A) ?\304) ((?\" ?E) ?\313)
!       ((?\" ?I) ?\317) ((?\" ?O) ?\326) ((?\" ?U) ?\334) ((?\" ?a) ?\344)
!       ((?\" ?e) ?\353) ((?\" ?i) ?\357) ((?\" ?o) ?\366) ((?\" ?s) ?\337)
!       ((?\" ?u) ?\374) ((?\" ?y) ?\377) ((?\" ? ) ?\") ((?\" ?\") ?\250)
!       ((?\~ ?A) ?\303) ((?\~ ?C) ?\307) ((?\~ ?D) ?\320) ((?\~ ?N) ?\321)
!       ((?\~ ?O) ?\325) ((?\~ ?T) ?\336) ((?\~ ?a) ?\343) ((?\~ ?c) ?\347)
!       ((?\~ ?d) ?\360) ((?\~ ?n) ?\361) ((?\~ ?o) ?\365) ((?\~ ?t) ?\376)
!       ((?\~ ?>) ?\273) ((?\~ ?<) ?\253) ((?\~ ?\ ) ?\~) ((?\~ ?\~) ?\270)
!       ((?\/ ?A) ?\305) ((?\/ ?E) ?\306) ((?\/ ?O) ?\330) ((?\/ ?a) ?\345)
!       ((?\/ ?e) ?\346) ((?\/ ?o) ?\370) ((?\/ ?\ ) ?\/) ((?\/ ?\/) ?\260))))
! 
    "List of language-specific customizations for the ISO Accents mode.
  
! Each element of the list is of the form (LANGUAGE ENABLE LIST).
  
! LANGUAGE is a string naming the language.
  
! ENABLE is a list of characters that will be used as accent prefixes.
! It will be the value of the iso-accents-enable variable.
  
! LIST is a list of accent translations.  It will be the value of the
! iso-accents-list variable.")
  
  (defvar iso-language nil
--- 68,158 ----
  (defvar iso-languages
    '(("portuguese"
!      (?' (?A . ?\301) (?E . ?\311) (?I . ?\315) (?O . ?\323) (?U . ?\332)
! 	 (?C . ?\307) (?a . ?\341) (?e . ?\351) (?i . ?\355) (?o . ?\363)
! 	 (?u . ?\372) (?c . ?\347) (?\  . ?'))
!      (?` (?A . ?\300) (?a . ?\340) (?\  . ?`))
!      (?^ (?A . ?\302) (?E . ?\312) (?O . ?\324) (?a . ?\342) (?e . ?\352)
! 	 (?o . ?\364) (?\  . ?^))
!      (?\" (?U . ?\334) (?u . ?\374) (?\  . ?\"))
!      (?\~ (?A . ?\303) (?O . ?\325) (?a . ?\343) (?o . ?\365) (?\  . ?\~)))
!     
!     ("irish"
!      (?' (?A . ?\301) (?E . ?\311) (?I . ?\315) (?O . ?\323) (?U . ?\332)
! 	 (?a . ?\341) (?e . ?\351) (?i . ?\355) (?o . ?\363) (?u . ?\372)
! 	 (?\  . ?')))
!     
      ("french"
!      (?' (?A . ?\301) (?E . ?\311) (?I . ?\315) (?O . ?\323) (?U . ?\332)
! 	 (?C . ?\307) (?a . ?\341) (?e . ?\351) (?i . ?\355) (?o . ?\363)
! 	 (?u . ?\372) (?c . ?\347) (?\  . ?'))
!      (?` (?A . ?\300) (?E . ?\310) (?a . ?\340) (?e . ?\350) (?\  . ?`))
!      (?^ (?A . ?\302) (?E . ?\312) (?I . ?\316) (?O . ?\324) (?U . ?\333)
! 	 (?a . ?\342) (?e . ?\352) (?i . ?\356) (?o . ?\364) (?u . ?\373)
! 	 (?\  . ?^))
!      (?\" (?U . ?\334) (?u . ?\374) (?\  . ?\"))
!      (?\~ (?A . ?\303) (?O . ?\325) (?a . ?\343) (?o . ?\365) (?\  . ?\~)))
!     
!     ("latin-2"
!      (?' (?A . ?\301) (?C . ?\306) (?D . ?\320) (?E . ?\311) (?I . ?\315)
! 	 (?L . ?\305) (?N . ?\321) (?O . ?\323) (?R . ?\300) (?S . ?\246)
! 	 (?U . ?\332) (?Y . ?\335) (?Z . ?\254) (?a . ?\341) (?c . ?\346)
! 	 (?d . ?\360) (?e . ?\351) (?i . ?\355) (?l . ?\345) (?n . ?\361)
! 	 (?o . ?\363) (?r . ?\340) (?s . ?\266) (?u . ?\372) (?y . ?\375)
! 	 (?z . ?\274) (?' . ?\264) (?\  . ?')) 
!      (?` (?A . ?\241) (?C . ?\307) (?E . ?\312) (?L . ?\243) (?S . ?\252)
! 	 (?T . ?\336) (?Z . ?\257) (?a . ?\261) (?l . ?\263) (?c . ?\347)
! 	 (?e . ?\352) (?s . ?\272) (?t . ?\376) (?z . ?\277) (?` . ?\252)
! 	 (?. . ?\377) (?\  . ?`))
!      (?^ (?A . ?\302) (?O . ?\324) (?a . ?\342) (?o . ?\364)
! 	 (?^ . ?^)			; no special code?
! 	 (?\  . ?^))
!      (?\" (?A . ?\304) (?E . ?\313) (?O . ?\326) (?U . ?\334) (?a . ?\344)
! 	  (?e . ?\353) (?o . ?\366) (?s . ?\337) (?u . ?\374) (?\" . ?\250)
! 	  (?\  . ?\"))
!      (?\~ (?A . ?\303) (?C . ?\310) (?D . ?\317) (?L . ?\245) (?N . ?\322)
! 	  (?O . ?\325) (?R . ?\330) (?S . ?\251) (?T . ?\253) (?U . ?\333)
! 	  (?Z . ?\256) (?a . ?\323) (?c . ?\350) (?d . ?\357) (?l . ?\265)
! 	  (?n . ?\362) (?o . ?\365) (?r . ?\370) (?s . ?\271) (?t . ?\273)
! 	  (?u . ?\373) (?z . ?\276)
! 	  (?v . ?\242)			; v accent
! 	  (?\~ . ?\242)			; v accent
! 	  (?\. . ?\270)			; cedilla accent
! 	  (?\  . ?\~)))
! 
!     ("latin-1"
!      (?' (?A . ?\301) (?E . ?\311) (?I . ?\315) (?O . ?\323) (?U . ?\332)
! 	 (?Y . ?\335) (?a . ?\341) (?e . ?\351) (?i . ?\355) (?o . ?\363)
! 	 (?u . ?\372) (?y . ?\375) (?' . ?\264) (?\  . ?'))      
!      (?` (?A . ?\300) (?E . ?\310) (?I . ?\314) (?O . ?\322) (?U . ?\331)
! 	 (?a . ?\340) (?e . ?\350) (?i . ?\354) (?o . ?\362) (?u . ?\371)
! 	 (?` . ?`) (?\  . ?`))
!      (?^ (?A . ?\302) (?E . ?\312) (?I . ?\316) (?O . ?\324) (?U . ?\333)
! 	 (?a . ?\342) (?e . ?\352) (?i . ?\356) (?o . ?\364) (?u . ?\373)
! 	 (?^ . ?^) (?\  . ?^))
!      (?\" (?A . ?\304) (?E . ?\313) (?I . ?\317) (?O . ?\326) (?U . ?\334)
! 	  (?a . ?\344) (?e . ?\353) (?i . ?\357) (?o . ?\366) (?s . ?\337)
! 	  (?u . ?\374) (?y . ?\377) (?\" . ?\250) (?\  . ?\"))
!      (?\~ (?A . ?\303) (?C . ?\307) (?D . ?\320) (?N . ?\321) (?O . ?\325)
! 	  (?T . ?\336) (?a . ?\343) (?c . ?\347) (?d . ?\360) (?n . ?\361)
! 	  (?o . ?\365) (?t . ?\376) (?> . ?\273) (?< . ?\253) (?\~ . ?\270)
! 	  (?! . ?\241) (?? . ?\277)
! 	  (?\  . ?\~))
!      (?\/ (?A . ?\305) (?E . ?\306) (?O . ?\330) (?a . ?\345) (?e . ?\346)
! 	  (?o . ?\370) (?\/ . ?\260) (?\  . ?\/))))
    "List of language-specific customizations for the ISO Accents mode.
  
! Each element of the list is of the form
  
!     (LANGUAGE
!      (PSEUDO-ACCENT MAPPINGS)
!      (PSEUDO-ACCENT MAPPINGS)
!      ...)
  
! LANGUAGE is a string naming the language.
! PSEUDO-ACCENT is a char specifying an accent key.
! MAPPINGS are cons cells of the form (CHAR . ISO-CHAR).
  
! The net effect is that the key sequence PSEUDO-ACCENT CHAR is mapped
! to ISO-CHAR on input.")
  
  (defvar iso-language nil
*************** See the function `iso-accents-mode'.")
*** 133,161 ****
  (make-variable-buffer-local 'iso-accents-mode)
  
  (defun iso-accents-accent-key (prompt)
    "Modify the following character by adding an accent to it."
    ;; Pick up the accent character.
!   (if iso-accents-mode
        (iso-accents-compose prompt)
      (char-to-string last-input-char)))
  
- (defun iso-accents-compose-key (prompt)
-   "Modify the following character by adding an accent to it."
-   ;; Pick up the accent character.
-   (let ((combined (iso-accents-compose prompt)))
-     (if unread-command-events
- 	(let ((unread unread-command-events))
- 	  (setq unread-command-events nil)
- 	  (error "Characters %s and %s cannot be composed"
- 		 (single-key-description (aref combined 0))
- 		 (single-key-description (car unread)))))
-     combined))
- 
  (defun iso-accents-compose (prompt)
    (let* ((first-char last-input-char)
  	 ;; Wait for the second key and look up the combination.
  	 (second-char (if (or prompt
  			      (not (eq (key-binding "a")
  				       'self-insert-command))
  			      ;; Called from anything but the command loop.
  			      this-command)
--- 169,199 ----
  (make-variable-buffer-local 'iso-accents-mode)
  
+ (defvar iso-accents-enable '(?' ?` ?^ ?\" ?~ ?/)
+   "*List of accent keys that become prefixes in ISO Accents mode.
+ The default is (?' ?` ?^ ?\" ?~ ?/), which contains all the supported
+ accent keys.  If you set this variable to a list in which some of those
+ characters are missing, the missing ones do not act as accents.
+ 
+ Note that if you specify a language with `iso-accents-customize',
+ that can also turn off certain prefixes (whichever ones are not needed in
+ the language you choose).")
+ 
  (defun iso-accents-accent-key (prompt)
    "Modify the following character by adding an accent to it."
    ;; Pick up the accent character.
!   (if (and iso-accents-mode
! 	   (memq last-input-char iso-accents-enable))
        (iso-accents-compose prompt)
      (char-to-string last-input-char)))
  
  (defun iso-accents-compose (prompt)
    (let* ((first-char last-input-char)
+ 	 (list (assq first-char iso-accents-list))
  	 ;; Wait for the second key and look up the combination.
  	 (second-char (if (or prompt
  			      (not (eq (key-binding "a")
  				       'self-insert-command))
+ 			      ;; Not at start of a key sequence.
+ 			      (> (length (this-single-command-keys)) 1)
  			      ;; Called from anything but the command loop.
  			      this-command)
*************** See the function `iso-accents-mode'.")
*** 168,185 ****
  			(prog1 (read-event)
  			  (delete-region (1- (point)) (point)))))
! 	 (entry (assoc (list first-char second-char) iso-accents-list)))
      (if entry
! 	;; Found it: delete the first character and insert the combination.
! 	(concat (list (nth 1 entry)))
        ;; Otherwise, advance and schedule the second key for execution.
        (setq unread-command-events (list second-char))
        (vector first-char))))
  
- (defvar iso-accents-enable nil
-   "*List of accent keys that become prefixes in ISO Accents mode.
- The default is (?' ?` ?^ ?\" ?~ ?/), which contains all the supported
- accent keys.  For certain languages, you might want to remove some of
- those characters that are not actually used.")
- 
  ;; It is a matter of taste if you want the minor mode indicated
  ;; in the mode line...
--- 206,217 ----
  			(prog1 (read-event)
  			  (delete-region (1- (point)) (point)))))
! 	 (entry (cdr (assq second-char list))))
      (if entry
! 	;; Found it: return the mapped char
! 	(vector entry)
        ;; Otherwise, advance and schedule the second key for execution.
        (setq unread-command-events (list second-char))
        (vector first-char))))
  
  ;; It is a matter of taste if you want the minor mode indicated
  ;; in the mode line...
*************** When Iso-accents mode is enabled, accent
*** 198,204 ****
  letter key so that it inserts an ISO accented letter.
  
! The variable `iso-accents-enable' specifies the list of characters to
! enable as accents.  If you don't need all of them, remove the ones you
! don't need from that list.
  
  Special combinations: ~c gives a c with cedilla,
--- 230,235 ----
  letter key so that it inserts an ISO accented letter.
  
! You can customize ISO Accents mode to a particular language
! with the command `iso-accents-customize'.
  
  Special combinations: ~c gives a c with cedilla,
*************** Special combinations: ~c gives a c with 
*** 208,212 ****
  /a gives a with ring.
  /e gives an a-e ligature.
! ~< and ~> give guillemets.
  ~! gives an inverted exclamation mark.
  ~? gives an inverted question mark.
--- 239,243 ----
  /a gives a with ring.
  /e gives an a-e ligature.
! ~< and ~> give guillemots.
  ~! gives an inverted exclamation mark.
  ~? gives an inverted question mark.
*************** It selects the customization based on th
*** 233,251 ****
    (interactive (list (completing-read "Language: " iso-languages nil t)))
    (let ((table (assoc language iso-languages))
! 	c)
      (if (not table)
! 	(error "Unknown language")
!       (setq iso-language language)
!       (setq iso-accents-enable (car (cdr table)))
!       (setq iso-accents-list (car (cdr (cdr table))))
        (if key-translation-map
  	  (substitute-key-definition
  	   'iso-accents-accent-key nil key-translation-map)
  	(setq key-translation-map (make-sparse-keymap)))
!       (setq c iso-accents-enable)
!       (while c
! 	(define-key
! 	  key-translation-map (char-to-string (car c)) 'iso-accents-accent-key)
! 	(setq c (cdr c))))))
  
  (defun iso-accentuate (start end)
--- 264,283 ----
    (interactive (list (completing-read "Language: " iso-languages nil t)))
    (let ((table (assoc language iso-languages))
! 	all-accents tail)
      (if (not table)
! 	(error "Unknown language '%s'" language)
!       (setq iso-language language
! 	    iso-accents-list (cdr table))
        (if key-translation-map
  	  (substitute-key-definition
  	   'iso-accents-accent-key nil key-translation-map)
  	(setq key-translation-map (make-sparse-keymap)))
!       ;; Set up translations for all the characters that are used as
!       ;; accent prefixes in this language.
!       (setq tail iso-accents-list)
!       (while tail
! 	(define-key key-translation-map (vector (car (car tail)))
! 	  'iso-accents-accent-key)
! 	(setq tail (cdr tail))))))
  
  (defun iso-accentuate (start end)
*************** This uses the same conversion that ISO A
*** 262,283 ****
  	(while (< (point) end)
  	  (if (and (memq (preceding-char) iso-accents-enable)
! 		   (<= ?A (following-char))
! 		   (<= (following-char) ?z)
! 		   (setq entry (assoc (list (preceding-char) (following-char))
! 				     iso-accents-list)))
  	      (progn
  		(forward-char -1)
  		(delete-char 2)
! 		(insert (car (cdr entry)))
  		(setq end (1- end)))
  	    (forward-char 1)))))))
  
  (defun iso-accent-rassoc-unit (value alist)
!   (while (and alist
! 	      (not (eq (car (cdr (car alist))) value)))
!     (setq alist (cdr alist)))
!   (if alist
!       (car alist)
!     nil))
  
  (defun iso-unaccentuate (start end)
--- 294,313 ----
  	(while (< (point) end)
  	  (if (and (memq (preceding-char) iso-accents-enable)
! 		   (setq entry (cdr (assq (following-char) (assq (preceding-char) iso-accents-list)))))
  	      (progn
  		(forward-char -1)
  		(delete-char 2)
! 		(insert entry)
  		(setq end (1- end)))
  	    (forward-char 1)))))))
  
  (defun iso-accent-rassoc-unit (value alist)
!   (let (elt acc)
!     (while (and alist (not elt))
!       (setq acc (car (car alist))
! 	    elt (car (rassq value (cdr (car alist))))
! 	    alist (cdr alist)))
!     (if elt
! 	(cons acc elt))))
  
  (defun iso-unaccentuate (start end)
*************** This uses the opposite of the conversion
*** 297,301 ****
  	      (progn
  		(delete-char 1)
! 		(insert (car (car entry)) (car (cdr (car entry))))
  		(setq end (1+ end)))
  	    (forward-char 1)))))))
--- 327,331 ----
  	      (progn
  		(delete-char 1)
! 		(insert (car entry) (cdr entry))
  		(setq end (1+ end)))
  	    (forward-char 1)))))))
*************** Noninteractively, this operates on text 
*** 316,324 ****
  	      (progn
  		(delete-char 1)
! 		(insert (car (cdr (car entry)))))
  	    (forward-char 1)))))))
  
! (iso-accents-customize "default")
  
! ;;; iso-acc.el ends here
  
--- 346,364 ----
  	      (progn
  		(delete-char 1)
! 		(insert (cdr entry)))
  	    (forward-char 1)))))))
  
! ;; Set up the default settings.
! (iso-accents-customize "latin-1")
  
! ;; Use Iso-Accents mode in the minibuffer
! ;; if it was in use in the previous buffer.
! (defun iso-acc-minibuf-setup ()
!   (setq iso-accents-mode
! 	(save-excursion
! 	  (set-buffer (window-buffer minibuffer-scroll-window))
! 	  iso-accents-mode)))
  
+ (add-hook 'minibuf-setup-hook 'iso-acc-minibuf-setup)
+ 
+ ;;; iso-acc.el ends here
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/iso-ascii.el emacs-19.31/lisp/iso-ascii.el
*** emacs-19.30/lisp/iso-ascii.el	Thu May 27 09:56:48 1993
--- emacs-19.31/lisp/iso-ascii.el	Sun Jan 14 02:34:30 1996
***************
*** 1,5 ****
  ;;; iso-ascii.el --- set up char tables for ISO 8859/1 on ASCII terminals.
  
! ;; Copyright (C) 1987 Free Software Foundation, Inc.
  
  ;; Author: Howard Gayle
--- 1,5 ----
  ;;; iso-ascii.el --- set up char tables for ISO 8859/1 on ASCII terminals.
  
! ;; Copyright (C) 1987, 1995 Free Software Foundation, Inc.
  
  ;; Author: Howard Gayle
***************
*** 20,25 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 35,134 ****
  (require 'disp-table)
  
! (standard-display-ascii 160 "{_}")   ; NBSP (no-break space)
! (standard-display-ascii 161 "{!}")   ; inverted exclamation mark
! (standard-display-ascii 162 "{c}")   ; cent sign
! (standard-display-ascii 163 "{GBP}") ; pound sign
! (standard-display-ascii 164 "{$}")   ; general currency sign
! (standard-display-ascii 165 "{JPY}") ; yen sign
! (standard-display-ascii 166 "{|}")   ; broken vertical line
! (standard-display-ascii 167 "{S}")   ; section sign
! (standard-display-ascii 168 "{\"}")  ; diaeresis
! (standard-display-ascii 169 "{C}")   ; copyright sign
! (standard-display-ascii 170 "{_a}")  ; ordinal indicator, feminine
! (standard-display-ascii 171 "{<<}")  ; left angle quotation mark
! (standard-display-ascii 172 "{~}")   ; not sign
! (standard-display-ascii 173 "{-}")   ; soft hyphen
! (standard-display-ascii 174 "{R}")   ; registered sign
! (standard-display-ascii 175 "{=}")   ; macron
! (standard-display-ascii 176 "{o}")   ; degree sign
! (standard-display-ascii 177 "{+-}")  ; plus or minus sign
! (standard-display-ascii 178 "{2}")   ; superscript two
! (standard-display-ascii 179 "{3}")   ; superscript three
! (standard-display-ascii 180 "{'}")   ; acute accent
! (standard-display-ascii 181 "{u}")   ; micro sign
! (standard-display-ascii 182 "{P}")   ; pilcrow
! (standard-display-ascii 183 "{.}")   ; middle dot
! (standard-display-ascii 184 "{,}")   ; cedilla
! (standard-display-ascii 185 "{1}")   ; superscript one
! (standard-display-ascii 186 "{_o}")  ; ordinal indicator, masculine
! (standard-display-ascii 187 "{>>}")  ; right angle quotation mark
! (standard-display-ascii 188 "{1/4}") ; fraction one-quarter
! (standard-display-ascii 189 "{1/2}") ; fraction one-half
! (standard-display-ascii 190 "{3/4}") ; fraction three-quarters
! (standard-display-ascii 191 "{?}")   ; inverted question mark
! (standard-display-ascii 192 "{`A}")  ; A with grave accent
! (standard-display-ascii 193 "{'A}")  ; A with acute accent
! (standard-display-ascii 194 "{^A}")  ; A with circumflex accent
! (standard-display-ascii 195 "{~A}")  ; A with tilde
! (standard-display-ascii 196 "{\"A}") ; A with diaeresis or umlaut mark
! (standard-display-ascii 197 "{AA}")  ; A with ring
! (standard-display-ascii 198 "{AE}")  ; AE diphthong
! (standard-display-ascii 199 "{,C}")  ; C with cedilla
! (standard-display-ascii 200 "{`E}")  ; E with grave accent
! (standard-display-ascii 201 "{'E}")  ; E with acute accent
! (standard-display-ascii 202 "{^E}")  ; E with circumflex accent
! (standard-display-ascii 203 "{\"E}") ; E with diaeresis or umlaut mark
! (standard-display-ascii 204 "{`I}")  ; I with grave accent
! (standard-display-ascii 205 "{'I}")  ; I with acute accent
! (standard-display-ascii 206 "{^I}")  ; I with circumflex accent
! (standard-display-ascii 207 "{\"I}") ; I with diaeresis or umlaut mark
! (standard-display-ascii 208 "{-D}")  ; D with stroke, Icelandic eth
! (standard-display-ascii 209 "{~N}")  ; N with tilde
! (standard-display-ascii 210 "{`O}")  ; O with grave accent
! (standard-display-ascii 211 "{'O}")  ; O with acute accent
! (standard-display-ascii 212 "{^O}")  ; O with circumflex accent
! (standard-display-ascii 213 "{~O}")  ; O with tilde
! (standard-display-ascii 214 "{\"O}") ; O with diaeresis or umlaut mark
! (standard-display-ascii 215 "{x}")   ; multiplication sign
! (standard-display-ascii 216 "{/O}")  ; O with slash
! (standard-display-ascii 217 "{`U}")  ; U with grave accent
! (standard-display-ascii 218 "{'U}")  ; U with acute accent
! (standard-display-ascii 219 "{^U}")  ; U with circumflex accent
! (standard-display-ascii 220 "{\"U}") ; U with diaeresis or umlaut mark
! (standard-display-ascii 221 "{'Y}")  ; Y with acute accent
! (standard-display-ascii 222 "{TH}")  ; capital thorn, Icelandic
! (standard-display-ascii 223 "{ss}")  ; small sharp s, German
! (standard-display-ascii 224 "{`a}")  ; a with grave accent
! (standard-display-ascii 225 "{'a}")  ; a with acute accent
! (standard-display-ascii 226 "{^a}")  ; a with circumflex accent
! (standard-display-ascii 227 "{~a}")  ; a with tilde
! (standard-display-ascii 228 "{\"a}") ; a with diaeresis or umlaut mark
! (standard-display-ascii 229 "{aa}")  ; a with ring
! (standard-display-ascii 230 "{ae}")  ; ae diphthong
! (standard-display-ascii 231 "{,c}")  ; c with cedilla
! (standard-display-ascii 232 "{`e}")  ; e with grave accent
! (standard-display-ascii 233 "{'e}")  ; e with acute accent
! (standard-display-ascii 234 "{^e}")  ; e with circumflex accent
! (standard-display-ascii 235 "{\"e}") ; e with diaeresis or umlaut mark
! (standard-display-ascii 236 "{`i}")  ; i with grave accent
! (standard-display-ascii 237 "{'i}")  ; i with acute accent
! (standard-display-ascii 238 "{^i}")  ; i with circumflex accent
! (standard-display-ascii 239 "{\"i}") ; i with diaeresis or umlaut mark
! (standard-display-ascii 240 "{-d}")  ; d with stroke, Icelandic eth
! (standard-display-ascii 241 "{~n}")  ; n with tilde
! (standard-display-ascii 242 "{`o}")  ; o with grave accent
! (standard-display-ascii 243 "{'o}")  ; o with acute accent
! (standard-display-ascii 244 "{^o}")  ; o with circumflex accent
! (standard-display-ascii 245 "{~o}")  ; o with tilde
! (standard-display-ascii 246 "{\"o}") ; o with diaeresis or umlaut mark
! (standard-display-ascii 247 "{/}")   ; division sign
! (standard-display-ascii 248 "{/o}")  ; o with slash
! (standard-display-ascii 249 "{`u}")  ; u with grave accent
! (standard-display-ascii 250 "{'u}")  ; u with acute accent
! (standard-display-ascii 251 "{^u}")  ; u with circumflex accent
! (standard-display-ascii 252 "{\"u}") ; u with diaeresis or umlaut mark
! (standard-display-ascii 253 "{'y}")  ; y with acute accent
! (standard-display-ascii 254 "{th}")  ; small thorn, Icelandic
! (standard-display-ascii 255 "{\"y}") ; small y with diaeresis or umlaut mark
  
  (provide 'iso-ascii)
--- 36,144 ----
  (require 'disp-table)
  
! (defvar iso-ascii-convenient nil
!   "*Non-nil means `iso-ascii' should aim for convenience, not precision.")
! 
! (defun iso-ascii-display (code string &optional convenient-string)
!   (if iso-ascii-convenient
!       (setq string (or convenient-string string))
!     (setq string (concat "{" string "}")))
!   (standard-display-ascii code string))
! 
! (iso-ascii-display 160 "_" " ")   ; NBSP (no-break space)
! (iso-ascii-display 161 "!")   ; inverted exclamation mark
! (iso-ascii-display 162 "c")   ; cent sign
! (iso-ascii-display 163 "GBP") ; pound sign
! (iso-ascii-display 164 "$")   ; general currency sign
! (iso-ascii-display 165 "JPY") ; yen sign
! (iso-ascii-display 166 "|")   ; broken vertical line
! (iso-ascii-display 167 "S" "(S)")   ; section sign
! (iso-ascii-display 168 "\"")  ; diaeresis
! (iso-ascii-display 169 "C" "(C)")   ; copyright sign
! (iso-ascii-display 170 "_a")  ; ordinal indicator, feminine
! (iso-ascii-display 171 "<<")  ; left angle quotation mark
! (iso-ascii-display 172 "~")   ; not sign
! (iso-ascii-display 173 "-")   ; soft hyphen
! (iso-ascii-display 174 "R" "(R)")   ; registered sign
! (iso-ascii-display 175 "=")   ; macron
! (iso-ascii-display 176 "o")   ; degree sign
! (iso-ascii-display 177 "+-")  ; plus or minus sign
! (iso-ascii-display 178 "2")   ; superscript two
! (iso-ascii-display 179 "3")   ; superscript three
! (iso-ascii-display 180 "'")   ; acute accent
! (iso-ascii-display 181 "u")   ; micro sign
! (iso-ascii-display 182 "P" "{P}")   ; pilcrow
! (iso-ascii-display 183 ".")   ; middle dot
! (iso-ascii-display 184 ",")   ; cedilla
! (iso-ascii-display 185 "1")   ; superscript one
! (iso-ascii-display 186 "_o")  ; ordinal indicator, masculine
! (iso-ascii-display 187 ">>")  ; right angle quotation mark
! (iso-ascii-display 188 "1/4") ; fraction one-quarter
! (iso-ascii-display 189 "1/2") ; fraction one-half
! (iso-ascii-display 190 "3/4") ; fraction three-quarters
! (iso-ascii-display 191 "?")   ; inverted question mark
! (iso-ascii-display 192 "`A")  ; A with grave accent
! (iso-ascii-display 193 "'A")  ; A with acute accent
! (iso-ascii-display 194 "^A")  ; A with circumflex accent
! (iso-ascii-display 195 "~A")  ; A with tilde
! (iso-ascii-display 196 "\"A") ; A with diaeresis or umlaut mark
! (iso-ascii-display 197 "AA")  ; A with ring
! (iso-ascii-display 198 "AE")  ; AE diphthong
! (iso-ascii-display 199 ",C")  ; C with cedilla
! (iso-ascii-display 200 "`E")  ; E with grave accent
! (iso-ascii-display 201 "'E")  ; E with acute accent
! (iso-ascii-display 202 "^E")  ; E with circumflex accent
! (iso-ascii-display 203 "\"E") ; E with diaeresis or umlaut mark
! (iso-ascii-display 204 "`I")  ; I with grave accent
! (iso-ascii-display 205 "'I")  ; I with acute accent
! (iso-ascii-display 206 "^I")  ; I with circumflex accent
! (iso-ascii-display 207 "\"I") ; I with diaeresis or umlaut mark
! (iso-ascii-display 208 "-D")  ; D with stroke, Icelandic eth
! (iso-ascii-display 209 "~N")  ; N with tilde
! (iso-ascii-display 210 "`O")  ; O with grave accent
! (iso-ascii-display 211 "'O")  ; O with acute accent
! (iso-ascii-display 212 "^O")  ; O with circumflex accent
! (iso-ascii-display 213 "~O")  ; O with tilde
! (iso-ascii-display 214 "\"O") ; O with diaeresis or umlaut mark
! (iso-ascii-display 215 "x")   ; multiplication sign
! (iso-ascii-display 216 "/O")  ; O with slash
! (iso-ascii-display 217 "`U")  ; U with grave accent
! (iso-ascii-display 218 "'U")  ; U with acute accent
! (iso-ascii-display 219 "^U")  ; U with circumflex accent
! (iso-ascii-display 220 "\"U") ; U with diaeresis or umlaut mark
! (iso-ascii-display 221 "'Y")  ; Y with acute accent
! (iso-ascii-display 222 "TH")  ; capital thorn, Icelandic
! (iso-ascii-display 223 "ss")  ; small sharp s, German
! (iso-ascii-display 224 "`a")  ; a with grave accent
! (iso-ascii-display 225 "'a")  ; a with acute accent
! (iso-ascii-display 226 "^a")  ; a with circumflex accent
! (iso-ascii-display 227 "~a")  ; a with tilde
! (iso-ascii-display 228 "\"a") ; a with diaeresis or umlaut mark
! (iso-ascii-display 229 "aa")  ; a with ring
! (iso-ascii-display 230 "ae")  ; ae diphthong
! (iso-ascii-display 231 ",c")  ; c with cedilla
! (iso-ascii-display 232 "`e")  ; e with grave accent
! (iso-ascii-display 233 "'e")  ; e with acute accent
! (iso-ascii-display 234 "^e")  ; e with circumflex accent
! (iso-ascii-display 235 "\"e") ; e with diaeresis or umlaut mark
! (iso-ascii-display 236 "`i")  ; i with grave accent
! (iso-ascii-display 237 "'i")  ; i with acute accent
! (iso-ascii-display 238 "^i")  ; i with circumflex accent
! (iso-ascii-display 239 "\"i") ; i with diaeresis or umlaut mark
! (iso-ascii-display 240 "-d")  ; d with stroke, Icelandic eth
! (iso-ascii-display 241 "~n")  ; n with tilde
! (iso-ascii-display 242 "`o")  ; o with grave accent
! (iso-ascii-display 243 "'o")  ; o with acute accent
! (iso-ascii-display 244 "^o")  ; o with circumflex accent
! (iso-ascii-display 245 "~o")  ; o with tilde
! (iso-ascii-display 246 "\"o") ; o with diaeresis or umlaut mark
! (iso-ascii-display 247 "/")   ; division sign
! (iso-ascii-display 248 "/o")  ; o with slash
! (iso-ascii-display 249 "`u")  ; u with grave accent
! (iso-ascii-display 250 "'u")  ; u with acute accent
! (iso-ascii-display 251 "^u")  ; u with circumflex accent
! (iso-ascii-display 252 "\"u") ; u with diaeresis or umlaut mark
! (iso-ascii-display 253 "'y")  ; y with acute accent
! (iso-ascii-display 254 "th")  ; small thorn, Icelandic
! (iso-ascii-display 255 "\"y") ; small y with diaeresis or umlaut mark
  
  (provide 'iso-ascii)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/iso-cvt.el emacs-19.31/lisp/iso-cvt.el
*** emacs-19.30/lisp/iso-cvt.el	Mon Oct 30 12:11:20 1995
--- emacs-19.31/lisp/iso-cvt.el	Mon May 20 17:03:37 1996
***************
*** 1,3 ****
! ;;; iso-cvt.-el -- translate to ISO 8859-1 from/to net/TeX conventions
  ;; This file was formerly called gm-lingo.el.
  
--- 1,3 ----
! ;;; iso-cvt.el --- translate to ISO 8859-1 from/to net/TeX conventions
  ;; This file was formerly called gm-lingo.el.
  
***************
*** 20,65 ****
  
  ;; 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: 
  ;; This lisp code serves two purposes, both of which involve 
  ;; the translation of various conventions for representing European 
  ;; character sets to ISO 8859-1.
  
! ; Net support: 
! ; Various conventions exist in Newsgroups on how to represent national 
! ; characters. The functions provided here translate these net conventions 
! ; to ISO.
! ;
! ; Calling `iso-german' will turn the net convention for umlauts ("a etc.) 
! ; into ISO latin1 umlaute for easy reading.
! ; 'iso-spanish' will turn net conventions for representing spanish 
! ; to ISO latin1. (Note that accents are omitted in news posts most 
! ; of the time, only enye is escaped.)
! 
! ; TeX support
! ; This mode installs hooks which change TeX files to ISO Latin-1 for 
! ; simplified editing. When the TeX file is saved, ISO latin1 characters are
! ; translated back to escape sequences.
! ;
! ; An alternative is a TeX style that handles 8 bit ISO files 
! ; (available on ftp.vlsivie.tuwien.ac.at in /pub/8bit)  
! ; - but these files are difficult to transmit ... so while the net is  
! ; still @ 7 bit this may be useful
! 
! ;; TO DO:
! ; The net support should install hooks (like TeX support does) 
! ; which recognizes certains news groups and translates all articles from 
! ; those groups. 
! ;
! ; Cover more cases for translation (There is an infinite number of ways to 
! ; represent accented characters in TeX)
! 
! ;; SEE ALSO:
! ; If you are interested in questions related to using the ISO 8859-1 
! ; characters set (configuring emacs, Unix, etc. to use ISO), then you
! ; can get the ISO 8859-1 FAQ via anonymous ftp from 
! ; ftp.vlsivie.tuwien.ac.at in /pub/bit/FAQ-ISO-8859-1
  
  ;;; Code:
--- 20,67 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary: 
+ 
  ;; This lisp code serves two purposes, both of which involve 
  ;; the translation of various conventions for representing European 
  ;; character sets to ISO 8859-1.
  
! ;; Net support: 
! ;; Various conventions exist in Newsgroups on how to represent national 
! ;; characters. The functions provided here translate these net conventions 
! ;; to ISO.
! ;;
! ;; Calling `iso-german' will turn the net convention for umlauts ("a etc.) 
! ;; into ISO latin1 umlauts for easy reading.
! ;; 'iso-spanish' will turn net conventions for representing spanish 
! ;; to ISO latin1. (Note that accents are omitted in news posts most 
! ;; of the time, only enye is escaped.)
! 
! ;; TeX support
! ;; This mode installs hooks which change TeX files to ISO Latin-1 for 
! ;; simplified editing. When the TeX file is saved, ISO latin1 characters are
! ;; translated back to escape sequences.
! ;;
! ;; An alternative is a TeX style that handles 8 bit ISO files 
! ;; (available on ftp.vlsivie.tuwien.ac.at in /pub/8bit)  
! ;; - but these files are difficult to transmit ... so while the net is  
! ;; still @ 7 bit this may be useful
! 
! ;;; TO DO:
! ;; The net support should install hooks (like TeX support does) 
! ;; which recognizes certain news groups and translates all articles from 
! ;; those groups. 
! ;;
! ;; Cover more cases for translation (There is an infinite number of ways to 
! ;; represent accented characters in TeX)
! 
! ;;; SEE ALSO:
! ;; If you are interested in questions related to using the ISO 8859-1 
! ;; characters set (configuring emacs, Unix, etc. to use ISO), then you
! ;; can get the ISO 8859-1 FAQ via anonymous ftp from 
! ;; ftp.vlsivie.tuwien.ac.at in /pub/bit/FAQ-ISO-8859-1
  
  ;;; Code:
*************** If German TeX is used, German TeX sequen
*** 684,688 ****
  (defun iso-fix-tex2iso ()
    "Turn TeX sequences into ISO 8859-1 (aka. ISO Latin-1) characters.
! This function recognices German TeX buffers."
    (if (or (equal major-mode 'latex-mode)
  	  (equal major-mode 'Latex-mode)) ; AucTeX wants this
--- 686,690 ----
  (defun iso-fix-tex2iso ()
    "Turn TeX sequences into ISO 8859-1 (aka. ISO Latin-1) characters.
! This function recognizes German TeX buffers."
    (if (or (equal major-mode 'latex-mode)
  	  (equal major-mode 'Latex-mode)) ; AucTeX wants this
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/iso-insert.el emacs-19.31/lisp/iso-insert.el
*** emacs-19.30/lisp/iso-insert.el	Tue May  3 19:43:17 1994
--- emacs-19.31/lisp/iso-insert.el	Sun Jan 14 02:34:30 1996
***************
*** 20,25 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/iso-swed.el emacs-19.31/lisp/iso-swed.el
*** emacs-19.30/lisp/iso-swed.el	Thu May 27 09:57:04 1993
--- emacs-19.31/lisp/iso-swed.el	Sun Jan 14 02:34:30 1996
***************
*** 20,25 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/iso-syntax.el emacs-19.31/lisp/iso-syntax.el
*** emacs-19.30/lisp/iso-syntax.el	Sun Oct 22 12:42:23 1995
--- emacs-19.31/lisp/iso-syntax.el	Sun Jan 14 02:34:30 1996
***************
*** 20,25 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/iso-transl.el emacs-19.31/lisp/iso-transl.el
*** emacs-19.30/lisp/iso-transl.el	Fri Oct  6 11:19:26 1995
--- emacs-19.31/lisp/iso-transl.el	Tue Feb 27 11:31:44 1996
***************
*** 20,25 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 37,41 ****
      (?\` . mute-grave)
      (?\" . mute-diaeresis)
!     (?\^ . mute-asciicircum)
      (?\~ . mute-asciitilde))
    "Mapping of ASCII characters to their corresponding dead-key symbols.")
--- 38,42 ----
      (?\` . mute-grave)
      (?\" . mute-diaeresis)
!     (?^ . mute-asciicircum)  ;; Don't use \, since \^ is special.
      (?\~ . mute-asciitilde))
    "Mapping of ASCII characters to their corresponding dead-key symbols.")
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/iso02-syn.el emacs-19.31/lisp/iso02-syn.el
*** emacs-19.30/lisp/iso02-syn.el	Sat Oct 28 02:22:50 1995
--- emacs-19.31/lisp/iso02-syn.el	Sun Jan 14 02:34:30 1996
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/ispell.el emacs-19.31/lisp/ispell.el
*** emacs-19.30/lisp/ispell.el	Mon Oct 30 12:14:44 1995
--- emacs-19.31/lisp/ispell.el	Thu May  9 13:35:58 1996
***************
*** 1,318 ****
  ;;; ispell.el --- spell checking using Ispell
  
! ;;; Copyright (C) 1994, 1995 Free Software Foundation, Inc.
  
! ;;; Authors         : Ken Stevens <k.stevens@ieee.org>
! ;;; Note: version numbers and time stamp are not updated
! ;;;   when this file is edited for release with GNU Emacs.
! ;;; Last Modified On: Tue Jun 13 12:05:28 EDT 1995
! ;;; Update Revision : 2.37
! ;;; Syntax          : emacs-lisp
! ;;; Status	    : Release with 3.1.12+ ispell.
! ;;; Version	    : International Ispell Version 3.1 by Geoff Kuenning.
! ;;; Bug Reports	    : ispell-el-bugs@itcorp.com
! 
! ;;; Note: version numbers and time stamp are not updated
! ;;;   when this file is edited for release with GNU Emacs.
! 
! ;;; 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:
! ;;;
! ;;; INSTRUCTIONS
! ;;;
! ;;;  This code contains a section of user-settable variables that you should
! ;;; inspect prior to installation.  Look past the end of the history list.
! ;;; Set them up for your locale and the preferences of the majority of the
! ;;; users.  Otherwise the users may need to set a number of variables
! ;;; themselves.
! ;;;  You particularly may want to change the default dictionary for your
! ;;; country and language.
! ;;;
! ;;;
! ;;; To fully install this, add this file to your Emacs Lisp directory and
! ;;; compile it with M-X byte-compile-file.  Then add the following to the
! ;;; appropriate init file:
! ;;;
! ;;;  (autoload 'ispell-word "ispell"
! ;;;    "Check the spelling of word in buffer." t)
! ;;;  (global-set-key "\e$" 'ispell-word)
! ;;;  (autoload 'ispell-region "ispell"
! ;;;    "Check the spelling of region." t)
! ;;;  (autoload 'ispell-buffer "ispell"
! ;;;    "Check the spelling of buffer." t)
! ;;;  (autoload 'ispell-complete-word "ispell"
! ;;;    "Look up current word in dictionary and try to complete it." t)
! ;;;  (autoload 'ispell-change-dictionary "ispell"
! ;;;    "Change ispell dictionary." t)
! ;;;  (autoload 'ispell-message "ispell"
! ;;;    "Check spelling of mail message or news post.")
! ;;;
! ;;;  Depending on the mail system you use, you may want to include these:
! ;;;
! ;;;  (add-hook 'news-inews-hook 'ispell-message)
! ;;;  (add-hook 'mail-send-hook  'ispell-message)
! ;;;  (add-hook 'mh-before-send-letter-hook 'ispell-message)
! ;;;
! ;;;
! ;;; Ispell has a TeX parser and a nroff parser (the default).
! ;;; The parsing is controlled by the variable ispell-parser.  Currently
! ;;; it is just a "toggle" between TeX and nroff, but if more parsers are
! ;;; added it will be updated.  See the variable description for more info.
! ;;;
! ;;;
! ;;; TABLE OF CONTENTS
! ;;;
! ;;;   ispell-word
! ;;;   ispell-region
! ;;;   ispell-buffer
! ;;;   ispell-message
! ;;;   ispell-continue
! ;;;   ispell-complete-word
! ;;;   ispell-complete-word-interior-frag
! ;;;   ispell-change-dictionary
! ;;;   ispell-kill-ispell
! ;;;   ispell-pdict-save
! ;;;
! ;;;
! ;;; Commands in ispell-region:
! ;;; Character replacement: Replace word with choice.  May query-replace.
! ;;; ' ': Accept word this time.
! ;;; 'i': Accept word and insert into private dictionary.
! ;;; 'a': Accept word for this session.
! ;;; 'A': Accept word and place in buffer-local dictionary.
! ;;; 'r': Replace word with typed-in value.  Rechecked.
! ;;; 'R': Replace word with typed-in value. Query-replaced in buffer. Rechecked.
! ;;; '?': Show these commands
! ;;; 'x': Exit spelling buffer.  Move cursor to original point.
! ;;; 'X': Exit spelling buffer.  Leave cursor at the current point.
! ;;; 'q': Quit spelling session (Kills ispell process).
! ;;; 'l': Look up typed-in replacement in alternate dictionary.  Wildcards okay.
! ;;; 'u': Like 'i', but the word is lower-cased first.
! ;;; 'm': Like 'i', but allows one to include dictionary completion info.
! ;;; 'C-l': redraws screen
! ;;; 'C-r': recursive edit
! ;;; 'C-z': suspend emacs or iconify frame
! ;;;
! ;;; Buffer-Local features:
! ;;; There are a number of buffer-local features that can be used to customize
! ;;;  ispell for the current buffer.  This includes language dictionaries,
! ;;;  personal dictionaries, parsing, and local word spellings.  Each of these
! ;;;  local customizations are done either through local variables, or by
! ;;;  including the keyword and argument(s) at the end of the buffer (usually
! ;;;  prefixed by the comment characters).  See the end of this file for
! ;;;  examples.  The local keywords and variables are:
! ;;;
! ;;;  ispell-dictionary-keyword   language-dictionary
! ;;;      uses local variable ispell-local-dictionary
! ;;;  ispell-pdict-keyword        personal-dictionary
! ;;;      uses local variable ispell-local-pdict
! ;;;  ispell-parsing-keyword      mode-arg extended-char-arg
! ;;;  ispell-words-keyword        any number of local word spellings
! ;;;
! ;;;
! ;;; BUGS:
! ;;;  Highlighting in version 19 still doesn't work on tty's.
! ;;;  On some versions of emacs, growing the minibuffer fails.
! ;;;
! ;;; HISTORY
! ;;;
! ;;; Revision 2.37  1995/6/13 12:05:28	stevens
! ;;; Removed autoload from ispell-dictionary-alist. *choices* mode-line shows
! ;;; misspelled word.  Block skip for pgp & forwarded messages added.
! ;;; RMS: the autoload changes had problems and I removed them.
! ;;;
! ;;; Revision 2.36  1995/2/6 17:39:38	stevens
! ;;; Properly adjust screen with different ispell-choices-win-default-height
! ;;; settings.  Skips SGML entity references.
! ;;;
! ;;; Revision 2.35  1995/1/13 14:16:46	stevens
! ;;; Skips SGML tags, ispell-change-dictionary fix for add-hook, assure personal
! ;;; dictionary is saved when called from the menu
! ;;;
! ;;; Revision 2.34  1994/12/08 13:17:41  stevens
! ;;; Interaction corrected to function with all 3.1 ispell versions.
! ;;;
! ;;; Revision 2.33  1994/11/24 02:31:20  stevens
! ;;; Repaired bug introduced in 2.32 that corrupts buffers when correcting.
! ;;; Improved buffer scrolling. Nondestructive buffer selections allowed.
! ;;;
! ;;; Revision 2.32  1994/10/31 21:10:08  geoff
! ;;; Many revisions accepted from RMS/FSF.  I think (though I don't know) that
! ;;; this represents an 'official' version.
! ;;;
! ;;; Revision 2.31  1994/5/31 10:18:17  stevens
! ;;; Repaired comments.  buffer-local commands executed in `ispell-word' now.
! ;;; German dictionary described for extended character mode.  Dict messages.
! ;;;
! ;;; Revision 2.30  1994/5/20 22:18:36  stevens
! ;;; Continue ispell from ispell-word, C-z functionality fixed.
! ;;;
! ;;; Revision 2.29  1994/5/12 09:44:33  stevens
! ;;; Restored ispell-use-ptys-p, ispell-message aborts sends with interrupt.
! ;;; defined fn ispell
! ;;;
! ;;; Revision 2.28  1994/4/28 16:24:40  stevens
! ;;; Window checking when ispell-message put on gnus-inews-article-hook jwz.
! ;;; prefixed ispell- to highlight functions and horiz-scroll fn.
! ;;; Try and respect case of word in ispell-complete-word.
! ;;; Ignore non-char events.  Ispell-use-ptys-p commented out. Lucid menu.
! ;;; Better interrupt handling.  ispell-message improvements from Ethan.
! ;;;
! ;;; Revision 2.27
! ;;; version 18 explicit C-g handling disabled as it didn't work. Added
! ;;; ispell-extra-args for ispell customization (jwz)
! ;;;
! ;;; Revision 2.26  1994/2/15 16:11:14  stevens
! ;;; name changes for copyright assignment.  Added word-frags in complete-word.
! ;;; Horizontal scroll (John Conover). Query-replace matches words now.  bugs.
! ;;;
! ;;; Revision 2.25
! ;;; minor mods, upgraded ispell-message
! ;;;
! ;;; Revision 2.24
! ;;; query-replace more robust, messages, defaults, ispell-change-dict.
! ;;;
! ;;; Revision 2.23  1993/11/22 23:47:03  stevens
! ;;; ispell-message, Fixed highlighting, added menu-bar, fixed ispell-help, ...
! ;;;
! ;;; Revision 2.22
! ;;; Added 'u' command.  Fixed default in ispell-local-dictionary.
! ;;; fixed affix rules display.  Tib skipping more robust.  Contributions by
! ;;; Per Abraham (parser selection), Denis Howe, and Eberhard Mattes.
! ;;;
! ;;; Revision 2.21  1993/06/30 14:09:04  stevens
! ;;; minor bugs. (nroff word skipping fixed)
! ;;;
! ;;; Revision 2.20  1993/06/30 14:09:04  stevens
! ;;;
! ;;; Debugging and contributions by: Boris Aronov, Rik Faith, Chris Moore,
! ;;;  Kevin Rodgers, Malcolm Davis.
! ;;; Particular thanks to Michael Lipp, Jamie Zawinski, Phil Queinnec
! ;;;  and John Heidemann for suggestions and code.
! ;;; Major update including many tweaks.
! ;;; Many changes were integrations of suggestions.
! ;;; lookup-words rehacked to use call-process (Jamie).
! ;;; ispell-complete-word rehacked to be compatible with the rest of the
! ;;; system for word searching and to include multiple wildcards,
! ;;; and it's own dictionary.
! ;;; query-replace capability added.  New options 'X', 'R', and 'A'.
! ;;; buffer-local modes for dictionary, word-spelling, and formatter-parsing.
! ;;; Many random bugs, like commented comments being skipped, fix to
! ;;; keep-choices-win, fix for math mode, added pipe mode choice,
! ;;; fixed 'q' command, ispell-word checks previous word and leave cursor
! ;;; in same location.  Fixed tib code which could drop spelling regions.
! ;;; Cleaned up setq calls for efficiency. Gave more context on window overlays.
! ;;; Assure context on ispell-command-loop.  Window lossage in look cmd fixed.
! ;;; Due to pervasive opinion, common-lisp package syntax removed. Display
! ;;; problem when not highlighting.
! ;;;
! ;;; Revision 2.19  1992/01/10  10:54:08  geoff
! ;;; Make another attempt at fixing the "Bogus, dude" problem.  This one is
! ;;; less elegant, but has the advantage of working.
! ;;;
! ;;; Revision 2.18  1992/01/07  10:04:52  geoff
! ;;; Fix the "Bogus, Dude" problem in ispell-word.
! ;;;
! ;;; Revision 2.17  1991/09/12  00:01:42  geoff
! ;;; Add some changes to make ispell-complete-word work better, though
! ;;; still not perfectly.
! ;;;
! ;;; Revision 2.16  91/09/04  18:00:52  geoff
! ;;; More updates from Sebastian, to make the multiple-dictionary support
! ;;; more flexible.
! ;;;
! ;;; Revision 2.15  91/09/04  17:30:02  geoff
! ;;; Sebastian Kremer's tib support
! ;;;
! ;;; Revision 2.14  91/09/04  16:19:37  geoff
! ;;; Don't do set-window-start if the move-to-window-line moved us
! ;;; downward, rather than upward.  This prevents getting the buffer all
! ;;; confused.  Also, don't use the "not-modified" function to clear the
! ;;; modification flag;  instead use set-buffer-modified-p.  This prevents
! ;;; extra messages from flashing.
! ;;;
! ;;; Revision 2.13  91/09/04  14:35:41  geoff
! ;;; Fix a spelling error in a comment.  Add code to handshake with the
! ;;; ispell process before sending anything to it.
! ;;;
! ;;; Revision 2.12  91/09/03  20:14:21  geoff
! ;;; Add Sebastian Kremer's multiple-language support.
! ;;;
! ;;;
! ;;; Walt Buehring
! ;;; Texas Instruments - Computer Science Center
! ;;; ARPA:  Buehring%TI-CSL@CSNet-Relay
! ;;; UUCP:  {smu, texsun, im4u, rice} ! ti-csl ! buehring
! ;;;
! ;;; ispell-region and associated routines added by
! ;;; Perry Smith
! ;;; pedz@bobkat
! ;;; Tue Jan 13 20:18:02 CST 1987
! ;;;
! ;;; extensively modified by Mark Davies and Andrew Vignaux
! ;;; {mark,andrew}@vuwcomp
! ;;; Sun May 10 11:45:04 NZST 1987
! ;;;
! ;;; Ken Stevens  ARPA: k.stevens@ieee.org
! ;;; Tue Jan  3 16:59:07 PST 1989
! ;;; This file has overgone a major overhaul to be compatible with ispell
! ;;; version 2.1.  Most of the functions have been totally rewritten, and
! ;;; many user-accessible variables have been added.  The syntax table has
! ;;; been removed since it didn't work properly anyway, and a filter is
! ;;; used rather than a buffer.  Regular expressions are used based on
! ;;; ispell's internal definition of characters (see ispell(4)).
! ;;; Some new updates:
! ;;; - Updated to version 3.0 to include terse processing.
! ;;; - Added a variable for the look command.
! ;;; - Fixed a bug in ispell-word when cursor is far away from the word
! ;;;   that is to be checked.
! ;;; - Ispell places the incorrect word or guess in the minibuffer now.
! ;;; - fixed a bug with 'l' option when multiple windows are on the screen.
! ;;; - lookup-words just didn't work with the process filter.  Fixed.
! ;;; - Rewrote the process filter to make it cleaner and more robust
! ;;;   in the event of a continued line not being completed.
! ;;; - Made ispell-init-process more robust in handling errors.
! ;;; - Fixed bug in continuation location after a region has been modified by
! ;;;   correcting a misspelling.
! ;;; Mon 17 Sept 1990
! ;;;
! ;;; Sebastian Kremer <sk@thp.uni-koeln.de>
! ;;; Wed Aug  7 14:02:17 MET DST 1991
! ;;; - Ported ispell-complete-word from Ispell 2 to Ispell 3.
! ;;; - Added ispell-kill-ispell command.
! ;;; - Added ispell-dictionary and ispell-dictionary-alist variables to
! ;;;   support other than default language.  See their docstrings and
! ;;;   command ispell-change-dictionary.
! ;;; - (ispelled it :-)
! ;;; - Added ispell-skip-tib variable to support the tib bibliography
! ;;;   program.
! ;;;
! ;;;
! ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  
  
  
! ;;; **********************************************************************
! ;;; The following variables should be set according to personal preference
! ;;; and location of binaries:
! ;;; **********************************************************************
  
  
- ;;;  ******* THIS FILE IS WRITTEN FOR ISPELL VERSION 3.1
  ;;; Code:
  
--- 1,313 ----
  ;;; ispell.el --- spell checking using Ispell
  
! ;; Copyright (C) 1994, 1995 Free Software Foundation, Inc.
  
! ;; Authors         : Ken Stevens <k.stevens@ieee.org>
! ;; Last Modified On: Tue Jun 13 12:05:28 EDT 1995
! ;; Update Revision : 2.37
! ;; Syntax          : emacs-lisp
! ;; Status	   : Release with 3.1.12+ ispell.
! ;; Version	   : International Ispell Version 3.1 by Geoff Kuenning.
! ;; Bug Reports	   : ispell-el-bugs@itcorp.com
! 
! ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
+ ;; Note: version numbers and time stamp are not updated
+ ;;   when this file is edited for release with GNU Emacs.
  
+ ;;; Commentary:
  
! ;; INSTRUCTIONS
! ;;
! ;;  This code contains a section of user-settable variables that you should
! ;; inspect prior to installation.  Look past the end of the history list.
! ;; Set them up for your locale and the preferences of the majority of the
! ;; users.  Otherwise the users may need to set a number of variables
! ;; themselves.
! ;;  You particularly may want to change the default dictionary for your
! ;; country and language.
! ;;
! ;;
! ;; To fully install this, add this file to your Emacs Lisp directory and
! ;; compile it with M-X byte-compile-file.  Then add the following to the
! ;; appropriate init file:
! ;;
! ;;  (autoload 'ispell-word "ispell"
! ;;    "Check the spelling of word in buffer." t)
! ;;  (global-set-key "\e$" 'ispell-word)
! ;;  (autoload 'ispell-region "ispell"
! ;;    "Check the spelling of region." t)
! ;;  (autoload 'ispell-buffer "ispell"
! ;;    "Check the spelling of buffer." t)
! ;;  (autoload 'ispell-complete-word "ispell"
! ;;    "Look up current word in dictionary and try to complete it." t)
! ;;  (autoload 'ispell-change-dictionary "ispell"
! ;;    "Change ispell dictionary." t)
! ;;  (autoload 'ispell-message "ispell"
! ;;    "Check spelling of mail message or news post.")
! ;;
! ;;  Depending on the mail system you use, you may want to include these:
! ;;
! ;;  (add-hook 'news-inews-hook 'ispell-message)
! ;;  (add-hook 'mail-send-hook  'ispell-message)
! ;;  (add-hook 'mh-before-send-letter-hook 'ispell-message)
! ;;
! ;;
! ;; Ispell has a TeX parser and a nroff parser (the default).
! ;; The parsing is controlled by the variable ispell-parser.  Currently
! ;; it is just a "toggle" between TeX and nroff, but if more parsers are
! ;; added it will be updated.  See the variable description for more info.
! ;;
! ;;
! ;; TABLE OF CONTENTS
! ;;
! ;;   ispell-word
! ;;   ispell-region
! ;;   ispell-buffer
! ;;   ispell-message
! ;;   ispell-continue
! ;;   ispell-complete-word
! ;;   ispell-complete-word-interior-frag
! ;;   ispell-change-dictionary
! ;;   ispell-kill-ispell
! ;;   ispell-pdict-save
! ;;
! ;;
! ;; Commands in ispell-region:
! ;; Character replacement: Replace word with choice.  May query-replace.
! ;; ' ': Accept word this time.
! ;; 'i': Accept word and insert into private dictionary.
! ;; 'a': Accept word for this session.
! ;; 'A': Accept word and place in buffer-local dictionary.
! ;; 'r': Replace word with typed-in value.  Rechecked.
! ;; 'R': Replace word with typed-in value. Query-replaced in buffer. Rechecked.
! ;; '?': Show these commands
! ;; 'x': Exit spelling buffer.  Move cursor to original point.
! ;; 'X': Exit spelling buffer.  Leave cursor at the current point.
! ;; 'q': Quit spelling session (Kills ispell process).
! ;; 'l': Look up typed-in replacement in alternate dictionary.  Wildcards okay.
! ;; 'u': Like 'i', but the word is lower-cased first.
! ;; 'm': Like 'i', but allows one to include dictionary completion info.
! ;; 'C-l': redraws screen
! ;; 'C-r': recursive edit
! ;; 'C-z': suspend emacs or iconify frame
! ;;
! ;; Buffer-Local features:
! ;; There are a number of buffer-local features that can be used to customize
! ;;  ispell for the current buffer.  This includes language dictionaries,
! ;;  personal dictionaries, parsing, and local word spellings.  Each of these
! ;;  local customizations are done either through local variables, or by
! ;;  including the keyword and argument(s) at the end of the buffer (usually
! ;;  prefixed by the comment characters).  See the end of this file for
! ;;  examples.  The local keywords and variables are:
! ;;
! ;;  ispell-dictionary-keyword   language-dictionary
! ;;      uses local variable ispell-local-dictionary
! ;;  ispell-pdict-keyword        personal-dictionary
! ;;      uses local variable ispell-local-pdict
! ;;  ispell-parsing-keyword      mode-arg extended-char-arg
! ;;  ispell-words-keyword        any number of local word spellings
! ;;
! ;;
! ;; BUGS:
! ;;  Highlighting in version 19 still doesn't work on tty's.
! ;;  On some versions of emacs, growing the minibuffer fails.
! ;;
! ;; HISTORY
! ;;
! ;; Revision 2.37  1995/6/13 12:05:28	stevens
! ;; Removed autoload from ispell-dictionary-alist. *choices* mode-line shows
! ;; misspelled word.  Block skip for pgp & forwarded messages added.
! ;; RMS: the autoload changes had problems and I removed them.
! ;;
! ;; Revision 2.36  1995/2/6 17:39:38	stevens
! ;; Properly adjust screen with different ispell-choices-win-default-height
! ;; settings.  Skips SGML entity references.
! ;;
! ;; Revision 2.35  1995/1/13 14:16:46	stevens
! ;; Skips SGML tags, ispell-change-dictionary fix for add-hook, assure personal
! ;; dictionary is saved when called from the menu
! ;;
! ;; Revision 2.34  1994/12/08 13:17:41  stevens
! ;; Interaction corrected to function with all 3.1 ispell versions.
! ;;
! ;; Revision 2.33  1994/11/24 02:31:20  stevens
! ;; Repaired bug introduced in 2.32 that corrupts buffers when correcting.
! ;; Improved buffer scrolling. Nondestructive buffer selections allowed.
! ;;
! ;; Revision 2.32  1994/10/31 21:10:08  geoff
! ;; Many revisions accepted from RMS/FSF.  I think (though I don't know) that
! ;; this represents an 'official' version.
! ;;
! ;; Revision 2.31  1994/5/31 10:18:17  stevens
! ;; Repaired comments.  buffer-local commands executed in `ispell-word' now.
! ;; German dictionary described for extended character mode.  Dict messages.
! ;;
! ;; Revision 2.30  1994/5/20 22:18:36  stevens
! ;; Continue ispell from ispell-word, C-z functionality fixed.
! ;;
! ;; Revision 2.29  1994/5/12 09:44:33  stevens
! ;; Restored ispell-use-ptys-p, ispell-message aborts sends with interrupt.
! ;; defined fn ispell
! ;;
! ;; Revision 2.28  1994/4/28 16:24:40  stevens
! ;; Window checking when ispell-message put on gnus-inews-article-hook jwz.
! ;; prefixed ispell- to highlight functions and horiz-scroll fn.
! ;; Try and respect case of word in ispell-complete-word.
! ;; Ignore non-char events.  Ispell-use-ptys-p commented out. Lucid menu.
! ;; Better interrupt handling.  ispell-message improvements from Ethan.
! ;;
! ;; Revision 2.27
! ;; version 18 explicit C-g handling disabled as it didn't work. Added
! ;; ispell-extra-args for ispell customization (jwz)
! ;;
! ;; Revision 2.26  1994/2/15 16:11:14  stevens
! ;; name changes for copyright assignment.  Added word-frags in complete-word.
! ;; Horizontal scroll (John Conover). Query-replace matches words now.  bugs.
! ;;
! ;; Revision 2.25
! ;; minor mods, upgraded ispell-message
! ;;
! ;; Revision 2.24
! ;; query-replace more robust, messages, defaults, ispell-change-dict.
! ;;
! ;; Revision 2.23  1993/11/22 23:47:03  stevens
! ;; ispell-message, Fixed highlighting, added menu-bar, fixed ispell-help, ...
! ;;
! ;; Revision 2.22
! ;; Added 'u' command.  Fixed default in ispell-local-dictionary.
! ;; fixed affix rules display.  Tib skipping more robust.  Contributions by
! ;; Per Abraham (parser selection), Denis Howe, and Eberhard Mattes.
! ;;
! ;; Revision 2.21  1993/06/30 14:09:04  stevens
! ;; minor bugs. (nroff word skipping fixed)
! ;;
! ;; Revision 2.20  1993/06/30 14:09:04  stevens
! ;;
! ;; Debugging and contributions by: Boris Aronov, Rik Faith, Chris Moore,
! ;;  Kevin Rodgers, Malcolm Davis.
! ;; Particular thanks to Michael Lipp, Jamie Zawinski, Phil Queinnec
! ;;  and John Heidemann for suggestions and code.
! ;; Major update including many tweaks.
! ;; Many changes were integrations of suggestions.
! ;; lookup-words rehacked to use call-process (Jamie).
! ;; ispell-complete-word rehacked to be compatible with the rest of the
! ;; system for word searching and to include multiple wildcards,
! ;; and it's own dictionary.
! ;; query-replace capability added.  New options 'X', 'R', and 'A'.
! ;; buffer-local modes for dictionary, word-spelling, and formatter-parsing.
! ;; Many random bugs, like commented comments being skipped, fix to
! ;; keep-choices-win, fix for math mode, added pipe mode choice,
! ;; fixed 'q' command, ispell-word checks previous word and leave cursor
! ;; in same location.  Fixed tib code which could drop spelling regions.
! ;; Cleaned up setq calls for efficiency. Gave more context on window overlays.
! ;; Assure context on ispell-command-loop.  Window lossage in look cmd fixed.
! ;; Due to pervasive opinion, common-lisp package syntax removed. Display
! ;; problem when not highlighting.
! ;;
! ;; Revision 2.19  1992/01/10  10:54:08  geoff
! ;; Make another attempt at fixing the "Bogus, dude" problem.  This one is
! ;; less elegant, but has the advantage of working.
! ;;
! ;; Revision 2.18  1992/01/07  10:04:52  geoff
! ;; Fix the "Bogus, Dude" problem in ispell-word.
! ;;
! ;; Revision 2.17  1991/09/12  00:01:42  geoff
! ;; Add some changes to make ispell-complete-word work better, though
! ;; still not perfectly.
! ;;
! ;; Revision 2.16  91/09/04  18:00:52  geoff
! ;; More updates from Sebastian, to make the multiple-dictionary support
! ;; more flexible.
! ;;
! ;; Revision 2.15  91/09/04  17:30:02  geoff
! ;; Sebastian Kremer's tib support
! ;;
! ;; Revision 2.14  91/09/04  16:19:37  geoff
! ;; Don't do set-window-start if the move-to-window-line moved us
! ;; downward, rather than upward.  This prevents getting the buffer all
! ;; confused.  Also, don't use the "not-modified" function to clear the
! ;; modification flag;  instead use set-buffer-modified-p.  This prevents
! ;; extra messages from flashing.
! ;;
! ;; Revision 2.13  91/09/04  14:35:41  geoff
! ;; Fix a spelling error in a comment.  Add code to handshake with the
! ;; ispell process before sending anything to it.
! ;;
! ;; Revision 2.12  91/09/03  20:14:21  geoff
! ;; Add Sebastian Kremer's multiple-language support.
! ;;
! ;;
! ;; Walt Buehring
! ;; Texas Instruments - Computer Science Center
! ;; ARPA:  Buehring%TI-CSL@CSNet-Relay
! ;; UUCP:  {smu, texsun, im4u, rice} ! ti-csl ! buehring
! ;;
! ;; ispell-region and associated routines added by
! ;; Perry Smith
! ;; pedz@bobkat
! ;; Tue Jan 13 20:18:02 CST 1987
! ;;
! ;; extensively modified by Mark Davies and Andrew Vignaux
! ;; {mark,andrew}@vuwcomp
! ;; Sun May 10 11:45:04 NZST 1987
! ;;
! ;; Ken Stevens  ARPA: k.stevens@ieee.org
! ;; Tue Jan  3 16:59:07 PST 1989
! ;; This file has overgone a major overhaul to be compatible with ispell
! ;; version 2.1.  Most of the functions have been totally rewritten, and
! ;; many user-accessible variables have been added.  The syntax table has
! ;; been removed since it didn't work properly anyway, and a filter is
! ;; used rather than a buffer.  Regular expressions are used based on
! ;; ispell's internal definition of characters (see ispell(4)).
! ;; Some new updates:
! ;; - Updated to version 3.0 to include terse processing.
! ;; - Added a variable for the look command.
! ;; - Fixed a bug in ispell-word when cursor is far away from the word
! ;;   that is to be checked.
! ;; - Ispell places the incorrect word or guess in the minibuffer now.
! ;; - fixed a bug with 'l' option when multiple windows are on the screen.
! ;; - lookup-words just didn't work with the process filter.  Fixed.
! ;; - Rewrote the process filter to make it cleaner and more robust
! ;;   in the event of a continued line not being completed.
! ;; - Made ispell-init-process more robust in handling errors.
! ;; - Fixed bug in continuation location after a region has been modified by
! ;;   correcting a misspelling.
! ;; Mon 17 Sept 1990
! ;;
! ;; Sebastian Kremer <sk@thp.uni-koeln.de>
! ;; Wed Aug  7 14:02:17 MET DST 1991
! ;; - Ported ispell-complete-word from Ispell 2 to Ispell 3.
! ;; - Added ispell-kill-ispell command.
! ;; - Added ispell-dictionary and ispell-dictionary-alist variables to
! ;;   support other than default language.  See their docstrings and
! ;;   command ispell-change-dictionary.
! ;; - (ispelled it :-)
! ;; - Added ispell-skip-tib variable to support the tib bibliography
! ;;   program.
! 
! 
! ;; **********************************************************************
! ;; The following variables should be set according to personal preference
! ;; and location of binaries:
! ;; **********************************************************************
  
+ ;;  ******* THIS FILE IS WRITTEN FOR ISPELL VERSION 3.1
  
  ;;; Code:
  
*************** It's most convenient if the cursor color
*** 328,333 ****
  slightly different.")
  
! (defvar ispell-check-comments nil
!   "*Spelling of comments checked when non-nil.")
  
  (defvar ispell-query-replace-choices nil
--- 323,328 ----
  slightly different.")
  
! (defvar ispell-check-comments t
!   "*If nil, don't check spelling of comments.")
  
  (defvar ispell-query-replace-choices nil
*************** used."
*** 1106,1110 ****
  		   ((= char ?X)
  		    (ispell-pdict-save ispell-silently-savep)
! 		    (message
  		     (substitute-command-keys
  		      (concat "Spell-checking suspended;"
--- 1101,1105 ----
  		   ((= char ?X)
  		    (ispell-pdict-save ispell-silently-savep)
! 		    (message "%s"
  		     (substitute-command-keys
  		      (concat "Spell-checking suspended;"
*************** SPC:   Accept word this time.
*** 1258,1261 ****
--- 1253,1259 ----
  		   (message nil))
  	       (enlarge-window 2)
+ 	       ;; Make sure we display the minibuffer
+ 	       ;; in this window, not some other.
+ 	       (set-minibuffer-window (selected-window))
  	       (insert (concat help-1 "\n" help-2 "\n" help-3))))
  	(sit-for 5)
*************** Optional second argument contains the di
*** 1325,1329 ****
  ;;; "ispell-filter-continue" is true when we have received only part of a
  ;;;   line as output from a generating function ("output" did not end with \n)
! ;;; NOTE THAT THIS FUNCTION WILL FAIL IF THE PROCESS OUTPUT DOESNT END WITH \n!
  ;;;   This is the case when a process dies or fails. The default behavior
  ;;;   in this case treats the next input received as fresh input.
--- 1323,1327 ----
  ;;; "ispell-filter-continue" is true when we have received only part of a
  ;;;   line as output from a generating function ("output" did not end with \n)
! ;;; THIS FUNCTION WILL FAIL IF THE PROCESS OUTPUT DOESN'T END WITH \n!
  ;;;   This is the case when a process dies or fails. The default behavior
  ;;;   in this case treats the next input received as fresh input.
*************** otherwise it is displayed normally."
*** 1371,1375 ****
  	(buffer-undo-list t))		; don't clutter the undo list.
      (delete-region start end)
!     (insert-char ?  (- end start))	; mimimize amount of redisplay
      (sit-for 0)				; update display
      (if highlight (setq inverse-video (not inverse-video))) ; toggle video
--- 1369,1373 ----
  	(buffer-undo-list t))		; don't clutter the undo list.
      (delete-region start end)
!     (insert-char ?  (- end start))	; minimize amount of redisplay
      (sit-for 0)				; update display
      (if highlight (setq inverse-video (not inverse-video))) ; toggle video
*************** With prefix argument, set the default di
*** 1861,1868 ****
  					end (+ end change)))))
  			      (if (not ispell-quit)
! 				  (message
! 				   (concat "Continuing spelling check using "
! 					   (or ispell-dictionary "default")
! 					   " dictionary...")))
  			      (sit-for 0)))
  			;; finished with line!
--- 1859,1864 ----
  					end (+ end change)))))
  			      (if (not ispell-quit)
! 				  (message "Continuing spelling check using %s dictionary..."
! 					   (or ispell-dictionary "default")))
  			      (sit-for 0)))
  			;; finished with line!
*************** You can bind this to the key C-c i in GN
*** 2201,2205 ****
  		   (end (or (and end-c end-fwd (min end-c end-fwd))
  			    end-c end-fwd
! 			    ;; defalut to limit of text.
  			    (marker-position limit))))
  	      (goto-char start)
--- 2197,2201 ----
  		   (end (or (and end-c end-fwd (min end-c end-fwd))
  			    end-c end-fwd
! 			    ;; default to limit of text.
  			    (marker-position limit))))
  	      (goto-char start)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/ispell4.el emacs-19.31/lisp/ispell4.el
*** emacs-19.30/lisp/ispell4.el	Tue May 23 20:47:26 1995
--- emacs-19.31/lisp/ispell4.el	Wed Jan 24 19:34:41 1996
***************
*** 1,23 ****
! ;;; ispell.el --- this is the GNU EMACS interface to GNU ISPELL version 4.
  
! ;;Copyright (C) 1990, 1991, 1993 Free Software Foundation, Inc.
  
  ;; Keywords: wp
  
! ;;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:
--- 1,24 ----
! ;;; ispell4.el --- this is the GNU EMACS interface to GNU ISPELL version 4.
  
! ;; Copyright (C) 1990, 1991, 1993 Free Software Foundation, Inc.
  
  ;; Keywords: wp
  
! ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** that have not already been dumped will b
*** 126,130 ****
  	(if (not (= (car greeting) 1))
  	    (error "Bad ispell version: wanted 1, got %d" (car greeting)))
! 	(message (car (cdr greeting))))
        (delete-region (point-min) last-char))))
    
--- 127,131 ----
  	(if (not (= (car greeting) 1))
  	    (error "Bad ispell version: wanted 1, got %d" (car greeting)))
! 	(message "%s" (car (cdr greeting))))
        (delete-region (point-min) last-char))))
    
*************** Return value is t unless exit is due to 
*** 349,353 ****
  	       (error "Ispell has not yet been run"))
  	      ((markerp (car ispell-bad-words))
! 	       (message (substitute-command-keys
  			   "Type \\[ispell-next] to continue")))
  	      ((eq (car ispell-bad-words) nil)
--- 350,355 ----
  	       (error "Ispell has not yet been run"))
  	      ((markerp (car ispell-bad-words))
! 	       (message "%s"
! 			(substitute-command-keys
  			   "Type \\[ispell-next] to continue")))
  	      ((eq (car ispell-bad-words) nil)
*************** With a prefix argument, resume handling 
*** 455,459 ****
  ;;;	     (goto-char start)
  ;;;	     (sit-for 0)
! 		 (message (format "Ispell checking %s" word))
  		 (ispell-cmd word)
  		 (let ((message (ispell-next-message)))
--- 457,461 ----
  ;;;	     (goto-char start)
  ;;;	     (sit-for 0)
! 		 (message "Ispell checking %s" word)
  		 (ispell-cmd word)
  		 (let ((message (ispell-next-message)))
*************** Overrides default dictionary file such a
*** 761,765 ****
  
  (defvar ispell-gnu-look-still-broken-p nil
!   "*t if GNU look -r can give different results with and without trialing `.*'.
  Example: `look -dfr \"^ya\" foo' returns nothing, while `look -dfr \"^ya.*\" foo'
  returns `yacc', where `foo' is a dictionary file containing the three lines
--- 763,767 ----
  
  (defvar ispell-gnu-look-still-broken-p nil
!   "*t if GNU look -r can give different results with and without trailing `.*'.
  Example: `look -dfr \"^ya\" foo' returns nothing, while `look -dfr \"^ya.*\" foo'
  returns `yacc', where `foo' is a dictionary file containing the three lines
*************** an interior word fragment.  `ispell-have
*** 977,981 ****
  	      "\\)")
    "*End of text which will be checked in ispell-message.
! If it is a string, limit at first occurence of that regular expression.
  Otherwise, it must be a function which is called to get the limit.")
  
--- 979,983 ----
  	      "\\)")
    "*End of text which will be checked in ispell-message.
! If it is a string, limit at first occurrence of that regular expression.
  Otherwise, it must be a function which is called to get the limit.")
  
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/jka-compr.el emacs-19.31/lisp/jka-compr.el
*** emacs-19.30/lisp/jka-compr.el	Tue Nov 21 12:32:19 1995
--- emacs-19.31/lisp/jka-compr.el	Fri Apr 26 15:31:29 1996
***************
*** 1,5 ****
  ;;; jka-compr.el --- reading/writing/loading compressed files
  
! ;;; Copyright (C) 1993, 1994  Free Software Foundation, Inc.
  
  ;; Author: jka@ece.cmu.edu (Jay K. Adams)
--- 1,5 ----
  ;;; jka-compr.el --- reading/writing/loading compressed files
  
! ;; Copyright (C) 1993, 1994  Free Software Foundation, Inc.
  
  ;; Author: jka@ece.cmu.edu (Jay K. Adams)
***************
*** 19,99 ****
  
  ;; 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: 
  
! ;;; This package implements low-level support for reading, writing,
! ;;; and loading compressed files.  It hooks into the low-level file
! ;;; I/O functions (including write-region and insert-file-contents) so
! ;;; that they automatically compress or uncompress a file if the file
! ;;; appears to need it (based on the extension of the file name).
! ;;; Packages like Rmail, VM, GNUS, and Info should be able to work
! ;;; with compressed files without modification.
! 
! 
! ;;; INSTRUCTIONS:
! ;;;
! ;;; To use jka-compr, simply load this package, and edit as usual.
! ;;; Its operation should be transparent to the user (except for
! ;;; messages appearing when a file is being compressed or
! ;;; uncompressed).
! ;;;
! ;;; The variable, jka-compr-compression-info-list can be used to
! ;;; customize jka-compr to work with other compression programs.
! ;;; The default value of this variable allows jka-compr to work with
! ;;; Unix compress and gzip.
! ;;;
! ;;; If you are concerned about the stderr output of gzip and other
! ;;; compression/decompression programs showing up in your buffers, you
! ;;; should set the discard-error flag in the compression-info-list.
! ;;; This will cause the stderr of all programs to be discarded.
! ;;; However, it also causes emacs to call compression/uncompression
! ;;; programs through a shell (which is specified by jka-compr-shell).
! ;;; This may be a drag if, on your system, starting up a shell is
! ;;; slow.
! ;;;
! ;;; If you don't want messages about compressing and decompressing
! ;;; to show up in the echo area, you can set the compress-name and
! ;;; decompress-name fields of the jka-compr-compression-info-list to
! ;;; nil.
! 
! 
! ;;; APPLICATION NOTES:
! ;;;
! ;;; crypt++
! ;;;   jka-compr can coexist with crpyt++ if you take all the decompression
! ;;;   entries out of the crypt-encoding-list.  Clearly problems will arise if
! ;;;   you have two programs trying to compress/decompress files.  jka-compr
! ;;;   will not "work with" crypt++ in the following sense: you won't be able to
! ;;;   decode encrypted compressed files--that is, files that have been
! ;;;   compressed then encrypted (in that order).  Theoretically, crypt++ and
! ;;;   jka-compr could properly handle a file that has been encrypted then
! ;;;   compressed, but there is little point in trying to compress an encrypted
! ;;;   file.
! ;;;
! 
! 
! ;;; ACKNOWLEDGMENTS
! ;;; 
! ;;; jka-compr is a V19 adaptation of jka-compr for V18 of Emacs.  Many people
! ;;; have made helpful suggestions, reported bugs, and even fixed bugs in 
! ;;; jka-compr.  I recall the following people as being particularly helpful.
! ;;;
! ;;;   Jean-loup Gailly
! ;;;   David Hughes
! ;;;   Richard Pieri
! ;;;   Daniel Quinlan
! ;;;   Chris P. Ross
! ;;;   Rick Sladkey
! ;;;
! ;;; Andy Norman's ange-ftp was the inspiration for the original jka-compr for
! ;;; Version 18 of Emacs.
! ;;;
! ;;; After I had made progress on the original jka-compr for V18, I learned of a
! ;;; package written by Kazushi Jam Marukawa, called jam-zcat, that did exactly
! ;;; what I was trying to do.  I looked over the jam-zcat source code and
! ;;; probably got some ideas from it.
! ;;;
  
  ;;; Code:
--- 19,100 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary: 
  
! ;; This package implements low-level support for reading, writing,
! ;; and loading compressed files.  It hooks into the low-level file
! ;; I/O functions (including write-region and insert-file-contents) so
! ;; that they automatically compress or uncompress a file if the file
! ;; appears to need it (based on the extension of the file name).
! ;; Packages like Rmail, VM, GNUS, and Info should be able to work
! ;; with compressed files without modification.
! 
! 
! ;; INSTRUCTIONS:
! ;;
! ;; To use jka-compr, simply load this package, and edit as usual.
! ;; Its operation should be transparent to the user (except for
! ;; messages appearing when a file is being compressed or
! ;; uncompressed).
! ;;
! ;; The variable, jka-compr-compression-info-list can be used to
! ;; customize jka-compr to work with other compression programs.
! ;; The default value of this variable allows jka-compr to work with
! ;; Unix compress and gzip.
! ;;
! ;; If you are concerned about the stderr output of gzip and other
! ;; compression/decompression programs showing up in your buffers, you
! ;; should set the discard-error flag in the compression-info-list.
! ;; This will cause the stderr of all programs to be discarded.
! ;; However, it also causes emacs to call compression/uncompression
! ;; programs through a shell (which is specified by jka-compr-shell).
! ;; This may be a drag if, on your system, starting up a shell is
! ;; slow.
! ;;
! ;; If you don't want messages about compressing and decompressing
! ;; to show up in the echo area, you can set the compress-name and
! ;; decompress-name fields of the jka-compr-compression-info-list to
! ;; nil.
! 
! 
! ;; APPLICATION NOTES:
! ;;
! ;; crypt++
! ;;   jka-compr can coexist with crpyt++ if you take all the decompression
! ;;   entries out of the crypt-encoding-list.  Clearly problems will arise if
! ;;   you have two programs trying to compress/decompress files.  jka-compr
! ;;   will not "work with" crypt++ in the following sense: you won't be able to
! ;;   decode encrypted compressed files--that is, files that have been
! ;;   compressed then encrypted (in that order).  Theoretically, crypt++ and
! ;;   jka-compr could properly handle a file that has been encrypted then
! ;;   compressed, but there is little point in trying to compress an encrypted
! ;;   file.
! ;;
! 
! 
! ;; ACKNOWLEDGMENTS
! ;; 
! ;; jka-compr is a V19 adaptation of jka-compr for V18 of Emacs.  Many people
! ;; have made helpful suggestions, reported bugs, and even fixed bugs in 
! ;; jka-compr.  I recall the following people as being particularly helpful.
! ;;
! ;;   Jean-loup Gailly
! ;;   David Hughes
! ;;   Richard Pieri
! ;;   Daniel Quinlan
! ;;   Chris P. Ross
! ;;   Rick Sladkey
! ;;
! ;; Andy Norman's ange-ftp was the inspiration for the original jka-compr for
! ;; Version 18 of Emacs.
! ;;
! ;; After I had made progress on the original jka-compr for V18, I learned of a
! ;; package written by Kazushi Jam Marukawa, called jam-zcat, that did exactly
! ;; what I was trying to do.  I looked over the jam-zcat source code and
! ;; probably got some ideas from it.
! ;;
  
  ;;; Code:
*************** invoked.")
*** 170,174 ****
    "The entry in `file-name-handler-alist' used by the jka-compr I/O functions.")
  
! ;;; Functions for accessing the return value of jka-get-compression-info
  (defun jka-compr-info-regexp               (info)  (aref info 0))
  (defun jka-compr-info-compress-message     (info)  (aref info 1))
--- 171,175 ----
    "The entry in `file-name-handler-alist' used by the jka-compr I/O functions.")
  
! ;;; Functions for accessing the return value of jka-compr-get-compression-info
  (defun jka-compr-info-regexp               (info)  (aref info 0))
  (defun jka-compr-info-compress-message     (info)  (aref info 1))
*************** There should be no more than seven chara
*** 685,694 ****
      (apply operation args)))
  
! ;;;###autoload
! (defun auto-compression-mode (&optional arg)
    "Toggle automatic file compression and uncompression.
  With prefix argument ARG, turn auto compression on if positive, else off.
! Returns the new status of auto compression (non-nil means on)."
!   (interactive "P")
    (let* ((installed (jka-compr-installed-p))
  	 (flag (if (null arg)
--- 686,709 ----
      (apply operation args)))
  
! ;;;###autoload(defun auto-compression-mode (&optional arg)
! ;;;###autoload  "\
! ;;;###autoloadToggle automatic file compression and uncompression.
! ;;;###autoloadWith prefix argument ARG, turn auto compression on if positive, else off.
! ;;;###autoloadReturns the new status of auto compression (non-nil means on)."
! ;;;###autoload  (interactive "P")
! ;;;###autoload  (if (not (fboundp 'jka-compr-installed-p))
! ;;;###autoload      (progn
! ;;;###autoload        (require 'jka-compr)
! ;;;###autoload        ;; That turned the mode on, so make it initially off.
! ;;;###autoload        (toggle-auto-compression)))
! ;;;###autoload  (toggle-auto-compression arg t))
! 
! (defun toggle-auto-compression (&optional arg message)
    "Toggle automatic file compression and uncompression.
  With prefix argument ARG, turn auto compression on if positive, else off.
! Returns the new status of auto compression (non-nil means on).
! If the argument MESSAGE is non-nil, it means to print a message
! saying whether the mode is now on or off."
!   (interactive "P\np")
    (let* ((installed (jka-compr-installed-p))
  	 (flag (if (null arg)
*************** Returns the new status of auto compressi
*** 708,712 ****
  
  
!     (and (interactive-p)
  	 (if flag
  	     (message "Automatic file (de)compression is now ON.")
--- 723,727 ----
  
  
!     (and message
  	 (if flag
  	     (message "Automatic file (de)compression is now ON.")
*************** Returns the new status of auto compressi
*** 714,718 ****
  
      flag))
- (defalias 'toggle-auto-compression 'auto-compression-mode)
  
  (defun jka-compr-build-file-regexp ()
--- 729,732 ----
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/kermit.el emacs-19.31/lisp/kermit.el
*** emacs-19.30/lisp/kermit.el	Sun Sep 18 16:25:04 1994
--- emacs-19.31/lisp/kermit.el	Sun Jan 14 02:34:30 1996
***************
*** 20,25 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/ledit.el emacs-19.31/lisp/ledit.el
*** emacs-19.30/lisp/ledit.el	Mon Mar 22 09:41:52 1993
--- emacs-19.31/lisp/ledit.el	Sun Jan 14 02:34:30 1996
***************
*** 4,8 ****
  
  ;; Maintainer: FSF
! ;; Keyord: languages
  
  ;; This file is part of GNU Emacs.
--- 4,8 ----
  
  ;; Maintainer: FSF
! ;; Keyword: languages
  
  ;; This file is part of GNU Emacs.
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/levents.el emacs-19.31/lisp/levents.el
*** emacs-19.30/lisp/levents.el	Sat Aug 26 17:01:54 1995
--- emacs-19.31/lisp/levents.el	Tue Feb 27 20:22:07 1996
***************
*** 16,21 ****
  
  ;; 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:
--- 16,22 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** an existing event object."
*** 229,237 ****
  GNU Emacs 19 does not currently generate process-output events."
    (eq (car-safe obj) 'process))
- 
- (defun timeout-event-p (obj)
-   "True if the argument is a timeout event object.
- GNU Emacs 19 does not currently generate timeout events."
-   (eq (car-safe obj) 'timeout))
  
  ;;; levents.el ends here
--- 230,233 ----
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/life.el emacs-19.31/lisp/life.el
*** emacs-19.30/lisp/life.el	Sat Aug 26 16:31:00 1995
--- emacs-19.31/lisp/life.el	Sun Jan 14 02:34:30 1996
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/lisp-mnt.el emacs-19.31/lisp/lisp-mnt.el
*** emacs-19.30/lisp/lisp-mnt.el	Thu Jun 15 16:42:52 1995
--- emacs-19.31/lisp/lisp-mnt.el	Sat Mar  2 01:10:02 1996
***************
*** 6,10 ****
  ;; Maintainer: Eric S. Raymond <esr@snark.thyrsus.com>
  ;; Created: 14 Jul 1992
! ;; Version: $Id: lisp-mnt.el,v 1.11 1995/06/15 20:42:24 kwzh Exp $
  ;; Keywords: docs
  ;; X-Bogus-Bureaucratic-Cruft: Gruad will get you if you don't watch out!
--- 6,10 ----
  ;; Maintainer: Eric S. Raymond <esr@snark.thyrsus.com>
  ;; Created: 14 Jul 1992
! ;; Version: $Id: lisp-mnt.el,v 1.17 1996/02/08 04:13:11 rms Exp $
  ;; Keywords: docs
  ;; X-Bogus-Bureaucratic-Cruft: Gruad will get you if you don't watch out!
***************
*** 24,28 ****
  ;; 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:
--- 24,29 ----
  ;; 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,  Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 70,74 ****
  ;; line, the person(s) in the Author field are presumed to be it.  The example
  ;; in this file is mildly bogus because the maintainer line is redundant.
! ;;    The idea behind these two fields is to be able to write a lisp function
  ;; that does "send mail to the author" without having to mine the name out by
  ;; hand. Please be careful about surrounding the network address with <> if
--- 71,75 ----
  ;; line, the person(s) in the Author field are presumed to be it.  The example
  ;; in this file is mildly bogus because the maintainer line is redundant.
! ;;    The idea behind these two fields is to be able to write a Lisp function
  ;; that does "send mail to the author" without having to mine the name out by
  ;; hand. Please be careful about surrounding the network address with <> if
***************
*** 95,99 ****
  ;; without invoking the wrath of any program.
  ;;
! ;;    * Commentary line --- enables lisp code to find the developer's and
  ;; maintainers' explanations of the package internals.
  ;; 
--- 96,100 ----
  ;; without invoking the wrath of any program.
  ;;
! ;;    * Commentary line --- enables Lisp code to find the developer's and
  ;; maintainers' explanations of the package internals.
  ;; 
***************
*** 117,128 ****
  (require 'emacsbug)
  
  ;; These functions all parse the headers of the current buffer
  
! (defun lm-section-mark (hd &optional after)
!   ;; Return the buffer location of a given section start marker
    (save-excursion
      (let ((case-fold-search t))
        (goto-char (point-min))
!       (if (re-search-forward (concat "^;;;;* " hd ":[ \t]*$") nil t)
  	  (progn
  	    (beginning-of-line)
--- 118,176 ----
  (require 'emacsbug)
  
+ ;;; Variables:
+ 
+ (defvar lm-header-prefix "^;;*[ \t]+\\(@\(#\)\\)?[ \t]*\\([\$]\\)?"
+   "Prefix that is ignored before the tag.
+ For example, you can write the 1st line synopsis string and headers like this
+ in your Lisp package:
+ 
+    ;; @(#) package.el -- pacakge description
+    ;;
+    ;; @(#) $Maintainer:   Person Foo Bar $
+ 
+ The @(#) construct is used by unix what(1) and
+ then $identifier: doc string $ is used by GNU ident(1)")
+ 
+ (defvar lm-comment-column 16
+   "Column used for placing formatted output.")
+ 
+ (defvar lm-commentary-header "Commentary\\|Documentation"
+   "Regexp which matches start of documentation section.")
+ 
+ (defvar lm-history-header "Change Log\\|History"
+   "Regexp which matches the start of code log section.")
+ 
+ ;;; Functions:
+ 
  ;; These functions all parse the headers of the current buffer
  
! (defsubst lm-get-header-re (header &optional mode)
!   "Returns regexp for matching HEADER.
! If called with optional MODE and with value `section',
! return section regexp instead."
!   (cond ((eq mode 'section)
! 	 (concat "^;;;;* " header ":[ \t]*$"))
! 	(t
! 	 (concat lm-header-prefix header ":[ \t]*"))))
! 
! (defsubst lm-get-package-name ()
!   "Returns package name by looking at the first line."
!   (save-excursion
!     (goto-char (point-min))
!     (if (and (looking-at (concat lm-header-prefix))
! 	     (progn (goto-char (match-end 0))
! 		    (looking-at "\\([^\t ]+\\)")
! 		    (match-end 1)))
! 	(buffer-substring (match-beginning 1) (match-end 1))
!       )))
! 
! (defun lm-section-mark (header &optional after)
!   "Return the buffer location of a given section start marker.
! The HEADER is the section mark string to search for.
! If AFTER is non-nil, return the location of the next line."
    (save-excursion
      (let ((case-fold-search t))
        (goto-char (point-min))
!       (if (re-search-forward (lm-get-header-re header 'section) nil t)
  	  (progn
  	    (beginning-of-line)
***************
*** 131,170 ****
  	nil))))
  
! (defun lm-code-mark ()
!   ;; Return the buffer location of the code start marker
    (lm-section-mark "Code"))
  
! (defun lm-header (hd)
!   ;; Return the contents of a named header
!     (goto-char (point-min))
!     (let ((case-fold-search t))
!       (if (re-search-forward
! 	   (concat "^;; " hd ": \\(.*\\)") (lm-code-mark) t)
! 	  (buffer-substring (match-beginning 1) (match-end 1))
! 	nil)))
! 
! (defun lm-header-multiline (hd)
!   ;; Return the contents of a named header, with possible continuation lines.
!   ;; Note -- the returned value is a list of strings, one per line.
    (save-excursion
      (goto-char (point-min))
!     (let ((res (save-excursion (lm-header hd))))
!       (if res
! 	  (progn
! 	    (forward-line 1)
! 	    (setq res (list res))
! 	    (while (looking-at "^;;\t\\(.*\\)")
! 	      (setq res (cons (buffer-substring
! 			       (match-beginning 1)
! 			       (match-end 1))
! 			      res))
! 	      (forward-line 1))
! 	    ))
!       res)))
  
  ;; These give us smart access to the header fields and commentary
  
  (defun lm-summary (&optional file)
!   ;; Return the buffer's or FILE's one-line summary.
    (save-excursion
      (if file
--- 179,234 ----
  	nil))))
  
! (defsubst lm-code-mark ()
!   "Return the buffer location of the `Code' start marker."
    (lm-section-mark "Code"))
  
! (defsubst lm-commentary-mark ()
!   "Return the buffer location of the `Commentary' start marker."
!   (lm-section-mark lm-commentary-header))
! 
! (defsubst lm-history-mark ()
!   "Return the buffer location of the `History' start marker."
!   (lm-section-mark lm-history-header))
! 
! (defun lm-header (header)
!   "Return the contents of the header named HEADER."
!   (goto-char (point-min))
!   (let ((case-fold-search t))
!     (if (and (re-search-forward (lm-get-header-re header) (lm-code-mark) t)
! 	     ;;   RCS ident likes format "$identifier: data$"
! 	     (looking-at "\\([^$\n]+\\)")
! 	     (match-end 1))
! 	(buffer-substring (match-beginning 1) (match-end 1))
!       nil)))
! 
! (defun lm-header-multiline (header)
!   "Return the contents of the header named HEADER, with continuation lines.
! The returned value is a list of strings, one per line."
    (save-excursion
      (goto-char (point-min))
!     (let ((res (lm-header header)))
!       (cond
!        (res
! 	(setq res (list res))
! 	(forward-line 1)
! 
! 	(while (and (looking-at (concat lm-header-prefix "[\t ]+"))
! 		    (progn
! 		      (goto-char (match-end 0))
! 		      (looking-at "\\(.*\\)"))
! 		    (match-end 1))
! 	  (setq res (cons (buffer-substring
! 			   (match-beginning 1)
! 			   (match-end 1))
! 			  res))
! 	  (forward-line 1))
! 	))
!       res
!       )))
  
  ;; These give us smart access to the header fields and commentary
  
  (defun lm-summary (&optional file)
!   "Return the one-line summary of file FILE, or current buffer if FILE is nil."
    (save-excursion
      (if file
***************
*** 172,176 ****
      (goto-char (point-min))
      (prog1
!       (if (looking-at "^;;; [^ ]+ --- \\(.*\\)")
  	  (buffer-substring (match-beginning 1) (match-end 1)))
        (if file
--- 236,243 ----
      (goto-char (point-min))
      (prog1
!       (if (and
! 	   (looking-at lm-header-prefix)
! 	   (progn (goto-char (match-end 0))
! 		  (looking-at "[^ ]+[ \t]+--+[ \t]+\\(.*\\)")))
  	  (buffer-substring (match-beginning 1) (match-end 1)))
        (if file
***************
*** 178,185 ****
        )))
  
- 
  (defun lm-crack-address (x)
!   ;; Given a string containing a human and email address, parse it
!   ;; into a cons pair (name . address).
    (cond ((string-match "\\(.+\\) [(<]\\(\\S-+@\\S-+\\)[>)]" x)
  	 (cons (substring x (match-beginning 1) (match-end 1))
--- 245,251 ----
        )))
  
  (defun lm-crack-address (x)
!   "Split up an email address into full name and real email address.
! The value is a cons of the form (FULLNAME . ADDRESS)."
    (cond ((string-match "\\(.+\\) [(<]\\(\\S-+@\\S-+\\)[>)]" x)
  	 (cons (substring x (match-beginning 1) (match-end 1))
***************
*** 194,200 ****
  
  (defun lm-authors (&optional file)
!   ;; Return the buffer's or FILE's author list.  Each element of the
!   ;; list is a cons; the car is a name-aming-humans, the cdr an email
!   ;; address.
    (save-excursion
      (if file
--- 260,266 ----
  
  (defun lm-authors (&optional file)
!   "Return the author list of file FILE, or current buffer if FILE is nil.
! Each element of the list is a cons; the car is the full name,
! the cdr is an email address."
    (save-excursion
      (if file
***************
*** 208,214 ****
  
  (defun lm-maintainer (&optional file)
!   ;; Get a package's bug-report & maintenance address.  Parse it out of FILE,
!   ;; or the current buffer if FILE is nil.
!   ;; The return value is a (name . address) cons.
    (save-excursion
      (if file
--- 274,279 ----
  
  (defun lm-maintainer (&optional file)
!   "Return the maintainer of file FILE, or current buffer if FILE is nil.
! The return value has the form (NAME . ADDRESS)."
    (save-excursion
      (if file
***************
*** 224,229 ****
  
  (defun lm-creation-date (&optional file)
!   ;; Return a package's creation date, if any.  Parse it out of FILE,
!   ;; or the current buffer if FILE is nil.
    (save-excursion
      (if file
--- 289,293 ----
  
  (defun lm-creation-date (&optional file)
!   "Return the created date given in file FILE, or current buffer if FILE is nil."
    (save-excursion
      (if file
***************
*** 237,241 ****
  
  (defun lm-last-modified-date (&optional file)
!   ;; Return a package's last-modified date, if you can find one.
    (save-excursion 
      (if file
--- 301,305 ----
  
  (defun lm-last-modified-date (&optional file)
!   "Return the modify-date given in file FILE, or current buffer if FILE is nil."
    (save-excursion 
      (if file
***************
*** 260,265 ****
  
  (defun lm-version (&optional file)
!   ;; Return the package's version field.
!   ;; If none, look for an RCS or SCCS header to crack it out of.
    (save-excursion 
      (if file
--- 324,329 ----
  
  (defun lm-version (&optional file)
!   "Return the version listed in file FILE, or current buffer if FILE is nil.
! This can befound in an RCS or SCCS header to crack it out of."
    (save-excursion 
      (if file
***************
*** 290,295 ****
  
  (defun lm-keywords (&optional file)
!   ;; Return the header containing the package's topic keywords.
!   ;; Parse them out of FILE, or the current buffer if FILE is nil.
    (save-excursion
      (if file
--- 354,358 ----
  
  (defun lm-keywords (&optional file)
!   "Return the keywords given in file FILE, or current buffer if FILE is nil."
    (save-excursion
      (if file
***************
*** 303,309 ****
  
  (defun lm-adapted-by (&optional file)
!   ;; Return the name or code of the person who cleaned up this package
!   ;; for distribution.  Parse it out of FILE, or the current buffer if
!   ;; FILE is nil.
    (save-excursion
      (if file
--- 366,372 ----
  
  (defun lm-adapted-by (&optional file)
!   "Return the adapted-by names in file FILE, or current buffer if FILE is nil.
! This is the name of the person who cleaned up this package for
! distribution."
    (save-excursion
      (if file
***************
*** 316,332 ****
  
  (defun lm-commentary (&optional file)
!   ;; Return the commentary region of a file, as a string.
    (save-excursion
      (if file
  	(find-file file))
      (prog1
! 	(let ((commentary (lm-section-mark "Commentary" t))
! 	      (change-log (lm-section-mark "Change Log"))
! 	      (code (lm-section-mark "Code")))
! 	  (and commentary
! 	      (if change-log
! 		  (buffer-substring commentary change-log)
! 		(buffer-substring commentary code)))
! 	  )
        (if file
  	  (kill-buffer (current-buffer)))
--- 379,400 ----
  
  (defun lm-commentary (&optional file)
!   "Return the commentary in file FILE, or current buffer if FILE is nil.
! The value is returned as a string.  In the text, the commentary starts
! with tag `Commentary' and ends with tag `Change Log' or `History'."
    (save-excursion
      (if file
  	(find-file file))
      (prog1
! 	(let ((commentary	(lm-commentary-mark))
! 	      (change-log	(lm-history-mark))
! 	      (code		(lm-code-mark))
! 	      )
! 	  (cond
! 	   ((and commentary change-log)
! 	    (buffer-substring commentary change-log))
! 	   ((and commentary code)
! 	    (buffer-substring commentary code))
! 	   (t
! 	    nil)))
        (if file
  	  (kill-buffer (current-buffer)))
***************
*** 335,391 ****
  ;;; Verification and synopses
  
! (defun insert-at-column (col &rest pieces)
!    (if (> (current-column) col) (insert "\n"))
!    (move-to-column-force col)
!    (apply 'insert pieces))
  
! (defconst lm-comment-column 16)
! 
! (defun lm-verify (&optional file showok)
    "Check that the current buffer (or FILE if given) is in proper format.
! If FILE is a directory, recurse on its files and generate a report into
  a temporary buffer."
!   (if (and file (file-directory-p file))
!       (progn
! 	(switch-to-buffer (get-buffer-create "*lm-verify*"))
! 	(erase-buffer)
! 	(mapcar
! 	 '(lambda (f)
! 	    (if (string-match ".*\\.el$" f)
! 		(let ((status (lm-verify f)))
! 		  (if status
! 		      (progn
! 			(insert f ":")
! 			(insert-at-column lm-comment-column status "\n"))
! 		    (and showok
  			 (progn
  			   (insert f ":")
! 			   (insert-at-column lm-comment-column "OK\n")))))))
! 	(directory-files file))
!     )
!   (save-excursion
!     (if file
! 	(find-file file))
!     (prog1
! 	(cond
! 	 ((not (lm-summary))
! 	  "Can't find a package summary")
! 	 ((not (lm-code-mark))
! 	  "Can't find a code section marker")
! 	 ((progn
! 	    (goto-char (point-max))
! 	    (forward-line -1)
! 	    (looking-at (concat ";;; " file "ends here")))
! 	  "Can't find a footer line")
! 	 )
!       (if file
! 	  (kill-buffer (current-buffer)))
!       ))))
  
  (defun lm-synopsis (&optional file showall)
    "Generate a synopsis listing for the buffer or the given FILE if given.
! If FILE is a directory, recurse on its files and generate a report into
! a temporary buffer.  If SHOWALL is on, also generate a line for files
  which do not include a recognizable synopsis."
    (if (and file (file-directory-p file))
        (progn
--- 403,505 ----
  ;;; Verification and synopses
  
! (defun lm-insert-at-column (col &rest strings)
!   "Insert list of STRINGS, at column COL."
!   (if (> (current-column) col) (insert "\n"))
!   (move-to-column-force col)
!   (apply 'insert strings))
  
! (defun lm-verify (&optional file showok &optional verb)
    "Check that the current buffer (or FILE if given) is in proper format.
! If FILE is a directory, recurse on its files and generate a report in
  a temporary buffer."
!   (interactive)
!   (let* ((verb    (or verb (interactive-p)))
! 	 ret
! 	 name
! 	 )
!     (if verb
! 	(setq ret "Ok."))		;init value
! 
!     (if (and file (file-directory-p file))
! 	(setq
! 	 ret
! 	 (progn
! 	   (switch-to-buffer (get-buffer-create "*lm-verify*"))
! 	   (erase-buffer)
! 	   (mapcar
! 	    '(lambda (f)
! 	       (if (string-match ".*\\.el$" f)
! 		   (let ((status (lm-verify f)))
! 		     (if status
  			 (progn
  			   (insert f ":")
! 			   (lm-insert-at-column lm-comment-column status "\n"))
! 		       (and showok
! 			    (progn
! 			      (insert f ":")
! 			      (lm-insert-at-column lm-comment-column "OK\n")))))))
! 	    (directory-files file))
! 	   ))
!       (save-excursion
! 	(if file
! 	    (find-file file))
! 	(setq name (lm-get-package-name))
! 
! 	(setq
! 	 ret
! 	 (prog1
! 	     (cond
! 	      ((null name)
! 	       "Can't find a package NAME")
! 
! 	      ((not (lm-authors))
! 	       "Author: tag missing.")
! 
! 	      ((not (lm-maintainer))
! 	       "Maintainer: tag missing.")
! 
! 	      ((not (lm-summary))
! 	       "Can't find a one-line 'Summary' description")
! 
! 	      ((not (lm-keywords))
! 	       "Keywords: tag missing.")
! 
! 	      ((not (lm-commentary-mark))
! 	       "Can't find a 'Commentary' section marker.")
! 
! 	      ((not (lm-history-mark))
! 	       "Can't find a 'History' section marker.")
! 
! 	      ((not (lm-code-mark))
! 	       "Can't find a 'Code' section marker")
! 
! 	      ((progn
! 		 (goto-char (point-max))
! 		 (not
! 		  (re-search-backward
! 		   (concat "^;;;[ \t]+" name "[ \t]+ends here[ \t]*$"
! 			   "\\|^;;;[ \t]+ End of file[ \t]+" name)
! 		   nil t
! 		   )))
! 	       (format "Can't find a footer line for [%s]" name))
! 	      (t
! 	       ret))
! 	   (if file
! 	       (kill-buffer (current-buffer)))
! 	  ))))
!     (if verb
! 	(message ret))
!     ret
!     ))
  
  (defun lm-synopsis (&optional file showall)
    "Generate a synopsis listing for the buffer or the given FILE if given.
! If FILE is a directory, recurse on its files and generate a report in
! a temporary buffer.  If SHOWALL is non-nil, also generate a line for files
  which do not include a recognizable synopsis."
+   (interactive
+    (list
+     (read-file-name "Synopsis for (file or dir): ")))
+ 
    (if (and file (file-directory-p file))
        (progn
*************** which do not include a recognizable syno
*** 399,407 ****
  		      (progn
  			(insert f ":")
! 			(insert-at-column lm-comment-column syn "\n"))
  		    (and showall
  			 (progn
  			   (insert f ":")
! 			   (insert-at-column lm-comment-column "NA\n")))))))
  	 (directory-files file))
  	)
--- 513,521 ----
  		      (progn
  			(insert f ":")
! 			(lm-insert-at-column lm-comment-column syn "\n"))
  		    (and showall
  			 (progn
  			   (insert f ":")
! 			   (lm-insert-at-column lm-comment-column "NA\n")))))))
  	 (directory-files file))
  	)
*************** which do not include a recognizable syno
*** 419,425 ****
  Prompts for bug subject.  Leaves you in a mail buffer."
    (interactive "sBug Subject: ")
!   (let ((package (buffer-name))
! 	(addr (lm-maintainer))
! 	(version (lm-version)))
      (mail nil
  	  (if addr
--- 533,539 ----
  Prompts for bug subject.  Leaves you in a mail buffer."
    (interactive "sBug Subject: ")
!   (let ((package	(lm-get-package-name))
! 	(addr		(lm-maintainer))
! 	(version	(lm-version)))
      (mail nil
  	  (if addr
*************** Prompts for bug subject.  Leaves you in 
*** 438,439 ****
--- 552,554 ----
  
  ;;; lisp-mnt.el ends here
+ 
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/lisp-mode.el emacs-19.31/lisp/lisp-mode.el
*** emacs-19.30/lisp/lisp-mode.el	Sat Nov 11 00:27:21 1995
--- emacs-19.31/lisp/lisp-mode.el	Sun Mar 17 10:34:53 1996
***************
*** 1,5 ****
  ;;; lisp-mode.el --- Lisp mode, and its idiosyncratic commands.
  
! ;; Copyright (C) 1985 Free Software Foundation, Inc.
  
  ;; Maintainer: FSF
--- 1,5 ----
  ;;; lisp-mode.el --- Lisp mode, and its idiosyncratic commands.
  
! ;; Copyright (C) 1985, 1986 Free Software Foundation, Inc.
  
  ;; Maintainer: FSF
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 103,106 ****
--- 104,112 ----
    (make-local-variable 'fill-paragraph-function)
    (setq fill-paragraph-function 'lisp-fill-paragraph)
+   ;; Adaptive fill mode gets in the way of auto-fill,
+   ;; and should make no difference for explicit fill
+   ;; because lisp-fill-paragraph should do the job.
+   (make-local-variable 'adaptive-fill-mode)
+   (setq adaptive-fill-mode nil)
    (make-local-variable 'indent-line-function)
    (setq indent-line-function 'lisp-indent-line)
*************** All commands in `shared-lisp-mode-map' a
*** 149,152 ****
--- 155,160 ----
      (define-key map [byte-recompile]
        '("Byte-recompile Directory..." . byte-recompile-directory))
+     (define-key map [emacs-byte-compile-and-load]
+       '("Byte-compile And Load" . emacs-lisp-byte-compile-and-load))
      (define-key map [byte-compile]
        '("Byte-compile This File" . emacs-lisp-byte-compile))
*************** All commands in `shared-lisp-mode-map' a
*** 168,172 ****
    (if buffer-file-name
        (byte-compile-file buffer-file-name)
!     (error "The buffer must be saved in a file first.")))
  
  (defun emacs-lisp-mode ()
--- 176,195 ----
    (if buffer-file-name
        (byte-compile-file buffer-file-name)
!     (error "The buffer must be saved in a file first")))
! 
! (defun emacs-lisp-byte-compile-and-load ()
!   "Byte-compile the current file (if it has changed), then load compiled code."
!   (interactive)
!   (or buffer-file-name
!       (error "The buffer must be saved in a file first"))
!   (require 'bytecomp)
!   ;; Recompile if file or buffer has changed since last compilation.
!   (if (and (buffer-modified-p)
! 	   (y-or-n-p (format "save buffer %s first? " (buffer-name))))
!       (save-buffer))
!   (let ((compiled-file-name (byte-compile-dest-file buffer-file-name)))
!     (if (file-newer-than-file-p compiled-file-name buffer-file-name)
! 	(load-file compiled-file-name)
!       (byte-compile-file buffer-file-name t))))
  
  (defun emacs-lisp-mode ()
*************** and initial semicolons."
*** 681,684 ****
--- 704,710 ----
  	has-comment
  
+ 	;; Non-nil if the current line contains code and a comment.
+ 	has-code-and-comment
+ 
  	;; If has-comment, the appropriate fill-prefix for the comment.
  	comment-fill-prefix
*************** and initial semicolons."
*** 699,712 ****
         ;; semi which starts the comment shouldn't be part of a string or
         ;; character.
!        ((progn
! 	  (while (not (looking-at ";\\|$"))
! 	    (skip-chars-forward "^;\n\"\\\\?")
! 	    (cond
! 	     ((eq (char-after (point)) ?\\) (forward-char 2))
! 	     ((memq (char-after (point)) '(?\" ??)) (forward-sexp 1))))
! 	  (looking-at ";+[\t ]*"))
! 	(setq has-comment t)
  	(setq comment-fill-prefix
! 	      (concat (make-string (current-column) ? )
  		      (buffer-substring (match-beginning 0) (match-end 0)))))))
  
--- 725,743 ----
         ;; semi which starts the comment shouldn't be part of a string or
         ;; character.
!        ((condition-case nil
! 	    (save-restriction
! 	      (narrow-to-region (point-min)
! 				(save-excursion (end-of-line) (point)))
! 	      (while (not (looking-at ";\\|$"))
! 		(skip-chars-forward "^;\n\"\\\\?")
! 		(cond
! 		 ((eq (char-after (point)) ?\\) (forward-char 2))
! 		 ((memq (char-after (point)) '(?\" ??)) (forward-sexp 1))))
! 	      (looking-at ";+[\t ]*"))
! 	  (error nil))
! 	(setq has-comment t has-code-and-comment t)
  	(setq comment-fill-prefix
! 	      (concat (make-string (/ (current-column) 8) ?\t)
! 		      (make-string (% (current-column) 8) ?\ )
  		      (buffer-substring (match-beginning 0) (match-end 0)))))))
  
*************** and initial semicolons."
*** 715,741 ****
  
        ;; Narrow to include only the comment, and then fill the region.
!       (save-restriction
! 	(narrow-to-region
! 	 ;; Find the first line we should include in the region to fill.
! 	 (save-excursion
! 	   (while (and (zerop (forward-line -1))
! 		       (looking-at "^[ \t]*;")))
! 	   ;; We may have gone to far.  Go forward again.
! 	   (or (looking-at "^[ \t]*;")
! 	       (forward-line 1))
! 	   (point))
! 	 ;; Find the beginning of the first line past the region to fill.
! 	 (save-excursion
! 	   (while (progn (forward-line 1)
  			 (looking-at "^[ \t]*;")))
! 	   (point)))
! 
! 	;; Lines with only semicolons on them can be paragraph boundaries.
! 	(let ((paragraph-start (concat paragraph-start "\\|[ \t;]*$"))
! 	      (paragraph-separate (concat paragraph-start "\\|[ \t;]*$"))
! 	      (fill-prefix comment-fill-prefix))
! 	  (fill-paragraph justify))))
      t))
- 
  
  (defun indent-code-rigidly (start end arg &optional nochange-regexp)
--- 746,794 ----
  
        ;; Narrow to include only the comment, and then fill the region.
!       (save-excursion
! 	(save-restriction
! 	  (beginning-of-line)
! 	  (narrow-to-region
! 	   ;; Find the first line we should include in the region to fill.
! 	   (save-excursion
! 	     (while (and (zerop (forward-line -1))
  			 (looking-at "^[ \t]*;")))
! 	     ;; We may have gone too far.  Go forward again.
! 	     (or (looking-at ".*;")
! 		 (forward-line 1))
! 	     (point))
! 	   ;; Find the beginning of the first line past the region to fill.
! 	   (save-excursion
! 	     (while (progn (forward-line 1)
! 			   (looking-at "^[ \t]*;")))
! 	     (point)))
! 
! 	  ;; Lines with only semicolons on them can be paragraph boundaries.
! 	  (let* ((paragraph-start (concat paragraph-start "\\|[ \t;]*$"))
! 		 (paragraph-separate (concat paragraph-start "\\|[ \t;]*$"))
! 		 (paragraph-ignore-fill-prefix nil)
! 		 (fill-prefix comment-fill-prefix)
! 		 (after-line (if has-code-and-comment
! 				 (save-excursion
! 				   (forward-line 1) (point))))
! 		 (end (progn
! 			(forward-paragraph)
! 			(or (bolp) (newline 1))
! 			(point)))
! 		 ;; If this comment starts on a line with code,
! 		 ;; include that like in the filling.
! 		 (beg (progn (backward-paragraph)
! 			     (if (eq (point) after-line)
! 				 (forward-line -1))
! 			     (point))))
! 	    (fill-region-as-paragraph beg end
! 				      justify nil
! 				      (save-excursion
! 					(goto-char beg)
! 					(if (looking-at fill-prefix)
! 					    nil
! 					  (re-search-forward comment-start-skip)
! 					  (point))))))))
      t))
  
  (defun indent-code-rigidly (start end arg &optional nochange-regexp)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/lisp.el emacs-19.31/lisp/lisp.el
*** emacs-19.30/lisp/lisp.el	Thu Sep 22 02:41:30 1994
--- emacs-19.31/lisp/lisp.el	Sun Jan 14 02:34:30 1996
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/lmenu.el emacs-19.31/lisp/lmenu.el
*** emacs-19.30/lisp/lmenu.el	Mon May  8 22:18:20 1995
--- emacs-19.31/lisp/lmenu.el	Sun Jan 14 02:34:30 1996
***************
*** 1,8 ****
  ;;; lmenu.el --- emulate Lucid's menubar support
  
- ;; Keywords: emulations
- 
  ;; Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc.
  
  ;; This file is part of GNU Emacs.
  
--- 1,8 ----
  ;;; lmenu.el --- emulate Lucid's menubar support
  
  ;; Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc.
  
+ ;; Keywords: emulations
+ 
  ;; This file is part of GNU Emacs.
  
***************
*** 18,23 ****
  
  ;; 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.
  
  ;;; Code:
--- 18,24 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Code:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/loaddefs.el emacs-19.31/lisp/loaddefs.el
*** emacs-19.30/lisp/loaddefs.el	Sat Nov 25 00:40:30 1995
--- emacs-19.31/lisp/loaddefs.el	Thu May 23 15:49:58 1996
***************
*** 1,5 ****
  ;;; loaddefs.el --- define standard autoloads and keys of other files
  
! ;; Copyright (C) 1985,86,87,92,93,94, 95 Free Software Foundation, Inc.
  
  ;; Maintainer: FSF
--- 1,5 ----
  ;;; loaddefs.el --- define standard autoloads and keys of other files
  
! ;; Copyright (C) 1985,86,87,92,93,94,95,96 Free Software Foundation, Inc.
  
  ;; Maintainer: FSF
***************
*** 20,24 ****
  ;; 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:
--- 20,25 ----
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 51,55 ****
  ;;; for you.  Just insert ";;;###autoload" before defuns or defmacros you
  ;;; want to be autoloaded, or other forms you want copied into loaddefs.el
! ;;; (defvars, key definitions, etc.).  For example, 
  ;;;	;;;###autoload
  ;;;	(defun foobar () ....)
--- 52,56 ----
  ;;; for you.  Just insert ";;;###autoload" before defuns or defmacros you
  ;;; want to be autoloaded, or other forms you want copied into loaddefs.el
! ;;; (defvars, key definitions, etc.).  For example,
  ;;;	;;;###autoload
  ;;;	(defun foobar () ....)
***************
*** 61,68 ****
  ;;; Then do M-x update-file-autoloads on the file to update loaddefs.el.
  ;;;
! ;;; You can also use M-x update-directory-autoloads to update the autoloads
! ;;; in loaddefs.el for all .el files in the lisp/ directory, or M-x
! ;;; update-autoloads-here to update the autoloads for each file that
! ;;; already has an autoload section in this file.
  ;;; **********************************************************************
  
--- 62,67 ----
  ;;; Then do M-x update-file-autoloads on the file to update loaddefs.el.
  ;;;
! ;;; You can also use M-x update-autoloads-from-directory to update the
! ;;; autoloads in loaddefs.el for all .el files in the directory specified.
  ;;; **********************************************************************
  
*************** is okay.  See `mode-line-format'.")
*** 140,144 ****
  	       ".dvi" ".toc" ".log" ".aux" ".a" ".ln"
  	       ".lof" ".blg" ".bbl" ".glo" ".idx" ".lot" ".fmt"))))
!       
  (make-variable-buffer-local 'indent-tabs-mode)
  
--- 139,216 ----
  	       ".dvi" ".toc" ".log" ".aux" ".a" ".ln"
  	       ".lof" ".blg" ".bbl" ".glo" ".idx" ".lot" ".fmt"))))
! 
! (setq debug-ignored-errors
!       '(beginning-of-line beginning-of-buffer end-of-line
! 	end-of-buffer end-of-file buffer-read-only
!       	"^Previous command was not a yank$"
! 	"^Minibuffer window is not active$"
! 	"^End of history; no next item$"
! 	"^Beginning of history; no preceding item$"
! 	"^No recursive edit is in progress$"
! 	"^Changes to be undone are outside visible portion of buffer$"
! 	"^No undo information in this buffer$"
! 	"^No further undo information$"
! 	"^Save not confirmed$"
! 	"^Recover-file cancelled\\.$"
! 
! 	;; comint
! 	"^Not at command line$"
! 	"^Empty input ring$"
! 	"^No history$"
! 	"^Not found$";; To common?
! 	"^Current buffer has no process$"
! 
! 	;; dabbrev
! 	"^No dynamic expansion for \".*\" found\\.$"
! 	"^No further dynamic expansions for \".*\" found\\.$"
! 	"^No further dynamic expansions for `.*' found$"
! 
! 	;; Completion
! 	(concat "^To complete, the point must be after a symbol at "
! 		"least [0-9]* character long\\.$")
! 	"^The string \".*\" is too short to be saved as a completion\\.$"
! 
! 	;; Compile
! 	"^No more errors\\( yet\\|\\)$"
! 
! 	;; Gnus
! 	"^NNTP: Connection closed\\.$"
! 
! 	;; info
! 	"^Node has no Previous$"
! 	"^No \".*\" in index$"
! 
! 	;; imenu
! 	"^No items suitable for an index found in this buffer\\.$"
! 	"^The mode \".*\" does not take full advantage of imenu\\.el yet\\.$"
! 
! 	;; ispell
! 	"^No word found to check!$"
! 
! 	;; mh-e
! 	"^Cursor not pointing to message$"
! 	"^There is no other window$"
! 
! 	;; man
! 	"^No manpage [0-9]* found$"
! 
! 	;; etags
! 	"^No tags table in use!  Use .* to select one\\.$"
! 	"^There is no default tag$"
! 	"^No previous tag locations$"
! 	"^File .* is not a valid tags table$"
! 	"^No \\(more \\|\\)tags \\(matching\\|containing\\) "
! 	"^Rerun etags: `.*' not found in "
! 	"^All files processed\\.$"
! 	"^No .* or .* in progress.$"
! 	"^File .* not in current tags tables$"
! 	"No tags table loaded."
! 	"^Nothing to complete$"
! 
! 	;; BBDB
! 	"^no previous record$"
! 	"^no next record$"))
! 
! 
  (make-variable-buffer-local 'indent-tabs-mode)
  
*************** is okay.  See `mode-line-format'.")
*** 147,151 ****
  (defun complete-tag ()
    "Perform tags completion on the text around point.
! Completes to the set of names listed in the current tags table.  
  The string to complete is chosen in the same way as the default
  for \\[find-tag] (which see)."
--- 219,223 ----
  (defun complete-tag ()
    "Perform tags completion on the text around point.
! Completes to the set of names listed in the current tags table.
  The string to complete is chosen in the same way as the default
  for \\[find-tag] (which see)."
*************** for \\[find-tag] (which see)."
*** 497,501 ****
  ;;;		    (point-min) (point-max))
  
! ;;;### (autoloads (ada-make-filename-from-adaname ada-mode) "ada-mode" "ada-mode.el" (12437 324))
  ;;; Generated autoloads from ada-mode.el
  
--- 569,573 ----
  ;;;		    (point-min) (point-max))
  
! ;;;### (autoloads (ada-make-filename-from-adaname ada-mode) "ada-mode" "ada-mode.el" (12557 20396))
  ;;; Generated autoloads from ada-mode.el
  
*************** Determine the filename of a package/proc
*** 555,561 ****
  ;;;***
  
! ;;;### (autoloads (add-log-current-defun change-log-mode add-change-log-entry-other-window add-change-log-entry find-change-log prompt-for-change-log-name) "add-log" "add-log.el" (12428 26197))
  ;;; Generated autoloads from add-log.el
  
  (autoload (quote prompt-for-change-log-name) "add-log" "\
  Prompt for a change log name." nil nil)
--- 627,641 ----
  ;;;***
  
! ;;;### (autoloads (add-log-current-defun change-log-mode add-change-log-entry-other-window add-change-log-entry find-change-log prompt-for-change-log-name) "add-log" "add-log.el" (12626 43402))
  ;;; Generated autoloads from add-log.el
  
+ (defvar add-log-full-name nil "\
+ *Full name of user, for inclusion in ChangeLog daily headers.
+ This defaults to the value returned by the `user-full-name' function.")
+ 
+ (defvar add-log-mailing-address nil "\
+ *Electronic mail address of user, for inclusion in ChangeLog daily headers.
+ This defaults to the value of `user-mail-address'.")
+ 
  (autoload (quote prompt-for-change-log-name) "add-log" "\
  Prompt for a change log name." nil nil)
*************** Find change log file in other window and
*** 588,592 ****
  Optional arg (interactive prefix) non-nil means prompt for user name and site.
  Second arg is file name of change log.  If nil, uses `change-log-default-name'." t nil)
! (define-key ctl-x-4-map "a" 'add-change-log-entry-other-window)
  
  (autoload (quote change-log-mode) "add-log" "\
--- 668,672 ----
  Optional arg (interactive prefix) non-nil means prompt for user name and site.
  Second arg is file name of change log.  If nil, uses `change-log-default-name'." t nil)
!  (define-key ctl-x-4-map "a" 'add-change-log-entry-other-window)
  
  (autoload (quote change-log-mode) "add-log" "\
*************** Has a preference of looking backwards." 
*** 612,616 ****
  ;;;***
  
! ;;;### (autoloads (defadvice ad-add-advice) "advice" "advice.el" (12135 49154))
  ;;; Generated autoloads from advice.el
  
--- 692,696 ----
  ;;;***
  
! ;;;### (autoloads (defadvice ad-add-advice) "advice" "advice.el" (12536 45574))
  ;;; Generated autoloads from advice.el
  
*************** always avoid compilation, `maybe' will c
*** 632,636 ****
  loaded, and `like-original' will compile if the original definition of the
  advised function is compiled or a built-in function. Every other value will
! be interpreted as `maybe'. This variable will only be considered if the 
  COMPILE argument of `ad-activate' was supplied as nil.")
  
--- 712,716 ----
  loaded, and `like-original' will compile if the original definition of the
  advised function is compiled or a built-in function. Every other value will
! be interpreted as `maybe'. This variable will only be considered if the
  COMPILE argument of `ad-activate' was supplied as nil.")
  
*************** extreme position.  If there was already 
*** 644,648 ****
  name, then the position argument will be ignored and the old advice
  will be overwritten with the new one.
!     If the FUNCTION was not advised already, then its advice info will be 
  initialized.  Redefining a piece of advice whose name is part of the cache-id
  will clear the cache." nil nil)
--- 724,728 ----
  name, then the position argument will be ignored and the old advice
  will be overwritten with the new one.
!     If the FUNCTION was not advised already, then its advice info will be
  initialized.  Redefining a piece of advice whose name is part of the cache-id
  will clear the cache." nil nil)
*************** FUNCTION has been properly defined prior
*** 682,686 ****
  advised function should be compiled.
  
! `disable': The defined advice will be disabled, hence, it will not be used 
  during activation until somebody enables it.
  
--- 762,766 ----
  advised function should be compiled.
  
! `disable': The defined advice will be disabled, hence, it will not be used
  during activation until somebody enables it.
  
*************** Look at the file `advice.el' for compreh
*** 701,705 ****
  ;;;***
  
! ;;;### (autoloads (ange-ftp-hook-function) "ange-ftp" "ange-ftp.el" (12433 49824))
  ;;; Generated autoloads from ange-ftp.el
  
--- 781,785 ----
  ;;;***
  
! ;;;### (autoloads (ange-ftp-hook-function) "ange-ftp" "ange-ftp.el" (12629 58728))
  ;;; Generated autoloads from ange-ftp.el
  
*************** Look at the file `advice.el' for compreh
*** 712,716 ****
  ;;;***
  
! ;;;### (autoloads (appt-make-list) "appt" "appt.el" (12404 27843))
  ;;; Generated autoloads from appt.el
  
--- 792,796 ----
  ;;;***
  
! ;;;### (autoloads (appt-make-list) "appt" "appt.el" (12536 45574))
  ;;; Generated autoloads from appt.el
  
*************** as the first thing on a line.")
*** 739,743 ****
  
  (defvar appt-display-diary t "\
! *Non-nil means to display the next days diary on the screen. 
  This will occur at midnight when the appointment list is updated.")
  
--- 819,823 ----
  
  (defvar appt-display-diary t "\
! *Non-nil means to display the next days diary on the screen.
  This will occur at midnight when the appointment list is updated.")
  
*************** This will occur at midnight when the app
*** 746,750 ****
  ;;;***
  
! ;;;### (autoloads (apropos-documentation apropos-value apropos apropos-command) "apropos" "apropos.el" (12305 5489))
  ;;; Generated autoloads from apropos.el
  
--- 826,830 ----
  ;;;***
  
! ;;;### (autoloads (apropos-documentation apropos-value apropos apropos-command) "apropos" "apropos.el" (12682 43347))
  ;;; Generated autoloads from apropos.el
  
*************** Returns list of symbols and values found
*** 769,773 ****
  
  (autoload (quote apropos-documentation) "apropos" "\
! Show symbols whose names or documentation contain matches for REGEXP.
  With optional prefix ARG or if `apropos-do-all' is non-nil, also use
  documentation that is not stored in the documentation file and show key
--- 849,853 ----
  
  (autoload (quote apropos-documentation) "apropos" "\
! Show symbols whose documentation contain matches for REGEXP.
  With optional prefix ARG or if `apropos-do-all' is non-nil, also use
  documentation that is not stored in the documentation file and show key
*************** Returns list of symbols and documentatio
*** 777,781 ****
  ;;;***
  
! ;;;### (autoloads (archive-mode) "arc-mode" "arc-mode.el" (12437 9405))
  ;;; Generated autoloads from arc-mode.el
  
--- 857,861 ----
  ;;;***
  
! ;;;### (autoloads (archive-mode) "arc-mode" "arc-mode.el" (12536 45574))
  ;;; Generated autoloads from arc-mode.el
  
*************** archive.
*** 795,799 ****
  ;;;***
  
! ;;;### (autoloads (asm-mode) "asm-mode" "asm-mode.el" (12145 57463))
  ;;; Generated autoloads from asm-mode.el
  
--- 875,879 ----
  ;;;***
  
! ;;;### (autoloads (asm-mode) "asm-mode" "asm-mode.el" (12536 45574))
  ;;; Generated autoloads from asm-mode.el
  
*************** Special commands:
*** 821,825 ****
  ;;;***
  
! ;;;### (autoloads (auto-show-mode) "auto-show" "auto-show.el" (12437 471))
  ;;; Generated autoloads from auto-show.el
  
--- 901,905 ----
  ;;;***
  
! ;;;### (autoloads (auto-show-mode) "auto-show" "auto-show.el" (12437 479))
  ;;; Generated autoloads from auto-show.el
  
*************** With arg, turn auto scrolling on if arg 
*** 830,834 ****
  ;;;***
  
! ;;;### (autoloads (define-auto-insert auto-insert) "autoinsert" "autoinsert.el" (12285 35264))
  ;;; Generated autoloads from autoinsert.el
  
--- 910,914 ----
  ;;;***
  
! ;;;### (autoloads (define-auto-insert auto-insert) "autoinsert" "autoinsert.el" (12537 60155))
  ;;; Generated autoloads from autoinsert.el
  
*************** or if CONDITION had no actions, after al
*** 844,848 ****
  ;;;***
  
! ;;;### (autoloads (batch-update-autoloads update-directory-autoloads update-autoloads-here update-file-autoloads) "autoload" "autoload.el" (12285 34483))
  ;;; Generated autoloads from autoload.el
  
--- 924,928 ----
  ;;;***
  
! ;;;### (autoloads (batch-update-autoloads update-autoloads-from-directory update-file-autoloads) "autoload" "autoload.el" (12543 11408))
  ;;; Generated autoloads from autoload.el
  
*************** Update the autoloads for FILE in `genera
*** 851,870 ****
  \(which FILE might bind in its local variables)." t nil)
  
! (autoload (quote update-autoloads-here) "autoload" "\
! Update sections of the current buffer generated by \\[update-file-autoloads]." t nil)
! 
! (autoload (quote update-directory-autoloads) "autoload" "\
! Run \\[update-file-autoloads] on each .el file in DIR." t nil)
  
  (autoload (quote batch-update-autoloads) "autoload" "\
! Update the autoloads for the files or directories on the command line.
! Runs \\[update-file-autoloads] on files and \\[update-directory-autoloads]
! on directories.  Must be used only with -batch, and kills Emacs on completion.
! Each file will be processed even if an error occurred previously.
! For example, invoke `emacs -batch -f batch-update-autoloads *.el'." nil nil)
  
  ;;;***
  
! ;;;### (autoloads (mouse-avoidance-mode) "avoid" "avoid.el" (12437 508))
  ;;; Generated autoloads from avoid.el
  
--- 931,945 ----
  \(which FILE might bind in its local variables)." t nil)
  
! (autoload (quote update-autoloads-from-directory) "autoload" "\
! Update loaddefs.el with all the current autoloads from DIR, and no old ones.
! This uses `update-file-autoloads' (which see) do its work." t nil)
  
  (autoload (quote batch-update-autoloads) "autoload" "\
! Update loaddefs.el autoloads in batch mode.
! Calls `update-autoloads-from-directory' on each command line argument." nil nil)
  
  ;;;***
  
! ;;;### (autoloads (mouse-avoidance-mode) "avoid" "avoid.el" (12633 49973))
  ;;; Generated autoloads from avoid.el
  
*************** definition of \"random distance\".)" t n
*** 896,900 ****
  ;;;***
  
! ;;;### (autoloads (awk-mode) "awk-mode" "awk-mode.el" (12116 38333))
  ;;; Generated autoloads from awk-mode.el
  
--- 971,975 ----
  ;;;***
  
! ;;;### (autoloads (awk-mode) "awk-mode" "awk-mode.el" (12536 45574))
  ;;; Generated autoloads from awk-mode.el
  
*************** with no args, if that value is non-nil."
*** 910,914 ****
  ;;;***
  
! ;;;### (autoloads (backquote) "backquote" "backquote.el" (12437 592))
  ;;; Generated autoloads from backquote.el
  
--- 985,989 ----
  ;;;***
  
! ;;;### (autoloads (backquote) "backquote" "backquote.el" (12704 56580))
  ;;; Generated autoloads from backquote.el
  
*************** Vectors work just like lists.  Nested ba
*** 932,940 ****
  ;;;***
  
! ;;;### (autoloads (bibtex-mode) "bibtex" "bibtex.el" (12322 49197))
  ;;; Generated autoloads from bibtex.el
  
  (autoload (quote bibtex-mode) "bibtex" "\
  Major mode for editing BibTeX files.
  
  \\{bibtex-mode-map}
--- 1007,1020 ----
  ;;;***
  
! ;;;### (autoloads (bibtex-mode) "bibtex" "bibtex.el" (12608 29069))
  ;;; Generated autoloads from bibtex.el
  
  (autoload (quote bibtex-mode) "bibtex" "\
  Major mode for editing BibTeX files.
+ To submit a problem report, enter `\\[bibtex-submit-bug-report]' from a
+ bibtex-mode buffer.  This automatically sets up a mail buffer with
+ version information already added.  You just need to add a description
+ of the problem, including a reproducable test case and send the
+ message.
  
  \\{bibtex-mode-map}
*************** non-nil." t nil)
*** 993,997 ****
  ;;;***
  
! ;;;### (autoloads (blackbox) "blackbox" "blackbox.el" (11356 18211))
  ;;; Generated autoloads from blackbox.el
  
--- 1073,1077 ----
  ;;;***
  
! ;;;### (autoloads (blackbox) "blackbox" "blackbox.el" (12536 45574))
  ;;; Generated autoloads from blackbox.el
  
*************** Note carefully the relative positions of
*** 1062,1074 ****
  degree deflection it causes.
  
!     1                                            
!   - * - - - - - -         - - - - - - - -         - - - - - - - -       
!   - * - - - - - -         - - - - - - - -         - - - - - - - -       
! 1 * * - - - - - -         - - - - - - - -         - O - - - - O -       
    - - O - - - - -         - - O - - - - -         - - * * * * - -
    - - - - - - - -         - - - * * * * * 2     3 * * * - - * - -
!   - - - - - - - -         - - - * - - - -         - - - O - * - -      
!   - - - - - - - -         - - - * - - - -         - - - - * * - -       
!   - - - - - - - -         - - - * - - - -         - - - - * - O -       
                                  2                         3
  
--- 1142,1154 ----
  degree deflection it causes.
  
!     1
!   - * - - - - - -         - - - - - - - -         - - - - - - - -
!   - * - - - - - -         - - - - - - - -         - - - - - - - -
! 1 * * - - - - - -         - - - - - - - -         - O - - - - O -
    - - O - - - - -         - - O - - - - -         - - * * * * - -
    - - - - - - - -         - - - * * * * * 2     3 * * * - - * - -
!   - - - - - - - -         - - - * - - - -         - - - O - * - -
!   - - - - - - - -         - - - * - - - -         - - - - * * - -
!   - - - - - - - -         - - - * - - - -         - - - - * - O -
                                  2                         3
  
*************** As mentioned above, a reflection occurs 
*** 1076,1080 ****
  it was sent in.  This can happen in several ways:
  
!                                                                            
    - - - - - - - -         - - - - - - - -          - - - - - - - -
    - - - - O - - -         - - O - O - - -          - - - - - - - -
--- 1156,1160 ----
  it was sent in.  This can happen in several ways:
  
! 
    - - - - - - - -         - - - - - - - -          - - - - - - - -
    - - - - O - - -         - - O - O - - -          - - - - - - - -
*************** a reflection." t nil)
*** 1110,1114 ****
  ;;;***
  
! ;;;### (autoloads (bookmark-menu-delete bookmark-menu-rename bookmark-menu-locate bookmark-menu-jump bookmark-menu-insert bookmark-bmenu-list bookmark-load bookmark-save bookmark-write bookmark-delete bookmark-insert bookmark-rename bookmark-insert-location bookmark-relocate bookmark-jump bookmark-set) "bookmark" "bookmark.el" (12339 39506))
  ;;; Generated autoloads from bookmark.el
  
--- 1190,1194 ----
  ;;;***
  
! ;;;### (autoloads (bookmark-menu-delete bookmark-menu-rename bookmark-menu-locate bookmark-menu-jump bookmark-menu-insert bookmark-bmenu-list bookmark-load bookmark-save bookmark-write bookmark-delete bookmark-insert bookmark-rename bookmark-insert-location bookmark-relocate bookmark-jump bookmark-set) "bookmark" "bookmark.el" (12689 4676))
  ;;; Generated autoloads from bookmark.el
  
*************** of the old one in the permanent bookmark
*** 1186,1193 ****
  
  (autoload (quote bookmark-relocate) "bookmark" "\
! Relocate BOOKMARK -- prompts for a filename, and makes an already
! existing bookmark point to that file, instead of the one it used to
! point at.  Useful when a file has been renamed after a bookmark was
! set in it." t nil)
  
  (autoload (quote bookmark-insert-location) "bookmark" "\
--- 1266,1273 ----
  
  (autoload (quote bookmark-relocate) "bookmark" "\
! Relocate BOOKMARK to another file (reading file name with minibuffer).
! This makes an already existing bookmark point to that file, instead of
! the one it used to point at.  Useful when a file has been renamed
! after a bookmark was set in it." t nil)
  
  (autoload (quote bookmark-insert-location) "bookmark" "\
*************** Optional second arg NO-HISTORY means don
*** 1196,1210 ****
  minibuffer history list `bookmark-history'." t nil)
  
  (autoload (quote bookmark-rename) "bookmark" "\
! Change the name of OLD bookmark to NEW name.  If called from
! keyboard, prompts for OLD and NEW.  If called from menubar, OLD is
! selected from a menu, and prompts for NEW.
  
! If called from Lisp, prompts for NEW if only OLD was passed as an
  argument.  If called with two strings, then no prompting is done.  You
  must pass at least OLD when calling from Lisp.
  
  While you are entering the new name, consecutive C-w's insert
! consectutive words from the text of the buffer into the new bookmark
  name." t nil)
  
--- 1276,1292 ----
  minibuffer history list `bookmark-history'." t nil)
  
+ (defalias (quote bookmark-locate) (quote bookmark-insert-location))
+ 
  (autoload (quote bookmark-rename) "bookmark" "\
! Change the name of OLD bookmark to NEW name.
! If called from keyboard, prompt for OLD and NEW.  If called from
! menubar, select OLD from a menu and prompt for NEW.
  
! If called from Lisp, prompt for NEW if only OLD was passed as an
  argument.  If called with two strings, then no prompting is done.  You
  must pass at least OLD when calling from Lisp.
  
  While you are entering the new name, consecutive C-w's insert
! consecutive words from the text of the buffer into the new bookmark
  name." t nil)
  
*************** probably because we were called from the
*** 1226,1232 ****
  
  (autoload (quote bookmark-write) "bookmark" "\
! Write bookmarks to a file (for which the user will be prompted
! interactively).  Don't use this in Lisp programs; use bookmark-save
! instead." t nil)
  
  (autoload (quote bookmark-save) "bookmark" "\
--- 1308,1313 ----
  
  (autoload (quote bookmark-write) "bookmark" "\
! Write bookmarks to a file (reading the file name with the minibuffer).
! Don't use this in Lisp programs; use `bookmark-save' instead." t nil)
  
  (autoload (quote bookmark-save) "bookmark" "\
*************** is done.  You must pass at least OLD-BOO
*** 1311,1315 ****
  
  While you are entering the new name, consecutive C-w's insert
! consectutive words from the text of the buffer into the new bookmark
  name.
  
--- 1392,1396 ----
  
  While you are entering the new name, consecutive C-w's insert
! consecutive words from the text of the buffer into the new bookmark
  name.
  
*************** corresponding bookmark function from Lis
*** 1333,1341 ****
  (defalias (quote menu-bar-bookmark-map) (symbol-value (quote menu-bar-bookmark-map)))
  
! (define-key menu-bar-bookmark-map [load] (quote ("Load a Bookmark File" . bookmark-load)))
  
! (define-key menu-bar-bookmark-map [write] (quote ("Write (to another file)" . bookmark-write)))
  
! (define-key menu-bar-bookmark-map [save] (quote ("Save  (in default file)" . bookmark-save)))
  
  (define-key menu-bar-bookmark-map [edit] (quote ("Edit Bookmark List" . bookmark-bmenu-list)))
--- 1414,1422 ----
  (defalias (quote menu-bar-bookmark-map) (symbol-value (quote menu-bar-bookmark-map)))
  
! (define-key menu-bar-bookmark-map [load] (quote ("Load a Bookmark File..." . bookmark-load)))
  
! (define-key menu-bar-bookmark-map [write] (quote ("Save Bookmarks As..." . bookmark-write)))
  
! (define-key menu-bar-bookmark-map [save] (quote ("Save Bookmarks" . bookmark-save)))
  
  (define-key menu-bar-bookmark-map [edit] (quote ("Edit Bookmark List" . bookmark-bmenu-list)))
*************** corresponding bookmark function from Lis
*** 1355,1359 ****
  ;;;***
  
! ;;;### (autoloads (batch-byte-recompile-directory batch-byte-compile display-call-tree byte-compile compile-defun byte-compile-file byte-recompile-directory byte-force-recompile) "bytecomp" "bytecomp.el" (12451 35049))
  ;;; Generated autoloads from bytecomp.el
  
--- 1436,1470 ----
  ;;;***
  
! ;;;### (autoloads (browse-url-of-dired-file browse-url-of-buffer browse-url-of-file browse-url-at-mouse browse-url-at-point) "browse-url" "browse-url.el" (12599 60492))
! ;;; Generated autoloads from browse-url.el
! 
! (autoload (quote browse-url-at-point) "browse-url" "\
! Ask a WWW browser to load the URL at or before point.
! The URL is loaded according to the value of `browse-url-browser-function'." t nil)
! 
! (autoload (quote browse-url-at-mouse) "browse-url" "\
! Ask a WWW browser to load a URL clicked with the mouse.
! The URL is the one around or before the position of the mouse click
! but point is not changed.  The URL is loaded according to the value of
! `browse-url-browser-function'." t nil)
! 
! (autoload (quote browse-url-of-file) "browse-url" "\
! Ask a WWW browser to display FILE.
! Display the current buffer's file if FILE is nil or if called
! interactively.  Turn the filename into a URL by performing
! replacements given in variable `browse-url-filename-alist'.  Pass the
! URL to a browser using variable `browse-url-browser-function' then run
! `browse-url-of-file-hook'." t nil)
! 
! (autoload (quote browse-url-of-buffer) "browse-url" "\
! Ask a WWW browser to display BUFFER.
! Display the current buffer if BUFFER is nil." t nil)
! 
! (autoload (quote browse-url-of-dired-file) "browse-url" "\
! In Dired, ask a WWW browser to display the file named on this line." t nil)
! 
! ;;;***
! 
! ;;;### (autoloads (batch-byte-recompile-directory batch-byte-compile display-call-tree byte-compile compile-defun byte-compile-file byte-recompile-directory byte-force-recompile) "bytecomp" "bytecomp.el" (12649 17674))
  ;;; Generated autoloads from bytecomp.el
  
*************** For example, invoke `emacs -batch -f bat
*** 1420,1424 ****
  ;;;***
  
! ;;;### (autoloads nil "cal-dst" "cal-dst.el" (12384 54305))
  ;;; Generated autoloads from cal-dst.el
  
--- 1531,1535 ----
  ;;;***
  
! ;;;### (autoloads nil "cal-dst" "cal-dst.el" (12536 45574))
  ;;; Generated autoloads from cal-dst.el
  
*************** For example, invoke `emacs -batch -f bat
*** 1429,1433 ****
  ;;;***
  
! ;;;### (autoloads (list-yahrzeit-dates) "cal-hebrew" "cal-hebrew.el" (12384 54943))
  ;;; Generated autoloads from cal-hebrew.el
  
--- 1540,1544 ----
  ;;;***
  
! ;;;### (autoloads (list-yahrzeit-dates) "cal-hebrew" "cal-hebrew.el" (12536 45574))
  ;;; Generated autoloads from cal-hebrew.el
  
*************** from the cursor position." t nil)
*** 1439,1443 ****
  ;;;***
  
! ;;;### (autoloads (calendar) "calendar" "calendar.el" (12413 13265))
  ;;; Generated autoloads from calendar.el
  
--- 1550,1554 ----
  ;;;***
  
! ;;;### (autoloads (calendar) "calendar" "calendar.el" (12704 37201))
  ;;; Generated autoloads from calendar.el
  
*************** causes the diary entry \"Vacation\" to a
*** 1630,1636 ****
  `diary-hebrew-date', `diary-islamic-date', `diary-mayan-date',
  `diary-chinese-date', `diary-coptic-date', `diary-ethiopic-date',
! `diary-yahrzeit', `diary-sunrise-sunset', `diary-phases-of-moon',
! `diary-parasha', `diary-omer', `diary-rosh-hodesh', and
! `diary-sabbath-candles'.  See the documentation for the function
  `list-sexp-diary-entries' for more details.
  
--- 1741,1747 ----
  `diary-hebrew-date', `diary-islamic-date', `diary-mayan-date',
  `diary-chinese-date', `diary-coptic-date', `diary-ethiopic-date',
! `diary-persian-date', `diary-yahrzeit', `diary-sunrise-sunset',
! `diary-phases-of-moon', `diary-parasha', `diary-omer', `diary-rosh-hodesh',
! and `diary-sabbath-candles'.  See the documentation for the function
  `list-sexp-diary-entries' for more details.
  
*************** somewhat; setting it to nil makes the di
*** 1797,1801 ****
  (put (quote general-holidays) (quote risky-local-variable) t)
  
! (defvar general-holidays (quote ((holiday-fixed 1 1 "New Year's Day") (holiday-float 1 1 3 "Martin Luther King Day") (holiday-fixed 2 2 "Ground Hog Day") (holiday-fixed 2 14 "Valentine's Day") (holiday-float 2 1 3 "President's Day") (holiday-fixed 3 17 "St. Patrick's Day") (holiday-fixed 4 1 "April Fool's Day") (holiday-float 5 0 2 "Mother's Day") (holiday-float 5 1 -1 "Memorial Day") (holiday-fixed 6 14 "Flag Day") (holiday-float 6 0 3 "Father's Day") (holiday-fixed 7 4 "Independence Day") (holiday-float 9 1 1 "Labor Day") (holiday-float 10 1 2 "Columbus Day") (holiday-fixed 10 31 "Halloween") (holiday-fixed 11 11 "Veteran's Day") (holiday-float 11 4 4 "Thanksgiving"))) "\
  *General holidays.  Default value is for the United States.
  See the documentation for `calendar-holidays' for details.")
--- 1908,1912 ----
  (put (quote general-holidays) (quote risky-local-variable) t)
  
! (defvar general-holidays (quote ((holiday-fixed 1 1 "New Year's Day") (holiday-float 1 1 3 "Martin Luther King Day") (holiday-fixed 2 2 "Ground Hog Day") (holiday-fixed 2 14 "Valentine's Day") (holiday-float 2 1 3 "President's Day") (holiday-fixed 3 17 "St. Patrick's Day") (holiday-fixed 4 1 "April Fools' Day") (holiday-float 5 0 2 "Mother's Day") (holiday-float 5 1 -1 "Memorial Day") (holiday-fixed 6 14 "Flag Day") (holiday-float 6 0 3 "Father's Day") (holiday-fixed 7 4 "Independence Day") (holiday-float 9 1 1 "Labor Day") (holiday-float 10 1 2 "Columbus Day") (holiday-fixed 10 31 "Halloween") (holiday-fixed 11 11 "Veteran's Day") (holiday-float 11 4 4 "Thanksgiving"))) "\
  *General holidays.  Default value is for the United States.
  See the documentation for `calendar-holidays' for details.")
*************** See the documentation for `calendar-holi
*** 1864,1868 ****
  The frame set up of the calendar.
  The choices are `one-frame' (calendar and diary together in one separate,
! dediciated frame) or `two-frames' (calendar and diary in separate, dedicated
  frames); with any other value the current frame is used.")
  
--- 1975,1979 ----
  The frame set up of the calendar.
  The choices are `one-frame' (calendar and diary together in one separate,
! dedicated frame) or `two-frames' (calendar and diary in separate, dedicated
  frames); with any other value the current frame is used.")
  
*************** The original function `calendar' has bee
*** 1873,1877 ****
  ;;;***
  
! ;;;### (autoloads (set-case-syntax set-case-syntax-pair set-case-syntax-delims copy-case-table describe-buffer-case-table) "case-table" "case-table.el" (12435 57930))
  ;;; Generated autoloads from case-table.el
  
--- 1984,1988 ----
  ;;;***
  
! ;;;### (autoloads (set-case-syntax set-case-syntax-pair set-case-syntax-delims copy-case-table describe-buffer-case-table) "case-table" "case-table.el" (12536 45574))
  ;;; Generated autoloads from case-table.el
  
*************** SYNTAX should be \" \", \"w\", \".\" or 
*** 1904,1910 ****
  ;;;***
  
! ;;;### (autoloads (objc-mode c-mode c++-mode) "cc-mode" "cc-mode.el" (12435 61040))
  ;;; Generated autoloads from cc-mode.el
  
  (autoload (quote c++-mode) "cc-mode" "\
  Major mode for editing C++ code.
--- 2015,2037 ----
  ;;;***
  
! ;;;### (autoloads (c-set-style java-mode objc-mode c++-mode c-mode) "cc-mode" "cc-mode.el" (12697 61020))
  ;;; Generated autoloads from cc-mode.el
  
+ (autoload (quote c-mode) "cc-mode" "\
+ Major mode for editing K&R and ANSI C code.
+ To submit a problem report, enter `\\[c-submit-bug-report]' from a
+ c-mode buffer.  This automatically sets up a mail buffer with version
+ information already added.  You just need to add a description of the
+ problem, including a reproducible test case and send the message.
+ 
+ To see what version of cc-mode you are running, enter `\\[c-version]'.
+ 
+ The hook variable `c-mode-hook' is run with no args, if that value is
+ bound and has a non-nil value.  Also the hook `c-mode-common-hook' is
+ run first.
+ 
+ Key bindings:
+ \\{c-mode-map}" t nil)
+ 
  (autoload (quote c++-mode) "cc-mode" "\
  Major mode for editing C++ code.
*************** To submit a problem report, enter `\\[c-
*** 1912,1978 ****
  c++-mode buffer.  This automatically sets up a mail buffer with
  version information already added.  You just need to add a description
! of the problem, including a reproducable test case and send the
  message.
  
  To see what version of cc-mode you are running, enter `\\[c-version]'.
  
- Note that the details of configuring c++-mode have been moved to the
- accompanying texinfo manual (which is not yet completed -- volunteers
- are welcome).  Until then, please read the README file that came with
- the cc-mode distribution.
- 
  The hook variable `c++-mode-hook' is run with no args, if that
! variable is bound and has a non-nil value.  Also the common hook
! c-mode-common-hook is run first, by this defun, `c-mode', and `objc-mode'.
  
  Key bindings:
  \\{c++-mode-map}" t nil)
  
! (autoload (quote c-mode) "cc-mode" "\
! Major mode for editing K&R and ANSI C code.
! To submit a problem report, enter `\\[c-submit-bug-report]' from a
! c-mode buffer.  This automatically sets up a mail buffer with version
! information already added.  You just need to add a description of the
! problem, including a reproducable test case and send the message.
  
  To see what version of cc-mode you are running, enter `\\[c-version]'.
  
! Note that the details of configuring c-mode have been moved to the
! accompanying texinfo manual (which is not yet completed -- volunteers
! are welcome).  Until then, please read the README file that came with
! the cc-mode distribution.
! 
! The hook variable `c-mode-hook' is run with no args, if that value is
! bound and has a non-nil value.  Also the common hook
! c-mode-common-hook is run first, by this defun, `c++-mode', and `objc-mode'.
  
  Key bindings:
! \\{c-mode-map}" t nil)
  
! (autoload (quote objc-mode) "cc-mode" "\
! Major mode for editing Objective C code.
  To submit a problem report, enter `\\[c-submit-bug-report]' from an
! objc-mode buffer.  This automatically sets up a mail buffer with
  version information already added.  You just need to add a description
! of the problem, including a reproducable test case and send the
  message.
  
  To see what version of cc-mode you are running, enter `\\[c-version]'.
  
! Note that the details of configuring objc-mode have been moved to the
! accompanying texinfo manual (which is not yet completed -- volunteers
! are welcome).  Until then, please read the README file that came with
! the cc-mode distribution.
! 
! The hook variable `objc-mode-hook' is run with no args, if that value
  is bound and has a non-nil value.  Also the common hook
! c-mode-common-hook is run first, by this defun, `c-mode', and `c++-mode'.
  
  Key bindings:
! \\{objc-mode-map}" t nil)
  
  ;;;***
  
! ;;;### (autoloads (command-history-mode list-command-history repeat-matching-complex-command) "chistory" "chistory.el" (11942 52235))
  ;;; Generated autoloads from chistory.el
  
--- 2039,2098 ----
  c++-mode buffer.  This automatically sets up a mail buffer with
  version information already added.  You just need to add a description
! of the problem, including a reproducible test case, and send the
  message.
  
  To see what version of cc-mode you are running, enter `\\[c-version]'.
  
  The hook variable `c++-mode-hook' is run with no args, if that
! variable is bound and has a non-nil value.  Also the hook
! `c-mode-common-hook' is run first.
  
  Key bindings:
  \\{c++-mode-map}" t nil)
  
! (autoload (quote objc-mode) "cc-mode" "\
! Major mode for editing Objective C code.
! To submit a problem report, enter `\\[c-submit-bug-report]' from an
! objc-mode buffer.  This automatically sets up a mail buffer with
! version information already added.  You just need to add a description
! of the problem, including a reproducible test case, and send the
! message.
  
  To see what version of cc-mode you are running, enter `\\[c-version]'.
  
! The hook variable `objc-mode-hook' is run with no args, if that value
! is bound and has a non-nil value.  Also the hook `c-mode-common-hook'
! is run first.
  
  Key bindings:
! \\{objc-mode-map}" t nil)
  
! (autoload (quote java-mode) "cc-mode" "\
! Major mode for editing Java code.
  To submit a problem report, enter `\\[c-submit-bug-report]' from an
! java-mode buffer.  This automatically sets up a mail buffer with
  version information already added.  You just need to add a description
! of the problem, including a reproducible test case and send the
  message.
  
  To see what version of cc-mode you are running, enter `\\[c-version]'.
  
! The hook variable `java-mode-hook' is run with no args, if that value
  is bound and has a non-nil value.  Also the common hook
! `c-mode-common-hook' is run first.
  
  Key bindings:
! \\{java-mode-map}" t nil)
! 
! (autoload (quote c-set-style) "cc-mode" "\
! Set cc-mode variables to use one of several different indentation styles.
! STYLENAME is a string representing the desired style from the list of
! styles described in the variable `c-style-alist'.  See that variable
! for details of setting up styles." t nil)
! (fset 'set-c-style           'c-set-style)
  
  ;;;***
  
! ;;;### (autoloads (command-history-mode list-command-history repeat-matching-complex-command) "chistory" "chistory.el" (12536 45574))
  ;;; Generated autoloads from chistory.el
  
*************** The Command History listing is recompute
*** 2006,2010 ****
  ;;;***
  
! ;;;### (autoloads (common-lisp-indent-function) "cl-indent" "cl-indent.el" (11285 49748))
  ;;; Generated autoloads from cl-indent.el
  
--- 2126,2130 ----
  ;;;***
  
! ;;;### (autoloads (common-lisp-indent-function) "cl-indent" "cl-indent.el" (12536 45574))
  ;;; Generated autoloads from cl-indent.el
  
*************** The Command History listing is recompute
*** 2013,2017 ****
  ;;;***
  
! ;;;### (autoloads (run-scheme) "cmuscheme" "cmuscheme.el" (12338 795))
  ;;; Generated autoloads from cmuscheme.el
  
--- 2133,2137 ----
  ;;;***
  
! ;;;### (autoloads (run-scheme) "cmuscheme" "cmuscheme.el" (12536 45574))
  ;;; Generated autoloads from cmuscheme.el
  
*************** of `scheme-program-name').  Runs the hoo
*** 2023,2031 ****
  \(after the `comint-mode-hook' is run).
  \(Type \\[describe-mode] in the process buffer for a list of commands.)" t nil)
! (add-hook 'same-window-buffer-names "*scheme*")
  
  ;;;***
  
! ;;;### (autoloads (comint-run make-comint) "comint" "comint.el" (12423 63603))
  ;;; Generated autoloads from comint.el
  
--- 2143,2151 ----
  \(after the `comint-mode-hook' is run).
  \(Type \\[describe-mode] in the process buffer for a list of commands.)" t nil)
!  (add-hook 'same-window-buffer-names "*scheme*")
  
  ;;;***
  
! ;;;### (autoloads (comint-run make-comint) "comint" "comint.el" (12620 12215))
  ;;; Generated autoloads from comint.el
  
*************** See `make-comint' and `comint-exec'." t 
*** 2050,2054 ****
  ;;;***
  
! ;;;### (autoloads (compare-windows) "compare-w" "compare-w.el" (11983 50606))
  ;;; Generated autoloads from compare-w.el
  
--- 2170,2174 ----
  ;;;***
  
! ;;;### (autoloads (compare-windows) "compare-w" "compare-w.el" (12536 45574))
  ;;; Generated autoloads from compare-w.el
  
*************** If `compare-ignore-case' is non-nil, cha
*** 2070,2074 ****
  ;;;***
  
! ;;;### (autoloads (next-error compilation-minor-mode grep compile) "compile" "compile.el" (12409 27006))
  ;;; Generated autoloads from compile.el
  
--- 2190,2194 ----
  ;;;***
  
! ;;;### (autoloads (next-error compilation-minor-mode compilation-mode grep compile) "compile" "compile.el" (12673 10114))
  ;;; Generated autoloads from compile.el
  
*************** This command uses a special history list
*** 2122,2129 ****
  easily repeat a grep command." t nil)
  
  (autoload (quote compilation-minor-mode) "compile" "\
  Toggle compilation minor mode.
  With arg, turn compilation mode on if and only if arg is positive.
! See `compilation-mode'." t nil)
  
  (autoload (quote next-error) "compile" "\
--- 2242,2258 ----
  easily repeat a grep command." t nil)
  
+ (autoload (quote compilation-mode) "compile" "\
+ Major mode for compilation log buffers.
+ \\<compilation-mode-map>To visit the source for a line-numbered error,
+ move point to the error message line and type \\[compile-goto-error].
+ To kill the compilation, type \\[kill-compilation].
+ 
+ Runs `compilation-mode-hook' with `run-hooks' (which see)." t nil)
+ 
  (autoload (quote compilation-minor-mode) "compile" "\
  Toggle compilation minor mode.
  With arg, turn compilation mode on if and only if arg is positive.
! See `compilation-mode'.
! Turning the mode on runs the normal hook `compilation-minor-mode-hook'." t nil)
  
  (autoload (quote next-error) "compile" "\
*************** processing errors from that compilation.
*** 2147,2155 ****
  See variables `compilation-parse-errors-function' and
  `compilation-error-regexp-alist' for customization ideas." t nil)
! (define-key ctl-x-map "`" 'next-error)
  
  ;;;***
  
! ;;;### (autoloads (shuffle-vector cookie-snarf cookie-insert cookie) "cookie1" "cookie1.el" (11418 1804))
  ;;; Generated autoloads from cookie1.el
  
--- 2276,2284 ----
  See variables `compilation-parse-errors-function' and
  `compilation-error-regexp-alist' for customization ideas." t nil)
!  (define-key ctl-x-map "`" 'next-error)
  
  ;;;***
  
! ;;;### (autoloads (shuffle-vector cookie-snarf cookie-insert cookie) "cookie1" "cookie1.el" (12550 52684))
  ;;; Generated autoloads from cookie1.el
  
*************** Randomly permute the elements of VECTOR 
*** 2172,2176 ****
  ;;;***
  
! ;;;### (autoloads (copyright copyright-update) "copyright" "copyright.el" (12292 1171))
  ;;; Generated autoloads from copyright.el
  
--- 2301,2305 ----
  ;;;***
  
! ;;;### (autoloads (copyright copyright-update) "copyright" "copyright.el" (12536 45574))
  ;;; Generated autoloads from copyright.el
  
*************** Insert a copyright by $ORGANIZATION noti
*** 2187,2191 ****
  ;;;***
  
! ;;;### (autoloads (cpp-parse-edit cpp-highlight-buffer) "cpp" "cpp.el" (12180 44882))
  ;;; Generated autoloads from cpp.el
  
--- 2316,2320 ----
  ;;;***
  
! ;;;### (autoloads (cpp-parse-edit cpp-highlight-buffer) "cpp" "cpp.el" (12557 20426))
  ;;; Generated autoloads from cpp.el
  
*************** Edit display information for cpp conditi
*** 2201,2205 ****
  ;;;***
  
! ;;;### (autoloads (dabbrev-expand dabbrev-completion) "dabbrev" "dabbrev.el" (12424 2787))
  ;;; Generated autoloads from dabbrev.el
  
--- 2330,2334 ----
  ;;;***
  
! ;;;### (autoloads (dabbrev-expand dabbrev-completion) "dabbrev" "dabbrev.el" (12550 33268))
  ;;; Generated autoloads from dabbrev.el
  
*************** See also `dabbrev-abbrev-char-regexp' an
*** 2246,2250 ****
  ;;;***
  
! ;;;### (autoloads (cancel-debug-on-entry debug-on-entry debug) "debug" "debug.el" (12141 3542))
  ;;; Generated autoloads from debug.el
  
--- 2375,2379 ----
  ;;;***
  
! ;;;### (autoloads (cancel-debug-on-entry debug-on-entry debug) "debug" "debug.el" (12536 45574))
  ;;; Generated autoloads from debug.el
  
*************** If argument is nil or an empty string, c
*** 2274,2278 ****
  ;;;***
  
! ;;;### (autoloads (delete-selection-mode) "delsel" "delsel.el" (12373 62512))
  ;;; Generated autoloads from delsel.el
  
--- 2403,2431 ----
  ;;;***
  
! ;;;### (autoloads (decipher-mode decipher) "decipher" "decipher.el" (12590 21179))
! ;;; Generated autoloads from decipher.el
! 
! (autoload (quote decipher) "decipher" "\
! Format a buffer of ciphertext for cryptanalysis and enter Decipher mode." t nil)
! 
! (autoload (quote decipher-mode) "decipher" "\
! Major mode for decrypting monoalphabetic substitution ciphers.
! Lower-case letters enter plaintext.
! Upper-case letters are commands.
! 
! The buffer is made read-only so that normal Emacs commands cannot
! modify it.
! 
! The most useful commands are:
! \\<decipher-mode-map>
! \\[decipher-digram-list]  Display a list of all digrams & their frequency
! \\[decipher-frequency-count]  Display the frequency of each ciphertext letter
! \\[decipher-adjacency-list]  Show adjacency list for current letter (lists letters appearing next to it)
! \\[decipher-make-checkpoint]  Save the current cipher alphabet (checkpoint)
! \\[decipher-restore-checkpoint]  Restore a saved cipher alphabet (checkpoint)" t nil)
! 
! ;;;***
! 
! ;;;### (autoloads (delete-selection-mode) "delsel" "delsel.el" (12536 45574))
  ;;; Generated autoloads from delsel.el
  
*************** When OFF, typed text is just inserted at
*** 2286,2290 ****
  ;;;***
  
! ;;;### (autoloads (derived-mode-init-mode-variables define-derived-mode) "derived" "derived.el" (12425 54367))
  ;;; Generated autoloads from derived.el
  
--- 2439,2443 ----
  ;;;***
  
! ;;;### (autoloads (derived-mode-init-mode-variables define-derived-mode) "derived" "derived.el" (12704 56747))
  ;;; Generated autoloads from derived.el
  
*************** the first time the mode is used." nil ni
*** 2328,2332 ****
  ;;;***
  
! ;;;### (autoloads (diary) "diary-lib" "diary-lib.el" (12470 43759))
  ;;; Generated autoloads from diary-lib.el
  
--- 2481,2485 ----
  ;;;***
  
! ;;;### (autoloads (diary) "diary-lib" "diary-lib.el" (12704 37365))
  ;;; Generated autoloads from diary-lib.el
  
*************** execution in a `.emacs' file." t nil)
*** 2339,2343 ****
  ;;;***
  
! ;;;### (autoloads (diff-backup diff) "diff" "diff.el" (11949 32903))
  ;;; Generated autoloads from diff.el
  
--- 2492,2496 ----
  ;;;***
  
! ;;;### (autoloads (diff-backup diff) "diff" "diff.el" (12536 45574))
  ;;; Generated autoloads from diff.el
  
*************** The backup file is the first file given 
*** 2356,2360 ****
  ;;;***
  
! ;;;### (autoloads (dired-noselect dired-other-frame dired-other-window dired) "dired" "dired.el" (12374 5214))
  ;;; Generated autoloads from dired.el
  
--- 2509,2513 ----
  ;;;***
  
! ;;;### (autoloads (dired-noselect dired-other-frame dired-other-window dired) "dired" "dired.el" (12645 28719))
  ;;; Generated autoloads from dired.el
  
*************** may contain even `F', `b', `i' and `s'. 
*** 2365,2374 ****
  `dired-ls-F-marks-symlinks' concerning the `F' switch.")
  
! (defvar dired-chown-program (if (memq system-type (quote (hpux dgux usg-unix-v irix linux))) "chown" "/etc/chown") "\
  Name of chown command (usually `chown' or `/etc/chown').")
  
  (defvar dired-ls-F-marks-symlinks nil "\
  *Informs dired about how `ls -lF' marks symbolic links.
! Set this to t if `insert-directory-program' with `-lF' marks the symbolic link
  itself with a trailing @ (usually the case under Ultrix).
  
--- 2518,2528 ----
  `dired-ls-F-marks-symlinks' concerning the `F' switch.")
  
! (defvar dired-chown-program (if (memq system-type (quote (hpux dgux usg-unix-v irix linux lignux))) "chown" "/etc/chown") "\
  Name of chown command (usually `chown' or `/etc/chown').")
  
  (defvar dired-ls-F-marks-symlinks nil "\
  *Informs dired about how `ls -lF' marks symbolic links.
! Set this to t if `ls' (or whatever program is specified by
! `insert-directory-program') with `-lF' marks the symbolic link
  itself with a trailing @ (usually the case under Ultrix).
  
*************** The target is used in the prompt for fil
*** 2417,2421 ****
  *If non-nil, Dired preserves the last-modified time in a file copy.
  \(This works on only some systems.)")
! (define-key ctl-x-map "d" 'dired)
  
  (autoload (quote dired) "dired" "\
--- 2571,2575 ----
  *If non-nil, Dired preserves the last-modified time in a file copy.
  \(This works on only some systems.)")
!  (define-key ctl-x-map "d" 'dired)
  
  (autoload (quote dired) "dired" "\
*************** Optional second argument SWITCHES specif
*** 2425,2429 ****
  Dired displays a list of files in DIRNAME (which may also have
  shell wildcards appended to select certain files).  If DIRNAME is a cons,
! its first element is taken as the directory name and the resr as an explicit
  list of files to make directory entries for.
  \\<dired-mode-map>You can move around in it with the usual commands.
--- 2579,2583 ----
  Dired displays a list of files in DIRNAME (which may also have
  shell wildcards appended to select certain files).  If DIRNAME is a cons,
! its first element is taken as the directory name and the rest as an explicit
  list of files to make directory entries for.
  \\<dired-mode-map>You can move around in it with the usual commands.
*************** Type \\[describe-mode] after entering di
*** 2433,2441 ****
  
  If DIRNAME is already in a dired buffer, that buffer is used without refresh." t nil)
! (define-key ctl-x-4-map "d" 'dired-other-window)
  
  (autoload (quote dired-other-window) "dired" "\
  \"Edit\" directory DIRNAME.  Like `dired' but selects in another window." t nil)
! (define-key ctl-x-5-map "d" 'dired-other-frame)
  
  (autoload (quote dired-other-frame) "dired" "\
--- 2587,2595 ----
  
  If DIRNAME is already in a dired buffer, that buffer is used without refresh." t nil)
!  (define-key ctl-x-4-map "d" 'dired-other-window)
  
  (autoload (quote dired-other-window) "dired" "\
  \"Edit\" directory DIRNAME.  Like `dired' but selects in another window." t nil)
!  (define-key ctl-x-5-map "d" 'dired-other-frame)
  
  (autoload (quote dired-other-frame) "dired" "\
*************** Like `dired' but returns the dired buffe
*** 2447,2451 ****
  ;;;***
  
! ;;;### (autoloads (dired-do-query-replace dired-do-search dired-hide-all dired-hide-subdir dired-tree-down dired-tree-up dired-kill-subdir dired-mark-subdir-files dired-goto-subdir dired-prev-subdir dired-maybe-insert-subdir dired-downcase dired-upcase dired-do-symlink-regexp dired-do-hardlink-regexp dired-do-copy-regexp dired-do-rename-regexp dired-do-rename dired-do-hardlink dired-do-symlink dired-do-copy dired-create-directory dired-rename-file dired-copy-file dired-relist-file dired-remove-file dired-add-file dired-do-redisplay dired-do-load dired-do-byte-compile dired-do-compress dired-compress-file dired-do-kill-lines dired-do-shell-command dired-do-print dired-do-chown dired-do-chgrp dired-do-chmod dired-backup-diff dired-diff) "dired-aux" "dired-aux.el" (12355 15919))
  ;;; Generated autoloads from dired-aux.el
  
--- 2601,2605 ----
  ;;;***
  
! ;;;### (autoloads (dired-do-query-replace dired-do-search dired-hide-all dired-hide-subdir dired-tree-down dired-tree-up dired-kill-subdir dired-mark-subdir-files dired-goto-subdir dired-prev-subdir dired-maybe-insert-subdir dired-downcase dired-upcase dired-do-symlink-regexp dired-do-hardlink-regexp dired-do-copy-regexp dired-do-rename-regexp dired-do-rename dired-do-hardlink dired-do-symlink dired-do-copy dired-create-directory dired-rename-file dired-copy-file dired-relist-file dired-remove-file dired-add-file dired-do-redisplay dired-do-load dired-do-byte-compile dired-do-compress dired-compress-file dired-do-kill-lines dired-do-shell-command dired-do-print dired-do-chown dired-do-chgrp dired-do-chmod dired-backup-diff dired-diff) "dired-aux" "dired-aux.el" (12682 60213))
  ;;; Generated autoloads from dired-aux.el
  
*************** with the command \\[tags-loop-continue].
*** 2643,2647 ****
  ;;;***
  
! ;;;### (autoloads (dired-jump) "dired-x" "dired-x.el" (12374 5734))
  ;;; Generated autoloads from dired-x.el
  
--- 2797,2801 ----
  ;;;***
  
! ;;;### (autoloads (dired-jump) "dired-x" "dired-x.el" (12536 45574))
  ;;; Generated autoloads from dired-x.el
  
*************** buffer and try again." t nil)
*** 2655,2659 ****
  ;;;***
  
! ;;;### (autoloads (disassemble) "disass" "disass.el" (12437 9616))
  ;;; Generated autoloads from disass.el
  
--- 2809,2813 ----
  ;;;***
  
! ;;;### (autoloads (disassemble) "disass" "disass.el" (12649 12917))
  ;;; Generated autoloads from disass.el
  
*************** redefine OBJECT if it is a symbol." t ni
*** 2667,2671 ****
  ;;;***
  
! ;;;### (autoloads (standard-display-european create-glyph standard-display-underline standard-display-graphic standard-display-g1 standard-display-ascii standard-display-default standard-display-8bit describe-current-display-table describe-display-table set-display-table-slot display-table-slot make-display-table) "disp-table" "disp-table.el" (12411 11888))
  ;;; Generated autoloads from disp-table.el
  
--- 2821,2825 ----
  ;;;***
  
! ;;;### (autoloads (standard-display-european create-glyph standard-display-underline standard-display-graphic standard-display-g1 standard-display-ascii standard-display-default standard-display-8bit describe-current-display-table describe-display-table set-display-table-slot display-table-slot make-display-table) "disp-table" "disp-table.el" (12536 45574))
  ;;; Generated autoloads from disp-table.el
  
*************** Return a new, empty display table." nil 
*** 2675,2684 ****
  (autoload (quote display-table-slot) "disp-table" "\
  Return the value of the extra slot in DISPLAY-TABLE named SLOT.
! SLOT may be a number from 0 to 5 inclusive, or a slot name (symbol)." nil nil)
  
  (autoload (quote set-display-table-slot) "disp-table" "\
  Set the value of the extra slot in DISPLAY-TABLE named SLOT to VALUE.
  SLOT may be a number from 0 to 5 inclusive, or a name (symbol).
! See `display-table-slot-name-alist' for the names and numbers." nil nil)
  
  (autoload (quote describe-display-table) "disp-table" "\
--- 2829,2841 ----
  (autoload (quote display-table-slot) "disp-table" "\
  Return the value of the extra slot in DISPLAY-TABLE named SLOT.
! SLOT may be a number from 0 to 5 inclusive, or a slot name (symbol).
! Valid symbols are `truncation', `wrap', `escape', `control',
! `selective-display', and `vertical-border'." nil nil)
  
  (autoload (quote set-display-table-slot) "disp-table" "\
  Set the value of the extra slot in DISPLAY-TABLE named SLOT to VALUE.
  SLOT may be a number from 0 to 5 inclusive, or a name (symbol).
! Valid symbols are `truncation', `wrap', `escape', `control',
! `selective-display', and `vertical-border'." nil nil)
  
  (autoload (quote describe-display-table) "disp-table" "\
*************** With prefix argument, enable European ch
*** 2720,2724 ****
  ;;;***
  
! ;;;### (autoloads (dissociated-press) "dissociate" "dissociate.el" (11829 12540))
  ;;; Generated autoloads from dissociate.el
  
--- 2877,2881 ----
  ;;;***
  
! ;;;### (autoloads (dissociated-press) "dissociate" "dissociate.el" (12536 45574))
  ;;; Generated autoloads from dissociate.el
  
*************** Default is 2." t nil)
*** 2734,2738 ****
  ;;;***
  
! ;;;### (autoloads (docref-setup) "docref" "docref.el" (12437 909))
  ;;; Generated autoloads from docref.el
  
--- 2891,2895 ----
  ;;;***
  
! ;;;### (autoloads (docref-setup) "docref" "docref.el" (12536 45574))
  ;;; Generated autoloads from docref.el
  
*************** See also \\(f@docref-subst)." t nil)
*** 2743,2747 ****
  ;;;***
  
! ;;;### (autoloads (doctor) "doctor" "doctor.el" (11718 57582))
  ;;; Generated autoloads from doctor.el
  
--- 2900,2904 ----
  ;;;***
  
! ;;;### (autoloads (doctor) "doctor" "doctor.el" (12668 63367))
  ;;; Generated autoloads from doctor.el
  
*************** Switch to *doctor* buffer and start givi
*** 2751,2755 ****
  ;;;***
  
! ;;;### (autoloads (double-mode) "double" "double.el" (12437 939))
  ;;; Generated autoloads from double.el
  
--- 2908,2912 ----
  ;;;***
  
! ;;;### (autoloads (double-mode) "double" "double.el" (12536 45574))
  ;;; Generated autoloads from double.el
  
*************** when pressed twice.  See variable `doubl
*** 2763,2767 ****
  ;;;***
  
! ;;;### (autoloads (dunnet) "dunnet" "dunnet.el" (12376 18678))
  ;;; Generated autoloads from dunnet.el
  
--- 2920,2924 ----
  ;;;***
  
! ;;;### (autoloads (dunnet) "dunnet" "dunnet.el" (12602 11920))
  ;;; Generated autoloads from dunnet.el
  
*************** Switch to *dungeon* buffer and start gam
*** 2771,2775 ****
  ;;;***
  
! ;;;### (autoloads (easy-menu-create-keymaps easy-menu-do-define easy-menu-define) "easymenu" "easymenu.el" (12221 28588))
  ;;; Generated autoloads from easymenu.el
  
--- 2928,2932 ----
  ;;;***
  
! ;;;### (autoloads (easy-menu-create-keymaps easy-menu-do-define easy-menu-define) "easymenu" "easymenu.el" (12536 45574))
  ;;; Generated autoloads from easymenu.el
  
*************** ENABLE is an expression; the item is ena
*** 2792,2796 ****
  whenever this expression's value is non-nil.
  
! Alternatively, a menu item may have the form: 
  
     [ NAME CALLBACK [ KEYWORD ARG ] ... ]
--- 2949,2953 ----
  whenever this expression's value is non-nil.
  
! Alternatively, a menu item may have the form:
  
     [ NAME CALLBACK [ KEYWORD ARG ] ... ]
*************** whenever this expression's value is non-
*** 2813,2824 ****
  NAME is a string; the name of an argument to CALLBACK.
  
!    :style 
!    
  STYLE is a symbol describing the type of menu item.  The following are
! defined:  
  
! toggle: A checkbox.  
          Currently just prepend the name with the string \"Toggle \".
! radio: A radio button. 
  nil: An ordinary menu item.
  
--- 2970,2981 ----
  NAME is a string; the name of an argument to CALLBACK.
  
!    :style STYLE
! 
  STYLE is a symbol describing the type of menu item.  The following are
! defined:
  
! toggle: A checkbox.
          Currently just prepend the name with the string \"Toggle \".
! radio: A radio button.
  nil: An ordinary menu item.
  
*************** is a list of menu items, as above." nil 
*** 2844,2848 ****
  ;;;***
  
! ;;;### (autoloads (electric-buffer-list) "ebuff-menu" "ebuff-menu.el" (12298 52725))
  ;;; Generated autoloads from ebuff-menu.el
  
--- 3001,3005 ----
  ;;;***
  
! ;;;### (autoloads (electric-buffer-list) "ebuff-menu" "ebuff-menu.el" (12550 52736))
  ;;; Generated autoloads from ebuff-menu.el
  
*************** Calls value of `electric-buffer-menu-mod
*** 2866,2870 ****
  ;;;***
  
! ;;;### (autoloads (Electric-command-history-redo-expression) "echistory" "echistory.el" (11722 62680))
  ;;; Generated autoloads from echistory.el
  
--- 3023,3027 ----
  ;;;***
  
! ;;;### (autoloads (Electric-command-history-redo-expression) "echistory" "echistory.el" (12536 45574))
  ;;; Generated autoloads from echistory.el
  
*************** With prefix arg NOCONFIRM, execute curre
*** 2875,2879 ****
  ;;;***
  
! ;;;### (autoloads (edebug-eval-top-level-form def-edebug-spec) "edebug" "edebug.el" (12417 12892))
  ;;; Generated autoloads from edebug.el
  
--- 3032,3036 ----
  ;;;***
  
! ;;;### (autoloads (edebug-eval-top-level-form def-edebug-spec) "edebug" "edebug.el" (12624 2197))
  ;;; Generated autoloads from edebug.el
  
*************** or if an error occurs, leave point after
*** 2893,2901 ****
  ;;;***
  
! ;;;### (autoloads (ediff-version ediff-revision ediff-patch-buffer ediff-merge-revisions-with-ancestor ediff-merge-revisions ediff-merge-buffers-with-ancestor ediff-merge-buffers ediff-merge-files-with-ancestor ediff-merge-files ediff-regions-linewise ediff-regions-wordwise ediff-windows-linewise ediff-windows-wordwise ediff-merge-directory-revisions-with-ancestor ediff-merge-directory-revisions ediff-merge-directories-with-ancestor ediff-merge-directories ediff-directories3 ediff-directory-revisions ediff-directories ediff-buffers3 ediff-buffers ediff-files3 ediff-files ediff-patch-file) "ediff" "ediff.el" (12415 10792))
  ;;; Generated autoloads from ediff.el
  
  (autoload (quote ediff-patch-file) "ediff" "\
! Run Ediff by patching FILE-TP-PATCH." t nil)
  
  (defalias (quote epatch) (quote ediff-patch-file))
--- 3050,3058 ----
  ;;;***
  
! ;;;### (autoloads (ediff-documentation ediff-version ediff-revision ediff-patch-buffer run-ediff-from-cvs-buffer ediff-merge-revisions-with-ancestor ediff-merge-revisions ediff-merge-buffers-with-ancestor ediff-merge-buffers ediff-merge-files-with-ancestor ediff-merge-files ediff-regions-linewise ediff-regions-wordwise ediff-windows-linewise ediff-windows-wordwise ediff-merge-directory-revisions-with-ancestor ediff-merge-directory-revisions ediff-merge-directories-with-ancestor ediff-merge-directories ediff-directories3 ediff-directory-revisions ediff-directories ediff-buffers3 ediff-buffers ediff-files3 ediff-files ediff-patch-file) "ediff" "ediff.el" (12580 9260))
  ;;; Generated autoloads from ediff.el
  
  (autoload (quote ediff-patch-file) "ediff" "\
! Run Ediff by patching SOURCE-FILENAME." t nil)
  
  (defalias (quote epatch) (quote ediff-patch-file))
*************** The file is the the optional FILE argume
*** 3021,3024 ****
--- 3178,3186 ----
  buffer." t nil)
  
+ (autoload (quote run-ediff-from-cvs-buffer) "ediff" "\
+ Run Ediff-merge on appropriate revisions of the selected file.
+ First run after `M-x cvs-update'. Then place the cursor on a lide describing a
+ file and then run `run-ediff-from-cvs-buffer'." t nil)
+ 
  (autoload (quote ediff-patch-buffer) "ediff" "\
  Run Ediff by patching BUFFER-NAME." t nil)
*************** Return string describing the version of 
*** 3033,3049 ****
  When called interactively, displays the version." t nil)
  
! ;;;***
! 
! ;;;### (autoloads (ediff-show-registry) "ediff-meta" "ediff-meta.el" (12415 10770))
! ;;; Generated autoloads from ediff-meta.el
! 
! (autoload (quote ediff-show-registry) "ediff-meta" "\
! Display Ediff's registry." t nil)
! 
! (defalias (quote eregistry) (quote ediff-show-registry))
  
  ;;;***
  
! ;;;### (autoloads (ediff-show-registry) "ediff-mult" "ediff-mult.el" (12464 64202))
  ;;; Generated autoloads from ediff-mult.el
  
--- 3195,3204 ----
  When called interactively, displays the version." t nil)
  
! (autoload (quote ediff-documentation) "ediff" "\
! Jump to Ediff's Info file." t nil)
  
  ;;;***
  
! ;;;### (autoloads (ediff-show-registry) "ediff-mult" "ediff-mult.el" (12580 9252))
  ;;; Generated autoloads from ediff-mult.el
  
*************** Display Ediff's registry." t nil)
*** 3055,3061 ****
  ;;;***
  
! ;;;### (autoloads (insert-kbd-macro format-kbd-macro read-kbd-macro edit-named-kbd-macro edit-last-kbd-macro edit-kbd-macro) "edmacro" "edmacro.el" (12352 45149))
  ;;; Generated autoloads from edmacro.el
! (define-key ctl-x-map "\C-k" 'edit-kbd-macro)
  
  (defvar edmacro-eight-bits nil "\
--- 3210,3216 ----
  ;;;***
  
! ;;;### (autoloads (insert-kbd-macro format-kbd-macro read-kbd-macro edit-named-kbd-macro edit-last-kbd-macro edit-kbd-macro) "edmacro" "edmacro.el" (12561 43913))
  ;;; Generated autoloads from edmacro.el
!  (define-key ctl-x-map "\C-k" 'edit-kbd-macro)
  
  (defvar edmacro-eight-bits nil "\
*************** use this command, and then save the file
*** 3112,3116 ****
  ;;;***
  
! ;;;### (autoloads (edt-emulation-on) "edt" "edt.el" (12437 1142))
  ;;; Generated autoloads from edt.el
  
--- 3267,3271 ----
  ;;;***
  
! ;;;### (autoloads (edt-emulation-on) "edt" "edt.el" (12550 52800))
  ;;; Generated autoloads from edt.el
  
*************** Turn on EDT Emulation." t nil)
*** 3120,3124 ****
  ;;;***
  
! ;;;### (autoloads (electric-helpify with-electric-help) "ehelp" "ehelp.el" (12441 11042))
  ;;; Generated autoloads from ehelp.el
  
--- 3275,3279 ----
  ;;;***
  
! ;;;### (autoloads (electric-helpify with-electric-help) "ehelp" "ehelp.el" (12645 17531))
  ;;; Generated autoloads from ehelp.el
  
*************** BUFFER is put into `default-major-mode' 
*** 3152,3156 ****
  ;;;***
  
! ;;;### (autoloads (elp-submit-bug-report elp-results elp-instrument-package elp-instrument-list elp-restore-function elp-instrument-function) "elp" "elp.el" (12033 65120))
  ;;; Generated autoloads from elp.el
  
--- 3307,3311 ----
  ;;;***
  
! ;;;### (autoloads (elp-submit-bug-report elp-results elp-instrument-package elp-instrument-list elp-restore-function elp-instrument-function) "elp" "elp.el" (12626 46701))
  ;;; Generated autoloads from elp.el
  
*************** Submit via mail, a bug report on elp." t
*** 3184,3188 ****
  ;;;***
  
! ;;;### (autoloads (report-emacs-bug) "emacsbug" "emacsbug.el" (12421 42207))
  ;;; Generated autoloads from emacsbug.el
  
--- 3339,3343 ----
  ;;;***
  
! ;;;### (autoloads (report-emacs-bug) "emacsbug" "emacsbug.el" (12620 12311))
  ;;; Generated autoloads from emacsbug.el
  
*************** Prompts for bug subject.  Leaves you in 
*** 3193,3197 ****
  ;;;***
  
! ;;;### (autoloads (emerge-merge-directories emerge-revisions-with-ancestor emerge-revisions emerge-files-with-ancestor-remote emerge-files-remote emerge-files-with-ancestor-command emerge-files-command emerge-buffers-with-ancestor emerge-buffers emerge-files-with-ancestor emerge-files) "emerge" "emerge.el" (12189 23987))
  ;;; Generated autoloads from emerge.el
  
--- 3348,3352 ----
  ;;;***
  
! ;;;### (autoloads (emerge-merge-directories emerge-revisions-with-ancestor emerge-revisions emerge-files-with-ancestor-remote emerge-files-remote emerge-files-with-ancestor-command emerge-files-command emerge-buffers-with-ancestor emerge-buffers emerge-files-with-ancestor emerge-files) "emerge" "emerge.el" (12592 59080))
  ;;; Generated autoloads from emerge.el
  
*************** Prompts for bug subject.  Leaves you in 
*** 3200,3216 ****
  (fset (quote menu-bar-emerge-menu) (symbol-value (quote menu-bar-emerge-menu)))
  
! (define-key menu-bar-emerge-menu [emerge-merge-directories] (quote ("Merge Directories ..." . emerge-merge-directories)))
  
! (define-key menu-bar-emerge-menu [emerge-revisions-with-ancestor] (quote ("Revisions with Ancestor ..." . emerge-revisions-with-ancestor)))
  
! (define-key menu-bar-emerge-menu [emerge-revisions] (quote ("Revisions ..." . emerge-revisions)))
  
! (define-key menu-bar-emerge-menu [emerge-files-with-ancestor] (quote ("Files with Ancestor ..." . emerge-files-with-ancestor)))
  
! (define-key menu-bar-emerge-menu [emerge-files] (quote ("Files ..." . emerge-files)))
  
! (define-key menu-bar-emerge-menu [emerge-buffers-with-ancestor] (quote ("Buffers with Ancestor ..." . emerge-buffers-with-ancestor)))
  
! (define-key menu-bar-emerge-menu [emerge-buffers] (quote ("Buffers ..." . emerge-buffers)))
  
  (autoload (quote emerge-files) "emerge" "\
--- 3355,3371 ----
  (fset (quote menu-bar-emerge-menu) (symbol-value (quote menu-bar-emerge-menu)))
  
! (define-key menu-bar-emerge-menu [emerge-merge-directories] (quote ("Merge Directories..." . emerge-merge-directories)))
  
! (define-key menu-bar-emerge-menu [emerge-revisions-with-ancestor] (quote ("Revisions with Ancestor..." . emerge-revisions-with-ancestor)))
  
! (define-key menu-bar-emerge-menu [emerge-revisions] (quote ("Revisions..." . emerge-revisions)))
  
! (define-key menu-bar-emerge-menu [emerge-files-with-ancestor] (quote ("Files with Ancestor..." . emerge-files-with-ancestor)))
  
! (define-key menu-bar-emerge-menu [emerge-files] (quote ("Files..." . emerge-files)))
  
! (define-key menu-bar-emerge-menu [emerge-buffers-with-ancestor] (quote ("Buffers with Ancestor..." . emerge-buffers-with-ancestor)))
  
! (define-key menu-bar-emerge-menu [emerge-buffers] (quote ("Buffers..." . emerge-buffers)))
  
  (autoload (quote emerge-files) "emerge" "\
*************** Emerge two RCS revisions of a file, with
*** 3244,3248 ****
  ;;;***
  
! ;;;### (autoloads (enriched-decode enriched-encode enriched-mode) "enriched" "enriched.el" (12437 1242))
  ;;; Generated autoloads from enriched.el
  
--- 3399,3403 ----
  ;;;***
  
! ;;;### (autoloads (enriched-decode enriched-encode enriched-mode) "enriched" "enriched.el" (12697 61530))
  ;;; Generated autoloads from enriched.el
  
*************** Minor mode for editing text/enriched fil
*** 3251,3257 ****
  These are files with embedded formatting information in the MIME standard
  text/enriched format.
! Turning the mode on runs `enriched-mode-hooks'.
  
! More information about enriched-mode is available in the file 
  etc/enriched.doc  in the Emacs distribution directory.
  
--- 3406,3412 ----
  These are files with embedded formatting information in the MIME standard
  text/enriched format.
! Turning the mode on runs `enriched-mode-hook'.
  
! More information about Enriched mode is available in the file 
  etc/enriched.doc  in the Emacs distribution directory.
  
*************** Commands:
*** 3266,3270 ****
  ;;;***
  
! ;;;### (autoloads (setenv) "env" "env.el" (12370 27107))
  ;;; Generated autoloads from env.el
  
--- 3421,3425 ----
  ;;;***
  
! ;;;### (autoloads (setenv) "env" "env.el" (12536 45574))
  ;;; Generated autoloads from env.el
  
*************** Commands:
*** 3272,3276 ****
  Set the value of the environment variable named VARIABLE to VALUE.
  VARIABLE should be a string.  VALUE is optional; if not provided or is
! `nil', the environment variable VARIABLE will be removed.  
  
  Interactively, a prefix argument means to unset the variable.
--- 3427,3431 ----
  Set the value of the environment variable named VARIABLE to VALUE.
  VARIABLE should be a string.  VALUE is optional; if not provided or is
! `nil', the environment variable VARIABLE will be removed.
  
  Interactively, a prefix argument means to unset the variable.
*************** This function works by modifying `proces
*** 3282,3286 ****
  ;;;***
  
! ;;;### (autoloads (complete-tag select-tags-table tags-apropos list-tags tags-query-replace tags-search tags-loop-continue next-file find-tag-regexp find-tag-other-frame find-tag-other-window find-tag find-tag-noselect tags-table-files visit-tags-table) "etags" "etags.el" (12437 9767))
  ;;; Generated autoloads from etags.el
  
--- 3437,3441 ----
  ;;;***
  
! ;;;### (autoloads (complete-tag select-tags-table tags-apropos list-tags tags-query-replace tags-search tags-loop-continue next-file find-tag-regexp find-tag-other-frame find-tag-other-window find-tag find-tag-noselect tags-table-files visit-tags-table) "etags" "etags.el" (12686 37769))
  ;;; Generated autoloads from etags.el
  
*************** To switch to a new tags table, setting t
*** 3290,3294 ****
  If you set this variable, do not also set `tags-table-list'.
  Use the `etags' program to make a tags table file.")
! (put 'tags-file-name 'variable-interactive "fVisit tags table: ")
  
  (defvar tags-table-list nil "\
--- 3445,3449 ----
  If you set this variable, do not also set `tags-table-list'.
  Use the `etags' program to make a tags table file.")
!  (put 'tags-file-name 'variable-interactive "fVisit tags table: ")
  
  (defvar tags-table-list nil "\
*************** file the tag was in." t nil)
*** 3329,3334 ****
  (autoload (quote tags-table-files) "etags" "\
  Return a list of files in the current tags table.
! Assumes the tags table is the current buffer.
! File names returned are absolute." nil nil)
  
  (autoload (quote find-tag-noselect) "etags" "\
--- 3484,3490 ----
  (autoload (quote tags-table-files) "etags" "\
  Return a list of files in the current tags table.
! Assumes the tags table is the current buffer.  The file names are returned
! as they appeared in the `etags' command that created the table, usually
! without directory names." nil nil)
  
  (autoload (quote find-tag-noselect) "etags" "\
*************** or just \\[negative-argument]), pop back
*** 3360,3364 ****
  
  See documentation of variable `tags-file-name'." t nil)
! (define-key esc-map "." 'find-tag)
  
  (autoload (quote find-tag-other-window) "etags" "\
--- 3516,3520 ----
  
  See documentation of variable `tags-file-name'." t nil)
!  (define-key esc-map "." 'find-tag)
  
  (autoload (quote find-tag-other-window) "etags" "\
*************** just \\[negative-argument]), pop back to
*** 3375,3379 ****
  
  See documentation of variable `tags-file-name'." t nil)
! (define-key ctl-x-4-map "." 'find-tag-other-window)
  
  (autoload (quote find-tag-other-frame) "etags" "\
--- 3531,3535 ----
  
  See documentation of variable `tags-file-name'." t nil)
!  (define-key ctl-x-4-map "." 'find-tag-other-window)
  
  (autoload (quote find-tag-other-frame) "etags" "\
*************** just \\[negative-argument]), pop back to
*** 3390,3394 ****
  
  See documentation of variable `tags-file-name'." t nil)
! (define-key ctl-x-5-map "." 'find-tag-other-frame)
  
  (autoload (quote find-tag-regexp) "etags" "\
--- 3546,3550 ----
  
  See documentation of variable `tags-file-name'." t nil)
!  (define-key ctl-x-5-map "." 'find-tag-other-frame)
  
  (autoload (quote find-tag-regexp) "etags" "\
*************** If third arg OTHER-WINDOW is non-nil, se
*** 3405,3409 ****
  
  See documentation of variable `tags-file-name'." t nil)
! (define-key esc-map [?\C-.] 'find-tag-regexp)
  
  (autoload (quote next-file) "etags" "\
--- 3561,3565 ----
  
  See documentation of variable `tags-file-name'." t nil)
!  (define-key esc-map [?\C-.] 'find-tag-regexp)
  
  (autoload (quote next-file) "etags" "\
*************** interesting (it returns non-nil if so) a
*** 3430,3434 ****
  evaluate to operate on an interesting file.  If the latter evaluates to
  nil, we exit; otherwise we scan the next file." t nil)
! (define-key esc-map "," 'tags-loop-continue)
  
  (autoload (quote tags-search) "etags" "\
--- 3586,3590 ----
  evaluate to operate on an interesting file.  If the latter evaluates to
  nil, we exit; otherwise we scan the next file." t nil)
!  (define-key esc-map "," 'tags-loop-continue)
  
  (autoload (quote tags-search) "etags" "\
*************** See documentation of variable `tags-file
*** 3448,3453 ****
  
  (autoload (quote list-tags) "etags" "\
! Gives the list of functions available in file \"filename\"
! Searches only in \"tags-file-name\"." t nil)
  
  (autoload (quote tags-apropos) "etags" "\
--- 3604,3611 ----
  
  (autoload (quote list-tags) "etags" "\
! Display list of tags in file FILE.
! This searches only the first table in the list, and no included tables.
! FILE should be as it appeared in the `etags' command, usually without a
! directory specification." t nil)
  
  (autoload (quote tags-apropos) "etags" "\
*************** see the doc of that variable if you want
*** 3461,3472 ****
  (autoload (quote complete-tag) "etags" "\
  Perform tags completion on the text around point.
! Completes to the set of names listed in the current tags table.  
  The string to complete is chosen in the same way as the default
  for \\[find-tag] (which see)." t nil)
! (define-key esc-map "\t" 'complete-tag)
  
  ;;;***
  
! ;;;### (autoloads (executable-self-display executable-set-magic) "executable" "executable.el" (12350 16067))
  ;;; Generated autoloads from executable.el
  
--- 3619,3630 ----
  (autoload (quote complete-tag) "etags" "\
  Perform tags completion on the text around point.
! Completes to the set of names listed in the current tags table.
  The string to complete is chosen in the same way as the default
  for \\[find-tag] (which see)." t nil)
!  (define-key esc-map "\t" 'complete-tag)
  
  ;;;***
  
! ;;;### (autoloads (executable-self-display executable-set-magic) "executable" "executable.el" (12598 35455))
  ;;; Generated autoloads from executable.el
  
*************** The magic number of such a command displ
*** 3484,3488 ****
  ;;;***
  
! ;;;### (autoloads (f90-mode) "f90" "f90.el" (12437 1284))
  ;;; Generated autoloads from f90.el
  
--- 3642,3646 ----
  ;;;***
  
! ;;;### (autoloads (f90-mode) "f90" "f90.el" (12700 59718))
  ;;; Generated autoloads from f90.el
  
*************** Variables controlling indentation style 
*** 3540,3544 ****
   f90-startup-message
      Set to nil to inhibit message first time F90 mode is used. (default t)
!  f90-keywords
      List of keywords used for highlighting/upcase-keywords etc.
  
--- 3698,3702 ----
   f90-startup-message
      Set to nil to inhibit message first time F90 mode is used. (default t)
!  f90-keywords-re
      List of keywords used for highlighting/upcase-keywords etc.
  
*************** with no args, if that value is non-nil."
*** 3548,3555 ****
  ;;;***
  
! ;;;### (autoloads (list-colors-display facemenu-read-color list-text-properties-at facemenu-remove-special facemenu-remove-all facemenu-remove-props facemenu-set-read-only facemenu-set-intangible facemenu-set-invisible facemenu-set-face-from-menu facemenu-set-background facemenu-set-foreground facemenu-set-face) "facemenu" "facemenu.el" (12437 1331))
  ;;; Generated autoloads from facemenu.el
! (define-key global-map "\M-g" 'facemenu-keymap)
! (autoload 'facemenu-keymap "facemenu" "Keymap for face-changing commands." t 'keymap)
  
  (defvar facemenu-face-menu (let ((map (make-sparse-keymap "Face"))) (define-key map "o" (cons "Other..." (quote facemenu-set-face))) map) "\
--- 3706,3713 ----
  ;;;***
  
! ;;;### (autoloads (list-colors-display facemenu-read-color list-text-properties-at facemenu-remove-special facemenu-remove-all facemenu-remove-props facemenu-set-read-only facemenu-set-intangible facemenu-set-invisible facemenu-set-face-from-menu facemenu-set-background facemenu-set-foreground facemenu-set-face) "facemenu" "facemenu.el" (12634 6160))
  ;;; Generated autoloads from facemenu.el
!  (define-key global-map "\M-g" 'facemenu-keymap)
!  (autoload 'facemenu-keymap "facemenu" "Keymap for face-changing commands." t 'keymap)
  
  (defvar facemenu-face-menu (let ((map (make-sparse-keymap "Face"))) (define-key map "o" (cons "Other..." (quote facemenu-set-face))) map) "\
*************** of colors that the current display can h
*** 3677,3681 ****
  ;;;***
  
! ;;;### (autoloads (turn-on-fast-lock fast-lock-mode) "fast-lock" "fast-lock.el" (12431 36427))
  ;;; Generated autoloads from fast-lock.el
  
--- 3835,3839 ----
  ;;;***
  
! ;;;### (autoloads (turn-on-fast-lock fast-lock-mode) "fast-lock" "fast-lock.el" (12552 36914))
  ;;; Generated autoloads from fast-lock.el
  
*************** Unconditionally turn on Fast Lock mode."
*** 3714,3718 ****
  ;;;***
  
! ;;;### (autoloads (find-grep-dired find-name-dired find-dired) "find-dired" "find-dired.el" (12276 36938))
  ;;; Generated autoloads from find-dired.el
  
--- 3872,3905 ----
  ;;;***
  
! ;;;### (autoloads (ffap-menu find-file-at-point ffap-next) "ffap" "ffap.el" (12629 23035))
! ;;; Generated autoloads from ffap.el
! 
! (autoload (quote ffap-next) "ffap" "\
! Search buffer for next file or url, and run ffap.
! Optional argument BACK says to search backwards.
! Optional argument WRAP says to try wrapping around if necessary.
! Interactively: use a single prefix to search backwards,
! double prefix to wrap forward, triple to wrap backwards.
! Actual search is done by `ffap-next-guess'." t nil)
! 
! (autoload (quote find-file-at-point) "ffap" "\
! Find FILENAME (or url), guessing default from text around point.
! If `ffap-dired-wildcards' is set, wildcard patterns are passed to dired.
! See also the functions `ffap-file-at-point', `ffap-url-at-point'.
! With a prefix, this command behaves *exactly* like `ffap-file-finder'.
! If `ffap-require-prefix' is set, the prefix meaning is reversed.
! 
! See <ftp://ftp.mathcs.emory.edu/pub/mic/emacs/> for latest version." t nil)
! 
! (autoload (quote ffap-menu) "ffap" "\
! Put up a menu of files and urls mentioned in this buffer.
! Then set mark, jump to choice, and try to fetch it.  The menu is
! cached in `ffap-menu-alist', and rebuilt by `ffap-menu-rescan'.
! The optional RESCAN argument (a prefix, interactively) forces
! a rebuild.  Searches with `ffap-menu-regexp'." t nil)
! 
! ;;;***
! 
! ;;;### (autoloads (find-grep-dired find-name-dired find-dired) "find-dired" "find-dired.el" (12536 45574))
  ;;; Generated autoloads from find-dired.el
  
*************** Thus ARG can also contain additional gre
*** 3752,3756 ****
  ;;;***
  
! ;;;### (autoloads (ff-find-other-file ff-get-other-file) "find-file" "find-file.el" (12351 34675))
  ;;; Generated autoloads from find-file.el
  
--- 3939,3943 ----
  ;;;***
  
! ;;;### (autoloads (ff-find-other-file ff-get-other-file) "find-file" "find-file.el" (12536 45574))
  ;;; Generated autoloads from find-file.el
  
*************** Variables of interest include:
*** 3774,3793 ****
     If you have extensions in different cases, you will want this to be nil.
  
!  - ff-always-in-other-window 
     If non-nil, always open the other file in another window, unless an
     argument is given to ff-find-other-file.
  
!  - ff-ignore-include 
     If non-nil, ignores #include lines.
  
!  - ff-always-try-to-create 
     If non-nil, always attempt to create the other file if it was not found.
  
!  - ff-quiet-mode 
     If non-nil, traces which directories are being searched.
  
!  - ff-special-constructs 
!    A list of regular expressions specifying how to recognise special 
!    constructs such as include files etc, and an associated method for 
     extracting the filename from that construct.
  
--- 3961,3980 ----
     If you have extensions in different cases, you will want this to be nil.
  
!  - ff-always-in-other-window
     If non-nil, always open the other file in another window, unless an
     argument is given to ff-find-other-file.
  
!  - ff-ignore-include
     If non-nil, ignores #include lines.
  
!  - ff-always-try-to-create
     If non-nil, always attempt to create the other file if it was not found.
  
!  - ff-quiet-mode
     If non-nil, traces which directories are being searched.
  
!  - ff-special-constructs
!    A list of regular expressions specifying how to recognise special
!    constructs such as include files etc, and an associated method for
     extracting the filename from that construct.
  
*************** Variables of interest include:
*** 3795,3806 ****
     Alist of extensions to find given the current file's extension.
  
!  - ff-search-directories 
     List of directories searched through with each extension specified in
     ff-other-file-alist that matches this file's extension.
  
!  - ff-pre-find-hooks 
     List of functions to be called before the search for the file starts.
  
!  - ff-pre-load-hooks 
     List of functions to be called before the other file is loaded.
  
--- 3982,3993 ----
     Alist of extensions to find given the current file's extension.
  
!  - ff-search-directories
     List of directories searched through with each extension specified in
     ff-other-file-alist that matches this file's extension.
  
!  - ff-pre-find-hooks
     List of functions to be called before the search for the file starts.
  
!  - ff-pre-load-hooks
     List of functions to be called before the other file is loaded.
  
*************** Variables of interest include:
*** 3816,3820 ****
  ;;;***
  
! ;;;### (autoloads (enable-flow-control-on enable-flow-control) "flow-ctrl" "flow-ctrl.el" (12418 54831))
  ;;; Generated autoloads from flow-ctrl.el
  
--- 4003,4007 ----
  ;;;***
  
! ;;;### (autoloads (enable-flow-control-on enable-flow-control) "flow-ctrl" "flow-ctrl.el" (12550 53108))
  ;;; Generated autoloads from flow-ctrl.el
  
*************** to get the effect of a C-q." nil nil)
*** 3833,3841 ****
  ;;;***
  
! ;;;### (autoloads (font-lock-fontify-buffer turn-on-font-lock font-lock-mode) "font-lock" "font-lock.el" (12437 1384))
  ;;; Generated autoloads from font-lock.el
  
  (defvar font-lock-maximum-decoration nil "\
! *If non-nil, the maximum decoration level for fontifying.
  If nil, use the default decoration (typically the minimum available).
  If t, use the maximum decoration available.
--- 4020,4094 ----
  ;;;***
  
! ;;;### (autoloads (follow-delete-other-windows-and-split follow-mode turn-off-follow-mode turn-on-follow-mode) "follow" "follow.el" (12653 19749))
! ;;; Generated autoloads from follow.el
! 
! (autoload (quote turn-on-follow-mode) "follow" "\
! Turn on Follow mode. Please see the function `follow-mode'." t nil)
! 
! (autoload (quote turn-off-follow-mode) "follow" "\
! Turn off Follow mode. Please see the function `follow-mode'." t nil)
! 
! (autoload (quote follow-mode) "follow" "\
! Minor mode which combines windows into one tall virtual window.
! 
! The feeling of a \"virtual window\" has been accomplished by the use
! of two major techniques:
! 
! * The windows always displays adjacent sections of the buffer. 
!   This means that whenever one window is moved, all the
!   others will follow.  (Hence the name Follow Mode.)
! 
! * Should the point (cursor) end up outside a window, another 
!   window displaying that point is selected, if possible.  This 
!   makes it possible to walk between windows using normal cursor 
!   movement commands.
! 
! Follow mode comes to its prime when used on a large screen and two
! side-by-side window are used. The user can, with the help of Follow
! mode, use two full-height windows as though they would have been
! one. Imagine yourself editing a large function, or section of text,
! and beeing able to use 144 lines instead of the normal 72... (your
! mileage may vary).
! 
! To split one large window into two side-by-side windows, the commands
! `\\[split-window-horizontally]' or `M-x follow-delete-other-windows-and-split' can be used.
! 
! Only windows displayed in the same frame follow each-other.
! 
! If the variable `follow-intercept-processes' is non-nil, Follow mode
! will listen to the output of processes and redisplay accordingly.
! \(This is the default.)
! 
! When Follow mode is switched on, the hook `follow-mode-hook'
! is called.  When turned off, `follow-mode-off-hook' is called.
! 
! Keys specific to Follow mode:
! \\{follow-mode-map}" t nil)
! 
! (autoload (quote follow-delete-other-windows-and-split) "follow" "\
! Create two side by side windows and enter Follow Mode.
! 
! Execute this command to display as much as possible of the text
! in the selected window.  All other windows, in the current 
! frame, are deleted and the selected window is split in two
! side-by-side windows. Follow Mode is activated, hence the 
! two windows always will display two successive pages.
! \(If one window is moved, the other one will follow.)
! 
! If ARG is positive, the leftmost window is selected.  If it negative,
! the rightmost is selected.  If ARG is nil, the leftmost window is
! selected if the original window is the first one in the frame.
! 
! To bind this command to a hotkey, place the following line
! in your `~/.emacs' file, replacing [f7] by your favourite key:
!     (global-set-key [f7] 'follow-delete-other-windows-and-split)" t nil)
! 
! ;;;***
! 
! ;;;### (autoloads (font-lock-fontify-buffer global-font-lock-mode turn-on-font-lock font-lock-mode) "font-lock" "font-lock.el" (12606 59029))
  ;;; Generated autoloads from font-lock.el
  
  (defvar font-lock-maximum-decoration nil "\
! *Maximum decoration level for fontification.
  If nil, use the default decoration (typically the minimum available).
  If t, use the maximum decoration available.
*************** available for buffers in `c-mode', and l
*** 3848,3852 ****
  
  (defvar font-lock-maximum-size (* 250 1024) "\
! *If non-nil, the maximum size for buffers for fontifying.
  Only buffers less than this can be fontified when Font Lock mode is turned on.
  If nil, means size is irrelevant.
--- 4101,4105 ----
  
  (defvar font-lock-maximum-size (* 250 1024) "\
! *Maximum size of a buffer for buffer fontification.
  Only buffers less than this can be fontified when Font Lock mode is turned on.
  If nil, means size is irrelevant.
*************** the major mode's hook.  For example, put
*** 3876,3882 ****
   (add-hook 'c-mode-hook 'turn-on-font-lock)
  
! Or for any visited file with the following in your ~/.emacs:
  
!  (add-hook 'find-file-hooks 'turn-on-font-lock)
  
  The default Font Lock mode faces and their attributes are defined in the
--- 4129,4137 ----
   (add-hook 'c-mode-hook 'turn-on-font-lock)
  
! Alternatively, you can use Global Font Lock mode to automagically turn on Font
! Lock mode in buffers whose major mode supports it, or in buffers whose major
! mode is one of `font-lock-global-modes'.  For example, put in your ~/.emacs:
  
!  (global-font-lock-mode t)
  
  The default Font Lock mode faces and their attributes are defined in the
*************** Where modes support different levels of 
*** 3890,3898 ****
  When you turn Font Lock mode on/off the buffer is fontified/defontified, though
  fontification occurs only if the buffer is less than `font-lock-maximum-size'.
! To fontify a buffer without turning on Font Lock mode, and regardless of buffer
! size, you can use \\[font-lock-fontify-buffer]." t nil)
  
  (autoload (quote turn-on-font-lock) "font-lock" "\
! Unconditionally turn on Font Lock mode." nil nil)
  
  (autoload (quote font-lock-fontify-buffer) "font-lock" "\
--- 4145,4177 ----
  When you turn Font Lock mode on/off the buffer is fontified/defontified, though
  fontification occurs only if the buffer is less than `font-lock-maximum-size'.
! 
! To fontify a buffer, without turning on Font Lock mode and regardless of buffer
! size, you can use \\[font-lock-fontify-buffer].
! 
! To fontify a block (the function or paragraph containing point, or a number of
! lines around point), perhaps because modification on the current line caused
! syntactic change on other lines, you can use \\[font-lock-fontify-block]." t nil)
  
  (autoload (quote turn-on-font-lock) "font-lock" "\
! Turn on Font Lock mode conditionally.
! Turn on only if the buffer mode supports it and the terminal can display it." nil nil)
! 
! (defvar font-lock-global-modes t "\
! *Modes for which Font Lock mode is automatically turned on.
! Global Font Lock mode is controlled by the `global-font-lock-mode' command.
! If nil, means no modes have Font Lock mode automatically turned on.
! If t, all modes that support Font Lock mode have it automatically turned on.
! If a list, each element should be a major mode symbol name such as `c-mode'.
! Font Lock is automatically turned on if the buffer major mode supports it and
! is in this list.  The sense of the list is negated if it begins with `not'.")
! 
! (autoload (quote global-font-lock-mode) "font-lock" "\
! Toggle Global Font Lock mode.
! With prefix ARG, turn Global Font Lock mode on if and only if ARG is positive.
! Displays a message saying whether the mode is on or off if MESSAGE is non-nil.
! Returns the new status of Global Font Lock mode (non-nil means on).
! 
! When Global Font Lock mode is enabled, Font Lock mode is automagically
! turned on in a buffer if its major mode is one of `font-lock-global-modes'." t nil)
  
  (autoload (quote font-lock-fontify-buffer) "font-lock" "\
*************** Fontify the current buffer the way `font
*** 3901,3905 ****
  ;;;***
  
! ;;;### (autoloads (forms-find-file-other-window forms-find-file forms-mode) "forms" "forms.el" (12437 1594))
  ;;; Generated autoloads from forms.el
  
--- 4180,4184 ----
  ;;;***
  
! ;;;### (autoloads (forms-find-file-other-window forms-find-file forms-mode) "forms" "forms.el" (12599 26747))
  ;;; Generated autoloads from forms.el
  
*************** Visit a file in Forms mode in other wind
*** 3932,3936 ****
  ;;;***
  
! ;;;### (autoloads (fortran-mode) "fortran" "fortran.el" (12431 36212))
  ;;; Generated autoloads from fortran.el
  
--- 4211,4215 ----
  ;;;***
  
! ;;;### (autoloads (fortran-mode) "fortran" "fortran.el" (12536 45574))
  ;;; Generated autoloads from fortran.el
  
*************** with a character in column 6.")
*** 3943,3947 ****
  (autoload (quote fortran-mode) "fortran" "\
  Major mode for editing Fortran code.
! \\[fortran-indent-line] indents the current Fortran line correctly. 
  DO statements must not share a common CONTINUE.
  
--- 4222,4226 ----
  (autoload (quote fortran-mode) "fortran" "\
  Major mode for editing Fortran code.
! \\[fortran-indent-line] indents the current Fortran line correctly.
  DO statements must not share a common CONTINUE.
  
*************** Variables controlling indentation style 
*** 3990,3994 ****
      Non-nil causes all numbered lines to be treated as possible \"continue\"
      statements.  (default nil)
!  fortran-blink-matching-if 
      Non-nil causes \\[fortran-indent-line] on an ENDIF statement to blink on
      matching IF.  Also, from an ENDDO statement, blink on matching DO [WHILE]
--- 4269,4273 ----
      Non-nil causes all numbered lines to be treated as possible \"continue\"
      statements.  (default nil)
!  fortran-blink-matching-if
      Non-nil causes \\[fortran-indent-line] on an ENDIF statement to blink on
      matching IF.  Also, from an ENDDO statement, blink on matching DO [WHILE]
*************** Variables controlling indentation style 
*** 3998,4005 ****
      line.  (default \"$\")
   fortran-comment-region
!     String inserted by \\[fortran-comment-region] at start of each line in 
      region.  (default \"c$$$\")
   fortran-electric-line-number
!     Non-nil causes line number digits to be moved to the correct column 
      as typed.  (default t)
   fortran-break-before-delimiters
--- 4277,4284 ----
      line.  (default \"$\")
   fortran-comment-region
!     String inserted by \\[fortran-comment-region] at start of each line in
      region.  (default \"c$$$\")
   fortran-electric-line-number
!     Non-nil causes line number digits to be moved to the correct column
      as typed.  (default t)
   fortran-break-before-delimiters
*************** with no args, if that value is non-nil."
*** 4014,4018 ****
  ;;;***
  
! ;;;### (autoloads (gnus-batch-score gnus gnus-no-server) "gnus" "gnus.el" (12442 58213))
  ;;; Generated autoloads from gnus.el
  
--- 4293,4297 ----
  ;;;***
  
! ;;;### (autoloads (gnus-batch-score gnus read-news gnus-no-server) "gnus" "gnus.el" (12662 39334))
  ;;; Generated autoloads from gnus.el
  
*************** prompt the user for the name of an NNTP 
*** 4025,4028 ****
--- 4304,4310 ----
  As opposed to `gnus', this command will not connect to the local server." t nil)
  
+ (autoload (quote read-news) "gnus" "\
+ Read network news.  This is an alias for the `gnus' command." nil nil)
+ 
  (autoload (quote gnus) "gnus" "\
  Read network news.
*************** score the alt hierarchy, you'd say \"!al
*** 4042,4046 ****
  ;;;***
  
! ;;;### (autoloads nil "gnus-msg" "gnus-msg.el" (12442 58110))
  ;;; Generated autoloads from gnus-msg.el
  
--- 4324,4328 ----
  ;;;***
  
! ;;;### (autoloads (gnus-post-news) "gnus-msg" "gnus-msg.el" (12586 7966))
  ;;; Generated autoloads from gnus-msg.el
  
*************** score the alt hierarchy, you'd say \"!al
*** 4049,4068 ****
  (defalias (quote postnews) (quote gnus-post-news))
  
! ;;;***
! 
! ;;;### (autoloads (gnus-post-news) "gnuspost" "gnuspost.el" (12248 23474))
! ;;; Generated autoloads from gnuspost.el
! 
! (defalias (quote sendnews) (quote gnus-post-news))
! 
! (defalias (quote postnews) (quote gnus-post-news))
! 
! (autoload (quote gnus-post-news) "gnuspost" "\
  Begin editing a new USENET news article to be posted.
! Type \\[describe-mode] once editing the article to get a list of commands." t nil)
  
  ;;;***
  
! ;;;### (autoloads (gomoku) "gomoku" "gomoku.el" (12201 8918))
  ;;; Generated autoloads from gomoku.el
  
--- 4331,4341 ----
  (defalias (quote postnews) (quote gnus-post-news))
  
! (autoload (quote gnus-post-news) "gnus-msg" "\
  Begin editing a new USENET news article to be posted.
! Type \\[describe-mode] in the buffer to get a list of commands." t nil)
  
  ;;;***
  
! ;;;### (autoloads (gomoku) "gomoku" "gomoku.el" (12645 30348))
  ;;; Generated autoloads from gomoku.el
  
*************** Start a Gomoku game between you and Emac
*** 4071,4074 ****
--- 4344,4348 ----
  If a game is in progress, this command allow you to resume it.
  If optional arguments N and M are given, an N by M board is used.
+ If prefix arg is given for N, M is prompted for.
  
  You and Emacs play in turn by marking a free square.  You mark it with X
*************** Use \\[describe-mode] for more info." t 
*** 4082,4093 ****
  ;;;***
  
! ;;;### (autoloads (goto-address) "goto-addr" "goto-addr.el" (12456 62933))
  ;;; Generated autoloads from goto-addr.el
  
  (autoload (quote goto-address) "goto-addr" "\
  Sets up goto-address functionality in the current buffer.
  Allows user to use mouse/keyboard command to click to go to a URL
  or to send e-mail.
! By default, goto-address binds to S-mouse-2 and C-c RET.
  
  Also fontifies the buffer appropriately (see `goto-address-fontify-p' and
--- 4356,4379 ----
  ;;;***
  
! ;;;### (autoloads (goto-address goto-address-at-point goto-address-at-mouse) "goto-addr" "goto-addr.el" (12659 6744))
  ;;; Generated autoloads from goto-addr.el
  
+ (autoload (quote goto-address-at-mouse) "goto-addr" "\
+ Send to the e-mail address or load the URL clicked with the mouse.
+ Send mail to address at position of mouse click.  See documentation for
+ `goto-address-find-address-at-point'.  If no address is found
+ there, then load the URL at or before the position of the mouse click." t nil)
+ 
+ (autoload (quote goto-address-at-point) "goto-addr" "\
+ Send to the e-mail address or load the URL at point.
+ Send mail to address at point.  See documentation for
+ `goto-address-find-address-at-point'.  If no address is found
+ there, then load the URL at or before point." t nil)
+ 
  (autoload (quote goto-address) "goto-addr" "\
  Sets up goto-address functionality in the current buffer.
  Allows user to use mouse/keyboard command to click to go to a URL
  or to send e-mail.
! By default, goto-address binds to mouse-2 and C-c RET.
  
  Also fontifies the buffer appropriately (see `goto-address-fontify-p' and
*************** Also fontifies the buffer appropriately 
*** 4096,4100 ****
  ;;;***
  
! ;;;### (autoloads (perldb xdb dbx sdb gdb) "gud" "gud.el" (12424 8923))
  ;;; Generated autoloads from gud.el
  
--- 4382,4386 ----
  ;;;***
  
! ;;;### (autoloads (perldb xdb dbx sdb gdb) "gud" "gud.el" (12690 44131))
  ;;; Generated autoloads from gud.el
  
*************** and source-file directory for your debug
*** 4129,4133 ****
  ;;;***
  
! ;;;### (autoloads (hanoi) "hanoi" "hanoi.el" (12189 24430))
  ;;; Generated autoloads from hanoi.el
  
--- 4415,4419 ----
  ;;;***
  
! ;;;### (autoloads (hanoi) "hanoi" "hanoi.el" (12579 52103))
  ;;; Generated autoloads from hanoi.el
  
*************** Towers of Hanoi diversion.  Argument is 
*** 4137,4141 ****
  ;;;***
  
! ;;;### (autoloads nil "help-macro" "help-macro.el" (12274 5253))
  ;;; Generated autoloads from help-macro.el
  
--- 4423,4427 ----
  ;;;***
  
! ;;;### (autoloads nil "help-macro" "help-macro.el" (12550 53134))
  ;;; Generated autoloads from help-macro.el
  
*************** A value of nil means skip the middle ste
*** 4149,4153 ****
  ;;;***
  
! ;;;### (autoloads (Helper-help Helper-describe-bindings) "helper" "helper.el" (12203 7388))
  ;;; Generated autoloads from helper.el
  
--- 4435,4439 ----
  ;;;***
  
! ;;;### (autoloads (Helper-help Helper-describe-bindings) "helper" "helper.el" (12536 45574))
  ;;; Generated autoloads from helper.el
  
*************** Provide help for current mode." t nil)
*** 4160,4164 ****
  ;;;***
  
! ;;;### (autoloads (hexlify-buffer hexl-find-file hexl-mode) "hexl" "hexl.el" (12366 29967))
  ;;; Generated autoloads from hexl.el
  
--- 4446,4450 ----
  ;;;***
  
! ;;;### (autoloads (hexlify-buffer hexl-find-file hexl-mode) "hexl" "hexl.el" (12639 13304))
  ;;; Generated autoloads from hexl.el
  
*************** Switch to a buffer visiting file FILENAM
*** 4240,4253 ****
  
  (autoload (quote hexlify-buffer) "hexl" "\
! Convert a binary buffer to hexl format." t nil)
  
  ;;;***
  
! ;;;### (autoloads (hide-ifdef-mode) "hideif" "hideif.el" (12430 64723))
  ;;; Generated autoloads from hideif.el
  
  (autoload (quote hide-ifdef-mode) "hideif" "\
  Toggle Hide-Ifdef mode.  This is a minor mode, albeit a large one.
! With ARG, turn Hide-Ifdef mode on iff arg is positive.
  In Hide-Ifdef mode, code within #ifdef constructs that the C preprocessor
  would eliminate may be hidden from view.  Several variables affect
--- 4526,4540 ----
  
  (autoload (quote hexlify-buffer) "hexl" "\
! Convert a binary buffer to hexl format.
! This discards the buffer's undo information." t nil)
  
  ;;;***
  
! ;;;### (autoloads (hide-ifdef-mode) "hideif" "hideif.el" (12684 58610))
  ;;; Generated autoloads from hideif.el
  
  (autoload (quote hide-ifdef-mode) "hideif" "\
  Toggle Hide-Ifdef mode.  This is a minor mode, albeit a large one.
! With ARG, turn Hide-Ifdef mode on if arg is positive, off otherwise.
  In Hide-Ifdef mode, code within #ifdef constructs that the C preprocessor
  would eliminate may be hidden from view.  Several variables affect
*************** hide-ifdef-read-only
*** 4280,4285 ****
  
  (defvar hide-ifdef-initially nil "\
! *Non-nil if `hide-ifdefs' should be called when Hide-Ifdef mode
! is first activated.")
  
  (defvar hide-ifdef-read-only nil "\
--- 4567,4571 ----
  
  (defvar hide-ifdef-initially nil "\
! *Non-nil means call `hide-ifdefs' when Hide-Ifdef mode is first activated.")
  
  (defvar hide-ifdef-read-only nil "\
*************** is first activated.")
*** 4287,4301 ****
  
  (defvar hide-ifdef-lines nil "\
! *Set to t if you don't want to see the #ifX, #else, and #endif lines.")
  
  ;;;***
  
! ;;;### (autoloads (hs-minor-mode hs-hide-block hs-hide-all) "hideshow" "hideshow.el" (12235 41891))
  ;;; Generated autoloads from hideshow.el
  
  (autoload (quote hs-hide-all) "hideshow" "\
  Hides all top-level blocks, displaying only first and last lines.
! When done, point is repositioned at the beginning of the line, and
! hs-hide-hooks is called.  See documentation for `run-hooks'." t nil)
  
  (autoload (quote hs-hide-block) "hideshow" "\
--- 4573,4587 ----
  
  (defvar hide-ifdef-lines nil "\
! *Non-nil means hide the #ifX, #else, and #endif lines.")
  
  ;;;***
  
! ;;;### (autoloads (hs-minor-mode hs-hide-block hs-hide-all) "hideshow" "hideshow.el" (12599 60349))
  ;;; Generated autoloads from hideshow.el
  
  (autoload (quote hs-hide-all) "hideshow" "\
  Hides all top-level blocks, displaying only first and last lines.
! It moves point to the beginning of the line, and it runs the normal hook
! `hs-hide-hook'.  See documentation for `run-hooks'." t nil)
  
  (autoload (quote hs-hide-block) "hideshow" "\
*************** Selects a block and hides it.  With pref
*** 4303,4307 ****
  Block is defined as a sexp for lispish modes, mode-specific otherwise.
  Comments are blocks, too.  Upon completion, point is at repositioned and
! hs-hide-hooks is called.  See documentation for `run-hooks'." t nil)
  
  (autoload (quote hs-minor-mode) "hideshow" "\
--- 4589,4593 ----
  Block is defined as a sexp for lispish modes, mode-specific otherwise.
  Comments are blocks, too.  Upon completion, point is at repositioned and
! the normal hook `hs-hide-hook' is run.  See documentation for `run-hooks'." t nil)
  
  (autoload (quote hs-minor-mode) "hideshow" "\
*************** With ARG, turn hideshow minor mode on if
*** 4310,4319 ****
  When hideshow minor mode is on, the menu bar is augmented with hideshow
  commands and the hideshow commands are enabled.  The variables
! 
! 	selective-display
! 	selective-display-ellipses
! 
! are set to t.  Lastly, the hooks set in hs-minor-mode-hook are called.
! See documentation for `run-hooks'.
  
  Turning hideshow minor mode off reverts the menu bar and the
--- 4596,4601 ----
  When hideshow minor mode is on, the menu bar is augmented with hideshow
  commands and the hideshow commands are enabled.  The variables
! `selective-display' and `selective-display-ellipses' are set to t.
! Last, the normal hook `hs-minor-mode-hook' is run; see the doc for `run-hooks'.
  
  Turning hideshow minor mode off reverts the menu bar and the
*************** variables to default values and disables
*** 4322,4326 ****
  ;;;***
  
! ;;;### (autoloads (make-hippie-expand-function hippie-expand) "hippie-exp" "hippie-exp.el" (12416 52243))
  ;;; Generated autoloads from hippie-exp.el
  
--- 4604,4608 ----
  ;;;***
  
! ;;;### (autoloads (make-hippie-expand-function hippie-expand) "hippie-exp" "hippie-exp.el" (12550 53148))
  ;;; Generated autoloads from hippie-exp.el
  
*************** argument VERBOSE non-nil makes the funct
*** 4359,4363 ****
  ;;;***
  
! ;;;### (autoloads (icomplete-minibuffer-setup icomplete-mode) "icomplete" "icomplete.el" (12437 1799))
  ;;; Generated autoloads from icomplete.el
  
--- 4641,4645 ----
  ;;;***
  
! ;;;### (autoloads (icomplete-minibuffer-setup icomplete-mode) "icomplete" "icomplete.el" (12536 45574))
  ;;; Generated autoloads from icomplete.el
  
*************** Usually run by inclusion in `minibuffer-
*** 4372,4376 ****
  ;;;***
  
! ;;;### (autoloads (icon-mode) "icon" "icon.el" (12344 39047))
  ;;; Generated autoloads from icon.el
  
--- 4654,4658 ----
  ;;;***
  
! ;;;### (autoloads (icon-mode) "icon" "icon.el" (12536 45574))
  ;;; Generated autoloads from icon.el
  
*************** with no args, if that value is non-nil."
*** 4410,4416 ****
  ;;;***
  
! ;;;### (autoloads (ielm) "ielm" "ielm.el" (12275 13201))
  ;;; Generated autoloads from ielm.el
! (add-hook 'same-window-buffer-names "*ielm*")
  
  (autoload (quote ielm) "ielm" "\
--- 4692,4698 ----
  ;;;***
  
! ;;;### (autoloads (ielm) "ielm" "ielm.el" (12536 45574))
  ;;; Generated autoloads from ielm.el
!  (add-hook 'same-window-buffer-names "*ielm*")
  
  (autoload (quote ielm) "ielm" "\
*************** Switches to the buffer `*ielm*', or crea
*** 4420,4424 ****
  ;;;***
  
! ;;;### (autoloads (imenu imenu-add-to-menubar) "imenu" "imenu.el" (12312 10290))
  ;;; Generated autoloads from imenu.el
  
--- 4702,4706 ----
  ;;;***
  
! ;;;### (autoloads (imenu imenu-add-to-menubar) "imenu" "imenu.el" (12620 12567))
  ;;; Generated autoloads from imenu.el
  
*************** function, variable or type) that is to a
*** 4445,4458 ****
  For emacs-lisp-mode for example PATTERN would look like:
  
! '((nil \"^\\s-*(def\\(un\\|subst\\|macro\\|advice\\)\\s-+\\([-A-Za-z0-9+]+\\)\" 2)
!   (\"*Vars*\" \"^\\s-*(def\\(var\\|const\\)\\s-+\\([-A-Za-z0-9+]+\\)\" 2)
!   (\"*Types*\" \"^\\s-*(def\\(type\\|struct\\|class\\|ine-condition\\)\\s-+\\([-A-Za-z0-9+]+\\)\" 2))
  
  The variable is buffer-local.")
  
  (autoload (quote imenu-add-to-menubar) "imenu" "\
! Adds an \"imenu\" entry to the menubar for the current local keymap.
! NAME is the string naming the menu to be added.
! See 'imenu' for more information." t nil)
  
  (autoload (quote imenu) "imenu" "\
--- 4727,4742 ----
  For emacs-lisp-mode for example PATTERN would look like:
  
! '((nil \"^\\\\s-*(def\\\\(un\\\\|subst\\\\|macro\\\\|advice\\\\)\\\\s-+\\\\([-A-Za-z0-9+]+\\\\)\" 2)
!   (\"*Vars*\" \"^\\\\s-*(def\\\\(var\\\\|const\\\\)\\\\s-+\\\\([-A-Za-z0-9+]+\\\\)\" 2)
!   (\"*Types*\" \"^\\\\s-*(def\\\\(type\\\\|struct\\\\|class\\\\|ine-condition\\\\)\\\\s-+\\\\([-A-Za-z0-9+]+\\\\)\" 2))
  
  The variable is buffer-local.")
  
+ (make-variable-buffer-local (quote imenu-generic-expression))
+ 
  (autoload (quote imenu-add-to-menubar) "imenu" "\
! Adds an `imenu' entry to the menu bar for the current buffer.
! NAME is a string used to name the menu bar item.
! See the command `imenu' for more information." t nil)
  
  (autoload (quote imenu) "imenu" "\
*************** See `imenu-choose-buffer-index' for more
*** 4462,4466 ****
  ;;;***
  
! ;;;### (autoloads (inferior-lisp) "inf-lisp" "inf-lisp.el" (12338 880))
  ;;; Generated autoloads from inf-lisp.el
  
--- 4746,4750 ----
  ;;;***
  
! ;;;### (autoloads (inferior-lisp) "inf-lisp" "inf-lisp.el" (12623 7617))
  ;;; Generated autoloads from inf-lisp.el
  
*************** This format string should use `%s' to su
*** 4479,4484 ****
  and should result in a Lisp expression that will command the inferior Lisp
  to load that file.  The default works acceptably on most Lisps.
! The string \"(progn (load \\\"%s\\\" :verbose nil :print t) (values))\\
! \"
  produces cosmetically superior output for this application,
  but it works only in Common Lisp.")
--- 4763,4767 ----
  and should result in a Lisp expression that will command the inferior Lisp
  to load that file.  The default works acceptably on most Lisps.
! The string \"(progn (load \\\"%s\\\" :verbose nil :print t) (values))\\n\"
  produces cosmetically superior output for this application,
  but it works only in Common Lisp.")
*************** Inferior Lisp buffer.
*** 4491,4496 ****
  
  More precise choices:
! Lucid Common Lisp: \"^\\(>\\|\\(->\\)+\\) *\"
! franz: \"^\\(->\\|<[0-9]*>:\\) *\"
  kcl: \"^>+ *\"
  
--- 4774,4779 ----
  
  More precise choices:
! Lucid Common Lisp: \"^\\\\(>\\\\|\\\\(->\\\\)+\\\\) *\"
! franz: \"^\\\\(->\\\\|<[0-9]*>:\\\\) *\"
  kcl: \"^>+ *\"
  
*************** of `inferior-lisp-program').  Runs the h
*** 4508,4512 ****
  `inferior-lisp-mode-hook' (after the `comint-mode-hook' is run).
  \(Type \\[describe-mode] in the process buffer for a list of commands.)" t nil)
! (add-hook 'same-window-buffer-names "*inferior-lisp*")
  
  (defalias (quote run-lisp) (quote inferior-lisp))
--- 4791,4795 ----
  `inferior-lisp-mode-hook' (after the `comint-mode-hook' is run).
  \(Type \\[describe-mode] in the process buffer for a list of commands.)" t nil)
!  (add-hook 'same-window-buffer-names "*inferior-lisp*")
  
  (defalias (quote run-lisp) (quote inferior-lisp))
*************** of `inferior-lisp-program').  Runs the h
*** 4514,4520 ****
  ;;;***
  
! ;;;### (autoloads (Info-goto-emacs-key-command-node Info-goto-emacs-command-node info-standalone info) "info" "info.el" (12429 5597))
  ;;; Generated autoloads from info.el
! (add-hook 'same-window-buffer-names "*info*")
  
  (autoload (quote info) "info" "\
--- 4797,4803 ----
  ;;;***
  
! ;;;### (autoloads (Info-goto-emacs-key-command-node Info-goto-emacs-command-node info-standalone info) "info" "info.el" (12686 40577))
  ;;; Generated autoloads from info.el
!  (add-hook 'same-window-buffer-names "*info*")
  
  (autoload (quote info) "info" "\
*************** the default is the top-level directory o
*** 4524,4528 ****
  
  In interactive use, a prefix argument directs this command
! to read a file name from the minibuffer." t nil)
  
  (autoload (quote info-standalone) "info" "\
--- 4807,4815 ----
  
  In interactive use, a prefix argument directs this command
! to read a file name from the minibuffer.
! 
! The search path for Info files is in the variable `Info-directory-list'.
! The top-level Info directory is made by combining all the files named `dir' 
! in all the directories in that path." t nil)
  
  (autoload (quote info-standalone) "info" "\
*************** the variable `Info-file-list-for-emacs'.
*** 4546,4550 ****
  ;;;***
  
! ;;;### (autoloads (batch-info-validate Info-validate Info-split Info-tagify) "informat" "informat.el" (12429 6068))
  ;;; Generated autoloads from informat.el
  
--- 4833,4837 ----
  ;;;***
  
! ;;;### (autoloads (batch-info-validate Info-validate Info-split Info-tagify) "informat" "informat.el" (12536 45574))
  ;;; Generated autoloads from informat.el
  
*************** For example, invoke \"emacs -batch -f ba
*** 4577,4581 ****
  ;;;***
  
! ;;;### (autoloads (iso-accents-mode) "iso-acc" "iso-acc.el" (12405 18297))
  ;;; Generated autoloads from iso-acc.el
  
--- 4864,4868 ----
  ;;;***
  
! ;;;### (autoloads (iso-accents-mode) "iso-acc" "iso-acc.el" (12704 56790))
  ;;; Generated autoloads from iso-acc.el
  
*************** When Iso-accents mode is enabled, accent
*** 4587,4593 ****
  letter key so that it inserts an ISO accented letter.
  
! The variable `iso-accents-enable' specifies the list of characters to
! enable as accents.  If you don't need all of them, remove the ones you
! don't need from that list.
  
  Special combinations: ~c gives a c with cedilla,
--- 4874,4879 ----
  letter key so that it inserts an ISO accented letter.
  
! You can customize ISO Accents mode to a particular language
! with the command `iso-accents-customize'.
  
  Special combinations: ~c gives a c with cedilla,
*************** Special combinations: ~c gives a c with 
*** 4597,4601 ****
  /a gives a with ring.
  /e gives an a-e ligature.
! ~< and ~> give guillemets.
  ~! gives an inverted exclamation mark.
  ~? gives an inverted question mark.
--- 4883,4887 ----
  /a gives a with ring.
  /e gives an a-e ligature.
! ~< and ~> give guillemots.
  ~! gives an inverted exclamation mark.
  ~? gives an inverted question mark.
*************** and a negative argument disables it." t 
*** 4606,4610 ****
  ;;;***
  
! ;;;### (autoloads (ispell-message ispell-minor-mode ispell-complete-word-interior-frag ispell-complete-word ispell-continue ispell-buffer ispell-region ispell-change-dictionary ispell-kill-ispell ispell-help ispell-word) "ispell" "ispell.el" (12437 2052))
  ;;; Generated autoloads from ispell.el
  
--- 4892,4896 ----
  ;;;***
  
! ;;;### (autoloads (ispell-message ispell-minor-mode ispell-complete-word-interior-frag ispell-complete-word ispell-continue ispell-buffer ispell-region ispell-change-dictionary ispell-kill-ispell ispell-help ispell-word) "ispell" "ispell.el" (12690 11518))
  ;;; Generated autoloads from ispell.el
  
*************** You can bind this to the key C-c i in GN
*** 4779,4793 ****
  ;;;***
  
! ;;;### (autoloads (auto-compression-mode) "jka-compr" "jka-compr.el" (12437 52288))
  ;;; Generated autoloads from jka-compr.el
! 
! (autoload (quote auto-compression-mode) "jka-compr" "\
  Toggle automatic file compression and uncompression.
  With prefix argument ARG, turn auto compression on if positive, else off.
! Returns the new status of auto compression (non-nil means on)." t nil)
  
  ;;;***
  
! ;;;### (autoloads (ledit-from-lisp-mode ledit-mode) "ledit" "ledit.el" (11181 53296))
  ;;; Generated autoloads from ledit.el
  
--- 5065,5086 ----
  ;;;***
  
! ;;;### (autoloads nil "jka-compr" "jka-compr.el" (12673 9361))
  ;;; Generated autoloads from jka-compr.el
! (defun auto-compression-mode (&optional arg)
!  "\
  Toggle automatic file compression and uncompression.
  With prefix argument ARG, turn auto compression on if positive, else off.
! Returns the new status of auto compression (non-nil means on)."
!  (interactive "P")
!  (if (not (fboundp 'jka-compr-installed-p))
!      (progn
!        (require 'jka-compr)
!        ;; That turned the mode on, so make it initially off.
!        (toggle-auto-compression)))
!  (toggle-auto-compression arg t))
  
  ;;;***
  
! ;;;### (autoloads (ledit-from-lisp-mode ledit-mode) "ledit" "ledit.el" (12536 45574))
  ;;; Generated autoloads from ledit.el
  
*************** do (setq lisp-mode-hook 'ledit-from-lisp
*** 4818,4822 ****
  ;;;***
  
! ;;;### (autoloads (life) "life" "life.el" (12351 33924))
  ;;; Generated autoloads from life.el
  
--- 5111,5115 ----
  ;;;***
  
! ;;;### (autoloads (life) "life" "life.el" (12536 45574))
  ;;; Generated autoloads from life.el
  
*************** generations (this defaults to 1)." t nil
*** 4829,4833 ****
  ;;;***
  
! ;;;### (autoloads (unload-feature) "loadhist" "loadhist.el" (12315 24591))
  ;;; Generated autoloads from loadhist.el
  
--- 5122,5126 ----
  ;;;***
  
! ;;;### (autoloads (unload-feature) "loadhist" "loadhist.el" (12536 45574))
  ;;; Generated autoloads from loadhist.el
  
*************** is nil, raise an error." t nil)
*** 4839,4847 ****
  ;;;***
  
! ;;;### (autoloads (print-region lpr-region print-buffer lpr-buffer) "lpr" "lpr.el" (12217 8152))
  ;;; Generated autoloads from lpr.el
  
  (defvar lpr-switches nil "\
! *List of strings to pass as extra switch args to `lpr' when it is invoked.")
  
  (defvar lpr-command (if (memq system-type (quote (usg-unix-v dgux hpux irix))) "lp" "lpr") "\
--- 5132,5141 ----
  ;;;***
  
! ;;;### (autoloads (print-region lpr-region print-buffer lpr-buffer) "lpr" "lpr.el" (12538 55123))
  ;;; Generated autoloads from lpr.el
  
  (defvar lpr-switches nil "\
! *List of strings to pass as extra options for the printer program.
! See `lpr-command'.")
  
  (defvar lpr-command (if (memq system-type (quote (usg-unix-v dgux hpux irix))) "lp" "lpr") "\
*************** Print region contents as with Unix comma
*** 4866,4870 ****
  ;;;***
  
! ;;;### (autoloads (phases-of-moon) "lunar" "lunar.el" (12384 53826))
  ;;; Generated autoloads from lunar.el
  
--- 5160,5175 ----
  ;;;***
  
! ;;;### (autoloads nil "ls-lisp" "ls-lisp.el" (12541 53441))
! ;;; Generated autoloads from ls-lisp.el
! 
! (defvar ls-lisp-support-shell-wildcards t "\
! *Non-nil means file patterns are treated as shell wildcards.
! nil means they are treated as Emacs regexps (for backward compatibility).
! This variable is checked by \\[insert-directory] only when `ls-lisp.el'
! package is used.")
! 
! ;;;***
! 
! ;;;### (autoloads (phases-of-moon) "lunar" "lunar.el" (12550 33373))
  ;;; Generated autoloads from lunar.el
  
*************** This function is suitable for execution 
*** 4877,4881 ****
  ;;;***
  
! ;;;### (autoloads (apply-macro-to-region-lines kbd-macro-query insert-kbd-macro name-last-kbd-macro) "macros" "macros.el" (12342 4949))
  ;;; Generated autoloads from macros.el
  
--- 5182,5186 ----
  ;;;***
  
! ;;;### (autoloads (apply-macro-to-region-lines kbd-macro-query insert-kbd-macro name-last-kbd-macro) "macros" "macros.el" (12554 59502))
  ;;; Generated autoloads from macros.el
  
*************** and then select the region of un-tablifi
*** 4953,4961 ****
  `\\[apply-macro-to-region-lines]' to build the table from the names.
  " t nil)
! (define-key ctl-x-map "q" 'kbd-macro-query)
  
  ;;;***
  
! ;;;### (autoloads (what-domain mail-extract-address-components) "mail-extr" "mail-extr.el" (12233 29328))
  ;;; Generated autoloads from mail-extr.el
  
--- 5258,5266 ----
  `\\[apply-macro-to-region-lines]' to build the table from the names.
  " t nil)
!  (define-key ctl-x-map "q" 'kbd-macro-query)
  
  ;;;***
  
! ;;;### (autoloads (what-domain mail-extract-address-components) "mail-extr" "mail-extr.el" (12587 31302))
  ;;; Generated autoloads from mail-extr.el
  
*************** Convert mail domain DOMAIN to the countr
*** 4977,4981 ****
  ;;;***
  
! ;;;### (autoloads (mail-hist-put-headers-into-history mail-hist-enable mail-hist-define-keys) "mail-hist" "mail-hist.el" (12267 49663))
  ;;; Generated autoloads from mail-hist.el
  
--- 5282,5286 ----
  ;;;***
  
! ;;;### (autoloads (mail-hist-put-headers-into-history mail-hist-enable mail-hist-define-keys) "mail-hist" "mail-hist.el" (12689 407))
  ;;; Generated autoloads from mail-hist.el
  
*************** This function normally would be called w
*** 4997,5001 ****
  ;;;***
  
! ;;;### (autoloads (mail-fetch-field mail-file-babyl-p) "mail-utils" "mail-utils.el" (12412 12667))
  ;;; Generated autoloads from mail-utils.el
  
--- 5302,5306 ----
  ;;;***
  
! ;;;### (autoloads (mail-fetch-field mail-file-babyl-p) "mail-utils" "mail-utils.el" (12653 17008))
  ;;; Generated autoloads from mail-utils.el
  
*************** If third arg ALL is non-nil, concatenate
*** 5015,5022 ****
  ;;;***
  
! ;;;### (autoloads (define-mail-abbrev build-mail-abbrevs mail-abbrevs-setup) "mailabbrev" "mailabbrev.el" (12437 34059))
  ;;; Generated autoloads from mailabbrev.el
  
! (autoload (quote mail-abbrevs-setup) "mailabbrev" nil nil nil)
  
  (autoload (quote build-mail-abbrevs) "mailabbrev" "\
--- 5320,5328 ----
  ;;;***
  
! ;;;### (autoloads (define-mail-abbrev build-mail-abbrevs mail-abbrevs-setup) "mailabbrev" "mailabbrev.el" (12609 17904))
  ;;; Generated autoloads from mailabbrev.el
  
! (autoload (quote mail-abbrevs-setup) "mailabbrev" "\
! Initialize use of the `mailabbrev' package." nil nil)
  
  (autoload (quote build-mail-abbrevs) "mailabbrev" "\
*************** If DEFINITION contains multiple addresse
*** 5030,5034 ****
  ;;;***
  
! ;;;### (autoloads (define-mail-alias) "mailalias" "mailalias.el" (12289 15684))
  ;;; Generated autoloads from mailalias.el
  
--- 5336,5340 ----
  ;;;***
  
! ;;;### (autoloads (mail-complete define-mail-alias) "mailalias" "mailalias.el" (12609 15124))
  ;;; Generated autoloads from mailalias.el
  
*************** can be separated by spaces; an address c
*** 5042,5048 ****
  if it is quoted with double-quotes." t nil)
  
  ;;;***
  
! ;;;### (autoloads (makefile-mode) "make-mode" "make-mode.el" (12436 36139))
  ;;; Generated autoloads from make-mode.el
  
--- 5348,5359 ----
  if it is quoted with double-quotes." t nil)
  
+ (autoload (quote mail-complete) "mailalias" "\
+ Perform completion on header field or word preceding point.
+ Completable headers are according to `mail-complete-alist'.  If none matches
+ current header, calls `mail-complete-function' and passes prefix arg if any." t nil)
+ 
  ;;;***
  
! ;;;### (autoloads (makefile-mode) "make-mode" "make-mode.el" (12594 2787))
  ;;; Generated autoloads from make-mode.el
  
*************** makefile-special-targets-list:
*** 5123,5127 ****
  ;;;***
  
! ;;;### (autoloads (make-command-summary) "makesum" "makesum.el" (11181 53304))
  ;;; Generated autoloads from makesum.el
  
--- 5434,5438 ----
  ;;;***
  
! ;;;### (autoloads (make-command-summary) "makesum" "makesum.el" (12536 45574))
  ;;; Generated autoloads from makesum.el
  
*************** Previous contents of that buffer are kil
*** 5132,5136 ****
  ;;;***
  
! ;;;### (autoloads (man) "man" "man.el" (12328 56650))
  ;;; Generated autoloads from man.el
  
--- 5443,5447 ----
  ;;;***
  
! ;;;### (autoloads (man) "man" "man.el" (12599 56964))
  ;;; Generated autoloads from man.el
  
*************** If a buffer already exists for this man 
*** 5147,5198 ****
  ;;;***
  
! ;;;### (autoloads (map-y-or-n-p) "map-ynp" "map-ynp.el" (12247 10697))
! ;;; Generated autoloads from map-ynp.el
! 
! (autoload (quote map-y-or-n-p) "map-ynp" "\
! Ask a series of boolean questions.
! Takes args PROMPTER ACTOR LIST, and optional args HELP and ACTION-ALIST.
! 
! LIST is a list of objects, or a function of no arguments to return the next
! object or nil.
! 
! If PROMPTER is a string, the prompt is (format PROMPTER OBJECT).  If not
! a string, PROMPTER is a function of one arg (an object from LIST), which
! returns a string to be used as the prompt for that object.  If the return
! value is not a string, it may be nil to ignore the object or non-nil to act
! on the object without asking the user.
! 
! ACTOR is a function of one arg (an object from LIST),
! which gets called with each object that the user answers `yes' for.
! 
! If HELP is given, it is a list (OBJECT OBJECTS ACTION),
! where OBJECT is a string giving the singular noun for an elt of LIST;
! OBJECTS is the plural noun for elts of LIST, and ACTION is a transitive
! verb describing ACTOR.  The default is (\"object\" \"objects\" \"act on\").
! 
! At the prompts, the user may enter y, Y, or SPC to act on that object;
! n, N, or DEL to skip that object; ! to act on all following objects;
! ESC or q to exit (skip all following objects); . (period) to act on the
! current object and then exit; or \\[help-command] to get help.
! 
! If ACTION-ALIST is given, it is an alist (KEY FUNCTION HELP) of extra keys
! that will be accepted.  KEY is a character; FUNCTION is a function of one
! arg (an object from LIST); HELP is a string.  When the user hits KEY,
! FUNCTION is called.  If it returns non-nil, the object is considered
! \"acted upon\", and the next object from LIST is processed.  If it returns
! nil, the prompt is repeated for the same object.
! 
! Final optional argument NO-CURSOR-IN-ECHO-AREA non-nil says not to set
! `cursor-in-echo-area' while prompting.
  
! This function uses `query-replace-map' to define the standard responses,
! but not all of the responses which `query-replace' understands
! are meaningful here.
! 
! Returns the number of actions taken." nil nil)
  
  ;;;***
  
! ;;;### (autoloads (mh-letter-mode mh-smail-other-window mh-smail-batch mh-smail) "mh-comp" "mh-comp.el" (12441 32363))
  ;;; Generated autoloads from mh-comp.el
  
--- 5458,5497 ----
  ;;;***
  
! ;;;### (autoloads (metamail-region metamail-buffer metamail-interpret-body metamail-interpret-header) "metamail" "metamail.el" (12663 54771))
! ;;; Generated autoloads from metamail.el
  
! (autoload (quote metamail-interpret-header) "metamail" "\
! Interpret a header part of a MIME message in current buffer.
! Its body part is not interpreted at all." t nil)
! 
! (autoload (quote metamail-interpret-body) "metamail" "\
! Interpret a body part of a MIME message in current buffer.
! Optional argument VIEWMODE specifies the value of the
! EMACS_VIEW_MODE environment variable (defaulted to 1).
! Optional argument NODISPLAY non-nil means buffer is not
! redisplayed as output is inserted.
! Its header part is not interpreted at all." t nil)
! 
! (autoload (quote metamail-buffer) "metamail" "\
! Process current buffer through `metamail'.
! Optional argument VIEWMODE specifies the value of the
! EMACS_VIEW_MODE environment variable (defaulted to 1).
! Optional argument BUFFER specifies a buffer to be filled (nil
! means current).
! Optional argument NODISPLAY non-nil means buffer is not
! redisplayed as output is inserted." t nil)
! 
! (autoload (quote metamail-region) "metamail" "\
! Process current region through 'metamail'.
! Optional argument VIEWMODE specifies the value of the
! EMACS_VIEW_MODE environment variable (defaulted to 1).
! Optional argument BUFFER specifies a buffer to be filled (nil
! means current).
! Optional argument NODISPLAY non-nil means buffer is not
! redisplayed as output is inserted." t nil)
  
  ;;;***
  
! ;;;### (autoloads (mh-letter-mode mh-smail-other-window mh-smail-batch mh-smail) "mh-comp" "mh-comp.el" (12536 45574))
  ;;; Generated autoloads from mh-comp.el
  
*************** invoked with no args, if those values ar
*** 5252,5256 ****
  ;;;***
  
! ;;;### (autoloads (mh-version mh-rmail) "mh-e" "mh-e.el" (12441 32337))
  ;;; Generated autoloads from mh-e.el
  
--- 5551,5555 ----
  ;;;***
  
! ;;;### (autoloads (mh-version mh-rmail) "mh-e" "mh-e.el" (12705 64721))
  ;;; Generated autoloads from mh-e.el
  
*************** Display version information about mh-e a
*** 5265,5269 ****
  ;;;***
  
! ;;;### (autoloads nil "mh-mime" "mh-mime.el" (12441 32419))
  ;;; Generated autoloads from mh-mime.el
  
--- 5564,5568 ----
  ;;;***
  
! ;;;### (autoloads nil "mh-mime" "mh-mime.el" (12536 45574))
  ;;; Generated autoloads from mh-mime.el
  
*************** Legal MIME content types.  See documenta
*** 5273,5277 ****
  ;;;***
  
! ;;;### (autoloads nil "mh-utils" "mh-utils.el" (12441 32380))
  ;;; Generated autoloads from mh-utils.el
  
--- 5572,5576 ----
  ;;;***
  
! ;;;### (autoloads nil "mh-utils" "mh-utils.el" (12557 21887))
  ;;; Generated autoloads from mh-utils.el
  
*************** Legal MIME content types.  See documenta
*** 5282,5286 ****
  ;;;***
  
! ;;;### (autoloads (convert-mocklisp-buffer) "mlconvert" "mlconvert.el" (12144 35507))
  ;;; Generated autoloads from mlconvert.el
  
--- 5581,5585 ----
  ;;;***
  
! ;;;### (autoloads (convert-mocklisp-buffer) "mlconvert" "mlconvert.el" (12536 45574))
  ;;; Generated autoloads from mlconvert.el
  
*************** Convert buffer of Mocklisp code to real 
*** 5290,5294 ****
  ;;;***
  
! ;;;### (autoloads (modula-2-mode) "modula2" "modula2.el" (12352 43076))
  ;;; Generated autoloads from modula2.el
  
--- 5589,5593 ----
  ;;;***
  
! ;;;### (autoloads (modula-2-mode) "modula2" "modula2.el" (12524 26272))
  ;;; Generated autoloads from modula2.el
  
*************** followed by the first character of the c
*** 5319,5323 ****
  ;;;***
  
! ;;;### (autoloads (mpuz) "mpuz" "mpuz.el" (11684 27378))
  ;;; Generated autoloads from mpuz.el
  
--- 5618,5622 ----
  ;;;***
  
! ;;;### (autoloads (mpuz) "mpuz" "mpuz.el" (12536 45574))
  ;;; Generated autoloads from mpuz.el
  
*************** Multiplication puzzle with GNU Emacs." t
*** 5327,5331 ****
  ;;;***
  
! ;;;### (autoloads (nnkiboze-generate-groups) "nnkiboze" "nnkiboze.el" (12442 58296))
  ;;; Generated autoloads from nnkiboze.el
  
--- 5626,5630 ----
  ;;;***
  
! ;;;### (autoloads (nnkiboze-generate-groups) "nnkiboze" "nnkiboze.el" (12540 16656))
  ;;; Generated autoloads from nnkiboze.el
  
*************** Finds out what articles are to be part o
*** 5336,5340 ****
  ;;;***
  
! ;;;### (autoloads (nnml-generate-nov-databases) "nnml" "nnml.el" (12442 58338))
  ;;; Generated autoloads from nnml.el
  
--- 5635,5639 ----
  ;;;***
  
! ;;;### (autoloads (nnml-generate-nov-databases) "nnml" "nnml.el" (12536 45574))
  ;;; Generated autoloads from nnml.el
  
*************** Generate nov databases in all nnml mail 
*** 5344,5348 ****
  ;;;***
  
! ;;;### (autoloads (disable-command enable-command disabled-command-hook) "novice" "novice.el" (12088 17075))
  ;;; Generated autoloads from novice.el
  
--- 5643,5647 ----
  ;;;***
  
! ;;;### (autoloads (disable-command enable-command disabled-command-hook) "novice" "novice.el" (12536 45574))
  ;;; Generated autoloads from novice.el
  
*************** to future sessions." t nil)
*** 5363,5367 ****
  ;;;***
  
! ;;;### (autoloads (nroff-mode) "nroff-mode" "nroff-mode.el" (12300 10924))
  ;;; Generated autoloads from nroff-mode.el
  
--- 5662,5666 ----
  ;;;***
  
! ;;;### (autoloads (nroff-mode) "nroff-mode" "nroff-mode.el" (12536 45574))
  ;;; Generated autoloads from nroff-mode.el
  
*************** closing requests for requests that are u
*** 5375,5379 ****
  ;;;***
  
! ;;;### (autoloads (edit-options list-options) "options" "options.el" (12135 28451))
  ;;; Generated autoloads from options.el
  
--- 5674,5678 ----
  ;;;***
  
! ;;;### (autoloads (edit-options list-options) "options" "options.el" (12536 45574))
  ;;; Generated autoloads from options.el
  
*************** Type \\[describe-mode] in that buffer fo
*** 5389,5393 ****
  ;;;***
  
! ;;;### (autoloads (outline-minor-mode outline-mode) "outline" "outline.el" (12197 36782))
  ;;; Generated autoloads from outline.el
  
--- 5688,5692 ----
  ;;;***
  
! ;;;### (autoloads (outline-minor-mode outline-mode) "outline" "outline.el" (12536 45574))
  ;;; Generated autoloads from outline.el
  
*************** Type \\[describe-mode] in that buffer fo
*** 5395,5402 ****
  Set major mode for editing outlines with selective display.
  Headings are lines which start with asterisks: one for major headings,
! two for subheadings, etc.  Lines not starting with asterisks are body lines. 
  
  Body text or subheadings under a heading can be made temporarily
! invisible, or visible again.  Invisible lines are attached to the end 
  of the heading, so they move with it, if the line is killed and yanked
  back.  A heading with text hidden under it is marked with an ellipsis (...).
--- 5694,5701 ----
  Set major mode for editing outlines with selective display.
  Headings are lines which start with asterisks: one for major headings,
! two for subheadings, etc.  Lines not starting with asterisks are body lines.
  
  Body text or subheadings under a heading can be made temporarily
! invisible, or visible again.  Invisible lines are attached to the end
  of the heading, so they move with it, if the line is killed and yanked
  back.  A heading with text hidden under it is marked with an ellipsis (...).
*************** See the command `outline-mode' for more 
*** 5439,5443 ****
  ;;;***
  
! ;;;### (autoloads (pascal-mode) "pascal" "pascal.el" (12437 2286))
  ;;; Generated autoloads from pascal.el
  
--- 5738,5755 ----
  ;;;***
  
! ;;;### (autoloads (show-paren-mode) "paren" "paren.el" (12605 9129))
! ;;; Generated autoloads from paren.el
! 
! (autoload (quote show-paren-mode) "paren" "\
! Toggle Show Paren mode.
! With prefix ARG, turn Show Paren mode on if and only if ARG is positive.
! Returns the new status of Show Paren mode (non-nil means on).
! 
! When Show Paren mode is enabled, any matching parenthesis is highlighted
! after `show-paren-delay' seconds of Emacs idle time." t nil)
! 
! ;;;***
! 
! ;;;### (autoloads (pascal-mode) "pascal" "pascal.el" (12695 25037))
  ;;; Generated autoloads from pascal.el
  
*************** Variables controlling indentation/edit s
*** 5468,5473 ****
      Indentation for case statements.
   pascal-auto-newline      (default nil)
!     Non-nil means automatically newline after simcolons and the punctation mark
!     after an end.
   pascal-tab-always-indent (default t)
      Non-nil means TAB in Pascal mode should always reindent the current line,
--- 5780,5785 ----
      Indentation for case statements.
   pascal-auto-newline      (default nil)
!     Non-nil means automatically newline after semicolons and the punctuation
!     mark after an end.
   pascal-tab-always-indent (default t)
      Non-nil means TAB in Pascal mode should always reindent the current line,
*************** no args, if that value is non-nil." t ni
*** 5487,5491 ****
  ;;;***
  
! ;;;### (autoloads (pc-bindings-mode) "pc-mode" "pc-mode.el" (12437 2392))
  ;;; Generated autoloads from pc-mode.el
  
--- 5799,5803 ----
  ;;;***
  
! ;;;### (autoloads (pc-bindings-mode) "pc-mode" "pc-mode.el" (12704 56926))
  ;;; Generated autoloads from pc-mode.el
  
*************** C-Escape does list-buffers." t nil)
*** 5502,5506 ****
  ;;;***
  
! ;;;### (autoloads (pc-selection-mode) "pc-select" "pc-select.el" (12419 61975))
  ;;; Generated autoloads from pc-select.el
  
--- 5814,5818 ----
  ;;;***
  
! ;;;### (autoloads (pc-selection-mode) "pc-select" "pc-select.el" (12599 57094))
  ;;; Generated autoloads from pc-select.el
  
*************** the MAC GUI or MS-Windows (sorry for the
*** 5519,5523 ****
  ;;;***
  
! ;;;### (autoloads (perl-mode) "perl-mode" "perl-mode.el" (12309 32447))
  ;;; Generated autoloads from perl-mode.el
  
--- 5831,5835 ----
  ;;;***
  
! ;;;### (autoloads (perl-mode) "perl-mode" "perl-mode.el" (12587 31317))
  ;;; Generated autoloads from perl-mode.el
  
*************** Turning on Perl mode runs the normal hoo
*** 5570,5574 ****
  ;;;***
  
! ;;;### (autoloads (picture-mode) "picture" "picture.el" (12189 27091))
  ;;; Generated autoloads from picture.el
  
--- 5882,5886 ----
  ;;;***
  
! ;;;### (autoloads (picture-mode) "picture" "picture.el" (12578 16858))
  ;;; Generated autoloads from picture.el
  
*************** they are not defaultly assigned to keys.
*** 5634,5638 ****
  ;;;***
  
! ;;;### (autoloads (pp-eval-last-sexp pp-eval-expression pp) "pp" "pp.el" (12437 2425))
  ;;; Generated autoloads from pp.el
  
--- 5946,5950 ----
  ;;;***
  
! ;;;### (autoloads (pp-eval-last-sexp pp-eval-expression pp) "pp" "pp.el" (12543 32626))
  ;;; Generated autoloads from pp.el
  
*************** Ignores leading comment characters." t n
*** 5656,5660 ****
  ;;;***
  
! ;;;### (autoloads (run-prolog prolog-mode) "prolog" "prolog.el" (12117 59000))
  ;;; Generated autoloads from prolog.el
  
--- 5968,5972 ----
  ;;;***
  
! ;;;### (autoloads (run-prolog prolog-mode) "prolog" "prolog.el" (12536 45574))
  ;;; Generated autoloads from prolog.el
  
*************** Run an inferior Prolog process, input an
*** 5672,5676 ****
  ;;;***
  
! ;;;### (autoloads (ps-despool ps-spool-region-with-faces ps-spool-region ps-spool-buffer-with-faces ps-spool-buffer ps-print-region-with-faces ps-print-region ps-print-buffer-with-faces ps-print-buffer) "ps-print" "ps-print.el" (12322 31800))
  ;;; Generated autoloads from ps-print.el
  
--- 5984,5988 ----
  ;;;***
  
! ;;;### (autoloads (ps-despool ps-spool-region-with-faces ps-spool-region ps-spool-buffer-with-faces ps-spool-buffer ps-print-region-with-faces ps-print-region ps-print-buffer-with-faces ps-print-buffer) "ps-print" "ps-print.el" (12679 63685))
  ;;; Generated autoloads from ps-print.el
  
*************** number, prompt the user for the name of 
*** 5689,5710 ****
  (autoload (quote ps-print-buffer-with-faces) "ps-print" "\
  Generate and print a PostScript image of the buffer.
- 
  Like `ps-print-buffer', but includes font, color, and underline
! information in the generated image." t nil)
  
  (autoload (quote ps-print-region) "ps-print" "\
  Generate and print a PostScript image of the region.
- 
  Like `ps-print-buffer', but prints just the current region." t nil)
  
  (autoload (quote ps-print-region-with-faces) "ps-print" "\
  Generate and print a PostScript image of the region.
- 
  Like `ps-print-region', but includes font, color, and underline
! information in the generated image." t nil)
  
  (autoload (quote ps-spool-buffer) "ps-print" "\
  Generate and spool a PostScript image of the buffer.
- 
  Like `ps-print-buffer' except that the PostScript image is saved in a
  local buffer to be sent to the printer later.
--- 6001,6020 ----
  (autoload (quote ps-print-buffer-with-faces) "ps-print" "\
  Generate and print a PostScript image of the buffer.
  Like `ps-print-buffer', but includes font, color, and underline
! information in the generated image.  This command works only if you
! are using a window system, so it has a way to determine color values." t nil)
  
  (autoload (quote ps-print-region) "ps-print" "\
  Generate and print a PostScript image of the region.
  Like `ps-print-buffer', but prints just the current region." t nil)
  
  (autoload (quote ps-print-region-with-faces) "ps-print" "\
  Generate and print a PostScript image of the region.
  Like `ps-print-region', but includes font, color, and underline
! information in the generated image.  This command works only if you
! are using a window system, so it has a way to determine color values." t nil)
  
  (autoload (quote ps-spool-buffer) "ps-print" "\
  Generate and spool a PostScript image of the buffer.
  Like `ps-print-buffer' except that the PostScript image is saved in a
  local buffer to be sent to the printer later.
*************** Use the command `ps-despool' to send the
*** 5714,5720 ****
  (autoload (quote ps-spool-buffer-with-faces) "ps-print" "\
  Generate and spool a PostScript image of the buffer.
- 
  Like `ps-spool-buffer', but includes font, color, and underline
! information in the generated image.
  
  Use the command `ps-despool' to send the spooled images to the printer." t nil)
--- 6024,6030 ----
  (autoload (quote ps-spool-buffer-with-faces) "ps-print" "\
  Generate and spool a PostScript image of the buffer.
  Like `ps-spool-buffer', but includes font, color, and underline
! information in the generated image.  This command works only if you
! are using a window system, so it has a way to determine color values.
  
  Use the command `ps-despool' to send the spooled images to the printer." t nil)
*************** Use the command `ps-despool' to send the
*** 5722,5726 ****
  (autoload (quote ps-spool-region) "ps-print" "\
  Generate a PostScript image of the region and spool locally.
- 
  Like `ps-spool-buffer', but spools just the current region.
  
--- 6032,6035 ----
*************** Use the command `ps-despool' to send the
*** 5729,5735 ****
  (autoload (quote ps-spool-region-with-faces) "ps-print" "\
  Generate a PostScript image of the region and spool locally.
- 
  Like `ps-spool-region', but includes font, color, and underline
! information in the generated image.
  
  Use the command `ps-despool' to send the spooled images to the printer." t nil)
--- 6038,6044 ----
  (autoload (quote ps-spool-region-with-faces) "ps-print" "\
  Generate a PostScript image of the region and spool locally.
  Like `ps-spool-region', but includes font, color, and underline
! information in the generated image.  This command works only if you
! are using a window system, so it has a way to determine color values.
  
  Use the command `ps-despool' to send the spooled images to the printer." t nil)
*************** number, prompt the user for the name of 
*** 5749,5753 ****
  ;;;***
  
! ;;;### (autoloads (remote-compile) "rcompile" "rcompile.el" (12437 2458))
  ;;; Generated autoloads from rcompile.el
  
--- 6058,6062 ----
  ;;;***
  
! ;;;### (autoloads (remote-compile) "rcompile" "rcompile.el" (12536 45574))
  ;;; Generated autoloads from rcompile.el
  
*************** See \\[compile]." t nil)
*** 5758,5762 ****
  ;;;***
  
! ;;;### (autoloads (clear-rectangle string-rectangle open-rectangle insert-rectangle yank-rectangle kill-rectangle extract-rectangle delete-extract-rectangle delete-rectangle) "rect" "rect.el" (11969 21329))
  ;;; Generated autoloads from rect.el
  
--- 6067,6071 ----
  ;;;***
  
! ;;;### (autoloads (clear-rectangle string-rectangle open-rectangle insert-rectangle yank-rectangle kill-rectangle extract-rectangle delete-extract-rectangle delete-rectangle) "rect" "rect.el" (12536 45574))
  ;;; Generated autoloads from rect.el
  
*************** When called from a program, requires two
*** 5810,5814 ****
  ;;;***
  
! ;;;### (autoloads (reporter-submit-bug-report) "reporter" "reporter.el" (12169 48728))
  ;;; Generated autoloads from reporter.el
  
--- 6119,6123 ----
  ;;;***
  
! ;;;### (autoloads (reporter-submit-bug-report) "reporter" "reporter.el" (12557 20662))
  ;;; Generated autoloads from reporter.el
  
*************** When called from a program, requires two
*** 5817,5821 ****
  ;;;***
  
! ;;;### (autoloads (reposition-window) "reposition" "reposition.el" (11718 57433))
  ;;; Generated autoloads from reposition.el
  
--- 6126,6130 ----
  ;;;***
  
! ;;;### (autoloads (reposition-window) "reposition" "reposition.el" (12536 45574))
  ;;; Generated autoloads from reposition.el
  
*************** visible (if point is in code and it coul
*** 5838,5846 ****
  comments, including the first comment line, are visible), or to make the
  first comment line visible (if point is in a comment)." t nil)
! (define-key esc-map "\C-l" 'reposition-window)
  
  ;;;***
  
! ;;;### (autoloads (resume-suspend-hook) "resume" "resume.el" (12256 39758))
  ;;; Generated autoloads from resume.el
  
--- 6147,6155 ----
  comments, including the first comment line, are visible), or to make the
  first comment line visible (if point is in a comment)." t nil)
!  (define-key esc-map "\C-l" 'reposition-window)
  
  ;;;***
  
! ;;;### (autoloads (resume-suspend-hook) "resume" "resume.el" (12679 50658))
  ;;; Generated autoloads from resume.el
  
*************** Clear out the file used for transmitting
*** 5850,5854 ****
  ;;;***
  
! ;;;### (autoloads (make-ring ring-p) "ring" "ring.el" (11786 5543))
  ;;; Generated autoloads from ring.el
  
--- 6159,6163 ----
  ;;;***
  
! ;;;### (autoloads (make-ring ring-p) "ring" "ring.el" (12536 45574))
  ;;; Generated autoloads from ring.el
  
*************** Make a ring that can contain SIZE elemen
*** 5861,5867 ****
  ;;;***
  
! ;;;### (autoloads (rlogin) "rlogin" "rlogin.el" (12433 24202))
  ;;; Generated autoloads from rlogin.el
! (add-hook 'same-window-regexps "^\\*rlogin-.*\\*\\(\\|<[0-9]+>\\)")
  
  (autoload (quote rlogin) "rlogin" "\
--- 6170,6176 ----
  ;;;***
  
! ;;;### (autoloads (rlogin) "rlogin" "rlogin.el" (12687 61518))
  ;;; Generated autoloads from rlogin.el
!  (add-hook 'same-window-regexps "^\\*rlogin-.*\\*\\(\\|<[0-9]+>\\)")
  
  (autoload (quote rlogin) "rlogin" "\
*************** variable." t nil)
*** 5901,5905 ****
  ;;;***
  
! ;;;### (autoloads (rmail-input rmail-mode rmail) "rmail" "rmail.el" (12431 36815))
  ;;; Generated autoloads from rmail.el
  
--- 6210,6214 ----
  ;;;***
  
! ;;;### (autoloads (rmail-input rmail-mode rmail) "rmail" "rmail.el" (12673 10151))
  ;;; Generated autoloads from rmail.el
  
*************** value is the user's name.)
*** 5915,5919 ****
  It is useful to set this variable in the site customization file.")
  
! (defvar rmail-ignored-headers "^via:\\|^mail-from:\\|^origin:\\|^status:\\|^received:\\|^x400-originator:\\|^x400-recipients:\\|^x400-received:\\|^x400-mts-identifier:\\|^x400-content-type:\\|^\\(resent-\\|\\)message-id:\\|^summary-line:" "\
  *Regexp to match Header fields that Rmail should normally hide.")
  
--- 6224,6228 ----
  It is useful to set this variable in the site customization file.")
  
! (defvar rmail-ignored-headers "^via:\\|^mail-from:\\|^origin:\\|^status:\\|^received:\\|^x400-originator:\\|^x400-recipients:\\|^x400-received:\\|^x400-mts-identifier:\\|^x400-content-type:\\|^\\(resent-\\|\\)message-id:\\|^summary-line:\\|^resent-date:\\|^nntp-posting-host:" "\
  *Regexp to match Header fields that Rmail should normally hide.")
  
*************** and the value of the environment variabl
*** 5952,5955 ****
--- 6261,6278 ----
  *Regexp for which files are secondary Rmail files.")
  
+ (defvar rmail-mode-hook nil "\
+ List of functions to call when Rmail is invoked.")
+ 
+ (defvar rmail-get-new-mail-hook nil "\
+ List of functions to call when Rmail has retrieved new mail.")
+ 
+ (defvar rmail-show-message-hook nil "\
+ List of functions to call when Rmail displays a message.")
+ 
+ (defvar rmail-delete-message-hook nil "\
+ List of functions to call when Rmail deletes a message.
+ When the hooks are called, the message has been marked deleted but is
+ still the current message in the Rmail buffer.")
+ 
  (autoload (quote rmail) "rmail" "\
  Read and edit incoming mail.
*************** Run Rmail on file FILENAME." t nil)
*** 6018,6022 ****
  ;;;***
  
! ;;;### (autoloads (news-post-news) "rnewspost" "rnewspost.el" (12206 60016))
  ;;; Generated autoloads from rnewspost.el
  
--- 6341,6353 ----
  ;;;***
  
! ;;;### (autoloads nil "rmailsum" "rmailsum.el" (12644 27))
! ;;; Generated autoloads from rmailsum.el
! 
! (defvar rmail-summary-scroll-between-messages t "\
! *Non-nil means Rmail summary scroll commands move between messages.")
! 
! ;;;***
! 
! ;;;### (autoloads (news-post-news) "rnewspost" "rnewspost.el" (12587 31371))
  ;;; Generated autoloads from rnewspost.el
  
*************** Type \\[describe-mode] once editing the 
*** 6027,6031 ****
  ;;;***
  
! ;;;### (autoloads (toggle-rot13-mode rot13-other-window) "rot13" "rot13.el" (11869 10108))
  ;;; Generated autoloads from rot13.el
  
--- 6358,6362 ----
  ;;;***
  
! ;;;### (autoloads (toggle-rot13-mode rot13-other-window) "rot13" "rot13.el" (12536 45574))
  ;;; Generated autoloads from rot13.el
  
*************** Toggle the use of rot 13 encoding for th
*** 6039,6043 ****
  ;;;***
  
! ;;;### (autoloads (resize-minibuffer-mode) "rsz-mini" "rsz-mini.el" (12346 16649))
  ;;; Generated autoloads from rsz-mini.el
  
--- 6370,6374 ----
  ;;;***
  
! ;;;### (autoloads (resize-minibuffer-mode) "rsz-mini" "rsz-mini.el" (12536 45574))
  ;;; Generated autoloads from rsz-mini.el
  
*************** counterparts." t nil)
*** 6099,6103 ****
  ;;;***
  
! ;;;### (autoloads (scheme-mode) "scheme" "scheme.el" (12156 22189))
  ;;; Generated autoloads from scheme.el
  
--- 6430,6434 ----
  ;;;***
  
! ;;;### (autoloads (scheme-mode) "scheme" "scheme.el" (12536 45574))
  ;;; Generated autoloads from scheme.el
  
*************** if that value is non-nil." t nil)
*** 6122,6126 ****
  ;;;***
  
! ;;;### (autoloads (scribe-mode) "scribe" "scribe.el" (12198 51390))
  ;;; Generated autoloads from scribe.el
  
--- 6453,6457 ----
  ;;;***
  
! ;;;### (autoloads (scribe-mode) "scribe" "scribe.el" (12536 45574))
  ;;; Generated autoloads from scribe.el
  
*************** scribe-electric-parenthesis
*** 6144,6148 ****
  ;;;***
  
! ;;;### (autoloads (mail-other-frame mail-other-window mail mail-mode) "sendmail" "sendmail.el" (12442 42000))
  ;;; Generated autoloads from sendmail.el
  
--- 6475,6479 ----
  ;;;***
  
! ;;;### (autoloads (mail-other-frame mail-other-window mail mail-mode) "sendmail" "sendmail.el" (12684 9816))
  ;;; Generated autoloads from sendmail.el
  
*************** Like `mail' command, but display mail bu
*** 6262,6273 ****
  (autoload (quote mail-other-frame) "sendmail" "\
  Like `mail' command, but display mail buffer in another frame." t nil)
! (define-key ctl-x-map "m" 'mail)
! (define-key ctl-x-4-map "m" 'mail-other-window)
! (define-key ctl-x-5-map "m" 'mail-other-frame)
! (add-hook 'same-window-buffer-names "*mail*")
  
  ;;;***
  
! ;;;### (autoloads (server-start) "server" "server.el" (12400 19910))
  ;;; Generated autoloads from server.el
  
--- 6593,6604 ----
  (autoload (quote mail-other-frame) "sendmail" "\
  Like `mail' command, but display mail buffer in another frame." t nil)
!  (define-key ctl-x-map "m" 'mail)
!  (define-key ctl-x-4-map "m" 'mail-other-window)
!  (define-key ctl-x-5-map "m" 'mail-other-frame)
!  (add-hook 'same-window-buffer-names "*mail*")
  
  ;;;***
  
! ;;;### (autoloads (server-start) "server" "server.el" (12596 58821))
  ;;; Generated autoloads from server.el
  
*************** Prefix arg means just kill any existing 
*** 6283,6299 ****
  ;;;***
  
! ;;;### (autoloads (sgml-mode) "sgml-mode" "sgml-mode.el" (12256 39759))
  ;;; Generated autoloads from sgml-mode.el
  
  (autoload (quote sgml-mode) "sgml-mode" "\
! Major mode for editing SGML.
! Makes > display the matching <.  Makes / display matching /.
! Use \\[sgml-validate] to validate your document with an SGML parser." t nil)
  
  ;;;***
  
! ;;;### (autoloads (sh-mode) "sh-script" "sh-script.el" (12441 35631))
  ;;; Generated autoloads from sh-script.el
  
  (autoload (quote sh-mode) "sh-script" "\
  Major mode for editing shell scripts.
--- 6614,6675 ----
  ;;;***
  
! ;;;### (autoloads (html-mode sgml-mode) "sgml-mode" "sgml-mode.el" (12570 12618))
  ;;; Generated autoloads from sgml-mode.el
  
  (autoload (quote sgml-mode) "sgml-mode" "\
! Major mode for editing SGML documents.
! Makes > match <.  Makes / blink matching /.
! Keys <, &, SPC within <>, \" and ' can be electric depending on
! `sgml-quick-keys'.
! 
! Do \\[describe-variable] sgml- SPC to see available variables.
! 
! Use \\[sgml-validate] to validate your document with an SGML parser.
! \\{sgml-mode-map}" t nil)
! 
! (autoload (quote html-mode) "sgml-mode" "\
! Major mode based on SGML mode for editing HTML documents.
! This allows inserting skeleton costructs used in hypertext documents with
! completion.  See below for an introduction to HTML.  Use
! \\[browse-url-of-buffer] to see how this comes out.  See also `sgml-mode' on
! which this is based.
! 
! Do \\[describe-variable] html- SPC and \\[describe-variable] sgml- SPC to see available variables.
! 
! To write fairly well formatted pages you only need to know few things.  Most
! browsers have a function to read the source code of the page being seen, so
! you can imitate various tricks.  Here's a very short HTML primer which you
! can also view with a browser to see what happens:
! 
! <title>A Title Describing Contents</title> should be on every page.  Pages can
! have <h1>Very Major Headlines</h1> through <h6>Very Minor Headlines</h6>
! <hr> Parts can be separated with horizontal rules.
! 
! <p>Paragraphs only need an opening tag.  Line breaks and multiple spaces are
! ignored unless the text is <pre>preformatted.</pre>  Text can be marked as
! <b>bold</b>, <i>italic</i> or <u>underlined</u> using the normal  M-g  or
! Edit/Text Properties/Face commands.
! 
! Pages can have <a name=\"SOMENAME\">named points</a> and can link other points
! to them with <a href=\"#SOMENAME\">see also somename</a>.  In the same way <a
! href=\"URL\">see also URL</a> where URL is a filename relative to current
! directory or something like http://www.cs.indiana.edu/elisp/w3/docs.html.
! 
! Images in many formats can be inlined with <img src=\"URL\">.
! 
! If you mainly create your own documents, `sgml-specials' might be interesting.
! But note that some HTML 2 browsers can't handle &apos;.  To work around that
! do:
! 
! \(eval-after-load \"sgml-mode\" '(aset sgml-char-names ?' nil))
! \\{html-mode-map}" t nil)
  
  ;;;***
  
! ;;;### (autoloads (sh-mode) "sh-script" "sh-script.el" (12658 48259))
  ;;; Generated autoloads from sh-script.el
  
+ (put (quote sh-mode) (quote mode-class) (quote special))
+ 
  (autoload (quote sh-mode) "sh-script" "\
  Major mode for editing shell scripts.
*************** following commands are available, based 
*** 6335,6339 ****
  
  If you generally program a shell different from your login shell you can
! set `sh-shell-path' accordingly.  If your shell's file name doesn't correctly
  indicate what shell it is use `sh-alias-alist' to translate.
  
--- 6711,6715 ----
  
  If you generally program a shell different from your login shell you can
! set `sh-shell-file' accordingly.  If your shell's file name doesn't correctly
  indicate what shell it is use `sh-alias-alist' to translate.
  
*************** with your script for an edit-interpret-d
*** 6345,6349 ****
  ;;;***
  
! ;;;### (autoloads (shell) "shell" "shell.el" (12261 65275))
  ;;; Generated autoloads from shell.el
  
--- 6721,6769 ----
  ;;;***
  
! ;;;### (autoloads (list-load-path-shadows) "shadow" "shadow.el" (12550 53409))
! ;;; Generated autoloads from shadow.el
! 
! (autoload (quote list-load-path-shadows) "shadow" "\
! Display a list of Emacs Lisp files that create shadows.
! 
! This function lists potential load-path problems.  Directories in the
! `load-path' variable are searched, in order, for Emacs Lisp
! files.  When a previously encountered file name is re-located, a
! message is displayed indicating that the later file is \"shadowed\" by
! the earlier.
! 
! For example, suppose `load-path' is set to
! 
! \(\"/usr/gnu/emacs/site-lisp\" \"/usr/gnu/emacs/share/emacs/19.30/lisp\")
! 
! and that each of these directories contains a file called XXX.el.  Then
! XXX.el in the site-lisp directory is referred to by all of:
! \(require 'XXX), (autoload .... \"XXX\"), (load-library \"XXX\") etc.
! 
! The first XXX.el file prevents emacs from seeing the second (unless
! the second is loaded explicitly via load-file).
! 
! When not intended, such shadowings can be the source of subtle
! problems.  For example, the above situation may have arisen because the
! XXX package was not distributed with versions of emacs prior to
! 19.30.  An emacs maintainer downloaded XXX from elsewhere and installed
! it.  Later, XXX was updated and included in the emacs distribution.
! Unless the emacs maintainer checks for this, the new version of XXX
! will be hidden behind the old (which may no longer work with the new
! emacs version).
! 
! This function performs these checks and flags all possible
! shadowings.  Because a .el file may exist without a corresponding .elc
! \(or vice-versa), these suffixes are essentially ignored.  A file
! XXX.elc in an early directory (that does not contain XXX.el) is
! considered to shadow a later file XXX.el, and vice-versa.
! 
! When run interactively, the shadowings (if any) are displayed in a
! buffer called `*Shadows*'.  Shadowings are located by calling the
! \(non-interactive) companion function, `find-emacs-lisp-shadows'." t nil)
! 
! ;;;***
! 
! ;;;### (autoloads (shell) "shell" "shell.el" (12563 25910))
  ;;; Generated autoloads from shell.el
  
*************** shell buffer.
*** 6355,6359 ****
  
  The pattern should probably not match more than one line.  If it does,
! shell-mode may become confused trying to distinguish prompt from input
  on lines which don't start with a prompt.
  
--- 6775,6779 ----
  
  The pattern should probably not match more than one line.  If it does,
! Shell mode may become confused trying to distinguish prompt from input
  on lines which don't start with a prompt.
  
*************** Otherwise, one argument `-i' is passed t
*** 6380,6388 ****
  
  \(Type \\[describe-mode] in the shell buffer for a list of commands.)" t nil)
! (add-hook 'same-window-buffer-names "*shell*")
  
  ;;;***
  
! ;;;### (autoloads (skeleton-pair-insert-maybe skeleton-insert skeleton-proxy define-skeleton) "skeleton" "skeleton.el" (12441 35845))
  ;;; Generated autoloads from skeleton.el
  
--- 6800,6808 ----
  
  \(Type \\[describe-mode] in the shell buffer for a list of commands.)" t nil)
!  (add-hook 'same-window-buffer-names "*shell*")
  
  ;;;***
  
! ;;;### (autoloads (skeleton-pair-insert-maybe skeleton-insert skeleton-proxy define-skeleton) "skeleton" "skeleton.el" (12599 6572))
  ;;; Generated autoloads from skeleton.el
  
*************** strings with the subskeleton being repea
*** 6447,6451 ****
  Quoted lisp-expressions are evaluated evaluated for their side-effect.
  Other lisp-expressions are evaluated and the value treated as above.
! Note that expressions may not return `t' since this impplies an
  endless loop.  Modes can define other symbols by locally setting them
  to any valid skeleton element.  The following local variables are
--- 6867,6871 ----
  Quoted lisp-expressions are evaluated evaluated for their side-effect.
  Other lisp-expressions are evaluated and the value treated as above.
! Note that expressions may not return `t' since this implies an
  endless loop.  Modes can define other symbols by locally setting them
  to any valid skeleton element.  The following local variables are
*************** symmetrical ones, and the same character
*** 6474,6478 ****
  ;;;***
  
! ;;;### (autoloads (solar-equinoxes-solstices sunrise-sunset) "solar" "solar.el" (12384 53888))
  ;;; Generated autoloads from solar.el
  
--- 6894,6898 ----
  ;;;***
  
! ;;;### (autoloads (solar-equinoxes-solstices sunrise-sunset) "solar" "solar.el" (12673 26218))
  ;;; Generated autoloads from solar.el
  
*************** can be a vector [degrees minutes north/s
*** 6499,6503 ****
  York City.
  
! This variable should be set in site-local.el.")
  
  (defvar calendar-longitude nil "\
--- 6919,6923 ----
  York City.
  
! This variable should be set in `site-start'.el.")
  
  (defvar calendar-longitude nil "\
*************** can be a vector [degrees minutes east/we
*** 6509,6513 ****
  York City.
  
! This variable should be set in site-local.el.")
  
  (defvar calendar-location-name (quote (let ((float-output-format "%.1f")) (format "%s%s, %s%s" (if (numberp calendar-latitude) (abs calendar-latitude) (+ (aref calendar-latitude 0) (/ (aref calendar-latitude 1) 60.0))) (if (numberp calendar-latitude) (if (> calendar-latitude 0) "N" "S") (if (equal (aref calendar-latitude 2) (quote north)) "N" "S")) (if (numberp calendar-longitude) (abs calendar-longitude) (+ (aref calendar-longitude 0) (/ (aref calendar-longitude 1) 60.0))) (if (numberp calendar-longitude) (if (> calendar-longitude 0) "E" "W") (if (equal (aref calendar-longitude 2) (quote east)) "E" "W"))))) "\
--- 6929,6933 ----
  York City.
  
! This variable should be set in `site-start'.el.")
  
  (defvar calendar-location-name (quote (let ((float-output-format "%.1f")) (format "%s%s, %s%s" (if (numberp calendar-latitude) (abs calendar-latitude) (+ (aref calendar-latitude 0) (/ (aref calendar-latitude 1) 60.0))) (if (numberp calendar-latitude) (if (> calendar-latitude 0) "N" "S") (if (equal (aref calendar-latitude 2) (quote north)) "N" "S")) (if (numberp calendar-longitude) (abs calendar-longitude) (+ (aref calendar-longitude 0) (/ (aref calendar-longitude 1) 60.0))) (if (numberp calendar-longitude) (if (> calendar-longitude 0) "E" "W") (if (equal (aref calendar-longitude 2) (quote east)) "E" "W"))))) "\
*************** For example, \"New York City\".  Default
*** 6516,6523 ****
  pair.
  
! This variable should be set in site-local.el.")
  
  (autoload (quote sunrise-sunset) "solar" "\
! Local time of sunrise and sunset for today.  Accurate to +/- 2 minutes.
  If called with an optional prefix argument, prompt for date.
  
--- 6936,6943 ----
  pair.
  
! This variable should be set in `site-start'.el.")
  
  (autoload (quote sunrise-sunset) "solar" "\
! Local time of sunrise and sunset for today.  Accurate to a few seconds.
  If called with an optional prefix argument, prompt for date.
  
*************** This function is suitable for execution 
*** 6528,6537 ****
  
  (autoload (quote solar-equinoxes-solstices) "solar" "\
! Date and time of equinoxes and solstices, if visible in the calendar window.
  Requires floating point." nil nil)
  
  ;;;***
  
! ;;;### (autoloads (solitaire) "solitaire" "solitaire.el" (12437 2599))
  ;;; Generated autoloads from solitaire.el
  
--- 6948,6957 ----
  
  (autoload (quote solar-equinoxes-solstices) "solar" "\
! *local* date and time of equinoxes and solstices, if visible in the calendar window.
  Requires floating point." nil nil)
  
  ;;;***
  
! ;;;### (autoloads (solitaire) "solitaire" "solitaire.el" (12550 33885))
  ;;; Generated autoloads from solitaire.el
  
*************** Pick your favourite shortcuts:
*** 6606,6610 ****
  ;;;***
  
! ;;;### (autoloads (reverse-region sort-columns sort-regexp-fields sort-fields sort-numeric-fields sort-pages sort-paragraphs sort-lines sort-subr) "sort" "sort.el" (12164 38924))
  ;;; Generated autoloads from sort.el
  
--- 7026,7030 ----
  ;;;***
  
! ;;;### (autoloads (reverse-region sort-columns sort-regexp-fields sort-fields sort-numeric-fields sort-pages sort-paragraphs sort-lines sort-subr) "sort" "sort.el" (12536 45574))
  ;;; Generated autoloads from sort.el
  
*************** RECORD-REGEXP specifies the textual unit
*** 6680,6686 ****
  KEY specifies the part of each record (ie each match for RECORD-REGEXP)
    is to be used for sorting.
!   If it is \"\\digit\" then the digit'th \"\\(...\\)\" match field from
    RECORD-REGEXP is used.
!   If it is \"\\&\" then the whole record is used.
    Otherwise, it is a regular-expression for which to search within the record.
  If a match for KEY is not found within a record then that record is ignored.
--- 7100,7106 ----
  KEY specifies the part of each record (ie each match for RECORD-REGEXP)
    is to be used for sorting.
!   If it is \"\\\\digit\" then the digit'th \"\\\\(...\\\\)\" match field from
    RECORD-REGEXP is used.
!   If it is \"\\\\&\" then the whole record is used.
    Otherwise, it is a regular-expression for which to search within the record.
  If a match for KEY is not found within a record then that record is ignored.
*************** With a negative prefix arg sorts in reve
*** 6690,6694 ****
  For example: to sort lines in the region by the first word on each line
   starting with the letter \"f\",
!  RECORD-REGEXP would be \"^.*$\" and KEY would be \"\\=\\<f\\w*\\>\"" t nil)
  
  (autoload (quote sort-columns) "sort" "\
--- 7110,7114 ----
  For example: to sort lines in the region by the first word on each line
   starting with the letter \"f\",
!  RECORD-REGEXP would be \"^.*$\" and KEY would be \"\\\\=\\<f\\\\w*\\\\>\"" t nil)
  
  (autoload (quote sort-columns) "sort" "\
*************** From a program takes two point or marker
*** 6711,6715 ****
  ;;;***
  
! ;;;### (autoloads (spell-string spell-region spell-word spell-buffer) "spell" "spell.el" (12040 61663))
  ;;; Generated autoloads from spell.el
  
--- 7131,7135 ----
  ;;;***
  
! ;;;### (autoloads (spell-string spell-region spell-word spell-buffer) "spell" "spell.el" (12536 45574))
  ;;; Generated autoloads from spell.el
  
*************** Check spelling of string supplied as arg
*** 6739,6743 ****
  ;;;***
  
! ;;;### (autoloads (snarf-spooks spook) "spook" "spook.el" (11332 39077))
  ;;; Generated autoloads from spook.el
  
--- 7159,7163 ----
  ;;;***
  
! ;;;### (autoloads (snarf-spooks spook) "spook" "spook.el" (12536 45574))
  ;;; Generated autoloads from spook.el
  
*************** Return a vector containing the lines fro
*** 6750,6754 ****
  ;;;***
  
! ;;;### (autoloads (sc-cite-original) "supercite" "supercite.el" (12336 37675))
  ;;; Generated autoloads from supercite.el
  
--- 7170,7174 ----
  ;;;***
  
! ;;;### (autoloads (sc-cite-original) "supercite" "supercite.el" (12536 45574))
  ;;; Generated autoloads from supercite.el
  
*************** before, and `sc-post-hook' is run after 
*** 6779,6783 ****
  ;;;***
  
! ;;;### (autoloads (tabify untabify) "tabify" "tabify.el" (12170 7254))
  ;;; Generated autoloads from tabify.el
  
--- 7199,7203 ----
  ;;;***
  
! ;;;### (autoloads (tabify untabify) "tabify" "tabify.el" (12536 45574))
  ;;; Generated autoloads from tabify.el
  
*************** The variable `tab-width' controls the sp
*** 6798,6802 ****
  ;;;***
  
! ;;;### (autoloads (talk-connect) "talk" "talk.el" (12277 42090))
  ;;; Generated autoloads from talk.el
  
--- 7218,7222 ----
  ;;;***
  
! ;;;### (autoloads (talk-connect) "talk" "talk.el" (12536 45574))
  ;;; Generated autoloads from talk.el
  
*************** Connect to display DISPLAY for the Emacs
*** 6806,6810 ****
  ;;;***
  
! ;;;### (autoloads (tar-mode) "tar-mode" "tar-mode.el" (12305 27749))
  ;;; Generated autoloads from tar-mode.el
  
--- 7226,7230 ----
  ;;;***
  
! ;;;### (autoloads (tar-mode) "tar-mode" "tar-mode.el" (12605 17260))
  ;;; Generated autoloads from tar-mode.el
  
*************** See also: variables `tar-update-datestam
*** 6827,6831 ****
  ;;;***
  
! ;;;### (autoloads (tcl-mode) "tcl-mode" "tcl-mode.el" (12437 2667))
  ;;; Generated autoloads from tcl-mode.el
  
--- 7247,7251 ----
  ;;;***
  
! ;;;### (autoloads (tcl-mode) "tcl-mode" "tcl-mode.el" (12536 45574))
  ;;; Generated autoloads from tcl-mode.el
  
*************** The following keys are bound:
*** 6838,6844 ****
  ;;;***
  
! ;;;### (autoloads (rsh telnet) "telnet" "telnet.el" (12131 55286))
  ;;; Generated autoloads from telnet.el
! (add-hook 'same-window-regexps "\\*telnet-.*\\*\\(\\|<[0-9]+>\\)")
  
  (autoload (quote telnet) "telnet" "\
--- 7258,7264 ----
  ;;;***
  
! ;;;### (autoloads (rsh telnet) "telnet" "telnet.el" (12536 45574))
  ;;; Generated autoloads from telnet.el
!  (add-hook 'same-window-regexps "\\*telnet-.*\\*\\(\\|<[0-9]+>\\)")
  
  (autoload (quote telnet) "telnet" "\
*************** Open a network login connection to host 
*** 6846,6850 ****
  Communication with HOST is recorded in a buffer `*telnet-HOST*'.
  Normally input is edited in Emacs and sent a line at a time." t nil)
! (add-hook 'same-window-regexps "\\*rsh-[^-]*\\*\\(\\|<[0-9]*>\\)")
  
  (autoload (quote rsh) "telnet" "\
--- 7266,7270 ----
  Communication with HOST is recorded in a buffer `*telnet-HOST*'.
  Normally input is edited in Emacs and sent a line at a time." t nil)
!  (add-hook 'same-window-regexps "\\*rsh-[^-]*\\*\\(\\|<[0-9]*>\\)")
  
  (autoload (quote rsh) "telnet" "\
*************** Normally input is edited in Emacs and se
*** 6855,6859 ****
  ;;;***
  
! ;;;### (autoloads (term make-term) "term" "term.el" (12437 2708))
  ;;; Generated autoloads from term.el
  
--- 7275,7279 ----
  ;;;***
  
! ;;;### (autoloads (term make-term) "term" "term.el" (12700 60494))
  ;;; Generated autoloads from term.el
  
*************** Start a terminal-emulator in a new buffe
*** 6870,6874 ****
  ;;;***
  
! ;;;### (autoloads (terminal-emulator) "terminal" "terminal.el" (12399 2206))
  ;;; Generated autoloads from terminal.el
  
--- 7290,7294 ----
  ;;;***
  
! ;;;### (autoloads (terminal-emulator) "terminal" "terminal.el" (12629 20482))
  ;;; Generated autoloads from terminal.el
  
*************** subprocess started." t nil)
*** 6904,6908 ****
  ;;;***
  
! ;;;### (autoloads (tex-start-shell slitex-mode latex-mode plain-tex-mode tex-mode) "tex-mode" "tex-mode.el" (12442 41336))
  ;;; Generated autoloads from tex-mode.el
  
--- 7324,7328 ----
  ;;;***
  
! ;;;### (autoloads (tex-start-shell slitex-mode latex-mode plain-tex-mode tex-mode) "tex-mode" "tex-mode.el" (12697 62715))
  ;;; Generated autoloads from tex-mode.el
  
*************** Entering SliTeX mode runs the hook `text
*** 7135,7139 ****
  ;;;***
  
! ;;;### (autoloads (texinfo-format-region texinfo-format-buffer) "texinfmt" "texinfmt.el" (12437 2800))
  ;;; Generated autoloads from texinfmt.el
  
--- 7555,7559 ----
  ;;;***
  
! ;;;### (autoloads (texinfo-format-region texinfo-format-buffer) "texinfmt" "texinfmt.el" (12536 45574))
  ;;; Generated autoloads from texinfmt.el
  
*************** converted to Info is stored in a tempora
*** 7155,7159 ****
  ;;;***
  
! ;;;### (autoloads (texinfo-mode) "texinfo" "texinfo.el" (12437 2860))
  ;;; Generated autoloads from texinfo.el
  
--- 7575,7579 ----
  ;;;***
  
! ;;;### (autoloads (texinfo-mode) "texinfo" "texinfo.el" (12604 46234))
  ;;; Generated autoloads from texinfo.el
  
*************** value of texinfo-mode-hook." t nil)
*** 7227,7231 ****
  ;;;***
  
! ;;;### (autoloads (texinfo-sequential-node-update texinfo-every-node-update texinfo-update-node) "texnfo-upd" "texnfo-upd.el" (12437 19984))
  ;;; Generated autoloads from texnfo-upd.el
  
--- 7647,7651 ----
  ;;;***
  
! ;;;### (autoloads (texinfo-sequential-node-update texinfo-every-node-update texinfo-update-node) "texnfo-upd" "texnfo-upd.el" (12536 45574))
  ;;; Generated autoloads from texnfo-upd.el
  
*************** Info `g*' command is inadequate." t nil)
*** 7273,7277 ****
  ;;;***
  
! ;;;### (autoloads (thing-at-point bounds-of-thing-at-point forward-thing) "thingatpt" "thingatpt.el" (12300 10535))
  ;;; Generated autoloads from thingatpt.el
  
--- 7693,7697 ----
  ;;;***
  
! ;;;### (autoloads (thing-at-point bounds-of-thing-at-point forward-thing) "thingatpt" "thingatpt.el" (12536 45574))
  ;;; Generated autoloads from thingatpt.el
  
*************** bounds-of-thing-at-point." nil nil)
*** 7292,7296 ****
  ;;;***
  
! ;;;### (autoloads (display-time) "time" "time.el" (12433 21239))
  ;;; Generated autoloads from time.el
  
--- 7712,7716 ----
  ;;;***
  
! ;;;### (autoloads (display-time) "time" "time.el" (12599 58564))
  ;;; Generated autoloads from time.el
  
*************** After each update, `display-time-hook' i
*** 7307,7311 ****
  ;;;***
  
! ;;;### (autoloads (time-stamp-toggle-active time-stamp) "time-stamp" "time-stamp.el" (12437 26449))
  ;;; Generated autoloads from time-stamp.el
  
--- 7727,7731 ----
  ;;;***
  
! ;;;### (autoloads (time-stamp-toggle-active time-stamp) "time-stamp" "time-stamp.el" (12544 22558))
  ;;; Generated autoloads from time-stamp.el
  
*************** With arg, turn time stamping on if and o
*** 7331,7382 ****
  ;;;***
  
! ;;;### (autoloads (run-at-time) "timer" "timer.el" (11985 30147))
  ;;; Generated autoloads from timer.el
  
  (autoload (quote run-at-time) "timer" "\
! Run a function at a time, and optionally on a regular interval.
! Arguments are TIME, REPEAT, FUNCTION &rest ARGS.
! TIME, a string, can be specified absolutely or relative to now.
! TIME can also be an integer, a number of seconds.
! REPEAT, an integer number of seconds, is the interval on which to repeat
! the call to the function.  If REPEAT is nil or 0, call it just once.
! 
! Absolute times may be specified in a wide variety of formats;
! Something of the form `HOUR:MIN:SEC TIMEZONE MONTH/DAY/YEAR', where
! all fields are numbers, works; the format used by the Unix `date'
! command works too.
! 
! Relative times may be specified as a series of numbers followed by units:
!   1 min         	denotes one minute from now.
!   min			does too.
!   1 min 5 sec		denotes 65 seconds from now.
!   1 min 2 sec 3 hour 4 day 5 week 6 fortnight 7 month 8 year
! 			denotes the sum of all the given durations from now." t nil)
  
  ;;;***
  
! ;;;### (autoloads (tmm-prompt tmm-menubar) "tmm" "tmm.el" (12452 8515))
  ;;; Generated autoloads from tmm.el
! (define-key global-map "\M-`" 'tmm-menubar)
! (define-key global-map [f10] 'tmm-menubar)
! (define-key global-map [menu-bar mouse-1] 'tmm-menubar)
  
  (autoload (quote tmm-menubar) "tmm" "\
  Text-mode emulation of looking and choosing from a menubar.
  See the documentation for `tmm-prompt'." t nil)
  
  (autoload (quote tmm-prompt) "tmm" "\
  Text-mode emulation of calling the bindings in keymap.
! Creates a text-mode menu of possible choices. You can access the elements
! in the menu:
!    *)  Either via history mechanism from minibuffer;
     *)  Or via completion-buffer that is automatically shown.
  The last alternative is currently a hack, you cannot use mouse reliably.
! If the optional argument IN-POPUP is set, is argument-compatible with 
! `x-popup-menu', otherwise the argument BIND should be a cdr of sparse keymap." nil nil)
  
  ;;;***
  
! ;;;### (autoloads (tpu-edt-on) "tpu-edt" "tpu-edt.el" (12440 19294))
  ;;; Generated autoloads from tpu-edt.el
  
--- 7751,7835 ----
  ;;;***
  
! ;;;### (autoloads (with-timeout run-with-idle-timer add-timeout run-with-timer run-at-time) "timer" "timer.el" (12643 64076))
  ;;; Generated autoloads from timer.el
  
  (autoload (quote run-at-time) "timer" "\
! Perform an action after a delay of SECS seconds.
! Repeat the action every REPEAT seconds, if REPEAT is non-nil.
! TIME should be a string like \"11:23pm\", nil meaning now, a number of seconds
! from now, or a value from `encode-time'.
! REPEAT may be an integer or floating point number.
! The action is to call FUNCTION with arguments ARGS.
! 
! This function returns a timer object which you can use in `cancel-timer'." t nil)
! 
! (autoload (quote run-with-timer) "timer" "\
! Perform an action after a delay of SECS seconds.
! Repeat the action every REPEAT seconds, if REPEAT is non-nil.
! SECS and REPEAT may be integers or floating point numbers.
! The action is to call FUNCTION with arguments ARGS.
! 
! This function returns a timer object which you can use in `cancel-timer'." t nil)
! 
! (autoload (quote add-timeout) "timer" "\
! Add a timer to run SECS seconds from now, to call FUNCTION on OBJECT.
! If REPEAT is non-nil, repeat the timer every REPEAT seconds.
! This function is for compatibility; see also `run-with-timer'." nil nil)
! 
! (autoload (quote run-with-idle-timer) "timer" "\
! Perform an action the next time Emacs is idle for SECS seconds.
! If REPEAT is non-nil, do this each time Emacs is idle for SECS seconds.
! SECS may be an integer or a floating point number.
! The action is to call FUNCTION with arguments ARGS.
! 
! This function returns a timer object which you can use in `cancel-timer'." t nil)
!  (put 'with-timeout 'lisp-indent-function 1)
! 
! (autoload (quote with-timeout) "timer" "\
! Run BODY, but if it doesn't finish in SECONDS seconds, give up.
! If we give up, we run the TIMEOUT-FORMS and return the value of the last one.
! The call should look like:
!  (with-timeout (SECONDS TIMEOUT-FORMS...) BODY...)
! The timeout is checked whenever Emacs waits for some kind of external
! event (such as keyboard input, input from subprocesses, or a certain time);
! if the program loops without waiting in any way, the timeout will not
! be detected." nil (quote macro))
  
  ;;;***
  
! ;;;### (autoloads (tmm-prompt tmm-menubar-mouse tmm-menubar) "tmm" "tmm.el" (12634 55024))
  ;;; Generated autoloads from tmm.el
!  (define-key global-map "\M-`" 'tmm-menubar)
!  (define-key global-map [f10] 'tmm-menubar)
!  (define-key global-map [menu-bar mouse-1] 'tmm-menubar-mouse)
  
  (autoload (quote tmm-menubar) "tmm" "\
  Text-mode emulation of looking and choosing from a menubar.
+ See the documentation for `tmm-prompt'.
+ X-POSITION, if non-nil, specifies a horizontal position within the menu bar;
+ we make that menu bar item (the one at that position) the default choice." t nil)
+ 
+ (autoload (quote tmm-menubar-mouse) "tmm" "\
+ Text-mode emulation of looking and choosing from a menubar.
+ This command is used when you click the mouse in the menubar
+ on a console which has no window system but does have a mouse.
  See the documentation for `tmm-prompt'." t nil)
  
  (autoload (quote tmm-prompt) "tmm" "\
  Text-mode emulation of calling the bindings in keymap.
! Creates a text-mode menu of possible choices.  You can access the elements
! in the menu in two ways:
!    *)  via history mechanism from minibuffer;
     *)  Or via completion-buffer that is automatically shown.
  The last alternative is currently a hack, you cannot use mouse reliably.
! 
! MENU is like the MENU argument to `x-popup-menu': either a
! keymap or an alist of alists.
! DEFAULT-ITEM, if non-nil, specifies an initial default choice.
! Its value should be an event that has a binding in MENU." nil nil)
  
  ;;;***
  
! ;;;### (autoloads (tpu-edt-on) "tpu-edt" "tpu-edt.el" (12594 16832))
  ;;; Generated autoloads from tpu-edt.el
  
*************** Turn on TPU/edt emulation." t nil)
*** 7390,7394 ****
  ;;;***
  
! ;;;### (autoloads (tpu-set-cursor-bound tpu-set-cursor-free tpu-set-scroll-margins) "tpu-extras" "tpu-extras.el" (12311 16501))
  ;;; Generated autoloads from tpu-extras.el
  
--- 7843,7847 ----
  ;;;***
  
! ;;;### (autoloads (tpu-set-cursor-bound tpu-set-cursor-free tpu-set-scroll-margins) "tpu-extras" "tpu-extras.el" (12536 45574))
  ;;; Generated autoloads from tpu-extras.el
  
*************** Constrain the cursor to the flow of the 
*** 7404,7408 ****
  ;;;***
  
! ;;;### (autoloads (tq-create) "tq" "tq.el" (12215 52362))
  ;;; Generated autoloads from tq.el
  
--- 7857,7861 ----
  ;;;***
  
! ;;;### (autoloads (tq-create) "tq" "tq.el" (12557 20669))
  ;;; Generated autoloads from tq.el
  
*************** to a tcp server on another machine." nil
*** 7415,7419 ****
  ;;;***
  
! ;;;### (autoloads (trace-function-background trace-function) "trace" "trace.el" (12201 32675))
  ;;; Generated autoloads from trace.el
  
--- 7868,7872 ----
  ;;;***
  
! ;;;### (autoloads (trace-function-background trace-function) "trace" "trace.el" (12536 45574))
  ;;; Generated autoloads from trace.el
  
*************** the window or buffer configuration at al
*** 7440,7446 ****
  ;;;***
  
! ;;;### (autoloads (2C-split 2C-associate-buffer 2C-two-columns) "two-column" "two-column.el" (12441 34577))
  ;;; Generated autoloads from two-column.el
! (autoload '2C-command "two-column" () t 'keymap)
  
  (global-set-key "6" (quote 2C-command))
--- 7893,7899 ----
  ;;;***
  
! ;;;### (autoloads (2C-split 2C-associate-buffer 2C-two-columns) "two-column" "two-column.el" (12441 34908))
  ;;; Generated autoloads from two-column.el
!  (autoload '2C-command "two-column" () t 'keymap)
  
  (global-set-key "6" (quote 2C-command))
*************** First column's text    sSs  Second colum
*** 7483,7487 ****
  ;;;***
  
! ;;;### (autoloads (type-break-guestimate-keystroke-threshold type-break-statistics type-break type-break-mode) "type-break" "type-break.el" (12003 12693))
  ;;; Generated autoloads from type-break.el
  
--- 7936,7940 ----
  ;;;***
  
! ;;;### (autoloads (type-break-guesstimate-keystroke-threshold type-break-statistics type-break type-break-mode) "type-break" "type-break.el" (12557 16919))
  ;;; Generated autoloads from type-break.el
  
*************** Keys with bucky bits (shift, control, me
*** 7522,7526 ****
  keystroke even though they really require multiple keys to generate them.
  
! The command `type-break-guestimate-keystroke-threshold' can be used to
  guess a reasonably good pair of values for this variable.")
  
--- 7975,7979 ----
  keystroke even though they really require multiple keys to generate them.
  
! The command `type-break-guesstimate-keystroke-threshold' can be used to
  guess a reasonably good pair of values for this variable.")
  
*************** or not to continue.
*** 7563,7567 ****
  The variable `type-break-keystroke-threshold' is used to determine the
  thresholds at which typing breaks should be considered.  You can use
! the command `type-break-guestimate-keystroke-threshold' to try to
  approximate good values for this.
  
--- 8016,8020 ----
  The variable `type-break-keystroke-threshold' is used to determine the
  thresholds at which typing breaks should be considered.  You can use
! the command `type-break-guesstimate-keystroke-threshold' to try to
  approximate good values for this.
  
*************** This includes the last time a typing bre
*** 7598,7602 ****
  scheduled, the keystroke thresholds and the current keystroke count, etc." t nil)
  
! (autoload (quote type-break-guestimate-keystroke-threshold) "type-break" "\
  Guess values for the minimum/maximum keystroke threshold for typing breaks.
  
--- 8051,8055 ----
  scheduled, the keystroke thresholds and the current keystroke count, etc." t nil)
  
! (autoload (quote type-break-guesstimate-keystroke-threshold) "type-break" "\
  Guess values for the minimum/maximum keystroke threshold for typing breaks.
  
*************** FRAC should be the inverse of the fracti
*** 7622,7626 ****
  ;;;***
  
! ;;;### (autoloads (ununderline-region underline-region) "underline" "underline.el" (11652 54624))
  ;;; Generated autoloads from underline.el
  
--- 8075,8079 ----
  ;;;***
  
! ;;;### (autoloads (ununderline-region underline-region) "underline" "underline.el" (12536 45574))
  ;;; Generated autoloads from underline.el
  
*************** which specify the range to operate on." 
*** 7638,7642 ****
  ;;;***
  
! ;;;### (autoloads (unrmail batch-unrmail) "unrmail" "unrmail.el" (12402 45362))
  ;;; Generated autoloads from unrmail.el
  
--- 8091,8095 ----
  ;;;***
  
! ;;;### (autoloads (unrmail batch-unrmail) "unrmail" "unrmail.el" (12550 48090))
  ;;; Generated autoloads from unrmail.el
  
*************** Convert Rmail file FILE to system inbox 
*** 7653,7683 ****
  ;;;***
  
! ;;;### (autoloads (ask-to-update-copyright update-copyright) "copyright" "copyright.el" (12065 4870))
! ;;; Generated autoloads from copyright.el
! 
! (defvar replace-copying-with nil "\
! *If non-nil, replace copying notices with this file.")
! 
! (autoload (quote update-copyright) "copyright" "\
! Update the copyright notice at the beginning of the buffer
! to indicate the current year.  If optional arg REPLACE is given
! \(interactively, with prefix arg) replace the years in the notice
! rather than adding the current year after them.
! If `replace-copying-with' is set, the copying permissions following the
! copyright are replaced as well.
! 
! If optional third argument ASK is non-nil, the user is prompted for whether
! or not to update the copyright.  If optional fourth argument ASK-YEAR is
! non-nil, the user is prompted for whether or not to replace the year rather
! than adding to it." t nil)
! 
! (autoload (quote ask-to-update-copyright) "copyright" "\
! If the current buffer contains a copyright notice that is out of date,
! ask the user if it should be updated with `update-copyright' (which see).
! Put this on write-file-hooks." nil nil)
! 
! ;;;***
! 
! ;;;### (autoloads (ask-user-about-supersession-threat ask-user-about-lock) "userlock" "userlock.el" (11968 23424))
  ;;; Generated autoloads from userlock.el
  
--- 8106,8110 ----
  ;;;***
  
! ;;;### (autoloads (ask-user-about-supersession-threat ask-user-about-lock) "userlock" "userlock.el" (12536 45574))
  ;;; Generated autoloads from userlock.el
  
*************** The buffer in question is current when t
*** 7702,7706 ****
  ;;;***
  
! ;;;### (autoloads (vc-update-change-log vc-rename-file vc-cancel-version vc-revert-buffer vc-print-log vc-retrieve-snapshot vc-create-snapshot vc-directory vc-insert-headers vc-version-other-window vc-diff vc-register vc-next-action) "vc" "vc.el" (12440 36668))
  ;;; Generated autoloads from vc.el
  
--- 8129,8133 ----
  ;;;***
  
! ;;;### (autoloads (vc-update-change-log vc-rename-file vc-cancel-version vc-revert-buffer vc-print-log vc-retrieve-snapshot vc-create-snapshot vc-directory vc-insert-headers vc-version-other-window vc-diff vc-register vc-next-action) "vc" "vc.el" (12692 55721))
  ;;; Generated autoloads from vc.el
  
*************** From a program, any arguments are passed
*** 7810,7814 ****
  ;;;***
  
! ;;;### (autoloads (vi-mode) "vi" "vi.el" (12317 15023))
  ;;; Generated autoloads from vi.el
  
--- 8237,8241 ----
  ;;;***
  
! ;;;### (autoloads (vi-mode) "vi" "vi.el" (12524 24198))
  ;;; Generated autoloads from vi.el
  
*************** Major differences between this mode and 
*** 7855,7864 ****
      `vi-mark-region', and 'vi-quote-words'.  Some of them are quite handy.
    - Use \\[vi-switch-mode] to switch among different modes quickly.
!   
  Syntax table and abbrevs while in vi mode remain as they were in Emacs." t nil)
  
  ;;;***
  
! ;;;### (autoloads (view-mode view-buffer-other-window view-buffer view-file-other-window view-file) "view" "view.el" (12409 31604))
  ;;; Generated autoloads from view.el
  
--- 8282,8291 ----
      `vi-mark-region', and 'vi-quote-words'.  Some of them are quite handy.
    - Use \\[vi-switch-mode] to switch among different modes quickly.
! 
  Syntax table and abbrevs while in vi mode remain as they were in Emacs." t nil)
  
  ;;;***
  
! ;;;### (autoloads (view-mode view-buffer-other-window view-buffer view-file-other-window view-file) "view" "view.el" (12565 8462))
  ;;; Generated autoloads from view.el
  
*************** If you use this function to turn on View
*** 7914,7922 ****
  \"exiting\" View mode does nothing except turn View mode off.
  The other way to turn View mode on is by calling
! `view-mode-enter'." t nil)
  
  ;;;***
  
! ;;;### (autoloads (vip-mode) "vip" "vip.el" (12264 64333))
  ;;; Generated autoloads from vip.el
  
--- 8341,8383 ----
  \"exiting\" View mode does nothing except turn View mode off.
  The other way to turn View mode on is by calling
! `view-mode-enter'.
! 
! Letters do not insert themselves.  Instead these commands are provided.
! Most commands take prefix arguments.  Commands dealing with lines
! default to \"scroll size\" lines (initially size of window).
! Search commands default to a repeat count of one.
! 
! M-< or <	move to beginning of buffer.
! M-> or >	move to end of buffer.
! C-v or Space	scroll forward lines.
! M-v or DEL	scroll backward lines.
! CR or LF	scroll forward one line (backward with prefix argument).
! z		like Space except set number of lines for further
! 		   scrolling commands to scroll by.
! C-u and Digits	provide prefix arguments.  `-' denotes negative argument.
! =		prints the current line number.
! g		goes to line given by prefix argument.
! / or M-C-s	searches forward for regular expression
! \\ or M-C-r	searches backward for regular expression.
! n		searches forward for last regular expression.
! p		searches backward for last regular expression.
! C-@ or .	set the mark.
! x		exchanges point and mark.
! C-s or s	do forward incremental search.
! C-r or r	do reverse incremental search.
! @ or '		return to mark and pops mark ring.
! 		  Mark ring is pushed at start of every
! 		  successful search and when jump to line to occurs.
! 		  The mark is set on jump to buffer start or end.
! ? or h		provide help message (list of commands).
! \\[help-command]		provides help (list of commands or description of a command).
! C-n		moves down lines vertically.
! C-p		moves upward lines vertically.
! C-l		recenters the screen.
! q		exit view-mode and return to previous buffer." t nil)
  
  ;;;***
  
! ;;;### (autoloads (vip-mode) "vip" "vip.el" (12557 20678))
  ;;; Generated autoloads from vip.el
  
*************** Turn on VIP emulation of VI." t nil)
*** 7926,7930 ****
  ;;;***
  
! ;;;### (autoloads (viper-mode) "viper" "viper.el" (12437 3256))
  ;;; Generated autoloads from viper.el
  
--- 8387,8391 ----
  ;;;***
  
! ;;;### (autoloads (viper-mode) "viper" "viper.el" (12635 12679))
  ;;; Generated autoloads from viper.el
  
*************** Turn on Viper emulation of Vi." t nil)
*** 7936,7940 ****
  ;;;***
  
! ;;;### (autoloads (wordstar-mode) "ws-mode" "ws-mode.el" (12351 35378))
  ;;; Generated autoloads from ws-mode.el
  
--- 8397,8401 ----
  ;;;***
  
! ;;;### (autoloads (wordstar-mode) "ws-mode" "ws-mode.el" (12536 45574))
  ;;; Generated autoloads from ws-mode.el
  
*************** The key bindings are:
*** 8047,8051 ****
  ;;;***
  
! ;;;### (autoloads (xterm-mouse-mode) "xt-mouse" "xt-mouse.el" (12409 22243))
  ;;; Generated autoloads from xt-mouse.el
  
--- 8508,8512 ----
  ;;;***
  
! ;;;### (autoloads (xterm-mouse-mode) "xt-mouse" "xt-mouse.el" (12603 24337))
  ;;; Generated autoloads from xt-mouse.el
  
*************** Turn it on to use emacs mouse commands, 
*** 8058,8062 ****
  ;;;***
  
! ;;;### (autoloads (psychoanalyze-pinhead insert-zippyism yow) "yow" "yow.el" (11968 23503))
  ;;; Generated autoloads from yow.el
  
--- 8519,8523 ----
  ;;;***
  
! ;;;### (autoloads (psychoanalyze-pinhead apropos-zippy insert-zippyism yow) "yow" "yow.el" (12536 45574))
  ;;; Generated autoloads from yow.el
  
*************** Return or display a random Zippy quotati
*** 8066,8069 ****
--- 8527,8534 ----
  (autoload (quote insert-zippyism) "yow" "\
  Prompt with completion for a known Zippy quotation, and insert it at point." t nil)
+ 
+ (autoload (quote apropos-zippy) "yow" "\
+ Return a list of all Zippy quotes matching REGEXP.
+ If called interactively, display a list of matches." t nil)
  
  (autoload (quote psychoanalyze-pinhead) "yow" "\
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/loadhist.el emacs-19.31/lisp/loadhist.el
*** emacs-19.30/lisp/loadhist.el	Sun Jul 30 06:33:51 1995
--- emacs-19.31/lisp/loadhist.el	Sun Jan 14 02:34:30 1996
***************
*** 1,4 ****
  ;;; loadhist.el --- lisp functions for working with feature groups
! ;;; Copyright (C) 1995 Free Software Foundation, Inc.
  
  ;; Author: Eric S. Raymond <esr@snark.thyrsus.com>
--- 1,5 ----
  ;;; loadhist.el --- lisp functions for working with feature groups
! 
! ;; Copyright (C) 1995 Free Software Foundation, Inc.
  
  ;; Author: Eric S. Raymond <esr@snark.thyrsus.com>
***************
*** 19,24 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/loadup.el emacs-19.31/lisp/loadup.el
*** emacs-19.30/lisp/loadup.el	Tue Oct 31 15:58:31 1995
--- emacs-19.31/lisp/loadup.el	Sat May 18 16:10:13 1996
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 111,114 ****
--- 112,117 ----
        (garbage-collect)
        (load "ls-lisp")
+       (garbage-collect)
+       (load "disp-table") ; needed to setup ibm-pc char set, see internal.el
        (garbage-collect)
        (load "winnt")
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/lpr.el emacs-19.31/lisp/lpr.el
*** emacs-19.30/lisp/lpr.el	Tue May 16 17:57:44 1995
--- emacs-19.31/lisp/lpr.el	Mon Jan 15 17:38:11 1996
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 32,39 ****
  ;;;###autoload
  (defvar lpr-switches nil 
!   "*List of strings to pass as extra switch args to `lpr' when it is invoked.")
  
  (defvar lpr-add-switches (eq system-type 'berkeley-unix)
!   "*Non-nil means construct -T and -J options for the `lpr'.")
  
  ;;;###autoload
--- 33,44 ----
  ;;;###autoload
  (defvar lpr-switches nil 
!   "*List of strings to pass as extra options for the printer program.
! See `lpr-command'.")
  
  (defvar lpr-add-switches (eq system-type 'berkeley-unix)
!   "*Non-nil means construct -T and -J options for the printer program.
! These are made assuming that the program is `lpr';
! if you are using some other incompatible printer program,
! this variable should be nil.")
  
  ;;;###autoload
***************
*** 46,50 ****
  ;; which is more reliable than pr with no args, which is what lpr -p does.
  (defvar lpr-headers-switches nil
!   "*List of strings to use as options for `lpr' to request page headings.
  If nil, we run `lpr-page-header-program' to make page headings
  and print the result.")
--- 51,55 ----
  ;; which is more reliable than pr with no args, which is what lpr -p does.
  (defvar lpr-headers-switches nil
!   "*List of strings of options to request page headings in the printer program.
  If nil, we run `lpr-page-header-program' to make page headings
  and print the result.")
*************** See definition of `print-region-1' for c
*** 58,62 ****
  
  (defvar lpr-page-header-switches '("-f")
!   "*List of strings to use as options for `lpr-page-header-program'.")
  
  ;;;###autoload
--- 63,68 ----
  
  (defvar lpr-page-header-switches '("-f")
!   "*List of strings to use as options for the page-header-generating program.
! The variable `lpr-page-header-program' specifies the program to use.")
  
  ;;;###autoload
*************** See definition of `print-region-1' for c
*** 94,97 ****
--- 100,107 ----
    (let ((name (concat (buffer-name) " Emacs buffer"))
  	(title (concat (buffer-name) " Emacs buffer"))
+ 	;; On MS-DOS systems, make pipes use binary mode if the
+ 	;; original file is binary.
+ 	(binary-process-input buffer-file-type)
+ 	(binary-process-output buffer-file-type)
  	(width tab-width)
  	switch-string)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/ls-lisp.el emacs-19.31/lisp/ls-lisp.el
*** emacs-19.30/lisp/ls-lisp.el	Thu Jun 15 16:42:53 1995
--- emacs-19.31/lisp/ls-lisp.el	Wed Jan 17 23:46:57 1996
***************
*** 1,22 ****
  ;;; ls-lisp.el --- emulate insert-directory completely in Emacs Lisp
  
  ;; Author: Sebastian Kremer <sk@thp.uni-koeln.de>
  ;; Keywords: unix
  
! ;; Copyright (C) 1992, 1994 by Sebastian Kremer <sk@thp.uni-koeln.de>
  
! ;; This program 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.
! ;;
! ;; This program 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 this program; if not, write to the Free Software
! ;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  
  ;; INSTALLATION =======================================================
--- 1,27 ----
  ;;; ls-lisp.el --- emulate insert-directory completely in Emacs Lisp
  
+ ;; Copyright (C) 1992, 1994 by Sebastian Kremer <sk@thp.uni-koeln.de>
+ 
  ;; Author: Sebastian Kremer <sk@thp.uni-koeln.de>
  ;; Keywords: unix
  
! ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
! 
! ;;; Commentary:
  
  ;; INSTALLATION =======================================================
***************
*** 51,56 ****
  ;;; Code:
  
  (defun insert-directory (file &optional switches wildcard full-directory-p)
!   "Insert directory listing for of FILE, formatted according to SWITCHES.
  Leaves point after the inserted text.
  Optional third arg WILDCARD means treat FILE as shell wildcard.
--- 56,68 ----
  ;;; Code:
  
+ ;;;###autoload
+ (defvar ls-lisp-support-shell-wildcards t
+   "*Non-nil means file patterns are treated as shell wildcards.
+ nil means they are treated as Emacs regexps (for backward compatibility).
+ This variable is checked by \\[insert-directory] only when `ls-lisp.el'
+ package is used.")
+ 
  (defun insert-directory (file &optional switches wildcard full-directory-p)
!   "Insert directory listing for FILE, formatted according to SWITCHES.
  Leaves point after the inserted text.
  Optional third arg WILDCARD means treat FILE as shell wildcard.
*************** Optional fourth arg FULL-DIRECTORY-P mea
*** 58,75 ****
  switches do not contain `d', so that a full listing is expected.
  
! This version of the function comes from `ls-lisp.el'.
! It does not support ordinary shell wildcards; instead, it allows
! regular expressions to match file names.
  
! The switches that work are: A a c i r S s t u"
    (let ((handler (find-file-name-handler file 'insert-directory)))
      (if handler
  	(funcall handler 'insert-directory file switches
  		 wildcard full-directory-p)
        ;; Convert SWITCHES to a list of characters.
        (setq switches (append switches nil))
        (if wildcard
! 	  (setq wildcard (file-name-nondirectory file) ; actually emacs regexp
! 		;; perhaps convert it from shell to emacs syntax?
  		file (file-name-directory file)))
        (if (or wildcard
--- 70,101 ----
  switches do not contain `d', so that a full listing is expected.
  
! This version of the function comes from `ls-lisp.el'.  It doesn not
! run any external programs or shells.  It supports ordinary shell
! wildcards if `ls-lisp-support-shell-wildcards' variable is non-nil;
! otherwise, it interprets wildcards as regular expressions to match
! file names.
  
! Not all `ls' switches are supported.  The switches that work
! are: A a c i r S s t u"
    (let ((handler (find-file-name-handler file 'insert-directory)))
      (if handler
  	(funcall handler 'insert-directory file switches
  		 wildcard full-directory-p)
+       ;; Sometimes we get ".../foo*/" as FILE.  While the shell and
+       ;; `ls' don't mind, we certainly do, because it makes us think
+       ;; there is no wildcard, only a directory name.
+       (if (and ls-lisp-support-shell-wildcards
+ 	       (string-match "[[?*]" file))
+ 	  (progn
+ 	    (or (not (eq (aref file (1- (length file))) ?/))
+ 		(setq file (substring file 0 (1- (length file)))))
+ 	    (setq wildcard t)))
        ;; Convert SWITCHES to a list of characters.
        (setq switches (append switches nil))
        (if wildcard
! 	  (setq wildcard
! 		(if ls-lisp-support-shell-wildcards
! 		    (wildcard-to-regexp (file-name-nondirectory file))
! 		  (file-name-nondirectory file))
  		file (file-name-directory file)))
        (if (or wildcard
*************** The switches that work are: A a c i r S 
*** 101,105 ****
  		   ;; ILLEGAL DATATYPE (#o37777777727) or #o67
  		   file-list))
! 	    (insert "total \007\n")	; filled in afterwards
  	    (setq file-alist
  		  (ls-lisp-handle-switches file-alist switches))
--- 127,136 ----
  		   ;; ILLEGAL DATATYPE (#o37777777727) or #o67
  		   file-list))
! 	    ;; ``Total'' line (filled in afterwards).
! 	    (insert (if (car-safe file-alist)
! 			"total \007\n"
! 		      ;; Shell says ``No match'' if no files match
! 		      ;; the wildcard; let's say something similar.
! 		      "(No match)\ntotal \007\n"))
  	    (setq file-alist
  		  (ls-lisp-handle-switches file-alist switches))
*************** The switches that work are: A a c i r S 
*** 117,121 ****
  	      (goto-char (match-end 0))
  	      (delete-char -1)
! 	      (insert (format "%d" (1+ (/ sum 1024))))))
  	;; if not full-directory-p, FILE *must not* end in /, as
  	;; file-attributes will not recognize a symlink to a directory
--- 148,152 ----
  	      (goto-char (match-end 0))
  	      (delete-char -1)
! 	      (insert (format "%d" (if (zerop sum) 0 (1+ (/ sum 1024)))))))
  	;; if not full-directory-p, FILE *must not* end in /, as
  	;; file-attributes will not recognize a symlink to a directory
*************** The switches that work are: A a c i r S 
*** 186,190 ****
  	    ;; user-login-name and user-full-name could take an
  	    ;; optional arg.
! 	    (format " %3d %8s %8s %8d "
  		    (nth 1 file-attr)	; no. of links
  		    (if (= (user-uid) (nth 2 file-attr))
--- 217,221 ----
  	    ;; user-login-name and user-full-name could take an
  	    ;; optional arg.
! 	    (format " %3d %-8s %-8s %8d "
  		    (nth 1 file-attr)	; no. of links
  		    (if (= (user-uid) (nth 2 file-attr))
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/lselect.el emacs-19.31/lisp/lselect.el
*** emacs-19.30/lisp/lselect.el	Fri Apr 23 02:48:02 1993
--- emacs-19.31/lisp/lselect.el	Sun Jan 14 02:34:30 1996
***************
*** 1,8 ****
  ;;; lselect.el --- Lucid interface to X Selections
  
  ;; Keywords: emulations
  
  ;; This won't completely work until we support or emulate Lucid-style extents.
- ;; Copyright (C) 1990, 1993 Free Software Foundation, Inc.
  ;; Based on Lucid's selection code.
  
--- 1,9 ----
  ;;; lselect.el --- Lucid interface to X Selections
  
+ ;; Copyright (C) 1990, 1993 Free Software Foundation, Inc.
+ 
  ;; Keywords: emulations
  
  ;; This won't completely work until we support or emulate Lucid-style extents.
  ;; Based on Lucid's selection code.
  
***************
*** 20,25 ****
  
  ;; 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.
  
  ;;; Code:
--- 21,27 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Code:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/lucid.el emacs-19.31/lisp/lucid.el
*** emacs-19.30/lisp/lucid.el	Thu Apr  6 21:26:47 1995
--- emacs-19.31/lisp/lucid.el	Sun Jan 14 02:34:30 1996
***************
*** 1,3 ****
--- 1,4 ----
  ;;; lucid.el --- Emulate some Lucid Emacs functions.
+ 
  ;; Copyright (C) 1993, 1995 Free Software Foundation, Inc.
  
***************
*** 15,21 ****
  
  ;; 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.
  
  
  (defun add-timeout (secs function object &optional resignal)
--- 16,24 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
+ ;;; Code:
  
  (defun add-timeout (secs function object &optional resignal)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/lunar.el emacs-19.31/lisp/lunar.el
*** emacs-19.30/lisp/lunar.el	Wed Sep 20 22:47:30 1995
--- emacs-19.31/lisp/lunar.el	Wed Jan 24 14:02:53 1996
***************
*** 20,25 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** This function is suitable for execution 
*** 362,366 ****
  (defun lunar-new-moon-on-or-after (d)
    "Astronomical (Julian) day number of first new moon on or after astronomical
! (Julian) day number d.  The fractional part is the time of day.
  
  The date and time are local time, including any daylight savings rules,
--- 363,367 ----
  (defun lunar-new-moon-on-or-after (d)
    "Astronomical (Julian) day number of first new moon on or after astronomical
! \(Julian) day number d.  The fractional part is the time of day.
  
  The date and time are local time, including any daylight savings rules,
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/macros.el emacs-19.31/lisp/macros.el
*** emacs-19.30/lisp/macros.el	Sat Aug 19 12:37:41 1995
--- emacs-19.31/lisp/macros.el	Sat Jan 27 22:07:26 1996
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** Such a \"function\" cannot be called fro
*** 45,48 ****
--- 46,51 ----
         (error "Function %s is already defined and not a keyboard macro."
  	      symbol))
+   (if (string-equal symbol "")
+       (error "No command name given"))
    (fset symbol last-kbd-macro))
  
*************** Your options are: \\<query-replace-map>
*** 195,199 ****
  	  (let ((key (let ((executing-macro nil)
  			   (defining-kbd-macro nil))
! 		       (message msg)
  		       (read-event)))
  		def)
--- 198,202 ----
  	  (let ((key (let ((executing-macro nil)
  			   (defining-kbd-macro nil))
! 		       (message "%s" msg)
  		       (read-event)))
  		def)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/mail-extr.el emacs-19.31/lisp/mail-extr.el
*** emacs-19.30/lisp/mail-extr.el	Mon May 29 03:06:56 1995
--- emacs-19.31/lisp/mail-extr.el	Wed Feb 21 15:02:14 1996
***************
*** 21,29 ****
  
  ;; 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:
  
  ;; The entry point of this code is
  ;;
--- 21,39 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
+ ;;; This file has been censored by the Communications Decency Act.
+ ;;; That law was passed under the guise of a ban on pornography, but
+ ;;; it bans far more than that.  This file did not contain pornography,
+ ;;; but it was censored nonetheless.
+ 
+ ;;; For information on US government censorship of the Internet, and
+ ;;; what you can do to bring back freedom of the press, see the web
+ ;;; site http://www.vtw.org/
+ 
  ;; The entry point of this code is
  ;;
*************** by translating things like \"foo!bar!baz
*** 646,650 ****
    ;;  replaced with a SPC.
    (or (memq no-replace '(t nil))
!       (error "no-replace must be t or nil, evalable at macroexpand-time."))
    (` (let ((temp (, list-symbol))
  	   ch)
--- 656,660 ----
    ;;  replaced with a SPC.
    (or (memq no-replace '(t nil))
!       (error "no-replace must be t or nil, evaluable at macroexpand-time"))
    (` (let ((temp (, list-symbol))
  	   ch)
*************** If ADDRESS contains more than one RFC-82
*** 760,764 ****
  	     (insert-buffer-substring address))
  	    (t
! 	     (error "Illegal address: %s" address)))
        
        ;; stolen from rfc822.el
--- 770,774 ----
  	     (insert-buffer-substring address))
  	    (t
! 	     (error "Invalid address: %s" address)))
        
        ;; stolen from rfc822.el
*************** If ADDRESS contains more than one RFC-82
*** 1274,1278 ****
  		   (mail-extr-delete-char 1)
  		   (goto-char quote-beg)
! 		   (mail-extr-delete-char 1))
  		 (mail-extr-undo-backslash-quoting quote-beg quote-end)
  		 (or (eq ?\  (char-after (point)))
--- 1284,1289 ----
  		   (mail-extr-delete-char 1)
  		   (goto-char quote-beg)
! 		   (or (eobp)
! 		       (mail-extr-delete-char 1)))
  		 (mail-extr-undo-backslash-quoting quote-beg quote-end)
  		 (or (eq ?\  (char-after (point)))
*************** If ADDRESS contains more than one RFC-82
*** 1307,1313 ****
  		    
  		    ;; Handle X.400 addresses encoded in RFC-822.
! 		    ;; *** Shit!  This has to handle the case where it is
  		    ;; *** embedded in a quote too!
! 		    ;; *** Shit!  The input is being broken up into atoms
  		    ;; *** by periods!
  		    ((looking-at mail-extr-x400-encoded-address-pattern)
--- 1318,1324 ----
  		    
  		    ;; Handle X.400 addresses encoded in RFC-822.
! 		    ;; *** This has to handle the case where it is
  		    ;; *** embedded in a quote too!
! 		    ;; *** The input is being broken up into atoms
  		    ;; *** by periods!
  		    ((looking-at mail-extr-x400-encoded-address-pattern)
*************** If ADDRESS contains more than one RFC-82
*** 1702,1706 ****
        ;; If the last thing in the name is 2 or more periods, or one or more
        ;; other sentence terminators (but not a single period) then keep them
!       ;; and the preceeding word.  This is for the benefit of whole sentences
        ;; in the name field: it's better behavior than dropping the last word
        ;; of the sentence...
--- 1713,1717 ----
        ;; If the last thing in the name is 2 or more periods, or one or more
        ;; other sentence terminators (but not a single period) then keep them
!       ;; and the preceding word.  This is for the benefit of whole sentences
        ;; in the name field: it's better behavior than dropping the last word
        ;; of the sentence...
*************** If ADDRESS contains more than one RFC-82
*** 1741,1745 ****
        
        ;; Delete leading and trailing junk characters.
!       ;; *** This is probably completly unneeded now.
        ;;(goto-char (point-max))
        ;;(skip-chars-backward mail-extr-non-end-name-chars)
--- 1752,1756 ----
        
        ;; Delete leading and trailing junk characters.
!       ;; *** This is probably completely unneeded now.
        ;;(goto-char (point-max))
        ;;(skip-chars-backward mail-extr-non-end-name-chars)
*************** If ADDRESS contains more than one RFC-82
*** 1857,1861 ****
         ("kr" "Korea (South)")
         ("kw" "Kuwait")
!        ("kz" "Kazachstan")
         ("lb" "Lebanon")
         ("lc" "St. Lucia")
--- 1868,1872 ----
         ("kr" "Korea (South)")
         ("kw" "Kuwait")
!        ("kz" "Kazakhstan")
         ("lb" "Lebanon")
         ("lc" "St. Lucia")
*************** If ADDRESS contains more than one RFC-82
*** 1894,1898 ****
         ("pl" "Poland")
         ("pr" "Puerto Rico (U.S.)")
!        ("pt" "Portugal"		"The Portugese Republic")
         ("py" "Paraguay")
         ("re" "Reunion (Fr.)")		; In .fr domain
--- 1905,1909 ----
         ("pl" "Poland")
         ("pr" "Puerto Rico (U.S.)")
!        ("pt" "Portugal"		"The Portuguese Republic")
         ("py" "Paraguay")
         ("re" "Reunion (Fr.)")		; In .fr domain
*************** If ADDRESS contains more than one RFC-82
*** 1956,1960 ****
    (or (setq domain (intern-soft (downcase domain)
  				mail-extr-all-top-level-domains))
!       (error "no such domain"))
    (message "%s: %s" (upcase (symbol-name domain)) (get domain 'domain-name)))
  
--- 1967,1971 ----
    (or (setq domain (intern-soft (downcase domain)
  				mail-extr-all-top-level-domains))
!       (error "No such domain"))
    (message "%s: %s" (upcase (symbol-name domain)) (get domain 'domain-name)))
  
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/mail-hist.el emacs-19.31/lisp/mail-hist.el
*** emacs-19.30/lisp/mail-hist.el	Sat Jun 24 03:42:55 1995
--- emacs-19.31/lisp/mail-hist.el	Wed May  8 16:18:31 1996
***************
*** 1,3 ****
--- 1,4 ----
  ;;; mail-hist.el --- Headers and message body history for outgoing mail.
+ 
  ;; Copyright (C) 1994 Free Software Foundation, Inc.
  
***************
*** 17,20 ****
--- 18,26 ----
  ;; 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, Inc., 59 Temple Place - Suite 330,
+ ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/mail-utils.el emacs-19.31/lisp/mail-utils.el
*** emacs-19.30/lisp/mail-utils.el	Sat Nov 18 13:42:56 1995
--- emacs-19.31/lisp/mail-utils.el	Thu Apr 11 13:33:36 1996
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** Usenet paths ending in an element that m
*** 150,154 ****
        (if (> pos 0) (setq pos (match-beginning 2)))
        (setq epos
! 	    (if (string-match "[ \t\n,]+" userids (match-end 0))
  		(match-end 0)
  	      (length userids)))
--- 151,156 ----
        (if (> pos 0) (setq pos (match-beginning 2)))
        (setq epos
! 	    ;; Delete thru the next comma, plus whitespace after.
! 	    (if (string-match ",[ \t\n]+" userids (match-end 0))
  		(match-end 0)
  	      (length userids)))
*************** If third arg ALL is non-nil, concatenate
*** 182,187 ****
  		;; Back up over newline, then trailing spaces or tabs
  		(forward-char -1)
! 		(while (member (preceding-char) '(?  ?\t))
! 		  (forward-char -1))
  		(setq value (concat value
  				    (if (string= value "") "" ", ")
--- 184,188 ----
  		;; Back up over newline, then trailing spaces or tabs
  		(forward-char -1)
! 		(skip-chars-backward " \t" opoint)
  		(setq value (concat value
  				    (if (string= value "") "" ", ")
*************** If third arg ALL is non-nil, concatenate
*** 197,202 ****
  		;; Back up over newline, then trailing spaces or tabs
  		(forward-char -1)
! 		(while (member (preceding-char) '(?  ?\t))
! 		  (forward-char -1))
  		(buffer-substring-no-properties opoint (point)))))))))
  
--- 198,202 ----
  		;; Back up over newline, then trailing spaces or tabs
  		(forward-char -1)
! 		(skip-chars-backward " \t" opoint)
  		(buffer-substring-no-properties opoint (point)))))))))
  
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/mailabbrev.el emacs-19.31/lisp/mailabbrev.el
*** emacs-19.30/lisp/mailabbrev.el	Mon Oct 30 21:08:11 1995
--- emacs-19.31/lisp/mailabbrev.el	Sat Mar  9 03:48:48 1996
***************
*** 1,5 ****
  ;;; mailabbrev.el --- abbrev-expansion of mail aliases.
  
! ;;; Copyright (C) 1985, 1986, 1987, 1992, 1993 Free Software Foundation, Inc.
  
  ;; Author: Jamie Zawinski <jwz@lucid.com>
--- 1,5 ----
  ;;; mailabbrev.el --- abbrev-expansion of mail aliases.
  
! ;; Copyright (C) 1985, 1986, 87, 92, 93, 1996 Free Software Foundation, Inc.
  
  ;; Author: Jamie Zawinski <jwz@lucid.com>
***************
*** 8,125 ****
  ;; Keywords: mail
  
! ;;; 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:
  
! ;;; This file ensures that, when the point is in a To:, CC:, BCC:, or From: 
! ;;; field, word-abbrevs are defined for each of your mail aliases.  These
! ;;; aliases will be defined from your .mailrc file (or the file specified by
! ;;; the MAILRC environment variable) if it exists.  Your mail aliases will
! ;;; expand any time you type a word-delimiter at the end of an abbreviation.
! ;;;
! ;;; What you see is what you get: no abbreviations will be expanded after you
! ;;; have sent the mail, unlike the old system.  This means you don't suffer
! ;;; the annoyance of having the system do things behind your back -- if an
! ;;; address you typed is going to be rewritten, you know it immediately,
! ;;; instead of after the mail has been sent and it's too late to do anything
! ;;; about it.  You will never again be screwed because you forgot to delete an
! ;;; old alias from your .mailrc when a new local user arrives and is given a
! ;;; userid which conflicts with one of your aliases, for example.
! ;;;
! ;;; Your mail alias abbrevs will be in effect only when the point is in an
! ;;; appropriate header field.  When in the body of the message, or other
! ;;; header fields, the mail aliases will not expand.  Rather, the normal
! ;;; mode-specific abbrev table (mail-mode-abbrev-table) will be used if 
! ;;; defined.  So if you use mail-mode specific abbrevs, this code will not
! ;;; adversely affect you.  You can control which header fields the abbrevs
! ;;; are used in by changing the variable mail-abbrev-mode-regexp.
! ;;;
! ;;; If auto-fill mode is on, abbrevs will wrap at commas instead of at word
! ;;; boundaries; also, header continuation-lines will be properly indented.
! ;;;
! ;;; You can also insert a mail alias with mail-interactive-insert-alias
! ;;; (bound to C-c C-a), which prompts you for an alias (with completion)
! ;;; and inserts its expansion at point.
! ;;;
! ;;; This file fixes a bug in the old system which prohibited your .mailrc
! ;;; file from having lines like
! ;;;
! ;;;     alias someone "John Doe <doe@quux.com>"
! ;;;
! ;;; That is, if you want an address to have embedded spaces, simply surround it
! ;;; with double-quotes.  This is necessary because the format of the .mailrc
! ;;; file bogusly uses spaces as address delimiters.  The following line defines
! ;;; an alias which expands to three addresses:
! ;;;
! ;;;     alias foobar addr-1 addr-2 "address three <addr-3>"
! ;;;
! ;;; (This is bogus because mail-delivery programs want commas, not spaces,
! ;;; but that's what the file format is, so we have to live with it.)
! ;;;
! ;;; If you like, you can call the function define-mail-abbrev to define your
! ;;; mail aliases instead of using a .mailrc file.  When you call it in this
! ;;; way, addresses are separated by commas.
! ;;;
! ;;; CAVEAT: This works on most Sun systems; I have been told that some versions
! ;;; of /bin/mail do not understand double-quotes in the .mailrc file.  So you
! ;;; should make sure your version does before including verbose addresses like
! ;;; this.  One solution to this, if you are on a system whose /bin/mail doesn't
! ;;; work that way, (and you still want to be able to /bin/mail to send mail in
! ;;; addition to emacs) is to define minimal aliases (without full names) in
! ;;; your .mailrc file, and use define-mail-abbrev to redefine them when sending
! ;;; mail from emacs; this way, mail sent from /bin/mail will work, and mail
! ;;; sent from emacs will be pretty.
! ;;;
! ;;; Aliases in the mailrc file may be nested.  If you define aliases like
! ;;;     alias group1 fred ethel
! ;;;     alias group2 larry curly moe
! ;;;     alias everybody group1 group2
! ;;; Then when you type "everybody" on the To: line, it will be expanded to
! ;;;     fred, ethyl, larry, curly, moe
! ;;;
! ;;; Aliases may also contain forward references; the alias of "everybody" can
! ;;; precede the aliases of "group1" and "group2".
! ;;;
! ;;; This code also understands the "source" .mailrc command, for reading
! ;;; aliases from some other file as well.
! ;;;
! ;;; Aliases may contain hyphens, as in "alias foo-bar foo@bar"; word-abbrevs
! ;;; normally cannot contain hyphens, but this code works around that for the
! ;;; specific case of mail-alias word-abbrevs.
! ;;;
! ;;; To read in the contents of another .mailrc-type file from emacs, use the
! ;;; command Meta-X merge-mail-abbrevs.  The rebuild-mail-abbrevs command is
! ;;; similar, but will delete existing aliases first.
! ;;;
! ;;; If you would like your aliases to be expanded when you type M-> or ^N to
! ;;; move out of the mail-header into the message body (instead of having to
! ;;; type SPC at the end of the abbrev before moving away) then you can do
! ;;;
! ;;;	(define-key mail-mode-map "\C-n" 'mail-abbrev-next-line)
! ;;;	(define-key mail-mode-map "\M->" 'mail-abbrev-end-of-buffer)
! ;;;
! ;;; If you want multiple addresses separated by a string other than ", " then
! ;;; you can set the variable mail-alias-separator-string to it.  This has to
! ;;; be a comma bracketed by whitespace if you want any kind of reasonable
! ;;; behaviour.
! ;;;
! ;;; Thanks to Harald Hanche-Olsen, Michael Ernst, David Loeffler, and
! ;;; Noah Friedman for suggestions and bug reports.
  
! ;;; To use this package, do (add-hook 'mail-setup-hook 'mail-abbrevs-setup).
  
  ;;; Code:
--- 8,128 ----
  ;; Keywords: mail
  
! ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
! ;; This file ensures that, when the point is in a To:, CC:, BCC:, or From: 
! ;; field, word-abbrevs are defined for each of your mail aliases.  These
! ;; aliases will be defined from your .mailrc file (or the file specified by
! ;; the MAILRC environment variable) if it exists.  Your mail aliases will
! ;; expand any time you type a word-delimiter at the end of an abbreviation.
! ;;
! ;; What you see is what you get: if mailabbrev is in use when you type
! ;; a name, and the name does not expand, you know it is not an abbreviation.
! ;; However, if you yank abbreviations into the headers
! ;; in a way that bypasses the check for abbreviations,
! ;; they are expanded (but not visibly) when you send the message.
! ;;
! ;; Your mail alias abbrevs will be in effect only when the point is in an
! ;; appropriate header field.  When in the body of the message, or other
! ;; header fields, the mail aliases will not expand.  Rather, the normal
! ;; mode-specific abbrev table (mail-mode-abbrev-table) will be used if 
! ;; defined.  So if you use mail-mode specific abbrevs, this code will not
! ;; adversely affect you.  You can control which header fields the abbrevs
! ;; are used in by changing the variable mail-abbrev-mode-regexp.
! ;;
! ;; If auto-fill mode is on, abbrevs will wrap at commas instead of at word
! ;; boundaries; also, header continuation-lines will be properly indented.
! ;;
! ;; You can also insert a mail alias with mail-interactive-insert-alias
! ;; (bound to C-c C-a), which prompts you for an alias (with completion)
! ;; and inserts its expansion at point.
! ;;
! ;; This file fixes a bug in the old system which prohibited your .mailrc
! ;; file from having lines like
! ;;
! ;;     alias someone "John Doe <doe@quux.com>"
! ;;
! ;; That is, if you want an address to have embedded spaces, simply surround it
! ;; with double-quotes.  This is necessary because the format of the .mailrc
! ;; file bogusly uses spaces as address delimiters.  The following line defines
! ;; an alias which expands to three addresses:
! ;;
! ;;     alias foobar addr-1 addr-2 "address three <addr-3>"
! ;;
! ;; (This is bogus because mail-delivery programs want commas, not spaces,
! ;; but that's what the file format is, so we have to live with it.)
! ;;
! ;; If you like, you can call the function define-mail-abbrev to define your
! ;; mail aliases instead of using a .mailrc file.  When you call it in this
! ;; way, addresses are separated by commas.
! ;;
! ;; CAVEAT: This works on most Sun systems; I have been told that some versions
! ;; of /bin/mail do not understand double-quotes in the .mailrc file.  So you
! ;; should make sure your version does before including verbose addresses like
! ;; this.  One solution to this, if you are on a system whose /bin/mail doesn't
! ;; work that way, (and you still want to be able to /bin/mail to send mail in
! ;; addition to emacs) is to define minimal aliases (without full names) in
! ;; your .mailrc file, and use define-mail-abbrev to redefine them when sending
! ;; mail from emacs; this way, mail sent from /bin/mail will work, and mail
! ;; sent from emacs will be pretty.
! ;;
! ;; Aliases in the mailrc file may be nested.  If you define aliases like
! ;;     alias group1 fred ethel
! ;;     alias group2 larry curly moe
! ;;     alias everybody group1 group2
! ;; Then when you type "everybody" on the To: line, it will be expanded to
! ;;     fred, ethyl, larry, curly, moe
! ;;
! ;; Aliases may also contain forward references; the alias of "everybody" can
! ;; precede the aliases of "group1" and "group2".
! ;;
! ;; This code also understands the "source" .mailrc command, for reading
! ;; aliases from some other file as well.
! ;;
! ;; Aliases may contain hyphens, as in "alias foo-bar foo@bar"; word-abbrevs
! ;; normally cannot contain hyphens, but this code works around that for the
! ;; specific case of mail-alias word-abbrevs.
! ;;
! ;; To read in the contents of another .mailrc-type file from emacs, use the
! ;; command Meta-X merge-mail-abbrevs.  The rebuild-mail-abbrevs command is
! ;; similar, but will delete existing aliases first.
! ;;
! ;; If you would like your aliases to be expanded when you type M-> or ^N to
! ;; move out of the mail-header into the message body (instead of having to
! ;; type SPC at the end of the abbrev before moving away) then you can do
! ;;
! ;;  (add-hook
! ;;   'mail-setup-hook
! ;;   '(lambda ()
! ;;      (substitute-key-definition 'next-line 'mail-abbrev-next-line
! ;;				 mail-mode-map global-map)
! ;;      (substitute-key-definition 'end-of-buffer 'mail-abbrev-end-of-buffer
! ;;				 mail-mode-map global-map)))
! ;;
! ;; If you want multiple addresses separated by a string other than ", " then
! ;; you can set the variable mail-alias-separator-string to it.  This has to
! ;; be a comma bracketed by whitespace if you want any kind of reasonable
! ;; behaviour.
! ;;
! ;; Thanks to Harald Hanche-Olsen, Michael Ernst, David Loeffler, and
! ;; Noah Friedman for suggestions and bug reports.
  
! ;; To use this package, do (add-hook 'mail-setup-hook 'mail-abbrevs-setup).
  
  ;;; Code:
*************** should be read from the .mailrc file.  (
*** 134,142 ****
  no aliases, which is represented by this being a table with no entries.)")
  
  ;;;###autoload
  (defun mail-abbrevs-setup ()
    (if (and (not (vectorp mail-abbrevs))
  	   (file-exists-p mail-personal-alias-file))
!       (build-mail-abbrevs))
    (make-local-hook 'pre-abbrev-expand-hook)
    (add-hook 'pre-abbrev-expand-hook 'sendmail-pre-abbrev-expand-hook
--- 137,161 ----
  no aliases, which is represented by this being a table with no entries.)")
  
+ (defvar mail-abbrev-modtime nil
+   "The modification time of your mail alias file when it was last examined.")
+ 
+ (defun mail-abbrevs-sync-aliases ()
+   (if (file-exists-p mail-personal-alias-file)
+       (let ((modtime (nth 5 (file-attributes mail-personal-alias-file))))
+ 	(if (not (equal mail-abbrev-modtime modtime))
+ 	    (progn
+ 	      (setq mail-abbrev-modtime modtime)
+ 	      (build-mail-abbrevs))))))
+ 
  ;;;###autoload
  (defun mail-abbrevs-setup ()
+   "Initialize use of the `mailabbrev' package."
    (if (and (not (vectorp mail-abbrevs))
  	   (file-exists-p mail-personal-alias-file))
!       (progn
! 	(setq mail-abbrev-modtime 
! 	      (nth 5 (file-attributes mail-personal-alias-file)))
! 	(build-mail-abbrevs)))
!   (mail-abbrevs-sync-aliases)
    (make-local-hook 'pre-abbrev-expand-hook)
    (add-hook 'pre-abbrev-expand-hook 'sendmail-pre-abbrev-expand-hook
*************** Don't use this command in Lisp programs!
*** 551,552 ****
--- 570,573 ----
  
  (provide 'mailabbrev)
+ 
+ ;;; mailabbrev.el ends here.
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/mailalias.el emacs-19.31/lisp/mailalias.el
*** emacs-19.30/lisp/mailalias.el	Mon Jul 10 10:46:28 1995
--- emacs-19.31/lisp/mailalias.el	Sat Mar  9 03:02:28 1996
***************
*** 1,5 ****
! ;;; mailalias.el --- expand mailing address aliases defined in ~/.mailrc.
  
! ;; Copyright (C) 1985, 1987 Free Software Foundation, Inc.
  
  ;; Maintainer: FSF
--- 1,5 ----
! ;;; mailalias.el --- expand and complete mailing address aliases
  
! ;; Copyright (C) 1985, 1987, 1995, 1996 Free Software Foundation, Inc.
  
  ;; Maintainer: FSF
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 32,35 ****
--- 33,106 ----
  (require 'sendmail)
  
+ (defvar mail-names t
+   "Alist of local users, aliases and directory entries as available.
+ When t this still needs to be initialized.
+ This is the basis for `mail-complete'.")
+ 
+ (defvar mail-local-names t
+   "Alist of local users.
+ When t this still needs to be initialized.")
+ 
+ (defvar mail-directory-names t
+   "Alist of mail address directory entries.
+ When t this still needs to be initialized.")
+ 
+ (defvar mail-address-field-regexp
+   "^\\(Resent-\\)?\\(To\\|From\\|CC\\|BCC\\|Reply-to\\):")
+ 
+ (defvar mail-complete-alist
+   `((,mail-address-field-regexp mail-get-names pattern)
+     ("Newsgroups:" . (if (boundp 'gnus-active-hashtb)
+ 			 gnus-active-hashtb
+ 		       (if (boundp news-group-article-assoc)
+ 			   news-group-article-assoc)))
+     ("Followup-To:" . (mail-sentto-newsgroups))
+     ;;("Distribution:" ???)
+     )
+   "Alist of header field and expression to return alist for completion.
+ Expression may reference variable `pattern' which is the string being completed.
+ If not on matching header, `mail-complete-function' gets called instead.")
+ 
+ (defvar mail-complete-function 'ispell-complete-word
+   "Function to call when completing outside `mail-complete-alist'-header.")
+ 
+ 
+ (defvar mail-directory-function nil
+   "Function to get completions from directory service or `nil' for none.
+ See `mail-directory-requery'.")
+ 
+ 
+ ;; This is for when the directory is huge, or changes frequently.
+ (defvar mail-directory-requery nil
+   "When non-`nil' call `mail-directory-function' for each completion.
+ In that case, one argument gets passed to the function, the partial string
+ entered so far.")
+ 
+ 
+ (defvar mail-directory-process nil
+   "Unix command when `mail-directory-function' is `mail-directory-process'.
+ This is a list of the form (COMMAND ARG ...), where each of the list elements
+ is evaluated.  When `mail-directory-requery' is non-`nil', during
+ evaluation the variable `pattern' contains the partial input being completed.
+ This might look like
+ 
+   '(remote-shell-program \"HOST\" \"-nl\" \"USER\" \"COMMAND\")
+ 
+ or
+ 
+   '(remote-shell-program \"HOST\" \"-n\" \"COMMAND '^\" pattern \"'\")")
+ 
+ (defvar mail-directory-stream ()
+   "List of (HOST SERVICE) for stream connection to mail directory.")
+ 
+ (defvar mail-directory-parser nil
+   "How to interpret the output of `mail-directory-function'.
+ Three types of values are possible:
+ 
+   - nil means to gather each line as one name
+   - regexp means first \\(grouping\\) in successive matches is name
+   - function called at beginning of buffer that returns an alist of names")
+ 
+ 
  ;; Called from sendmail-send-it, or similar functions,
  ;; only if some mail aliases are defined.
*************** their `Resent-' variants.
*** 41,45 ****
  Optional second arg EXCLUDE may be a regular expression defining text to be
  removed from alias expansions."
!   (sendmail-synch-aliases)
    (if (eq mail-aliases t)
        (progn (setq mail-aliases nil) (build-mail-aliases)))
--- 112,116 ----
  Optional second arg EXCLUDE may be a regular expression defining text to be
  removed from alias expansions."
!   (sendmail-sync-aliases)
    (if (eq mail-aliases t)
        (progn (setq mail-aliases nil) (build-mail-aliases)))
*************** removed from alias expansions."
*** 48,52 ****
    (let ((case-fold-search nil))
      (while (let ((case-fold-search t))
! 	     (re-search-forward "^\\(Resent-\\)?\\(To\\|From\\|CC\\|BCC\\|Reply-to\\):" end t))
        (skip-chars-forward " \t")
        (let ((beg1 (point))
--- 119,123 ----
    (let ((case-fold-search nil))
      (while (let ((case-fold-search t))
! 	     (re-search-forward mail-address-field-regexp end t))
        (skip-chars-forward " \t")
        (let ((beg1 (point))
*************** By default, this is the file specified b
*** 114,119 ****
      (unwind-protect
  	(progn
! 	  (setq buffer (generate-new-buffer "mailrc"))
! 	  (buffer-disable-undo buffer)
  	  (set-buffer buffer)
  	  (while file
--- 185,189 ----
      (unwind-protect
  	(progn
! 	  (setq buffer (generate-new-buffer " mailrc"))
  	  (set-buffer buffer)
  	  (while file
*************** By default, this is the file specified b
*** 121,125 ****
  		   (insert (save-excursion
  			     (set-buffer (get-file-buffer file))
! 			     (buffer-substring (point-min) (point-max)))))
  		  ((file-exists-p file) (insert-file-contents file))
  		  ((file-exists-p (setq file (concat "~/" file)))
--- 191,196 ----
  		   (insert (save-excursion
  			     (set-buffer (get-file-buffer file))
! 			     (buffer-substring-no-properties
! 			      (point-min) (point-max)))))
  		  ((file-exists-p file) (insert-file-contents file))
  		  ((file-exists-p (setq file (concat "~/" file)))
*************** By default, this is the file specified b
*** 140,145 ****
  	    (cond ((re-search-forward "^source[ \t]+" nil t)
  		   (re-search-forward "\\S-+")
! 		   (setq file
! 			 (buffer-substring (match-beginning 0) (match-end 0)))
  		   (beginning-of-line)
  		   (insert "# ") ; to ensure we don't re-process this file
--- 211,216 ----
  	    (cond ((re-search-forward "^source[ \t]+" nil t)
  		   (re-search-forward "\\S-+")
! 		   (setq file (buffer-substring-no-properties
! 			       (match-beginning 0) (match-end 0)))
  		   (beginning-of-line)
  		   (insert "# ") ; to ensure we don't re-process this file
*************** By default, this is the file specified b
*** 154,158 ****
  	      (define-mail-alias
  		name
! 		(buffer-substring start (point))
  		t)))
  	  mail-aliases)
--- 225,229 ----
  	      (define-mail-alias
  		name
! 		(buffer-substring-no-properties start (point))
  		t)))
  	  mail-aliases)
*************** if it is quoted with double-quotes."
*** 174,178 ****
    (interactive "sDefine mail alias: \nsDefine %s as mail alias for: ")
    ;; Read the defaults first, if we have not done so.
!   (sendmail-synch-aliases)
    (if (eq mail-aliases t)
        (progn
--- 245,249 ----
    (interactive "sDefine mail alias: \nsDefine %s as mail alias for: ")
    ;; Read the defaults first, if we have not done so.
!   (sendmail-sync-aliases)
    (if (eq mail-aliases t)
        (progn
*************** if it is quoted with double-quotes."
*** 210,214 ****
      (if tem
  	(rplacd tem definition)
!       (setq mail-aliases (cons (cons name definition) mail-aliases)))))
  
  (provide 'mailalias)
--- 281,432 ----
      (if tem
  	(rplacd tem definition)
!       (setq mail-aliases (cons (cons name definition) mail-aliases)
! 	    mail-names t))))
! 
! ;;;###autoload
! (defun mail-complete (arg)
!   "Perform completion on header field or word preceding point.
! Completable headers are according to `mail-complete-alist'.  If none matches
! current header, calls `mail-complete-function' and passes prefix arg if any."
!   (interactive "P")
!   (let ((list mail-complete-alist))
!     (if (and (save-excursion (search-forward
! 			      (concat "\n" mail-header-separator "\n")
! 			      nil t))
! 	     (save-excursion
! 	       (if (re-search-backward "^[^\t]" nil t)
! 		   (while list
! 		     (if (looking-at (car (car list)))
! 			 (setq arg (cdr (car list))
! 			       list ())
! 		       (setq list (cdr list)))))
! 	       arg))
! 	(let* ((end (point))
! 	       (beg (save-excursion
! 		      (skip-chars-backward "^ \t<,:")
! 		      (point)))
! 	       (pattern (buffer-substring beg end))
! 	       completion)
! 	  (setq list (eval arg)
! 		completion (try-completion pattern list))
! 	  (cond ((eq completion t))
! 		((null completion)
! 		 (message "Can't find completion for \"%s\"" pattern)
! 		 (ding))
! 		((not (string= pattern completion))
! 		 (delete-region beg end)
! 		 (insert completion))
! 		(t
! 		 (message "Making completion list...")
! 		 (with-output-to-temp-buffer "*Completions*"
! 		   (display-completion-list
! 		    (all-completions pattern list)))
! 		 (message "Making completion list...%s" "done"))))
!       (funcall mail-complete-function arg))))
! 
! (defun mail-get-names (pattern)
!   "Fetch local users and global mail adresses for completion.
! Consults `/etc/passwd' and a directory service if one is set up via
! `mail-directory-function'."
!   (if (eq mail-local-names t)
!       (save-excursion
! 	(set-buffer (generate-new-buffer " passwd"))
! 	(insert-file-contents "/etc/passwd" nil nil nil t)
! 	(setq mail-local-names)
! 	(while (not (eobp))
! 	  ;;Recognize lines like
! 	  ;;  nobody:*:65534:65534::/:
! 	  ;;  +demo::::::/bin/csh
! 	  ;;  +ethanb
! 	  ;;while skipping
! 	  ;;  +@SOFTWARE
! 	  (if (looking-at "\\+?\\([^:@\n+]+\\)")
! 	      (add-to-list 'mail-local-names (list (match-string 1))))
! 	  (beginning-of-line 2))
! 	(kill-buffer (current-buffer))))
!   (if (or (eq mail-names t)
! 		(eq mail-directory-names t))
!       (let (directory)
! 	(and mail-directory-function
! 	     (eq mail-directory-names t)
! 	     (setq directory
! 		   (mail-directory (if mail-directory-requery pattern))))
! 	(if (or directory
! 		(eq mail-names t))
! 	    (setq mail-names
! 		  (sort (append (if (consp mail-aliases) mail-aliases)
! 				(if (consp mail-local-names)
! 				    mail-local-names)
! 				directory)
! 			(lambda (a b)
! 			  ;; should cache downcased strings
! 			  (string< (downcase (car a))
! 				   (downcase (car b)))))))
! 	(or mail-directory-requery
! 	    (setq mail-directory-names directory))))
!   mail-names)
! 
! 
! (defun mail-directory (pattern)
!   "Call directory to get names matching PATTERN or all if `nil'.
! Calls `mail-directory-function' and applies `mail-directory-parser' to output."
!   (save-excursion
!     (message "Querying directory...")
!     (set-buffer (generate-new-buffer " *mail-directory*"))
!     (funcall mail-directory-function pattern)
!     (goto-char 1)
!     (let (directory)
!       (if (stringp mail-directory-parser)
! 	  (while (re-search-forward mail-directory-parser nil t)
! 	    (setq directory
! 		  `((,(match-string 1))
! 		    ,@directory)))
! 	(if mail-directory-parser
! 	    (setq directory (funcall mail-directory-parser))
! 	  (while (not (eobp))
! 	    (setq directory
! 		  `((,(buffer-substring (point)
! 					(progn
! 					  (forward-line)
! 					  (if (bolp)
! 					    (1- (point))
! 					    (point)))))
! 		    ,@directory)))))
!       (kill-buffer (current-buffer))
!       (message "Querying directory...done")
!       directory)))
! 
! 
! (defun mail-directory-process (pattern)
!   "Call a Unix process to output names in directory.
! See `mail-directory-process'."
!   (apply 'call-process (eval (car mail-directory-process)) nil t nil
! 	 (mapcar 'eval (cdr mail-directory-process))))
! 
! ;; This should handle a dialog.  Currently expects port to spit out names.
! (defun mail-directory-stream (pattern)
!   "Open a stream to retrieve names in directory.
! See `mail-directory-stream'."
!   (let (mailalias-done)
!     (set-process-sentinel
!      (apply 'open-network-stream "mailalias" (current-buffer)
! 	    mail-directory-stream)
!      (lambda (x x)
!        (setq mailalias-done t)))
!     (while (not mailalias-done)
!       (sit-for .1))))
! 
! (defun mail-sentto-newsgroups ()
!   "Return all entries from Newsgroups: header as completion alist."
!   (save-excursion
!     (if (mail-position-on-field "newsgroups" t)
! 	(let ((point (point))
! 	      list)
! 	  (while (< (skip-chars-backward "^:, \t\n") 0)
! 	    (setq list `((,(buffer-substring (point) point))
! 			 ,@list))
! 	    (skip-chars-backward ", \t\n")
! 	    (setq point (point)))
! 	  list))))
  
  (provide 'mailalias)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/make-mode.el emacs-19.31/lisp/make-mode.el
*** emacs-19.30/lisp/make-mode.el	Fri Nov 10 13:44:44 1995
--- emacs-19.31/lisp/make-mode.el	Mon Feb 26 14:32:51 1996
***************
*** 26,31 ****
  
  ;; 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:
--- 26,32 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** you enter a \".\" at the beginning of a 
*** 178,182 ****
  
  (defvar makefile-runtime-macros-list
!   '(("@") ("&") (">") ("<") ("*") ("^") ("?") ("%") ("$"))
    "List of macros that are resolved by make at runtime.
  If you insert a macro reference using makefile-insert-macro-ref, the name
--- 179,183 ----
  
  (defvar makefile-runtime-macros-list
!   '(("@") ("&") (">") ("<") ("*") ("^") ("+") ("?") ("%") ("$"))
    "List of macros that are resolved by make at runtime.
  If you insert a macro reference using makefile-insert-macro-ref, the name
*************** not be enclosed in { } or ( ).")
*** 202,206 ****
    "Regex for filenames that will NOT be included in the target list.")
  
! (add-to-list 'facemenu-unlisted-faces 'makefile-space-face)
  (defvar makefile-space-face 'makefile-space-face
    "Face to use for highlighting leading spaces in Font-Lock mode.")
--- 203,208 ----
    "Regex for filenames that will NOT be included in the target list.")
  
! (if (fboundp 'facemenu-unlisted-faces)
!     (add-to-list 'facemenu-unlisted-faces 'makefile-space-face))
  (defvar makefile-space-face 'makefile-space-face
    "Face to use for highlighting leading spaces in Font-Lock mode.")
*************** not be enclosed in { } or ( ).")
*** 213,220 ****
     ;;
     ;; Variable references even in targets/strings/comments:
!    '("\\$[({]\\([a-zA-Z0-9_]+\\)[})]" 1 font-lock-reference-face t)
     ;;
     ;; Do dependencies.  These get the function name face.
!    (list makefile-dependency-regex 1 'font-lock-function-name-face)
  
     ;; Highlight lines that contain just whitespace.
--- 215,222 ----
     ;;
     ;; Variable references even in targets/strings/comments:
!    '("\\$[({]\\([a-zA-Z0-9_]+\\)[})]" 1 font-lock-reference-face prepend)
     ;;
     ;; Do dependencies.  These get the function name face.
!    (list makefile-dependency-regex 1 'font-lock-function-name-face 'prepend)
  
     ;; Highlight lines that contain just whitespace.
*************** not be enclosed in { } or ( ).")
*** 224,228 ****
     ;; Highlight shell comments that Make treats as commands,
     ;; since these can fool people.
!    '("^\t+#" makefile-space-face t)
  
     ;; Highlight spaces that precede tabs.
--- 226,230 ----
     ;; Highlight shell comments that Make treats as commands,
     ;; since these can fool people.
!    '("^\t+#" 0 makefile-space-face t)
  
     ;; Highlight spaces that precede tabs.
*************** makefile-special-targets-list:
*** 489,493 ****
  
    ;; Font lock.
!   (if (fboundp 'makefile-define-space-face)
        (makefile-define-space-face))
    (make-local-variable 'font-lock-defaults)
--- 491,495 ----
  
    ;; Font lock.
!   (if (fboundp 'make-face)
        (makefile-define-space-face))
    (make-local-variable 'font-lock-defaults)
*************** Anywhere else just self-inserts."
*** 562,566 ****
  
  (defun makefile-insert-special-target ()
!   "Propmt for and insert a special target name.
  Uses `makefile-special-targets' list."
    (interactive)
--- 564,568 ----
  
  (defun makefile-insert-special-target ()
!   "Prompt for and insert a special target name.
  Uses `makefile-special-targets' list."
    (interactive)
*************** The context determines which are conside
*** 863,867 ****
    "Insert backslashes at end of every line in region.
  Useful for defining multi-line rules.
! If called with a prefix argument, trailing backslahes are removed."
    (interactive "r\nP")
    (save-excursion
--- 865,869 ----
    "Insert backslashes at end of every line in region.
  Useful for defining multi-line rules.
! If called with a prefix argument, trailing backslashes are removed."
    (interactive "r\nP")
    (save-excursion
*************** If called with a prefix argument, traili
*** 970,974 ****
        (if (makefile-browser-on-macro-line-p)
  	  (let ((macro-name (makefile-browser-this-line-macro-name)))
! 	    (kill-line)
  	    (insert
  	     (makefile-browser-format-macro-line
--- 972,976 ----
        (if (makefile-browser-on-macro-line-p)
  	  (let ((macro-name (makefile-browser-this-line-macro-name)))
! 	    (delete-region (point) (progn (end-of-line) (point)))
  	    (insert
  	     (makefile-browser-format-macro-line
*************** If called with a prefix argument, traili
*** 976,980 ****
  		(makefile-browser-get-state-for-line this-line))))
  	(let ((target-name (makefile-browser-this-line-target-name)))
! 	  (kill-line)
  	  (insert
  	   (makefile-browser-format-target-line
--- 978,982 ----
  		(makefile-browser-get-state-for-line this-line))))
  	(let ((target-name (makefile-browser-this-line-target-name)))
! 	  (delete-region (point) (progn (end-of-line) (point)))
  	  (insert
  	   (makefile-browser-format-target-line
*************** Uses `makefile-use-curly-braces-for-macr
*** 1329,1345 ****
  
  (defun makefile-add-log-defun ()
!   ;; "Return name of target or macro point is in, or nil."
    (save-excursion
!     (beginning-of-line)
!     (cond
!      ((looking-at makefile-macroassign-regex)
!       (buffer-substring (match-beginning 1)
! 			(match-end 1)))
!      ((progn
! 	(or (eobp) (forward-char))
! 	(re-search-backward makefile-dependency-regex nil t))
!       (buffer-substring (match-beginning 1)
! 			(match-end 1)))
!      (t nil))))
  
  ;; FIXME it might be nice to have them separated by macro vs target.
--- 1331,1358 ----
  
  (defun makefile-add-log-defun ()
!   "Return name of target or variable assignment that point is in.
! If it isn't in one, return nil."
    (save-excursion
!     (let (found)
!       (beginning-of-line)
!       ;; Scan back line by line, noticing when we come to a
!       ;; variable or rule definition, and giving up when we see
!       ;; a line that is not part of either of those.
!       (while (not found)
! 	(cond
! 	 ((looking-at makefile-macroassign-regex)
! 	  (setq found (buffer-substring-no-properties (match-beginning 1)
! 							(match-end 1))))
! 	 ((looking-at makefile-dependency-regex)
! 	  (setq found (buffer-substring-no-properties (match-beginning 1)
! 						      (match-end 1))))
! 	 ;; Don't keep looking across a blank line or comment.  Give up.
! 	 ((looking-at "$\\|#")
! 	  (setq found 'bobp))
! 	 ((bobp)
! 	  (setq found 'bobp)))
! 	(or found
! 	    (forward-line -1)))
!       (if (stringp found) found))))
  
  ;; FIXME it might be nice to have them separated by macro vs target.
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/makefile.nt emacs-19.31/lisp/makefile.nt
*** emacs-19.30/lisp/makefile.nt	Wed Nov 22 13:52:39 1995
--- emacs-19.31/lisp/makefile.nt	Wed Mar 27 23:30:59 1996
*************** all:
*** 28,36 ****
  #
  install:;	- mkdir $(INSTALL_DIR)\lisp
! 		- del .\same-dir.tst
! 		- del $(INSTALL_DIR)\lisp\same-dir.tst
  		echo SameDirTest > $(INSTALL_DIR)\lisp\same-dir.tst
  		if not exist .\same-dir.tst $(CP_DIR) . $(INSTALL_DIR)\lisp
! 		- del $(INSTALL_DIR)\lisp\same-dir.tst
  		
  
--- 28,36 ----
  #
  install:;	- mkdir $(INSTALL_DIR)\lisp
! 		- $(DEL) .\same-dir.tst
! 		- $(DEL) $(INSTALL_DIR)\lisp\same-dir.tst
  		echo SameDirTest > $(INSTALL_DIR)\lisp\same-dir.tst
  		if not exist .\same-dir.tst $(CP_DIR) . $(INSTALL_DIR)\lisp
! 		- $(DEL) $(INSTALL_DIR)\lisp\same-dir.tst
  		
  
*************** install:;	- mkdir $(INSTALL_DIR)\lisp
*** 38,41 ****
  # Maintenance
  # 
! clean:;		- del *~
  		- $(DEL_TREE) deleted
--- 38,41 ----
  # Maintenance
  # 
! clean:;		- $(DEL) *~
  		- $(DEL_TREE) deleted
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/makeinfo.el emacs-19.31/lisp/makeinfo.el
*** emacs-19.30/lisp/makeinfo.el	Mon Oct 30 12:16:53 1995
--- emacs-19.31/lisp/makeinfo.el	Sun Jan 14 02:34:30 1996
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/makesum.el emacs-19.31/lisp/makesum.el
*** emacs-19.30/lisp/makesum.el	Mon Mar 22 09:42:00 1993
--- emacs-19.31/lisp/makesum.el	Sun Jan 14 02:34:30 1996
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/man.el emacs-19.31/lisp/man.el
*** emacs-19.30/lisp/man.el	Fri Nov 24 17:19:36 1995
--- emacs-19.31/lisp/man.el	Sat Mar  2 00:37:08 1996
***************
*** 1,5 ****
  ;;; man.el --- browse UNIX manual pages
  
! ;; Copyright (C) 1993, 1994 Free Software Foundation, Inc.
  
  ;; Author:		Barry A. Warsaw <bwarsaw@cen.com>
--- 1,5 ----
  ;;; man.el --- browse UNIX manual pages
  
! ;; Copyright (C) 1993, 1994, 1996 Free Software Foundation, Inc.
  
  ;; Author:		Barry A. Warsaw <bwarsaw@cen.com>
***************
*** 20,25 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 36,40 ****
  ;; In mid 1991, several people posted some interesting improvements to
  ;; man.el from the standard emacs 18.57 distribution.  I liked many of
! ;; these, but wanted everthing in one single package, so I decided
  ;; to incorporate them into a single manual browsing mode.  While
  ;; much of the code here has been rewritten, and some features added,
--- 37,41 ----
  ;; In mid 1991, several people posted some interesting improvements to
  ;; man.el from the standard emacs 18.57 distribution.  I liked many of
! ;; these, but wanted everything in one single package, so I decided
  ;; to incorporate them into a single manual browsing mode.  While
  ;; much of the code here has been rewritten, and some features added,
***************
*** 57,61 ****
  ;; Francesco Potorti` <pot@cnuce.cnr.it> cleaned it up thoroughly,
  ;; making it faster, more robust and more tolerant of different
! ;; systems' man idiosynchrasies.
  
  ;; ========== Features ==========
--- 58,62 ----
  ;; Francesco Potorti` <pot@cnuce.cnr.it> cleaned it up thoroughly,
  ;; making it faster, more robust and more tolerant of different
! ;; systems' man idiosyncrasies.
  
  ;; ========== Features ==========
***************
*** 101,112 ****
  (defvar Man-current-page)
  (defvar Man-page-list)
! (defvar Man-filter-list)
  (defvar Man-original-frame)
  (defvar Man-arguments)
  (defvar Man-sections-alist)
  (defvar Man-refpages-alist)
! (defvar Man-uses-untabify-flag)
  (defvar Man-page-mode-string)
! (defvar Man-sed-script)
  
  ;; vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
--- 102,126 ----
  (defvar Man-current-page)
  (defvar Man-page-list)
! (defvar Man-filter-list nil
!   "*Manpage cleaning filter command phrases.
! This variable contains a list of the following form:
! 
! '((command-string phrase-string*)*)
! 
! Each phrase-string is concatenated onto the command-string to form a
! command filter.  The (standard) output (and standard error) of the Un*x
! man command is piped through each command filter in the order the
! commands appear in the association list.  The final output is placed in
! the manpage buffer.")
! 
  (defvar Man-original-frame)
  (defvar Man-arguments)
  (defvar Man-sections-alist)
  (defvar Man-refpages-alist)
! (defvar Man-uses-untabify-flag t
!   "When non-nil use `untabify' instead of Man-untabify-command.")
  (defvar Man-page-mode-string)
! (defvar Man-sed-script nil
!   "Script for sed to nuke backspaces and ANSI codes from manpages.")
  
  ;; vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
*************** This regular expression should start wit
*** 291,295 ****
    (define-key Man-mode-map "."    'beginning-of-buffer)
    (define-key Man-mode-map "r"    'Man-follow-manual-reference)
-   (define-key Man-mode-map "t"    'toggle-truncate-lines)
    (define-key Man-mode-map "g"    'Man-goto-section)
    (define-key Man-mode-map "s"    'Man-goto-see-also-section)
--- 305,308 ----
*************** This regular expression should start wit
*** 304,308 ****
  ;; utilities
  
! (defsubst Man-init-defvars ()
    "Used for initialising variables based on the value of window-system.
  This is necessary if one wants to dump man.el with emacs."
--- 317,321 ----
  ;; utilities
  
! (defun Man-init-defvars ()
    "Used for initialising variables based on the value of window-system.
  This is necessary if one wants to dump man.el with emacs."
*************** This is necessary if one wants to dump m
*** 313,385 ****
  				      window-system))
  
!   (defconst Man-uses-untabify-flag t
!     ;; don't use pr: it is buggy
!     ;; (or (not (file-readable-p "/etc/passwd"))
!     ;;   (/= 0 (apply 'call-process
!     ;;                Man-untabify-command nil nil nil
!     ;;                (append Man-untabify-command-args
!     ;;                        (list "/etc/passwd")))))
!     "When non-nil use `untabify' instead of Man-untabify-command.")
  
!   (defconst Man-sed-script
!     (cond
!      (Man-fontify-manpage-flag
!       nil)
!      ((= 0 (call-process Man-sed-command nil nil nil Man-sysv-sed-script))
!       Man-sysv-sed-script)
!      ((= 0 (call-process Man-sed-command nil nil nil Man-berkeley-sed-script))
!       Man-berkeley-sed-script)
!      (t
!       nil))
!     "Script for sed to nuke backspaces and ANSI codes from manpages.")
! 
!   (defvar Man-filter-list
!     (list
!      (cons
!       Man-sed-command
!       (list
!        (if Man-sed-script
! 	   (concat "-e '" Man-sed-script "'")
! 	 "")
!        "-e '/^[\001-\032][\001-\032]*$/d'"
!        "-e '/\e[789]/s///g'"
!        "-e '/Reformatting page.  Wait/d'"
!        "-e '/Reformatting entry.  Wait/d'"
!        "-e '/^[ \t]*Hewlett-Packard[ \t]Company[ \t]*-[ \t][0-9]*[ \t]-/d'"
!        "-e '/^[ \t]*Hewlett-Packard[ \t]*-[ \t][0-9]*[ \t]-.*$/d'"
!        "-e '/^[ \t][ \t]*-[ \t][0-9]*[ \t]-[ \t]*Formatted:.*[0-9]$/d'"
!        "-e '/^[ \t]*Page[ \t][0-9]*.*(printed[ \t][0-9\\/]*)$/d'"
!        "-e '/^Printed[ \t][0-9].*[0-9]$/d'"
!        "-e '/^[ \t]*X[ \t]Version[ \t]1[01].*Release[ \t][0-9]/d'"
!        "-e '/^[A-za-z].*Last[ \t]change:/d'"
!        "-e '/^Sun[ \t]Release[ \t][0-9].*[0-9]$/d'"
!        "-e '/[ \t]*Copyright [0-9]* UNIX System Laboratories, Inc.$/d'"
!        ))
!      (cons
!       Man-awk-command
!       (list
!        "'\n"
!        "BEGIN { blankline=0; anonblank=0; }\n"
!        "/^$/ { if (anonblank==0) next; }\n"
!        "{ anonblank=1; }\n"
!        "/^$/ { blankline++; next; }\n"
!        "{ if (blankline>0) { print \"\"; blankline=0; } print $0; }\n"
!        "'"
!        ))
!      (if (not Man-uses-untabify-flag)
  	 (cons
! 	  Man-untabify-command
! 	  Man-untabify-command-args)
!        ))
!     "*Manpage cleaning filter command phrases.
! This variable contains a list of the following form:
! 
! '((command-string phrase-string*)*)
! 
! Each phrase-string is concatenated onto the command-string to form a
! command filter.  The (standard) output (and standard error) of the Un*x
! man command is piped through each command filter in the order the
! commands appear in the association list.  The final output is placed in
! the manpage buffer.")
  )
  
--- 326,379 ----
  				      window-system))
  
!   (setq Man-sed-script
! 	(cond
! 	 (Man-fontify-manpage-flag
! 	  nil)
! 	 ((= 0 (call-process Man-sed-command nil nil nil Man-sysv-sed-script))
! 	  Man-sysv-sed-script)
! 	 ((= 0 (call-process Man-sed-command nil nil nil Man-berkeley-sed-script))
! 	  Man-berkeley-sed-script)
! 	 (t
! 	  nil)))
  
!   (setq Man-filter-list
! 	(list
  	 (cons
! 	  Man-sed-command
! 	  (list
! 	   (if Man-sed-script
! 	       (concat "-e '" Man-sed-script "'")
! 	     "")
! 	   "-e '/^[\001-\032][\001-\032]*$/d'"
! 	   "-e '/\e[789]/s///g'"
! 	   "-e '/Reformatting page.  Wait/d'"
! 	   "-e '/Reformatting entry.  Wait/d'"
! 	   "-e '/^[ \t]*Hewlett-Packard[ \t]Company[ \t]*-[ \t][0-9]*[ \t]-/d'"
! 	   "-e '/^[ \t]*Hewlett-Packard[ \t]*-[ \t][0-9]*[ \t]-.*$/d'"
! 	   "-e '/^[ \t][ \t]*-[ \t][0-9]*[ \t]-[ \t]*Formatted:.*[0-9]$/d'"
! 	   "-e '/^[ \t]*Page[ \t][0-9]*.*(printed[ \t][0-9\\/]*)$/d'"
! 	   "-e '/^Printed[ \t][0-9].*[0-9]$/d'"
! 	   "-e '/^[ \t]*X[ \t]Version[ \t]1[01].*Release[ \t][0-9]/d'"
! 	   "-e '/^[A-za-z].*Last[ \t]change:/d'"
! 	   "-e '/^Sun[ \t]Release[ \t][0-9].*[0-9]$/d'"
! 	   "-e '/[ \t]*Copyright [0-9]* UNIX System Laboratories, Inc.$/d'"
! 	   "-e '/^[ \t]*Rev\\..*Page [0-9][0-9]*$/d'"
! 	   ))
! 	 (cons
! 	  Man-awk-command
! 	  (list
! 	   "'\n"
! 	   "BEGIN { blankline=0; anonblank=0; }\n"
! 	   "/^$/ { if (anonblank==0) next; }\n"
! 	   "{ anonblank=1; }\n"
! 	   "/^$/ { blankline++; next; }\n"
! 	   "{ if (blankline>0) { print \"\"; blankline=0; } print $0; }\n"
! 	   "'"
! 	   ))
! 	 (if (not Man-uses-untabify-flag)
! 	     (cons
! 	      Man-untabify-command
! 	      Man-untabify-command-args)
! 	   )))
  )
  
*************** If a buffer already exists for this man 
*** 517,523 ****
  	     input))))
  
-   ;; Init the man package variables, if not already done.
-   (Man-init-defvars)
- 
    ;; Possibly translate the "subject(section)" syntax into the
    ;; "section subject" syntax and possibly downcase the section.
--- 511,514 ----
*************** Specify which reference to use; default 
*** 1064,1067 ****
--- 1055,1061 ----
        (error "You're looking at the first manpage in the buffer"))))
  
+ ;; Init the man package variables, if not already done.
+ (Man-init-defvars)
+ 
  (provide 'man)
  
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/map-ynp.el emacs-19.31/lisp/map-ynp.el
*** emacs-19.30/lisp/map-ynp.el	Thu Jun  8 12:48:09 1995
--- emacs-19.31/lisp/map-ynp.el	Sun Mar 17 10:39:18 1996
***************
*** 1,37 ****
  ;;; map-ynp.el --- General-purpose boolean question-asker.
  
! ;;; Copyright (C) 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
  
  ;; Author: Roland McGrath <roland@gnu.ai.mit.edu>
  ;; Keywords: lisp, extensions
  
! ;;; This program 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.
! ;;;
! ;;; This program 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.
! ;;;
! ;;; A copy of the GNU General Public License can be obtained from this
! ;;; program's author (send electronic mail to roland@ai.mit.edu) or from
! ;;; the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA
! ;;; 02139, USA.
  
  ;;; Commentary:
  
! ;;; map-y-or-n-p is a general-purpose question-asking function.
! ;;; It asks a series of y/n questions (a la y-or-n-p), and decides to
! ;;; applies an action to each element of a list based on the answer.
! ;;; The nice thing is that you also get some other possible answers
! ;;; to use, reminiscent of query-replace: ! to answer y to all remaining
! ;;; questions; ESC or q to answer n to all remaining questions; . to answer
! ;;; y once and then n for the remainder; and you can get help with C-h.
  
  ;;; Code:
  
- ;;;###autoload
  (defun map-y-or-n-p (prompter actor list &optional help action-alist
  			      no-cursor-in-echo-area)
--- 1,38 ----
  ;;; map-ynp.el --- General-purpose boolean question-asker.
  
! ;; Copyright (C) 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
  
  ;; Author: Roland McGrath <roland@gnu.ai.mit.edu>
  ;; Keywords: lisp, extensions
  
! ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
! ;; map-y-or-n-p is a general-purpose question-asking function.
! ;; It asks a series of y/n questions (a la y-or-n-p), and decides to
! ;; applies an action to each element of a list based on the answer.
! ;; The nice thing is that you also get some other possible answers
! ;; to use, reminiscent of query-replace: ! to answer y to all remaining
! ;; questions; ESC or q to answer n to all remaining questions; . to answer
! ;; y once and then n for the remainder; and you can get help with C-h.
  
  ;;; Code:
  
  (defun map-y-or-n-p (prompter actor list &optional help action-alist
  			      no-cursor-in-echo-area)
*************** Returns the number of actions taken."
*** 78,81 ****
--- 79,84 ----
    (let* ((actions 0)
  	 user-keys mouse-event map prompt char elt tail def
+ 	 ;; Non-nil means we should use mouse menus to ask.
+ 	 use-menus
  	 delayed-switch-frame
  	 (next (if (or (and list (symbolp list))
*************** Returns the number of actions taken."
*** 107,110 ****
--- 110,114 ----
  					    (vector (nth 1 elt))))
  				    action-alist))))
+ 		use-menus t
  		mouse-event last-nonmenu-event))			       
        (setq user-keys (if action-alist
*************** Returns the number of actions taken."
*** 133,138 ****
  		   ;; Prompt the user about this object.
  		   (setq quit-flag nil)
! 		   (if mouse-event
! 		       (setq def (or (x-popup-dialog mouse-event
  						     (cons prompt map))
  				     'quit))
--- 137,142 ----
  		   ;; Prompt the user about this object.
  		   (setq quit-flag nil)
! 		   (if use-menus
! 		       (setq def (or (x-popup-dialog (or mouse-event use-menus)
  						     (cons prompt map))
  				     'quit))
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/menu-bar.el emacs-19.31/lisp/menu-bar.el
*** emacs-19.30/lisp/menu-bar.el	Thu Nov 16 12:14:18 1995
--- emacs-19.31/lisp/menu-bar.el	Fri Mar  8 13:14:30 1996
***************
*** 1,9 ****
  ;;; menu-bar.el --- define a default menu bar.
  
  ;; Author: RMS
  ;; Keywords: internal
  
- ;; Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc.
- 
  ;; This file is part of GNU Emacs.
  
--- 1,9 ----
  ;;; menu-bar.el --- define a default menu bar.
  
+ ;; Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc.
+ 
  ;; Author: RMS
  ;; Keywords: internal
  
  ;; This file is part of GNU Emacs.
  
***************
*** 19,24 ****
  
  ;; 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.
  
  ;; Avishai Yacobi suggested some menu rearrangements.
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;; Avishai Yacobi suggested some menu rearrangements.
***************
*** 26,29 ****
--- 27,38 ----
  ;;; Code:
  
+ ;;; User options:
+ 
+ (defvar buffers-menu-max-size 10
+   "*Maximum number of entries which may appear on the Buffers menu.
+ If this is 10, then only the ten most-recently-selected buffers are shown.
+ If this is nil, then all buffers are shown.
+ A large number or nil slows down menu responsiveness.")
+ 
  ;; Don't clobber an existing menu-bar keymap, to preserve any menu-bar key
  ;; definitions made in loaddefs.el.
***************
*** 59,63 ****
    '("--"))
  
! (define-key menu-bar-tools-menu [vc-menu]
    (cons "Version Control" vc-menu-map))
  
--- 68,72 ----
    '("--"))
  
! (define-key menu-bar-tools-menu [vc]
    (cons "Version Control" vc-menu-map))
  
***************
*** 190,200 ****
    '("--"))
  
! (define-key menu-bar-search-menu [nonincremental-repeat-re-search-back]
    '("Repeat Regexp Backwards" . nonincremental-repeat-re-search-backward))
! (define-key menu-bar-search-menu [nonincremental-repeat-search-back]
    '("Repeat Backwards" . nonincremental-repeat-search-backward))
! (define-key menu-bar-search-menu [nonincremental-repeat-re-search-fwd]
    '("Repeat Regexp" . nonincremental-repeat-re-search-forward))
! (define-key menu-bar-search-menu [nonincremental-repeat-search-fwd]
    '("Repeat Search" . nonincremental-repeat-search-forward))
  
--- 199,209 ----
    '("--"))
  
! (define-key menu-bar-search-menu [repeat-regexp-back]
    '("Repeat Regexp Backwards" . nonincremental-repeat-re-search-backward))
! (define-key menu-bar-search-menu [repeat-search-back]
    '("Repeat Backwards" . nonincremental-repeat-search-backward))
! (define-key menu-bar-search-menu [repeat-regexp-fwd]
    '("Repeat Regexp" . nonincremental-repeat-re-search-forward))
! (define-key menu-bar-search-menu [repeat-search-fwd]
    '("Repeat Search" . nonincremental-repeat-search-forward))
  
***************
*** 202,212 ****
    '("--"))
  
! (define-key menu-bar-search-menu [re-search-back]
    '("Regexp Search Backwards..." . nonincremental-re-search-backward))
! (define-key menu-bar-search-menu [search-back]
    '("Search Backwards..." . nonincremental-search-backward))
! (define-key menu-bar-search-menu [re-search-fwd]
    '("Regexp Search..." . nonincremental-re-search-forward))
! (define-key menu-bar-search-menu [search-fwd]
    '("Search..." . nonincremental-search-forward))
  
--- 211,221 ----
    '("--"))
  
! (define-key menu-bar-search-menu [re-search-backward]
    '("Regexp Search Backwards..." . nonincremental-re-search-backward))
! (define-key menu-bar-search-menu [search-backward]
    '("Search Backwards..." . nonincremental-search-backward))
! (define-key menu-bar-search-menu [re-search-forward]
    '("Regexp Search..." . nonincremental-re-search-forward))
! (define-key menu-bar-search-menu [search-forward]
    '("Search..." . nonincremental-search-forward))
  
*************** Do the same for the keys of the same nam
*** 424,433 ****
  (define-key global-map [menu-bar buffer]
    (cons "Buffers" (make-sparse-keymap "Buffers")))
- 
- (defvar buffers-menu-max-size 10
-   "*Maximum number of entries which may appear on the Buffers menu.
- If this is 10, then only the ten most-recently-selected buffers are shown.
- If this is nil, then all buffers are shown.
- A large number or nil slows down menu responsiveness.")
  
  (defvar list-buffers-directory nil)
--- 433,436 ----
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/metamail.el emacs-19.31/lisp/metamail.el
*** emacs-19.30/lisp/metamail.el	Sun Aug 15 00:39:52 1993
--- emacs-19.31/lisp/metamail.el	Fri Apr 19 14:05:39 1996
***************
*** 1,8 ****
  ;;; metamail.el --- Metamail interface for GNU Emacs
  
! ;; Copyright (C) 1993 Masanobu UMEDA
  
  ;; Author: Masanobu UMEDA <umerin@mse.kyutech.ac.jp>
! ;; Version: $Header: /home/gd/gnu/emacs/19.0/lisp/RCS/metamail.el,v 1.1 1993/07/20 03:02:12 rms Exp $
  ;; Keywords: mail, news, mime, multimedia
  
--- 1,8 ----
  ;;; metamail.el --- Metamail interface for GNU Emacs
  
! ;; Copyright (C) 1993, 1996  Masanobu UMEDA
  
  ;; Author: Masanobu UMEDA <umerin@mse.kyutech.ac.jp>
! ;; Version: $Header: /home/fsf/rms/e19/lisp/RCS/metamail.el,v 1.5 1996/04/19 18:05:38 rms Exp $
  ;; Keywords: mail, news, mime, multimedia
  
***************
*** 20,32 ****
  
  ;; 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:
  
! ;; LCD Archive Entry:
! ;; metamail|Masanobu UMEDA|umerin@mse.kyutech.ac.jp|
! ;; Metamail interface for GNU Emacs|
! ;; $Date: 1993/07/20 03:02:12 $|$Revision: 1.1 $|~/misc/metamail.el.Z|
  
  ;; Note: Metamail does not have all options which is compatible with
--- 20,31 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
! ;; The latest version will be at:
! ;;	ftp://ftp.kyutech.ac.jp/pub/MultiMedia/mime/emacs-mime-tools.shar
  
  ;; Note: Metamail does not have all options which is compatible with
***************
*** 34,38 ****
  ;; hack the environment variables.  In addition, there is no way to
  ;; display all header fields without extra informative body messages
! ;; which is suppressed by "-q" option.
  
  ;; The idea of using metamail to process MIME messages is from
--- 33,46 ----
  ;; hack the environment variables.  In addition, there is no way to
  ;; display all header fields without extra informative body messages
! ;; which are suppressed by "-q" option.
! 
! ;; The following definition is what I'm using with GNUS 4:
! ;;(setq gnus-show-mime-method
! ;;      (function
! ;;       (lambda ()
! ;;	   (metamail-interpret-header)
! ;;	   (let ((metamail-switches	;Suppress header fields in a body.
! ;;		  (append metamail-switches '("-q"))))
! ;;	     (metamail-interpret-body)))))
  
  ;; The idea of using metamail to process MIME messages is from
***************
*** 44,78 ****
    "*Metamail program name.")
  
! (defvar metamail-environment '("KEYHEADS=*")
    "*Environment variables passed to `metamail'.
! It must ba a list of strings that have the format ENVVARNAME=VALUE.")
  
! (defvar metamail-switches '("-m" "emacs" "-x" "-d" "-z")
    "*Switches for `metamail' program.
! -z is required to remove zap file.")
  
! (defun metamail-buffer (&optional buffer nodisplay)
    "Process current buffer through `metamail'.
! Optional 1st argument BUFFER specifies a buffer to be filled (nil
  means current).
! Optional 2nd argument NODISPLAY non-nil means buffer is not
  redisplayed as output is inserted."
!   (interactive)
!   (metamail-region (point-min) (point-max) buffer nodisplay))
  
! (defun metamail-region (beg end &optional buffer nodisplay)
    "Process current region through 'metamail'.
! Optional 1st argument BUFFER specifies a buffer to be filled (nil
  means current).
! Optional 2nd argument NODISPLAY non-nil means buffer is not
  redisplayed as output is inserted."
!   (interactive "r")
    (let ((curbuf (current-buffer))
  	(buffer-read-only nil)
! 	(metafile (make-temp-name "/tmp/metamail")))
      (save-excursion
        ;; Gee!  Metamail does not ouput to stdout if input comes from
        ;; stdin.
!       (write-region beg end metafile nil 'nomessage)
        (if buffer
  	  (set-buffer buffer))
--- 52,167 ----
    "*Metamail program name.")
  
! (defvar metamail-mailer-name "emacs"
!   "*Mailer name set to MM_MAILER environment variable.")
! 
! (defvar metamail-environment '("KEYHEADS=*" "MM_QUIET=1")
    "*Environment variables passed to `metamail'.
! It must be a list of strings that have the format ENVVARNAME=VALUE.
! It is not expected to be altered globally by `set' or `setq'.
! Instead, change its value temporary using `let' or `let*' form.")
  
! (defvar metamail-switches '("-x" "-d" "-z")
    "*Switches for `metamail' program.
! `-z' is required to remove zap file.
! It is not expected to be altered globally by `set' or `setq'.
! Instead, change its value temporary using `let' or `let*' form.
! `-m MAILER' argument is automatically generated from the
! `metamail-mailer-name' variable.")
! 
! ;;;###autoload
! (defun metamail-interpret-header ()
!   "Interpret a header part of a MIME message in current buffer.
! Its body part is not interpreted at all."
!   (interactive)
!   (save-excursion
!     (let* ((buffer-read-only nil)
! 	   (metamail-switches		;Inhibit processing an empty body.
! 	    (append metamail-switches '("-c" "text/plain" "-E" "7bit")))
! 	   (end (progn
! 		  (goto-char (point-min))
! 		  (search-forward "\n\n" nil 'move)
! 		  ;; An extra newline is inserted by metamail if there
! 		  ;; is no body part.  So, insert a dummy body by
! 		  ;; itself.
! 		  (insert "\n")
! 		  (point))))
!       (metamail-region (point-min) end nil nil 'nodisplay)
!       ;; Remove an extra newline inserted by myself.
!       (goto-char (point-min))
!       (if (search-forward "\n\n\n" nil t)
! 	  (delete-char -1))
!       )))
  
! ;;;###autoload
! (defun metamail-interpret-body (&optional viewmode nodisplay)
!   "Interpret a body part of a MIME message in current buffer.
! Optional argument VIEWMODE specifies the value of the
! EMACS_VIEW_MODE environment variable (defaulted to 1).
! Optional argument NODISPLAY non-nil means buffer is not
! redisplayed as output is inserted.
! Its header part is not interpreted at all."
!   (interactive "p")
!   (save-excursion
!     (let ((contype nil)
! 	  (encoding nil)
! 	  (end (progn
! 		 (goto-char (point-min))
! 		 (search-forward "\n\n" nil t)
! 		 (point))))
!       ;; Find Content-Type and Content-Transfer-Encoding from the header.
!       (save-restriction
! 	(narrow-to-region (point-min) end)
! 	(setq contype 
! 	      (or (mail-fetch-field "Content-Type") "text/plain"))
! 	(setq encoding 
! 	      (or (mail-fetch-field "Content-Transfer-Encoding") "7bit")))
!       ;; Interpret the body part only.
!       (let ((metamail-switches		;Process body part only.
! 	     (append metamail-switches
! 		     (list "-b" "-c" contype "-E" encoding))))
! 	(metamail-region end (point-max) viewmode nil nodisplay))
!       ;; Mode specific hack.
!       (cond ((eq major-mode 'rmail-mode)
! 	     ;; Adjust the marker of this message if in Rmail mode buffer.
! 	     (set-marker (aref rmail-message-vector (1+ rmail-current-message))
! 			 (point-max))))
!       )))
! 
! ;;;###autoload
! (defun metamail-buffer (&optional viewmode buffer nodisplay)
    "Process current buffer through `metamail'.
! Optional argument VIEWMODE specifies the value of the
! EMACS_VIEW_MODE environment variable (defaulted to 1).
! Optional argument BUFFER specifies a buffer to be filled (nil
  means current).
! Optional argument NODISPLAY non-nil means buffer is not
  redisplayed as output is inserted."
!   (interactive "p")
!   (metamail-region (point-min) (point-max) viewmode buffer nodisplay))
  
! ;;;###autoload
! (defun metamail-region (beg end &optional viewmode buffer nodisplay)
    "Process current region through 'metamail'.
! Optional argument VIEWMODE specifies the value of the
! EMACS_VIEW_MODE environment variable (defaulted to 1).
! Optional argument BUFFER specifies a buffer to be filled (nil
  means current).
! Optional argument NODISPLAY non-nil means buffer is not
  redisplayed as output is inserted."
!   (interactive "r\np")
    (let ((curbuf (current-buffer))
  	(buffer-read-only nil)
! 	(metafile (make-temp-name "/tmp/metamail"))
! 	(option-environment
! 	 (list (concat "EMACS_VIEW_MODE=" 
! 		       (if (numberp viewmode) viewmode 1)))))
      (save-excursion
        ;; Gee!  Metamail does not ouput to stdout if input comes from
        ;; stdin.
!       (let ((selective-display nil)	;Disable ^M to nl translation.
! 	    (kanji-fileio-code 2)	;Write in JIS code when nemacs.
! 	    (file-coding-system		;Write in JUNET style when mule.
! 	     (if (featurep 'mule) *junet*)))
! 	(write-region beg end metafile nil 'nomessage))
        (if buffer
  	  (set-buffer buffer))
*************** redisplayed as output is inserted."
*** 86,90 ****
        ;; to pass such information directly.
        (let ((process-environment
! 	     (append metamail-environment process-environment)))
  	(apply (function call-process)
  	       metamail-program-name
--- 175,185 ----
        ;; to pass such information directly.
        (let ((process-environment
! 	     (append process-environment
! 		     metamail-environment option-environment)))
! 	;; Specify character coding system.
! 	(if (boundp 'NEMACS)
! 	    (define-program-kanji-code nil metamail-program-name 2)) ;JIS
! 	(if (featurep 'mule)
! 	    (define-program-coding-system nil metamail-program-name *junet*))
  	(apply (function call-process)
  	       metamail-program-name
*************** redisplayed as output is inserted."
*** 92,96 ****
  	       t			;Output to current buffer
  	       (not nodisplay)		;Force redisplay
! 	       (append metamail-switches (list metafile))))
        ;; `metamail' may not delete the temporary file!
        (condition-case error
--- 187,193 ----
  	       t			;Output to current buffer
  	       (not nodisplay)		;Force redisplay
! 	       (append metamail-switches
! 		       (list "-m" (or metamail-mailer-name "emacs"))
! 		       (list metafile))))
        ;; `metamail' may not delete the temporary file!
        (condition-case error
*************** redisplayed as output is inserted."
*** 98,121 ****
  	(error nil))
        )))
- 
- ;(defun metamail-region (beg end &optional buffer)
- ;  "Process current region through 'metamail'.
- ;Optional argument BUFFER specifies a buffer to be filled (nil means current)."
- ;  (interactive "r")
- ;  (let ((curbuf (current-buffer))
- ;	(buffer-read-only nil)
- ;	(metafile (make-temp-name "/tmp/metamail")))
- ;    (save-excursion
- ;      (write-region (point-min) (point-max) metafile nil 'nomessage)
- ;      (if (eq curbuf
- ;	      (if buffer (get-buffer buffer) (current-buffer)))
- ;	  (delete-region (point-min) (point-max)))
- ;      (apply (function call-process)
- ;	     metamail-program-name
- ;	     nil
- ;	     (or buffer t)		;BUFFER or current buffer
- ;	     nil			;don't redisplay
- ;	     (append metamail-switches (list metafile)))
- ;      )))
  
  (provide 'metamail)
--- 195,198 ----
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/mh-comp.el emacs-19.31/lisp/mh-comp.el
*** emacs-19.30/lisp/mh-comp.el	Thu Nov  2 21:28:59 1995
--- emacs-19.31/lisp/mh-comp.el	Sun Jan 14 02:34:30 1996
***************
*** 17,22 ****
  
  ;; 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:
--- 17,23 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 26,30 ****
  ;;; Change Log:
  
! ;; $Id: mh-comp.el,v 1.7 1995/11/03 02:28:52 kwzh Exp $
  
  ;;; Code:
--- 27,31 ----
  ;;; Change Log:
  
! ;; $Id: mh-comp.el,v 1.8 1996/01/14 07:34:30 erik Exp $
  
  ;;; Code:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/mh-e.el emacs-19.31/lisp/mh-e.el
*** emacs-19.30/lisp/mh-e.el	Thu Nov  2 21:28:33 1995
--- emacs-19.31/lisp/mh-e.el	Tue May 21 13:26:41 1996
***************
*** 1,9 ****
  ;;; mh-e.el --- GNU Emacs interface to the MH mail system
  
! ;;; Copyright (C) 1985,86,87,88,90,92,93,94,95 Free Software Foundation, Inc.
! 
! (defconst mh-e-time-stamp "Time-stamp: <95/10/30 19:14:06 gildea>")
! (defconst mh-e-version "5.0.2"
!   "Version numbers of this version of mh-e.")
  
  ;; Maintainer: Stephen Gildea <gildea@lcs.mit.edu>
--- 1,5 ----
  ;;; mh-e.el --- GNU Emacs interface to the MH mail system
  
! ;; Copyright (C) 1985,86,87,88,90,92,93,94,95 Free Software Foundation, Inc.
  
  ;; Maintainer: Stephen Gildea <gildea@lcs.mit.edu>
***************
*** 25,68 ****
  
  ;; 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:
  
! ;;; HOW TO USE:
! ;;; M-x mh-rmail to read mail.  Type C-h m there for a list of commands.
! ;;; C-u M-x mh-rmail to visit any folder.
! ;;; M-x mh-smail to send mail.  From within the mail reader, "m" works, too.
! 
! ;;; MH (Message Handler) is a powerful mail reader.  The MH newsgroup
! ;;; is comp.mail.mh; the mailing list is mh-users@ics.uci.edu (send to
! ;;; mh-users-request to be added).  See the monthly Frequently Asked
! ;;; Questions posting there for information on getting MH and mh-e.
! 
! ;;; mh-e is an Emacs interface to the MH mail system.
! ;;; The mailing list mh-e@x.org is for discussion of mh-e and
! ;;; announcements of new versions.  Send a "subscribe" message to
! ;;; mh-e-request@x.org to be added.  Do not report bugs here; mail
! ;;; them directly to the author (see top of mh-e.el source).
! ;;; Include the output of M-x mh-version in any bug report.
! 
! ;;; mh-e works with GNU Emacs 18 or 19, and MH 6.
! 
! ;;; NB.  MH must have been compiled with the MHE compiler flag or several
! ;;; features necessary for mh-e will be missing from MH commands, specifically
! ;;; the -build switch to repl and forw.
! 
! ;;; Your .emacs might benefit from these bindings:
! ;;; (global-set-key "\C-cr" 'mh-rmail)
! ;;; (global-set-key "\C-xm" 'mh-smail)
! ;;; (global-set-key "\C-x4m" 'mh-smail-other-window)
  
  ;;; Change Log:
  
! ;;; Original version for Gosling emacs by Brian Reid, Stanford, 1982.
! ;;; Modified by James Larus, BBN, July 1984 and UCB, 1984 & 1985.
! ;;; Rewritten for GNU Emacs, James Larus 1985.  larus@ginger.berkeley.edu
! ;;; Modified by Stephen Gildea 1988.  gildea@lcs.mit.edu
! (defconst mh-e-RCS-id "$Id: mh-e.el,v 1.9 1995/11/03 02:28:26 kwzh Exp $")
  
  ;;; Code:
--- 21,65 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
! ;; HOW TO USE:
! ;; M-x mh-rmail to read mail.  Type C-h m there for a list of commands.
! ;; C-u M-x mh-rmail to visit any folder.
! ;; M-x mh-smail to send mail.  From within the mail reader, "m" works, too.
! 
! ;; MH (Message Handler) is a powerful mail reader.  The MH newsgroup
! ;; is comp.mail.mh; the mailing list is mh-users@ics.uci.edu (send to
! ;; mh-users-request to be added).  See the monthly Frequently Asked
! ;; Questions posting there for information on getting MH and mh-e.
! 
! ;; mh-e is an Emacs interface to the MH mail system.
! ;; The mailing list mh-e@x.org is for discussion of mh-e and
! ;; announcements of new versions.  Send a "subscribe" message to
! ;; mh-e-request@x.org to be added.  Do not report bugs here; mail
! ;; them directly to the author (see top of mh-e.el source).
! ;; Include the output of M-x mh-version in any bug report.
! 
! ;; mh-e works with GNU Emacs 18 or 19, and MH 6.
! 
! ;; NB.  MH must have been compiled with the MHE compiler flag or several
! ;; features necessary for mh-e will be missing from MH commands, specifically
! ;; the -build switch to repl and forw.
! 
! ;; Your .emacs might benefit from these bindings:
! ;; (global-set-key "\C-cr" 'mh-rmail)
! ;; (global-set-key "\C-xm" 'mh-smail)
! ;; (global-set-key "\C-x4m" 'mh-smail-other-window)
  
  ;;; Change Log:
  
! ;; Original version for Gosling emacs by Brian Reid, Stanford, 1982.
! ;; Modified by James Larus, BBN, July 1984 and UCB, 1984 & 1985.
! ;; Rewritten for GNU Emacs, James Larus 1985.  larus@ginger.berkeley.edu
! ;; Modified by Stephen Gildea 1988.  gildea@lcs.mit.edu
! (defconst mh-e-RCS-id "$Id: mh-e.el,v 1.14 1996/05/21 17:26:31 kwzh Exp $")
  
  ;;; Code:
*************** A directory name string, or nil to use c
*** 141,145 ****
  
  (defvar mh-good-msg-regexp  "^....[^D^]"
!   "Regexp specifiying the scan lines that are 'good' messages.")
  
  (defvar mh-deleted-msg-regexp "^....D"
--- 138,142 ----
  
  (defvar mh-good-msg-regexp  "^....[^D^]"
!   "Regexp specifying the scan lines that are 'good' messages.")
  
  (defvar mh-deleted-msg-regexp "^....D"
*************** provided, then prompt for the message se
*** 523,527 ****
    (set-buffer (get-buffer-create mh-temp-buffer))
    (erase-buffer)
!   (insert "  mh-e info:\n\nversion: " mh-e-version "\n" mh-e-time-stamp
  	  "\nEmacs: " emacs-version " on " (symbol-name system-type) " ")
    (condition-case ()
--- 520,524 ----
    (set-buffer (get-buffer-create mh-temp-buffer))
    (erase-buffer)
!   (insert "  mh-e info:\n\nversion: " mh-e-RCS-id
  	  "\nEmacs: " emacs-version " on " (symbol-name system-type) " ")
    (condition-case ()
*************** The value of mh-folder-mode-hook is call
*** 869,875 ****
  	(new-mail-p nil))
      (with-mh-folder-updating (t)
!       (message (if maildrop-name
! 		   (format "inc %s -file %s..." folder maildrop-name)
! 		   (format "inc %s..." folder)))
        (setq mh-next-direction 'forward)
        (goto-char (point-max))
--- 866,872 ----
  	(new-mail-p nil))
      (with-mh-folder-updating (t)
!       (if maildrop-name
! 	  (message "inc %s -file %s..." folder maildrop-name)
! 	(message "inc %s..." folder))
        (setq mh-next-direction 'forward)
        (goto-char (point-max))
*************** The value of mh-folder-mode-hook is call
*** 884,891 ****
  	    (mh-exec-cmd-output mh-inc-prog nil
  				"-width" (window-width)))
! 	(message
! 	 (if maildrop-name
! 	     (format "inc %s -file %s...done" folder maildrop-name)
! 	     (format "inc %s...done" folder)))
  	(goto-char start-of-inc)
  	(cond ((save-excursion
--- 881,887 ----
  	    (mh-exec-cmd-output mh-inc-prog nil
  				"-width" (window-width)))
! 	(if maildrop-name
! 	    (message "inc %s -file %s...done" folder maildrop-name)
! 	  (message "inc %s...done" folder))
  	(goto-char start-of-inc)
  	(cond ((save-excursion
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/mh-funcs.el emacs-19.31/lisp/mh-funcs.el
*** emacs-19.30/lisp/mh-funcs.el	Thu Nov  2 21:29:40 1995
--- emacs-19.31/lisp/mh-funcs.el	Sun Jan 14 02:34:30 1996
***************
*** 17,32 ****
  
  ;; 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:
  
! ;;; Internal support for mh-e package.
! ;;; Putting these functions in a separate file lets mh-e start up faster,
! ;;; since less Lisp code needs to be loaded all at once.
  
  ;;; Change Log:
  
! ;; $Id: mh-funcs.el,v 1.4 1995/11/03 02:29:34 kwzh Exp $
  
  ;;; Code:
--- 17,33 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
! ;; Internal support for mh-e package.
! ;; Putting these functions in a separate file lets mh-e start up faster,
! ;; since less Lisp code needs to be loaded all at once.
  
  ;;; Change Log:
  
! ;; $Id: mh-funcs.el,v 1.5 1996/01/14 07:34:30 erik Exp $
  
  ;;; Code:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/mh-mime.el emacs-19.31/lisp/mh-mime.el
*** emacs-19.30/lisp/mh-mime.el	Thu Nov  2 21:29:55 1995
--- emacs-19.31/lisp/mh-mime.el	Sun Jan 14 02:34:30 1996
***************
*** 17,32 ****
  
  ;; 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:
  
! ;;; Internal support for mh-e package.
! ;;; Support for generating an mhn composition file.
! ;;; MIME is supported only by MH 6.8 or later.
  
  ;;; Change Log:
  
! ;; $Id: mh-mime.el,v 1.5 1995/11/03 02:29:49 kwzh Exp $
  
  ;;; Code:
--- 17,33 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
! ;; Internal support for mh-e package.
! ;; Support for generating an mhn composition file.
! ;; MIME is supported only by MH 6.8 or later.
  
  ;;; Change Log:
  
! ;; $Id: mh-mime.el,v 1.6 1996/01/14 07:34:30 erik Exp $
  
  ;;; Code:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/mh-pick.el emacs-19.31/lisp/mh-pick.el
*** emacs-19.30/lisp/mh-pick.el	Thu Nov  2 21:30:14 1995
--- emacs-19.31/lisp/mh-pick.el	Sun Jan 14 02:34:30 1996
***************
*** 17,22 ****
  
  ;; 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:
--- 17,23 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 26,30 ****
  ;;; Change Log:
  
! ;; $Id: mh-pick.el,v 1.4 1995/11/03 02:30:09 kwzh Exp $
  
  ;;; Code:
--- 27,31 ----
  ;;; Change Log:
  
! ;; $Id: mh-pick.el,v 1.5 1996/01/14 07:34:30 erik Exp $
  
  ;;; Code:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/mh-seq.el emacs-19.31/lisp/mh-seq.el
*** emacs-19.30/lisp/mh-seq.el	Thu Nov  2 21:30:22 1995
--- emacs-19.31/lisp/mh-seq.el	Mon Jan 29 18:16:58 1996
***************
*** 17,22 ****
  
  ;; 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:
--- 17,23 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 26,30 ****
  ;;; Change Log:
  
! ;; $Id: mh-seq.el,v 1.4 1995/11/03 02:30:17 kwzh Exp $
  
  ;;; Code:
--- 27,31 ----
  ;;; Change Log:
  
! ;; $Id: mh-seq.el,v 1.6 1996/01/29 23:16:57 kwzh Exp $
  
  ;;; Code:
*************** If optional prefix argument provided, th
*** 169,173 ****
  	 (msgs (mh-seq-to-msgs seq)))
      (if (and (null msgs) not-empty)
! 	(error (format "No messages in sequence `%s'" seq)))
      seq))
  
--- 170,174 ----
  	 (msgs (mh-seq-to-msgs seq)))
      (if (and (null msgs) not-empty)
! 	(error "No messages in sequence `%s'" seq))
      seq))
  
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/mh-utils.el emacs-19.31/lisp/mh-utils.el
*** emacs-19.30/lisp/mh-utils.el	Thu Nov  2 21:29:16 1995
--- emacs-19.31/lisp/mh-utils.el	Mon Jan 29 18:17:19 1996
***************
*** 17,22 ****
  
  ;; 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:
--- 17,23 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 26,30 ****
  ;;; Change Log:
  
! ;; $Id: mh-utils.el,v 1.6 1995/11/03 02:29:09 kwzh Exp $
  
  ;;; Code:
--- 27,31 ----
  ;;; Change Log:
  
! ;; $Id: mh-utils.el,v 1.9 1996/01/29 23:17:16 kwzh Exp $
  
  ;;; Code:
*************** Type \"\\[mh-header-display]\" to see th
*** 301,305 ****
  	   ;; pgp.el uses this.
  	   (if (boundp 'write-contents-hooks) ;Emacs 19
! 	       (setq write-contents-hooks nil))
  	   (if formfile
  	       (mh-exec-lib-cmd-output "mhl" "-nobell" "-noclear"
--- 302,306 ----
  	   ;; pgp.el uses this.
  	   (if (boundp 'write-contents-hooks) ;Emacs 19
! 	       (kill-local-variable 'write-contents-hooks))
  	   (if formfile
  	       (mh-exec-lib-cmd-output "mhl" "-nobell" "-noclear"
*************** Non-nil third argument means not to show
*** 893,901 ****
  	 status)
  	((stringp status)		;kill string
! 	 (error (format "%s: %s" command status)))
  	(t				;exit code
  	 (cond
  	  ((= (buffer-size) 0)		;program produced no error message
! 	   (error (format "%s: exit code %d" command status)))
  	  (t
  	   ;; will error message fit on one line?
--- 894,902 ----
  	 status)
  	((stringp status)		;kill string
! 	 (error "%s: %s" command status))
  	(t				;exit code
  	 (cond
  	  ((= (buffer-size) 0)		;program produced no error message
! 	   (error "%s: exit code %d" command status))
  	  (t
  	   ;; will error message fit on one line?
*************** Non-nil third argument means not to show
*** 903,913 ****
  	   (if (and (< (buffer-size) (screen-width))
  		    (eobp))
! 	       (error (buffer-substring 1 (progn (goto-char 1)
  						 (end-of-line)
  						 (point))))
  	     (display-buffer (current-buffer))
! 	     (error (format
! 		     "%s failed with status %d.  See error message in other window."
! 		     command status))))))))
  
  
--- 904,914 ----
  	   (if (and (< (buffer-size) (screen-width))
  		    (eobp))
! 	       (error "%s"
! 		      (buffer-substring 1 (progn (goto-char 1)
  						 (end-of-line)
  						 (point))))
  	     (display-buffer (current-buffer))
! 	     (error "%s failed with status %d.  See error message in other window."
! 		    command status)))))))
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/misc.el emacs-19.31/lisp/misc.el
*** emacs-19.30/lisp/misc.el	Mon Sep 21 07:45:22 1992
--- emacs-19.31/lisp/misc.el	Sun Jan 14 02:34:30 1996
***************
*** 18,23 ****
  
  ;; 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.
  
  ;;; Code:
--- 18,24 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Code:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/mlconvert.el emacs-19.31/lisp/mlconvert.el
*** emacs-19.30/lisp/mlconvert.el	Wed Mar 22 15:38:11 1995
--- emacs-19.31/lisp/mlconvert.el	Sun Jan 14 02:34:30 1996
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/mldrag.el emacs-19.31/lisp/mldrag.el
*** emacs-19.30/lisp/mldrag.el	Mon Oct 30 12:17:37 1995
--- emacs-19.31/lisp/mldrag.el	Sun Jan 14 02:34:30 1996
***************
*** 1,4 ****
  ;;; mldrag.el --- mode line and vertical line dragging to resize windows
! ;;; Copyright (C) 1994 Free Software Foundation, Inc.
  
  ;; Author: Kyle E. Jones <kyle@wonderworks.com>
--- 1,5 ----
  ;;; mldrag.el --- mode line and vertical line dragging to resize windows
! 
! ;; Copyright (C) 1994 Free Software Foundation, Inc.
  
  ;; Author: Kyle E. Jones <kyle@wonderworks.com>
***************
*** 18,23 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/mlsupport.el emacs-19.31/lisp/mlsupport.el
*** emacs-19.30/lisp/mlsupport.el	Wed Mar 22 15:38:11 1995
--- emacs-19.31/lisp/mlsupport.el	Sun Jan 14 02:34:30 1996
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 27,31 ****
  ;; Emacs (including the commercial UniPress versions).  These have an
  ;; ml- prefix to distinguish them from native GNU Emacs functions with
! ;; similar names.  The oackage mlconvert.el translates Mocklisp code
  ;; to use these names.
  
--- 28,32 ----
  ;; Emacs (including the commercial UniPress versions).  These have an
  ;; ml- prefix to distinguish them from native GNU Emacs functions with
! ;; similar names.  The package mlconvert.el translates Mocklisp code
  ;; to use these names.
  
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/modula2.el emacs-19.31/lisp/modula2.el
*** emacs-19.30/lisp/modula2.el	Sun Aug 27 13:15:48 1995
--- emacs-19.31/lisp/modula2.el	Thu Jan  4 18:45:36 1996
*************** followed by the first character of the c
*** 167,171 ****
  
  (defun m2-case ()
!   "Build skeleton CASE statment, prompting for the <expression>."
    (interactive)
    (let ((name (read-string "Case-Expression: ")))
--- 167,171 ----
  
  (defun m2-case ()
!   "Build skeleton CASE statement, prompting for the <expression>."
    (interactive)
    (let ((name (read-string "Case-Expression: ")))
*************** followed by the first character of the c
*** 195,199 ****
  
  (defun m2-for ()
!   "Build skeleton FOR loop statment, prompting for the loop parameters."
    (interactive)
    (insert "FOR ")
--- 195,199 ----
  
  (defun m2-for ()
!   "Build skeleton FOR loop statement, prompting for the loop parameters."
    (interactive)
    (insert "FOR ")
*************** followed by the first character of the c
*** 225,229 ****
  
  (defun m2-if ()
!   "Insert skeleton IF statment, prompting for <boolean-expression>."
    (interactive)
    (insert "IF ")
--- 225,229 ----
  
  (defun m2-if ()
!   "Insert skeleton IF statement, prompting for <boolean-expression>."
    (interactive)
    (insert "IF ")
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/morse.el emacs-19.31/lisp/morse.el
*** emacs-19.30/lisp/morse.el	Thu Oct 26 02:40:04 1995
--- emacs-19.31/lisp/morse.el	Sun Jan 14 02:34:30 1996
***************
*** 18,23 ****
  
  ;; 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.
  
  ;;; Code:
--- 18,24 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Code:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/mouse-sel.el emacs-19.31/lisp/mouse-sel.el
*** emacs-19.30/lisp/mouse-sel.el	Wed Nov 15 13:02:44 1995
--- emacs-19.31/lisp/mouse-sel.el	Sun Jan 14 02:34:30 1996
***************
*** 18,23 ****
  ;; GNU General Public License for more details.
  
  ;;; Commentary:
! ;;
  ;; This module provides multi-click mouse support for GNU Emacs versions
  ;; 19.18 and later.  I've tried to make it behave more like standard X
--- 18,28 ----
  ;; 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, Inc., 59 Temple Place - Suite 330,
+ ;; Boston, MA 02111-1307, USA.
+ 
  ;;; Commentary:
! 
  ;; This module provides multi-click mouse support for GNU Emacs versions
  ;; 19.18 and later.  I've tried to make it behave more like standard X
***************
*** 131,135 ****
  ;;     (overlay-put mouse-drag-overlay 'face 'bold)
  
! ;;; Code: =================================================================
  
  (provide 'mouse-sel)
--- 136,140 ----
  ;;     (overlay-put mouse-drag-overlay 'face 'bold)
  
! ;;; Code:
  
  (provide 'mouse-sel)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/mouse.el emacs-19.31/lisp/mouse.el
*** emacs-19.30/lisp/mouse.el	Tue Nov 21 18:03:31 1995
--- emacs-19.31/lisp/mouse.el	Sun May  5 20:41:33 1996
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** Upon exit, point is at the far edge of t
*** 485,493 ****
  Highlight the drag area as you move the mouse.
  This must be bound to a button-down mouse event.
! In Transient Mark mode, the highlighting remains once you
! release the mouse button.  Otherwise, it does not."
    (interactive "e")
    (mouse-minibuffer-check start-event)
!   (let* ((start-posn (event-start start-event))
  	 (start-point (posn-point start-posn))
  	 (start-window (posn-window start-posn))
--- 486,495 ----
  Highlight the drag area as you move the mouse.
  This must be bound to a button-down mouse event.
! In Transient Mark mode, the highlighting remains as long as the mark
! remains active.  Otherwise, it remains until the next input event."
    (interactive "e")
    (mouse-minibuffer-check start-event)
!   (let* ((echo-keystrokes 0)
! 	 (start-posn (event-start start-event))
  	 (start-point (posn-point start-posn))
  	 (start-window (posn-window start-posn))
*************** release the mouse button.  Otherwise, it
*** 559,563 ****
  	    ;; In the case of a multiple click, it gives the wrong results,
  	    ;; because it would fail to set up a region.
! 	    (if (and (= (mod mouse-selection-click-count 3) 0) (fboundp fun))
  		;; In this case, we can just let the up-event execute normally.
  		(let ((end (event-end event)))
--- 561,565 ----
  	    ;; In the case of a multiple click, it gives the wrong results,
  	    ;; because it would fail to set up a region.
! 	    (if nil ;; (and (= (mod mouse-selection-click-count 3) 0) (fboundp fun))
  		;; In this case, we can just let the up-event execute normally.
  		(let ((end (event-end event)))
*************** release the mouse button.  Otherwise, it
*** 576,582 ****
  		    (push-mark (overlay-start mouse-drag-overlay) t t)
  		    (goto-char (overlay-end mouse-drag-overlay))
- 		    (delete-overlay mouse-drag-overlay)
  		    (copy-region-as-kill (point) (mark t))
! 		    (mouse-set-region-1))
  		(goto-char (overlay-end mouse-drag-overlay))
  		(setq this-command 'mouse-set-point)
--- 578,588 ----
  		    (push-mark (overlay-start mouse-drag-overlay) t t)
  		    (goto-char (overlay-end mouse-drag-overlay))
  		    (copy-region-as-kill (point) (mark t))
! 		    (let ((inhibit-quit t))
! 		      (setq unread-command-events
! 			    (cons (read-event) unread-command-events))
! 		      (setq quit-flag nil))
! 		    (mouse-set-region-1)
! 		    (delete-overlay mouse-drag-overlay))
  		(goto-char (overlay-end mouse-drag-overlay))
  		(setq this-command 'mouse-set-point)
*************** This must be bound to a button-down mous
*** 917,921 ****
    (interactive "e")
    (mouse-minibuffer-check start-event)
!   (let* ((start-posn (event-start start-event))
  	 (start-point (posn-point start-posn))
  	 (start-window (posn-window start-posn))
--- 923,928 ----
    (interactive "e")
    (mouse-minibuffer-check start-event)
!   (let* ((echo-keystrokes 0)
! 	 (start-posn (event-start start-event))
  	 (start-point (posn-point start-posn))
  	 (start-window (posn-window start-posn))
*************** again.  If you do this twice in the same
*** 1153,1156 ****
--- 1160,1168 ----
  			    (overlay-end mouse-secondary-overlay)))))))
  
+ (defvar mouse-menu-buffer-maxlen 20
+   "*Number of buffers in one pane (submenu) of the buffer menu.
+ If we have lots of buffers, divide them into groups of
+ `mouse-menu-buffer-maxlen' and make a pane (or submenu) for each one.")
+ 
  (defun mouse-buffer-menu (event)
    "Pop up a menu of buffers for selection with the mouse.
*************** and selects that window."
*** 1159,1200 ****
    (interactive "e")
    (mouse-minibuffer-check event)
!   (let ((menu
! 	 (list "Buffer Menu"
! 	       (cons "Select Buffer"
! 		     (let ((tail (buffer-list))
! 			   (maxbuf 0)
! 			   head)
! 		       (while tail
! 			 (or (eq ?\ (aref (buffer-name (car tail)) 0))
! 			     (setq maxbuf
! 				   (max maxbuf
! 					(length (buffer-name (car tail))))))
! 			 (setq tail (cdr tail)))
! 		       (setq tail (buffer-list))
! 		       (while tail
! 			 (let ((elt (car tail)))
! 			   (if (not (string-match "^ "
! 						  (buffer-name elt)))
! 			       (setq head
! 				(cons
! 				 (cons
! 				  (format
! 				   (format "%%%ds  %%s%%s  %%s" maxbuf)
! 				   (buffer-name elt)
! 				   (if (buffer-modified-p elt) "*" " ")
! 				   (save-excursion
! 				     (set-buffer elt)
! 				     (if buffer-read-only "%" " "))
! 				   (or (buffer-file-name elt) 
! 				       (save-excursion
! 					 (set-buffer elt)
! 					 (if list-buffers-directory
! 					     (expand-file-name
! 					      list-buffers-directory)))
! 				       ""))
! 				  elt)
! 				 head))))
! 			 (setq tail (cdr tail)))
! 		       (reverse head))))))
      (let ((buf (x-popup-menu event menu))
  	  (window (posn-window (event-start event))))
--- 1171,1232 ----
    (interactive "e")
    (mouse-minibuffer-check event)
!   (let* ((buffers
! 	  ;; Make an alist of (MENU-ITEM . BUFFER).
! 	  (let ((tail (buffer-list))
! 		(maxlen 0)
! 		head)
! 	    (while tail
! 	      (or (eq ?\ (aref (buffer-name (car tail)) 0))
! 		  (setq maxlen
! 			(max maxlen
! 			     (length (buffer-name (car tail))))))
! 	      (setq tail (cdr tail)))
! 	    (setq tail (buffer-list))
! 	    (while tail
! 	      (let ((elt (car tail)))
! 		(if (not (string-match "^ "
! 				       (buffer-name elt)))
! 		    (setq head
! 			  (cons
! 			   (cons
! 			    (format
! 			     (format "%%%ds  %%s%%s  %%s" maxlen)
! 			     (buffer-name elt)
! 			     (if (buffer-modified-p elt) "*" " ")
! 			     (save-excursion
! 			       (set-buffer elt)
! 			       (if buffer-read-only "%" " "))
! 			     (or (buffer-file-name elt) 
! 				 (save-excursion
! 				   (set-buffer elt)
! 				   (if list-buffers-directory
! 				       (expand-file-name
! 					list-buffers-directory)))
! 				 ""))
! 			    elt)
! 			   head))))
! 	      (setq tail (cdr tail)))
! 	    ;; Compensate for the reversal that the above loop does.
! 	    (nreverse head)))
! 	 (menu
! 	  ;; If we have lots of buffers, divide them into groups of 20
! 	  ;; and make a pane (or submenu) for each one.
! 	  (if (> (length buffers) (/ (* mouse-menu-buffer-maxlen 3) 2))
! 	      (let ((buffers buffers) sublists next
! 		    (i 1))
! 		(while buffers
! 		  ;; Pull off the next mouse-menu-buffer-maxlen buffers
! 		  ;; and make them the next element of sublist.
! 		  (setq next (nthcdr mouse-menu-buffer-maxlen buffers))
! 		  (if next
! 		      (setcdr (nthcdr (1- mouse-menu-buffer-maxlen) buffers)
! 			      nil))
! 		  (setq sublists (cons (cons (format "Buffers %d" i) buffers)
! 				       sublists))
! 		  (setq i (1+ i))
! 		  (setq buffers next))
! 		(cons "Buffer Menu" (nreverse sublists)))
! 	    ;; Few buffers--put them all in one pane.
! 	    (list "Buffer Menu" (cons "Select Buffer" buffers)))))
      (let ((buf (x-popup-menu event menu))
  	  (window (posn-window (event-start event))))
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/mpuz.el emacs-19.31/lisp/mpuz.el
*** emacs-19.30/lisp/mpuz.el	Thu Apr  7 16:20:02 1994
--- emacs-19.31/lisp/mpuz.el	Sun Jan 14 02:34:30 1996
***************
*** 1,5 ****
  ;;; mpuz.el --- multiplication puzzle for GNU Emacs
  
! ;;; Copyright (C) 1990 Free Software Foundation, Inc.
  
  ;; Author: Philippe Schnoebelen <phs@lifia.imag.fr>
--- 1,5 ----
  ;;; mpuz.el --- multiplication puzzle for GNU Emacs
  
! ;; Copyright (C) 1990 Free Software Foundation, Inc.
  
  ;; Author: Philippe Schnoebelen <phs@lifia.imag.fr>
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** You may abort a game by typing \\<mpuz-m
*** 186,190 ****
  		   E (* A B))
  	     (or (< C 1000) (< D 1000)))) ; forbid leading zeros in C or D
!     ;; Individual digits are now put on their respectives squares.
      ;; [NB: A square is a pair <row,column> of the screen.]
      (mpuz-put-digit-on-board A		 '(2 . 9))
--- 187,191 ----
  		   E (* A B))
  	     (or (< C 1000) (< D 1000)))) ; forbid leading zeros in C or D
!     ;; Individual digits are now put on their respective squares.
      ;; [NB: A square is a pair <row,column> of the screen.]
      (mpuz-put-digit-on-board A		 '(2 . 9))
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/msb.el emacs-19.31/lisp/msb.el
*** emacs-19.30/lisp/msb.el	Tue Oct 31 10:11:02 1995
--- emacs-19.31/lisp/msb.el	Mon Jan 29 17:56:40 1996
***************
*** 1,26 ****
  ;;; msb.el --- Customizable buffer-selection with multiple menus.
  ;; Copyright (C) 1993, 1994, 1995 Lars Lindberg <Lars.Lindberg@sypro.cap.se>
! ;;
  ;; Author: Lars Lindberg <Lars.Lindberg@sypro.cap.se>
  ;; Created: 8 Oct 1993
  ;; Lindberg's last update version: 3.31
  ;; Keywords: mouse buffer menu 
! ;;
! ;; This program 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 of the License, or
! ;; (at your option) any later version.
! ;;
! ;; This program 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 this program; if not, write to the Free Software
! ;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  
  ;;; Commentary:
! ;;
  ;; Purpose of this package:
  ;;   1. Offer a function for letting the user choose buffer,
--- 1,30 ----
  ;;; msb.el --- Customizable buffer-selection with multiple menus.
+ 
  ;; Copyright (C) 1993, 1994, 1995 Lars Lindberg <Lars.Lindberg@sypro.cap.se>
! 
  ;; Author: Lars Lindberg <Lars.Lindberg@sypro.cap.se>
  ;; Created: 8 Oct 1993
  ;; Lindberg's last update version: 3.31
  ;; Keywords: mouse buffer menu 
! 
! ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
! 
  ;; Purpose of this package:
  ;;   1. Offer a function for letting the user choose buffer,
*************** Nil means no limit.")
*** 223,227 ****
  
  When the menu is of type `file by directory', this is the maximum
! number of buffers that are clumped togehter from different
  directories.
  
--- 227,231 ----
  
  When the menu is of type `file by directory', this is the maximum
! number of buffers that are clumped together from different
  directories.
  
*************** the groups in msb-menu-cond.")
*** 279,283 ****
  
  (defvar msb-menu-cond msb--very-many-menus
!   "*List of criterias for splitting the mouse buffer menu.
  The elements in the list should be of this type:
   (CONDITION MENU-SORT-KEY MENU-TITLE ITEM-HANDLING-FN ITEM-SORT-FN).
--- 283,287 ----
  
  (defvar msb-menu-cond msb--very-many-menus
!   "*List of criteria for splitting the mouse buffer menu.
  The elements in the list should be of this type:
   (CONDITION MENU-SORT-KEY MENU-TITLE ITEM-HANDLING-FN ITEM-SORT-FN).
*************** The elements in the list should be of th
*** 285,289 ****
  When making the split, the buffers are tested one by one against the
  CONDITION, just like a lisp cond: When hitting a true condition, the
! other criterias are *not* tested and the buffer name will appear in
  the menu with the menu-title corresponding to the true condition.
  
--- 289,293 ----
  When making the split, the buffers are tested one by one against the
  CONDITION, just like a lisp cond: When hitting a true condition, the
! other criteria are *not* tested and the buffer name will appear in
  the menu with the menu-title corresponding to the true condition.
  
*************** If the argument is left out or nil, then
*** 440,444 ****
         (eq ?\ (aref (buffer-name buffer) 0))))
  
! ;; Strip one hierarcy level from the end of PATH.
  (defun msb--strip-path (path)
    (save-match-data
--- 444,448 ----
         (eq ?\ (aref (buffer-name buffer) 0))))
  
! ;; Strip one hierarchy level from the end of PATH.
  (defun msb--strip-path (path)
    (save-match-data
*************** If the argument is left out or nil, then
*** 660,664 ****
  		      "In msb-menu-cond, error for buffer `%s'."
  		      (buffer-name buffer)))
! 	       (error msb--error))))))
  
  ;; Return (SORT-KEY TITLE . BUFFER-LIST) or nil if the
--- 664,668 ----
  		      "In msb-menu-cond, error for buffer `%s'."
  		      (buffer-name buffer)))
! 	       (error "%s" msb--error))))))
  
  ;; Return (SORT-KEY TITLE . BUFFER-LIST) or nil if the
*************** If the argument is left out or nil, then
*** 815,819 ****
    (interactive)
    (setq msb-files-by-directory (not msb-files-by-directory))
!   (menu-bar-update-buffers t))
  
  (defun mouse-select-buffer (event)
--- 819,823 ----
    (interactive)
    (setq msb-files-by-directory (not msb-files-by-directory))
!   (menu-bar-update-buffers))
  
  (defun mouse-select-buffer (event)
*************** variable `msb-menu-cond'."
*** 841,845 ****
  	      position (list (list posX posY) posWind))))
      ;; This `sit-for' magically makes the menu stay up if the mouse
!     ;; button is released withing 0.1 second.
      (sit-for 0 100)
      ;; Popup the menu
--- 845,849 ----
  	      position (list (list posX posY) posWind))))
      ;; This `sit-for' magically makes the menu stay up if the mouse
!     ;; button is released within 0.1 second.
      (sit-for 0 100)
      ;; Popup the menu
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/nnbabyl.el emacs-19.31/lisp/nnbabyl.el
*** emacs-19.30/lisp/nnbabyl.el	Fri Nov  3 22:52:32 1995
--- emacs-19.31/lisp/nnbabyl.el	Fri Jan  5 16:59:51 1996
***************
*** 355,359 ****
  ;; If FORCE, delete article no matter how many X-Gnus-Newsgroup
  ;; headers there are. If LEAVE-DELIM, don't delete the Unix mbox
! ;; delimeter line.
  (defun nnbabyl-delete-mail (&optional force leave-delim)
    ;; Delete the current X-Gnus-Newsgroup line.
--- 355,359 ----
  ;; If FORCE, delete article no matter how many X-Gnus-Newsgroup
  ;; headers there are. If LEAVE-DELIM, don't delete the Unix mbox
! ;; delimiter line.
  (defun nnbabyl-delete-mail (&optional force leave-delim)
    ;; Delete the current X-Gnus-Newsgroup line.
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/nndir.el emacs-19.31/lisp/nndir.el
*** emacs-19.30/lisp/nndir.el	Fri Nov  3 22:52:42 1995
--- emacs-19.31/lisp/nndir.el	Sun Jan 14 02:34:30 1996
***************
*** 1,3 ****
--- 1,4 ----
  ;;; nndir.el --- single directory newsgroup access for Gnus
+ 
  ;; Copyright (C) 1995 Free Software Foundation, Inc.
  
***************
*** 19,24 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/nndoc.el emacs-19.31/lisp/nndoc.el
*** emacs-19.30/lisp/nndoc.el	Fri Nov  3 22:52:52 1995
--- emacs-19.31/lisp/nndoc.el	Sun Jan 14 02:34:30 1996
***************
*** 1,3 ****
--- 1,4 ----
  ;;; nndoc.el --- single file access for Gnus
+ 
  ;; Copyright (C) 1995 Free Software Foundation, Inc.
  
***************
*** 19,24 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/nneething.el emacs-19.31/lisp/nneething.el
*** emacs-19.30/lisp/nneething.el	Fri Nov  3 22:53:00 1995
--- emacs-19.31/lisp/nneething.el	Sun Jan 14 02:34:30 1996
***************
*** 1,3 ****
--- 1,4 ----
  ;;; nneething.el --- random file access for Gnus
+ 
  ;; Copyright (C) 1995 Free Software Foundation, Inc.
  
***************
*** 19,24 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 202,206 ****
  
  (defun nneething-map-file ()
!   ;; We make sure that the .neething directory exists. 
    (make-directory nneething-map-file-directory 'parents)
    ;; We store it in a special directory under the user's home dir.
--- 204,208 ----
  
  (defun nneething-map-file ()
!   ;; We make sure that the .nneething directory exists. 
    (make-directory nneething-map-file-directory 'parents)
    ;; We store it in a special directory under the user's home dir.
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/nnfolder.el emacs-19.31/lisp/nnfolder.el
*** emacs-19.30/lisp/nnfolder.el	Fri Nov  3 22:53:09 1995
--- emacs-19.31/lisp/nnfolder.el	Sun Jan 14 02:34:30 1996
***************
*** 1,3 ****
--- 1,4 ----
  ;;; nnfolder.el --- mail folder access for Gnus
+ 
  ;; Copyright (C) 1995 Free Software Foundation, Inc.
  
***************
*** 20,25 ****
  
  ;; 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:
--- 21,27 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 43,47 ****
    "The name of the active file.")
  
! ;; I renamed this variable to somehting more in keeping with the general GNU
  ;; style. -SLB
  
--- 45,49 ----
    "The name of the active file.")
  
! ;; I renamed this variable to something more in keeping with the general GNU
  ;; style. -SLB
  
*************** such things as moving mail.  All buffers
*** 567,571 ****
  ;; would _that_ ever happen? :-).  In that case, we will be in the middle of
  ;; processing the file, ready to add new X-Gnus article number markers, and
! ;; we'll run accross a message with no ID yet - the active list _may_not_ be
  ;; ready for us yet.
  
--- 569,573 ----
  ;; would _that_ ever happen? :-).  In that case, we will be in the middle of
  ;; processing the file, ready to add new X-Gnus article number markers, and
! ;; we'll run across a message with no ID yet - the active list _may_not_ be
  ;; ready for us yet.
  
*************** such things as moving mail.  All buffers
*** 594,598 ****
        (goto-char (point-min))
        ;;
!       ;; Anytime the active number is 1 or 0, it is supect.  In that case,
        ;; search the file manually to find the active number.  Or, of course,
        ;; if we're being paranoid.  (This would also be the place to build
--- 596,600 ----
        (goto-char (point-min))
        ;;
!       ;; Anytime the active number is 1 or 0, it is suspect.  In that case,
        ;; search the file manually to find the active number.  Or, of course,
        ;; if we're being paranoid.  (This would also be the place to build
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/nnheader.el emacs-19.31/lisp/nnheader.el
*** emacs-19.30/lisp/nnheader.el	Fri Nov  3 22:53:18 1995
--- emacs-19.31/lisp/nnheader.el	Tue Feb 20 14:16:33 1996
***************
*** 1,3 ****
--- 1,4 ----
  ;;; nnheader.el --- header access macros for Gnus and its backends
+ 
  ;; Copyright (C) 1987,88,89,90,93,94,95 Free Software Foundation, Inc.
  
***************
*** 19,24 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 187,198 ****
      (setq state (cdr state))))
  
! ;; Read the head of an article.
  (defun nnheader-insert-head (file)
!   (let ((beg 0)
! 	(chop 1024))
!     (while (and (eq chop (nth 1 (nnheader-insert-file-contents-literally
! 				 file nil beg (setq beg (+ chop beg)))))
! 		(prog1 (not (search-backward "\n\n" nil t)) 
! 		  (goto-char (point-max)))))))
  
  (defun nnheader-article-p ()
--- 189,209 ----
      (setq state (cdr state))))
  
! (defvar nnheader-max-head-length 4096
!   "The maximum length of a HEAD.")
! 
  (defun nnheader-insert-head (file)
!   "Insert the head of the article."
!   (if (eq nnheader-max-head-length t)
!       ;; Just read the entire file.
!       (insert-file-contents-literally file)
!     ;; Read 1K blocks until we find a separator.
!     (let ((beg 0)
! 	  (chop 1024))
!       (while (and (eq chop (nth 1 (insert-file-contents-literally
! 				   file nil beg (setq beg (+ beg chop)))))
! 		  (prog1 (not (search-forward "\n\n" nil t)) 
! 		    (goto-char (point-max)))
! 		  (or (null nnheader-max-head-length)
! 		      (< beg nnheader-max-head-length)))))))
  
  (defun nnheader-article-p ()
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/nnkiboze.el emacs-19.31/lisp/nnkiboze.el
*** emacs-19.30/lisp/nnkiboze.el	Fri Nov  3 22:53:28 1995
--- emacs-19.31/lisp/nnkiboze.el	Tue Jan 16 19:21:36 1996
***************
*** 1,3 ****
--- 1,4 ----
  ;;; nnkiboze.el --- select virtual news access for Gnus
+ 
  ;; Copyright (C) 1995 Free Software Foundation, Inc.
  
***************
*** 18,23 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** If the stream is opened, return T, other
*** 102,106 ****
    (nnkiboze-possibly-change-newsgroups newsgroup)
    (if (not (numberp article))
!       ;; This is a real cludge. It might not work at times, but it
        ;; does no harm I think. The only alternative is to offer no
        ;; article fetching by message-id at all.
--- 104,108 ----
    (nnkiboze-possibly-change-newsgroups newsgroup)
    (if (not (numberp article))
!       ;; This is a real kludge. It might not work at times, but it
        ;; does no harm I think. The only alternative is to offer no
        ;; article fetching by message-id at all.
*************** If the stream is opened, return T, other
*** 146,150 ****
    (nnkiboze-possibly-change-newsgroups group)
    ;; Remove NOV lines of articles that are marked as read.
!   (if (not (file-exists-p (nnkiboze-nov-file-name)))
        ()
      (save-excursion
--- 148,153 ----
    (nnkiboze-possibly-change-newsgroups group)
    ;; Remove NOV lines of articles that are marked as read.
!   (if (or (not (file-exists-p (nnkiboze-nov-file-name)))
! 	  (not (eq major-mode 'gnus-summary-mode)))
        ()
      (save-excursion
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/nnmail.el emacs-19.31/lisp/nnmail.el
*** emacs-19.30/lisp/nnmail.el	Fri Nov  3 22:53:39 1995
--- emacs-19.31/lisp/nnmail.el	Wed Jan 24 19:35:28 1996
***************
*** 1,3 ****
--- 1,4 ----
  ;;; nnmail.el --- mail support functions for the Gnus mail backends
+ 
  ;; Copyright (C) 1995 Free Software Foundation, Inc.
  
***************
*** 18,23 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** Example:
*** 203,207 ****
    "*The approximate number of Message-IDs nnmail will keep in its cache.
  If this variable is nil, no checking on duplicate messages will be
! perfomed.")
  
  (defvar nnmail-message-id-cache-file "~/.nnmail-cache"
--- 205,209 ----
    "*The approximate number of Message-IDs nnmail will keep in its cache.
  If this variable is nil, no checking on duplicate messages will be
! performed.")
  
  (defvar nnmail-message-id-cache-file "~/.nnmail-cache"
*************** perfomed.")
*** 412,418 ****
  		       (delete-region (point-min) (match-end 0)))
  		   (beep t)
! 		   (message (concat "movemail: "
! 				    (buffer-substring (point-min)
! 						      (point-max))))
  		   (sit-for 3)
  		   nil)))))
--- 414,420 ----
  		       (delete-region (point-min) (match-end 0)))
  		   (beep t)
! 		   (message "movemail: %s"
! 			    (buffer-substring (point-min)
! 					      (point-max)))
  		   (sit-for 3)
  		   nil)))))
*************** FUNC will be called with the buffer narr
*** 571,575 ****
  	(kill-buffer (current-buffer))))))
  
! ;; Mail crossposts syggested by Brian Edmonds <edmonds@cs.ubc.ca>. 
  (defun nnmail-article-group (func)
    "Look at the headers and return an alist of groups that match.
--- 573,577 ----
  	(kill-buffer (current-buffer))))))
  
! ;; Mail crossposts suggested by Brian Edmonds <edmonds@cs.ubc.ca>. 
  (defun nnmail-article-group (func)
    "Look at the headers and return an alist of groups that match.
*************** Problems with `nnmail-split-methods', us
*** 611,615 ****
  		      (sit-for 1)
  		      '("bogus")))))
! 	  ;; Go throught the split methods to find a match.
  	  (while (and methods (or nnmail-crosspost (not group-art)))
  	    (goto-char (point-max))
--- 613,617 ----
  		      (sit-for 1)
  		      '("bogus")))))
! 	  ;; Go through the split methods to find a match.
  	  (while (and methods (or nnmail-crosspost (not group-art)))
  	    (goto-char (point-max))
*************** See the documentation for the variable `
*** 689,693 ****
  
  (defvar nnmail-split-cache nil)
! ;; Alist of split expresions their equivalent regexps.
  
  (defun nnmail-split-it (split)
--- 691,695 ----
  
  (defvar nnmail-split-cache nil)
! ;; Alist of split expressions their equivalent regexps.
  
  (defun nnmail-split-it (split)
*************** See the documentation for the variable `
*** 743,747 ****
  			  nnmail-procmail-suffix "$") t)))
  	 (p procmails))
!     ;; Remove any directories that inadvertantly match the procmail
      ;; suffix, which might happen if the suffix is "".
      (while p
--- 745,749 ----
  			  nnmail-procmail-suffix "$") t)))
  	 (p procmails))
!     ;; Remove any directories that inadvertently match the procmail
      ;; suffix, which might happen if the suffix is "".
      (while p
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/nnmbox.el emacs-19.31/lisp/nnmbox.el
*** emacs-19.30/lisp/nnmbox.el	Fri Nov  3 22:53:48 1995
--- emacs-19.31/lisp/nnmbox.el	Sun Jan 14 02:34:30 1996
***************
*** 1,3 ****
--- 1,4 ----
  ;;; nnmbox.el --- mail mbox access for Gnus
+ 
  ;; Copyright (C) 1995 Free Software Foundation, Inc.
  
***************
*** 19,24 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 339,343 ****
  ;; If FORCE, delete article no matter how many X-Gnus-Newsgroup
  ;; headers there are. If LEAVE-DELIM, don't delete the Unix mbox
! ;; delimeter line.
  (defun nnmbox-delete-mail (&optional force leave-delim)
    ;; Delete the current X-Gnus-Newsgroup line.
--- 341,345 ----
  ;; If FORCE, delete article no matter how many X-Gnus-Newsgroup
  ;; headers there are. If LEAVE-DELIM, don't delete the Unix mbox
! ;; delimiter line.
  (defun nnmbox-delete-mail (&optional force leave-delim)
    ;; Delete the current X-Gnus-Newsgroup line.
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/nnmh.el emacs-19.31/lisp/nnmh.el
*** emacs-19.30/lisp/nnmh.el	Fri Nov  3 22:54:01 1995
--- emacs-19.31/lisp/nnmh.el	Sun Jan 14 02:34:30 1996
***************
*** 1,3 ****
--- 1,4 ----
  ;;; nnmh.el --- mhspool access for Gnus
+ 
  ;; Copyright (C) 1995 Free Software Foundation, Inc.
  
***************
*** 19,24 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 312,316 ****
         (nnmail-activate 'nnmh)
         ;; We trick the choosing function into believing that only one
!        ;; group is availiable.  
         (let ((nnmail-split-methods (list (list group ""))))
  	 (car (nnmh-save-mail))))
--- 314,318 ----
         (nnmail-activate 'nnmh)
         ;; We trick the choosing function into believing that only one
!        ;; group is available.  
         (let ((nnmail-split-methods (list (list group ""))))
  	 (car (nnmh-save-mail))))
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/nnml.el emacs-19.31/lisp/nnml.el
*** emacs-19.30/lisp/nnml.el	Fri Nov  3 22:54:10 1995
--- emacs-19.31/lisp/nnml.el	Sun Jan 14 02:34:30 1996
***************
*** 1,3 ****
--- 1,4 ----
  ;;; nnml.el --- mail spool access for Gnus
+ 
  ;; Copyright (C) 1995 Free Software Foundation, Inc.
  
***************
*** 19,24 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** all. This may very well take some time."
*** 328,332 ****
  	 (nnmail-activate 'nnml)
  	 ;; We trick the choosing function into believing that only one
! 	 ;; group is availiable.  
  	 (let ((nnmail-split-methods (list (list group ""))))
  	   (setq result (car (nnml-save-mail))))
--- 330,334 ----
  	 (nnmail-activate 'nnml)
  	 ;; We trick the choosing function into believing that only one
! 	 ;; group is available.  
  	 (let ((nnmail-split-methods (list (list group ""))))
  	   (setq result (car (nnml-save-mail))))
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/nnspool.el emacs-19.31/lisp/nnspool.el
*** emacs-19.30/lisp/nnspool.el	Fri Nov  3 22:54:19 1995
--- emacs-19.31/lisp/nnspool.el	Sun Jan 14 02:34:30 1996
***************
*** 1,3 ****
--- 1,4 ----
  ;;; nnspool.el --- spool access for GNU Emacs
+ 
  ;; Copyright (C) 1988,89,90,93,94,95 Free Software Foundation, Inc.
  
***************
*** 19,24 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** Newsgroup must be selected before callin
*** 367,371 ****
  	      (insert-file-contents nov)
  	      ;; First we find the first wanted line. We issue a number
! 	      ;; of search-forwards - the first article we are lookign
  	      ;; for may be expired, so we have to go on searching until
  	      ;; we find one of the articles we want.
--- 369,373 ----
  	      (insert-file-contents nov)
  	      ;; First we find the first wanted line. We issue a number
! 	      ;; of search-forwards - the first article we are looking
  	      ;; for may be expired, so we have to go on searching until
  	      ;; we find one of the articles we want.
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/nntp.el emacs-19.31/lisp/nntp.el
*** emacs-19.30/lisp/nntp.el	Sat Nov 18 12:42:48 1995
--- emacs-19.31/lisp/nntp.el	Fri Feb 23 19:33:36 1996
***************
*** 1,4 ****
  ;;; nntp.el --- nntp access for Gnus
! ;; Copyright (C) 1987,88,89,90,92,93,94,95 Free Software Foundation, Inc.
  
  ;; Author: Masanobu UMEDA <umerin@flab.flab.fujitsu.junet>
--- 1,5 ----
  ;;; nntp.el --- nntp access for Gnus
! 
! ;; Copyright (C) 1987,88,89,90,92,93,94,95,96 Free Software Foundation, Inc.
  
  ;; Author: Masanobu UMEDA <umerin@flab.flab.fujitsu.junet>
***************
*** 19,24 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** instead call function `nntp-status-messa
*** 327,331 ****
  	  (progn
  	    ;; We have read active entries, so we just delete the
! 	    ;; superfluos gunk.
  	    (goto-char (point-min))
  	    (while (re-search-forward "^[.2-5]" nil t)
--- 329,333 ----
  	  (progn
  	    ;; We have read active entries, so we just delete the
! 	    ;; superfluous gunk.
  	    (goto-char (point-min))
  	    (while (re-search-forward "^[.2-5]" nil t)
*************** servers."
*** 364,368 ****
      (if (or (nntp-server-opened server)
  	    connectionless)
! 	()
        (if (member nntp-address nntp-timeout-servers)
  	  nil
--- 366,370 ----
      (if (or (nntp-server-opened server)
  	    connectionless)
! 	t
        (if (member nntp-address nntp-timeout-servers)
  	  nil
*************** servers."
*** 590,595 ****
--- 592,603 ----
    "Post the current buffer."
    (nntp-possibly-change-server nil server)
+   (save-excursion
+     (set-buffer nntp-server-buffer)
+     (erase-buffer))
    (if (nntp-send-command "^[23].*\r?\n" "POST")
        (progn
+ 	(save-excursion
+ 	  (set-buffer nntp-server-buffer)
+ 	  (erase-buffer))
  	(nntp-encode-text)
  	(nntp-send-region-to-server (point-min) (point-max))
*************** It will prompt for a password."
*** 937,941 ****
  		;; On some Emacs versions the preceding function has
  		;; a tendency to change the buffer. Perhaps. It's
! 		;; quite difficult to reporduce, because it only
  		;; seems to happen once in a blue moon. 
  		(set-buffer buf) 
--- 945,949 ----
  		;; On some Emacs versions the preceding function has
  		;; a tendency to change the buffer. Perhaps. It's
! 		;; quite difficult to reproduce, because it only
  		;; seems to happen once in a blue moon. 
  		(set-buffer buf) 
*************** It will prompt for a password."
*** 1013,1051 ****
      (or (nntp-server-opened nntp-current-server)
  	(nntp-open-server nntp-current-server)
! 	(error (nntp-status-message)))
      ;; Send the strings.
      (process-send-string nntp-server-process cmd)))
  
  (defun nntp-send-region-to-server (begin end)
!   "Send current buffer region (from BEGIN to END) to news server."
    (save-excursion
!     ;; We have to work in the buffer associated with NNTP server
!     ;;  process because of NEmacs hack.
!     (copy-to-buffer nntp-server-buffer begin end)
!     (set-buffer nntp-server-buffer)
!     (setq begin (point-min))
!     (setq end (point-max))
!     ;; `process-send-region' does not work if text to be sent is very
!     ;;  large. I don't know maximum size of text sent correctly.
!     (let ((last nil)
! 	  (size 100))			;Size of text sent at once.
!       (save-restriction
! 	(narrow-to-region begin end)
! 	(goto-char begin)
! 	(while (not (eobp))
! 	  ;;(setq last (min end (+ (point) size)))
! 	  ;; NEmacs gets confused if character at `last' is Kanji.
! 	  (setq last (save-excursion
! 		       (goto-char (min end (+ (point) size)))
! 		       (or (eobp) (forward-char 1)) ;Adjust point
! 		       (point)))
! 	  (process-send-region nntp-server-process (point) last)
! 	  ;; I don't know whether the next codes solve the known
! 	  ;;  problem of communication error of GNU Emacs.
! 	  (accept-process-output)
! 	  ;;(sit-for 0)
! 	  (goto-char last))))
!     ;; We cannot erase buffer, because reply may be received.
!     (delete-region begin end)))
  
  (defun nntp-open-server-semi-internal (server &optional service)
--- 1021,1051 ----
      (or (nntp-server-opened nntp-current-server)
  	(nntp-open-server nntp-current-server)
! 	(error "%s" (nntp-status-message)))
      ;; Send the strings.
      (process-send-string nntp-server-process cmd)))
  
  (defun nntp-send-region-to-server (begin end)
!   "Send the current buffer region (from BEGIN to END) to the server."
    (save-excursion
!     (let ((cur (current-buffer)))
!       ;; Copy the buffer over to the send buffer.
!       (set-buffer (get-buffer-create " *nntp send*"))
!       (buffer-disable-undo (current-buffer))
!       (erase-buffer)
!       (insert-buffer-substring cur begin end)
!       (save-excursion
! 	(set-buffer cur)
! 	(erase-buffer))
!       ;; `process-send-region' does not work if the text to be sent is very
!       ;; large, so we send it piecemeal.
!       (let ((last (point-min))
! 	    (size 100))			;Size of text sent at once.
! 	(while (/= last (point-max))
! 	  (process-send-region 
! 	   nntp-server-process
! 	   last (setq last (min (+ last size) (point-max))))
! 	  ;; Read any output from the server.  May be unnecessary.
! 	  (accept-process-output)))
!       (kill-buffer (current-buffer)))))
  
  (defun nntp-open-server-semi-internal (server &optional service)
*************** defining this function as macro."
*** 1182,1186 ****
  		(message ""))
  	    (condition-case errorcode
! 		(accept-process-output nntp-server-process)
  	      (error
  	       (cond ((string-equal "select error: Invalid argument" 
--- 1182,1186 ----
  		(message ""))
  	    (condition-case errorcode
! 		(accept-process-output nntp-server-process 1)
  	      (error
  	       (cond ((string-equal "select error: Invalid argument" 
*************** defining this function as macro."
*** 1259,1263 ****
      (or (nntp-async-server-opened)
  	(nntp-async-open-server)
! 	(error (nntp-status-message)))
      (process-send-string nntp-async-process cmd)))
  
--- 1259,1263 ----
      (or (nntp-async-server-opened)
  	(nntp-async-open-server)
! 	(error "%s" (nntp-status-message)))
      (process-send-string nntp-async-process cmd)))
  
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/nnvirtual.el emacs-19.31/lisp/nnvirtual.el
*** emacs-19.30/lisp/nnvirtual.el	Fri Nov  3 22:54:42 1995
--- emacs-19.31/lisp/nnvirtual.el	Sun Jan 14 02:34:30 1996
***************
*** 1,3 ****
--- 1,4 ----
  ;;; nnvirtual.el --- virtual newsgroups access for Gnus
+ 
  ;; Copyright (C) 1994,95 Free Software Foundation, Inc.
  
***************
*** 19,24 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/noutline.el emacs-19.31/lisp/noutline.el
*** emacs-19.30/lisp/noutline.el	Fri Oct 20 19:14:55 1995
--- emacs-19.31/lisp/noutline.el	Sun Jan 14 02:34:30 1996
***************
*** 1,3 ****
--- 1,4 ----
  ;;; outline.el --- outline mode commands for Emacs
+ 
  ;; Copyright (C) 1986, 1993, 1994, 1995 Free Software Foundation, Inc.
  
***************
*** 18,23 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** in the file it applies to.")
*** 146,150 ****
  	      font-lock-variable-name-face))
  	nil t))
!     ;; Highight citations of the form [1] and [Mar94].
      ("\\[\\([A-Z][A-Za-z]+\\)*[0-9]+\\]" . font-lock-type-face))
    "Additional expressions to highlight in Outline mode.")
--- 148,152 ----
  	      font-lock-variable-name-face))
  	nil t))
!     ;; Highlight citations of the form [1] and [Mar94].
      ("\\[\\([A-Z][A-Za-z]+\\)*[0-9]+\\]" . font-lock-type-face))
    "Additional expressions to highlight in Outline mode.")
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/novice.el emacs-19.31/lisp/novice.el
*** emacs-19.30/lisp/novice.el	Tue Feb  7 23:04:03 1995
--- emacs-19.31/lisp/novice.el	Sun Jan 14 02:34:30 1996
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/nroff-mode.el emacs-19.31/lisp/nroff-mode.el
*** emacs-19.30/lisp/nroff-mode.el	Tue Jul 18 17:42:04 1995
--- emacs-19.31/lisp/nroff-mode.el	Sun Jan 14 02:34:30 1996
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/options.el emacs-19.31/lisp/options.el
*** emacs-19.30/lisp/options.el	Wed Mar 15 17:50:11 1995
--- emacs-19.31/lisp/options.el	Sun Jan 14 02:34:30 1996
***************
*** 18,23 ****
  
  ;; 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:
--- 18,24 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/outline.el emacs-19.31/lisp/outline.el
*** emacs-19.30/lisp/outline.el	Mon May  1 21:49:34 1995
--- emacs-19.31/lisp/outline.el	Sun Jan 14 02:34:30 1996
***************
*** 1,3 ****
--- 1,4 ----
  ;;; outline.el --- outline mode commands for Emacs
+ 
  ;; Copyright (C) 1986, 1993, 1994 Free Software Foundation, Inc.
  
***************
*** 18,23 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** in the file it applies to.")
*** 146,150 ****
  	      font-lock-variable-name-face))
  	nil t))
!     ;; Highight citations of the form [1] and [Mar94].
      ("\\[\\([A-Z][A-Za-z]+\\)*[0-9]+\\]" . font-lock-type-face))
    "Additional expressions to highlight in Outline mode.")
--- 148,152 ----
  	      font-lock-variable-name-face))
  	nil t))
!     ;; Highlight citations of the form [1] and [Mar94].
      ("\\[\\([A-Z][A-Za-z]+\\)*[0-9]+\\]" . font-lock-type-face))
    "Additional expressions to highlight in Outline mode.")
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/page-ext.el emacs-19.31/lisp/page-ext.el
*** emacs-19.30/lisp/page-ext.el	Tue May  3 19:44:06 1994
--- emacs-19.31/lisp/page-ext.el	Sun Jan 14 02:34:30 1996
***************
*** 1,7 ****
  ;;; page-ext.el --- extended page handling commands
  
- ;; You may use these commands to handle an address list or other
- ;; small data base.
- 
  ;; Copyright (C) 1990, 1991, 1993, 1994 Free Software Foundation
  
--- 1,4 ----
***************
*** 21,230 ****
  
  ;; 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.
  
  
  ;;; Summary
  
! ; The current page commands are:
  
! ;     forward-page         C-x ]
! ;     backward-page        C-x [
! ;     narrow-to-page       C-x p
! ;     count-lines-page     C-x l
! ;     mark-page            C-x C-p  (change this to C-x C-p C-m)
! ;     sort-pages           not bound
! ;     what-page            not bound
! 
! ; The new page handling commands all use `C-x C-p' as a prefix.  This
! ; means that the key binding for `mark-page' must be changed.
! ; Otherwise, no other changes are made to the current commands or
! ; their bindings.
! 
! ; New page handling commands:
! 
! ;     next-page                        C-x C-p C-n
! ;     previous-page                    C-x C-p C-p
! ;     search-pages                     C-x C-p C-s
! ;     add-new-page                     C-x C-p C-a
! ;     sort-pages-buffer                C-x C-p s      
! ;     set-page-delimiter               C-x C-p C-l
! ;     pages-directory                  C-x C-p C-d   
! ;     pages-directory-for-addresses    C-x C-p d
! ;        pages-directory-goto          C-c C-c
  
  
  ;;; Using the page commands
   
! ; The page commands are helpful in several different contexts.  For
! ; example, programmers often divide source files into sections using the
! ; `page-delimiter'; you can use the `pages-directory' command to list
! ; the sections.
! 
! ; You may change the buffer local value of the `page-delimiter' with
! ; the `set-page-delimiter' command.  This command is bound to `C-x C-p
! ; C-l' The command prompts you for a new value for the page-delimiter.
! ; Called with a prefix-arg, the command resets the value of the
! ; page-delimiter to its original value.
! 
! ; You may set several user options:
! ;
! ;   The `pages-directory-buffer-narrowing-p' variable causes the
! ;   `pages-directory-goto' command to narrow to the destination page.
! ;
! ;   The `pages-directory-for-adding-page-narrowing-p' variable, causes the
! ;   `add-new-page' command to narrow to the new entry.
! ;
! ;   The `pages-directory-for-adding-new-page-before-current-page-p' variable
! ;   causes the `add-new-page' command to insert a new page before current
! ;   page.
! ;
! ; These variables are true by default.
! ;
! ; Additional, addresses-related user options are described in the next page
! ; of this file.
  
  
  ;;; Handling an address list or small data base
  
! ; You may use the page commands to handle an address list or other
! ; small data base.  Put each address or entry on its own page.  The
! ; first line of text in each page is a `header line' and is listed by
! ; the `pages-directory' or `pages-directory-for-addresses' command.
! 
! ; Specifically:
! ; 
! ;   1. Begin each entry with a `page-delimiter' (which is, by default,
! ;      `^L' at the beginning of the line).
! ; 
! ;   2. The first line of text in each entry is the `heading line'; it
! ;      will appear in the pages-directory-buffer which is constructed
! ;      using the `C-x C-p C-d' (pages-directory) command or the `C-x
! ;      C-p d' (pages-directory-for-addresses) command.
! ; 
! ;      The heading line may be on the same line as the page-delimiter
! ;      or it may follow after.  It is the first non-blank line on the
! ;      page.  Conventionally, the heading line is placed on the line
! ;      immediately following the line containing page-delimiter.
! ;
! ;   3. Follow the heading line with the body of the entry.  The body
! ;      extends up to the next `page-delimiter'.  The body may be of any
! ;      length.  It is conventional to place a blank line after the last
! ;      line of the body.
! 
! ; For example, a file might look like this:
! ; 
! ;     FSF
! ;     Free Software Foundation
! ;     675 Massachusetts Avenue
! ;     Cambridge, MA 02139  USA
! ;     (617) 876-3296
! ;     gnu@prep.ai.mit.edu
! ; 
! ;     
! ;     House Subcommittee on Intellectual Property,
! ;     U.S. House of Representatives,
! ;     Washington, DC  20515
! ;     
! ;     Congressional committee concerned with permitting or preventing
! ;     monopolistic restrictions on the use of software technology.
! ; 
! ;     
! ;     George Lakoff
! ;     ``Women, Fire, and Dangerous Things:
! ;     What Categories Reveal about the Mind''
! ;     1987, Univ. of Chicago Press
! ; 
! ;     About philosophy, Whorfian effects, and linguistics.
! ; 
! ;      
! ;     OBI   (On line text collection.)
! ;     Open Book Initiative
! ;     c/o Software Tool & Die
! ;     1330 Beacon St, Brookline, MA 02146 USA
! ;     (617) 739-0202 
! ;     obi@world.std.com
! 
! ; In this example, the heading lines are:
! ;
! ;     FSF
! ;     House Subcommittee on Intellectual Property
! ;     George Lakoff
! ;     OBI (On line text collection.)
! 
! ; The `C-x C-p s' (sort-pages-buffer) command sorts the entries in the
! ; buffer alphabetically.
! 
! ; You may use any of the page commands, including the `next-page',
! ; `previous-page', `add-new-page', `mark-page', and `search-pages'
! ; commands.
! 
! ; You may use either the `C-x C-p d' (pages-directory-for-addresses)
! ; or the `C-x C-p C-d' (pages-directory) command to construct and
! ; dislay a directory of all the heading lines.
! 
! ; In the directory, you may position the cursor over a heading line
! ; and type `C-c C-c' (pages-directory-goto) to go to the entry to
! ; which it refers in the pages buffer.
! 
! ; You can type `C-c C-p C-a' (add-new-page) to add a new entry in the
! ; pages buffer or address file.  This is the same command you use to
! ; add a new entry when you are in the pages buffer or address file.
  
! ; If you wish, you may create several different directories,
! ; one for each different buffer.
  
  ;; `pages-directory-for-addresses' in detail
  
! ; The `pages-directory-for-addresses' assumes a default addresses
! ; file.  You do not need to specify the addresses file but merely type
! ; `C-x C-p d' from any buffer.  The command finds the file, constructs
! ; a directory for it, and switches you to the directory.  If you call
! ; the command with a prefix arg, `C-u C-x C-p d', it prompts you for a
! ; file name.
! 
! ; You may customize the addresses commands:
! 
! ;   The `pages-addresses-file-name' variable determines the name of
! ;   the addresses file; by default it is "~/addresses".
! 
! ;   The `pages-directory-for-addresses-goto-narrowing-p' variable
! ;   determines whether `pages-directory-goto' narrows the addresses
! ;   buffer to the entry, which it does by default.
! 
! ;   The `pages-directory-for-addresses-buffer-keep-windows-p' variable
! ;   determines whether `pages-directory-for-addresses' deletes other
! ;   windows to show as many lines as possible on the screen or works
! ;   in the usual Emacs manner and keeps other windows.  Default is to
! ;   keep other windows.
! 
! ;   The `pages-directory-for-adding-addresses-narrowing-p' variable
! ;   determines whether `pages-directory-for-addresses' narrows the
! ;   addresses buffer to a new entry when you are adding that entry.
! ;   Default is to narrow to new entry, which means you see a blank
! ;   screen before you write the new entry.
  
  ;; `pages-directory' in detail
  
! ; Call the `pages-directory' command from the buffer for which you
! ; want a directory created; it creates a directory for the buffer and
! ; pops you to the directory.
! 
! ; The `pages-directory' command has several options:
! 
! ;   Called with a prefix arg, `C-u C-x C-p C-d', the `pages-directory'
! ;   prompts you for a regular expression and only lists only those
! ;   header lines that are part of pages that contain matches to the
! ;   regexp.  In the example above, `C-u C-x C-p C-d 617 RET' would
! ;   match the telephone area code of the first and fourth entries, so
! ;   only the header lines of those two entries would appear in the
! ;   pages-directory-buffer.
! ; 
! ;   Called with a numeric argument, the `pages-directory' command
! ;   lists the number of lines in each page.  This is helpful when you
! ;   are printing hardcopy.  
  
! ;   Called with a negative numeric argument, the `pages-directory'
! ;   command lists the lengths of pages whose contents match a regexp.
  
  ;;; Code:
--- 18,233 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
! 
! ;;; Commentary:
! 
! ;; You may use these commands to handle an address list or other
! ;; small data base.
  
  
  ;;; Summary
  
! ;; The current page commands are:
  
! ;;     forward-page         C-x ]
! ;;     backward-page        C-x [
! ;;     narrow-to-page       C-x p
! ;;     count-lines-page     C-x l
! ;;     mark-page            C-x C-p  (change this to C-x C-p C-m)
! ;;     sort-pages           not bound
! ;;     what-page            not bound
! 
! ;; The new page handling commands all use `C-x C-p' as a prefix.  This
! ;; means that the key binding for `mark-page' must be changed.
! ;; Otherwise, no other changes are made to the current commands or
! ;; their bindings.
! 
! ;; New page handling commands:
! 
! ;;     next-page                        C-x C-p C-n
! ;;     previous-page                    C-x C-p C-p
! ;;     search-pages                     C-x C-p C-s
! ;;     add-new-page                     C-x C-p C-a
! ;;     sort-pages-buffer                C-x C-p s      
! ;;     set-page-delimiter               C-x C-p C-l
! ;;     pages-directory                  C-x C-p C-d   
! ;;     pages-directory-for-addresses    C-x C-p d
! ;;        pages-directory-goto          C-c C-c
  
  
  ;;; Using the page commands
   
! ;; The page commands are helpful in several different contexts.  For
! ;; example, programmers often divide source files into sections using the
! ;; `page-delimiter'; you can use the `pages-directory' command to list
! ;; the sections.
! 
! ;; You may change the buffer local value of the `page-delimiter' with
! ;; the `set-page-delimiter' command.  This command is bound to `C-x C-p
! ;; C-l' The command prompts you for a new value for the page-delimiter.
! ;; Called with a prefix-arg, the command resets the value of the
! ;; page-delimiter to its original value.
! 
! ;; You may set several user options:
! ;;
! ;;   The `pages-directory-buffer-narrowing-p' variable causes the
! ;;   `pages-directory-goto' command to narrow to the destination page.
! ;;
! ;;   The `pages-directory-for-adding-page-narrowing-p' variable, causes the
! ;;   `add-new-page' command to narrow to the new entry.
! ;;
! ;;   The `pages-directory-for-adding-new-page-before-current-page-p' variable
! ;;   causes the `add-new-page' command to insert a new page before current
! ;;   page.
! ;;
! ;; These variables are true by default.
! ;;
! ;; Additional, addresses-related user options are described in the next page
! ;; of this file.
  
  
  ;;; Handling an address list or small data base
  
! ;; You may use the page commands to handle an address list or other
! ;; small data base.  Put each address or entry on its own page.  The
! ;; first line of text in each page is a `header line' and is listed by
! ;; the `pages-directory' or `pages-directory-for-addresses' command.
! 
! ;; Specifically:
! ;; 
! ;;   1. Begin each entry with a `page-delimiter' (which is, by default,
! ;;      `^L' at the beginning of the line).
! ;; 
! ;;   2. The first line of text in each entry is the `heading line'; it
! ;;      will appear in the pages-directory-buffer which is constructed
! ;;      using the `C-x C-p C-d' (pages-directory) command or the `C-x
! ;;      C-p d' (pages-directory-for-addresses) command.
! ;; 
! ;;      The heading line may be on the same line as the page-delimiter
! ;;      or it may follow after.  It is the first non-blank line on the
! ;;      page.  Conventionally, the heading line is placed on the line
! ;;      immediately following the line containing page-delimiter.
! ;;
! ;;   3. Follow the heading line with the body of the entry.  The body
! ;;      extends up to the next `page-delimiter'.  The body may be of any
! ;;      length.  It is conventional to place a blank line after the last
! ;;      line of the body.
! 
! ;; For example, a file might look like this:
! ;; 
! ;;     FSF
! ;;     Free Software Foundation
! ;;     675 Massachusetts Avenue
! ;;     Cambridge, MA 02139  USA
! ;;     (617) 876-3296
! ;;     gnu@prep.ai.mit.edu
! ;; 
! ;;     
! ;;     House Subcommittee on Intellectual Property,
! ;;     U.S. House of Representatives,
! ;;     Washington, DC  20515
! ;;     
! ;;     Congressional committee concerned with permitting or preventing
! ;;     monopolistic restrictions on the use of software technology.
! ;; 
! ;;     
! ;;     George Lakoff
! ;;     ``Women, Fire, and Dangerous Things:
! ;;     What Categories Reveal about the Mind''
! ;;     1987, Univ. of Chicago Press
! ;; 
! ;;     About philosophy, Whorfian effects, and linguistics.
! ;; 
! ;;      
! ;;     OBI   (On line text collection.)
! ;;     Open Book Initiative
! ;;     c/o Software Tool & Die
! ;;     1330 Beacon St, Brookline, MA 02146 USA
! ;;     (617) 739-0202 
! ;;     obi@world.std.com
! 
! ;; In this example, the heading lines are:
! ;;
! ;;     FSF
! ;;     House Subcommittee on Intellectual Property
! ;;     George Lakoff
! ;;     OBI (On line text collection.)
! 
! ;; The `C-x C-p s' (sort-pages-buffer) command sorts the entries in the
! ;; buffer alphabetically.
! 
! ;; You may use any of the page commands, including the `next-page',
! ;; `previous-page', `add-new-page', `mark-page', and `search-pages'
! ;; commands.
! 
! ;; You may use either the `C-x C-p d' (pages-directory-for-addresses)
! ;; or the `C-x C-p C-d' (pages-directory) command to construct and
! ;; display a directory of all the heading lines.
! 
! ;; In the directory, you may position the cursor over a heading line
! ;; and type `C-c C-c' (pages-directory-goto) to go to the entry to
! ;; which it refers in the pages buffer.
! 
! ;; You can type `C-c C-p C-a' (add-new-page) to add a new entry in the
! ;; pages buffer or address file.  This is the same command you use to
! ;; add a new entry when you are in the pages buffer or address file.
  
! ;; If you wish, you may create several different directories,
! ;; one for each different buffer.
  
  ;; `pages-directory-for-addresses' in detail
  
! ;; The `pages-directory-for-addresses' assumes a default addresses
! ;; file.  You do not need to specify the addresses file but merely type
! ;; `C-x C-p d' from any buffer.  The command finds the file, constructs
! ;; a directory for it, and switches you to the directory.  If you call
! ;; the command with a prefix arg, `C-u C-x C-p d', it prompts you for a
! ;; file name.
! 
! ;; You may customize the addresses commands:
! 
! ;;   The `pages-addresses-file-name' variable determines the name of
! ;;   the addresses file; by default it is "~/addresses".
! 
! ;;   The `pages-directory-for-addresses-goto-narrowing-p' variable
! ;;   determines whether `pages-directory-goto' narrows the addresses
! ;;   buffer to the entry, which it does by default.
! 
! ;;   The `pages-directory-for-addresses-buffer-keep-windows-p' variable
! ;;   determines whether `pages-directory-for-addresses' deletes other
! ;;   windows to show as many lines as possible on the screen or works
! ;;   in the usual Emacs manner and keeps other windows.  Default is to
! ;;   keep other windows.
! 
! ;;   The `pages-directory-for-adding-addresses-narrowing-p' variable
! ;;   determines whether `pages-directory-for-addresses' narrows the
! ;;   addresses buffer to a new entry when you are adding that entry.
! ;;   Default is to narrow to new entry, which means you see a blank
! ;;   screen before you write the new entry.
  
  ;; `pages-directory' in detail
  
! ;; Call the `pages-directory' command from the buffer for which you
! ;; want a directory created; it creates a directory for the buffer and
! ;; pops you to the directory.
! 
! ;; The `pages-directory' command has several options:
! 
! ;;   Called with a prefix arg, `C-u C-x C-p C-d', the `pages-directory'
! ;;   prompts you for a regular expression and only lists only those
! ;;   header lines that are part of pages that contain matches to the
! ;;   regexp.  In the example above, `C-u C-x C-p C-d 617 RET' would
! ;;   match the telephone area code of the first and fourth entries, so
! ;;   only the header lines of those two entries would appear in the
! ;;   pages-directory-buffer.
! ;; 
! ;;   Called with a numeric argument, the `pages-directory' command
! ;;   lists the number of lines in each page.  This is helpful when you
! ;;   are printing hardcopy.  
  
! ;;   Called with a negative numeric argument, the `pages-directory'
! ;;   command lists the lengths of pages whose contents match a regexp.
  
  ;;; Code:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/page.el emacs-19.31/lisp/page.el
*** emacs-19.30/lisp/page.el	Wed Sep 14 23:20:58 1994
--- emacs-19.31/lisp/page.el	Sun Jan 14 02:34:30 1996
***************
*** 18,23 ****
  
  ;; 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:
--- 18,24 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** A page boundary is any line whose beginn
*** 43,59 ****
      (setq count (1- count)))
    (while (and (< count 0) (not (bobp)))
      (forward-char -1)
!     (let (result (end (point)))
!       ;; If we find a match that ends where we started searching,
!       ;; look for another one.
!       (while (and (setq result (re-search-backward page-delimiter nil t))
! 		  (= (match-end 0) end))
! 	;; Just search again.
! 	)
!       (if result
! 	  ;; We found one--move to the end of it.
! 	  (goto-char (match-end 0))
! 	;; We found nothing--go to beg of buffer.
! 	(goto-char (point-min))))
      (setq count (1+ count))))
  
--- 44,58 ----
      (setq count (1- count)))
    (while (and (< count 0) (not (bobp)))
+     ;; In case the page-delimiter matches the null string,
+     ;; don't find a match without moving.
+     (and (save-excursion (re-search-backward page-delimiter nil t))
+ 	 (= (match-end 0) (point))
+ 	 (goto-char (match-beginning 0)))
      (forward-char -1)
!     (if (re-search-backward page-delimiter nil t)
! 	;; We found one--move to the end of it.
! 	(goto-char (match-end 0))
!       ;; We found nothing--go to beg of buffer.
!       (goto-char (point-min)))
      (setq count (1+ count))))
  
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/paragraphs.el emacs-19.31/lisp/paragraphs.el
*** emacs-19.30/lisp/paragraphs.el	Tue Aug  8 04:09:56 1995
--- emacs-19.31/lisp/paragraphs.el	Fri Jan 26 14:46:44 1996
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** to which the end of the previous line be
*** 191,194 ****
--- 192,196 ----
        (setq arg (1+ arg)))
      (while (and (> arg 0) (not (eobp)))
+       ;; Move forward over separator lines, and one more line.
        (while (prog1 (and (not (eobp))
  			 (progn (move-to-left-margin) (not (eobp)))
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/paren.el emacs-19.31/lisp/paren.el
*** emacs-19.30/lisp/paren.el	Fri Nov 10 13:42:24 1995
--- emacs-19.31/lisp/paren.el	Wed Mar  6 00:33:29 1996
***************
*** 1,4 ****
  ;;; paren.el --- highlight matching paren.
! ;; Copyright (C) 1993 Free Software Foundation, Inc.
  
  ;; Author: rms@gnu.ai.mit.edu
--- 1,5 ----
  ;;; paren.el --- highlight matching paren.
! 
! ;; Copyright (C) 1993, 1996 Free Software Foundation, Inc.
  
  ;; Author: rms@gnu.ai.mit.edu
***************
*** 19,24 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 31,46 ****
  ;; This is the overlay used to highlight the matching paren.
  (defvar show-paren-overlay nil)
! ;; This is the overlay used to highlight the closeparen
! ;; right before point.
  (defvar show-paren-overlay-1 nil)
  
  (defvar show-paren-mismatch-face nil)
  
  (defvar show-paren-face 'region
!   "*Name of face to use for showing the matching paren.")
  
  ;; Find the place to show, if there is one,
  ;; and show it until input arrives.
! (defun show-paren-command-hook ()
    ;; Do nothing if no window system to display results with.
    ;; Do nothing if executing keyboard macro.
--- 33,77 ----
  ;; This is the overlay used to highlight the matching paren.
  (defvar show-paren-overlay nil)
! ;; This is the overlay used to highlight the closeparen right before point.
  (defvar show-paren-overlay-1 nil)
  
+ (defvar show-paren-mode nil)
+ (defvar show-paren-idle-timer nil)
+ 
  (defvar show-paren-mismatch-face nil)
  
+ (defvar show-paren-delay (if (featurep 'lisp-float-type) 0.125 1)
+   "*Time in seconds to delay before showing the matching paren.")
+ 
  (defvar show-paren-face 'region
!   "*Name of the face to use for showing the matching paren.")
! 
! ;;;###autoload
! (defun show-paren-mode (&optional arg)
!   "Toggle Show Paren mode.
! With prefix ARG, turn Show Paren mode on if and only if ARG is positive.
! Returns the new status of Show Paren mode (non-nil means on).
! 
! When Show Paren mode is enabled, any matching parenthesis is highlighted
! after `show-paren-delay' seconds of Emacs idle time."
!   (interactive "P")
!   (if window-system
!       (let ((on-p (if arg
! 		      (> (prefix-numeric-value arg) 0)
! 		    (not show-paren-mode))))
! 	(setq blink-matching-paren-on-screen (not on-p))
! 	(and show-paren-idle-timer (cancel-timer show-paren-idle-timer))
! 	(if on-p
! 	    (setq show-paren-idle-timer (run-with-idle-timer show-paren-delay t
! 					 'show-paren-function))
! 	  (and show-paren-overlay (overlay-buffer show-paren-overlay)
! 	       (delete-overlay show-paren-overlay))
! 	  (and show-paren-overlay-1 (overlay-buffer show-paren-overlay-1)
! 	       (delete-overlay show-paren-overlay-1)))
! 	(setq show-paren-mode on-p))))
  
  ;; Find the place to show, if there is one,
  ;; and show it until input arrives.
! (defun show-paren-function ()
    ;; Do nothing if no window system to display results with.
    ;; Do nothing if executing keyboard macro.
***************
*** 106,110 ****
  				       (current-buffer))
  		       (setq show-paren-overlay-1
! 			     (make-overlay (- pos dir) pos)))
  		     ;; Always set the overlay face, since it varies.
  		     (overlay-put show-paren-overlay-1 'face face))
--- 137,141 ----
  				       (current-buffer))
  		       (setq show-paren-overlay-1
! 			     (make-overlay (+ (point) dir) (point))))
  		     ;; Always set the overlay face, since it varies.
  		     (overlay-put show-paren-overlay-1 'face face))
***************
*** 129,144 ****
  		    (delete-overlay show-paren-overlay-1)))))))
  
! (if window-system
!     (progn
!       (setq blink-paren-function nil)
!       (add-hook 'post-command-idle-hook 'show-paren-command-hook)))
! ;;; This is in case paren.el is preloaded.
! (add-hook 'window-setup-hook
! 	  (function (lambda ()
! 		      (if window-system
! 			  (progn
! 			    (setq blink-paren-function nil)
! 			    (add-hook 'post-command-idle-hook
! 				      'show-paren-command-hook))))))
  (provide 'paren)
  
--- 160,167 ----
  		    (delete-overlay show-paren-overlay-1)))))))
  
! ;;; For back compatibility we turn ourselves on if we're dumped or loaded.
! (add-hook 'window-setup-hook '(lambda () (show-paren-mode t)))
! (show-paren-mode t)
! 
  (provide 'paren)
  
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/pascal.el emacs-19.31/lisp/pascal.el
*** emacs-19.30/lisp/pascal.el	Mon Oct 30 12:18:38 1995
--- emacs-19.31/lisp/pascal.el	Mon May 13 12:22:37 1996
***************
*** 8,17 ****
  ;; This file is part of GNU Emacs.
  
! ;; This program 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 of the License, or
! ;; (at your option) any later version.
  
! ;; This program 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
--- 8,17 ----
  ;; 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
***************
*** 19,60 ****
  
  ;; You should have received a copy of the GNU General Public License
! ;; along with this program; if not, write to the Free Software
! ;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  
  ;;; Commentary:
  
! ;;; USAGE
! ;;; =====
  
! ;;; Emacs should enter Pascal mode when you find a Pascal source file.
! ;;; When you have entered Pascal mode, you may get more info by pressing
! ;;; C-h m. You may also get online help describing various functions by:
! ;;; C-h f <Name of function you want described>
! 
! ;;; If you want to customize Pascal mode to fit you better, you may add
! ;;; these lines (the values of the variables presented here are the defaults):
! ;;;
! ;;; ;; User customization for Pascal mode
! ;;; (setq pascal-indent-level       3
! ;;;       pascal-case-indent        2
! ;;;       pascal-auto-newline       nil
! ;;;       pascal-tab-always-indent  t
! ;;;       pascal-auto-endcomments   t
! ;;;       pascal-auto-lineup        '(all)
! ;;;       pascal-toggle-completions nil
! ;;;       pascal-type-keywords      '("array" "file" "packed" "char" 
! ;;; 				      "integer" "real" "string" "record")
! ;;;       pascal-start-keywords     '("begin" "end" "function" "procedure"
! ;;; 				      "repeat" "until" "while" "read" "readln"
! ;;; 				      "reset" "rewrite" "write" "writeln")
! ;;;       pascal-separator-keywords '("downto" "else" "mod" "div" "then"))
! 
! ;;; KNOWN BUGS / BUGREPORTS
! ;;; =======================
! ;;; As far as I know, there are no bugs in the current version of this
! ;;; package.  This may not be true however, since I never use this mode
! ;;; myself and therefore would never notice them anyway.   If you do
! ;;; find any bugs, you may submit them to: espensk@stud.cs.uit.no
! ;;; as well as to bug-gnu-emacs@prep.ai.mit.edu.
  
  ;;; Code:
--- 19,61 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
! ;; USAGE
! ;; =====
  
! ;; Emacs should enter Pascal mode when you find a Pascal source file.
! ;; When you have entered Pascal mode, you may get more info by pressing
! ;; C-h m. You may also get online help describing various functions by:
! ;; C-h f <Name of function you want described>
! 
! ;; If you want to customize Pascal mode to fit you better, you may add
! ;; these lines (the values of the variables presented here are the defaults):
! ;;
! ;; ;; User customization for Pascal mode
! ;; (setq pascal-indent-level       3
! ;;       pascal-case-indent        2
! ;;       pascal-auto-newline       nil
! ;;       pascal-tab-always-indent  t
! ;;       pascal-auto-endcomments   t
! ;;       pascal-auto-lineup        '(all)
! ;;       pascal-toggle-completions nil
! ;;       pascal-type-keywords      '("array" "file" "packed" "char" 
! ;; 				      "integer" "real" "string" "record")
! ;;       pascal-start-keywords     '("begin" "end" "function" "procedure"
! ;; 				      "repeat" "until" "while" "read" "readln"
! ;; 				      "reset" "rewrite" "write" "writeln")
! ;;       pascal-separator-keywords '("downto" "else" "mod" "div" "then"))
! 
! ;; KNOWN BUGS / BUGREPORTS
! ;; =======================
! ;; As far as I know, there are no bugs in the current version of this
! ;; package.  This may not be true however, since I never use this mode
! ;; myself and therefore would never notice them anyway.   If you do
! ;; find any bugs, you may submit them to: espensk@stud.cs.uit.no
! ;; as well as to bug-gnu-emacs@prep.ai.mit.edu.
  
  ;;; Code:
***************
*** 177,182 ****
  
  (defvar pascal-auto-newline nil
!   "*Non-nil means automatically newline after simcolons and the punctation mark
! after an end.")
  
  (defvar pascal-tab-always-indent t
--- 178,183 ----
  
  (defvar pascal-auto-newline nil
!   "*Non-nil means automatically newline after semicolons and the punctuation
! mark after an end.")
  
  (defvar pascal-tab-always-indent t
*************** Pascal program are completed runtime and
*** 244,248 ****
  		 (save-excursion (end-of-line 2) (point)) t))
        (cond ((match-beginning 1) (setq nest (1+ nest)))
! 	    ((match-beginning 2) (setq nest (1- nest)))))))
  
  
--- 245,250 ----
  		 (save-excursion (end-of-line 2) (point)) t))
        (cond ((match-beginning 1) (setq nest (1+ nest)))
! 	    ((match-beginning 2) (setq nest (1- nest)))
! 	    ((looking-at "[^(\n]+)") (setq nest 0))))))
  
  
*************** Variables controlling indentation/edit s
*** 291,296 ****
      Indentation for case statements.
   pascal-auto-newline      (default nil)
!     Non-nil means automatically newline after simcolons and the punctation mark
!     after an end.
   pascal-tab-always-indent (default t)
      Non-nil means TAB in Pascal mode should always reindent the current line,
--- 293,298 ----
      Indentation for case statements.
   pascal-auto-newline      (default nil)
!     Non-nil means automatically newline after semicolons and the punctuation
!     mark after an end.
   pascal-tab-always-indent (default t)
      Non-nil means TAB in Pascal mode should always reindent the current line,
*************** no args, if that value is non-nil."
*** 407,411 ****
  
  (defun electric-pascal-hash ()
!   "Insert `#', and indent to coulmn 0 if this is a CPP directive."
    (interactive)
    (insert last-command-char)
--- 409,413 ----
  
  (defun electric-pascal-hash ()
!   "Insert `#', and indent to column 0 if this is a CPP directive."
    (interactive)
    (insert last-command-char)
*************** no args, if that value is non-nil."
*** 427,431 ****
  	  (beginning-of-line)
  	  (pascal-indent-line))
!       (insert "\t"))
      (pascal-indent-command)))
  
--- 429,437 ----
  	  (beginning-of-line)
  	  (pascal-indent-line))
!       (if (save-excursion
! 	    (skip-chars-backward " \t")
! 	    (bolp))
! 	  (pascal-indent-line)
! 	(insert "\t")))
      (pascal-indent-command)))
  
*************** area.  See also `pascal-comment-area'."
*** 607,611 ****
    "Move forward to end of current statement."
    (interactive)
!   (let ((nest 0) pos
  	(regexp (concat "\\(" pascal-beg-block-re "\\)\\|\\("
  			pascal-end-block-re "\\)")))
--- 613,618 ----
    "Move forward to end of current statement."
    (interactive)
!   (let ((parse-sexp-ignore-comments t)
! 	(nest 0) pos
  	(regexp (concat "\\(" pascal-beg-block-re "\\)\\|\\("
  			pascal-end-block-re "\\)")))
*************** on the line which ends a function or pro
*** 779,783 ****
  Return a list of two elements: (INDENT-TYPE INDENT-LEVEL)."
    (save-excursion
!     (let* ((oldpos (point))
  	   (state (save-excursion (parse-partial-sexp (point-min) (point))))
  	   (nest 0) (par 0) (complete (looking-at "[ \t]*end\\>"))
--- 786,791 ----
  Return a list of two elements: (INDENT-TYPE INDENT-LEVEL)."
    (save-excursion
!     (let* ((parse-sexp-ignore-comments t)
! 	   (oldpos (point))
  	   (state (save-excursion (parse-partial-sexp (point-min) (point))))
  	   (nest 0) (par 0) (complete (looking-at "[ \t]*end\\>"))
*************** column number the line should be indente
*** 890,895 ****
  (defun pascal-indent-case ()
    "Indent within case statements."
!   (skip-chars-forward ": \t")
!   (let ((end (prog2
  		 (end-of-line)
  		 (point-marker)
--- 898,903 ----
  (defun pascal-indent-case ()
    "Indent within case statements."
!   (let ((savepos (point-marker))
! 	(end (prog2
  		 (end-of-line)
  		 (point-marker)
*************** column number the line should be indente
*** 903,910 ****
  	   (marker-position end) 'move)
  	  (forward-char -1))
!       (delete-horizontal-space)
!       (if (> (current-column) ind)
! 	  (setq ind (current-column)))
!       (pascal-end-of-statement))
      (goto-char beg)
      (setq oldpos (marker-position end))
--- 911,920 ----
  	   (marker-position end) 'move)
  	  (forward-char -1))
!       (if (< (point) (marker-position end))
! 	  (progn
! 	    (delete-horizontal-space)
! 	    (if (> (current-column) ind)
! 		(setq ind (current-column)))
! 	    (pascal-end-of-statement))))
      (goto-char beg)
      (setq oldpos (marker-position end))
*************** column number the line should be indente
*** 923,927 ****
        (setq oldpos (point))
        (pascal-end-of-statement))
!     (goto-char oldpos)))
  
  (defun pascal-indent-paramlist (&optional arg)
--- 933,937 ----
        (setq oldpos (point))
        (pascal-end-of-statement))
!     (goto-char savepos)))
  
  (defun pascal-indent-paramlist (&optional arg)
*************** indent of the current line in parameterl
*** 1084,1088 ****
  (defun pascal-get-completion-decl ()
    ;; Macro for searching through current declaration (var, type or const)
!   ;; for matches of `str' and adding the occurence tp `all'
    (let ((end (save-excursion (pascal-declaration-end)
  			     (point)))
--- 1094,1098 ----
  (defun pascal-get-completion-decl ()
    ;; Macro for searching through current declaration (var, type or const)
!   ;; for matches of `str' and adding the occurrence tp `all'
    (let ((end (save-excursion (pascal-declaration-end)
  			     (point)))
*************** indent of the current line in parameterl
*** 1134,1138 ****
  	(if (> start (prog1 (save-excursion (pascal-end-of-defun)
  					    (point))))
! 	    () ; Declarations not reacable
  	  (if (search-forward "(" (pascal-get-end-of-line) t)
  	      ;; Check parameterlist
--- 1144,1148 ----
  	(if (> start (prog1 (save-excursion (pascal-end-of-defun)
  					    (point))))
! 	    () ; Declarations not reachable
  	  (if (search-forward "(" (pascal-get-end-of-line) t)
  	      ;; Check parameterlist
*************** indent of the current line in parameterl
*** 1173,1177 ****
      (let ((pascal-all nil))
        ;; Set buffer to use for searching labels. This should be set
!       ;; within functins which use pascal-completions
        (set-buffer pascal-buffer-to-use)
  
--- 1183,1187 ----
      (let ((pascal-all nil))
        ;; Set buffer to use for searching labels. This should be set
!       ;; within functions which use pascal-completions
        (set-buffer pascal-buffer-to-use)
  
*************** indent of the current line in parameterl
*** 1283,1287 ****
  	    (insert "" pascal-str)
  	    (message "(No match)")))
!       ;; The other form of completion does not necessarly do that.
  
        ;; Insert match if found, or the original string if no match
--- 1293,1297 ----
  	    (insert "" pascal-str)
  	    (message "(No match)")))
!       ;; The other form of completion does not necessarily do that.
  
        ;; Insert match if found, or the original string if no match
*************** With optional second arg non-nil, STR is
*** 1359,1363 ****
  
        ;; Set buffer to use for searching labels. This should be set
!       ;; within functins which use pascal-completions
        (set-buffer pascal-buffer-to-use)
  
--- 1369,1373 ----
  
        ;; Set buffer to use for searching labels. This should be set
!       ;; within functions which use pascal-completions
        (set-buffer pascal-buffer-to-use)
  
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/patcomp.el emacs-19.31/lisp/patcomp.el
*** emacs-19.30/lisp/patcomp.el	Mon Oct 30 11:45:11 1995
--- emacs-19.31/lisp/patcomp.el	Mon May 20 17:06:28 1996
***************
*** 1,3 ****
! ;;; bytecpat.el --- do recompilation for Emacs patch files.
  ;;; This function is used by the patch files to update Emacs releases.
  
--- 1,3 ----
! 
  ;;; This function is used by the patch files to update Emacs releases.
  
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/paths.el emacs-19.31/lisp/paths.el
*** emacs-19.30/lisp/paths.el	Mon Jul 17 18:54:20 1995
--- emacs-19.31/lisp/paths.el	Sun Jan 14 02:34:30 1996
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** Therefore, the directory of Info files t
*** 49,53 ****
  normally should come last (so that local files override standard ones).")
  
! (defvar news-path "/usr/spool/news/"
    "The root directory below which all news files are stored.")
  
--- 50,57 ----
  normally should come last (so that local files override standard ones).")
  
! (defvar news-path
!   (if (file-exists-p "/usr/spool/news/")
!       "/usr/spool/news/"
!     "/var/spool/news/")
    "The root directory below which all news files are stored.")
  
*************** Will use `gnus-startup-file'-SERVER inst
*** 99,102 ****
--- 103,109 ----
  	((file-exists-p "/var/mail")
  	 "/var/mail/")
+ 	;; Many GNU/Linux systems use this name.
+ 	((file-exists-p "/var/spool/mail")
+ 	 "/var/spool/mail/")
  	((memq system-type '(dgux hpux usg-unix-v unisoft-unix rtu irix))
  	 "/usr/mail/")
*************** the terminal-initialization file to be l
*** 143,147 ****
    (if (eq system-type 'vax-vms)
        "~/abbrev.def"
!     "~/.abbrev_defs")
    "*Default name of file to read abbrevs from.")
  
--- 150,154 ----
    (if (eq system-type 'vax-vms)
        "~/abbrev.def"
!     (convert-standard-filename "~/.abbrev_defs"))
    "*Default name of file to read abbrevs from.")
  
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/pc-mode.el emacs-19.31/lisp/pc-mode.el
*** emacs-19.30/lisp/pc-mode.el	Mon Oct 30 12:20:24 1995
--- emacs-19.31/lisp/pc-mode.el	Mon May 20 17:04:30 1996
***************
*** 1,3 ****
! ;;; pc-mode.el emulate certain key bindings used on PCs.
  ;; Copyright (C) 1995 Free Software Foundation, Inc.
  
--- 1,4 ----
! ;;; pc-mode.el --- emulate certain key bindings used on PCs.
! 
  ;; Copyright (C) 1995 Free Software Foundation, Inc.
  
***************
*** 10,23 ****
  ;; 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.
  
  
  ;;;###autoload
--- 11,26 ----
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
+ ;;; Code:
  
  ;;;###autoload
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/pc-select.el emacs-19.31/lisp/pc-select.el
*** emacs-19.30/lisp/pc-select.el	Fri Nov 10 12:19:00 1995
--- emacs-19.31/lisp/pc-select.el	Sat Mar  2 00:39:18 1996
***************
*** 3,7 ****
  ;;;		     including key bindings
  
! ;; Copyright (C) 1995 Free Software Foundation, Inc.
  
  ;; Author: Michael Staats <michael@thp.Uni-Duisburg.DE>
--- 3,7 ----
  ;;;		     including key bindings
  
! ;; Copyright (C) 1995, 1996 Free Software Foundation, Inc.
  
  ;; Author: Michael Staats <michael@thp.Uni-Duisburg.DE>
***************
*** 21,29 ****
  
  ;; 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:
! ;;
  ;; This package emulates the mark, copy, cut and paste look-and-feel of motif
  ;; programs (which is the same as the MAC gui and (sorry for that) MS-Windows).
--- 21,30 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
! 
  ;; This package emulates the mark, copy, cut and paste look-and-feel of motif
  ;; programs (which is the same as the MAC gui and (sorry for that) MS-Windows).
***************
*** 53,56 ****
--- 54,59 ----
  ;; Thanks to Pete Forman <pete.forman@airgun.wg.waii.com>
  ;; for additional motif keybindings.
+ ;; Thanks to jvromans@squirrel.nl (Johan Vromans) for a bug report
+ ;; concerning setting of this-command.
  ;;
  ;;
***************
*** 69,89 ****
  ;;    S-insert (paste) and C-insert (copy). These keys do the same in many
  ;;    other programs.
- ;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;;
- ;;;; INSTALLATION:
- ;;;; o Put this file called "pc-select.el" into a path where emacs
- ;;;;   looks for lisp libraries. Byte-compile if you want to.
- ;;;; o Put the command '(require 'pc-select) or
- ;;;;   '(load "pc-select")' into your ~/.emacs. After that line
- ;;;;   put the command '(pc-selection-mode)' to activate the mode.
- ;;;;
- ;;;; Please note that I am _not_ a lisp expert, I apologise for
- ;;;; all hacks which look ugly to an experienced lisp programmer.
- ;;;; Please report all errors and improvement. Thank you.
- ;;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  
! ;;;; Code:
  
  ;;;;
--- 72,77 ----
  ;;    S-insert (paste) and C-insert (copy). These keys do the same in many
  ;;    other programs.
  
! ;;; Code:
  
  ;;;;
*************** and nil is returned."
*** 136,140 ****
  With arg N, do it N times; negative arg -N means move backward N paragraphs.\n
  A line which `paragraph-start' matches either separates paragraphs
! (if `paragraph-separate' matches it also) or is the first line of a paragraph.
  A paragraph end is the beginning of a line which is not part of the paragraph
  to which the end of the previous line belongs, or the end of the buffer."
--- 124,128 ----
  With arg N, do it N times; negative arg -N means move backward N paragraphs.\n
  A line which `paragraph-start' matches either separates paragraphs
! \(if `paragraph-separate' matches it also) or is the first line of a paragraph.
  A paragraph end is the beginning of a line which is not part of the paragraph
  to which the end of the previous line belongs, or the end of the buffer."
*************** in `goal-column', which is nil when ther
*** 159,163 ****
    (interactive "p")
    (ensure-mark)
!   (next-line arg))
  
  (defun end-of-line-mark (&optional arg)
--- 147,152 ----
    (interactive "p")
    (ensure-mark)
!   (next-line arg)
!   (setq this-command 'next-line))
  
  (defun end-of-line-mark (&optional arg)
*************** If scan reaches end of buffer, stop ther
*** 167,171 ****
    (interactive "p")
    (ensure-mark)
!   (end-of-line arg))
  
  (defun scroll-down-mark (&optional arg)
--- 156,161 ----
    (interactive "p")
    (ensure-mark)
!   (end-of-line arg)
!   (setq this-command 'end-of-line))
  
  (defun scroll-down-mark (&optional arg)
*************** and nil is returned."
*** 234,238 ****
  With arg N, do it N times; negative arg -N means move backward N paragraphs.\n
  A line which `paragraph-start' matches either separates paragraphs
! (if `paragraph-separate' matches it also) or is the first line of a paragraph.
  A paragraph end is the beginning of a line which is not part of the paragraph
  to which the end of the previous line belongs, or the end of the buffer."
--- 224,228 ----
  With arg N, do it N times; negative arg -N means move backward N paragraphs.\n
  A line which `paragraph-start' matches either separates paragraphs
! \(if `paragraph-separate' matches it also) or is the first line of a paragraph.
  A paragraph end is the beginning of a line which is not part of the paragraph
  to which the end of the previous line belongs, or the end of the buffer."
*************** in `goal-column', which is nil when ther
*** 257,261 ****
    (interactive "p")
    (setq mark-active nil)
!   (next-line arg))
  
  (defun end-of-line-nomark (&optional arg)
--- 247,252 ----
    (interactive "p")
    (setq mark-active nil)
!   (next-line arg)
!   (setq this-command 'next-line))
  
  (defun end-of-line-nomark (&optional arg)
*************** If scan reaches end of buffer, stop ther
*** 265,269 ****
    (interactive "p")
    (setq mark-active nil)
!   (end-of-line arg))
  
  (defun scroll-down-nomark (&optional arg)
--- 256,261 ----
    (interactive "p")
    (setq mark-active nil)
!   (end-of-line arg)
!   (setq this-command 'end-of-line))
  
  (defun scroll-down-nomark (&optional arg)
*************** If the buffer is narrowed, this command 
*** 282,286 ****
  of the accessible part of the buffer.\n
  Don't use this command in Lisp programs!
! (goto-char (point-max)) is faster and avoids clobbering the mark."
    (interactive "P")
    (setq mark-active nil)
--- 274,278 ----
  of the accessible part of the buffer.\n
  Don't use this command in Lisp programs!
! \(goto-char (point-max)) is faster and avoids clobbering the mark."
    (interactive "P")
    (setq mark-active nil)
*************** to use and more reliable (no dependence 
*** 353,357 ****
    (interactive "p")
    (ensure-mark)
!   (previous-line arg))
  
  (defun beginning-of-line-mark (&optional arg)
--- 345,350 ----
    (interactive "p")
    (ensure-mark)
!   (previous-line arg)
!   (setq this-command 'previous-line))
  
  (defun beginning-of-line-mark (&optional arg)
*************** Then it does not try to move vertically.
*** 434,438 ****
    (interactive "p")
    (setq mark-active nil)
!   (previous-line arg))
  
  (defun beginning-of-line-nomark (&optional arg)
--- 427,432 ----
    (interactive "p")
    (setq mark-active nil)
!   (previous-line arg)
!   (setq this-command 'previous-line))
  
  (defun beginning-of-line-nomark (&optional arg)
*************** If the buffer is narrowed, this command 
*** 459,463 ****
  of the accessible part of the buffer.\n
  Don't use this command in Lisp programs!
! (goto-char (point-min)) is faster and avoids clobbering the mark."
    (interactive "P")
    (setq mark-active nil)
--- 453,457 ----
  of the accessible part of the buffer.\n
  Don't use this command in Lisp programs!
! \(goto-char (point-min)) is faster and avoids clobbering the mark."
    (interactive "P")
    (setq mark-active nil)
*************** the MAC GUI or MS-Windows (sorry for the
*** 495,499 ****
  
  
!   ;; The followong keybindings are for standard ISO keyboards
    ;; as they are used with IBM compatible PCs, IBM RS/6000,
    ;; MACs, many X-Stations and probably more
--- 489,493 ----
  
  
!   ;; The following keybindings are for standard ISO keyboards
    ;; as they are used with IBM compatible PCs, IBM RS/6000,
    ;; MACs, many X-Stations and probably more
*************** the MAC GUI or MS-Windows (sorry for the
*** 502,505 ****
--- 496,501 ----
    (define-key global-map [C-S-right] 'forward-word-mark)
    (define-key global-map [C-right]   'forward-word-nomark)
+   (define-key global-map [M-S-right] 'forward-word-mark)
+   (define-key global-map [M-right]   'forward-word-nomark)
  
    (define-key global-map [S-down]    'next-line-mark)
*************** the MAC GUI or MS-Windows (sorry for the
*** 510,513 ****
--- 506,511 ----
    (global-set-key [S-C-end]          'end-of-buffer-mark)
    (global-set-key [C-end]            'end-of-buffer-nomark)
+   (global-set-key [S-M-end]          'end-of-buffer-mark)
+   (global-set-key [M-end]            'end-of-buffer-nomark)
  
    (define-key global-map [S-next]    'scroll-up-mark)
*************** the MAC GUI or MS-Windows (sorry for the
*** 518,521 ****
--- 516,521 ----
    (define-key global-map [C-S-left]  'backward-word-mark)
    (define-key global-map [C-left]    'backward-word-nomark)
+   (define-key global-map [M-S-left]  'backward-word-mark)
+   (define-key global-map [M-left]    'backward-word-nomark)
  
    (define-key global-map [S-up]      'previous-line-mark)
*************** the MAC GUI or MS-Windows (sorry for the
*** 526,529 ****
--- 526,531 ----
    (global-set-key [S-C-home]         'beginning-of-buffer-mark)
    (global-set-key [C-home]           'beginning-of-buffer-nomark)
+   (global-set-key [S-M-home]         'beginning-of-buffer-mark)
+   (global-set-key [M-home]           'beginning-of-buffer-nomark)
  
    (define-key global-map [S-prior]   'scroll-down-mark)
*************** the MAC GUI or MS-Windows (sorry for the
*** 534,538 ****
    (define-key global-map [S-delete]  'kill-region)
  
!   ;; The following bindings are usueful on Sun Type 3 keyboards
    ;; They implement the Get-Delete-Put (copy-cut-paste)
    ;; functions from sunview on the L6, L8 and L10 keys
--- 536,540 ----
    (define-key global-map [S-delete]  'kill-region)
  
!   ;; The following bindings are useful on Sun Type 3 keyboards
    ;; They implement the Get-Delete-Put (copy-cut-paste)
    ;; functions from sunview on the L6, L8 and L10 keys
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/perl-mode.el emacs-19.31/lisp/perl-mode.el
*** emacs-19.30/lisp/perl-mode.el	Tue Jul 25 19:31:11 1995
--- emacs-19.31/lisp/perl-mode.el	Wed Feb 21 15:02:29 1996
***************
*** 24,29 ****
  
  ;; 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:
--- 24,30 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 32,36 ****
  ;; to your .emacs file and change the first line of your perl script to:
  ;; #!/usr/bin/perl --	 # -*-Perl-*-
! ;; With argments to perl:
  ;; #!/usr/bin/perl -P-	 # -*-Perl-*-
  ;; To handle files included with do 'filename.pl';, add something like
--- 33,37 ----
  ;; to your .emacs file and change the first line of your perl script to:
  ;; #!/usr/bin/perl --	 # -*-Perl-*-
! ;; With arguments to perl:
  ;; #!/usr/bin/perl -P-	 # -*-Perl-*-
  ;; To handle files included with do 'filename.pl';, add something like
*************** The expansion is entirely correct becaus
*** 154,178 ****
      ;;Variables
      ("Variables" "^\\([$@%][-A-Za-z0-9+_:]+\\)\\s-*=" 1 )
      )
    "Imenu generic expression for Perl mode.  See `imenu-generic-expression'.")
  
! (defvar perl-font-lock-keywords
!   (list
! ;   ("if" "until" "while" "elsif" "else" "unless" "for" "foreach" "continue"
! ;    "exit" "die" "last" "goto" "next" "redo" "return" "local" "exec")
!    (concat "\\<\\("
! 	   "continue\\|die\\|e\\(ls\\(e\\|if\\)\\|x\\(ec\\|it\\)\\)\\|"
! 	   "for\\(\\|each\\)\\|goto\\|if\\|l\\(ast\\|ocal\\)\\|next\\|"
! 	   "re\\(do\\|turn\\)\\|un\\(less\\|til\\)\\|while"
! 	   "\\)\\>")
! ;   ("#endif" "#else" "#ifdef" "#ifndef" "#if" "#include" "#define" "#undef")
!    (cons (concat "#\\(define\\|e\\(lse\\|ndif\\)\\|"
! 		 "i\\(f\\(\\|def\\|ndef\\)\\|nclude\\)\\|undef\\)\\>")
! 	 'font-lock-reference-face)
!    '("^[ \n\t]*sub[ \t]+\\([^ \t{]+\\)[ \t]*[{]" 1 font-lock-function-name-face)
!    '("[ \n\t{]*\\(eval\\)[ \n\t(;]" 1 font-lock-function-name-face)
!    '("\\(--- .* ---\\|=== .* ===\\)" . font-lock-string-face)
!    )
!   "Additional expressions to highlight in Perl mode.")
  
  (defvar perl-indent-level 4
--- 155,221 ----
      ;;Variables
      ("Variables" "^\\([$@%][-A-Za-z0-9+_:]+\\)\\s-*=" 1 )
+     ("Packages" "^package\\s-+\\([-A-Za-z0-9+_:]+\\);" 1 )
      )
    "Imenu generic expression for Perl mode.  See `imenu-generic-expression'.")
  
! ;; Regexps updated with help from Tom Tromey <tromey@cambric.colorado.edu> and
! ;; Jim Campbell <jec@murzim.ca.boeing.com>.
! 
! (defconst perl-font-lock-keywords-1
!   '(;; What is this for?
!     ;;("\\(--- .* ---\\|=== .* ===\\)" . font-lock-string-face)
!     ;;
!     ;; Fontify preprocessor statements as we do in `c-font-lock-keywords'.
!     ;; Ilya Zakharevich <ilya@math.ohio-state.edu> thinks this is a bad idea.
!     ("^#[ \t]*include[ \t]+\\(<[^>\"\n]+>\\)" 1 font-lock-string-face)
!     ("^#[ \t]*define[ \t]+\\(\\sw+\\)(" 1 font-lock-function-name-face)
!     ("^#[ \t]*if\\>"
!      ("\\<\\(defined\\)\\>[ \t]*(?\\(\\sw+\\)?" nil nil
!       (1 font-lock-reference-face) (2 font-lock-variable-name-face nil t)))
!     ("^#[ \t]*\\(\\sw+\\)\\>[ \t]*\\(\\sw+\\)?"
!      (1 font-lock-reference-face) (2 font-lock-variable-name-face nil t))
!     ;;
!     ;; Fontify function and package names in declarations.
!     ("\\<\\(package\\|sub\\)\\>[ \t]*\\(\\sw+\\)?"
!      (1 font-lock-keyword-face) (2 font-lock-function-name-face nil t))
!     ("\\<\\(import\\|no\\|require\\|use\\)\\>[ \t]*\\(\\sw+\\)?"
!      (1 font-lock-keyword-face) (2 font-lock-reference-face nil t)))
!   "Subdued level highlighting for Perl mode.")
! 
! (defconst perl-font-lock-keywords-2
!   (append perl-font-lock-keywords-1
!    (list
!     ;;
!     ;; Fontify keywords, except those fontified otherwise.
! ;   (make-regexp '("if" "until" "while" "elsif" "else" "unless" "do" "dump"
! ;  "for" "foreach" "exit" "die"
! ;  "BEGIN" "END" "return" "exec" "eval"))
!     (concat "\\<\\("
! 	    "BEGIN\\|END\\|d\\(ie\\|o\\|ump\\)\\|"
! 	    "e\\(ls\\(e\\|if\\)\\|val\\|x\\(ec\\|it\\)\\)\\|"
! 	    "for\\(\\|each\\)\\|if\\|return\\|un\\(less\\|til\\)\\|while"
! 	    "\\)\\>")
!     ;;
!     ;; Fontify local and my keywords as types.
!     '("\\<\\(local\\|my\\)\\>" . font-lock-type-face)
!     ;;
!     ;; Fontify function, variable and file name references.
!     '("&\\(\\sw+\\)" 1 font-lock-function-name-face)
!     ;; Additionally underline non-scalar variables.  Maybe this is a bad idea.
!     ;;'("[$@%*][#{]?\\(\\sw+\\)" 1 font-lock-variable-name-face)
!     '("[$*]{?\\(\\sw+\\)" 1 font-lock-variable-name-face)
!     '("\\([@%]\\|\\$#\\)\\(\\sw+\\)"
!       (2 (cons font-lock-variable-name-face '(underline))))
!     '("<\\(\\sw+\\)>" 1 font-lock-reference-face)
!     ;;
!     ;; Fontify keywords with/and labels as we do in `c++-font-lock-keywords'.
!     '("\\<\\(continue\\|goto\\|last\\|next\\|redo\\)\\>[ \t]*\\(\\sw+\\)?"
!       (1 font-lock-keyword-face) (2 font-lock-reference-face nil t))
!     '("^[ \t]*\\(\\sw+\\)[ \t]*:[^:]" 1 font-lock-reference-face)))
!   "Gaudy level highlighting for Perl mode.")
! 
! (defvar perl-font-lock-keywords perl-font-lock-keywords-1
!   "Default expressions to highlight in Perl mode.")
! 
  
  (defvar perl-indent-level 4
*************** Turning on Perl mode runs the normal hoo
*** 281,286 ****
    (make-local-variable 'parse-sexp-ignore-comments)
    (setq parse-sexp-ignore-comments t)
    (make-local-variable 'font-lock-defaults)
!   (setq font-lock-defaults '(perl-font-lock-keywords))
    ;; Tell imenu how to handle Perl.
    (make-local-variable 'imenu-generic-expression)
--- 324,333 ----
    (make-local-variable 'parse-sexp-ignore-comments)
    (setq parse-sexp-ignore-comments t)
+   ;; Tell font-lock.el how to handle Perl.
    (make-local-variable 'font-lock-defaults)
!   (setq font-lock-defaults '((perl-font-lock-keywords
! 			      perl-font-lock-keywords-1
! 			      perl-font-lock-keywords-2)
! 			     nil nil ((?\_ . "w"))))
    ;; Tell imenu how to handle Perl.
    (make-local-variable 'imenu-generic-expression)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/picture.el emacs-19.31/lisp/picture.el
*** emacs-19.30/lisp/picture.el	Tue Apr 25 17:29:55 1995
--- emacs-19.31/lisp/picture.el	Wed Feb 14 15:11:06 1996
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** Leaves the region surrounding the rectan
*** 480,483 ****
--- 481,488 ----
        (setq picture-mode-map (list 'keymap (make-vector 256 nil)))
        (picture-substitute 'self-insert-command 'picture-self-insert)
+       (picture-substitute 'completion-separator-self-insert-command
+ 			  'picture-self-insert)
+       (picture-substitute 'completion-separator-self-insert-autofilling
+ 			  'picture-self-insert)
        (picture-substitute 'forward-char 'picture-forward-column)
        (picture-substitute 'backward-char 'picture-backward-column)
*************** they are not defaultly assigned to keys.
*** 608,615 ****
      ;; edit-picture-hook is what we used to run, picture-mode-hook is in doc.
      (run-hooks 'edit-picture-hook 'picture-mode-hook)
!     (message
!      (substitute-command-keys
!       "Type \\[picture-mode-exit] in this buffer to return it to %s mode.")
!      picture-mode-old-mode-name)))
  
  ;;;###autoload
--- 613,619 ----
      ;; edit-picture-hook is what we used to run, picture-mode-hook is in doc.
      (run-hooks 'edit-picture-hook 'picture-mode-hook)
!     (message "Type %s in this buffer to return it to %s mode."
! 	     (substitute-command-keys "\\[picture-mode-exit]")
! 	     picture-mode-old-mode-name)))
  
  ;;;###autoload
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/pp.el emacs-19.31/lisp/pp.el
*** emacs-19.30/lisp/pp.el	Mon Oct 30 12:20:57 1995
--- emacs-19.31/lisp/pp.el	Fri Jan 19 06:24:34 1996
***************
*** 1,6 ****
  ;;; pp.el --- pretty printer for Emacs Lisp
  ;; Copyright (C) 1989, 1993 Free Software Foundation, Inc.
  
! ;; Author: Randal Schwartz <merlyn@ora.com>
  
  ;; This file is part of GNU Emacs.
--- 1,7 ----
  ;;; pp.el --- pretty printer for Emacs Lisp
+ 
  ;; Copyright (C) 1989, 1993 Free Software Foundation, Inc.
  
! ;; Author: Randal Schwartz <merlyn@stonehenge.com>
  
  ;; This file is part of GNU Emacs.
***************
*** 17,22 ****
  
  ;; 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.
  
  ;;; Code:
--- 18,24 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Code:
*************** value."
*** 116,120 ****
  	       (end-of-line 1)
  	       (if (or (< (1+ (point)) (point-max))
! 		       (>= (- (point) (point-min)) (screen-width)))
  		   (let ((temp-buffer-show-function old-show-function)
  			 (old-selected (selected-window))
--- 118,122 ----
  	       (end-of-line 1)
  	       (if (or (< (1+ (point)) (point-max))
! 		       (>= (- (point) (point-min)) (frame-width)))
  		   (let ((temp-buffer-show-function old-show-function)
  			 (old-selected (selected-window))
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/profile.el emacs-19.31/lisp/profile.el
*** emacs-19.30/lisp/profile.el	Tue May  3 18:10:29 1994
--- emacs-19.31/lisp/profile.el	Fri Mar  8 12:44:02 1996
***************
*** 22,68 ****
  
  ;; 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:
  
! ; DESCRIPTION:
! ; ------------
! ;   This program can be used to monitor running time performance of Emacs Lisp
! ; functions. It takes a list of functions and report the real time spent 
! ; inside these functions. It runs a process with a separate timer program.
! ;   Caveat: the C code in ../lib-src/profile.c requires BSD-compatible
! ; time-of-day functions.  If you're running an AT&T version prior to SVr4,
! ; you may have difficulty getting it to work.  Your X library may supply
! ; the required routines if the standard C library does not.
! 
! ; HOW TO USE:
! ; -----------
! ;   Set the variable  profile-functions-list  to the list of functions
! ; (as symbols) You want to profile. Call  M-x  profile-functions to set 
! ; this list on and start using your program.  Note that profile-functions 
! ; MUST be called AFTER all the functions in profile-functions-list have 
! ; been loaded !!   (This call modifies the code of the profiled functions.
! ; Hence if you reload these functions, you need to call  profile-functions  
! ; again! ).
! ;   To display the results do  M-x  profile-results .  For example:
! ;-------------------------------------------------------------------
! ;  (setq profile-functions-list '(sokoban-set-mode-line sokoban-load-game 
! ;	                          sokoban-move-vertical sokoban-move))
! ;  (load "sokoban")
! ;  M-x profile-functions
! ;     ...  I play the sokoban game ..........
! ;  M-x profile-results
! ;
! ;      Function                     Time (Seconds.Useconds)
! ;      ========                     =======================
! ;      sokoban-move                     0.539088
! ;      sokoban-move-vertical            0.410130
! ;      sokoban-load-game                0.453235
! ;      sokoban-set-mode-line            1.949203
! ;-----------------------------------------------------
! ; To clear all the settings to profile use profile-finish. 
! ; To set one function at a time (instead of or in addition to setting the 
! ; above list and  M-x profile-functions) use M-x profile-a-function.
  
  ;;; Code:
--- 22,69 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
! ;; DESCRIPTION:
! ;; ------------
! ;;   This program can be used to monitor running time performance of Emacs Lisp
! ;; functions. It takes a list of functions and report the real time spent 
! ;; inside these functions. It runs a process with a separate timer program.
! ;;   Caveat: the C code in ../lib-src/profile.c requires BSD-compatible
! ;; time-of-day functions.  If you're running an AT&T version prior to SVr4,
! ;; you may have difficulty getting it to work.  Your X library may supply
! ;; the required routines if the standard C library does not.
! 
! ;; HOW TO USE:
! ;; -----------
! ;;   Set the variable  profile-functions-list  to the list of functions
! ;; (as symbols) You want to profile. Call  M-x  profile-functions to set 
! ;; this list on and start using your program.  Note that profile-functions 
! ;; MUST be called AFTER all the functions in profile-functions-list have 
! ;; been loaded !!   (This call modifies the code of the profiled functions.
! ;; Hence if you reload these functions, you need to call  profile-functions  
! ;; again! ).
! ;;   To display the results do  M-x  profile-results .  For example:
! ;;-------------------------------------------------------------------
! ;;  (setq profile-functions-list '(sokoban-set-mode-line sokoban-load-game 
! ;;	                          sokoban-move-vertical sokoban-move))
! ;;  (load "sokoban")
! ;;  M-x profile-functions
! ;;     ...  I play the sokoban game ..........
! ;;  M-x profile-results
! ;;
! ;;      Function                     Time (Seconds.Useconds)
! ;;      ========                     =======================
! ;;      sokoban-move                     0.539088
! ;;      sokoban-move-vertical            0.410130
! ;;      sokoban-load-game                0.453235
! ;;      sokoban-set-mode-line            1.949203
! ;;-----------------------------------------------------
! ;; To clear all the settings to profile use profile-finish. 
! ;; To set one function at a time (instead of or in addition to setting the 
! ;; above list and  M-x profile-functions) use M-x profile-a-function.
  
  ;;; Code:
*************** With argument FLIST, use the list FLIST 
*** 218,224 ****
--- 219,243 ----
        )))
  
+ (defun profile-convert-byte-code (function)
+   (let ((defn (symbol-function function)))
+     (if (byte-code-function-p defn)
+ 	;; It is a compiled code object.
+ 	(let* ((contents (append defn nil))
+ 	       (body
+ 		(list (list 'byte-code (nth 1 contents)
+ 			    (nth 2 contents) (nth 3 contents)))))
+ 	  (if (nthcdr 5 contents)
+ 	      (setq body (cons (list 'interactive (nth 5 contents)) body)))
+ 	  (if (nth 4 contents)
+ 	      ;; Use `documentation' here, to get the actual string,
+ 	      ;; in case the compiled function has a reference
+ 	      ;; to the .elc file.
+ 	      (setq body (cons (documentation function) body)))
+ 	  (fset function (cons 'lambda (cons (car contents) body)))))))
+ 
  (defun profile-a-function (fun)
    "Profile the function FUN."
    (interactive "aFunction to profile: ")
+   (profile-convert-byte-code fun)
    (let ((def (symbol-function fun)) (funlen (length (symbol-name fun))))
      (if (eq (car def) 'lambda) nil
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/prolog.el emacs-19.31/lisp/prolog.el
*** emacs-19.30/lisp/prolog.el	Thu Mar  2 10:38:32 1995
--- emacs-19.31/lisp/prolog.el	Sun Jan 14 02:34:30 1996
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/ps-print.el emacs-19.31/lisp/ps-print.el
*** emacs-19.30/lisp/ps-print.el	Fri Aug  4 15:59:52 1995
--- emacs-19.31/lisp/ps-print.el	Wed May  1 19:50:29 1996
***************
*** 1,7 ****
  ;;; ps-print.el --- Jim's Pretty-Good PostScript Generator for Emacs 19.
  
! ;; Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc.
  
  ;; Author: Jim Thompson <thompson@wg2.waii.com>
  ;; Keywords: print, PostScript
  
--- 1,8 ----
  ;;; ps-print.el --- Jim's Pretty-Good PostScript Generator for Emacs 19.
  
! ;; Copyright (C) 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
  
  ;; Author: Jim Thompson <thompson@wg2.waii.com>
+ ;; Maintainer: FSF
  ;; Keywords: print, PostScript
  
***************
*** 19,24 ****
  
  ;; 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.
  
  ;; LCD Archive Entry:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;; LCD Archive Entry:
***************
*** 84,88 ****
  ;; 
  ;; Ps-print has a hook in the kill-emacs-hooks so that you won't
! ;; accidently quit from Emacs while you have unprinted PostScript
  ;; waiting in the spool buffer.  If you do attempt to exit with
  ;; spooled PostScript, you'll be asked if you want to print it, and if
--- 86,90 ----
  ;; 
  ;; Ps-print has a hook in the kill-emacs-hooks so that you won't
! ;; accidentally quit from Emacs while you have unprinted PostScript
  ;; waiting in the spool buffer.  If you do attempt to exit with
  ;; spooled PostScript, you'll be asked if you want to print it, and if
***************
*** 199,203 ****
  ;; italic; these lists are built the first time you invoke ps-print.
  ;; For the sake of efficiency, the lists are built only once; the same
! ;; lists are referred in later invokations of ps-print.
  ;;
  ;; Because these lists are built only once, it's possible for them to
--- 201,205 ----
  ;; italic; these lists are built the first time you invoke ps-print.
  ;; For the sake of efficiency, the lists are built only once; the same
! ;; lists are referred in later invocations of ps-print.
  ;;
  ;; Because these lists are built only once, it's possible for them to
***************
*** 256,260 ****
  ;; show in the header.  Variables should contain strings to display in
  ;; the header.  In either case, function or variable, the PostScript
! ;; strings delimeters are added by ps-print, and should not be part of
  ;; the returned value.
  ;;
--- 258,262 ----
  ;; show in the header.  Variables should contain strings to display in
  ;; the header.  In either case, function or variable, the PostScript
! ;; string delimiters are added by ps-print, and should not be part of
  ;; the returned value.
  ;;
***************
*** 303,329 ****
  ;; ps-legal, or ps-a4.  The default is ps-letter.
  ;;
- ;; 
- ;; Installing ps-print
- ;; -------------------
- ;;
- ;; 1. Place ps-print.el somewhere in your load-path and byte-compile
- ;;    it.  You can ignore all byte-compiler warnings; they are the
- ;;    result of multi-Emacs support.  This step is necessary only if
- ;;    you're installing your own ps-print; if ps-print came with your
- ;;    copy of Emacs, this been done already.
- ;;
- ;; 2. Place in your .emacs file the line
  ;;
! ;;        (require 'ps-print)
  ;;
- ;;    to load ps-print.  Or you may cause any of the ps-print commands
- ;;    to be autoloaded with an autoload command such as:
- ;;
- ;;      (autoload 'ps-print-buffer "ps-print"
- ;;        "Generate and print a PostScript image of the buffer..." t)
- ;;
- ;; 3. Make sure that the variables ps-lpr-command and ps-lpr-switches
- ;;    contain appropriate values for your system; see the usage notes
- ;;    below and the documentation of these variables.
  ;; 
  ;; New since version 1.5
--- 305,313 ----
  ;; ps-legal, or ps-a4.  The default is ps-letter.
  ;;
  ;;
! ;; Make sure that the variables ps-lpr-command and ps-lpr-switches
! ;; contain appropriate values for your system; see the usage notes
! ;; below and the documentation of these variables.
  ;;
  ;; 
  ;; New since version 1.5
*************** number, prompt the user for the name of 
*** 604,610 ****
  (defun ps-print-buffer-with-faces (&optional filename)
    "Generate and print a PostScript image of the buffer.
- 
  Like `ps-print-buffer', but includes font, color, and underline
! information in the generated image."
    (interactive (list (ps-print-preprint current-prefix-arg)))
    (ps-generate (current-buffer) (point-min) (point-max)
--- 588,594 ----
  (defun ps-print-buffer-with-faces (&optional filename)
    "Generate and print a PostScript image of the buffer.
  Like `ps-print-buffer', but includes font, color, and underline
! information in the generated image.  This command works only if you
! are using a window system, so it has a way to determine color values."
    (interactive (list (ps-print-preprint current-prefix-arg)))
    (ps-generate (current-buffer) (point-min) (point-max)
*************** information in the generated image."
*** 616,620 ****
  (defun ps-print-region (from to &optional filename)
    "Generate and print a PostScript image of the region.
- 
  Like `ps-print-buffer', but prints just the current region."
  
--- 600,603 ----
*************** Like `ps-print-buffer', but prints just 
*** 628,634 ****
  (defun ps-print-region-with-faces (from to &optional filename)
    "Generate and print a PostScript image of the region.
- 
  Like `ps-print-region', but includes font, color, and underline
! information in the generated image."
  
    (interactive (list (point) (mark) (ps-print-preprint current-prefix-arg)))
--- 611,617 ----
  (defun ps-print-region-with-faces (from to &optional filename)
    "Generate and print a PostScript image of the region.
  Like `ps-print-region', but includes font, color, and underline
! information in the generated image.  This command works only if you
! are using a window system, so it has a way to determine color values."
  
    (interactive (list (point) (mark) (ps-print-preprint current-prefix-arg)))
*************** information in the generated image."
*** 641,645 ****
  (defun ps-spool-buffer ()
    "Generate and spool a PostScript image of the buffer.
- 
  Like `ps-print-buffer' except that the PostScript image is saved in a
  local buffer to be sent to the printer later.
--- 624,627 ----
*************** Use the command `ps-despool' to send the
*** 654,660 ****
  (defun ps-spool-buffer-with-faces ()
    "Generate and spool a PostScript image of the buffer.
- 
  Like `ps-spool-buffer', but includes font, color, and underline
! information in the generated image.
  
  Use the command `ps-despool' to send the spooled images to the printer."
--- 636,642 ----
  (defun ps-spool-buffer-with-faces ()
    "Generate and spool a PostScript image of the buffer.
  Like `ps-spool-buffer', but includes font, color, and underline
! information in the generated image.  This command works only if you
! are using a window system, so it has a way to determine color values.
  
  Use the command `ps-despool' to send the spooled images to the printer."
*************** Use the command `ps-despool' to send the
*** 668,672 ****
  (defun ps-spool-region (from to)
    "Generate a PostScript image of the region and spool locally.
- 
  Like `ps-spool-buffer', but spools just the current region.
  
--- 650,653 ----
*************** Use the command `ps-despool' to send the
*** 680,686 ****
  (defun ps-spool-region-with-faces (from to)
    "Generate a PostScript image of the region and spool locally.
- 
  Like `ps-spool-region', but includes font, color, and underline
! information in the generated image.
  
  Use the command `ps-despool' to send the spooled images to the printer."
--- 661,667 ----
  (defun ps-spool-region-with-faces (from to)
    "Generate a PostScript image of the region and spool locally.
  Like `ps-spool-region', but includes font, color, and underline
! information in the generated image.  This command works only if you
! are using a window system, so it has a way to determine color values.
  
  Use the command `ps-despool' to send the spooled images to the printer."
*************** StandardEncoding 46 82 getinterval aload
*** 1188,1194 ****
        (let* ((name (concat (buffer-name) ".ps"))
  	     (prompt (format "Save PostScript to file: (default %s) "
! 			     name)))
! 	(read-file-name prompt default-directory
! 			name nil))))
  
  ;; The following functions implement a simple list-buffering scheme so
--- 1169,1177 ----
        (let* ((name (concat (buffer-name) ".ps"))
  	     (prompt (format "Save PostScript to file: (default %s) "
! 			     name))
! 	     (res (read-file-name prompt default-directory name nil)))
! 	(if (file-directory-p res)
! 	    (expand-file-name name (file-name-as-directory res))
! 	  res))))
  
  ;; The following functions implement a simple list-buffering scheme so
*************** EndDSCPage\n"))
*** 1781,1786 ****
  		 (setq position
  		       (min property-change overlay-change))
  		 (setq face
! 		       (cond ((get-text-property from 'invisible) nil)
  			     ((get-text-property from 'face))
  			     (t 'default)))
--- 1764,1781 ----
  		 (setq position
  		       (min property-change overlay-change))
+ 		 ;; The code below is not quite correct,
+ 		 ;; because a non-nil overlay invisible property
+ 		 ;; which is inactive according to the current value
+ 		 ;; of buffer-invisibility-spec nonetheless overrides
+ 		 ;; a face text property.
  		 (setq face
! 		       (cond ((let ((prop (get-text-property from 'invisible)))
! 				;; Decide whether this invisible property
! 				;; really makes the text invisible.
! 				(if (eq buffer-invisibility-spec t)
! 				    (not (null prop))
! 				  (or (memq prop buffer-invisibility-spec)
! 				      (assq prop buffer-invisibility-spec))))
! 			      nil)
  			     ((get-text-property from 'face))
  			     (t 'default)))
*************** EndDSCPage\n"))
*** 1796,1800 ****
  		       (if (and (or overlay-invisible overlay-face)
  				(> overlay-priority face-priority))
! 			   (setq face (cond (overlay-invisible nil)
  					    ((and face overlay-face)))
  				 face-priority overlay-priority)))
--- 1791,1799 ----
  		       (if (and (or overlay-invisible overlay-face)
  				(> overlay-priority face-priority))
! 			   (setq face (cond ((if (eq buffer-invisibility-spec t)
! 						 (not (null overlay-invisible))
! 					       (or (memq overlay-invisible buffer-invisibility-spec)
! 						   (assq overlay-invisible buffer-invisibility-spec)))
! 					     nil)
  					    ((and face overlay-face)))
  				 face-priority overlay-priority)))
*************** EndDSCPage\n"))
*** 1810,1814 ****
  (defun ps-generate (buffer from to genfunc)
    (let ((from (min to from))
! 	(to (max to from)))
      (save-restriction
        (narrow-to-region from to)
--- 1809,1816 ----
  (defun ps-generate (buffer from to genfunc)
    (let ((from (min to from))
! 	(to (max to from))
! 	;; This avoids trouble if chars with read-only properties
! 	;; are copied into ps-spool-buffer.
! 	(inhibit-read-only t))
      (save-restriction
        (narrow-to-region from to)
*************** EndDSCPage\n"))
*** 1858,1862 ****
  	      (setq completed-safely t))
  
! 	  ;; Unwind form: If some bad mojo ocurred while generating
  	  ;; postscript, delete all the postscript that was generated.
  	  ;; This protects the previously spooled files from getting
--- 1860,1864 ----
  	      (setq completed-safely t))
  
! 	  ;; Unwind form: If some bad mojo occurred while generating
  	  ;; postscript, delete all the postscript that was generated.
  	  ;; This protects the previously spooled files from getting
*************** EndDSCPage\n"))
*** 1890,1896 ****
        (save-excursion
  	(set-buffer ps-spool-buffer)
! 	(apply 'call-process-region
! 	       (point-min) (point-max) ps-lpr-command nil 0 nil
! 	       ps-lpr-switches))
        (if ps-razzle-dazzle
  	  (message "Printing...done")))
--- 1892,1903 ----
        (save-excursion
  	(set-buffer ps-spool-buffer)
! 	(if (and (eq system-type 'ms-dos) (stringp dos-ps-printer))
! 	    (write-region (point-min) (point-max) dos-ps-printer t 0)
! 	  (let ((binary-process-input t)) ; for MS-DOS
! 	    (apply 'call-process-region
! 		   (point-min) (point-max) ps-lpr-command nil
! 		   (if (fboundp 'start-process) 0 nil)
! 		   nil
! 		   ps-lpr-switches))))
        (if ps-razzle-dazzle
  	  (message "Printing...done")))
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/rcompile.el emacs-19.31/lisp/rcompile.el
*** emacs-19.30/lisp/rcompile.el	Mon Oct 30 12:21:30 1995
--- emacs-19.31/lisp/rcompile.el	Sun Jan 14 02:34:30 1996
***************
*** 1,5 ****
  ;;; rcompile.el --- run a compilation on a remote machine
  
! ;;; Copyright (C) 1993, 1994 Free Software Foundation, Inc.
  
  ;; Author: Albert    <alon@milcse.rtsg.mot.com>
--- 1,5 ----
  ;;; rcompile.el --- run a compilation on a remote machine
  
! ;; Copyright (C) 1993, 1994 Free Software Foundation, Inc.
  
  ;; Author: Albert    <alon@milcse.rtsg.mot.com>
***************
*** 22,63 ****
  
  ;; 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:
  
! ;;; This package is for running a remote compilation and using emacs to parse
! ;;; the error messages. It works by rsh'ing the compilation to a remote host
! ;;; and parsing the output. If the file visited at the time remote-compile was
! ;;; called was loaded remotely (ange-ftp), the host and user name are obtained
! ;;; by the calling ange-ftp-ftp-name on the current directory. In this case the
! ;;; next-error command will also ange-ftp the files over. This is achieved
! ;;; automatically because the compilation-parse-errors function uses
! ;;; default-directory to build it's file names. If however the file visited was
! ;;; loaded locally, remote-compile prompts for a host and user and assumes the
! ;;; files mounted locally (otherwise, how was the visited file loaded).
! 
! ;;; See the user defined variables section for more info.
! 
! ;;; I was contemplating redefining "compile" to "remote-compile" automatically
! ;;; if the file visited was ange-ftp'ed but decided against it for now. If you
! ;;; feel this is a good idea, let me know and I'll consider it again.
! 
! ;;; Installation:
! 
! ;;; To use rcompile, you also need to give yourself permission to connect to
! ;;; the remote host.  You do this by putting lines like:
! 
! ;;; monopoly alon
! ;;; vme33
! ;;;
! ;;; in a file named .rhosts in the home directory (of the remote machine).
! ;;; Be careful what you put in this file. A line like:
! ;;;
! ;;; +
! ;;;
! ;;; Will allow anyone access to your account without a password. I suggest you
! ;;; read the rhosts(5) manual page before you edit this file (if you are not
! ;;; familiar with it already) 
  
  ;;; Code:
--- 22,64 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
! ;; This package is for running a remote compilation and using emacs to parse
! ;; the error messages. It works by rsh'ing the compilation to a remote host
! ;; and parsing the output. If the file visited at the time remote-compile was
! ;; called was loaded remotely (ange-ftp), the host and user name are obtained
! ;; by the calling ange-ftp-ftp-name on the current directory. In this case the
! ;; next-error command will also ange-ftp the files over. This is achieved
! ;; automatically because the compilation-parse-errors function uses
! ;; default-directory to build it's file names. If however the file visited was
! ;; loaded locally, remote-compile prompts for a host and user and assumes the
! ;; files mounted locally (otherwise, how was the visited file loaded).
! 
! ;; See the user defined variables section for more info.
! 
! ;; I was contemplating redefining "compile" to "remote-compile" automatically
! ;; if the file visited was ange-ftp'ed but decided against it for now. If you
! ;; feel this is a good idea, let me know and I'll consider it again.
! 
! ;; Installation:
! 
! ;; To use rcompile, you also need to give yourself permission to connect to
! ;; the remote host.  You do this by putting lines like:
! 
! ;; monopoly alon
! ;; vme33
! ;;
! ;; in a file named .rhosts in the home directory (of the remote machine).
! ;; Be careful what you put in this file. A line like:
! ;;
! ;; +
! ;;
! ;; Will allow anyone access to your account without a password. I suggest you
! ;; read the rhosts(5) manual page before you edit this file (if you are not
! ;; familiar with it already) 
  
  ;;; Code:
*************** nil means use the value returned by \\[u
*** 79,83 ****
  (defvar remote-compile-run-before nil
    "*Command to run before compilation.
! This can be used for setting up enviroment variables,
  since rsh does not invoke the shell as a login shell and files like .login
  \(tcsh\) and .bash_profile \(bash\) are not run.
--- 80,84 ----
  (defvar remote-compile-run-before nil
    "*Command to run before compilation.
! This can be used for setting up environment variables,
  since rsh does not invoke the shell as a login shell and files like .login
  \(tcsh\) and .bash_profile \(bash\) are not run.
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/rect.el emacs-19.31/lisp/rect.el
*** emacs-19.30/lisp/rect.el	Wed Nov  9 17:55:13 1994
--- emacs-19.31/lisp/rect.el	Sun Jan 14 02:34:30 1996
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/refbib.el emacs-19.31/lisp/refbib.el
*** emacs-19.30/lisp/refbib.el	Wed Nov  9 00:07:45 1994
--- emacs-19.31/lisp/refbib.el	Sun Jan 14 02:34:30 1996
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 31,56 ****
  ;;; Change Log:
  
! ; HISTORY
! ; 9/88, created H.Kautz
! ; modified 1/19/89, allow books with editor but no author;
! ;                   added %O ordering field;
! ;                   appended illegal multiple fields, instead of 
! ;                     discarding;
! ;                   added rule, a tech report whose %R number
! ;                     contains "ISBN" is really a book
! ;                   added rule, anything with an editor is a book
! ;                     or a proceedings
! ;                   added 'manual type, for items with institution
! ;                     but no author or editor
! ;                   fixed bug so trailing blanks are trimmed
! ;                   added 'proceedings type
! ;                   used "organization" field for proceedings
! ; modified 2/16/89, updated help messages
! ; modified 2/23/89, include capitalize stop words in r2b stop words,
! ;                   fixed problems with contractions (e.g. it's),
! ;                   caught multiple stop words in a row
! ; modified 3/1/89,  fixed capitialize-title for first words all caps
! ; modified 3/15/89, allow use of " to delimit fields
! ; modified 4/18/89, properly "quote" special characters on output
  
  ;;; Code:
--- 32,57 ----
  ;;; Change Log:
  
! ;; HISTORY
! ;; 9/88, created H.Kautz
! ;; modified 1/19/89, allow books with editor but no author;
! ;;                   added %O ordering field;
! ;;                   appended illegal multiple fields, instead of 
! ;;                     discarding;
! ;;                   added rule, a tech report whose %R number
! ;;                     contains "ISBN" is really a book
! ;;                   added rule, anything with an editor is a book
! ;;                     or a proceedings
! ;;                   added 'manual type, for items with institution
! ;;                     but no author or editor
! ;;                   fixed bug so trailing blanks are trimmed
! ;;                   added 'proceedings type
! ;;                   used "organization" field for proceedings
! ;; modified 2/16/89, updated help messages
! ;; modified 2/23/89, include capitalize stop words in r2b stop words,
! ;;                   fixed problems with contractions (e.g. it's),
! ;;                   caught multiple stop words in a row
! ;; modified 3/1/89,  fixed capitalize-title for first words all caps
! ;; modified 3/15/89, allow use of " to delimit fields
! ;; modified 4/18/89, properly "quote" special characters on output
  
  ;;; Code:
*************** in `r2b-proceedings-list' (although it w
*** 110,114 ****
  (defvar r2b-additional-stop-words
  	 "Some\\|What"
!    "Words other than the `capitialize-title-stop-words'
  which are not to be used to build the citation key")
  
--- 111,115 ----
  (defvar r2b-additional-stop-words
  	 "Some\\|What"
!    "Words other than the `capitalize-title-stop-words'
  which are not to be used to build the citation key")
  
*************** which are not to be used to build the ci
*** 125,129 ****
        "the\\|and\\|of\\|is\\|a\\|an\\|of\\|for\\|in\\|to\\|in\\|on\\|at\\|"
        "by\\|with\\|that\\|its")
!    "Words not to be capitialized in a title (unless they are the first
  word in the title)")
  
--- 126,130 ----
        "the\\|and\\|of\\|is\\|a\\|an\\|of\\|for\\|in\\|to\\|in\\|on\\|at\\|"
        "by\\|with\\|that\\|its")
!    "Words not to be capitalized in a title (unless they are the first
  word in the title)")
  
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/refer.el emacs-19.31/lisp/refer.el
*** emacs-19.30/lisp/refer.el	Sun Aug 27 03:20:10 1995
--- emacs-19.31/lisp/refer.el	Sun Jan 14 02:34:30 1996
***************
*** 20,28 ****
  
  ;; 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:
! ;;
  ;; Functions to look up references in bibliography files given lists of
  ;; keywords, similar to refer(1).  I don't use tags since tags on .bib files
--- 20,29 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
! 
  ;; Functions to look up references in bibliography files given lists of
  ;; keywords, similar to refer(1).  I don't use tags since tags on .bib files
***************
*** 61,65 ****
  
  ;;; ChangeLog:
! ;;
  ;; 01/08/89 Ashwin Ram <Ram-Ashwin@cs.yale.edu>
  ;;          Initial release.
--- 62,66 ----
  
  ;;; ChangeLog:
! 
  ;; 01/08/89 Ashwin Ram <Ram-Ashwin@cs.yale.edu>
  ;;          Initial release.
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/regi.el emacs-19.31/lisp/regi.el
*** emacs-19.30/lisp/regi.el	Tue Aug 15 08:31:17 1995
--- emacs-19.31/lisp/regi.el	Sun Jan 14 02:34:30 1996
***************
*** 23,28 ****
  
  ;; 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.
  
  ;;; Code:
--- 23,29 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Code:
*************** t       -- always produces a true outcom
*** 107,111 ****
  
  Note that NEGATE-P and CASE-FOLD-SEARCH are meaningless if PRED is one
! of these special symbols.  Only the first occurance of each symbol in
  a frame entry is used, the rest are ignored.
  
--- 108,112 ----
  
  Note that NEGATE-P and CASE-FOLD-SEARCH are meaningless if PRED is one
! of these special symbols.  Only the first occurrence of each symbol in
  a frame entry is used, the rest are ignored.
  
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/register.el emacs-19.31/lisp/register.el
*** emacs-19.30/lisp/register.el	Fri Sep  8 13:19:09 1995
--- emacs-19.31/lisp/register.el	Sun Jan 14 02:34:30 1996
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/replace.el emacs-19.31/lisp/replace.el
*** emacs-19.30/lisp/replace.el	Fri Sep  8 16:00:22 1995
--- emacs-19.31/lisp/replace.el	Wed Apr 17 13:30:14 1996
***************
*** 1,5 ****
  ;;; replace.el --- replace commands for Emacs.
  
! ;; Copyright (C) 1985, 1986, 1987, 1992, 1994 Free Software Foundation, Inc.
  
  ;; This file is part of GNU Emacs.
--- 1,5 ----
  ;;; replace.el --- replace commands for Emacs.
  
! ;; Copyright (C) 1985, 1986, 1987, 1992, 1994, 1996 Free Software Foundation, Inc.
  
  ;; This file is part of GNU Emacs.
***************
*** 16,21 ****
  
  ;; 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:
--- 16,22 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** The lines are shown in a buffer named `*
*** 330,347 ****
  It serves as a menu to find any of the occurrences in this buffer.
  \\[describe-mode] in that buffer will explain how."
!   (interactive (list (let* ((default (car regexp-history))
! 			    (input 
! 			     (read-from-minibuffer
! 			      (if default
! 				  (format "List lines matching regexp (default `%s'): " default)
! 				"List lines matching regexp: ")
! 			      nil nil nil
! 			      'regexp-history)))
! 		       (if (> (length input) 0) input
! 			 (setcar regexp-history default)))
! 		     current-prefix-arg))
!   (setq nlines (if nlines (prefix-numeric-value nlines)
! 		 list-matching-lines-default-context-lines))
!   (let ((first t)
  	(buffer (current-buffer))
  	(dir default-directory)
--- 331,352 ----
  It serves as a menu to find any of the occurrences in this buffer.
  \\[describe-mode] in that buffer will explain how."
!   (interactive
!    (list (let* ((default (car regexp-history))
! 		(input
! 		 (read-from-minibuffer
! 		  (if default
! 		      (format "List lines matching regexp (default `%s'): "
! 			      default)
! 		    "List lines matching regexp: ")
! 		  nil nil nil 'regexp-history)))
! 	   (if (string-equal input "")
! 	       default
! 	     (set-text-properties 0 (length input) nil input)
! 	     input))
! 	 current-prefix-arg))
!   (let ((nlines (if nlines
! 		    (prefix-numeric-value nlines)
! 		  list-matching-lines-default-context-lines))
! 	(first t)
  	(buffer (current-buffer))
  	(dir default-directory)
*************** It serves as a menu to find any of the o
*** 353,446 ****
  ;;;	  (setq linenum (1+ (count-lines (point-min) (point))))
  ;;;	  (setq prevpos (point)))
!     (with-output-to-temp-buffer "*Occur*"
!       (save-excursion
! 	(set-buffer standard-output)
! 	(setq default-directory dir)
! 	;; We will insert the number of lines, and "lines", later.
! 	(insert " matching ")
! 	(let ((print-escape-newlines t))
! 	  (prin1 regexp))
! 	(insert " in buffer " (buffer-name buffer) ?. ?\n)
! 	(occur-mode)
! 	(setq occur-buffer buffer)
! 	(setq occur-nlines nlines)
! 	(setq occur-pos-list ()))
!       (if (eq buffer standard-output)
! 	  (goto-char (point-max)))
!       (save-excursion
! 	(beginning-of-buffer)
! 	;; Find next match, but give up if prev match was at end of buffer.
! 	(while (and (not (= prevpos (point-max)))
! 		    (re-search-forward regexp nil t))
! 	  (goto-char (match-beginning 0))
! 	  (beginning-of-line)
! 	  (save-match-data
! 	    (setq linenum (+ linenum (count-lines prevpos (point)))))
! 	  (setq prevpos (point))
! 	  (goto-char (match-end 0))
! 	  (let* ((start (save-excursion
! 			  (goto-char (match-beginning 0))
! 			  (forward-line (if (< nlines 0) nlines (- nlines)))
! 			  (point)))
! 		 (end (save-excursion
! 			(goto-char (match-end 0))
! 			(if (> nlines 0)
! 			    (forward-line (1+ nlines))
! 			    (forward-line 1))
! 			(point)))
! 		 (tag (format "%5d" linenum))
! 		 (empty (make-string (length tag) ?\ ))
! 		 tem)
! 	    (save-excursion
! 	      (setq tem (make-marker))
! 	      (set-marker tem (point))
! 	      (set-buffer standard-output)
! 	      (setq occur-pos-list (cons tem occur-pos-list))
! 	      (or first (zerop nlines)
! 		  (insert "--------\n"))
! 	      (setq first nil)
! 	      (insert-buffer-substring buffer start end)
! 	      (set-marker final-context-start 
! 			  (- (point) (- end (match-end 0))))
! 	      (backward-char (- end start))
! 	      (setq tem nlines)
! 	      (while (> tem 0)
! 		(insert empty ?:)
! 		(forward-line 1)
! 		(setq tem (1- tem)))
! 	      (let ((this-linenum linenum))
! 		(while (< (point) final-context-start)
! 		  (if (null tag)
! 		      (setq tag (format "%5d" this-linenum)))
! 		  (insert tag ?:)
! 		  (put-text-property (save-excursion
! 				       (beginning-of-line)
! 				       (point))
! 				     (save-excursion
! 				       (end-of-line)
! 				       (point))
! 				     'mouse-face 'highlight)
! 		  (forward-line 1)
! 		  (setq tag nil)
! 		  (setq this-linenum (1+ this-linenum)))
! 		(while (<= (point) final-context-start)
! 		  (insert empty ?:)
! 		  (forward-line 1)
! 		  (setq this-linenum (1+ this-linenum))))
! 	      (while (< tem nlines)
! 		(insert empty ?:)
! 		(forward-line 1)
! 		(setq tem (1+ tem)))
  	      (goto-char (point-max)))
! 	    (forward-line 1)))
! 	(set-buffer standard-output)
! 	;; Put positions in increasing order to go with buffer.
! 	(setq occur-pos-list (nreverse occur-pos-list))
! 	(goto-char (point-min))
! 	(if (= (length occur-pos-list) 1)
! 	    (insert "1 line")
! 	  (insert (format "%d lines" (length occur-pos-list))))
! 	(if (interactive-p)
! 	    (message "%d matching lines." (length occur-pos-list)))))))
  
  ;; It would be nice to use \\[...], but there is no reasonable way
--- 358,457 ----
  ;;;	  (setq linenum (1+ (count-lines (point-min) (point))))
  ;;;	  (setq prevpos (point)))
!     (save-excursion
!       (goto-char (point-min))
!       ;; Check first whether there are any matches at all.
!       (if (not (re-search-forward regexp nil t))
! 	  (message "No matches for `%s'" regexp)
! 	;; Back up, so the search loop below will find the first match.
! 	(goto-char (match-beginning 0))
! 	(with-output-to-temp-buffer "*Occur*"
! 	  (save-excursion
! 	    (set-buffer standard-output)
! 	    (setq default-directory dir)
! 	    ;; We will insert the number of lines, and "lines", later.
! 	    (insert " matching ")
! 	    (let ((print-escape-newlines t))
! 	      (prin1 regexp))
! 	    (insert " in buffer " (buffer-name buffer) ?. ?\n)
! 	    (occur-mode)
! 	    (setq occur-buffer buffer)
! 	    (setq occur-nlines nlines)
! 	    (setq occur-pos-list ()))
! 	  (if (eq buffer standard-output)
  	      (goto-char (point-max)))
! 	  (save-excursion
! 	    ;; Find next match, but give up if prev match was at end of buffer.
! 	    (while (and (not (= prevpos (point-max)))
! 			(re-search-forward regexp nil t))
! 	      (goto-char (match-beginning 0))
! 	      (beginning-of-line)
! 	      (save-match-data
! 		(setq linenum (+ linenum (count-lines prevpos (point)))))
! 	      (setq prevpos (point))
! 	      (goto-char (match-end 0))
! 	      (let* ((start (save-excursion
! 			      (goto-char (match-beginning 0))
! 			      (forward-line (if (< nlines 0) nlines (- nlines)))
! 			      (point)))
! 		     (end (save-excursion
! 			    (goto-char (match-end 0))
! 			    (if (> nlines 0)
! 				(forward-line (1+ nlines))
! 				(forward-line 1))
! 			    (point)))
! 		     (tag (format "%5d" linenum))
! 		     (empty (make-string (length tag) ?\ ))
! 		     tem)
! 		(save-excursion
! 		  (setq tem (make-marker))
! 		  (set-marker tem (point))
! 		  (set-buffer standard-output)
! 		  (setq occur-pos-list (cons tem occur-pos-list))
! 		  (or first (zerop nlines)
! 		      (insert "--------\n"))
! 		  (setq first nil)
! 		  (insert-buffer-substring buffer start end)
! 		  (set-marker final-context-start 
! 			      (- (point) (- end (match-end 0))))
! 		  (backward-char (- end start))
! 		  (setq tem nlines)
! 		  (while (> tem 0)
! 		    (insert empty ?:)
! 		    (forward-line 1)
! 		    (setq tem (1- tem)))
! 		  (let ((this-linenum linenum))
! 		    (while (< (point) final-context-start)
! 		      (if (null tag)
! 			  (setq tag (format "%5d" this-linenum)))
! 		      (insert tag ?:)
! 		      (put-text-property (save-excursion
! 					   (beginning-of-line)
! 					   (point))
! 					 (save-excursion
! 					   (end-of-line)
! 					   (point))
! 					 'mouse-face 'highlight)
! 		      (forward-line 1)
! 		      (setq tag nil)
! 		      (setq this-linenum (1+ this-linenum)))
! 		    (while (<= (point) final-context-start)
! 		      (insert empty ?:)
! 		      (forward-line 1)
! 		      (setq this-linenum (1+ this-linenum))))
! 		  (while (< tem nlines)
! 		    (insert empty ?:)
! 		    (forward-line 1)
! 		    (setq tem (1+ tem)))
! 		  (goto-char (point-max)))
! 		(forward-line 1)))
! 	    (set-buffer standard-output)
! 	    ;; Put positions in increasing order to go with buffer.
! 	    (setq occur-pos-list (nreverse occur-pos-list))
! 	    (goto-char (point-min))
! 	    (if (= (length occur-pos-list) 1)
! 		(insert "1 line")
! 	      (insert (format "%d lines" (length occur-pos-list))))
! 	    (if (interactive-p)
! 		(message "%d matching lines." (length occur-pos-list)))))))))
  
  ;; It would be nice to use \\[...], but there is no reasonable way
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/reporter.el emacs-19.31/lisp/reporter.el
*** emacs-19.30/lisp/reporter.el	Mon Apr 10 19:25:12 1995
--- emacs-19.31/lisp/reporter.el	Mon Jan 29 17:56:54 1996
***************
*** 1,4 ****
--- 1,7 ----
  ;;; reporter.el --- customizable bug reporting of lisp programs
  
+ ;; Copyright (C) 1993 1994 Barry A. Warsaw
+ ;; Copyright (C) 1993 1994 Free Software Foundation, Inc.
+ 
  ;; Author: 1993 Barry A. Warsaw <bwarsaw@cnri.reston.va.us>
  ;; Maintainer:      bwarsaw@cnri.reston.va.us
***************
*** 8,14 ****
  ;; Keywords: bug reports lisp
  
- ;; Copyright (C) 1993 1994 Barry A. Warsaw
- ;; Copyright (C) 1993 1994 Free Software Foundation, Inc.
- 
  ;; This file is part of GNU Emacs.
  
--- 11,14 ----
***************
*** 24,32 ****
  
  ;; 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:
! ;;
  ;; Introduction
  ;; ============
--- 24,33 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
! 
  ;; Introduction
  ;; ============
***************
*** 62,66 ****
  ;; etc. This list's intended audience is elisp package authors who are
  ;; using reporter and want to stay current with releases. Here are the
! ;; relevent addresses:
  ;;
  ;; Administrivia: reporter-request@anthem.nlm.nih.gov
--- 63,67 ----
  ;; etc. This list's intended audience is elisp package authors who are
  ;; using reporter and want to stay current with releases. Here are the
! ;; relevant addresses:
  ;;
  ;; Administrivia: reporter-request@anthem.nlm.nih.gov
*************** buffer-local so you should never just `s
*** 102,106 ****
  
  (defvar reporter-dont-compact-list nil
!   "Interface variable controlling compating of list values.
  When non-nil, this must be a list of variable symbols.  When a
  variable containing a list value is formatted in the bug report mail
--- 103,107 ----
  
  (defvar reporter-dont-compact-list nil
!   "Interface variable controlling compacting of list values.
  When non-nil, this must be a list of variable symbols.  When a
  variable containing a list value is formatted in the bug report mail
*************** composed.")
*** 217,221 ****
         (end-of-line)
         (insert (symbol-name varsym) " ")))
!     (error (error))))
  
  (defun reporter-dump-state (pkgname varlist pre-hooks post-hooks)
--- 218,222 ----
         (end-of-line)
         (insert (symbol-name varsym) " ")))
!     (error (error ""))))
  
  (defun reporter-dump-state (pkgname varlist pre-hooks post-hooks)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/reposition.el emacs-19.31/lisp/reposition.el
*** emacs-19.30/lisp/reposition.el	Tue May  3 19:38:01 1994
--- emacs-19.31/lisp/reposition.el	Sun Jan 14 02:34:30 1996
***************
*** 20,39 ****
  
  ;; 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:
  
! ;;; Reposition-window makes an entire function definition or comment visible,
! ;;; or, if it is already visible, places it at the top of the window;
! ;;; additional invocations toggle the visibility of comments preceding the
! ;;; code.  For the gory details, see the documentation for reposition-window;
! ;;; rather than reading that, you may just want to play with it.
  
! ;;; This tries pretty hard to do the recentering correctly; the precise
! ;;; action depends on what the buffer looks like.  If you find a situation
! ;;; where it doesn't behave well, let me know.  This function is modeled
! ;;; after one of the same name in ZMACS, but the code is all-new and the
! ;;; behavior in some situations differs.
  
  ;;; Code:
--- 20,40 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
! ;; Reposition-window makes an entire function definition or comment visible,
! ;; or, if it is already visible, places it at the top of the window;
! ;; additional invocations toggle the visibility of comments preceding the
! ;; code.  For the gory details, see the documentation for reposition-window;
! ;; rather than reading that, you may just want to play with it.
  
! ;; This tries pretty hard to do the recentering correctly; the precise
! ;; action depends on what the buffer looks like.  If you find a situation
! ;; where it doesn't behave well, let me know.  This function is modeled
! ;; after one of the same name in ZMACS, but the code is all-new and the
! ;; behavior in some situations differs.
  
  ;;; Code:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/resume.el emacs-19.31/lisp/resume.el
*** emacs-19.30/lisp/resume.el	Thu Jun 15 16:42:54 1995
--- emacs-19.31/lisp/resume.el	Wed May  1 16:13:22 1996
***************
*** 20,88 ****
  
  ;; 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:
  
! ;; Theory: the first time you start Emacs, command line arguments are
! ;; handled normally.  Then, you suspend your emacs job.  When you want to edit
! ;; something else, you type "emacs filename" as usual, but instead of
! ;; starting a new emacs job, the old job is resumed instead, and the command
! ;; line arguments are placed in a file where the old emacs job looks for
! ;; them.
  
! ;; Stephan Gildea suggested bug fix (gildea@bbn.com).
! ;; Ideas from Michael DeCorte and other people.
  
! ;; For csh users, insert the following alias in your .cshrc file
! ;; (after removing the leading double semicolons, of course):
! ;;
! ;;# The following line could be just EMACS_CMD=emacs, but this depends on
! ;;# your site.
! ;;if (! $?EMACS_CMD) set EMACS_CMD=emacs
! ;;set JOBS_FILE=/tmp/jobs.$USER.$$
! ;;set ARGS_FILE=~/.emacs_args
! ;;set STOP_PATT='^\[[0-9]*\] *[ +-] Stopped ............ '
! ;;set SUNVIEW_CMD='emacstool -nw -f emacstool-init -f server-start'
! ;;set X_CMD=\'\''$EMACS_CMD -i -f server-start'
! ;;alias emacs \
! ;;' \\
! ;;   jobs >! "$JOBS_FILE" \\
! ;;   && grep "$STOP_PATT$EMACS_CMD" "$JOBS_FILE" >& /dev/null \\
! ;;   && echo `pwd` \!* >! "$ARGS_FILE" && ""fg %$EMACS_CMD \\
! ;;|| if (! -e ~/.emacs_server || -f ~/.emacs_server) set status=1 \\
! ;;   && emacsclient \!* \\
! ;;|| @ status=1 - $?DISPLAY && eval "$X_CMD -i \!* &" \\
! ;;|| @ status=1 - $?WINDOW_PARENT && eval "$SUNVIEW_CMD \!* &" \\
! ;;|| ""$EMACS_CMD -nw \!* \\
! ;;'
! ;;
! ;; The alias works as follows:
! ;; 1. If there is a suspended Emacs job that is a child of the
! ;; current shell, place its arguments in the ~/.emacs_args file and
! ;; resume it.
! ;; 2. Else if the ~/.emacs_server socket has been created, presume an
! ;; Emacs server is running and attempt to connect to it.  If no Emacs
! ;; server is listening on the socket, this will fail.
! ;; 3. Else if the DISPLAY environment variable is set, presume we are
! ;; running under X Windows and start a new GNU Emacs process in the
! ;; background as an X client.
! ;; 4. Else if the WINDOW_PARENT environment variable is set, presume we
! ;; are running under SunView and start an emacstool process in the
! ;; background.
! ;; 5. Else start a regular Emacs process.
! ;;
! ;; Notes:
! ;; The output of the "jobs" command is not piped directly into "grep"
! ;; because that would run the "jobs" command in a subshell.
! ;; Before resuming a suspended emacs, the current directory and all
! ;; command line arguments are placed in a file name ~/.emacs_args.
! ;; The "-nw" switch to Emacs means no windowing system.
  
! ;; Insert this in your .emacs file:
! ;;(add-hook 'suspend-hook 'resume-suspend-hook)
  
! ;; Finally, put the rest in a file named "resume.el" in a lisp library
! ;; directory.
  
  ;;; Code:
--- 20,48 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
! ;; The purpose of this library is to handle command line arguments
! ;; when you resume an existing Emacs job.
  
! ;; In order to use it, you must put this code in your .emacs file.
  
! ;; (add-hook 'suspend-hook 'resume-suspend-hook)
! ;; (add-hook 'suspend-resume-hook 'resume-process-args)
  
! ;; You can't get the benefit of this library by using the `emacs' command,
! ;; since that always starts a new Emacs job.  Instead you must use a
! ;; command called `edit' which knows how to resume an existing Emacs job
! ;; if you have one, or start a new Emacs job if you don't have one.
! 
! ;; To define the `edit' command, run the script etc/emacs.csh (if you use CSH),
! ;; or etc/emacs.bash if you use BASH.  You would normally do this in your
! ;; login script.
  
! ;; Stephan Gildea suggested bug fix (gildea@bbn.com).
! ;; Ideas from Michael DeCorte and other people.
  
  ;;; Code:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/rfc822.el emacs-19.31/lisp/rfc822.el
*** emacs-19.30/lisp/rfc822.el	Thu Mar 25 00:22:44 1993
--- emacs-19.31/lisp/rfc822.el	Sun Jan 14 02:34:30 1996
***************
*** 20,25 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/ring.el emacs-19.31/lisp/ring.el
*** emacs-19.30/lisp/ring.el	Thu Jun 23 19:07:19 1994
--- emacs-19.31/lisp/ring.el	Sun Jan 14 02:34:30 1996
***************
*** 19,40 ****
  
  ;; 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:
  
! ;;; This code defines a ring data structure. A ring is a 
! ;;;     (hd-index length . vector) 
! ;;; list. You can insert to, remove from, and rotate a ring. When the ring
! ;;; fills up, insertions cause the oldest elts to be quietly dropped.
! ;;;
! ;;; In ring-ref, 0 is the index of the newest element.  Higher indexes
! ;;; correspond to older elements until they wrap.
! ;;;
! ;;; hd-index = index of the newest item on the ring.
! ;;; length = number of ring items.
! ;;;
! ;;; These functions are used by the input history mechanism, but they can
! ;;; be used for other purposes as well.
  
  ;;; Code:
--- 19,41 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
! ;; This code defines a ring data structure. A ring is a 
! ;;     (hd-index length . vector) 
! ;; list. You can insert to, remove from, and rotate a ring. When the ring
! ;; fills up, insertions cause the oldest elts to be quietly dropped.
! ;;
! ;; In ring-ref, 0 is the index of the newest element.  Higher indexes
! ;; correspond to older elements until they wrap.
! ;;
! ;; hd-index = index of the newest item on the ring.
! ;; length = number of ring items.
! ;;
! ;; These functions are used by the input history mechanism, but they can
! ;; be used for other purposes as well.
  
  ;;; Code:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/rlogin.el emacs-19.31/lisp/rlogin.el
*** emacs-19.30/lisp/rlogin.el	Fri Oct 27 18:34:50 1995
--- emacs-19.31/lisp/rlogin.el	Tue May  7 20:52:30 1996
***************
*** 1,25 ****
  ;;; rlogin.el --- remote login interface
  
  ;; Author: Noah Friedman
  ;; Maintainer: Noah Friedman <friedman@prep.ai.mit.edu>
  ;; Keywords: unix, comm
  
! ;; Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
! ;;
! ;; This program 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.
! ;;
! ;; This program 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 this program; if not, write to: The Free Software Foundation,
! ;; Inc.; 675 Massachusetts Avenue.; Cambridge, MA 02139, USA.
  
! ;; $Id: rlogin.el,v 1.30 1995/10/27 22:34:50 friedman Exp $
  
  ;;; Commentary:
--- 1,28 ----
  ;;; rlogin.el --- remote login interface
  
+ ;; Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+ 
  ;; Author: Noah Friedman
  ;; Maintainer: Noah Friedman <friedman@prep.ai.mit.edu>
  ;; Keywords: unix, comm
  
! ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
! ;; $Id: rlogin.el,v 1.32 1996/05/08 00:52:30 friedman Exp $
  
  ;;; Commentary:
*************** variable."
*** 178,182 ****
        ;; buffer from a previous exited process.
        (set-marker (process-mark proc) (point-max))
-       (rlogin-mode)
  
        ;; comint-output-filter-functions is just like a hook, except that the
--- 181,184 ----
*************** variable."
*** 184,187 ****
--- 186,191 ----
        ;; enough for modifying it.
        (add-hook 'comint-output-filter-functions 'rlogin-carriage-filter)
+ 
+       (rlogin-mode)
  
        (make-local-variable 'rlogin-host)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/rmail.el emacs-19.31/lisp/rmail.el
*** emacs-19.30/lisp/rmail.el	Mon Nov 20 18:16:47 1995
--- emacs-19.31/lisp/rmail.el	Fri Apr 26 15:44:39 1996
***************
*** 1,5 ****
  ;;; rmail.el --- main code of "RMAIL" mail reader for Emacs.
  
! ;; Copyright (C) 1985,86,87,88,93,94,95 Free Software Foundation, Inc.
  
  ;; Maintainer: FSF
--- 1,5 ----
  ;;; rmail.el --- main code of "RMAIL" mail reader for Emacs.
  
! ;; Copyright (C) 1985,86,87,88,93,94,95,96 Free Software Foundation, Inc.
  
  ;; Maintainer: FSF
***************
*** 19,24 ****
  
  ;; 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.
  
  ;;; Code:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Code:
***************
*** 54,57 ****
--- 55,64 ----
    "If non-nil, name of program for fetching new mail.")
  
+ (defvar rmail-pop-password nil
+   "*Password to use when reading mail from a POP server, if required.")
+ 
+ (defvar rmail-pop-password-required nil
+   "*Non-nil if a password is required when reading mail using POP.")
+ 
  ;;;###autoload
  (defvar rmail-dont-reply-to-names nil "\
*************** It is useful to set this variable in the
*** 68,72 ****
  
  ;;;###autoload
! (defvar rmail-ignored-headers "^via:\\|^mail-from:\\|^origin:\\|^status:\\|^received:\\|^x400-originator:\\|^x400-recipients:\\|^x400-received:\\|^x400-mts-identifier:\\|^x400-content-type:\\|^\\(resent-\\|\\)message-id:\\|^summary-line:"
    "*Regexp to match Header fields that Rmail should normally hide.")
  
--- 75,79 ----
  
  ;;;###autoload
! (defvar rmail-ignored-headers "^via:\\|^mail-from:\\|^origin:\\|^status:\\|^received:\\|^x400-originator:\\|^x400-recipients:\\|^x400-received:\\|^x400-mts-identifier:\\|^x400-content-type:\\|^\\(resent-\\|\\)message-id:\\|^summary-line:\\|^resent-date:\\|^nntp-posting-host:"
    "*Regexp to match Header fields that Rmail should normally hide.")
  
*************** Called with region narrowed to the messa
*** 224,228 ****
       ;; The time the message was sent.
       "\\([^ \n]*\\) *"			; day of the week
!      "\\([^ ]*\\) *"			; month
       "\\([0-9]*\\) *"			; day of month
       "\\([0-9:]*\\) *"			; time of day
--- 231,235 ----
       ;; The time the message was sent.
       "\\([^ \n]*\\) *"			; day of the week
!      "\\([^ \n]*\\) *"			; month
       "\\([0-9]*\\) *"			; day of month
       "\\([0-9:]*\\) *"			; time of day
*************** have a chance to specify a file name wit
*** 283,288 ****
  If `rmail-display-summary' is non-nil, make a summary for this RMAIL file."
    (interactive (if current-prefix-arg
! 		   (list (read-file-name "Run rmail on RMAIL file: "
! 					 nil nil t))))
    (let* ((file-name (expand-file-name (or file-name-arg rmail-file-name)))
  	 (existed (get-file-buffer file-name)))
--- 290,294 ----
  If `rmail-display-summary' is non-nil, make a summary for this RMAIL file."
    (interactive (if current-prefix-arg
! 		   (list (read-file-name "Run rmail on RMAIL file: "))))
    (let* ((file-name (expand-file-name (or file-name-arg rmail-file-name)))
  	 (existed (get-file-buffer file-name)))
*************** Instead, these commands are available:
*** 649,653 ****
    (setq revert-buffer-function 'rmail-revert)
    (make-local-variable 'font-lock-defaults)
!   (setq font-lock-defaults '(rmail-font-lock-keywords t))
    (make-local-variable 'rmail-last-label)
    (make-local-variable 'rmail-last-regexp)
--- 655,663 ----
    (setq revert-buffer-function 'rmail-revert)
    (make-local-variable 'font-lock-defaults)
!   (setq font-lock-defaults
!    '(rmail-font-lock-keywords t nil nil nil
!      (font-lock-fontify-buffer-function . rmail-fontify-buffer-function)
!      (font-lock-unfontify-buffer-function . rmail-unfontify-buffer-function)
!      (font-lock-inhibit-thing-lock . (lazy-lock-mode fast-lock-mode))))
    (make-local-variable 'rmail-last-label)
    (make-local-variable 'rmail-last-regexp)
*************** original copy."
*** 785,791 ****
  	  (setq file (car files))
  	  (setq files (cdr files))
! 	  (setq ret (nconc
! 		     (rmail-find-all-files file)
! 		     ret)))
  	;; Sort here instead of in directory-files
  	;; because this list is usually much shorter.
--- 795,802 ----
  	  (setq file (car files))
  	  (setq files (cdr files))
! 	  (or (member (file-name-nondirectory start) '("." ".."))
! 	      (setq ret (nconc
! 			 (rmail-find-all-files file)
! 			 ret))))
  	;; Sort here instead of in directory-files
  	;; because this list is usually much shorter.
*************** It returns t if it got any new messages.
*** 939,946 ****
  	  ;; unless we have other unseen messages before it.
  	  (rmail-show-message (rmail-first-unseen-message))
! 	  ;; Update the displayed time, since that will clear out
! 	  ;; the flag that says you have mail.
! 	  (if (eq (process-status "display-time") 'run)
! 	      (display-time-filter display-time-process ""))
  	  t))
      ;; Don't leave the buffer screwed up if we get a disk-full error.
--- 950,954 ----
  	  ;; unless we have other unseen messages before it.
  	  (rmail-show-message (rmail-first-unseen-message))
! 	  (run-hooks 'rmail-after-get-new-mail-hook)
  	  t))
      ;; Don't leave the buffer screwed up if we get a disk-full error.
*************** It returns t if it got any new messages.
*** 983,986 ****
--- 991,1006 ----
  					     file)))))
        (cond (popmail
+ 	     (if (and rmail-pop-password-required (not rmail-pop-password))
+ 		 (setq rmail-pop-password
+ 		       (rmail-read-passwd
+ 			(format "Password for %s: "
+ 				(substring file (+ popmail 3))))))
+ 	     (if (eq system-type 'windows-nt)
+ 		 ;; cannot have "po:" in file name
+ 		 (setq tofile
+ 		       (expand-file-name
+ 			(concat ".newmail-pop-" (substring file (+ popmail 3)))
+ 			(file-name-directory
+ 			 (expand-file-name buffer-file-name)))))
  	     (message "Getting mail from post office ..."))
  	    ((and (file-exists-p tofile)
*************** It returns t if it got any new messages.
*** 1017,1024 ****
  		     (setq errors (generate-new-buffer " *rmail loss*"))
  		     (buffer-disable-undo errors)
! 		     (call-process
! 		      (or rmail-movemail-program
! 			  (expand-file-name "movemail" exec-directory))
! 		      nil errors nil file tofile)
  		     (if (not (buffer-modified-p errors))
  			 ;; No output => movemail won
--- 1037,1049 ----
  		     (setq errors (generate-new-buffer " *rmail loss*"))
  		     (buffer-disable-undo errors)
! 		     (if rmail-pop-password
! 			 (call-process
! 			  (or rmail-movemail-program
! 			      (expand-file-name "movemail" exec-directory))
! 			  nil errors nil file tofile rmail-pop-password)
! 		       (call-process
! 			(or rmail-movemail-program
! 			    (expand-file-name "movemail" exec-directory))
! 			nil errors nil file tofile))
  		     (if (not (buffer-modified-p errors))
  			 ;; No output => movemail won
*************** It returns t if it got any new messages.
*** 1034,1040 ****
  			   (delete-region (point-min) (match-end 0)))
  		       (beep t)
! 		       (message (concat "movemail: "
! 					(buffer-substring (point-min)
! 							  (point-max))))
  		       (sit-for 3)
  		       nil))
--- 1059,1065 ----
  			   (delete-region (point-min) (match-end 0)))
  		       (beep t)
! 		       (message "movemail: %s"
! 				(buffer-substring (point-min)
! 						  (point-max)))
  		       (sit-for 3)
  		       nil))
*************** It returns t if it got any new messages.
*** 1056,1059 ****
--- 1081,1107 ----
      delete-files))
  
+ (defun rmail-read-passwd (prompt &optional default)
+   "Read a password, echoing `.' for each character typed.
+ End with RET, LFD, or ESC.  DEL or C-h rubs out.  C-u kills line.
+ Optional DEFAULT is password to start with."
+   (let ((pass (if default default ""))
+ 	(c 0)
+ 	(echo-keystrokes 0)
+ 	(cursor-in-echo-area t))
+     (while (progn (message "%s%s"
+ 			   prompt
+ 			   (make-string (length pass) ?.))
+ 		  (setq c (read-char))
+ 		  (and (/= c ?\r) (/= c ?\n) (/= c ?\e)))
+       (if (= c ?\C-u)
+ 	  (setq pass "")
+ 	(if (and (/= c ?\b) (/= c ?\177))
+ 	    (setq pass (concat pass (char-to-string c)))
+ 	  (if (> (length pass) 0)
+ 	      (setq pass (substring pass 0 -1))))))
+     (message "")
+     (message nil)
+     pass))
+ 
  ;; the  rmail-break-forwarded-messages  feature is not implemented
  (defun rmail-convert-to-babyl-format ()
*************** delete all header fields *except* those 
*** 1266,1288 ****
  Otherwise, delete all header fields whose names match `rmail-ignored-headers'."
    (if (search-forward "\n\n" nil t)
!       (if (and rmail-displayed-headers (null ignored-headers))
  	  (save-restriction
  	    (narrow-to-region (point-min) (point))
! 	    (let ((buffer-read-only nil) lim)
! 	      (goto-char (point-min))
! 	      (while (save-excursion
! 		       (re-search-forward "\n[^ \t]")
! 		       (and (not (eobp))
! 			    (setq lim (1- (point)))))
! 		(if (save-excursion
! 		      (re-search-forward rmail-displayed-headers lim t))
! 		    (goto-char lim)
! 		  (delete-region (point) lim))))
! 	    (goto-char (point-min)))
! 	(or ignored-headers (setq ignored-headers rmail-ignored-headers))
! 	(save-restriction
! 	  (narrow-to-region (point-min) (point))
! 	  (let ((buffer-read-only nil))
! 	    (while (let ((case-fold-search t))
  		     (goto-char (point-min))
  		     (re-search-forward ignored-headers nil t))
--- 1314,1337 ----
  Otherwise, delete all header fields whose names match `rmail-ignored-headers'."
    (if (search-forward "\n\n" nil t)
!       (let ((case-fold-search t)
! 	    (buffer-read-only nil))
! 	(if (and rmail-displayed-headers (null ignored-headers))
! 	    (save-restriction
! 	      (narrow-to-region (point-min) (point))
! 	      (let (lim)
! 		(goto-char (point-min))
! 		(while (save-excursion
! 			 (re-search-forward "\n[^ \t]")
! 			 (and (not (eobp))
! 			      (setq lim (1- (point)))))
! 		  (if (save-excursion
! 			(re-search-forward rmail-displayed-headers lim t))
! 		      (goto-char lim)
! 		    (delete-region (point) lim))))
! 	      (goto-char (point-min)))
! 	  (or ignored-headers (setq ignored-headers rmail-ignored-headers))
  	  (save-restriction
  	    (narrow-to-region (point-min) (point))
! 	    (while (progn
  		     (goto-char (point-min))
  		     (re-search-forward ignored-headers nil t))
*************** or forward if N is negative."
*** 1728,1732 ****
  (defvar rmail-search-last-regexp nil)
  (defun rmail-search (regexp &optional n)
!   "Show message containing next match for REGEXP.
  Prefix argument gives repeat count; negative argument means search
  backwards (through earlier messages).
--- 1777,1781 ----
  (defvar rmail-search-last-regexp nil)
  (defun rmail-search (regexp &optional n)
!   "Show message containing next match for REGEXP (but not the current msg).
  Prefix argument gives repeat count; negative argument means search
  backwards (through earlier messages).
*************** Deleted messages stay in the file until 
*** 2054,2059 ****
        (prog1
  	(apply 'mail-other-frame args)
  	(modify-frame-parameters (selected-frame)
! 				 '((dedicated . t))))
      (apply 'mail-other-window args)))
  
--- 2103,2110 ----
        (prog1
  	(apply 'mail-other-frame args)
+ 	;; This is not a standard frame parameter;
+ 	;; nothing except sendmail.el looks at it.
  	(modify-frame-parameters (selected-frame)
! 				 '((mail-dedicated-frame . t))))
      (apply 'mail-other-window args)))
  
*************** see the documentation of `rmail-resend'.
*** 2253,2257 ****
  	    (forward-line 1)
  	    (insert "------- Start of forwarded message -------\n")
! 	    (insert-buffer-substring forward-buffer)
  	    (insert "------- End of forwarded message -------\n")
  	    (push-mark))))))
--- 2304,2323 ----
  	    (forward-line 1)
  	    (insert "------- Start of forwarded message -------\n")
! 	    ;; Quote lines with `- ' if they start with `-'.
! 	    (let ((beg (point)) end)
! 	      (setq end (point-marker))
! 	      (set-marker-insertion-type end t)
! 	      (insert-buffer-substring forward-buffer)
! 	      (goto-char beg)
! 	      (while (re-search-forward "^-" nil t)
! 		(beginning-of-line)
! 		(insert "- ")
! 		(forward-line 1))
! 	      (goto-char end)
! 	      (skip-chars-backward "\n")
! 	      (if (< (point) end)
! 		  (forward-char 1))
! 	      (delete-region (point) end)
! 	      (set-marker end nil))
  	    (insert "------- End of forwarded message -------\n")
  	    (push-mark))))))
*************** typically for purposes of moderating a l
*** 2282,2286 ****
  	  (insert-buffer-substring mailbuf)
  	  (goto-char (point-min))
! 	  ;; Delete any Sender field, since that's not specifyable.
  	  ; Only delete Sender fields in the actual header.
  	  (re-search-forward "^$" nil 'move)
--- 2348,2352 ----
  	  (insert-buffer-substring mailbuf)
  	  (goto-char (point-min))
! 	  ;; Delete any Sender field, since that's not specifiable.
  	  ; Only delete Sender fields in the actual header.
  	  (re-search-forward "^$" nil 'move)
*************** specifying headers which should not be c
*** 2363,2367 ****
    (interactive)
    (require 'mail-utils)
!   (let (mail-buffer bounce-start bounce-end bounce-indent resending)
      (save-excursion
        ;; Narrow down to just the quoted original message
--- 2429,2435 ----
    (interactive)
    (require 'mail-utils)
!   (let ((rmail-buffer (current-buffer))
! 	(msgnum rmail-current-message)
! 	bounce-start bounce-end bounce-indent resending)
      (save-excursion
        ;; Narrow down to just the quoted original message
*************** specifying headers which should not be c
*** 2373,2377 ****
  				     (progn (end-of-line) (point)))))
  	      (re-search-forward mail-unsent-separator)
- 	      (setq mail-buffer (current-buffer))
  	      (search-forward codestring)
  	      (or (search-forward "\n\n" nil t)
--- 2441,2444 ----
*************** specifying headers which should not be c
*** 2400,2422 ****
  	    ;; One message contained a few random lines before the old
  	    ;; message header.  The first line of the message started with
! 	    ;; two hyphens.  A blank line follows these random lines.
  	    (if (looking-at "^--")
! 		(progn
  		  (search-forward "\n\n")
! 		  (skip-chars-forward "\n")))
! 	    (setq bounce-start (point)
! 		  bounce-end (point-max))
  	    (or (search-forward "\n\n" nil t)
! 		(error "Cannot find end of header in failed message")))
! 	  (setq mail-buffer (current-buffer)))))
      ;; Start sending a new message; default header fields from the original.
      ;; Turn off the usual actions for initializing the message body
      ;; because we want to get only the text from the failure message.
!     (let (mail-signature mail-setup-hook)
!       (if (rmail-start-mail nil nil nil nil nil mail-buffer)
  	  ;; Insert original text as initial text of new draft message.
! 	  (progn
  	    (erase-buffer)
! 	    (insert-buffer-substring mail-buffer bounce-start bounce-end)
  	    (goto-char (point-min))
  	    (if bounce-indent
--- 2467,2516 ----
  	    ;; One message contained a few random lines before the old
  	    ;; message header.  The first line of the message started with
! 	    ;; two hyphens.  A blank line followed these random lines.
! 	    ;; The same line beginning with two hyphens was possibly
! 	    ;; marking the end of the message.
  	    (if (looking-at "^--")
! 		(let ((boundary (buffer-substring-no-properties
! 				 (point)
! 				 (progn (end-of-line) (point)))))
  		  (search-forward "\n\n")
! 		  (skip-chars-forward "\n")
! 		  (setq bounce-start (point))
! 		  (goto-char (point-max))
! 		  (search-backward (concat "\n\n" boundary) bounce-start t)
! 		  (setq bounce-end (point)))
! 	      (setq bounce-start (point)
! 		    bounce-end (point-max)))
  	    (or (search-forward "\n\n" nil t)
! 		(error "Cannot find end of header in failed message"))
! 	    ))))
      ;; Start sending a new message; default header fields from the original.
      ;; Turn off the usual actions for initializing the message body
      ;; because we want to get only the text from the failure message.
!     (let ((action
! 	   ;; This function will be called when the user sends the retry.
! 	   ;; It will mark the bounce message as "retried".
! 	   (function (lambda ()
! 		       (let ((msgnum rmail-send-actions-rmail-msg-number))
! 			 (save-excursion
! 			   (set-buffer rmail-send-actions-rmail-buffer)
! 			   (if msgnum
! 			       (rmail-set-attribute "retried" t msgnum)))))))
! 	  mail-signature mail-setup-hook)
!       (if (rmail-start-mail nil nil nil nil nil rmail-buffer
! 			    (list (list action)))
  	  ;; Insert original text as initial text of new draft message.
! 	  ;; Bind inhibit-read-only since the header delimiter
! 	  ;; of the previous message was probably read-only.
! 	  (let ((inhibit-read-only t))
! 	    ;; We keep the rmail buffer and message number in these 
! 	    ;; buffer-local vars in the sendmail buffer,
! 	    ;; so that the rmail-only-expunge can relocate the message number.
! 	    (make-local-variable 'rmail-send-actions-rmail-buffer)
! 	    (make-local-variable 'rmail-send-actions-rmail-msg-number)
! 	    (setq rmail-send-actions-rmail-buffer rmail-buffer)
! 	    (setq rmail-send-actions-rmail-msg-number msgnum)
  	    (erase-buffer)
! 	    (insert-buffer-substring rmail-buffer bounce-start bounce-end)
  	    (goto-char (point-min))
  	    (if bounce-indent
*************** specifying headers which should not be c
*** 2436,2440 ****
  	    (insert mail-header-separator)
  	    (mail-position-on-field (if resending "Resent-To" "To") t)
! 	    (set-buffer mail-buffer)
  	    (rmail-beginning-of-message))))))
  
--- 2530,2534 ----
  	    (insert mail-header-separator)
  	    (mail-position-on-field (if resending "Resent-To" "To") t)
! 	    (set-buffer rmail-buffer)
  	    (rmail-beginning-of-message))))))
  
*************** This has an effect only if a summary buf
*** 2479,2486 ****
  	     (progn
  	       (select-window window)
! 	       (enlarge-window (- rmail-summary-window-size
! 				  (window-height))))
  	   (select-window selected)))))
  
  ;;;; *** Rmail Specify Inbox Files ***
  
--- 2573,2616 ----
  	     (progn
  	       (select-window window)
! 	       (enlarge-window (- rmail-summary-window-size (window-height))))
  	   (select-window selected)))))
  
+ ;;;; *** Rmail Local Fontification ***
+ 
+ (defun rmail-fontify-buffer-function ()
+   ;; This function's symbol is bound to font-lock-fontify-buffer-function.
+   (make-local-hook 'rmail-show-message-hook)
+   (add-hook 'rmail-show-message-hook 'rmail-fontify-message nil t)
+   ;; If we're already showing a message, fontify it now.
+   (if rmail-current-message (rmail-fontify-message))
+   ;; Prevent Font Lock mode from kicking in.
+   (setq font-lock-fontified t))
+ 
+ (defun rmail-unfontify-buffer-function ()
+   ;; This function's symbol is bound to font-lock-fontify-unbuffer-function.
+   (let ((modified (buffer-modified-p))
+ 	(buffer-undo-list t) (inhibit-read-only t)
+ 	before-change-functions after-change-functions
+ 	buffer-file-name buffer-file-truename)
+     (save-restriction
+       (widen)
+       (remove-hook 'rmail-show-message-hook 'rmail-fontify-message t)
+       (remove-text-properties (point-min) (point-max) '(rmail-fontified nil))
+       (font-lock-default-unfontify-buffer)
+       (and (not modified) (buffer-modified-p) (set-buffer-modified-p nil)))))
+ 
+ (defun rmail-fontify-message ()
+   ;; Fontify the current message if it is not already fontified.
+   (if (text-property-any (point-min) (point-max) 'rmail-fontified nil)
+       (let ((modified (buffer-modified-p))
+ 	    (buffer-undo-list t) (inhibit-read-only t)
+ 	    before-change-functions after-change-functions
+ 	    buffer-file-name buffer-file-truename)
+ 	(save-excursion
+ 	  (save-match-data
+ 	    (add-text-properties (point-min) (point-max) '(rmail-fontified t))
+ 	    (font-lock-fontify-region (point-min) (point-max))
+ 	    (and (not modified) (buffer-modified-p) (set-buffer-modified-p nil)))))))
+ 
  ;;;; *** Rmail Specify Inbox Files ***
  
*************** buffer visiting that file."
*** 2610,2613 ****
--- 2740,2749 ----
    "Break up a digest message into its constituent messages.
  Leaves original message, deleted, before the undigestified messages."
+   t)
+ 
+ (autoload 'unforward-rmail-message "undigest"
+   "Extract a forwarded message from the containing message.
+ This puts the forwarded message into a separate rmail message
+ following the containing message."
    t)
  
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/rmailedit.el emacs-19.31/lisp/rmailedit.el
*** emacs-19.30/lisp/rmailedit.el	Tue Apr 25 17:31:09 1995
--- emacs-19.31/lisp/rmailedit.el	Wed Jan 24 19:36:15 1996
***************
*** 19,24 ****
  
  ;; 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.
  
  ;;; Code:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Code:
*************** to return to regular RMAIL:
*** 68,72 ****
  	   (eq (key-binding "\C-c\C-]") 'rmail-abort-edit))
        (message "Editing: Type C-c C-c to return to Rmail, C-c C-] to abort")
!     (message (substitute-command-keys
  	       "Editing: Type \\[rmail-cease-edit] to return to Rmail, \\[rmail-abort-edit] to abort"))))
  
--- 69,73 ----
  	   (eq (key-binding "\C-c\C-]") 'rmail-abort-edit))
        (message "Editing: Type C-c C-c to return to Rmail, C-c C-] to abort")
!     (message "%s" (substitute-command-keys
  	       "Editing: Type \\[rmail-cease-edit] to return to Rmail, \\[rmail-abort-edit] to abort"))))
  
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/rmailkwd.el emacs-19.31/lisp/rmailkwd.el
*** emacs-19.30/lisp/rmailkwd.el	Thu Apr 20 20:44:59 1995
--- emacs-19.31/lisp/rmailkwd.el	Sun Jan 14 02:34:30 1996
***************
*** 19,24 ****
  
  ;; 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.
  
  ;;; Code:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Code:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/rmailmsc.el emacs-19.31/lisp/rmailmsc.el
*** emacs-19.30/lisp/rmailmsc.el	Tue Sep  6 16:33:33 1994
--- emacs-19.31/lisp/rmailmsc.el	Sun Jan 14 02:34:30 1996
***************
*** 19,24 ****
  
  ;; 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.
  
  ;;; Code:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Code:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/rmailout.el emacs-19.31/lisp/rmailout.el
*** emacs-19.30/lisp/rmailout.el	Thu Sep 21 16:20:09 1995
--- emacs-19.31/lisp/rmailout.el	Sun Jan 14 02:34:30 1996
***************
*** 19,24 ****
  
  ;; 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.
  
  ;;; Code:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Code:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/rmailsort.el emacs-19.31/lisp/rmailsort.el
*** emacs-19.30/lisp/rmailsort.el	Tue May  3 18:46:39 1994
--- emacs-19.31/lisp/rmailsort.el	Sat Jan 20 02:41:39 1996
***************
*** 4,8 ****
  
  ;; Author: Masanobu UMEDA <umerin@mse.kyutech.ac.jp>
! ;; Version: $Header: /gd/gnu/emacs/19.0/lisp/RCS/rmailsort.el,v 1.22 1994/05/03 22:46:37 kwzh Exp $
  ;; Keywords: mail
  
--- 4,8 ----
  
  ;; Author: Masanobu UMEDA <umerin@mse.kyutech.ac.jp>
! ;; Version: $Header: /home/gd/gnu/emacs/19.0/lisp/RCS/rmailsort.el,v 1.24 1996/01/20 07:41:37 kwzh Exp $
  ;; Keywords: mail
  
***************
*** 20,29 ****
  
  ;; 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.
  
  ;;; Code:
  
  (require 'sort)
  
  (autoload 'timezone-make-date-sortable "timezone")
--- 20,33 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Code:
  
  (require 'sort)
+ 
+ ;; For rmail-select-summary
+ (require 'rmail)
  
  (autoload 'timezone-make-date-sortable "timezone")
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/rmailsum.el emacs-19.31/lisp/rmailsum.el
*** emacs-19.30/lisp/rmailsum.el	Sat Nov 11 15:37:28 1995
--- emacs-19.31/lisp/rmailsum.el	Thu Apr  4 12:00:11 1996
***************
*** 1,5 ****
  ;;; rmailsum.el --- make summary buffers for the mail reader
  
! ;; Copyright (C) 1985, 1993, 1994, 1995 Free Software Foundation, Inc.
  
  ;; Maintainer: FSF
--- 1,5 ----
  ;;; rmailsum.el --- make summary buffers for the mail reader
  
! ;; Copyright (C) 1985, 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
  
  ;; Maintainer: FSF
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 33,36 ****
--- 34,41 ----
  (require 'rmail)
  
+ ;;;###autoload
+ (defvar rmail-summary-scroll-between-messages t
+   "*Non-nil means Rmail summary scroll commands move between messages.")
+ 
  (defvar rmail-summary-font-lock-keywords
    '(("^....D.*" . font-lock-string-face)			; Deleted.
*************** nil for FUNCTION means all messages."
*** 349,355 ****
  			       (point)))))
                       len mch lo)
! 		(if (string-match (concat "^"
  					  (regexp-quote (user-login-name))
! 					  "\\($\\|@\\)")
  				  from)
  		    (save-excursion
--- 354,362 ----
  			       (point)))))
                       len mch lo)
! 		(if (string-match (concat "^\\("
  					  (regexp-quote (user-login-name))
! 					  "\\($\\|@\\)\\|"
! 					  (regexp-quote user-mail-address)
! 					  "\\>\\)")
  				  from)
  		    (save-excursion
*************** nil for FUNCTION means all messages."
*** 376,380 ****
  						    (t (- mch 14))))
  				     (min len (+ lo 25))))))))
! 	  "  #"
  	  (if (re-search-forward "^Subject:" nil t)
  	      (progn (skip-chars-forward " \t")
--- 383,405 ----
  						    (t (- mch 14))))
  				     (min len (+ lo 25))))))))
! 	  (save-excursion
! 	    (save-restriction
! 	      (widen)
! 	      (let ((beg (rmail-msgbeg msgnum))
! 		    (end (rmail-msgend msgnum))
! 		    lines)
! 		(save-excursion
! 		  (goto-char beg)
! 		  ;; Count only lines in the reformatted header,
! 		  ;; if we have reformatted it.
! 		  (search-forward "\n*** EOOH ***\n" end t)
! 		  (setq lines (count-lines (point) end)))
! 		(format (cond
! 			 ((<= lines     9) "   [%d]")
! 			 ((<= lines    99) "  [%d]")
! 			 ((<= lines   999) " [%3d]")
! 			 (t		    "[%d]"))
! 			lines))))
! 	  " #"				;The # is part of the format.
  	  (if (re-search-forward "^Subject:" nil t)
  	      (progn (skip-chars-forward " \t")
*************** Deleted messages stay in the file until 
*** 528,531 ****
--- 553,557 ----
  
  (defun rmail-summary-mark-deleted (&optional n undel)
+   ;; Since third arg is t, this only alters the summary, not the Rmail buf.
    (and n (rmail-summary-goto-msg n t t))
    (or (eobp)
*************** Commands for sorting the summary:
*** 634,638 ****
    (setq rmail-summary-redo nil)
    (make-local-variable 'revert-buffer-function)
!   (make-local-variable 'post-command-hook)
    (make-local-variable 'font-lock-defaults)
    (setq font-lock-defaults '(rmail-summary-font-lock-keywords t))
--- 660,664 ----
    (setq rmail-summary-redo nil)
    (make-local-variable 'revert-buffer-function)
!   (make-local-hook 'post-command-hook)
    (make-local-variable 'font-lock-defaults)
    (setq font-lock-defaults '(rmail-summary-font-lock-keywords t))
*************** Commands for sorting the summary:
*** 643,652 ****
  (defun rmail-summary-disable ()
    (use-local-map text-mode-map)
!   (remove-hook 'post-command-hook 'rmail-summary-rmail-update)
    (setq revert-buffer-function nil))
  
  (defun rmail-summary-enable ()
    (use-local-map rmail-summary-mode-map)
!   (add-hook 'post-command-hook 'rmail-summary-rmail-update)
    (setq revert-buffer-function 'rmail-update-summary))
  
--- 669,678 ----
  (defun rmail-summary-disable ()
    (use-local-map text-mode-map)
!   (remove-hook 'post-command-hook 'rmail-summary-rmail-update t)
    (setq revert-buffer-function nil))
  
  (defun rmail-summary-enable ()
    (use-local-map rmail-summary-mode-map)
!   (add-hook 'post-command-hook 'rmail-summary-rmail-update nil t)
    (setq revert-buffer-function 'rmail-update-summary))
  
*************** Commands for sorting the summary:
*** 875,878 ****
--- 901,912 ----
  (put 'rmail-summary-overlay 'permanent-local t)
  
+ ;; Go to message N in the summary buffer which is current,
+ ;; and in the corresponding Rmail buffer.
+ ;; If N is nil, use the message corresponding to point in the summary
+ ;; and move to that message in the Rmail buffer.
+ 
+ ;; If NOWARN, don't say anything if N is out of range.
+ ;; If SKIP-RMAIL, don't do anything to the Rmail buffer.
+ 
  (defun rmail-summary-goto-msg (&optional n nowarn skip-rmail)
    (interactive "P")
*************** Commands for sorting the summary:
*** 900,904 ****
  	  (progn (message "No following message")
  		 (goto-char (point-max))
! 		 (rmail-summary-goto-msg)))
        (goto-char (point-min))
        (if (not (re-search-forward (format "^%4d[^0-9]" n) nil t))
--- 934,938 ----
  	  (progn (message "No following message")
  		 (goto-char (point-max))
! 		 (rmail-summary-goto-msg nil nowarn skip-rmail)))
        (goto-char (point-min))
        (if (not (re-search-forward (format "^%4d[^0-9]" n) nil t))
*************** advance to the next message."
*** 965,969 ****
  			(eobp)))
  		  (select-window rmail-summary-window)))
! 	      (rmail-summary-next-msg (or dist 1))
  	    (let ((other-window-scroll-buffer rmail-buffer))
  	      (scroll-other-window dist)))
--- 999,1005 ----
  			(eobp)))
  		  (select-window rmail-summary-window)))
! 	      (if (not rmail-summary-scroll-between-messages)
! 		  (error "End of buffer")
! 		(rmail-summary-next-msg (or dist 1)))
  	    (let ((other-window-scroll-buffer rmail-buffer))
  	      (scroll-other-window dist)))
*************** advance to the previous message."
*** 990,994 ****
  		      (bobp))
  		  (select-window rmail-summary-window)))
! 	      (rmail-summary-previous-msg (or dist 1))
  	    (let ((other-window-scroll-buffer rmail-buffer))
  	      (scroll-other-window-down dist)))
--- 1026,1032 ----
  		      (bobp))
  		  (select-window rmail-summary-window)))
! 	      (if (not rmail-summary-scroll-between-messages)
! 		  (error "Beginning of buffer")
! 		(rmail-summary-previous-msg (or dist 1)))
  	    (let ((other-window-scroll-buffer rmail-buffer))
  	      (scroll-other-window-down dist)))
*************** advance to the previous message."
*** 1052,1056 ****
        (setq msg rmail-current-message))
      ;; Make sure that message is displayed.
!     (rmail-summary-goto-msg msg)))
  
  (defun rmail-summary-input (filename)
--- 1090,1095 ----
        (setq msg rmail-current-message))
      ;; Make sure that message is displayed.
!     (or (zerop msg)
! 	(rmail-summary-goto-msg msg))))
  
  (defun rmail-summary-input (filename)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/rnews.el emacs-19.31/lisp/rnews.el
*** emacs-19.30/lisp/rnews.el	Sun Aug 21 13:24:28 1994
--- emacs-19.31/lisp/rnews.el	Sun Jan 14 02:34:30 1996
***************
*** 19,24 ****
  
  ;; 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.
  
  ;;; Change Log:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Change Log:
***************
*** 44,48 ****
  ;; added news-rotate-buffer-body
  ;;	tower@prep Oct 17 1986
! ;; made messages more user friendly, cleanuped news-inews
  ;; move posting and mail code to new file rnewpost.el
  ;;	tower@prep Oct 29 1986
--- 45,49 ----
  ;; added news-rotate-buffer-body
  ;;	tower@prep Oct 17 1986
! ;; made messages more user friendly, cleaned up news-inews
  ;; move posting and mail code to new file rnewpost.el
  ;;	tower@prep Oct 29 1986
*************** Using ls was found to be too slow in a p
*** 797,801 ****
  	       (while tem
  		 (if (or (not (string-match "^[0-9]*$" (car tem)))
! 			 ;; dont get confused by directories that look like numbers
  			 (file-directory-p
  			  (concat file-directory "/" (car tem)))
--- 798,802 ----
  	       (while tem
  		 (if (or (not (string-match "^[0-9]*$" (car tem)))
! 			 ;; don't get confused by directories that look like numbers
  			 (file-directory-p
  			  (concat file-directory "/" (car tem)))
*************** Using ls was found to be too slow in a p
*** 859,863 ****
    "Resubscribe to or add a USENET news group named GROUP (a string)."
  ; @@ (completing-read ...)
! ; @@ could be based on news library file ../active (slightly facist)
  ; @@ or (expensive to compute) all directories under the news spool directory
    (interactive "sAdd news group: ")
--- 860,864 ----
    "Resubscribe to or add a USENET news group named GROUP (a string)."
  ; @@ (completing-read ...)
! ; @@ could be based on news library file ../active (slightly fascist)
  ; @@ or (expensive to compute) all directories under the news spool directory
    (interactive "sAdd news group: ")
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/rnewspost.el emacs-19.31/lisp/rnewspost.el
*** emacs-19.30/lisp/rnewspost.el	Tue May  9 00:07:12 1995
--- emacs-19.31/lisp/rnewspost.el	Wed Feb 21 15:03:23 1996
***************
*** 19,26 ****
  
  ;; 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.
  
! ;; Change Log:
  
  ;; moved posting and mail code from rnews.el
--- 19,27 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
! ;;; Change Log:
  
  ;; moved posting and mail code from rnews.el
***************
*** 47,51 ****
  ;; Mon Mar 25,1985 at 03:07:04 ads@mit-hermes.
  ;; this is done so that rnews can operate independently from rmail.el and
! ;; sendmail and dosen't have to autoload these functions.
  ;;
  ;;; >> Nuked by Mly to autoload those functions again, as the duplication of
--- 48,52 ----
  ;; Mon Mar 25,1985 at 03:07:04 ads@mit-hermes.
  ;; this is done so that rnews can operate independently from rmail.el and
! ;; sendmail and doesn't have to autoload these functions.
  ;;
  ;;; >> Nuked by Mly to autoload those functions again, as the duplication of
***************
*** 96,101 ****
        (define-key news-reply-mode-map [menu-bar news news-caesar-buffer-body]
  	'("Rot13" . news-caesar-buffer-body))
-       (define-key news-reply-mode-map [menu-bar news news-reply-signature]
- 	'("Signature" . news-reply-signature))
        (define-key news-reply-mode-map [menu-bar news news-reply-yank-original]
  	'("Yank Original" . news-reply-yank-original))
--- 97,100 ----
*************** C-c C-r  caesar rotate all letters by 13
*** 140,150 ****
    (run-hooks 'text-mode-hook 'news-reply-mode-hook))
  
! (defvar news-reply-yank-from
!   "Save `From:' field for `news-reply-yank-original'."
!   "")
! 
! (defvar news-reply-yank-message-id
!   "Save `Message-Id:' field for `news-reply-yank-original'."
!   "")
  
  (defun news-reply-yank-original (arg)
--- 139,147 ----
    (run-hooks 'text-mode-hook 'news-reply-mode-hook))
  
! (defvar news-reply-yank-from ""
!   "Save `From:' field for `news-reply-yank-original'.")
! 
! (defvar news-reply-yank-message-id ""
!   "Save `Message-Id:' field for `news-reply-yank-original'.")
  
  (defun news-reply-yank-original (arg)
*************** summary (abstract) of the message."
*** 222,226 ****
    "The inews program appends `~/.signature' automatically."
    (interactive)
!   (message "`~/.signature' will be appended automatically."))
  
  (defun news-setup (to subject in-reply-to newsgroups replybuffer)
--- 219,223 ----
    "The inews program appends `~/.signature' automatically."
    (interactive)
!   (message "Posting news will append your signature automatically."))
  
  (defun news-setup (to subject in-reply-to newsgroups replybuffer)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/rot13.el emacs-19.31/lisp/rot13.el
*** emacs-19.30/lisp/rot13.el	Thu Aug 25 19:21:32 1994
--- emacs-19.31/lisp/rot13.el	Sun Jan 14 02:34:30 1996
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/rsz-mini.el emacs-19.31/lisp/rsz-mini.el
*** emacs-19.30/lisp/rsz-mini.el	Tue Aug 22 16:41:45 1995
--- emacs-19.31/lisp/rsz-mini.el	Sun Jan 14 02:34:30 1996
***************
*** 8,12 ****
  ;; Keywords: minibuffer, window, frame, display
  ;; Status: Known to work in FSF GNU Emacs 19.26 and later.
! ;; $Id: rsz-mini.el,v 1.9 1995/08/03 17:38:07 rms Exp $
  
  ;; This file is part of GNU Emacs.
--- 8,12 ----
  ;; Keywords: minibuffer, window, frame, display
  ;; Status: Known to work in FSF GNU Emacs 19.26 and later.
! ;; $Id: rsz-mini.el,v 1.11 1996/01/14 07:34:30 erik Exp $
  
  ;; This file is part of GNU Emacs.
***************
*** 23,28 ****
  
  ;; 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:
--- 23,29 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 52,61 ****
  ;; has no mode line.
  
! ;; To use this package, put the following in your .emacs:
! ;;
! ;;     (autoload 'resize-minibuffer-mode "rsz-mini" nil t)
! ;;
! ;; Invoking the command `resize-minibuffer-mode' will then enable this mode.
! ;; Simply loading this file will also enable it.
  
  ;;; Code:
--- 53,57 ----
  ;; has no mode line.
  
! ;; To enable or disable this mode, use M-x resize-minibuffer-mode.
  
  ;;; Code:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/s-region.el emacs-19.31/lisp/s-region.el
*** emacs-19.30/lisp/s-region.el	Wed Jun  7 14:56:58 1995
--- emacs-19.31/lisp/s-region.el	Sun Jan 14 02:34:30 1996
***************
*** 1,4 ****
  ;;; s-region.el --- set region using shift key.
! ;;; Copyright (C) 1994, 1995 Free Software Foundation, Inc.
  
  ;; Author: Morten Welinder (terra@diku.dk)
--- 1,5 ----
  ;;; s-region.el --- set region using shift key.
! 
! ;; Copyright (C) 1994, 1995 Free Software Foundation, Inc.
  
  ;; Author: Morten Welinder (terra@diku.dk)
***************
*** 19,24 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 26,30 ****
  ;; Having loaded this code you can set the region by holding down the
  ;; shift key and move the cursor to the other end of the region.  The
! ;; functionallity provided by this code is similar to that provided by
  ;; the editors of Borland International's compilers for ms-dos.
  
--- 28,32 ----
  ;; Having loaded this code you can set the region by holding down the
  ;; shift key and move the cursor to the other end of the region.  The
! ;; functionality provided by this code is similar to that provided by
  ;; the editors of Borland International's compilers for ms-dos.
  
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/saveplace.el emacs-19.31/lisp/saveplace.el
*** emacs-19.30/lisp/saveplace.el	Mon Nov 20 00:37:47 1995
--- emacs-19.31/lisp/saveplace.el	Wed May  8 16:34:48 1996
***************
*** 6,10 ****
  ;; Maintainer: FSF
  ;; Created: July, 1993
- ;; Version: 1.2
  ;; Keywords: bookmarks, placeholders
  
--- 6,9 ----
***************
*** 22,27 ****
  
  ;; 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.
  
  ;; Automatically save place in files, so that visiting them later
--- 21,29 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
! 
! ;;; Commentary:
  
  ;; Automatically save place in files, so that visiting them later
***************
*** 34,37 ****
--- 36,41 ----
  ;; `save-place-version-control' stuff in it.
  
+ ;;; Code:
+ 
  ;; this is what I was using during testing:
  ;; (define-key ctl-x-map "p" 'toggle-save-place)
*************** simply put this in your `~/.emacs' file:
*** 57,61 ****
  (make-variable-buffer-local 'save-place)
  
! (defvar save-place-file "~/.emacs-places"
    "*Name of the file that records `save-place-alist' value.")
  
--- 61,65 ----
  (make-variable-buffer-local 'save-place)
  
! (defvar save-place-file (convert-standard-filename "~/.emacs-places")
    "*Name of the file that records `save-place-alist' value.")
  
*************** value of `version-control'.")
*** 70,73 ****
--- 74,80 ----
    "Non-nil means that the `save-place-file' has been loaded.")
  
+ (defvar save-place-limit nil
+   "Maximum number of entries to retain in the list; nil means no limit.")
+ 
  (defun toggle-save-place (&optional parg)
    "Toggle whether to save your place in this file between sessions.
*************** To save places automatically in all file
*** 84,94 ****
    (interactive "P")
    (if (not buffer-file-name)
!       (message 
!        (format "Buffer \"%s\" not visiting a file." (buffer-name)))
      (if (and save-place (or (not parg) (<= parg 0)))
  	(progn
! 	  (message "No place will be saved in this file.")
  	  (setq save-place nil))
!       (message "Place will be saved.")
        (setq save-place t))))
  
--- 91,100 ----
    (interactive "P")
    (if (not buffer-file-name)
!       (message "Buffer `%s' not visiting a file" (buffer-name))
      (if (and save-place (or (not parg) (<= parg 0)))
  	(progn
! 	  (message "No place will be saved in this file")
  	  (setq save-place nil))
!       (message "Place will be saved")
        (setq save-place t))))
  
*************** To save places automatically in all file
*** 108,112 ****
          (if save-place
              (setq save-place-alist
!                   (cons (cons buffer-file-name
  			      (if (not (eq major-mode 'hexl-mode))
  				  (point)
--- 114,118 ----
          (if save-place
              (setq save-place-alist
! 		  (cons (cons buffer-file-name
  			      (if (not (eq major-mode 'hexl-mode))
  				  (point)
*************** To save places automatically in all file
*** 117,121 ****
    (let ((file (expand-file-name save-place-file)))
      (save-excursion
!       (message (format "Saving places to %s..." file))
        (set-buffer (get-buffer-create " *Saved Places*"))
        (delete-region (point-min) (point-max))
--- 123,127 ----
    (let ((file (expand-file-name save-place-file)))
      (save-excursion
!       (message "Saving places to %s..." file)
        (set-buffer (get-buffer-create " *Saved Places*"))
        (delete-region (point-min) (point-max))
*************** To save places automatically in all file
*** 134,138 ****
          (write-file file)
          (kill-buffer (current-buffer))
!         (message (format "Saving places to %s... done." file))))))
  
  (defun load-save-place-alist-from-file ()
--- 140,144 ----
          (write-file file)
          (kill-buffer (current-buffer))
!         (message "Saving places to %s...done" file)))))
  
  (defun load-save-place-alist-from-file ()
*************** To save places automatically in all file
*** 145,150 ****
            (if (file-readable-p file)
                (save-excursion
!                 (message (format "Loading places from %s..."
!                                  save-place-file))
                  ;; don't want to use find-file because we have been
                  ;; adding hooks to it.
--- 151,155 ----
            (if (file-readable-p file)
                (save-excursion
!                 (message "Loading places from %s..." save-place-file)
                  ;; don't want to use find-file because we have been
                  ;; adding hooks to it.
*************** To save places automatically in all file
*** 156,161 ****
                        (car (read-from-string
                              (buffer-substring (point-min) (point-max)))))
                  (kill-buffer (current-buffer))
!                 (message (format "Loading places from %s... done." file))
                  t)
              t)
--- 161,184 ----
                        (car (read-from-string
                              (buffer-substring (point-min) (point-max)))))
+ 
+                 ;; If there is a limit, and we're over it, then we'll
+                 ;; have to truncate the end of the list:
+                 (if save-place-limit
+                     (if (<= save-place-limit 0)
+                         ;; Zero gets special cased.  I'm not thrilled
+                         ;; with this, but the loop for >= 1 is tight.
+                         (setq save-place-alist nil)
+                       ;; Else the limit is >= 1, so enforce it by
+                       ;; counting and then `setcdr'ing.
+                       (let ((s save-place-alist)
+                             (count 1))
+                         (while s
+                           (if (>= count save-place-limit)
+                               (setcdr s nil)
+                             (setq count (1+ count)))
+                           (setq s (cdr s))))))
+                   
                  (kill-buffer (current-buffer))
!                 (message "Loading places from %s...done" file)
                  t)
              t)
*************** To save places automatically in all file
*** 181,185 ****
    (let ((cell (assoc buffer-file-name save-place-alist)))
      (if cell
!         (progn
  	  (or after-find-file-from-revert-buffer
  	      (goto-char (cdr cell)))
--- 204,208 ----
    (let ((cell (assoc buffer-file-name save-place-alist)))
      (if cell
! 	(progn
  	  (or after-find-file-from-revert-buffer
  	      (goto-char (cdr cell)))
*************** To save places automatically in all file
*** 188,193 ****
  
  (defun save-place-kill-emacs-hook ()
    (save-places-to-alist)
!   (save-place-alist-to-file))
  
  (add-hook 'find-file-hooks 'save-place-find-file-hook t)
--- 211,220 ----
  
  (defun save-place-kill-emacs-hook ()
+   ;; First update the alist.  This loads the old save-place-file if nec.
    (save-places-to-alist)
!   ;; Now save the alist in the file, if we have ever loaded the file
!   ;; (including just now).
!   (if save-place-loaded
!       (save-place-alist-to-file)))
  
  (add-hook 'find-file-hooks 'save-place-find-file-hook t)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/scheme.el emacs-19.31/lisp/scheme.el
*** emacs-19.30/lisp/scheme.el	Fri Mar 31 14:23:25 1995
--- emacs-19.31/lisp/scheme.el	Sun Jan 14 02:34:30 1996
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/scribe.el emacs-19.31/lisp/scribe.el
*** emacs-19.30/lisp/scribe.el	Tue May  2 20:05:18 1995
--- emacs-19.31/lisp/scribe.el	Sun Jan 14 02:34:30 1996
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/scroll-bar.el emacs-19.31/lisp/scroll-bar.el
*** emacs-19.30/lisp/scroll-bar.el	Wed May 31 15:38:49 1995
--- emacs-19.31/lisp/scroll-bar.el	Tue May 21 10:38:52 1996
***************
*** 1,26 ****
  ;;; scroll-bar.el --- window system-independent scroll bar support.
  
! ;;; Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc.
  
  ;; Maintainer: FSF
  ;; Keywords: hardware
  
! ;;; 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.
! 
! ;;; Code:
  
  ;;; Commentary:
--- 1,25 ----
  ;;; scroll-bar.el --- window system-independent scroll bar support.
  
! ;; Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc.
  
  ;; Maintainer: FSF
  ;; Keywords: hardware
  
! ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 28,31 ****
--- 27,31 ----
  ;; Window-system-independent bindings of mouse clicks on the scroll bar.
  ;; Presently emulates the scroll-bar behavior of xterm.
+ 
  ;;; Code:
  
*************** EVENT should be a scroll bar click or dr
*** 114,117 ****
--- 114,151 ----
  	(beginning-of-line)
  	(set-window-start window (point))))))
+ 
+ (defun scroll-bar-drag-position (portion-whole)
+   "Calculate new window start for drag event."
+   (save-excursion
+     (goto-char (+ (point-min)
+ 		  (scroll-bar-scale portion-whole
+ 				    (- (point-max) (point-min)))))
+     (beginning-of-line)
+     (point)))
+ 
+ (defun scroll-bar-maybe-set-window-start (event)
+   "Set the window start according to where the scroll bar is dragged.
+ Only change window start if the new start is substantially different.
+ EVENT should be a scroll bar click or drag event."
+   (interactive "e")
+   (let* ((end-position (event-end event))
+ 	 (window (nth 0 end-position))
+ 	 (portion-whole (nth 2 end-position))
+ 	 (next-portion-whole (cons (1+ (car portion-whole))
+ 				   (cdr portion-whole)))
+ 	 portion-start
+ 	 next-portion-start
+ 	 (current-start (window-start window)))
+     (save-excursion
+       (set-buffer (window-buffer window))
+       (setq portion-start (scroll-bar-drag-position portion-whole))
+       (setq next-portion-start (max
+ 				(scroll-bar-drag-position next-portion-whole)
+ 				(1+ portion-start)))
+       (if (or (> current-start next-portion-start)
+ 	      (< current-start portion-start))
+ 	  (set-window-start window portion-start)
+ 	;; Always set window start, to ensure scroll bar position is updated.
+ 	(set-window-start window current-start)))))
  
  ;; Scroll the window to the proper position for EVENT.
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/select.el emacs-19.31/lisp/select.el
*** emacs-19.30/lisp/select.el	Wed Apr 12 22:31:21 1995
--- emacs-19.31/lisp/select.el	Sun Jan 14 02:34:30 1996
***************
*** 19,24 ****
  
  ;; 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.
  
  ;;; Code:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Code:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/sendmail.el emacs-19.31/lisp/sendmail.el
*** emacs-19.30/lisp/sendmail.el	Fri Nov 10 12:23:39 1995
--- emacs-19.31/lisp/sendmail.el	Sat May  4 23:54:00 1996
***************
*** 1,5 ****
  ;;; sendmail.el --- mail sending commands for Emacs.
  
! ;; Copyright (C) 1985, 1986, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
  
  ;; Maintainer: FSF
--- 1,5 ----
  ;;; sendmail.el --- mail sending commands for Emacs.
  
! ;; Copyright (C) 1985, 86, 92, 93, 94, 95, 96 Free Software Foundation, Inc.
  
  ;; Maintainer: FSF
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** match the variable `mail-header-separato
*** 66,69 ****
--- 67,79 ----
  *Line used to separate headers from text in messages being composed.")
  
+ ;; Set up mail-header-separator for use as a category text property.
+ (put 'mail-header-separator 'rear-nonsticky '(category))
+ ;;; This was a nice idea, for preventing accidental modification of
+ ;;; the separator.   But I found it also prevented or obstructed
+ ;;; certain deliberate operations, such as copying the separator line
+ ;;; up to the top to send myself a copy of an already sent outgoing message
+ ;;; and other things.  So I turned it off.  --rms.
+ ;;;(put 'mail-header-separator 'read-only t)
+ 
  ;;;###autoload
  (defvar mail-archive-file-name nil "\
*************** actually occur.")
*** 200,216 ****
  
  (defvar mail-font-lock-keywords
!   (let* ((cite-prefix "A-Za-z") (cite-suffix (concat cite-prefix "0-9_.@-")))
!     (list '("^To:" . font-lock-function-name-face)
! 	  '("^B?CC:\\|^Reply-To:" . font-lock-keyword-face)
! 	  '("^\\(Subject:\\)[ \t]*\\(.+\\)?"
! 	    (1 font-lock-comment-face) (2 font-lock-type-face nil t))
! 	  (list (concat "^\\(" (regexp-quote mail-header-separator) "\\)$")
! 		1 'font-lock-comment-face)
! 	  (cons (concat "^[ \t]*"
! 			"\\([" cite-prefix "]+[" cite-suffix "]*\\)?"
! 			"[>|}].*")
! 		'font-lock-reference-face)
! 	  '("^\\(X-[A-Za-z0-9-]+\\|In-reply-to\\):.*"
! 	    . font-lock-string-face)))
    "Additional expressions to highlight in Mail mode.")
  
--- 210,227 ----
  
  (defvar mail-font-lock-keywords
!   (eval-when-compile
!     (let* ((cite-prefix "A-Za-z") (cite-suffix (concat cite-prefix "0-9_.@-")))
!       (list '("^To:" . font-lock-function-name-face)
! 	    '("^B?CC:\\|^Reply-to:" . font-lock-keyword-face)
! 	    '("^\\(Subject:\\)[ \t]*\\(.+\\)?"
! 	      (1 font-lock-comment-face) (2 font-lock-type-face nil t))
! 	    '(eval cons (concat "^" (regexp-quote mail-header-separator) "$")
! 		   'font-lock-comment-face)
! 	    (cons (concat "^[ \t]*"
! 			  "\\([" cite-prefix "]+[" cite-suffix "]*\\)?"
! 			  "[>|}].*")
! 		  'font-lock-reference-face)
! 	    '("^\\(X-[A-Za-z0-9-]+\\|In-reply-to\\):.*"
! 	      . font-lock-string-face))))
    "Additional expressions to highlight in Mail mode.")
  
*************** actually occur.")
*** 218,222 ****
    "Normal hook run before sending mail, in Mail mode.")
  
! (defun sendmail-synch-aliases ()
    (let ((modtime (nth 5 (file-attributes mail-personal-alias-file))))
      (or (equal mail-alias-modtime modtime)
--- 229,233 ----
    "Normal hook run before sending mail, in Mail mode.")
  
! (defun sendmail-sync-aliases ()
    (let ((modtime (nth 5 (file-attributes mail-personal-alias-file))))
      (or (equal mail-alias-modtime modtime)
*************** actually occur.")
*** 227,231 ****
    (or mail-default-reply-to
        (setq mail-default-reply-to (getenv "REPLYTO")))
!   (sendmail-synch-aliases)
    (if (eq mail-aliases t)
        (progn
--- 238,242 ----
    (or mail-default-reply-to
        (setq mail-default-reply-to (getenv "REPLYTO")))
!   (sendmail-sync-aliases)
    (if (eq mail-aliases t)
        (progn
*************** actually occur.")
*** 264,271 ****
  	(insert "Reply-to: " mail-default-reply-to "\n"))
      (if mail-self-blind
! 	(insert "BCC: " (user-login-name) "\n"))
      (if mail-archive-file-name
  	(insert "FCC: " mail-archive-file-name "\n"))
!     (insert mail-header-separator "\n")
      ;; Insert the signature.  But remember the beginning of the message.
      (if to (setq to (point)))
--- 275,286 ----
  	(insert "Reply-to: " mail-default-reply-to "\n"))
      (if mail-self-blind
! 	(insert "BCC: " user-mail-address "\n"))
      (if mail-archive-file-name
  	(insert "FCC: " mail-archive-file-name "\n"))
!     (put-text-property (point)
! 		       (progn
! 			 (insert mail-header-separator "\n")
! 			 (1- (point)))
! 		       'category 'mail-header-separator)
      ;; Insert the signature.  But remember the beginning of the message.
      (if to (setq to (point)))
*************** C-c C-v  mail-sent-via (add a Sent-via f
*** 313,321 ****
    (make-local-variable 'paragraph-separate)
    (make-local-variable 'paragraph-start)
    (setq paragraph-start (concat (regexp-quote mail-header-separator)
! 				"$\\|[ \t]*[-_][-_][-_]+$\\|"
  				paragraph-start))
    (setq paragraph-separate (concat (regexp-quote mail-header-separator)
! 				   "$\\|[ \t]*[-_][-_][-_]+$\\|"
  				   paragraph-separate))
    (run-hooks 'text-mode-hook 'mail-mode-hook))
--- 328,340 ----
    (make-local-variable 'paragraph-separate)
    (make-local-variable 'paragraph-start)
+   ;; `-- ' precedes the signature.  `-----' appears at the start of the
+   ;; lines that delimit forwarded messages.
+   ;; Lines containing just >= 3 dashes, perhaps after whitespace,
+   ;; are also sometimes used and should be separators.
    (setq paragraph-start (concat (regexp-quote mail-header-separator)
! 				"$\\|[ \t]*[-_][-_][-_]+$\\|-- $\\|-----\\|"
  				paragraph-start))
    (setq paragraph-separate (concat (regexp-quote mail-header-separator)
! 				   "$\\|[ \t]*[-_][-_][-_]+$\\|-- $\\|-----\\|"
  				   paragraph-separate))
    (run-hooks 'text-mode-hook 'mail-mode-hook))
*************** C-c C-v  mail-sent-via (add a Sent-via f
*** 326,329 ****
--- 345,349 ----
      nil
    (setq mail-mode-map (nconc (make-sparse-keymap) text-mode-map))
+   (define-key mail-mode-map "\M-\t" 'mail-complete)
    (define-key mail-mode-map "\C-c?" 'describe-mode)
    (define-key mail-mode-map "\C-c\C-f\C-t" 'mail-to)
*************** Prefix arg means don't delete this windo
*** 406,411 ****
    (let ((newbuf (other-buffer (current-buffer))))
      (bury-buffer (current-buffer))
!     (if (and (fboundp 'frame-parameters)
! 	     (cdr (assq 'dedicated (frame-parameters)))
  	     (not (null (delq (selected-frame) (visible-frame-list)))))
  	(delete-frame (selected-frame))
--- 426,431 ----
    (let ((newbuf (other-buffer (current-buffer))))
      (bury-buffer (current-buffer))
!     (if (and (or (window-dedicated-p (frame-selected-window))
! 		 (assq 'mail-dedicated-frame (frame-parameters)))
  	     (not (null (delq (selected-frame) (visible-frame-list)))))
  	(delete-frame (selected-frame))
*************** the user from the mailer."
*** 440,444 ****
  	(or (buffer-modified-p)
  	    (y-or-n-p "Message already sent; resend? ")))
!       (progn
  	(run-hooks 'mail-send-hook)
  	(message "Sending...")
--- 460,464 ----
  	(or (buffer-modified-p)
  	    (y-or-n-p "Message already sent; resend? ")))
!       (let ((inhibit-read-only t))
  	(run-hooks 'mail-send-hook)
  	(message "Sending...")
*************** the user from the mailer."
*** 484,488 ****
  	  (backward-char 1)
  	  (setq delimline (point-marker))
! 	  (sendmail-synch-aliases)
  	  (if mail-aliases
  	      (expand-mail-aliases (point-min) delimline))
--- 504,508 ----
  	  (backward-char 1)
  	  (setq delimline (point-marker))
! 	  (sendmail-sync-aliases)
  	  (if mail-aliases
  	      (expand-mail-aliases (point-min) delimline))
*************** the user from the mailer."
*** 494,498 ****
  	  (let ((case-fold-search t))
  	    (goto-char (point-min))
! 	    (while (re-search-forward "^Resent-to:" delimline t)
  	      (setq resend-to-addresses
  		    (save-restriction
--- 514,518 ----
  	  (let ((case-fold-search t))
  	    (goto-char (point-min))
! 	    (while (re-search-forward "^Resent-\\(to\\|cc\\|bcc\\):" delimline t)
  	      (setq resend-to-addresses
  		    (save-restriction
*************** the user from the mailer."
*** 502,506 ****
  					  (point)))
  		      (append (mail-parse-comma-list)
! 			      resend-to-addresses))))
  ;;; Apparently this causes a duplicate Sender.
  ;;;	    ;; If the From is different than current user, insert Sender.
--- 522,531 ----
  					  (point)))
  		      (append (mail-parse-comma-list)
! 			      resend-to-addresses)))
! 	      ;; Delete Resent-BCC ourselves
! 	      (if (save-excursion (beginning-of-line)
! 				  (looking-at "resent-bcc"))
! 		  (delete-region (save-excursion (beginning-of-line) (point))
! 				 (save-excursion (end-of-line) (1+ (point))))))
  ;;; Apparently this causes a duplicate Sender.
  ;;;	    ;; If the From is different than current user, insert Sender.
*************** the user from the mailer."
*** 521,525 ****
  	    (goto-char (point-min))
  	    (if (re-search-forward "^Subject:\\([ \t]*\n\\)+\\b" delimline t)
! 		(replace-match ""))
  	    ;; Put the "From:" field in unless for some odd reason
  	    ;; they put one in themselves.
--- 546,554 ----
  	    (goto-char (point-min))
  	    (if (re-search-forward "^Subject:\\([ \t]*\n\\)+\\b" delimline t)
! 		(replace-match "")
! 	      ;; This one matches a Subject just before the header delimiter.
! 	      (if (and (re-search-forward "^Subject:\\([ \t]*\n\\)+" delimline t)
! 		       (= (match-end 0) delimline))
! 		  (replace-match "")))
  	    ;; Put the "From:" field in unless for some odd reason
  	    ;; they put one in themselves.
*************** However, if `mail-yank-prefix' is non-ni
*** 862,866 ****
  (defun mail-yank-original (arg)
    "Insert the message being replied to, if any (in rmail).
! Puts point before the text and mark after.
  Normally, indents each nonblank line ARG spaces (default 3).
  However, if `mail-yank-prefix' is non-nil, insert that prefix on each line.
--- 891,895 ----
  (defun mail-yank-original (arg)
    "Insert the message being replied to, if any (in rmail).
! Puts point after the text and mark before.
  Normally, indents each nonblank line ARG spaces (default 3).
  However, if `mail-yank-prefix' is non-nil, insert that prefix on each line.
*************** The seventh argument ACTIONS is a list o
*** 996,999 ****
--- 1025,1032 ----
  ;;;          t))
    (pop-to-buffer "*mail*")
+   ;; Put the auto-save file in the home dir
+   ;; to avoid any danger that it can't be written.
+   (if (file-exists-p (expand-file-name "~/"))
+       (setq default-directory (expand-file-name "~/")))
    (auto-save-mode auto-save-default)
    (mail-mode)
*************** The seventh argument ACTIONS is a list o
*** 1005,1011 ****
  	 (or (not (buffer-modified-p))
  	     (y-or-n-p "Unsent message being composed; erase it? "))
! 	 (progn (erase-buffer)
! 		(mail-setup to subject in-reply-to cc replybuffer actions)
! 		(setq initialized t)))
      (if (and buffer-auto-save-file-name
  	     (file-exists-p buffer-auto-save-file-name))
--- 1038,1045 ----
  	 (or (not (buffer-modified-p))
  	     (y-or-n-p "Unsent message being composed; erase it? "))
! 	 (let ((inhibit-read-only t))
! 	   (erase-buffer)
! 	   (mail-setup to subject in-reply-to cc replybuffer actions)
! 	   (setq initialized t)))
      (if (and buffer-auto-save-file-name
  	     (file-exists-p buffer-auto-save-file-name))
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/server.el emacs-19.31/lisp/server.el
*** emacs-19.30/lisp/server.el	Fri Nov 10 12:01:49 1995
--- emacs-19.31/lisp/server.el	Wed Feb 28 18:31:17 1996
***************
*** 21,74 ****
  
  ;; 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:
  
! ;;; This Lisp code is run in Emacs when it is to operate as
! ;;; a server for other processes.
  
! ;;; Load this library and do M-x server-edit to enable Emacs as a server.
! ;;; Emacs runs the program ../arch-lib/emacsserver as a subprocess
! ;;; for communication with clients.  If there are no client buffers to edit, 
! ;;; server-edit acts like (switch-to-buffer (other-buffer))
! 
! ;;; When some other program runs "the editor" to edit a file,
! ;;; "the editor" can be the Emacs client program ../lib-src/emacsclient.
! ;;; This program transmits the file names to Emacs through
! ;;; the server subprocess, and Emacs visits them and lets you edit them.
! 
! ;;; Note that any number of clients may dispatch files to emacs to be edited.
! 
! ;;; When you finish editing a Server buffer, again call server-edit
! ;;; to mark that buffer as done for the client and switch to the next 
! ;;; Server buffer.  When all the buffers for a client have been edited 
! ;;; and exited with server-edit, the client "editor" will return
! ;;; to the program that invoked it.  
! 
! ;;; Your editing commands and Emacs's display output go to and from
! ;;; the terminal in the usual way.  Thus, server operation is possible
! ;;; only when Emacs can talk to the terminal at the time you invoke
! ;;; the client.  This is possible in four cases:
! 
! ;;; 1. On a window system, where Emacs runs in one window and the
! ;;; program that wants to use "the editor" runs in another.
! 
! ;;; 2. On a multi-terminal system, where Emacs runs on one terminal and the
! ;;; program that wants to use "the editor" runs on another.
! 
! ;;; 3. When the program that wants to use "the editor" is running
! ;;; as a subprocess of Emacs.
! 
! ;;; 4. On a system with job control, when Emacs is suspended, the program
! ;;; that wants to use "the editor" will stop and display
! ;;; "Waiting for Emacs...".  It can then be suspended, and Emacs can be
! ;;; brought into the foreground for editing.  When done editing, Emacs is
! ;;; suspended again, and the client program is brought into the foreground.
! 
! ;;; The buffer local variable "server-buffer-clients" lists 
! ;;; the clients who are waiting for this buffer to be edited.  
! ;;; The global variable "server-clients" lists all the waiting clients,
! ;;; and which files are yet to be edited for each.
  
  ;;; Code:
--- 21,75 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
! ;; This Lisp code is run in Emacs when it is to operate as
! ;; a server for other processes.
  
! ;; Load this library and do M-x server-edit to enable Emacs as a server.
! ;; Emacs runs the program ../arch-lib/emacsserver as a subprocess
! ;; for communication with clients.  If there are no client buffers to edit, 
! ;; server-edit acts like (switch-to-buffer (other-buffer))
! 
! ;; When some other program runs "the editor" to edit a file,
! ;; "the editor" can be the Emacs client program ../lib-src/emacsclient.
! ;; This program transmits the file names to Emacs through
! ;; the server subprocess, and Emacs visits them and lets you edit them.
! 
! ;; Note that any number of clients may dispatch files to emacs to be edited.
! 
! ;; When you finish editing a Server buffer, again call server-edit
! ;; to mark that buffer as done for the client and switch to the next 
! ;; Server buffer.  When all the buffers for a client have been edited 
! ;; and exited with server-edit, the client "editor" will return
! ;; to the program that invoked it.  
! 
! ;; Your editing commands and Emacs's display output go to and from
! ;; the terminal in the usual way.  Thus, server operation is possible
! ;; only when Emacs can talk to the terminal at the time you invoke
! ;; the client.  This is possible in four cases:
! 
! ;; 1. On a window system, where Emacs runs in one window and the
! ;; program that wants to use "the editor" runs in another.
! 
! ;; 2. On a multi-terminal system, where Emacs runs on one terminal and the
! ;; program that wants to use "the editor" runs on another.
! 
! ;; 3. When the program that wants to use "the editor" is running
! ;; as a subprocess of Emacs.
! 
! ;; 4. On a system with job control, when Emacs is suspended, the program
! ;; that wants to use "the editor" will stop and display
! ;; "Waiting for Emacs...".  It can then be suspended, and Emacs can be
! ;; brought into the foreground for editing.  When done editing, Emacs is
! ;; suspended again, and the client program is brought into the foreground.
! 
! ;; The buffer local variable "server-buffer-clients" lists 
! ;; the clients who are waiting for this buffer to be edited.  
! ;; The global variable "server-clients" lists all the waiting clients,
! ;; and which files are yet to be edited for each.
  
  ;;; Code:
*************** Prefix arg means just kill any existing 
*** 191,195 ****
        (setq string (substring string (match-end 0)))	  
        (if (string-match "^Error: " request)
! 	  (message (concat "Server error: " (substring request (match-end 0))))
  	(if (string-match "^Client: " request)
  	    (progn
--- 192,196 ----
        (setq string (substring string (match-end 0)))	  
        (if (string-match "^Error: " request)
! 	  (message "Server error: %s" (substring request (match-end 0)))
  	(if (string-match "^Client: " request)
  	    (progn
*************** Prefix arg means just kill any existing 
*** 202,206 ****
--- 203,211 ----
  		  (setq request (substring request (match-end 0)))
  		  (if (string-match "\\`\\+[0-9]+\\'" arg)
+ 		      ;; ARG is a line number option.
  		      (setq lineno (read (substring arg 1)))
+ 		    ;; ARG is a file name.
+ 		    ;; Collapse multiple slashes to single slashes.
+ 		    (setq arg (command-line-normalize-file-name arg))
  		    (setq files
  			  (cons (list arg lineno)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/sgml-mode.el emacs-19.31/lisp/sgml-mode.el
*** emacs-19.30/lisp/sgml-mode.el	Thu Jun 15 16:42:55 1995
--- emacs-19.31/lisp/sgml-mode.el	Thu Feb  8 12:22:18 1996
***************
*** 1,9 ****
! ;;; sgml-mode.el --- SGML-editing mode
  
! ;; Copyright (C) 1992 Free Software Foundation, Inc.
  
  ;; Author: James Clark <jjc@clark.com>
! ;; Adapted-By: ESR
! ;; Keywords: wp
  
  ;; This file is part of GNU Emacs.
--- 1,9 ----
! ;;; sgml-mode.el --- SGML- and HTML-editing modes
  
! ;; Copyright (C) 1992, 1995, 1996 Free Software Foundation, Inc.
  
  ;; Author: James Clark <jjc@clark.com>
! ;; Adapted-By: ESR; Daniel.Pfeiffer@Informatik.START.dbp.de
! ;; Keywords: wp, hypermedia, comm, languages
  
  ;; This file is part of GNU Emacs.
***************
*** 20,42 ****
  
  ;; 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:
  
! ;; Major mode for editing the SGML document-markup language.
  
  ;;; Code:
  
! (provide 'sgml-mode)
! (require 'compile)
! 
! ;;; sgmls is a free SGML parser available from
! ;;; ftp.uu.net:pub/text-processing/sgml
! ;;; Its error messages can be parsed by next-error.
! ;;; The -s option suppresses output.
  
! (defconst sgml-validate-command
!   "sgmls -s"
    "*The command to validate an SGML document.
  The file name of current buffer file name will be appended to this,
--- 20,170 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
! ;; Configurable major mode for editing document in the SGML standard general
! ;; markup language.  As an example contains a mode for editing the derived
! ;; HTML hypertext markup language.
  
  ;;; Code:
  
! ;; As long as Emacs' syntax can't be complemented with predicates to context
! ;; sensitively confirm the syntax of characters, we have to live with this
! ;; kludgy kind of tradeoff.
! (defvar sgml-specials '(?\" ?-)
!   "List of characters that have a special meaning for sgml-mode.
! This list is used when first loading the sgml-mode library.
! The supported characters and potential disadvantages are:
! 
!   ?\\\"	Makes \" in text start a string.
!   ?'	Makes ' in text start a string.
!   ?-	Makes -- in text start a comment.
! 
! When only one of ?\\\" or ?' are included, \"'\" or '\"' as it can be found in
! DTDs, start a string.  To partially avoid this problem this also makes these
! self insert as named entities depending on `sgml-quick-keys'.  <!----> must
! contain an even multiple of two (4, 8, ...) minuses, or Emacs' syntax
! mechanism won't recognize a comment.")
! 
! (defvar sgml-quick-keys nil
!   "Use <, >, &, SPC and `sgml-specials' keys ``electrically'' when non-nil.
! This takes effect when first loading the library.")
! 
! 
! (defvar sgml-mode-map
!   (let ((map (list 'keymap (make-vector 256 nil)))
! 	(menu-map (make-sparse-keymap "SGML")))
!     (define-key map "\t" 'indent-relative-maybe)
!     (define-key map "\C-c\C-i" 'sgml-tags-invisible)
!     (define-key map "/" 'sgml-slash)
!     (define-key map "\C-c\C-n" 'sgml-name-char)
!     (define-key map "\C-c\C-t" 'sgml-tag)
!     (define-key map "\C-c\C-a" 'sgml-attributes)
!     (define-key map "\C-c\C-b" 'sgml-skip-tag-backward)
!     (define-key map [?\C-c left] 'sgml-skip-tag-backward)
!     (define-key map "\C-c\C-f" 'sgml-skip-tag-forward)
!     (define-key map [?\C-c right] 'sgml-skip-tag-forward)
!     (define-key map "\C-c\C-d" 'sgml-delete-tag)
!     (define-key map "\C-c\^?" 'sgml-delete-tag)
!     (define-key map "\C-c?" 'sgml-tag-help)
!     (define-key map "\C-c8" 'sgml-name-8bit-mode)
!     (define-key map "\C-c\C-v" 'sgml-validate)
!     (if sgml-quick-keys
! 	(progn
! 	  (define-key map "&" 'sgml-name-char)
! 	  (define-key map "<" 'sgml-tag)
! 	  (define-key map " " 'sgml-auto-attributes)
! 	  (define-key map ">" 'sgml-maybe-end-tag)
! 	  (if (memq ?\" sgml-specials)
! 	      (define-key map "\"" 'sgml-name-self))
! 	  (if (memq ?' sgml-specials)
! 	      (define-key map "'" 'sgml-name-self))))
!     (let ((c 127)
! 	  (map (nth 1 map)))
!       (while (< (setq c (1+ c)) 256)
! 	(aset map c 'sgml-maybe-name-self)))
!     (define-key map [menu-bar sgml] (cons "SGML" menu-map))
!     (define-key menu-map [sgml-validate] '("Validate" . sgml-validate))
!     (define-key menu-map [sgml-name-8bit-mode]
!       '("Toggle 8 Bit Insertion" . sgml-name-8bit-mode))
!     (define-key menu-map [sgml-tags-invisible]
!       '("Toggle Tag Visibility" . sgml-tags-invisible))
!     (define-key menu-map [sgml-tag-help]
!       '("Describe Tag" . sgml-tag-help))
!     (define-key menu-map [sgml-delete-tag]
!       '("Delete Tag" . sgml-delete-tag))
!     (define-key menu-map [sgml-skip-tag-forward]
!       '("Forward Tag" . sgml-skip-tag-forward))
!     (define-key menu-map [sgml-skip-tag-backward]
!       '("Backward Tag" . sgml-skip-tag-backward))
!     (define-key menu-map [sgml-attributes]
!       '("Insert Attributes" . sgml-attributes))
!     (define-key menu-map [sgml-tag] '("Insert Tag" . sgml-tag))
!     map)
!   "Keymap for SGML mode.  See also `sgml-specials'.")
! 
! 
! (defvar sgml-mode-syntax-table
!   (let ((table (copy-syntax-table text-mode-syntax-table)))
!     (modify-syntax-entry ?< "(>" table)
!     (modify-syntax-entry ?> ")<" table)
!     (if (memq ?- sgml-specials)
! 	(modify-syntax-entry ?- "_ 1234" table))
!     (if (memq ?\" sgml-specials)
! 	(modify-syntax-entry ?\" "\"\"" table))
!     (if (memq ?' sgml-specials)
! 	(modify-syntax-entry ?\' "\"'" table))
!     table)
!   "Syntax table used in SGML mode.  See also `sgml-specials'.")
! 
! 
! (defvar sgml-name-8bit-mode nil
!   "*When non-`nil' insert 8 bit characters with their names.")
! 
! (defvar sgml-char-names
!   [nil nil nil nil nil nil nil nil
!    nil nil nil nil nil nil nil nil
!    nil nil nil nil nil nil nil nil
!    nil nil nil nil nil nil nil nil
!    "ensp" "excl" "quot" "num" "dollar" "percnt" "amp" "apos"
!    "lpar" "rpar" "ast" "plus" "comma" "hyphen" "period" "sol"
!    nil nil nil nil nil nil nil nil
!    nil nil "colon" "semi" "lt" "eq" "gt" "quest"
!    "commat" nil nil nil nil nil nil nil
!    nil nil nil nil nil nil nil nil
!    nil nil nil nil nil nil nil nil
!    nil nil nil "lsqb" nil "rsqb" "uarr" "lowbar"
!    "lsquo" nil nil nil nil nil nil nil
!    nil nil nil nil nil nil nil nil
!    nil nil nil nil nil nil nil nil
!    nil nil nil "lcub" "verbar" "rcub" "tilde" nil
!    nil nil nil nil nil nil nil nil
!    nil nil nil nil nil nil nil nil
!    nil nil nil nil nil nil nil nil
!    nil nil nil nil nil nil nil nil
!    "nbsp" "iexcl" "cent" "pound" "curren" "yen" "brvbar" "sect"
!    "uml" "copy" "ordf" "laquo" "not" "shy" "reg" "macr"
!    "ring" "plusmn" "sup2" "sup3" "acute" "micro" "para" "middot"
!    "cedil" "sup1" "ordm" "raquo" "frac14" "half" "frac34" "iquest"
!    "Agrave" "Aacute" "Acirc" "Atilde" "Auml" "Aring" "AElig" "Ccedil"
!    "Egrave" "Eacute" "Ecirc" "Euml" "Igrave" "Iacute" "Icirc" "Iuml"
!    "ETH" "Ntilde" "Ograve" "Oacute" "Ocirc" "Otilde" "Ouml" nil
!    "Oslash" "Ugrave" "Uacute" "Ucirc" "Uuml" "Yacute" "THORN" "szlig"
!    "agrave" "aacute" "acirc" "atilde" "auml" "aring" "aelig" "ccedil"
!    "egrave" "eacute" "ecirc" "euml" "igrave" "iacute" "icirc" "iuml"
!    "eth" "ntilde" "ograve" "oacute" "ocirc" "otilde" "ouml" "divide"
!    "oslash" "ugrave" "uacute" "ucirc" "uuml" "yacute" "thorn" "yuml"]
!   "Vector of symbolic character names without `&' and `;'.")
! 
! 
! ;; sgmls is a free SGML parser available from
! ;; ftp.uu.net:pub/text-processing/sgml
! ;; Its error messages can be parsed by next-error.
! ;; The -s option suppresses output.
  
! (defvar sgml-validate-command "sgmls -s"
    "*The command to validate an SGML document.
  The file name of current buffer file name will be appended to this,
*************** separated by a space.")
*** 46,97 ****
    "The command last used to validate in this buffer.")
  
- (defvar sgml-mode-map nil "Keymap for SGML mode")
  
! (if sgml-mode-map
!     ()
!   (setq sgml-mode-map (make-sparse-keymap))
!   (define-key sgml-mode-map ">" 'sgml-close-angle)
!   (define-key sgml-mode-map "/" 'sgml-slash)
!   (define-key sgml-mode-map "\C-c\C-v" 'sgml-validate))
  
! ;;;###autoload
! (defun sgml-mode ()
!   "Major mode for editing SGML.
! Makes > display the matching <.  Makes / display matching /.
! Use \\[sgml-validate] to validate your document with an SGML parser."
!   (interactive)
    (kill-all-local-variables)
    (setq local-abbrev-table text-mode-abbrev-table)
!   (use-local-map sgml-mode-map)
!   (setq mode-name "SGML")
!   (setq major-mode 'sgml-mode)
    (make-local-variable 'paragraph-start)
-   ;; A start or end tag by itself on a line separates a paragraph.
-   ;; This is desirable because SGML discards a newline that appears
-   ;; immediately after a start tag or immediately before an end tag.
-   (setq paragraph-start
- 	"^[ \t\n]\\|\
- \\(</?\\([A-Za-z]\\([-.A-Za-z0-9= \t\n]\\|\"[^\"]*\"\\|'[^']*'\\)*\\)?>$\\)")
    (make-local-variable 'paragraph-separate)
-   (setq paragraph-separate
- 	"^[ \t\n]*$\\|\
- ^</?\\([A-Za-z]\\([-.A-Za-z0-9= \t\n]\\|\"[^\"]*\"\\|'[^']*'\\)*\\)?>$")
    (make-local-variable 'sgml-saved-validate-command)
-   (set-syntax-table text-mode-syntax-table)
    (make-local-variable 'comment-start)
-   (setq comment-start "<!-- ")
    (make-local-variable 'comment-end)
-   (setq comment-end " -->")
    (make-local-variable 'comment-indent-function)
-   (setq comment-indent-function 'sgml-comment-indent)
    (make-local-variable 'comment-start-skip)
!   ;; This will allow existing comments within declarations to be
!   ;; recognized.
!   (setq comment-start-skip "--[ \t]*")
    (run-hooks 'text-mode-hook 'sgml-mode-hook))
  
  (defun sgml-comment-indent ()
    (if (and (looking-at "--")
! 	   (not (and (eq (char-after (1- (point))) ?!)
  		     (eq (char-after (- (point) 2)) ?<))))
        (progn
--- 174,355 ----
    "The command last used to validate in this buffer.")
  
  
! ;;; I doubt that null end tags are used much for large elements,
! ;;; so use a small distance here.
! (defconst sgml-slash-distance 1000
!   "*If non-nil, is the maximum distance to search for matching /.")
  
! (defconst sgml-start-tag-regex
!   "<[A-Za-z]\\([-.A-Za-z0-9= \n\t]\\|\"[^\"]*\"\\|'[^']*'\\)*"
!   "Regular expression that matches a non-empty start tag.
! Any terminating > or / is not matched.")
! 
! 
! (defvar sgml-font-lock-keywords
!   '(("<\\([!?][a-z0-9]+\\)" 1 font-lock-keyword-face)
!     ("<\\(/?[a-z0-9]+\\)" 1 font-lock-function-name-face)
!     ("[&%][-.A-Za-z0-9]+;?" . font-lock-variable-name-face))
!   "*Rules for highlighting SGML code.  See also `sgml-tag-face-alist'.")
! 
! ;; internal
! (defvar sgml-font-lock-keywords-1 ())
! 
! (defvar sgml-face-tag-alist ()
!   "Alist of face and tag name for facemenu.")
! 
! (defvar sgml-tag-face-alist ()
!   "Tag names and face or list of faces to fontify with when invisible.
! When `font-lock-maximum-decoration' is 1 this is always used for fontifying.
! When more these are fontified together with `sgml-font-lock-keywords'.")
! 
! 
! (defvar sgml-display-text ()
!   "Tag names as lowercase symbols, and display string when invisible.")
! 
! ;; internal
! (defvar sgml-tags-invisible nil)
! 
! 
! (defvar sgml-tag-alist
!   '(("![" ("ignore" t) ("include" t))
!     ("!attlist")
!     ("!doctype")
!     ("!element")
!     ("!entity"))
!   "*Alist of tag names for completing read and insertion rules.
! This alist is made up as
! 
!   ((\"tag\" . TAGRULE)
!    ...)
! 
! TAGRULE is a list of optionally `t' (no endtag) or `\\n' (separate endtag by
! newlines) or a skeleton with `nil', `t' or `\\n' in place of the interactor
! followed by an ATTRIBUTERULE (for an always present attribute) or an
! attribute alist.
! 
! The attribute alist is made up as
! 
!   ((\"attribute\" . ATTRIBUTERULE)
!    ...)
! 
! ATTRIBUTERULE is a list of optionally `t' (no value when no input) followed by
! an optional alist of possible values.")
! 
! (defvar sgml-tag-help
!   '(("!" . "Empty declaration for comment")
!     ("![" . "Embed declarations with parser directive")
!     ("!attlist" . "Tag attributes declaration")
!     ("!doctype" . "Document type (DTD) declaration")
!     ("!element" . "Tag declaration")
!     ("!entity" . "Entity (macro) declaration"))
!   "*Alist of tag name and short description.")
! 
! 
! ;; put read-only last to enable setting this even when read-only enabled
! (or (get 'sgml-tag 'invisible)
!     (setplist 'sgml-tag
! 	      (append '(invisible t
! 			rear-nonsticky t
! 			point-entered sgml-point-entered
! 			read-only t)
! 		      (symbol-plist 'sgml-tag))))
! 
! 
! 
! (defun sgml-mode-common (sgml-tag-face-alist sgml-display-text)
!   "Common code for setting up `sgml-mode' and derived modes.
! SGML-TAG-FACE-ALIST is used for calculating `sgml-font-lock-keywords-1'.
! SGML-DISPLAY-TEXT sets up alternate text for when tags are invisible (see
! varables of same name)."
    (kill-all-local-variables)
    (setq local-abbrev-table text-mode-abbrev-table)
!   (set-syntax-table sgml-mode-syntax-table)
!   (make-local-variable 'indent-line-function)
    (make-local-variable 'paragraph-start)
    (make-local-variable 'paragraph-separate)
    (make-local-variable 'sgml-saved-validate-command)
    (make-local-variable 'comment-start)
    (make-local-variable 'comment-end)
    (make-local-variable 'comment-indent-function)
    (make-local-variable 'comment-start-skip)
!   (make-local-variable 'comment-indent-function)
!   (make-local-variable 'sgml-tags-invisible)
!   (make-local-variable 'skeleton-transformation)
!   (make-local-variable 'skeleton-further-elements)
!   (make-local-variable 'skeleton-end-hook)
!   (make-local-variable 'font-lock-defaults)
!   (make-local-variable 'sgml-font-lock-keywords-1)
!   (make-local-variable 'facemenu-add-face-function)
!   (make-local-variable 'facemenu-end-add-face)
!   ;;(make-local-variable 'facemenu-remove-face-function)
!   (and sgml-tag-face-alist
!        (not (assq 1 sgml-tag-face-alist))
!        (nconc sgml-tag-face-alist
! 	      `((1 (,(concat "<\\("
! 			     (mapconcat 'car sgml-tag-face-alist "\\|")
! 			     "\\)\\([ \t].+\\)?>\\(.+\\)</\\1>")
! 		    3 (cdr (assoc (match-string 1) ',sgml-tag-face-alist)))))))
!   (setq indent-line-function 'indent-relative-maybe
! 	;; A start or end tag by itself on a line separates a paragraph.
! 	;; This is desirable because SGML discards a newline that appears
! 	;; immediately after a start tag or immediately before an end tag.
! 	paragraph-start "^[ \t\n]\\|\
! \\(</?\\([A-Za-z]\\([-.A-Za-z0-9= \t\n]\\|\"[^\"]*\"\\|'[^']*'\\)*\\)?>$\\)"
! 	paragraph-separate "^[ \t\n]*$\\|\
! ^</?\\([A-Za-z]\\([-.A-Za-z0-9= \t\n]\\|\"[^\"]*\"\\|'[^']*'\\)*\\)?>$"
! 	comment-start "<!-- "
! 	comment-end " -->"
! 	comment-indent-function 'sgml-comment-indent
! 	;; This will allow existing comments within declarations to be
! 	;; recognized.
! 	comment-start-skip "--[ \t]*"
! 	skeleton-transformation 'identity
! 	skeleton-further-elements '((completion-ignore-case t))
! 	skeleton-end-hook (lambda ()
! 			    (or (eolp)
! 				(not (or (eq v2 '\n)
! 					 (eq (car-safe v2) '\n)))
! 				(newline-and-indent)))
! 	sgml-font-lock-keywords-1 (cdr (assq 1 sgml-tag-face-alist))
! 	font-lock-defaults '((sgml-font-lock-keywords
! 			      sgml-font-lock-keywords-1)
! 			     nil
! 			     t)
! 	facemenu-add-face-function
! 	  (lambda (face end)
! 	    (if (setq face (cdr (assq face sgml-face-tag-alist)))
! 		(progn
! 		  (setq facemenu-end-add-face (concat "</" face ">"))
! 		  (concat "<" face ">"))
! 	      (error "Face not configured for %s mode." mode-name))))
!   (while sgml-display-text
!     (put (car (car sgml-display-text)) 'before-string
! 	 (cdr (car sgml-display-text)))
!     (setq sgml-display-text (cdr sgml-display-text)))
    (run-hooks 'text-mode-hook 'sgml-mode-hook))
  
+ 
+ ;;;###autoload
+ (defun sgml-mode (&optional function)
+   "Major mode for editing SGML documents.
+ Makes > match <.  Makes / blink matching /.
+ Keys <, &, SPC within <>, \" and ' can be electric depending on
+ `sgml-quick-keys'.
+ 
+ Do \\[describe-variable] sgml- SPC to see available variables.
+ 
+ Use \\[sgml-validate] to validate your document with an SGML parser.
+ \\{sgml-mode-map}"
+   (interactive)
+   (sgml-mode-common sgml-tag-face-alist sgml-display-text)
+   (use-local-map sgml-mode-map)
+   (setq mode-name "SGML"
+ 	major-mode 'sgml-mode))
+ 
+ 
+ 
  (defun sgml-comment-indent ()
    (if (and (looking-at "--")
! 	   (not (and (eq (preceding-char) ?!)
  		     (eq (char-after (- (point) 2)) ?<))))
        (progn
*************** Use \\[sgml-validate] to validate your d
*** 100,197 ****
      0))
  
- (defconst sgml-start-tag-regex
-   "<[A-Za-z]\\([-.A-Za-z0-9= \n\t]\\|\"[^\"]*\"\\|'[^']*'\\)*"
-   "Regular expression that matches a non-empty start tag.
- Any terminating > or / is not matched.")
- 
- (defvar sgml-mode-markup-syntax-table nil
-   "Syntax table used for scanning SGML markup.")
  
- (if sgml-mode-markup-syntax-table
-     ()
-   (setq sgml-mode-markup-syntax-table (make-syntax-table))
-   (modify-syntax-entry ?< "(>" sgml-mode-markup-syntax-table)
-   (modify-syntax-entry ?> ")<" sgml-mode-markup-syntax-table)
-   (modify-syntax-entry ?- "_ 1234" sgml-mode-markup-syntax-table)
-   (modify-syntax-entry ?\' "\"" sgml-mode-markup-syntax-table))
- 
- (defconst sgml-angle-distance 4000
-   "*If non-nil, is the maximum distance to search for matching <.")
- 
- (defun sgml-close-angle (arg)
-   "Insert > and display matching <."
-   (interactive "p")
-   (insert-char ?> arg)
-   (if (> arg 0)
-       (let ((oldpos (point))
- 	    (blinkpos))
- 	(save-excursion
- 	  (save-restriction
- 	    (if sgml-angle-distance
- 		(narrow-to-region (max (point-min)
- 				       (- (point) sgml-angle-distance))
- 				  oldpos))
- 	    ;; See if it's the end of a marked section.
- 	    (and (> (- (point) (point-min)) 3)
- 		 (eq (char-after (- (point) 2)) ?\])
- 		 (eq (char-after (- (point) 3)) ?\])
- 		 (re-search-backward "<!\\[\\(-?[A-Za-z0-9. \t\n&;]\\|\
- --\\([^-]\\|-[^-]\\)*--\\)*\\["
- 				     (point-min)
- 				     t)
- 		 (let ((msspos (point)))
- 		   (if (and (search-forward "]]>" oldpos t)
- 			    (eq (point) oldpos))
- 		       (setq blinkpos msspos))))
- 	    ;; This handles cases where the > ends one of the following:
- 	    ;; markup declaration starting with <! (possibly including a
- 	    ;; declaration subset); start tag; end tag; SGML declaration.
- 	    (if blinkpos
- 		()
- 	      (goto-char oldpos)
- 	      (condition-case ()
- 		  (let ((oldtable (syntax-table))
- 			(parse-sexp-ignore-comments t))
- 		    (unwind-protect
- 			(progn
- 			  (set-syntax-table sgml-mode-markup-syntax-table)
- 			  (setq blinkpos (scan-sexps oldpos -1)))
- 		      (set-syntax-table oldtable)))
- 		(error nil))
- 	      (and blinkpos
- 		   (goto-char blinkpos)
- 		   (or
- 		    ;; Check that it's a valid delimiter in context.
- 		    (not (looking-at
- 			  "<\\(\\?\\|/?[A-Za-z>]\\|!\\([[A-Za-z]\\|--\\)\\)"))
- 		    ;; Check that it's not a net-enabling start tag
- 		    ;; nor an unclosed start-tag.
- 		    (looking-at (concat sgml-start-tag-regex "[/<]"))
- 		    ;; Nor an unclosed end-tag.
- 		    (looking-at "</[A-Za-z][-.A-Za-z0-9]*[ \t]*<"))
- 		   (setq blinkpos nil)))
- 	    (if blinkpos
- 		()
- 	      ;; See if it's the end of a processing instruction.
- 	      (goto-char oldpos)
- 	      (if (search-backward "<?" (point-min) t)
- 		  (let ((pipos (point)))
- 		    (if (and (search-forward ">" oldpos t)
- 			     (eq (point) oldpos))
- 			(setq blinkpos pipos))))))
- 	  (if blinkpos
- 	      (progn
- 		(goto-char blinkpos)
- 		(if (pos-visible-in-window-p)
- 		    (sit-for 1)
- 		  (message "Matches %s"
- 			   (buffer-substring blinkpos
- 					     (progn (end-of-line)
- 						    (point)))))))))))
- 
- ;;; I doubt that null end tags are used much for large elements,
- ;;; so use a small distance here.
- (defconst sgml-slash-distance 1000
-   "*If non-nil, is the maximum distance to search for matching /.")
  
  (defun sgml-slash (arg)
--- 358,362 ----
*************** start tag, and the second / is the corre
*** 238,241 ****
--- 403,699 ----
  					     (1+ blinkpos))))))))))
  
+ 
+ (defun sgml-name-char (&optional char)
+   "Insert a symbolic character name according to `sgml-char-names'.
+ 8 bit chars may be inserted with the meta key as in M-SPC for no break space,
+ or M-- for a soft hyphen."
+   (interactive "*")
+   (insert ?&)
+   (or char
+       (setq char (read-quoted-char)))
+   (delete-backward-char 1)
+   (insert char)
+   (undo-boundary)
+   (delete-backward-char 1)
+   (insert ?&
+ 	  (or (aref sgml-char-names char)
+ 	      (format "#%d" char))
+ 	  ?\;))
+ 
+ 
+ (defun sgml-name-self ()
+   "Insert a symbolic character name according to `sgml-char-names'."
+   (interactive "*")
+   (sgml-name-char last-command-char))
+ 
+ 
+ (defun sgml-maybe-name-self ()
+   "Insert a symbolic character name according to `sgml-char-names'."
+   (interactive "*")
+   (if sgml-name-8bit-mode
+       (sgml-name-char last-command-char)
+     (self-insert-command 1)))
+ 
+ 
+ (defun sgml-name-8bit-mode ()
+   "Toggle insertion of 8 bit characters."
+   (interactive)
+   (setq sgml-name-8bit-mode (not sgml-name-8bit-mode)))
+ 
+ 
+ 
+ (define-skeleton sgml-tag
+   "Insert a tag you are prompted for, optionally with attributes.
+ Completion and configuration is according to `sgml-tag-alist'.
+ If you like tags and attributes in uppercase set `skeleton-transformation'
+ to `upcase'."
+   (funcall skeleton-transformation
+ 	   (completing-read "Tag: " sgml-tag-alist))
+   ?< (setq v1 (eval str)) |
+   (("") -1 '(undo-boundary) "&lt;") |
+   (("") '(setq v2 (sgml-attributes v1 t)) ?>
+    (if (string= "![" v1)
+        (prog1 '(("") " [ " _ " ]]")
+ 	 (backward-char))
+      (if (or (eq v2 t)
+ 	     (string-match "^[/!?]" v1))
+ 	 ()
+        (if (symbolp v2)
+ 	   '(("") v2 _ v2 "</" v1 ?>)
+ 	 (if (eq (car v2) t)
+ 	     (cons '("") (cdr v2))
+ 	   (append '(("") (car v2))
+ 		   (cdr v2)
+ 		   '(resume: (car v2) _ "</" v1 ?>))))))))
+ 
+ (autoload 'skeleton-read "skeleton")
+ 
+ (defun sgml-attributes (alist &optional quiet)
+   "When at toplevel of a tag, interactively insert attributes."
+   (interactive (list (save-excursion (sgml-beginning-of-tag t))))
+   (or (stringp alist) (error "Wrong context for adding attribute"))
+   (if alist
+       (let ((completion-ignore-case t)
+ 	    car attribute i)
+ 	(setq alist (cdr (assoc (downcase alist) sgml-tag-alist)))
+ 	(if (or (symbolp (car alist))
+ 		(symbolp (car (car alist))))
+ 	    (setq car (car alist)
+ 		  alist (cdr alist)))
+ 	(or quiet
+ 	    (message "No attributes configured."))
+ 	(if (stringp (car alist))
+ 	    (progn
+ 	      (insert (if (eq (preceding-char) ? ) "" ? ) (car alist))
+ 	      (sgml-value alist))
+ 	  (setq i (length alist))
+ 	  (while (> i 0)
+ 	    (insert ? )
+ 	    (insert (funcall skeleton-transformation
+ 			     (setq attribute
+ 				   (skeleton-read '(completing-read
+ 						    "[Attribute]: "
+ 						    alist)))))
+ 	    (if (string= "" attribute)
+ 		(setq i 0)
+ 	      (sgml-value (assoc attribute alist))
+ 	      (setq i (1- i))))
+ 	  (if (eq (preceding-char) ? )
+ 	      (delete-backward-char 1)))
+ 	car)))
+ 
+ (defun sgml-auto-attributes (arg)
+   "Self insert, except, when at top level of tag, prompt for attributes.
+ With prefix ARG only self insert."
+   (interactive "*P")
+   (let ((point (point))
+ 	tag)
+     (if (or arg
+ 	    (not sgml-tag-alist)	; no message when nothing configured
+ 	    (symbolp (setq tag (save-excursion (sgml-beginning-of-tag t))))
+ 	    (eq (aref tag 0) ?/))
+ 	(self-insert-command (prefix-numeric-value arg))
+       (sgml-attributes tag)
+       (setq last-command-char ? )
+       (or (> (point) point)
+ 	  (self-insert-command 1)))))
+ 
+ 
+ (defun sgml-tag-help (&optional tag)
+   "Display description of optional TAG or tag at point."
+   (interactive)
+   (or tag
+       (save-excursion
+ 	(if (eq (following-char) ?<)
+ 	    (forward-char))
+ 	(setq tag (sgml-beginning-of-tag))))
+   (or (stringp tag)
+       (error "No tag selected"))
+   (setq tag (downcase tag))
+   (message "%s"
+ 	   (or (cdr (assoc tag sgml-tag-help))
+ 	       (and (eq (aref tag 0) ?/)
+ 		    (cdr (assoc (substring tag 1) sgml-tag-help)))
+ 	       "No description available")))
+ 
+ 
+ (defun sgml-maybe-end-tag ()
+   "Name self unless in position to end a tag."
+   (interactive)
+   (or (condition-case nil
+ 	  (save-excursion (up-list -1))
+ 	(error
+ 	 (sgml-name-self)
+ 	 t))
+       (condition-case nil
+ 	  (progn
+ 	    (save-excursion (up-list 1))
+ 	    (sgml-name-self))
+ 	(error (self-insert-command 1)))))
+ 
+ 
+ (defun sgml-skip-tag-backward (arg)
+   "Skip to beginning of tag or matching opening tag if present.
+ With prefix ARG, repeat that many times."
+   (interactive "p")
+   (while (>= arg 1)
+     (search-backward "<" nil t)
+     (if (looking-at "</\\([^ \n\t>]+\\)")
+ 	;; end tag, skip any nested pairs
+ 	(let ((case-fold-search t)
+ 	      (re (concat "</?" (regexp-quote (match-string 1)))))
+ 	  (while (and (re-search-backward re nil t)
+ 		      (eq (char-after (1+ (point))) ?/))
+ 	    (forward-char 1)
+ 	    (sgml-skip-tag-backward 1))))
+     (setq arg (1- arg))))
+ 
+ (defun sgml-skip-tag-forward (arg &optional return)
+   "Skip to end of tag or matching closing tag if present.
+ With prefix ARG, repeat that many times.
+ Return t iff after a closing tag."
+   (interactive "p")
+   (setq return t)
+   (while (>= arg 1)
+     (skip-chars-forward "^<>")
+     (if (eq (following-char) ?>)
+ 	(up-list -1))
+     (if (looking-at "<\\([^/ \n\t>]+\\)")
+ 	;; start tag, skip any nested same pairs _and_ closing tag
+ 	(let ((case-fold-search t)
+ 	      (re (concat "</?" (regexp-quote (match-string 1))))
+ 	      point close)
+ 	  (forward-list 1)
+ 	  (setq point (point))
+ 	  (while (and (re-search-forward re nil t)
+ 		      (not (setq close
+ 				 (eq (char-after (1+ (match-beginning 0))) ?/)))
+ 		      (not (up-list -1))
+ 		      (sgml-skip-tag-forward 1))
+ 	    (setq close nil))
+ 	  (if close
+ 	      (up-list 1)
+ 	    (goto-char point)
+ 	    (setq return)))
+       (forward-list 1))
+     (setq arg (1- arg)))
+   return)
+ 
+ (defun sgml-delete-tag (arg)
+   "Delete tag on or after cursor, and matching closing or opening tag.
+ With prefix ARG, repeat that many times."
+   (interactive "p")
+   (while (>= arg 1)
+     (save-excursion
+       (let* (close open)
+ 	(if (looking-at "[ \t\n]*<")
+ 	    ;; just before tag
+ 	    (if (eq (char-after (match-end 0)) ?/)
+ 		;; closing tag
+ 		(progn
+ 		  (setq close (point))
+ 		  (goto-char (match-end 0))))
+ 	  ;; on tag?
+ 	  (or (save-excursion (setq close (sgml-beginning-of-tag)
+ 				    close (and (stringp close)
+ 					       (eq (aref close 0) ?/)
+ 					       (point))))
+ 	      ;; not on closing tag
+ 	      (let ((point (point)))
+ 		(sgml-skip-tag-backward 1)
+ 		(if (or (not (eq (following-char) ?<))
+ 			(save-excursion
+ 			  (forward-list 1)
+ 			  (<= (point) point)))
+ 		    (error "Not on or before tag")))))
+ 	(if close
+ 	    (progn
+ 	      (sgml-skip-tag-backward 1)
+ 	      (setq open (point))
+ 	      (goto-char close)
+ 	      (kill-sexp 1))
+ 	  (setq open (point))
+ 	  (sgml-skip-tag-forward 1)
+ 	  (backward-list)
+ 	  (forward-char)
+ 	  (if (eq (aref (sgml-beginning-of-tag) 0) ?/)
+ 	      (kill-sexp 1)))
+ 	(goto-char open)
+ 	(kill-sexp 1)))
+     (setq arg (1- arg))))
+ 
+ 
+ 
+ (defun sgml-tags-invisible (arg)
+   "Toggle visibility of existing tags."
+   (interactive "P")
+   (let ((modified (buffer-modified-p))
+ 	(inhibit-read-only t)
+ 	(point (point-min))
+ 	symbol)
+     (save-excursion
+       (goto-char point)
+       (if (setq sgml-tags-invisible
+ 		(if arg
+ 		    (>= (prefix-numeric-value arg) 0)
+ 		  (not sgml-tags-invisible)))
+ 	  (while (re-search-forward "<\\([!/?A-Za-z][-A-Za-z0-9]*\\)"
+ 				    nil t)
+ 	    (setq symbol (intern-soft (downcase (match-string 1))))
+ 	    (goto-char (match-beginning 0))
+ 	    (and (get symbol 'before-string)
+ 		 (not (overlays-at (point)))
+ 		 (overlay-put (make-overlay (point)
+ 					    (match-beginning 1))
+ 			      'category symbol))
+ 	    (put-text-property (setq point (point)) (forward-list)
+ 			       'intangible (point))			
+ 	    (put-text-property point (point)
+ 			       'category 'sgml-tag))
+ 	(while (< (setq point (next-overlay-change point)) (point-max))
+ 	  (delete-overlay (car (overlays-at point))))
+ 	(remove-text-properties (point-min) (point-max)
+ 				'(category sgml-tag intangible t))))
+     (set-buffer-modified-p modified)
+     (run-hooks 'sgml-tags-invisible-hook)
+     (message "")))
+ 
+ (defun sgml-point-entered (x y)
+   ;; Show preceding or following hidden tag, depending of cursor direction.
+   (let ((inhibit-point-motion-hooks t))
+     (save-excursion
+       (message "Invisible tag: %s"
+ 	       (buffer-substring
+ 		(point)
+ 		(if (or (and (> x y)
+ 			     (not (eq (following-char) ?<)))
+ 			(and (< x y)
+ 			     (eq (preceding-char) ?>)))
+ 		    (backward-list)
+ 		  (forward-list)))))))
+ 
+ 
+ (autoload 'compile-internal "compile")
+ 
  (defun sgml-validate (command)
    "Validate an SGML document.
*************** and move to the line in the SGML documen
*** 254,257 ****
--- 712,1228 ----
    (setq sgml-saved-validate-command command)
    (compile-internal command "No more errors"))
+ 
+ 
+ (defun sgml-beginning-of-tag (&optional top-level)
+   "Skip to beginning of tag and return its name.
+ Else `t'."
+   (or (if top-level
+ 	  (condition-case nil
+ 	      (up-list -1)
+ 	    (error t))
+ 	(>= (point)
+ 	    (if (search-backward "<" nil t)
+ 		(save-excursion
+ 		  (forward-list)
+ 		  (point))
+ 	      0)))
+       (if (looking-at "<[!?/]?[[A-Za-z][A-Za-z0-9]*")
+ 	  (buffer-substring-no-properties
+ 	   (1+ (point))
+ 	   (match-end 0))
+ 	t)))
+ 
+ (defun sgml-value (alist)
+   (setq alist (cdr alist))
+   (if (stringp (car alist))
+       (insert "=\"" (car alist) ?\")
+     (if (eq (car alist) t)
+ 	(if (cdr alist)
+ 	    (progn
+ 	      (insert "=\"")
+ 	      (setq alist (skeleton-read '(completing-read
+ 					   "[Value]: " (cdr alist))))
+ 	      (if (string< "" alist)
+ 		  (insert (funcall skeleton-transformation alist) ?\")
+ 		(delete-backward-char 2))))
+       (insert "=\"")
+       (if alist
+ 	  (insert (funcall skeleton-transformation
+ 			   (skeleton-read '(completing-read "Value: " alist)))))
+       (insert ?\"))))
+ 
+ (provide 'sgml-mode)
+ 
+ (defvar html-quick-keys sgml-quick-keys
+   "Use C-c X combinations for quick insertion of frequent tags when non-nil.
+ This defaults to `sgml-quick-keys'.
+ This takes effect when first loading the library.")
+ 
+ (defvar html-mode-map
+   (let ((map (nconc (make-sparse-keymap) sgml-mode-map))
+ 	(menu-map (make-sparse-keymap "HTML")))
+     (define-key map "\C-c6" 'html-headline)
+     (define-key map "\C-c5" 'html-headline)
+     (define-key map "\C-c4" 'html-headline)
+     (define-key map "\C-c3" 'html-headline)
+     (define-key map "\C-c2" 'html-headline)
+     (define-key map "\C-c1" 'html-headline)
+     (define-key map "\C-c\r" 'html-paragraph)
+     (define-key map "\C-c\n" 'html-line)
+     (define-key map "\C-c\C-c-" 'html-horizontal-rule)
+     (define-key map "\C-c\C-co" 'html-list)
+     (define-key map "\C-c\C-cu" 'html-list)
+     (define-key map "\C-c\C-cr" 'html-radio-buttons)
+     (define-key map "\C-c\C-cc" 'html-checkboxes)
+     (define-key map "\C-c\C-cl" 'html-list-item)
+     (define-key map "\C-c\C-ch" 'html-href-anchor)
+     (define-key map "\C-c\C-cn" 'html-name-anchor)
+     (define-key map "\C-c\C-ci" 'html-image)
+     (if html-quick-keys
+ 	(progn
+ 	  (define-key map "\C-c-" 'html-horizontal-rule)
+ 	  (define-key map "\C-co" 'html-list)
+ 	  (define-key map "\C-cu" 'html-list)
+ 	  (define-key map "\C-cr" 'html-radio-buttons)
+ 	  (define-key map "\C-cc" 'html-checkboxes)
+ 	  (define-key map "\C-cl" 'html-list-item)
+ 	  (define-key map "\C-ch" 'html-href-anchor)
+ 	  (define-key map "\C-cn" 'html-name-anchor)
+ 	  (define-key map "\C-ci" 'html-image)))
+     (define-key map "\C-c\C-s" 'html-autoview-mode)
+     (define-key map "\C-c\C-v" 'browse-url-of-buffer)
+     (define-key map [menu-bar html] (cons "HTML" menu-map))
+     (define-key menu-map [html-autoview-mode]
+       '("Toggle Autoviewing" . html-autoview-mode))
+     (define-key menu-map [browse-url-of-buffer]
+       '("View Buffer Contents" . browse-url-of-buffer))
+     (define-key menu-map [nil] '("--"))
+     ;;(define-key menu-map "6" '("Heading 6" . html-headline))
+     ;;(define-key menu-map "5" '("Heading 5" . html-headline))
+     ;;(define-key menu-map "4" '("Heading 4" . html-headline))
+     (define-key menu-map "3" '("Heading 3" . html-headline))
+     (define-key menu-map "2" '("Heading 2" . html-headline))
+     (define-key menu-map "1" '("Heading 1" . html-headline))
+     (define-key menu-map "l" '("Radio Buttons" . html-radio-buttons))
+     (define-key menu-map "c" '("Checkboxes" . html-checkboxes))
+     (define-key menu-map "l" '("List Item" . html-list-item))
+     (define-key menu-map "u" '("Unordered List" . html-list))
+     (define-key menu-map "o" '("Ordered List" . html-list))
+     (define-key menu-map "-" '("Horizontal Rule" . html-horizontal-rule))
+     (define-key menu-map "\n" '("Line Break" . html-line))
+     (define-key menu-map "\r" '("Paragraph" . html-paragraph))
+     (define-key menu-map "i" '("Image" . html-image))
+     (define-key menu-map "h" '("Href Anchor" . html-href-anchor))
+     (define-key menu-map "n" '("Name Anchor" . html-name-anchor))
+     map)
+   "Keymap for commands for use in HTML mode.")
+ 
+ 
+ (defvar html-face-tag-alist
+   '((bold . "b")
+     (italic . "i")
+     (underline . "u")
+     (modeline . "rev"))
+   "Value of `sgml-face-tag-alist' for HTML mode.")
+ 
+ (defvar html-tag-face-alist
+   '(("b" . bold)
+     ("big" . bold)
+     ("blink" . highlight)
+     ("cite" . italic)
+     ("em" . italic)
+     ("h1" bold underline)
+     ("h2" bold-italic underline)
+     ("h3" italic underline)
+     ("h4" . underline)
+     ("h5" . underline)
+     ("h6" . underline)
+     ("i" . italic)
+     ("rev"  . modeline)
+     ("s" . underline)
+     ("small" . default)
+     ("strong" . bold)
+     ("title" bold underline)
+     ("tt" . default)
+     ("u" . underline)
+     ("var" . italic))
+   "Value of `sgml-tag-face-alist' for HTML mode.")
+ 
+ 
+ (defvar html-display-text
+   '((img . "[/]")
+     (hr . "----------")
+     (li . "o "))
+   "Value of `sgml-display-text' for HTML mode.")
+ 
+ 
+ ; should code exactly HTML 3 here when that is finished
+ (defvar html-tag-alist
+   (let* ((1-9 '(("8") ("9")
+ 		("1") ("2") ("3") ("4") ("5") ("6") ("7")))
+ 	 (align '(("align" ("left") ("center") ("right"))))
+ 	 (valign '(("top") ("middle") ("bottom") ("baseline")))
+ 	 (rel '(("next") ("previous") ("parent") ("subdocument") ("made")))
+ 	 (href '("href" ("ftp:") ("file:") ("finger:") ("gopher:") ("http:")
+ 		 ("mailto:") ("news:") ("rlogin:") ("telnet:") ("tn3270:")
+ 		 ("wais:") ("/cgi-bin/")))
+ 	 (name '("name"))
+ 	 (link `(,href
+ 		 ("rel" ,@rel)
+ 		 ("rev" ,@rel)
+ 		 ("title")))
+ 	 (list '((nil \n
+ 		      ( "List item: "
+ 			"<li>" str \n))
+ 		 ("type" ("A") ("a") ("I") ("i") ("1"))))
+ 	 (cell `(t
+ 		 ,align
+ 		 ("valign" ,@valign)
+ 		 ("colspan" ,@1-9)
+ 		 ("rowspan" ,@1-9)
+ 		 ("nowrap" t))))
+     ;; put ,-expressions first, else byte-compile chokes (as of V19.29)
+     ;; and like this it's more efficient anyway
+     `(("a" ,name ,@link)
+       ("base" t ,@href)
+       ("dir" ,@list)
+       ("font" "size" ("-1") ("+1") ("-2") ("+2") ,@(cdr (cdr 1-9)))
+       ("form" (\n _ \n "<input type=\"submit\" value=\"\">")
+        ("action" ,@(cdr href)) ("method" ("get") ("post")))
+       ("h1" ,@align)
+       ("h2" ,@align)
+       ("h3" ,@align)
+       ("h4" ,@align)
+       ("h5" ,@align)
+       ("h6" ,@align)
+       ("hr" t ("size" ,@1-9) ("width") ("noshade" t) ,@align)
+       ("img" t ("align" ,@valign ("texttop") ("absmiddle") ("absbottom"))
+        ("src") ("alt") ("width" "1") ("height" "1")
+        ("border" "1") ("vspace" "1") ("hspace" "1") ("ismap" t))
+       ("input" t ("size" ,@1-9) ("maxlength" ,@1-9) ("checked" t) ,name
+        ("type" ("text") ("password") ("checkbox") ("radio")
+ 	("submit") ("reset"))
+        ("value"))
+       ("link" t ,@link)
+       ("menu" ,@list)
+       ("ol" ,@list)
+       ("p" t ,@align)
+       ("select" (nil \n
+ 		     ("Text: "
+ 		      "<option>" str \n))
+        ,name ("size" ,@1-9) ("multiple" t))
+       ("table" (nil \n
+ 		    ((completing-read "Cell kind: " '(("td") ("th"))
+ 				      nil t "t")
+ 		     "<tr><" str ?> _ \n))
+        ("border" t ,@1-9) ("width" "10") ("cellpadding"))
+       ("td" ,@cell)
+       ("textarea" ,name ("rows" ,@1-9) ("cols" ,@1-9))
+       ("th" ,@cell)
+       ("ul" ,@list)
+ 
+       ,@sgml-tag-alist
+ 
+       ("abbrev")
+       ("acronym")
+       ("address")
+       ("array" (nil \n
+ 		    ("Item: " "<item>" str \n))
+        "align")
+       ("au")
+       ("b")
+       ("big")
+       ("blink")
+       ("blockquote" \n)
+       ("body" \n ("background" ".gif") ("bgcolor" "#") ("text" "#")
+        ("link" "#") ("alink" "#") ("vlink" "#"))
+       ("box" (nil _ "<over>" _))
+       ("br" t ("clear" ("left") ("right")))
+       ("caption" ("valign" ("top") ("bottom")))
+       ("center" \n)
+       ("cite")
+       ("code" \n)
+       ("dd" t)
+       ("del")
+       ("dfn")
+       ("dl" (nil \n
+ 		 ( "Term: "
+ 		   "<dt>" str "<dd>" _ \n)))
+       ("dt" (t _ "<dd>"))
+       ("em")
+       ("fn" "id" "fn")
+       ("head" \n)
+       ("html" (\n
+ 	       "<head>\n"
+ 	       "<title>" (setq str (read-input "Title: ")) "</title>\n"
+ 	       "<body>\n<h1>" str "</h1>\n" _
+ 	       "\n<address>\n<a href=\"mailto:"
+ 	       user-mail-address
+ 	       "\">" (user-full-name) "</a>\n</address>"))
+       ("i")
+       ("ins")
+       ("isindex" t ("action") ("prompt"))
+       ("kbd")
+       ("lang")
+       ("li" t)
+       ("math" \n)
+       ("nobr")
+       ("option" t ("value") ("label") ("selected" t))
+       ("over" t)
+       ("person")
+       ("pre" \n)
+       ("q")
+       ("rev")
+       ("s")
+       ("samp")
+       ("small")
+       ("strong")
+       ("sub")
+       ("sup")
+       ("title")
+       ("tr" t)
+       ("tt")
+       ("u")
+       ("var")
+       ("wbr" t)))
+   "*Value of `sgml-tag-alist' for HTML mode.")
+ 
+ (defvar html-tag-help
+   `(,@sgml-tag-help
+     ("a" . "Anchor of point or link elsewhere")
+     ("abbrev" . "?")
+     ("acronym" . "?")
+     ("address" . "Formatted mail address")
+     ("array" . "Math array")
+     ("au" . "?")
+     ("b" . "Bold face")
+     ("base" . "Base address for URLs")
+     ("big" . "Font size")
+     ("blink" . "Blinking text")
+     ("blockquote" . "Indented quotation")
+     ("body" . "Document body")
+     ("box" . "Math fraction")
+     ("br" . "Line break")
+     ("caption" . "Table caption")
+     ("center" . "Centered text")
+     ("changed" . "Change bars")
+     ("cite" . "Citation of a document")
+     ("code" . "Formatted source code")
+     ("dd" . "Definition of term")
+     ("del" . "?")
+     ("dfn" . "?")
+     ("dir" . "Directory list (obsolete)")
+     ("dl" . "Definition list")
+     ("dt" . "Term to be definined")
+     ("em" . "Emphasised") 
+     ("embed" . "Embedded data in foreign format")
+     ("fig" . "Figure")
+     ("figa" . "Figure anchor")
+     ("figd" . "Figure description")
+     ("figt" . "Figure text")
+     ("fn" . "?")
+     ("font" . "Font size")
+     ("form" . "Form with input fields")
+     ("group" . "Document grouping")
+     ("h1" . "Most important section headline")
+     ("h2" . "Important section headline")
+     ("h3" . "Section headline")
+     ("h4" . "Minor section headline")
+     ("h5" . "Unimportant section headline")
+     ("h6" . "Least important section headline")
+     ("head" . "Document header")
+     ("hr" . "Horizontal rule")
+     ("html" . "HTML Document")
+     ("i" . "Italic face")
+     ("img" . "Graphic image")
+     ("input" . "Form input field")
+     ("ins" . "?")
+     ("isindex" . "Input field for index search")
+     ("kbd" . "Keybard example face")
+     ("lang" . "Natural language")
+     ("li" . "List item")
+     ("link" . "Link relationship")
+     ("math" . "Math formula")
+     ("menu" . "Menu list (obsolete)")
+     ("mh" . "Form mail header")
+     ("nextid" . "Allocate new id")
+     ("nobr" . "Text without line break")
+     ("ol" . "Ordered list")
+     ("option" . "Selection list item")
+     ("over" . "Math fraction rule")
+     ("p" . "Paragraph start")
+     ("panel" . "Floating panel")
+     ("person" . "?")
+     ("pre" . "Preformatted fixed width text")
+     ("q" . "?")
+     ("rev" . "Reverse video")
+     ("s" . "?")
+     ("samp" . "Sample text")
+     ("select" . "Selection list")
+     ("small" . "Font size")
+     ("sp" . "Nobreak space")
+     ("strong" . "Standout text")
+     ("sub" . "Subscript")
+     ("sup" . "Superscript")
+     ("table" . "Table with rows and columns")
+     ("tb" . "Table vertical break")
+     ("td" . "Table data cell")
+     ("textarea" . "Form multiline edit area")
+     ("th" . "Table header cell")
+     ("title" . "Document title")
+     ("tr" . "Table row separator")
+     ("tt" . "Typewriter face")
+     ("u" . "Underlined text")
+     ("ul" . "Unordered list")
+     ("var" . "Math variable face")
+     ("wbr" . "Enable <br> within <nobr>"))
+ "*Value of `sgml-tag-help' for HTML mode.")
+ 
+ 
+ 
+ ;;;###autoload
+ (defun html-mode ()
+   "Major mode based on SGML mode for editing HTML documents.
+ This allows inserting skeleton costructs used in hypertext documents with
+ completion.  See below for an introduction to HTML.  Use
+ \\[browse-url-of-buffer] to see how this comes out.  See also `sgml-mode' on
+ which this is based.
+ 
+ Do \\[describe-variable] html- SPC and \\[describe-variable] sgml- SPC to see available variables.
+ 
+ To write fairly well formatted pages you only need to know few things.  Most
+ browsers have a function to read the source code of the page being seen, so
+ you can imitate various tricks.  Here's a very short HTML primer which you
+ can also view with a browser to see what happens:
+ 
+ <title>A Title Describing Contents</title> should be on every page.  Pages can
+ have <h1>Very Major Headlines</h1> through <h6>Very Minor Headlines</h6>
+ <hr> Parts can be separated with horizontal rules.
+ 
+ <p>Paragraphs only need an opening tag.  Line breaks and multiple spaces are
+ ignored unless the text is <pre>preformatted.</pre>  Text can be marked as
+ <b>bold</b>, <i>italic</i> or <u>underlined</u> using the normal  M-g  or
+ Edit/Text Properties/Face commands.
+ 
+ Pages can have <a name=\"SOMENAME\">named points</a> and can link other points
+ to them with <a href=\"#SOMENAME\">see also somename</a>.  In the same way <a
+ href=\"URL\">see also URL</a> where URL is a filename relative to current
+ directory or something like http://www.cs.indiana.edu/elisp/w3/docs.html.
+ 
+ Images in many formats can be inlined with <img src=\"URL\">.
+ 
+ If you mainly create your own documents, `sgml-specials' might be interesting.
+ But note that some HTML 2 browsers can't handle &apos;.  To work around that
+ do:
+ 
+ \(eval-after-load \"sgml-mode\" '(aset sgml-char-names ?' nil))
+ \\{html-mode-map}"
+   (interactive)
+   (sgml-mode-common html-tag-face-alist html-display-text)
+   (use-local-map html-mode-map)
+   (make-local-variable 'sgml-tag-alist)
+   (make-local-variable 'sgml-face-tag-alist)
+   (make-local-variable 'sgml-tag-help)
+   (make-local-variable 'outline-regexp)
+   (make-local-variable 'outline-heading-end-regexp)
+   (make-local-variable 'outline-level)
+   (setq mode-name "HTML"
+         major-mode 'html-mode
+ 	sgml-tag-alist html-tag-alist
+ 	sgml-face-tag-alist html-face-tag-alist
+ 	sgml-tag-help html-tag-help
+ 	outline-regexp "^.*<[Hh][1-6]\\>"
+ 	outline-heading-end-regexp "</[Hh][1-6]>"
+ 	outline-level (lambda ()
+ 			(char-after (1- (match-end 0)))))
+   (run-hooks 'html-mode-hook))
+ 
+ 
+ (define-skeleton html-href-anchor
+   "HTML anchor tag with href attribute."
+   nil
+   "<a href=\"http:" _ "\"></a>")
+ 
+ (define-skeleton html-name-anchor
+   "HTML anchor tag with name attribute."
+   nil
+   "<a name=\"" _ "\"></a>")
+ 
+ (define-skeleton html-headline
+   "HTML headline tags."
+   last-command-char
+   "<h" str ?> _ "</h" str ?>)
+ 
+ (define-skeleton html-horizontal-rule
+   "HTML horizontal rule tag."
+   nil
+   "<hr>" \n)
+ 
+ (define-skeleton html-image
+   "HTML image tag."
+   nil
+   "<img src=\"http:" _ "\">")
+ 
+ (define-skeleton html-line
+   "HTML line break tag."
+   nil
+   "<br>" \n)
+ 
+ (define-skeleton html-list
+   "HTML unordered/ordered list tags."
+   last-command-char
+   ?< str "l>" \n
+   "<li>" _ \n
+   "</" str "l>")
+ 
+ (define-skeleton html-list-item
+   "HTML list item tag."
+   nil
+   (if (bolp) nil '\n)
+   "<li>")
+ 
+ (define-skeleton html-paragraph
+   "HTML paragraph tag."
+   nil
+   (if (bolp) nil ?\n)
+   \n "<p>")
+ 
+ (define-skeleton html-checkboxes
+   "Group of connected checkbox inputs."
+   nil
+   '(setq v1 (eval str))			; allow passing name as argument
+   ("Value & Text: "
+    "<input type=\"checkbox\" name=\""
+    (or v1 (setq v1 (skeleton-read "Name: ")))
+    "\" value=\"" str ?\"
+    (if v2 "" " checked") ?> str
+    (or v2 (setq v2 (if (y-or-n-p "Newline? ") "<br>" ""))) \n))
+ 
+ (define-skeleton html-radio-buttons
+   "Group of connected radio button inputs."
+   nil
+   '(setq v1 (eval str))			; allow passing name as argument
+   ("Value & Text: "
+    "<input type=\"radio\" name=\""
+    (or v1 (setq v1 (skeleton-read "Name: ")))
+    "\" value=\"" str ?\"
+    (if v2 "" " checked") ?> str
+    (or v2 (setq v2 (if (y-or-n-p "Newline? ") "<br>" ""))) \n))
+ 
+ 
+ (defun html-autoview-mode (&optional arg)
+   "Toggle automatic viewing via `html-viewer' upon saving buffer.
+ With positive prefix ARG always turns viewing on, with negative ARG always off.
+ Can be used as a value for `html-mode-hook'."
+   (interactive "P")
+   (if (setq arg (if arg
+ 		    (< (prefix-numeric-value arg) 0)
+ 		  (and (boundp 'after-save-hook)
+ 		       (memq 'browse-url-of-buffer after-save-hook))))
+       (setq after-save-hook (delq 'browse-url-of-buffer after-save-hook))
+     (make-local-hook 'after-save-hook)
+     (add-hook 'after-save-hook 'browse-url-of-buffer nil t))
+   (message "Autoviewing turned %s."
+ 	   (if arg "off" "on")))
  
  ;;; sgml-mode.el ends here
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/sh-script.el emacs-19.31/lisp/sh-script.el
*** emacs-19.30/lisp/sh-script.el	Sat Nov 11 09:35:47 1995
--- emacs-19.31/lisp/sh-script.el	Mon Apr 15 17:15:47 1996
***************
*** 1,7 ****
  ;;; sh-script.el --- shell-script editing commands for Emacs
! ;; Copyright (C) 1993, 1994, 1995 by Free Software Foundation, Inc.
  
  ;; Author: Daniel.Pfeiffer@Informatik.START.dbp.de, fax (+49 69) 7588-2389
! ;; Version: 2.0d
  ;; Maintainer: FSF
  ;; Keywords: languages, unix
--- 1,8 ----
  ;;; sh-script.el --- shell-script editing commands for Emacs
! 
! ;; Copyright (C) 1993, 1994, 1995, 1996 by Free Software Foundation, Inc.
  
  ;; Author: Daniel.Pfeiffer@Informatik.START.dbp.de, fax (+49 69) 7588-2389
! ;; Version: 2.0e
  ;; Maintainer: FSF
  ;; Keywords: languages, unix
***************
*** 20,25 ****
  
  ;; 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:
--- 21,27 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 33,42 ****
  ;;; Known Bugs:
  
! ;; - Since GNU Emacs' syntax can't handle the context-sensitive meanings of
! ;;   the variable/number base/comment symbol `#', that has to be fontified by
! ;;   regexp.  This alas means that a quote `'' or `"' in a comment will
! ;;   fontify VERY badly.  The alternative is to have these frequent constructs
! ;;   with `#' fontify as comments.  Or maybe we intoduce a 'syntax text-
! ;;   property?
  ;; - Variables in `"' strings aren't fontified because there's no way of
  ;;   syntactically distinguishing those from `'' strings.
--- 35,39 ----
  ;;; Known Bugs:
  
! ;; - In Bourne the keyword `in' is not anchored to case, for, select ...
  ;; - Variables in `"' strings aren't fontified because there's no way of
  ;;   syntactically distinguishing those from `'' strings.
***************
*** 51,87 ****
  (require 'executable)
  
- 
- 
- ;; Autoload cookie deleted here because it made loaddefs.el fail to load.
- ;; -rms
- (or (assoc "sh" interpreter-mode-alist)
-     (setq auto-mode-alist
- 	  ;; matches files
- 	  ;;	- that have a suffix .sh, .csh or .shar (shell archive)
- 	  ;;	- that contain ressources for the various shells
- 	  ;;	- startup files for X11
- 	  (cons '("\\.c?sh\\'\\|\\.shar\\'\\|/\\.\\(z?profile\\|bash_profile\\|z?login\\|bash_login\\|z?logout\\|bash_logout\\|[kz]shrc\\|bashrc\\|t?cshrc\\|esrc\\|rcrc\\|[kz]shenv\\|xinitrc\\|startxrc\\|xsession\\)\\'" . sh-mode)
- 		auto-mode-alist)
- 	  interpreter-mode-alist
- 	  (nconc '(("ash" . sh-mode)
- 		   ("bash" . sh-mode)
- 		   ("csh" . sh-mode)
- 		   ("dtksh" . sh-mode)
- 		   ("es" . sh-mode)
- 		   ("itcsh" . sh-mode)
- 		   ("jsh" . sh-mode)
- 		   ("ksh" . sh-mode)
- 		   ("oash" . sh-mode)
- 		   ("pdksh" . sh-mode)
- 		   ("rc" . sh-mode)
- 		   ("sh" . sh-mode)
- 		   ("sh5" . sh-mode)
- 		   ("tcsh" . sh-mode)
- 		   ("wksh" . sh-mode)
- 		   ("wsh" . sh-mode)
- 		   ("zsh" . sh-mode))
- 		 interpreter-mode-alist)))
- 
- 
  (defvar sh-ancestor-alist
    '((ash . sh)
--- 48,51 ----
*************** sh		Bourne Shell
*** 127,134 ****
  
  (defvar sh-alias-alist
!   (nconc (if (eq system-type 'linux)
  	     '((csh . tcsh)
! 	       (ksh . pdksh)
! 	       (sh . bash)))
  	 ;; for the time being
  	 '((ksh . ksh88)
--- 91,97 ----
  
  (defvar sh-alias-alist
!   (nconc (if (eq system-type 'lignux)
  	     '((csh . tcsh)
! 	       (ksh . pdksh)))
  	 ;; for the time being
  	 '((ksh . ksh88)
*************** shell it really is.")
*** 139,198 ****
  
  
! (defvar sh-shell-path (or (getenv "SHELL") "/bin/sh")
!   "*The executable of the shell being programmed.")
  
  
  (defvar sh-shell-arg
!   '((bash . "-norc")
      (csh . "-f")
-     (ksh88 eval progn nil (if (file-exists-p "/etc/suid_profile") nil "-p"))
      (pdksh)
      (rc . "-p")
!     (wksh . "-motif")
      (zsh . "-f"))
    "*Single argument string for the magic number.  See `sh-feature'.")
  
  
! 
! (defvar sh-shell (or (cdr (assq (intern (file-name-nondirectory sh-shell-path))
! 				sh-alias-alist))
! 		     (intern (file-name-nondirectory sh-shell-path)))
    "The shell being programmed.  This is set by \\[sh-set-shell].")
  
! 
! 
! (defvar sh-abbrevs
!   '((csh eval sh-abbrevs shell
! 	 "switch" 'sh-case
! 	 "getopts" 'sh-while-getopts)
! 
!     (es eval sh-abbrevs shell
! 	"function" 'sh-function)
! 
!     (ksh88 eval sh-abbrevs sh
! 	   "select" 'sh-select)
! 
!     (rc eval sh-abbrevs shell
! 	"case" 'sh-case
! 	"function" 'sh-function)
! 
!     (sh eval sh-abbrevs shell
! 	"case" 'sh-case
! 	"function" 'sh-function
! 	"until" 'sh-until
! 	"getopts" 'sh-while-getopts)
! 
!     ;; The next entry is only used for defining the others
!     (shell "for" sh-for
! 	   "loop" sh-indexed-loop
! 	   "if" sh-if
! 	   "tmpfile" sh-tmp-file
! 	   "while" sh-while)
! 
!     (zsh eval sh-abbrevs ksh88
! 	 "repeat" 'sh-repeat))
!   "Abbrev-table used in Shell-Script mode.  See `sh-feature'.
! Due to the internal workings of abbrev tables, the shell name symbol is
! actually defined as the table for the like of \\[edit-abbrevs].")
  
  
--- 102,179 ----
  
  
! (defvar sh-shell-file (or (getenv "SHELL") "/bin/sh")
!   "*The executable file name for the shell being programmed.")
  
  
  (defvar sh-shell-arg
!   ;; bash does not need any options when run in a shell script,
!   '((bash)
      (csh . "-f")
      (pdksh)
+     ;; Bill_Mann@praxisint.com says -p with ksh can do harm.
+     (ksh88)
+     ;; -p means don't initialize functions from the environment.
      (rc . "-p")
!     ;; Someone proposed -motif, but we don't want to encourage
!     ;; use of a non-free widget set.
!     (wksh)
!     ;; -f means don't run .zshrc.
      (zsh . "-f"))
    "*Single argument string for the magic number.  See `sh-feature'.")
  
+ (defvar sh-shell-variables nil
+   "Alist of shell variable names that should be included in completion.
+ These are used for completion in addition to all the variables named
+ in `process-environment'.  Each element looks like (VAR . VAR), where
+ the car and cdr are the same symbol.")
+ 
+ (defvar sh-shell-variables-initialized nil
+   "Non-nil if `sh-shell-variables' is initialized.")
+ 
+ (defun sh-canonicalize-shell (shell)
+   "Convert a shell name SHELL to the one we should handle it as."
+   (or (symbolp shell)
+       (setq shell (intern shell)))
+   (or (cdr (assq shell sh-alias-alist))
+       shell))
  
! (defvar sh-shell (sh-canonicalize-shell (file-name-nondirectory sh-shell-file))
    "The shell being programmed.  This is set by \\[sh-set-shell].")
  
! ;;; I turned off this feature because it doesn't permit typing commands
! ;;; in the usual way without help.
! ;;;(defvar sh-abbrevs
! ;;;  '((csh eval sh-abbrevs shell
! ;;;	 "switch" 'sh-case
! ;;;	 "getopts" 'sh-while-getopts)
! 
! ;;;    (es eval sh-abbrevs shell
! ;;;	"function" 'sh-function)
! 
! ;;;    (ksh88 eval sh-abbrevs sh
! ;;;	   "select" 'sh-select)
! 
! ;;;    (rc eval sh-abbrevs shell
! ;;;	"case" 'sh-case
! ;;;	"function" 'sh-function)
! 
! ;;;    (sh eval sh-abbrevs shell
! ;;;	"case" 'sh-case
! ;;;	"function" 'sh-function
! ;;;	"until" 'sh-until
! ;;;	"getopts" 'sh-while-getopts)
! 
! ;;;    ;; The next entry is only used for defining the others
! ;;;    (shell "for" sh-for
! ;;;	   "loop" sh-indexed-loop
! ;;;	   "if" sh-if
! ;;;	   "tmpfile" sh-tmp-file
! ;;;	   "while" sh-while)
! 
! ;;;    (zsh eval sh-abbrevs ksh88
! ;;;	 "repeat" 'sh-repeat))
! ;;;  "Abbrev-table used in Shell-Script mode.  See `sh-feature'.
! ;;;Due to the internal workings of abbrev tables, the shell name symbol is
! ;;;actually defined as the table for the like of \\[edit-abbrevs].")
  
  
*************** actually defined as the table for the li
*** 223,227 ****
  
  (defvar sh-mode-map
!   (let ((map (make-sparse-keymap)))
      (define-key map "\C-c(" 'sh-function)
      (define-key map "\C-c\C-w" 'sh-while)
--- 204,209 ----
  
  (defvar sh-mode-map
!   (let ((map (make-sparse-keymap))
! 	(menu-map (make-sparse-keymap "Insert")))
      (define-key map "\C-c(" 'sh-function)
      (define-key map "\C-c\C-w" 'sh-while)
*************** actually defined as the table for the li
*** 264,289 ****
      (substitute-key-definition 'forward-sentence 'sh-end-of-command
  			       map (current-global-map))
!     (define-key map [menu-bar insert] 
!       (cons "Insert" (make-sparse-keymap "Insert")))
!     (define-key map [menu-bar insert sh-while] 
!       '("While loop" . sh-while))
!     (define-key map [menu-bar insert sh-until] 
!       '("Until loop" . sh-until))
!     (define-key map [menu-bar insert sh-tmp-file] 
!       '("Temporary file" . sh-tmp-file))
!     (define-key map [menu-bar insert sh-select] 
!       '("Select statement" . sh-select))
!     (define-key map [menu-bar insert sh-repeat] 
!       '("Repeat loop" . sh-repeat))
!     (define-key map [menu-bar insert sh-while-getopts] 
!       '("Options loop" . sh-while-getopts))
!     (define-key map [menu-bar insert sh-indexed-loop] 
!       '("Indexed loop" . sh-indexed-loop))
!     (define-key map [menu-bar insert sh-if] 
!       '("If statement" . sh-if))
!     (define-key map [menu-bar insert sh-for] 
!       '("For loop" . sh-for))
!     (define-key map [menu-bar insert sh-case] 
!       '("Case statement" . sh-case))
      map)
    "Keymap used in Shell-Script mode.")
--- 246,262 ----
      (substitute-key-definition 'forward-sentence 'sh-end-of-command
  			       map (current-global-map))
!     (define-key map [menu-bar insert] (cons "Insert" menu-map))
!     (define-key menu-map [sh-while]	'("While Loop" . sh-while))
!     (define-key menu-map [sh-until]	'("Until Loop" . sh-until))
!     (define-key menu-map [sh-tmp-file]	'("Temporary File" . sh-tmp-file))
!     (define-key menu-map [sh-select]	'("Select Statement" . sh-select))
!     (define-key menu-map [sh-repeat]	'("Repeat Loop" . sh-repeat))
!     (define-key menu-map [sh-while-getopts]
! 					'("Options Loop" . sh-while-getopts))
!     (define-key menu-map [sh-indexed-loop]
! 					'("Indexed Loop" . sh-indexed-loop))
!     (define-key menu-map [sh-if]	'("If Statement" . sh-if))
!     (define-key menu-map [sh-for]	'("For Loop" . sh-for))
!     (define-key menu-map [sh-case]	'("Case Statement" . sh-case))
      map)
    "Keymap used in Shell-Script mode.")
*************** See `sh-feature'.")
*** 560,564 ****
      ;; The next entry is only used for defining the others
      (shell eval sh-append executable-font-lock-keywords
! 	   '("\\\\." 0 font-lock-string-face)
  	   '("\\${?\\([A-Za-z_][A-Za-z0-9_]*\\|[0-9]+\\|[$*_]\\)" 1
  	     font-lock-variable-name-face)))
--- 533,537 ----
      ;; The next entry is only used for defining the others
      (shell eval sh-append executable-font-lock-keywords
! 	   '("\\\\[^A-Za-z0-9]" 0 font-lock-string-face)
  	   '("\\${?\\([A-Za-z_][A-Za-z0-9_]*\\|[0-9]+\\|[$*_]\\)" 1
  	     font-lock-variable-name-face)))
*************** See `sh-feature'.")
*** 566,570 ****
  
  (defvar sh-font-lock-keywords-1
!   '((sh "[ \t]in[ \t]"))
    "*Additional rules for highlighting shell scripts.  See `sh-feature'.")
  
--- 539,543 ----
  
  (defvar sh-font-lock-keywords-1
!   '((sh "[ \t]in\\>"))
    "*Additional rules for highlighting shell scripts.  See `sh-feature'.")
  
*************** See `sh-feature'.")
*** 572,579 ****
--- 545,561 ----
    "*Yet more rules for highlighting shell scripts.  See `sh-feature'.")
  
+ (defvar sh-font-lock-keywords-only t
+   "*Value of `font-lock-keywords-only' for highlighting shell scripts.
+ Default value is `t' because Emacs' syntax is not expressive enough to
+ detect that $# does not start a comment.  Thus comments are fontified by
+ regexp which means that a single apostrophe in a comment turns everything
+ upto the next one or end of buffer into a string.")
  
  ;; mode-command and utility functions
  
  ;;;###autoload
+ (put 'sh-mode 'mode-class 'special)
+ 
+ ;;;###autoload
  (defun sh-mode ()
    "Major mode for editing shell scripts.
*************** following commands are available, based 
*** 615,619 ****
  
  If you generally program a shell different from your login shell you can
! set `sh-shell-path' accordingly.  If your shell's file name doesn't correctly
  indicate what shell it is use `sh-alias-alist' to translate.
  
--- 597,601 ----
  
  If you generally program a shell different from your login shell you can
! set `sh-shell-file' accordingly.  If your shell's file name doesn't correctly
  indicate what shell it is use `sh-alias-alist' to translate.
  
*************** with your script for an edit-interpret-d
*** 632,636 ****
    (make-local-variable 'require-final-newline)
    (make-local-variable 'sh-header-marker)
!   (make-local-variable 'sh-shell-path)
    (make-local-variable 'sh-shell)
    (make-local-variable 'skeleton-pair-alist)
--- 614,618 ----
    (make-local-variable 'require-final-newline)
    (make-local-variable 'sh-header-marker)
!   (make-local-variable 'sh-shell-file)
    (make-local-variable 'sh-shell)
    (make-local-variable 'skeleton-pair-alist)
*************** with your script for an edit-interpret-d
*** 642,646 ****
    (make-local-variable 'skeleton-filter)
    (make-local-variable 'skeleton-newline-indent-rigidly)
!   (make-local-variable 'process-environment)
    (setq major-mode 'sh-mode
  	mode-name "Shell-script"
--- 624,629 ----
    (make-local-variable 'skeleton-filter)
    (make-local-variable 'skeleton-newline-indent-rigidly)
!   (make-local-variable 'sh-shell-variables)
!   (make-local-variable 'sh-shell-variables-initialized)
    (setq major-mode 'sh-mode
  	mode-name "Shell-script"
*************** with your script for an edit-interpret-d
*** 657,661 ****
  	skeleton-end-hook (lambda ()
  			    (or (eolp) (newline) (indent-relative)))
!  	paragraph-start (concat page-delimiter "\\|$")
  	paragraph-separate paragraph-start
  	comment-start "# "
--- 640,644 ----
  	skeleton-end-hook (lambda ()
  			    (or (eolp) (newline) (indent-relative)))
! 	paragraph-start (concat page-delimiter "\\|$")
  	paragraph-separate paragraph-start
  	comment-start "# "
*************** with your script for an edit-interpret-d
*** 664,671 ****
  	comint-prompt-regexp "^[ \t]*"
  	font-lock-defaults
! 	  '((sh-font-lock-keywords
  	     sh-font-lock-keywords-1
  	     sh-font-lock-keywords-2)
! 	    nil nil
  	    ((?/ . "w") (?~ . "w") (?. . "w") (?- . "w") (?_ . "w")))
  	skeleton-pair-alist '((?` _ ?`))
--- 647,655 ----
  	comint-prompt-regexp "^[ \t]*"
  	font-lock-defaults
! 	  `((sh-font-lock-keywords
  	     sh-font-lock-keywords-1
  	     sh-font-lock-keywords-2)
! 	    ,sh-font-lock-keywords-only
! 	    nil
  	    ((?/ . "w") (?~ . "w") (?. . "w") (?- . "w") (?_ . "w")))
  	skeleton-pair-alist '((?` _ ?`))
*************** with your script for an edit-interpret-d
*** 675,685 ****
  	skeleton-filter 'sh-feature
  	skeleton-newline-indent-rigidly t)
!   ;; parse or insert magic number for exec() and set all variables depending
!   ;; on the shell thus determined
!   (goto-char (point-min))
!   (sh-set-shell
!    (if (looking-at "#![\t ]*\\([^\t\n ]+\\)")
!        (match-string 1)
!      sh-shell-path))
    (run-hooks 'sh-mode-hook))
  ;;;###autoload
--- 659,670 ----
  	skeleton-filter 'sh-feature
  	skeleton-newline-indent-rigidly t)
!   (save-excursion
!     ;; parse or insert magic number for exec() and set all variables depending
!     ;; on the shell thus determined
!     (goto-char (point-min))
!     (sh-set-shell
!      (if (looking-at "#![\t ]*\\([^\t\n ]+\\)")
! 	 (match-string 1)
!        sh-shell-file)))
    (run-hooks 'sh-mode-hook))
  ;;;###autoload
*************** This adds rules for comments and assignm
*** 728,732 ****
  
  
! (defun sh-set-shell (shell)
    "Set this buffer's shell to SHELL (a string).
  Makes this script executable via `executable-set-magic'.
--- 713,717 ----
  
  
! (defun sh-set-shell (shell &optional no-query-flag insert-flag)
    "Set this buffer's shell to SHELL (a string).
  Makes this script executable via `executable-set-magic'.
*************** Calls the value of `sh-set-shell-hook' i
*** 734,757 ****
    (interactive (list (completing-read "Name or path of shell: "
  				      interpreter-mode-alist
! 				      (lambda (x) (eq (cdr x) 'sh-mode)))))
!   (if (eq this-command 'sh-set-shell)
!       ;; prevent querying
!       (setq this-command 'executable-set-magic))
    (setq sh-shell (intern (file-name-nondirectory shell))
  	sh-shell (or (cdr (assq sh-shell sh-alias-alist))
! 		     sh-shell)
! 	sh-shell-path (executable-set-magic shell (sh-feature sh-shell-arg))
! 	local-abbrev-table (sh-feature sh-abbrevs)
! 	require-final-newline (sh-feature sh-require-final-newline)
  	font-lock-keywords nil		; force resetting
  	comment-start-skip (concat (sh-feature sh-comment-prefix) "#+[\t ]*")
  	mode-line-process (format "[%s]" sh-shell)
! 	process-environment (default-value 'process-environment)
  	shell (sh-feature sh-variables))
    (set-syntax-table (sh-feature sh-mode-syntax-table))
-   (setq font-lock-syntax-table)
-   (save-excursion
-     (while (search-forward "=" nil t)
-       (sh-assignment 0)))
    (while shell
      (sh-remember-variable (car shell))
--- 719,739 ----
    (interactive (list (completing-read "Name or path of shell: "
  				      interpreter-mode-alist
! 				      (lambda (x) (eq (cdr x) 'sh-mode)))
! 		     (eq executable-query 'function)
! 		     t))
    (setq sh-shell (intern (file-name-nondirectory shell))
  	sh-shell (or (cdr (assq sh-shell sh-alias-alist))
! 		     sh-shell))
!   (setq sh-shell-file (executable-set-magic shell (sh-feature sh-shell-arg)))
!   (setq require-final-newline (sh-feature sh-require-final-newline)
! ;;;	local-abbrev-table (sh-feature sh-abbrevs)
  	font-lock-keywords nil		; force resetting
+ 	font-lock-syntax-table nil
  	comment-start-skip (concat (sh-feature sh-comment-prefix) "#+[\t ]*")
  	mode-line-process (format "[%s]" sh-shell)
! 	sh-shell-variables nil
! 	sh-shell-variables-initialized nil
  	shell (sh-feature sh-variables))
    (set-syntax-table (sh-feature sh-mode-syntax-table))
    (while shell
      (sh-remember-variable (car shell))
*************** in ALIST."
*** 816,853 ****
  
  
! (defun sh-abbrevs (ancestor &rest list)
!   "Iff it isn't, define the current shell as abbrev table and fill that.
! Abbrev table will inherit all abbrevs from ANCESTOR, which is either an abbrev
! table or a list of (NAME1 EXPANSION1 ...).  In addition it will define abbrevs
! according to the remaining arguments NAMEi EXPANSIONi ...
! EXPANSION may be either a string or a skeleton command."
!   (or (if (boundp sh-shell)
! 	  (symbol-value sh-shell))
!       (progn
! 	(if (listp ancestor)
! 	    (nconc list ancestor))
! 	(define-abbrev-table sh-shell ())
! 	(if (vectorp ancestor)
! 	    (mapatoms (lambda (atom)
! 			(or (eq atom 0)
! 			    (define-abbrev (symbol-value sh-shell)
! 			      (symbol-name atom)
! 			      (symbol-value atom)
! 			      (symbol-function atom))))
! 		      ancestor))
! 	(while list
! 	  (define-abbrev (symbol-value sh-shell)
! 	    (car list)
! 	    (if (stringp (car (cdr list)))
! 		(car (cdr list))
! 	      "")
! 	    (if (symbolp (car (cdr list)))
! 		(car (cdr list))))
! 	  (setq list (cdr (cdr list)))))
!       (symbol-value sh-shell)))
  
  
  (defun sh-mode-syntax-table (table &rest list)
!   "Copy TABLE and set syntax for succesive CHARs according to strings S."
    (setq table (copy-syntax-table table))
    (while list
--- 798,836 ----
  
  
! ;;; I commented this out because nobody calls it -- rms.
! ;;;(defun sh-abbrevs (ancestor &rest list)
! ;;;  "Iff it isn't, define the current shell as abbrev table and fill that.
! ;;;Abbrev table will inherit all abbrevs from ANCESTOR, which is either an abbrev
! ;;;table or a list of (NAME1 EXPANSION1 ...).  In addition it will define abbrevs
! ;;;according to the remaining arguments NAMEi EXPANSIONi ...
! ;;;EXPANSION may be either a string or a skeleton command."
! ;;;  (or (if (boundp sh-shell)
! ;;;	  (symbol-value sh-shell))
! ;;;      (progn
! ;;;	(if (listp ancestor)
! ;;;	    (nconc list ancestor))
! ;;;	(define-abbrev-table sh-shell ())
! ;;;	(if (vectorp ancestor)
! ;;;	    (mapatoms (lambda (atom)
! ;;;			(or (eq atom 0)
! ;;;			    (define-abbrev (symbol-value sh-shell)
! ;;;			      (symbol-name atom)
! ;;;			      (symbol-value atom)
! ;;;			      (symbol-function atom))))
! ;;;		      ancestor))
! ;;;	(while list
! ;;;	  (define-abbrev (symbol-value sh-shell)
! ;;;	    (car list)
! ;;;	    (if (stringp (car (cdr list)))
! ;;;		(car (cdr list))
! ;;;	      "")
! ;;;	    (if (symbolp (car (cdr list)))
! ;;;		(car (cdr list))))
! ;;;	  (setq list (cdr (cdr list)))))
! ;;;      (symbol-value sh-shell)))
  
  
  (defun sh-mode-syntax-table (table &rest list)
!   "Copy TABLE and set syntax for successive CHARs according to strings S."
    (setq table (copy-syntax-table table))
    (while list
*************** Lines containing only comments are consi
*** 878,886 ****
    (interactive)
    (let ((previous (save-excursion
! 		    (while (progn
! 			     (line-move -1)
! 			     (back-to-indentation)
! 			     (or (eolp)
! 				 (eq (following-char) ?#))))
  		    (current-column)))
  	current)
--- 861,870 ----
    (interactive)
    (let ((previous (save-excursion
! 		    (while (and (not (bobp))
! 				(progn
! 				  (forward-line -1)
! 				  (back-to-indentation)
! 				  (or (eolp)
! 				      (eq (following-char) ?#)))))
  		    (current-column)))
  	current)
*************** region, clear header."
*** 922,928 ****
  				     (setq end (+ sh-header-marker
  						  (- end start)))
! 				     sh-shell-path)
  	    (delete-region sh-header-marker end)))
!       (shell-command-on-region start end (concat sh-shell-path " -")))))
  
  
--- 906,912 ----
  				     (setq end (+ sh-header-marker
  						  (- end start)))
! 				     sh-shell-file)
  	    (delete-region sh-header-marker end)))
!       (shell-command-on-region start end (concat sh-shell-file " -")))))
  
  
*************** region, clear header."
*** 931,935 ****
    (or (< (length var) sh-remember-variable-min)
        (getenv var)
!       (setq process-environment (cons (concat var "=") process-environment)))
    var)
  
--- 915,920 ----
    (or (< (length var) sh-remember-variable-min)
        (getenv var)
!       (assoc var sh-shell-variables)
!       (setq sh-shell-variables (cons (cons var var) sh-shell-variables)))
    var)
  
*************** region, clear header."
*** 1049,1060 ****
  
  
  (defun sh-add (var delta)
    "Insert an addition of VAR and prefix DELTA for Bourne (type) shell."
    (interactive
!    (list (completing-read "Variable: "
! 			  (mapcar (lambda (var)
! 				    (substring var 0 (string-match "=" var)))
! 				  process-environment))
! 	 (prefix-numeric-value current-prefix-arg)))
    (insert (sh-feature '((bash . "$[ ")
  			(ksh88 . "$(( ")
--- 1034,1086 ----
  
  
+ (defun sh-shell-initialize-variables ()
+   "Scan the buffer for variable assignments.
+ Add these variables to `sh-shell-variables'."
+   (message "Scanning buffer `%s' for variable assignments..." (buffer-name))
+   (save-excursion
+     (goto-char (point-min))
+     (setq sh-shell-variables-initialized t)
+     (while (search-forward "=" nil t)
+       (sh-assignment 0)))
+   (message "Scanning buffer `%s' for variable assignments...done"
+ 	   (buffer-name)))
+ 
+ (defvar sh-add-buffer)
+ 
+ (defun sh-add-completer (string predicate code)
+   "Do completion using `sh-shell-variables', but initialize it first.
+ This function is designed for use as the \"completion table\",
+ so it takes three arguments:
+   STRING, the current buffer contents;
+   PREDICATE, the predicate for filtering possible matches;
+   CODE, which says what kind of things to do.
+ CODE can be nil, t or `lambda'.
+ nil means to return the best completion of STRING, or nil if there is none.
+ t means to return a list of all possible completions of STRING.
+ `lambda' means to return t if STRING is a valid completion as it stands."
+   (let ((sh-shell-variables
+ 	 (save-excursion
+ 	   (set-buffer sh-add-buffer)
+ 	   (or sh-shell-variables-initialized
+ 	       (sh-shell-initialize-variables))
+ 	   (nconc (mapcar (lambda (var)
+ 			    (let ((name
+ 				   (substring var 0 (string-match "=" var))))
+ 			      (cons name name)))
+ 			  process-environment)
+ 		  sh-shell-variables))))
+     (cond ((null code)
+ 	   (try-completion string sh-shell-variables predicate))
+ 	  ((eq code t)
+ 	   (all-completions string sh-shell-variables predicate))
+ 	  ((eq code 'lambda)
+ 	   (assoc string sh-shell-variables)))))
+ 
  (defun sh-add (var delta)
    "Insert an addition of VAR and prefix DELTA for Bourne (type) shell."
    (interactive
!    (let ((sh-add-buffer (current-buffer)))
!      (list (completing-read "Variable: " 'sh-add-completer)
! 	   (prefix-numeric-value current-prefix-arg))))
    (insert (sh-feature '((bash . "$[ ")
  			(ksh88 . "$(( ")
*************** option followed by a colon `:' if the op
*** 1272,1281 ****
        < "*)" \n
        > "echo" " \"usage: " "`basename $0`"
!       "[ +-" '(setq v1 (point)) str
        '(save-excursion
  	 (while (search-backward ":" v1 t)
! 	   (replace-match " arg][ +-" t t)))
        (if (eq (preceding-char) ?-) -5)
!       "][ --] args\"" \n
        "exit 2" \n
        < < "esac" \n
--- 1298,1307 ----
        < "*)" \n
        > "echo" " \"usage: " "`basename $0`"
!       " [+-" '(setq v1 (point)) str
        '(save-excursion
  	 (while (search-backward ":" v1 t)
! 	   (replace-match " ARG] [+-" t t)))
        (if (eq (preceding-char) ?-) -5)
!       "] [--] ARGS...\"" \n
        "exit 2" \n
        < < "esac" \n
*************** The document is bounded by `sh-here-docu
*** 1365,1367 ****
--- 1391,1394 ----
        (goto-char (match-end 1))))
  
+ (provide 'sh-script)
  ;; sh-script.el ends here
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/shadow.el emacs-19.31/lisp/shadow.el
*** emacs-19.30/lisp/shadow.el	Wed Dec 31 19:00:00 1969
--- emacs-19.31/lisp/shadow.el	Wed Jan 24 19:36:49 1996
***************
*** 0 ****
--- 1,202 ----
+ ;;; shadow.el --- Locate Emacs Lisp file shadowings.
+ 
+ ;; Copyright (C) 1995 Free Software Foundation, Inc.
+ 
+ ;; Author: Terry Jones <terry@santafe.edu>
+ ;; Keywords: lisp
+ ;; Created: 15 December 1995
+ 
+ ;; 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, Inc., 59 Temple Place - Suite 330,
+ ;; Boston, MA 02111-1307, USA.
+ 
+ ;;; Commentary:
+ 
+ ;; The functions in this file detect (`find-emacs-lisp-shadows')
+ ;; and display (`list-load-path-shadows') potential load-path
+ ;; problems that arise when Emacs Lisp files "shadow" each other.
+ ;;
+ ;; For example, a file XXX.el early in one's load-path will shadow
+ ;; a file with the same name in a later load-path directory.  When
+ ;; this is unintentional, it may result in problems that could have
+ ;; been easily avoided.  This occurs often (to me) when installing a
+ ;; new version of emacs and something in the site-lisp directory
+ ;; has been updated and added to the emacs distribution.  The old
+ ;; version, now outdated, shadows the new one. This is obviously
+ ;; undesirable.
+ ;;
+ ;; The `list-load-path-shadows' function was run when you installed
+ ;; this version of emacs. To run it by hand in emacs:
+ ;;
+ ;;     M-x load-library RET shadow RET
+ ;;     M-x list-load-path-shadows
+ ;;
+ ;; or run it non-interactively via:
+ ;;
+ ;;     emacs -batch -l shadow.el -f list-load-path-shadows
+ ;;
+ ;; Thanks to Francesco Potorti` <pot@cnuce.cnr.it> for suggestions,
+ ;; rewritings & speedups.
+ 
+ ;;; Code:
+ 
+ (defun find-emacs-lisp-shadows (&optional path)
+   "Return a list of Emacs Lisp files that create shadows.
+ This function does the work for `list-load-path-shadows'.
+ 
+ We traverse PATH looking for shadows, and return a \(possibly empty\)
+ even-length list of files.  A file in this list at position 2i shadows
+ the file in position 2i+1.  Emacs Lisp file suffixes \(.el and .elc\)
+ are stripped from the file names in the list.
+ 
+ See the documentation for `list-load-path-shadows' for further information."
+   
+   (or path (setq path load-path))
+ 
+   (let (true-names			; List of dirs considered.
+ 	shadows				; List of shadowings, to be returned.
+ 	files				; File names ever seen, with dirs.
+ 	dir				; The dir being currently scanned.
+ 	curr-files			; This dir's Emacs Lisp files.
+ 	orig-dir			; Where the file was first seen.
+ 	files-seen-this-dir		; Files seen so far in this dir.
+ 	file)				; The current file.
+ 
+   
+     (while path
+ 
+       (setq dir (file-truename (or (car path) ".")))
+       (if (member dir true-names)
+ 	  ;; We have already considered this PATH redundant directory.
+ 	  ;; Show the redundancy if we are interactiver, unless the PATH
+ 	  ;; dir is nil or "." (these redundant directories are just a
+ 	  ;; result of the current working directory, and are therefore
+ 	  ;; not always redundant).
+ 	  (or noninteractive
+ 	      (and (car path)
+ 		   (not (string= (car path) "."))
+ 		   (message "Ignoring redundant directory '%s'." (car path))))
+ 	
+ 	(setq true-names (append true-names (list dir)))
+ 	(setq dir (or (car path) "."))
+ 	(setq curr-files (if (file-accessible-directory-p dir)
+                                (directory-files dir nil ".\\.elc?$" t)))
+ 	(and curr-files
+ 	     (not noninteractive)
+ 	     (message "Checking %d files in '%s' ..." (length curr-files) dir))
+ 	
+ 	(setq files-seen-this-dir nil)
+ 
+ 	(while curr-files
+ 
+ 	  (setq file (car curr-files))
+ 	  (setq file (substring
+ 		      file 0 (if (string= (substring file -1) "c") -4 -3)))
+ 
+ 	  ;; 'file' now contains the current file name, with no suffix.
+ 	  (if (member file files-seen-this-dir)
+ 	      nil
+ 	  	    
+ 	    ;; File has not been seen yet in this directory.
+ 	    ;; This test prevents us declaring that XXX.el shadows
+ 	    ;; XXX.elc (or vice-versa) when they are in the same directory.
+ 	    (setq files-seen-this-dir (cons file files-seen-this-dir))
+ 	      
+ 	    (if (setq orig-dir (assoc file files))
+ 		;; This file was seen before, we have a shadowing.
+ 		(setq shadows
+ 		      (append shadows
+ 			      (list (concat (cdr orig-dir) "/" file)
+ 				    (concat dir "/" file))))
+ 
+ 	      ;; Not seen before, add it to the list of seen files.
+ 	      (setq files (cons (cons file dir) files))))
+ 
+ 	  (setq curr-files (cdr curr-files))))
+ 	(setq path (cdr path)))
+ 
+     ;; Return the list of shadowings.
+     shadows))
+ 
+ 
+ ;;;###autoload
+ (defun list-load-path-shadows ()
+   
+   "Display a list of Emacs Lisp files that create shadows.
+ 
+ This function lists potential load-path problems.  Directories in the
+ `load-path' variable are searched, in order, for Emacs Lisp
+ files.  When a previously encountered file name is re-located, a
+ message is displayed indicating that the later file is \"shadowed\" by
+ the earlier.
+ 
+ For example, suppose `load-path' is set to
+ 
+ \(\"/usr/gnu/emacs/site-lisp\" \"/usr/gnu/emacs/share/emacs/19.30/lisp\"\)
+ 
+ and that each of these directories contains a file called XXX.el.  Then
+ XXX.el in the site-lisp directory is referred to by all of:
+ \(require 'XXX\), \(autoload .... \"XXX\"\), \(load-library \"XXX\"\) etc.
+ 
+ The first XXX.el file prevents emacs from seeing the second \(unless
+ the second is loaded explicitly via load-file\).
+ 
+ When not intended, such shadowings can be the source of subtle
+ problems.  For example, the above situation may have arisen because the
+ XXX package was not distributed with versions of emacs prior to
+ 19.30.  An emacs maintainer downloaded XXX from elsewhere and installed
+ it.  Later, XXX was updated and included in the emacs distribution.
+ Unless the emacs maintainer checks for this, the new version of XXX
+ will be hidden behind the old \(which may no longer work with the new
+ emacs version\).
+ 
+ This function performs these checks and flags all possible
+ shadowings.  Because a .el file may exist without a corresponding .elc
+ \(or vice-versa\), these suffixes are essentially ignored.  A file
+ XXX.elc in an early directory \(that does not contain XXX.el\) is
+ considered to shadow a later file XXX.el, and vice-versa.
+ 
+ When run interactively, the shadowings \(if any\) are displayed in a
+ buffer called `*Shadows*'.  Shadowings are located by calling the
+ \(non-interactive\) companion function, `find-emacs-lisp-shadows'."
+   
+   (interactive)
+   (let* ((shadows (find-emacs-lisp-shadows))
+ 	 (n (/ (length shadows) 2))
+ 	 (msg (format "%s Emacs Lisp load-path shadowing%s found."
+ 		      (if (zerop n) "No" (concat "\n" (number-to-string n)))
+ 		      (if (= n 1) " was" "s were"))))
+ 	(if (interactive-p)
+ 	  (save-excursion
+ 	    ;; We are interactive.
+ 	    ;; Create the *Shadows* buffer and display shadowings there.
+ 	    (let ((output-buffer (get-buffer-create "*Shadows*")))
+ 	      (display-buffer output-buffer)
+ 	      (set-buffer output-buffer)
+ 	      (erase-buffer)
+ 	      (while shadows
+ 		(insert (format "%s shadows %s\n" (car shadows) (car (cdr shadows))))
+ 		(setq shadows (cdr (cdr shadows))))
+ 	      (insert msg "\n")))
+ 	  ;; We are non-interactive, print shadows via message.
+ 	  (while shadows
+ 	    (message "%s shadows %s" (car shadows) (car (cdr shadows)))
+ 	    (setq shadows (cdr (cdr shadows))))
+ 	  (message "%s" msg))))
+ 
+ (provide 'shadow)
+ 
+ ;;; shadow.el ends here
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/shadowfile.el emacs-19.31/lisp/shadowfile.el
*** emacs-19.30/lisp/shadowfile.el	Mon Oct 30 12:23:20 1995
--- emacs-19.31/lisp/shadowfile.el	Wed Jan 24 20:17:01 1996
***************
*** 19,78 ****
  
  ;; 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.
! 
! ;;; LCD Archive Entry:
! ;;; shadowfile|Boris Goldowsky|boris@gnu.ai.mit.edu|
! ;;; Helps you keep identical copies of files in multiple places.|
! ;;; $Date: 1995/10/30 17:23:17 $ |$Revision: 1.6 $|~/misc/shadowfile.el.Z|
! 
! ;;; Commentary:
! ;;;
! ;;;  This package helps you to keep identical copies of files in more than one
! ;;;  place - possibly on different machines.  When you save a file, it checks
! ;;;  whether it is on the list of files with "shadows", and if so, it tries to
! ;;;  copy it when you exit emacs (or use the shadow-copy-files command).
! 
! ;;; Installation & Use:
! ;;;
! ;;;      Put (require 'shadowfile) in your .emacs; add clusters (if necessary)
! ;;;  and file groups with shadow-define-cluster, shadow-define-literal-group,
! ;;;  and shadow-define-regexp-group (see the documentation for these functions
! ;;;  for information on how and when to use them).  After doing this once,
! ;;;  everything should be automatic.
! ;;;      The lists of clusters and shadows are saved in a file called
! ;;;  .shadows, so that they can be remembered from one emacs session to
! ;;;  another, even (as much as possible) if the emacs session terminates
! ;;;  abnormally.  The files needing to be copied are stored in .shadow_todo; if
! ;;;  a file cannot be copied for any reason, it will stay on the list to be
! ;;;  tried again next time.  The .shadows file should itself have shadows on
! ;;;  all your accounts so that the information in it is consistent everywhere,
! ;;;  but .shadow_todo is local information and should have no shadows.
! ;;;     If you do not want to copy a particular file, you can answer "no"
! ;;;  and be asked again next time you hit C-x 4 s or exit emacs.  If you do not
! ;;;  want to be asked again, use shadow-cancel, and you will not be asked until
! ;;;  you change the file and save it again.  If you do not want to shadow
! ;;;  that file ever again, you can edit it out of the .shadows buffer.
! ;;;  Anytime you edit the .shadows buffer, you must type M-x shadow-read-files
! ;;;  to load in the new information, or your changes will be overwritten!
! 
! ;;; Bugs & Warnings:
! ;;;
! ;;;  - It is bad to have two emacses both running shadowfile at the same
! ;;;  time.  It tries to detect this condition, but is not always successful.
! ;;;
! ;;;  - You have to be careful not to edit a file in two locations
! ;;;  before shadowfile has had a chance to copy it; otherwise
! ;;;  "updating shadows" will overwrite one of the changed versions.
! ;;;
! ;;;  - It ought to check modification times of both files to make sure
! ;;;  it is doing the right thing.  This will have to wait until
! ;;;  file-newer-than-file-p works between machines.
! ;;;
! ;;;  - It will not make directories for you, it just fails to copy files
! ;;;  that belong in non-existent directories.
! ;;;
! ;;;  Please report any bugs to me (boris@gnu.ai.mit.edu).  Also let me know
! ;;;  if you have suggestions or would like to be informed of updates.
  
  ;;; Code:
--- 19,82 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
! 
! ;; LCD Archive Entry:
! ;; shadowfile|Boris Goldowsky|boris@gnu.ai.mit.edu|
! ;; Helps you keep identical copies of files in multiple places.|
! ;; $Date: 1996/01/25 01:16:55 $ |$Revision: 1.8 $|~/misc/shadowfile.el.Z|
! 
! ;; Commentary:
! 
! ;;  This package helps you to keep identical copies of files in more than one
! ;;  place - possibly on different machines.  When you save a file, it checks
! ;;  whether it is on the list of files with "shadows", and if so, it tries to
! ;;  copy it when you exit emacs (or use the shadow-copy-files command).
! 
! ;; Installation & Use:
! 
! ;;  Put (require 'shadowfile) in your .emacs; add clusters (if necessary)
! ;;  and file groups with shadow-define-cluster,
! ;;  shadow-define-literal-group, and shadow-define-regexp-group (see the
! ;;  documentation for these functions for information on how and when to
! ;;  use them).  After doing this once, everything should be automatic.
! 
! ;;  The lists of clusters and shadows are saved in a file called .shadows,
! ;;  so that they can be remembered from one emacs session to another, even
! ;;  (as much as possible) if the emacs session terminates abnormally.  The
! ;;  files needing to be copied are stored in .shadow_todo; if a file cannot
! ;;  be copied for any reason, it will stay on the list to be tried again
! ;;  next time.  The .shadows file should itself have shadows on all your
! ;;  accounts so that the information in it is consistent everywhere, but
! ;;  .shadow_todo is local information and should have no shadows.
! 
! ;;  If you do not want to copy a particular file, you can answer "no" and
! ;;  be asked again next time you hit C-x 4 s or exit emacs.  If you do not
! ;;  want to be asked again, use shadow-cancel, and you will not be asked
! ;;  until you change the file and save it again.  If you do not want to
! ;;  shadow that file ever again, you can edit it out of the .shadows
! ;;  buffer.  Anytime you edit the .shadows buffer, you must type M-x
! ;;  shadow-read-files to load in the new information, or your changes will
! ;;  be overwritten!
! 
! ;; Bugs & Warnings:
! ;;
! ;;  - It is bad to have two emacses both running shadowfile at the same
! ;;  time.  It tries to detect this condition, but is not always successful.
! ;;
! ;;  - You have to be careful not to edit a file in two locations
! ;;  before shadowfile has had a chance to copy it; otherwise
! ;;  "updating shadows" will overwrite one of the changed versions.
! ;;
! ;;  - It ought to check modification times of both files to make sure
! ;;  it is doing the right thing.  This will have to wait until
! ;;  file-newer-than-file-p works between machines.
! ;;
! ;;  - It will not make directories for you, it just fails to copy files
! ;;  that belong in non-existent directories.
! ;;
! ;;  Please report any bugs to me (boris@gnu.ai.mit.edu).  Also let me know
! ;;  if you have suggestions or would like to be informed of updates.
  
  ;;; Code:
*************** shadow-define-cluster)."
*** 498,502 ****
  				  (shadow-shadows-of (buffer-file-name)))
  			  " ")))
!     (message (if (zerop (length msg)) 
  		 "No shadows."
  	       msg))))
--- 502,507 ----
  				  (shadow-shadows-of (buffer-file-name)))
  			  " ")))
!     (message "%s"
! 	     (if (zerop (length msg)) 
  		 "No shadows."
  	       msg))))
*************** shadow-regexp-groups."
*** 536,541 ****
  		shadow-files-to-copy
  		'("shadow" "shadows" "cancel copy"))
!   (message (format "There are %d shadows to be updated." 
! 		   (length shadow-files-to-copy)))
    (shadow-write-todo-file))
  
--- 541,546 ----
  		shadow-files-to-copy
  		'("shadow" "shadows" "cancel copy"))
!   (message "There are %d shadows to be updated." 
! 	   (length shadow-files-to-copy))
    (shadow-write-todo-file))
  
*************** site."
*** 579,584 ****
  	      (write-region (point-min) (point-max) to)
  	      (shadow-remove-from-todo s))
! 	  (error (message (format "Shadow %s not updated!" 
! 				  (cdr s)))))))))
  
  (defun shadow-shadows-of (file)
--- 584,588 ----
  	      (write-region (point-min) (point-max) to)
  	      (shadow-remove-from-todo s))
! 	  (error (message "Shadow %s not updated!" (cdr s))))))))
  
  (defun shadow-shadows-of (file)
*************** of files needing to be copied."
*** 631,636 ****
  	    (shadow-union shadows shadow-files-to-copy))
        (shadow-when (not shadow-inhibit-message)
! 	(message (substitute-command-keys
! 		  "Use \\[shadow-copy-files] to update shadows."))
  	(sit-for 1))
        (shadow-write-todo-file)))
--- 635,640 ----
  	    (shadow-union shadows shadow-files-to-copy))
        (shadow-when (not shadow-inhibit-message)
! 	(message "%s" (substitute-command-keys
! 		       "Use \\[shadow-copy-files] to update shadows."))
  	(sit-for 1))
        (shadow-write-todo-file)))
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/shell.el emacs-19.31/lisp/shell.el
*** emacs-19.30/lisp/shell.el	Mon Jun 19 18:49:31 1995
--- emacs-19.31/lisp/shell.el	Sat Feb  3 08:37:58 1996
***************
*** 1,5 ****
  ;;; shell.el --- specialized comint.el for running the shell.
  
! ;; Copyright (C) 1988, 1993, 1994, 1995 Free Software Foundation, Inc.
  
  ;; Author: Olin Shivers <shivers@cs.cmu.edu>
--- 1,5 ----
  ;;; shell.el --- specialized comint.el for running the shell.
  
! ;; Copyright (C) 1988, 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
  
  ;; Author: Olin Shivers <shivers@cs.cmu.edu>
***************
*** 20,52 ****
  
  ;; 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:
  
! ;;; Please send me bug reports, bug fixes, and extensions, so that I can
! ;;; merge them into the master source.
! ;;;     - Olin Shivers (shivers@cs.cmu.edu)
! ;;;     - Simon Marshall (simon@gnu.ai.mit.edu)
! 
! ;;; This file defines a a shell-in-a-buffer package (shell mode) built
! ;;; on top of comint mode.  This is actually cmushell with things
! ;;; renamed to replace its counterpart in Emacs 18.  cmushell is more
! ;;; featureful, robust, and uniform than the Emacs 18 version.
! 
! ;;; Since this mode is built on top of the general command-interpreter-in-
! ;;; a-buffer mode (comint mode), it shares a common base functionality, 
! ;;; and a common set of bindings, with all modes derived from comint mode.
! ;;; This makes these modes easier to use.
! 
! ;;; For documentation on the functionality provided by comint mode, and
! ;;; the hooks available for customising it, see the file comint.el.
! ;;; For further information on shell mode, see the comments below.
! 
! ;;; Needs fixin:
! ;;; When sending text from a source file to a subprocess, the process-mark can 
! ;;; move off the window, so you can lose sight of the process interactions.
! ;;; Maybe I should ensure the process mark is in the window when I send
! ;;; text to the process? Switch selectable?
  
  ;; YOUR .EMACS FILE
--- 20,53 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
! ;; Please send me bug reports, bug fixes, and extensions, so that I can
! ;; merge them into the master source.
! ;;     - Olin Shivers (shivers@cs.cmu.edu)
! ;;     - Simon Marshall (simon@gnu.ai.mit.edu)
! 
! ;; This file defines a a shell-in-a-buffer package (shell mode) built
! ;; on top of comint mode.  This is actually cmushell with things
! ;; renamed to replace its counterpart in Emacs 18.  cmushell is more
! ;; featureful, robust, and uniform than the Emacs 18 version.
! 
! ;; Since this mode is built on top of the general command-interpreter-in-
! ;; a-buffer mode (comint mode), it shares a common base functionality, 
! ;; and a common set of bindings, with all modes derived from comint mode.
! ;; This makes these modes easier to use.
! 
! ;; For documentation on the functionality provided by comint mode, and
! ;; the hooks available for customising it, see the file comint.el.
! ;; For further information on shell mode, see the comments below.
! 
! ;; Needs fixin:
! ;; When sending text from a source file to a subprocess, the process-mark can 
! ;; move off the window, so you can lose sight of the process interactions.
! ;; Maybe I should ensure the process mark is in the window when I send
! ;; text to the process? Switch selectable?
  
  ;; YOUR .EMACS FILE
***************
*** 58,111 ****
  ;;  '(define-key shell-mode-map "\M-#" 'shells-dynamic-spell))
  
! ;;; Brief Command Documentation:
! ;;;============================================================================
! ;;; Comint Mode Commands: (common to shell and all comint-derived modes)
! ;;;
! ;;; m-p	    comint-previous-input    	    Cycle backwards in input history
! ;;; m-n	    comint-next-input  	    	    Cycle forwards
! ;;; m-r     comint-previous-matching-input  Previous input matching a regexp
! ;;; m-s     comint-next-matching-input      Next input that matches
! ;;; m-c-l   comint-show-output		    Show last batch of process output
! ;;; return  comint-send-input
! ;;; c-d	    comint-delchar-or-maybe-eof	    Delete char unless at end of buff.
! ;;; c-c c-a comint-bol                      Beginning of line; skip prompt
! ;;; c-c c-u comint-kill-input	    	    ^u
! ;;; c-c c-w backward-kill-word    	    ^w
! ;;; c-c c-c comint-interrupt-subjob 	    ^c
! ;;; c-c c-z comint-stop-subjob	    	    ^z
! ;;; c-c c-\ comint-quit-subjob	    	    ^\
! ;;; c-c c-o comint-kill-output		    Delete last batch of process output
! ;;; c-c c-r comint-show-output		    Show last batch of process output
! ;;; c-c c-h comint-dynamic-list-input-ring  List input history
! ;;;         send-invisible                  Read line w/o echo & send to proc
! ;;;         comint-continue-subjob	    Useful if you accidentally suspend
! ;;;					        top-level job
! ;;; comint-mode-hook is the comint mode hook.
! 
! ;;; Shell Mode Commands:
! ;;;         shell			Fires up the shell process
! ;;; tab     comint-dynamic-complete	Complete filename/command/history
! ;;; m-?     comint-dynamic-list-filename-completions
! ;;;					List completions in help buffer
! ;;; m-c-f   shell-forward-command	Forward a shell command
! ;;; m-c-b   shell-backward-command	Backward a shell command
! ;;; 	    dirs			Resync the buffer's dir stack
! ;;; 	    dirtrack-toggle		Turn dir tracking on/off
! ;;;         comint-strip-ctrl-m		Remove trailing ^Ms from output
! ;;;
! ;;; The shell mode hook is shell-mode-hook
! ;;; comint-prompt-regexp is initialised to shell-prompt-pattern, for backwards
! ;;; compatibility.
  
! ;;; Read the rest of this file for more information.
  
- ;;; Customization and Buffer Variables
- ;;; ===========================================================================
- ;;; 
- 
  ;;; Code:
  
  (require 'comint)
  
  ;;;###autoload
  (defvar shell-prompt-pattern "^[^#$%>\n]*[#$%>] *"
--- 59,110 ----
  ;;  '(define-key shell-mode-map "\M-#" 'shells-dynamic-spell))
  
! ;; Brief Command Documentation:
! ;;============================================================================
! ;; Comint Mode Commands: (common to shell and all comint-derived modes)
! ;;
! ;; m-p	    comint-previous-input    	    Cycle backwards in input history
! ;; m-n	    comint-next-input  	    	    Cycle forwards
! ;; m-r     comint-previous-matching-input  Previous input matching a regexp
! ;; m-s     comint-next-matching-input      Next input that matches
! ;; m-c-l   comint-show-output		    Show last batch of process output
! ;; return  comint-send-input
! ;; c-d	    comint-delchar-or-maybe-eof	    Delete char unless at end of buff.
! ;; c-c c-a comint-bol                      Beginning of line; skip prompt
! ;; c-c c-u comint-kill-input	    	    ^u
! ;; c-c c-w backward-kill-word    	    ^w
! ;; c-c c-c comint-interrupt-subjob 	    ^c
! ;; c-c c-z comint-stop-subjob	    	    ^z
! ;; c-c c-\ comint-quit-subjob	    	    ^\
! ;; c-c c-o comint-kill-output		    Delete last batch of process output
! ;; c-c c-r comint-show-output		    Show last batch of process output
! ;; c-c c-h comint-dynamic-list-input-ring  List input history
! ;;         send-invisible                  Read line w/o echo & send to proc
! ;;         comint-continue-subjob	    Useful if you accidentally suspend
! ;;					        top-level job
! ;; comint-mode-hook is the comint mode hook.
! 
! ;; Shell Mode Commands:
! ;;         shell			Fires up the shell process
! ;; tab     comint-dynamic-complete	Complete filename/command/history
! ;; m-?     comint-dynamic-list-filename-completions
! ;;					List completions in help buffer
! ;; m-c-f   shell-forward-command	Forward a shell command
! ;; m-c-b   shell-backward-command	Backward a shell command
! ;; 	    dirs			Resync the buffer's dir stack
! ;; 	    dirtrack-toggle		Turn dir tracking on/off
! ;;         comint-strip-ctrl-m		Remove trailing ^Ms from output
! ;;
! ;; The shell mode hook is shell-mode-hook
! ;; comint-prompt-regexp is initialised to shell-prompt-pattern, for backwards
! ;; compatibility.
  
! ;; Read the rest of this file for more information.
  
  ;;; Code:
  
  (require 'comint)
  
+ ;;; Customization and Buffer Variables
+ 
  ;;;###autoload
  (defvar shell-prompt-pattern "^[^#$%>\n]*[#$%>] *"
*************** shell buffer.
*** 116,120 ****
  
  The pattern should probably not match more than one line.  If it does,
! shell-mode may become confused trying to distinguish prompt from input
  on lines which don't start with a prompt.
  
--- 115,119 ----
  
  The pattern should probably not match more than one line.  If it does,
! Shell mode may become confused trying to distinguish prompt from input
  on lines which don't start with a prompt.
  
*************** Thus, this does not include the shell's 
*** 255,260 ****
  
  ;;; Basic Procedures
- ;;; ===========================================================================
- ;;;
  
  (defun shell-mode ()
--- 254,257 ----
*************** buffer."
*** 345,349 ****
  	(setq comint-input-ring-file-name nil))
      (setq shell-dirstack-query
! 	  (if (string-match "^k?sh$" shell) "pwd" "dirs")))
    (run-hooks 'shell-mode-hook)
    (comint-read-input-ring t))
--- 342,348 ----
  	(setq comint-input-ring-file-name nil))
      (setq shell-dirstack-query
! 	  (cond ((string-equal shell "sh") "pwd")
! 		((string-equal shell "ksh") "echo $PWD ~-")
! 		(t "dirs"))))
    (run-hooks 'shell-mode-hook)
    (comint-read-input-ring t))
*************** Otherwise, one argument `-i' is passed t
*** 395,399 ****
  
  ;;; Directory tracking
! ;;; ===========================================================================
  ;;; This code provides the shell mode input sentinel
  ;;;     SHELL-DIRECTORY-TRACKER
--- 394,398 ----
  
  ;;; Directory tracking
! ;;;
  ;;; This code provides the shell mode input sentinel
  ;;;     SHELL-DIRECTORY-TRACKER
*************** Environment variables are expanded, see 
*** 520,525 ****
  		  (let ((old default-directory))
  		    (shell-cd (car shell-dirstack))
! 		    (setq shell-dirstack
! 			  (cons old (cdr shell-dirstack)))
  		    (shell-dirstack-message)))
  		 (t
--- 519,523 ----
  		  (let ((old default-directory))
  		    (shell-cd (car shell-dirstack))
! 		    (setq shell-dirstack (cons old (cdr shell-dirstack)))
  		    (shell-dirstack-message)))
  		 (t
*************** command again."
*** 621,625 ****
  	(condition-case nil
  	    (progn (shell-cd (car ds))
! 		   (setq shell-dirstack (cdr ds))
  		   (shell-dirstack-message))
  	  (error (message "Couldn't cd.")))))))
--- 619,624 ----
  	(condition-case nil
  	    (progn (shell-cd (car ds))
! 		   (setq shell-dirstack (cdr ds)
! 			 shell-last-dir (car shell-dirstack))
  		   (shell-dirstack-message))
  	  (error (message "Couldn't cd.")))))))
*************** command again."
*** 652,656 ****
  	(setq msg (concat msg (directory-file-name dir) " "))
  	(setq ds (cdr ds))))
!     (message msg)))
  
  (defun shell-forward-command (&optional arg)
--- 651,655 ----
  	(setq msg (concat msg (directory-file-name dir) " "))
  	(setq ds (cdr ds))))
!     (message "%s" msg)))
  
  (defun shell-forward-command (&optional arg)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/simple.el emacs-19.31/lisp/simple.el
*** emacs-19.30/lisp/simple.el	Sat Nov 18 11:45:20 1995
--- emacs-19.31/lisp/simple.el	Tue May 21 10:28:39 1996
***************
*** 16,21 ****
  
  ;; 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:
--- 16,22 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** and KILLP is t if a prefix arg was speci
*** 286,294 ****
  	(forward-char -1)
  	(setq count (1- count)))))
!   (delete-backward-char arg killp)
!   ;; In overwrite mode, back over columns while clearing them out,
!   ;; unless at end of line.
!   (and overwrite-mode (not (eolp))
!        (save-excursion (insert-char ?\  arg))))
  
  (defun zap-to-char (arg char)
--- 287,291 ----
  	(forward-char -1)
  	(setq count (1- count)))))
!   (delete-backward-char arg killp))
  
  (defun zap-to-char (arg char)
*************** the minibuffer, then read and evaluate t
*** 478,482 ****
  				       '(command-history . 1))))
      ;; If command was added to command-history as a string,
!     ;; get rid of that.  We want only evallable expressions there.
      (if (stringp (car command-history))
  	(setq command-history (cdr command-history)))
--- 475,479 ----
  				       '(command-history . 1))))
      ;; If command was added to command-history as a string,
!     ;; get rid of that.  We want only evaluable expressions there.
      (if (stringp (car command-history))
  	(setq command-history (cdr command-history)))
*************** to get different commands to edit and re
*** 511,515 ****
  
  	  ;; If command was added to command-history as a string,
! 	  ;; get rid of that.  We want only evallable expressions there.
  	  (if (stringp (car command-history))
  	      (setq command-history (cdr command-history)))
--- 508,512 ----
  
  	  ;; If command was added to command-history as a string,
! 	  ;; get rid of that.  We want only evaluable expressions there.
  	  (if (stringp (car command-history))
  	      (setq command-history (cdr command-history)))
*************** In either case, the output is inserted a
*** 772,823 ****
  					   nil nil nil 'shell-command-history)
  		     current-prefix-arg))
!   (if (and output-buffer
! 	   (not (or (bufferp output-buffer)  (stringp output-buffer))))
!       (progn (barf-if-buffer-read-only)
! 	     (push-mark)
! 	     ;; We do not use -f for csh; we will not support broken use of
! 	     ;; .cshrcs.  Even the BSD csh manual says to use
! 	     ;; "if ($?prompt) exit" before things which are not useful
! 	     ;; non-interactively.  Besides, if someone wants their other
! 	     ;; aliases for shell commands then they can still have them.
! 	     (call-process shell-file-name nil t nil
! 			   shell-command-switch command)
! 	     ;; This is like exchange-point-and-mark, but doesn't
! 	     ;; activate the mark.  It is cleaner to avoid activation,
! 	     ;; even though the command loop would deactivate the mark
! 	     ;; because we inserted text.
! 	     (goto-char (prog1 (mark t)
! 			  (set-marker (mark-marker) (point)
! 				      (current-buffer)))))
!     ;; Preserve the match data in case called from a program.
!     (save-match-data
!       (if (string-match "[ \t]*&[ \t]*$" command)
! 	  ;; Command ending with ampersand means asynchronous.
! 	  (let ((buffer (get-buffer-create
! 			 (or output-buffer "*Asynch Shell Command*")))
! 		(directory default-directory)
! 		proc)
! 	    ;; Remove the ampersand.
! 	    (setq command (substring command 0 (match-beginning 0)))
! 	    ;; If will kill a process, query first.
! 	    (setq proc (get-buffer-process buffer))
! 	    (if proc
! 		(if (yes-or-no-p "A command is running.  Kill it? ")
! 		    (kill-process proc)
! 		  (error "Shell command in progress")))
! 	    (save-excursion
! 	      (set-buffer buffer)
! 	      (setq buffer-read-only nil)
! 	      (erase-buffer)
! 	      (display-buffer buffer)
! 	      (setq default-directory directory)
! 	      (setq proc (start-process "Shell" buffer shell-file-name 
! 					shell-command-switch command))
! 	      (setq mode-line-process '(":%s"))
! 	      (require 'shell) (shell-mode)
! 	      (set-process-sentinel proc 'shell-command-sentinel)
! 	      ))
! 	(shell-command-on-region (point) (point) command nil)
! 	))))
  
  ;; We have a sentinel to prevent insertion of a termination message
--- 769,826 ----
  					   nil nil nil 'shell-command-history)
  		     current-prefix-arg))
!   ;; Look for a handler in case default-directory is a remote file name.
!   (let ((handler
! 	 (find-file-name-handler (directory-file-name default-directory)
! 				 'shell-command)))
!     (if handler
! 	(funcall handler 'shell-command command output-buffer)
!       (if (and output-buffer
! 	       (not (or (bufferp output-buffer)  (stringp output-buffer))))
! 	  (progn (barf-if-buffer-read-only)
! 		 (push-mark)
! 		 ;; We do not use -f for csh; we will not support broken use of
! 		 ;; .cshrcs.  Even the BSD csh manual says to use
! 		 ;; "if ($?prompt) exit" before things which are not useful
! 		 ;; non-interactively.  Besides, if someone wants their other
! 		 ;; aliases for shell commands then they can still have them.
! 		 (call-process shell-file-name nil t nil
! 			       shell-command-switch command)
! 		 ;; This is like exchange-point-and-mark, but doesn't
! 		 ;; activate the mark.  It is cleaner to avoid activation,
! 		 ;; even though the command loop would deactivate the mark
! 		 ;; because we inserted text.
! 		 (goto-char (prog1 (mark t)
! 			      (set-marker (mark-marker) (point)
! 					  (current-buffer)))))
! 	;; Preserve the match data in case called from a program.
! 	(save-match-data
! 	  (if (string-match "[ \t]*&[ \t]*$" command)
! 	      ;; Command ending with ampersand means asynchronous.
! 	      (let ((buffer (get-buffer-create
! 			     (or output-buffer "*Async Shell Command*")))
! 		    (directory default-directory)
! 		    proc)
! 		;; Remove the ampersand.
! 		(setq command (substring command 0 (match-beginning 0)))
! 		;; If will kill a process, query first.
! 		(setq proc (get-buffer-process buffer))
! 		(if proc
! 		    (if (yes-or-no-p "A command is running.  Kill it? ")
! 			(kill-process proc)
! 		      (error "Shell command in progress")))
! 		(save-excursion
! 		  (set-buffer buffer)
! 		  (setq buffer-read-only nil)
! 		  (erase-buffer)
! 		  (display-buffer buffer)
! 		  (setq default-directory directory)
! 		  (setq proc (start-process "Shell" buffer shell-file-name 
! 					    shell-command-switch command))
! 		  (setq mode-line-process '(":%s"))
! 		  (require 'shell) (shell-mode)
! 		  (set-process-sentinel proc 'shell-command-sentinel)
! 		  ))
! 	    (shell-command-on-region (point) (point) command nil)
! 	    ))))))
  
  ;; We have a sentinel to prevent insertion of a termination message
*************** In either case, the output is inserted a
*** 866,870 ****
    (if (or replace
  	  (and output-buffer
! 	       (not (or (bufferp output-buffer) (stringp output-buffer)))))
        ;; Replace specified region with output from command.
        (let ((swap (and replace (< start end))))
--- 869,874 ----
    (if (or replace
  	  (and output-buffer
! 	       (not (or (bufferp output-buffer) (stringp output-buffer))))
! 	  (equal (buffer-name (current-buffer)) "*Shell Command Output*"))
        ;; Replace specified region with output from command.
        (let ((swap (and replace (< start end))))
*************** In either case, the output is inserted a
*** 891,895 ****
  	      (progn (setq buffer-read-only nil)
  		     (delete-region (max start end) (point-max))
! 		     (delete-region (point-min) (max start end))
  		     (call-process-region (point-min) (point-max)
  					  shell-file-name t t nil
--- 895,899 ----
  	      (progn (setq buffer-read-only nil)
  		     (delete-region (max start end) (point-max))
! 		     (delete-region (point-min) (min start end))
  		     (call-process-region (point-min) (point-max)
  					  shell-file-name t t nil
*************** yanking point; just return the Nth kill 
*** 1181,1184 ****
--- 1185,1192 ----
    "*Non-nil means don't signal an error for killing read-only text.")
  
+ (put 'text-read-only 'error-conditions
+      '(text-read-only buffer-read-only error))
+ (put 'text-read-only 'error-message "Text is read-only")
+ 
  (defun kill-region (beg end)
    "Kill between point and mark.
*************** to make one entry in the kill ring."
*** 1210,1214 ****
  	(message "Read only text copied to kill ring")
        (setq this-command 'kill-region)
!       (barf-if-buffer-read-only)))
  
     ;; In certain cases, we can arrange for the undo list and the kill
--- 1218,1225 ----
  	(message "Read only text copied to kill ring")
        (setq this-command 'kill-region)
!       ;; Signal an error if the buffer is read-only.
!       (barf-if-buffer-read-only)
!       ;; If the buffer isn't read-only, the text is.
!       (signal 'text-read-only (list (current-buffer)))))
  
     ;; In certain cases, we can arrange for the undo list and the kill
*************** comes the newest one."
*** 1312,1316 ****
        (error "Previous command was not a yank"))
    (setq this-command 'yank)
!   (let ((before (< (point) (mark t))))
      (delete-region (point) (mark t))
      (set-marker (mark-marker) (point) (current-buffer))
--- 1323,1328 ----
        (error "Previous command was not a yank"))
    (setq this-command 'yank)
!   (let ((inhibit-read-only t)
! 	(before (< (point) (mark t))))
      (delete-region (point) (mark t))
      (set-marker (mark-marker) (point) (current-buffer))
*************** With argument, rotate that many kills fo
*** 1362,1369 ****
  Puts mark after the inserted text.
  BUFFER may be a buffer or a buffer name."
!   (interactive (list (progn (barf-if-buffer-read-only)
! 			    (read-buffer "Insert buffer: " 
! 					 (other-buffer (current-buffer) t)
! 					 t))))
    (or (bufferp buffer)
        (setq buffer (get-buffer buffer)))
--- 1374,1386 ----
  Puts mark after the inserted text.
  BUFFER may be a buffer or a buffer name."
!   (interactive
!    (list
!     (progn
!       (barf-if-buffer-read-only)
!       (read-buffer "Insert buffer: "
! 		   (if (eq (selected-window) (next-window (selected-window)))
! 		       (other-buffer (current-buffer))
! 		     (window-buffer (next-window (selected-window))))
! 		   t))))
    (or (bufferp buffer)
        (setq buffer (get-buffer buffer)))
*************** Setting this variable automatically make
*** 2314,2317 ****
--- 2331,2337 ----
    "*Regexp to match lines which should not be auto-filled.")
  
+ ;; This function is the auto-fill-function of a buffer
+ ;; when Auto-Fill mode is enabled.
+ ;; It returns t if it really did any work.
  (defun do-auto-fill ()
    (let (fc justify bol give-up
*************** Setting this variable automatically make
*** 2403,2407 ****
  	    (setq give-up t))))
        ;; justify last line
!       (justify-current-line justify t t)))) 
  
  (defun auto-fill-mode (&optional arg)
--- 2423,2428 ----
  	    (setq give-up t))))
        ;; justify last line
!       (justify-current-line justify t t)
!       t))) 
  
  (defun auto-fill-mode (&optional arg)
*************** in the mode line."
*** 2611,2614 ****
--- 2632,2640 ----
    "*Non-nil means show matching open-paren when close-paren is inserted.")
  
+ (defvar blink-matching-paren-on-screen t
+   "*Non-nil means show matching open-paren when it is on screen.
+ nil means don't show it (but the open-paren can still be shown
+ when it is off screen.")
+ 
  (defconst blink-matching-paren-distance 12000
    "*If non-nil, is maximum distance to search for matching open-paren.")
*************** in the mode line."
*** 2658,2662 ****
  		(goto-char blinkpos)
  		(if (pos-visible-in-window-p)
! 		    (sit-for blink-matching-delay)
  		  (goto-char blinkpos)
  		  (message
--- 2684,2689 ----
  		(goto-char blinkpos)
  		(if (pos-visible-in-window-p)
! 		    (and blink-matching-paren-on-screen
! 			 (sit-for blink-matching-delay))
  		  (goto-char blinkpos)
  		  (message
*************** Go to the window from which completion w
*** 2825,2829 ****
  (defun next-completion (n)
    "Move to the next item in the completion list.
! WIth prefix argument N, move N items (negative N means move backward)."
    (interactive "p")
    (while (and (> n 0) (not (eobp)))
--- 2852,2856 ----
  (defun next-completion (n)
    "Move to the next item in the completion list.
! With prefix argument N, move N items (negative N means move backward)."
    (interactive "p")
    (while (and (> n 0) (not (eobp)))
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/simula.el emacs-19.31/lisp/simula.el
*** emacs-19.30/lisp/simula.el	Thu Mar  2 10:43:43 1995
--- emacs-19.31/lisp/simula.el	Sat Apr 20 21:40:24 1996
***************
*** 1,9 ****
  ;;; simula.el --- SIMULA 87 code editing commands for Emacs
  
! ;; Copyright (C) 1992 Free Software Foundation, Inc.
  
  ;; Author: Hans Henrik Eriksen <hhe@ifi.uio.no>
  ;; Maintainer: simula-mode@ifi.uio.no
- ;; Version: 0.992
  ;; Adapted-By: ESR
  ;; Keywords: languages
--- 1,8 ----
  ;;; simula.el --- SIMULA 87 code editing commands for Emacs
  
! ;; Copyright (C) 1992, 1994, 1996 Free Software Foundation, Inc.
  
  ;; Author: Hans Henrik Eriksen <hhe@ifi.uio.no>
  ;; Maintainer: simula-mode@ifi.uio.no
  ;; Adapted-By: ESR
  ;; Keywords: languages
***************
*** 22,27 ****
  
  ;; 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:
--- 21,27 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 37,54 ****
  ;;; Code:
  
! (provide 'simula-mode)
  
! (defconst simula-tab-always-indent nil
    "*Non-nil means TAB in SIMULA mode should always reindent the current line.
  Otherwise TAB indents only when point is within
  the run of whitespace at the beginning of the line.")
  
! (defconst simula-indent-level 3
    "*Indentation of SIMULA statements with respect to containing block.")
  
! (defconst simula-substatement-offset 3
    "*Extra indentation after DO, THEN, ELSE, WHEN and OTHERWISE.")
  
! (defconst simula-continued-statement-offset 3
    "*Extra indentation for lines not starting a statement or substatement.
  If value is a list, each line in a multipleline continued statement
--- 37,70 ----
  ;;; Code:
  
! 
! (defconst simula-tab-always-indent-default nil
!   "Non-nil means TAB in SIMULA mode should always reindent the current line.
! Otherwise TAB indents only when point is within
! the run of whitespace at the beginning of the line.")
  
! (defvar simula-tab-always-indent simula-tab-always-indent-default
    "*Non-nil means TAB in SIMULA mode should always reindent the current line.
  Otherwise TAB indents only when point is within
  the run of whitespace at the beginning of the line.")
  
! (defconst simula-indent-level-default 3
!   "Indentation of SIMULA statements with respect to containing block.")
! 
! (defvar simula-indent-level simula-indent-level-default
    "*Indentation of SIMULA statements with respect to containing block.")
  
! (defconst simula-substatement-offset-default 3
!   "Extra indentation after DO, THEN, ELSE, WHEN and OTHERWISE.")
! 
! (defvar simula-substatement-offset simula-substatement-offset-default
    "*Extra indentation after DO, THEN, ELSE, WHEN and OTHERWISE.")
  
! (defconst simula-continued-statement-offset-default 3
!   "Extra indentation for lines not starting a statement or substatement.
! If value is a list, each line in a multipleline continued statement
! will have the car of the list extra indentation with respect to
! the previous line of the statement.")
! 
! (defvar simula-continued-statement-offset simula-continued-statement-offset-default
    "*Extra indentation for lines not starting a statement or substatement.
  If value is a list, each line in a multipleline continued statement
*************** will have the car of the list extra inde
*** 56,84 ****
  the previous line of the statement.")
  
! (defconst simula-label-offset -4711
    "*Offset of SIMULA label lines relative to usual indentation.")
  
! (defconst simula-if-indent '(0 . 0)
    "*Extra indentation of THEN and ELSE with respect to the starting IF.
  Value is a cons cell, the car is extra THEN indentation and the cdr
  extra ELSE indentation.  IF after ELSE is indented as the starting IF.")
  
! (defconst simula-inspect-indent '(0 . 0)
    "*Extra indentation of WHEN and OTHERWISE with respect to the INSPECT.
  Value is a cons cell, the car is extra WHEN indentation
  and the cdr extra OTHERWISE indentation.")
  
! (defconst simula-electric-indent nil
    "*Non-nil means `simula-indent-line' function may reindent previous line.")
  
! (defconst simula-abbrev-keyword 'upcase
    "*Specify how to convert case for SIMULA keywords.
  Value is one of the symbols `upcase', `downcase', `capitalize',
! \(as in) `abbrev-table' or nil if they should not be changed.")
  
! (defconst simula-abbrev-stdproc 'abbrev-table
    "*Specify how to convert case for standard SIMULA procedure and class names.
  Value is one of the symbols `upcase', `downcase', `capitalize',
! \(as in) `abbrev-table', or nil if they should not be changed.")
  
  (defvar simula-abbrev-file nil
--- 72,126 ----
  the previous line of the statement.")
  
! (defconst simula-label-offset-default -4711
!   "Offset of SIMULA label lines relative to usual indentation.")
! 
! (defvar simula-label-offset simula-label-offset-default
    "*Offset of SIMULA label lines relative to usual indentation.")
  
! (defconst simula-if-indent-default '(0 . 0)
!   "Extra indentation of THEN and ELSE with respect to the starting IF.
! Value is a cons cell, the car is extra THEN indentation and the cdr
! extra ELSE indentation.  IF after ELSE is indented as the starting IF.")
! 
! (defvar simula-if-indent simula-if-indent-default
    "*Extra indentation of THEN and ELSE with respect to the starting IF.
  Value is a cons cell, the car is extra THEN indentation and the cdr
  extra ELSE indentation.  IF after ELSE is indented as the starting IF.")
  
! (defconst simula-inspect-indent-default '(0 . 0)
!   "Extra indentation of WHEN and OTHERWISE with respect to the INSPECT.
! Value is a cons cell, the car is extra WHEN indentation
! and the cdr extra OTHERWISE indentation.")
! 
! (defvar simula-inspect-indent simula-inspect-indent-default
    "*Extra indentation of WHEN and OTHERWISE with respect to the INSPECT.
  Value is a cons cell, the car is extra WHEN indentation
  and the cdr extra OTHERWISE indentation.")
  
! (defconst simula-electric-indent-default nil
!   "Non-nil means `simula-indent-line' function may reindent previous line.")
! 
! (defvar simula-electric-indent simula-electric-indent-default
    "*Non-nil means `simula-indent-line' function may reindent previous line.")
  
! (defconst simula-abbrev-keyword-default 'upcase
!   "Specify how to convert case for SIMULA keywords.
! Value is one of the symbols `upcase', `downcase', `capitalize',
! (as in) `abbrev-table' or nil if they should not be changed.")
! 
! (defvar simula-abbrev-keyword simula-abbrev-keyword-default
    "*Specify how to convert case for SIMULA keywords.
  Value is one of the symbols `upcase', `downcase', `capitalize',
! (as in) `abbrev-table' or nil if they should not be changed.")
! 
! (defconst simula-abbrev-stdproc-default 'abbrev-table
!   "Specify how to convert case for standard SIMULA procedure and class names.
! Value is one of the symbols `upcase', `downcase', `capitalize',
! (as in) `abbrev-table', or nil if they should not be changed.")
  
! (defvar simula-abbrev-stdproc simula-abbrev-stdproc-default
    "*Specify how to convert case for standard SIMULA procedure and class names.
  Value is one of the symbols `upcase', `downcase', `capitalize',
! (as in) `abbrev-table', or nil if they should not be changed.")
  
  (defvar simula-abbrev-file nil
*************** for SIMULA mode to function correctly.")
*** 91,94 ****
--- 133,185 ----
    "Syntax table in SIMULA mode buffers.")
  
+ ; The following function is taken from cc-mode.el,
+ ; it determines the flavor of the Emacs running
+ (defconst simula-emacs-features
+   (let ((major (and (boundp 'emacs-major-version)
+ 		    emacs-major-version))
+ 	(minor (and (boundp 'emacs-minor-version)
+ 		    emacs-minor-version))
+ 	flavor comments)
+     ;; figure out version numbers if not already discovered
+     (and (or (not major) (not minor))
+ 	 (string-match "\\([0-9]+\\).\\([0-9]+\\)" emacs-version)
+ 	 (setq major (string-to-int (substring emacs-version
+ 					       (match-beginning 1)
+ 					       (match-end 1)))
+ 	       minor (string-to-int (substring emacs-version
+ 					       (match-beginning 2)
+ 					       (match-end 2)))))
+     (if (not (and major minor))
+ 	(error "Cannot figure out the major and minor version numbers."))
+     ;; calculate the major version
+     (cond
+      ((= major 18) (setq major 'v18))	;Emacs 18
+      ((= major 4)  (setq major 'v18))	;Epoch 4
+      ((= major 19) (setq major 'v19	;Emacs 19
+ 			 flavor (if (string-match "Lucid" emacs-version)
+ 				    'Lucid 'FSF)))
+      ;; I don't know
+      (t (error "Cannot recognize major version number: %s" major)))
+         (list major flavor comments))
+   "A list of features extant in the Emacs you are using.
+ There are many flavors of Emacs out there, each with different
+ features supporting those needed by simula-mode.  Here's the current
+ supported list, along with the values for this variable:
+ 
+  Emacs 19:                  (v19 FSF 1-bit)
+  Vanilla Emacs 18/Epoch 4:  (v18 no-dual-comments)
+  Emacs 18/Epoch 4 (patch2): (v18 8-bit)
+  Lucid Emacs 19:            (v19 Lucid 8-bit).")
+ 
+ (defvar simula-mode-menu
+   '(["Report Bug"	      simula-submit-bug-report t]
+     ["Indent Line"	      simula-indent-line t]
+     ["Backward Statement"     simula-previous-statement t]
+     ["Forward Statement"      simula-next-statement t]
+     ["Backward Up Level"      simula-backward-up-level t]
+     ["Forward Down Statement" simula-forward-down-level t]
+     )
+   "Lucid Emacs menu for SIMULA mode.")
+ 
  (if simula-mode-syntax-table
      ()
*************** for SIMULA mode to function correctly.")
*** 123,127 ****
    (define-key simula-mode-map "\177"       'backward-delete-char-untabify)
    (define-key simula-mode-map ":"          'simula-electric-label)
!   (define-key simula-mode-map "\t"         'simula-indent-command))
  
  (defvar simula-mode-abbrev-table nil
--- 214,276 ----
    (define-key simula-mode-map "\177"       'backward-delete-char-untabify)
    (define-key simula-mode-map ":"          'simula-electric-label)
!   (define-key simula-mode-map "\e\C-q"     'simula-indent-exp)
!   (define-key simula-mode-map "\t"         'simula-indent-command)
!   ;; Emacs 19 defines menus in the mode map
!   (if (memq 'FSF simula-emacs-features)
!       (progn
! 	(define-key simula-mode-map [menu-bar] (make-sparse-keymap))
! 
! 	(define-key simula-mode-map [menu-bar simula]
! 	  (cons "SIMULA" (make-sparse-keymap "SIMULA")))
! 	(define-key simula-mode-map [menu-bar simula bug-report]
! 	  '("Submit Bug Report" . simula-submit-bug-report))
! 	(define-key simula-mode-map [menu-bar simula separator-indent]
! 	  '("--"))
! 	(define-key simula-mode-map [menu-bar simula indent-exp]
! 	  '("Indent Expression" . simula-indent-exp))
! 	(define-key simula-mode-map [menu-bar simula indent-line]
! 	  '("Indent Line" . simula-indent-command))
! 	(define-key simula-mode-map [menu-bar simula separator-navigate]
! 	  '("--"))
! 	(define-key simula-mode-map [menu-bar simula backward-stmt]
! 	  '("Previous Statement" . simula-previous-statement))
! 	(define-key simula-mode-map [menu-bar simula forward-stmt]
! 	  '("Next Statement" . simula-next-statement))
! 	(define-key simula-mode-map [menu-bar simula backward-up]
! 	  '("Backward Up Level" . simula-backward-up-level))
! 	(define-key simula-mode-map [menu-bar simula forward-down]
! 	  '("Forward Down Statement" . simula-forward-down-level))
! 
! 	(put 'simula-next-statement 'menu-enable '(not (eobp)))
! 	(put 'simula-previous-statement 'menu-enable '(not (bobp)))
! 	(put 'simula-forward-down-level 'menu-enable '(not (eobp)))
! 	(put 'simula-backward-up-level 'menu-enable '(not (bobp)))
! 	(put 'simula-indent-command 'menu-enable '(not buffer-read-only))
! 	(put 'simula-indent-exp 'menu-enable '(not buffer-read-only))))
! 
!   ;; RMS: mouse-3 should not select this menu.  mouse-3's global
!   ;; definition is useful in SIMULA mode and we should not interfere
!   ;; with that.  The menu is mainly for beginners, and for them,
!   ;; the menubar requires less memory than a special click.
!   ;; in Lucid Emacs, we want the menu to popup when the 3rd button is
!   ;; hit.  In 19.10 and beyond this is done automatically if we put
!   ;; the menu on mode-popup-menu variable, see c-common-init [cc-mode.el]
!   (if (memq 'Lucid simula-emacs-features)
!       (if (not (boundp 'mode-popup-menu))
! 	  (define-key simula-mode-map 'button3 'simula-popup-menu))))
! 
! ;; menus for Lucid
! (defun simula-popup-menu (e)
!   "Pops up the SIMULA menu."
!   (interactive "@e")
!   (popup-menu (cons (concat mode-name " Mode Commands") simula-mode-menu))
!   (simula-keep-region-active))
! 
! ;; active regions, and auto-newline/hungry delete key
! (defun simula-keep-region-active ()
!   ;; do whatever is necessary to keep the region active in
!   ;; Lucid. ignore byte-compiler warnings you might see
!   (and (boundp 'zmacs-region-stays)
!        (setq zmacs-region-stays t)))
  
  (defvar simula-mode-abbrev-table nil
*************** at all."
*** 180,185 ****
    (make-local-variable 'comment-column)
    (setq comment-column 40)
!   (make-local-variable 'end-comment-column)
!   (setq end-comment-column 75)
    (set-syntax-table simula-mode-syntax-table)
    (make-local-variable 'paragraph-start)
--- 329,334 ----
    (make-local-variable 'comment-column)
    (setq comment-column 40)
! ;  (make-local-variable 'end-comment-column)
! ;  (setq end-comment-column 75)
    (set-syntax-table simula-mode-syntax-table)
    (make-local-variable 'paragraph-start)
*************** at all."
*** 213,216 ****
--- 362,386 ----
  
  
+ (defun simula-indent-exp ()
+   "Indent SIMULA expression following point."
+   (interactive)
+   (let ((here (point))
+ 	(simula-electric-indent nil)
+ 	end)
+     (simula-skip-comment-forward)
+     (if (eobp)
+ 	(goto-char here)
+       (unwind-protect
+ 	  (progn
+ 	    (simula-next-statement 1)
+ 	    (setq end (point-marker))
+ 	    (simula-previous-statement 1)
+ 	    (beginning-of-line)
+ 	    (while (< (point) end)
+ 	      (if (not (looking-at "[ \t]*$"))
+ 		  (simula-indent-line))
+ 	      (forward-line 1)))
+ 	(and end (set-marker end nil))))))
+       
  
  (defun simula-indent-line ()
*************** If `simula-electric-indent' is non-nil, 
*** 221,245 ****
  	(case-fold-search t))
      (unwind-protect
! 	(progn
! 	  ;;
! 	  ;; manually expand abbrev on last line, if any
! 	  ;;
! 	  (end-of-line 0)
! 	  (expand-abbrev)
! 	  ;; now maybe we should reindent that line
! 	  (if simula-electric-indent
! 	      (progn
! 		(beginning-of-line)
! 		(skip-chars-forward " \t\f")
! 		(if (and
! 		     (looking-at
! 		      "\\(end\\|if\\|then\\|else\\|when\\|otherwise\\)\\>")
! 		     (not (simula-context)))
! 		    ;; yes - reindent
! 		    (let ((post-indent (simula-calculate-indent)))
! 		      (if (eq (current-indentation) post-indent)
! 			  ()
! 			(delete-horizontal-space)
! 			(indent-to post-indent)))))))
        (goto-char (- (point-max) origin))
        (if (eq (current-indentation) indent)
--- 391,414 ----
  	(case-fold-search t))
      (unwind-protect
! 	(if simula-electric-indent
! 	    (progn
! 	      ;;
! 	      ;; manually expand abbrev on last line, if any
! 	      ;;
! 	      (end-of-line 0)
! 	      (expand-abbrev)
! 	      ;; now maybe we should reindent that line
! 	      (beginning-of-line)
! 	      (skip-chars-forward " \t\f")
! 	      (if (and
! 		   (looking-at
! 		    "\\(end\\|if\\|then\\|else\\|when\\|otherwise\\)\\>")
! 		   (not (simula-context)))
! 		  ;; yes - reindent
! 		  (let ((post-indent (simula-calculate-indent)))
! 		    (if (eq (current-indentation) post-indent)
! 			()
! 		      (delete-horizontal-space)
! 		      (indent-to post-indent))))))
        (goto-char (- (point-max) origin))
        (if (eq (current-indentation) indent)
*************** The relative indentation among the lines
*** 364,375 ****
  	   ((memq (preceding-char) '(?d ?D))
  	    (setq return-value 2)
! 	    (while (and (memq (preceding-char) '(?d ?D)) (not return-value))
! 	      (while (and (re-search-forward
! 			   ";\\|\\<end\\>\\|\\<else\\>\\|\\<otherwise\\>\\|\\<when\\>\\|^%"
! 			   origin 'move)
! 			  (eq (preceding-char) ?%))
! 		(beginning-of-line 2)))
! 	    (if (looking-at "[ \t\n\f]*\\(;\\|\\<end\\>\\|\\<else\\>\\|\\<otherwise\\>\\|\\<when\\>\\)")
! 		(setq return-value nil)))
  	   ((memq (preceding-char) '(?! ?t ?T))
  	    ; skip comment
--- 533,552 ----
  	   ((memq (preceding-char) '(?d ?D))
  	    (setq return-value 2)
! 	    (while (and (re-search-forward
! 			 ";\\|\\<end\\>\\|\\<else\\>\\|\\<otherwise\\>\\|\\<when\\>\\|^%"
! 			 origin 'move)
! 			;; found another END?
! 			(or (memq (preceding-char) '(?d ?D))
! 			    ;; if directive, skip line
! 			    (and (eq (preceding-char) ?%)
! 				 (beginning-of-line 2))
! 			    ;; found other keyword, out of END comment
! 			    (setq return-value nil))))
! 	    (if (and (eq (char-syntax (preceding-char)) ?w)
! 		     (eq (char-syntax (following-char)) ?w))
! 		(save-excursion
! 		  (backward-word 1)
! 		  (if (looking-at "end\\>\\|else\\>\\|otherwise\\>\\|when\\>")
! 		      (setq return-value nil)))))
  	   ((memq (preceding-char) '(?! ?t ?T))
  	    ; skip comment
*************** The relative indentation among the lines
*** 406,413 ****
  	(case-fold-search t)
  	;; don't mix a label with an assignment operator := :-
! 	;; therefore look at next typed character...
! 	(next-char (setq unread-command-events (list (read-event))))
! 	(com-char last-command-char))
      (unwind-protect
  	;; Problem: find out if character just read is a command char
  	;; that would insert something after ':' making it a label.
--- 583,591 ----
  	(case-fold-search t)
  	;; don't mix a label with an assignment operator := :-
! 	;; therefore take a peek at next typed character...
! 	(next-char (read-event)))
      (unwind-protect
+ 	(setq unread-command-events (append unread-command-events
+ 					    (list next-char)))
  	;; Problem: find out if character just read is a command char
  	;; that would insert something after ':' making it a label.
*************** If COUNT is negative, move forward inste
*** 516,519 ****
--- 694,698 ----
  	  (origin (point)))
        (condition-case ()
+ 	  ;; 
  	  (progn
  	    (simula-skip-comment-backward)
*************** If COUNT is negative, move forward inste
*** 524,528 ****
  		      (backward-word -1)))
  	      (if (eq (preceding-char) ?\;)
! 		  (backward-char 1)))
  	    (while (and (natnump (setq count (1- count)))
  			(setq status (simula-search-backward
--- 703,708 ----
  		      (backward-word -1)))
  	      (if (eq (preceding-char) ?\;)
! 		  (backward-char 1))
! 	      )
  	    (while (and (natnump (setq count (1- count)))
  			(setq status (simula-search-backward
*************** If COUNT is negative, move backward inst
*** 564,568 ****
  
  
! (defun simula-skip-comment-backward ()
    "Search towards bob to find first char that is outside a comment."
    (interactive)
--- 744,748 ----
  
  
! (defun simula-skip-comment-backward (&optional stop-at-end)
    "Search towards bob to find first char that is outside a comment."
    (interactive)
*************** If COUNT is negative, move backward inst
*** 574,578 ****
  	    (save-excursion
  	      (backward-char 1)
! 	      (setq context (simula-context)))
  	  (setq context (simula-context)))
  	(cond
--- 754,760 ----
  	    (save-excursion
  	      (backward-char 1)
! 	      (setq context (simula-context))
! 	      (if (and stop-at-end (eq context 2))
! 		  (setq context nil)))
  	  (setq context (simula-context)))
  	(cond
*************** If COUNT is negative, move backward inst
*** 591,597 ****
  		      (memq (simula-context) '(0 1)))))
  	 ((eq context 1)
! 	  (end-of-line 0)
  	  (if (bobp)
! 	      (throw 'simula-out nil)))
  	 ((eq context 2)
  	  ;; an END-comment must belong to an END
--- 773,780 ----
  		      (memq (simula-context) '(0 1)))))
  	 ((eq context 1)
! 	  (beginning-of-line)
  	  (if (bobp)
! 	      (throw 'simula-out nil)
! 	    (backward-char)))
  	 ((eq context 2)
  	  ;; an END-comment must belong to an END
*************** If COUNT is negative, move backward inst
*** 610,613 ****
--- 793,798 ----
      (while t
        (skip-chars-forward " \t\n\f")
+       ;; BUG: the following (0 2) branches don't take into account intermixing
+       ;; directive lines
        (cond
         ((looking-at "!\\|\\<comment\\>")
*************** If COUNT is negative, move backward inst
*** 666,669 ****
--- 851,859 ----
  	    (current-column)
  	  (goto-char origin)))
+        ((eq where 1)
+ 	;;
+ 	;; Directive. Always 0.
+ 	;;
+ 	0)
         ;;
         ;; Detect missing string delimiters
*************** If COUNT is negative, move backward inst
*** 722,726 ****
  	  (setq indent simula-label-offset)))
  	;; find line with non-comment text
! 	(simula-skip-comment-backward)
  	(if (and found-end
  		 (not (eq (preceding-char) ?\;))
--- 912,916 ----
  	  (setq indent simula-label-offset)))
  	;; find line with non-comment text
! 	(simula-skip-comment-backward 'dont-skip-end)
  	(if (and found-end
  		 (not (eq (preceding-char) ?\;))
*************** If COUNT is negative, move backward inst
*** 933,937 ****
       ((eq simula-abbrev-stdproc 'upcase) (upcase-word -1))
       ((eq simula-abbrev-stdproc 'downcase) (downcase-word -1))
!      ((eq simula-abbrev-stdproc 'capitalize) (capitalize-word -1)))))
  
  
--- 1123,1134 ----
       ((eq simula-abbrev-stdproc 'upcase) (upcase-word -1))
       ((eq simula-abbrev-stdproc 'downcase) (downcase-word -1))
!      ((eq simula-abbrev-stdproc 'capitalize) (capitalize-word -1))
!      ((eq simula-abbrev-stdproc 'abbrev-table)
!       ;; If not in lowercase, expansions are always capitalized.
!       ;; We then want to replace with the exact expansion.
!       (if (equal (symbol-name last-abbrev) last-abbrev-text)
! 	  ()
! 	(downcase-word -1)
! 	(expand-abbrev))))))
  
  
*************** If COUNT is negative, move backward inst
*** 942,946 ****
       ((eq simula-abbrev-keyword 'upcase) (upcase-word -1))
       ((eq simula-abbrev-keyword 'downcase) (downcase-word -1))
!      ((eq simula-abbrev-keyword 'capitalize) (capitalize-word -1)))))
  
  
--- 1139,1148 ----
       ((eq simula-abbrev-keyword 'upcase) (upcase-word -1))
       ((eq simula-abbrev-keyword 'downcase) (downcase-word -1))
!      ((eq simula-abbrev-keyword 'capitalize) (capitalize-word -1))
!      ((eq simula-abbrev-stdproc 'abbrev-table)
!       (if (equal (symbol-name last-abbrev) last-abbrev-text)
! 	  ()
! 	(downcase-word -1)
! 	(expand-abbrev))))))
  
  
*************** If COUNT is negative, move backward inst
*** 987,995 ****
  			       (if (pos-visible-in-window-p)
  				   (sit-for 1)
! 				 (message
! 				  (concat "Matches "
  					  (buffer-substring
  					   (point)
! 					   (+ (point) (window-width))))))))
  			 (skip-chars-backward " \t\f")
  			 (bolp)))
--- 1189,1196 ----
  			       (if (pos-visible-in-window-p)
  				   (sit-for 1)
! 				 (message "Matches %s"
  					  (buffer-substring
  					   (point)
! 					   (+ (point) (window-width)))))))
  			 (skip-chars-backward " \t\f")
  			 (bolp)))
*************** If COUNT is negative, move backward inst
*** 1008,1053 ****
  
  
! (defun simula-search-backward (string &optional limit move)
!   (setq string (concat string "\\|\\<end\\>"))
!   (let (level)
!     (catch 'simula-out
!       (while (re-search-backward string limit move)
! 	(if (simula-context)
! 	    ()
! 	  (if (looking-at "\\<end\\>")
!               (progn
!                 (setq level 0)
!                 (while (natnump level)
!                   (re-search-backward "\\<begin\\>\\|\\<end\\>")
!                   (if (simula-context)
!                       ()
!                     (setq level (if (memq (following-char) '(?b ?B))
!                                     (1- level)
!                                   (1+ level))))))
!             (throw 'simula-out t)))))))
! 
! 
! (defun simula-search-forward (string &optional limit move)
!   (setq string (concat string "\\|\\<begin\\>"))
!   (let (level)
!     (catch 'exit
!       (while (re-search-forward string limit move)
! 	(goto-char (match-beginning 0))
! 	(if (simula-context)
! 	    (goto-char (1- (match-end 0)))
! 	  (if (looking-at "\\<begin\\>")
! 	      (progn
! 		(goto-char (1- (match-end 0)))
! 		(setq level 0)
! 		(while (natnump level)
! 		  (re-search-forward "\\<begin\\>\\|\\<end\\>")
! 		  (backward-word 1)
! 		  (if (not (simula-context))
! 		      (setq level (if (memq (following-char) '(?e ?E))
! 				      (1- level)
! 				    (1+ level))))
! 		  (backward-word -1)))
! 	    (goto-char (1- (match-end 0)))
! 	    (throw 'exit t)))))))
  
    
--- 1209,1331 ----
  
  
! (defun simula-search-backward (regexp &optional bound noerror)
!   "Search backward from point for regular expression REGEXP, ignoring matches
! found inside SIMULA comments, string literals, and BEGIN..END blocks.
! Set point to the end of the occurrence found, and return point.
! An optional second argument BOUND bounds the search, it is a buffer position.
! The match found must not extend after that position.  Optional third argument
! NOERROR, if t, means if fail just return nil (no error).
! If not nil and not t, move to limit of search and return nil."
!   (let (begin end context (comb-regexp (concat regexp "\\|\\<end\\>"))
! 	      match (start-point (point)))
!     (catch 'simula-backward
!       (while (re-search-backward comb-regexp bound 1)
! 	;; We have a match, check SIMULA context at match-beginning
! 	;; to see if we are outside comments etc.
! 	;; Set MATCH to t if we found a true match,
! 	;; set MATCH to 'BLOCK if we found a BEGIN..END block,
! 	;; else set MATCH to nil.
! 	(save-match-data
! 	  (setq context (simula-context))
! 	  (cond
! 	   ((eq context nil)
! 	    (setq match (if (looking-at regexp) t 'BLOCK)))
! ;;; A comment-ending semicolon is part of the comment, and shouldn't match.
! ;;;	     ((eq context 0)
! ;;;	      (setq match (if (eq (following-char) ?\;) t nil)))
! 	   ((eq context 2)
! 	    (setq match (if (and (looking-at regexp)
! 				 (looking-at ";\\|\\<end\\>\\|\\<else\\>\\|\\<otherwise\\>\\|\\<when\\>"))
! 			    t
! 			  (if (looking-at "\\<end\\>") 'BLOCK nil))))
! 	   (t (setq match nil))))
! 	;; Exit if true match
! 	(if (eq match t) (throw 'simula-backward (point)))
! 	(if (eq match 'BLOCK)
! 	;; We found the END of a block
! 	    (let ((level 0))
! 	      (while (natnump level)
! 		  (if (re-search-backward "\\<begin\\>\\|\\<end\\>" bound 1)
! 		      (let ((context (simula-context)))
! 			;;    We found a BEGIN -> decrease level count
! 			(cond ((and (eq context nil)
! 				   (memq (following-char) '(?b ?B)))
! 			       (setq level (1- level)))
! 			      ;; END -> increase level count
! 			      ((and (memq context '(nil 2))
! 				    (memq (following-char) '(?e ?E)))
! 			       (setq level (1+ level)))))
! 		    ;; Block search failed.  Action depends on noerror.
! 		    (if (or (not noerror) (eq noerror t))
! 			(goto-char start-point))
! 		    (if (not noerror)
! 			(signal 'search-failed (list regexp)))
! 		    (throw 'simula-backward nil))))))
!       ;; Search failed.  Action depends on noerror.
!       (if (or (not noerror) (eq noerror t))
! 	  (goto-char start-point))
!       (if noerror
! 	  nil
! 	(signal 'search-failed (list regexp))))))
! 
! 
! (defun simula-search-forward (regexp &optional bound noerror)
!   "Search forward from point for regular expression REGEXP, ignoring matches
! found inside SIMULA comments, string literals, and BEGIN..END blocks.
! Set point to the end of the occurrence found, and return point.
! An optional second argument BOUND bounds the search, it is a buffer position.
! The match found must not extend after that position.  Optional third argument
! NOERROR, if t, means if fail just return nil (no error).
! If not nil and not t, move to limit of search and return nil."
!   (let (begin end context (comb-regexp (concat regexp "\\|\\<begin\\>"))
! 	      match (start-point (point)))
!     (catch 'simula-forward
!       (while (re-search-forward comb-regexp bound 1)
! 	;; We have a match, check SIMULA context at match-beginning
! 	;; to see if we are outside comments.
! 	;; Set MATCH to t if we found a true match,
! 	;; set MATCH to 'BLOCK if we found a BEGIN..END block,
! 	;; else set MATCH to nil.
! 	(save-match-data
! 	  (save-excursion
! 	    (goto-char (match-beginning 0))
! 	    (setq context (simula-context))
! 	    (cond
! 	     ((not context)
! 	      (setq match (if (looking-at regexp) t 'BLOCK)))
! ;;; A comment-ending semicolon is part of the comment, and shouldn't match.
! ;;;	     ((eq context 0)
! ;;;	      (setq match (if (eq (following-char) ?\;) t nil)))
! 	     ((eq context 2)
! 	      (setq match (if (and (looking-at regexp)
! 				   (looking-at ";\\|\\<end\\>\\|\\<else\\>\\|\\<otherwise\\>\\|\\<when\\>")) t nil)))
! 	     (t (setq match nil)))))
! 	;; Exit if true match
! 	(if (eq match t) (throw 'simula-forward (point)))
! 	(if (eq match 'BLOCK)
! 	;; We found the BEGINning of a block
! 	    (let ((level 0))
! 	      (while (natnump level)
! 		  (if (re-search-forward "\\<begin\\>\\|\\<end\\>" bound 1)
! 		      (let ((context (simula-context)))
! 			;;    We found a BEGIN -> increase level count
! 			(cond ((eq context nil) (setq level (1+ level)))
! 			      ;; END -> decrease level count
! 			      ((and (eq context 2)
! 				    ;; Don't match BEGIN inside END comment
! 				    (memq (preceding-char) '(?d ?D)))
! 			       (setq level (1- level)))))
! 		    ;; Block search failed.  Action depends on noerror.
! 		    (if (or (not noerror) (eq noerror t))
! 			(goto-char start-point))
! 		    (if (not noerror)
! 			(signal 'search-failed (list regexp)))
! 		    (throw 'simula-forward nil))))))
!       ;; Search failed.  Action depends on noerror.
!       (if (or (not noerror) (eq noerror t))
! 	  (goto-char start-point))
!       (if noerror
! 	  nil
! 	(signal 'search-failed (list regexp))))))
  
    
*************** If COUNT is negative, move backward inst
*** 1288,1291 ****
--- 1566,1673 ----
  	    ("when" "WHEN" simula-electric-keyword)
  	    ("while" "WHILE" simula-expand-keyword))))
+ 
+ (if (and (fboundp 'hilit-set-mode-patterns)
+ 	 (boundp 'hilit-patterns-alist)
+ 	 (not (assoc 'simula-mode hilit-patterns-alist)))
+     (hilit-set-mode-patterns
+      'simula-mode
+      '(
+        ("^%\\([ \t\f].*\\)?$" nil comment)
+        ("^%include\\>" nil include)
+        ("\"[^\"\n]*\"\\|'.'\\|'![0-9]+!'" nil string)
+        ("\\<\\(ACTIVATE\\|AFTER\\|AND\\|ARRAY\\|AT\\|BEFORE\\|BEGIN\\|BOOLEAN\\|CHARACTER\\|CLASS\\|DELAY\\|DO\\|ELSE\\|END\\|EQ\\|EQV\\|EXTERNAL\\|FALSE\\|FOR\\|GE\\|GO\\|GOTO\\|GT\\|HIDDEN\\|IF\\|IMP\\|IN\\|INNER\\|INSPECT\\|INTEGER\\|IS\\|LABEL\\|LE\\|LONG\\|LT\\|NAME\\|NE\\|NEW\\|NONE\\|NOT\\|NOTEXT\\|OR\\|OTHERWISE\\|PRIOR\\|PROCEDURE\\|PROTECTED\\|QUA\\|REACTIVATE\\|REAL\\|REF\\|SHORT\\|STEP\\|SWITCH\\|TEXT\\|THEN\\|THIS\\|TO\\|TRUE\\|UNTIL\\|VALUE\\|VIRTUAL\\|WHEN\\|WHILE\\)\\>" nil keyword)
+        ("!\\|\\<COMMENT\\>" ";" comment))
+      nil 'case-insensitive))
+ 
+ (setq simula-find-comment-point -1
+       simula-find-comment-context nil)
+ 
+ ;; function used by hilit19
+ (defun simula-find-next-comment-region (param)
+   "Return region (start end) cons of comment after point, or NIL"
+   (let (start end)
+     ;; This function is called repeatedly, check if point is
+     ;; where we left it in the last call
+     (if (not (eq simula-find-comment-point (point)))
+ 	(setq simula-find-comment-point (point)
+ 	      simula-find-comment-context (simula-context)))
+     ;; loop as long as we haven't found the end of a comment
+     (if (memq simula-find-comment-context '(0 1 2))
+ 	(setq start (point))
+       (if (re-search-forward "\\<end\\>\\|!\\|\"\\|'\\|^%\\|\\<comment\\>"
+ 			     nil 'move)
+ 	  (let ((previous-char (preceding-char)))
+ 	    (cond
+ 	     ((memq previous-char '(?d ?D))
+ 	      (setq start (point)
+ 		    simula-find-comment-context 2))
+ 	     ((memq previous-char '(?t ?T ?\!))
+ 	      (setq start (point)
+ 		    simula-find-comment-context 0))
+ 	     ((eq previous-char ?%)
+ 	      (setq start (point)
+ 		    simula-find-comment-context 0))))))
+     ;; BUG: the following (0 2) branches don't take into account intermixing
+     ;; directive lines
+     (cond
+      ((eq simula-find-comment-context 0)
+       (search-forward ";" nil 'move))
+      ((eq simula-find-comment-context 1)
+       (beginning-of-line 2))
+      ((eq simula-find-comment-context 2)
+       (re-search-forward ";\\|\\<end\\>\\|\\<else\\>\\|\\<otherwise\\>\\|\\<when\\>\\" (point-max) 'move)))
+     (if start
+ 	(setq end (point)))
+     ;; save point for later calls to this function
+     (setq simula-find-comment-point (if end (point) -1))
+     (and end (cons start end))))
+ 
+ (if (not (fboundp 'save-match-data))
+     (defmacro save-match-data (&rest body)
+       "Execute the BODY forms, restoring the global value of the match data."
+       (let ((original (make-symbol "match-data")))
+ 	(list
+ 	 'let (list (list original '(match-data)))
+ 	 (list 'unwind-protect
+ 	       (cons 'progn body)
+ 	       (list 'store-match-data original))))))
+ 
+ 
+ ;; defuns for submitting bug reports
+ 
+ (defconst simula-mode-help-address "simula-mode@ifi.uio.no"
+   "Address accepting submission of simula-mode bug reports.")
+ 
+ ;; get reporter-submit-bug-report when byte-compiling
+ (and (fboundp 'eval-when-compile)
+      (eval-when-compile
+       (require 'reporter)))
+ 
+ (defun simula-submit-bug-report ()
+   "Submit via mail a bug report on simula-mode."
+   (interactive)
+   (and
+    (y-or-n-p "Do you want to submit a report on simula-mode? ")
+    (require 'reporter)
+    (reporter-submit-bug-report
+     simula-mode-help-address
+     (concat "simula-mode from Emacs " emacs-version)
+     (list
+      ;; report only the vars that affect indentation
+      'simula-emacs-features
+      'simula-indent-level
+      'simula-substatement-offset
+      'simula-continued-statement-offset
+      'simula-label-offset
+      'simula-if-indent
+      'simula-inspect-indent
+      'simula-electric-indent
+      'simula-abbrev-keyword
+      'simula-abbrev-stdproc
+      'simula-abbrev-file
+      'simula-tab-always-indent
+      ))))
+ 
+ (provide 'simula-mode)
  
  ;;; simula.el ends here
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/skeleton.el emacs-19.31/lisp/skeleton.el
*** emacs-19.30/lisp/skeleton.el	Thu Nov  2 22:27:01 1995
--- emacs-19.31/lisp/skeleton.el	Fri Mar  1 10:37:16 1996
***************
*** 1,3 ****
--- 1,4 ----
  ;;; skeleton.el --- Lisp language extension for writing statement skeletons
+ 
  ;; Copyright (C) 1993, 1994, 1995 by Free Software Foundation, Inc.
  
***************
*** 19,24 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** strings with the subskeleton being repea
*** 201,205 ****
  Quoted lisp-expressions are evaluated evaluated for their side-effect.
  Other lisp-expressions are evaluated and the value treated as above.
! Note that expressions may not return `t' since this impplies an
  endless loop.  Modes can define other symbols by locally setting them
  to any valid skeleton element.  The following local variables are
--- 203,207 ----
  Quoted lisp-expressions are evaluated evaluated for their side-effect.
  Other lisp-expressions are evaluated and the value treated as above.
! Note that expressions may not return `t' since this implies an
  endless loop.  Modes can define other symbols by locally setting them
  to any valid skeleton element.  The following local variables are
*************** symmetrical ones, and the same character
*** 512,515 ****
--- 514,519 ----
  ;;;      (setq i (1+ i))))
  ;;;  (run-hooks 'mirror-mode-hook))
+ 
+ (provide 'skeleton)
  
  ;; skeleton.el ends here
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/solar.el emacs-19.31/lisp/solar.el
*** emacs-19.30/lisp/solar.el	Wed Sep 20 22:48:32 1995
--- emacs-19.31/lisp/solar.el	Fri Apr 26 20:12:26 1996
***************
*** 4,7 ****
--- 4,8 ----
  
  ;; Author: Edward M. Reingold <reingold@cs.uiuc.edu>
+ ;;	Denis B. Roegel <Denis.Roegel@loria.fr>
  ;; Keywords: calendar
  ;; Human-Keywords: sunrise, sunset, equinox, solstice, calendar, diary,
***************
*** 21,26 ****
  
  ;; 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:
--- 22,28 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 28,49 ****
  ;; This collection of functions implements the features of calendar.el,
  ;; diary.el, and holiday.el that deal with times of day, sunrise/sunset, and
! ;; eqinoxes/solstices.
  
  ;; Based on the ``Almanac for Computers 1984,'' prepared by the Nautical
  ;; Almanac Office, United States Naval Observatory, Washington, 1984, on
  ;; ``Astronomical Formulae for Calculators,'' 3rd ed., by Jean Meeus,
! ;; Willmann-Bell, Inc., 1985, and on ``Astronomical Algorithms'' by Jean
! ;; Meeus, Willmann-Bell, Inc., 1991.
  
  ;;
! ;; WARNINGS:
! ;;    1. SUNRISE/SUNSET calculations will be accurate only to +/- 2 minutes.
! ;;       Locations should be between +/- 65 degrees of latitude.
! ;;       Dates should be in the latter half of the 20th century.
  ;;
! ;;    2. Equinox/solstice times will be accurate only to +/- 15 minutes.
! 
! ;; The author would be delighted to have an astronomically more sophisticated
! ;; person rewrite the code for the solar calculations in this file!
  
  ;; Comments, corrections, and improvements should be sent to
--- 30,50 ----
  ;; This collection of functions implements the features of calendar.el,
  ;; diary.el, and holiday.el that deal with times of day, sunrise/sunset, and
! ;; equinoxes/solstices.
  
  ;; Based on the ``Almanac for Computers 1984,'' prepared by the Nautical
  ;; Almanac Office, United States Naval Observatory, Washington, 1984, on
  ;; ``Astronomical Formulae for Calculators,'' 3rd ed., by Jean Meeus,
! ;; Willmann-Bell, Inc., 1985, on ``Astronomical Algorithms'' by Jean Meeus,
! ;; Willmann-Bell, Inc., 1991, and on ``Planetary Programs and Tables from
! ;; -4000 to +2800'' by Pierre Bretagnon and Jean-Louis Simon, Willmann-Bell,
! ;; Inc., 1986.
  
  ;;
! ;; Accuracy:
! ;;    1. Sunrise/sunset times will be accurate to the minute for years
! ;;       1951--2050.  For other years the times will be within +/- 2 minutes.
  ;;
! ;;    2. Equinox/solstice times will be accurate to the minute for years
! ;;       1951--2050.  For other years the times will be within +/- 1 minute.
  
  ;; Comments, corrections, and improvements should be sent to
***************
*** 60,63 ****
--- 61,65 ----
  
  (require 'cal-dst)
+ (require 'cal-julian)
  
  ;;;###autoload
*************** can be a vector [degrees minutes north/s
*** 87,91 ****
  York City.
  
! This variable should be set in site-local.el.")
  
  ;;;###autoload
--- 89,93 ----
  York City.
  
! This variable should be set in `site-start'.el.")
  
  ;;;###autoload
*************** can be a vector [degrees minutes east/we
*** 98,102 ****
  York City.
  
! This variable should be set in site-local.el.")
  
  (defsubst calendar-latitude ()
--- 100,104 ----
  York City.
  
! This variable should be set in `site-start'.el.")
  
  (defsubst calendar-latitude ()
*************** For example, \"New York City\".  Default
*** 142,146 ****
  pair.
  
! This variable should be set in site-local.el.")
  
  (defvar solar-n-hemi-seasons
--- 144,161 ----
  pair.
  
! This variable should be set in `site-start'.el.")
! 
! (defvar solar-error 0.5
! "*Tolerance (in minutes) for sunrise/sunset calculations.
! 
! A larger value makes the calculations for sunrise/sunset faster, but less
! accurate.  The default is half a minute (30 seconds), so that sunrise/sunset
! times will be correct to the minute.
! 
! It is useless to set the value smaller than 4*delta, where delta is the
! accuracy in the longitude of the sun (given by the function
! `solar-ecliptic-coordinates') in degrees since (delta/360) x (86400/60) = 4 x
! delta.  At present, delta = 0.01 degrees, so the value of the variable
! `solar-error' should be at least 0.04 minutes (about 2.5 seconds).")
  
  (defvar solar-n-hemi-seasons
*************** This variable should be set in site-loca
*** 152,155 ****
--- 167,178 ----
    "List of season changes for the southern hemisphere.")
  
+ (defvar solar-sidereal-time-greenwich-midnight 
+    nil 
+    "Sidereal time at Greenwich at midnight (universal time).")
+ 
+ (defvar solar-spring-or-summer-season nil  
+   "T if spring or summer and nil otherwise.
+ Needed for polar areas, in order to know whether the day lasts 0 or 24 hours.")
+ 
  (defun solar-setup ()
    "Prompt user for latitude, longitude, and time zone."
*************** Returns nil if nothing was entered."
*** 175,187 ****
          (string-to-int x))))
  
! (defsubst solar-sin-degrees (x)
!   (sin (degrees-to-radians (mod x 360.0))))
! 
! (defsubst solar-cosine-degrees (x)
!   (cos (degrees-to-radians (mod x 360.0))))
! 
! (defsubst solar-tangent-degrees (x)
!   (tan (degrees-to-radians (mod x 360.0))))
! 
  (defun solar-xy-to-quadrant (x y)
    "Determines the quadrant of the point X, Y."
--- 198,216 ----
          (string-to-int x))))
  
! ;; The condition-case stuff is needed to catch bogus arithmetic
! ;; exceptions that occur on some machines (like Sparcs)
! (defun solar-sin-degrees (x)
!   (condition-case nil
!       (sin (degrees-to-radians (mod x 360.0)))
!     (solar-sin-degrees x)))
! (defun solar-cosine-degrees (x)
!    (condition-case nil
!        (cos (degrees-to-radians (mod x 360.0)))
!      (solar-cosine-degrees x)))
! (defun solar-tangent-degrees (x)
!   (condition-case nil
!       (tan (degrees-to-radians (mod x 360.0)))
!     (solar-tangent-degrees x)))
!       
  (defun solar-xy-to-quadrant (x y)
    "Determines the quadrant of the point X, Y."
*************** Returns nil if nothing was entered."
*** 202,321 ****
  	  (t                deg))))
  
  (defun solar-arccos (x)
!   (let ((y (sqrt (- 1 (* x x)))))
!     (solar-arctan (/ y x) (solar-xy-to-quadrant x y))))
  
  (defun solar-arcsin (y)
!   (let ((x (sqrt (- 1 (* y y)))))
!     (solar-arctan (/ y x) (solar-xy-to-quadrant x y))))
! 
! (defconst solar-earth-inclination 23.441884 
!   "Inclination of earth's equator to its solar orbit in degrees.")
! 
! (defconst solar-cos-inclination (solar-cosine-degrees solar-earth-inclination) 
!   "Cosine of earth's inclination.")
! 
! (defconst solar-sin-inclination (solar-sin-degrees solar-earth-inclination)
!   "Sine of earth's inclination.")
! 
! (defconst solar-earth-orbit-eccentricity 0.016718
!   "Eccentricity of orbit of the earth around the sun.")
! 
! (defsubst solar-degrees-to-hours (deg)
!   (/ deg 15.0))
  
  (defsubst solar-hours-to-days (hour)
    (/ hour 24.0))
  
! (defun solar-longitude-of-sun (day)
!   "Longitude of the sun at DAY in the year."
!   (let ((mean-anomaly (- (* 0.9856 day) 3.289)))
!     (mod (+ mean-anomaly 
! 	    (* 1.916 (solar-sin-degrees mean-anomaly))
! 	    (* 0.020 (solar-sin-degrees (* 2 mean-anomaly)))
! 	    282.634)
! 	 360)))
! 
! (defun solar-right-ascension (longitude)
!   "Right ascension of the sun, given its LONGITUDE."
    (solar-degrees-to-hours
     (solar-arctan
!     (* solar-cos-inclination (solar-tangent-degrees longitude))
      (solar-degrees-to-quadrant longitude))))
  
! (defun solar-declination (longitude)
!   "Declination of the sun, given its LONGITUDE."
    (solar-arcsin
!    (* solar-sin-inclination
        (solar-sin-degrees longitude))))
  
! (defun solar-sunrise (date)
!   "Calculates the *standard* time of sunrise for Gregorian DATE.
! Calculation is for location given by `calendar-latitude' and
! `calendar-longitude'.
! 
! Returns a decimal fraction of hours.  Returns nil if the sun does not rise at
! that location on that day."
!   (let* ((day-of-year (calendar-day-number date))
! 	 (approx-sunrise
!           (+ day-of-year
!              (solar-hours-to-days
!               (-  6 (solar-degrees-to-hours (calendar-longitude))))))
! 	 (solar-longitude-of-sun-at-sunrise
!           (solar-longitude-of-sun approx-sunrise))
! 	 (solar-right-ascension-at-sunrise
!           (solar-right-ascension solar-longitude-of-sun-at-sunrise))
! 	 (solar-declination-at-sunrise
!           (solar-declination solar-longitude-of-sun-at-sunrise))
! 	 (cos-local-sunrise
!           (/ (- (solar-cosine-degrees (+ 90 (/ 50.0 60.0)))
!                 (* (solar-sin-degrees solar-declination-at-sunrise)
!                    (solar-sin-degrees (calendar-latitude))))
!              (* (solar-cosine-degrees solar-declination-at-sunrise)
!                 (solar-cosine-degrees (calendar-latitude))))))
!     (if (<= (abs cos-local-sunrise) 1);; otherwise, no sunrise that day
!       (let* ((local-sunrise (solar-degrees-to-hours
!                              (- 360 (solar-arccos cos-local-sunrise))))
!              (local-mean-sunrise
! 	      (mod (- (+ local-sunrise solar-right-ascension-at-sunrise)
! 		      (+ (* 0.065710 approx-sunrise)
! 			 6.622))
! 		   24)))
! 	(+ (- local-mean-sunrise (solar-degrees-to-hours (calendar-longitude)))
! 	   (/ calendar-time-zone 60.0))))))
! 
! (defun solar-sunset (date)
!   "Calculates the *standard* time of sunset for Gregorian DATE.
! Calculation is for location given by `calendar-latitude' and
! `calendar-longitude'.
! 
! Returns a decimal fractions of hours.  Returns nil if the sun does not set at
! that location on that day."
!   (let* ((day-of-year (calendar-day-number date))
! 	 (approx-sunset
!           (+ day-of-year
!              (solar-hours-to-days
!               (- 18 (solar-degrees-to-hours (calendar-longitude))))))
! 	 (solar-longitude-of-sun-at-sunset
!           (solar-longitude-of-sun approx-sunset))
! 	 (solar-right-ascension-at-sunset
!           (solar-right-ascension solar-longitude-of-sun-at-sunset))
! 	 (solar-declination-at-sunset
!           (solar-declination solar-longitude-of-sun-at-sunset))
! 	 (cos-local-sunset
!           (/ (- (solar-cosine-degrees (+ 90 (/ 50.0 60.0)))
!                 (* (solar-sin-degrees solar-declination-at-sunset)
!                    (solar-sin-degrees (calendar-latitude))))
!              (* (solar-cosine-degrees solar-declination-at-sunset)
!                 (solar-cosine-degrees (calendar-latitude))))))
!     (if (<= (abs cos-local-sunset) 1);; otherwise, no sunset that day
!       (let* ((local-sunset (solar-degrees-to-hours
!                             (solar-arccos cos-local-sunset)))
!              (local-mean-sunset
! 	      (mod (- (+ local-sunset solar-right-ascension-at-sunset)
! 		      (+ (* 0.065710 approx-sunset) 6.622))
! 		   24)))
! 	(+ (- local-mean-sunset (solar-degrees-to-hours (calendar-longitude)))
! 	   (/ calendar-time-zone 60.0))))))
  
  (defun solar-time-string (time time-zone)
--- 231,345 ----
  	  (t                deg))))
  
+ (defun solar-atn2 (x y)
+    "Arctan of point X, Y."
+    (if (= x 0)
+        (if (> y 0) 90 270)
+      (solar-arctan (/ y x) x)))
+ 
  (defun solar-arccos (x)
!      "Arcos of X."
!      (let ((y (sqrt (- 1 (* x x)))))
!        (solar-atn2 x y)))
  
  (defun solar-arcsin (y)
!      "Arcsin of Y."
!      (let ((x (sqrt (- 1 (* y y)))))
!        (solar-atn2 x y)
!        ))
! 
! (defsubst solar-degrees-to-hours (degrees)
!   "Convert DEGREES to hours."
!   (/ degrees 15.0))
  
  (defsubst solar-hours-to-days (hour)
+   "Convert HOUR to decimal fraction of a day."
    (/ hour 24.0))
  
! (defun solar-right-ascension (longitude obliquity)
!   "Right ascension of the sun, in hours, given LONGITUDE and OBLIQUITY.
! Both arguments are in degrees."
    (solar-degrees-to-hours
     (solar-arctan
!     (* (solar-cosine-degrees obliquity) (solar-tangent-degrees longitude))
      (solar-degrees-to-quadrant longitude))))
  
! (defun solar-declination (longitude obliquity)
!   "Declination of the sun, in degrees, given LONGITUDE and OBLIQUITY.
! Both arguments are in degrees."
    (solar-arcsin
!    (* (solar-sin-degrees obliquity)
        (solar-sin-degrees longitude))))
  
! (defun solar-sunrise-and-sunset (time latitude longitude)
!   "Sunrise, sunset and length of day. 
! Parameters are the midday TIME and the LATITUDE, LONGITUDE of the location.
! 
! TIME is a pair with the first component being the number of Julian centuries
! elapsed at 0 Universal Time, and the second component being the universal
! time.  For instance, the pair corresponding to November 28, 1995 at 16 UT is
! \(-0.040945 16), -0.040945 being the number of julian centuries elapsed between
! Jan 1, 2000 at 12 UT and November 28, 1995 at 0 UT.
! 
! Coordinates are included because this function is called with latitude=10
! degrees to find out if polar regions have 24 hours of sun or only night."
!   (let* ((rise-time (solar-moment -1 latitude longitude time))
!          (set-time (solar-moment 1 latitude longitude time))
!          (day-length))
!     (if (not (and rise-time set-time))
!         (if (or (and (> latitude 0) solar-spring-or-summer-season)
!                 (and (< latitude 0) (not solar-spring-or-summer-season)))
!           (setq day-length 24)
!           (setq day-length 0))
!         (setq day-length (- set-time rise-time)))
!     (list (if rise-time (+ rise-time (/ calendar-time-zone 60.0)) nil)
!           (if set-time (+ set-time (/ calendar-time-zone 60.0)) nil)
!           day-length)))
! 
! (defun solar-moment (direction latitude longitude time)
!   "Sunrise/sunset at location.
! Sunrise if DIRECTION =-1 or sunset if =1 at LATITUDE, LONGITUDE, with midday
! being TIME.
! 
! TIME is a pair with the first component being the number of Julian centuries
! elapsed at 0 Universal Time, and the second component being the universal
! time.  For instance, the pair corresponding to November 28, 1995 at 16 UT is
! \(-0.040945 16), -0.040945 being the number of julian centuries elapsed between
! Jan 1, 2000 at 12 UT and November 28, 1995 at 0 UT.
! 
! Uses binary search."
!   (let* ((ut (car (cdr time)))
!          (possible 1) ; we assume that rise or set are possible
!          (utmin (+ ut (* direction 12.0))) 
!          (utmax ut)    ; the time searched is between utmin and utmax
!             ; utmin and utmax are in hours
!          (utmoment-old 0.0)    ; rise or set approximation
!          (utmoment 1.0) ; rise or set approximation
!          (hut 0)         ; sun height at utmoment
!          (t0 (car time))
!          (hmin (car (cdr 
!                (solar-horizontal-coordinates (list t0 utmin) 
!                                                 latitude longitude t))))
!          (hmax (car (cdr 
!                (solar-horizontal-coordinates (list t0 utmax) 
!                                                 latitude longitude t)))))
!        ; -0.61 degrees is the height of the middle of the sun, when it rises
!        ;   or sets.
!      (if (< hmin -0.61) 
!               (if (> hmax -0.61)
!                   (while ;(< i 20) ; we perform a simple dichotomy
!                          ; (> (abs (+ hut 0.61)) epsilon)
!                          (>= (abs (- utmoment utmoment-old))
!                              (/ solar-error 60))
!                     (setq utmoment-old utmoment)
!                     (setq utmoment (/ (+ utmin utmax) 2))
!                     (setq hut (car (cdr 
!                                     (solar-horizontal-coordinates 
!                                    (list t0 utmoment) latitude longitude t))))
!                     (if (< hut -0.61) (setq utmin utmoment))
!                     (if (> hut -0.61) (setq utmax utmoment))
!                    )
!                 (setq possible 0)) ; the sun never rises
!                 (setq possible 0)) ; the sun never sets
!      (if (equal possible 0) nil utmoment)))
  
  (defun solar-time-string (time time-zone)
*************** Format used is given by `calendar-time-d
*** 330,347 ****
      (mapconcat 'eval calendar-time-display-form "")))
  
  (defun solar-sunrise-sunset (date)
!   "String giving local times of sunrise and sunset on Gregorian DATE."
!   (let* ((rise (solar-sunrise date))
!          (adj-rise (if rise (dst-adjust-time date rise)))
!          (set (solar-sunset date))
!          (adj-set (if set (dst-adjust-time date set))))
!     (format "%s, %s at %s"
! 	    (if (and rise (calendar-date-equal date (car adj-rise)))
! 		(concat "Sunrise " (apply 'solar-time-string (cdr adj-rise)))
! 	      "No sunrise")
! 	    (if (and set (calendar-date-equal date (car adj-set)))
! 		(concat "sunset " (apply 'solar-time-string (cdr adj-set)))
! 	      "no sunset")
! 	    (eval calendar-location-name))))
  
  (defun solar-date-next-longitude (d l)
--- 354,463 ----
      (mapconcat 'eval calendar-time-display-form "")))
  
+ 
+ (defun solar-daylight (time)
+   "Printable form for time expressed in hours."
+   (format "%d:%02d"
+           (floor time)
+           (floor (* 60 (- time (floor time))))))
+ 
+ (defun solar-exact-local-noon (date)
+   "Date and Universal Time of local noon at *local date* date. 
+ 
+ The date may be different from the one asked for, but it will be the right
+ local date.  The second component of date should be an integer."
+   (let* ((nd date)
+          (ut (- 12.0 (/ (calendar-longitude) 15)))
+          (te (solar-time-equation date ut)))
+     (setq ut (- ut te))
+     (if (>= ut 24)
+         (progn 
+           (setq nd (list (car date) (+ 1 (car (cdr date)))
+                          (car (cdr (cdr date)))))
+           (setq ut (- ut 24))))
+     (if (< ut 0)
+         (progn 
+           (setq nd (list (car date) (- (car (cdr date)) 1)
+                          (car (cdr (cdr date)))))
+           (setq ut (+ ut 24))))
+     (setq nd (calendar-gregorian-from-absolute
+                        (calendar-absolute-from-gregorian nd)))
+         ; date standardization
+     (list nd ut)))
+ 
  (defun solar-sunrise-sunset (date)
!   "List of *local* times of sunrise, sunset, and daylight on Gregorian DATE.
! 
! Corresponding value is nil if there is no sunrise/sunset."
!   (let* (; first, get the exact moment of local noon.
!          (exact-local-noon (solar-exact-local-noon date))
!          ; get the the time from the 2000 epoch.
!          (t0 (solar-julian-ut-centuries (car exact-local-noon)))
!          ; store the sidereal time at Greenwich at midnight of UT time.
!          ; find if summer or winter slightly above the equator
!          (equator-rise-set
!           (progn (setq solar-sidereal-time-greenwich-midnight 
!                        (solar-sidereal-time t0))
!                  (solar-sunrise-and-sunset 
!                   (list t0 (car (cdr exact-local-noon)))
!                   10.0
!                   (calendar-longitude))))
!          ; store the spring/summer information,
!          ; compute sunrise and sunset (two first components of rise-set).
!          ; length of day is the third component (it is only the difference
!          ; between sunset and sunrise when there is a sunset and a sunrise)
!          (rise-set
!           (progn
!             (setq solar-spring-or-summer-season 
!                   (if (> (car (cdr (cdr equator-rise-set))) 12) 1 0))
!             (solar-sunrise-and-sunset 
!              (list t0 (car (cdr exact-local-noon)))
!              (calendar-latitude)
!              (calendar-longitude))))
!          (rise (car rise-set))
!          (adj-rise (if rise (dst-adjust-time date rise) nil))
!          (set (car (cdr rise-set)))
!          (adj-set (if set (dst-adjust-time date set) nil))
!          (length  (car (cdr (cdr rise-set)))) )
!     (list
!      (and rise (calendar-date-equal date (car adj-rise)) (cdr adj-rise))
!      (and set (calendar-date-equal date (car adj-set)) (cdr adj-set))
!      (solar-daylight length))))
! 
! (defun solar-sunrise-sunset-string (date)
!   "String of *local* times of sunrise, sunset, and daylight on Gregorian DATE."
!   (let ((l (solar-sunrise-sunset date)))
!     (format
!      "%s, %s at %s (%s hours daylight)"
!      (if (car l)
!          (concat "Sunrise " (apply 'solar-time-string (car l)))
!        "No sunrise")
!      (if (car (cdr l))
!          (concat "sunset " (apply 'solar-time-string (car (cdr l))))
!        "no sunset")
!      (eval calendar-location-name)
!      (car (cdr (cdr l))))))
! 
! (defun solar-julian-ut-centuries (date)
!   "Number of Julian centuries elapsed since 1 Jan, 2000 at noon  U.T. for Gregorian DATE."
!   (/ (- (calendar-absolute-from-gregorian date) 
!         (calendar-absolute-from-gregorian '(1 1.5 2000)))
!      36525.0))
!   
! (defun solar-ephemeris-time(time)
!   "Ephemeris Time at moment TIME.
! 
! TIME is a pair with the first component being the number of Julian centuries
! elapsed at 0 Universal Time, and the second component being the universal
! time.  For instance, the pair corresponding to November 28, 1995 at 16 UT is
! \(-0.040945 16), -0.040945 being the number of julian centuries elapsed between
! Jan 1, 2000 at 12 UT and November 28, 1995 at 0 UT.
! 
! Result is in julian centuries of ephemeris time."
!   (let* ((t0 (car time))
!          (ut (car (cdr time)))
!          (t1 (+ t0 (/ (/ ut 24.0) 36525)))
!          (y (+ 2000 (* 100 t1)))
!          (dt (* 86400 (solar-ephemeris-correction (floor y)))))
!       (+ t1 (/ (/ dt 86400) 36525))))
  
  (defun solar-date-next-longitude (d l)
*************** calendar-time-zone are used to interpret
*** 381,387 ****
      (/ (+ start end) 2.0)))
  
  (defun solar-longitude (d)
    "Longitude of sun on astronomical (Julian) day number D.
! Accurary is about 0.01 degree (about 365.25*24*60*0.01/360 = 15 minutes).
  
  The values of calendar-daylight-savings-starts,
--- 497,608 ----
      (/ (+ start end) 2.0)))
  
+ (defun solar-horizontal-coordinates 
+           (time latitude longitude for-sunrise-sunset)
+   "Azimuth and height of the sun at TIME, LATITUDE, and LONGITUDE.
+ 
+ TIME is a pair with the first component being the number of Julian centuries
+ elapsed at 0 Universal Time, and the second component being the universal
+ time.  For instance, the pair corresponding to November 28, 1995 at 16 UT is
+ \(-0.040945 16), -0.040945 being the number of julian centuries elapsed between
+ Jan 1, 2000 at 12 UT and November 28, 1995 at 0 UT.
+ 
+ The azimuth is given in degrees as well as the height (between -180 and 180)."
+   (let* ((ut (car (cdr time)))
+          (ec (solar-equatorial-coordinates time for-sunrise-sunset))
+          (st (+ solar-sidereal-time-greenwich-midnight
+                 (* ut 1.00273790935)))
+          (ah (- (* st 15) (* 15 (car ec)) (* -1 (calendar-longitude))))
+                        ; hour angle (in degrees)
+          (de (car (cdr ec)))
+          (azimuth (solar-atn2 (- (* (solar-cosine-degrees ah)
+                                    (solar-sin-degrees latitude))
+                                 (* (solar-tangent-degrees de)
+                                    (solar-cosine-degrees latitude)))
+                               (solar-sin-degrees ah)))
+          (height (solar-arcsin 
+                   (+ (* (solar-sin-degrees latitude) (solar-sin-degrees de))
+                      (* (solar-cosine-degrees latitude)
+                         (solar-cosine-degrees de)
+                         (solar-cosine-degrees ah))))))
+     (if (> height 180) (setq height (- height 360)))
+     (list azimuth height)))
+ 
+ (defun solar-equatorial-coordinates (time for-sunrise-sunset)
+   "Right ascension (in hours) and declination (in degrees) of the sun at TIME.
+ 
+ TIME is a pair with the first component being the number of Julian centuries
+ elapsed at 0 Universal Time, and the second component being the universal
+ time.  For instance, the pair corresponding to November 28, 1995 at 16 UT is
+ \(-0.040945 16), -0.040945 being the number of julian centuries elapsed between
+ Jan 1, 2000 at 12 UT and November 28, 1995 at 0 UT."
+    (let* ((tm (solar-ephemeris-time time)) 
+           (ec (solar-ecliptic-coordinates tm for-sunrise-sunset)))
+      (list (solar-right-ascension (car ec) (car (cdr ec)))
+            (solar-declination (car ec) (car (cdr ec))))))
+ 
+ (defun solar-ecliptic-coordinates (time for-sunrise-sunset)
+   "Apparent longitude of the sun, ecliptic inclination, (both in degrees)
+ equation of time (in hours) and nutation in longitude (in seconds)
+ at moment `time', expressed in julian centuries of Ephemeris Time
+ since January 1st, 2000, at 12 ET."
+   (let* ((l (+ 280.46645
+                (* 36000.76983 time)
+                (* 0.0003032 time time))) ; sun mean longitude 
+          (ml (+ 218.3165
+                 (* 481267.8813 time))) ; moon mean longitude 
+          (m (+ 357.52910
+                (* 35999.05030 time)
+                (* -0.0001559 time time)
+                (* -0.00000048 time time time))) ; sun mean anomaly 
+          (i (+ 23.43929111 (* -0.013004167 time)
+                (* -0.00000016389 time time)
+                (* 0.0000005036 time time time))); mean inclination 
+          (c (+ (* (+ 1.914600
+                      (* -0.004817 time)
+                      (* -0.000014 time time))
+                   (solar-sin-degrees m))
+                (* (+ 0.019993 (* -0.000101 time))
+                   (solar-sin-degrees (* 2 m)))
+                (* 0.000290
+                   (solar-sin-degrees (* 3 m))))) ; center equation 
+          (L (+ l c)) ; total longitude 
+          (omega (+ 125.04
+                    (* -1934.136 time))) ; longitude of moon's ascending node
+                                         ; on the ecliptic
+          (nut (if (not for-sunrise-sunset)
+                  (+ (* -17.20 (solar-sin-degrees omega))
+                  (* -1.32 (solar-sin-degrees (* 2 l)))
+                  (* -0.23 (solar-sin-degrees (* 2 ml)))
+                  (* 0.21 (solar-sin-degrees (* 2 omega))))
+                nil))
+                   ; nut = nutation in longitude, measured in seconds of angle.
+          (ecc (if (not for-sunrise-sunset)
+                  (+ 0.016708617
+                  (* -0.000042037 time)
+                  (* -0.0000001236 time time)) ; eccentricity of earth's orbit
+                nil))
+          (app (+ L
+                  -0.00569
+                  (* -0.00478
+                     (solar-sin-degrees omega)))) ; apparent longitude of sun
+          (y (if (not for-sunrise-sunset)
+                  (* (solar-tangent-degrees (/ i 2)) 
+                   (solar-tangent-degrees (/ i 2)))
+                 nil))
+          (time-eq (if (not for-sunrise-sunset)
+                     (/ (* 12 (+ (* y (solar-sin-degrees (* 2 l)))
+                      (* -2 ecc (solar-sin-degrees m))
+                      (* 4 ecc y (solar-sin-degrees m) 
+                                 (solar-cosine-degrees (* 2 l)))
+                      (* -0.5 y y  (solar-sin-degrees (* 4 l)))
+                      (* -1.25 ecc ecc (solar-sin-degrees (* 2 m)))))
+                       3.1415926535)
+                     nil)))
+                   ; equation of time, in hours
+     (list app i time-eq nut)))
+ 
  (defun solar-longitude (d)
    "Longitude of sun on astronomical (Julian) day number D.
! Accurary is about 0.0006 degree (about 365.25*24*60*0.0006/360 = 1 minutes).
  
  The values of calendar-daylight-savings-starts,
*************** calendar-daylight-savings-ends-time, cal
*** 390,404 ****
  calendar-time-zone are used to interpret local time."
    (let* ((a-d (calendar-absolute-from-astro d))
-          (date (calendar-gregorian-from-absolute (floor a-d)))
-          (time (* 24 (- a-d (truncate a-d))))
- 	 (rounded-abs-date (+ (calendar-absolute-from-gregorian date)
- 			      (/ (round (* 60 time)) 60.0 24.0)))
-          ;; get local standard time
- 	 (a-d (- rounded-abs-date
-                (if (dst-in-effect rounded-abs-date)
-                    (/ calendar-daylight-time-offset 24.0 60.0) 0)))
           ;; get Universal Time
!          (a-d (- a-d (/ calendar-time-zone 60.0 24.0)))
!          (date (calendar-astro-from-absolute a-d))
           ;; get Ephemeris Time
           (date (+ date (solar-ephemeris-correction
--- 611,620 ----
  calendar-time-zone are used to interpret local time."
    (let* ((a-d (calendar-absolute-from-astro d))
           ;; get Universal Time
!          (date (calendar-astro-from-absolute
!                 (- a-d
!                    (if (dst-in-effect a-d)
!                        (/ calendar-daylight-time-offset 24.0 60.0) 0)
!                    (/ calendar-time-zone 60.0 24.0))))
           ;; get Ephemeris Time
           (date (+ date (solar-ephemeris-correction
*************** calendar-time-zone are used to interpret
*** 408,435 ****
                             (calendar-absolute-from-astro
                              date)))))))
!          (T (/ (- date 2451545.0) 36525.0))
! 	 (Lo (mod (+ 280.46645 (* 36000.76983 T) (* 0.0003032 T T)) 360.0))
! 	 (M (mod (+ 357.52910
!                     (* 35999.05030 T)
!                     (* -0.0001559 T T)
!                     (* -0.00000048 T T T))
!                  360.0))
! 	 (e (+ 0.016708617 (* -0.000042037 T) (* -0.0000001236 T T)))
! 	 (C (+ (* (+ 1.914600 (* -0.004817 T) (* -0.000014 T T))
! 		  (solar-sin-degrees M))
! 	       (* (+ 0.019993 (* -0.000101 T)) (solar-sin-degrees (* 2 M)))
! 	       (* 0.000290 (solar-sin-degrees (* 3 M)))))
! 	 (true-longitude (+ Lo C))
! 	 (omega (+ 125.04 (* -1934.136 T)))
! 	 (apparent-longitude (mod
! 			      (+ true-longitude
! 				 -0.00569
! 				 (* -0.00478 (solar-sin-degrees omega)))
!                               360.0)))
!     apparent-longitude))
  
  (defun solar-ephemeris-correction (year)
!   "Ephemeris time minus Universal Time at astronomical (Julian) day D.
! Result is in days For the years 1800-1987, the maximum error is 1.9 seconds.
  For the other years, the maximum error is about 30 seconds."
    (cond ((and (<= 1988 year) (< year 2020))
--- 624,704 ----
                             (calendar-absolute-from-astro
                              date)))))))
!          (U (/ (- date 2451545) 3652500))
!          (longitude
!           (+ 4.9353929
!              (* 62833.1961680 U)
!              (* 0.0000001
!                 (apply '+
!                        (mapcar '(lambda (x)
!                                   (* (car x)
!                                      (sin (mod
!                                            (+ (car (cdr x))
!                                               (* (car (cdr (cdr x))) U))
!                                            (* 2 pi)))))
!                                solar-data-list)))))
!          (aberration
!           (* 0.0000001 (- (* 17 (cos (+ 3.10 (* 62830.14 U)))) 973)))
!          (A1 (mod (+ 2.18 (* U (+ -3375.70 (* 0.36 U)))) (* 2 pi)))
!          (A2 (mod (+ 3.51 (* U (+ 125666.39 (* 0.10 U)))) (* 2 pi)))
!          (nutation (* -0.0000001 (+ (* 834 (sin A1)) (* 64 (sin A2))))))
!     (mod (radians-to-degrees (+ longitude aberration nutation)) 360.0)))
! 
! (defconst solar-data-list
!   '((403406 4.721964 1.621043)
!     (195207 5.937458 62830.348067)
!     (119433 1.115589 62830.821524)
!     (112392 5.781616 62829.634302)
!     (3891 5.5474 125660.5691)
!     (2819 1.5120 125660.984)
!     (1721 4.1897 62832.4766)
!     (0 1.163 0.813)
!     (660 5.415 125659.31)
!     (350 4.315 57533.85)
!     (334 4.553 -33.931)
!     (314 5.198 777137.715)
!     (268 5.989 78604.191)
!     (242 2.911 5.412)
!     (234 1.423 39302.098)
!     (158 0.061 -34.861)
!     (132 2.317 115067.698)
!     (129 3.193 15774.337)
!     (114 2.828 5296.670)
!     (99 0.52 58849.27)
!     (93 4.65 5296.11)
!     (86 4.35 -3980.70)
!     (78 2.75 52237.69)
!     (72 4.50 55076.47)
!     (68 3.23 261.08)
!     (64 1.22 15773.85)
!     (46 0.14 188491.03)
!     (38 3.44 -7756.55)
!     (37 4.37 264.89)
!     (32 1.14 117906.27)
!     (29 2.84 55075.75)
!     (28 5.96 -7961.39)
!     (27 5.09 188489.81)
!     (27 1.72 2132.19)
!     (25 2.56 109771.03)
!     (24 1.92 54868.56)
!     (21 0.09 25443.93)
!     (21 5.98 -55731.43)
!     (20 4.03 60697.74)
!     (18 4.47 2132.79)
!     (17 0.79 109771.63)
!     (14 4.24 -7752.82)
!     (13 2.01 188491.91)
!     (13 2.65 207.81)
!     (13 4.98 29424.63)
!     (12 0.93 -7.99)
!     (10 2.21 46941.14)
!     (10 3.59 -68.29)
!     (10 1.50 21463.25)
!     (10 2.55 157208.40)))
  
  (defun solar-ephemeris-correction (year)
!   "Ephemeris time minus Universal Time during Gregorian year.
! Result is in days.
! 
! For the years 1800-1987, the maximum error is 1.9 seconds.
  For the other years, the maximum error is about 30 seconds."
    (cond ((and (<= 1988 year) (< year 2020))
*************** For the other years, the maximum error i
*** 488,494 ****
               (/ second 60.0 60.0 24.0)))))
  
  ;;;###autoload
  (defun sunrise-sunset (&optional arg)
!   "Local time of sunrise and sunset for today.  Accurate to +/- 2 minutes.
  If called with an optional prefix argument, prompt for date.
  
--- 757,793 ----
               (/ second 60.0 60.0 24.0)))))
  
+ (defun solar-sidereal-time (t0)
+   "Sidereal time (in hours) in Greenwich.
+ 
+ At T0=Julian centuries of universal time.
+ T0 must correspond to 0 hours UT."
+    (let* ((mean-sid-time (+ 6.6973746
+                            (* 2400.051337 t0)
+                            (* 0.0000258622 t0 t0)
+                            (* -0.0000000017222 t0 t0 t0)))
+           (et (solar-ephemeris-time (list t0 0.0)))
+           (nut-i (solar-ecliptic-coordinates et nil))
+           (nut (car (cdr (cdr (cdr nut-i))))) ; nutation
+           (i (car (cdr nut-i)))) ; inclination
+        (mod (+ (mod (+ mean-sid-time 
+                     (/ (/ (* nut (solar-cosine-degrees i)) 15) 3600)) 24.0)
+                24.0)
+             24.0)))
+ 
+ (defun solar-time-equation (date ut)
+   "Equation of time expressed in hours at Gregorian DATE at Universal time UT."
+   (let* ((et (solar-date-to-et date ut))
+          (ec (solar-ecliptic-coordinates et nil)))
+      (car (cdr (cdr ec)))))
+ 
+ (defun solar-date-to-et (date ut)
+   "Ephemeris Time at Gregorian DATE at Universal Time UT (in hours).
+ Expressed in julian centuries of Ephemeris Time."
+     (let ((t0 (solar-julian-ut-centuries date)))
+       (solar-ephemeris-time (list t0 ut))))
+ 
  ;;;###autoload
  (defun sunrise-sunset (&optional arg)
!   "Local time of sunrise and sunset for today.  Accurate to a few seconds.
  If called with an optional prefix argument, prompt for date.
  
*************** This function is suitable for execution 
*** 545,556 ****
          (date (if (< arg 4) (calendar-current-date) (calendar-read-date)))
          (date-string (calendar-date-string date t))
!         (time-string (solar-sunrise-sunset date))
          (msg (format "%s: %s" date-string time-string))
          (one-window (one-window-p t)))
     (if (<= (length msg) (frame-width))
!        (message msg)
       (with-output-to-temp-buffer "*temp*"
         (princ (concat date-string "\n" time-string)))
!      (message (substitute-command-keys
                 (if one-window
                     (if pop-up-windows
--- 844,856 ----
          (date (if (< arg 4) (calendar-current-date) (calendar-read-date)))
          (date-string (calendar-date-string date t))
!         (time-string (solar-sunrise-sunset-string date))
          (msg (format "%s: %s" date-string time-string))
          (one-window (one-window-p t)))
     (if (<= (length msg) (frame-width))
!        (message "%s" msg)
       (with-output-to-temp-buffer "*temp*"
         (princ (concat date-string "\n" time-string)))
!      (message "%s"
! 	      (substitute-command-keys
                 (if one-window
                     (if pop-up-windows
*************** This function is suitable for execution 
*** 561,565 ****
  (defun calendar-sunrise-sunset ()
    "Local time of sunrise and sunset for date under cursor.
! Accurate to +/- 2 minutes."
    (interactive)
    (if (not (and calendar-latitude calendar-longitude calendar-time-zone))
--- 861,865 ----
  (defun calendar-sunrise-sunset ()
    "Local time of sunrise and sunset for date under cursor.
! Accurate to a few seconds."
    (interactive)
    (if (not (and calendar-latitude calendar-longitude calendar-time-zone))
*************** Accurate to +/- 2 minutes."
*** 568,579 ****
      (message "%s: %s"
               (calendar-date-string date t t)
!              (solar-sunrise-sunset date))))
  
  (defun diary-sunrise-sunset ()
    "Local time of sunrise and sunset as a diary entry.
! Accurate to +/- 2 minutes."
    (if (not (and calendar-latitude calendar-longitude calendar-time-zone))
        (solar-setup))
!   (solar-sunrise-sunset date))
  
  (defun diary-sabbath-candles ()
--- 868,879 ----
      (message "%s: %s"
               (calendar-date-string date t t)
!              (solar-sunrise-sunset-string date))))
  
  (defun diary-sunrise-sunset ()
    "Local time of sunrise and sunset as a diary entry.
! Accurate to a few seconds."
    (if (not (and calendar-latitude calendar-longitude calendar-time-zone))
        (solar-setup))
!   (solar-sunrise-sunset-string date))
  
  (defun diary-sabbath-candles ()
*************** No diary entry if there is no sunset on 
*** 583,598 ****
        (solar-setup))
    (if (= (% (calendar-absolute-from-gregorian date) 7) 5);;  Friday
!       (let* ((sunset (solar-sunset date))
! 	     (light (if sunset
!                         (dst-adjust-time
!                          date
!                          (- sunset (/ 18.0 60.0))))))
!         (if (and light (calendar-date-equal date (car light)))
              (format "%s Sabbath candle lighting"
!                     (apply 'solar-time-string (cdr light)))))))
  
  ;;;###autoload
  (defun solar-equinoxes-solstices ()
!   "Date and time of equinoxes and solstices, if visible in the calendar window.
  Requires floating point."
    (let ((m displayed-month)
--- 883,1001 ----
        (solar-setup))
    (if (= (% (calendar-absolute-from-gregorian date) 7) 5);;  Friday
!       (let* ((sunset (car (cdr (solar-sunrise-sunset date))))
!                   (light (if sunset
!                         (cons (- (car sunset) (/ 18.0 60.0)) (cdr sunset)))))
!         (if sunset
              (format "%s Sabbath candle lighting"
!                     (apply 'solar-time-string light))))))
! 
! (defun solar-equinoxes/solstices (k year)
!   "Date of equinox/solstice K for YEAR.
! K=0, spring equinox; K=1, summer solstice; K=2, fall equinox;
! K=3, winter solstice. 
! RESULT is a gregorian local date.
! 
! Accurate to less than a minute between 1951 and 2050."
!   (let* ((JDE0 (solar-mean-equinoxes/solstices k year))
!          (T (/ (- JDE0 2451545.0) 36525))
!          (W (- (* 35999.373 T) 2.47))
!          (Delta-lambda (+ 1 (* 0.0334 (solar-cosine-degrees W))
!                             (* 0.0007 (solar-cosine-degrees (* 2 W)))))
!          (S (apply '+ (mapcar '(lambda(x) 
!                                  (* (car x) (solar-cosine-degrees 
!                                              (+ (* (car (cdr (cdr x))) T)
!                                                   (car (cdr x)))))) 
!                               solar-seasons-data)))
!          (JDE (+ JDE0 (/ (* 0.00001 S) Delta-lambda)))
!          (correction (+ 102.3 (* 123.5 T) (* 32.5 T T))) 
!              ; ephemeris time correction
!          (JD (- JDE (/ correction 86400)))
!          (date (calendar-gregorian-from-absolute (floor (- JD 1721424.5))))
!          (time (- (- JD 0.5) (floor (- JD 0.5))))
!          )
!       (list (car date) (+ (car (cdr date)) time
!                           (/ (/ calendar-time-zone 60.0) 24.0))
!             (car (cdr (cdr date))))))
! 
! ; from Meeus, 1991, page 166
! (defun solar-mean-equinoxes/solstices (k year)
!   "Julian day of mean equinox/solstice K for YEAR.  
! K=0, spring equinox; K=1, summer solstice; K=2, fall equinox; K=3, winter
! solstice.  These formulas are only to be used between 1000 BC and 3000 AD."
!   (let ((y (/ year 1000.0))
!         (z (/ (- year 2000) 1000.0)))
!     (if (< year 1000) ; actually between -1000 and 1000
!              (cond ((equal k 0) (+ 1721139.29189
!                                    (*  365242.13740 y)
!                                    (* 0.06134 y y)
!                                    (* 0.00111 y y y)
!                                    (* -0.00071 y y y y)))
!                    ((equal k 1) (+ 1721233.25401
!                                    (* 365241.72562 y)
!                                    (* -0.05323 y y)
!                                    (* 0.00907 y y y)
!                                    (* 0.00025 y y y y)))
!                    ((equal k 2) (+ 1721325.70455
!                                    (* 365242.49558 y)
!                                    (* -0.11677 y y)
!                                    (* -0.00297 y y y)
!                                    (* 0.00074 y y y y)))
!                    ((equal k 3) (+ 1721414.39987
!                                    (* 365242.88257 y)
!                                    (* -0.00769 y y)
!                                    (* -0.00933 y y y)
!                                    (* -0.00006 y y y y))))
!                       ; actually between 1000 and 3000
!              (cond ((equal k 0) (+ 2451623.80984
!                                    (* 365242.37404  z)
!                                    (* 0.05169 z z)
!                                    (* -0.00411 z z z)
!                                    (* -0.00057 z z z z)))
!                    ((equal k 1) (+ 2451716.56767
!                                    (* 365241.62603 z)
!                                    (* 0.00325 z z)
!                                    (* 0.00888 z z z)
!                                    (* -0.00030 z z z z)))
!                    ((equal k 2) (+ 2451810.21715
!                                    (* 365242.01767 z)
!                                    (* -0.11575 z z)
!                                    (* 0.00337 z z z)
!                                    (* 0.00078 z z z z)))
!                    ((equal k 3) (+ 2451900.05952
!                                    (* 365242.74049 z)
!                                    (* -0.06223 z z)
!                                    (* -0.00823 z z z)
!                                    (* 0.00032 z z z z)))))))
! 
! ; from Meeus, 1991, page 167
! (defconst solar-seasons-data
!   '((485 324.96 1934.136)
!     (203 337.23 32964.467)
!     (199 342.08 20.186)
!     (182 27.85 445267.112)
!     (156 73.14 45036.886)
!     (136 171.52 22518.443)
!     (77 222.54 65928.934)
!     (74 296.72 3034.906)
!     (70 243.58 9037.513)
!     (58 119.81 33718.147)
!     (52 297.17 150.678)
!     (50 21.02 2281.226)
!     (45 247.54 29929.562)
!     (44 325.15 31555.956)
!     (29 60.93 4443.417)
!     (18 155.12 67555.328)
!     (17 288.79 4562.452)
!     (16 198.04 62894.029)
!     (14 199.76 31436.921)
!     (12 95.39 14577.848)
!     (12 287.11 31931.756)
!     (12 320.81 34777.259)
!     (9 227.73 1222.114)
!     (8 15.45 16859.074)))
  
  ;;;###autoload
  (defun solar-equinoxes-solstices ()
!   "*local* date and time of equinoxes and solstices, if visible in the calendar window.
  Requires floating point."
    (let ((m displayed-month)
*************** Requires floating point."
*** 609,618 ****
             (calendar-time-zone (if calendar-time-zone calendar-time-zone 0))
             (k (1- (/ m 3)))
! 	   (d (solar-date-next-longitude
!                (calendar-astro-from-absolute
!                 (calendar-absolute-from-gregorian
!                  (list (+ 3 (* k 3)) 15 y)))
!                90))
!            (abs-day (calendar-absolute-from-astro d)))
        (list
         (list (calendar-gregorian-from-absolute (floor abs-day))
--- 1012,1030 ----
             (calendar-time-zone (if calendar-time-zone calendar-time-zone 0))
             (k (1- (/ m 3)))
!            (d0 (solar-equinoxes/solstices k y)) 
!            (d1 (list (car d0) (floor (car (cdr d0))) (car (cdr (cdr d0)))))
!            (h0 (* 24 (- (car (cdr d0)) (floor (car (cdr d0))))))
!            (adj (dst-adjust-time d1 h0))
!            (d (list (car d1) (+ (car (cdr d1))  
!                   (/ (car (cdr adj)) 24.0))
!                     (car (cdr (cdr d1)))))
!            ; The following is nearly as accurate, but not quite:
! 	   ;(d0 (solar-date-next-longitude
!            ;    (calendar-astro-from-absolute
!            ;     (calendar-absolute-from-gregorian
!            ;      (list (+ 3 (* k 3)) 15 y)))
!            ;    90))
!            ;(abs-day (calendar-absolute-from-astro d)))
!            (abs-day (calendar-absolute-from-gregorian d)))
        (list
         (list (calendar-gregorian-from-absolute (floor abs-day))
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/solitaire.el emacs-19.31/lisp/solitaire.el
*** emacs-19.30/lisp/solitaire.el	Mon Oct 30 12:23:51 1995
--- emacs-19.31/lisp/solitaire.el	Wed Jan 24 14:11:25 1996
***************
*** 20,25 ****
  
  ;; You should have received a copy of the GNU General Public License
! ;; along with this program; if not, write to the Free Software
! ;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  
  ;;; Commentary:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** Move stones using \\[solitaire-move] fol
*** 134,138 ****
  Undo moves using \\[solitaire-undo].
  Check for possible moves using \\[solitaire-do-check].
! (The variable solitaire-auto-eval controls whether to automatically
  check after each move or undo)
  
--- 135,139 ----
  Undo moves using \\[solitaire-undo].
  Check for possible moves using \\[solitaire-do-check].
! \(The variable solitaire-auto-eval controls whether to automatically
  check after each move or undo)
  
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/sort.el emacs-19.31/lisp/sort.el
*** emacs-19.30/lisp/sort.el	Fri Nov 24 19:26:08 1995
--- emacs-19.31/lisp/sort.el	Sun Jan 14 02:34:30 1996
***************
*** 20,30 ****
  
  ;; 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:
  
! ;;; This package provides the sorting facilities documented in the Emacs
! ;;; user's manual.
  
  ;;; Code:
--- 20,31 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
! ;; This package provides the sorting facilities documented in the Emacs
! ;; user's manual.
  
  ;;; Code:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/soundex.el emacs-19.31/lisp/soundex.el
*** emacs-19.30/lisp/soundex.el	Thu Jun 23 15:38:47 1994
--- emacs-19.31/lisp/soundex.el	Mon May 20 17:04:55 1996
***************
*** 1,3 ****
! ;;; soundex.el -- implement Soundex algorithm
  
  ;; Copyright (C) 1993 Free Software Foundation, Inc.
--- 1,3 ----
! ;;; soundex.el --- implement Soundex algorithm
  
  ;; Copyright (C) 1993 Free Software Foundation, Inc.
***************
*** 21,26 ****
  
  ;; 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:
--- 21,27 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/spell.el emacs-19.31/lisp/spell.el
*** emacs-19.30/lisp/spell.el	Tue Jan  3 01:38:23 1995
--- emacs-19.31/lisp/spell.el	Sun Jan 14 02:34:30 1996
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/spook.el emacs-19.31/lisp/spook.el
*** emacs-19.30/lisp/spook.el	Wed Jul 14 19:37:09 1993
--- emacs-19.31/lisp/spook.el	Sun Jan 14 02:34:30 1996
***************
*** 20,37 ****
  
  ;; 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:
  
! ; Steve Strassmann <straz@media-lab.media.mit.edu> didn't write
! ; this, and even if he did, he really didn't mean for you to use it
! ; in an anarchistic way.
! ;
! ; To use this:
! ;  Just before sending mail, do M-x spook.
! ;  A number of phrases will be inserted into your buffer, to help
! ;  give your message that extra bit of attractiveness for automated
! ;  keyword scanners.  Help defeat the NSA trunk trawler!
  
  ;;; Code:
--- 20,38 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
! ;; Steve Strassmann <straz@media-lab.media.mit.edu> didn't write
! ;; this, and even if he did, he really didn't mean for you to use it
! ;; in an anarchistic way.
! ;;
! ;; To use this:
! ;;  Just before sending mail, do M-x spook.
! ;;  A number of phrases will be inserted into your buffer, to help
! ;;  give your message that extra bit of attractiveness for automated
! ;;  keyword scanners.  Help defeat the NSA trunk trawler!
  
  ;;; Code:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/startup.el emacs-19.31/lisp/startup.el
*** emacs-19.30/lisp/startup.el	Wed Nov 15 12:23:53 1995
--- emacs-19.31/lisp/startup.el	Thu Apr 11 01:22:42 1996
***************
*** 1,5 ****
  ;;; startup.el --- process Emacs shell arguments
  
! ;; Copyright (C) 1985, 1986, 1992, 1994, 1995 Free Software Foundation, Inc.
  
  ;; Maintainer: FSF
--- 1,5 ----
  ;;; startup.el --- process Emacs shell arguments
  
! ;; Copyright (C) 1985, 86, 92, 94, 95, 1996 Free Software Foundation, Inc.
  
  ;; Maintainer: FSF
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** altering `command-line-args-left' to rem
*** 157,173 ****
  This is normally copied from `default-directory' when Emacs starts.")
  
  (defvar before-init-hook nil
!   "Functions to call after handling urgent options but before init files.
! The frame system uses this to open frames to display messages while
! Emacs loads the user's initialization file.")
  
  (defvar after-init-hook nil
!   "Functions to call after loading the init file (`~/.emacs').
! The call is not protected by a condition-case, so you can set `debug-on-error'
! in `.emacs', and put all the actual code on `after-init-hook'.")
  
  (defvar term-setup-hook nil
!   "Functions to be called after loading terminal-specific Lisp code.
! See `run-hooks'.  This variable exists for users to set,
  so as to override the definitions made by the terminal-specific file.
  Emacs never sets this variable itself.")
--- 158,234 ----
  This is normally copied from `default-directory' when Emacs starts.")
  
+ ;;; This is here, rather than in x-win.el, so that we can ignore these
+ ;;; options when we are not using X.
+ (defvar command-line-x-option-alist
+   '(("-bw" 1 x-handle-numeric-switch border-width)
+     ("-d" 1 x-handle-display)
+     ("-display" 1 x-handle-display)
+     ("-name" 1 x-handle-name-rn-switch)
+     ("-rn" 1 x-handle-name-rn-switch)
+     ("-title" 1 x-handle-switch title)
+     ("-T" 1 x-handle-switch title)
+     ("-r" 0 x-handle-switch reverse t)
+     ("-rv" 0 x-handle-switch reverse t)
+     ("-reverse" 0 x-handle-switch reverse t)
+     ("-reverse-video" 0 x-handle-switch reverse t)
+     ("-fn" 1 x-handle-switch font)
+     ("-font" 1 x-handle-switch font)
+     ("-ib" 1 x-handle-numeric-switch internal-border-width)
+     ("-g" 1 x-handle-geometry)
+     ("-geometry" 1 x-handle-geometry)
+     ("-fg" 1 x-handle-switch foreground-color)
+     ("-foreground" 1 x-handle-switch foreground-color)
+     ("-bg" 1 x-handle-switch background-color)
+     ("-background" 1 x-handle-switch background-color)
+     ("-ms" 1 x-handle-switch mouse-color)
+     ("-itype" 0 x-handle-switch icon-type t)
+     ("-i" 0 x-handle-switch icon-type t)
+     ("-iconic" 0 x-handle-iconic)
+     ("-xrm" 1 x-handle-xrm-switch)
+     ("-cr" 1 x-handle-switch cursor-color)
+     ("-vb" 0 x-handle-switch vertical-scroll-bars t)
+     ("-hb" 0 x-handle-switch horizontal-scroll-bars t)
+     ("-bd" 1 x-handle-switch)
+     ("--border-width" 1 x-handle-numeric-switch border-width)
+     ("--display" 1 x-handle-display)
+     ("--name" 1 x-handle-name-rn-switch)
+     ("--title" 1 x-handle-switch title)
+     ("--reverse-video" 0 x-handle-switch reverse t)
+     ("--font" 1 x-handle-switch font)
+     ("--internal-border" 1 x-handle-numeric-switch internal-border-width)
+     ("--geometry" 1 x-handle-geometry)
+     ("--foreground-color" 1 x-handle-switch foreground-color)
+     ("--background-color" 1 x-handle-switch background-color)
+     ("--mouse-color" 1 x-handle-switch mouse-color)
+     ("--icon-type" 0 x-handle-switch icon-type t)
+     ("--iconic" 0 x-handle-iconic)
+     ("--xrm" 1 x-handle-xrm-switch)
+     ("--cursor-color" 1 x-handle-switch cursor-color)
+     ("--vertical-scroll-bars" 0 x-handle-switch vertical-scroll-bars t)
+     ("--border-color" 1 x-handle-switch border-width))
+   "Alist of X Windows options.
+ Each element has the form
+   (NAME NUMARGS HANDLER FRAME-PARAM VALUE)
+ where NAME is the option name string, NUMARGS is the number of arguments
+ that the option accepts, HANDLER is a function to call to handle the option.
+ FRAME-PARAM (optional) is the frame parameter this option specifies,
+ and VALUE is the value which is given to that frame parameter
+ \(most options use the argument for this, so VALUE is not present).")
+ 
  (defvar before-init-hook nil
!   "Normal hook run after handling urgent options but before loading init files.")
  
  (defvar after-init-hook nil
!   "Normal hook run after loading the init files, `~/.emacs' and `default.el'.
! There is no `condition-case' around the running of these functions;
! therefore, if you set `debug-on-error' non-nil in `.emacs',
! an error in one of these functions will invoke the debugger.")
! 
! (defvar emacs-startup-hook nil
!   "Normal hook run after loading init files and handling the command line.")
  
  (defvar term-setup-hook nil
!   "Normal hook run after loading terminal-specific Lisp code.
! It also follows `emacs-startup-hook'.  This hook exists for users to set,
  so as to override the definitions made by the terminal-specific file.
  Emacs never sets this variable itself.")
*************** This is initialized based on `mail-host-
*** 228,235 ****
  after your init file is read, in case it sets `mail-host-address'.")
  
! (defvar auto-save-list-file-prefix "~/.saves-"
!   "Prefix for generating auto-save-list-file-name.
! Emacs's pid and the system name will be appended to
! this prefix to create a unique file name.")
  
  (defvar init-file-debug nil)
--- 289,302 ----
  after your init file is read, in case it sets `mail-host-address'.")
  
! (defvar auto-save-list-file-prefix
!   (if (eq system-type 'ms-dos)
!       "~/_s"  ; MS-DOS cannot have initial dot, and allows only 8.3 names
!     "~/.saves-")
!   "Prefix for generating `auto-save-list-file-name'.
! This is used after reading your `.emacs' file to initialize
! `auto-save-list-file-name', by appending Emacs's pid and the system name,
! if you have not already set `auto-save-list-file-name' yourself.
! Set this to nil if you want to prevent `auto-save-list-file-name'
! from being initialized.")
  
  (defvar init-file-debug nil)
*************** this prefix to create a unique file name
*** 285,294 ****
  	;; Specify the file for recording all the auto save files of this session.
  	;; This is used by recover-session.
! 	(setq auto-save-list-file-name
! 	      (expand-file-name
! 	       (format "%s%d-%s"
! 		       auto-save-list-file-prefix
! 		       (emacs-pid)
! 		       (system-name))))
  	(run-hooks 'emacs-startup-hook)
  	(and term-setup-hook
--- 352,370 ----
  	;; Specify the file for recording all the auto save files of this session.
  	;; This is used by recover-session.
! 	(or auto-save-list-file-name
! 	    (and auto-save-list-file-prefix
! 		 (setq auto-save-list-file-name
! 		       ;; Under MS-DOS our PID is almost always reused between
! 		       ;; Emacs invocations.  We need something more unique.
! 		       (if (eq system-type 'ms-dos)
! 			   (concat 
! 			    (make-temp-name
! 			     (expand-file-name auto-save-list-file-prefix))
! 			    "~")
! 
! 			 (expand-file-name (format "%s%d-%s~"
! 						   auto-save-list-file-prefix
! 						   (emacs-pid)
! 						   (system-name)))))))
  	(run-hooks 'emacs-startup-hook)
  	(and term-setup-hook
*************** this prefix to create a unique file name
*** 494,498 ****
  			    (concat "~" init-file-user "/_emacs"))
  			   ((eq system-type 'windows-nt)
! 			    "~/_emacs")
  			   ((eq system-type 'vax-vms) 
  			    "sys$login:.emacs")
--- 570,576 ----
  			    (concat "~" init-file-user "/_emacs"))
  			   ((eq system-type 'windows-nt)
! 			    (if (file-exists-p "~/.emacs") 
! 				"~/.emacs"
! 			      "~/_emacs"))
  			   ((eq system-type 'vax-vms) 
  			    "sys$login:.emacs")
*************** this prefix to create a unique file name
*** 621,625 ****
  		   (insert (emacs-version)
  			   "
! Copyright (C) 1995 Free Software Foundation, Inc.")
  		   ;; If keys have their default meanings,
  		   ;; use precomputed string to save lots of time.
--- 699,703 ----
  		   (insert (emacs-version)
  			   "
! Copyright (C) 1996 Free Software Foundation, Inc.")
  		   ;; If keys have their default meanings,
  		   ;; use precomputed string to save lots of time.
*************** Copyright (C) 1995 Free Software Foundat
*** 630,641 ****
  			    (eq (key-binding "\C-hi") 'info))
  		       (insert "\n
! Type C-h for help; C-x u to undo changes.  (`C-' means use CTRL key.)
! To kill the Emacs job, type C-x C-c.
  Type C-h t for a tutorial on using Emacs.
  Type C-h i to enter Info, which you can use to read GNU documentation.")
  		     (insert (substitute-command-keys
  			      (format "\n
! Type %s for help; \\[advertised-undo] to undo changes.  (`C-' means use CTRL key.)
! To kill the Emacs job, type \\[save-buffers-kill-emacs].
  Type \\[help-with-tutorial] for a tutorial on using Emacs.
  Type \\[info] to enter Info, which you can use to read GNU documentation."
--- 708,719 ----
  			    (eq (key-binding "\C-hi") 'info))
  		       (insert "\n
! Type C-x C-c to exit Emacs.
! Type C-h for help; C-x u to undo changes.
  Type C-h t for a tutorial on using Emacs.
  Type C-h i to enter Info, which you can use to read GNU documentation.")
  		     (insert (substitute-command-keys
  			      (format "\n
! Type \\[save-buffers-kill-emacs] to exit Emacs.
! Type %s for help; \\[advertised-undo] to undo changes.
  Type \\[help-with-tutorial] for a tutorial on using Emacs.
  Type \\[info] to enter Info, which you can use to read GNU documentation."
*************** Type \\[info] to enter Info, which you c
*** 645,653 ****
  					    (key-description where)
  					  "M-x help"))))))
  		   ;; Say how to use the menu bar
  		   ;; if that is not with the mouse.
  		   (if (not (assq 'display (frame-parameters)))
  		       (if (eq (key-binding "\M-`") 'tmm-menubar)
! 			   (insert "\n\nType F10, ESC ` or Meta-` to use the menu bar.")
  			 (insert (substitute-command-keys
  				  "\n\nType \\[tmm-menubar] to use the menu bar."))))
--- 723,735 ----
  					    (key-description where)
  					  "M-x help"))))))
+ 		   ;; Many users seem to have problems with these.
+ 		   (insert "
+ (`C-' means use the CTRL key.  `M-' means use the Meta (or Alt) key.
+ If you have no Meta key, you may instead type ESC followed by the character.)")
  		   ;; Say how to use the menu bar
  		   ;; if that is not with the mouse.
  		   (if (not (assq 'display (frame-parameters)))
  		       (if (eq (key-binding "\M-`") 'tmm-menubar)
! 			   (insert "\n\nType F10 or M-` to use the menu bar.")
  			 (insert (substitute-command-keys
  				  "\n\nType \\[tmm-menubar] to use the menu bar."))))
*************** Type \\[info] to enter Info, which you c
*** 655,666 ****
  		   ;; Windows and MSDOS (currently) do not count as
  		   ;; window systems, but do have mouse support.
! 		   (if (or (memq system-type '(msdos windowsnt))
! 			   window-system)
  		       (insert "\n
  C-mouse-3 (third mouse button, with Control) gets a mode-specific menu."))
! 		   (if (directory-files "~/" nil "\\`\\.saves-" t)
! 		       (insert "\n\nIf an Emacs session crashed recently,\n"
! 			       "type M-x recover-session RET to recover"
! 			       " the files you were editing."))
  
  		   (if (and (eq (key-binding "\C-h\C-c") 'describe-copying)
--- 737,754 ----
  		   ;; Windows and MSDOS (currently) do not count as
  		   ;; window systems, but do have mouse support.
! 		   (if window-system
  		       (insert "\n
  C-mouse-3 (third mouse button, with Control) gets a mode-specific menu."))
! 		   (and auto-save-list-file-prefix
! 			(directory-files
! 			 (file-name-directory auto-save-list-file-prefix)
! 			 nil
! 			 (concat "\\`"
! 				 (regexp-quote (file-name-nondirectory
! 						auto-save-list-file-prefix)))
! 			 t)
! 			(insert "\n\nIf an Emacs session crashed recently,\n"
! 				"type M-x recover-session RET to recover"
! 				" the files you were editing."))
  
  		   (if (and (eq (key-binding "\C-h\C-c") 'describe-copying)
*************** Type \\[describe-distribution] for infor
*** 712,715 ****
--- 800,810 ----
  	  (setq command-line-args-left (cdr command-line-args-left))
  
+ 	  ;; Add the long X options to longopts.
+ 	  (setq tem command-line-x-option-alist)
+ 	  (while tem
+ 	    (if (string-match "^--" (car (car tem)))
+ 		(setq longopts (cons (list (car (car tem))) longopts)))
+ 	    (setq tem (cdr tem)))
+ 
  	  ;; Convert long options to ordinary options
  	  ;; and separate out an attached option argument into argval.
*************** Type \\[describe-distribution] for infor
*** 757,760 ****
--- 852,856 ----
  		   (setq tem (car command-line-args-left)
  			 command-line-args-left (cdr command-line-args-left)))
+ 		 (setq tem (command-line-normalize-file-name tem))
  		 (setq extra-load-path
  		       (cons (expand-file-name tem) extra-load-path))
*************** Type \\[describe-distribution] for infor
*** 767,771 ****
  		   (setq tem (car command-line-args-left)
  			 command-line-args-left (cdr command-line-args-left)))
! 		 (let ((file tem))
  		   ;; Take file from default dir if it exists there;
  		   ;; otherwise let `load' search for it.
--- 863,867 ----
  		   (setq tem (car command-line-args-left)
  			 command-line-args-left (cdr command-line-args-left)))
! 		 (let ((file (command-line-normalize-file-name tem)))
  		   ;; Take file from default dir if it exists there;
  		   ;; otherwise let `load' search for it.
*************** Type \\[describe-distribution] for infor
*** 780,788 ****
  		 (or (stringp tem)
  		     (error "File name omitted from `-insert' option"))
! 		 (insert-file-contents tem))
  		((string-equal argi "-kill")
  		 (kill-emacs t))
  		((string-match "^\\+[0-9]+\\'" argi)
  		 (setq line (string-to-int argi)))
  		(t
  		 ;; We have almost exhausted our options. See if the
--- 876,888 ----
  		 (or (stringp tem)
  		     (error "File name omitted from `-insert' option"))
! 		 (insert-file-contents (command-line-normalize-file-name tem)))
  		((string-equal argi "-kill")
  		 (kill-emacs t))
  		((string-match "^\\+[0-9]+\\'" argi)
  		 (setq line (string-to-int argi)))
+ 		((setq tem (assoc argi command-line-x-option-alist))
+ 		 ;; Ignore X-windows options and their args if not using X.
+ 		 (setq command-line-args-left
+ 		       (nthcdr (nth 1 tem) command-line-args-left)))
  		(t
  		 ;; We have almost exhausted our options. See if the
*************** Type \\[describe-distribution] for infor
*** 799,802 ****
--- 899,903 ----
  			     (error "Unknown option `%s'" argi))
  			 (setq file-count (1+ file-count))
+ 			 (setq argi (command-line-normalize-file-name argi))
  			 (cond ((= file-count 1)
  				(setq first-file-buffer
*************** Type \\[describe-distribution] for infor
*** 813,816 ****
--- 914,929 ----
  	      (progn (other-window 1)
  		     (buffer-menu)))))))
+ 
+ (defun command-line-normalize-file-name (file)
+   "Collapse multiple slashes to one, to handle non-Emacs file names."
+   (save-match-data
+     ;; Use arg 1 so that we don't collapse // at the start of the file name.
+     ;; That is significant on some systems.
+     ;; However, /// at the beginning is supposed to mean just /, not //.
+     (if (string-match "^///+" file)
+ 	(setq file (replace-match "/" t t file)))
+     (while (string-match "//+" file 1)
+       (setq file (replace-match "/" t t file)))
+     file))
  
  ;;; startup.el ends here
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/subr.el emacs-19.31/lisp/subr.el
*** emacs-19.30/lisp/subr.el	Sat Oct  7 00:05:11 1995
--- emacs-19.31/lisp/subr.el	Wed Feb 28 04:21:50 1996
***************
*** 1,5 ****
  ;;; subr.el --- basic lisp subroutines for Emacs
  
! ;;; Copyright (C) 1985, 1986, 1992, 1994, 1995 Free Software Foundation, Inc.
  
  ;; This file is part of GNU Emacs.
--- 1,5 ----
  ;;; subr.el --- basic lisp subroutines for Emacs
  
! ;; Copyright (C) 1985, 1986, 1992, 1994, 1995 Free Software Foundation, Inc.
  
  ;; This file is part of GNU Emacs.
***************
*** 16,21 ****
  
  ;; 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.
  
  ;;; Code:
--- 16,22 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Code:
*************** To make a hook variable buffer-local, al
*** 566,569 ****
--- 567,571 ----
  (defun add-to-list (list-var element)
    "Add to the value of LIST-VAR the element ELEMENT if it isn't there yet.
+ The test for presence of ELEMENT is done with `equal'.
  If you want to use `add-to-list' on a variable that is not defined
  until a certain package is loaded, you should put the call to `add-to-list'
*************** or three octal digits representing its c
*** 624,629 ****
  	     (setq code (+ (* code 8) (- char ?0))
  		   count (1+ count))
! 	     (and prompt (message (setq prompt
! 					(format "%s %c" prompt char)))))
  	    ((> count 0)
  	     (setq unread-command-events (list char) count 259))
--- 626,630 ----
  	     (setq code (+ (* code 8) (- char ?0))
  		   count (1+ count))
! 	     (and prompt (setq prompt (message "%s %c" prompt char))))
  	    ((> count 0)
  	     (setq unread-command-events (list char) count 259))
*************** On those systems, it is automatically lo
*** 697,700 ****
--- 698,712 ----
  On other systems, this variable is normally always nil.")
  
+ ;; This should probably be written in C (i.e., without using `walk-windows').
+ (defun get-buffer-window-list (buffer &optional minibuf frame)
+   "Return windows currently displaying BUFFER, or nil if none.
+ See `walk-windows' for the meaning of MINIBUF and FRAME."
+   (let ((buffer (if (bufferp buffer) buffer (get-buffer buffer))) windows)
+     (walk-windows (function (lambda (window)
+ 			      (if (eq (window-buffer window) buffer)
+ 				  (setq windows (cons window windows)))))
+ 		  minibuf frame)
+     windows))
+ 
  (defun ignore (&rest ignore)
    "Do nothing and return nil.
*************** This function accepts any number of argu
*** 704,708 ****
  
  (defun error (&rest args)
!   "Signal an error, making error message by passing all args to `format'."
    (while t
      (signal 'error (list (apply 'format args)))))
--- 716,723 ----
  
  (defun error (&rest args)
!   "Signal an error, making error message by passing all args to `format'.
! In Emacs, the convention is that error messages start with a capital
! letter but *do not* end with a period.  Please follow this convention
! for the sake of consistency."
    (while t
      (signal 'error (list (apply 'format args)))))
*************** STRING should be given if the last searc
*** 749,758 ****
  	  (substring string (match-beginning num) (match-end num))
  	(buffer-substring (match-beginning num) (match-end num)))))
- 
- (defun buffer-substring-no-properties (beg end)
-   "Return the text from BEG to END, without text properties, as a string."
-   (let ((string (buffer-substring beg end)))
-     (set-text-properties 0 (length string) nil string)
-     string))
  
  (defun shell-quote-argument (argument)
--- 764,767 ----
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/sun-curs.el emacs-19.31/lisp/sun-curs.el
*** emacs-19.30/lisp/sun-curs.el	Sun Sep 12 06:32:14 1993
--- emacs-19.31/lisp/sun-curs.el	Sat May 18 12:38:57 1996
***************
*** 19,24 ****
  
  ;; 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.
  
  ;;; Code:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Code:
*************** Otherwise, ICON should be a vector or th
*** 119,123 ****
  		(sc::menu-choose-cursor *menu-window* *menu-x* *menu-y*)) 
    ("Reset Cursor" sc:set-cursor nil)
!   ("Help". sc::edit-icon-help-menu)
    ("Quit" sc::quit-edit)
    )
--- 120,124 ----
  		(sc::menu-choose-cursor *menu-window* *menu-x* *menu-y*)) 
    ("Reset Cursor" sc:set-cursor nil)
!   ("Help" sc::edit-icon-help-menu)
    ("Quit" sc::quit-edit)
    )
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/sun-fns.el emacs-19.31/lisp/sun-fns.el
*** emacs-19.30/lisp/sun-fns.el	Sun Sep 12 06:32:15 1993
--- emacs-19.31/lisp/sun-fns.el	Sun Jan 14 02:34:30 1996
***************
*** 19,56 ****
  
  ;; 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:
  
! ;;; Submitted Mar. 1987, Jeff Peck
! ;;;		 	 Sun Microsystems Inc. <peck@sun.com>
! ;;; Conceived Nov. 1986, Stan Jefferson,
! ;;;                      Computer Science Lab, SRI International.
! ;;; GoodIdeas Feb. 1987, Steve Greenbaum
! ;;; & UpClicks           Reasoning Systems, Inc.
! ;;;
! ;;;
! ;;; Functions for manipulating via the mouse and mouse-map definitions
! ;;; for accessing them.  Also definitions of mouse menus.
! ;;; This file you should freely modify to reflect you personal tastes.
! ;;;
! ;;; First half of file defines functions to implement mouse commands,
! ;;; Don't delete any of those, just add what ever else you need.
! ;;; Second half of file defines mouse bindings, do whatever you want there.
! 
! ;;;
! ;;;         Mouse Functions.
! ;;;
! ;;; These functions follow the sun-mouse-handler convention of being called
! ;;; with three arguments: (window x-pos y-pos)
! ;;; This makes it easy for a mouse executed command to know where the mouse is.
! ;;; Use the macro "eval-in-window" to execute a function 
! ;;; in a temporarily selected window.
! ;;;
! ;;; If you have a function that must be called with other arguments
! ;;; bind the mouse button to an s-exp that contains the necessary parameters.
! ;;; See "minibuffer" bindings for examples.
! ;;;
  
  ;;; Code:
--- 19,57 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
! ;; Submitted Mar. 1987, Jeff Peck
! ;;		 	 Sun Microsystems Inc. <peck@sun.com>
! ;; Conceived Nov. 1986, Stan Jefferson,
! ;;                      Computer Science Lab, SRI International.
! ;; GoodIdeas Feb. 1987, Steve Greenbaum
! ;; & UpClicks           Reasoning Systems, Inc.
! ;;
! ;;
! ;; Functions for manipulating via the mouse and mouse-map definitions
! ;; for accessing them.  Also definitions of mouse menus.
! ;; This file you should freely modify to reflect you personal tastes.
! ;;
! ;; First half of file defines functions to implement mouse commands,
! ;; Don't delete any of those, just add what ever else you need.
! ;; Second half of file defines mouse bindings, do whatever you want there.
! 
! ;;
! ;;         Mouse Functions.
! ;;
! ;; These functions follow the sun-mouse-handler convention of being called
! ;; with three arguments: (window x-pos y-pos)
! ;; This makes it easy for a mouse executed command to know where the mouse is.
! ;; Use the macro "eval-in-window" to execute a function 
! ;; in a temporarily selected window.
! ;;
! ;; If you have a function that must be called with other arguments
! ;; bind the mouse button to an s-exp that contains the necessary parameters.
! ;; See "minibuffer" bindings for examples.
! ;;
  
  ;;; Code:
*************** relative X divided by window width."
*** 320,324 ****
    (eval-in-window window 
      (if (>= x (1- (window-width)))
! 	;; When x is maximun (equal to or 1 less than window width),
  	;; goto end of buffer.  We check for this special case
  	;; because the calculated goto-char often goes short of the
--- 321,325 ----
    (eval-in-window window 
      (if (>= x (1- (window-width)))
! 	;; When x is maximum (equal to or 1 less than window width),
  	;; goto end of buffer.  We check for this special case
  	;; because the calculated goto-char often goes short of the
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/supercite.el emacs-19.31/lisp/supercite.el
*** emacs-19.30/lisp/supercite.el	Tue Aug 15 08:29:31 1995
--- emacs-19.31/lisp/supercite.el	Sun Jan 14 02:34:30 1996
***************
*** 25,30 ****
  
  ;; 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.
  
  ;; LCD Archive Entry
--- 25,31 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;; LCD Archive Entry
*************** This should NOT have a leading `^' chara
*** 69,73 ****
    "*Regexp describing the variable root part of a nested citation.
  This should NOT have a leading `^' character.  This variable is
! related to `sc-citation-root-regexp' but where as that varariable
  describes both nested and non-nested citation roots, this variable
  describes only nested citation roots.")
--- 70,74 ----
    "*Regexp describing the variable root part of a nested citation.
  This should NOT have a leading `^' character.  This variable is
! related to `sc-citation-root-regexp' but whereas that variable
  describes both nested and non-nested citation roots, this variable
  describes only nested citation roots.")
*************** This should be the author's full name mi
*** 897,902 ****
  	  ;; treat everything before that as the full name.
  	  ;; Even if it contains parens, use the whole thing.
  	  (and (string-match " *<.*>" from 0)
! 	       (sc-name-substring from 0 (match-beginning 0) 0))
  	  (sc-name-substring
  	   from (string-match "(.*)" from 0) (match-end 0) 1)
--- 898,909 ----
  	  ;; treat everything before that as the full name.
  	  ;; Even if it contains parens, use the whole thing.
+ 	  ;; On the other hand, we do look for quotes in the usual way.
  	  (and (string-match " *<.*>" from 0)
! 	       (let ((before-angles
! 		      (sc-name-substring from 0 (match-beginning 0) 0)))
! 		 (if (string-match "\".*\"" before-angles 0)
! 		     (sc-name-substring
! 		      before-angles (match-beginning 0) (match-end 0) 1)
! 		   before-angles)))
  	  (sc-name-substring
  	   from (string-match "(.*)" from 0) (match-end 0) 1)
*************** buffer."
*** 1321,1325 ****
  
  (defun sc-add-citation-level ()
!   "Add a citation level for nested citation style w/ coersion."
    (let* ((nesting (sc-guess-nesting))
  	 (citation (make-string (1+ (length nesting))
--- 1328,1332 ----
  
  (defun sc-add-citation-level ()
!   "Add a citation level for nested citation style w/ coercion."
    (let* ((nesting (sc-guess-nesting))
  	 (citation (make-string (1+ (length nesting))
*************** non-nil."
*** 1423,1427 ****
  
  (defun sc-no-blank-line-or-header()
!   "Similar to `sc-no-header' except it removes the preceeding blank line."
    (if (not (bobp))
        (if (and (eolp)
--- 1430,1434 ----
  
  (defun sc-no-blank-line-or-header()
!   "Similar to `sc-no-header' except it removes the preceding blank line."
    (if (not (bobp))
        (if (and (eolp)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/swedish.el emacs-19.31/lisp/swedish.el
*** emacs-19.30/lisp/swedish.el	Mon May 24 03:53:46 1993
--- emacs-19.31/lisp/swedish.el	Sun Jan 14 02:34:30 1996
***************
*** 20,25 ****
  
  ;; 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.
  
  ;;; Code:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Code:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/tabify.el emacs-19.31/lisp/tabify.el
*** emacs-19.30/lisp/tabify.el	Tue Apr 11 02:06:14 1995
--- emacs-19.31/lisp/tabify.el	Sun Jan 14 02:34:30 1996
***************
*** 18,23 ****
  
  ;; 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:
--- 18,24 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/talk.el emacs-19.31/lisp/talk.el
*** emacs-19.30/lisp/talk.el	Sat Jul  1 15:39:22 1995
--- emacs-19.31/lisp/talk.el	Sun Jan 14 02:34:30 1996
***************
*** 2,5 ****
--- 2,6 ----
  
  ;; Copyright (C) 1995 Free Software Foundation, Inc.
+ 
  ;; Keywords: comm, frames
  
***************
*** 17,27 ****
  
  ;; 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:
  
! ;;; This is a multi-user talk package that runs in Emacs.
! ;;; Use talk-connect to bring a new person into the conversation.
  
  ;;; Code:
--- 18,29 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
! ;; This is a multi-user talk package that runs in Emacs.
! ;; Use talk-connect to bring a new person into the conversation.
  
  ;;; Code:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/tar-mode.el emacs-19.31/lisp/tar-mode.el
*** emacs-19.30/lisp/tar-mode.el	Sat Jul 22 17:23:49 1995
--- emacs-19.31/lisp/tar-mode.el	Wed Mar  6 02:49:00 1996
***************
*** 1,5 ****
  ;;; tar-mode.el --- simple editing of tar files from GNU emacs
  
! ;;; Copyright (C) 1990, 1991, 1993, 1994, 1995 Free Software Foundation, Inc.
  
  ;; Author: Jamie Zawinski <jwz@lucid.com>
--- 1,5 ----
  ;;; tar-mode.el --- simple editing of tar files from GNU emacs
  
! ;; Copyright (C) 1990, 1991, 1993, 1994, 1995 Free Software Foundation, Inc.
  
  ;; Author: Jamie Zawinski <jwz@lucid.com>
***************
*** 7,93 ****
  ;; Keywords: unix
  
! ;;; 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:
  
! ;;; This package attempts to make dealing with Unix 'tar' archives easier.
! ;;; When this code is loaded, visiting a file whose name ends in '.tar' will
! ;;; cause the contents of that archive file to be displayed in a Dired-like
! ;;; listing.  It is then possible to use the customary Dired keybindings to
! ;;; extract sub-files from that archive, either by reading them into their own
! ;;; editor buffers, or by copying them directly to arbitrary files on disk.
! ;;; It is also possible to delete sub-files from within the tar file and write
! ;;; the modified archive back to disk, or to edit sub-files within the archive
! ;;; and re-insert the modified files into the archive.  See the documentation
! ;;; string of tar-mode for more info.
! 
! ;;; This code now understands the extra fields that GNU tar adds to tar files.
! 
! ;;; This interacts correctly with "uncompress.el" in the Emacs library,
! ;;; which you get with 
! ;;;
! ;;;  (autoload 'uncompress-while-visiting "uncompress")
! ;;;  (setq auto-mode-alist (cons '("\\.Z$" . uncompress-while-visiting)
! ;;;			   auto-mode-alist))
! ;;;
! ;;; Do not attempt to use tar-mode.el with crypt.el, you will lose.
! 
! ;;;    ***************   TO DO   *************** 
! ;;;
! ;;; o  chmod should understand "a+x,og-w".
! ;;;
! ;;; o  It's not possible to add a NEW file to a tar archive; not that 
! ;;;    important, but still...
! ;;;
! ;;; o  The code is less efficient that it could be - in a lot of places, I
! ;;;    pull a 512-character string out of the buffer and parse it, when I could
! ;;;    be parsing it in place, not garbaging a string.  Should redo that.
! ;;;
! ;;; o  I'd like a command that searches for a string/regexp in every subfile
! ;;;    of an archive, where <esc> would leave you in a subfile-edit buffer.
! ;;;    (Like the Meta-R command of the Zmacs mail reader.)
! ;;;
! ;;; o  Sometimes (but not always) reverting the tar-file buffer does not 
! ;;;    re-grind the listing, and you are staring at the binary tar data.
! ;;;    Typing 'g' again immediately after that will always revert and re-grind
! ;;;    it, though.  I have no idea why this happens.
! ;;;
! ;;; o  Tar-mode interacts poorly with crypt.el and zcat.el because the tar
! ;;;    write-file-hook actually writes the file.  Instead it should remove the
! ;;;    header (and conspire to put it back afterwards) so that other write-file
! ;;;    hooks which frob the buffer have a chance to do their dirty work.  There
! ;;;    might be a problem if the tar write-file-hook does not come *first* on
! ;;;    the list.
! ;;;
! ;;; o  Block files, sparse files, continuation files, and the various header 
! ;;;    types aren't editable.  Actually I don't know that they work at all.
! 
! ;;; Rationale:
! 
! ;;; Why does tar-mode edit the file itself instead of using tar?
! 
! ;;; That means that you can edit tar files which you don't have room for
! ;;; on your local disk.
! 
! ;;; I don't know about recent features in gnu tar, but old versions of tar
! ;;; can't replace a file in the middle of a tar file with a new version.
! ;;; Tar-mode can.  I don't think tar can do things like chmod the subfiles.
! ;;; An implementation which involved unpacking and repacking the file into
! ;;; some scratch directory would be very wasteful, and wouldn't be able to
! ;;; preserve the file owners.
  
  ;;; Code:
--- 7,94 ----
  ;; Keywords: unix
  
! ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
! ;; This package attempts to make dealing with Unix 'tar' archives easier.
! ;; When this code is loaded, visiting a file whose name ends in '.tar' will
! ;; cause the contents of that archive file to be displayed in a Dired-like
! ;; listing.  It is then possible to use the customary Dired keybindings to
! ;; extract sub-files from that archive, either by reading them into their own
! ;; editor buffers, or by copying them directly to arbitrary files on disk.
! ;; It is also possible to delete sub-files from within the tar file and write
! ;; the modified archive back to disk, or to edit sub-files within the archive
! ;; and re-insert the modified files into the archive.  See the documentation
! ;; string of tar-mode for more info.
! 
! ;; This code now understands the extra fields that GNU tar adds to tar files.
! 
! ;; This interacts correctly with "uncompress.el" in the Emacs library,
! ;; which you get with 
! ;;
! ;;  (autoload 'uncompress-while-visiting "uncompress")
! ;;  (setq auto-mode-alist (cons '("\\.Z$" . uncompress-while-visiting)
! ;;			   auto-mode-alist))
! ;;
! ;; Do not attempt to use tar-mode.el with crypt.el, you will lose.
! 
! ;;    ***************   TO DO   *************** 
! ;;
! ;; o  chmod should understand "a+x,og-w".
! ;;
! ;; o  It's not possible to add a NEW file to a tar archive; not that 
! ;;    important, but still...
! ;;
! ;; o  The code is less efficient that it could be - in a lot of places, I
! ;;    pull a 512-character string out of the buffer and parse it, when I could
! ;;    be parsing it in place, not garbaging a string.  Should redo that.
! ;;
! ;; o  I'd like a command that searches for a string/regexp in every subfile
! ;;    of an archive, where <esc> would leave you in a subfile-edit buffer.
! ;;    (Like the Meta-R command of the Zmacs mail reader.)
! ;;
! ;; o  Sometimes (but not always) reverting the tar-file buffer does not 
! ;;    re-grind the listing, and you are staring at the binary tar data.
! ;;    Typing 'g' again immediately after that will always revert and re-grind
! ;;    it, though.  I have no idea why this happens.
! ;;
! ;; o  Tar-mode interacts poorly with crypt.el and zcat.el because the tar
! ;;    write-file-hook actually writes the file.  Instead it should remove the
! ;;    header (and conspire to put it back afterwards) so that other write-file
! ;;    hooks which frob the buffer have a chance to do their dirty work.  There
! ;;    might be a problem if the tar write-file-hook does not come *first* on
! ;;    the list.
! ;;
! ;; o  Block files, sparse files, continuation files, and the various header 
! ;;    types aren't editable.  Actually I don't know that they work at all.
! 
! ;; Rationale:
! 
! ;; Why does tar-mode edit the file itself instead of using tar?
! 
! ;; That means that you can edit tar files which you don't have room for
! ;; on your local disk.
! 
! ;; I don't know about recent features in gnu tar, but old versions of tar
! ;; can't replace a file in the middle of a tar file with a new version.
! ;; Tar-mode can.  I don't think tar can do things like chmod the subfiles.
! ;; An implementation which involved unpacking and repacking the file into
! ;; some scratch directory would be very wasteful, and wouldn't be able to
! ;; preserve the file owners.
  
  ;;; Code:
*************** is visible (and the real data of the buf
*** 457,469 ****
      ;; but let's not get a fatal error if it doesn't.
      (if (eq tokens 'empty-tar-block)
! 	(message "Parsing tar file...done.")
        (message "Warning: premature EOF parsing tar file")))
    (save-excursion
      (goto-char (point-min))
!     (let ((buffer-read-only nil))
!       (tar-dolist (tar-desc tar-parse-info)
! 	(insert-string
! 	  (tar-header-block-summarize (tar-desc-tokens tar-desc)))
! 	(insert-string "\n"))
        (make-local-variable 'tar-header-offset)
        (setq tar-header-offset (point))
--- 458,475 ----
      ;; but let's not get a fatal error if it doesn't.
      (if (eq tokens 'empty-tar-block)
! 	(message "Parsing tar file...done")
        (message "Warning: premature EOF parsing tar file")))
    (save-excursion
      (goto-char (point-min))
!     (let ((buffer-read-only nil)
! 	  (summaries nil))
!       ;; Collect summary lines and insert them all at once since tar files
!       ;; can be pretty big.
!       (tar-dolist (tar-desc (reverse tar-parse-info))
! 	(setq summaries
! 	      (cons (tar-header-block-summarize (tar-desc-tokens tar-desc))
! 		    (cons "\n"
! 			  summaries))))
!       (insert (apply 'concat summaries))
        (make-local-variable 'tar-header-offset)
        (setq tar-header-offset (point))
*************** See also: variables `tar-update-datestam
*** 597,603 ****
  (defun tar-subfile-mode (p)
    "Minor mode for editing an element of a tar-file.
! This mode redefines the save-buffer command to save the current buffer back
! into its associated tar-file buffer.  You must save that buffer to actually
! save your changes to disk."
    (interactive "P")
    (or (and (boundp 'tar-superior-buffer) tar-superior-buffer)
--- 603,609 ----
  (defun tar-subfile-mode (p)
    "Minor mode for editing an element of a tar-file.
! This mode arranges for \"saving\" this buffer to write the data
! into the tar-file buffer that it came from.  The changes will actually
! appear on disk when you save the tar-file's buffer."
    (interactive "P")
    (or (and (boundp 'tar-superior-buffer) tar-superior-buffer)
*************** save your changes to disk."
*** 726,732 ****
  		(setq tar-superior-buffer tar-buffer)
  		(setq tar-superior-descriptor descriptor)
! 		(tar-subfile-mode 1)		
! 		(setq buffer-read-only read-only-p)
! 		(set-buffer-modified-p nil))
  	      (set-buffer tar-buffer))
  	  (narrow-to-region 1 tar-header-offset)))
--- 732,738 ----
  		(setq tar-superior-buffer tar-buffer)
  		(setq tar-superior-descriptor descriptor)
! 		(setq buffer-read-only read-only-p)		
! 		(set-buffer-modified-p nil)
! 		(tar-subfile-mode 1))
  	      (set-buffer tar-buffer))
  	  (narrow-to-region 1 tar-header-offset)))
*************** With a prefix argument, un-mark that man
*** 852,856 ****
  	(delete-region line-start (point))
  	;;
! 	;; decrement the header-pointer to be in synch...
  	(setq tar-header-offset (- tar-header-offset line-len))))
      ;;
--- 858,862 ----
  	(delete-region line-start (point))
  	;;
! 	;; decrement the header-pointer to be in sync...
  	(setq tar-header-offset (- tar-header-offset line-len))))
      ;;
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/tcl-mode.el emacs-19.31/lisp/tcl-mode.el
*** emacs-19.30/lisp/tcl-mode.el	Mon Oct 30 12:24:59 1995
--- emacs-19.31/lisp/tcl-mode.el	Sun Jan 14 02:34:30 1996
***************
*** 1,9 ****
  ;;; tcl-mode.el --- a major-mode for editing tcl/tk scripts
  
  ;; Author: Gregor Schmid <schmid@fb3-s7.math.tu-berlin.de>
  ;; Keywords: languages, processes, tools
  
- ;; Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc.
- 
  ;; This file is part of GNU Emacs.
  
--- 1,9 ----
  ;;; tcl-mode.el --- a major-mode for editing tcl/tk scripts
  
+ ;; Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc.
+ 
  ;; Author: Gregor Schmid <schmid@fb3-s7.math.tu-berlin.de>
  ;; Keywords: languages, processes, tools
  
  ;; This file is part of GNU Emacs.
  
***************
*** 19,29 ****
  
  ;; 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.
  
! ;; Please send bug-reports, suggestions etc. to
! ;;
! ;; 		schmid@fb3-s7.math.tu-berlin.de
! ;;
  
  ;; Special Thanks to Simon Marshall <simonm@mail.esrin.esa.it> for
--- 19,27 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
! ;;; Commentary:
  
  ;; Special Thanks to Simon Marshall <simonm@mail.esrin.esa.it> for
*************** If `tcl-process' is nil or dead, start a
*** 655,661 ****
  (provide 'tcl-mode)
  
- ;;{{{ Emacs local variables
- 
  
  
  ;; Local Variables:
--- 653,658 ----
  (provide 'tcl-mode)
  
  
+ ;;{{{ Emacs local variables
  
  ;; Local Variables:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/tcp.el emacs-19.31/lisp/tcp.el
*** emacs-19.30/lisp/tcp.el	Sun Aug 15 00:40:49 1993
--- emacs-19.31/lisp/tcp.el	Mon May 20 17:07:10 1996
***************
*** 1,7 ****
! ;;; TCP/IP stream emulation for GNU Emacs
  ;; Copyright (C) 1988, 1989, 1993 Free Software Foundation, Inc.
  
! ;;; Author: Masanobu Umeda
! ;;; Maintainer: umerin@mse.kyutech.ac.jp
  
  ;; This file is part of GNU Emacs.
--- 1,8 ----
! ;;; tcp.el --- TCP/IP stream emulation for GNU Emacs
! 
  ;; Copyright (C) 1988, 1989, 1993 Free Software Foundation, Inc.
  
! ;; Author: Masanobu Umeda
! ;; Maintainer: umerin@mse.kyutech.ac.jp
  
  ;; This file is part of GNU Emacs.
***************
*** 18,23 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/telnet.el emacs-19.31/lisp/telnet.el
*** emacs-19.30/lisp/telnet.el	Mon Mar 13 00:28:22 1995
--- emacs-19.31/lisp/telnet.el	Sun Jan 14 02:34:30 1996
***************
*** 1,5 ****
  ;;; telnet.el --- run a telnet session from within an Emacs buffer
  
! ;;; Copyright (C) 1985, 1988, 1992, 1994 Free Software Foundation, Inc.
  
  ;; Author: William F. Schelter
--- 1,5 ----
  ;;; telnet.el --- run a telnet session from within an Emacs buffer
  
! ;; Copyright (C) 1985, 1988, 1992, 1994 Free Software Foundation, Inc.
  
  ;; Author: William F. Schelter
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/tempo.el emacs-19.31/lisp/tempo.el
*** emacs-19.30/lisp/tempo.el	Tue Jun 20 09:43:16 1995
--- emacs-19.31/lisp/tempo.el	Sun Jan 14 02:34:30 1996
***************
*** 1,3 ****
--- 1,4 ----
  ;;; tempo.el --- Flexible template insertion
+ 
  ;; Copyright (C) 1994, 1995 Free Software Foundation, Inc.
  
***************
*** 20,25 ****
  
  ;; 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:
--- 21,27 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 96,100 ****
  ;;; Contributors:
  
! ;; These people have given me importand feedback and new ideas for
  ;; tempo.el. Thanks.
  
--- 98,102 ----
  ;;; Contributors:
  
! ;; These people have given me important feedback and new ideas for
  ;; tempo.el. Thanks.
  
*************** setting it to '(upcase), for example.")
*** 145,149 ****
    "A list of locally installed tag completion lists.
  It is a association list where the car of every element is a symbol
! whose varable value is a template list. The cdr part, if non-nil, is a
  function or a regexp that defines the string to match. See the
  documentation for the function `tempo-complete-tag' for more info.
--- 147,151 ----
    "A list of locally installed tag completion lists.
  It is a association list where the car of every element is a symbol
! whose variable value is a template list. The cdr part, if non-nil, is a
  function or a regexp that defines the string to match. See the
  documentation for the function `tempo-complete-tag' for more info.
*************** should be replaced with a template.")
*** 182,186 ****
    "Element handlers for user-defined elements.
  A list of symbols which are bound to functions that take one argument.
! This function should return somthing to be sent to `tempo-insert' if
  it recognizes the argument, and NIL otherwise")
  
--- 184,188 ----
    "Element handlers for user-defined elements.
  A list of symbols which are bound to functions that take one argument.
! This function should return something to be sent to `tempo-insert' if
  it recognizes the argument, and NIL otherwise")
  
*************** TAG-LIST is a symbol whose variable valu
*** 606,610 ****
  `tempo-add-tag'.
  
! COMPLETION-FUNCTION is an obsolete option for specifyingis an optional
  function or string that is used by `\\[tempo-complete-tag]' to find a
  string to match the tag against. It has the same definition as the
--- 608,612 ----
  `tempo-add-tag'.
  
! COMPLETION-FUNCTION is an obsolete option for specifying an optional
  function or string that is used by `\\[tempo-complete-tag]' to find a
  string to match the tag against. It has the same definition as the
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/term/AT386.el emacs-19.31/lisp/term/AT386.el
*** emacs-19.30/lisp/term/AT386.el	Wed Mar 17 22:17:59 1993
--- emacs-19.31/lisp/term/AT386.el	Sun Jan 14 04:55:08 1996
***************
*** 19,28 ****
  
  ;; 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:
  
! ;;; Uses the Emacs 19 terminal initialization features --- won't work with 18.
  
  ;;; Code:
--- 19,29 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
! ;; Uses the Emacs 19 terminal initialization features --- won't work with 18.
  
  ;;; Code:
***************
*** 57,61 ****
    )
  
- 
  ;;; AT386.el ends here
- 
--- 58,60 ----
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/term/bg-mouse.el emacs-19.31/lisp/term/bg-mouse.el
*** emacs-19.30/lisp/term/bg-mouse.el	Mon Sep 21 06:49:28 1992
--- emacs-19.31/lisp/term/bg-mouse.el	Sun Jan 14 04:55:19 1996
***************
*** 21,26 ****
  
  ;; 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.
  
  ;;; Code:
--- 21,27 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Code:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/term/internal.el emacs-19.31/lisp/term/internal.el
*** emacs-19.30/lisp/term/internal.el	Fri Nov 10 12:38:13 1995
--- emacs-19.31/lisp/term/internal.el	Sun Jan 14 04:55:26 1996
***************
*** 4,8 ****
  
  ;; Author: Morten Welinder <terra@diku.dk>
! ;; Version: 1,02
  
  ;; This file is part of GNU Emacs.
--- 4,8 ----
  
  ;; Author: Morten Welinder <terra@diku.dk>
! ;; Version: 1.02
  
  ;; This file is part of GNU Emacs.
***************
*** 19,24 ****
  
  ;; 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.
  ;; ---------------------------------------------------------------------------
  ;; screen setup -- that's easy!
--- 19,28 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
! 
! ;;; Code:
! 
  ;; ---------------------------------------------------------------------------
  ;; screen setup -- that's easy!
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/term/keyswap.el emacs-19.31/lisp/term/keyswap.el
*** emacs-19.30/lisp/term/keyswap.el	Sat May 29 23:44:20 1993
--- emacs-19.31/lisp/term/keyswap.el	Sun Jan 14 04:55:32 1996
***************
*** 1,9 ****
  ;; keyswap.el --- swap BS and DEL keys
  
  ;; Author: Eric S. Raymond <esr@snark.thyrsus.com>
  ;; Keywords: terminals
  
- ;; Copyright (C) 1992 Free Software Foundation, Inc.
- 
  ;; This file is part of GNU Emacs.
  
--- 1,9 ----
  ;; keyswap.el --- swap BS and DEL keys
  
+ ;; Copyright (C) 1992 Free Software Foundation, Inc.
+ 
  ;; Author: Eric S. Raymond <esr@snark.thyrsus.com>
  ;; Keywords: terminals
  
  ;; This file is part of GNU Emacs.
  
***************
*** 19,28 ****
  
  ;; 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:
  
! ;;; This package is meant to be called by other terminal packages.
  
  ;;; Code:
--- 19,29 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
! ;; This package is meant to be called by other terminal packages.
  
  ;;; Code:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/term/news.el emacs-19.31/lisp/term/news.el
*** emacs-19.30/lisp/term/news.el	Sun Aug 21 13:38:39 1994
--- emacs-19.31/lisp/term/news.el	Sun Jan 14 04:55:42 1996
***************
*** 1,28 ****
  ;; news.el --- keypad and function key bindings for the Sony NEWS keyboard
  
  ;; Author: FSF
  ;; Keywords: terminals
  
! ;; Copyright (C) 1989, 1993 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.
  
  ;;; Commentary:
  
! ;;; Uses the Emacs 19 terminal initialization features --- won't work with 18.
  
  ;;; Code:
--- 1,29 ----
  ;; news.el --- keypad and function key bindings for the Sony NEWS keyboard
  
+ ;; Copyright (C) 1989, 1993 Free Software Foundation, Inc.
+ 
  ;; Author: FSF
  ;; Keywords: terminals
  
! ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
! ;; Uses the Emacs 19 terminal initialization features --- won't work with 18.
  
  ;;; Code:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/term/pc-win.el emacs-19.31/lisp/term/pc-win.el
*** emacs-19.30/lisp/term/pc-win.el	Wed Nov 22 08:44:44 1995
--- emacs-19.31/lisp/term/pc-win.el	Sat Mar  2 01:37:32 1996
***************
*** 1,8 ****
  ;; pc-win.el -- setup support for `PC windows' (whatever that is).
  
! ;; Copyright (C) 1994 Free Software Foundation, Inc.
  
  ;; Author: Morten Welinder <terra@diku.dk>
! ;; Version: 1,00
  
  ;; This file is part of GNU Emacs.
--- 1,8 ----
  ;; pc-win.el -- setup support for `PC windows' (whatever that is).
  
! ;; Copyright (C) 1994, 1996 Free Software Foundation, Inc.
  
  ;; Author: Morten Welinder <terra@diku.dk>
! ;; Maintainer: FSF
  
  ;; This file is part of GNU Emacs.
***************
*** 19,25 ****
  
  ;; 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.
! ;; ---------------------------------------------------------------------------
  (load "term/internal" nil t)
  
--- 19,28 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
! 
! ;;; Code:
! 
  (load "term/internal" nil t)
  
***************
*** 37,40 ****
--- 40,45 ----
      ("goldenrod"      . "yellow")
      ("grey40"         . "darkgray")
+     ("dark gray"      .	"darkgray")
+     ("light gray"     . "lightgray")
      ("rosybrown"      . "brown")
      ("blue"	      .	"lightblue")  ;; from here: for Enriched Text
***************
*** 55,76 ****
    (setq name (downcase name))
    (let* ((len (length name))
! 	 (val (cdr (assoc name
! 			 '(("black" . 0)
! 			   ("blue" . 1)
! 			   ("green" . 2)
! 			   ("cyan" . 3)
! 			   ("red" . 4)
! 			   ("magenta" . 5)
! 			   ("brown" . 6)
! 			   ("lightgray" . 7) ("light gray" . 7)
! 			   ("darkgray" . 8) ("dark gray" . 8)
! 			   ("lightblue" . 9)
! 			   ("lightgreen" . 10)
! 			   ("lightcyan" . 11)
! 			   ("lightred" . 12)
! 			   ("lightmagenta" . 13)
! 			   ("yellow" . 14)
! 			   ("white" . 15)))))
  	 (try))
      (or val
  	(and (setq try (cdr (assoc name msdos-color-aliases)))
--- 60,67 ----
    (setq name (downcase name))
    (let* ((len (length name))
! 	 (val (- (length x-colors)
! 		 (length (member name x-colors))))
  	 (try))
+     (if (or (< val 0) (>= val (length x-colors))) (setq val nil))
      (or val
  	(and (setq try (cdr (assoc name msdos-color-aliases)))
***************
*** 115,119 ****
  (add-hook 'before-init-hook 'msdos-face-setup)
  ;; ---------------------------------------------------------------------------
! ;; More or less useful immitations of certain X-functions.  A lot of the
  ;; values returned are questionable, but usually only the form of the
  ;; returned value matters.  Also, by the way, recall that `ignore' is
--- 106,110 ----
  (add-hook 'before-init-hook 'msdos-face-setup)
  ;; ---------------------------------------------------------------------------
! ;; More or less useful imitations of certain X-functions.  A lot of the
  ;; values returned are questionable, but usually only the form of the
  ;; returned value matters.  Also, by the way, recall that `ignore' is
***************
*** 126,131 ****
  (defun x-list-fonts (pattern &optional face frame) (list "default"))
  (defun x-color-defined-p (color) (numberp (msdos-color-translate color)))
! (defun x-display-pixel-width (&optional frame) (* 8 (frame-width frame)))
! (defun x-display-pixel-height (&optional frame) (* 8 (frame-height frame)))
  (defun x-display-planes (&optional frame) 4) ; 3 for background, actually
  (defun x-display-color-cells (&optional frame) 16) ; ???
--- 117,122 ----
  (defun x-list-fonts (pattern &optional face frame) (list "default"))
  (defun x-color-defined-p (color) (numberp (msdos-color-translate color)))
! (defun x-display-pixel-width (&optional frame) (frame-width frame))
! (defun x-display-pixel-height (&optional frame) (frame-height frame))
  (defun x-display-planes (&optional frame) 4) ; 3 for background, actually
  (defun x-display-color-cells (&optional frame) 16) ; ???
***************
*** 144,148 ****
  (setq x-display-name "pc")
  (setq split-window-keep-point t)
! 
  ;; From lisp/select.el
  (defun x-get-selection (&rest rest) "")
--- 135,161 ----
  (setq x-display-name "pc")
  (setq split-window-keep-point t)
! (defvar x-colors '("black"
! 		   "blue"
! 		   "green"
! 		   "cyan"
! 		   "red"
! 		   "magenta"
! 		   "brown"
! 		   "lightgray"
! 		   "darkgray"
! 		   "lightblue"
! 		   "lightgreen"
! 		   "lightcyan"
! 		   "lightred"
! 		   "lightmagenta"
! 		   "yellow"
! 		   "white")
!   "The list of colors available on a PC display under MS-DOS.")
! (defun x-defined-colors (&optional frame)
!   "Return a list of colors supported for a particular frame.
! The argument FRAME specifies which frame to try.
! The value may be different for frames on different X displays."
!   x-colors)
! ;
  ;; From lisp/select.el
  (defun x-get-selection (&rest rest) "")
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/term/sun-mouse.el emacs-19.31/lisp/term/sun-mouse.el
*** emacs-19.30/lisp/term/sun-mouse.el	Wed Jun  9 07:28:00 1993
--- emacs-19.31/lisp/term/sun-mouse.el	Sun Jan 14 04:56:05 1996
***************
*** 20,43 ****
  
  ;; 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:
  
! ;;; Jeff Peck, Sun Microsystems, Jan 1987.
! ;;; Original idea by Stan Jefferson
  
! ;;;
! ;;;     Modelled after the GNUEMACS keymap interface.
! ;;;
! ;;; User Functions:
! ;;;   make-mousemap, copy-mousemap, 
! ;;;   define-mouse, global-set-mouse, local-set-mouse,
! ;;;   use-global-mousemap, use-local-mousemap,
! ;;;   mouse-lookup, describe-mouse-bindings
! ;;;
! ;;; Options:
! ;;;   extra-click-wait, scrollbar-width
! ;;;
  
  ;;; Code:
--- 20,42 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
! ;; Jeff Peck, Sun Microsystems, Jan 1987.
! ;; Original idea by Stan Jefferson
  
! ;;     Modeled after the GNUEMACS keymap interface.
! ;;
! ;; User Functions:
! ;;   make-mousemap, copy-mousemap, 
! ;;   define-mouse, global-set-mouse, local-set-mouse,
! ;;   use-global-mousemap, use-local-mousemap,
! ;;   mouse-lookup, describe-mouse-bindings
! ;;
! ;; Options:
! ;;   extra-click-wait, scrollbar-width
  
  ;;; Code:
*************** Returns nil."
*** 274,278 ****
    "Read and return next mouse-hit, include possible double click"
    (let ((hit1 (mouse-hit-read)))
!     (if (not (sm::hit-up-p hit1))	; Up hits dont start doubles or chords.
  	(let ((hit2 (mouse-second-hit extra-click-wait)))
  	  (if hit2	; we cons'd it, we can smash it.
--- 273,277 ----
    "Read and return next mouse-hit, include possible double click"
    (let ((hit1 (mouse-hit-read)))
!     (if (not (sm::hit-up-p hit1))      ; Up hits don't start doubles or chords.
  	(let ((hit2 (mouse-second-hit extra-click-wait)))
  	  (if hit2	; we cons'd it, we can smash it.
*************** Returns list (window x y) where x and y 
*** 352,356 ****
  	  (if (= be (frame-height))
  	      ;; include partial line at bottom of frame with this window
! 	      ;; id est, if window is not multple of char size.
  	      (setq be (1+ be)))
  
--- 351,355 ----
  	  (if (= be (frame-height))
  	      ;; include partial line at bottom of frame with this window
! 	      ;; id est, if window is not multiple of char size.
  	      (setq be (1+ be)))
  
*************** where each mouse-list is bound to the fu
*** 548,552 ****
  (defun describe-mouse-briefly (mouse-list)
    "Print a short description of the function bound to MOUSE-LIST."
!   (interactive "xDescibe mouse list briefly: ")
    (let ((function (mouse-lookup (mouse-list-to-mouse-code mouse-list))))
      (if function
--- 547,551 ----
  (defun describe-mouse-briefly (mouse-list)
    "Print a short description of the function bound to MOUSE-LIST."
!   (interactive "xDescribe mouse list briefly: ")
    (let ((function (mouse-lookup (mouse-list-to-mouse-code mouse-list))))
      (if function
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/term/sun.el emacs-19.31/lisp/term/sun.el
*** emacs-19.30/lisp/term/sun.el	Mon Nov 15 05:49:05 1993
--- emacs-19.31/lisp/term/sun.el	Sun Jan 14 04:56:19 1996
***************
*** 1,24 ****
  ;; sun.el --- keybinding for standard default sunterm keys
  
  ;; Author: Jeff Peck <peck@sun.com>
  ;; Keywords: terminals
  
! ;; Copyright (C) 1987 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.
  
  ;;; Commentary:
--- 1,25 ----
  ;; sun.el --- keybinding for standard default sunterm keys
  
+ ;; Copyright (C) 1987 Free Software Foundation, Inc.
+ 
  ;; Author: Jeff Peck <peck@sun.com>
  ;; Keywords: terminals
  
! ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/term/sup-mouse.el emacs-19.31/lisp/term/sup-mouse.el
*** emacs-19.30/lisp/term/sup-mouse.el	Mon Sep 21 07:23:19 1992
--- emacs-19.31/lisp/term/sup-mouse.el	Sun Jan 14 04:56:30 1996
***************
*** 23,28 ****
  
  ;; 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.
  
  ;;; Code:
--- 23,29 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Code:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/term/tvi970.el emacs-19.31/lisp/term/tvi970.el
*** emacs-19.30/lisp/term/tvi970.el	Wed Mar 17 22:31:43 1993
--- emacs-19.31/lisp/term/tvi970.el	Sun Jan 14 04:56:38 1996
***************
*** 19,28 ****
  
  ;; 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:
  
! ;;; Uses the Emacs 19 terminal initialization features --- won't work with 18.
  
  ;;; Code:
--- 19,29 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
! ;; Uses the Emacs 19 terminal initialization features --- won't work with 18.
  
  ;;; Code:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/term/vt100.el emacs-19.31/lisp/term/vt100.el
*** emacs-19.30/lisp/term/vt100.el	Sat May 29 23:38:43 1993
--- emacs-19.31/lisp/term/vt100.el	Sun Jan 14 04:56:47 1996
***************
*** 1,23 ****
  ;;; vt100.el --- define VT100 function key sequences in function-key-map
  
  ;; Author: FSF
  ;; Keywords: terminals
  
! ;; Copyright (C) 1989, 1993 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.
  
  ;;; Commentary:
--- 1,25 ----
  ;;; vt100.el --- define VT100 function key sequences in function-key-map
  
+ ;; Copyright (C) 1989, 1993 Free Software Foundation, Inc.
+ 
  ;; Author: FSF
  ;; Keywords: terminals
  
! ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/term/win32-win.el emacs-19.31/lisp/term/win32-win.el
*** emacs-19.30/lisp/term/win32-win.el	Tue Nov  7 02:49:29 1995
--- emacs-19.31/lisp/term/win32-win.el	Tue May 21 10:34:35 1996
***************
*** 1,3 ****
--- 1,4 ----
  ;;; win32-win.el --- parse switches controlling interface with win32
+ 
  ;; Copyright (C) 1993, 1994 Free Software Foundation, Inc.
  
***************
*** 5,23 ****
  ;; Keywords: terminals
  
! ;;; 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:
--- 6,25 ----
  ;; Keywords: terminals
  
! ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 76,79 ****
--- 78,117 ----
  (require 'menu-bar)
  
+ ;; Because Windows scrollbars look and act quite differently compared
+ ;; with the standard X scroll-bars, we don't try to use the normal
+ ;; scroll bar routines.
+ 
+ (defun win32-handle-scroll-bar-event (event)
+   "Handle Win32 scroll bar events to do normal Window style scrolling."
+   (interactive "e")
+   (let ((old-window (selected-window)))
+     (unwind-protect
+ 	(let* ((position (event-start event))
+ 	       (window (nth 0 position))
+ 	       (portion-whole (nth 2 position))
+ 	       (bar-part (nth 4 position)))
+ 	  (save-excursion
+ 	    (select-window window)
+ 	    (cond
+ 	     ((eq bar-part 'up)
+ 	      (scroll-down 1))
+ 	     ((eq bar-part 'above-handle)
+ 	      (scroll-down))
+ 	     ((eq bar-part 'handle)
+ 	      (scroll-bar-maybe-set-window-start event))
+ 	     ((eq bar-part 'below-handle)
+ 	      (scroll-up))
+ 	     ((eq bar-part 'down)
+ 	      (scroll-up 1))
+ 	     )))
+       (select-window old-window))))
+ 
+ ;; The following definition is used for debugging.
+ ;(defun win32-handle-scroll-bar-event (event) (interactive "e") (princ event))
+ 
+ (global-set-key [vertical-scroll-bar mouse-1] 'win32-handle-scroll-bar-event)
+ 
+ ;; (scroll-bar-mode nil)
+ 
  (defvar x-invocation-args)
  
*************** The value may be different for frames on
*** 437,442 ****
  ;; Map certain keypad keys into ASCII characters
  ;; that people usually expect.
- (define-key function-key-map [backspace] [127])
- (define-key function-key-map [delete] [127])
  (define-key function-key-map [tab] [?\t])
  (define-key function-key-map [linefeed] [?\n])
--- 475,478 ----
*************** The value may be different for frames on
*** 444,449 ****
  (define-key function-key-map [return] [13])
  (define-key function-key-map [escape] [?\e])
- (define-key function-key-map [M-backspace] [?\M-\d])
- (define-key function-key-map [M-delete] [?\M-\d])
  (define-key function-key-map [M-tab] [?\M-\t])
  (define-key function-key-map [M-linefeed] [?\M-\n])
--- 480,483 ----
*************** The value may be different for frames on
*** 452,459 ****
  (define-key function-key-map [M-escape] [?\M-\e])
  
  ;; These tell read-char how to convert
  ;; these special chars to ASCII.
- (put 'backspace 'ascii-character 127)
- (put 'delete 'ascii-character 127)
  (put 'tab 'ascii-character ?\t)
  (put 'linefeed 'ascii-character ?\n)
--- 486,497 ----
  (define-key function-key-map [M-escape] [?\M-\e])
  
+ ;; These don't do the right thing (voelker)
+ ;(define-key function-key-map [backspace] [127])
+ ;(define-key function-key-map [delete] [127])
+ ;(define-key function-key-map [M-backspace] [?\M-\d])
+ ;(define-key function-key-map [M-delete] [?\M-\d])
+ 
  ;; These tell read-char how to convert
  ;; these special chars to ASCII.
  (put 'tab 'ascii-character ?\t)
  (put 'linefeed 'ascii-character ?\n)
*************** The value may be different for frames on
*** 461,464 ****
--- 499,505 ----
  (put 'return 'ascii-character 13)
  (put 'escape 'ascii-character ?\e)
+ ;; These don't seem to be necessary (voelker)
+ ;(put 'backspace 'ascii-character 127)
+ ;(put 'delete 'ascii-character 127)
  
  
*************** This is in addition to the primary selec
*** 481,485 ****
  (defun x-select-text (text &optional push)
    (if x-select-enable-clipboard 
!       (win32-set-clipboard-data text)))
      
  ;;; Return the value of the current selection.
--- 522,527 ----
  (defun x-select-text (text &optional push)
    (if x-select-enable-clipboard 
!       (win32-set-clipboard-data text))
!   (setq x-last-selected-text text))
      
  ;;; Return the value of the current selection.
*************** This is in addition to the primary selec
*** 494,498 ****
  	  (error (message "win32-get-clipboard-data:%s" c)))
  	(if (string= text "") (setq text nil))
! 	text)))
  
  ;;; Do the actual Windows setup here; the above code just defines
--- 536,548 ----
  	  (error (message "win32-get-clipboard-data:%s" c)))
  	(if (string= text "") (setq text nil))
! 	(cond
! 	 ((not text) nil)
! 	 ((eq text x-last-selected-text) nil)
! 	 ((string= text x-last-selected-text)
! 	  ;; Record the newer string, so subsequent calls can use the 'eq' test.
! 	  (setq x-last-selected-text text)
! 	  nil)
! 	 (t
! 	  (setq x-last-selected-text text))))))
  
  ;;; Do the actual Windows setup here; the above code just defines
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/term/wyse50.el emacs-19.31/lisp/term/wyse50.el
*** emacs-19.30/lisp/term/wyse50.el	Tue May  3 19:44:24 1994
--- emacs-19.31/lisp/term/wyse50.el	Sun Jan 14 04:57:04 1996
***************
*** 7,25 ****
  ;; Keywords: terminals
  
! ;;; 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:
--- 7,26 ----
  ;; Keywords: terminals
  
! ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/term/x-win.el emacs-19.31/lisp/term/x-win.el
*** emacs-19.30/lisp/term/x-win.el	Wed Nov  1 23:37:24 1995
--- emacs-19.31/lisp/term/x-win.el	Sun Apr 21 20:48:52 1996
***************
*** 1,3 ****
--- 1,4 ----
  ;;; x-win.el --- parse switches controlling interface with X window system
+ 
  ;; Copyright (C) 1993, 1994 Free Software Foundation, Inc.
  
***************
*** 5,23 ****
  ;; Keywords: terminals
  
! ;;; 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:
--- 6,25 ----
  ;; Keywords: terminals
  
! ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 79,165 ****
  (defvar x-command-line-resources nil)
  
- (defconst x-option-alist
-   '(("-bw" .	x-handle-numeric-switch)
-     ("-d" .		x-handle-display)
-     ("-display" .	x-handle-display)
-     ("-name" .	x-handle-name-rn-switch)
-     ("-rn" .	x-handle-name-rn-switch)
-     ("-T" .		x-handle-switch)
-     ("-r" .		x-handle-switch)
-     ("-rv" .	x-handle-switch)
-     ("-reverse" .	x-handle-switch)
-     ("-fn" .	x-handle-switch)
-     ("-font" .	x-handle-switch)
-     ("-ib" .	x-handle-numeric-switch)
-     ("-g" .		x-handle-geometry)
-     ("-geometry" .	x-handle-geometry)
-     ("-fg" .	x-handle-switch)
-     ("-foreground".	x-handle-switch)
-     ("-bg" .	x-handle-switch)
-     ("-background".	x-handle-switch)
-     ("-ms" .	x-handle-switch)
-     ("-itype" .	x-handle-switch)
-     ("-i" 	.	x-handle-switch)
-     ("-iconic" .	x-handle-iconic)
-     ("-xrm" .       x-handle-xrm-switch)
-     ("-cr" .	x-handle-switch)
-     ("-vb" .	x-handle-switch)
-     ("-hb" .	x-handle-switch)
-     ("-bd" .	x-handle-switch)))
- 
- (defconst x-long-option-alist
-   '(("--border-width" .	"-bw")
-     ("--display" .	"-d")
-     ("--name" .		"-name")
-     ("--title" .	"-T")
-     ("--reverse-video" . "-reverse")
-     ("--font" .		"-font")
-     ("--internal-border" . "-ib")
-     ("--geometry" .	"-geometry")
-     ("--foreground-color" . "-fg")
-     ("--background-color" . "-bg")
-     ("--mouse-color" .	"-ms")
-     ("--icon-type" .	"-itype")
-     ("--iconic" .	"-iconic")
-     ("--xrm" .		"-xrm")
-     ("--cursor-color" .	"-cr")
-     ("--vertical-scroll-bars" . "-vb")
-     ("--border-color" .	"-bd")))
- 
- (defconst x-switch-definitions
-   '(("-name" name)
-     ("-T" name)
-     ("-r" reverse t)
-     ("-rv" reverse t)
-     ("-reverse" reverse t)
-     ("-fn" font)
-     ("-font" font)
-     ("-ib" internal-border-width)
-     ("-fg" foreground-color)
-     ("-foreground" foreground-color)
-     ("-bg" background-color)
-     ("-background" background-color)
-     ("-ms" mouse-color)
-     ("-cr" cursor-color)
-     ("-itype" icon-type t)
-     ("-i" icon-type t)
-     ("-vb" vertical-scroll-bars t)
-     ("-hb" horizontal-scroll-bars t)
-     ("-bd" border-color)
-     ("-bw" border-width)))
- 
  ;; Handler for switches of the form "-switch value" or "-switch".
  (defun x-handle-switch (switch)
!   (let ((aelt (assoc switch x-switch-definitions)))
      (if aelt
! 	(if (nth 2 aelt)
  	    (setq default-frame-alist
! 		  (cons (cons (nth 1 aelt) (nth 2 aelt))
! 			default-frame-alist))
  	  (setq default-frame-alist
! 		(cons (cons (nth 1 aelt)
! 			    (car x-invocation-args))
  		      default-frame-alist)
! 		x-invocation-args (cdr x-invocation-args))))))
  
  ;; Make -iconic apply only to the initial frame!
--- 81,111 ----
  (defvar x-command-line-resources nil)
  
  ;; Handler for switches of the form "-switch value" or "-switch".
  (defun x-handle-switch (switch)
!   (let ((aelt (assoc switch command-line-x-option-alist)))
      (if aelt
! 	(let ((param (nth 3 aelt))
! 	      (value (nth 4 aelt)))
! 	  (if value
! 	      (setq default-frame-alist
! 		    (cons (cons param value)
! 			  default-frame-alist))
  	    (setq default-frame-alist
! 		  (cons (cons param
! 			      (car x-invocation-args))
! 			default-frame-alist)
! 		  x-invocation-args (cdr x-invocation-args)))))))
! 
! ;; Handler for switches of the form "-switch n"
! (defun x-handle-numeric-switch (switch)
!   (let ((aelt (assoc switch command-line-x-option-alist)))
!     (if aelt
! 	(let ((param (nth 3 aelt)))
  	  (setq default-frame-alist
! 		(cons (cons param
! 			    (string-to-int (car x-invocation-args)))
  		      default-frame-alist)
! 		x-invocation-args
! 		(cdr x-invocation-args))))))
  
  ;; Make -iconic apply only to the initial frame!
***************
*** 168,182 ****
  	(cons '(visibility . icon) initial-frame-alist)))
  
- ;; Handler for switches of the form "-switch n"
- (defun x-handle-numeric-switch (switch)
-   (let ((aelt (assoc switch x-switch-definitions)))
-     (if aelt
- 	(setq default-frame-alist
- 	      (cons (cons (nth 1 aelt)
- 			  (string-to-int (car x-invocation-args)))
- 		    default-frame-alist)
- 	      x-invocation-args
- 	      (cdr x-invocation-args)))))
- 
  ;; Handle the -xrm option.
  (defun x-handle-xrm-switch (switch)
--- 114,117 ----
***************
*** 215,230 ****
  (defun x-handle-display (switch)
    (setq x-display-name (car x-invocation-args)
! 	x-invocation-args (cdr x-invocation-args)))
! 
! (defvar x-invocation-args nil)
  
  (defun x-handle-args (args)
    "Process the X-related command line options in ARGS.
  This is done before the user's startup file is loaded.  They are copied to
! x-invocation args from which the X-related things are extracted, first
  the switch (e.g., \"-fg\") in the following code, and possible values
  \(e.g., \"black\") in the option handler code (e.g., x-handle-switch).
! This returns ARGS with the arguments that have been processed removed."
!   (message "%s" args)
    (setq x-invocation-args args
  	args nil)
--- 150,168 ----
  (defun x-handle-display (switch)
    (setq x-display-name (car x-invocation-args)
! 	x-invocation-args (cdr x-invocation-args))
!   ;; Make subshell programs see the same DISPLAY value Emacs really uses.
!   ;; Note that this isn't completely correct, since Emacs can use
!   ;; multiple displays.  However, there is no way to tell an already
!   ;; running subshell which display the user is currently typing on.
!   (setenv "DISPLAY" x-display-name))
  
  (defun x-handle-args (args)
    "Process the X-related command line options in ARGS.
  This is done before the user's startup file is loaded.  They are copied to
! `x-invocation-args', from which the X-related things are extracted, first
  the switch (e.g., \"-fg\") in the following code, and possible values
  \(e.g., \"black\") in the option handler code (e.g., x-handle-switch).
! This function returns ARGS minus the arguments that have been processed."
!   ;; We use ARGS to accumulate the args that we don't handle here, to return.
    (setq x-invocation-args args
  	args nil)
*************** This returns ARGS with the arguments tha
*** 232,236 ****
      (let* ((this-switch (car x-invocation-args))
  	   (orig-this-switch this-switch)
! 	   completion argval aelt)
        (setq x-invocation-args (cdr x-invocation-args))
        ;; Check for long options with attached arguments
--- 170,174 ----
      (let* ((this-switch (car x-invocation-args))
  	   (orig-this-switch this-switch)
! 	   completion argval aelt handler)
        (setq x-invocation-args (cdr x-invocation-args))
        ;; Check for long options with attached arguments
*************** This returns ARGS with the arguments tha
*** 239,265 ****
  	  (setq argval (substring this-switch (match-end 0))
  		this-switch (substring this-switch 0 (1- (match-end 0)))))
!       (setq completion (try-completion this-switch x-long-option-alist))
!       (if (eq completion t)
! 	  ;; Exact match for long option.
! 	  (setq this-switch (cdr (assoc this-switch x-long-option-alist)))
! 	(if (stringp completion)
! 	    (let ((elt (assoc completion x-long-option-alist)))
! 	      ;; Check for abbreviated long option.
! 	      (or elt
! 		  (error "Option `%s' is ambiguous" this-switch))
! 	      (setq this-switch (cdr elt)))
! 	  ;; Check for a short option.
! 	  (setq argval nil this-switch orig-this-switch)))
!       (setq aelt (assoc this-switch x-option-alist))
!       (if aelt
  	  (if argval
  	      (let ((x-invocation-args
  		     (cons argval x-invocation-args)))
! 		(funcall (cdr aelt) this-switch))
! 	    (funcall (cdr aelt) this-switch))
! 	(setq args (cons this-switch args)))))
!   (setq args (nreverse args)))
! 
! 
  
  ;;
--- 177,203 ----
  	  (setq argval (substring this-switch (match-end 0))
  		this-switch (substring this-switch 0 (1- (match-end 0)))))
!       ;; Complete names of long options.
!       (if (string-match "^--" this-switch)
! 	  (progn
! 	    (setq completion (try-completion this-switch command-line-x-option-alist))
! 	    (if (eq completion t)
! 		;; Exact match for long option.
! 		nil
! 	      (if (stringp completion)
! 		  (let ((elt (assoc completion command-line-x-option-alist)))
! 		    ;; Check for abbreviated long option.
! 		    (or elt
! 			(error "Option `%s' is ambiguous" this-switch))
! 		    (setq this-switch completion))))))
!       (setq aelt (assoc this-switch command-line-x-option-alist))
!       (if aelt (setq handler (nth 2 aelt)))
!       (if handler
  	  (if argval
  	      (let ((x-invocation-args
  		     (cons argval x-invocation-args)))
! 		(funcall handler this-switch))
! 	    (funcall handler this-switch))
! 	(setq args (cons orig-this-switch args)))))
!   (nreverse args))
  
  ;;
*************** This is in addition to the primary selec
*** 648,652 ****
      (condition-case c
  	(setq text (x-get-selection 'PRIMARY))
!       (error (message "%s" c)))
      (if (string= text "") (setq text nil))
  
--- 586,590 ----
      (condition-case c
  	(setq text (x-get-selection 'PRIMARY))
!       (error nil))
      (if (string= text "") (setq text nil))
  
*************** This is in addition to the primary selec
*** 654,658 ****
  	(condition-case c
  	    (setq text (x-get-selection 'CLIPBOARD))
! 	  (error (message "%s" c))))
      (if (string= text "") (setq text nil))
      (or text (setq text (x-get-cut-buffer 0)))
--- 592,596 ----
  	(condition-case c
  	    (setq text (x-get-selection 'CLIPBOARD))
! 	  (error nil)))
      (if (string= text "") (setq text nil))
      (or text (setq text (x-get-cut-buffer 0)))
*************** This is in addition to the primary selec
*** 763,766 ****
--- 701,708 ----
  ;; Don't show the frame name; that's redundant with X.
  (setq-default mode-line-buffer-identification '("Emacs: %12b"))
+ 
+ ;; Motif normally handles f10 itself, so don't try to handle it a second time.
+ (if (featurep 'motif)
+     (global-set-key [f10] 'ignore))
  
  ;;; x-win.el ends here
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/term/xterm.el emacs-19.31/lisp/term/xterm.el
*** emacs-19.30/lisp/term/xterm.el	Thu Jun  8 22:26:27 1995
--- emacs-19.31/lisp/term/xterm.el	Sun Jan 14 04:57:26 1996
***************
*** 1,23 ****
  ;;; xterm.el --- define function key sequences for xterm
  
  ;; Author: FSF
  ;; Keywords: terminals
  
! ;; Copyright (C) 1995 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.
  
  ;;;; Code:
--- 1,25 ----
  ;;; xterm.el --- define function key sequences for xterm
  
+ ;; Copyright (C) 1995 Free Software Foundation, Inc.
+ 
  ;; Author: FSF
  ;; Keywords: terminals
  
! ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;;; Code:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/term-nasty.el emacs-19.31/lisp/term-nasty.el
*** emacs-19.30/lisp/term-nasty.el	Wed Jul 29 17:20:50 1992
--- emacs-19.31/lisp/term-nasty.el	Sun Feb 11 13:44:47 1996
***************
*** 1,29 ****
  ;;; term-nasty.el --- Damned Things from terminfo.el
- ;;; This file is in the public domain, and was written by Stallman and Mlynarik
  
! ;;; Commentary:
! 
! ;; Some people used to be bothered by the following comments that were
! ;; found in terminal.el.  We decided they were distracting, and that it
! ;; was better not to have them there.  On the other hand, we didn't want
! ;; to appear to be giving in to the pressure to censor obscenity that
! ;; currently threatens freedom of speech and of the press in the US.
! ;; So we decided to put the comments here.
! 
! ;;; Code:
! 
! These comments were removed from te-losing-unix.
!   ;(what lossage)
!   ;(message "fucking-unix: %d" char)
! 
! This was before te-process-output.
! ;; fucking unix has -such- braindamaged lack of tty control...
! 
! And about the need to handle output characters such as C-m, C-g, C-h
! and C-i even though the termcap doesn't say they may be used:
! ;fuck me harder
! ;again and again!
! ;wa12id!!
! ;(spiked)
  
  ;;; term-nasty.el ends here
--- 1,12 ----
  ;;; term-nasty.el --- Damned Things from terminfo.el
  
! ;;; This text is no longer included in Emacs, because it was censored
! ;;; by the Communications Decency Act.  The law was promoted as a ban
! ;;; on pornography, but it bans far more than that.  This file did not
! ;;; contain pornography, but it was prohibited nonetheless.
! 
! ;;; For information on US government censorship of the Internet, and
! ;;; what you can do to bring back freedom of the press, see the web
! ;;; site http://www.vtw.org/
  
  ;;; term-nasty.el ends here
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/term.el emacs-19.31/lisp/term.el
*** emacs-19.30/lisp/term.el	Mon Oct 30 12:25:40 1995
--- emacs-19.31/lisp/term.el	Fri May 17 17:14:54 1996
***************
*** 20,87 ****
  
  ;; 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:
  
! ;;; The changelog is at the end of this file.
  
! ;;; Please send me bug reports, bug fixes, and extensions, so that I can
! ;;; merge them into the master source.
! ;;;     - Per Bothner (bothner@cygnus.com)
! 
! ;;; This file defines a general command-interpreter-in-a-buffer package
! ;;; (term mode). The idea is that you can build specific process-in-a-buffer
! ;;; modes on top of term mode -- e.g., lisp, shell, scheme, T, soar, ....
! ;;; This way, all these specific packages share a common base functionality, 
! ;;; and a common set of bindings, which makes them easier to use (and
! ;;; saves code, implementation time, etc., etc.).
! 
! ;;; For hints on converting existing process modes (e.g., tex-mode,
! ;;; background, dbx, gdb, kermit, prolog, telnet) to use term-mode
! ;;; instead of shell-mode, see the notes at the end of this file.
  
  
! ;;; Brief Command Documentation:
! ;;;============================================================================
! ;;; Term Mode Commands: (common to all derived modes, like cmushell & cmulisp
! ;;; mode)
! ;;;
! ;;; m-p	    term-previous-input    	  Cycle backwards in input history
! ;;; m-n	    term-next-input  	    	  Cycle forwards
! ;;; m-r     term-previous-matching-input  Previous input matching a regexp
! ;;; m-s     comint-next-matching-input      Next input that matches
! ;;; return  term-send-input
! ;;; c-c c-a term-bol                      Beginning of line; skip prompt.
! ;;; c-d	    term-delchar-or-maybe-eof     Delete char unless at end of buff.
! ;;; c-c c-u term-kill-input	    	    ^u
! ;;; c-c c-w backward-kill-word    	    ^w
! ;;; c-c c-c term-interrupt-subjob 	    ^c
! ;;; c-c c-z term-stop-subjob	    	    ^z
! ;;; c-c c-\ term-quit-subjob	    	    ^\
! ;;; c-c c-o term-kill-output		    Delete last batch of process output
! ;;; c-c c-r term-show-output		    Show last batch of process output
! ;;; c-c c-h term-dynamic-list-input-ring  List input history
! ;;;
! ;;; Not bound by default in term-mode
! ;;; term-send-invisible			Read a line w/o echo, and send to proc
! ;;; (These are bound in shell-mode)
! ;;; term-dynamic-complete		Complete filename at point.
! ;;; term-dynamic-list-completions	List completions in help buffer.
! ;;; term-replace-by-expanded-filename	Expand and complete filename at point;
! ;;;					replace with expanded/completed name.
! ;;; term-kill-subjob			No mercy.
! ;;; term-show-maximum-output            Show as much output as possible.
! ;;; term-continue-subjob		Send CONT signal to buffer's process
! ;;;					group. Useful if you accidentally
! ;;;					suspend your process (with C-c C-z).
  
! ;;; term-mode-hook is the term mode hook. Basically for your keybindings.
! ;;; term-load-hook is run after loading in this package.
  
! ;;; Code:
  
! ;;; This is passed to the inferior in the EMACS environment variable,
! ;;; so it is important to increase it if there are protocol-relevant changes.
  (defconst term-protocol-version "0.95")
  
--- 20,88 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
! ;; The changelog is at the end of this file.
  
! ;; Please send me bug reports, bug fixes, and extensions, so that I can
! ;; merge them into the master source.
! ;;     - Per Bothner (bothner@cygnus.com)
! 
! ;; This file defines a general command-interpreter-in-a-buffer package
! ;; (term mode). The idea is that you can build specific process-in-a-buffer
! ;; modes on top of term mode -- e.g., lisp, shell, scheme, T, soar, ....
! ;; This way, all these specific packages share a common base functionality, 
! ;; and a common set of bindings, which makes them easier to use (and
! ;; saves code, implementation time, etc., etc.).
! 
! ;; For hints on converting existing process modes (e.g., tex-mode,
! ;; background, dbx, gdb, kermit, prolog, telnet) to use term-mode
! ;; instead of shell-mode, see the notes at the end of this file.
  
  
! ;; Brief Command Documentation:
! ;;============================================================================
! ;; Term Mode Commands: (common to all derived modes, like cmushell & cmulisp
! ;; mode)
! ;;
! ;; m-p	    term-previous-input    	  Cycle backwards in input history
! ;; m-n	    term-next-input  	    	  Cycle forwards
! ;; m-r     term-previous-matching-input  Previous input matching a regexp
! ;; m-s     comint-next-matching-input      Next input that matches
! ;; return  term-send-input
! ;; c-c c-a term-bol                      Beginning of line; skip prompt.
! ;; c-d	    term-delchar-or-maybe-eof     Delete char unless at end of buff.
! ;; c-c c-u term-kill-input	    	    ^u
! ;; c-c c-w backward-kill-word    	    ^w
! ;; c-c c-c term-interrupt-subjob 	    ^c
! ;; c-c c-z term-stop-subjob	    	    ^z
! ;; c-c c-\ term-quit-subjob	    	    ^\
! ;; c-c c-o term-kill-output		    Delete last batch of process output
! ;; c-c c-r term-show-output		    Show last batch of process output
! ;; c-c c-h term-dynamic-list-input-ring  List input history
! ;;
! ;; Not bound by default in term-mode
! ;; term-send-invisible			Read a line w/o echo, and send to proc
! ;; (These are bound in shell-mode)
! ;; term-dynamic-complete		Complete filename at point.
! ;; term-dynamic-list-completions	List completions in help buffer.
! ;; term-replace-by-expanded-filename	Expand and complete filename at point;
! ;;					replace with expanded/completed name.
! ;; term-kill-subjob			No mercy.
! ;; term-show-maximum-output            Show as much output as possible.
! ;; term-continue-subjob		Send CONT signal to buffer's process
! ;;					group. Useful if you accidentally
! ;;					suspend your process (with C-c C-z).
  
! ;; term-mode-hook is the term mode hook. Basically for your keybindings.
! ;; term-load-hook is run after loading in this package.
  
! ;; Code:
  
! ;; This is passed to the inferior in the EMACS environment variable,
! ;; so it is important to increase it if there are protocol-relevant changes.
  (defconst term-protocol-version "0.95")
  
*************** This is run before the process is cranke
*** 279,283 ****
  This is called after the process is cranked up.  It is useful for things that
  must be done each time a process is executed in a term-mode buffer (e.g.,
! (process-kill-without-query)). In contrast, the term-mode-hook is only
  executed once when the buffer is created.")
  
--- 280,284 ----
  This is called after the process is cranked up.  It is useful for things that
  must be done each time a process is executed in a term-mode buffer (e.g.,
! \(process-kill-without-query)). In contrast, the term-mode-hook is only
  executed once when the buffer is created.")
  
*************** Do not change it directly;  use term-set
*** 294,298 ****
  (defvar term-ptyp t
    "True if communications via pty; false if by pipe.  Buffer local.
! This is to work around a bug in emacs process signalling.")
  
  (defvar term-last-input-match ""
--- 295,299 ----
  (defvar term-ptyp t
    "True if communications via pty; false if by pipe.  Buffer local.
! This is to work around a bug in emacs process signaling.")
  
  (defvar term-last-input-match ""
*************** Entry to this mode runs the hooks on ter
*** 642,646 ****
        (if (term-pager-enabled)
  	  (setq term-pager-count (term-current-row)))
!       (send-string proc chars))))
  
  (defun term-send-raw ()
--- 643,647 ----
        (if (term-pager-enabled)
  	  (setq term-pager-count (term-current-row)))
!       (process-send-string proc chars))))
  
  (defun term-send-raw ()
*************** without any interpretation." 
*** 699,703 ****
    (setq c (make-string 1 c))
    (define-key term-raw-map c term-raw-escape-map)
!   ;; Define standard binings in term-raw-escape-map
    (define-key term-raw-escape-map "\C-x"
      (lookup-key (current-global-map) "\C-x"))
--- 700,704 ----
    (setq c (make-string 1 c))
    (define-key term-raw-map c term-raw-escape-map)
!   ;; Define standard bindings in term-raw-escape-map
    (define-key term-raw-escape-map "\C-x"
      (lookup-key (current-global-map) "\C-x"))
*************** buffer. The hook term-exec-hook is run a
*** 862,866 ****
  :UP=\\E[%%dA:DO=\\E[%%dB:LE=\\E[%%dD:RI=\\E[%%dC"
  ;;; : -undefine ic
!   "termcap capabilties supported")
  
  ;;; This auxiliary function cranks up the process for term-exec in
--- 863,867 ----
  :UP=\\E[%%dA:DO=\\E[%%dB:LE=\\E[%%dD:RI=\\E[%%dC"
  ;;; : -undefine ic
!   "termcap capabilities supported")
  
  ;;; This auxiliary function cranks up the process for term-exec in
*************** Argument 0 is the command name."
*** 1376,1380 ****
  	(args ()) (pos 0)
  	(count 0)
! 	beg str value quotes)
      ;; Build a list of all the args until we have as many as we want.
      (while (and (or (null mth) (<= count mth))
--- 1377,1381 ----
  	(args ()) (pos 0)
  	(count 0)
! 	beg str quotes)
      ;; Build a list of all the args until we have as many as we want.
      (while (and (or (null mth) (<= count mth))
*************** applications."
*** 1587,1591 ****
        (if stars
            (message "%s%s" prompt (make-string (length ans) ?*))
!         (message prompt))
        (setq c (read-char))
        (cond ((= c ?\C-g)
--- 1588,1592 ----
        (if stars
            (message "%s%s" prompt (make-string (length ans) ?*))
!         (message "%s" prompt))
        (setq c (read-char))
        (cond ((= c ?\C-g)
*************** See `term-prompt-regexp'."
*** 1985,1989 ****
  	       (todo (+ count (/ (current-column) term-width))))
  	   (end-of-line)
! 	   ;; The loop interates over buffer lines;
  	   ;; H is the number of screen lines in the current line, i.e.
  	   ;; the ceiling of dividing the buffer line width by term-width.
--- 1986,1990 ----
  	       (todo (+ count (/ (current-column) term-width))))
  	   (end-of-line)
! 	   ;; The loop iterates over buffer lines;
  	   ;; H is the number of screen lines in the current line, i.e.
  	   ;; the ceiling of dividing the buffer line width by term-width.
*************** See `term-prompt-regexp'."
*** 2010,2014 ****
  			      (not (bobp))))
  	     (setq todo (- todo H))
! 	     (backward-char)) ;; Move to end of previos line
  	   (if (and (>= todo H) (> todo 0))
  	       (+ count todo (- 1 H)) ;; Hit beginning of buffer.
--- 2011,2015 ----
  			      (not (bobp))))
  	     (setq todo (- todo H))
! 	     (backward-char)) ;; Move to end of previous line.
  	   (if (and (>= todo H) (> todo 0))
  	       (+ count todo (- 1 H)) ;; Hit beginning of buffer.
*************** See `term-prompt-regexp'."
*** 2189,2193 ****
  				  (t ;; Not followed by LF or can't optimize:
  				   (term-vertical-motion 0)
! 				   (setq term-current-column 0))))
  			   ((eq char ?\n)
  			    (if (not (and term-kill-echo-list
--- 2190,2194 ----
  				  (t ;; Not followed by LF or can't optimize:
  				   (term-vertical-motion 0)
! 				   (setq term-current-column term-start-line-column))))
  			   ((eq char ?\n)
  			    (if (not (and term-kill-echo-list
*************** See `term-prompt-regexp'."
*** 2331,2343 ****
  (defun term-handle-deferred-scroll ()
    (let ((count (- (term-current-row) term-height)))
!     (if (> count 0)
  	(save-excursion
  	  (goto-char term-home-marker)
! 	  (term-vertical-motion count)
  	  (set-marker term-home-marker (point))
  	  (setq term-current-row (1- term-height))))))
  
  ;;; Handle a character assuming (eq terminal-state 2) -
! ;;; i.e. we have previousely seen Escape followed by ?[.
  
  (defun term-handle-ansi-escape (proc char)
--- 2332,2344 ----
  (defun term-handle-deferred-scroll ()
    (let ((count (- (term-current-row) term-height)))
!     (if (>= count 0)
  	(save-excursion
  	  (goto-char term-home-marker)
! 	  (term-vertical-motion (1+ count))
  	  (set-marker term-home-marker (point))
  	  (setq term-current-row (1- term-height))))))
  
  ;;; Handle a character assuming (eq terminal-state 2) -
! ;;; i.e. we have previously seen Escape followed by ?[.
  
  (defun term-handle-ansi-escape (proc char)
*************** See `term-prompt-regexp'."
*** 2424,2428 ****
    "Set scrolling region.
  TOP is the top-most line (inclusive) of the new scrolling region,
! while BOTTOM is the line folling the new scrolling region (e.g. exclusive).
  The top-most line is line 0."
    (setq term-scroll-start
--- 2425,2429 ----
    "Set scrolling region.
  TOP is the top-most line (inclusive) of the new scrolling region,
! while BOTTOM is the line following the new scrolling region (e.g. exclusive).
  The top-most line is line 0."
    (setq term-scroll-start
*************** The top-most line is line 0."
*** 2570,2574 ****
  	  (define-key tmp [help] '("Help" . term-pager-help))
  	  (define-key tmp [disable]
! 	    '("Diable paging" . term-fake-pager-disable))
  	  (define-key tmp [discard]
  	    '("Discard remaining output" . term-pager-discard))
--- 2571,2575 ----
  	  (define-key tmp [help] '("Help" . term-pager-help))
  	  (define-key tmp [disable]
! 	    '("Disable paging" . term-fake-pager-disable))
  	  (define-key tmp [discard]
  	    '("Discard remaining output" . term-pager-discard))
*************** This is a good place to put keybindings.
*** 2940,2944 ****
  
  (defvar term-completion-autolist nil
!   "*If non-nil, automatically list possiblities on partial completion.
  This mirrors the optional behavior of tcsh.")
  
--- 2941,2945 ----
  
  (defvar term-completion-autolist nil
!   "*If non-nil, automatically list possibilities on partial completion.
  This mirrors the optional behavior of tcsh.")
  
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/terminal.el emacs-19.31/lisp/terminal.el
*** emacs-19.30/lisp/terminal.el	Sun Oct  1 17:31:10 1995
--- emacs-19.31/lisp/terminal.el	Sun Mar 24 08:37:06 1996
***************
*** 20,25 ****
  
  ;; 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.
  
  ;;; Code:
--- 20,37 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
! 
! ;;; Commentary:
! 
! ;;; This file has been censored by the Communications Decency Act.
! ;;; That law was passed under the guise of a ban on pornography, but
! ;;; it bans far more than that.  This file did not contain pornography,
! ;;; but it was censored nonetheless.
! 
! ;;; For information on US government censorship of the Internet, and
! ;;; what you can do to bring back freedom of the press, see the web
! ;;; site http://www.vtw.org/
  
  ;;; Code:
*************** performance.")
*** 161,165 ****
  
  ;; Required to support terminfo systems
! (defconst te-terminal-name-prefix "emacs-virtual")
  (defvar te-terminal-name nil)
  
--- 173,180 ----
  
  ;; Required to support terminfo systems
! (defconst te-terminal-name-prefix "emacs-em"
!   "Prefix used for terminal type names for Terminfo.")
! (defconst te-terminfo-directory "/tmp/emacs-terminfo/"
!   "Directory used for run-time terminal definition files for Terminfo.")
  (defvar te-terminal-name nil)
  
*************** together with a command \\<terminal-edit
*** 514,518 ****
    (if (eq (key-binding "\C-c\C-c") 'terminal-cease-edit)
        (message "Editing: Type C-c C-c to return to Terminal")
!     (message (substitute-command-keys
  	       "Editing: Type \\[terminal-cease-edit] to return to Terminal"))))
  
--- 529,534 ----
    (if (eq (key-binding "\C-c\C-c") 'terminal-cease-edit)
        (message "Editing: Type C-c C-c to return to Terminal")
!     (message "%s"
! 	     (substitute-command-keys
  	       "Editing: Type \\[terminal-cease-edit] to return to Terminal"))))
  
*************** move to start of new line, clear to end 
*** 797,801 ****
  
  
! ;; disgusting unix-required shit
  ;;  Are we living twenty years in the past yet?
  
--- 813,817 ----
  
  
! ;; disgusting unix-required excrement
  ;;  Are we living twenty years in the past yet?
  
*************** move to start of new line, clear to end 
*** 866,872 ****
  ;; to some readers has been moved to term-nasty.el.)
  ;; unix lacks ITS-style tty control...
! (defun te-process-output (preemptable)
    ;;>> There seems no good reason to ever disallow preemption
!   (setq preemptable t)
    (catch 'te-process-output
      (let ((buffer-read-only nil)
--- 882,888 ----
  ;; to some readers has been moved to term-nasty.el.)
  ;; unix lacks ITS-style tty control...
! (defun te-process-output (preemptible)
    ;;>> There seems no good reason to ever disallow preemption
!   (setq preemptible t)
    (catch 'te-process-output
      (let ((buffer-read-only nil)
*************** move to start of new line, clear to end 
*** 956,962 ****
  		    'te-losing-unix)))
  	  (te-redisplay-if-necessary 1))
! 	(and preemptable
  	     (input-pending-p)
! 	     ;; preemptable output!  Oh my!!
  	     (throw 'te-process-output t)))))
    ;; We must update window-point in every window displaying our buffer
--- 972,978 ----
  		    'te-losing-unix)))
  	  (te-redisplay-if-necessary 1))
! 	(and preemptible
  	     (input-pending-p)
! 	     ;; preemptible output!  Oh my!!
  	     (throw 'te-process-output t)))))
    ;; We must update window-point in every window displaying our buffer
*************** subprocess started."
*** 1088,1092 ****
    (terminal-mode)
    (setq te-width width te-height height)
!   (setq te-terminal-name (concat te-terminal-name-prefix "-" te-width
  				 te-height))
    (setq mode-line-buffer-identification
--- 1104,1108 ----
    (terminal-mode)
    (setq te-width width te-height height)
!   (setq te-terminal-name (concat te-terminal-name-prefix te-width
  				 te-height))
    (setq mode-line-buffer-identification
*************** of the terminal-emulator"
*** 1230,1241 ****
  (defun te-create-terminfo ()
    "Create and compile a terminfo entry for the virtual terminal. This is kept
! in the /tmp directory"
    (if (and system-uses-terminfo
! 	   (not (file-exists-p (concat  "/tmp/"
  					(substring te-terminal-name-prefix 0 1)
  					"/" te-terminal-name))))
      (let ( (terminfo
  	    (concat
! 	     (format "%s,mir, xon,cols#%d, lines#%d,"
  		     te-terminal-name te-width te-height)
  	     "bel=^P^G, clear=^P\\f, cr=^P^A, cub1=^P^B, cud1=^P\\n,"
--- 1246,1258 ----
  (defun te-create-terminfo ()
    "Create and compile a terminfo entry for the virtual terminal. This is kept
! in the directory specified by `te-terminfo-directory'."
    (if (and system-uses-terminfo
! 	   (not (file-exists-p (concat  te-terminfo-directory
  					(substring te-terminal-name-prefix 0 1)
  					"/" te-terminal-name))))
      (let ( (terminfo
  	    (concat
! 	     ;; The first newline avoids trouble with ncurses.
! 	     (format "%s,\n\tmir, xon,cols#%d, lines#%d,"
  		     te-terminal-name te-width te-height)
  	     "bel=^P^G, clear=^P\\f, cr=^P^A, cub1=^P^B, cud1=^P\\n,"
*************** in the /tmp directory"
*** 1244,1249 ****
  	     "dl1=^P^K!, ed=^PC, el=^Pc, home=^P=\\s\\s,"
  	     "ich=^P_%p1%'\\s'%+%c, ich1=^P_!, il=^P^O%p1%'\\s'%+%c,"
! 	     "il1=^P^O!, ind=^P\\n, nel=\\n,"))
! 	   (file-name (concat "/tmp/" te-terminal-name ".tif")) )
        (save-excursion
  	(set-buffer (create-file-buffer file-name))
--- 1261,1268 ----
  	     "dl1=^P^K!, ed=^PC, el=^Pc, home=^P=\\s\\s,"
  	     "ich=^P_%p1%'\\s'%+%c, ich1=^P_!, il=^P^O%p1%'\\s'%+%c,"
! 	     "il1=^P^O!, ind=^P\\n, nel=\\n,\n"))
! 	   ;; The last newline avoids trouble with ncurses.
! 	   (file-name (concat te-terminfo-directory te-terminal-name ".tif")) )
!       (make-directory te-terminfo-directory t)
        (save-excursion
  	(set-buffer (create-file-buffer file-name))
*************** in the /tmp directory"
*** 1253,1261 ****
  	)
        (let ( (process-environment
! 	      (cons (concat "TERMINFO=" "/tmp")
  		    process-environment)) )
  	(set-process-sentinel (start-process "tic" nil "tic" file-name)
  			      'te-tic-sentinel))))
!     "/tmp"
  )
  
--- 1272,1281 ----
  	)
        (let ( (process-environment
! 	      (cons (concat "TERMINFO="
! 			    (directory-file-name te-terminfo-directory))
  		    process-environment)) )
  	(set-process-sentinel (start-process "tic" nil "tic" file-name)
  			      'te-tic-sentinel))))
!     (directory-file-name te-terminfo-directory)
  )
  
*************** in the /tmp directory"
*** 1294,1298 ****
    (if (equal state-change "finished
  ")
!       (delete-file (concat "/tmp/" te-terminal-name ".tif"))))
  
  (provide 'terminal)
--- 1314,1318 ----
    (if (equal state-change "finished
  ")
!       (delete-file (concat te-terminfo-directory te-terminal-name ".tif"))))
  
  (provide 'terminal)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/tex-mode.el emacs-19.31/lisp/tex-mode.el
*** emacs-19.30/lisp/tex-mode.el	Fri Nov  3 18:10:48 1995
--- emacs-19.31/lisp/tex-mode.el	Wed May 15 11:15:07 1996
***************
*** 1,5 ****
  ;;; tex-mode.el --- TeX, LaTeX, and SliTeX mode commands.
  
! ;; Copyright (C) 1985, 86, 89, 92, 94, 95 Free Software Foundation, Inc.
  
  ;; Maintainer: FSF
--- 1,5 ----
  ;;; tex-mode.el --- TeX, LaTeX, and SliTeX mode commands.
  
! ;; Copyright (C) 1985, 86, 89, 92, 94, 95, 96 Free Software Foundation, Inc.
  
  ;; Maintainer: FSF
***************
*** 22,27 ****
  
  ;; 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.
  
  ;;; Code:
--- 22,28 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Code:
*************** Set by \\[tex-region], \\[tex-buffer], a
*** 179,195 ****
    "Syntax table used while in TeX mode.")
  
! ;; Written by Wolfgang Bangerth <zcg51122@rpool1.rus.uni-stuttgart.de>
! (defvar latex-imenu-generic-expression
!   '(
!     ("Part" "\\\\part{\\([^}]*\\)}" 1)
!     ("Chapter" "\\\\chapter{\\([^}]*\\)}" 1)
!     ("Section" "\\\\[a-zA-Z]*section{\\([^}]*\\)}" 1)
!     ;; i put numbers like 3.15 before my
!     ;; \begin{equation}'s which tell me
!     ;; the number the equation will get when
!     ;; being printed.
!     ("Equations" "%[ \t]*\\([0-9]+\\.[0-9]+\\)[,;]?[ \t]?" 1))  
! 
!   "Imenu generic expression for LaTex mode.  See `imenu-generic-expression'.")
  
  (defun tex-define-common-keys (keymap)
--- 180,200 ----
    "Syntax table used while in TeX mode.")
  
! (defun latex-imenu-create-index ()
!   "Generates an alist for imenu from a LaTeX buffer."
!   (let (result temp)
!     (goto-char (point-max))
!     (while (re-search-backward "\\\\\\(part\\|chapter\\|\
! \\(sub\\)?\\(\\(sub\\)?section\\|paragraph\\)\\)\\*?[ \t\n]*{\\([^}]*\\)}" nil t)
!       (setq temp
! 	    (assoc (buffer-substring-no-properties (match-beginning 1)
! 						   (match-end 1)) 
! 		   '(("part" . "") ("chapter" . " ")
! 		     ("section" . "  ") ("subsection" . "   ")
! 		     ("subsubsection" . "    ")
! 		     ("paragraph" . "     ") ("subparagraph" . "      "))))
!       (setq result (cons (cons (concat (cdr temp) (match-string 5)) 
! 			       (match-beginning 0))
! 			 result)))
!     result))
  
  (defun tex-define-common-keys (keymap)
*************** Set by \\[tex-region], \\[tex-buffer], a
*** 256,259 ****
--- 261,278 ----
  Inherits `shell-mode-map' with a few additions.")
  
+ (defvar tex-face-alist
+   '((bold . "{\\bf ")
+     (italic . "{\\it ")
+     (bold-italic . "{\\bi ")		; hypothetical
+     (underline . "\\underline{")
+     (default . "{\\rm "))
+   "Alist of face and TeX font name for facemenu.")
+ 
+ (defvar tex-latex-face-alist
+   `((italic . "{\\em ")
+     ,@tex-face-alist)
+   "Alist of face and LaTeX font name for facemenu.")
+ 
+ 
  (defvar compare-windows-whitespace)	; Pacify the byte-compiler
  
*************** subshell is initiated, `tex-shell-hook' 
*** 416,421 ****
  \\\\newpage\\|\\\\[a-z]*page[a-z]*\\|\\\\footnote\\|\
  \\\\marginpar\\|\\\\parbox\\|\\\\caption\\)[ \t]*\\($\\|%\\)")
!   (make-local-variable 'imenu-generic-expression)
!   (setq imenu-generic-expression latex-imenu-generic-expression)
    (run-hooks 'text-mode-hook 'tex-mode-hook 'latex-mode-hook))
  
--- 435,442 ----
  \\\\newpage\\|\\\\[a-z]*page[a-z]*\\|\\\\footnote\\|\
  \\\\marginpar\\|\\\\parbox\\|\\\\caption\\)[ \t]*\\($\\|%\\)")
!   (make-local-variable 'imenu-create-index-function)
!   (setq imenu-create-index-function 'latex-imenu-create-index)
!   (make-local-variable 'tex-face-alist)
!   (setq tex-face-alist tex-latex-face-alist)
    (run-hooks 'text-mode-hook 'tex-mode-hook 'latex-mode-hook))
  
*************** Entering SliTeX mode runs the hook `text
*** 467,471 ****
    (setq major-mode 'slitex-mode)
    (setq tex-command slitex-run-command)
!   (setq tex-start-of-header "\\\\documentstyle{slides}\\|\\\\docuentclass{slides}")
    (setq tex-end-of-header "\\\\begin{document}")
    (setq tex-trailer "\\end{document}\n")
--- 488,492 ----
    (setq major-mode 'slitex-mode)
    (setq tex-command slitex-run-command)
!   (setq tex-start-of-header "\\\\documentstyle{slides}\\|\\\\documentclass{slides}")
    (setq tex-end-of-header "\\\\begin{document}")
    (setq tex-trailer "\\end{document}\n")
*************** Entering SliTeX mode runs the hook `text
*** 536,539 ****
--- 557,571 ----
    (make-local-variable 'compare-windows-whitespace)
    (setq compare-windows-whitespace 'tex-categorize-whitespace)
+   (make-local-variable 'facemenu-add-face-function)
+   (make-local-variable 'facemenu-end-add-face)
+   (make-local-variable 'facemenu-remove-face-function)
+   (setq facemenu-add-face-function
+ 	(lambda (face end)
+ 	  (let ((face-text (cdr (assq face tex-face-alist))))
+ 	    (if face-text
+ 		face-text
+ 	      (error "Face %s not configured for %s mode" face mode-name))))
+ 	facemenu-end-add-face "}"
+ 	facemenu-remove-face-function t)
    (make-local-variable 'tex-command)
    (make-local-variable 'tex-start-of-header)
*************** so normally SUFFIX starts with one."
*** 1122,1126 ****
        (let ((file (file-name-nondirectory file-name))
  	    trial-name)
! 	;; Try spliting on last period.
  	;; The first-period split can get fooled when two files
  	;; named a.tex and a.b.tex are both tex'd;
--- 1154,1158 ----
        (let ((file (file-name-nondirectory file-name))
  	    trial-name)
! 	;; Try splitting on last period.
  	;; The first-period split can get fooled when two files
  	;; named a.tex and a.b.tex are both tex'd;
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/texinfmt.el emacs-19.31/lisp/texinfmt.el
*** emacs-19.30/lisp/texinfmt.el	Mon Oct 30 12:27:12 1995
--- emacs-19.31/lisp/texinfmt.el	Sun Jan 14 02:34:30 1996
***************
*** 1,6 ****
  ;;; texinfmt.el --- format Texinfo files into Info files.
  
! ;; Copyright (C) 1985, 1986, 1988,
! ;;               1990, 1991, 1992, 1993  Free Software Foundation, Inc.
  
  ;; Maintainer: Robert J. Chassell <bug-texinfo@prep.ai.mit.edu>
--- 1,6 ----
  ;;; texinfmt.el --- format Texinfo files into Info files.
  
! ;; Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993 Free Software
! ;; Foundation, Inc.
  
  ;; Maintainer: Robert J. Chassell <bug-texinfo@prep.ai.mit.edu>
***************
*** 19,24 ****
  
  ;; 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.
  
  ;;; Code:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Code:
*************** The command  `@value{foo}'  expands to t
*** 2894,2898 ****
  ;; incorporated in to the printed manual.  To make references to the
  ;; included file, the Texinfo source file has to refer to the included
! ;; files using the `(filename)nodename' format for refering to other
  ;; Info files.  Also, the included files had to be formatted on their
  ;; own.  It was just like they were another file.
--- 2895,2899 ----
  ;; incorporated in to the printed manual.  To make references to the
  ;; included file, the Texinfo source file has to refer to the included
! ;; files using the `(filename)nodename' format for referring to other
  ;; Info files.  Also, the included files had to be formatted on their
  ;; own.  It was just like they were another file.
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/texinfo.el emacs-19.31/lisp/texinfo.el
*** emacs-19.30/lisp/texinfo.el	Mon Oct 30 12:28:12 1995
--- emacs-19.31/lisp/texinfo.el	Tue Mar  5 16:39:38 1996
***************
*** 1,6 ****
  ;;; texinfo.el --- major mode for editing Texinfo files
  
! ;; Copyright (C) 1985, '88, '89, 
! ;;                '90, '91, '92, '93 Free Software Foundation, Inc.
  
  ;; Author: Robert J. Chassell          
--- 1,6 ----
  ;;; texinfo.el --- major mode for editing Texinfo files
  
! ;; Copyright (C) 1985, 1988, 1989, 1990, 1991, 1992, 1993 Free Software
! ;; Foundation, Inc.
  
  ;; Author: Robert J. Chassell          
***************
*** 20,25 ****
  
  ;; 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.
  
  
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  
*************** menus) before it constructs the master m
*** 93,97 ****
  
  The function removes the detailed part of an already existing master
! menu.  This action depends on the pre-exisitng master menu using the
  standard `texinfo-master-menu-header'.
  
--- 94,98 ----
  
  The function removes the detailed part of an already existing master
! menu.  This action depends on the pre-existing master menu using the
  standard `texinfo-master-menu-header'.
  
*************** chapter."
*** 199,203 ****
  
  ;; Written by Wolfgang Bangerth <zcg51122@rpool1.rus.uni-stuttgart.de>
! ;; To overide this example, set either `imenu-generic-expression'
  ;; or `imenu-create-index-function'.
  (defvar texinfo-imenu-generic-expression
--- 200,204 ----
  
  ;; Written by Wolfgang Bangerth <zcg51122@rpool1.rus.uni-stuttgart.de>
! ;; To override this example, set either `imenu-generic-expression'
  ;; or `imenu-create-index-function'.
  (defvar texinfo-imenu-generic-expression
*************** chapter."
*** 208,227 ****
  
  (defvar texinfo-font-lock-keywords
!   (list
!    ;; All but the first 2 had an OVERRIDE of t.
!    ;; It didn't seem to be any better, and it's slower--simon.
!    '("^\\(@c\\|@comment\\)\\>.*" . font-lock-comment-face) 	;comments
!    ;; Robert J. Chassell <bob@gnu.ai.mit.edu> says remove this line.
!    ;'("\\$\\([^$]*\\)\\$" 1 font-lock-string-face t)
!    "@\\(@\\|[^}\t \n{]+\\)"					;commands
!    '("^\\(*.*\\)[\t ]*$" 1 font-lock-function-name-face t) 	;menu items
!    '("@\\(emph\\|strong\\|b\\|i\\){\\([^}]+\\)" 2 font-lock-comment-face)
!    '("@\\(file\\|kbd\\|key\\){\\([^}]+\\)" 2 font-lock-string-face)
!    '("@\\(samp\\|code\\|var\\|math\\){\\([^}]+\\)"
       2 font-lock-variable-name-face)
!    '("@\\(cite\\|xref\\|pxref\\){\\([^}]+\\)" 2 font-lock-reference-face)
!    '("@\\(end\\|item\\) *\\(.+\\)" 2 font-lock-function-name-face keep)
!    )
    "Additional expressions to highlight in TeXinfo mode.")
  
  ;;; Keybindings
--- 209,261 ----
  
  (defvar texinfo-font-lock-keywords
!   '(;; All but the first 2 had an OVERRIDE of t.
!     ;; It didn't seem to be any better, and it's slower--simon.
!     ("^\\(@c\\|@comment\\)\\>.*" . font-lock-comment-face) 	;comments
!     ;; Robert J. Chassell <bob@gnu.ai.mit.edu> says remove this line.
!     ;("\\$\\([^$]*\\)\\$" 1 font-lock-string-face t)
!     ("@\\([a-zA-Z]+\\|[^ \t\n]\\)" 1 font-lock-keyword-face)	;commands
!     ("^\\*\\(.*\\)[\t ]*$" 1 font-lock-function-name-face t) 	;menu items
!     ("@\\(emph\\|strong\\|b\\|i\\){\\([^}]+\\)" 2 font-lock-comment-face)
!     ("@\\(file\\|kbd\\|key\\){\\([^}]+\\)" 2 font-lock-string-face)
!     ("@\\(samp\\|code\\|var\\|math\\){\\([^}]+\\)"
       2 font-lock-variable-name-face)
!     ("@\\(cite\\|xref\\|pxref\\){\\([^}]+\\)" 2 font-lock-reference-face)
!     ("@\\(end\\|itemx?\\) +\\(.+\\)" 2 font-lock-function-name-face keep)
!     )
    "Additional expressions to highlight in TeXinfo mode.")
+ 
+ (defvar texinfo-section-list
+   '(("top" 1)
+     ("majorheading" 1)
+     ("chapter" 2)
+     ("unnumbered" 2)
+     ("appendix" 2)
+     ("chapheading" 2)
+     ("section" 3)
+     ("unnumberedsec" 3)
+     ("appendixsec" 3)
+     ("heading" 3)
+     ("subsection" 4)
+     ("unnumberedsubsec" 4)
+     ("appendixsubsec" 4)
+     ("subheading" 4)
+     ("subsubsection" 5)
+     ("unnumberedsubsubsec" 5)
+     ("appendixsubsubsec" 5)
+     ("subsubheading" 5))
+   "Alist of sectioning commands and their relative level.")
+ 
+ (defun texinfo-outline-level ()
+   ;; Calculate level of current texinfo outline heading.
+   (save-excursion
+     (if (bobp)
+ 	0
+       (forward-char 1)
+       (let* ((word (buffer-substring-no-properties 
+ 		    (point) (progn (forward-word 1) (point))))
+ 	     (entry (assoc word texinfo-section-list)))
+ 	(if entry
+ 	    (nth 1 entry)
+ 	  5)))))
  
  ;;; Keybindings
*************** value of texinfo-mode-hook."
*** 402,405 ****
--- 436,446 ----
    (make-local-variable 'font-lock-defaults)
    (setq font-lock-defaults '(texinfo-font-lock-keywords t))
+   (make-local-variable 'outline-regexp)
+   (setq outline-regexp 
+ 	(concat "@\\("
+ 		(mapconcat 'car texinfo-section-list "\\>\\|")
+ 		"\\>\\)"))
+   (make-local-variable 'outline-level)
+   (setq outline-level 'texinfo-outline-level)
    (make-local-variable 'tex-start-of-header)
    (setq tex-start-of-header "%**start")
*************** The default is not to surround any exist
*** 544,547 ****
--- 585,594 ----
  
  ;;; Texinfo file structure
+ 
+ ;; These are defined in tenfo-upd.el.
+ (defvar texinfo-section-types-regexp)
+ (defvar texinfo-section-level-regexp)
+ (defvar texinfo-subsection-level-regexp)
+ (defvar texinfo-subsubsection-level-regexp)
  
  (defun texinfo-show-structure (&optional nodes-too) 
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/texnfo-upd.el emacs-19.31/lisp/texnfo-upd.el
*** emacs-19.30/lisp/texnfo-upd.el	Mon Oct 30 17:13:36 1995
--- emacs-19.31/lisp/texnfo-upd.el	Sun Jan 14 02:34:30 1996
***************
*** 20,148 ****
  
  ;; 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:
  
! ;;; Known bug: update commands fail to ignore @ignore.
  
! ;;; Summary: how to use the updating commands
  
! ; The node and menu updating functions automatically
  
! ;   * insert missing `@node' lines,
! ;   * insert the `Next', `Previous' and `Up' pointers of a node,
! ;   * insert or update the menu for a section, 
! ;   * create a master menu for a Texinfo source file.
! ;
! ; Passed an argument, the `texinfo-update-node' and
! ; `texinfo-make-menu' functions do their jobs in the region.
! ;
! ; In brief, the functions for creating or updating nodes and menus, are:
! ; 
! ;     texinfo-update-node (&optional region-p)            
! ;     texinfo-every-node-update ()                        
! ;     texinfo-sequential-node-update (&optional region-p)
! ; 
! ;     texinfo-make-menu (&optional region-p)              
! ;     texinfo-all-menus-update ()                         
! ;     texinfo-master-menu ()
! ;
! ;     texinfo-insert-node-lines  (&optional title-p)
! ; 
! ;     texinfo-indent-menu-description (column &optional region-p)
! 
! ; The `texinfo-column-for-description' variable specifies the column to
! ; which menu descriptions are indented. 
! 
! ; Texinfo file structure
! ; ----------------------
! 
! ; To use the updating commands, you must structure your Texinfo file
! ; hierarchically.  Each `@node' line, with the exception of the top
! ; node, must be accompanied by some kind of section line, such as an
! ; `@chapter' or `@section' line.  Each node-line/section-line
! ; combination must look like this:
! 
! ;      @node    Lists and Tables, Cross References, Structuring, Top
! ;      @comment node-name,        next,             previous,    up
! ;      @chapter Making Lists and Tables
  
! ; or like this (without the `@comment' line):
  
! ;      @node    Lists and Tables, Cross References, Structuring, Top
! ;      @chapter Making Lists and Tables
  
! ; If the file has a `top' node, it must be called `top' or `Top' and
! ; be the first node in the file.
  
  
  ;;; The update node functions described in detail
  
! ; The `texinfo-update-node' function without an argument inserts
! ; the correct next, previous and up pointers for the node in which
! ; point is located (i.e., for the node preceding point).
! 
! ; With an argument, the `texinfo-update-node' function inserts the
! ; correct next, previous and up pointers for the nodes inside the
! ; region.
! 
! ; It does not matter whether the  `@node' line has pre-existing
! ; `Next', `Previous', or `Up' pointers in it.  They are removed.
! 
! ; The `texinfo-every-node-update' function runs `texinfo-update-node'
! ; on the whole buffer.
! 
! ; The `texinfo-sequential-node-update' function inserts the
! ; immediately following and preceding node into the `Next' or
! ; `Previous' pointers regardless of their hierarchical level.  This is
! ; only useful for certain kinds of text, like a novel, which you go
! ; through sequentially.
  
  
  ;;; The menu making functions described in detail
  
! ; The `texinfo-make-menu' function without an argument creates or
! ; updates a menu for the section encompassing the node that follows
! ; point.  With an argument, it makes or updates menus for the nodes
! ; within or part of the marked region.
! 
! ; Whenever an existing menu is updated, the descriptions from
! ; that menu are incorporated into the new menu.  This is done by copying
! ; descriptions from the existing menu to the entries in the new menu
! ; that have the same node names.  If the node names are different, the
! ; descriptions are not copied to the new menu.
! 
! ; Menu entries that refer to other Info files are removed since they
! ; are not a node within current buffer.  This is a deficiency.
! 
! ; The `texinfo-all-menus-update' function runs `texinfo-make-menu'
! ; on the whole buffer.
! 
! ; The `texinfo-master-menu' function creates an extended menu located
! ; after the top node.  (The file must have a top node.)  The function
! ; first updates all the regular menus in the buffer (incorporating the
! ; descriptions from pre-existing menus), and then constructs a master
! ; menu that includes every entry from every other menu.  (However, the
! ; function cannot update an already existing master menu; if one
! ; exists, it must be removed before calling the function.)
! 
! ; The `texinfo-indent-menu-description' function indents every
! ; description in the menu following point, to the specified column.
! ; Non-nil argument (prefix, if interactive) means indent every
! ; description in every menu in the region.  This function does not
! ; indent second and subsequent lines of a multi-line description.
! 
! ; The `texinfo-insert-node-lines' function inserts `@node' before the
! ; `@chapter', `@section', and such like lines of a region in a Texinfo
! ; file where the `@node' lines are missing.
! ; 
! ; With a non-nil argument (prefix, if interactive), the function not
! ; only inserts `@node' lines but also inserts the chapter or section
! ; titles as the names of the corresponding nodes; and inserts titles
! ; as node names in pre-existing `@node' lines that lack names.
! ; 
! ; Since node names should be more concise than section or chapter
! ; titles, node names so inserted will need to be edited manually.
  
   
--- 20,149 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
! ;; Known bug: update commands fail to ignore @ignore.
  
! ;; Summary: how to use the updating commands
  
! ;; The node and menu updating functions automatically
  
! ;;   * insert missing `@node' lines,
! ;;   * insert the `Next', `Previous' and `Up' pointers of a node,
! ;;   * insert or update the menu for a section, 
! ;;   * create a master menu for a Texinfo source file.
! ;;
! ;; Passed an argument, the `texinfo-update-node' and
! ;; `texinfo-make-menu' functions do their jobs in the region.
! ;;
! ;; In brief, the functions for creating or updating nodes and menus, are:
! ;; 
! ;;     texinfo-update-node (&optional region-p)            
! ;;     texinfo-every-node-update ()                        
! ;;     texinfo-sequential-node-update (&optional region-p)
! ;; 
! ;;     texinfo-make-menu (&optional region-p)              
! ;;     texinfo-all-menus-update ()                         
! ;;     texinfo-master-menu ()
! ;;
! ;;     texinfo-insert-node-lines  (&optional title-p)
! ;; 
! ;;     texinfo-indent-menu-description (column &optional region-p)
! 
! ;; The `texinfo-column-for-description' variable specifies the column to
! ;; which menu descriptions are indented. 
! 
! ;; Texinfo file structure
! ;; ----------------------
! 
! ;; To use the updating commands, you must structure your Texinfo file
! ;; hierarchically.  Each `@node' line, with the exception of the top
! ;; node, must be accompanied by some kind of section line, such as an
! ;; `@chapter' or `@section' line.  Each node-line/section-line
! ;; combination must look like this:
! 
! ;;      @node    Lists and Tables, Cross References, Structuring, Top
! ;;      @comment node-name,        next,             previous,    up
! ;;      @chapter Making Lists and Tables
  
! ;; or like this (without the `@comment' line):
  
! ;;      @node    Lists and Tables, Cross References, Structuring, Top
! ;;      @chapter Making Lists and Tables
  
! ;; If the file has a `top' node, it must be called `top' or `Top' and
! ;; be the first node in the file.
  
  
  ;;; The update node functions described in detail
  
! ;; The `texinfo-update-node' function without an argument inserts
! ;; the correct next, previous and up pointers for the node in which
! ;; point is located (i.e., for the node preceding point).
! 
! ;; With an argument, the `texinfo-update-node' function inserts the
! ;; correct next, previous and up pointers for the nodes inside the
! ;; region.
! 
! ;; It does not matter whether the  `@node' line has pre-existing
! ;; `Next', `Previous', or `Up' pointers in it.  They are removed.
! 
! ;; The `texinfo-every-node-update' function runs `texinfo-update-node'
! ;; on the whole buffer.
! 
! ;; The `texinfo-sequential-node-update' function inserts the
! ;; immediately following and preceding node into the `Next' or
! ;; `Previous' pointers regardless of their hierarchical level.  This is
! ;; only useful for certain kinds of text, like a novel, which you go
! ;; through sequentially.
  
  
  ;;; The menu making functions described in detail
  
! ;; The `texinfo-make-menu' function without an argument creates or
! ;; updates a menu for the section encompassing the node that follows
! ;; point.  With an argument, it makes or updates menus for the nodes
! ;; within or part of the marked region.
! 
! ;; Whenever an existing menu is updated, the descriptions from
! ;; that menu are incorporated into the new menu.  This is done by copying
! ;; descriptions from the existing menu to the entries in the new menu
! ;; that have the same node names.  If the node names are different, the
! ;; descriptions are not copied to the new menu.
! 
! ;; Menu entries that refer to other Info files are removed since they
! ;; are not a node within current buffer.  This is a deficiency.
! 
! ;; The `texinfo-all-menus-update' function runs `texinfo-make-menu'
! ;; on the whole buffer.
! 
! ;; The `texinfo-master-menu' function creates an extended menu located
! ;; after the top node.  (The file must have a top node.)  The function
! ;; first updates all the regular menus in the buffer (incorporating the
! ;; descriptions from pre-existing menus), and then constructs a master
! ;; menu that includes every entry from every other menu.  (However, the
! ;; function cannot update an already existing master menu; if one
! ;; exists, it must be removed before calling the function.)
! 
! ;; The `texinfo-indent-menu-description' function indents every
! ;; description in the menu following point, to the specified column.
! ;; Non-nil argument (prefix, if interactive) means indent every
! ;; description in every menu in the region.  This function does not
! ;; indent second and subsequent lines of a multi-line description.
! 
! ;; The `texinfo-insert-node-lines' function inserts `@node' before the
! ;; `@chapter', `@section', and such like lines of a region in a Texinfo
! ;; file where the `@node' lines are missing.
! ;; 
! ;; With a non-nil argument (prefix, if interactive), the function not
! ;; only inserts `@node' lines but also inserts the chapter or section
! ;; titles as the names of the corresponding nodes; and inserts titles
! ;; as node names in pre-existing `@node' lines that lack names.
! ;; 
! ;; Since node names should be more concise than section or chapter
! ;; titles, node names so inserted will need to be edited manually.
  
   
*************** menus) before it constructs the master m
*** 750,754 ****
  
  The function removes the detailed part of an already existing master
! menu.  This action depends on the pre-exisitng master menu using the
  standard `texinfo-master-menu-header'.
  
--- 751,755 ----
  
  The function removes the detailed part of an already existing master
! menu.  This action depends on the pre-existing master menu using the
  standard `texinfo-master-menu-header'.
  
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/text-mode.el emacs-19.31/lisp/text-mode.el
*** emacs-19.30/lisp/text-mode.el	Thu Sep  7 19:44:32 1995
--- emacs-19.31/lisp/text-mode.el	Tue Mar 19 14:34:29 1996
***************
*** 18,24 ****
  
  ;; 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:
--- 18,24 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/thingatpt.el emacs-19.31/lisp/thingatpt.el
*** emacs-19.30/lisp/thingatpt.el	Tue Jul 18 17:35:35 1995
--- emacs-19.31/lisp/thingatpt.el	Sun Jan 14 02:34:30 1996
***************
*** 20,24 ****
  
  ;;; Commentary:
! ;;
  ;; This file provides routines for getting the `thing' at the location of
  ;; point, whatever that `thing' happens to be.  The `thing' is defined by
--- 20,24 ----
  
  ;;; Commentary:
! 
  ;; This file provides routines for getting the `thing' at the location of
  ;; point, whatever that `thing' happens to be.  The `thing' is defined by
***************
*** 44,52 ****
  ;;     (thing-at-point 'page)
  
! ;;; Code: =================================================================
  
  (provide 'thingatpt)
  
! ;;=== Basic movement ======================================================
  
  ;;;###autoload
--- 44,52 ----
  ;;     (thing-at-point 'page)
  
! ;;; Code:
  
  (provide 'thingatpt)
  
! ;; Basic movement
  
  ;;;###autoload
***************
*** 59,63 ****
        (error "Can't determine how to move over %ss" THING))))
  
! ;;=== General routines ====================================================
  
  ;;;###autoload
--- 59,63 ----
        (error "Can't determine how to move over %ss" THING))))
  
! ;; General routines
  
  ;;;###autoload
*************** bounds-of-thing-at-point."
*** 93,97 ****
  	(buffer-substring (car bounds) (cdr bounds)))))
  
! ;;=== Go to beginning/end =================================================
  
  (defun beginning-of-thing (THING)
--- 93,97 ----
  	(buffer-substring (car bounds) (cdr bounds)))))
  
! ;; Go to beginning/end
  
  (defun beginning-of-thing (THING)
*************** bounds-of-thing-at-point."
*** 105,111 ****
      (goto-char (cdr bounds))))
  
! ;;=== Special cases =======================================================
  
! ;;--- Lines ---
  
  ;; bolp will be false when you click on the last line in the buffer
--- 105,111 ----
      (goto-char (cdr bounds))))
  
! ;;  Special cases 
  
! ;;  Lines 
  
  ;; bolp will be false when you click on the last line in the buffer
*************** bounds-of-thing-at-point."
*** 115,119 ****
       (function (lambda () (if (bolp) (forward-line -1) (beginning-of-line)))))
  
! ;;--- Sexps ---
  
  (defun in-string-p ()
--- 115,119 ----
       (function (lambda () (if (bolp) (forward-line -1) (beginning-of-line)))))
  
! ;;  Sexps 
  
  (defun in-string-p ()
*************** bounds-of-thing-at-point."
*** 132,141 ****
  (put 'sexp 'end-op 'end-of-sexp)
  
! ;;--- Lists ---
  
  (put 'list 'end-op (function (lambda () (up-list 1))))
  (put 'list 'beginning-op 'backward-sexp)
  
! ;;--- Filenames ---
  
  (defvar file-name-chars "~/A-Za-z0-9---_.${}#%,"
--- 132,141 ----
  (put 'sexp 'end-op 'end-of-sexp)
  
! ;;  Lists 
  
  (put 'list 'end-op (function (lambda () (up-list 1))))
  (put 'list 'beginning-op 'backward-sexp)
  
! ;;  Filenames 
  
  (defvar file-name-chars "~/A-Za-z0-9---_.${}#%,"
*************** bounds-of-thing-at-point."
*** 147,151 ****
       (function (lambda () (skip-chars-backward file-name-chars (point-min)))))
  
! ;;--- Whitespace ---
  
  (defun forward-whitespace (ARG)
--- 147,151 ----
       (function (lambda () (skip-chars-backward file-name-chars (point-min)))))
  
! ;;  Whitespace 
  
  (defun forward-whitespace (ARG)
*************** bounds-of-thing-at-point."
*** 159,168 ****
        (setq ARG (1+ ARG)))))
  
! ;;--- Buffer ---
  
  (put 'buffer 'end-op 'end-of-buffer)
  (put 'buffer 'beginning-op 'beginning-of-buffer)
  
! ;;--- Symbols ---
  
  (defun forward-symbol (ARG)
--- 159,168 ----
        (setq ARG (1+ ARG)))))
  
! ;;  Buffer 
  
  (put 'buffer 'end-op 'end-of-buffer)
  (put 'buffer 'beginning-op 'beginning-of-buffer)
  
! ;;  Symbols 
  
  (defun forward-symbol (ARG)
*************** bounds-of-thing-at-point."
*** 175,179 ****
        (setq ARG (1+ ARG)))))
  
! ;;--- Syntax blocks ---
  
  (defun forward-same-syntax (&optional arg)
--- 175,179 ----
        (setq ARG (1+ ARG)))))
  
! ;;  Syntax blocks 
  
  (defun forward-same-syntax (&optional arg)
*************** bounds-of-thing-at-point."
*** 187,191 ****
      (setq arg (1- arg))))
  
! ;;=== Aliases =============================================================
  
  (defun word-at-point () (thing-at-point 'word))
--- 187,191 ----
      (setq arg (1- arg))))
  
! ;;  Aliases 
  
  (defun word-at-point () (thing-at-point 'word))
*************** bounds-of-thing-at-point."
*** 193,197 ****
  
  (defun read-from-whole-string (STR)
!   "Read a lisp expression from STR, signalling an error if the entire string
  was not used."
    (let* ((read-data (read-from-string STR))
--- 193,197 ----
  
  (defun read-from-whole-string (STR)
!   "Read a lisp expression from STR, signaling an error if the entire string
  was not used."
    (let* ((read-data (read-from-string STR))
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/time-stamp.el emacs-19.31/lisp/time-stamp.el
*** emacs-19.30/lisp/time-stamp.el	Mon Oct 30 19:01:21 1995
--- emacs-19.31/lisp/time-stamp.el	Fri Jan 19 21:49:02 1996
***************
*** 1,6 ****
  ;;; time-stamp.el --- Maintain last change time stamps in files edited by Emacs
- ;;; Copyright 1989, 1993, 1994, 1995 Free Software Foundation, Inc.
- ;;; Maintainer's Time-stamp: <95/09/21 12:32:56 gildea>
  
  ;; Maintainer: Stephen Gildea <gildea@lcs.mit.edu>
  ;; Keywords: tools
--- 1,7 ----
  ;;; time-stamp.el --- Maintain last change time stamps in files edited by Emacs
  
+ ;; Copyright 1989, 1993, 1994, 1995 Free Software Foundation, Inc.
+ 
+ ;; Maintainer's Time-stamp: <95/12/28 19:48:49 gildea>
  ;; Maintainer: Stephen Gildea <gildea@lcs.mit.edu>
  ;; Keywords: tools
***************
*** 17,53 ****
  
  ;; 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:
  
! ;;; If you put a time stamp template anywhere in the first 8 lines of a file,
! ;;; it can be updated every time you save the file.  See the top of
! ;;; time-stamp.el for a sample.  The template looks like one of the following:
! ;;;     Time-stamp: <>
! ;;;     Time-stamp: " "
! ;;; The time stamp is written between the brackets or quotes, resulting in
! ;;;     Time-stamp: <95/01/18 10:20:51 gildea>
! ;;; Here is an example which puts the file name and time stamp in the binary:
! ;;; static char *time_stamp = "sdmain.c Time-stamp: <>";
! 
! ;;; To activate automatic time stamping in GNU Emacs 19, add this code
! ;;; to your .emacs file:
! ;;; (add-hook 'write-file-hooks 'time-stamp)
! ;;;
! ;;; In Emacs 18 you will need to do this instead:
! ;;; (if (not (memq 'time-stamp write-file-hooks))
! ;;;     (setq write-file-hooks
! ;;;           (cons 'time-stamp write-file-hooks)))
! ;;; (autoload 'time-stamp "time-stamp" "Update the time stamp in a buffer." t)
  
! ;;; See the documentation for the function `time-stamp' for more details.
  
  ;;; Change Log:
  
! ;;; Originally based on the 19 Dec 88 version of
! ;;;   date.el by John Sturdy <mcvax!harlqn.co.uk!jcgs@uunet.uu.net>
! ;;; version 2, January 1995: replaced functions with %-escapes
! ;;; $Id: time-stamp.el,v 1.15 1995/10/31 00:01:15 kwzh Exp $
  
  ;;; Code:
--- 18,55 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
! ;; If you put a time stamp template anywhere in the first 8 lines of a file,
! ;; it can be updated every time you save the file.  See the top of
! ;; time-stamp.el for a sample.  The template looks like one of the following:
! ;;     Time-stamp: <>
! ;;     Time-stamp: " "
! ;; The time stamp is written between the brackets or quotes, resulting in
! ;;     Time-stamp: <95/01/18 10:20:51 gildea>
! ;; Here is an example that puts the file name and time stamp in the binary:
! ;; static char *time_stamp = "sdmain.c Time-stamp: <>";
! 
! ;; To activate automatic time stamping in GNU Emacs 19, add this code
! ;; to your .emacs file:
! ;; (add-hook 'write-file-hooks 'time-stamp)
! ;;
! ;; In Emacs 18 you will need to do this instead:
! ;; (if (not (memq 'time-stamp write-file-hooks))
! ;;     (setq write-file-hooks
! ;;           (cons 'time-stamp write-file-hooks)))
! ;; (autoload 'time-stamp "time-stamp" "Update the time stamp in a buffer." t)
  
! ;; See the documentation for the function `time-stamp' for more details.
  
  ;;; Change Log:
  
! ;; Originally based on the 19 Dec 88 version of
! ;;   date.el by John Sturdy <mcvax!harlqn.co.uk!jcgs@uunet.uu.net>
! ;; version 2, January 1995: replaced functions with %-escapes
! ;; $Id: time-stamp.el,v 1.18 1996/01/20 02:49:02 erik Exp $
  
  ;;; Code:
*************** use \"%3a %3b %2d %02H:%02M:%02S %Z %y\"
*** 103,110 ****
  
  (defvar time-stamp-line-limit 8	    ;Do not change!
!   "Number of lines at the beginning of a file that are searched.
  The patterns `time-stamp-start' and `time-stamp-end' must be found on one
! of the first `time-stamp-line-limit' lines of the file for the file to
! be time-stamped by \\[time-stamp].
  
  Do not change `time-stamp-line-limit', `time-stamp-start', or
--- 105,112 ----
  
  (defvar time-stamp-line-limit 8	    ;Do not change!
!   "Lines of a file searched; positive counts from start, negative from end.
  The patterns `time-stamp-start' and `time-stamp-end' must be found on one
! of the first (last) `time-stamp-line-limit' lines of the file for the
! file to be time-stamped by \\[time-stamp].
  
  Do not change `time-stamp-line-limit', `time-stamp-start', or
*************** control finding the template."
*** 153,157 ****
    (interactive)
    (let ((case-fold-search nil)
! 	(need-to-warn nil))
      (if (and (stringp time-stamp-start)
  	     (stringp time-stamp-end))
--- 155,160 ----
    (interactive)
    (let ((case-fold-search nil)
! 	(need-to-warn nil)
! 	start search-end)
      (if (and (stringp time-stamp-start)
  	     (stringp time-stamp-end))
*************** control finding the template."
*** 159,190 ****
  	  (save-restriction
  	    (widen)
! 	    (goto-char (point-min))
! 	    (forward-line time-stamp-line-limit)
! 	    (let ((start (point-min))
! 		  (search-end (point)))
! 	      (goto-char start)
! 	      (while
! 		  (and (< (point) search-end)
! 		       (re-search-forward time-stamp-start search-end 'move))
! 		(setq start (point))
! 		(end-of-line)
! 		(let ((line-end (point)))
! 		  (goto-char start)
! 		  (if (re-search-forward time-stamp-end line-end 'move)
! 		      (progn
! 			(if time-stamp-active
! 			    (let ((end (match-beginning 0)))
! 			      (delete-region start end)
! 			      (goto-char start)
! 			      (insert (time-stamp-string))
! 			      (setq end (point))
! 			      ;; remove any tabs used to format time stamp
! 			      (goto-char start)
! 			      (if (search-forward "\t" end t)
! 				  (untabify start end)))
! 			  (if time-stamp-warn-inactive
! 			      ;; do warning outside save-excursion
! 			      (setq need-to-warn t)))
! 			(setq search-end (point)))))))))
        ;; don't signal an error in a write-file-hook
        (message "time-stamp-start or time-stamp-end is not a string")
--- 162,197 ----
  	  (save-restriction
  	    (widen)
! 	    (if (> time-stamp-line-limit 0)
! 		(progn
! 		  (goto-char (setq start (point-min)))
! 		  (forward-line time-stamp-line-limit)
! 		  (setq search-end (point)))
! 	      (goto-char (setq search-end (point-max)))
! 	      (forward-line time-stamp-line-limit)
! 	      (setq start (point)))
! 	    (goto-char start)
! 	    (while
! 		(and (< (point) search-end)
! 		     (re-search-forward time-stamp-start search-end 'move))
! 	      (setq start (point))
! 	      (end-of-line)
! 	      (let ((line-end (point)))
! 		(goto-char start)
! 		(if (re-search-forward time-stamp-end line-end 'move)
! 		    (progn
! 		      (if time-stamp-active
! 			  (let ((end (match-beginning 0)))
! 			    (delete-region start end)
! 			    (goto-char start)
! 			    (insert (time-stamp-string))
! 			    (setq end (point))
! 			    ;; remove any tabs used to format time stamp
! 			    (goto-char start)
! 			    (if (search-forward "\t" end t)
! 				(untabify start end)))
! 			(if time-stamp-warn-inactive
! 			    ;; do warning outside save-excursion
! 			    (setq need-to-warn t)))
! 		      (setq search-end (point))))))))
        ;; don't signal an error in a write-file-hook
        (message "time-stamp-start or time-stamp-end is not a string")
*************** With arg, turn time stamping on if and o
*** 232,235 ****
--- 239,248 ----
    ["Sunday" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday"])
  
+ (defconst time-stamp-am-pm '("am" "pm")
+   "List of strings used to denote morning and afternoon.")
+ 
+ (defconst time-stamp-no-file "(no file)"
+   "String to use when the buffer is not associated with a file.")
+ 
  (defun time-stamp-strftime (format &optional time)
    "Uses a FORMAT to format date, time, file, and user information.
*************** of the format string."
*** 329,334 ****
  	  (let ((name
  		 (if (> 12 (string-to-int (substring time-string 11 13)))
! 		     "am"
! 		   "pm")))
  	    (if (eq cur-char ?p)
  		name
--- 342,347 ----
  	  (let ((name
  		 (if (> 12 (string-to-int (substring time-string 11 13)))
! 		     (car time-stamp-am-pm)
! 		   (car (cdr time-stamp-am-pm)))))
  	    (if (eq cur-char ?p)
  		name
*************** of the format string."
*** 352,359 ****
  	  (if buffer-file-name
  	      (file-name-nondirectory buffer-file-name)
! 	    "(no file)"))
  	 ((eq cur-char ?F)		;buffer-file-name, full path
  	  (or buffer-file-name
! 	      "(no file)"))
  	 ((eq cur-char ?s)		;system name
  	  (system-name))
--- 365,372 ----
  	  (if buffer-file-name
  	      (file-name-nondirectory buffer-file-name)
! 	    time-stamp-no-file))
  	 ((eq cur-char ?F)		;buffer-file-name, full path
  	  (or buffer-file-name
! 	      time-stamp-no-file))
  	 ((eq cur-char ?s)		;system name
  	  (system-name))
*************** of the format string."
*** 387,392 ****
  This is the value of `mail-host-address' if bound and a string,
  otherwise the value of `time-stamp-mail-host' (for versions of Emacs
! before 19.29) otherwise the value of the function system-name.
! This function may be usefully referenced by `time-stamp-format'."
    (or (and (boundp 'mail-host-address)
  	   (stringp mail-host-address)
--- 400,404 ----
  This is the value of `mail-host-address' if bound and a string,
  otherwise the value of `time-stamp-mail-host' (for versions of Emacs
! before 19.29) otherwise the value of the function system-name."
    (or (and (boundp 'mail-host-address)
  	   (stringp mail-host-address)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/time.el emacs-19.31/lisp/time.el
*** emacs-19.30/lisp/time.el	Fri Oct 27 17:45:27 1995
--- emacs-19.31/lisp/time.el	Sat Mar  2 01:03:48 1996
***************
*** 1,5 ****
  ;;; time.el --- display time and load in mode line of Emacs.
  
! ;; Copyright (C) 1985, 1986, 1987, 1993, 1994 Free Software Foundation, Inc.
  
  ;; Maintainer: FSF
--- 1,5 ----
  ;;; time.el --- display time and load in mode line of Emacs.
  
! ;; Copyright (C) 1985, 86, 87, 93, 94, 1996 Free Software Foundation, Inc.
  
  ;; Maintainer: FSF
***************
*** 18,28 ****
  
  ;; 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:
  
! ;;; Facilities to display current time/date and a new-mail indicator
! ;;; in the Emacs mode line.  The single entry point is `display-time'.
  
  ;;; Code:
--- 18,29 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
  
! ;; Facilities to display current time/date and a new-mail indicator
! ;; in the Emacs mode line.  The single entry point is `display-time'.
  
  ;;; Code:
*************** default, which is system-dependent, and 
*** 37,41 ****
  *Non-nil means \\[display-time] should display day and date as well as time.")
  
! (defvar display-time-process nil)
  
  (defvar display-time-interval 60
--- 38,42 ----
  *Non-nil means \\[display-time] should display day and date as well as time.")
  
! (defvar display-time-timer nil)
  
  (defvar display-time-interval 60
*************** are displayed as well.
*** 63,94 ****
  After each update, `display-time-hook' is run with `run-hooks'."
    (interactive)
!   (let ((live (and display-time-process
! 		   (eq (process-status display-time-process) 'run))))
!     (if (not live)
! 	(progn
! 	  (if display-time-process
! 	      (delete-process display-time-process))
! 	  (or global-mode-string (setq global-mode-string '("")))
! 	  (or (memq 'display-time-string global-mode-string)
! 	      (setq global-mode-string
! 		    (append global-mode-string '(display-time-string))))
! 	  (setq display-time-string "")
! 	  ;; Using a pty is wasteful, and the separate session causes
! 	  ;; annoyance sometimes (some systems kill idle sessions).
! 	  (let ((process-connection-type nil))
! 	    (setq display-time-process
! 		  (start-process "display-time" nil
! 				 (expand-file-name "wakeup" exec-directory)
! 				 (int-to-string display-time-interval))))
! 	  (process-kill-without-query display-time-process)
! 	  (set-process-sentinel display-time-process 'display-time-sentinel)
! 	  (set-process-filter display-time-process 'display-time-filter)))))
! 
! (defun display-time-sentinel (proc reason)
!   (or (eq (process-status proc) 'run)
!       (setq display-time-string ""))
!   ;; Force mode-line updates
!   (force-mode-line-update t)
!   (sit-for 0))
  
  (defvar display-time-string-forms
--- 64,78 ----
  After each update, `display-time-hook' is run with `run-hooks'."
    (interactive)
!   (setq display-time-string "")
!   (or global-mode-string (setq global-mode-string '("")))
!   (or (memq 'display-time-string global-mode-string)
!       (setq global-mode-string
! 	    (append global-mode-string '(display-time-string))))
!   ;; Setup the time timer.
!   (and display-time-timer (cancel-timer display-time-timer))
!   (setq display-time-timer
! 	(run-at-time nil display-time-interval 'display-time-event-handler))
!   ;; When you get new mail, clear "Mail" from the mode line.
!   (add-hook 'rmail-after-get-new-mail-hook 'display-time-event-handler))
  
  (defvar display-time-string-forms
*************** For example, the form
*** 117,121 ****
  would give mode line times like `94/12/30 21:07:48 (UTC)'.")
  
! (defun display-time-filter (proc string)
    (let* ((now (current-time))
  	 (time (current-time-string now))
--- 101,114 ----
  would give mode line times like `94/12/30 21:07:48 (UTC)'.")
  
! (defun display-time-event-handler ()
!   (display-time-update)
!   ;; Do redisplay right now, if no input pending.
!   (sit-for 0))
! 
! ;; Update the display-time info for the mode line
! ;; but don't redisplay right now.  This is used for
! ;; things like Rmail `g' that want to force an update
! ;; which can wait for the next redisplay.
! (defun display-time-update ()
    (let* ((now (current-time))
  	 (time (current-time-string now))
*************** would give mode line times like `94/12/3
*** 168,174 ****
      ;; what variables are available.
      (run-hooks 'display-time-hook))
!   (force-mode-line-update)
!   ;; Do redisplay right now, if no input pending.
!   (sit-for 0))
  
  (defun display-time-file-nonempty-p (file)
--- 161,165 ----
      ;; what variables are available.
      (run-hooks 'display-time-hook))
!   (force-mode-line-update))
  
  (defun display-time-file-nonempty-p (file)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/timer.el emacs-19.31/lisp/timer.el
*** emacs-19.30/lisp/timer.el	Mon Nov 21 23:38:27 1994
--- emacs-19.31/lisp/timer.el	Thu Apr  4 11:35:24 1996
***************
*** 1,5 ****
! ;;; timer.el --- run a function with args at some time in future
  
! ;; Copyright (C) 1990, 1993, 1994 Free Software Foundation, Inc.
  
  ;; Maintainer: FSF
--- 1,5 ----
! ;;; timer.el --- run a function with args at some time in future.
  
! ;; Copyright (C) 1996 Free Software Foundation, Inc.
  
  ;; Maintainer: FSF
***************
*** 18,23 ****
  
  ;; 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:
--- 18,24 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 25,181 ****
  ;; This package gives you the capability to run Emacs Lisp commands at
  ;; specified times in the future, either as one-shots or periodically.
- ;; The single entry point is `run-at-time'.
  
  ;;; Code:
  
! (defvar timer-program (expand-file-name "timer" exec-directory)
!   "The name of the program to run as the timer subprocess.
! It should normally be in the exec-directory.")
! 
! (defvar timer-process nil)
! (defvar timer-alist ())
! (defvar timer-out "")
! (defvar timer-dont-exit nil
!   ;; this is useful for functions which will be doing their own erratic
!   ;; rescheduling or people who otherwise expect to use the process frequently
!   "If non-nil, don't exit the timer process when no more events are pending.")
! 
! ;; Error symbols for timers
! (put 'timer-error 'error-conditions '(error timer-error))
! (put 'timer-error 'error-message "Timer error")
! 
! (put 'timer-abnormal-termination 
!      'error-conditions 
!      '(error timer-error timer-abnormal-termination))
! (put 'timer-abnormal-termination 
!      'error-message 
!      "Timer exited abnormally--all events cancelled")
! 
! (put 'timer-filter-error
!      'error-conditions
!      '(error timer-error timer-filter-error))
! (put 'timer-filter-error
!      'error-message 
!      "Error in timer process filter")
! 
! 
! ;; This should not be necessary, but on some systems, we get
! ;; unkillable processes without this.
! ;; It may be a kernel bug, but that's not certain.
! (defun timer-kill-emacs-hook ()
!   (if timer-process
!       (progn
! 	(set-process-sentinel timer-process nil)
! 	(set-process-filter timer-process nil)
! 	(delete-process timer-process))))
! (add-hook 'kill-emacs-hook 'timer-kill-emacs-hook)
  
  ;;;###autoload
  (defun run-at-time (time repeat function &rest args)
!   "Run a function at a time, and optionally on a regular interval.
! Arguments are TIME, REPEAT, FUNCTION &rest ARGS.
! TIME, a string, can be specified absolutely or relative to now.
! TIME can also be an integer, a number of seconds.
! REPEAT, an integer number of seconds, is the interval on which to repeat
! the call to the function.  If REPEAT is nil or 0, call it just once.
! 
! Absolute times may be specified in a wide variety of formats;
! Something of the form `HOUR:MIN:SEC TIMEZONE MONTH/DAY/YEAR', where
! all fields are numbers, works; the format used by the Unix `date'
! command works too.
! 
! Relative times may be specified as a series of numbers followed by units:
!   1 min         	denotes one minute from now.
!   min			does too.
!   1 min 5 sec		denotes 65 seconds from now.
!   1 min 2 sec 3 hour 4 day 5 week 6 fortnight 7 month 8 year
! 			denotes the sum of all the given durations from now."
    (interactive "sRun at time: \nNRepeat interval: \naFunction: ")
-   (if (equal repeat 0)
-       (setq repeat nil))
-   ;; Make TIME a string.
-   (if (integerp time)
-       (setq time (format "%d sec" time)))
-   (cond ((or (not timer-process) 
-              (memq (process-status timer-process) '(exit signal nil)))
-          (if timer-process (delete-process timer-process))
-          (setq timer-process
- 	       (let ((process-connection-type nil))
- 		 (start-process "timer" nil timer-program))
-                timer-alist nil)
-          (set-process-filter   timer-process 'timer-process-filter)
-          (set-process-sentinel timer-process 'timer-process-sentinel)
-          (process-kill-without-query timer-process))
-         ((eq (process-status timer-process) 'stop)
-          (continue-process timer-process)))
-   ;; There should be a living, breathing timer process now
-   (let* ((token (concat (current-time-string) "-" (length timer-alist)))
- 	 (elt (list token repeat function args)))
-     (process-send-string timer-process (concat time "@" token "\n"))
-     (setq timer-alist (cons elt timer-alist))
-     elt))
- 
- (defun cancel-timer (elt)
-   "Cancel a timer previously made with `run-at-time'.
- The argument should be a value previously returned by `run-at-time'.
- Cancelling the timer means that nothing special 
- will happen at the specified time."
-   (setcar (cdr elt) nil)
-   (setcar (cdr (cdr elt)) 'ignore))
- 
- (defun timer-process-filter (proc str)
-   (setq timer-out (concat timer-out str))
-   (let (do token error)
-     (while (string-match "\n" timer-out)
-       (setq token (substring timer-out 0 (match-beginning 0))
- 	    do (assoc token timer-alist)
- 	    timer-out (substring timer-out (match-end 0)))
-       (cond
-        (do
- 	(apply (nth 2 do) (nth 3 do))	; do it
- 	(if (natnump (nth 1 do))	; reschedule it
- 	    (send-string proc (concat (nth 1 do) " sec@" (car do) "\n"))
- 	  (setq timer-alist (delq do timer-alist))))
-        ((string-match "timer: \\([^:]+\\): \\([^@]*\\)@\\(.*\\)$" token)
- 	(setq error (substring token (match-beginning 1) (match-end 1))
- 	      do    (substring token (match-beginning 2) (match-end 2))
- 	      token (assoc (substring token (match-beginning 3) (match-end 3))
- 			   timer-alist)
- 	      timer-alist (delq token timer-alist))
- 	(or timer-alist 
- 	    timer-dont-exit
- 	    (process-send-eof proc))
- 	;; Update error message for this particular instance
- 	(put 'timer-filter-error
- 	     'error-message
- 	     (format "%s for %s; couldn't set at \"%s\"" 
- 		     error (nth 2 token) do))
- 	(signal 'timer-filter-error (list proc str)))))
-     (or timer-alist timer-dont-exit (process-send-eof proc))))
- 
- (defun timer-process-sentinel (proc str)
-   (let ((stat (process-status proc)))
-     (if (eq stat 'stop)
- 	(continue-process proc)
-       ;; if it exited normally, presumably it was intentional.
-       ;; if there were no pending events, who cares that it exited?
-       (or (null timer-alist)
-           (eq stat 'exit)
-           (let ((alist timer-alist))
-             (setq timer-process nil timer-alist nil)
-             (signal 'timer-abnormal-termination (list proc stat str alist))))
-       ;; Used to set timer-scratch to "", but nothing uses that var.
-       (setq timer-process nil timer-alist nil))))
  
! (defun cancel-function-timers (function)
!   "Cancel all events scheduled by `run-at-time' which would run FUNCTION."
!   (interactive "aCancel timers of function: ")
!   (let ((alist timer-alist))
!     (while alist
!       (if (eq (nth 2 (car alist)) function)
!           (setq timer-alist (delq (car alist) timer-alist)))
!       (setq alist (cdr alist))))
!   (or timer-alist timer-dont-exit (process-send-eof timer-process)))
  
  (provide 'timer)
  
--- 26,413 ----
  ;; This package gives you the capability to run Emacs Lisp commands at
  ;; specified times in the future, either as one-shots or periodically.
  
  ;;; Code:
  
! ;; Layout of a timer vector:
! ;; [triggered-p high-seconds low-seconds usecs repeat-delay
! ;;  function args idle-delay]
! 
! (defun timer-create ()
!   "Create a timer object."
!   (let ((timer (make-vector 8 nil)))
!     (aset timer 0 t)
!     timer))
! 
! (defun timerp (object)
!   "Return t if OBJECT is a timer."
!   (and (vectorp object) (= (length object) 8)))
! 
! (defun timer-set-time (timer time &optional delta)
!   "Set the trigger time of TIMER to TIME.
! TIME must be in the internal format returned by, e.g., `current-time'.
! If optional third argument DELTA is a non-zero integer, make the timer
! fire repeatedly that many seconds apart."
!   (or (timerp timer)
!       (error "Invalid timer"))
!   (aset timer 1 (car time))
!   (aset timer 2 (if (consp (cdr time)) (car (cdr time)) (cdr time)))
!   (aset timer 3 (or (and (consp (cdr time)) (consp (cdr (cdr time)))
! 			 (nth 2 time))
! 		    0))
!   (aset timer 4 (and (numberp delta) (> delta 0) delta))
!   timer)
! 
! (defun timer-set-idle-time (timer secs &optional repeat)
!   "Set the trigger idle time of TIMER to SECS.
! If optional third argument REPEAT is non-nil, make the timer
! fire each time Emacs is idle for that many seconds."
!   (or (timerp timer)
!       (error "Invalid timer"))
!   (aset timer 1 0)
!   (aset timer 2 0)
!   (aset timer 3 0)
!   (timer-inc-time timer secs)
!   (aset timer 4 repeat)
!   timer)
! 
! (defun timer-relative-time (time secs &optional usecs)
!   "Advance TIME by SECS seconds and optionally USECS microseconds.
! SECS may be a fraction."
!   (let ((high (car time))
! 	(low (if (consp (cdr time)) (nth 1 time) (cdr time)))
! 	(micro (if (numberp (car-safe (cdr-safe (cdr time))))
! 		   (nth 2 time)
! 		 0)))
!     ;; Add
!     (if usecs (setq micro (+ micro usecs)))
!     (if (floatp secs)
! 	(setq micro (+ micro (floor (* 1000000 (- secs (floor secs)))))))
!     (setq low (+ low (floor secs)))
! 
!     ;; Normalize
!     (setq low (+ low (/ micro 1000000)))
!     (setq micro (mod micro 1000000))
!     (setq high (+ high (/ low 65536)))
!     (setq low (logand low 65535))
! 
!     (list high low (and (/= micro 0) micro))))
! 
! (defun timer-inc-time (timer secs &optional usecs)
!   "Increment the time set in TIMER by SECS seconds and USECS microseconds.
! SECS may be a fraction."
!   (let ((time (timer-relative-time
! 	       (list (aref timer 1) (aref timer 2) (aref timer 3))
! 	       secs
! 	       usecs)))
!     (aset timer 1 (nth 0 time))
!     (aset timer 2 (nth 1 time))
!     (aset timer 3 (or (nth 2 time) 0))))
! 
! (defun timer-set-time-with-usecs (timer time usecs &optional delta)
!   "Set the trigger time of TIMER to TIME.
! TIME must be in the internal format returned by, e.g., `current-time'.
! If optional third argument DELTA is a non-zero integer, make the timer
! fire repeatedly that many seconds apart."
!   (or (timerp timer)
!       (error "Invalid timer"))
!   (aset timer 1 (car time))
!   (aset timer 2 (if (consp (cdr time)) (car (cdr time)) (cdr time)))
!   (aset timer 3 usecs)
!   (aset timer 4 (and (numberp delta) (> delta 0) delta))
!   timer)
! 
! (defun timer-set-function (timer function &optional args)
!   "Make TIMER call FUNCTION with optional ARGS when triggering."
!   (or (timerp timer)
!       (error "Invalid timer"))
!   (aset timer 5 function)
!   (aset timer 6 args)
!   timer)
! 
! (defun timer-activate (timer)
!   "Put TIMER on the list of active timers."
!   (if (and (timerp timer)
! 	   (integerp (aref timer 1))
! 	   (integerp (aref timer 2))
! 	   (integerp (aref timer 3))
! 	   (aref timer 5))
!       (let ((timers timer-list)
! 	    last)
! 	;; Skip all timers to trigger before the new one.
! 	(while (and timers
! 		    (or (> (aref timer 1) (aref (car timers) 1))
! 			(and (= (aref timer 1) (aref (car timers) 1))
! 			     (> (aref timer 2) (aref (car timers) 2)))
! 			(and (= (aref timer 1) (aref (car timers) 1))
! 			     (= (aref timer 2) (aref (car timers) 2))
! 			     (> (aref timer 3) (aref (car timers) 3)))))
! 	  (setq last timers
! 		timers (cdr timers)))
! 	;; Insert new timer after last which possibly means in front of queue.
! 	(if last
! 	    (setcdr last (cons timer timers))
! 	  (setq timer-list (cons timer timers)))
! 	(aset timer 0 nil)
! 	(aset timer 7 nil)
! 	nil)
!     (error "Invalid or uninitialized timer")))
! 
! (defun timer-activate-when-idle (timer)
!   "Arrange to activate TIMER whenever Emacs is next idle."
!   (if (and (timerp timer)
! 	   (integerp (aref timer 1))
! 	   (integerp (aref timer 2))
! 	   (integerp (aref timer 3))
! 	   (aref timer 5))
!       (let ((timers timer-idle-list)
! 	    last)
! 	;; Skip all timers to trigger before the new one.
! 	(while (and timers
! 		    (or (> (aref timer 1) (aref (car timers) 1))
! 			(and (= (aref timer 1) (aref (car timers) 1))
! 			     (> (aref timer 2) (aref (car timers) 2)))
! 			(and (= (aref timer 1) (aref (car timers) 1))
! 			     (= (aref timer 2) (aref (car timers) 2))
! 			     (> (aref timer 3) (aref (car timers) 3)))))
! 	  (setq last timers
! 		timers (cdr timers)))
! 	;; Insert new timer after last which possibly means in front of queue.
! 	(if last
! 	    (setcdr last (cons timer timers))
! 	  (setq timer-idle-list (cons timer timers)))
! 	(aset timer 0 t)
! 	(aset timer 7 t)
! 	nil)
!     (error "Invalid or uninitialized timer")))
! 
! (defalias 'disable-timeout 'cancel-timer)
! (defun cancel-timer (timer)
!   "Remove TIMER from the list of active timers."
!   (or (timerp timer)
!       (error "Invalid timer"))
!   (setq timer-list (delq timer timer-list))
!   (setq timer-idle-list (delq timer timer-idle-list))
!   nil)
  
+ (defun cancel-function-timers (function)
+   "Cancel all timers scheduled by `run-at-time' which would run FUNCTION."
+   (interactive "aCancel timers of function: ")
+   (let ((tail timer-list))
+     (while tail
+       (if (eq (aref (car tail) 5) function)
+           (setq timer-list (delq (car tail) timer-list)))
+       (setq tail (cdr tail))))
+   (let ((tail timer-idle-list))
+     (while tail
+       (if (eq (aref (car tail) 5) function)
+           (setq timer-idle-list (delq (car tail) timer-idle-list)))
+       (setq tail (cdr tail)))))
+ 
+ ;; Set up the common handler for all timer events.  Since the event has
+ ;; the timer as parameter we can still distinguish.  Note that using
+ ;; special-event-map ensures that event timer events that arrive in the
+ ;; middle of a key sequence being entered are still handled correctly.
+ (define-key special-event-map [timer-event] 'timer-event-handler)
+ 
+ ;; Record the last few events, for debugging.
+ (defvar timer-event-last-2 nil)
+ (defvar timer-event-last-1 nil)
+ (defvar timer-event-last nil)
+ 
+ (defun timer-event-handler (event)
+   "Call the handler for the timer in the event EVENT."
+   (interactive "e")
+   (setq timer-event-last-2 timer-event-last-1)
+   (setq timer-event-last-1 timer-event-last)
+   (setq timer-event-last (cons event (copy-sequence event)))
+   (let ((inhibit-quit t)
+ 	(timer (car-safe (cdr-safe event))))
+     (if (timerp timer)
+ 	(progn
+ 	  ;; Delete from queue.
+ 	  (cancel-timer timer)
+ 	  ;; Run handler
+ 	  (condition-case nil
+ 	      (apply (aref timer 5) (aref timer 6))
+ 	    (error nil))
+ 	  ;; Re-schedule if requested.
+ 	  (if (aref timer 4)
+ 	      (if (aref timer 7)
+ 		  (timer-activate-when-idle timer)
+ 		(timer-inc-time timer (aref timer 4) 0)
+ 		(timer-activate timer))))
+       (error "Bogus timer event"))))
+ 
+ ;; This function is incompatible with the one in levents.el.
+ (defun timeout-event-p (event)
+   "Non-nil if EVENT is a timeout event."
+   (and (listp event) (eq (car event) 'timer-event)))
+ 
  ;;;###autoload
  (defun run-at-time (time repeat function &rest args)
!   "Perform an action after a delay of SECS seconds.
! Repeat the action every REPEAT seconds, if REPEAT is non-nil.
! TIME should be a string like \"11:23pm\", nil meaning now, a number of seconds
! from now, or a value from `encode-time'.
! REPEAT may be an integer or floating point number.
! The action is to call FUNCTION with arguments ARGS.
! 
! This function returns a timer object which you can use in `cancel-timer'."
    (interactive "sRun at time: \nNRepeat interval: \naFunction: ")
  
!   ;; Special case: nil means "now" and is useful when repeating.
!   (if (null time)
!       (setq time (current-time)))
! 
!   ;; Handle numbers as relative times in seconds.
!   (if (numberp time)
!       (setq time (timer-relative-time (current-time) time)))
! 
!   ;; Handle relative times like "2 hours and 35 minutes"
!   (if (stringp time)
!       (let ((secs (timer-duration time)))
! 	(if secs
! 	    (setq time (timer-relative-time (current-time) secs)))))
! 
!   ;; Handle "11:23pm" and the like.  Interpret it as meaning today
!   ;; which admittedly is rather stupid if we have passed that time
!   ;; already.  (Though only Emacs hackers hack Emacs at that time.)
!   (if (stringp time)
!       (progn
! 	(require 'diary-lib)
! 	(let ((hhmm (diary-entry-time time))
! 	      (now (decode-time)))
! 	  (if (>= hhmm 0)
! 	      (setq time
! 		    (encode-time 0 (% hhmm 100) (/ hhmm 100) (nth 3 now)
! 				 (nth 4 now) (nth 5 now) (nth 8 now)))))))
! 
!   (or (consp time)
!       (error "Invalid time format"))
! 
!   (or (null repeat)
!       (numberp repeat)
!       (error "Invalid repetition interval"))
! 
!   (let ((timer (timer-create)))
!     (timer-set-time timer time repeat)
!     (timer-set-function timer function args)
!     (timer-activate timer)
!     timer))
  
+ ;;;###autoload
+ (defun run-with-timer (secs repeat function &rest args)
+   "Perform an action after a delay of SECS seconds.
+ Repeat the action every REPEAT seconds, if REPEAT is non-nil.
+ SECS and REPEAT may be integers or floating point numbers.
+ The action is to call FUNCTION with arguments ARGS.
+ 
+ This function returns a timer object which you can use in `cancel-timer'."
+   (interactive "sRun after delay (seconds): \nNRepeat interval: \naFunction: ")
+   (apply 'run-at-time secs repeat function args))
+ 
+ ;;;###autoload
+ (defun add-timeout (secs function object &optional repeat)
+   "Add a timer to run SECS seconds from now, to call FUNCTION on OBJECT.
+ If REPEAT is non-nil, repeat the timer every REPEAT seconds.
+ This function is for compatibility; see also `run-with-timer'."
+   (run-with-timer secs repeat function object))
+ 
+ ;;;###autoload
+ (defun run-with-idle-timer (secs repeat function &rest args)
+   "Perform an action the next time Emacs is idle for SECS seconds.
+ If REPEAT is non-nil, do this each time Emacs is idle for SECS seconds.
+ SECS may be an integer or a floating point number.
+ The action is to call FUNCTION with arguments ARGS.
+ 
+ This function returns a timer object which you can use in `cancel-timer'."
+   (interactive
+    (list (read-from-minibuffer "Run after idle (seconds): " nil nil t)
+ 	 (y-or-n-p "Repeat each time Emacs is idle? ")
+ 	 (intern (completing-read "Function: " obarray 'fboundp t))))
+   (let ((timer (timer-create)))
+     (timer-set-function timer function args)
+     (timer-set-idle-time timer secs repeat)
+     (timer-activate-when-idle timer)
+     timer))
+ 
+ (defun with-timeout-handler (tag)
+   (throw tag 'timeout))
+ 
+ ;;;###autoload (put 'with-timeout 'lisp-indent-function 1)
+ 
+ ;;;###autoload
+ (defmacro with-timeout (list &rest body)
+   "Run BODY, but if it doesn't finish in SECONDS seconds, give up.
+ If we give up, we run the TIMEOUT-FORMS and return the value of the last one.
+ The call should look like:
+  (with-timeout (SECONDS TIMEOUT-FORMS...) BODY...)
+ The timeout is checked whenever Emacs waits for some kind of external
+ event \(such as keyboard input, input from subprocesses, or a certain time);
+ if the program loops without waiting in any way, the timeout will not
+ be detected."
+   (let ((seconds (car list))
+ 	(timeout-forms (cdr list)))
+     `(let ((with-timeout-tag (cons nil nil))
+ 	   with-timeout-value with-timeout-timer)
+        (if (catch with-timeout-tag
+ 	     (progn
+ 	       (setq with-timeout-timer
+ 		     (run-with-timer ,seconds nil
+ 				      'with-timeout-handler
+ 				      with-timeout-tag))
+ 	       (setq with-timeout-value (progn . ,body))
+ 	       nil))
+ 	   (progn . ,timeout-forms)
+ 	 (cancel-timer with-timeout-timer)
+ 	 with-timeout-value))))
+ 
+ (defun y-or-n-p-with-timeout (prompt seconds default-value)
+   "Like (y-or-n-p PROMPT), with a timeout.
+ If the user does not answer after SECONDS seconds, return DEFAULT-VALUE."
+   (with-timeout (seconds default-value)
+     (y-or-n-p prompt)))
+ 
+ (defvar timer-duration-words
+   (list (cons "microsec" 0.000001)
+ 	(cons "microsecond" 0.000001)
+         (cons "millisec" 0.001)
+ 	(cons "millisecond" 0.001)
+         (cons "sec" 1)
+ 	(cons "second" 1)
+ 	(cons "min" 60)
+ 	(cons "minute" 60)
+ 	(cons "hour" (* 60 60))
+ 	(cons "day" (* 24 60 60))
+ 	(cons "week" (* 7 24 60 60))
+ 	(cons "fortnight" (* 14 24 60 60))
+ 	(cons "month" (* 30 24 60 60))	  ; Approximation
+ 	(cons "year" (* 365.25 24 60 60)) ; Approximation
+ 	)
+   "Alist mapping temporal words to durations in seconds")
+ 
+ (defun timer-duration (string)
+   "Return number of seconds specified by STRING, or nil if parsing fails."
+   (let ((secs 0)
+ 	(start 0)
+ 	(case-fold-search t))
+     (while (string-match
+ 	    "[ \t]*\\([0-9.]+\\)?[ \t]*\\([a-z]+[a-rt-z]\\)s?[ \t]*"
+ 	    string start)
+       (let ((count (if (match-beginning 1)
+ 		       (string-to-number (match-string 1 string))
+ 		     1))
+ 	    (itemsize (cdr (assoc (match-string 2 string)
+ 				  timer-duration-words))))
+ 	(if itemsize
+ 	    (setq start (match-end 0)
+ 		  secs (+ secs (* count itemsize)))
+ 	  (setq secs nil
+ 		start (length string)))))
+     (if (= start (length string))
+ 	secs
+       (if (string-match "\\`[0-9.]+\\'" string)
+ 	  (string-to-number string)))))
+ 
  (provide 'timer)
  
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/timezone.el emacs-19.31/lisp/timezone.el
*** emacs-19.30/lisp/timezone.el	Mon Oct 30 12:30:37 1995
--- emacs-19.31/lisp/timezone.el	Sun Jan 14 02:34:30 1996
***************
*** 20,25 ****
  
  ;; 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.
  
  ;;; Code:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Code:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/tmm.el emacs-19.31/lisp/tmm.el
*** emacs-19.30/lisp/tmm.el	Wed Nov 15 18:28:17 1995
--- emacs-19.31/lisp/tmm.el	Thu Mar 28 13:14:08 1996
***************
*** 1,5 ****
  ;;; tmm.el --- text mode access to menu-bar
  
! ;; Copyright (C) 1994, 1995 Free Software Foundation, Inc.
  
  ;; Author: Ilya Zakharevich <ilya@math.mps.ohio-state.edu>
--- 1,5 ----
  ;;; tmm.el --- text mode access to menu-bar
  
! ;; Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc.
  
  ;; Author: Ilya Zakharevich <ilya@math.mps.ohio-state.edu>
***************
*** 19,35 ****
  
  ;; 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 ============================================================
  
! ;;; To use this package add 
  
! ;;; (autoload 'tmm-menubar 'tmm "Text mode substitute for menubar" t) 
! ;;; (global-set-key [f10] 'tmm-menubar)
  
! ;;; to your .emacs file. You can also add your own access to different
! ;;; menus available in Window System Emacs modelling definition after
! ;;; tmm-menubar.
  
  (require 'electric)
--- 19,37 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
! ;;; Commentary:
  
! ;; To use this package add 
  
! ;; (autoload 'tmm-menubar 'tmm "Text mode substitute for menubar" t) 
! ;; (global-set-key [f10] 'tmm-menubar)
! ;; to your .emacs file. You can also add your own access to different
! ;; menus available in Window System Emacs modeling definition after
! ;; tmm-menubar.
  
! ;;; Code:
  
  (require 'electric)
***************
*** 45,58 ****
  ;;;###autoload (define-key global-map "\M-`" 'tmm-menubar)
  ;;;###autoload (define-key global-map [f10] 'tmm-menubar)
! ;;;###autoload (define-key global-map [menu-bar mouse-1] 'tmm-menubar)
  
  ;;;###autoload
! (defun tmm-menubar ()
    "Text-mode emulation of looking and choosing from a menubar.
! See the documentation for `tmm-prompt'."
    (interactive)
    (run-hooks 'menu-bar-update-hook)
    ;; Obey menu-bar-final-items; put those items last.
!   (let ((menu-bar (tmm-get-keybind [menu-bar])))
      (let ((list menu-bar-final-items))
        (while list
--- 47,63 ----
  ;;;###autoload (define-key global-map "\M-`" 'tmm-menubar)
  ;;;###autoload (define-key global-map [f10] 'tmm-menubar)
! ;;;###autoload (define-key global-map [menu-bar mouse-1] 'tmm-menubar-mouse)
  
  ;;;###autoload
! (defun tmm-menubar (&optional x-position)
    "Text-mode emulation of looking and choosing from a menubar.
! See the documentation for `tmm-prompt'.
! X-POSITION, if non-nil, specifies a horizontal position within the menu bar;
! we make that menu bar item (the one at that position) the default choice."
    (interactive)
    (run-hooks 'menu-bar-update-hook)
    ;; Obey menu-bar-final-items; put those items last.
!   (let ((menu-bar (tmm-get-keybind [menu-bar]))
! 	menu-bar-item)
      (let ((list menu-bar-final-items))
        (while list
*************** See the documentation for `tmm-prompt'."
*** 64,68 ****
  				   (list this-one)))))
  	(setq list (cdr list))))
!     (tmm-prompt menu-bar)))
  
  (defvar tmm-mid-prompt "==>"
--- 69,96 ----
  				   (list this-one)))))
  	(setq list (cdr list))))
!     (if x-position
! 	(let ((tail menu-bar)
! 	      this-one
! 	      (column 0))
! 	  (while (and tail (< column x-position))
! 	    (setq this-one (car tail))
! 	    (if (and (consp (car tail))
! 		     (consp (cdr (car tail)))
! 		     (stringp (nth 1 (car tail))))
! 		(setq column (+ column
! 				(length (nth 1 (car tail)))
! 				1)))
! 	    (setq tail (cdr tail)))
! 	  (setq menu-bar-item (car this-one))))
!     (tmm-prompt menu-bar nil menu-bar-item)))
! 
! ;;;###autoload
! (defun tmm-menubar-mouse (event)
!   "Text-mode emulation of looking and choosing from a menubar.
! This command is used when you click the mouse in the menubar
! on a console which has no window system but does have a mouse.
! See the documentation for `tmm-prompt'."
!   (interactive "e")
!   (tmm-menubar (car (posn-x-y (event-start event)))))
  
  (defvar tmm-mid-prompt "==>"
*************** marked letters to pick up your choice.  
*** 81,155 ****
  
  ;;;###autoload
! (defun tmm-prompt (bind &optional in-popup)
    "Text-mode emulation of calling the bindings in keymap.
! Creates a text-mode menu of possible choices. You can access the elements
! in the menu:
!    *)  Either via history mechanism from minibuffer;
     *)  Or via completion-buffer that is automatically shown.
  The last alternative is currently a hack, you cannot use mouse reliably.
! If the optional argument IN-POPUP is set, is argument-compatible with 
! `x-popup-menu', otherwise the argument BIND should be a cdr of sparse keymap."
!   (if in-popup (if bind (setq bind in-popup) (x-popup-menu nil in-popup)))
!   (let (gl-str tmm-km-list out history history-len tmm-table-undef tmm-c-prompt
! 	       tmm-old-mb-map tmm-old-comp-map tmm-short-cuts)
      (run-hooks 'activate-menubar-hook)
      (mapcar (function (lambda (elt)
  			(if (stringp elt)
  			    (setq gl-str elt)
! 			  (and (listp elt) (tmm-get-keymap elt in-popup)))))
! 	    bind)
!     (and tmm-km-list
! 	 (progn
! 	   (if tmm-mid-prompt
! 	       (setq tmm-km-list (tmm-add-shortcuts tmm-km-list))
! 	     t)
! 	   (setq history (reverse (mapcar 'car tmm-km-list)))
! 	   (setq history-len (length history))
! 	   (setq history (append history history history history))
! 	   (setq tmm-c-prompt (nth (1- history-len) history))
! 	   (add-hook 'minibuffer-setup-hook 'tmm-add-prompt)
! 	   (unwind-protect
! 	       (setq out
! 		     (completing-read
! 		      (concat gl-str " (up/down to change, PgUp to menu): ")
! 		      tmm-km-list nil t nil
! 		      (cons 'history (* 2 history-len))))
! 	     (save-excursion
! 	       (remove-hook 'minibuffer-setup-hook 'tmm-add-prompt)
! 	       (if (get-buffer "*Completions*")
! 		   (progn
! 		     (set-buffer "*Completions*")
! 		     (use-local-map tmm-old-comp-map)
! 		     (bury-buffer (current-buffer)))))
! 	     )))
!     (setq bind (cdr (assoc out tmm-km-list)))
!     (and (null bind)
! 	 (> (length out) (length tmm-c-prompt))
! 	 (string= (substring out 0 (length tmm-c-prompt)) tmm-c-prompt)
! 	 (setq out (substring out (length tmm-c-prompt))
! 	       bind (cdr (assoc out tmm-km-list))))
!     (and (null bind)
! 	 (setq out (try-completion out tmm-km-list)
! 	       bind (cdr (assoc  out tmm-km-list))))
!     (setq last-command-event (car bind))
!     (setq bind (cdr bind))
!     (if bind
! 	 (if in-popup (tmm-prompt t bind)
! 	   (if (keymapp bind)
! 	       (if (listp bind)
! 		   (progn
! 		     (condition-case nil
! 			 (require 'mouse)
! 		       (error nil))
! 		     (condition-case nil
! 			 (x-popup-menu nil bind) ; Get the shortcuts
! 		       (error nil))
! 		     (tmm-prompt bind))
! 		 (tmm-prompt (symbol-value bind))
! 		 )
! 	     (if last-command-event
! 		 (call-interactively bind)
! 	       bind)))
!       gl-str)))
  
  
--- 109,222 ----
  
  ;;;###autoload
! (defun tmm-prompt (menu &optional in-popup default-item)
    "Text-mode emulation of calling the bindings in keymap.
! Creates a text-mode menu of possible choices.  You can access the elements
! in the menu in two ways:
!    *)  via history mechanism from minibuffer;
     *)  Or via completion-buffer that is automatically shown.
  The last alternative is currently a hack, you cannot use mouse reliably.
! 
! MENU is like the MENU argument to `x-popup-menu': either a
! keymap or an alist of alists.
! DEFAULT-ITEM, if non-nil, specifies an initial default choice.
! Its value should be an event that has a binding in MENU."
!   ;; If the optional argument IN-POPUP is t,
!   ;; then MENU is an alist of elements of the form (STRING . VALUE).
!   ;; That is used for recursive calls only.
!   (let ((gl-str "Menu bar")  ;; The menu bar itself is not a menu keymap
! 					; so it doesn't have a name.
! 	tmm-km-list out history history-len tmm-table-undef tmm-c-prompt
! 	tmm-old-mb-map tmm-old-comp-map tmm-short-cuts
! 	chosen-string choice
! 	(not-menu (not (keymapp menu))))
      (run-hooks 'activate-menubar-hook)
+     ;; Compute tmm-km-list from MENU.
+     ;; tmm-km-list is an alist of (STRING . MEANING).
+     ;; It has no other elements.
+     ;; The order of elements in tmm-km-list is the order of the menu bar.
      (mapcar (function (lambda (elt)
  			(if (stringp elt)
  			    (setq gl-str elt)
! 			  (and (listp elt) (tmm-get-keymap elt not-menu)))))
! 	    menu)
!     ;; Choose an element of tmm-km-list; put it in choice.
!     (if (and not-menu (= 1 (length tmm-km-list)))
! 	;; If this is the top-level of an x-popup-menu menu,
! 	;; and there is just one pane, choose that one silently.
! 	;; This way we only ask the user one question,
! 	;; for which element of that pane.
! 	(setq choice (cdr (car tmm-km-list)))
!       (and tmm-km-list
! 	   (let ((index-of-default 0))
! 	     (if tmm-mid-prompt
! 		 (setq tmm-km-list (tmm-add-shortcuts tmm-km-list))
! 	       t)
! 	     ;; Find the default item's index within the menu bar.
! 	     ;; We use this to decide the initial minibuffer contents
! 	     ;; and initial history position.
! 	     (if default-item
! 		 (let ((tail menu))
! 		   (while (and tail
! 			       (not (eq (car-safe (car tail)) default-item)))
! 		     ;; Be careful to count only the elements of MENU
! 		     ;; that actually constitute menu bar items.
! 		     (if (and (consp (car tail))
! 			      (stringp (car-safe (cdr (car tail)))))
! 			 (setq index-of-default (1+ index-of-default)))
! 		     (setq tail (cdr tail)))))
! 	     (setq history (reverse (mapcar 'car tmm-km-list)))
! 	     (setq history-len (length history))
! 	     (setq history (append history history history history))
! 	     (setq tmm-c-prompt (nth (- history-len 1 index-of-default) history))
! 	     (add-hook 'minibuffer-setup-hook 'tmm-add-prompt)
! 	     (unwind-protect
! 		 (setq out
! 		       (completing-read
! 			(concat gl-str " (up/down to change, PgUp to menu): ")
! 			tmm-km-list nil t nil
! 			(cons 'history (- (* 2 history-len) index-of-default))))
! 	       (save-excursion
! 		 (remove-hook 'minibuffer-setup-hook 'tmm-add-prompt)
! 		 (if (get-buffer "*Completions*")
! 		     (progn
! 		       (set-buffer "*Completions*")
! 		       (use-local-map tmm-old-comp-map)
! 		       (bury-buffer (current-buffer)))))
! 	       )))
!       (setq choice (cdr (assoc out tmm-km-list)))
!       (and (null choice)
! 	   (> (length out) (length tmm-c-prompt))
! 	   (string= (substring out 0 (length tmm-c-prompt)) tmm-c-prompt)
! 	   (setq out (substring out (length tmm-c-prompt))
! 		 choice (cdr (assoc out tmm-km-list))))
!       (and (null choice)
! 	   (setq out (try-completion out tmm-km-list)
! 		 choice (cdr (assoc  out tmm-km-list)))))
!     ;; CHOICE is now (STRING . MEANING).  Separate the two parts.
!     (setq chosen-string (car choice))
!     (setq choice (cdr choice))
!     (cond (in-popup
! 	   ;; We just did the inner level of a -popup menu.
! 	   choice)
! 	  ;; We just did the outer level.  Do the inner level now.
! 	  (not-menu (tmm-prompt choice t)) 
! 	  ;; We just handled a menu keymap and found another keymap.
! 	  ((keymapp choice)
! 	   (if (symbolp choice)
! 	       (setq choice (indirect-function choice)))
! 	   (condition-case nil
! 	       (require 'mouse)
! 	     (error nil))
! 	   (condition-case nil
! 	       (x-popup-menu nil choice) ; Get the shortcuts
! 	     (error nil))
! 	   (tmm-prompt choice))
! 	  ;; We just handled a menu keymap and found a command.
! 	  (choice
! 	   (if chosen-string
! 	       (progn
! 		 (setq last-command-event chosen-string)
! 		 (call-interactively choice))
! 	     choice)))))
  
  
*************** Stores a list of all the shortcuts in th
*** 182,195 ****
  	    (reverse list))))
  
! (defun tmm-define-keys ()
    (mapcar (lambda (str)
  	    (define-key (current-local-map) str 'tmm-shortcut)
  	    (define-key (current-local-map) (downcase str) 'tmm-shortcut))
  	  tmm-short-cuts)
!   (define-key (current-local-map) [pageup] 'tmm-goto-completions)
!   (define-key (current-local-map) [prior] 'tmm-goto-completions)
!   (define-key (current-local-map) "\ev" 'tmm-goto-completions)
!   (define-key (current-local-map) "\C-n" 'next-history-element)
!   (define-key (current-local-map) "\C-p" 'previous-history-element))
  
  (defun tmm-add-prompt ()
--- 249,264 ----
  	    (reverse list))))
  
! (defun tmm-define-keys (minibuffer)
    (mapcar (lambda (str)
  	    (define-key (current-local-map) str 'tmm-shortcut)
  	    (define-key (current-local-map) (downcase str) 'tmm-shortcut))
  	  tmm-short-cuts)
!   (if minibuffer
!       (progn
! 	(define-key (current-local-map) [pageup] 'tmm-goto-completions)
! 	(define-key (current-local-map) [prior] 'tmm-goto-completions)
! 	(define-key (current-local-map) "\ev" 'tmm-goto-completions)
! 	(define-key (current-local-map) "\C-n" 'next-history-element)
! 	(define-key (current-local-map) "\C-p" 'previous-history-element))))
  
  (defun tmm-add-prompt ()
*************** Stores a list of all the shortcuts in th
*** 200,204 ****
      (setq tmm-old-mb-map (current-local-map))
      (use-local-map (append (make-sparse-keymap) tmm-old-mb-map))
!     (tmm-define-keys)
      ;; Get window and hide it for electric mode to get correct size
      (save-window-excursion 
--- 269,273 ----
      (setq tmm-old-mb-map (current-local-map))
      (use-local-map (append (make-sparse-keymap) tmm-old-mb-map))
!     (tmm-define-keys t)
      ;; Get window and hide it for electric mode to get correct size
      (save-window-excursion 
*************** Stores a list of all the shortcuts in th
*** 217,221 ****
        (setq tmm-old-comp-map (current-local-map))
        (use-local-map (append (make-sparse-keymap) tmm-old-comp-map))
!       (tmm-define-keys)
        (select-window win)		; Cannot use
  					; save-window-excursion, since
--- 286,290 ----
        (setq tmm-old-comp-map (current-local-map))
        (use-local-map (append (make-sparse-keymap) tmm-old-comp-map))
!       (tmm-define-keys nil)
        (select-window win)		; Cannot use
  					; save-window-excursion, since
*************** The values are deduced from the argument
*** 266,271 ****
  element of keymap, an `x-popup-menu' argument, or an element of
  `x-popup-menu' argument (when IN-X-MENU is not-nil).
! Does it only if it is not already there. Uses free variable 
! `tmm-table-undef' to keep undefined keys."
    (let (km str cache (event (car elt)))
      (setq elt (cdr elt))
--- 335,340 ----
  element of keymap, an `x-popup-menu' argument, or an element of
  `x-popup-menu' argument (when IN-X-MENU is not-nil).
! This function adds the element only if it is not already present.
! It uses the free variable `tmm-table-undef' to keep undefined keys."
    (let (km str cache (event (car elt)))
      (setq elt (cdr elt))
*************** Does it only if it is not already there.
*** 318,322 ****
  (defun tmm-get-keybind (keyseq)
    "Return the current binding of KEYSEQ, merging prefix definitions.
! If KEYSEQ is a prefix key that has local and gloibal bindings,
  we merge them into a single keymap which shows the proper order of the menu.
  However, for the menu bar itself, the value does not take account
--- 387,391 ----
  (defun tmm-get-keybind (keyseq)
    "Return the current binding of KEYSEQ, merging prefix definitions.
! If KEYSEQ is a prefix key that has local and global bindings,
  we merge them into a single keymap which shows the proper order of the menu.
  However, for the menu bar itself, the value does not take account
*************** of `menu-bar-final-items'."
*** 350,356 ****
  (add-hook 'calendar-load-hook (lambda () (require 'cal-menu)))
  
- 
  (provide 'tmm)
- 
  
  ;;; tmm.el ends here
--- 419,423 ----
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/tpu-edt.el emacs-19.31/lisp/tpu-edt.el
*** emacs-19.30/lisp/tpu-edt.el	Wed Nov  1 23:38:54 1995
--- emacs-19.31/lisp/tpu-edt.el	Mon Feb 26 18:26:56 1996
***************
*** 21,26 ****
  
  ;; 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.
  
  ;; TPU-edt is based on tpu.el by Jeff Kowalski and Bob Covey.
--- 21,27 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;; TPU-edt is based on tpu.el by Jeff Kowalski and Bob Covey.
*************** SS3 is DEC's name for the sequence <ESC>
*** 317,328 ****
  
  (defvar GOLD-map (make-keymap)
!   "Maps the function keys on the VT100 keyboard preceeded by PF1.
  GOLD is the ASCII 7-bit escape sequence <ESC>OP.")
  
  (defvar GOLD-CSI-map (make-sparse-keymap)
!   "Maps the function keys on the VT100 keyboard preceeded by GOLD-CSI.")
  
  (defvar GOLD-SS3-map (make-sparse-keymap)
!   "Maps the function keys on the VT100 keyboard preceeded by GOLD-SS3.")
  
  (defvar tpu-global-map nil "TPU-edt global keymap.")
--- 318,329 ----
  
  (defvar GOLD-map (make-keymap)
!   "Maps the function keys on the VT100 keyboard preceded by PF1.
  GOLD is the ASCII 7-bit escape sequence <ESC>OP.")
  
  (defvar GOLD-CSI-map (make-sparse-keymap)
!   "Maps the function keys on the VT100 keyboard preceded by GOLD-CSI.")
  
  (defvar GOLD-SS3-map (make-sparse-keymap)
!   "Maps the function keys on the VT100 keyboard preceded by GOLD-SS3.")
  
  (defvar tpu-global-map nil "TPU-edt global keymap.")
*************** version of Emacs."
*** 544,548 ****
  (defun tpu-set-mark (pos)
    "TPU-edt verion of the `set-mark' function.
! Sets the mark at POS and activates the region acording to the
  current version of Emacs."
    (set-mark pos)
--- 545,549 ----
  (defun tpu-set-mark (pos)
    "TPU-edt verion of the `set-mark' function.
! Sets the mark at POS and activates the region according to the
  current version of Emacs."
    (set-mark pos)
*************** current version of Emacs."
*** 561,565 ****
  Optional second argument NOT-YES changes default to negative.
  Like Emacs `y-or-n-p', but also accepts space as y and DEL as n."
!   (message (format "%s[%s]" prompt (if not-yes "n" "y")))
    (let ((doit t))
      (while doit
--- 562,566 ----
  Optional second argument NOT-YES changes default to negative.
  Like Emacs `y-or-n-p', but also accepts space as y and DEL as n."
!   (message "%s[%s]" prompt (if not-yes "n" "y"))
    (let ((doit t))
      (while doit
*************** Like Emacs `y-or-n-p', but also accepts 
*** 573,578 ****
  	      (t
  	       (setq doit t) (beep)
! 	       (message (format "Please answer y or n.  %s[%s]"
! 				prompt (if not-yes "n" "y"))))))))
    tpu-last-answer)
  
--- 574,579 ----
  	      (t
  	       (setq doit t) (beep)
! 	       (message "Please answer y or n.  %s[%s]"
! 			prompt (if not-yes "n" "y")))))))
    tpu-last-answer)
  
*************** direction.  If an argument is specified,
*** 1204,1208 ****
  (defun tpu-check-search-case (string)
    "Returns t if string contains upper case."
!   ;; if using regexp, elimiate upper case forms (\B \W \S.)
    (if tpu-regexp-p
        (let ((pat (copy-sequence string)) (case-fold-search nil) (pos 0))
--- 1205,1209 ----
  (defun tpu-check-search-case (string)
    "Returns t if string contains upper case."
!   ;; if using regexp, eliminate upper case forms (\B \W \S.)
    (if tpu-regexp-p
        (let ((pat (copy-sequence string)) (case-fold-search nil) (pos 0))
*************** If FILE is nil, try to load a default fi
*** 2367,2376 ****
  	 (setq file (expand-file-name tpu-xkeys-file)))
  	(tpu-lucid-emacs19-p
! 	 (setq file (expand-file-name "~/.tpu-lucid-keys")))
  	(tpu-emacs19-p
! 	 (setq file (expand-file-name "~/.tpu-keys"))
  	 (and (not (file-exists-p file))
! 	      (file-exists-p (expand-file-name "~/.tpu-gnu-keys"))
! 	      (tpu-copy-keyfile (expand-file-name "~/.tpu-gnu-keys") file))))
    (cond ((file-readable-p file)
  	 (load-file file))
--- 2368,2383 ----
  	 (setq file (expand-file-name tpu-xkeys-file)))
  	(tpu-lucid-emacs19-p
! 	 (setq file (convert-standard-filename
! 		     (expand-file-name "~/.tpu-lucid-keys"))))
  	(tpu-emacs19-p
! 	 (setq file (convert-standard-filename
! 		     (expand-file-name "~/.tpu-keys")))
  	 (and (not (file-exists-p file))
! 	      (file-exists-p
! 	       (convert-standard-filename
! 		(expand-file-name "~/.tpu-gnu-keys")))
! 	      (tpu-copy-keyfile
! 	       (convert-standard-filename
! 		(expand-file-name "~/.tpu-gnu-keys")) file))))
    (cond ((file-readable-p file)
  	 (load-file file))
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/tpu-extras.el emacs-19.31/lisp/tpu-extras.el
*** emacs-19.30/lisp/tpu-extras.el	Thu Jul 27 03:29:57 1995
--- emacs-19.31/lisp/tpu-extras.el	Sun Jan 14 02:34:30 1996
***************
*** 20,25 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/tpu-mapper.el emacs-19.31/lisp/tpu-mapper.el
*** emacs-19.30/lisp/tpu-mapper.el	Thu Jul 27 03:30:03 1995
--- emacs-19.31/lisp/tpu-mapper.el	Fri Jan 19 17:41:57 1996
***************
*** 20,25 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 365,369 ****
  ;;;  Save the key mapping program
  ;;;
! (let ((file (if tpu-lucid-emacs19-p "~/.tpu-lucid-keys" "~/.tpu-keys")))
    (set-visited-file-name
     (read-file-name (format "Save key mapping to file (default %s): " file) "" file)))
--- 366,372 ----
  ;;;  Save the key mapping program
  ;;;
! (let ((file
!        (convert-standard-filename
! 	(if tpu-lucid-emacs19-p "~/.tpu-lucid-keys" "~/.tpu-keys"))))
    (set-visited-file-name
     (read-file-name (format "Save key mapping to file (default %s): " file) "" file)))
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/tq.el emacs-19.31/lisp/tq.el
*** emacs-19.30/lisp/tq.el	Mon May 15 17:50:02 1995
--- emacs-19.31/lisp/tq.el	Mon Jan 29 17:57:01 1996
***************
*** 20,25 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** that's how we tell where the answer ends
*** 101,107 ****
  	  (delete-region (point-min) (point))
  	  (pop-to-buffer buf nil)
! 	  (error (concat "Spurious communication from process "
! 			 (process-name (tq-process tq))
! 			 ", see buffer " (buffer-name buf) ".")))
        (goto-char (point-min))
        (if (re-search-forward (tq-queue-head-regexp tq) nil t)
--- 102,108 ----
  	  (delete-region (point-min) (point))
  	  (pop-to-buffer buf nil)
! 	  (error "Spurious communication from process %s, see buffer %s"
! 		 (process-name (tq-process tq))
! 		 (buffer-name buf)))
        (goto-char (point-min))
        (if (re-search-forward (tq-queue-head-regexp tq) nil t)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/trace.el emacs-19.31/lisp/trace.el
*** emacs-19.30/lisp/trace.el	Thu May  4 21:30:11 1995
--- emacs-19.31/lisp/trace.el	Sun Jan 14 02:34:30 1996
***************
*** 20,25 ****
  
  ;; 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.
  
  ;; LCD Archive Entry:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;; LCD Archive Entry:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/type-break.el emacs-19.31/lisp/type-break.el
*** emacs-19.30/lisp/type-break.el	Mon Dec  5 10:28:21 1994
--- emacs-19.31/lisp/type-break.el	Mon Jan 29 16:54:31 1996
*************** Keys with bucky bits (shift, control, me
*** 119,123 ****
  keystroke even though they really require multiple keys to generate them.
  
! The command `type-break-guestimate-keystroke-threshold' can be used to
  guess a reasonably good pair of values for this variable.")
  
--- 119,123 ----
  keystroke even though they really require multiple keys to generate them.
  
! The command `type-break-guesstimate-keystroke-threshold' can be used to
  guess a reasonably good pair of values for this variable.")
  
*************** remove themselves after running.")
*** 223,227 ****
--- 223,265 ----
  (defvar type-break-time-warning-count 0)
  (defvar type-break-keystroke-warning-count 0)
+ 
+ ;; This should return t if warnings were enabled, nil otherwise.
+ (defsubst type-break-check-keystroke-warning ()
+   ;; This is safe because the caller should have checked that the cdr was
+   ;; non-nil already.
+   (let ((left (- (cdr type-break-keystroke-threshold)
+                  type-break-keystroke-count)))
+     (cond
+      ((null (car type-break-current-keystroke-warning-interval))
+       nil)
+      ((> left (car type-break-current-keystroke-warning-interval))
+       nil)
+      (t
+       (while (and (car type-break-current-keystroke-warning-interval)
+                   (< left (car type-break-current-keystroke-warning-interval)))
+         (setq type-break-current-keystroke-warning-interval
+               (cdr type-break-current-keystroke-warning-interval)))
+       (setq type-break-keystroke-warning-count type-break-warning-repeat)
+       (add-hook 'type-break-post-command-hook 'type-break-keystroke-warning)
+       (setq type-break-warning-countdown-string (number-to-string left))
+       (setq type-break-warning-countdown-string-type "keystrokes")
+       t))))
  
+ ;; Compute the difference, in seconds, between a and b, two structures
+ ;; similar to those returned by `current-time'.
+ ;; Use addition rather than logand since that is more robust; the low 16
+ ;; bits of the seconds might have been incremented, making it more than 16
+ ;; bits wide.
+ (defsubst type-break-time-difference (a b)
+   (+ (lsh (- (car b) (car a)) 16)
+      (- (car (cdr b)) (car (cdr a)))))
+ 
+ (defsubst type-break-format-time (secs)
+   (let ((mins (/ secs 60)))
+     (cond
+      ((= mins 1) (format "%d minute" mins))
+      ((> mins 0) (format "%d minutes" mins))
+      ((= secs 1) (format "%d second" secs))
+      (t (format "%d seconds" secs)))))
  
  ;;;###autoload
*************** or not to continue.
*** 264,268 ****
  The variable `type-break-keystroke-threshold' is used to determine the
  thresholds at which typing breaks should be considered.  You can use
! the command `type-break-guestimate-keystroke-threshold' to try to
  approximate good values for this.
  
--- 302,306 ----
  The variable `type-break-keystroke-threshold' is used to determine the
  thresholds at which typing breaks should be considered.  You can use
! the command `type-break-guesstimate-keystroke-threshold' to try to
  approximate good values for this.
  
*************** keystroke threshold has been exceeded."
*** 499,503 ****
         (t
          ;; If keystroke count is within min-threshold of
!         ;; max-threshold, lower it to reduce the liklihood of an
          ;; immediate subsequent query.
          (and max-threshold
--- 537,541 ----
         (t
          ;; If keystroke count is within min-threshold of
!         ;; max-threshold, lower it to reduce the likelihood of an
          ;; immediate subsequent query.
          (and max-threshold
*************** keystroke threshold has been exceeded."
*** 557,561 ****
                  ;; yes-or-no-p sets this-command to exit-minibuffer,
                  ;; which hoses undo or yank-pop (if you happened to be
!                 ;; yanking just when the query occured).
                  (this-command this-command))
              (funcall type-break-query-function 
--- 595,599 ----
                  ;; yes-or-no-p sets this-command to exit-minibuffer,
                  ;; which hoses undo or yank-pop (if you happened to be
!                 ;; yanking just when the query occurred).
                  (this-command this-command))
              (funcall type-break-query-function 
*************** Current keystroke count     : %s"
*** 647,651 ****
  
  ;;;###autoload
! (defun type-break-guestimate-keystroke-threshold (wpm &optional wordlen frac)
    "Guess values for the minimum/maximum keystroke threshold for typing breaks.
  
--- 685,689 ----
  
  ;;;###autoload
! (defun type-break-guesstimate-keystroke-threshold (wpm &optional wordlen frac)
    "Guess values for the minimum/maximum keystroke threshold for typing breaks.
  
*************** FRAC should be the inverse of the fracti
*** 782,786 ****
              (kill-buffer "*Life*"))
          (life-extinct
!          (message (get 'life-extinct 'error-message))
           (sit-for 3)
           ;; restart demo
--- 820,824 ----
              (kill-buffer "*Life*"))
          (life-extinct
!          (message "%s" (get 'life-extinct 'error-message))
           (sit-for 3)
           ;; restart demo
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/uncompress.el emacs-19.31/lisp/uncompress.el
*** emacs-19.30/lisp/uncompress.el	Tue May  3 18:59:27 1994
--- emacs-19.31/lisp/uncompress.el	Sun Jan 14 02:34:30 1996
***************
*** 18,23 ****
  
  ;; 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:
--- 18,24 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/underline.el emacs-19.31/lisp/underline.el
*** emacs-19.30/lisp/underline.el	Mon Mar 14 16:21:36 1994
--- emacs-19.31/lisp/underline.el	Sun Jan 14 02:34:30 1996
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/undigest.el emacs-19.31/lisp/undigest.el
*** emacs-19.30/lisp/undigest.el	Wed Sep 27 11:25:19 1995
--- emacs-19.31/lisp/undigest.el	Mon Mar  4 15:26:43 1996
***************
*** 1,5 ****
  ;;; undigest.el --- digest-cracking support for the RMAIL mail reader
  
! ;; Copyright (C) 1985, 1986, 1994 Free Software Foundation, Inc.
  
  ;; Maintainer: FSF
--- 1,5 ----
  ;;; undigest.el --- digest-cracking support for the RMAIL mail reader
  
! ;; Copyright (C) 1985, 1986, 1994, 1996 Free Software Foundation, Inc.
  
  ;; Maintainer: FSF
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** Leaves original message, deleted, before
*** 131,134 ****
--- 132,173 ----
  	     (delete-region (point-min) (point-max))
  	     (rmail-show-message rmail-current-message))))))
+ 
+ (defun unforward-rmail-message ()
+   "Extract a forwarded message from the containing message.
+ This puts the forwarded message into a separate rmail message
+ following the containing message."
+   (interactive)
+   (narrow-to-region (rmail-msgbeg rmail-current-message)
+ 		    (rmail-msgend rmail-current-message))
+   (goto-char (point-min))
+   (let (beg end (buffer-read-only nil) msg-string who-forwarded-it)
+     (setq who-forwarded-it (mail-fetch-field "From"))
+     (if (re-search-forward "^----" nil t)
+ 	nil
+       (error "No forwarded message"))
+     (forward-line 1)
+     (setq beg (point))
+     (if (re-search-forward "^----" nil t)
+ 	(setq end (match-beginning 0))
+       (error "No terminator for forwarded message"))
+     (widen)
+     (setq msg-string (buffer-substring beg end))
+     (goto-char (rmail-msgend rmail-current-message))
+     (narrow-to-region (point) (point))
+     (insert "\^_\^L\n0, unseen,,\n*** EOOH ***\n")
+     (narrow-to-region (point) (point))
+     (insert "Forwarded-by: " who-forwarded-it "\n")
+     (insert msg-string)
+     (goto-char (point-min))
+     (while (not (eobp))
+       (if (looking-at "- ")
+ 	  (delete-region (point) (+ 2 (point))))
+       (forward-line 1))
+     (let ((n rmail-current-message))
+       (rmail-forget-messages)
+       (rmail-show-message n)
+       (if (rmail-summary-exists)
+ 	  (rmail-select-summary
+ 	   (rmail-update-summary))))))
  
  ;;; undigest.el ends here
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/uniquify.el emacs-19.31/lisp/uniquify.el
*** emacs-19.30/lisp/uniquify.el	Sat Aug 26 12:43:14 1995
--- emacs-19.31/lisp/uniquify.el	Wed Jan 24 18:08:05 1996
***************
*** 1,3 ****
! ;;; uniquify.el --- unique buffer names dependent on pathname
  
  ;; Copyright (c) 1989, 1995 Free Software Foundation, Inc.
--- 1,3 ----
! ;;; uniquify.el --- unique buffer names dependent on file name
  
  ;; Copyright (c) 1989, 1995 Free Software Foundation, Inc.
***************
*** 6,10 ****
  ;; Maintainer: Michael Ernst <mernst@theory.lcs.mit.edu>
  ;; Created: 15 May 86
- ;; Time-stamp: <95/08/26 11:01:44 mernst>
  
  ;; This file is part of GNU Emacs.
--- 6,9 ----
***************
*** 21,26 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 29,33 ****
  ;; etc. to the end of (all but one of) the buffers.  This file replaces
  ;; that behavior, for buffers visiting files and dired buffers, with a
! ;; uniquification that adds parts of the pathname until the buffer names
  ;; are unique.  For instance, buffers visiting /u/mernst/tmp/Makefile and
  ;; /usr/projects/zaphod/Makefile would be named Makefile|tmp and
--- 29,33 ----
  ;; etc. to the end of (all but one of) the buffers.  This file replaces
  ;; that behavior, for buffers visiting files and dired buffers, with a
! ;; uniquification that adds parts of the file name until the buffer names
  ;; are unique.  For instance, buffers visiting /u/mernst/tmp/Makefile and
  ;; /usr/projects/zaphod/Makefile would be named Makefile|tmp and
***************
*** 39,45 ****
  ;; For other options, see "User-visible variables", below.
  
! ;; uniquify.el works under Emacs, XEmacs, and InfoDock.
! 
! ;; Doesn't correctly handle buffer names created by M-x write-file in Emacs 18.
  
  ;;; Change Log:
--- 39,44 ----
  ;; For other options, see "User-visible variables", below.
  
! ;; A version of uniquify.el that works under Emacs 18, Emacs 19, XEmacs,
! ;; and InfoDock is available from the maintainer.
  
  ;;; Change Log:
***************
*** 78,85 ****
  (defvar uniquify-buffer-name-style 'post-forward
    "*If non-nil, buffer names are uniquified with parts of directory name.
! The value determines the buffer name style and is one of 'forward,
! 'reverse, 'post-forward (the default), or 'post-forward-angle-brackets.
! For example, files /foo/bar/mumble/name and /baz/quux/mumble/name
! would be in the following buffers:
    forward        bar/mumble/name  quux/mumble/name
    reverse        name\\mumble\\bar  name\\mumble\\quux
--- 77,84 ----
  (defvar uniquify-buffer-name-style 'post-forward
    "*If non-nil, buffer names are uniquified with parts of directory name.
! The value determines the buffer name style and is one of `forward',
! `reverse', `post-forward' (the default), or `post-forward-angle-brackets'.
! For example, files `/foo/bar/mumble/name' and `/baz/quux/mumble/name'
! would have the following buffer names in the various styles:
    forward        bar/mumble/name  quux/mumble/name
    reverse        name\\mumble\\bar  name\\mumble\\quux
*************** other buffer names are changed.")
*** 99,115 ****
  
  (defvar uniquify-min-dir-content 0
!   "*Minimum parts of directory pathname included in buffer name.")
  
  (defvar uniquify-separator nil
    "*String separator for buffer name components.
! When `uniquify-buffer-name-style' is 'post-forward, separates
  base file name from directory part in buffer names (default \"|\").
! When `uniquify-buffer-name-style' is 'reverse, separates all
! pathname components (default \"\\\").")
  
  (defvar uniquify-trailing-separator-p nil
!   "*If non-nil, add a pathname separator to dired buffer names.
! If `uniquify-buffer-name-style' is 'forward, add the separator at the end;
! if it's is 'reverse, add the separator at the beginning; otherwise, this
  variable is ignored.")
  
--- 98,114 ----
  
  (defvar uniquify-min-dir-content 0
!   "*Minimum parts of directory name included in buffer name.")
  
  (defvar uniquify-separator nil
    "*String separator for buffer name components.
! When `uniquify-buffer-name-style' is `post-forward', separates
  base file name from directory part in buffer names (default \"|\").
! When `uniquify-buffer-name-style' is `reverse', separates all
! file name components (default \"\\\").")
  
  (defvar uniquify-trailing-separator-p nil
!   "*If non-nil, add a file name separator to dired buffer names.
! If `uniquify-buffer-name-style' is `forward', add the separator at the end;
! if it is `reverse', add the separator at the beginning; otherwise, this
  variable is ignored.")
  
*************** variable is ignored.")
*** 139,145 ****
  
  (defun uniquify-rationalize-file-buffer-names (&optional newbuffile newbuf)
!   "Makes file buffer names unique by adding segments from pathname.
  If `uniquify-min-dir-content' > 0, always pulls that many
! pathname elements.  Arguments cause only a subset of buffers to be renamed."
    (interactive)
    (let (fix-list
--- 138,144 ----
  
  (defun uniquify-rationalize-file-buffer-names (&optional newbuffile newbuf)
!   "Makes file buffer names unique by adding segments from file name.
  If `uniquify-min-dir-content' > 0, always pulls that many
! file name elements.  Arguments cause only a subset of buffers to be renamed."
    (interactive)
    (let (fix-list
*************** pathname elements.  Arguments cause only
*** 150,154 ****
  	(let* ((buffer (car buffers))
  	       (bfn (if (eq buffer newbuf)
! 			(expand-file-name newbuffile)
  		      (uniquify-buffer-file-name buffer)))
  	       (rawname (and bfn (file-name-nondirectory bfn)))
--- 149,154 ----
  	(let* ((buffer (car buffers))
  	       (bfn (if (eq buffer newbuf)
! 			(and newbuffile
! 			     (expand-file-name newbuffile))
  		      (uniquify-buffer-file-name buffer)))
  	       (rawname (and bfn (file-name-nondirectory bfn)))
*************** pathname elements.  Arguments cause only
*** 165,173 ****
      ;; may conflict.
      (setq fix-list
! 	  (sort fix-list 'uniquify-filename-sort))
      ;; bringing conflicting names together
      (uniquify-rationalize-a-list fix-list depth)
      (mapcar 'uniquify-unrationalized-buffer fix-list)))
  
  (defun uniquify-buffer-file-name (buffer)
    "Return name of file BUFFER is visiting, or nil if none.
--- 165,174 ----
      ;; may conflict.
      (setq fix-list
! 	  (sort fix-list 'uniquify-fix-list-filename-lessp))
      ;; bringing conflicting names together
      (uniquify-rationalize-a-list fix-list depth)
      (mapcar 'uniquify-unrationalized-buffer fix-list)))
  
+ ;; uniquify's version of buffer-file-name
  (defun uniquify-buffer-file-name (buffer)
    "Return name of file BUFFER is visiting, or nil if none.
*************** Works on dired buffers as well as ordina
*** 178,185 ****
  	list-buffers-directory)))
  
! (defun uniquify-filename-sort (s1 s2)
    (uniquify-filename-lessp
!    (uniquify-fix-list-filename s1) (uniquify-fix-list-filename s2)))
  
  (defun uniquify-filename-lessp (s1 s2)
    (let ((s1f (file-name-nondirectory s1))
--- 179,187 ----
  	list-buffers-directory)))
  
! (defun uniquify-fix-list-filename-lessp (fixlist1 fixlist2)
    (uniquify-filename-lessp
!    (uniquify-fix-list-filename fixlist1) (uniquify-fix-list-filename fixlist2)))
  
+ ;; This examines the filename components in reverse order.
  (defun uniquify-filename-lessp (s1 s2)
    (let ((s1f (file-name-nondirectory s1))
*************** Works on dired buffers as well as ordina
*** 315,319 ****
  ;;; Hooks from the rest of Emacs
  
! ;; Emacs 19 (GNU Emacs or XEmacs)
  
  ;; The logical place to put all this code is in generate-new-buffer-name.
--- 317,321 ----
  ;;; Hooks from the rest of Emacs
  
! ;; Emacs 19 (Emacs or XEmacs)
  
  ;; The logical place to put all this code is in generate-new-buffer-name.
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/unrmail.el emacs-19.31/lisp/unrmail.el
*** emacs-19.30/lisp/unrmail.el	Wed Oct  4 12:07:14 1995
--- emacs-19.31/lisp/unrmail.el	Wed Jan 24 18:08:10 1996
***************
*** 18,23 ****
  
  ;; 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.
  
  ;;; Code:
--- 18,24 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Code:
*************** For example, invoke `emacs -batch -f bat
*** 53,56 ****
--- 54,59 ----
  	(rmail-delete-after-output nil))
      (rmail file)
+     ;; Default the directory of TO-FILE based on where FILE is.
+     (setq to-file (expand-file-name to-file default-directory))
      (message "Writing messages to %s..." to-file)
      (while (< message-count rmail-total-messages)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/userlock.el emacs-19.31/lisp/userlock.el
*** emacs-19.30/lisp/userlock.el	Wed Nov  9 00:17:52 1994
--- emacs-19.31/lisp/userlock.el	Sun Jan 14 02:34:30 1996
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/vc-hooks.el emacs-19.31/lisp/vc-hooks.el
*** emacs-19.30/lisp/vc-hooks.el	Mon Nov 13 18:52:39 1995
--- emacs-19.31/lisp/vc-hooks.el	Thu May  9 15:45:40 1996
***************
*** 1,5 ****
  ;;; vc-hooks.el --- resident support for version-control
  
! ;; Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
  
  ;; Author: Eric S. Raymond <esr@snark.thyrsus.com>
--- 1,5 ----
  ;;; vc-hooks.el --- resident support for version-control
  
! ;; Copyright (C) 1992, 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
  
  ;; Author: Eric S. Raymond <esr@snark.thyrsus.com>
***************
*** 21,26 ****
  
  ;; 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:
--- 21,27 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** when creating new masters.")
*** 66,69 ****
--- 67,80 ----
  If nil (the default), files covered by version control don't get backups.")
  
+ (defvar vc-follow-symlinks 'ask
+   "*Indicates what to do if you visit a symbolic link to a file
+ that is under version control.  Editing such a file through the
+ link bypasses the version control system, which is dangerous and
+ probably not what you want.  
+   If this variable is t, VC follows the link and visits the real file,
+ telling you about it in the echo area.  If it is `ask', VC asks for
+ confirmation whether it should follow the link.  If nil, the link is
+ visited and a warning displayed.")
+ 
  (defvar vc-display-status t
    "*If non-nil, display revision number and lock status in modeline.
*************** Otherwise, not displayed.")
*** 71,75 ****
  
  (defvar vc-consult-headers t
!   "*Identify work files by searching for version headers.")
  
  (defvar vc-keep-workfiles t
--- 82,86 ----
  
  (defvar vc-consult-headers t
!   "*If non-nil, identify work files by searching for version headers.")
  
  (defvar vc-keep-workfiles t
*************** value of this flag.")
*** 79,83 ****
  
  (defvar vc-mistrust-permissions nil
!   "*Don't assume that permissions and ownership track version-control status.")
  
  (defun vc-mistrust-permissions (file)
--- 90,96 ----
  
  (defvar vc-mistrust-permissions nil
!   "*If non-nil, don't assume that permissions and ownership track 
! version-control status.  If nil, do rely on the permissions.
! See also variable `vc-consult-headers'.")
  
  (defun vc-mistrust-permissions (file)
*************** value of this flag.")
*** 182,186 ****
    ;; Optional argument LIMIT is a regexp. If present,
    ;; the file is inserted in chunks of size BLOCKSIZE
!   ;; (default 8 kByte), until the first occurence of
    ;; LIMIT is found. The function returns nil if FILE 
    ;; doesn't exist.
--- 195,199 ----
    ;; Optional argument LIMIT is a regexp. If present,
    ;; the file is inserted in chunks of size BLOCKSIZE
!   ;; (default 8 kByte), until the first occurrence of
    ;; LIMIT is found. The function returns nil if FILE 
    ;; doesn't exist.
*************** value of this flag.")
*** 381,385 ****
  	(goto-char (match-end 0))
  	;; if found, store the revision number ...
! 	(setq version (buffer-substring (match-beginning 1) (match-end 1)))
  	;; ... and check for the locking state
  	(cond 
--- 394,399 ----
  	(goto-char (match-end 0))
  	;; if found, store the revision number ...
! 	(setq version (buffer-substring-no-properties (match-beginning 1)
! 						      (match-end 1)))
  	;; ... and check for the locking state
  	(cond 
*************** value of this flag.")
*** 397,401 ****
  	   ((looking-at "\\([^ ]+\\) \\$")
  	    (setq locking-user
! 		  (buffer-substring (match-beginning 1) (match-end 1)))
  	    (setq status 'rev-and-lock))
  	   ;; everything else: false
--- 411,416 ----
  	   ((looking-at "\\([^ ]+\\) \\$")
  	    (setq locking-user
! 		  (buffer-substring-no-properties (match-beginning 1)
! 						  (match-end 1)))
  	    (setq status 'rev-and-lock))
  	   ;; everything else: false
*************** value of this flag.")
*** 410,420 ****
  			   nil t)
  	;; if found, store the revision number ...
! 	(setq version (buffer-substring (match-beginning 1) (match-end 1)))
  	;; and see if there's any lock information
  	(goto-char (point-min))
  	(if (re-search-forward (concat "\\$" "Locker:") nil t)
  	    (cond ((looking-at " \\([^ ]+\\) \\$")
! 		   (setq locking-user (buffer-substring (match-beginning 1)
! 							(match-end 1)))
  		   (setq status 'rev-and-lock))
  		  ((looking-at " *\\$") 
--- 425,437 ----
  			   nil t)
  	;; if found, store the revision number ...
! 	(setq version (buffer-substring-no-properties (match-beginning 1)
! 						      (match-end 1)))
  	;; and see if there's any lock information
  	(goto-char (point-min))
  	(if (re-search-forward (concat "\\$" "Locker:") nil t)
  	    (cond ((looking-at " \\([^ ]+\\) \\$")
! 		   (setq locking-user (buffer-substring-no-properties
! 				       (match-beginning 1)
! 				       (match-end 1)))
  		   (setq status 'rev-and-lock))
  		  ((looking-at " *\\$") 
*************** For CVS, the full name of CVS/Entries is
*** 752,769 ****
  	  nil)))))
  
- (defun vc-utc-string (timeval)
-   ;; Convert a time value into universal time, and return it as a
-   ;; human-readable string.  This is for comparing CVS checkout times
-   ;; with file modification times.
-   (let (utc (high (car timeval)) (low  (nth 1 timeval))
-         (offset (car (current-time-zone timeval))))
-     (setq low (- low offset))
-     (setq utc (if (> low 65535) 
- 		  (list (1+ high) (- low 65536))
- 		(if (< low 0)
- 		    (list (1- high) (+ 65536 low))
- 		  (list high low))))
-     (current-time-string utc)))
- 	  
  (defun vc-find-cvs-master (dirname basename)
    ;; Check if DIRNAME/BASENAME is handled by CVS.
--- 769,772 ----
*************** For CVS, the full name of CVS/Entries is
*** 789,793 ****
  	       ((re-search-forward
  		 (concat "^/" (regexp-quote basename) 
! 			 "/\\([^/]*\\)/\\([^/]*\\)/")
  		 nil t)
  		(setq case-fold-search fold)  ;; restore the old value
--- 792,796 ----
  	       ((re-search-forward
  		 (concat "^/" (regexp-quote basename) 
! 			 "/\\([^/]*\\)/[^ /]* \\([A-Z][a-z][a-z]\\) *\\([0-9]*\\) \\([0-9]*\\):\\([0-9]*\\):\\([0-9]*\\) \\([0-9]*\\)")
  		 nil t)
  		(setq case-fold-search fold)  ;; restore the old value
*************** For CVS, the full name of CVS/Entries is
*** 799,804 ****
  		;; If the file hasn't been modified since checkout,
  		;; store the checkout-time.
! 		(let ((mtime (nth 5 (file-attributes file))))
! 		  (if (string= (match-string 2) (vc-utc-string mtime))
  		      (vc-file-setprop file 'vc-checkout-time mtime)
  		    (vc-file-setprop file 'vc-checkout-time 0)))
--- 802,819 ----
  		;; If the file hasn't been modified since checkout,
  		;; store the checkout-time.
! 		(let ((mtime (nth 5 (file-attributes file)))
! 		      (second (string-to-number (match-string 6)))
! 		      (minute (string-to-number (match-string 5)))
! 		      (hour (string-to-number (match-string 4)))
! 		      (day (string-to-number (match-string 3)))
! 		      (year (string-to-number (match-string 7))))
! 		  (if (equal mtime
! 			     (encode-time
! 			      second minute hour day
! 			      (/ (string-match
! 				  (match-string 2)
! 				  "xxxJanFebMarAprMayJunJulAugSepOctNovDec")
! 				 3)
! 			      year 0))
  		      (vc-file-setprop file 'vc-checkout-time mtime)
  		    (vc-file-setprop file 'vc-checkout-time 0)))
*************** control system name."
*** 905,908 ****
--- 920,941 ----
  	   (concat ":" locker ":" rev)))))
  
+ (defun vc-follow-link ()
+   ;; If the current buffer visits a symbolic link, this function makes it
+   ;; visit the real file instead.  If the real file is already visited in 
+   ;; another buffer, make that buffer current, and kill the buffer 
+   ;; that visits the link.
+   (let* ((truename (abbreviate-file-name (file-chase-links buffer-file-name)))
+          (true-buffer (find-buffer-visiting truename))
+ 	 (this-buffer (current-buffer)))
+     (if (eq true-buffer this-buffer)
+ 	(progn
+ 	  (kill-buffer this-buffer)
+ 	  ;; In principle, we could do something like set-visited-file-name.
+ 	  ;; However, it can't be exactly the same as set-visited-file-name.
+ 	  ;; I'm not going to work out the details right now. -- rms.
+ 	  (set-buffer (find-file-noselect truename)))
+       (set-buffer true-buffer)
+       (kill-buffer this-buffer))))
+ 
  ;;; install a call to the above as a find-file hook
  (defun vc-find-file-hook ()
*************** control system name."
*** 921,929 ****
  	     (setq backup-inhibited t))))
       ((let* ((link (file-symlink-p buffer-file-name))
! 	     (link-type (and link (vc-backend link))))
  	(if link-type
! 	    (message
! 	     "Warning: symbolic link to %s-controlled source file"
! 	     link-type))))))))
  
  (add-hook 'find-file-hooks 'vc-find-file-hook)
--- 954,982 ----
  	     (setq backup-inhibited t))))
       ((let* ((link (file-symlink-p buffer-file-name))
! 	     (link-type (and link (vc-backend (file-chase-links link)))))
  	(if link-type
!             (cond ((eq vc-follow-symlinks nil)
!                    (message
!         "Warning: symbolic link to %s-controlled source file" link-type))
!                   ((or (not (eq vc-follow-symlinks 'ask))
! 		       ;; If we already visited this file by following
! 		       ;; the link, don't ask again if we try to visit
! 		       ;; it again.  GUD does that, and repeated questions
! 		       ;; are painful.
! 		       (get-file-buffer
! 			(abbreviate-file-name (file-chase-links buffer-file-name))))
! 		       
! 		   (vc-follow-link)
! 		   (message "Followed link to %s" buffer-file-name)
! 		   (vc-find-file-hook))
!                   (t
!                    (if (yes-or-no-p (format
!         "Symbolic link to %s-controlled source file; follow link? " link-type))
!                        (progn (vc-follow-link)
!                               (message "Followed link to %s" buffer-file-name)
!                               (vc-find-file-hook))
!                      (message 
!         "Warning: editing through the link bypasses version control")
!                      ))))))))))
  
  (add-hook 'find-file-hooks 'vc-find-file-hook)
*************** Returns t if checkout was successful, ni
*** 995,1012 ****
    (define-key vc-menu-map [vc-menu-check-in] '("Check In" . vc-next-action))
    (define-key vc-menu-map [vc-check-out] '("Check Out" . vc-toggle-read-only))
!   (define-key vc-menu-map [vc-register] '("Register" . vc-register))
!   (put 'vc-rename-file 'menu-enable 'vc-mode)
!   (put 'vc-version-other-window 'menu-enable 'vc-mode)
!   (put 'vc-diff 'menu-enable 'vc-mode)
!   (put 'vc-update-change-log 'menu-enable
!        '(eq (vc-buffer-backend) 'RCS))
!   (put 'vc-print-log 'menu-enable 'vc-mode)
!   (put 'vc-cancel-version 'menu-enable 'vc-mode)
!   (put 'vc-revert-buffer 'menu-enable 'vc-mode)
!   (put 'vc-insert-headers 'menu-enable 'vc-mode)
!   (put 'vc-next-action 'menu-enable '(and vc-mode (not buffer-read-only)))
!   (put 'vc-toggle-read-only 'menu-enable '(and vc-mode buffer-read-only))
!   (put 'vc-register 'menu-enable '(and buffer-file-name (not vc-mode)))
!   )
  
  (provide 'vc-hooks)
--- 1048,1065 ----
    (define-key vc-menu-map [vc-menu-check-in] '("Check In" . vc-next-action))
    (define-key vc-menu-map [vc-check-out] '("Check Out" . vc-toggle-read-only))
!   (define-key vc-menu-map [vc-register] '("Register" . vc-register)))
! 
! (put 'vc-rename-file 'menu-enable 'vc-mode)
! (put 'vc-version-other-window 'menu-enable 'vc-mode)
! (put 'vc-diff 'menu-enable 'vc-mode)
! (put 'vc-update-change-log 'menu-enable
!      '(eq (vc-buffer-backend) 'RCS))
! (put 'vc-print-log 'menu-enable 'vc-mode)
! (put 'vc-cancel-version 'menu-enable 'vc-mode)
! (put 'vc-revert-buffer 'menu-enable 'vc-mode)
! (put 'vc-insert-headers 'menu-enable 'vc-mode)
! (put 'vc-next-action 'menu-enable 'vc-mode)
! (put 'vc-toggle-read-only 'menu-enable 'vc-mode)
! (put 'vc-register 'menu-enable '(and buffer-file-name (not vc-mode)))
  
  (provide 'vc-hooks)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/vc.el emacs-19.31/lisp/vc.el
*** emacs-19.30/lisp/vc.el	Mon Nov 13 15:24:22 1995
--- emacs-19.31/lisp/vc.el	Sat May 11 14:17:13 1996
***************
*** 1,5 ****
  ;;; vc.el --- drive a version-control system from within Emacs
  
! ;; Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
  
  ;; Author: Eric S. Raymond <esr@snark.thyrsus.com>
--- 1,5 ----
  ;;; vc.el --- drive a version-control system from within Emacs
  
! ;; Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
  
  ;; Author: Eric S. Raymond <esr@snark.thyrsus.com>
***************
*** 22,27 ****
  
  ;; 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:
--- 22,28 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** If FORM3 is `RCS', use FORM2 for CVS as 
*** 101,113 ****
    "*If non-nil, treat user as expert; suppress yes-no prompts on some things.")
  (defvar vc-initial-comment nil
!   "*Prompt for initial comment when a file is registered.")
  (defvar vc-command-messages nil
!   "*Display run messages from back-end commands.")
  (defvar vc-checkin-switches nil
!   "*Extra switches passed to the checkin program by \\[vc-checkin].")
  (defvar vc-checkout-switches nil
!   "*Extra switches passed to the checkout program by \\[vc-checkout].")
  (defvar vc-directory-exclusion-list '("SCCS" "RCS" "CVS")
!   "*Directory names ignored by functions that recursively walk file trees.")
  
  (defconst vc-maximum-comment-ring-size 32
--- 102,117 ----
    "*If non-nil, treat user as expert; suppress yes-no prompts on some things.")
  (defvar vc-initial-comment nil
!   "*If non-nil, prompt for initial comment when a file is registered.")
  (defvar vc-command-messages nil
!   "*If non-nil, display run messages from back-end commands.")
  (defvar vc-checkin-switches nil
!   "*A string or list of strings specifying extra switches passed 
! to the checkin program by \\[vc-checkin].")
  (defvar vc-checkout-switches nil
!   "*A string or list of strings specifying extra switches passed 
! to the checkout program by \\[vc-checkout].")
  (defvar vc-directory-exclusion-list '("SCCS" "RCS" "CVS")
!   "*A list of directory names ignored by functions that recursively 
! walk file trees.")
  
  (defconst vc-maximum-comment-ring-size 32
*************** farms to gold trees.")
*** 132,136 ****
  (defvar vc-header-alist
    '((SCCS "\%W\%") (RCS "\$Id\$") (CVS "\$Id\$"))
!   "*Header keywords to be inserted when `vc-insert-headers' is executed.")
  (defvar vc-static-header-alist
    '(("\\.c$" .
--- 136,143 ----
  (defvar vc-header-alist
    '((SCCS "\%W\%") (RCS "\$Id\$") (CVS "\$Id\$"))
!   "*Header keywords to be inserted by `vc-insert-headers'.
! Must be a list of two-element lists, the first element of each must
! be `RCS', `CVS', or `SCCS'.  The second element is the string to
! be inserted for this particular backend.")
  (defvar vc-static-header-alist
    '(("\\.c$" .
*************** If nil, VC itself computes this value wh
*** 162,166 ****
  
  (defvar vc-cvs-release nil
!   "*The release number of your SCCS installation, as a string.
  If nil, VC itself computes this value when it is first needed.")
  
--- 169,173 ----
  
  (defvar vc-cvs-release nil
!   "*The release number of your CVS installation, as a string.
  If nil, VC itself computes this value when it is first needed.")
  
*************** If nil, VC itself computes this value wh
*** 184,188 ****
  (make-variable-buffer-local 'vc-dired-mode)
  
! (defvar vc-comment-ring nil)
  (defvar vc-comment-ring-index nil)
  (defvar vc-last-comment-match nil)
--- 191,195 ----
  (make-variable-buffer-local 'vc-dired-mode)
  
! (defvar vc-comment-ring (make-ring vc-maximum-comment-ring-size))
  (defvar vc-comment-ring-index nil)
  (defvar vc-last-comment-match nil)
*************** If nil, VC itself computes this value wh
*** 291,295 ****
    ;; Note: there is potential for minor lossage here if there is an open
    ;; log buffer with a nonzero local value of vc-comment-ring-index.
!   (setq vc-comment-ring nil))
  
  (defun vc-file-clear-masterprops (file)
--- 298,302 ----
    ;; Note: there is potential for minor lossage here if there is an open
    ;; log buffer with a nonzero local value of vc-comment-ring-index.
!   (setq vc-comment-ring (make-ring vc-maximum-comment-ring-size)))
  
  (defun vc-file-clear-masterprops (file)
*************** to an optional list of FLAGS."
*** 540,544 ****
    (widen)
    (let ((context (vc-buffer-context)))
!     (revert-buffer arg no-confirm)
      (vc-restore-buffer-context context)))
  
--- 547,552 ----
    (widen)
    (let ((context (vc-buffer-context)))
!     ;; t means don't call normal-mode; that's to preserve various minor modes.
!     (revert-buffer arg no-confirm t)
      (vc-restore-buffer-context context)))
  
*************** to an optional list of FLAGS."
*** 632,636 ****
  		     (vc-mode-line file))
  	    (if (not (yes-or-no-p "Revert to checked-in version, instead? "))
! 		(error "Checkout aborted.")
  	      (vc-revert-buffer1 t t)
  	      (vc-checkout-writable-buffer file))
--- 640,644 ----
  		     (vc-mode-line file))
  	    (if (not (yes-or-no-p "Revert to checked-in version, instead? "))
! 		(error "Checkout aborted")
  	      (vc-revert-buffer1 t t)
  	      (vc-checkout-writable-buffer file))
*************** to an optional list of FLAGS."
*** 640,644 ****
  		(vc-checkout file nil 
  		   (read-string "Branch or version to move to: "))
! 	      (error "Sorry, this is not implemented for SCCS."))
  	  (if (vc-latest-on-branch-p file)
  	      (vc-checkout-writable-buffer file)
--- 648,652 ----
  		(vc-checkout file nil 
  		   (read-string "Branch or version to move to: "))
! 	      (error "Sorry, this is not implemented for SCCS"))
  	  (if (vc-latest-on-branch-p file)
  	      (vc-checkout-writable-buffer file)
*************** to an optional list of FLAGS."
*** 660,664 ****
        (and (eq vc-type 'RCS)
  	   (not (vc-backend-release-p 'RCS "5.6.2"))
! 	   (error "File is locked by %s." owner))
        (vc-steal-lock
         file
--- 668,672 ----
        (and (eq vc-type 'RCS)
  	   (not (vc-backend-release-p 'RCS "5.6.2"))
! 	   (error "File is locked by %s" owner))
        (vc-steal-lock
         file
*************** to an optional list of FLAGS."
*** 704,708 ****
  	(dired-dir default-directory))
      (dired-map-over-marks
!      (let ((file (dired-get-filename)) p)
         (message "Processing %s..." file)
         ;; Adjust the default directory so that checkouts
--- 712,717 ----
  	(dired-dir default-directory))
      (dired-map-over-marks
!      (let ((file (dired-get-filename)) p
! 	   (default-directory default-directory))
         (message "Processing %s..." file)
         ;; Adjust the default directory so that checkouts
*************** merge in the changes into your working c
*** 821,825 ****
  (defun vc-resynch-window (file &optional keep noquery)
    ;; If the given file is in the current buffer,
!   ;; either revert on it so we see expanded keyworks,
    ;; or unvisit it (depending on vc-keep-workfiles)
    ;; NOQUERY if non-nil inhibits confirmation for reverting.
--- 830,834 ----
  (defun vc-resynch-window (file &optional keep noquery)
    ;; If the given file is in the current buffer,
!   ;; either revert on it so we see expanded keywords,
    ;; or unvisit it (depending on vc-keep-workfiles)
    ;; NOQUERY if non-nil inhibits confirmation for reverting.
*************** If nil, uses `change-log-default-name'."
*** 998,1003 ****
  	(vc-backend-logentry-check vc-log-file)
  	;; Record the comment in the comment ring
- 	(if (null vc-comment-ring)
- 	    (setq vc-comment-ring (make-ring vc-maximum-comment-ring-size)))
  	(ring-insert vc-comment-ring (buffer-string))
  	))
--- 1007,1010 ----
*************** checked in version of that file.  This u
*** 1102,1106 ****
  With a prefix argument, it reads the file name to use
  and two version designators specifying which versions to compare."
!   (interactive "P")
    (if vc-dired-mode
        (set-buffer (find-file-noselect (dired-get-filename))))
--- 1109,1113 ----
  With a prefix argument, it reads the file name to use
  and two version designators specifying which versions to compare."
!   (interactive (list current-prefix-arg t))
    (if vc-dired-mode
        (set-buffer (find-file-noselect (dired-get-filename))))
*************** and two version designators specifying w
*** 1119,1123 ****
        (setq unchanged (vc-workfile-unchanged-p buffer-file-name))
        (if unchanged
! 	  (message "No changes to %s since latest version." file)
  	(vc-backend-diff file)
  	;; Ideally, we'd like at this point to parse the diff so that
--- 1126,1130 ----
        (setq unchanged (vc-workfile-unchanged-p buffer-file-name))
        (if unchanged
! 	  (message "No changes to %s since latest version" file)
  	(vc-backend-diff file)
  	;; Ideally, we'd like at this point to parse the diff so that
*************** and two version designators specifying w
*** 1128,1137 ****
  	;; visited.  This plays hell with numerous assumptions in
  	;; the diff.el and compile.el machinery.
! 	(pop-to-buffer "*vc-diff*")
  	(setq default-directory (file-name-directory file))
  	(if (= 0 (buffer-size))
  	    (progn
  	      (setq unchanged t)
! 	      (message "No changes to %s since latest version." file))
  	  (goto-char (point-min))
  	  (shrink-window-if-larger-than-buffer)))
--- 1135,1145 ----
  	;; visited.  This plays hell with numerous assumptions in
  	;; the diff.el and compile.el machinery.
! 	(set-buffer "*vc-diff*")
  	(setq default-directory (file-name-directory file))
  	(if (= 0 (buffer-size))
  	    (progn
  	      (setq unchanged t)
! 	      (message "No changes to %s since latest version" file))
!           (pop-to-buffer "*vc-diff*")
  	  (goto-char (point-min))
  	  (shrink-window-if-larger-than-buffer)))
*************** A prefix argument means do not revert th
*** 1610,1636 ****
      (pop-to-buffer vc-parent-buffer))
    (cond 
!    ((eq (vc-backend (buffer-file-name)) 'CVS)
      (error "Unchecking files under CVS is dangerous and not supported in VC"))
     ((vc-locking-user (buffer-file-name))
!     (error "This version is locked.  Use vc-revert-buffer to discard changes."))
     ((not (vc-latest-on-branch-p (buffer-file-name)))
!     (error "This is not the latest version.  VC cannot cancel it.")))
!   (let ((target (vc-workfile-version (buffer-file-name))))
!     (if (null (yes-or-no-p "Remove this version from master? "))
  	nil
        (setq norevert (or norevert (not 
             (yes-or-no-p "Revert buffer to most recent remaining version? "))))
        (vc-backend-uncheck (buffer-file-name) target)
!       (if (not norevert)
! 	  (vc-checkout (buffer-file-name) nil)
! 	;; If norevert, lock the most recent remaining version, 
!         ;; and mark the buffer modified.
! 	(if (eq (vc-backend (buffer-file-name)) 'RCS)
! 	    (progn (setq buffer-read-only nil)
! 		   (vc-clear-headers)))
! 	(vc-backend-checkout (buffer-file-name) t (vc-branch-part target))
! 	(set-visited-file-name (buffer-file-name))
! 	(vc-mode-line (buffer-file-name)))
!       (message "Version %s has been removed from the master." target)
        )))
  
--- 1618,1676 ----
      (pop-to-buffer vc-parent-buffer))
    (cond 
!    ((not (vc-registered (buffer-file-name)))
!     (vc-registration-error (buffer-file-name))
!     (eq (vc-backend (buffer-file-name)) 'CVS)
      (error "Unchecking files under CVS is dangerous and not supported in VC"))
     ((vc-locking-user (buffer-file-name))
!     (error "This version is locked; use vc-revert-buffer to discard changes"))
     ((not (vc-latest-on-branch-p (buffer-file-name)))
!     (error "This is not the latest version--VC cannot cancel it")))
!   (let* ((target (vc-workfile-version (buffer-file-name)))
!          (recent (if (vc-trunk-p target) "" (vc-branch-part target)))
!          (config (current-window-configuration)) done)
!     (if (null (yes-or-no-p (format "Remove version %s from master? " target)))
  	nil
        (setq norevert (or norevert (not 
             (yes-or-no-p "Revert buffer to most recent remaining version? "))))
        (vc-backend-uncheck (buffer-file-name) target)
!       ;; Check out the most recent remaining version.  If it fails, because
!       ;; the whole branch got deleted, do a double-take and check out the
!       ;; version where the branch started.
!       (while (not done)
!         (condition-case err
!             (progn
!               (if norevert
!                   ;; Check out locked, but only to disc, and keep 
!                   ;; modifications in the buffer.
!                   (vc-backend-checkout (buffer-file-name) t recent)
!                 ;; Check out unlocked, and revert buffer.
!                 (vc-checkout (buffer-file-name) nil recent))
!               (setq done t))
!           ;; If the checkout fails, vc-do-command signals an error.
!           ;; We catch this error, check the reason, correct the
!           ;; version number, and try a second time.
!           (error (set-buffer "*vc*")
!                  (goto-char (point-min))
!                  (if (search-forward "no side branches present for" nil t)
!                      (progn (setq recent (vc-branch-part recent))
!                             ;; vc-do-command popped up a window with
!                             ;; the error message.  Get rid of it, by
!                             ;; restoring the old window configuration.
!                             (set-window-configuration config))
!                    ;; No, it was some other error: re-signal it.
!                    (signal (car err) (cdr err))))))
!       ;; If norevert, clear version headers and mark the buffer modified.
!       (if norevert
!           (progn
!             (set-visited-file-name (buffer-file-name))
!             (if (not vc-make-backup-files)
!                 ;; inhibit backup for this buffer
!                 (progn (make-local-variable 'backup-inhibited)
!                        (setq backup-inhibited t)))
!             (if (eq (vc-backend (buffer-file-name)) 'RCS)
!                 (progn (setq buffer-read-only nil)
!                        (vc-clear-headers)))
!             (vc-mode-line (buffer-file-name))))
!       (message "Version %s has been removed from the master" target)
        )))
  
*************** A prefix argument means do not revert th
*** 1646,1650 ****
    ;; until CVS 2.0 is released.  --ceder 1994-01-23 21:27:51
    (if (eq (vc-backend old) 'CVS)
!       (error "Renaming files under CVS is dangerous and not supported in VC."))
    (let ((oldbuf (get-file-buffer old)))
      (if (and oldbuf (buffer-modified-p oldbuf))
--- 1686,1690 ----
    ;; until CVS 2.0 is released.  --ceder 1994-01-23 21:27:51
    (if (eq (vc-backend old) 'CVS)
!       (error "Renaming files under CVS is dangerous and not supported in VC"))
    (let ((oldbuf (get-file-buffer old)))
      (if (and oldbuf (buffer-modified-p oldbuf))
*************** A prefix argument means do not revert th
*** 1688,1692 ****
  	(save-excursion
  	  (set-buffer oldbuf)
! 	  (set-visited-file-name new)
  	  (set-buffer-modified-p nil))))
    ;; This had FILE, I changed it to OLD. -- rms.
--- 1728,1735 ----
  	(save-excursion
  	  (set-buffer oldbuf)
! 	  (let ((buffer-read-only buffer-read-only))
! 	    (set-visited-file-name new))
! 	  (vc-backend new)
! 	  (vc-mode-line new)
  	  (set-buffer-modified-p nil))))
    ;; This had FILE, I changed it to OLD. -- rms.
*************** From a program, any arguments are passed
*** 1728,1732 ****
  			      f)))
  			 (directory-files RCS nil "...\\|^[^.]\\|^.[^.]")))))))
!   (let ((odefault default-directory))
      (find-file-other-window (find-change-log))
      (barf-if-buffer-read-only)
--- 1771,1779 ----
  			      f)))
  			 (directory-files RCS nil "...\\|^[^.]\\|^.[^.]")))))))
!   (let ((odefault default-directory)
! 	(full-name (or add-log-full-name
! 		       (user-full-name)))
! 	(mailing-address (or add-log-mailing-address
! 			     user-mail-address)))
      (find-file-other-window (find-change-log))
      (barf-if-buffer-read-only)
*************** From a program, any arguments are passed
*** 1742,1748 ****
  				  (concat (user-login-name)
  					  "\t"
! 					  (user-full-name)
  					  "\t"
! 					  user-mail-address)
  				  (mapcar (function
  					   (lambda (f)
--- 1789,1795 ----
  				  (concat (user-login-name)
  					  "\t"
! 					  full-name
  					  "\t"
! 					  mailing-address)
  				  (mapcar (function
  					   (lambda (f)
*************** From a program, any arguments are passed
*** 1805,1951 ****
    (let ((filename (or workfile file))
  	(file-buffer (get-file-buffer file))
! 	(old-default-dir default-directory))
      (message "Checking out %s..." filename)
      (save-excursion
!       ;; Change buffers to get local value of vc-checkin-switches.
        (if file-buffer (set-buffer file-buffer))
!       ;; Adjust the default-directory so that the check-out creates 
!       ;; the file in the right place. The old value is restored below.
!       (setq default-directory (file-name-directory filename))
!       (vc-backend-dispatch file
! 	(if workfile;; SCCS
! 	    ;; Some SCCS implementations allow checking out directly to a
! 	    ;; file using the -G option, but then some don't so use the
! 	    ;; least common denominator approach and use the -p option
! 	    ;; ala RCS.
! 	    (let ((vc-modes (logior (file-modes (vc-name file))
! 				    (if writable 128 0)))
! 		  (failed t))
! 	      (unwind-protect
! 		  (progn
! 		    (apply 'vc-do-command
! 			   nil 0 "/bin/sh" file 'MASTER "-c"
! 			   ;; Some shells make the "" dummy argument into $0
! 			   ;; while others use the shell's name as $0 and
! 			   ;; use the "" as $1.  The if-statement
! 			   ;; converts the latter case to the former.
! 			   (format "if [ x\"$1\" = x ]; then shift; fi; \
  			       umask %o; exec >\"$1\" || exit; \
  			       shift; umask %o; exec get \"$@\""
! 				   (logand 511 (lognot vc-modes))
! 				   (logand 511 (lognot (default-file-modes))))
! 			   ""		; dummy argument for shell's $0
! 			   filename 
! 			   (if writable "-e")
! 			   "-p" (and rev
! 				     (concat "-r" (vc-lookup-triple file rev)))
! 			   vc-checkout-switches)
! 		    (setq failed nil))
! 		(and failed (file-exists-p filename) (delete-file filename))))
! 	  (apply 'vc-do-command nil 0 "get" file 'MASTER   ;; SCCS
! 		 (if writable "-e")
! 		 (and rev (concat "-r" (vc-lookup-triple file rev)))
! 		 vc-checkout-switches)
! 	  (vc-file-setprop file 'vc-workfile-version nil))
! 	(if workfile  ;; RCS
! 	    ;; RCS doesn't let us check out into arbitrary file names directly.
! 	    ;; Use `co -p' and make stdout point to the correct file.
! 	    (let ((vc-modes (logior (file-modes (vc-name file))
! 				    (if writable 128 0)))
! 		  (failed t))
! 	      (unwind-protect
! 		  (progn
! 		    (apply 'vc-do-command
! 			   nil 0 "/bin/sh" file 'MASTER "-c"
! 			   ;; See the SCCS case, above, regarding the
! 			   ;; if-statement.
! 			   (format "if [ x\"$1\" = x ]; then shift; fi; \
  			       umask %o; exec >\"$1\" || exit; \
  			       shift; umask %o; exec co \"$@\""
! 				   (logand 511 (lognot vc-modes))
! 				   (logand 511 (lognot (default-file-modes))))
! 			   ""		; dummy argument for shell's $0
! 			   filename
! 			   (if writable "-l")
! 			   (concat "-p" rev)
! 			   vc-checkout-switches)
! 		    (setq failed nil))
! 		(and failed (file-exists-p filename) (delete-file filename))))
!        (let (new-version)
! 	 ;; if we should go to the head of the trunk, 
! 	 ;; clear the default branch first
! 	 (and rev (string= rev "") 
! 	      (vc-do-command nil 0 "rcs" file 'MASTER "-b"))
! 	 ;; now do the checkout
! 	 (apply 'vc-do-command
! 		nil 0 "co" file 'MASTER
! 		;; If locking is not strict, force to overwrite
! 		;; the writable workfile.
! 		(if (eq (vc-checkout-model file) 'implicit) "-f")
! 		(if writable "-l")
! 		(if rev (concat "-r" rev)
! 		  ;; if no explicit revision was specified,
! 		  ;; check out that of the working file
! 		  (let ((workrev (vc-workfile-version file)))
! 		    (if workrev (concat "-r" workrev)
! 		      nil)))
! 		vc-checkout-switches)
! 	 ;; determine the new workfile version
! 	 (save-excursion
! 	   (set-buffer "*vc*")
! 	   (goto-char (point-min))
! 	   (setq new-version 
! 		 (if (re-search-forward "^revision \\([0-9.]+\\).*\n" nil t)
! 		     (buffer-substring (match-beginning 1) (match-end 1)))))
! 	 (vc-file-setprop file 'vc-workfile-version new-version)
! 	 ;; if necessary, adjust the default branch
! 	 (and rev (not (string= rev ""))
! 	      (vc-do-command nil 0 "rcs" file 'MASTER 
! 		 (concat "-b" (if (vc-latest-on-branch-p file)
! 				  (if (vc-trunk-p new-version) nil
! 				    (vc-branch-part new-version))
! 				new-version))))))
! 	(if workfile  ;; CVS
! 	    ;; CVS is much like RCS
! 	    (let ((failed t))
! 	      (unwind-protect
! 		  (progn
! 		    (apply 'vc-do-command
! 			   nil 0 "/bin/sh" file 'WORKFILE "-c"
! 			   "exec >\"$1\" || exit; shift; exec cvs update \"$@\""
! 			   ""		; dummy argument for shell's $0
! 			   workfile
! 			   (concat "-r" rev)
! 			   "-p"
! 			   vc-checkout-switches)
! 		    (setq failed nil))
! 		(and failed (file-exists-p filename) (delete-file filename))))
! 	  ;; default for verbose checkout: clear the sticky tag
! 	  ;; so that the actual update will get the head of the trunk
! 	  (and rev (string= rev "")
! 	       (vc-do-command nil 0 "cvs" file 'WORKFILE "update" "-A"))
! 	  ;; If a revision was specified, check that out.
! 	  (if rev
! 	      (apply 'vc-do-command nil 0 "cvs" file 'WORKFILE 
! 		     (and writable (eq (vc-checkout-model file) 'manual) "-w")
! 		     "update"
! 		     (and rev (not (string= rev ""))
! 			  (concat "-r" rev))
! 		     vc-checkout-switches)
! 	    ;; If no revision was specified, simply make the file writable.
! 	    (and writable 
! 		 (or (eq (vc-checkout-model file) 'manual)
! 		     (zerop (logand 128 (file-modes file))))
! 		 (set-file-modes file (logior 128 (file-modes file)))))
! 	  (if rev (vc-file-setprop file 'vc-workfile-version nil))))
!     (setq default-directory old-default-dir)
!     (cond 
!      ((not workfile)
!       (vc-file-clear-masterprops file)
!       (if writable 
! 	  (vc-file-setprop file 'vc-locking-user (user-login-name)))
!       (vc-file-setprop file
! 		       'vc-checkout-time (nth 5 (file-attributes file)))))
!     (message "Checking out %s...done" filename))))
  
  (defun vc-backend-logentry-check (file)
--- 1852,2009 ----
    (let ((filename (or workfile file))
  	(file-buffer (get-file-buffer file))
! 	switches)
      (message "Checking out %s..." filename)
      (save-excursion
!       ;; Change buffers to get local value of vc-checkout-switches.
        (if file-buffer (set-buffer file-buffer))
!       (setq switches (if (stringp vc-checkout-switches)
! 			 (list vc-checkout-switches)
! 		       vc-checkout-switches))
!       ;; Save this buffer's default-directory
!       ;; and use save-excursion to make sure it is restored
!       ;; in the same buffer it was saved in.
!       (let ((default-directory default-directory))
! 	(save-excursion
! 	  ;; Adjust the default-directory so that the check-out creates 
! 	  ;; the file in the right place.
! 	  (setq default-directory (file-name-directory filename))
! 	  (vc-backend-dispatch file
! 	    (progn  ;; SCCS
! 	      (and rev (string= rev "") (setq rev nil))
! 	      (if workfile  
! 		  ;; Some SCCS implementations allow checking out directly to a
! 		  ;; file using the -G option, but then some don't so use the
! 		  ;; least common denominator approach and use the -p option
! 		  ;; ala RCS.
! 		  (let ((vc-modes (logior (file-modes (vc-name file))
! 					  (if writable 128 0)))
! 			(failed t))
! 		    (unwind-protect
! 			(progn
! 			  (apply 'vc-do-command
! 				 nil 0 "/bin/sh" file 'MASTER "-c"
! 				 ;; Some shells make the "" dummy argument into $0
! 				 ;; while others use the shell's name as $0 and
! 				 ;; use the "" as $1.  The if-statement
! 				 ;; converts the latter case to the former.
! 				 (format "if [ x\"$1\" = x ]; then shift; fi; \
  			       umask %o; exec >\"$1\" || exit; \
  			       shift; umask %o; exec get \"$@\""
! 				       (logand 511 (lognot vc-modes))
! 				       (logand 511 (lognot (default-file-modes))))
! 				 ""		; dummy argument for shell's $0
! 				 filename 
! 				 (if writable "-e")
! 				 "-p" 
! 				 (and rev
! 				      (concat "-r" (vc-lookup-triple file rev)))
! 				 switches)
! 			  (setq failed nil))
! 		      (and failed (file-exists-p filename) 
! 			   (delete-file filename))))
! 		(apply 'vc-do-command nil 0 "get" file 'MASTER   ;; SCCS
! 		       (if writable "-e")
! 		       (and rev (concat "-r" (vc-lookup-triple file rev)))
! 		       switches)
! 		(vc-file-setprop file 'vc-workfile-version nil)))
! 	    (if workfile  ;; RCS
! 		;; RCS doesn't let us check out into arbitrary file names directly.
! 		;; Use `co -p' and make stdout point to the correct file.
! 		(let ((vc-modes (logior (file-modes (vc-name file))
! 					(if writable 128 0)))
! 		      (failed t))
! 		  (unwind-protect
! 		      (progn
! 			(apply 'vc-do-command
! 			       nil 0 "/bin/sh" file 'MASTER "-c"
! 			       ;; See the SCCS case, above, regarding the
! 			       ;; if-statement.
! 			       (format "if [ x\"$1\" = x ]; then shift; fi; \
  			       umask %o; exec >\"$1\" || exit; \
  			       shift; umask %o; exec co \"$@\""
! 				       (logand 511 (lognot vc-modes))
! 				       (logand 511 (lognot (default-file-modes))))
! 			       ""		; dummy argument for shell's $0
! 			       filename
! 			       (if writable "-l")
! 			       (concat "-p" rev)
! 			       switches)
! 			(setq failed nil))
! 		    (and failed (file-exists-p filename) (delete-file filename))))
! 	      (let (new-version)
! 		;; if we should go to the head of the trunk, 
! 		;; clear the default branch first
! 		(and rev (string= rev "") 
! 		     (vc-do-command nil 0 "rcs" file 'MASTER "-b"))
! 		;; now do the checkout
! 		(apply 'vc-do-command
! 		       nil 0 "co" file 'MASTER
! 		       ;; If locking is not strict, force to overwrite
! 		       ;; the writable workfile.
! 		       (if (eq (vc-checkout-model file) 'implicit) "-f")
! 		       (if writable "-l")
! 		       (if rev (concat "-r" rev)
! 			 ;; if no explicit revision was specified,
! 			 ;; check out that of the working file
! 			 (let ((workrev (vc-workfile-version file)))
! 			   (if workrev (concat "-r" workrev)
! 			     nil)))
! 		       switches)
! 		;; determine the new workfile version
! 		(save-excursion
! 		  (set-buffer "*vc*")
! 		  (goto-char (point-min))
! 		  (setq new-version 
! 			(if (re-search-forward "^revision \\([0-9.]+\\).*\n" nil t)
! 			    (buffer-substring (match-beginning 1) (match-end 1)))))
! 		(vc-file-setprop file 'vc-workfile-version new-version)
! 		;; if necessary, adjust the default branch
! 		(and rev (not (string= rev ""))
! 		     (vc-do-command nil 0 "rcs" file 'MASTER 
! 			(concat "-b" (if (vc-latest-on-branch-p file)
! 					 (if (vc-trunk-p new-version) nil
! 					   (vc-branch-part new-version))
! 				       new-version))))))
! 	    (if workfile  ;; CVS
! 		;; CVS is much like RCS
! 		(let ((failed t))
! 		  (unwind-protect
! 		      (progn
! 			(apply 'vc-do-command
! 			       nil 0 "/bin/sh" file 'WORKFILE "-c"
! 			       "exec >\"$1\" || exit; shift; exec cvs update \"$@\""
! 			       ""		; dummy argument for shell's $0
! 			       workfile
! 			       (concat "-r" rev)
! 			       "-p"
! 			       switches)
! 			(setq failed nil))
! 		    (and failed (file-exists-p filename) (delete-file filename))))
! 	      ;; default for verbose checkout: clear the sticky tag
! 	      ;; so that the actual update will get the head of the trunk
! 	      (and rev (string= rev "")
! 		   (vc-do-command nil 0 "cvs" file 'WORKFILE "update" "-A"))
! 	      ;; If a revision was specified, check that out.
! 	      (if rev
! 		  (apply 'vc-do-command nil 0 "cvs" file 'WORKFILE 
! 			 (and writable (eq (vc-checkout-model file) 'manual) "-w")
! 			 "update"
! 			 (and rev (not (string= rev ""))
! 			      (concat "-r" rev))
! 			 switches)
! 		;; If no revision was specified, simply make the file writable.
! 		(and writable 
! 		     (or (eq (vc-checkout-model file) 'manual)
! 			 (zerop (logand 128 (file-modes file))))
! 		     (set-file-modes file (logior 128 (file-modes file)))))
! 	      (if rev (vc-file-setprop file 'vc-workfile-version nil))))
! 	  (cond 
! 	   ((not workfile)
! 	    (vc-file-clear-masterprops file)
! 	    (if writable 
! 		(vc-file-setprop file 'vc-locking-user (user-login-name)))
! 	    (vc-file-setprop file
! 			     'vc-checkout-time (nth 5 (file-attributes file)))))
! 	  (message "Checking out %s...done" filename))))))
  
  (defun vc-backend-logentry-check (file)
*************** From a program, any arguments are passed
*** 1965,1969 ****
    ;; keywords expanded if vc-keep-workfiles is non-nil, otherwise
    ;; it deletes the workfile.
!   ;;   Adaption for RCS branch support: if this is an explicit checkin,
    ;; or if the checkin creates a new branch, set the master file branch
    ;; accordingly.
--- 2023,2027 ----
    ;; keywords expanded if vc-keep-workfiles is non-nil, otherwise
    ;; it deletes the workfile.
!   ;;   Adaptation for RCS branch support: if this is an explicit checkin,
    ;; or if the checkin creates a new branch, set the master file branch
    ;; accordingly.
*************** From a program, any arguments are passed
*** 1976,2066 ****
      ;; Change buffers to get local value of vc-checkin-switches.
      (set-buffer (or (get-file-buffer file) (current-buffer)))
!     ;; Clear the master-properties.  Do that here, not at the
!     ;; end, because if the check-in fails we want them to get
!     ;; re-computed before the next try.
!     (vc-file-clear-masterprops file)
!     (vc-backend-dispatch file
!       ;; SCCS
!       (progn
! 	(apply 'vc-do-command nil 0 "delta" file 'MASTER
! 	       (if rev (concat "-r" rev))
! 	       (concat "-y" comment)
! 	       vc-checkin-switches)
! 	(vc-file-setprop file 'vc-locking-user 'none)
! 	(vc-file-setprop file 'vc-workfile-version nil)
! 	(if vc-keep-workfiles
! 	    (vc-do-command nil 0 "get" file 'MASTER))
! 	)
!       ;; RCS
!       (let ((old-version (vc-workfile-version file)) new-version)
! 	(apply 'vc-do-command nil 0 "ci" file 'MASTER
! 	       ;; if available, use the secure check-in option
! 	       (and (vc-backend-release-p 'RCS "5.6.4") "-j")
! 	       (concat (if vc-keep-workfiles "-u" "-r") rev)
! 	       (concat "-m" comment)
! 	       vc-checkin-switches)
! 	(vc-file-setprop file 'vc-locking-user 'none)
! 	(vc-file-setprop file 'vc-workfile-version nil)
  
! 	;; determine the new workfile version
! 	(set-buffer "*vc*")
! 	(goto-char (point-min))
! 	(if (or (re-search-forward 
! 		 "new revision: \\([0-9.]+\\);" nil t)
! 		(re-search-forward 
! 		 "reverting to previous revision \\([0-9.]+\\)" nil t))
! 	    (progn (setq new-version (buffer-substring (match-beginning 1)
! 						       (match-end 1)))
! 		   (vc-file-setprop file 'vc-workfile-version new-version)))
! 
! 	;; if we got to a different branch, adjust the default
! 	;; branch accordingly
! 	(cond 
! 	 ((and old-version new-version
! 	       (not (string= (vc-branch-part old-version)
! 			     (vc-branch-part new-version))))
! 	  (vc-do-command nil 0 "rcs" file 'MASTER 
! 			 (if (vc-trunk-p new-version) "-b"
! 			   (concat "-b" (vc-branch-part new-version))))
! 	  ;; If this is an old RCS release, we might have 
! 	  ;; to remove a remaining lock.
! 	  (if (not (vc-backend-release-p 'RCS "5.6.2"))
! 	      ;; exit status of 1 is also accepted.
! 	      ;; It means that the lock was removed before.
! 	      (vc-do-command nil 1 "rcs" file 'MASTER 
! 			     (concat "-u" old-version))))))
!       ;; CVS
!       (progn
! 	;; explicit check-in to the trunk requires a 
!         ;; double check-in (first unexplicit) (CVS-1.3)
! 	(condition-case nil
! 	    (progn
! 	      (if (and rev (vc-trunk-p rev))
! 		  (apply 'vc-do-command nil 0 "cvs" file 'WORKFILE 
! 			 "ci" "-m" "intermediate"
! 			 vc-checkin-switches))
! 	      (apply 'vc-do-command nil 0 "cvs" file 'WORKFILE 
! 		     "ci" (if rev (concat "-r" rev))
! 		     (concat "-m" comment)
! 		     vc-checkin-switches))
! 	  (error (if (eq (vc-cvs-status file) 'needs-merge)
! 		     ;; The CVS output will be on top of this message.
! 		     (error "Type C-x 0 C-x C-q to merge in changes.")
! 		   (error "Check in FAILED."))))
! 	;; determine and store the new workfile version
! 	(set-buffer "*vc*")
! 	(goto-char (point-min))
! 	(if (re-search-forward 
! 	     "^\\(new\\|initial\\) revision: \\([0-9.]+\\)" nil t)
! 	    (vc-file-setprop file 'vc-workfile-version 
! 			     (buffer-substring (match-beginning 2)
! 					       (match-end 2)))
! 	  (vc-file-setprop file 'vc-workfile-version nil))
! 	;; if this was an explicit check-in, remove the sticky tag
! 	(if rev
! 	    (vc-do-command nil 0 "cvs" file 'WORKFILE "update" "-A"))
! 	(vc-file-setprop file 'vc-locking-user 'none)
! 	(vc-file-setprop file 'vc-checkout-time 
! 			 (nth 5 (file-attributes file))))))
    (message "Checking in %s...done" file))
  
--- 2034,2128 ----
      ;; Change buffers to get local value of vc-checkin-switches.
      (set-buffer (or (get-file-buffer file) (current-buffer)))
!     (let ((switches
! 	   (if (stringp vc-checkin-switches)
! 	       (list vc-checkin-switches)
! 	     vc-checkin-switches)))
!       ;; Clear the master-properties.  Do that here, not at the
!       ;; end, because if the check-in fails we want them to get
!       ;; re-computed before the next try.
!       (vc-file-clear-masterprops file)
!       (vc-backend-dispatch file
! 	;; SCCS
! 	(progn
! 	  (apply 'vc-do-command nil 0 "delta" file 'MASTER
! 		 (if rev (concat "-r" rev))
! 		 (concat "-y" comment)
! 		 switches)
! 	  (vc-file-setprop file 'vc-locking-user 'none)
! 	  (vc-file-setprop file 'vc-workfile-version nil)
! 	  (if vc-keep-workfiles
! 	      (vc-do-command nil 0 "get" file 'MASTER))
! 	  )
! 	;; RCS
! 	(let ((old-version (vc-workfile-version file)) new-version)
! 	  (apply 'vc-do-command nil 0 "ci" file 'MASTER
! 		 ;; if available, use the secure check-in option
! 		 (and (vc-backend-release-p 'RCS "5.6.4") "-j")
! 		 (concat (if vc-keep-workfiles "-u" "-r") rev)
! 		 (concat "-m" comment)
! 		 switches)
! 	  (vc-file-setprop file 'vc-locking-user 'none)
! 	  (vc-file-setprop file 'vc-workfile-version nil)
  
! 	  ;; determine the new workfile version
! 	  (set-buffer "*vc*")
! 	  (goto-char (point-min))
! 	  (if (or (re-search-forward 
! 		   "new revision: \\([0-9.]+\\);" nil t)
! 		  (re-search-forward 
! 		   "reverting to previous revision \\([0-9.]+\\)" nil t))
! 	      (progn (setq new-version (buffer-substring (match-beginning 1)
! 							 (match-end 1)))
! 		     (vc-file-setprop file 'vc-workfile-version new-version)))
! 
! 	  ;; if we got to a different branch, adjust the default
! 	  ;; branch accordingly
! 	  (cond 
! 	   ((and old-version new-version
! 		 (not (string= (vc-branch-part old-version)
! 			       (vc-branch-part new-version))))
! 	    (vc-do-command nil 0 "rcs" file 'MASTER 
! 			   (if (vc-trunk-p new-version) "-b"
! 			     (concat "-b" (vc-branch-part new-version))))
! 	    ;; If this is an old RCS release, we might have 
! 	    ;; to remove a remaining lock.
! 	    (if (not (vc-backend-release-p 'RCS "5.6.2"))
! 		;; exit status of 1 is also accepted.
! 		;; It means that the lock was removed before.
! 		(vc-do-command nil 1 "rcs" file 'MASTER 
! 			       (concat "-u" old-version))))))
! 	;; CVS
! 	(progn
! 	  ;; explicit check-in to the trunk requires a 
! 	  ;; double check-in (first unexplicit) (CVS-1.3)
! 	  (condition-case nil
! 	      (progn
! 		(if (and rev (vc-trunk-p rev))
! 		    (apply 'vc-do-command nil 0 "cvs" file 'WORKFILE 
! 			   "ci" "-m" "intermediate"
! 			   switches))
! 		(apply 'vc-do-command nil 0 "cvs" file 'WORKFILE 
! 		       "ci" (if rev (concat "-r" rev))
! 		       (concat "-m" comment)
! 		       switches))
! 	    (error (if (eq (vc-cvs-status file) 'needs-merge)
! 		       ;; The CVS output will be on top of this message.
! 		       (error "Type C-x 0 C-x C-q to merge in changes")
! 		     (error "Check-in failed"))))
! 	  ;; determine and store the new workfile version
! 	  (set-buffer "*vc*")
! 	  (goto-char (point-min))
! 	  (if (re-search-forward 
! 	       "^\\(new\\|initial\\) revision: \\([0-9.]+\\)" nil t)
! 	      (vc-file-setprop file 'vc-workfile-version 
! 			       (buffer-substring (match-beginning 2)
! 						 (match-end 2)))
! 	    (vc-file-setprop file 'vc-workfile-version nil))
! 	  ;; if this was an explicit check-in, remove the sticky tag
! 	  (if rev
! 	      (vc-do-command nil 0 "cvs" file 'WORKFILE "update" "-A"))
! 	  (vc-file-setprop file 'vc-locking-user 'none)
! 	  (vc-file-setprop file 'vc-checkout-time 
! 			   (nth 5 (file-attributes file)))))))
    (message "Checking in %s...done" file))
  
*************** From a program, any arguments are passed
*** 2098,2102 ****
     (vc-do-command nil 0 "rcs" file 'MASTER	;RCS
  		  "-M" (concat "-u" rev) (concat "-l" rev))
!    (error "You cannot steal a CVS lock; there are no CVS locks to steal.") ;CVS
     )
    (vc-file-setprop file 'vc-locking-user (user-login-name))
--- 2160,2164 ----
     (vc-do-command nil 0 "rcs" file 'MASTER	;RCS
  		  "-M" (concat "-u" rev) (concat "-l" rev))
!    (error "You cannot steal a CVS lock; there are no CVS locks to steal") ;CVS
     )
    (vc-file-setprop file 'vc-locking-user (user-login-name))
*************** Invoke FUNC f ARGS on each non-directory
*** 2373,2377 ****
  ;;; recover from errors resulting from dispatch on an out-of-date state.
  ;;; 
! ;;; Alternative (a) appears to be unfeasible.  The problem is that we can't
  ;;; guarantee that the lock will ever be removed.  Suppose a user starts a
  ;;; checkin, the change message buffer pops up, and the user, having wandered
--- 2435,2439 ----
  ;;; recover from errors resulting from dispatch on an out-of-date state.
  ;;; 
! ;;; Alternative (a) appears to be infeasible.  The problem is that we can't
  ;;; guarantee that the lock will ever be removed.  Suppose a user starts a
  ;;; checkin, the change message buffer pops up, and the user, having wandered
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/version.el emacs-19.31/lisp/version.el
*** emacs-19.30/lisp/version.el	Wed Nov 22 10:37:02 1995
--- emacs-19.31/lisp/version.el	Sat May 25 15:26:52 1996
***************
*** 19,28 ****
  
  ;; 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.
  
  ;;; Code:
  
! (defconst emacs-version "19.30" "\
  Version numbers of this version of Emacs.")
  
--- 19,29 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Code:
  
! (defconst emacs-version "19.31" "\
  Version numbers of this version of Emacs.")
  
*************** This variable first existed in version 1
*** 39,43 ****
  This variable first existed in version 19.23.")
  
! (defconst emacs-build-time (current-time-string) "\
  Time at which Emacs was dumped out.")
  
--- 40,44 ----
  This variable first existed in version 19.23.")
  
! (defconst emacs-build-time (current-time) "\
  Time at which Emacs was dumped out.")
  
*************** to the system configuration; look at `sy
*** 51,55 ****
    (interactive "P")
    (let ((version-string 
!          (format "GNU Emacs %s (%s%s) of %s %s on %s"
                   emacs-version
  		 system-configuration
--- 52,56 ----
    (interactive "P")
    (let ((version-string 
!          (format "GNU Emacs %s (%s%s) of %s on %s"
                   emacs-version
  		 system-configuration
*************** to the system configuration; look at `sy
*** 57,64 ****
  		       ((featurep 'x-toolkit) ", X toolkit")
  		       (t ""))
!                  (substring emacs-build-time 0
!                             (string-match " *[0-9]*:" emacs-build-time))
!                  (substring emacs-build-time 
!                             (string-match "[0-9]*$" emacs-build-time))
                   emacs-build-system)))
      (if here 
--- 58,62 ----
  		       ((featurep 'x-toolkit) ", X toolkit")
  		       (t ""))
! 		 (format-time-string "%a %b %e %Y" emacs-build-time)
                   emacs-build-system)))
      (if here 
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/vi.el emacs-19.31/lisp/vi.el
*** emacs-19.30/lisp/vi.el	Mon Jul 31 16:18:55 1995
--- emacs-19.31/lisp/vi.el	Thu Jan  4 18:11:02 1996
***************
*** 2,6 ****
  
  ; This file is in the public domain because the authors distributed it
! ; without a copyright noticed before the US signed the Bern Convention.
  
  ;; Author: Neal Ziring <nz@rsch.wisc.edu>
--- 2,6 ----
  
  ; This file is in the public domain because the authors distributed it
! ; without a copyright notice before the US signed the Bern Convention.
  
  ;; Author: Neal Ziring <nz@rsch.wisc.edu>
*************** command extensions.")
*** 118,126 ****
    (define-key vi-com-map "\C-@" 'vi-mark-region) ; extension
    (define-key vi-com-map "\C-a" 'vi-ask-for-info)  ; extension
!   (define-key vi-com-map "\C-b" 'vi-backward-windowfull)
    (define-key vi-com-map "\C-c" 'vi-do-old-mode-C-c-command) ; extension
    (define-key vi-com-map "\C-d" 'vi-scroll-down-window)
    (define-key vi-com-map "\C-e" 'vi-expose-line-below)
!   (define-key vi-com-map "\C-f" 'vi-forward-windowfull)
    (define-key vi-com-map "\C-g" 'keyboard-quit)
    (define-key vi-com-map "\C-i" 'indent-relative-maybe) ; TAB
--- 118,126 ----
    (define-key vi-com-map "\C-@" 'vi-mark-region) ; extension
    (define-key vi-com-map "\C-a" 'vi-ask-for-info)  ; extension
!   (define-key vi-com-map "\C-b" 'vi-backward-windowful)
    (define-key vi-com-map "\C-c" 'vi-do-old-mode-C-c-command) ; extension
    (define-key vi-com-map "\C-d" 'vi-scroll-down-window)
    (define-key vi-com-map "\C-e" 'vi-expose-line-below)
!   (define-key vi-com-map "\C-f" 'vi-forward-windowful)
    (define-key vi-com-map "\C-g" 'keyboard-quit)
    (define-key vi-com-map "\C-i" 'indent-relative-maybe) ; TAB
*************** are given, use those instead of the ones
*** 734,739 ****
      (vi-goto-command-state t)))
  
! (defun vi-backward-windowfull (count)
!   "Backward COUNT windowfulls. Default is one."
    (interactive "p")
  ; (set-mark-command nil)
--- 734,739 ----
      (vi-goto-command-state t)))
  
! (defun vi-backward-windowful (count)
!   "Backward COUNT windowfuls. Default is one."
    (interactive "p")
  ; (set-mark-command nil)
*************** The given COUNT is remembered for future
*** 756,761 ****
    (scroll-up count))
  
! (defun vi-forward-windowfull (count)
!   "Forward COUNT windowfulls. Default is one."
    (interactive "p")
  ; (set-mark-command nil)
--- 756,761 ----
    (scroll-up count))
  
! (defun vi-forward-windowful (count)
!   "Forward COUNT windowfuls. Default is one."
    (interactive "p")
  ; (set-mark-command nil)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/view.el emacs-19.31/lisp/view.el
*** emacs-19.30/lisp/view.el	Fri Nov 24 18:08:15 1995
--- emacs-19.31/lisp/view.el	Sun Feb  4 16:11:42 1996
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** This is local in each buffer, once it is
*** 71,75 ****
      nil
    (setq view-mode-map (make-keymap))
!   (suppress-keymap view-mode-map)
    (define-key view-mode-map "q" 'view-exit)
    (define-key view-mode-map "<" 'beginning-of-buffer)
--- 72,78 ----
      nil
    (setq view-mode-map (make-keymap))
!   ;; We used to call suppress-keymap here, but that isn't good in a minor mode.
!   ;; Self-inserting characters will beep anyway, since the buffer is read-only,
!   ;; and we should not interfere with letters that serve as useful commands.
    (define-key view-mode-map "q" 'view-exit)
    (define-key view-mode-map "<" 'beginning-of-buffer)
*************** This function runs the normal hook `view
*** 262,266 ****
  
    (run-hooks 'view-mode-hook)
!   (message
       (substitute-command-keys
        "Type \\[help-command] for help, \\[describe-mode] for commands, \\[view-exit] to quit.")))
--- 265,269 ----
  
    (run-hooks 'view-mode-hook)
!   (message "%s"
       (substitute-command-keys
        "Type \\[help-command] for help, \\[describe-mode] for commands, \\[view-exit] to quit.")))
*************** Arg is number of lines to scroll."
*** 343,347 ****
      (cond ((pos-visible-in-window-p (point-max))
  	   (goto-char (point-max))
! 	   (message (substitute-command-keys
  		     "End.  Type \\[view-exit] to quit viewing."))))
      (move-to-window-line -1)
--- 346,351 ----
      (cond ((pos-visible-in-window-p (point-max))
  	   (goto-char (point-max))
! 	   (message "%s"
! 		    (substitute-command-keys
  		     "End.  Type \\[view-exit] to quit viewing."))))
      (move-to-window-line -1)
*************** The variable `view-highlight-face' contr
*** 408,412 ****
  for highlighting the match that is found."
    (interactive "p")
!   (View-search-regexp-forward n view-last-regexp))
  
  (defun View-search-last-regexp-backward (n)
--- 412,418 ----
  for highlighting the match that is found."
    (interactive "p")
!   (if view-last-regexp
!       (View-search-regexp-forward n view-last-regexp)
!     (error "No previous View-mode search")))
  
  (defun View-search-last-regexp-backward (n)
*************** The variable `view-highlight-face' contr
*** 418,422 ****
  for highlighting the match that is found."
    (interactive "p")
!   (View-search-regexp-backward n view-last-regexp))
  
  (defun View-back-to-mark (&optional ignore)
--- 424,430 ----
  for highlighting the match that is found."
    (interactive "p")
!   (if view-last-regexp
!       (View-search-regexp-backward n view-last-regexp)
!     (error "No previous View-mode search")))
  
  (defun View-back-to-mark (&optional ignore)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/vip.el emacs-19.31/lisp/vip.el
*** emacs-19.30/lisp/vip.el	Thu Jun 22 01:10:37 1995
--- emacs-19.31/lisp/vip.el	Mon Jan 29 17:57:10 1996
***************
*** 5,8 ****
--- 5,25 ----
  ;; Keywords: emulations
  
+ ;; 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, Inc., 59 Temple Place - Suite 330,
+ ;; Boston, MA 02111-1307, USA.
+ 
  ;;; Commentary:
  
*************** re-execute last destructive command")
*** 71,75 ****
  
  (defconst vip-shift-width 8
!   "*The number of colums shifted by > and < command.")
  
  (defconst vip-re-replace nil
--- 88,92 ----
  
  (defconst vip-shift-width 8
!   "*The number of columns shifted by > and < command.")
  
  (defconst vip-re-replace nil
*************** bound to delete-backward-char.")
*** 122,125 ****
--- 139,145 ----
  
  (defvar vip-inhibit-startup-message nil)
+ 
+ (defvar vip-startup-file (convert-standard-filename "~/.vip")
+   "filename used as strtup file for `vip-mode'.")
  
  ;; basic set up
*************** Type `n' to quit this window for now.\n"
*** 244,248 ****
  	      (save-excursion
  		(set-buffer
! 		 (find-file-noselect (substitute-in-file-name "~/.vip")))
  		(goto-char (point-max))
  		(insert "\n(setq vip-inhibit-startup-message t)\n")
--- 264,269 ----
  	      (save-excursion
  		(set-buffer
! 		 (find-file-noselect
! 		  (substitute-in-file-name vip-startup-file)))
  		(goto-char (point-max))
  		(insert "\n(setq vip-inhibit-startup-message t)\n")
*************** obtained so far, and COM is the command 
*** 393,397 ****
      ;; as com is non-nil, this means that we have a command to execute
      (if (or (= (car com) ?r) (= (car com) ?R))
! 	;; execute apropriate region command.
  	(let ((char (car com)) (com (cdr com)))
  	  (setq prefix-arg (cons value com))
--- 414,418 ----
      ;; as com is non-nil, this means that we have a command to execute
      (if (or (= (car com) ?r) (= (car com) ?R))
! 	;; execute appropriate region command.
  	(let ((char (car com)) (com (cdr com)))
  	  (setq prefix-arg (cons value com))
*************** the query replace mode will toggle betwe
*** 919,925 ****
  	(progn
  	  (setq vip-re-replace (not vip-re-replace))
! 	  (message (format "Replace mode changed to %s."
! 			   (if vip-re-replace "regexp replace"
! 			     "string replace"))))
        (if vip-re-replace
  	  ;; (replace-regexp
--- 940,946 ----
  	(progn
  	  (setq vip-re-replace (not vip-re-replace))
! 	  (message "Replace mode changed to %s."
! 		   (if vip-re-replace "regexp replace"
! 		     "string replace")))
        (if vip-re-replace
  	  ;; (replace-regexp
*************** giving null search string."
*** 1440,1446 ****
  	(progn
  	  (setq vip-re-search (not vip-re-search))
! 	  (message (format "Search mode changed to %s search."
! 			   (if vip-re-search "regular expression"
! 			     "vanilla"))))
        (vip-search vip-s-string t val)
        (if com
--- 1461,1467 ----
  	(progn
  	  (setq vip-re-search (not vip-re-search))
! 	  (message "Search mode changed to %s search."
! 		   (if vip-re-search "regular expression"
! 		     "vanilla")))
        (vip-search vip-s-string t val)
        (if com
*************** giving null search string."
*** 1460,1466 ****
  	(progn
  	  (setq vip-re-search (not vip-re-search))
! 	  (message (format "Search mode changed to %s search."
! 			   (if vip-re-search "regular expression"
! 			     "vanilla"))))
        (vip-search vip-s-string nil val)
        (if com
--- 1481,1487 ----
  	(progn
  	  (setq vip-re-search (not vip-re-search))
! 	  (message "Search mode changed to %s search."
! 		   (if vip-re-search "regular expression"
! 		     "vanilla")))
        (vip-search vip-s-string nil val)
        (if com
*************** a token has type \(command, address, end
*** 2534,2538 ****
  	     (string= ex-token "open")
  	     )
! 	 (error (format "%s: no such command from VIP" ex-token)))
  	((or (string= ex-token "abbreviate")
  	     (string= ex-token "list")
--- 2555,2559 ----
  	     (string= ex-token "open")
  	     )
! 	 (error "%s: no such command from VIP" ex-token))
  	((or (string= ex-token "abbreviate")
  	     (string= ex-token "list")
*************** a token has type \(command, address, end
*** 2547,2552 ****
  	     (string= ex-token "z")
  	     )
! 	 (error (format "%s: not implemented in VIP" ex-token)))
! 	(t (error (format "%s: Not an editor command" ex-token)))))
  
  (defun ex-goto ()
--- 2568,2573 ----
  	     (string= ex-token "z")
  	     )
! 	 (error "%s: not implemented in VIP" ex-token))
! 	(t (error "%s: Not an editor command" ex-token))))
  
  (defun ex-goto ()
*************** vip-s-string"
*** 2964,2968 ****
  	   (file-exists-p ex-file)
  	   (not ex-variant))
!       (error (format "\"%s\" File exists - use w! to override" ex-file)))
    (let ((end (car ex-addresses)) (beg (car (cdr ex-addresses))))
      (if (> beg end) (error "First address exceeds second"))
--- 2985,2989 ----
  	   (file-exists-p ex-file)
  	   (not ex-variant))
!       (error "\"%s\" File exists - use w! to override" ex-file))
    (let ((end (car ex-addresses)) (beg (car (cdr ex-addresses))))
      (if (> beg end) (error "First address exceeds second"))
*************** vip-s-string"
*** 3021,3025 ****
  		(if (null ex-addresses) (point-max) (car ex-addresses))))))
  
! (if (file-exists-p "~/.vip") (load "~/.vip"))
  
  ;;; vip.el ends here
--- 3042,3046 ----
  		(if (null ex-addresses) (point-max) (car ex-addresses))))))
  
! (if (file-exists-p vip-startup-file) (load vip-startup-file))
  
  ;;; vip.el ends here
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/viper-ex.el emacs-19.31/lisp/viper-ex.el
*** emacs-19.30/lisp/viper-ex.el	Mon Oct 30 12:32:27 1995
--- emacs-19.31/lisp/viper-ex.el	Thu Mar 28 19:39:57 1996
***************
*** 1,5 ****
  ;;; viper-ex.el --- functions implementing the Ex commands for Viper
  
! ;; Copyright (C) 1994, 1995 Free Software Foundation, Inc.
  
  ;; This file is part of GNU Emacs.
--- 1,5 ----
  ;;; viper-ex.el --- functions implementing the Ex commands for Viper
  
! ;; Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc.
  
  ;; This file is part of GNU Emacs.
***************
*** 16,25 ****
  
  ;; 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.
  
  
  (require 'viper-util)
  
  ;;; Variables
  
--- 16,32 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  
+ ;; Code
+ 
  (require 'viper-util)
  
+ ;; Compiler pacifier
+ (defvar read-file-name-map)
+ ;; end compiler pacifier
+ 
  ;;; Variables
  
***************
*** 46,56 ****
  (defconst ex-variable-alist 
    '(("wrapscan") ("ws") ("wrapmargin") ("wm")
!     ("tab-stop-local") ("tsl") ("tabstop") ("ts")
      ("showmatch") ("sm") ("shiftwidth") ("sw") ("shell") ("sh")
      ("readonly") ("ro") 
      ("nowrapscan") ("nows") ("noshowmatch") ("nosm")
      ("noreadonly") ("noro") ("nomagic") ("noma")
!     ("noignorecase") ("noic") ("noautoindent") ("noai")
!     ("magic") ("ma") ("ignorecase") ("ic") ("autoindent") ("ai")
      ))
  
--- 53,65 ----
  (defconst ex-variable-alist 
    '(("wrapscan") ("ws") ("wrapmargin") ("wm")
!     ("global-tabstop") ("gts") ("tabstop") ("ts")
      ("showmatch") ("sm") ("shiftwidth") ("sw") ("shell") ("sh")
      ("readonly") ("ro") 
      ("nowrapscan") ("nows") ("noshowmatch") ("nosm")
      ("noreadonly") ("noro") ("nomagic") ("noma")
!     ("noignorecase") ("noic")
!     ("global-noautoindent") ("gnoai") ("noautoindent") ("noai")
!     ("magic") ("ma") ("ignorecase") ("ic")
!     ("global-autoindent") ("gai") ("autoindent") ("ai")
      ))
  
*************** reversed.")
*** 346,352 ****
    (setq vip-incomplete-ex-cmd t)
    (let ((quit-regex1 (concat
! 		      "\\("
! 		      "set[ \t]*" "\\|" "edit[ \t]*" "\\|" "[nN]ext[ \t]*"
! 		      "\\|" "unm[ \t]*" "\\|" "^[ \t]*rep"
  		      "\\)"))
  	(quit-regex2 (concat
--- 355,363 ----
    (setq vip-incomplete-ex-cmd t)
    (let ((quit-regex1 (concat
! 		      "\\(" "set[ \t]*"
! 		      "\\|" "edit[ \t]*"
! 		      "\\|" "[nN]ext[ \t]*"
! 		      "\\|" "unm[ \t]*"
! 		      "\\|" "^[ \t]*rep"
  		      "\\)"))
  	(quit-regex2 (concat
*************** reversed.")
*** 357,367 ****
  		      "*[ \t]*$"))
  	(stay-regex (concat
! 		     "\\("
! 		     "^[ \t]*$" "\\|" "[ktgjmsz][ \t]*$" "\\|" "^[ \t]*ab.*"
! 		     "\\|" "tr[ansfer \t]*" "\\|" "sr[ \t]*"
! 		     "\\|" "mo.*" "\\|" "^[ \t]*k?ma[^p]*"
! 		     "\\|" "^[ \t]*fi.*" "\\|" "v?gl.*" "\\|" "[vg][ \t]*$"
! 		     "\\|" "jo.*" "\\|" "^[ \t]*ta.*" "\\|" "^[ \t]*una.*"
! 		     "\\|" "^[ \t]*su.*" "\\|['`][a-z][ \t]*"
  		     "\\|" "![ \t]*[a-zA-Z].*"
  		     "\\)"
--- 368,387 ----
  		      "*[ \t]*$"))
  	(stay-regex (concat
! 		     "\\(" "^[ \t]*$"
! 		     "\\|" "[?/].*[?/].*"
! 		     "\\|" "[ktgjmsz][ \t]*$"
! 		     "\\|" "^[ \t]*ab.*"
! 		     "\\|" "tr[ansfer \t]*"
! 		     "\\|" "sr[ \t]*"
! 		     "\\|" "mo.*"
! 		     "\\|" "^[ \t]*k?ma[^p]*"
! 		     "\\|" "^[ \t]*fi.*"
! 		     "\\|" "v?gl.*"
! 		     "\\|" "[vg][ \t]*$"
! 		     "\\|" "jo.*"
! 		     "\\|" "^[ \t]*ta.*"
! 		     "\\|" "^[ \t]*una.*"
! 		     "\\|" "^[ \t]*su.*"
! 		     "\\|['`][a-z][ \t]*"
  		     "\\|" "![ \t]*[a-zA-Z].*"
  		     "\\)"
*************** reversed.")
*** 477,481 ****
  		   ))
  	    ((eq ex-token-type 'non-command)
! 	     (error (format "`%s': %s" ex-token vip-BadExCommand)))
  	    ((eq ex-token-type 'whole)
  	     (setq address nil)
--- 497,501 ----
  		   ))
  	    ((eq ex-token-type 'non-command)
! 	     (error "`%s': %s" ex-token vip-BadExCommand))
  	    ((eq ex-token-type 'whole)
  	     (setq address nil)
*************** reversed.")
*** 719,723 ****
        (setq pf (ex-next nil t))) ; this finds alternative file name
      (if (and (null cf) (string-match "[^\\]%\\|\\`%" cmd))
! 	(error "No current file to substitute for `\%'"))
      (if (and (null pf) (string-match "[^\\]#\\|\\`#" cmd))
  	(error "No alternate file to substitute for `#'"))
--- 739,743 ----
        (setq pf (ex-next nil t))) ; this finds alternative file name
      (if (and (null cf) (string-match "[^\\]%\\|\\`%" cmd))
! 	(error "No current file to substitute for `%%'"))
      (if (and (null pf) (string-match "[^\\]#\\|\\`#" cmd))
  	(error "No alternate file to substitute for `#'"))
*************** reversed.")
*** 827,833 ****
    ;; don't exit if directory---ex-commands don't 
    (cond ((ex-cmd-accepts-multiple-files-p ex-token) (exit-minibuffer))
! 	(t (minibuffer-complete-word))))
!      
! 	       
  (defun ex-cmd-accepts-multiple-files-p (token)
    (member token '("edit" "next" "Next")))
--- 847,867 ----
    ;; don't exit if directory---ex-commands don't 
    (cond ((ex-cmd-accepts-multiple-files-p ex-token) (exit-minibuffer))
! 	;; apparently the argument to an Ex command is
! 	;; supposed to be a shell command
! 	((vip-looking-back "^[ \t]*!.*")
! 	 (setq ex-cmdfile t)
! 	 (insert " "))
! 	(t
! 	 (setq ex-cmdfile nil)
! 	 (minibuffer-complete-word))))
! 
! (defun vip-handle-! ()
!   (interactive)
!   (if (and (string=
! 	    (buffer-string) (vip-abbreviate-file-name default-directory))
! 	   (member ex-token '("read" "write")))
!       (erase-buffer))
!   (insert "!"))
! 
  (defun ex-cmd-accepts-multiple-files-p (token)
    (member token '("edit" "next" "Next")))
*************** reversed.")
*** 841,845 ****
  	 beg end cont val)
      
!     (vip-add-keymap ex-read-filename-map minibuffer-local-completion-map) 
  		    
      (setq cont (setq vip-keep-reading-filename t))
--- 875,882 ----
  	 beg end cont val)
      
!     (vip-add-keymap ex-read-filename-map
! 		    (if vip-emacs-p 
! 			minibuffer-local-completion-map
! 		      read-file-name-map)) 
  		    
      (setq cont (setq vip-keep-reading-filename t))
*************** reversed.")
*** 932,951 ****
  	     (string= ex-token "insert")
  	     (string= ex-token "open"))
! 	 (error
! 	  (format "`%s': Obsolete command, not supported by Viper"
! 		  ex-token)))
  	((or (string= ex-token "abbreviate")
  	     (string= ex-token "unabbreviate"))
  	 (error
! 	  (format
! 	   "`%s': Vi-style abbrevs are obsolete. Use the more powerful Emacs abbrevs"
! 	   ex-token)))
  	((or (string= ex-token "list")
  	     (string= ex-token "print")
  	     (string= ex-token "z")
  	     (string= ex-token "#"))
! 	 (error
! 	  (format "`%s': Command not implemented in Viper" ex-token)))
! 	(t (error (format "`%s': %s" ex-token vip-BadExCommand)))))
  
  (defun vip-undisplayed-files ()
--- 969,984 ----
  	     (string= ex-token "insert")
  	     (string= ex-token "open"))
! 	 (error "`%s': Obsolete command, not supported by Viper" ex-token))
  	((or (string= ex-token "abbreviate")
  	     (string= ex-token "unabbreviate"))
  	 (error
! 	  "`%s': Vi abbrevs are obsolete. Use the more powerful Emacs abbrevs"
! 	  ex-token))
  	((or (string= ex-token "list")
  	     (string= ex-token "print")
  	     (string= ex-token "z")
  	     (string= ex-token "#"))
! 	 (error "`%s': Command not implemented in Viper" ex-token))
! 	(t (error "`%s': %s" ex-token vip-BadExCommand))))
  
  (defun vip-undisplayed-files ()
*************** reversed.")
*** 1072,1076 ****
        (vip-get-ex-file))
    (cond ((and (string= ex-file "") buffer-file-name)
! 	 (setq ex-file  (abbreviate-file-name (buffer-file-name))))
  	((string= ex-file "")
  	 (error vip-NoFileSpecified)))
--- 1105,1109 ----
        (vip-get-ex-file))
    (cond ((and (string= ex-file "") buffer-file-name)
! 	 (setq ex-file  (vip-abbreviate-file-name (buffer-file-name))))
  	((string= ex-file "")
  	 (error vip-NoFileSpecified)))
*************** reversed.")
*** 1315,1319 ****
        (if find-alt-file (car l)
  	(progn
! 	  (if (car l)
  	      (let* ((w (if cycle-other-window
  			    (get-lru-window) (selected-window)))
--- 1348,1352 ----
        (if find-alt-file (car l)
  	(progn
! 	  (if (and (car l) (get-file-buffer (car l)))
  	      (let* ((w (if cycle-other-window
  			    (get-lru-window) (selected-window)))
*************** reversed.")
*** 1352,1362 ****
  	(error "Didn't find buffer %S or file %S"
  	       file-or-buffer-name
! 	       (abbreviate-file-name (expand-file-name file-or-buffer-name))))
  	  
      (if (equal buf (current-buffer))
  	(or no-recursion
  	    ;; try again
! 	    (setq skip-rest t)
! 	    (ex-next-related-buffer direction 'norecursion)))
  	
      (if skip-rest
--- 1385,1397 ----
  	(error "Didn't find buffer %S or file %S"
  	       file-or-buffer-name
! 	       (vip-abbreviate-file-name
! 		(expand-file-name file-or-buffer-name))))
  	  
      (if (equal buf (current-buffer))
  	(or no-recursion
  	    ;; try again
! 	    (progn
! 	      (setq skip-rest t)
! 	      (ex-next-related-buffer direction 'norecursion))))
  	
      (if skip-rest
*************** reversed.")
*** 1415,1419 ****
  (defun ex-read ()
    (vip-get-ex-file)
!   (let ((point (if (null ex-addresses) (point) (car ex-addresses))))
      (goto-char point)
      (vip-add-newline-at-eob-if-necessary)
--- 1450,1455 ----
  (defun ex-read ()
    (vip-get-ex-file)
!   (let ((point (if (null ex-addresses) (point) (car ex-addresses)))
! 	command)
      (goto-char point)
      (vip-add-newline-at-eob-if-necessary)
*************** reversed.")
*** 1425,1429 ****
  	  (setq ex-file buffer-file-name)))
      (if ex-cmdfile
! 	(shell-command ex-file t)
        (insert-file-contents ex-file)))
    (ex-fixup-history vip-last-ex-prompt ex-file))
--- 1461,1467 ----
  	  (setq ex-file buffer-file-name)))
      (if ex-cmdfile
! 	(progn
! 	  (setq command (ex-expand-filsyms ex-file (current-buffer)))
! 	  (shell-command command t))
        (insert-file-contents ex-file)))
    (ex-fixup-history vip-last-ex-prompt ex-file))
*************** reversed.")
*** 1498,1504 ****
--- 1536,1555 ----
      (cond ((member var '("ai" "autoindent"))
  	   (setq var "vip-auto-indent"
+ 		 set-cmd "setq"
+ 		 ask-if-save nil
+ 		 val "t"))
+ 	  ((member var '("gai" "global-autoindent"))
+ 	   (kill-local-variable 'vip-auto-indent)
+ 	   (setq var "vip-auto-indent"
+ 		 set-cmd "setq-default"
  		 val "t"))
  	  ((member var '("noai" "noautoindent"))
  	   (setq var "vip-auto-indent"
+ 		 ask-if-save nil
+ 		 val "nil"))
+ 	  ((member var '("gnoai" "global-noautoindent"))
+ 	   (kill-local-variable 'vip-auto-indent)
+ 	   (setq var "vip-auto-indent"
+ 		 set-cmd "setq-default"
  		 val "nil"))
  	  ((member var '("ic" "ignorecase"))
*************** reversed.")
*** 1534,1538 ****
      (if (eq val 0) ; value must be set by the user
  	(let ((cursor-in-echo-area t))
! 	  (message (format ":set %s = <Value>" var))
  	  ;; if there are unread events, don't wait
  	  (or (vip-set-unread-command-events "") (sit-for 2))
--- 1585,1589 ----
      (if (eq val 0) ; value must be set by the user
  	(let ((cursor-in-echo-area t))
! 	  (message ":set %s = <Value>" var)
  	  ;; if there are unread events, don't wait
  	  (or (vip-set-unread-command-events "") (sit-for 2))
*************** reversed.")
*** 1542,1546 ****
  	  ;; check numerical values
  	  (if (member var
! 		      '("sw" "shiftwidth" "ts" "tabstop" "wm" "wrapmargin"))
  	      (condition-case nil
  		  (or (numberp (setq val2 (car (read-from-string val))))
--- 1593,1600 ----
  	  ;; check numerical values
  	  (if (member var
! 		      '("sw" "shiftwidth"
! 			"ts" "tabstop"
! 			"gts" "global-tabstop"
! 			"wm" "wrapmargin")) 
  	      (condition-case nil
  		  (or (numberp (setq val2 (car (read-from-string val))))
*************** reversed.")
*** 1554,1564 ****
  	   ((member var '("ts" "tabstop"))
  	    ;; make it take effect in curr buff and new bufs
- 	    (kill-local-variable 'tab-width)
- 	    (setq var "tab-width"
- 		  set-cmd "setq-default"))
- 	   ((member var '("tsl" "tab-stop-local"))
  	    (setq var "tab-width"
  		  set-cmd "setq"
  		  ask-if-save nil))
  	   ((member var '("wm" "wrapmargin"))
  	    ;; make it take effect in curr buff and new bufs
--- 1608,1618 ----
  	   ((member var '("ts" "tabstop"))
  	    ;; make it take effect in curr buff and new bufs
  	    (setq var "tab-width"
  		  set-cmd "setq"
  		  ask-if-save nil))
+ 	   ((member var '("gts" "global-tabstop"))
+ 	    (kill-local-variable 'tab-width)
+ 	    (setq var "tab-width"
+ 		  set-cmd "setq-default"))
  	   ((member var '("wm" "wrapmargin"))
  	    ;; make it take effect in curr buff and new bufs
*************** reversed.")
*** 1603,1609 ****
  	  ))
      
!     (message (format "%s %s %s" set-cmd var (if (string-match "^[ \t]*$" val)
! 						(format "%S" val)
! 					      val)))
      (eval (car (read-from-string actual-lisp-cmd)))
  	(if (string= var "fill-column")
--- 1657,1663 ----
  	  ))
      
!     (message "%s %s %s" set-cmd var (if (string-match "^[ \t]*$" val)
! 					(format "%S" val)
! 				      val))
      (eval (car (read-from-string actual-lisp-cmd)))
  	(if (string= var "fill-column")
*************** reversed.")
*** 1649,1653 ****
        (progn
  	(pop-to-buffer (get-buffer-create "*info*"))
! 	(info "viper.info")
  	(message "Type `i' to search for a specific topic"))
      (error (beep 1)
--- 1703,1707 ----
        (progn
  	(pop-to-buffer (get-buffer-create "*info*"))
! 	(info (if vip-xemacs-p "viper.info" "viper"))
  	(message "Type `i' to search for a specific topic"))
      (error (beep 1)
*************** Please contact your system administrator
*** 1729,1733 ****
  			  (if (not (stringp repl))
  			      (error "Can't perform Ex substitution: No previous replacement pattern"))
! 			  (replace-match repl t t))))
  		  (end-of-line)
  		  (vip-forward-char-carefully))
--- 1783,1787 ----
  			  (if (not (stringp repl))
  			      (error "Can't perform Ex substitution: No previous replacement pattern"))
! 			  (replace-match repl t))))
  		  (end-of-line)
  		  (vip-forward-char-carefully))
*************** Please contact your system administrator
*** 1741,1745 ****
  		    (if (not (stringp repl))
  			(error "Can't perform Ex substitution: No previous replacement pattern"))
! 		    (replace-match repl t t)))
  	      (end-of-line)
  	      (vip-forward-char-carefully))))))
--- 1795,1799 ----
  		    (if (not (stringp repl))
  			(error "Can't perform Ex substitution: No previous replacement pattern"))
! 		    (replace-match repl t)))
  	      (end-of-line)
  	      (vip-forward-char-carefully))))))
*************** Please contact your system administrator
*** 1849,1853 ****
  (defun ex-write-info (exists file-name beg end)
    (message "`%s'%s %d lines, %d characters"
! 	   (abbreviate-file-name file-name)
  	   (if exists "" " [New file]")
  	   (count-lines beg (min (1+ end) (point-max)))
--- 1903,1907 ----
  (defun ex-write-info (exists file-name beg end)
    (message "`%s'%s %d lines, %d characters"
! 	   (vip-abbreviate-file-name file-name)
  	   (if exists "" " [New file]")
  	   (count-lines beg (min (1+ end) (point-max)))
*************** Please contact your system administrator
*** 1916,1925 ****
  (defun vip-info-on-file ()
    (interactive)
!   (let (file info)
!     (setq file (if (buffer-file-name)
! 		   (concat (abbreviate-file-name (buffer-file-name)) ":")
  		 (concat (buffer-name) " [Not visiting any file]:"))
  	  info (format "line=%d/%d pos=%d/%d col=%d %s"
! 		       (count-lines (point-min) (vip-line-pos 'end))
  		       (count-lines (point-min) (point-max))
  		       (point) (1- (point-max))
--- 1970,1984 ----
  (defun vip-info-on-file ()
    (interactive)
!   (let ((pos1 (vip-line-pos 'start))
! 	(pos2 (vip-line-pos 'end))
! 	lines file info)
!     (setq lines (count-lines (point-min) (vip-line-pos 'end))
! 	  file (if (buffer-file-name)
! 		   (concat (vip-abbreviate-file-name (buffer-file-name)) ":")
  		 (concat (buffer-name) " [Not visiting any file]:"))
  	  info (format "line=%d/%d pos=%d/%d col=%d %s"
! 		       (if (= pos1 pos2)
! 			   (1+ lines)
! 			 lines)
  		       (count-lines (point-min) (point-max))
  		       (point) (1- (point-max))
*************** Please contact your system administrator
*** 1934,1938 ****
  			 file "\n\n\t" info
  			 "\n\n\nPress any key to continue...\n\n")))
! 	(vip-read-event)))
      ))
  
--- 1993,1998 ----
  			 file "\n\n\t" info
  			 "\n\n\nPress any key to continue...\n\n")))
! 	(vip-read-event)
! 	(kill-buffer " *vip-info*")))
      ))
  
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/viper-keym.el emacs-19.31/lisp/viper-keym.el
*** emacs-19.30/lisp/viper-keym.el	Mon Oct 30 12:33:01 1995
--- emacs-19.31/lisp/viper-keym.el	Thu Mar 28 19:40:03 1996
***************
*** 1,5 ****
! ;;; viper-keym.el --- main Viper keymaps
  
! ;; Copyright (C) 1994, 1995 Free Software Foundation, Inc.
  
  ;; This file is part of GNU Emacs.
--- 1,5 ----
! ;;; viper-keym.el --- Viper keymaps
  
! ;; Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc.
  
  ;; This file is part of GNU Emacs.
***************
*** 16,22 ****
  
  ;; 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.
  
  
  (require 'viper-util)
--- 16,24 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
+ ;; Code
  
  (require 'viper-util)
***************
*** 33,37 ****
  
  ;; keymap used to zap all keymaps other than function-key-map,
! ;; devide-function-key-map, etc.
  (defvar vip-overriding-map (make-sparse-keymap))
    
--- 35,39 ----
  
  ;; keymap used to zap all keymaps other than function-key-map,
! ;; device-function-key-map, etc.
  (defvar vip-overriding-map (make-sparse-keymap))
    
*************** vip-insert-basic-map. Not recommended, e
*** 365,368 ****
--- 367,371 ----
  (defvar ex-read-filename-map (make-sparse-keymap))
  (define-key ex-read-filename-map " " 'vip-complete-filename-or-exit)
+ (define-key ex-read-filename-map "!" 'vip-handle-!)
  
  
*************** Usage:
*** 405,408 ****
--- 408,425 ----
      (vip-normalize-minor-mode-map-alist)
      (vip-set-mode-vars-for vip-current-state)))
+ 
+ (defun vip-zap-local-keys ()
+   "Unconditionally reset Viper vip-*-local-user-map's.
+ Rarely useful, but if u made a mistake by switching to a mode that adds
+ undesirable local keys, e.g., comint-mode, then this function can return
+ you to sanity."
+   (interactive)
+   (setq vip-vi-local-user-map (make-sparse-keymap)
+ 	vip-need-new-vi-local-map nil
+ 	vip-insert-local-user-map (make-sparse-keymap)
+ 	vip-need-new-insert-local-map nil
+ 	vip-emacs-local-user-map (make-sparse-keymap)
+ 	vip-need-new-emacs-local-map nil)
+   (vip-normalize-minor-mode-map-alist))
      
  
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/viper-macs.el emacs-19.31/lisp/viper-macs.el
*** emacs-19.30/lisp/viper-macs.el	Mon Oct 30 12:33:29 1995
--- emacs-19.31/lisp/viper-macs.el	Thu Mar 28 19:40:09 1996
***************
*** 1,5 ****
  ;;; viper-macs.el --- functions implementing keyboard macros for Viper
  
! ;; Copyright (C) 1994, 1995 Free Software Foundation, Inc.
  
  ;; This file is part of GNU Emacs.
--- 1,5 ----
  ;;; viper-macs.el --- functions implementing keyboard macros for Viper
  
! ;; Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc.
  
  ;; This file is part of GNU Emacs.
***************
*** 16,24 ****
  
  ;; 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.
  
  
  (require 'viper-util)
  
  ;;; Variables
--- 16,28 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
+ ;; Code
  
  (require 'viper-util)
+ (require 'viper-keym)
+ 
  
  ;;; Variables
*************** a key is a symbol, e.g., `a', `\\1', `f2
*** 151,158 ****
  	    (setq key-seq (subseq key-seq 0 (- (length key-seq) 2))))
  	(setq message
! 	      (format ":map%s %s"
! 		 variant (if (> (length key-seq) 0)
! 			     (prin1-to-string (vip-display-macro key-seq))
! 			   "")))
  	(message message)
  	(setq event (vip-read-key))
--- 155,163 ----
  	    (setq key-seq (subseq key-seq 0 (- (length key-seq) 2))))
  	(setq message
! 	      (format
! 	       ":map%s %s"
! 	       variant (if (> (length key-seq) 0)
! 			   (prin1-to-string (vip-display-macro key-seq))
! 			 "")))
  	(message message)
  	(setq event (vip-read-key))
*************** a key is a symbol, e.g., `a', `\\1', `f2
*** 216,233 ****
  	       (setq key-seq (subseq key-seq 0 (1- (length key-seq))))
  	       (setq message 
! 		     (format ":unmap%s %s"
! 			     variant (if (> (length key-seq) 0)
! 					 (prin1-to-string
! 					  (vip-display-macro key-seq))
! 				       "")))
! 	       (setq key-seq
! 		     (vip-do-sequence-completion key-seq macro-alist message))
! 	       ))
! 	(setq message 
! 	      (format ":unmap%s %s"
  		      variant (if (> (length key-seq) 0)
  				  (prin1-to-string
  				   (vip-display-macro key-seq))
  				"")))
  	(message message)
  	(setq event (vip-read-key))
--- 221,240 ----
  	       (setq key-seq (subseq key-seq 0 (1- (length key-seq))))
  	       (setq message 
! 		     (format
! 		      ":unmap%s %s"
  		      variant (if (> (length key-seq) 0)
  				  (prin1-to-string
  				   (vip-display-macro key-seq))
  				"")))
+ 	       (setq key-seq
+ 		     (vip-do-sequence-completion key-seq macro-alist message))
+ 	       ))
+ 	(setq message 
+ 	      (format
+ 	       ":unmap%s %s"
+ 	       variant (if (> (length key-seq) 0)
+ 			   (prin1-to-string
+ 			    (vip-display-macro key-seq))
+ 			 "")))
  	(message message)
  	(setq event (vip-read-key))
*************** a key is a symbol, e.g., `a', `\\1', `f2
*** 254,259 ****
      
      
  (defun vip-end-mapping-kbd-macro (&optional ignore)
-   "Terminate kbd macro."
    (interactive)
    (define-key vip-vi-intercept-map "\C-x)" nil)
--- 261,269 ----
      
      
+ ;; Terminate a Vi kbd macro.
+ ;; optional argument IGNORE, if t, indicates that we are dealing with an
+ ;; existing macro that needs to be registered, but there is no need to
+ ;; terminate a kbd macro.
  (defun vip-end-mapping-kbd-macro (&optional ignore)
    (interactive)
    (define-key vip-vi-intercept-map "\C-x)" nil)
*************** If SCOPE is nil, the user is asked to sp
*** 392,397 ****
  			 state-name))
  		  t)))
! 	  (if (y-or-n-p (format "Save this macro in %s? "
! 				(abbreviate-file-name vip-custom-file-name)))
  	      (vip-save-string-in-file 
  	       (format "\n(vip-record-kbd-macro %S '%S %s '%S)"
--- 402,408 ----
  			 state-name))
  		  t)))
! 	  (if (y-or-n-p
! 	       (format "Save this macro in %s? "
! 		       (vip-abbreviate-file-name vip-custom-file-name)))
  	      (vip-save-string-in-file 
  	       (format "\n(vip-record-kbd-macro %S '%S %s '%S)"
*************** there."
*** 641,647 ****
    (princ "\n   ** Global:")
    (if (vip-kbd-global-definition macro)
!       (princ 
!        (format "\n           %S" 
! 	       (cdr (vip-kbd-global-pair macro))))
      (princ "  none"))
    (princ "\n"))
--- 652,656 ----
    (princ "\n   ** Global:")
    (if (vip-kbd-global-definition macro)
!       (princ (format "\n           %S" (cdr (vip-kbd-global-pair macro))))
      (princ "  none"))
    (princ "\n"))
*************** there."
*** 771,783 ****
  ;; if seq of Viper key symbols (representing a macro) can be converted to a
  ;; string--do so. Otherwise, do nothing.
! (defun vip-display-macro (macro-name)
!   (cond ((vip-char-symbol-sequence-p macro-name)
! 	 (mapconcat 'symbol-name macro-name ""))
! 	((vip-char-array-p macro-name)
! 	 (mapconcat 'char-to-string macro-name ""))
! 	(t macro-name)))
!     
  (defun vip-events-to-macro (event-seq)
!   (vconcat (mapcar 'vip-event-key event-seq)))
    
  ;; convert strings or arrays of characters to Viper macro form
--- 780,805 ----
  ;; if seq of Viper key symbols (representing a macro) can be converted to a
  ;; string--do so. Otherwise, do nothing.
! (defun vip-display-macro (macro-name-or-body)
!   (cond ((vip-char-symbol-sequence-p macro-name-or-body)
! 	 (mapconcat 'symbol-name macro-name-or-body ""))
! 	((vip-char-array-p macro-name-or-body)
! 	 (mapconcat 'char-to-string macro-name-or-body ""))
! 	(t macro-name-or-body)))
!     
! ;; convert sequence of events (that came presumably from emacs kbd macro) into
! ;; Viper's macro, which is a vector of the form
! ;; [ desc desc ... ]
! ;; Each desc is either a symbol of (meta symb), (shift symb), etc.
! ;; Here we purge events that happen to be lists. In most cases, these events
! ;; got into a macro definition unintentionally; say, when the user moves mouse
! ;; during a macro definition, then something like (switch-frame ...) might get
! ;; in. Another reason for purging lists-events is that we can't store them in
! ;; textual form (say, in .emacs) and then read them back.
  (defun vip-events-to-macro (event-seq)
!   (vconcat (delq nil (mapcar (function (lambda (elt)
! 					 (if (consp elt)
! 					     nil
! 					   (vip-event-key elt))))
! 			     event-seq))))
    
  ;; convert strings or arrays of characters to Viper macro form
*************** there."
*** 790,797 ****
      (vconcat (mapcar 'vip-event-key macro))))
      
! ;; For macros bodies and names, goes over and checks if all members are
  ;; names of keys (actually, it only checks if they are symbols or lists
! ;; if a digit is found, it is converted into a symbol (0 -> \0, etc).
! ;; If not list or vector, doesn't change its argument
  (defun vip-fixup-macro (macro)
    (let ((len (length macro))
--- 812,819 ----
      (vconcat (mapcar 'vip-event-key macro))))
      
! ;; For macros bodies and names, goes over MACRO and checks if all members are
  ;; names of keys (actually, it only checks if they are symbols or lists
! ;; if a digit is found, it is converted into a symbol (e.g., 0 -> \0, etc).
! ;; If MACRO is not a list or vector -- doesn't change MACRO.
  (defun vip-fixup-macro (macro)
    (let ((len (length macro))
*************** there."
*** 812,816 ****
  				    (intern (char-to-string (+ ?0 elt)))))
  			   )))
- 		;;(setq break t)))
  		((listp elt)
  		 (vip-fixup-macro elt))
--- 834,837 ----
*************** there."
*** 904,908 ****
  	       (vip-set-register-macro reg))))
  	  (t
! 	   (error (format "`%c': Unknown register" reg))))))
  	   
  
--- 925,929 ----
  	       (vip-set-register-macro reg))))
  	  (t
! 	   (error "`%c': Unknown register" reg)))))
  	   
  
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/viper-mous.el emacs-19.31/lisp/viper-mous.el
*** emacs-19.30/lisp/viper-mous.el	Mon Oct 30 12:33:55 1995
--- emacs-19.31/lisp/viper-mous.el	Thu Mar 28 19:40:14 1996
***************
*** 1,5 ****
  ;;; viper-mous.el --- mouse support for Viper
  
! ;; Copyright (C) 1994, 1995 Free Software Foundation, Inc.
  
  ;; This file is part of GNU Emacs.
--- 1,5 ----
  ;;; viper-mous.el --- mouse support for Viper
  
! ;; Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc.
  
  ;; This file is part of GNU Emacs.
***************
*** 16,25 ****
  
  ;; 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.
  
  
  (require 'viper-util)
  
  
  ;;; Variables
--- 16,32 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
+ ;; Code
  
  (require 'viper-util)
  
+ ;; compiler pacifier
+ (defvar double-click-time)
+ (defvar mouse-track-multi-click-time)
+ ;; end compiler pacifier
+ 
  
  ;;; Variables
*************** considered related.")
*** 70,74 ****
--- 77,106 ----
  (defsubst vip-multiclick-p ()
    (not (vip-sit-for-short vip-multiclick-timeout t)))
+ 
+ ;; Returns window where click occurs
+ (defsubst vip-mouse-click-window (click)
+   (if vip-xemacs-p
+       (event-window click)
+     (posn-window (event-start click))))
+ 
+ ;; Returns window where click occurs
+ (defsubst vip-mouse-click-frame (click)
+   (window-frame (vip-mouse-click-window click)))
+ 
+ ;; Returns the buffer of the window where click occurs
+ (defsubst vip-mouse-click-window-buffer (click)
+   (window-buffer (vip-mouse-click-window click)))
+ 
+ ;; Returns the name of the buffer in the window where click occurs
+ (defsubst vip-mouse-click-window-buffer-name (click)
+   (buffer-name (vip-mouse-click-window-buffer click)))
+ 
+ ;; Returns position of a click
+ (defsubst vip-mouse-click-posn (click)
+   (if vip-xemacs-p
+       (event-point click)
+     (posn-point (event-start click))))
  	     
+ 
  (defun vip-surrounding-word (count click-count)
     "Returns word surrounding point according to a heuristic.
*************** On single or double click, returns the w
*** 176,202 ****
  	click-word))))
  
- ;; Returns window where click occurs
- (defsubst vip-mouse-click-frame (click)
-   (window-frame (vip-mouse-click-window click)))
- 
- ;; Returns window where click occurs
- (defsubst vip-mouse-click-window (click)
-   (if vip-xemacs-p
-       (event-window click)
-     (posn-window (event-start click))))
- 
- ;; Returns the buffer of the window where click occurs
- (defsubst vip-mouse-click-window-buffer (click)
-   (window-buffer (vip-mouse-click-window click)))
- 
- ;; Returns the name of the buffer in the window where click occurs
- (defsubst vip-mouse-click-window-buffer-name (click)
-   (buffer-name (vip-mouse-click-window-buffer click)))
- 
- ;; Returns position of a click
- (defsubst vip-mouse-click-posn (click)
-   (if vip-xemacs-p
-       (event-point click)
-     (posn-point (event-start click))))
  
  (defun vip-mouse-click-insert-word (click arg)
--- 208,211 ----
*************** See `vip-surrounding-word' for the defin
*** 223,227 ****
  	 ;; This trick checks if there is a pending mouse event
  	 ;; if so, we use this latter event and discard the current mouse click
! 	 ;; If the next panding event is not a mouse event, we execute
  	 ;; the current mouse event
  	 (progn
--- 232,236 ----
  	 ;; This trick checks if there is a pending mouse event
  	 ;; if so, we use this latter event and discard the current mouse click
! 	 ;; If the next pending event is not a mouse event, we execute
  	 ;; the current mouse event
  	 (progn
*************** bindings in viper.el and in the Viper ma
*** 403,413 ****
  (cond ((vip-window-display-p)
         (let* ((search-key (if vip-xemacs-p
! 			      [(meta shift button1up)] [S-mouse-1]))
  	      (search-key-catch (if vip-xemacs-p
! 				    [(meta shift button1)] [S-down-mouse-1]))
  	      (insert-key (if vip-xemacs-p
! 			      [(meta shift button2up)] [S-mouse-2]))
  	      (insert-key-catch (if vip-xemacs-p
! 				    [(meta shift button2)] [S-down-mouse-2]))
  	      (search-key-unbound (and (not (key-binding search-key))
  				       (not (key-binding search-key-catch))))
--- 412,422 ----
  (cond ((vip-window-display-p)
         (let* ((search-key (if vip-xemacs-p
! 			      [(meta shift button1up)] [M-S-mouse-1]))
  	      (search-key-catch (if vip-xemacs-p
! 				    [(meta shift button1)] [M-S-down-mouse-1]))
  	      (insert-key (if vip-xemacs-p
! 			      [(meta shift button2up)] [M-S-mouse-2]))
  	      (insert-key-catch (if vip-xemacs-p
! 				    [(meta shift button2)] [M-S-down-mouse-2]))
  	      (search-key-unbound (and (not (key-binding search-key))
  				       (not (key-binding search-key-catch))))
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/viper-util.el emacs-19.31/lisp/viper-util.el
*** emacs-19.30/lisp/viper-util.el	Fri Oct 13 22:18:14 1995
--- emacs-19.31/lisp/viper-util.el	Thu Mar 28 19:40:21 1996
***************
*** 1,4 ****
  ;;; viper-util.el --- Utilities used by viper.el
! ;; Copyright (C) 1994, 1995 Free Software Foundation, Inc.
  
  ;; This file is part of GNU Emacs.
--- 1,5 ----
  ;;; viper-util.el --- Utilities used by viper.el
! 
! ;; Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc.
  
  ;; This file is part of GNU Emacs.
***************
*** 15,26 ****
  
  ;; 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.
  
  (require 'ring)
  
! ;; Whether it is XEmacs or not
  (defconst vip-xemacs-p (string-match "\\(Lucid\\|XEmacs\\)" emacs-version))
! ;; Whether it is Emacs or not
  (defconst vip-emacs-p (not vip-xemacs-p))
  ;; Tell whether we are running as a window application or on a TTY
--- 16,51 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
! 
! 
! ;; Code
  
  (require 'ring)
  
! ;; Compiler pacifier
! (defvar vip-overriding-map)
! (defvar pm-color-alist)
! (defvar zmacs-region-stays)
! (defvar vip-search-face)
! (defvar vip-minibuffer-current-face)
! (defvar vip-minibuffer-insert-face)
! (defvar vip-minibuffer-vi-face)
! (defvar vip-minibuffer-emacs-face)
! (defvar vip-replace-overlay-face)
! (defvar vip-minibuffer-overlay)
! (defvar vip-replace-overlay)
! (defvar vip-search-overlay)
! (defvar vip-replace-overlay-cursor-color)
! (defvar vip-intermediate-command)
! (defvar vip-use-replace-region-delimiters)
! (defvar vip-fast-keyseq-timeout)
! (defvar vip-related-files-and-buffers-ring)
! ;; end compiler pacifier
! 
! ;; Is it XEmacs?
  (defconst vip-xemacs-p (string-match "\\(Lucid\\|XEmacs\\)" emacs-version))
! ;; Is it Emacs?
  (defconst vip-emacs-p (not vip-xemacs-p))
  ;; Tell whether we are running as a window application or on a TTY
***************
*** 30,36 ****
      (device-type (selected-device))))
  ;; in XEmacs: device-type is tty on tty and stream in batch.
! (defsubst vip-window-display-p ()
    (and (vip-device-type) (not (memq (vip-device-type) '(tty stream)))))
  
  
  ;;; Macros
--- 55,72 ----
      (device-type (selected-device))))
  ;; in XEmacs: device-type is tty on tty and stream in batch.
! (defun vip-window-display-p ()
    (and (vip-device-type) (not (memq (vip-device-type) '(tty stream)))))
  
+ (defvar vip-force-faces nil
+   "If t, Viper will think that it is running on a display that supports faces.
+ This is provided as a temporary relief for users of face-capable displays
+ that Viper doesn't know about.")
+ 
+ (defun vip-has-face-support-p ()
+   (cond ((vip-window-display-p))
+ 	(vip-force-faces)
+ 	(vip-emacs-p (memq (vip-device-type) '(pc)))
+ 	(vip-xemacs-p (memq (vip-device-type) '(tty pc)))))
+ 
  
  ;;; Macros
***************
*** 129,133 ****
        (if (vip-window-display-p)
  	  (fset 'vip-iconify (symbol-function 'iconify-frame)))
!       (cond ((vip-window-display-p)
  	     (fset 'vip-get-face (symbol-function 'get-face))
  	     (fset 'vip-color-defined-p
--- 165,169 ----
        (if (vip-window-display-p)
  	  (fset 'vip-iconify (symbol-function 'iconify-frame)))
!       (cond ((vip-has-face-support-p)
  	     (fset 'vip-get-face (symbol-function 'get-face))
  	     (fset 'vip-color-defined-p
***************
*** 144,148 ****
    (if (vip-window-display-p)
        (fset 'vip-iconify (symbol-function 'iconify-or-deiconify-frame)))
!   (cond ((vip-window-display-p)
  	 (fset 'vip-get-face (symbol-function 'internal-get-face))
  	 (fset 'vip-color-defined-p (symbol-function 'x-color-defined-p))
--- 180,184 ----
    (if (vip-window-display-p)
        (fset 'vip-iconify (symbol-function 'iconify-or-deiconify-frame)))
!   (cond ((vip-has-face-support-p)
  	 (fset 'vip-get-face (symbol-function 'internal-get-face))
  	 (fset 'vip-color-defined-p (symbol-function 'x-color-defined-p))
***************
*** 153,156 ****
--- 189,195 ----
        (x-display-color-p)
      (eq (device-class (selected-device)) 'color)))
+    
+ (defsubst vip-get-cursor-color ()
+   (cdr (assoc 'cursor-color (frame-parameters))))
    
  ;; OS/2
***************
*** 171,175 ****
      ))
  
! ;; currently doesn't work for XEmacs
  (defun vip-change-cursor-color (new-color)
    (if (and (vip-window-display-p)  (vip-color-display-p)
--- 210,218 ----
      ))
  
! (defun vip-hide-face (face)
!   (if (and (vip-has-face-support-p) vip-emacs-p)
!       (add-to-list 'facemenu-unlisted-faces face)))
! 
! ;; cursor colors
  (defun vip-change-cursor-color (new-color)
    (if (and (vip-window-display-p)  (vip-color-display-p)
***************
*** 189,195 ****
    (vip-change-cursor-color
     (vip-overlay-get vip-replace-overlay 'vip-cursor-color)))
-    
- (defsubst vip-get-cursor-color ()
-   (cdr (assoc 'cursor-color (frame-parameters))))
  	 
  
--- 232,235 ----
***************
*** 550,554 ****
    
    (vip-overlay-put vip-search-overlay 'priority vip-search-overlay-priority)
!   (if (vip-window-display-p)
        (progn
  	(vip-overlay-put vip-search-overlay 'face vip-search-face)
--- 590,594 ----
    
    (vip-overlay-put vip-search-overlay 'priority vip-search-overlay-priority)
!   (if (vip-has-face-support-p)
        (progn
  	(vip-overlay-put vip-search-overlay 'face vip-search-face)
***************
*** 558,576 ****
  ;; Replace state
  
  (defun vip-set-replace-overlay (beg end)
    (if (vip-overlay-p vip-replace-overlay)
        (vip-move-replace-overlay beg end)
      (setq vip-replace-overlay (vip-make-overlay beg end (current-buffer)))
!     (vip-overlay-put vip-replace-overlay
! 		     'vip-start 
! 		     (move-marker (make-marker)
! 				  (vip-overlay-start vip-replace-overlay)))
!     (vip-overlay-put vip-replace-overlay
! 		     'vip-end 
! 		     (move-marker (make-marker)
! 				  (vip-overlay-end vip-replace-overlay)))
      (vip-overlay-put 
       vip-replace-overlay 'priority vip-replace-overlay-priority)) 
!   (if (vip-window-display-p)
        (vip-overlay-put vip-replace-overlay 'face vip-replace-overlay-face))
    (vip-save-cursor-color)
--- 598,614 ----
  ;; Replace state
  
+ (defsubst vip-move-replace-overlay (beg end)
+   (vip-move-overlay vip-replace-overlay beg end))
+   
  (defun vip-set-replace-overlay (beg end)
    (if (vip-overlay-p vip-replace-overlay)
        (vip-move-replace-overlay beg end)
      (setq vip-replace-overlay (vip-make-overlay beg end (current-buffer)))
!     ;; never detach
!     (vip-overlay-put
!      vip-replace-overlay (if vip-emacs-p 'evaporate 'detachable) nil)
      (vip-overlay-put 
       vip-replace-overlay 'priority vip-replace-overlay-priority)) 
!   (if (vip-has-face-support-p)
        (vip-overlay-put vip-replace-overlay 'face vip-replace-overlay-face))
    (vip-save-cursor-color)
***************
*** 578,607 ****
    )
    
- 
-   
- (defsubst vip-hide-replace-overlay ()
-   (vip-set-replace-overlay-glyphs nil nil)
-   (vip-restore-cursor-color)
-   (if (vip-window-display-p)
-       (vip-overlay-put vip-replace-overlay 'face nil)))
        
  (defsubst vip-set-replace-overlay-glyphs (before-glyph after-glyph)
!   (if (or (not (vip-window-display-p))
! 	   vip-use-replace-region-delimiters)
        (let ((before-name (if vip-xemacs-p 'begin-glyph 'before-string))
  	    (after-name (if vip-xemacs-p 'end-glyph 'after-string)))
  	(vip-overlay-put vip-replace-overlay before-name before-glyph)
  	(vip-overlay-put vip-replace-overlay after-name after-glyph))))
  
      
  (defsubst vip-replace-start ()
!   (vip-overlay-get vip-replace-overlay 'vip-start))
  (defsubst vip-replace-end ()
!   (vip-overlay-get vip-replace-overlay 'vip-end))
!   
! (defsubst vip-move-replace-overlay (beg end)
!   (vip-move-overlay vip-replace-overlay beg end)
!   (move-marker (vip-replace-start) (vip-overlay-start vip-replace-overlay))
!   (move-marker (vip-replace-end) (vip-overlay-end vip-replace-overlay)))
   
  
--- 616,639 ----
    )
    
        
  (defsubst vip-set-replace-overlay-glyphs (before-glyph after-glyph)
!   (if (or (not (vip-has-face-support-p))
! 	  vip-use-replace-region-delimiters)
        (let ((before-name (if vip-xemacs-p 'begin-glyph 'before-string))
  	    (after-name (if vip-xemacs-p 'end-glyph 'after-string)))
  	(vip-overlay-put vip-replace-overlay before-name before-glyph)
  	(vip-overlay-put vip-replace-overlay after-name after-glyph))))
+   
+ (defsubst vip-hide-replace-overlay ()
+   (vip-set-replace-overlay-glyphs nil nil)
+   (vip-restore-cursor-color)
+   (if (vip-has-face-support-p)
+       (vip-overlay-put vip-replace-overlay 'face nil)))
  
      
  (defsubst vip-replace-start ()
!   (vip-overlay-start vip-replace-overlay))
  (defsubst vip-replace-end ()
!   (vip-overlay-end vip-replace-overlay))
   
  
***************
*** 610,640 ****
  (defun vip-set-minibuffer-overlay ()
    (vip-check-minibuffer-overlay)
!   ;; We always move the minibuffer overlay, since in XEmacs
!   ;; this overlay may get detached. Moving will reattach it.
!   ;; This overlay is also moved via the vip-post-command-hook,
!   ;; to insure that it covers the whole minibuffer.
!   (vip-move-minibuffer-overlay)
!   (if (vip-window-display-p)
        (progn
  	(vip-overlay-put
  	 vip-minibuffer-overlay 'face vip-minibuffer-current-face)
  	(vip-overlay-put 
! 	 vip-minibuffer-overlay 'priority vip-minibuffer-overlay-priority))
! 	 ))
         
  (defun vip-check-minibuffer-overlay ()
!   (if (vip-overlay-p vip-minibuffer-overlay)
!       ()
!     (setq vip-minibuffer-overlay
! 	  (vip-make-overlay 1 (1+ (buffer-size)) (current-buffer)))))
  
- ;; arguments to this function are dummies. they are needed just because
- ;; it is used as a insert-in-front-hook to vip-minibuffer-overlay, and such
- ;; hooks require 3 arguments.
- (defun vip-move-minibuffer-overlay (&optional overl beg end)
-   (if (vip-is-in-minibuffer)
-       (progn
- 	(vip-check-minibuffer-overlay)
- 	(vip-move-overlay vip-minibuffer-overlay 1 (1+ (buffer-size))))))
  
  (defsubst vip-is-in-minibuffer ()
--- 642,672 ----
  (defun vip-set-minibuffer-overlay ()
    (vip-check-minibuffer-overlay)
!   (if (vip-has-face-support-p)
        (progn
  	(vip-overlay-put
  	 vip-minibuffer-overlay 'face vip-minibuffer-current-face)
  	(vip-overlay-put 
! 	 vip-minibuffer-overlay 'priority vip-minibuffer-overlay-priority)
! 	;; never detach
! 	(vip-overlay-put
! 	 vip-minibuffer-overlay (if vip-emacs-p 'evaporate 'detachable) nil)
! 	;; make vip-minibuffer-overlay open-ended
! 	;; In emacs, it is made open ended at creation time
! 	(if vip-xemacs-p
! 	    (progn
! 	      (vip-overlay-put vip-minibuffer-overlay 'start-open nil)
! 	      (vip-overlay-put vip-minibuffer-overlay 'end-open nil)))
! 	)))
         
  (defun vip-check-minibuffer-overlay ()
!   (or (vip-overlay-p vip-minibuffer-overlay)
!       (setq vip-minibuffer-overlay
! 	    (if vip-xemacs-p
! 		(vip-make-overlay 1 (1+ (buffer-size)) (current-buffer))
! 	      ;; make overlay open-ended
! 	      (vip-make-overlay
! 	       1 (1+ (buffer-size)) (current-buffer) nil 'rear-advance)))
!       ))
  
  
  (defsubst vip-is-in-minibuffer ()
***************
*** 644,647 ****
--- 676,685 ----
  
  ;;; XEmacs compatibility
+ 
+ (defun vip-abbreviate-file-name (file)
+   (if vip-emacs-p
+       (abbreviate-file-name file)
+     ;; XEmacs requires addl argument
+     (abbreviate-file-name file t)))
      
  ;; Sit for VAL milliseconds. XEmacs doesn't support the millisecond arg 
***************
*** 658,666 ****
      (member key ESC-keys)))
  	
- ;; like (set-mark-command nil) but doesn't push twice, if (car mark-ring)
- ;; is the same as (mark t).
- (defsubst vip-set-mark-if-necessary ()
-   (setq mark-ring (delete (vip-mark-marker) mark-ring))
-   (set-mark-command nil))
    
  (defsubst vip-mark-marker ()
--- 696,699 ----
***************
*** 668,671 ****
--- 701,710 ----
        (mark-marker t)
      (mark-marker)))
+ 
+ ;; like (set-mark-command nil) but doesn't push twice, if (car mark-ring)
+ ;; is the same as (mark t).
+ (defsubst vip-set-mark-if-necessary ()
+   (setq mark-ring (delete (vip-mark-marker) mark-ring))
+   (set-mark-command nil))
         
  ;; In transient mark mode (zmacs mode), it is annoying when regions become
***************
*** 767,771 ****
  
  ;; Emacs has a bug in eventp, which causes (eventp nil) to return (nil)
! ;; instead of nil, if '(nil) was previously inadvertantly assigned to
  ;; unread-command-events
  (defun vip-event-key (event)
--- 806,810 ----
  
  ;; Emacs has a bug in eventp, which causes (eventp nil) to return (nil)
! ;; instead of nil, if '(nil) was previously inadvertently assigned to
  ;; unread-command-events
  (defun vip-event-key (event)
***************
*** 792,796 ****
  		  ;; Emacs has the oddity whereby characters 128+char
  		  ;; represent M-char *if* this appears inside a string.
! 		  ;; So, we convert them manually into (mata char).
  		  ((and (numberp event) (< ?\C-? event) (<= event 255))
  		   (setq mod '(meta)
--- 831,835 ----
  		  ;; Emacs has the oddity whereby characters 128+char
  		  ;; represent M-char *if* this appears inside a string.
! 		  ;; So, we convert them manually to (meta char).
  		  ((and (numberp event) (< ?\C-? event) (<= event 255))
  		   (setq mod '(meta)
***************
*** 798,802 ****
  		  (t (event-basic-type event)))
  	    )))
-     
      (if (numberp basis)
  	(setq basis
--- 837,840 ----
***************
*** 804,812 ****
  		  (list 'control '\?) ; taking care of an emacs bug
  		(intern (char-to-string basis)))))
-     
      (if mod
  	(append mod (list basis))
!       basis)
!     ))
      
  (defun vip-key-to-emacs-key (key)
--- 842,848 ----
  		  (list 'control '\?) ; taking care of an emacs bug
  		(intern (char-to-string basis)))))
      (if mod
  	(append mod (list basis))
!       basis)))
      
  (defun vip-key-to-emacs-key (key)
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/viper.el emacs-19.31/lisp/viper.el
*** emacs-19.30/lisp/viper.el	Fri Nov 10 13:42:21 1995
--- emacs-19.31/lisp/viper.el	Thu Mar 28 19:40:39 1996
***************
*** 1,3 ****
! ;;; viper.el --- A full-featured Vi emulator.
  ;;		 a VI Plan for Emacs Rescue,
  ;;		 and a venomous VI PERil.
--- 1,3 ----
! ;;; viper.el --- A full-featured Vi emulator for GNU Emacs 19 and XEmacs 19,
  ;;		 a VI Plan for Emacs Rescue,
  ;;		 and a venomous VI PERil.
***************
*** 7,14 ****
  ;;  Author: Michael Kifer <kifer@cs.sunysb.edu>
  
! (defconst viper-version "2.82 of October 12, 1995"
!   "The current version of Viper")
  
! ;; Copyright (C) 1994, 1995 Free Software Foundation, Inc.
  
  ;; This file is part of GNU Emacs.
--- 7,14 ----
  ;;  Author: Michael Kifer <kifer@cs.sunysb.edu>
  
! ;; Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc.
  
! (defconst viper-version "2.86 of March 14, 1996"
!   "The current version of Viper")
  
  ;; This file is part of GNU Emacs.
***************
*** 294,297 ****
--- 294,298 ----
  ;;
  
+ ;; Code
  
  (require 'advice)
***************
*** 301,304 ****
--- 302,314 ----
  (require 'viper-util)
  
+ ;; Compiler pacifier
+ (defvar vip-minibuffer-current-face)
+ (defvar vip-minibuffer-insert-face)
+ (defvar vip-minibuffer-vi-face)
+ (defvar vip-minibuffer-emacs-face)
+ (defvar iso-accents-mode)
+ (defvar zmacs-region-stays)
+ ;; end pacifier
+ 
  
  ;;; Variables
*************** it better fits your working style.")  
*** 468,475 ****
  (put 'vip-replace-overlay 'permanent-local t)
  
! (if (vip-window-display-p)
      (progn
-       (add-to-list 'facemenu-unlisted-faces 'vip-replace-overlay-face)
        (make-face 'vip-replace-overlay-face)
        (or (face-differs-from-default-p 'vip-replace-overlay-face)
  	  (progn
--- 478,485 ----
  (put 'vip-replace-overlay 'permanent-local t)
  
! (if (vip-has-face-support-p)
      (progn
        (make-face 'vip-replace-overlay-face)
+       (vip-hide-face 'vip-replace-overlay-face)
        (or (face-differs-from-default-p 'vip-replace-overlay-face)
  	  (progn
*************** It is used only with TTYs or if `vip-use
*** 494,498 ****
  is non-nil.")
  (defvar vip-use-replace-region-delimiters 
!   (or (not (vip-window-display-p)) (not (vip-color-display-p)))
    "*If non-nil, Viper will always use `vip-replace-region-end-delimiter' and
  `vip-replace-region-start-delimiter' to delimit replacement regions, even on
--- 504,508 ----
  is non-nil.")
  (defvar vip-use-replace-region-delimiters 
!   (or (not (vip-has-face-support-p)) (not (vip-color-display-p)))
    "*If non-nil, Viper will always use `vip-replace-region-end-delimiter' and
  `vip-replace-region-start-delimiter' to delimit replacement regions, even on
*************** bound to delete-backward-char.")
*** 591,596 ****
  (vip-deflocalvar vip-preserve-indent nil)
  
! (defconst vip-auto-indent nil
    "*Autoindent if t.")
  
  (defconst vip-shift-width 8
--- 601,609 ----
  (vip-deflocalvar vip-preserve-indent nil)
  
! (vip-deflocalvar vip-auto-indent nil
    "*Autoindent if t.")
+ (vip-deflocalvar vip-electric-mode t
+   "*If t, enable electric behavior. 
+ Currently only enables auto-indentation `according to mode'.")
  
  (defconst vip-shift-width 8
*************** These buffers can be cycled through via 
*** 808,812 ****
    "t means, arrange that vi-state will be a default.")
  
! (defvar vip-custom-file-name "~/.vip"
    "Viper customisation file.
  This variable must be set _before_ loading Viper.")
--- 821,832 ----
    "t means, arrange that vi-state will be a default.")
  
! (defvar vip-custom-file-name (cond ((memq system-type '(vax-vms axp-vms))
! 				    "sys$login:.vip")
! 				   ((memq system-type '(emx ms-dos))
! 				    "/_vip")
! 				   ((memq system-type '(windows-nt windows-95))
! 				    "~/_vip")
! 				   (t ; Unix
! 				    "~/.vip"))
    "Viper customisation file.
  This variable must be set _before_ loading Viper.")
*************** Should be set in `~/.vip' file.")
*** 930,934 ****
  
  
! ;;;; CODE
  
  ;; changing mode
--- 950,1057 ----
  
  
! ;;; CODE
! 
! ;; sentinels
! 
! ;; Runs vip-after-change-functions inside after-change-functions
! (defun vip-after-change-sentinel (beg end len)
!   (let ((list vip-after-change-functions))
!     (while list
!       (funcall (car list) beg end len)
!       (setq list (cdr list)))))
!       
! ;; Runs vip-before-change-functions inside before-change-functions
! (defun vip-before-change-sentinel (beg end)
!   (let ((list vip-before-change-functions))
!     (while list
!       (funcall (car list) beg end)
!       (setq list (cdr list)))))
! 
! (defsubst vip-post-command-sentinel ()
!   (run-hooks 'vip-post-command-hooks))
!   
! (defsubst vip-pre-command-sentinel ()
!   (run-hooks 'vip-pre-command-hooks))
!   
! ;; Needed so that Viper will be able to figure the last inserted
! ;; chunk of text with reasonable accuracy.
! (defsubst vip-insert-state-post-command-sentinel ()
!   (if (and (memq vip-current-state '(insert-state replace-state))
! 	   vip-insert-point
! 	   (>= (point) vip-insert-point))
!       (setq vip-last-posn-while-in-insert-state (point-marker)))
!   (if (and (eq this-command 'dabbrev-expand)
! 	   (integerp vip-pre-command-point)
! 	   (> vip-insert-point vip-pre-command-point))
!       (move-marker vip-insert-point vip-pre-command-point))
!   )
!   
! (defsubst vip-insert-state-pre-command-sentinel ()
!   (if (and (eq this-command 'dabbrev-expand)
! 	   (markerp vip-insert-point)
! 	   (marker-position vip-insert-point))
!       (setq vip-pre-command-point (marker-position vip-insert-point))))
! 	
! (defsubst vip-R-state-post-command-sentinel ()
!   ;; Restoring cursor color is needed despite
!   ;; vip-replace-state-pre-command-sentinel: When you jump to another buffer in
!   ;; another frame, the pre-command hook won't change cursor color to default
!   ;; in that other frame.  So, if the second frame cursor was red and we set
!   ;; the point outside the replacement region, then the cursor color will
!   ;; remain red. Restoring the default, below, prevents this.
!   (if (and (<= (vip-replace-start) (point))
! 	   (<=  (point) (vip-replace-end)))
!       (vip-change-cursor-color vip-replace-overlay-cursor-color)
!     (vip-restore-cursor-color)
!     ))
! 
! ;; to speed up, don't change cursor color before self-insert
! ;; and common move commands
! (defsubst vip-replace-state-pre-command-sentinel ()
!   (or (memq this-command '(self-insert-command))
!       (memq (vip-event-key last-command-event)
! 	    '(up down left right (meta f) (meta b)
! 		 (control n) (control p) (control f) (control b)))
!       (vip-restore-cursor-color)))
!   
! (defun vip-replace-state-post-command-sentinel ()
!   ;; Restoring cursor color is needed despite
!   ;; vip-replace-state-pre-command-sentinel: When one jumps to another buffer
!   ;; in another frame, the pre-command hook won't change cursor color to
!   ;; default in that other frame.  So, if the second frame cursor was red and
!   ;; we set the point outside the replacement region, then the cursor color
!   ;; will remain red. Restoring the default, below, fixes this problem.
!   ;;
!   ;; We optimize for self-insert-command's here, since they either don't change
!   ;; cursor color or, if they terminate replace mode, the color will be changed
!   ;; in vip-finish-change
!   (or (memq this-command '(self-insert-command))
!       (vip-restore-cursor-color))
!   (cond 
!    ((eq vip-current-state 'replace-state)
!     ;; delete characters to compensate for inserted chars.
!     (let ((replace-boundary (vip-replace-end)))
!       (save-excursion
! 	(goto-char vip-last-posn-in-replace-region)
! 	(delete-char vip-replace-chars-to-delete)
! 	(setq vip-replace-chars-to-delete 0
! 	      vip-replace-chars-deleted 0)
! 	;; terminate replace mode if reached replace limit
! 	(if (= vip-last-posn-in-replace-region 
! 	       (vip-replace-end))
! 	    (vip-finish-change vip-last-posn-in-replace-region)))
!       
!       (if (and (<= (vip-replace-start) (point))
! 	       (<=  (point) replace-boundary))
! 	  (progn
! 	    ;; the state may have changed in vip-finish-change above
! 	    (if (eq vip-current-state 'replace-state)
! 		(vip-change-cursor-color vip-replace-overlay-cursor-color))
! 	    (setq vip-last-posn-in-replace-region (point-marker))))
!       ))
!    
!    (t ;; terminate replace mode if changed Viper states.
!     (vip-finish-change vip-last-posn-in-replace-region))))
! 
  
  ;; changing mode
*************** Should be set in `~/.vip' file.")
*** 938,942 ****
    ;; Keep vip-post/pre-command-hooks fresh.
    ;; We remove then add vip-post/pre-command-sentinel since it is very
!   ;; desirable that noone gets in-between
    (remove-hook 'post-command-hook 'vip-post-command-sentinel)
    (add-hook 'post-command-hook 'vip-post-command-sentinel)
--- 1061,1066 ----
    ;; Keep vip-post/pre-command-hooks fresh.
    ;; We remove then add vip-post/pre-command-sentinel since it is very
!   ;; desirable that vip-pre-command-sentinel is the last hook and
!   ;; vip-post-command-sentinel is the first hook.
    (remove-hook 'post-command-hook 'vip-post-command-sentinel)
    (add-hook 'post-command-hook 'vip-post-command-sentinel)
*************** Should be set in `~/.vip' file.")
*** 945,951 ****
    ;; These hooks will be added back if switching to insert/replace mode
    (vip-remove-hook 'vip-post-command-hooks
! 	       'vip-insert-state-post-command-sentinel)
    (vip-remove-hook 'vip-pre-command-hooks
! 	       'vip-insert-state-pre-command-sentinel)
    (cond ((eq new-state 'vi-state)
  	 (cond ((member vip-current-state '(insert-state replace-state))
--- 1069,1075 ----
    ;; These hooks will be added back if switching to insert/replace mode
    (vip-remove-hook 'vip-post-command-hooks
! 		   'vip-insert-state-post-command-sentinel)
    (vip-remove-hook 'vip-pre-command-hooks
! 		   'vip-insert-state-pre-command-sentinel)
    (cond ((eq new-state 'vi-state)
  	 (cond ((member vip-current-state '(insert-state replace-state))
*************** Should be set in `~/.vip' file.")
*** 988,994 ****
  	 (vip-move-marker-locally 'vip-last-posn-while-in-insert-state (point))
  	 (vip-add-hook 'vip-post-command-hooks
! 		   'vip-insert-state-post-command-sentinel t)
  	 (vip-add-hook 'vip-pre-command-hooks
! 		   'vip-insert-state-pre-command-sentinel t))
  	) ; outermost cond
    
--- 1112,1118 ----
  	 (vip-move-marker-locally 'vip-last-posn-while-in-insert-state (point))
  	 (vip-add-hook 'vip-post-command-hooks
! 		       'vip-insert-state-post-command-sentinel t)
  	 (vip-add-hook 'vip-pre-command-hooks
! 		       'vip-insert-state-pre-command-sentinel t))
  	) ; outermost cond
    
*************** This startup message appears whenever yo
*** 1266,1270 ****
         
    ;; minibuffer faces
!   (if (vip-window-display-p)
        (setq vip-minibuffer-current-face
  	    (cond ((eq state 'emacs-state) vip-minibuffer-emacs-face)
--- 1390,1394 ----
         
    ;; minibuffer faces
!   (if (vip-has-face-support-p)
        (setq vip-minibuffer-current-face
  	    (cond ((eq state 'emacs-state) vip-minibuffer-emacs-face)
*************** Suffixes such as .el or .elc should be s
*** 1464,1468 ****
     load-file '(setq-default minor-mode-map-alist minor-mode-map-alist))
    )
!   
  
  (defun vip-ESC (arg)
--- 1588,1592 ----
     load-file '(setq-default minor-mode-map-alist minor-mode-map-alist))
    )
! 
  
  (defun vip-ESC (arg)
*************** behaves as in Emacs, any number of multi
*** 1635,1638 ****
--- 1759,1790 ----
  ;; command prefix such as "c", "d", "m" and "y".
  
+ ;; Get value part of prefix-argument ARG.
+ (defsubst vip-p-val (arg)
+   (cond ((null arg) 1)
+ 	((consp arg)
+ 	 (if (or (null (car arg)) (equal (car arg) '(nil)))
+ 	     1 (car arg)))
+ 	(t arg)))
+ 
+ ;; Get raw value part of prefix-argument ARG.
+ (defsubst vip-P-val (arg)
+   (cond ((consp arg) (car arg))
+ 	(t arg)))
+ 
+ ;; Get com part of prefix-argument ARG.
+ (defsubst vip-getcom (arg)
+   (cond ((null arg) nil)
+ 	((consp arg) (cdr arg))
+ 	(t nil)))
+ 
+ ;; Get com part of prefix-argument ARG and modify it.
+ (defun vip-getCom (arg)
+   (let ((com (vip-getcom arg)))
+     (cond ((equal com ?c) ?C)
+ 	  ((equal com ?d) ?D)
+ 	  ((equal com ?y) ?Y)
+ 	  (t com))))
+ 
+ 
  ;; Compute numeric prefix arg value. 
  ;; Invoked by CHAR. COM is the command part obtained so far.
*************** behaves as in Emacs, any number of multi
*** 1691,1695 ****
        ;; com is a single char, so we construct prefix-arg 
        ;; and if char is ?, describe prefix arg, otherwise exit by
!       ;; pushing the char back
        (progn
  	(setq prefix-arg (cons value com))
--- 1843,1849 ----
        ;; com is a single char, so we construct prefix-arg 
        ;; and if char is ?, describe prefix arg, otherwise exit by
!       ;; pushing the char back into vip-set-unread-command-events
!       ;; Since char is a command, the command will execute with the prefix
!       ;; argument that we just constructed.
        (progn
  	(setq prefix-arg (cons value com))
*************** behaves as in Emacs, any number of multi
*** 1758,1788 ****
    (vip-deactivate-mark))
  
- ;; Get value part of prefix-argument ARG.
- (defsubst vip-p-val (arg)
-   (cond ((null arg) 1)
- 	((consp arg)
- 	 (if (or (null (car arg)) (equal (car arg) '(nil)))
- 	     1 (car arg)))
- 	(t arg)))
- 
- ;; Get raw value part of prefix-argument ARG.
- (defsubst vip-P-val (arg)
-   (cond ((consp arg) (car arg))
- 	(t arg)))
- 
- ;; Get com part of prefix-argument ARG.
- (defsubst vip-getcom (arg)
-   (cond ((null arg) nil)
- 	((consp arg) (cdr arg))
- 	(t nil)))
- 
- ;; Get com part of prefix-argument ARG and modify it.
- (defun vip-getCom (arg)
-   (let ((com (vip-getcom arg)))
-     (cond ((equal com ?c) ?C)
- 	  ((equal com ?d) ?D)
- 	  ((equal com ?y) ?Y)
- 	  (t com))))
- 
  
  ;; repeat last destructive command
--- 1912,1915 ----
*************** behaves as in Emacs, any number of multi
*** 1794,1801 ****
  				(get-register reg) "")
  			    (buffer-substring start end))))
  			    
  ;; define functions to be executed
  
! ;; invoked by C command
  (defun vip-exec-change (m-com com) 
    ;; handle C cmd at the eol and at eob.
--- 1921,1949 ----
  				(get-register reg) "")
  			    (buffer-substring start end))))
+ 
+ ;; Saves last inserted text for possible use by vip-repeat command.
+ (defun vip-save-last-insertion (beg end)
+   (setq vip-last-insertion (buffer-substring beg end))
+   (or (< (length vip-d-com) 5)
+       (setcar (nthcdr 4 vip-d-com) vip-last-insertion))
+   (or (null vip-command-ring)
+       (ring-empty-p vip-command-ring)
+       (progn
+ 	(setcar (nthcdr 4 (vip-current-ring-item vip-command-ring))
+ 		vip-last-insertion)
+ 	;; del most recent elt, if identical to the second most-recent
+ 	(vip-cleanup-ring vip-command-ring)))
+   )
+     
+ (defsubst vip-yank-last-insertion ()
+   "Inserts the text saved by the previous vip-save-last-insertion command."
+   (condition-case nil
+       (insert vip-last-insertion)
+     (error nil)))
+   
  			    
  ;; define functions to be executed
  
! ;; invoked by the `C' command
  (defun vip-exec-change (m-com com) 
    ;; handle C cmd at the eol and at eob.
*************** invokes the command before that, etc."
*** 2067,2074 ****
  
      (or (and (numberp num) (<= 0 num) (<= num 9))
! 	(setq idx 0
! 	      num 0)
! 	(message
! 	 "`vip-repeat-from-history' must be invoked as a Vi macro bound to `<key><digit>'"))
      (while (< 0 num)
        (setq vip-d-com (vip-special-ring-rotate1 vip-command-ring -1))
--- 2215,2223 ----
  
      (or (and (numberp num) (<= 0 num) (<= num 9))
! 	(progn
! 	  (setq idx 0
! 		num 0)
! 	  (message
! 	   "`vip-repeat-from-history' must be invoked as a Vi macro bound to `<key><digit>'")))
      (while (< 0 num)
        (setq vip-d-com (vip-special-ring-rotate1 vip-command-ring -1))
*************** Undo previous insertion and inserts new.
*** 2279,2287 ****
        ;; make sure all lines end with newline, unless in the minibuffer or
        ;; when requested otherwise (require-final-newline is nil)
!       (if (and
! 	   (eobp)
! 	   (not (bolp))
! 	   require-final-newline
! 	   (not (vip-is-in-minibuffer)))
  	  (insert "\n"))))
  
--- 2428,2436 ----
        ;; make sure all lines end with newline, unless in the minibuffer or
        ;; when requested otherwise (require-final-newline is nil)
!       (if (and (eobp)
! 	       (not (bolp))
! 	       require-final-newline
! 	       (not (vip-is-in-minibuffer))
! 	       (not buffer-read-only))
  	  (insert "\n"))))
  
*************** Undo previous insertion and inserts new.
*** 2369,2376 ****
  		'vip-change-state-to-emacs)))
      (funcall hook)
- 
-     ;; Make sure the minibufer overlay is kept up-to-date. In XEmacs also
-     ;; guards against the possibility of detaching this overlay.
-     (vip-add-hook 'vip-post-command-hooks 'vip-move-minibuffer-overlay)
      ))
    
--- 2518,2521 ----
*************** Undo previous insertion and inserts new.
*** 2386,2404 ****
  
  (defun vip-set-search-face ()
!   (if (not (vip-window-display-p))
!       ()
!     (defvar vip-search-face
!       (progn
! 	(add-to-list 'facemenu-unlisted-faces 'vip-search-face)
! 	(make-face 'vip-search-face)
! 	(or (face-differs-from-default-p 'vip-search-face)
! 	    ;; face wasn't set in .vip or .Xdefaults
! 	    (if (vip-can-use-colors "Black" "khaki")
! 		(progn
! 		  (set-face-background 'vip-search-face "khaki")
! 		  (set-face-foreground 'vip-search-face "Black"))
! 	      (copy-face 'italic 'vip-search-face)
! 	      (set-face-underline-p 'vip-search-face t)))
! 	'vip-search-face)
          "*Face used to flash out the search pattern.")
      ))
--- 2531,2548 ----
  
  (defun vip-set-search-face ()
!   (if (vip-has-face-support-p)
!       (defvar vip-search-face
! 	(progn
! 	  (make-face 'vip-search-face)
! 	  (vip-hide-face 'vip-search-face)
! 	  (or (face-differs-from-default-p 'vip-search-face)
! 	      ;; face wasn't set in .vip or .Xdefaults
! 	      (if (vip-can-use-colors "Black" "khaki")
! 		  (progn
! 		    (set-face-background 'vip-search-face "khaki")
! 		    (set-face-foreground 'vip-search-face "Black"))
! 		(copy-face 'italic 'vip-search-face)
! 		(set-face-underline-p 'vip-search-face t)))
! 	  'vip-search-face)
          "*Face used to flash out the search pattern.")
      ))
*************** Undo previous insertion and inserts new.
*** 2406,2415 ****
    
  (defun vip-set-minibuffer-faces ()
!   (if (not (vip-window-display-p))
        ()
      (defvar vip-minibuffer-emacs-face
        (progn
- 	(add-to-list 'facemenu-unlisted-faces 'vip-minibuffer-emacs-face)
  	(make-face 'vip-minibuffer-emacs-face)
  	(or (face-differs-from-default-p 'vip-minibuffer-emacs-face)
  	    ;; face wasn't set in .vip or .Xdefaults
--- 2550,2559 ----
    
  (defun vip-set-minibuffer-faces ()
!   (if (not (vip-has-face-support-p))
        ()
      (defvar vip-minibuffer-emacs-face
        (progn
  	(make-face 'vip-minibuffer-emacs-face)
+ 	(vip-hide-face 'vip-minibuffer-emacs-face)
  	(or (face-differs-from-default-p 'vip-minibuffer-emacs-face)
  	    ;; face wasn't set in .vip or .Xdefaults
*************** Undo previous insertion and inserts new.
*** 2422,2426 ****
  		      (set-face-foreground
  		       'vip-minibuffer-emacs-face "Black"))
! 		  (copy-face 'highlight 'vip-minibuffer-emacs-face))
  	      ;; emacs state is the main state in the minibuffer
  	      (if (vip-can-use-colors "Black" "pink")
--- 2566,2570 ----
  		      (set-face-foreground
  		       'vip-minibuffer-emacs-face "Black"))
! 		  (copy-face 'modeline 'vip-minibuffer-emacs-face))
  	      ;; emacs state is the main state in the minibuffer
  	      (if (vip-can-use-colors "Black" "pink")
*************** Undo previous insertion and inserts new.
*** 2436,2441 ****
      (defvar vip-minibuffer-insert-face
        (progn
- 	(add-to-list 'facemenu-unlisted-faces 'vip-minibuffer-insert-face)
  	(make-face 'vip-minibuffer-insert-face)
  	(or (face-differs-from-default-p 'vip-minibuffer-insert-face)
  	    (if vip-vi-style-in-minibuffer
--- 2580,2585 ----
      (defvar vip-minibuffer-insert-face
        (progn
  	(make-face 'vip-minibuffer-insert-face)
+ 	(vip-hide-face 'vip-minibuffer-insert-face)
  	(or (face-differs-from-default-p 'vip-minibuffer-insert-face)
  	    (if vip-vi-style-in-minibuffer
*************** Undo previous insertion and inserts new.
*** 2453,2457 ****
  		    (set-face-foreground
  		     'vip-minibuffer-insert-face "Black"))
! 		(copy-face 'highlight 'vip-minibuffer-insert-face))
  	      (vip-italicize-face 'vip-minibuffer-insert-face)))
  	'vip-minibuffer-insert-face)
--- 2597,2601 ----
  		    (set-face-foreground
  		     'vip-minibuffer-insert-face "Black"))
! 		(copy-face 'modeline 'vip-minibuffer-insert-face))
  	      (vip-italicize-face 'vip-minibuffer-insert-face)))
  	'vip-minibuffer-insert-face)
*************** Undo previous insertion and inserts new.
*** 2460,2465 ****
      (defvar vip-minibuffer-vi-face
        (progn
- 	(add-to-list 'facemenu-unlisted-faces 'vip-minibuffer-vi-face)
  	(make-face 'vip-minibuffer-vi-face)
  	(or (face-differs-from-default-p 'vip-minibuffer-vi-face)
  	    (if vip-vi-style-in-minibuffer
--- 2604,2609 ----
      (defvar vip-minibuffer-vi-face
        (progn
  	(make-face 'vip-minibuffer-vi-face)
+ 	(vip-hide-face 'vip-minibuffer-vi-face)
  	(or (face-differs-from-default-p 'vip-minibuffer-vi-face)
  	    (if vip-vi-style-in-minibuffer
*************** Undo previous insertion and inserts new.
*** 2484,2490 ****
  (defun vip-read-string-with-history (prompt &optional initial 
  					    history-var default keymap)
!   ;; Reads string, prompting with PROMPT and inserting the INITIAL
    ;; value. Uses HISTORY-VAR. DEFAULT is the default value to accept if the
!   ;; input is an empty string. Uses KEYMAP, if given, or the
    ;; minibuffer-local-map.
    ;; Default value is displayed until the user types something in the
--- 2628,2634 ----
  (defun vip-read-string-with-history (prompt &optional initial 
  					    history-var default keymap)
!   ;; Read string, prompting with PROMPT and inserting the INITIAL
    ;; value. Uses HISTORY-VAR. DEFAULT is the default value to accept if the
!   ;; input is an empty string. Use KEYMAP, if given, or the
    ;; minibuffer-local-map.
    ;; Default value is displayed until the user types something in the
*************** Undo previous insertion and inserts new.
*** 2524,2534 ****
  	    (string= (nth 0 (eval history-var)) ""))
  	(set history-var (cdr (eval history-var))))
!     ;; if the user enters nothing but the prev cmd wasn't vip-ex or
!     ;; vip-command-argument, this means that the user typed something then
!     ;; erased. Return "" in this case, not the default---default is too
!     ;; confusing in this case
      (cond ((and (string= val "")
  		(not (memq last-command
! 			   (list 'vip-ex 'vip-command-argument t))))
  	   "")
  	  ((string= val "") (or default ""))
--- 2668,2682 ----
  	    (string= (nth 0 (eval history-var)) ""))
  	(set history-var (cdr (eval history-var))))
!     ;; If the user enters nothing but the prev cmd wasn't vip-ex,
!     ;; vip-command-argument, or `! shell-command', this probably means 
!     ;; that the user typed something then erased. Return "" in this case, not
!     ;; the default---the default is too confusing in this case.
      (cond ((and (string= val "")
+ 		(not (string= prompt "!")) ; was a `! shell-command'
  		(not (memq last-command
! 			   '(vip-ex
! 			     vip-command-argument
! 			     t)
! 			   )))
  	   "")
  	  ((string= val "") (or default ""))
*************** Undo previous insertion and inserts new.
*** 2615,2623 ****
  		      (newline 1)
  		      (if vip-auto-indent 
! 			  (progn (setq vip-cted t) (indent-to col)))
  		      (vip-yank-last-insertion)))
  	(end-of-line)
  	(newline 1)
! 	(if vip-auto-indent (progn (setq vip-cted t) (indent-to col)))
  	(vip-change-state-to-insert)
  	))))
--- 2763,2782 ----
  		      (newline 1)
  		      (if vip-auto-indent 
! 			  (progn
! 			    (setq vip-cted t)
! 			    (if vip-electric-mode
! 				(indent-according-to-mode)
! 			      (indent-to col))
! 			    ))
  		      (vip-yank-last-insertion)))
  	(end-of-line)
  	(newline 1)
! 	(if vip-auto-indent
! 	    (progn
! 	      (setq vip-cted t)
! 	      (if vip-electric-mode
! 		  (indent-according-to-mode)
! 		(indent-to col))
! 	      ))
  	(vip-change-state-to-insert)
  	))))
*************** Undo previous insertion and inserts new.
*** 2637,2645 ****
  		      (open-line 1)
  		      (if vip-auto-indent 
! 			  (progn (setq vip-cted t) (indent-to col)))
  		      (vip-yank-last-insertion)))
  	(beginning-of-line)
  	(open-line 1)
! 	(if vip-auto-indent (progn (setq vip-cted t) (indent-to col)))
  	(vip-change-state-to-insert)))))
  
--- 2796,2815 ----
  		      (open-line 1)
  		      (if vip-auto-indent 
! 			  (progn
! 			    (setq vip-cted t)
! 			    (if vip-electric-mode
! 				(indent-according-to-mode)
! 			      (indent-to col))
! 			    ))
  		      (vip-yank-last-insertion)))
  	(beginning-of-line)
  	(open-line 1)
! 	(if vip-auto-indent
! 	    (progn
! 	      (setq vip-cted t)
! 	      (if vip-electric-mode
! 		  (indent-according-to-mode)
! 		(indent-to col))
! 	      ))
  	(vip-change-state-to-insert)))))
  
*************** Undo previous insertion and inserts new.
*** 2698,2801 ****
    )
    
- ;; Runs vip-after-change-functions inside after-change-functions
- (defun vip-after-change-sentinel (beg end len)
-   (let ((list vip-after-change-functions))
-     (while list
-       (funcall (car list) beg end len)
-       (setq list (cdr list)))))
-       
- ;; Runs vip-before-change-functions inside before-change-functions
- (defun vip-before-change-sentinel (beg end)
-   (let ((list vip-before-change-functions))
-     (while list
-       (funcall (car list) beg end)
-       (setq list (cdr list)))))
- 
- (defsubst vip-post-command-sentinel ()
-   (run-hooks 'vip-post-command-hooks))
-   
- (defsubst vip-pre-command-sentinel ()
-   (run-hooks 'vip-pre-command-hooks))
-   
- ;; Needed so that Viper will be able to figure the last inserted
- ;; chunk of text with reasonable accuracy.
- (defsubst vip-insert-state-post-command-sentinel ()
-   (if (and (memq vip-current-state '(insert-state replace-state))
- 	   vip-insert-point
- 	   (>= (point) vip-insert-point))
-       (setq vip-last-posn-while-in-insert-state (point-marker)))
-   (if (and (eq this-command 'dabbrev-expand)
- 	   (integerp vip-pre-command-point)
- 	   (> vip-insert-point vip-pre-command-point))
-       (move-marker vip-insert-point vip-pre-command-point))
-   )
-   
- (defsubst vip-insert-state-pre-command-sentinel ()
-   (if (and (eq this-command 'dabbrev-expand)
- 	   (markerp vip-insert-point)
- 	   (marker-position vip-insert-point))
-       (setq vip-pre-command-point (marker-position vip-insert-point))))
- 	
- (defsubst vip-R-state-post-command-sentinel ()
-   ;; Restoring cursor color is needed despite
-   ;; vip-replace-state-pre-command-sentinel: When you jump to another buffer in
-   ;; another frame, the pre-command hook won't change cursor color to default
-   ;; in that other frame.  So, if the second frame cursor was red and we set
-   ;; the point outside the replacement region, then the cursor color will
-   ;; remain red. Restoring the default, below, prevents this.
-   (if (and (<= (vip-replace-start) (point))
- 	   (<=  (point) (vip-replace-end)))
-       (vip-change-cursor-color vip-replace-overlay-cursor-color)
-     (vip-restore-cursor-color)
-     ))
- 
- ;; to speed up, don't change cursor color before self-insert
- ;; and common move commands
- (defsubst vip-replace-state-pre-command-sentinel ()
-   (or (memq this-command '(self-insert-command))
-       (memq (vip-event-key last-command-event)
- 	    '(up down left right (meta f) (meta b)
- 		 (control n) (control p) (control f) (control b)))
-       (vip-restore-cursor-color)))
-   
- (defun vip-replace-state-post-command-sentinel ()
-   ;; Restoring cursor color is needed despite
-   ;; vip-replace-state-pre-command-sentinel: When one jumps to another buffer
-   ;; in another frame, the pre-command hook won't change cursor color to
-   ;; default in that other frame.  So, if the second frame cursor was red and
-   ;; we set the point outside the replacement region, then the cursor color
-   ;; will remain red. Restoring the default, below, fixes this problem.
-   ;;
-   ;; We optimize for self-insert-command's here, since they either don't change
-   ;; cursor color or, if they terminate replace mode, the color will be changed
-   ;; in vip-finish-change
-   (or (memq this-command '(self-insert-command))
-       (vip-restore-cursor-color))
-   (cond 
-    ((eq vip-current-state 'replace-state)
-     ;; delete characters to compensate for inserted chars.
-     (let ((replace-boundary (vip-replace-end)))
-       (save-excursion
- 	(goto-char vip-last-posn-in-replace-region)
- 	(delete-char vip-replace-chars-to-delete)
- 	(setq vip-replace-chars-to-delete 0
- 	      vip-replace-chars-deleted 0)
- 	;; terminate replace mode if reached replace limit
- 	(if (= vip-last-posn-in-replace-region 
- 	       (vip-replace-end))
- 	    (vip-finish-change vip-last-posn-in-replace-region)))
-       
-       (if (and (<= (vip-replace-start) (point))
- 	       (<=  (point) replace-boundary))
- 	  (progn
- 	    ;; the state may have changed in vip-finish-change above
- 	    (if (eq vip-current-state 'replace-state)
- 		(vip-change-cursor-color vip-replace-overlay-cursor-color))
- 	    (setq vip-last-posn-in-replace-region (point-marker))))
-       ))
-    
-    (t ;; terminate replace mode if changed Viper states.
-     (vip-finish-change vip-last-posn-in-replace-region))))
- 
  
  ;; checks how many chars were deleted by the last change
--- 2868,2871 ----
*************** Undo previous insertion and inserts new.
*** 2833,2837 ****
        ;; The reason why new-dabbrev.el causes this are this:
        ;; if one dinamically completes a partial word that starts before the
!       ;; replacement region (but ends inside)then new-dabbrev.el first
        ;; moves cursor backwards, to the beginning of the word to be
        ;; completed (say, pt A). Then it inserts the 
--- 2903,2907 ----
        ;; The reason why new-dabbrev.el causes this are this:
        ;; if one dinamically completes a partial word that starts before the
!       ;; replacement region (but ends inside) then new-dabbrev.el first
        ;; moves cursor backwards, to the beginning of the word to be
        ;; completed (say, pt A). Then it inserts the 
*************** Undo previous insertion and inserts new.
*** 2842,2848 ****
        ;; dabbrev-expand.
        ;;
!       ;; We should be able deal with these problems in a better way
!       ;; when emacs will have overlays with sticky back ends.
!       ;; In fact, it would be also useful to add overlays for insert
        ;; regions as well, since this will let us capture the situation when
        ;; dabbrev-expand goes back past the insertion point to find the
--- 2912,2916 ----
        ;; dabbrev-expand.
        ;;
!       ;; In fact, it might be also useful to have overlays for insert
        ;; regions as well, since this will let us capture the situation when
        ;; dabbrev-expand goes back past the insertion point to find the
*************** controlled by the sign of prefix numeric
*** 3770,3774 ****
      (if com (vip-move-marker-locally 'vip-com-point (point)))
      (forward-paragraph val)
!     (if com (vip-execute-com 'vip-forward-paragraph nil com))))
  
  (defun vip-backward-paragraph (arg)
--- 3838,3845 ----
      (if com (vip-move-marker-locally 'vip-com-point (point)))
      (forward-paragraph val)
!     (if com
! 	(progn
! 	  (backward-char 1)
! 	  (vip-execute-com 'vip-forward-paragraph nil com)))))
  
  (defun vip-backward-paragraph (arg)
*************** controlled by the sign of prefix numeric
*** 3780,3784 ****
      (if com (vip-move-marker-locally 'vip-com-point (point)))
      (backward-paragraph val)
!     (if com (vip-execute-com 'vip-backward-paragraph nil com))))
  
  ;; should be mode-specific etc.
--- 3851,3859 ----
      (if com (vip-move-marker-locally 'vip-com-point (point)))
      (backward-paragraph val)
!     (if com
! 	(progn
! 	  (forward-char 1)
! 	  (vip-execute-com 'vip-backward-paragraph nil com)
! 	  (backward-char 1)))))
  
  ;; should be mode-specific etc.
*************** To turn this feature off, set this varia
*** 4301,4324 ****
      (error (copy-region-as-kill beg beg))))
      
- ;; Saves last inserted text for possible use by vip-repeat command.
- (defun vip-save-last-insertion (beg end)
-   (setq vip-last-insertion (buffer-substring beg end))
-   (or (< (length vip-d-com) 5)
-       (setcar (nthcdr 4 vip-d-com) vip-last-insertion))
-   (or (null vip-command-ring)
-       (ring-empty-p vip-command-ring)
-       (progn
- 	(setcar (nthcdr 4 (vip-current-ring-item vip-command-ring))
- 		vip-last-insertion)
- 	;; del most recent elt, if identical to the second most-recent
- 	(vip-cleanup-ring vip-command-ring)))
-   )
-     
- (defsubst vip-yank-last-insertion ()
-   "Inserts the text saved by the previous vip-save-last-insertion command."
-   (condition-case nil
-       (insert vip-last-insertion)
-     (error nil)))
-   
  
  (defun vip-delete-char (arg)
--- 4376,4379 ----
*************** One can use `` and '' to temporarily jum
*** 4650,4654 ****
  	   (if com (vip-move-marker-locally 'vip-com-point (point)))
  	   (if (not (vip-valid-marker text-marker))
! 	       (error (format vip-EmptyTextmarker char)))
  	   (if (and (vip-same-line (point) vip-last-jump)
  		    (= (point) vip-last-jump-ignore))
--- 4705,4709 ----
  	   (if com (vip-move-marker-locally 'vip-com-point (point)))
  	   (if (not (vip-valid-marker text-marker))
! 	       (error vip-EmptyTextmarker char))
  	   (if (and (vip-same-line (point) vip-last-jump)
  		    (= (point) vip-last-jump-ignore))
*************** One can use `` and '' to temporarily jum
*** 4704,4707 ****
--- 4759,4768 ----
  ;; Input Mode Indentation
  
+ ;; Returns t, if the string before point matches the regexp STR.
+ (defsubst vip-looking-back (str)
+   (and (save-excursion (re-search-backward str nil t))
+        (= (point) (match-end 0))))
+ 
+ 
  (defun vip-forward-indent ()
    "Indent forward -- `C-t' in Vi."
*************** One can use `` and '' to temporarily jum
*** 4717,4721 ****
  	(if (vip-looking-back "[0^]")
  	    (progn
! 	      (if (= ?^ (preceding-char)) (setq vip-preserve-indent t))
  	      (delete-backward-char 1)
  	      (setq p (point))
--- 4778,4783 ----
  	(if (vip-looking-back "[0^]")
  	    (progn
! 	      (if (eq ?^ (preceding-char))
! 		  (setq vip-preserve-indent t))
  	      (delete-backward-char 1)
  	      (setq p (point))
*************** One can use `` and '' to temporarily jum
*** 4735,4741 ****
    (interactive)
    (let ((col (current-indentation)))
!     (if (not vip-preserve-indent)
! 	(setq vip-current-indent col)
!       (setq vip-preserve-indent nil))
      ;; don't leave whitespace lines around
      (if (memq last-command
--- 4797,4803 ----
    (interactive)
    (let ((col (current-indentation)))
!     (if vip-preserve-indent
! 	(setq vip-preserve-indent nil)
!       (setq vip-current-indent col))
      ;; don't leave whitespace lines around
      (if (memq last-command
*************** One can use `` and '' to temporarily jum
*** 4748,4752 ****
  	(progn
  	  (setq vip-cted t)
! 	  (indent-to vip-current-indent)))))
  
  	   
--- 4810,4818 ----
  	(progn
  	  (setq vip-cted t)
! 	  (if vip-electric-mode
! 	      (indent-according-to-mode)
! 	    (indent-to vip-current-indent))
! 	  ))
!     ))
  
  	   
*************** One can use `` and '' to temporarily jum
*** 4784,4789 ****
  	   (let* ((val (get-register (1+ (- reg ?a))))
  		  (buf (if (not val) 
! 			   (error 
! 			    (format vip-EmptyTextmarker reg))
  			 (marker-buffer val)))
  		  (pos (marker-position val))
--- 4850,4854 ----
  	   (let* ((val (get-register (1+ (- reg ?a))))
  		  (buf (if (not val) 
! 			   (error vip-EmptyTextmarker reg)
  			 (marker-buffer val)))
  		  (pos (marker-position val))
*************** sensitive for VI-style look-and-feel."
*** 4884,4888 ****
  	       vip-want-emacs-keys-in-vi     t
  	       vip-want-emacs-keys-in-insert (> vip-expert-level 2))
! 	       
  	 (if (eq vip-expert-level 4) ; respect user's ex-style motions
  	     	    	    	     ; and vip-no-multiple-ESC
--- 4949,4953 ----
  	       vip-want-emacs-keys-in-vi     t
  	       vip-want-emacs-keys-in-insert (> vip-expert-level 2))
! 
  	 (if (eq vip-expert-level 4) ; respect user's ex-style motions
  	     	    	    	     ; and vip-no-multiple-ESC
*************** Please, specify your level now: ")
*** 5050,5060 ****
    (beep 1))
    
- 
- ;; Returns t, if the string before point matches the regexp STR.
- (defsubst vip-looking-back (str)
-   (and (save-excursion (re-search-backward str nil t))
-        (= (point) (match-end 0))))
- 
-     
      
  ;; if ENFORCE-BUFFER is not nil, error if CHAR is a marker in another buffer
--- 5115,5118 ----
*************** Please, specify your level now: ")
*** 5108,5118 ****
  			      (vip-color-display-p)
  			    'non-x)
! 	  minibuffer-vi-face (if (vip-window-display-p)
  				 (vip-get-face vip-minibuffer-vi-face)
  			       'non-x)
! 	  minibuffer-insert-face (if (vip-window-display-p)
  				     (vip-get-face vip-minibuffer-insert-face)
  				   'non-x)
! 	  minibuffer-emacs-face (if (vip-window-display-p)
  				    (vip-get-face vip-minibuffer-emacs-face)
  				  'non-x)
--- 5166,5176 ----
  			      (vip-color-display-p)
  			    'non-x)
! 	  minibuffer-vi-face (if (vip-has-face-support-p)
  				 (vip-get-face vip-minibuffer-vi-face)
  			       'non-x)
! 	  minibuffer-insert-face (if (vip-has-face-support-p)
  				     (vip-get-face vip-minibuffer-insert-face)
  				   'non-x)
! 	  minibuffer-emacs-face (if (vip-has-face-support-p)
  				    (vip-get-face vip-minibuffer-emacs-face)
  				  'non-x)
*************** Mail anyway (y or n)? ")
*** 5320,5331 ****
      (vip-change-state-to-vi))
  
    (defvar help-mode-hook nil)
    (add-hook 'help-mode-hook 'viper-mode)
!   
!   (defvar emacs-lisp-mode-hook nil)
!   (add-hook 'emacs-lisp-mode-hook 'viper-mode)
    
    (defvar html-mode-hook nil)
    (add-hook 'html-mode-hook 'viper-mode)
  
    (defvar lisp-mode-hook nil)
--- 5378,5397 ----
      (vip-change-state-to-vi))
  
+   (defvar makefile-mode-hook nil)
+   (add-hook 'makefile-mode-hook 'viper-mode)
+ 
    (defvar help-mode-hook nil)
    (add-hook 'help-mode-hook 'viper-mode)
! 
!   (defvar awk-mode-hook nil)
!   (add-hook 'awk-mode-hook 'viper-mode)
    
    (defvar html-mode-hook nil)
    (add-hook 'html-mode-hook 'viper-mode)
+   (defvar html-helper-mode-hook nil)
+   (add-hook 'html-helper-mode-hook 'viper-mode)
+   
+   (defvar emacs-lisp-mode-hook nil)
+   (add-hook 'emacs-lisp-mode-hook 'viper-mode)
  
    (defvar lisp-mode-hook nil)
*************** Mail anyway (y or n)? ")
*** 5352,5355 ****
--- 5418,5424 ----
    (add-hook 'completion-list-mode-hook 'viper-mode)  
    (add-hook 'compilation-mode-hook     'viper-mode)  
+ 
+   (add-hook 'perl-mode-hook     'viper-mode)  
+   (add-hook 'tcl-mode-hook     'viper-mode)  
    
    (defvar emerge-startup-hook nil)
*************** Mail anyway (y or n)? ")
*** 5379,5382 ****
--- 5448,5457 ----
        "Switch to emacs state while reading password."
        (vip-change-state-to-emacs)))
+ 
+   (vip-eval-after-load
+    "prolog"
+    '(defadvice prolog-mode (after vip-prolog-ad activate)
+       "Switch to Vi state in Prolog mode."
+       (vip-change-state-to-vi)))
    
    ;; Emacs shell, ange-ftp, and comint-based modes
*************** Mail anyway (y or n)? ")
*** 5388,5391 ****
--- 5463,5468 ----
    (defvar sh-mode-hook nil)
    (add-hook 'sh-mode-hook 'viper-mode)
+   (defvar ksh-mode-hook nil)
+   (add-hook 'ksh-mode-hook 'viper-mode)
    
    ;; Dired
*************** Mail anyway (y or n)? ")
*** 5493,5496 ****
--- 5570,5574 ----
  (vip-harness-minor-mode "russian")
  (vip-harness-minor-mode "view-less")
+ (vip-harness-minor-mode "view")
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/vms-patch.el emacs-19.31/lisp/vms-patch.el
*** emacs-19.30/lisp/vms-patch.el	Thu Mar 16 18:27:53 1995
--- emacs-19.31/lisp/vms-patch.el	Sun Jan 14 02:34:30 1996
***************
*** 19,24 ****
  
  ;; 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.
  
  ;;; Code:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Code:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/vms-pmail.el emacs-19.31/lisp/vms-pmail.el
*** emacs-19.30/lisp/vms-pmail.el	Thu Mar 18 16:55:22 1993
--- emacs-19.31/lisp/vms-pmail.el	Sun Jan 14 02:34:30 1996
***************
*** 19,24 ****
  
  ;; 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.
  
  ;;; Code:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Code:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/vmsproc.el emacs-19.31/lisp/vmsproc.el
*** emacs-19.30/lisp/vmsproc.el	Mon Sep 21 08:06:55 1992
--- emacs-19.31/lisp/vmsproc.el	Sun Jan 14 02:34:30 1996
***************
*** 20,30 ****
  
  ;; 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.
  
  ;;; Code:
  
  (defvar display-subprocess-window nil
!   "If non-nil, the suprocess window is displayed whenever input is received.")
  
  (defvar command-prefix-string "$ "
--- 20,31 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Code:
  
  (defvar display-subprocess-window nil
!   "If non-nil, the subprocess window is displayed whenever input is received.")
  
  (defvar command-prefix-string "$ "
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/vt-control.el emacs-19.31/lisp/vt-control.el
*** emacs-19.30/lisp/vt-control.el	Thu Jun 22 16:27:59 1995
--- emacs-19.31/lisp/vt-control.el	Sun Jan 14 02:34:30 1996
***************
*** 20,25 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/vt100-led.el emacs-19.31/lisp/vt100-led.el
*** emacs-19.30/lisp/vt100-led.el	Thu Mar 25 00:26:46 1993
--- emacs-19.31/lisp/vt100-led.el	Sun Jan 14 02:34:30 1996
***************
*** 20,25 ****
  
  ;; 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.
  
  ;;; Code:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Code:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/window.el emacs-19.31/lisp/window.el
*** emacs-19.30/lisp/window.el	Fri Nov 10 19:58:02 1995
--- emacs-19.31/lisp/window.el	Thu Apr 25 23:03:09 1996
***************
*** 1,5 ****
  ;;; window.el --- GNU Emacs window commands aside from those written in C.
  
! ;;; Copyright (C) 1985, 1989, 1992, 1993, 1994 Free Software Foundation, Inc.
  
  ;; Maintainer: FSF
--- 1,5 ----
  ;;; window.el --- GNU Emacs window commands aside from those written in C.
  
! ;; Copyright (C) 1985, 1989, 1992, 1993, 1994 Free Software Foundation, Inc.
  
  ;; Maintainer: FSF
***************
*** 18,23 ****
  
  ;; 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.
  
  ;;; Code:
--- 18,24 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Code:
*************** minibuffer even if it is active.
*** 52,59 ****
  Several frames may share a single minibuffer; if the minibuffer
  counts, all windows on all frames that share that minibuffer count
! too.  Therefore, when a separate minibuffer frame is active,
  `walk-windows' includes the windows in the frame from which you
! entered the minibuffer, as well as the minibuffer window.  But if the
! minibuffer does not count, only windows from WINDOW's frame count.
  
  ALL-FRAMES is the optional third argument.
--- 53,60 ----
  Several frames may share a single minibuffer; if the minibuffer
  counts, all windows on all frames that share that minibuffer count
! too.  Therefore, if you are using a separate minibuffer frame
! and the minibuffer is active and MINIBUF says it counts,
  `walk-windows' includes the windows in the frame from which you
! entered the minibuffer, as well as the minibuffer window.
  
  ALL-FRAMES is the optional third argument.
*************** ALL-FRAMES = `visible' means include win
*** 62,66 ****
  ALL-FRAMES = 0 means include windows on all visible and iconified frames.
  ALL-FRAMES = t means include windows on all frames including invisible frames.
! Anything else means restrict to WINDOW's frame."
    ;; If we start from the minibuffer window, don't fail to come back to it.
    (if (window-minibuffer-p (selected-window))
--- 63,67 ----
  ALL-FRAMES = 0 means include windows on all visible and iconified frames.
  ALL-FRAMES = t means include windows on all frames including invisible frames.
! Anything else means restrict to the selected frame."
    ;; If we start from the minibuffer window, don't fail to come back to it.
    (if (window-minibuffer-p (selected-window))
*************** Anything else means restrict to WINDOW's
*** 88,93 ****
  (defun count-windows (&optional minibuf)
     "Returns the number of visible windows.
! Optional arg NO-MINI non-nil means don't count the minibuffer
! even if it is active."
     (let ((count 0))
       (walk-windows (function (lambda (w)
--- 89,94 ----
  (defun count-windows (&optional minibuf)
     "Returns the number of visible windows.
! Optional arg MINIBUF non-nil means count the minibuffer
! even if it is inactive."
     (let ((count 0))
       (walk-windows (function (lambda (w)
*************** new mode line."
*** 168,172 ****
  	(old-point (point))
  	(size (and arg (prefix-numeric-value arg)))
! 	new-w bottom switch)
      (and size (< size 0) (setq size (+ (window-height) size)))
      (setq new-w (split-window nil size))
--- 169,174 ----
  	(old-point (point))
  	(size (and arg (prefix-numeric-value arg)))
!         (window-full-p nil)
! 	new-w bottom switch moved)
      (and size (< size 0) (setq size (+ (window-height) size)))
      (setq new-w (split-window nil size))
*************** new mode line."
*** 176,191 ****
  	    (set-buffer (window-buffer))
  	    (goto-char (window-start))
! 	    (vertical-motion (window-height))
  	    (set-window-start new-w (point))
  	    (if (> (point) (window-point new-w))
  		(set-window-point new-w (point)))
! 	    (vertical-motion -1)
! 	    (setq bottom (point)))
! 	  (if (<= bottom (point))
! 	      (set-window-point old-w (1- bottom)))
! 	  (if (< (window-start new-w) old-point)
! 	      (progn
! 		(set-window-point new-w old-point)
! 		(select-window new-w)))))
      new-w))
  
--- 178,198 ----
  	    (set-buffer (window-buffer))
  	    (goto-char (window-start))
!             (setq moved (vertical-motion (window-height)))
  	    (set-window-start new-w (point))
  	    (if (> (point) (window-point new-w))
  		(set-window-point new-w (point)))
!             (and (= moved (window-height))
!                  (progn
!                    (setq window-full-p t)
!                    (vertical-motion -1)))
!             (setq bottom (point)))
!           (and window-full-p
!                (<= bottom (point))
!                (set-window-point old-w (1- bottom)))
! 	  (and window-full-p
!                (<= (window-start new-w) old-point)
!                (progn
!                  (set-window-point new-w old-point)
!                  (select-window new-w)))))
      new-w))
  
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/winnt.el emacs-19.31/lisp/winnt.el
*** emacs-19.30/lisp/winnt.el	Thu Jun 15 21:24:36 1995
--- emacs-19.31/lisp/winnt.el	Sat May 18 16:09:04 1996
***************
*** 1,3 ****
! ;; winnt.el --- Lisp routines for Windows NT.
  ;; Copyright (C) 1994 Free Software Foundation, Inc.
  
--- 1,4 ----
! ;;; winnt.el --- Lisp routines for Windows NT.
! 
  ;; Copyright (C) 1994 Free Software Foundation, Inc.
  
***************
*** 17,22 ****
  
  ;; 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:
--- 18,24 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 51,54 ****
--- 53,57 ----
     (purecopy ")%]--")
     (purecopy '(line-number-mode "L%l--"))
+    (purecopy '(column-number-mode "C%c--"))
     (purecopy '(-3 . "%p"))
     (purecopy "-%-")))
*************** against the file name, and TYPE is nil f
*** 144,156 ****
  ;; Really should provide this capability at the drive letter granularity.
  (defun using-unix-filesystems (flag)
    (if flag
        (progn
  	(add-hook 'write-file-hooks 'save-to-unix-hook)
- 	(add-hook 'write-contents-hooks 'save-to-unix-hook)
  	(add-hook 'after-save-hook 'revert-from-unix-hook))
      (progn
        (remove-hook 'write-file-hooks 'save-to-unix-hook)
-       (remove-hook 'write-contents-hooks 'save-to-unix-hook)
        (remove-hook 'after-save-hook 'revert-from-unix-hook))))
  
  ;;; Fix interface to (X-specific) mouse.el
--- 147,179 ----
  ;; Really should provide this capability at the drive letter granularity.
  (defun using-unix-filesystems (flag)
+   "Read and write all files assuming that they are on a drive attached 
+ to a remote Unix file system.  No CR/LF translation is done on any files
+ in this case.  This behavior is activated when FLAG is t and deactived
+ when FLAG is any other value."
    (if flag
        (progn
  	(add-hook 'write-file-hooks 'save-to-unix-hook)
  	(add-hook 'after-save-hook 'revert-from-unix-hook))
      (progn
        (remove-hook 'write-file-hooks 'save-to-unix-hook)
        (remove-hook 'after-save-hook 'revert-from-unix-hook))))
+ 
+ ;;; Avoid creating auto-save file names containing illegal characters
+ ;;; (primarily "*", eg. for the *mail* buffer).
+ (fset 'original-make-auto-save-file-name
+       (symbol-function 'make-auto-save-file-name))
+ 
+ (defun make-auto-save-file-name ()
+   "Return file name to use for auto-saves of current buffer.
+ Does not consider `auto-save-visited-file-name' as that variable is checked
+ before calling this function.  You can redefine this for customization.
+ See also `auto-save-file-name-p'."
+   (let ((name (original-make-auto-save-file-name))
+ 	(start 0))
+     ;; destructively replace occurences of * or ? with $
+     (while (string-match "[?*]" name start)
+       (aset name (match-beginning 0) ?$)
+       (setq start (1+ (match-end 0))))
+     name))
  
  ;;; Fix interface to (X-specific) mouse.el
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/ws-mode.el emacs-19.31/lisp/ws-mode.el
*** emacs-19.30/lisp/ws-mode.el	Sat Aug 26 16:55:14 1995
--- emacs-19.31/lisp/ws-mode.el	Sun Jan 14 02:34:30 1996
***************
*** 20,25 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/x-apollo.el emacs-19.31/lisp/x-apollo.el
*** emacs-19.30/lisp/x-apollo.el	Fri May 12 20:29:32 1995
--- emacs-19.31/lisp/x-apollo.el	Sun Jan 14 02:34:30 1996
***************
*** 1,20 ****
  ;;; x-apollo.el --- Apollo support functions
  ;; Copyright (C) 1995 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.
  
  ;;; Code:
--- 1,22 ----
  ;;; x-apollo.el --- Apollo support functions
+ 
  ;; Copyright (C) 1995 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Code:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/x-menu.el emacs-19.31/lisp/x-menu.el
*** emacs-19.30/lisp/x-menu.el	Sat Aug 26 16:53:15 1995
--- emacs-19.31/lisp/x-menu.el	Sun Jan 14 02:34:30 1996
***************
*** 16,21 ****
  
  ;; 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.
  
  ;;; Code:
--- 16,22 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Code:
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/xscheme.el emacs-19.31/lisp/xscheme.el
*** emacs-19.30/lisp/xscheme.el	Wed Aug 16 10:39:09 1995
--- emacs-19.31/lisp/xscheme.el	Sun Jan 14 02:34:30 1996
***************
*** 19,24 ****
  
  ;; 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:
--- 19,25 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
*************** waiting for input.  Otherwise, it is bus
*** 457,462 ****
  (defconst xscheme-control-g-synchronization-p t
    "If non-nil, insert markers in the scheme input stream to indicate when
! control-g interrupts were signalled.  Do not allow more control-g's to be
! signalled until the scheme process acknowledges receipt.")
  
  (defvar xscheme-control-g-disabled-p nil
--- 458,463 ----
  (defconst xscheme-control-g-synchronization-p t
    "If non-nil, insert markers in the scheme input stream to indicate when
! control-g interrupts were signaled.  Do not allow more control-g's to be
! signaled until the scheme process acknowledges receipt.")
  
  (defvar xscheme-control-g-disabled-p nil
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/xt-mouse.el emacs-19.31/lisp/xt-mouse.el
*** emacs-19.30/lisp/xt-mouse.el	Fri Nov 10 23:02:01 1995
--- emacs-19.31/lisp/xt-mouse.el	Mon Mar  4 16:22:25 1996
***************
*** 1,3 ****
--- 1,4 ----
  ;;; xt-mouse.el --- Support the mouse when emacs run in an xterm.
+ 
  ;; Copyright (C) 1994 Free Software Foundation
  
***************
*** 5,25 ****
  ;; Keywords: mouse, terminals
  
! ;; This program 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.
! ;; 
! ;; This program 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 this program; if not, write to the Free Software
! ;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  
  ;;; Comments:
  
! ;; Enable mouse support when running inside an xterm. 
  
  ;; This is actually useful when you are running X11 locally, but is
--- 6,29 ----
  ;; Keywords: mouse, terminals
  
! ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Comments:
  
! ;; Enable mouse support when running inside an xterm or Linux console.
  
  ;; This is actually useful when you are running X11 locally, but is
***************
*** 29,32 ****
--- 33,43 ----
  ;; events so it should work with any package that uses the mouse.
  
+ ;; The xterm mouse escape codes are supposedly also supported by the
+ ;; Linux console, but I have not been able to verify this.
+ 
+ ;; You don't have to turn off xterm mode to use the normal xterm mouse
+ ;; functionality, it is still available by holding down the SHIFT key
+ ;; when you press the mouse button.
+ 
  ;;; Todo:
  
***************
*** 39,42 ****
--- 50,55 ----
  (define-key function-key-map "\e[M" 'xterm-mouse-translate)
  
+ (defvar xterm-mouse-last)
+ 
  (defun xterm-mouse-translate (event)
    ;; Read a click and release event from XTerm.
***************
*** 44,48 ****
      (save-window-excursion
        (deactivate-mark)
!       (let* ((last)
  	     (down (xterm-mouse-event))
  	     (down-command (nth 0 down))
--- 57,61 ----
      (save-window-excursion
        (deactivate-mark)
!       (let* ((xterm-mouse-last)
  	     (down (xterm-mouse-event))
  	     (down-command (nth 0 down))
***************
*** 74,78 ****
  		     (if (symbolp down-where)
  			 0
! 		       (list (intern (concat "drag-mouse-" (+ 1 last)))
  			     down-data click-data))
  		     )))
--- 87,91 ----
  		     (if (symbolp down-where)
  			 0
! 		       (list (intern (concat "drag-mouse-" (+ 1 xterm-mouse-last)))
  			     down-data click-data))
  		     )))
***************
*** 116,121 ****
  		where))
  	 (mouse (intern (if (eq type 3)
! 			    (concat "mouse-" (+ 1 last))
! 			  (setq last type)
  			  (concat "down-mouse-" (+ 1 type))))))
      (setq xterm-mouse-x x
--- 129,134 ----
  		where))
  	 (mouse (intern (if (eq type 3)
! 			    (concat "mouse-" (+ 1 xterm-mouse-last))
! 			  (setq xterm-mouse-last type)
  			  (concat "down-mouse-" (+ 1 type))))))
      (setq xterm-mouse-x x
diff -2rcpP --exclude=*.elc emacs-19.30/lisp/yow.el emacs-19.31/lisp/yow.el
*** emacs-19.30/lisp/yow.el	Wed Nov  9 00:19:11 1994
--- emacs-19.31/lisp/yow.el	Sun Jan 14 02:34:30 1996
***************
*** 1,5 ****
  ;;; yow.el --- quote random zippyisms
  
! ;; Copyright (C) 1993, 1994 Free Software Foundation, Inc.
  
  ;; Maintainer: FSF
--- 1,5 ----
  ;;; yow.el --- quote random zippyisms
  
! ;; Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc.
  
  ;; Maintainer: FSF
***************
*** 20,25 ****
  
  ;; 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:
--- 20,26 ----
  
  ;; 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, Inc., 59 Temple Place - Suite 330,
! ;; Boston, MA 02111-1307, USA.
  
  ;;; Commentary:
***************
*** 38,47 ****
     "File containing pertinent pinhead phrases.")
  
  ;;;###autoload
  (defun yow (&optional insert)
    "Return or display a random Zippy quotation.  With prefix arg, insert it."
    (interactive "P")
!   (let ((yow (cookie yow-file
! 		     "Am I CONSING yet?..." "I have SEEN the CONSING!!")))
      (cond (insert
  	   (insert yow))
--- 39,50 ----
     "File containing pertinent pinhead phrases.")
  
+ (defconst yow-load-message "Am I CONSING yet?...")
+ (defconst yow-after-load-message "I have SEEN the CONSING!!")
+ 
  ;;;###autoload
  (defun yow (&optional insert)
    "Return or display a random Zippy quotation.  With prefix arg, insert it."
    (interactive "P")
!   (let ((yow (cookie yow-file yow-load-message yow-after-load-message)))
      (cond (insert
  	   (insert yow))
***************
*** 62,67 ****
    "Read a Zippyism from the minibuffer with completion, prompting with PROMPT.
  If optional second arg is non-nil, require input to match a completion."
!   (read-cookie prompt yow-file
! 	       "Am I CONSING yet?..." "I have SEEN the CONSING!!"
  	       require-match))
  
--- 65,69 ----
    "Read a Zippyism from the minibuffer with completion, prompting with PROMPT.
  If optional second arg is non-nil, require input to match a completion."
!   (read-cookie prompt yow-file yow-load-message yow-after-load-message
  	       require-match))
  
*************** If optional second arg is non-nil, requi
*** 71,79 ****
    (interactive (list (read-zippyism "Pinhead wisdom: " t)))
    (insert zippyism))
  
! ; Yowza!! Feed zippy quotes to the doctor. Watch results.
! ; fun, fun, fun. Entertainment for hours...
! ;
! ; written by Kayvan Aghaiepour
  
  ;;;###autoload
--- 73,114 ----
    (interactive (list (read-zippyism "Pinhead wisdom: " t)))
    (insert zippyism))
+ 
+ ;;;###autoload
+ (defun apropos-zippy (regexp)
+   "Return a list of all Zippy quotes matching REGEXP.
+ If called interactively, display a list of matches."
+   (interactive "sApropos Zippy (regexp): ")
+   ;; Make sure yows are loaded
+   (cookie yow-file yow-load-message yow-after-load-message)
+   (let* ((case-fold-search t)
+          (cookie-table-symbol (intern yow-file cookie-cache))
+          (string-table (symbol-value cookie-table-symbol))
+          (matches nil)
+          (len (length string-table))
+          (i 0))
+     (save-match-data
+       (while (< i len)
+         (and (string-match regexp (aref string-table i))
+              (setq matches (cons (aref string-table i) matches)))
+         (setq i (1+ i))))
+     (and matches
+          (setq matches (sort matches 'string-lessp)))
+     (and (interactive-p)
+          (cond ((null matches)
+                 (message "No matches found."))
+                (t
+                 (let ((l matches))
+                   (with-output-to-temp-buffer "*Zippy Apropos*"
+                     (while l
+                       (princ (car l))
+                       (setq l (cdr l))
+                       (and l (princ "\n\n"))))))))
+     matches))
+ 
  
! ;; Yowza!! Feed zippy quotes to the doctor. Watch results.
! ;; fun, fun, fun. Entertainment for hours...
! ;;
! ;; written by Kayvan Aghaiepour
  
  ;;;###autoload
diff -2rcpP --exclude=*.elc emacs-19.30/lwlib/ChangeLog emacs-19.31/lwlib/ChangeLog
*** emacs-19.30/lwlib/ChangeLog	Fri Nov 24 23:41:16 1995
--- emacs-19.31/lwlib/ChangeLog	Sat May 25 15:31:38 1996
***************
*** 1,2 ****
--- 1,79 ----
+ Sat May 25 15:30:10 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
+ 
+ 	* Version 19.31 released.
+ 
+ Sun Mar 31 15:19:31 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* lwlib-Xm.c (destroy_all_children): When freeing a cascade button,
+ 	free its submenu too.
+ 	(make_menu_in_widget): Use a cascade button gadget, not a widget.
+ 	Include Xm/CascadeBG.h.
+ 
+ Fri Mar 29 09:47:25 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* Makefile.in (tags): New target.
+ 
+ Thu Mar 28 13:38:14 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* Makefile.in (TAGS): Renamed from `tags' and fixed to work.
+ 
+ Tue Mar 26 13:45:45 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* Makefile.in (xlwmenu.o): New explicit target.
+ 
+ Sun Mar 24 06:55:06 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* lwlib.h (struct widget_value): New field this_one_change.
+ 	* lwlib.c (merge_widget_value): Set the this_one_change field.
+ 	* lwlib-Xm.c (destroy_all_children): New arg first_child_to_destroy.
+ 	(make_menu_in_widget): New arg keep_first_children.
+ 	(xm_update_menu): Preserve the first children even if later ones
+ 	have a structural change.
+ 	(update_one_menu_entry): Use this_one_change field.
+ 
+ Fri Mar  1 14:41:35 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xlwmenu.c (motion_event_is_in_menu): Make x and y signed.
+ 
+ Sun Feb 25 01:59:30 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* lwlib.c (lw_window_is_in_menubar) [USE_MOTIF]:
+ 	With Motif, the window WIN can be the menu bar widget itself.
+ 
+ Wed Feb 21 15:54:25 1996  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
+ 
+ 	* lwlib.c (free_widget_value_tree, merge_widget_value):
+ 	Use XtFree for the toolkit_data.
+ 
+ Mon Feb 19 02:36:44 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
+ 
+ 	* lwlib.c (lw_internal_update_other_instances): Move static var
+ 	outside the function, and rename it to lwlib_updating.
+ 
+ Thu Jan  4 19:09:22 1996  Paul Eggert  <eggert@twinsun.com>
+ 
+ 	* lwlib.c (instantiate_widget_instance): Renamed from
+ 	instanciate_widget_instance (spelling correction).
+ 	All callers changed.
+ 
+ Sun Dec 31 13:57:56 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xlwmenu.c (xlwMenuActionsList): Add "key" and "nothing".
+ 	(xlwMenuTranslations): Add translations for Key, KeyUp,
+ 	and for the modifier keysyms.
+ 	(Nothing, Key): New functions.
+ 
+ Sun Dec 24 11:02:18 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xlwmenu.c (XlwMenuSetValues): Do redisplay if non-null contents
+ 	get replaced by empty contents.
+ 
+ 	* lwlib.c (merge_widget_value): Treat disappearance of entire contents
+ 	as a STRUCTURAL_CHANGE.
+ 
+ Wed Dec 20 20:31:41 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
+ 
+ 	* lwlib-utils.c: Add #undef for index and rindex.
+ 
  Fri Nov 24 23:41:12 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
diff -2rcpP --exclude=*.elc emacs-19.30/lwlib/Makefile.in emacs-19.31/lwlib/Makefile.in
*** emacs-19.30/lwlib/Makefile.in	Mon Aug 14 19:10:55 1995
--- emacs-19.31/lwlib/Makefile.in	Fri Mar 29 09:47:19 1996
*************** lwlib-Xm.o:    lwlib.h lwlib-int.h lwlib
*** 65,68 ****
--- 65,69 ----
  lwlib-Xol.o:   lwlib.h lwlib-int.h
  lwlib-Xolmb.o: lwlib-Xolmb.h lwlib-XolmbP.h
+ xlwmenu.o: xlwmenu.c xlwmenu.h lwlib.h xlwmenuP.h
  
  mostlyclean:
*************** distclean: clean
*** 73,76 ****
  maintainer-clean: distclean
  
! tags::
! 	$(TAGS) -t *.[ch]
--- 74,79 ----
  maintainer-clean: distclean
  
! TAGS:
! 	../lib-src/etags -t *.[ch]
! tags: TAGS
! .PHONY: tags
diff -2rcpP --exclude=*.elc emacs-19.30/lwlib/dispatch.c emacs-19.31/lwlib/dispatch.c
*** emacs-19.30/lwlib/dispatch.c	Thu Jun 15 18:35:59 1995
--- emacs-19.31/lwlib/dispatch.c	Mon Jan 15 04:17:38 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  /* 
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA. */
  
  /* 
diff -2rcpP --exclude=*.elc emacs-19.30/lwlib/lwlib-Xaw.c emacs-19.31/lwlib/lwlib-Xaw.c
*** emacs-19.30/lwlib/lwlib-Xaw.c	Thu Jun 15 18:36:15 1995
--- emacs-19.31/lwlib/lwlib-Xaw.c	Mon Jan 15 04:17:38 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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 <stdio.h>
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  #include <stdio.h>
diff -2rcpP --exclude=*.elc emacs-19.30/lwlib/lwlib-Xlw.c emacs-19.31/lwlib/lwlib-Xlw.c
*** emacs-19.30/lwlib/lwlib-Xlw.c	Wed Aug  2 03:03:16 1995
--- emacs-19.31/lwlib/lwlib-Xlw.c	Mon Jan 15 04:17:38 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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 "lwlib-Xlw.h"
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  #include "lwlib-Xlw.h"
diff -2rcpP --exclude=*.elc emacs-19.30/lwlib/lwlib-Xm.c emacs-19.31/lwlib/lwlib-Xm.c
*** emacs-19.30/lwlib/lwlib-Xm.c	Wed Aug  2 03:07:46 1995
--- emacs-19.31/lwlib/lwlib-Xm.c	Sun Mar 31 19:14:11 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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 <stdlib.h>
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  #include <stdlib.h>
*************** the Free Software Foundation, 675 Mass A
*** 34,37 ****
--- 35,39 ----
  #include <Xm/BulletinB.h>
  #include <Xm/CascadeB.h>
+ #include <Xm/CascadeBG.h>
  #include <Xm/DrawingA.h>
  #include <Xm/FileSB.h>
*************** resource_motif_string (widget, name)
*** 147,153 ****
  }
  
  static void
! destroy_all_children (widget)
       Widget widget;
  {
    Widget* children;
--- 149,159 ----
  }
  
+ /* Destroy all of the children of WIDGET
+    starting with number FIRST_CHILD_TO_DESTROY.  */
+ 
  static void
! destroy_all_children (widget, first_child_to_destroy)
       Widget widget;
+      int first_child_to_destroy;
  {
    Widget* children;
*************** destroy_all_children (widget)
*** 158,172 ****
    if (children)
      {
        /* Unmanage all children and destroy them.  They will only be 
!        * really destroyed when we get out of DispatchEvent. */
!       for (i = 0; i < number; i++)
  	{
! 	  Widget child = children [i];
! 	  if (!child->core.being_destroyed)
! 	    {
! 	      XtUnmanageChild (child);
! 	      XtDestroyWidget (child);
! 	    }
  	}
        XtFree ((char *) children);
      }
--- 164,188 ----
    if (children)
      {
+       XtUnmanageChildren (children + first_child_to_destroy,
+ 			  number - first_child_to_destroy);
+ 
        /* Unmanage all children and destroy them.  They will only be 
! 	 really destroyed when we get out of DispatchEvent.  */
!       for (i = first_child_to_destroy; i < number; i++)
  	{
! 	  Arg al[2];
! 	  Widget submenu = 0;
! 	  /* Cascade buttons have submenus,and these submenus
! 	     need to be freed.  But they are not included in
! 	     XtCompositeChildren.  So get it out of the cascade button
! 	     and free it.  If this child is not a cascade button,
! 	     then submenu should remain unchanged.  */
! 	  XtSetArg (al[0], XmNsubMenuId, &submenu); 
!   	  XtGetValues (children[i], al, 1);
! 	  if (submenu)
! 	    XtDestroyWidget (submenu);
! 	  XtDestroyWidget (children[i]);
  	}
+ 
        XtFree ((char *) children);
      }
*************** all_dashes_p (s)
*** 337,345 ****
  }
  
  static void
! make_menu_in_widget (instance, widget, val)
       widget_instance* instance;
       Widget widget;
       widget_value* val;
  {
    Widget* children = 0;
--- 353,364 ----
  }
  
+ /* KEEP_FIRST_CHILDREN gives the number of initial children to keep.  */
+ 
  static void
! make_menu_in_widget (instance, widget, val, keep_first_children)
       widget_instance* instance;
       Widget widget;
       widget_value* val;
+      int keep_first_children;
  {
    Widget* children = 0;
*************** make_menu_in_widget (instance, widget, v
*** 353,356 ****
--- 372,380 ----
    Boolean menubar_p;
  
+   Widget* old_children;
+   unsigned int old_num_children;
+ 
+   old_children = XtCompositeChildren (widget, &old_num_children);
+ 
    /* Allocate the children array */
    for (num_children = 0, cur = val; cur; num_children++, cur = cur->next);
*************** make_menu_in_widget (instance, widget, v
*** 368,372 ****
  		   xm_pop_down_callback, (XtPointer)instance);
  
!   for (child_index = 0, cur = val; cur; child_index++, cur = cur->next)
      {    
        ac = 0;
--- 392,407 ----
  		   xm_pop_down_callback, (XtPointer)instance);
  
!   /* Preserve the first KEEP_FIRST_CHILDREN old children.  */
!   for (child_index = 0, cur = val; child_index < keep_first_children;
!        child_index++, cur = cur->next)
!     children[child_index] = old_children[child_index];
! 
!   /* Check that those are all we have
!      (the caller should have deleted the rest).  */
!   if (old_num_children != keep_first_children)
!     abort ();
! 
!   /* Create the rest.  */
!   for (child_index = keep_first_children; cur; child_index++, cur = cur->next)
      {    
        ac = 0;
*************** make_menu_in_widget (instance, widget, v
*** 405,411 ****
  	{
  	  menu = XmCreatePulldownMenu (widget, cur->name, NULL, 0);
! 	  make_menu_in_widget (instance, menu, cur->contents);
  	  XtSetArg (al [ac], XmNsubMenuId, menu); ac++;
! 	  button = XmCreateCascadeButton (widget, cur->name, al, ac);
  
  	  xm_update_label (instance, button, cur);
--- 440,446 ----
  	{
  	  menu = XmCreatePulldownMenu (widget, cur->name, NULL, 0);
! 	  make_menu_in_widget (instance, menu, cur->contents, 0);
  	  XtSetArg (al [ac], XmNsubMenuId, menu); ac++;
! 	  button = XmCreateCascadeButtonGadget (widget, cur->name, al, ac);
  
  	  xm_update_label (instance, button, cur);
*************** make_menu_in_widget (instance, widget, v
*** 430,433 ****
--- 465,470 ----
  
    XtFree ((char *) children);
+   if (old_children)
+     XtFree ((char *) old_children);
  }
  
*************** update_one_menu_entry (instance, widget,
*** 444,448 ****
    widget_value* contents;
  
!   if (val->change == NO_CHANGE)
      return;
  
--- 481,485 ----
    widget_value* contents;
  
!   if (val->this_one_change == NO_CHANGE)
      return;
  
*************** update_one_menu_entry (instance, widget,
*** 455,459 ****
  
    /* update the menu button as a label. */
!   if (val->change >= VISIBLE_CHANGE)
      xm_update_label (instance, widget, val);
  
--- 492,496 ----
  
    /* update the menu button as a label. */
!   if (val->this_one_change >= VISIBLE_CHANGE)
      xm_update_label (instance, widget, val);
  
*************** update_one_menu_entry (instance, widget,
*** 471,475 ****
  	{
  	  menu = XmCreatePulldownMenu (XtParent (widget), XtName (widget), NULL, 0);
! 	  make_menu_in_widget (instance, menu, contents);
  	  ac = 0;
  	  XtSetArg (al [ac], XmNsubMenuId, menu); ac++;
--- 508,512 ----
  	{
  	  menu = XmCreatePulldownMenu (XtParent (widget), XtName (widget), NULL, 0);
! 	  make_menu_in_widget (instance, menu, contents, 0);
  	  ac = 0;
  	  XtSetArg (al [ac], XmNsubMenuId, menu); ac++;
*************** xm_update_menu (instance, widget, val, d
*** 495,531 ****
       Boolean deep_p;
  {
    /* Widget is a RowColumn widget whose contents have to be updated
     * to reflect the list of items in val->contents */
-   if (val->contents->change == STRUCTURAL_CHANGE)
-     {
-       destroy_all_children (widget);
-       make_menu_in_widget (instance, widget, val->contents);
-     }
-   else
-     {
-       /* Update all the buttons of the RowColumn in order. */
-       Widget* children;
-       unsigned int num_children;
-       int i;
-       widget_value* cur;
  
!       children = XtCompositeChildren (widget, &num_children);
        if (children)
  	{
! 	  for (i = 0, cur = val->contents; i < num_children; i++)
  	    {
! 	      if (!cur)
! 		abort ();
! 	      if (children [i]->core.being_destroyed
! 		  || strcmp (XtName (children [i]), cur->name))
! 		continue;
! 	      update_one_menu_entry (instance, children [i], cur, deep_p);
! 	      cur = cur->next;
  	    }
! 	  XtFree ((char *) children);
  	}
-       if (cur)
- 	abort ();
      }
  }
  
--- 532,593 ----
       Boolean deep_p;
  {
+   Widget* children;
+   unsigned int num_children;
+   int num_children_to_keep = 0;
+   int i;
+   widget_value* cur;
+ 
+   children = XtCompositeChildren (widget, &num_children);
+ 
    /* Widget is a RowColumn widget whose contents have to be updated
     * to reflect the list of items in val->contents */
  
!   /* See how many buttons we can keep, and how many we
!      must completely replace.  */
!   if (val->contents == 0)
!     num_children_to_keep = 0;
!   else if (val->contents->change == STRUCTURAL_CHANGE)
!     {
        if (children)
  	{
! 	  for (i = 0, cur = val->contents; i < num_children;
! 	       i++, cur = cur->next)
  	    {
! 	      if (cur->this_one_change == STRUCTURAL_CHANGE)
! 		break;
  	    }
! 
! 	  num_children_to_keep = i;
  	}
      }
+   else
+     num_children_to_keep = num_children;
+ 
+   /* Update all the buttons of the RowColumn, in order,
+      except for those we are going to replace entirely.  */
+   if (children)
+     {
+       for (i = 0, cur = val->contents; i < num_children_to_keep; i++)
+ 	{
+ 	  if (!cur)
+ 	    abort ();
+ 	  if (children [i]->core.being_destroyed
+ 	      || strcmp (XtName (children [i]), cur->name))
+ 	    continue;
+ 	  update_one_menu_entry (instance, children [i], cur, deep_p);
+ 	  cur = cur->next;
+ 	}
+     }
+ 
+   /* Now replace from scratch all the buttons after the last
+      place that the top-level structure changed.  */
+   if (val->contents->change == STRUCTURAL_CHANGE)
+     {
+       destroy_all_children (widget, num_children_to_keep);
+       make_menu_in_widget (instance, widget, val->contents,
+ 			   num_children_to_keep);
+     }
+ 
+   XtFree ((char *) children);
  }
  
*************** xm_update_one_value (instance, widget, v
*** 727,731 ****
     we pass a NULL argument in the call_data which is not Motif compatible.
     This is used from the XmNdefaultAction callback of the List widgets to
!    have a dble-click put down a dialog box like the button woudl do. 
     I could not find a way to do that with accelerators.
   */
--- 789,793 ----
     we pass a NULL argument in the call_data which is not Motif compatible.
     This is used from the XmNdefaultAction callback of the List widgets to
!    have a double-click put down a dialog box like the button would do. 
     I could not find a way to do that with accelerators.
   */
*************** make_dialog (name, parent, pop_up_p, she
*** 842,846 ****
      }
  
!   /* invisible seperator button */
    ac = 0;
    XtSetArg (al[ac], XmNmappedWhenManaged, FALSE); ac++;
--- 904,908 ----
      }
  
!   /* invisible separator button */
    ac = 0;
    XtSetArg (al[ac], XmNmappedWhenManaged, FALSE); ac++;
diff -2rcpP --exclude=*.elc emacs-19.30/lwlib/lwlib-int.h emacs-19.31/lwlib/lwlib-int.h
*** emacs-19.30/lwlib/lwlib-int.h	Mon Nov 28 04:13:31 1994
--- emacs-19.31/lwlib/lwlib-int.h	Thu Jan  4 15:44:41 1996
*************** typedef struct _widget_creation_entry
*** 43,47 ****
  
  /* update all other instances of a widget.  Can be used in a callback when
!    a wiget has been used by the user */
  void
  lw_internal_update_other_instances ();
--- 43,47 ----
  
  /* update all other instances of a widget.  Can be used in a callback when
!    a widget has been used by the user */
  void
  lw_internal_update_other_instances ();
diff -2rcpP --exclude=*.elc emacs-19.30/lwlib/lwlib-utils.c emacs-19.31/lwlib/lwlib-utils.c
*** emacs-19.30/lwlib/lwlib-utils.c	Sun Apr  9 00:56:34 1995
--- emacs-19.31/lwlib/lwlib-utils.c	Mon Jan 15 04:17:38 1996
*************** GNU General Public License for more deta
*** 16,24 ****
  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.  */
  
  #ifdef HAVE_CONFIG_H
  #include <config.h>
  #endif
  
  #include <X11/Xatom.h>
--- 16,32 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  #ifdef HAVE_CONFIG_H
  #include <config.h>
  #endif
+ 
+ /* Definitions of these in config.h can cause
+    declaration conflicts later on between declarations for index
+    and declarations for strchr.  This file doesn't use
+    index and rindex, so cancel them.  */
+ #undef index
+ #undef rindex
  
  #include <X11/Xatom.h>
diff -2rcpP --exclude=*.elc emacs-19.30/lwlib/lwlib.c emacs-19.31/lwlib/lwlib.c
*** emacs-19.30/lwlib/lwlib.c	Wed Aug  2 03:03:20 1995
--- emacs-19.31/lwlib/lwlib.c	Sun Mar 24 07:18:36 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  #ifdef NeXT
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  #ifdef NeXT
*************** char *lwlib_toolkit_type = "lucid";
*** 75,79 ****
  /* Forward declarations */
  static void
! instanciate_widget_instance (/* widget_instance* instance */);
  
  lwlib_memset (address, value, length)
--- 76,80 ----
  /* Forward declarations */
  static void
! instantiate_widget_instance (/* widget_instance* instance */);
  
  lwlib_memset (address, value, length)
*************** malloc_widget_value ()
*** 162,166 ****
  }
  
! /* this is analagous to free().  It frees only what was allocated
     by malloc_widget_value(), and no substructures. 
   */
--- 163,167 ----
  }
  
! /* this is analogous to free().  It frees only what was allocated
     by malloc_widget_value(), and no substructures. 
   */
*************** free_widget_value_tree (wv)
*** 201,205 ****
    if (wv->toolkit_data && wv->free_toolkit_data)
      {
!       free (wv->toolkit_data);
        wv->toolkit_data = (void *) 0xDEADBEEF;
      }
--- 202,206 ----
    if (wv->toolkit_data && wv->free_toolkit_data)
      {
!       XtFree (wv->toolkit_data);
        wv->toolkit_data = (void *) 0xDEADBEEF;
      }
*************** copy_widget_value_tree (val, change)
*** 238,241 ****
--- 239,243 ----
    copy->edited = False;
    copy->change = change;
+   copy->this_one_change = change;
    copy->contents = copy_widget_value_tree (val->contents, change);
    copy->call_data = val->call_data;
*************** allocate_widget_instance (info, parent, 
*** 311,315 ****
    info->instances = instance;
  
!   instanciate_widget_instance (instance);
  
    XtAddCallback (instance->widget, XtNdestroyCallback,
--- 313,317 ----
    info->instances = instance;
  
!   instantiate_widget_instance (instance);
  
    XtAddCallback (instance->widget, XtNdestroyCallback,
*************** merge_widget_value (val1, val2, level)
*** 439,443 ****
       int level;
  {
!   change_type change;
    widget_value* merged_next;
    widget_value* merged_contents;
--- 441,445 ----
       int level;
  {
!   change_type change, this_one_change;
    widget_value* merged_next;
    widget_value* merged_contents;
*************** merge_widget_value (val1, val2, level)
*** 511,517 ****
        if (val1->contents && !merged_contents)
  	{
! 	  EXPLAIN (val1->name, change, INVISIBLE_CHANGE, "(contents gone)",
  		   0, 0);
! 	  change = max (change, INVISIBLE_CHANGE);
  	}
        else if (merged_contents && merged_contents->change != NO_CHANGE)
--- 513,524 ----
        if (val1->contents && !merged_contents)
  	{
! 	  /* This used to say INVISIBLE_CHANGE,
! 	     but it is visible and vitally important when
! 	     the contents of the menu bar itself are entirely deleted.
! 
! 	     But maybe it doesn't matter.  This fails to fix the bug.  */
! 	  EXPLAIN (val1->name, change, STRUCTURAL_CHANGE, "(contents gone)",
  		   0, 0);
! 	  change = max (change, STRUCTURAL_CHANGE);
  	}
        else if (merged_contents && merged_contents->change != NO_CHANGE)
*************** merge_widget_value (val1, val2, level)
*** 525,528 ****
--- 532,537 ----
      }
  
+   this_one_change = change;
+ 
    merged_next = merge_widget_value (val1->next, val2->next, level);
  
*************** merge_widget_value (val1, val2, level)
*** 543,546 ****
--- 552,556 ----
    val1->next = merged_next;
  
+   val1->this_one_change = this_one_change;
    val1->change = change;
    
*************** merge_widget_value (val1, val2, level)
*** 548,552 ****
      {
        if (val1->free_toolkit_data)
! 	free (val1->toolkit_data);
        val1->toolkit_data = NULL;
      }
--- 558,562 ----
      {
        if (val1->free_toolkit_data)
! 	XtFree (val1->toolkit_data);
        val1->toolkit_data = NULL;
      }
*************** dialog_spec_p (name)
*** 760,764 ****
  
  static void
! instanciate_widget_instance (instance)
       widget_instance* instance;
  {
--- 770,774 ----
  
  static void
! instantiate_widget_instance (instance)
       widget_instance* instance;
  {
*************** lw_get_widget_value_for_widget (instance
*** 1197,1200 ****
--- 1207,1214 ----
  
  /* update other instances value when one thing changed */
+ 
+ /* To forbid recursive calls */
+ static Boolean lwlib_updating;
+ 
  /* This function can be used as a an XtCallback for the widgets that get 
    modified to update other instances of the widgets.  Closure should be the
*************** lw_internal_update_other_instances (widg
*** 1206,1212 ****
       XtPointer call_data;
  {
-   /* To forbid recursive calls */
-   static Boolean updating;
-   
    widget_instance* instance = (widget_instance*)closure;
    char* name = XtName (widget);
--- 1220,1223 ----
*************** lw_internal_update_other_instances (widg
*** 1215,1220 ****
    widget_value* val;
  
!   /* never recurse as this could cause infinite recursions. */
!   if (updating)
      return;
  
--- 1226,1231 ----
    widget_value* val;
  
!   /* Avoid possibly infinite recursion.  */
!   if (lwlib_updating)
      return;
  
*************** lw_internal_update_other_instances (widg
*** 1228,1232 ****
      return;
  
!   updating = True;
  
    for (val = info->val; val && strcmp (val->name, name); val = val->next);
--- 1239,1243 ----
      return;
  
!   lwlib_updating = True;
  
    for (val = info->val; val && strcmp (val->name, name); val = val->next);
*************** lw_internal_update_other_instances (widg
*** 1237,1241 ****
  	set_one_value (cur, val, True);
  
!   updating = False;
  }
  
--- 1248,1252 ----
  	set_one_value (cur, val, True);
  
!   lwlib_updating = False;
  }
  
*************** lw_window_is_in_menubar (win, menubar_wi
*** 1339,1345 ****
  #endif
  #if defined (USE_MOTIF)
!       && XtWindowToWidget (XtDisplay (menubar_widget), win)
!       && (XtParent (XtWindowToWidget (XtDisplay (menubar_widget), win))
! 	  == menubar_widget);
  #endif
  }
--- 1350,1357 ----
  #endif
  #if defined (USE_MOTIF)
!       && ((XtWindow (menubar_widget) == win)
! 	  || (XtWindowToWidget (XtDisplay (menubar_widget), win)
! 	      && (XtParent (XtWindowToWidget (XtDisplay (menubar_widget), win))
! 		  == menubar_widget)));
  #endif
  }
diff -2rcpP --exclude=*.elc emacs-19.30/lwlib/lwlib.h emacs-19.31/lwlib/lwlib.h
*** emacs-19.30/lwlib/lwlib.h	Wed Feb 15 05:29:52 1995
--- emacs-19.31/lwlib/lwlib.h	Sun Mar 24 06:27:31 1996
*************** typedef struct _widget_value
*** 49,52 ****
--- 49,55 ----
    /* true if has changed (maintained by lw library) */
    change_type	change;
+   /* true if this widget itself has changed,
+      but not counting the other widgets found in the `next' field.  */
+   change_type   this_one_change;
    /* Contents of the sub-widgets, also selected slot for checkbox */
    struct _widget_value*	contents;
*************** void lw_show_busy (/* Widget w, Boolean 
*** 103,107 ****
  
  /* Silly hack to assist with Lucid/Athena geometry management. */
! void lw_refigure_widget (/* Widget w, Boolan doit */);
  
  /* Toolkit independent way of determining if an event occurred on a
--- 106,110 ----
  
  /* Silly hack to assist with Lucid/Athena geometry management. */
! void lw_refigure_widget (/* Widget w, Boolean doit */);
  
  /* Toolkit independent way of determining if an event occurred on a
diff -2rcpP --exclude=*.elc emacs-19.30/lwlib/xlwmenu.c emacs-19.31/lwlib/xlwmenu.c
*** emacs-19.30/lwlib/xlwmenu.c	Wed Nov 15 18:00:20 1995
--- emacs-19.31/lwlib/xlwmenu.c	Fri Mar  1 14:39:57 1996
*************** XFontStruct *xlwmenu_default_font;
*** 38,44 ****
  static char 
  xlwMenuTranslations [] = 
! "<BtnDown>:	start()\n\
! <Motion>:	drag()\n\
! <BtnUp>:	select()\n\
  ";
  
--- 38,74 ----
  static char 
  xlwMenuTranslations [] = 
! "<BtnDown>:	  start()\n\
! <Motion>:	  drag()\n\
! <BtnUp>:	  select()\n\
! <Key>Shift_L:     nothing()\n\
! <Key>Shift_R:     nothing()\n\
! <Key>Meta_L:      nothing()\n\
! <Key>Meta_R:      nothing()\n\
! <Key>Control_L:   nothing()\n\
! <Key>Control_R:   nothing()\n\
! <Key>Hyper_L:     nothing()\n\
! <Key>Hyper_R:     nothing()\n\
! <Key>Super_L:     nothing()\n\
! <Key>Super_R:     nothing()\n\
! <Key>Alt_L:       nothing()\n\
! <Key>Alt_R:       nothing()\n\
! <Key>Caps_Lock:   nothing()\n\
! <Key>Shift_Lock:  nothing()\n\
! <KeyUp>Shift_L:   nothing()\n\
! <KeyUp>Shift_R:   nothing()\n\
! <KeyUp>Meta_L:    nothing()\n\
! <KeyUp>Meta_R:    nothing()\n\
! <KeyUp>Control_L: nothing()\n\
! <KeyUp>Control_R: nothing()\n\
! <KeyUp>Hyper_L:   nothing()\n\
! <KeyUp>Hyper_R:   nothing()\n\
! <KeyUp>Super_L:   nothing()\n\
! <KeyUp>Super_R:   nothing()\n\
! <KeyUp>Alt_L:     nothing()\n\
! <KeyUp>Alt_R:     nothing()\n\
! <KeyUp>Caps_Lock: nothing()\n\
! <KeyUp>Shift_Lock:nothing()\n\
! <Key>:            key()\n\
! <KeyUp>:          key()\n\
  ";
  
*************** static void Start();
*** 98,101 ****
--- 128,133 ----
  static void Drag();
  static void Select();
+ static void Key();
+ static void Nothing();
  
  static XtActionsRec 
*************** xlwMenuActionsList [] =
*** 105,108 ****
--- 137,142 ----
    {"drag",		Drag},
    {"select",		Select},
+   {"key",		Key},
+   {"nothing",		Nothing},
  };
  
*************** remap_menubar (mw)
*** 815,819 ****
    mw->menu.old_depth = new_depth;
  
!   /* refresh the last seletion */
    selection_position.x = 0;
    selection_position.y = 0;
--- 849,853 ----
    mw->menu.old_depth = new_depth;
  
!   /* refresh the last selection */
    selection_position.x = 0;
    selection_position.y = 0;
*************** motion_event_is_in_menu (mw, ev, level, 
*** 859,864 ****
  {
    window_state* ws = &mw->menu.windows [level];
!   unsigned int x = level == 0 ? ws->x : ws->x + mw->menu.shadow_thickness;
!   unsigned int y = level == 0 ? ws->y : ws->y + mw->menu.shadow_thickness;
    relative_pos->x = ev->x_root - x;
    relative_pos->y = ev->y_root - y;
--- 893,898 ----
  {
    window_state* ws = &mw->menu.windows [level];
!   int x = level == 0 ? ws->x : ws->x + mw->menu.shadow_thickness;
!   int y = level == 0 ? ws->y : ws->y + mw->menu.shadow_thickness;
    relative_pos->x = ev->x_root - x;
    relative_pos->y = ev->y_root - y;
*************** XlwMenuSetValues (current, request, new)
*** 1252,1255 ****
--- 1286,1294 ----
        && newmw->menu.contents->contents->change >= VISIBLE_CHANGE)
      redisplay = True;
+   /* Do redisplay if the contents are entirely eliminated.  */
+   if (newmw->menu.contents
+       && newmw->menu.contents->contents == 0
+       && newmw->menu.contents->change >= VISIBLE_CHANGE)
+     redisplay = True;
  
    if (newmw->core.background_pixel != oldmw->core.background_pixel
*************** Drag (w, ev, params, num_params)
*** 1379,1383 ****
  }
  
! static void 
  Select (w, ev, params, num_params)
       Widget w;
--- 1418,1465 ----
  }
  
! /* Do nothing.
!    This is how we handle presses and releases of modifier keys.  */
! static void
! Nothing (w, ev, params, num_params)
!      Widget w;
!      XEvent *ev;
!      String *params;
!      Cardinal *num_params;
! {
! }
! 
! /* Handle key press and release events while menu is popped up.
!    Our action is to get rid of the menu.  */
! static void
! Key (w, ev, params, num_params)
!      Widget w;
!      XEvent *ev;
!      String *params;
!      Cardinal *num_params;
! {
!   XlwMenuWidget mw = (XlwMenuWidget)w;
! 
!   /* Pop down everything.  */
!   mw->menu.new_depth = 1;
!   remap_menubar (mw);
! 
!   if (mw->menu.popped_up)
!     {
!       mw->menu.popped_up = False;
!       XtUngrabPointer ((Widget)mw, ev->xmotion.time);
!       if (XtIsShell (XtParent ((Widget) mw)))
! 	XtPopdown (XtParent ((Widget) mw));
!       else
! 	{
! 	  XtRemoveGrab ((Widget) mw);
! 	  display_menu (mw, 0, False, NULL, NULL, NULL, NULL, NULL);
! 	}
!     }
! 
!   /* callback */
!   XtCallCallbackList ((Widget)mw, mw->menu.select, (XtPointer)0);
! }
! 
! static void
  Select (w, ev, params, num_params)
       Widget w;
diff -2rcpP --exclude=*.elc emacs-19.30/lwlib/xrdb-cpp.c emacs-19.31/lwlib/xrdb-cpp.c
*** emacs-19.30/lwlib/xrdb-cpp.c	Mon May  9 18:42:35 1994
--- emacs-19.31/lwlib/xrdb-cpp.c	Mon Jan 15 03:32:27 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  /* This code reads a resource database file and filters it through cpp
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* This code reads a resource database file and filters it through cpp
diff -2rcpP --exclude=*.elc emacs-19.30/make-dist emacs-19.31/make-dist
*** emacs-19.30/make-dist	Sat Nov 25 00:45:10 1995
--- emacs-19.31/make-dist	Fri May  3 17:46:43 1996
*************** progname="$0"
*** 33,53 ****
  ### set -v
  
! clean_up=yes
! make_tar=yes
  newer=""
  
  while [ $# -gt 0 ]; do
    case "$1" in
!     ## This option tells make-dist not to delete the staging directory
!     ## after it's done making the tar file.
!     "--no-clean-up" )
!       clean_up=no
      ;;
!     ## This option tells make-dist not to make a tar file.  Since it's 
!     ## rather pointless to build the whole staging directory and then
!     ## nuke it, using this option also selects '--no-clean-up'.
!     "--no-tar" )
!       make_tar=no
!       clean_up=no
      ;;
      ## This option tells make-dist to make the distribution normally, then
--- 33,50 ----
  ### set -v
  
! clean_up=no
! make_tar=no
  newer=""
  
  while [ $# -gt 0 ]; do
    case "$1" in
!     ## This option tells make-dist to delete the staging directory
!     ## when done.  It is useless to use this unless you make a tar file.
!     "--clean-up" )
!       clean_up=yes
      ;;
!     ## This option tells make-dist to make a tar file.
!     "--tar" )
!       make_tar=yes
      ;;
      ## This option tells make-dist to make the distribution normally, then
*************** version=`grep 'defconst[	 ]*emacs-versio
*** 86,94 ****
  	 | sed -e 's/^[^"]*"\([^"]*\)".*$/\1/'`
  if [ ! "${version}" ]; then
!   echo "${progname}: can't find current Emacs version in \`./lisp/version.el'." >&2
    exit 1
  fi
  
! echo $version and $shortversion
  
  if grep -s "GNU Emacs version ${shortversion}" ./man/emacs.texi > /dev/null; then
--- 83,91 ----
  	 | sed -e 's/^[^"]*"\([^"]*\)".*$/\1/'`
  if [ ! "${version}" ]; then
!   echo "${progname}: can't find current Emacs version in \`./lisp/version.el'" >&2
    exit 1
  fi
  
! echo Version numbers are $version and $shortversion
  
  if grep -s "GNU Emacs version ${shortversion}" ./man/emacs.texi > /dev/null; then
*************** rm -f /tmp/el /tmp/elc
*** 132,138 ****
  ### Make sure configure is newer than configure.in.
  if [ "x`ls -t configure configure.in | head -1`" != "xconfigure" ]; then
!   echo "\`./configure.in' seems to be newer than \`./configure.'" >&2
!   echo "Attempting to run autoconf." >&2
!   autoconf
  fi
  
--- 129,135 ----
  ### Make sure configure is newer than configure.in.
  if [ "x`ls -t configure configure.in | head -1`" != "xconfigure" ]; then
!   echo "\`./configure.in' is newer than \`./configure'" >&2
!   echo "Running autoconf" >&2
!   autoconf || { x=$?; echo Autoconf FAILED! >&2; exit $x; }
  fi
  
*************** fi
*** 140,156 ****
  (cd lib-src; make -f Makefile getdate.c YACC="bison -y")
  
! echo "Updating Info files."
  
  (cd man; make info)
  
! echo "Updating finder-inf.el."
  
! ### update finder-inf.el.
! (cd lisp; ../src/emacs -batch -l finder -f finder-compile-keywords)
! (cd lisp; ../src/emacs -batch -f batch-byte-compile finder-inf.el)
  
  echo "Making lisp/MANIFEST"
  
! (cd lisp; head -1 *.el | grep '^;' | sed -e 's/;;; //' > MANIFEST)
  
  echo "Creating staging directory: \`${tempparent}'"
--- 137,159 ----
  (cd lib-src; make -f Makefile getdate.c YACC="bison -y")
  
! echo "Updating Info files"
  
  (cd man; make info)
  
! echo "Updating finder-inf.el"
  
! (cd lisp; ../src/emacs -batch -l finder -f finder-compile-keywords-make-dist)
! 
! echo "Recompiling Lisp files"
! 
! src/emacs -batch -f batch-byte-recompile-directory lisp
! 
! echo "Updating autoloads"
! 
! src/emacs -batch -f batch-update-autoloads lisp
  
  echo "Making lisp/MANIFEST"
  
! (cd lisp; head -1 [!=]*.el | grep '^;' | sed -e 's/;;; //' > MANIFEST)
  
  echo "Creating staging directory: \`${tempparent}'"
*************** tempdir="${tempparent}/${emacsname}"
*** 162,166 ****
  ### when the script is interrupted in mid-career.
  if [ "${clean_up}" = yes ]; then
!   trap "echo 'Interrupted...cleaning up the staging directory.'; rm -rf ${tempparent}; exit 1" 1 2 15
  fi
  
--- 165,169 ----
  ### when the script is interrupted in mid-career.
  if [ "${clean_up}" = yes ]; then
!   trap "echo 'Interrupted...cleaning up the staging directory'; rm -rf ${tempparent}; exit 1" 1 2 15
  fi
  
*************** mkdir ${tempdir}
*** 172,176 ****
  ### tar file; this means that people can start reading the INSTALL and
  ### README while the rest of the tar file is still unpacking.  Whoopee.
! echo "Making links to top-level files." 
  ln GETTING.GNU.SOFTWARE INSTALL PROBLEMS README BUGS move-if-change ${tempdir}
  ln ChangeLog Makefile.in configure configure.in ${tempdir}
--- 175,179 ----
  ### tar file; this means that people can start reading the INSTALL and
  ### README while the rest of the tar file is still unpacking.  Whoopee.
! echo "Making links to top-level files"
  ln GETTING.GNU.SOFTWARE INSTALL PROBLEMS README BUGS move-if-change ${tempdir}
  ln ChangeLog Makefile.in configure configure.in ${tempdir}
*************** cp config.guess ${tempdir}
*** 182,186 ****
  cp install.sh ${tempdir}
  
! echo "Updating version number in README."
  (cd ${tempdir}
   awk \
--- 185,189 ----
  cp install.sh ${tempdir}
  
! echo "Updating version number in README"
  (cd ${tempdir}
   awk \
*************** echo "Updating version number in README.
*** 191,203 ****
  
  
! echo "Creating subdirectories."
  for subdir in lisp lisp/term site-lisp \
  	      src src/m src/s src/bitmaps lib-src oldXMenu lwlib \
! 	      nt nt/inc nt/inc/sys \
  	      etc etc/e lock cpp info man msdos vms; do
    mkdir ${tempdir}/${subdir}
  done
  
! echo "Making links to \`lisp'."
  ### Don't distribute TAGS, =*.el files, site-init.el, site-load.el, or default.el.
  (cd lisp
--- 194,206 ----
  
  
! echo "Creating subdirectories"
  for subdir in lisp lisp/term site-lisp \
  	      src src/m src/s src/bitmaps lib-src oldXMenu lwlib \
! 	      nt nt/inc nt/inc/sys nt/inc/arpa nt/inc/netinet \
  	      etc etc/e lock cpp info man msdos vms; do
    mkdir ${tempdir}/${subdir}
  done
  
! echo "Making links to \`lisp'"
  ### Don't distribute TAGS, =*.el files, site-init.el, site-load.el, or default.el.
  (cd lisp
*************** echo "Making links to \`lisp'."
*** 207,211 ****
   ## simula.el doesn't keep abbreviations in simula.defns any more.
   ## ln [a-zA-Z]*.defns ../${tempdir}/lisp
!  ln ChangeLog Makefile makefile.nt ChangeLog.? README dired.todo ../${tempdir}/lisp
   cd ../${tempdir}/lisp
   rm -f TAGS =*
--- 210,214 ----
   ## simula.el doesn't keep abbreviations in simula.defns any more.
   ## ln [a-zA-Z]*.defns ../${tempdir}/lisp
!  ln ChangeLog Makefile makefile.nt ChangeLog.? README ../${tempdir}/lisp
   cd ../${tempdir}/lisp
   rm -f TAGS =*
*************** echo "Making links to \`lisp'."
*** 216,220 ****
   rm -f default default.el default.elc)
  
! #echo "Making links to \`lisp/calc-2.02'."
  #### Don't distribute =*.el files, TAGS or backups.
  #(cd lisp/calc-2.02
--- 219,223 ----
   rm -f default default.el default.elc)
  
! #echo "Making links to \`lisp/calc-2.02'"
  #### Don't distribute =*.el files, TAGS or backups.
  #(cd lisp/calc-2.02
*************** echo "Making links to \`lisp'."
*** 226,230 ****
  # rm -f *~ TAGS)
  
! echo "Making links to \`lisp/term'."
  ### Don't distribute =*.el files or TAGS.
  (cd lisp/term
--- 229,233 ----
  # rm -f *~ TAGS)
  
! echo "Making links to \`lisp/term'"
  ### Don't distribute =*.el files or TAGS.
  (cd lisp/term
*************** echo "Making links to \`lisp/term'."
*** 234,238 ****
   rm -f =* TAGS)
  
! echo "Making links to \`src'."
  ### Don't distribute =*.[ch] files, or the configured versions of
  ### config.in, paths.in, or Makefile.in, or TAGS.
--- 237,241 ----
   rm -f =* TAGS)
  
! echo "Making links to \`src'"
  ### Don't distribute =*.[ch] files, or the configured versions of
  ### config.in, paths.in, or Makefile.in, or TAGS.
*************** echo "Making links to \`src'."
*** 253,270 ****
   rm -f =* TAGS)
  
! echo "Making links to \`src/bitmaps'."
  (cd src/bitmaps
   ln README *.xbm ../../${tempdir}/src/bitmaps)
  
! echo "Making links to \`src/m'."
  (cd src/m
   # We call files for miscellaneous input (to linker etc) .inp.
   ln README [a-zA-Z0-9]*.h *.inp ../../${tempdir}/src/m)
  
! echo "Making links to \`src/s'."
  (cd src/s
   ln README [a-zA-Z0-9]*.h ../../${tempdir}/src/s)
  
! echo "Making links to \`lib-src'."
  (cd lib-src
   ln [a-zA-Z]*.[chy] ../${tempdir}/lib-src
--- 256,273 ----
   rm -f =* TAGS)
  
! echo "Making links to \`src/bitmaps'"
  (cd src/bitmaps
   ln README *.xbm ../../${tempdir}/src/bitmaps)
  
! echo "Making links to \`src/m'"
  (cd src/m
   # We call files for miscellaneous input (to linker etc) .inp.
   ln README [a-zA-Z0-9]*.h *.inp ../../${tempdir}/src/m)
  
! echo "Making links to \`src/s'"
  (cd src/s
   ln README [a-zA-Z0-9]*.h ../../${tempdir}/src/s)
  
! echo "Making links to \`lib-src'"
  (cd lib-src
   ln [a-zA-Z]*.[chy] ../${tempdir}/lib-src
*************** echo "Making links to \`lib-src'."
*** 275,300 ****
   rm -f =* TAGS)
  
! echo "Making links to \`nt'."
  (cd nt
!  ln emacs.ico emacs.rc config.nt config.w95 [a-z]*.in [a-z]*.c ../${tempdir}/nt
   ln [a-z]*.bat [a-z]*.h makefile.def makefile.nt ../${tempdir}/nt
   ln TODO ChangeLog INSTALL README ../${tempdir}/nt)
  
! echo "Making links to \`nt/inc'."
  (cd nt/inc
   ln [a-z]*.h ../../${tempdir}/nt/inc)
  
! echo "Making links to \`nt/inc/sys'."
  (cd nt/inc/sys
   ln [a-z]*.h ../../../${tempdir}/nt/inc/sys)
  
! echo "Making links to \`msdos'."
  (cd msdos
   ln  ChangeLog emacs.ico emacs.pif ../${tempdir}/msdos
!  ln mainmake sed*.inp ../${tempdir}/msdos
   cd ../${tempdir}/msdos
   rm -f =*)
  
! echo "Making links to \`oldXMenu'."
  (cd oldXMenu
   ln *.c *.h *.in ../${tempdir}/oldXMenu
--- 278,311 ----
   rm -f =* TAGS)
  
! echo "Making links to \`nt'"
  (cd nt
!  ln emacs.ico emacs.rc config.nt [a-z]*.in [a-z]*.c ../${tempdir}/nt
   ln [a-z]*.bat [a-z]*.h makefile.def makefile.nt ../${tempdir}/nt
   ln TODO ChangeLog INSTALL README ../${tempdir}/nt)
  
! echo "Making links to \`nt/inc'"
  (cd nt/inc
   ln [a-z]*.h ../../${tempdir}/nt/inc)
  
! echo "Making links to \`nt/inc/sys'"
  (cd nt/inc/sys
   ln [a-z]*.h ../../../${tempdir}/nt/inc/sys)
  
! echo "Making links to \`nt/inc/arpa'"
! (cd nt/inc/arpa
!  ln [a-z]*.h ../../../${tempdir}/nt/inc/arpa)
! 
! echo "Making links to \`nt/inc/netinet'"
! (cd nt/inc/netinet
!  ln [a-z]*.h ../../../${tempdir}/nt/inc/netinet)
! 
! echo "Making links to \`msdos'"
  (cd msdos
   ln  ChangeLog emacs.ico emacs.pif ../${tempdir}/msdos
!  ln mainmake mainmake.v2 sed*.inp ../${tempdir}/msdos
   cd ../${tempdir}/msdos
   rm -f =*)
  
! echo "Making links to \`oldXMenu'"
  (cd oldXMenu
   ln *.c *.h *.in ../${tempdir}/oldXMenu
*************** echo "Making links to \`oldXMenu'."
*** 302,311 ****
   ln compile.com descrip.mms ../${tempdir}/oldXMenu)
  
! echo "Making links to \`lwlib'."
  (cd lwlib
   ln *.c *.h *.in ../${tempdir}/lwlib
!  ln README Imakefile ChangeLog ../${tempdir}/lwlib)
  
! echo "Making links to \`etc'."
  ### Don't distribute = files, TAGS, DOC files, backups, autosaves, or
  ### tex litter.
--- 313,324 ----
   ln compile.com descrip.mms ../${tempdir}/oldXMenu)
  
! echo "Making links to \`lwlib'"
  (cd lwlib
   ln *.c *.h *.in ../${tempdir}/lwlib
!  ln README Imakefile ChangeLog ../${tempdir}/lwlib
!  cd ../${tempdir}/lwlib
!  rm -f lwlib-Xol*)
  
! echo "Making links to \`etc'"
  ### Don't distribute = files, TAGS, DOC files, backups, autosaves, or
  ### tex litter.
*************** echo "Making links to \`etc'."
*** 316,320 ****
   rm -f TAGS)
  
! echo "Making links to \`etc/e'."
  (cd etc/e
   ln `ls -d * | grep -v 'RCS'` ../../${tempdir}/etc/e
--- 329,333 ----
   rm -f TAGS)
  
! echo "Making links to \`etc/e'"
  (cd etc/e
   ln `ls -d * | grep -v 'RCS'` ../../${tempdir}/etc/e
*************** echo "Making links to \`etc/e'."
*** 322,330 ****
   rm -f *~ \#*\# *,v =* core)
  
! echo "Making links to \`cpp'."
  (cd cpp
   ln cccp.c cexp.y Makefile README ../${tempdir}/cpp)
  
! echo "Making links to \`info'."
  # Don't distribute backups or autosaves.
  (cd info
--- 335,343 ----
   rm -f *~ \#*\# *,v =* core)
  
! echo "Making links to \`cpp'"
  (cd cpp
   ln cccp.c cexp.y Makefile README ../${tempdir}/cpp)
  
! echo "Making links to \`info'"
  # Don't distribute backups or autosaves.
  (cd info
*************** echo "Making links to \`info'."
*** 335,339 ****
   rm -f *~ \#*\# core)
  
! echo "Making links to \`man'."
  (cd man
   ln *.texi *.aux *.cps *.fns *.kys *.vrs ../${tempdir}/man
--- 348,352 ----
   rm -f *~ \#*\# core)
  
! echo "Making links to \`man'"
  (cd man
   ln *.texi *.aux *.cps *.fns *.kys *.vrs ../${tempdir}/man
*************** echo "Making links to \`man'."
*** 346,350 ****
   rm -f emacs.?? termcap.?? gdb.?? *.log *.toc *.dvi *.oaux)
  
! echo "Making links to \`vms'."
  (cd vms
   ln [0-9a-zA-Z]* ../${tempdir}/vms
--- 359,363 ----
   rm -f emacs.?? termcap.?? gdb.?? *.log *.toc *.dvi *.oaux)
  
! echo "Making links to \`vms'"
  (cd vms
   ln [0-9a-zA-Z]* ../${tempdir}/vms
*************** echo "Making links to \`vms'."
*** 354,358 ****
  ### It would be nice if they could all be symlinks to etc's copy, but
  ### you're not supposed to have any symlinks in distribution tar files.
! echo "Making sure copying notices are all copies of \`etc/COPYING'."
  rm -f ${tempdir}/etc/COPYING
  cp etc/COPYING ${tempdir}/etc/COPYING
--- 367,371 ----
  ### It would be nice if they could all be symlinks to etc's copy, but
  ### you're not supposed to have any symlinks in distribution tar files.
! echo "Making sure copying notices are all copies of \`etc/COPYING'"
  rm -f ${tempdir}/etc/COPYING
  cp etc/COPYING ${tempdir}/etc/COPYING
*************** done
*** 371,375 ****
  #### they'll have exactly two links normally.)
  ####
! #### Commented out since it's not stricly necessary; it should suffice
  #### to just break the link on alloca.c.
  #echo "Breaking intra-tree links."
--- 384,388 ----
  #### they'll have exactly two links normally.)
  ####
! #### Commented out since it's not strictly necessary; it should suffice
  #### to just break the link on alloca.c.
  #echo "Breaking intra-tree links."
*************** cp $tempdir/src/alloca.c $tempdir/lib-sr
*** 380,384 ****
  
  if [ "${newer}" ]; then
!   echo "Removing files older than $newer."
    ## We remove .elc files unconditionally, on the theory that anyone picking
    ## up an incremental distribution already has a running Emacs to byte-compile
--- 393,397 ----
  
  if [ "${newer}" ]; then
!   echo "Removing files older than $newer"
    ## We remove .elc files unconditionally, on the theory that anyone picking
    ## up an incremental distribution already has a running Emacs to byte-compile
*************** fi
*** 389,393 ****
  if [ "${make_tar}" = yes ]; then
    if [ "${default_gzip}" = "" ]; then
!     echo "Looking for gzip."
      temppath=`echo $PATH | sed 's/^:/.:/
  				s/::/:.:/g
--- 402,406 ----
  if [ "${make_tar}" = yes ]; then
    if [ "${default_gzip}" = "" ]; then
!     echo "Looking for gzip"
      temppath=`echo $PATH | sed 's/^:/.:/
  				s/::/:.:/g
*************** if [ "${make_tar}" = yes ]; then
*** 405,409 ****
      * )         gzip_extension=.gz ;;
    esac
!   echo "Creating tar file."
    (cd ${tempparent} ; tar cvf - ${emacsname} ) \
      | ${default_gzip} \
--- 418,422 ----
      * )         gzip_extension=.gz ;;
    esac
!   echo "Creating tar file"
    (cd ${tempparent} ; tar cvf - ${emacsname} ) \
      | ${default_gzip} \
*************** fi
*** 412,416 ****
  
  if [ "${clean_up}" = yes ]; then
!   echo "Cleaning up the staging directory."
    rm -rf ${tempparent}
  else
--- 425,429 ----
  
  if [ "${clean_up}" = yes ]; then
!   echo "Cleaning up the staging directory"
    rm -rf ${tempparent}
  else
diff -2rcpP --exclude=*.elc emacs-19.30/man/ChangeLog emacs-19.31/man/ChangeLog
*** emacs-19.30/man/ChangeLog	Fri Nov 24 23:41:34 1995
--- emacs-19.31/man/ChangeLog	Sat May 25 15:31:49 1996
***************
*** 1,2 ****
--- 1,17 ----
+ Sat May 25 15:30:10 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
+ 
+ 	* Version 19.31 released.
+ 
+ Sun Jan  7 22:55:57 1996  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
+ 
+ 	* Makefile.in (../info/ccmode): Renamed from ../info/cc-mode.
+ 	(INFO_TARGETS): Use new name.  This avoids name conflict on MSDOS.
+ 
+ Wed Nov 29 20:09:48 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* Makefile.in (../info/cc-mode, cc-mode.dvi): New targets.
+ 	(INFO_TARGETS): Add ../info/cc-mode.
+ 	(DVI_TARGETS): Add cc-mode.dvi.
+ 
  Fri Nov 24 23:41:30 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
diff -2rcpP --exclude=*.elc emacs-19.30/man/Makefile.in emacs-19.31/man/Makefile.in
*** emacs-19.30/man/Makefile.in	Mon Jun 26 03:42:30 1995
--- emacs-19.31/man/Makefile.in	Sat Feb 17 23:54:37 1996
*************** VPATH=@srcdir@
*** 13,21 ****
  # The makeinfo program is part of the Texinfo distribution.
  MAKEINFO = makeinfo
! INFO_TARGETS = ../info/emacs ../info/cl ../info/dired-x ../info/ediff \
! 	       ../info/forms ../info/gnus ../info/info \
  	       ../info/mh-e ../info/sc ../info/vip ../info/viper
! DVI_TARGETS = emacs.dvi cl.dvi dired-x.dvi ediff.dvi forms.dvi gnus.dvi \
! 		 mh-e.dvi sc.dvi vip.dvi viper.dvi
  INFOSOURCES = info.texi info-stnd.texi
  
--- 13,21 ----
  # The makeinfo program is part of the Texinfo distribution.
  MAKEINFO = makeinfo
! INFO_TARGETS = ../info/emacs ../info/ccmode ../info/cl ../info/dired-x \
! 	       ../info/ediff ../info/forms ../info/gnus ../info/info \
  	       ../info/mh-e ../info/sc ../info/vip ../info/viper
! DVI_TARGETS = emacs.dvi cc-mode.dvi cl.dvi dired-x.dvi ediff.dvi forms.dvi \
! 		 gnus.dvi mh-e.dvi sc.dvi vip.dvi viper.dvi
  INFOSOURCES = info.texi info-stnd.texi
  
*************** info.dvi: ${INFOSOURCES}
*** 81,84 ****
--- 81,89 ----
  emacs.dvi: ${EMACSSOURCES}
  	$(TEXI2DVI) ${srcdir}/emacs.texi
+ 
+ ../info/ccmode: cc-mode.texi
+ 	$(MAKEINFO) cc-mode.texi
+ cc-mode.dvi: cc-mode.texi
+ 	$(TEXI2DVI) ${srcdir}/cc-mode.texi
  
  ../info/cl: cl.texi
diff -2rcpP --exclude=*.elc emacs-19.30/man/abbrevs.texi emacs-19.31/man/abbrevs.texi
*** emacs-19.30/man/abbrevs.texi	Fri Jun  2 16:46:08 1995
--- emacs-19.31/man/abbrevs.texi	Thu Dec 21 01:12:44 1995
*************** Abbrevs}.
*** 27,30 ****
--- 27,31 ----
  * Saving Abbrevs::    Saving the entire list of abbrevs for another session.
  * Dynamic Abbrevs::   Abbreviations for words already in the buffer.
+ * Dabbrev Customization:: What is a word, for dynamic abbrevs.  Case handling.
  @end menu
  
*************** Complete the word before point as a dyna
*** 324,327 ****
--- 325,329 ----
  @end table
  
+ @vindex dabbrev-limit
    For example, if the buffer contains @samp{does this follow } and you
  type @kbd{f o M-/}, the effect is to insert @samp{follow} because that
*************** expansion found looking backward from po
*** 331,336 ****
  searches for an alternative expansion by looking farther back.  After
  considering the entire buffer before point, it searches the text after
! point.  After searching all of the current buffer, @kbd{M-/} searches
! other buffers.
  
    A negative argument to @kbd{M-/}, as in @kbd{C-u - M-/}, says to
--- 333,343 ----
  searches for an alternative expansion by looking farther back.  After
  considering the entire buffer before point, it searches the text after
! point.  The variable @code{dabbrev-limit}, if non-@code{nil}, specifies
! how far in the buffer to search for an expansion.
! 
! @vindex dabbrev-check-all-buffers
!   After searching all of the current buffer, @kbd{M-/} normally searches
! other buffers, unless you have set @code{dabbrev-check-all-buffers} to
! @code{nil}.
  
    A negative argument to @kbd{M-/}, as in @kbd{C-u - M-/}, says to
*************** words that follow the expansion in its o
*** 345,356 ****
  punctuation between words is copied along with the words.
  
- @vindex dabbrev-abbrev-skip-leading-regexp
-   In shell scripts and makefiles, a variable name is sometimes prefixed
- with @samp{$} and sometimes not.  Major modes for this kind of text can
- customize dynamic abbreviation to handle optional prefixes by setting
- the variable @code{dabbrev-abbrev-skip-leading-regexp}.  Its value
- should be a regular expression that matches the optional prefix that
- dynamic abbreviation should ignore.
- 
    The command @kbd{C-M-/} (@code{dabbrev-completion}) performs
  completion of a dynamic abbreviation.  Instead of trying the possible
--- 352,355 ----
*************** the usual manner.  @xref{Completion}.
*** 363,364 ****
--- 362,405 ----
  expansion of a word with @kbd{M-/} is completely independent of whether
  it has a definition as an ordinary abbrev.
+ 
+ @node Dabbrev Customization
+ @section Customizing Dynamic Abbreviation
+ 
+ @vindex dabbrev-case-fold-search
+   Normally, dynamic abbrev expansion ignores case when searching for
+ expansions.  That is, the expansion need not agree in case with the
+ word you are expanding.  If you set @code{dabbrev-case-fold-search}
+ to @code{nil}, then the word and the expansion must match in case.
+ 
+ @vindex dabbrev-case-replace
+   Normally, dynamic abbrev expansion preserves the case pattern @emph{of
+ the word you are expanding}, by converting the expansion to that case
+ pattern.  If you set @code{dabbrev-case-replace} to @code{nil}, the
+ expansion is copied without conversion.
+ 
+   The variables @code{dabbrev-case-fold-search} and
+ @code{dabbrev-case-replace} are handled in a special way.  Their values
+ are actually Lisp expressions which are evaluated each time a decision
+ needs to be made.  If the expression's value is non-@code{nil}, then
+ case is ignored in searching, or converted on replacement, respectively.
+ If the expression's value is @code{nil}, the action is not done.  The
+ default values let the variables @code{case-fold-search} (@pxref{Search
+ Case}) and @code{case-replace} (@pxref{Replacement and Case}) control
+ what to do.
+ 
+ @vindex dabbrev-abbrev-char-regexp
+   The variable @code{dabbrev-abbrev-char-regexp}, if non-@code{nil}
+ controls which characters are part of a word, for dynamic expansion
+ purposes.  The regular expression must match just one character, never
+ two or more.  The same regular expression also determines what
+ characters are part of an expansion.  The value @code{nil} has a special
+ meaning: abbreviations are made of word characters, but expansions are
+ made of word and symbol characters.
+ 
+ @vindex dabbrev-abbrev-skip-leading-regexp
+   In shell scripts and makefiles, a variable name is sometimes prefixed
+ with @samp{$} and sometimes not.  Major modes for this kind of text can
+ customize dynamic abbreviation to handle optional prefixes by setting
+ the variable @code{dabbrev-abbrev-skip-leading-regexp}.  Its value
+ should be a regular expression that matches the optional prefix that
+ dynamic abbreviation should ignore.
diff -2rcpP --exclude=*.elc emacs-19.30/man/ack.texi emacs-19.31/man/ack.texi
*** emacs-19.30/man/ack.texi	Wed Jun 28 06:07:30 1995
--- emacs-19.31/man/ack.texi	Thu Mar  7 17:19:53 1996
*************** decompression and recompression for comp
*** 21,25 ****
  
  @item
! Joe Arceneax wrote the original text property implementation, and
  implemented support for X11.
  
--- 21,25 ----
  
  @item
! Joe Arceneaux wrote the original text property implementation, and
  implemented support for X11.
  
*************** code.
*** 104,108 ****
  @item
  Michael Ernst wrote @file{reposition.el}, a command for recentering a
! function's source code and preceeding comment on the screen.
  
  @item
--- 104,108 ----
  @item
  Michael Ernst wrote @file{reposition.el}, a command for recentering a
! function's source code and preceding comment on the screen.
  
  @item
*************** data computed by Font-Lock mode.
*** 336,341 ****
  
  @item
! Bengt Martensson, Mark Shapiro, Mike Newton, and Aaron Larson wrote
! @file{bibtex.el}, a mode for editing Bib@TeX{} bibliography files.
   
  @item
--- 336,342 ----
  
  @item
! Bengt Martensson, Mark Shapiro, Mike Newton, Aaron Larson, and Stefan
! Schoef, wrote @file{bibtex.el}, a mode for editing Bib@TeX{}
! bibliography files.
   
  @item
*************** Soundex algorithm for comparing English 
*** 446,450 ****
  
  @item
! Franceso A. Potorti wrote @file{cmacexp.el}, providing a command which
  runs the C preprocessor on a region of a file and displays the results.
  
--- 447,451 ----
  
  @item
! Francesco A. Potorti wrote @file{cmacexp.el}, providing a command which
  runs the C preprocessor on a region of a file and displays the results.
  
diff -2rcpP --exclude=*.elc emacs-19.30/man/anti.texi emacs-19.31/man/anti.texi
*** emacs-19.30/man/anti.texi	Mon Jun  5 22:41:02 1995
--- emacs-19.31/man/anti.texi	Wed Jan 24 17:42:33 1996
***************
*** 4,12 ****
  
  @node Antinews, MS-DOS, Command Arguments, Top
! @appendix Emacs 19.28 Antinews
  
    For those users who live backwards in time, here is information about
! downgrading to Emacs version 19.28.  We hope you will enjoy the greater
! simplicity that results from the absence of certain Emacs 19.29
  features.
  
--- 4,12 ----
  
  @node Antinews, MS-DOS, Command Arguments, Top
! @appendix Emacs 19.28 and 19.29 Antinews
  
    For those users who live backwards in time, here is information about
! downgrading to Emacs version 19.28 or 19.29.  We hope you will enjoy the
! greater simplicity that results from the absence of certain Emacs 19.30
  features.
  
*************** This version doesn't support Windows NT,
*** 16,19 ****
--- 16,48 ----
  
  @item
+ In Emacs 19.28, or even 19.29, the features for controlling indentation
+ in C are much simpler.  There is a separate variable for each aspect of
+ indentation which you can control.  Here is a list of them:
+ 
+ @table @code
+ @item c-indent-level
+ Level of indentation of C statements with respect to containing block.
+ 
+ @item c-label-offset
+ Offset of C label lines and case statements relative to usual indentation.
+ 
+ @item c-continued-brace-offset
+ Extra indentation for substatements that start with open-braces.  This
+ is in addition to @code{c-continued-statement-offset}.@refill
+ 
+ @item c-continued-statement-offset
+ Extra indentation for lines not starting new statements.
+ 
+ @item c-brace-offset
+ Extra indentation for braces, compared with other text in same context.
+ 
+ @item c-brace-imaginary-offset
+ Imagined indentation of a C open brace that actually follows a statement.
+ 
+ @item c-argdecl-indent
+ Indentation level of declarations of C function arguments.
+ @end table
+ 
+ @item
  There is no support for editing formatted text.  The text formatter
  @TeX{} does a much better job of formatting than any formatted text
*************** you use must appear in this order: @samp
*** 75,77 ****
--- 104,119 ----
  @samp{-batch}, @samp{-q} or @samp{-no-init-file}, @samp{-no-site-file},
  @samp{-u} or @samp{-user}, @samp{-debug-init}.
+ 
+ @item
+ Many improvements which make various Emacs command work on MS-DOS are
+ gone.  For instance, you cannot print from within Emacs, @samp{Dired}
+ doesn't support shell wildcards in filenames, some packages use
+ filenames which are illegal in MS-DOS, @samp{display-time} doesn't work,
+ @samp{font-lock} won't work unless you create some faces by hand first,
+ and @samp{call-process} cannot redirect @code{stderr}.  As an additional
+ bonus, you get random characters inserted into the buffer without a
+ warning (unless you're smart enough to discover that setting
+ @var{visible-bell} makes this problem to go away).  In a word, it's a
+ great relief for those who still need proof that MS-DOG isn't an
+ operating system for someone who uses Emacs.
  @end itemize
diff -2rcpP --exclude=*.elc emacs-19.30/man/autotype.texi emacs-19.31/man/autotype.texi
*** emacs-19.30/man/autotype.texi	Thu Aug 31 19:53:29 1995
--- emacs-19.31/man/autotype.texi	Thu Jan  4 15:53:49 1996
*************** over and over again.  This is especially
*** 13,17 ****
  language constructs.  Project-specific header comments, flow-control
  constructs or magic numbers are essentially the same every time.  Emacs has
! various features for doing tedious and repetetive typing chores for you.
  
    One solution is using skeletons, flexible rules that say what to
--- 13,17 ----
  language constructs.  Project-specific header comments, flow-control
  constructs or magic numbers are essentially the same every time.  Emacs has
! various features for doing tedious and repetitive typing chores for you.
  
    One solution is using skeletons, flexible rules that say what to
*************** put at these places.  Point is left at f
*** 172,176 ****
  @item >
  Indent line according to major mode.  When following element is @code{_}, and
! there is a interregion that will be wrappped here, indent that interregion.
  @item &
  Logical and.  Iff preceding element moved point, i.e. usually inserted
--- 172,176 ----
  @item >
  Indent line according to major mode.  When following element is @code{_}, and
! there is a interregion that will be wrapped here, indent that interregion.
  @item &
  Logical and.  Iff preceding element moved point, i.e. usually inserted
*************** File}).
*** 290,294 ****
  name, making an element applicable when a buffer is in that mode.  Or they
  can be a string, which is a regexp matched against the buffer's file name.
! In that way diferent kinds of files that have the same mode in Emacs can be
  distinguished.  The @code{car}s may also be @code{cons}-cells consisting of
  mode name or regexp as above and an additional descriptive string.
--- 290,294 ----
  name, making an element applicable when a buffer is in that mode.  Or they
  can be a string, which is a regexp matched against the buffer's file name.
! In that way different kinds of files that have the same mode in Emacs can be
  distinguished.  The @code{car}s may also be @code{cons}-cells consisting of
  mode name or regexp as above and an additional descriptive string.
diff -2rcpP --exclude=*.elc emacs-19.30/man/buffers.texi emacs-19.31/man/buffers.texi
*** emacs-19.30/man/buffers.texi	Fri Jun  2 16:46:14 1995
--- emacs-19.31/man/buffers.texi	Sun Mar 17 12:59:07 1996
*************** can also be used to switch to an existin
*** 90,93 ****
--- 90,98 ----
  @xref{Visiting}.
  
+   Emacs uses buffer names that start with a space for internal purposes.
+ It treats these buffers specially in minor ways---for example, by
+ default they do not record undo information.  It is best to avoid using
+ such buffer names yourself.
+ 
  @node List Buffers
  @section Listing Existing Buffers
diff -2rcpP --exclude=*.elc emacs-19.30/man/building.texi emacs-19.31/man/building.texi
*** emacs-19.30/man/building.texi	Thu Jun 29 19:14:36 1995
--- emacs-19.31/man/building.texi	Tue May 21 11:44:43 1996
*************** string @samp{Compiling} appears in the m
*** 86,89 ****
--- 86,96 ----
  this string disappears, the compilation is finished.
  
+   If you want to watch the compilation transcript as it appears, switch
+ to the @samp{*compilation*} buffer and move point to the end of the
+ buffer.  When point is at the end, new compilation output is inserted
+ above point, which remains at the end.  If point is not at the end of
+ the buffer, it remains fixed while more compilation output is added at
+ the end of the buffer.
+ 
  @findex kill-compilation
    To kill the compilation process, do @kbd{M-x kill-compilation}.  When
*************** stops for some other reason).
*** 401,404 ****
--- 408,415 ----
  that makes sense.
  
+   Because @key{TAB} serves as a completion command, you can't use it to
+ enter a tab as input to the program you are debugging with GDB.
+ Instead, type @kbd{C-q @key{TAB}} to enter a tab.
+ 
  @node GUD Customization
  @subsection GUD Customization
*************** The mode for an interactive session with
*** 494,514 ****
  @end table
  
- @iftex
    Most editing commands for working with Lisp programs are in fact
  available globally.  @xref{Programs}.
- @end iftex
- @menu
- These subnodes of the chapter on editing programs describe the editing
- commands for working with Lisp programs, which are in fact available
- globally.
- 
- * Lists::	      Expressions with balanced parentheses.
- * List Commands::     The commands for working with list and sexps.
- * Defuns::	      Each program is made up of separate functions.
- 			There are editing commands to operate on them.
- * Program Indent::    Adjusting indentation to show the nesting.
- * Matching::	      Insertion of a close-delimiter flashes matching open.
- * Comments::	      Inserting, killing, and aligning comments.
- @end menu
  
  @node Lisp Libraries
--- 505,510 ----
diff -2rcpP --exclude=*.elc emacs-19.30/man/calendar.texi emacs-19.31/man/calendar.texi
*** emacs-19.30/man/calendar.texi	Tue Nov 21 14:41:37 1995
--- emacs-19.31/man/calendar.texi	Tue May 21 11:44:36 1996
*************** argument which specifies how many days, 
*** 364,372 ****
  (starting always with the selected one).
  
!   If the variable @code{cal-text-holidays} is non-@code{nil}, then the
! printed calendars show the holidays in @code{calendar-holidays}.  If the
! variable @code{cal-tex-diary} is non-@code{nil} (the default is
! @code{nil}), diary entries are included also (in weekly and monthly
! calendars only).
  
  @node Holidays
--- 364,372 ----
  (starting always with the selected one).
  
!   If the variable @code{cal-text-holidays} is non-@code{nil} (the
! default), then the printed calendars show the holidays in
! @code{calendar-holidays}.  If the variable @code{cal-tex-diary} is
! non-@code{nil} (the default is @code{nil}), diary entries are included
! also (in weekly and monthly calendars only).
  
  @node Holidays
*************** Display holidays for the selected date
*** 382,386 ****
  (@code{calendar-cursor-holidays}).
  @item Mouse-2 Holidays
! Display any diary entries for the date you click on.
  @item x
  Mark holidays in the calendar window (@code{mark-calendar-holidays}).
--- 382,386 ----
  (@code{calendar-cursor-holidays}).
  @item Mouse-2 Holidays
! Display any holidays for the date you click on.
  @item x
  Mark holidays in the calendar window (@code{mark-calendar-holidays}).
*************** Goodman-Martinez-Thompson correlation in
*** 638,645 ****
    The Copts use a calendar based on the ancient Egyptian solar calendar.
  Their calendar consists of twelve 30-day months followed by an extra
! five day period.  Once every fourth year they add a leap day is added to
! this extra period to make it six days.  The Ethiopic calendar is
! identical in structure, but has a different year numbers and month
! names.
  
  @cindex Chinese calendar
--- 638,651 ----
    The Copts use a calendar based on the ancient Egyptian solar calendar.
  Their calendar consists of twelve 30-day months followed by an extra
! five day period.  Once every fourth year they add a leap day to this
! extra period to make it six days.  The Ethiopic calendar is identical in
! structure, but has a different year numbers and month names.
! 
! @cindex Persian calendar
!   The Persians use a solar calendar based on a design of Omar Khayyam.
! Their calendar consists of twelve months of which the first six have 31
! days, the next five have 30 days, and the last has 29 in ordinary years
! and 30 in leap years.  Leap years occur in a complicated pattern every
! four or five years.
  
  @cindex Chinese calendar
*************** either twelve months in an ordinary year
*** 649,653 ****
  year; each month has either 29 or 30 days.  Years, ordinary months, and
  days are named by combining one of ten ``celestial stems'' with one of
! twelve ``terrestial branchs'' for a total of sixty names that are
  repeated in a cycle of sixty.
  
--- 655,659 ----
  year; each month has either 29 or 30 days.  Years, ordinary months, and
  days are named by combining one of ten ``celestial stems'' with one of
! twelve ``terrestrial branches'' for a total of sixty names that are
  repeated in a cycle of sixty.
  
*************** Display Coptic date for selected day
*** 695,698 ****
--- 701,708 ----
  Display Ethiopic date for selected day
  (@code{calendar-print-ethiopic-date}).
+ @findex calendar-print-persian-date
+ @item p p
+ Display Perisan date for selected day
+ (@code{calendar-print-persian-date}).
  @findex calendar-print-mayan-date
  @item p m
*************** Display Mayan date for selected day (@co
*** 700,709 ****
  @end table
  
!   If you are using X windows, the easiest way to translate a date into
! other calendars is to click on it with @kbd{Mouse-2}, then choose
! @kbd{Other Calendars} from the menu that appears.  This displays the
! equivalent forms of the date in all the calendars Emacs understands, in
! the form of a menu.  (Choosing an alternative from this menu doesn't
! actually do anything---the menu is used only for display.)
  
    Put point on the desired date of the Gregorian calendar, then type the
--- 710,719 ----
  @end table
  
!   If you are using X, the easiest way to translate a date into other
! calendars is to click on it with @kbd{Mouse-2}, then choose @kbd{Other
! Calendars} from the menu that appears.  This displays the equivalent
! forms of the date in all the calendars Emacs understands, in the form of
! a menu.  (Choosing an alternative from this menu doesn't actually do
! anything---the menu is used only for display.)
  
    Put point on the desired date of the Gregorian calendar, then type the
*************** other than Mayan; for the Mayan calendar
*** 726,729 ****
--- 736,740 ----
  @findex calendar-goto-french-date
  @findex calendar-goto-chinese-date
+ @findex calendar-goto-persian-date
  @findex calendar-goto-coptic-date
  @findex calendar-goto-ethiopic-date
*************** Move to a date specified in the French R
*** 750,753 ****
--- 761,767 ----
  Move to a date specified in the Chinese calendar
  (@code{calendar-goto-chinese-date}).
+ @item g p
+ Move to a date specified in the Persian calendar
+ (@code{calendar-goto-persian-date}).
  @item g k
  Move to a date specified in the Coptic calendar
*************** exiting Emacs.
*** 1154,1160 ****
  
    In addition to entries based on calendar dates, the diary file can
! contain @dfn{special entries} for regular events such as anniversaries.
  These entries are based on Lisp expressions (sexps) that Emacs evaluates
! as it scans the diary file.  Instead of a date, a special entry contains
  @samp{%%} followed by a Lisp expression which must begin and end with
  parentheses.  The Lisp expression determines which dates the entry
--- 1168,1174 ----
  
    In addition to entries based on calendar dates, the diary file can
! contain @dfn{sexp entries} for regular events such as anniversaries.
  These entries are based on Lisp expressions (sexps) that Emacs evaluates
! as it scans the diary file.  Instead of a date, a sexp entry contains
  @samp{%%} followed by a Lisp expression which must begin and end with
  parentheses.  The Lisp expression determines which dates the entry
*************** applies to.
*** 1162,1166 ****
  
    Calendar mode provides commands to insert certain commonly used
! special entries:
  
  @table @kbd
--- 1176,1180 ----
  
    Calendar mode provides commands to insert certain commonly used
! sexp entries:
  
  @table @kbd
*************** Thursday of January, February, and March
*** 1264,1268 ****
  entry applies to all months of the year.@refill
  
!   Most generally, special diary entries can perform arbitrary
  computations to determine when they apply.  @xref{Sexp Diary Entries,,
  Sexp Diary Entries, elisp, The Emacs Lisp Reference Manual}.
--- 1278,1282 ----
  entry applies to all months of the year.@refill
  
!   Most generally, sexp diary entries can perform arbitrary
  computations to determine when they apply.  @xref{Sexp Diary Entries,,
  Sexp Diary Entries, elisp, The Emacs Lisp Reference Manual}.
*************** minutes.  The value for Cambridge, Massa
*** 1389,1394 ****
  @vindex calendar-daylight-savings-ends-time
    The two variables @code{calendar-daylight-savings-starts-time} and
! @code{calendar-daylight-savings-ends-time} specify the number of
! minutes after midnight local time when the transition to and from
! daylight savings time should occur.  For Cambridge, both variables'
  values are 120.
--- 1403,1408 ----
  @vindex calendar-daylight-savings-ends-time
    The two variables @code{calendar-daylight-savings-starts-time} and
! @code{calendar-daylight-savings-ends-time} specify the number of minutes
! after midnight local time when the transition to and from daylight
! savings time should occur.  For Cambridge, Massachusetts both variables'
  values are 120.
diff -2rcpP --exclude=*.elc emacs-19.30/man/cc-mode.texi emacs-19.31/man/cc-mode.texi
*** emacs-19.30/man/cc-mode.texi	Thu Aug 31 16:12:21 1995
--- emacs-19.31/man/cc-mode.texi	Sat Feb 10 02:43:36 1996
***************
*** 5,9 ****
  @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  
! @setfilename  cc-mode.info
  @settitle     CC-MODE Version 4 Documentation
  @footnotestyle end
--- 5,10 ----
  @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  
! @comment This Info file name was chosen to avoid lossage on MSDOS.
! @setfilename  ../info/ccmode
  @settitle     CC-MODE Version 4 Documentation
  @footnotestyle end
***************
*** 18,27 ****
  @comment 
  @comment texinfo manual for @file{cc-mode.el} version 4
! @comment manual version: 2.30
  @comment generated from the original README file by Krishna Padmasola
  @comment <krishna@earth-gw.njit.edu>
  @comment 
  @comment Barry A. Warsaw <bwarsaw@cnri.reston.va.us>
! @comment Last modification: 1995/08/29 15:55:54
  @comment 
  @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
--- 19,28 ----
  @comment 
  @comment texinfo manual for @file{cc-mode.el} version 4
! @comment manual version: 2.35
  @comment generated from the original README file by Krishna Padmasola
  @comment <krishna@earth-gw.njit.edu>
  @comment 
  @comment Barry A. Warsaw <bwarsaw@cnri.reston.va.us>
! @comment Last modification: 1996/01/19 20:50:48
  @comment 
  @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
*************** Copyright @copyright{} 1995 Free Softwar
*** 52,56 ****
  @sp 2
  @center A GNU Emacs mode for editing C, C++, and Objective-C code.
! @center (manual revision: 2.30)
  @sp 2
  @center Barry A. Warsaw
--- 53,57 ----
  @sp 2
  @center A GNU Emacs mode for editing C, C++, and Objective-C code.
! @center (manual revision: 2.35)
  @sp 2
  @center Barry A. Warsaw
*************** Copyright @copyright{} 1995 Free Softwar
*** 111,115 ****
  @cindex BOCM
  Welcome to @code{cc-mode}, version 4.  This is a GNU Emacs mode for
! editing files containing C, C++, and Objective-C code.
  This incarnation of the mode is descendant from @file{c-mode.el} (also
  called "Boring Old C Mode" or BOCM @code{:-)}, and @file{c++-mode.el}
--- 112,116 ----
  @cindex BOCM
  Welcome to @code{cc-mode}, version 4.  This is a GNU Emacs mode for
! editing files containing C, C++, Objective-C, and Java code.
  This incarnation of the mode is descendant from @file{c-mode.el} (also
  called "Boring Old C Mode" or BOCM @code{:-)}, and @file{c++-mode.el}
*************** developed.
*** 122,128 ****
  @code{cc-mode} version 4 supports the editing of K&R and ANSI C,
  @dfn{ARM} @footnote{i.e. ``The Annotated C++ Reference Manual'', by
! Ellis and Stroustrup.} C++, and Objective-C files.  In this way, you can
! easily set up consistent coding styles for use in editing all C, C++,
! and Objective-C programs.
  
  This manual will describe the following:
--- 123,129 ----
  @code{cc-mode} version 4 supports the editing of K&R and ANSI C,
  @dfn{ARM} @footnote{i.e. ``The Annotated C++ Reference Manual'', by
! Ellis and Stroustrup.} C++, Objective-C, and Java files.  In this way,
! you can easily set up consistent coding styles for use in editing all C,
! C++, Objective-C, and Java programs.
  
  This manual will describe the following:
*************** refer to the package as @code{cc-mode}, 
*** 145,171 ****
  differentiate it from @file{c-mode.el}.  All of the variables, commands,
  and functions in @code{cc-mode} are prefixed with @code{c-<thing>}, and
! @code{c-mode}, @code{c++-mode}, and @code{objc-mode} entry points are
! provided.  This file is intended to be a replacement for
! @file{c-mode.el} and @file{c++-mode.el}.
  
  @findex c-version
  The major version number was incremented to 4 with the addition of
  @code{objc-mode}. To find the minor revision number of this release, use
! @kbd{M-x c-version RET}.  This release will be the last for major
! release version 4 and the last release for which Emacs 18 will be
! supported.  Work has already begun on @code{cc-mode} version 5.
! 
! XEmacs 19.11 (formerly Lucid Emacs) is distributed with @code{cc-mode}
! 4.85 as its default C and C++ editing modes; it has completely replaced
! @file{c-mode.el} and @file{c++-mode.el}.  If you have XEmacs 19.11 or
! 19.12 you should upgrade your @file{cc-mode.el} to version 4.241 (see
! @ref{Getting the latest cc-mode release}).  XEmacs 19.13 will be
! distributed with version 4.241.
  
  @cindex @file{cc-compat.el} file
! Both XEmacs and this distribution also contain a new file called
! @file{cc-compat.el} which should ease your transition from BOCM to
! @code{cc-mode}.  It currently comes unguaranteed and unsupported, but
! this may change for future versions.
  
  A special word of thanks goes to Krishna Padmasola for his work in
--- 146,170 ----
  differentiate it from @file{c-mode.el}.  All of the variables, commands,
  and functions in @code{cc-mode} are prefixed with @code{c-<thing>}, and
! @code{c-mode}, @code{c++-mode}, @code{objc-mode}, and @code{java-mode}
! entry points are provided.  This file is intended to be a replacement
! for @file{c-mode.el} and @file{c++-mode.el}.
  
  @findex c-version
  The major version number was incremented to 4 with the addition of
  @code{objc-mode}. To find the minor revision number of this release, use
! @kbd{M-x c-version RET}.  Work has already begun on @code{cc-mode}
! version 5, in which Emacs 18 will not be supported.
! 
! As of this writing (19-Jan-1996), both Emacs 19.30 and XEmacs 19.13 are
! distributed with @code{cc-mode}.  Emacs 19.31 and XEmacs 19.14 will both
! contain the latest version of cc-mode when it is released.  If you are
! running older versions of these Emacsen, you may want to upgrade your
! copy of @code{cc-mode}.  See @ref{Getting the latest cc-mode release}.
  
  @cindex @file{cc-compat.el} file
! This distribution also contains a file called @file{cc-compat.el}
! which should ease your transition from BOCM to @code{cc-mode}.  It
! currently comes unguaranteed and unsupported, but this may change for
! future versions.
  
  A special word of thanks goes to Krishna Padmasola for his work in
*************** and thanks to Krishna, it is now availab
*** 186,193 ****
  
  @file{cc-mode.el} works well with the 2 main branches of Emacs 19:
! XEmacs and the Emacs 19 maintained by the FSF.  FSF's Emacs 19 users
! will want to use Emacs version 19.21 or better, XEmacs users will want
! 19.6 or better.  Earlier versions of these Emacsen have deficiencies
! and/or bugs which will adversely affect the performance and usability of
  @code{cc-mode}.
  
--- 185,192 ----
  
  @file{cc-mode.el} works well with the 2 main branches of Emacs 19:
! XEmacs and the Emacs 19 maintained by the FSF.  Emacs 19 users will want
! to use Emacs version 19.21 or better, XEmacs users will want 19.6 or
! better.  Earlier versions of these Emacsen have deficiencies and/or bugs
! which will adversely affect the performance and usability of
  @code{cc-mode}.
  
*************** it is highly recommended that you upgrad
*** 202,211 ****
  version 5, Emacs 18 support will be dropped altogether.
  
! Note that XEmacs 19.13 already comes with the latest @code{cc-mode}
! version 4 preconfigured for your use.  You should be able to safely skip
! the rest of the setup information in this chapter.  XEmacs 19.11 and
! 19.12 ships older versions of @code{cc-mode}, so those users will want
! to continue reading to learn how to upgrade to the latest @code{cc-mode}
! version 4 (see @ref{Getting the latest cc-mode release}).
  
  @cindex @file{.emacs} file
--- 201,207 ----
  version 5, Emacs 18 support will be dropped altogether.
  
! Note that as of XEmacs 19.13 and Emacs 19.30, your Emacs already comes
! with @code{cc-mode} version 4 preconfigured for your use.  You should be
! able to safely skip the rest of the setup information in this chapter.
  
  @cindex @file{.emacs} file
*************** M-x byte-compile-file RET ~/mylisp/cc-mo
*** 252,258 ****
  @end example
  
! If you are running XEmacs 19.11 or 19.12, you can simply add the
! following to your @file{.emacs} file in order to upgrade to the latest
! version of @code{cc-mode}:
  @example
  
--- 248,255 ----
  @end example
  
! If you are running a version of Emacs or XEmacs that comes with
! @code{cc-mode} by default, you can simply add the following to your
! @file{.emacs} file in order to upgrade to the latest version of
! @code{cc-mode}:
  @example
  
*************** version of @code{cc-mode}:
*** 261,269 ****
  @end example
  
! Users of FSF's Emacs 19, Emacs 18, or of the older Lucid Emacs will
! probably be running an Emacs that has BOCM @file{c-mode.el} and possible
! @file{c++-mode.el} pre-dumped.  If your Emacs is dumped with either of
! these files you first need to make Emacs ``forget'' about those older
! modes.
  
  If you can do a @kbd{C-h v c-mode-map RET} without getting an error, you
--- 258,266 ----
  @end example
  
! Users of even older versions of Emacs 19, Emacs 18, or of the older
! Lucid Emacs will probably be running an Emacs that has BOCM
! @file{c-mode.el} and possible @file{c++-mode.el} pre-dumped.  If your
! Emacs is dumped with either of these files you first need to make Emacs
! ``forget'' about those older modes.
  
  If you can do a @kbd{C-h v c-mode-map RET} without getting an error, you
*************** After those lines you will want to add t
*** 289,292 ****
--- 286,290 ----
  (autoload 'c-mode    "cc-mode" "C Editing Mode" t)
  (autoload 'objc-mode "cc-mode" "Objective-C Editing Mode" t)
+ (autoload 'java-mode "cc-mode" "Java Editing Mode" t)
  
  @end group
*************** Next, you will want to set up Emacs so t
*** 307,311 ****
  @file{.emacs} file.  Note that this assumes you'll be editing @code{.h}
  and @code{.c} files as C, @code{.hh}, @code{.cc}, @code{.H}, and
! @code{.C} files as C++, and @code{.m} files as Objective-C. YMMV:
  @example
  @group
--- 305,310 ----
  @file{.emacs} file.  Note that this assumes you'll be editing @code{.h}
  and @code{.c} files as C, @code{.hh}, @code{.cc}, @code{.H}, and
! @code{.C} files as C++, @code{.m} files as Objective-C, and @code{.java}
! files as Java code. YMMV:
  @example
  @group
*************** and @code{.c} files as C, @code{.hh}, @c
*** 313,323 ****
  (setq auto-mode-alist
    (append
!     '(("\\.C$"  . c++-mode)
!       ("\\.H$"  . c++-mode)
!       ("\\.cc$" . c++-mode)
!       ("\\.hh$" . c++-mode)
!       ("\\.c$"  . c-mode)
!       ("\\.h$"  . c-mode)
!       ("\\.m$"  . objc-mode)
       ) auto-mode-alist))
  
--- 312,323 ----
  (setq auto-mode-alist
    (append
!     '(("\\.C$"    . c++-mode)
!       ("\\.H$"    . c++-mode)
!       ("\\.cc$"   . c++-mode)
!       ("\\.hh$"   . c++-mode)
!       ("\\.c$"    . c-mode)
!       ("\\.h$"    . c-mode)
!       ("\\.m$"    . objc-mode)
!       ("\\.java$" . java-mode)
       ) auto-mode-alist))
  
*************** You may already have some or all of thes
*** 330,341 ****
  That's all you need -- I know, I know, it sounds like a lot @code{:-)},
  but after you've done all this, you should only need to quit and restart
! Emacs.  The next time you visit a C, C++, or Objective-C file you should
! be using @code{cc-mode}.  You can check this easily by hitting
! @kbd{M-x c-version RET}
! in the @code{c-mode}, @code{c++-mode}, or @code{objc-mode} buffer.
! You should see this message in the echo area:
  @example
  
! Using @code{cc-mode} version 4.241.
  
  @end example
--- 330,342 ----
  That's all you need -- I know, I know, it sounds like a lot @code{:-)},
  but after you've done all this, you should only need to quit and restart
! Emacs.  The next time you visit a C, C++, Objective-C, or Java file you
! should be using @code{cc-mode}.  You can check this easily by hitting
! @kbd{M-x c-version RET} in the @code{c-mode}, @code{c++-mode}, or
! @code{objc-mode} buffer.  You should see this message in the echo area:
  @example
  
! Using @code{cc-mode} version 4.@var{xxx}
! 
! Where @var{xxx} is the latest release minor number.
  
  @end example
*************** of information (in lisp parlance, a @emp
*** 395,405 ****
  part is a @dfn{syntactic symbol}, and the second part is a @dfn{relative
  buffer position}.  Syntactic symbols describe elements of C code
! @footnote{or C++, or Objective-C code.  In general, for the rest of this
! manual I'll use the term ``C code'' to refer to all the C-like dialects,
! unless otherwise noted.}, e.g. @code{statement}, @code{substatement},
! @code{class-open}, @code{class-close}, etc.  @xref{Syntactic Symbols},
! for a complete list of currently recognized syntactic symbols and their
! semantics.  The variable @code{c-offsets-alist} also contains the list
! of currently supported syntactic symbols.
  
  Conceptually, a line of C code is always indented relative to the
--- 396,407 ----
  part is a @dfn{syntactic symbol}, and the second part is a @dfn{relative
  buffer position}.  Syntactic symbols describe elements of C code
! @footnote{or C++, Objective-C, or Java code.  In general, for the rest
! of this manual I'll use the term ``C code'' to refer to all the C-like
! dialects, unless otherwise noted.}, e.g. @code{statement},
! @code{substatement}, @code{class-open}, @code{class-close}, etc.
! @xref{Syntactic Symbols}, for a complete list of currently recognized
! syntactic symbols and their semantics.  The variable
! @code{c-offsets-alist} also contains the list of currently supported
! syntactic symbols.
  
  Conceptually, a line of C code is always indented relative to the
*************** Hitting @kbd{C-c C-s} on line 4 gives us
*** 475,479 ****
  
  @cindex substatement
! @cindex substatment block
  @noindent
  which tells us that this is a brace that @emph{opens} a substatement
--- 477,481 ----
  
  @cindex substatement
! @cindex substatement block
  @noindent
  which tells us that this is a brace that @emph{opens} a substatement
*************** enabled, you will see @samp{C/a} on the 
*** 648,652 ****
  that the @samp{C} would be replaced with @samp{C++} or @samp{ObjC} if
  you were editing C++ or Objective-C code.}.  When hungry delete mode is
! enabled you would see @samp{C/h} and when mode modes are enabled, you'd
  see @samp{C/ah}.
  
--- 650,654 ----
  that the @samp{C} would be replaced with @samp{C++} or @samp{ObjC} if
  you were editing C++ or Objective-C code.}.  When hungry delete mode is
! enabled you would see @samp{C/h} and when both modes are enabled, you'd
  see @samp{C/ah}.
  
*************** normal, with no @kbd{C-u} prefix).
*** 731,736 ****
  Certain other conditions may apply on a language specific basis.  For
  example, the second slash (@kbd{/}) of a C++ style line comment is
! electric in @code{c++-mode} and @code{objc-mode}, but not in
! @code{c-mode}.
  
  
--- 733,738 ----
  Certain other conditions may apply on a language specific basis.  For
  example, the second slash (@kbd{/}) of a C++ style line comment is
! electric in @code{c++-mode}, @code{objc-mode}, and @code{java-mode}, but
! not in @code{c-mode}.
  
  
*************** Using a mechanism similar to brace hangi
*** 857,861 ****
  colons can also be made to hang using the variable
  @code{c-hanging-colons-alist}.  The syntactic symbols appropriate for
! this assocation list are: @code{case-label}, @code{label},
  @code{access-label}, @code{member-init-intro}, and @code{inher-intro}.
  @xref{Hanging Braces} and @ref{Custom Brace and Colon Hanging} for
--- 859,863 ----
  colons can also be made to hang using the variable
  @code{c-hanging-colons-alist}.  The syntactic symbols appropriate for
! this association list are: @code{case-label}, @code{label},
  @code{access-label}, @code{member-init-intro}, and @code{inher-intro}.
  @xref{Hanging Braces} and @ref{Custom Brace and Colon Hanging} for
*************** defined by @code{c-offsets-alist}.
*** 949,953 ****
  
  @dfn{Clean-ups} are a mechanism complementary to colon and brace
! hanging.  On the surface, it would see that clean-ups overlap the
  functionality provided by the @code{c-hanging-*-alist} variables, and
  similarly, clean-ups are only enabled when auto-newline minor mode is
--- 951,955 ----
  
  @dfn{Clean-ups} are a mechanism complementary to colon and brace
! hanging.  On the surface, it would seem that clean-ups overlap the
  functionality provided by the @code{c-hanging-*-alist} variables, and
  similarly, clean-ups are only enabled when auto-newline minor mode is
*************** the opening brace or parenthesis of the 
*** 1184,1188 ****
  Another very convenient keystroke is @kbd{C-c C-q}
  (@code{c-indent-defun}) when re-indents the entire top-level function or
! class definition that encompases point.  It leaves point at the
  same position within the buffer.
  
--- 1186,1190 ----
  Another very convenient keystroke is @kbd{C-c C-q}
  (@code{c-indent-defun}) when re-indents the entire top-level function or
! class definition that encompasses point.  It leaves point at the
  same position within the buffer.
  
*************** adjustments.
*** 1431,1445 ****
  @vindex c++-mode-hook
  @vindex objc-mode-hook
  @cindex hooks
  To make this change permanent, you need to add some lisp code to your
  @file{.emacs} file.  @code{cc-mode} provides four hooks that you can use
! to customize your language editing styles.  Three language specific
! hooks are provided, according to Emacs major mode conventions:
! @code{c-mode-hook}, @code{c++-mode-hook}, and @code{objc-mode-hook}.
! These get run as the last thing when you enter @code{c-mode},
! @code{c++-mode}, or @code{objc-mode} respectively.  @code{cc-mode} also
! provides a hook called @code{c-mode-common-hook} which is run by all
! three modes @emph{before} the language specific hook.  Thus, to make
! changes consistently across all supported @code{cc-mode} modes, use
  @code{c-mode-common-hook}.  Most of the examples in this section will
  assume you are using the common hook.
--- 1433,1449 ----
  @vindex c++-mode-hook
  @vindex objc-mode-hook
+ @vindex java-mode-hook
  @cindex hooks
  To make this change permanent, you need to add some lisp code to your
  @file{.emacs} file.  @code{cc-mode} provides four hooks that you can use
! to customize your language editing styles.  Four language specific hooks
! are provided, according to Emacs major mode conventions:
! @code{c-mode-hook}, @code{c++-mode-hook}, @code{objc-mode-hook}, and
! @code{java-mode-hook}.  These get run as the last thing when you enter
! @code{c-mode}, @code{c++-mode}, @code{objc-mode}, or
! @code{java-mode-hook} respectively.  @code{cc-mode} also provides a hook
! called @code{c-mode-common-hook} which is run by all three modes
! @emph{before} the language specific hook.  Thus, to make changes
! consistently across all supported @code{cc-mode} modes, use
  @code{c-mode-common-hook}.  Most of the examples in this section will
  assume you are using the common hook.
*************** Emacs 19.  Workarounds are available if 
*** 1456,1460 ****
  
  (defun my-c-mode-common-hook ()
!   ;; my customizations for all of c-mode, c++-mode, and objc-mode
    (c-set-offset 'substatement-open 0)
    ;; other customizations can go here
--- 1460,1464 ----
  
  (defun my-c-mode-common-hook ()
!   ;; my customizations for all of c-mode, c++-mode, objc-mode, java-mode
    (c-set-offset 'substatement-open 0)
    ;; other customizations can go here
*************** already built-in.  These include:
*** 1515,1542 ****
  @item
  @cindex GNU style
! @code{GNU} -- coding style blessed by the Free Software Foundation
  for C code in GNU programs.
  
  @item
  @cindex K&R style
! @code{K&R} -- The classic Kernighan and Ritchie style for C code.
  
  @item
  @cindex BSD style
! @code{BSD} -- @strong{<TBD> Anybody know anything about the history of
  this style?}
  
  @item
  @cindex Stroustrup style
! @code{Stroustrup} -- The classic Stroustrup style for C++ code.
  
  @item
  @cindex Whitesmith style
! @code{Whitesmith} -- @strong{<TBD> Anybody know anything about the history of
  this style?}
  
  @item
  @cindex Ellemtel style
! @code{Ellemtel} -- Popular C++ coding standards as defined by
  ``Programming in C++, Rules and Recommendations'', Erik Nyquist and Mats
  Henricson, Ellemtel @footnote{This document is ftp'able from
--- 1519,1546 ----
  @item
  @cindex GNU style
! @code{gnu} -- coding style blessed by the Free Software Foundation
  for C code in GNU programs.
  
  @item
  @cindex K&R style
! @code{k&r} -- The classic Kernighan and Ritchie style for C code.
  
  @item
  @cindex BSD style
! @code{bsd} -- @strong{<TBD> Anybody know anything about the history of
  this style?}
  
  @item
  @cindex Stroustrup style
! @code{stroustrup} -- The classic Stroustrup style for C++ code.
  
  @item
  @cindex Whitesmith style
! @code{whitesmith} -- @strong{<TBD> Anybody know anything about the history of
  this style?}
  
  @item
  @cindex Ellemtel style
! @code{ellemtel} -- Popular C++ coding standards as defined by
  ``Programming in C++, Rules and Recommendations'', Erik Nyquist and Mats
  Henricson, Ellemtel @footnote{This document is ftp'able from
*************** Henricson, Ellemtel @footnote{This docum
*** 1544,1547 ****
--- 1548,1557 ----
  
  @item
+ @cindex Java style
+ @cindex java-mode
+ @code{java} -- The style for editing Java code.  Note that this style is
+ automatically installed when you enter @code{java-mode}.
+ 
+ @item
  @cindex CC-MODE style
  @code{CC-MODE} -- Style that encapsulates the default values of the
*************** type the following in a @code{cc-mode} b
*** 1562,1572 ****
  @end example
  @noindent
! Note however that setting a style in this way does @emph{not}
! automatically re-indent your file.  For commands that you can use to
! view the effect of your changes, see @ref{Indentation Commands}.
  
  Once you find a built-in style you like, you can make the change
  permanent by adding a call to your @file{.emacs} file.  Let's say for
! example that you want to use the @code{Ellemtel} style in all your
  files.  You would add this:
  @example
--- 1572,1584 ----
  @end example
  @noindent
! Note that all style names are case insensitive, even the ones you define.
! 
! Setting a style in this way does @emph{not} automatically re-indent your
! file.  For commands that you can use to view the effect of your changes,
! see @ref{Indentation Commands}.
  
  Once you find a built-in style you like, you can make the change
  permanent by adding a call to your @file{.emacs} file.  Let's say for
! example that you want to use the @code{ellemtel} style in all your
  files.  You would add this:
  @example
*************** files.  You would add this:
*** 1575,1579 ****
  (defun my-c-mode-common-hook ()
    ;; use Ellemtel style for all C, C++, and Objective-C code
!   (c-set-style "Ellemtel")
    ;; other customizations can go here
    )
--- 1587,1591 ----
  (defun my-c-mode-common-hook ()
    ;; use Ellemtel style for all C, C++, and Objective-C code
!   (c-set-style "ellemtel")
    ;; other customizations can go here
    )
*************** implicitly inherit from it; in other wor
*** 1590,1597 ****
  your new style configurations.
  
! The @code{CC-MODE} style exists because once @code{cc-mode} initializes, it
! institutes the @code{GNU} style for compatibility with BOCM's defaults.
! Any customizations you make in mode hooks will be based on the
! @code{GNU} style, unless you first do a @code{c-set-style} to
  @code{CC-MODE} or some other built-in style.
  
--- 1602,1609 ----
  your new style configurations.
  
! The @code{CC-MODE} style exists because once @code{cc-mode} initializes,
! it institutes the @code{gnu} style for compatibility with BOCM's
! defaults.  Any customizations you make in mode hooks will be based on
! the @code{gnu} style, unless you first do a @code{c-set-style} to
  @code{CC-MODE} or some other built-in style.
  
*************** The sample @file{.emacs} file provides a
*** 1625,1631 ****
  style can be added and automatically set.  @xref{Sample .emacs File}.
  
- @strong{<TBD: give some examples of the built-in styles>}
- 
- 
  @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  @node     File Styles, ,  Adding Styles, Styles
--- 1637,1640 ----
*************** using @code{c-set-style}.
*** 1660,1664 ****
  Another variable, @code{c-file-offsets}, takes an association list
  similar to what is allowed in @code{c-offsets-alist}.  When the file is
! visited, @code{cc-mode} will automatically institute these offets using
  @code{c-set-offset}.
  
--- 1669,1673 ----
  Another variable, @code{c-file-offsets}, takes an association list
  similar to what is allowed in @code{c-offsets-alist}.  When the file is
! visited, @code{cc-mode} will automatically institute these offsets using
  @code{c-set-offset}.
  
*************** Now, to associate the function @code{c-l
*** 1767,1771 ****
  following to our @code{c++-mode-hook}@footnote{It probably makes more
  sense to add this to @code{c++-mode-hook} than @code{c-mode-common-hook}
! since stream operators are only relevent for C++.}:
  @example
  
--- 1776,1780 ----
  following to our @code{c++-mode-hook}@footnote{It probably makes more
  sense to add this to @code{c++-mode-hook} than @code{c-mode-common-hook}
! since stream operators are only relevant for C++.}:
  @example
  
*************** by @code{font-lock-mode}.  It is not par
*** 2538,2560 ****
  @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  
! The canonical version of the latest @code{cc-mode} release will always
! be available for anonymous ftp from the Emacs Lisp Archive Server:
! @example
  
- @code{archive.cis.ohio-state.edu}
- 
- @end example
- @noindent
- and the path to the file is:
  @example
  
! /pub/gnu/emacs/elisp-archive/modes/cc-mode.tar.gz
  
  @end example
! Note that this is a ``gzipped'' tar file.  There may be other anonymous
! ftp servers that mirror the full @code{cc-mode} release, including
! @code{cs.uiuc.edu} and @code{ftp.hackvan.com}.  These latter are not
! guaranteed, and you should always try the Emacs Lisp Archive Server
! first!
  
  If you do not have anonymous ftp access, you can get the distribution
--- 2547,2562 ----
  @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  
! @code{cc-mode} is now distributed with both Emacs 19 and XEmacs 19, so
! you would typically just use the version that comes with your Emacs.
! Users of older versions of Emacs can get the latest release from this
! URL:
  
  @example
  
!     @code{ftp://ftp.python.org/pub/emacs/cc-mode.tar.gz}
  
  @end example
! 
! Note that this is a ``gzipped'' tar file.
  
  If you do not have anonymous ftp access, you can get the distribution
*************** the following message in the body of you
*** 2565,2572 ****
  
  reply <a valid net address back to you>
! connect archive.cis.ohio-state.edu
  binary
  uuencode
! chdir pub/gnu/emacs/elisp-archive/modes
  get cc-mode.tar.gz
  
--- 2567,2574 ----
  
  reply <a valid net address back to you>
! connect ftp.python.org
  binary
  uuencode
! chdir pub/emacs
  get cc-mode.tar.gz
  
*************** expose the bug.  Be especially sure to i
*** 2712,2743 ****
  @emph{before} your bug example.
  
! Send a message to @code{cc-mode-help@@merlin.cnri.reston.va.us} for
! other help or suggestions.
! 
! To join the beta testers list, send the word @samp{subscribe} in the
! body of a message to
! @code{cc-mode-victims-request@@merlin.cnri.reston.va.us}.  Note that
! this is a fairly technical discussion list so you should be moderately
! Emacs lisp fluent and have anonymous ftp access.  I generally won't
! email patches to individual victims.  Note that non-members are
! prohibited from posting messages to this list (i.e. you must join it
! first!).
! 
! There is also an announce only list where you will get beta version
! update diffs, but will not join in the technical discussions.  You
! should still have anon-ftp, and you shouldn't expect beta releases to be
! as stable as public releases.  Send the word @samp{subscribe} in the
! body of a message to
! @code{cc-mode-announce-request@@merlin.cnri.reston.va.us} to be added to
! this list.  This is is moderated; you cannot post messages to it.
! 
! Both of these lists are maintained by Majordomo.  Send the word
! @samp{help} in the body of a mail message to
! @code{majordomo@@merlin.cnri.reston.va.us} for details of how to
! interact with these Majordomo administered mailing lists.
! 
! Please use the proper address so I can concentrate less on administrivia
! and more on the next version of @code{cc-mode}!  Thanks!
! 
  
  @c !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
--- 2714,2726 ----
  @emph{before} your bug example.
  
! Bug reports are now to be sent to @code{bug-gnu-emacs@@prep.ai.mit.edu}
! which is mirrored on the Usenet newsgroup @code{gnu.emacs.bug}.  Other
! questions and suggestions should be mailed to
! @code{help-gnu-emacs@@prep.ai.mit.edu} which is mirrored on
! @code{gnu.emacs.help}.
! 
! Note that the @code{cc-mode} Majordomo mailing lists have been
! disbanded!  With the inclusion of @code{cc-mode} in both of the latest
! flavors of Emacs 19, the need for them has ended.
  
  @c !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
diff -2rcpP --exclude=*.elc emacs-19.30/man/cl.texi emacs-19.31/man/cl.texi
*** emacs-19.30/man/cl.texi	Sat Jan  8 03:42:47 1994
--- emacs-19.31/man/cl.texi	Tue Apr 16 00:36:53 1996
*************** body is enclosed in an implicit block as
*** 1851,1858 ****
  
  @defspec labels (bindings@dots{}) forms@dots{}
! The @code{labels} form is a synonym for @code{flet}.  (In Common
! Lisp, @code{labels} and @code{flet} differ in ways that depend on
! their lexical scoping; these distinctions vanish in dynamically
! scoped Emacs Lisp.)
  @end defspec
  
--- 1851,1874 ----
  
  @defspec labels (bindings@dots{}) forms@dots{}
! The @code{labels} form is like @code{flet}, except that it
! makes lexical bindings of the function names rather than
! dynamic bindings.  (In true Common Lisp, both @code{flet} and
! @code{labels} make lexical bindings of slightly different sorts;
! since Emacs Lisp is dynamically bound by default, it seemed
! more appropriate for @code{flet} also to use dynamic binding.
! The @code{labels} form, with its lexical binding, is fully
! compatible with Common Lisp.)
! 
! Lexical scoping means that all references to the named
! functions must appear physically within the body of the
! @code{labels} form.  References may appear both in the body
! @var{forms} of @code{labels} itself, and in the bodies of
! the functions themselves.  Thus, @code{labels} can define
! local recursive functions, or mutually-recursive sets of
! functions.
! 
! A ``reference'' to a function name is either a call to that
! function, or a use of its name quoted by @code{quote} or
! @code{function} to be passed on to, say, @code{mapcar}.
  @end defspec
  
*************** a @key{RET} or @key{LFD}, or anything el
*** 2021,2025 ****
  @defspec ecase keyform clause@dots{}
  This macro is just like @code{case}, except that if the key does
! not match any of the clauses, an error is signalled rather than
  simply returning @code{nil}.
  @end defspec
--- 2037,2041 ----
  @defspec ecase keyform clause@dots{}
  This macro is just like @code{case}, except that if the key does
! not match any of the clauses, an error is signaled rather than
  simply returning @code{nil}.
  @end defspec
*************** several types, use an @code{(or ...)} ty
*** 2046,2050 ****
  @defspec etypecase keyform clause@dots{}
  This macro is just like @code{typecase}, except that if the key does
! not match any of the clauses, an error is signalled rather than
  simply returning @code{nil}.
  @end defspec
--- 2062,2066 ----
  @defspec etypecase keyform clause@dots{}
  This macro is just like @code{typecase}, except that if the key does
! not match any of the clauses, an error is signaled rather than
  simply returning @code{nil}.
  @end defspec
*************** This function is a synonym for @code{(cd
*** 4306,4310 ****
  @defun endp x
  Common Lisp defines this function to act like @code{null}, but
! signalling an error if @code{x} is neither a @code{nil} nor a
  cons cell.  This package simply defines @code{endp} as a synonym
  for @code{null}.
--- 4322,4326 ----
  @defun endp x
  Common Lisp defines this function to act like @code{null}, but
! signaling an error if @code{x} is neither a @code{nil} nor a
  cons cell.  This package simply defines @code{endp} as a synonym
  for @code{null}.
*************** The following error-related macro is als
*** 5156,5160 ****
  This executes @var{forms} exactly like a @code{progn}, except that
  errors are ignored during the @var{forms}.  More precisely, if
! an error is signalled then @code{ignore-errors} immediately
  aborts execution of the @var{forms} and returns @code{nil}.
  If the @var{forms} complete successfully, @code{ignore-errors}
--- 5172,5176 ----
  This executes @var{forms} exactly like a @code{progn}, except that
  errors are ignored during the @var{forms}.  More precisely, if
! an error is signaled then @code{ignore-errors} immediately
  aborts execution of the @var{forms} and returns @code{nil}.
  If the @var{forms} complete successfully, @code{ignore-errors}
*************** readable @code{incf} and @code{push} for
*** 5195,5199 ****
  every time they are executed.  For this reason it is strongly
  recommended that code making heavy use of macros be compiled.
! (The features labelled ``Special Form'' instead of ``Function'' in
  this manual are macros.)  A loop using @code{incf} a hundred times
  will execute considerably faster if compiled, and will also
--- 5211,5215 ----
  every time they are executed.  For this reason it is strongly
  recommended that code making heavy use of macros be compiled.
! (The features labeled ``Special Form'' instead of ``Function'' in
  this manual are macros.)  A loop using @code{incf} a hundred times
  will execute considerably faster if compiled, and will also
*************** This package sometimes omits such error 
*** 5279,5283 ****
  compactness and efficiency.  For example, @code{do} variable
  specifiers are supposed to be lists of one, two, or three forms;
! extra forms are ignored by this package rather than signalling a
  syntax error.  The @code{endp} function is simply a synonym for
  @code{null} in this package.  Functions taking keyword arguments
--- 5295,5299 ----
  compactness and efficiency.  For example, @code{do} variable
  specifiers are supposed to be lists of one, two, or three forms;
! extra forms are ignored by this package rather than signaling a
  syntax error.  The @code{endp} function is simply a synonym for
  @code{null} in this package.  Functions taking keyword arguments
diff -2rcpP --exclude=*.elc emacs-19.30/man/cmdargs.texi emacs-19.31/man/cmdargs.texi
*** emacs-19.30/man/cmdargs.texi	Wed Nov 15 20:37:14 1995
--- emacs-19.31/man/cmdargs.texi	Mon May  6 18:03:20 1996
*************** the action arguments in the order they a
*** 62,65 ****
--- 62,66 ----
  * Window Size X::       Start-up window size, under X.
  * Borders X::	        Internal and external borders, under X.
+ * Title X::             Specifying the initial frame's title.
  * Icons X::             Choosing what sort of icon to use, under X.
  * Resources X::         Advanced use of classes and resources, under X.
*************** a suspension.  To prepare for this, put 
*** 205,208 ****
--- 206,210 ----
  @example
  (add-hook 'suspend-hook 'resume-suspend-hook)
+ (add-hook 'suspend-resume-hook 'resume-process-args)
  @end example
  
*************** variable.
*** 387,390 ****
--- 389,405 ----
  On MS-DOS, these specify the name of the directory for storing temporary
  files in.
+ @item EMACSTEST
+ On MS-DOS, this is the name of the file where Emacs writes a full log
+ of the internal terminal emulator operation.  Useful when submitting
+ bugs.
+ @item EMACSCOLORS
+ Used on MS-DOS systems to set screen colors early so that the screen
+ won't momentarily flash the default colors at startup.  The value of
+ this variable should be 2-character encoding of the foreground (the
+ first character) and the background (the second character) colors of
+ the default face.  Each character should be a hexadecimal code of the
+ color on a standard PC text-mode display.  Only 3 lower bits of the
+ background color are actually used, because PC display cannot use more
+ than 8 background colors.
  @item WINDOW_GFX
  Used when initializing the Sun windows system.
*************** not pay attention to what you specify). 
*** 696,699 ****
--- 711,736 ----
  external border is 2.
  
+ @node Title X
+ @appendixsec Frame Titles
+ 
+   An Emacs frame may or may not have a specified title.  The frame
+ title, if specified, appears in window decorations and icons as the name
+ of the frame.  If an Emacs frame has no specified title, the default
+ title is the name of the executable program (if there is only one frame)
+ or the selected window's buffer name (if there is more than one frame).
+ 
+   You can specify a title for the initial Emacs frame with a command
+ line option:
+ 
+ @table @samp
+ @item -title @var{title}
+ @itemx --title=@var{title}
+ @itemx -T @var{title}
+ Specify @var{title} as the title for the initial Emacs frame.
+ @end table
+ 
+   The @samp{--name} option (@pxref{Resources X}) also specifies the title
+ for the initial Emacs frame.
+ 
  @node Icons X
  @appendixsec Icons
*************** invoke to run Emacs.  If Emacs is instal
*** 781,796 ****
  looks for resources under that name instead of @samp{emacs}.
  
-   When Emacs creates a new frame, it may or may not have a specified
- title.  The frame title, if specified, appears in window decorations and
- icons as the name of the frame.  It is also used (instead of the Emacs
- executable's name) to look up all the resources for that frame.  The
- option @samp{-name} specifies a frame title for the initial frame.
- Subsequent frames normally have no specified frame title, but Lisp
- programs can specify a title when they create frames.
- 
  @table @samp
  @item -name @var{name}
  @itemx --name=@var{name}
! Use @var{name} as the title of the initial frame.
  
  @item -xrm @var{resource-values}
--- 818,830 ----
  looks for resources under that name instead of @samp{emacs}.
  
  @table @samp
  @item -name @var{name}
  @itemx --name=@var{name}
! Use @var{name} as the resource name (and the title) for the initial
! Emacs frame.  This option does not affect subsequent frames, but Lisp
! programs can specify frame names when they create frames.
! 
! If you don't specify this option, the default is to use the Emacs
! executable's name as the resource name.
  
  @item -xrm @var{resource-values}
*************** yes.
*** 904,907 ****
--- 938,943 ----
  @node Lucid Resources
  @section Lucid Menu X Resources
+ @cindex Menu X Resources (Lucid widgets)
+ @cindex Lucid Widget X Resources
  
    If the Emacs installed at your site was built to use the X toolkit
*************** Emacs.menu*.font:	8x16
*** 931,934 ****
--- 967,976 ----
  @end example
  
+   For dialog boxes, use @samp{dialog} instead of @samp{menu}:
+ 
+ @example
+ Emacs.dialog*.font:	8x16
+ @end example
+ 
    Experience shows that on some systems you may need to add
  @samp{shell.}@: before the @samp{pane.menubar} or @samp{menu*}.  On
*************** Thickness of shadow line around the widg
*** 959,962 ****
--- 1001,1006 ----
  @node Motif Resources
  @section Motif Menu X Resources
+ @cindex Menu X Resources (Motif widgets)
+ @cindex Motif Widget X Resources
  
    If the Emacs installed at your site was built to use the X toolkit
diff -2rcpP --exclude=*.elc emacs-19.30/man/custom.texi emacs-19.31/man/custom.texi
*** emacs-19.30/man/custom.texi	Fri Oct 27 02:25:03 1995
--- emacs-19.31/man/custom.texi	Fri May 17 17:22:35 1996
*************** minor modes you prefer.
*** 156,160 ****
  @section Variables
  @cindex variable
! @cindex option
  
    A @dfn{variable} is a Lisp symbol which has a value.  The symbol's
--- 156,161 ----
  @section Variables
  @cindex variable
! @cindex option, user
! @cindex user option
  
    A @dfn{variable} is a Lisp symbol which has a value.  The symbol's
*************** turn on the feature---since you have to 
*** 174,186 ****
  set the variable---is @code{t}.
  
!   Emacs uses many Lisp variables for internal record keeping, as any Lisp
! program must, but the most interesting variables for you are the ones that
! exist for the sake of customization.  Emacs does not (usually) change the
! values of these variables; instead, you set the values, and thereby alter
! and control the behavior of certain Emacs commands.  These variables are
! called @dfn{options}.  Most options are documented in this manual, and
! appear in the Variable Index (@pxref{Variable Index}).
  
!   One example of a variable which is an option is @code{fill-column}, which
  specifies the position of the right margin (as a number of characters from
  the left margin) to be used by the fill commands (@pxref{Filling}).
--- 175,188 ----
  set the variable---is @code{t}.
  
!   Emacs uses many Lisp variables for internal record keeping, as any
! Lisp program must, but the most interesting variables for you are the
! ones that exist for the sake of customization.  Emacs does not (usually)
! change the values of these variables; instead, you set the values, and
! thereby alter and control the behavior of certain Emacs commands.  These
! variables are called @dfn{user options}.  Most user options are
! documented in this manual, and appear in the Variable Index
! (@pxref{Variable Index}).
  
!   One example of a variable which is a user option is @code{fill-column}, which
  specifies the position of the right margin (as a number of characters from
  the left margin) to be used by the fill commands (@pxref{Filling}).
*************** the left margin) to be used by the fill 
*** 188,192 ****
  @menu
  * Examining::	     Examining or setting one variable's value.
! * Edit Options::     Examining or editing list of all variables' values.
  * Hooks::	     Hook variables let you specify programs for parts
  		       of Emacs to run on particular occasions.
--- 190,194 ----
  @menu
  * Examining::	     Examining or setting one variable's value.
! * Edit Options::     Examining or editing list of all user options' values.
  * Hooks::	     Hook variables let you specify programs for parts
  		       of Emacs to run on particular occasions.
*************** Automatically becomes buffer-local when 
*** 228,237 ****
  
  @noindent
! The star at the beginning of the documentation indicates that this variable
! is an option.  @kbd{C-h v} is not restricted to options; it allows any
! variable name.
  
  @findex set-variable
!   The most convenient way to set a specific option is with @kbd{M-x
  set-variable}.  This reads the variable name with the minibuffer (with
  completion), and then reads a Lisp expression for the new value using
--- 230,239 ----
  
  @noindent
! The star at the beginning of the documentation indicates that this
! variable is a user option.  @kbd{C-h v} is not restricted to user
! options; it allows any variable name.
  
  @findex set-variable
!   The most convenient way to set a specific user option is with @kbd{M-x
  set-variable}.  This reads the variable name with the minibuffer (with
  completion), and then reads a Lisp expression for the new value using
*************** M-x set-variable @key{RET} fill-column @
*** 245,250 ****
  sets @code{fill-column} to 75.
  
!   You can set any variable with a Lisp expression using the function
! @code{setq}.  Here's how to use it to set @code{fill-column}:
  
  @example
--- 247,253 ----
  sets @code{fill-column} to 75.
  
!  @kbd{M-x set-variable} is limited to user option variables.  You can
! set any variable with a Lisp expression using the function @code{setq}.
! Here's how to use it to set @code{fill-column}:
  
  @example
*************** otherwise stated, affects only the curre
*** 258,262 ****
  @subsection Editing Variable Values
  
! These two functions make it easy to display all the Emacs option
  variables, and to change some of them if you wish.
  
--- 261,265 ----
  @subsection Editing Variable Values
  
! These two functions make it easy to display all the Emacs user option
  variables, and to change some of them if you wish.
  
*************** variables, and to change some of them if
*** 265,276 ****
  Display a buffer listing names, values and documentation of all options.
  @item M-x edit-options
! Change option values by editing a list of options.
  @end table
  
  @findex list-options
!   @kbd{M-x list-options} displays a list of all Emacs option variables, in
! an Emacs buffer named @samp{*List Options*}.  Each option is shown with its
! documentation and its current value.  Here is what a portion of it might
! look like:
  
  @smallexample
--- 268,279 ----
  Display a buffer listing names, values and documentation of all options.
  @item M-x edit-options
! Change user option values by editing a list of user option variables.
  @end table
  
  @findex list-options
!   @kbd{M-x list-options} displays a list of all Emacs option variables,
! in an Emacs buffer named @samp{*List Options*}.  Each user option is
! shown with its documentation and its current value.  Here is what a
! portion of it might look like:
  
  @smallexample
*************** Automatically becomes buffer-local when 
*** 289,296 ****
  
  @findex edit-options
!   @kbd{M-x edit-options} goes one step further and immediately selects the
! @samp{*List Options*} buffer; this buffer uses the major mode Options mode,
! which provides commands that allow you to point at an option and change its
! value:
  
  @table @kbd
--- 292,299 ----
  
  @findex edit-options
!   @kbd{M-x edit-options} goes one step further and immediately selects
! the @samp{*List Options*} buffer; this buffer uses the major mode
! Options mode, which provides commands that allow you to point at a user
! option variable and change its value:
  
  @table @kbd
*************** Set the variable point is in or near to 
*** 307,311 ****
  @item n
  @itemx p
! Move to the next or previous variable.
  @end table
  
--- 310,314 ----
  @item n
  @itemx p
! Move to the next or previous user option.
  @end table
  
*************** lambda expression.
*** 350,365 ****
  @example
  @group
! (add-hook 'c-mode-hook 
!   (function (lambda ()
!               (setq c-indent-level 4
!                     c-argdecl-indent 0
!                     c-label-offset -4
  @end group
  @group
!                     c-continued-statement-indent 0
!                     c-brace-offset 0
!                     comment-column 40))))
  
! (setq c++-mode-hook c-mode-hook)
  @end group
  @end example
--- 353,373 ----
  @example
  @group
! (setq my-c-style
!   '((c-comment-only-line-offset . 4)
! @end group
! @group
!     (c-cleanup-list . (scope-operator
! 		       empty-defun-braces
! 		       defun-close-semi))
  @end group
  @group
!     (c-offsets-alist . ((arglist-close . c-lineup-arglist)
! 			(substatement-open . 0)))))
! @end group
  
! @group
! (add-hook 'c-mode-common-hook
!   (function (lambda ()
!     (c-add-style "my-style" my-c-style t))))
  @end group
  @end example
*************** macro later, @kbd{C-x q} asks you intera
*** 759,763 ****
  
    The valid responses when @kbd{C-x q} asks are @key{SPC} (or @kbd{y}),
! @key{DEL} (or @kbd{n}), @key{ESC} (or @kbd{q}), @kbd{C-l} and @kbd{C-r}.
  The answers are the same as in @code{query-replace}, though not all of
  the @code{query-replace} options are meaningful.
--- 767,771 ----
  
    The valid responses when @kbd{C-x q} asks are @key{SPC} (or @kbd{y}),
! @key{DEL} (or @kbd{n}), @key{RET} (or @kbd{q}), @kbd{C-l} and @kbd{C-r}.
  The answers are the same as in @code{query-replace}, though not all of
  the @code{query-replace} options are meaningful.
*************** the @code{query-replace} options are mea
*** 765,769 ****
    These responses include @key{SPC} to continue, and @key{DEL} to skip
  the remainder of this repetition of the macro and start right away with
! the next repetition.  @key{ESC} means to skip the remainder of this
  repetition and cancel further repetitions.  @kbd{C-l} redraws the screen
  and asks you again for a character to say what to do.
--- 773,777 ----
    These responses include @key{SPC} to continue, and @key{DEL} to skip
  the remainder of this repetition of the macro and start right away with
! the next repetition.  @key{RET} means to skip the remainder of this
  repetition and cancel further repetitions.  @kbd{C-l} redraws the screen
  and asks you again for a character to say what to do.
*************** events with keyboard events, but we reco
*** 884,887 ****
--- 892,902 ----
  sequences are inconvenient to type in.
  
+   As a user, you can redefine any key; but it might be best to stick to
+ key sequences that consist of @kbd{C-c} followed by a letter.  These
+ keys are ``reserved for users,'', so they won't conflict with any
+ properly designed Emacs extension.  If you redefine some other key, your
+ definition may be overridden by certain extensions or major modes which
+ redefine the same key.
+ 
  @node Prefix Keymaps
  @subsection Prefix Keymaps
*************** definition is the keymap for @kbd{C-x} c
*** 901,904 ****
--- 916,926 ----
  the global map, so these prefix keys are always available.
  
+   Aside from ordinary prefix keys, there is a fictitious ``prefix key''
+ which represents the menu bar; see @ref{Menu Bar,,,elisp, The Emacs Lisp
+ Reference Manual}, for special information about menu bar key bindings.
+ Mouse button events that invoke pop-up menus are also prefix keys; see
+ @ref{Menu Keymaps,,,elisp, The Emacs Lisp Reference Manual}, for more
+ details.
+ 
    Some prefix keymaps are stored in variables with names:
  
*************** mode's local keymap and the global keyma
*** 941,951 ****
  @vindex c-mode-map
  @vindex lisp-mode-map
!   The local keymaps for Lisp mode, C mode, and several other major modes
! always exist even when not in use.  These are kept in variables named
! @code{lisp-mode-map}, @code{c-mode-map}, and so on.  For major modes
! less often used, the local keymap is normally constructed only when the
! mode is used for the first time in a session.  This is to save space.
! If you wish to change one of these keymaps, you must use the major
! mode's @dfn{mode hook}---see below.
  
    All minor mode keymaps are created in advance.  There is no way to
--- 963,973 ----
  @vindex c-mode-map
  @vindex lisp-mode-map
!   The local keymaps for Lisp mode and several other major modes always
! exist even when not in use.  These are kept in variables named
! @code{lisp-mode-map} and so on.  For major modes less often used, the
! local keymap is normally constructed only when the mode is used for the
! first time in a session.  This is to save space.  If you wish to change
! one of these keymaps, you must use the major mode's @dfn{mode
! hook}---see below.
  
    All minor mode keymaps are created in advance.  There is no way to
*************** Note once again the single-quote used to
*** 1742,1749 ****
  
  @item
! Do the same thing for C mode only.
  
  @example
! (define-key c-mode-map "\C-xl" 'make-symbolic-link)
  @end example
  
--- 1764,1771 ----
  
  @item
! Do the same thing for Lisp mode only.
  
  @example
! (define-key lisp-mode-map "\C-xl" 'make-symbolic-link)
  @end example
  
diff -2rcpP --exclude=*.elc emacs-19.30/man/dired-x.texi emacs-19.31/man/dired-x.texi
*** emacs-19.30/man/dired-x.texi	Fri Jun 16 18:04:04 1995
--- emacs-19.31/man/dired-x.texi	Thu Jan  4 15:54:19 1996
*************** GNU Emacs v19 compatible.
*** 170,175 ****
  
  In adopting this @file{dired-x.el} to GNU Emacs v19 some material that has
! been incorported into @file{dired.el} and @file{dired-aux.el} of the GNU Emacs
! 19 distribution has been removed and some material was modifed for agreement
  with the functions in @file{dired.el} and @file{dired-aux.el}.  For example,
  the code using @code{gmhist} history functions was replaced with code using
--- 170,175 ----
  
  In adopting this @file{dired-x.el} to GNU Emacs v19 some material that has
! been incorporated into @file{dired.el} and @file{dired-aux.el} of the GNU Emacs
! 19 distribution has been removed and some material was modified for agreement
  with the functions in @file{dired.el} and @file{dired-aux.el}.  For example,
  the code using @code{gmhist} history functions was replaced with code using
diff -2rcpP --exclude=*.elc emacs-19.30/man/display.texi emacs-19.31/man/display.texi
*** emacs-19.30/man/display.texi	Wed Nov 15 01:40:00 1995
--- emacs-19.31/man/display.texi	Wed Apr 17 17:46:22 1996
*************** moves in the window.  Thus, the command 
*** 40,43 ****
--- 40,44 ----
  * Selective Display::      Hiding lines with lots of indentation.
  * European Display::	   Displaying (and entering) European characters.
+ * Follow Mode::            Follow mode lets two windows scroll as one.
  * Optional Mode Line::     Optional mode line display features.
  * Display Vars::           Information on variables for customizing display.
*************** numeric argument @var{n}.  Then lines wi
*** 191,202 ****
  indentation disappear from the screen.  The only indication of their
  presence is that three dots (@samp{@dots{}}) appear at the end of each
! visible line that is followed by one or more invisible ones.
  
!   The commands @kbd{C-n} and @kbd{C-p} move across the invisible lines
! as if they were not there.
  
!   The invisible lines are still present in the buffer, and most editing
! commands see them as usual, so you may find point in the middle of
! invisible text.  When this happens, the cursor appears at the end of the
  previous line, after the three dots.  If point is at the end of the
  visible line, before the newline that ends it, the cursor appears before
--- 192,203 ----
  indentation disappear from the screen.  The only indication of their
  presence is that three dots (@samp{@dots{}}) appear at the end of each
! visible line that is followed by one or more hidden ones.
  
!   The commands @kbd{C-n} and @kbd{C-p} move across the hidden lines as
! if they were not there.
  
!   The hidden lines are still present in the buffer, and most editing
! commands see them as usual, so you may find point in the middle of the
! hidden text.  When this happens, the cursor appears at the end of the
  previous line, after the three dots.  If point is at the end of the
  visible line, before the newline that ends it, the cursor appears before
*************** the three dots.
*** 208,213 ****
    If you set the variable @code{selective-display-ellipses} to
  @code{nil}, the three dots do not appear at the end of a line that
! precedes invisible lines.  Then there is no visible indication of the
! invisible lines.  This variable becomes local automatically when set.
  
  @node European Display
--- 209,214 ----
    If you set the variable @code{selective-display-ellipses} to
  @code{nil}, the three dots do not appear at the end of a line that
! precedes hidden lines.  Then there is no visible indication of the
! hidden lines.  This variable becomes local automatically when set.
  
  @node European Display
*************** invisible lines.  This variable becomes 
*** 218,226 ****
  @cindex ISO Latin-1 character set
  @findex standard-display-european
- @cindex @code{iso-syntax} library
    Some European languages use accented letters and other special
  symbols.  The ISO 8859 Latin-1 character set defines character codes for
  many European languages in the range 160 to 255.
  
    Emacs can display those characters according to Latin-1, provided the
  terminal or font in use supports them.  The @kbd{M-x
--- 219,227 ----
  @cindex ISO Latin-1 character set
  @findex standard-display-european
    Some European languages use accented letters and other special
  symbols.  The ISO 8859 Latin-1 character set defines character codes for
  many European languages in the range 160 to 255.
  
+ @cindex @code{iso-syntax} library
    Emacs can display those characters according to Latin-1, provided the
  terminal or font in use supports them.  The @kbd{M-x
*************** syntactic properties and case conversion
*** 232,235 ****
--- 233,242 ----
  set.
  
+ @cindex @code{iso-ascii} library
+   If your terminal does not support display of the Latin-1 character
+ set, Emacs can display these characters as ASCII sequences which at
+ least give you a clear idea of what the characters are.  To do this,
+ load the library @code{iso-ascii}.
+ 
    Some operating systems let you specify the language you are using by
  setting a locale.  Emacs handles one common special case of this: if
*************** in ISO Accents mode to enter certain oth
*** 308,314 ****
  German sharp @samp{s}.
  @item ~<
! Left guillemet.
  @item ~>
! Right guillemet.
  @item ~!
  Inverted exclamation mark.
--- 315,321 ----
  German sharp @samp{s}.
  @item ~<
! Left guillemot.
  @item ~>
! Right guillemot.
  @item ~!
  Inverted exclamation mark.
*************** Inverted question mark.
*** 318,321 ****
--- 325,341 ----
  @end itemize
  
+ @node Follow Mode
+ @section Follow Mode
+ @cindex Follow mode
+ 
+   @dfn{Follow mode} is a minor mode which makes two windows showing the
+ same buffer scroll as one tall ``virtual window.''  To use Follow mode,
+ go to a frame with just one window, split it into two side-by-side
+ windows using @kbd{C-x 3}, and then type @kbd{M-x follow-mode}.  From
+ then on, you can edit the buffer in either of the two windows, or scroll
+ either one; the other window follows it.
+ 
+   To turn off Follow mode, type @kbd{M-x follow-mode} a second time.
+ 
  @node Optional Mode Line
  @section Optional Mode Line Features
*************** accessible portion of the buffer.
*** 343,348 ****
  @findex column-number-mode
    You can also display the current column number by turning on Column
! Number mode.  It displays the current column number after the letter
! @samp{C}.  Type @kbd{M-x column-number-mode} to toggle this mode.
  
  @findex display-time
--- 363,368 ----
  @findex column-number-mode
    You can also display the current column number by turning on Column
! Number mode.  It displays the current column number preceded by the
! letter @samp{C}.  Type @kbd{M-x column-number-mode} to toggle this mode.
  
  @findex display-time
diff -2rcpP --exclude=*.elc emacs-19.30/man/ediff.texi emacs-19.31/man/ediff.texi
*** emacs-19.30/man/ediff.texi	Mon Nov 20 12:16:06 1995
--- emacs-19.31/man/ediff.texi	Fri Feb 16 01:39:12 1996
*************** paragraph not being relevant to the prin
*** 38,44 ****
  @title Ediff User's Manual
  @sp 4
! @subtitle Ediff version 2.46
  @sp 1
! @subtitle September 1995
  @sp 5
  @author Michael Kifer
--- 38,44 ----
  @title Ediff User's Manual
  @sp 4
! @subtitle Ediff version 2.50
  @sp 1
! @subtitle November 1995
  @sp 5
  @author Michael Kifer
*************** Usually this happens when the user doesn
*** 520,524 ****
  files in the group, and the corresponding session records just add clutter
  to the session group buffer. To help alleviate this problem, the user can
! type @kbd{x} to mark a session as a candidate for exclusion and @kbd{x} to
  actually hide the marked sessions. There actions are reversible: with a
  prefix argument, @kbd{h} unmarks the session under the cursor, and @kbd{x}
--- 520,524 ----
  files in the group, and the corresponding session records just add clutter
  to the session group buffer. To help alleviate this problem, the user can
! type @kbd{h} to mark a session as a candidate for exclusion and @kbd{x} to
  actually hide the marked sessions. There actions are reversible: with a
  prefix argument, @kbd{h} unmarks the session under the cursor, and @kbd{x}
*************** refer to Emacs manual for the informatio
*** 591,597 ****
  * Hooks::                       Customization via the hooks.
  * Quick Help::                  How to customize Ediff's quick help feature.
! * Window and Frame Configuration::  Controling the way Ediff displays things.
  * Selective Browsing::          Advanced browsing through difference regions.
! * Highlighting Difference Regions::  Controling highlighting.
  * Narrowing::                   Comparing regions, windows, etc.
  * Refinement of Difference Regions::  How to control the refinement process.
--- 591,597 ----
  * Hooks::                       Customization via the hooks.
  * Quick Help::                  How to customize Ediff's quick help feature.
! * Window and Frame Configuration::  Controlling the way Ediff displays things.
  * Selective Browsing::          Advanced browsing through difference regions.
! * Highlighting Difference Regions::  Controlling highlighting.
  * Narrowing::                   Comparing regions, windows, etc.
  * Refinement of Difference Regions::  How to control the refinement process.
*************** sessions. @xref{Session Groups}, for det
*** 722,726 ****
  @node Quick Help, Window and Frame Configuration, Hooks, Customization
  @section Quick Help
! @vindex ediff-prefer-long-help-message
  @vindex ediff-control-buffer
  @vindex ediff-startup-hook
--- 722,726 ----
  @node Quick Help, Window and Frame Configuration, Hooks, Customization
  @section Quick Help
! @vindex ediff-use-long-help-message
  @vindex ediff-control-buffer
  @vindex ediff-startup-hook
*************** typing @kbd{?}.  The control window will
*** 732,740 ****
  mode line, displaying a short help message.
  
! The variable @code{ediff-prefer-long-help-message} tells Ediff whether
! you prefer the short message initially or the long one.  By default, it
! is set to @code{nil}, meaning that the short message is shown on
! startup.  Set this to @code{t}, if you want Ediff to start with the long
! message.
  
  If you want to change the appearance of the help message on a per-buffer
--- 732,741 ----
  mode line, displaying a short help message.
  
! The variable @code{ediff-use-long-help-message} tells Ediff whether
! you use the short message or the long one.  By default, it
! is set to @code{nil}, meaning that the short message is used.
! Set this to @code{t}, if you want Ediff to use the long
! message by default. This property can always be changed interactively, by
! typing @kbd{?} into Ediff Control Buffer.
  
  If you want to change the appearance of the help message on a per-buffer
*************** via the prefix @code{Ediff*}.
*** 792,796 ****
  @item ediff-control-frame-position-function
  @vindex ediff-control-frame-position-function
! The prefered way of specifying the position of the control frame is by
  setting the variable @code{ediff-control-frame-position-function} to an
  appropriate function.
--- 793,797 ----
  @item ediff-control-frame-position-function
  @vindex ediff-control-frame-position-function
! The preferred way of specifying the position of the control frame is by
  setting the variable @code{ediff-control-frame-position-function} to an
  appropriate function.
*************** buffer B matches @var{regexp-B}, etc.  W
*** 902,905 ****
--- 903,911 ----
  depends on how you respond to a question.
  
+ When scanning difference regions for the aforesaid regular expressions,
+ Ediff narrows the buffers to those regions. This means that you can use
+ the expressions @kbd{\`} and @kbd{\'} to tie search to the beginning or end
+ of the difference regions.
+ 
  On the other hand, typing @kbd{#h} lets you specify (hide) uninteresting
  regions. That is, if a difference region in buffer A matches
*************** in the white space and newlines.
*** 958,965 ****
  @strong{Note:} In order for this feature to work, auto-refining of
  difference regions must be on, since otherwise Ediff won't know if there
! are fine differences between regions.  Under X, auto-refining is a
! default, but it is not turned on by default on text-only terminals.  In
! that case, you must explicitly turn auto-refining on (such as, by typing
! @kbd{@@}).
  
  @strong{Reassurance:} If many inessential regions appear in a row, Ediff may
--- 964,971 ----
  @strong{Note:} In order for this feature to work, auto-refining of
  difference regions must be on, since otherwise Ediff won't know if there
! are fine differences between regions.  On devices where Emacs can display
! faces, auto-refining is a default, but it is not turned on by default on
! text-only terminals.  In that case, you must explicitly turn auto-refining
! on (such as, by typing @kbd{@@}).
  
  @strong{Reassurance:} If many inessential regions appear in a row, Ediff may
*************** regions:
*** 983,990 ****
  @vindex ediff-before-flag-mol
  @vindex ediff-after-flag-mol
! These variables hold strings that Ediff uses to mark the beginning and
! the end of the differences found in files A, B, and C.  Ediff uses
! different flags to highlight regions that begin/end at the beginning/end
! of a line or in a middle of a line.
  
  @item ediff-current-diff-face-A
--- 989,996 ----
  @vindex ediff-before-flag-mol
  @vindex ediff-after-flag-mol
! These variables hold strings that Ediff uses to mark the beginning and the
! end of the differences found in files A, B, and C on devices where Emacs
! cannot display faces. Ediff uses different flags to highlight regions that
! begin/end at the beginning/end of a line or in a middle of a line.
  
  @item ediff-current-diff-face-A
*************** of a line or in a middle of a line.
*** 994,1002 ****
  @vindex ediff-current-diff-face-B
  @vindex ediff-current-diff-face-C
! Ediff uses these faces to highlight current differences on X displays.
! These and subsequently described faces can be set either in @file{.emacs}
! or in @file{.Xdefaults}. The X resource for Ediff is @samp{Ediff}, @emph{not}
! @samp{emacs}. Please refer to Emacs manual for the information on how to set X
! resources.
  @item ediff-fine-diff-face-A
  @itemx ediff-fine-diff-face-B
--- 1000,1008 ----
  @vindex ediff-current-diff-face-B
  @vindex ediff-current-diff-face-C
! Ediff uses these faces to highlight current differences on devices where
! Emacs can display faces.  These and subsequently described faces can be set
! either in @file{.emacs} or in @file{.Xdefaults}. The X resource for Ediff
! is @samp{Ediff}, @emph{not} @samp{emacs}. Please refer to Emacs manual for
! the information on how to set X resources.
  @item ediff-fine-diff-face-A
  @itemx ediff-fine-diff-face-B
*************** displays, because without colors options
*** 1025,1028 ****
--- 1031,1041 ----
  So, Ediff uses italics to highlight non-current differences.
  
+ @item ediff-force-faces
+ @vindex ediff-force-faces
+ Ediff generally can detect when Emacs is running on a device where it can
+ use highlighting with faces. However, if it fails to determine that faces
+ can be used, the user can set this variable to @code{t} to make sure that
+ Ediff uses faces to highlight differences.
+ 
  @item ediff-highlight-all-diffs
  @vindex ediff-highlight-all-diffs
*************** the difference number).
*** 1411,1415 ****
  Ediff supports version control and lets you compare versions of files
  visited by Emacs buffers via the function @code{ediff-revision}. This
! feature is controled by the following variables:
  
  @table @code
--- 1424,1428 ----
  Ediff supports version control and lets you compare versions of files
  visited by Emacs buffers via the function @code{ediff-revision}. This
! feature is controlled by the following variables:
  
  @table @code
*************** If you are like most Emacs users, Ediff 
*** 1421,1434 ****
  package. This is the standard Emacs interface to RCS, CVS, and SCCS.
  
! However, if you are that unlikely person with needs that are better
! served by other interfaces, you will have to tell Ediff which version control
! package you are using, e.g.,
  @example
  (setq ediff-version-control-package 'rcs)
  @end example
  
! Apart from the standard @file{vc.el}, Ediff supports two other interfaces
  to version control:
! @file{rcs.el} and @file{generic-sc.el}. 
  The package @file{rcs.el} is written by Sebastian Kremer
  <sk@@thp.Uni-Koeln.DE> and is available as
--- 1434,1446 ----
  package. This is the standard Emacs interface to RCS, CVS, and SCCS.
  
! However, if your needs are better served by other interfaces, you will
! have to tell Ediff which version control package you are using, e.g.,
  @example
  (setq ediff-version-control-package 'rcs)
  @end example
  
! Apart from the standard @file{vc.el}, Ediff supports three other interfaces
  to version control:
! @file{rcs.el}, @file{pcl-cvs.el}, and @file{generic-sc.el}. 
  The package @file{rcs.el} is written by Sebastian Kremer
  <sk@@thp.Uni-Koeln.DE> and is available as
*************** The package @file{rcs.el} is written by 
*** 1437,1447 ****
  @file{ftp.uni-koeln.de:/pub/gnu/emacs/rcs.tar.Z}
  @end example
! The package @file{generic-sc.el} is part of XEmacs distribution (but not
! Emacs distribution).
  @pindex @file{vc.el}
  @pindex @file{rcs.el}
  @pindex @file{generic-sc.el}
  @end table
  
  @node Customizing the Mode Line, Miscellaneous, Support for Version Control, Customization
  @section Customizing the Mode Line
--- 1449,1469 ----
  @file{ftp.uni-koeln.de:/pub/gnu/emacs/rcs.tar.Z}
  @end example
! The packages @file{pcl-cvs.el} and @file{generic-sc.el} are found in XEmacs
! distribution.
  @pindex @file{vc.el}
  @pindex @file{rcs.el}
+ @pindex @file{pcl-cvs.el}
  @pindex @file{generic-sc.el}
  @end table
  
+ Ediff's interface to the above packages allows the user to compare the
+ versions of the current buffer or to merge them (with or without an
+ ancestor-version). These operations can also be performed on directories
+ containing files under version control.
+ 
+ In case of @file{pcl-cvs.el}, Ediff can also be invoked via the function
+ @code{run-ediff-from-cvs-buffer}---see the documentation string for this
+ function.
+ 
  @node Customizing the Mode Line, Miscellaneous, Support for Version Control, Customization
  @section Customizing the Mode Line
*************** Here is a full list of contributors (I h
*** 1652,1661 ****
--- 1674,1686 ----
  
  @example
+ Neal Becker (neal@@ctd.comsat.com),
  Alastair Burt (burt@@dfki.uni-kl.de), Paul Bibilo (peb@@delcam.co.uk),
  Kevin Broadey (KevinB@@bartley.demon.co.uk),
  Harald Boegeholz (hwb@@machnix.mathematik.uni-stuttgart.de),
+ Bradley A. Bosch (brad@@lachman.com),
  Michael D. Carney  (carney@@ltx-tr.com),
  Jin S. Choi (jin@@atype.com), Eric Eide (eeide@@asylum.cs.utah.edu),
  Kevin Esler (esler@@ch.hp.com), Robert Estes (estes@@ece.ucdavis.edu), 
+ Xavier Fornari (xavier@@europe.cma.fr),
  Eric Freudenthal (freudent@@jan.ultra.nyu.edu),
  Job Ganzevoort (Job.Ganzevoort@@cwi.nl),
*************** Chris Murphy (murphycm@@sun.aston.ac.uk)
*** 1677,1684 ****
  Erik Naggum (erik@@naggum.no),
  Eyvind Ness (Eyvind.Ness@@hrp.no), Ray Nickson (nickson@@cs.uq.oz.au), 
! Paul Raines (raines@@slac.stanford.edu), 
  Benjamin Pierce (benjamin.pierce@@cl.cam.ac.uk),
  Tibor Polgar (tlp00@@spg.amdahl.com),
  David Prince (dave0d@@fegs.co.uk),
  C.S. Roberson (roberson@@aur.alcatel.com),
  Kevin Rodgers (kevin.rodgers@@ihs.com),
--- 1702,1710 ----
  Erik Naggum (erik@@naggum.no),
  Eyvind Ness (Eyvind.Ness@@hrp.no), Ray Nickson (nickson@@cs.uq.oz.au), 
! David Petchey (petchey_david@@jpmorgan.com),
  Benjamin Pierce (benjamin.pierce@@cl.cam.ac.uk),
  Tibor Polgar (tlp00@@spg.amdahl.com),
  David Prince (dave0d@@fegs.co.uk),
+ Paul Raines (raines@@slac.stanford.edu), 
  C.S. Roberson (roberson@@aur.alcatel.com),
  Kevin Rodgers (kevin.rodgers@@ihs.com),
*************** Richard Stanton (stanton@@haas.berkeley.
*** 1690,1695 ****
  Ake Stenhoff (etxaksf@@aom.ericsson.se), Stig (stig@@hackvan.com),
  Peter Stout (Peter_Stout@@cs.cmu.edu), Chuck Thompson (cthomp@@cs.uiuc.edu),
  Raymond Toy (toy@@rtp.ericsson.se),
! Ilya Zakharevich (ilya@@math.ohio-state.edu)
  @end example
  
--- 1716,1724 ----
  Ake Stenhoff (etxaksf@@aom.ericsson.se), Stig (stig@@hackvan.com),
  Peter Stout (Peter_Stout@@cs.cmu.edu), Chuck Thompson (cthomp@@cs.uiuc.edu),
+ Ray Tomlinson (tomlinso@@bbn.com),
  Raymond Toy (toy@@rtp.ericsson.se),
! Ben Wing (wing@@666.com),
! Ilya Zakharevich (ilya@@math.ohio-state.edu),
! Eli Zaretskii (eliz@@is.elta.co.il)
  @end example
  
diff -2rcpP --exclude=*.elc emacs-19.30/man/emacs.texi emacs-19.31/man/emacs.texi
*** emacs-19.30/man/emacs.texi	Sun Nov 19 16:29:36 1995
--- emacs-19.31/man/emacs.texi	Thu May 23 15:32:26 1996
***************
*** 4,8 ****
  @c The edition number appears in several places in this file
  This corresponds to the eleventh edition of the @cite{GNU Emacs Manual},
! for Emacs version 19.30.
  @c Please REMEMBER to update edition number in *three* places in this file.
  
--- 4,8 ----
  @c The edition number appears in several places in this file
  This corresponds to the eleventh edition of the @cite{GNU Emacs Manual},
! for Emacs version 19.31.
  @c Please REMEMBER to update edition number in *three* places in this file.
  
*************** Published by the Free Software Foundatio
*** 11,15 ****
  Boston, MA  02111-1307 USA
  
! Copyright (C) 1985, 1986, 1987, 1993, 1994, 1995 Free Software Foundation, Inc.
  
  Permission is granted to make and distribute verbatim copies of
--- 11,15 ----
  Boston, MA  02111-1307 USA
  
! Copyright (C) 1985, 1986, 1987, 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
  
  Permission is granted to make and distribute verbatim copies of
*************** original English.
*** 64,76 ****
  @center @titlefont{GNU Emacs Manual}
  @sp 4
! @center Eleventh Edition, Updated for Emacs Version 19.30
  @sp 5
  @center Richard Stallman
  @page
  @vskip 0pt plus 1filll
! Copyright @copyright{} 1985, 1986, 1987, 1993, 1994, 1995 Free Software Foundation, Inc.
  @sp 2
  Eleventh Edition @*
! Updated for Emacs Version 19.30, @*
  November 1995
  
--- 64,76 ----
  @center @titlefont{GNU Emacs Manual}
  @sp 4
! @center Eleventh Edition, Updated for Emacs Version 19.31
  @sp 5
  @center Richard Stallman
  @page
  @vskip 0pt plus 1filll
! Copyright @copyright{} 1985, 1986, 1987, 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
  @sp 2
  Eleventh Edition @*
! Updated for Emacs Version 19.31, @*
  November 1995
  
*************** Emacs is the extensible, customizable, s
*** 111,115 ****
  display editor.  This Info file describes how to edit with Emacs
  and some of how to customize it, but not how to extend it.  It
! corresponds to GNU Emacs version 19.30.
  
  @end ifinfo
--- 111,115 ----
  display editor.  This Info file describes how to edit with Emacs
  and some of how to customize it, but not how to extend it.  It
! corresponds to GNU Emacs version 19.31.
  
  @end ifinfo
*************** Recovery from Problems.
*** 228,231 ****
--- 228,232 ----
  * Lossage::	      What to do if Emacs is hung or malfunctioning.
  * Bugs::	      How and when to report a bug.
+ * Contributing::      How to contribute improvements to Emacs.
  * Service::	      How to get help for your own Emacs needs.
  
*************** Controlling the Display
*** 310,315 ****
  * Horizontal Scrolling::   Moving text left and right in a window.
  * Selective Display::	   Hiding lines with lots of indentation.
- * Optional Mode Line::	   Optional mode line features.
  * European Display::	   Displaying (and entering) European characters.
  * Display Vars::	   Information on variables for customizing display.
  
--- 311,317 ----
  * Horizontal Scrolling::   Moving text left and right in a window.
  * Selective Display::	   Hiding lines with lots of indentation.
  * European Display::	   Displaying (and entering) European characters.
+ * Follow Mode::            Follow mode lets two windows scroll as one.
+ * Optional Mode Line::	   Optional mode line features.
  * Display Vars::	   Information on variables for customizing display.
  
*************** File Handling
*** 351,354 ****
--- 353,357 ----
  * Comparing Files::  Finding where two files differ.
  * Misc File Ops::    Other things you can do on files.
+ * Compressed Files:: Accessing compressed files.
  
  Saving Files
*************** Command Line Options and Arguments
*** 723,726 ****
--- 726,730 ----
  * Window Size X::       Start-up window size, under X.
  * Borders X::	        Internal and external borders, under X.
+ * Title X::             Specifying the initial frame's title.
  * Icons X::             Choosing what sort of icon to use, under X.
  * Resources X::         Advanced use of classes and resources, under X.
*************** Environment Variables
*** 732,735 ****
--- 736,749 ----
  * General Variables::	  Environment variables that all versions of Emacs use.
  * Misc Variables::	  Certain system specific variables.
+ 
+ MS-DOS and Windows NT/95
+ 
+ * Keyboard and Mouse on MS-DOS::
+ * Display on MS-DOS::
+ * File Names on MS-DOS::
+ * Text and Binary::
+ * Printing and MS-DOS::
+ * Subprocesses on MS-DOS::
+ * Windows 95 Subprocesses::
  @end menu
  
*************** Cambridge, MA 02139, USA@.  The price to
*** 793,800 ****
  This edition of the manual is intended for use with GNU Emacs installed
  on GNU and Unix systems.  GNU Emacs can also be used on VMS, MS-DOS
! (aka.@: MS-DOG) and Windows NT systems, but those systems have different
! file name syntax and do not support all GNU Emacs features.  We don't
! try to describe VMS usage in this manual.  @xref{MS-DOS}, for
! information about using Emacs on MS-DOS.
  @end iftex
  
--- 807,814 ----
  This edition of the manual is intended for use with GNU Emacs installed
  on GNU and Unix systems.  GNU Emacs can also be used on VMS, MS-DOS
! (aka.@: MS-DOG), Windows NT, and Windows 95 systems.  Those systems use
! different file name syntax; in addition, VMS and MS-DOS do not support
! all GNU Emacs features.  We don't try to describe VMS usage in this
! manual.  @xref{MS-DOS}, for information about using Emacs on MS-DOS.
  @end iftex
  
*************** subscribing to periodic updates.
*** 855,859 ****
  @iftex
  Contributors to GNU Emacs include Per Abrahamsen, Jay K. Adams, Joe
! Arceneax, Boaz Ben-Zvi, Jim Blandy, Frank Bresz, Kevin Broadey, Vincent
  Broman, David M. Brown, Hans Chalupsky, Bob Chassell, James Clark, Mike
  Clarkson, Doug Cutting, Michael DeCorte, Gary Delp, Matthieu Devin,
--- 869,873 ----
  @iftex
  Contributors to GNU Emacs include Per Abrahamsen, Jay K. Adams, Joe
! Arceneaux, Boaz Ben-Zvi, Jim Blandy, Frank Bresz, Kevin Broadey, Vincent
  Broman, David M. Brown, Hans Chalupsky, Bob Chassell, James Clark, Mike
  Clarkson, Doug Cutting, Michael DeCorte, Gary Delp, Matthieu Devin,
*************** Martensson, Charlie Martin, Thomas May, 
*** 872,876 ****
  Richard Mlynarik, Keith Moore, Thomas Neumann, Mike Newton, Jurgen
  Nickelsen, Jeff Norden, Jeff Peck, Damon Anton Permezel, Tom Perrine,
! Daniel Pfeiffer, Fred Pierresteguy, Christian Plaunt, Franceso
  A. Potorti, Michael D. Prange, Mukesh Prasad, Ashwin Ram, Eric
  S. Raymond, Paul Reilly, Edward M. Reingold, Rob Riepel, Roland
--- 886,890 ----
  Richard Mlynarik, Keith Moore, Thomas Neumann, Mike Newton, Jurgen
  Nickelsen, Jeff Norden, Jeff Peck, Damon Anton Permezel, Tom Perrine,
! Daniel Pfeiffer, Fred Pierresteguy, Christian Plaunt, Francesco
  A. Potorti, Michael D. Prange, Mukesh Prasad, Ashwin Ram, Eric
  S. Raymond, Paul Reilly, Edward M. Reingold, Rob Riepel, Roland
diff -2rcpP --exclude=*.elc emacs-19.30/man/files.texi emacs-19.31/man/files.texi
*** emacs-19.30/man/files.texi	Wed Nov 15 20:34:33 1995
--- emacs-19.31/man/files.texi	Wed May 15 10:50:35 1996
*************** like this in the echo area:
*** 317,321 ****
  
  @example
! (No changes need to be written)
  @end example
  
--- 317,321 ----
  
  @example
! (No changes need to be saved)
  @end example
  
*************** in a buffer is calculated when auto-savi
*** 708,716 ****
  
    When you delete a substantial part of the text in a large buffer, auto
! save turns off temporarily in that buffer.  This is so that if you
! delete text accidentally, it is likely to remain present in the auto
! save file.  To reenable auto-saving after this happens, simply save the
! file explicitly with @kbd{C-x C-s}.  Using @kbd{C-u 1 M-x
! auto-save-mode} also cancels this particular state.
  
  @vindex auto-save-visited-file-name
--- 708,716 ----
  
    When you delete a substantial part of the text in a large buffer, auto
! save turns off temporarily in that buffer.  This is because if you
! deleted the text unintentionally, you might find the auto-save file more
! useful if it contains the deleted text.  To reenable auto-saving after
! this happens, save the buffer with @kbd{C-x C-s}, or use @kbd{C-u 1 M-x
! auto-save}.
  
  @vindex auto-save-visited-file-name
*************** to @code{nil}.  Changing the visited fil
*** 726,735 ****
  the new visited name.
  
-   When you delete a large amount of a buffer's text, auto-saving turns
- off in that buffer.  This is because if you deleted the text
- unintentionally, you might find the auto-save file more useful if it
- contains the deleted text.  To restart auto-saving in that buffer, save
- the buffer with @kbd{C-x C-s}, or use @kbd{M-x auto-save}.
- 
  @node Auto Save Control
  @subsection Controlling Auto-Saving
--- 726,729 ----
*************** this---saving them---updates the files t
*** 812,818 ****
  
    Interrupted sessions are recorded in files named
! @file{.save-@var{pid}-@var{hostname}} in your home directory.  You can
  turn off the recording of sessions by setting the variable
! @code{auto-save-file-name-list} to @code{nil}.  You can store the
  current session in a different place by setting the variable to a
  different file name, but you'll have to redefine @code{recover-session}
--- 806,814 ----
  
    Interrupted sessions are recorded in files named
! @file{.saves-@var{pid}-@var{hostname}} in your home directory.  You can
  turn off the recording of sessions by setting the variable
! @code{auto-save-list-file-name} to @code{nil}.  (Doing that in your
! @file{.emacs} file has no effect---instead, set
! @code{auto-save-list-file-prefix} to @code{nil}).  You can store the
  current session in a different place by setting the variable to a
  different file name, but you'll have to redefine @code{recover-session}
*************** description of what was changed in that 
*** 861,867 ****
  
    The Emacs version control commands work with three version control
! systems---RCS, CVS and SCCS.  The GNU project recommends the version
! control system known as RCS, which is free software and available from
! the Free Software Foundation.
  
  @menu
--- 857,862 ----
  
    The Emacs version control commands work with three version control
! systems---RCS, CVS and SCCS.  The GNU project recommends RCS and CVS,
! which are free software and available from the Free Software Foundation.
  
  @menu
*************** and visit the file again.
*** 1192,1196 ****
  
  @cindex @code{CVSREAD} environment variable
- @c ??? What value of CVSREAD
    If, instead, you would like to use explicit check-out with CVS, set
  the @code{CVSREAD} environment variable to some value.  (It does not
--- 1187,1190 ----
*************** headers.
*** 1810,1814 ****
  @node Customizing VC
  @subsection Customizing VC
! @c There is no need to tell users about vc-master-templates.
  
  @vindex vc-make-backup-files
--- 1804,1821 ----
  @node Customizing VC
  @subsection Customizing VC
! 
!   There are many ways of customizing VC.  The variables that control its
! behaviour fall into three categories, described in the following
! sections.
! 
! @menu
! * VC Workfile Handling::  Various options concerning working files.
! * VC Status Retrieval::   How VC finds the version control status of a file,
!                             and how to customize this.
! * VC Command Execution::  Which commands VC should run, and how.
! @end menu
! 
! @node VC Workfile Handling
! @subsubsection VC Workfile Handling
  
  @vindex vc-make-backup-files
*************** attempt to visit the file with Emacs cre
*** 1825,1840 ****
  files are always kept.)
  
! @vindex vc-suppress-confirm
!   If @code{vc-suppress-confirm} is non-@code{nil}, then @kbd{C-x C-q}
! and @kbd{C-x v i} can save the current buffer without asking, and
! @kbd{C-x v u} also operates without asking for confirmation.  (This
! variable does not affect @kbd{C-x v c}; that operation is so drastic
! that it should always ask for confirmation.)
  
! @vindex vc-command-messages
!   VC mode does much of its work by running the shell commands for RCS,
! CVS and SCCS.  If @code{vc-command-messages} is non-@code{nil}, VC
! displays messages to indicate which shell commands it runs, and
! additional messages when the commands finish.
  
    When deducing the locked/unlocked state of a file, VC first looks for
--- 1832,1853 ----
  files are always kept.)
  
! @vindex vc-follow-symlinks
!   Editing a version-controlled file through a symbolic link can be
! dangerous.  It bypasses the version control system--you can edit the
! file without checking it out, and fail to check your changes in.  Also,
! your changes might overwrite those of another user.  To protect against
! this, VC checks each symbolic link that you visit, to see if it points
! to a file under version control.
! 
!   The variable @code{vc-follow-symlinks} controls what to do when a
! symbolic link points to a version-controlled file.  If it is @code{nil},
! VC only displays a warning message.  If it is @code{t}, VC automatically
! follows the link, and visits the real file instead, telling you about
! this in the echo area.  If the variable is @code{ask} (the default), VC
! asks you each time what to do.
  
! @node VC Status Retrieval
! @subsubsection VC Status Retrieval
! @c There is no need to tell users about vc-master-templates.
  
    When deducing the locked/unlocked state of a file, VC first looks for
*************** there's any lock on the file, but not wh
*** 1848,1851 ****
--- 1861,1865 ----
  contains that locked version.
  
+ @vindex vc-consult-headers
    You can tell VC not to use version headers to determine lock status by
  setting @code{vc-consult-headers} to @code{nil}.  VC then always uses
*************** files are changed erroneously, set @code
*** 1866,1869 ****
--- 1880,1899 ----
  status.
  
+ @node VC Command Execution
+ @subsubsection VC Command Execution
+ 
+ @vindex vc-suppress-confirm
+   If @code{vc-suppress-confirm} is non-@code{nil}, then @kbd{C-x C-q}
+ and @kbd{C-x v i} can save the current buffer without asking, and
+ @kbd{C-x v u} also operates without asking for confirmation.  (This
+ variable does not affect @kbd{C-x v c}; that operation is so drastic
+ that it should always ask for confirmation.)
+ 
+ @vindex vc-command-messages
+   VC mode does much of its work by running the shell commands for RCS,
+ CVS and SCCS.  If @code{vc-command-messages} is non-@code{nil}, VC
+ displays messages to indicate which shell commands it runs, and
+ additional messages when the commands finish.
+ 
  @vindex vc-path
    You can specify additional directories to search for version control
*************** if you alter them and save them.  To ena
*** 2057,2061 ****
  command @kbd{M-x auto-compression-mode}.
  
!   When automatic compression (which implies automatic uncompresson as
  well) is enabled, Emacs recognizes compressed files by their file names.
  File names ending in @samp{.gz} indicate a file compressed with
--- 2087,2091 ----
  command @kbd{M-x auto-compression-mode}.
  
!   When automatic compression (which implies automatic uncompression as
  well) is enabled, Emacs recognizes compressed files by their file names.
  File names ending in @samp{.gz} indicate a file compressed with
diff -2rcpP --exclude=*.elc emacs-19.30/man/forms.texi emacs-19.31/man/forms.texi
*** emacs-19.30/man/forms.texi	Tue Jun  6 22:01:59 1995
--- emacs-19.31/man/forms.texi	Sat Mar 23 09:42:27 1996
***************
*** 2,6 ****
  @c documentation for forms-mode
  @c Written by Johan Vromans, and edited by Richard Stallman
! @c $Id: forms.texi,v 1.7 1994/10/15 10:58:31 jv Exp $
  
  @comment %**start of header (This is for running Texinfo on a region.)
--- 2,6 ----
  @c documentation for forms-mode
  @c Written by Johan Vromans, and edited by Richard Stallman
! @c $Id: forms.texi,v 1.10 1996/03/01 21:36:47 jv Exp $
  
  @comment %**start of header (This is for running Texinfo on a region.)
*************** paragraph not being relevant to the prin
*** 40,51 ****
  @center Forms-Mode version 2
  @sp 1
! @center January 1995
  @sp 5
  @center Johan Vromans
! @center @i{jv@@nl.net}
  @page
  
  @vskip 0pt plus 1filll
! Copyright @copyright{} 1989, 1995 Free Software Foundation, Inc.
  
  Permission is granted to make and distribute verbatim copies of
--- 40,51 ----
  @center Forms-Mode version 2
  @sp 1
! @center March 1996
  @sp 5
  @center Johan Vromans
! @center @i{jvromans@@squirrel.nl}
  @page
  
  @vskip 0pt plus 1filll
! Copyright @copyright{} 1989, 1995, 1996 Free Software Foundation, Inc.
  
  Permission is granted to make and distribute verbatim copies of
*************** If you give an empty argument, the previ
*** 264,269 ****
  
  @findex forms-search-backward
! @kindex C-c C-s @var{regexp} @key{RET}
! @item C-c C-s @var{regexp} @key{RET}
  Search backward for @var{regexp} in all records following this one
  (@code{forms-search-backward}).  If found, this record is shown.
--- 264,269 ----
  
  @findex forms-search-backward
! @kindex C-c C-r @var{regexp} @key{RET}
! @item C-c C-r @var{regexp} @key{RET}
  Search backward for @var{regexp} in all records following this one
  (@code{forms-search-backward}).  If found, this record is shown.
*************** modified, just before updating the Forms
*** 504,507 ****
--- 504,519 ----
  @code{nil}, no function is called.
  @xref{Modifying Forms Contents}, for details.
+ 
+ @findex forms-insert-after
+ @item forms-insert-after
+ If this variable is not @code{nil}, new records are created @emph{after} the 
+ current record. Also, upon visiting a file, the initial position will be
+ at the last record instead of the first one.
+ 
+ @findex forms-check-number-of-fields
+ @item forms-check-number-of-fields
+ Normally each record is checked to contain the correct number of fields.
+ Under certain circumstances, this can be undesirable.
+ If this variable is set to @code{nil}, these checks will be bypassed.
  @end table
  
diff -2rcpP --exclude=*.elc emacs-19.30/man/frames.texi emacs-19.31/man/frames.texi
*** emacs-19.30/man/frames.texi	Wed Nov 15 21:40:27 1995
--- emacs-19.31/man/frames.texi	Wed May 15 10:44:05 1996
*************** Specify font @var{font} as the default f
*** 500,506 ****
  @xref{Font X}, for ways to list the available fonts on your system.
  
! @kindex C-Mouse-1
  You can also set a frame's default font through a pop-up menu.
! Press @kbd{C-Mouse-1} to activate this menu.
  @end table
  
--- 500,506 ----
  @xref{Font X}, for ways to list the available fonts on your system.
  
! @kindex S-Mouse-1
  You can also set a frame's default font through a pop-up menu.
! Press @kbd{S-Mouse-1} to activate this menu.
  @end table
  
*************** additional line available for text.
*** 597,602 ****
  characters.  The aspects of style that you can control are the type
  font, the foreground color, the background color, and whether to
! underline.  Emacs 19.29 does not support faces on MS-DOS, but future
! versions may support them partially (@pxref{MS-DOS}).
  
    The way you control display style is by defining named @dfn{faces}.
--- 597,603 ----
  characters.  The aspects of style that you can control are the type
  font, the foreground color, the background color, and whether to
! underline.  Emacs on MS-DOS supports faces partially by letting you
! control the foreground and background colors of each face
! (@pxref{MS-DOS}).
  
    The way you control display style is by defining named @dfn{faces}.
*************** it can also recognize and properly highl
*** 663,666 ****
--- 664,684 ----
  constructs---for example, names of functions being defined.
  
+ @kindex C-M-g
+ @findex font-lock-fontify-block
+   In Font-Lock mode, when you edit the text, the highlighting updates
+ automatically in the line that you changed.  Most changes don't affect
+ the highlighting of subsequent lines, but occasionally they do.  To
+ rehighlight a range of lines, use the command @kbd{C-M-g}
+ (@code{font-lock-fontify-block}).
+ 
+ @vindex font-lock-mark-block-function
+   In certain major modes, @kbd{C-M-g} refontifies the entire current
+ function.  (The variable @code{font-lock-mark-block-function} controls
+ how to find the current function.)  In other major modes, @kbd{C-M-g}
+ refontifies 16 lines above and below point.
+ 
+   With a prefix argument @var{n}, @kbd{C-M-g} refontifies @var{n} lines
+ above and below point, regardless of the mode.
+ 
  @findex font-lock-mode
  @findex turn-on-font-lock
*************** file, you can do this:
*** 675,678 ****
--- 693,704 ----
  @end example
  
+ @findex global-font-lock-mode
+   To turn on Font-Lock mode automatically in all modes which support it,
+ use the function @code{global-font-lock-mode}, like this:
+ 
+ @example
+ (global-font-lock-mode t)
+ @end example
+ 
  @vindex font-lock-display-type
    To get the full benefit of Font-Lock mode, you need to choose a
*************** kinds of text.  Emacs chooses the defaul
*** 684,697 ****
  characteristics of your display.
  
- @vindex font-lock-maximum-size
  @vindex font-lock-maximum-decoration
!   The variable @code{font-lock-maximum-size} specifies a buffer size
! beyond which Font-Lock mode is suppressed (lest it take too long).  The
! variable @code{font-lock-maximum-decoration} specifies the preferred
! level of fontification for modes that provide multiple levels.  The
! normal default is 1; larger numbers request more fontification, and some
! modes support levels as high as 3.  These variables can also specify
! different numbers for particular major modes; for example, to use level
! 3 for C/C++ modes, and the default level otherwise, use this:
  
  @example
--- 710,720 ----
  characteristics of your display.
  
  @vindex font-lock-maximum-decoration
!   The variable @code{font-lock-maximum-decoration} specifies the
! preferred level of fontification for modes that provide multiple levels.
! The normal default is 1; larger numbers request more fontification, and
! some modes support levels as high as 3.  These variables can also
! specify different numbers for particular major modes; for example, to
! use level 3 for C/C++ modes, and the default level otherwise, use this:
  
  @example
*************** different numbers for particular major m
*** 699,702 ****
--- 722,754 ----
        '((c-mode . 3) (c++-mode . 3)))
  @end example
+ 
+ @vindex font-lock-maximum-size
+   Fontification can be too slow for large buffers, so you can suppress
+ it.  The variable `font-lock-maximum-size' specifies a buffer size,
+ beyond which buffer fontification is suppressed.
+ 
+ @cindex Fast Lock mode
+   To make Font Lock mode practical for large buffers, you can use Fast
+ Lock mode to avoid repetitive buffer fontification.  Fast Lock mode
+ saves the font information for a file in a separate cache file; each
+ time you visit the file, it rereads the font information from the cache
+ file instead of refontifying the text from scratch.
+ 
+ @findex fast-lock-mode
+ @findex turn-on-fast-lock
+   The command @kbd{M-x fast-lock-mode} turns Fast Lock mode on or off,
+ according to the argument (with no argument, it toggles).  The function
+ @code{turn-on-fast-lock} unconditionally enables Fast Lock mode.  Here
+ is how you can arrange to enable Fast Lock mode whenever you use Font
+ Lock mode:
+ 
+ @example
+ (add-hook 'font-lock-mode-hook 'turn-on-fast-lock)
+ @end example
+ 
+ @vindex fast-lock-minimum-size
+   It is not worth while writing a cache file for small buffers.
+ Therefore, the variable @code{fast-lock-minimum-size} specifies a
+ minimum buffer size for caching font information.
  
    You can print out the buffer with the highlighting that appears
diff -2rcpP --exclude=*.elc emacs-19.30/man/glossary.texi emacs-19.31/man/glossary.texi
*** emacs-19.30/man/glossary.texi	Mon Jun  5 22:48:45 1995
--- emacs-19.31/man/glossary.texi	Sun Nov 26 17:45:10 1995
*************** the effect of the command.  Often the nu
*** 612,619 ****
  repeat count.  @xref{Arguments}.
  
- @item Option
- An option is a variable (q.v.@:) that exists so that you can customize
- Emacs by setting it to a new value.  @xref{Variables}.
- 
  @item Overwrite Mode
  Overwrite mode is a minor mode.  When it is enabled, ordinary text
--- 612,615 ----
*************** back the text that existed earlier in th
*** 889,896 ****
  @xref{Undo}.
  
  @item Variable
  A variable is an object in Lisp that can store an arbitrary value.
  Emacs uses some variables for internal purposes, and has others (known
! as `options' (q.v.@:)) just so that you can set their values to
  control the behavior of Emacs.  The variables used in Emacs that you
  are likely to be interested in are listed in the Variables Index in
--- 885,896 ----
  @xref{Undo}.
  
+ @item User Option
+ A user option is a variable (q.v.@:) that exists so that you can customize
+ Emacs by setting it to a new value.  @xref{Variables}.
+ 
  @item Variable
  A variable is an object in Lisp that can store an arbitrary value.
  Emacs uses some variables for internal purposes, and has others (known
! as `user options' (q.v.@:)) just so that you can set their values to
  control the behavior of Emacs.  The variables used in Emacs that you
  are likely to be interested in are listed in the Variables Index in
diff -2rcpP --exclude=*.elc emacs-19.30/man/gnu.texi emacs-19.31/man/gnu.texi
*** emacs-19.30/man/gnu.texi	Thu Jun  1 21:15:58 1995
--- emacs-19.31/man/gnu.texi	Tue Apr 30 14:25:32 1996
*************** want to let the free market decide this?
*** 277,281 ****
  Foundation raises most of its funds from a distribution service,
  although it is a charity rather than a company.  If @emph{no one}
! chooses to obtain copies by ordering the from the FSF, it will be unable
  to do its work.  But this does not mean that proprietary restrictions
  are justified to force every user to pay.  If a small fraction of all
--- 277,281 ----
  Foundation raises most of its funds from a distribution service,
  although it is a charity rather than a company.  If @emph{no one}
! chooses to obtain copies by ordering from the FSF, it will be unable
  to do its work.  But this does not mean that proprietary restrictions
  are justified to force every user to pay.  If a small fraction of all
diff -2rcpP --exclude=*.elc emacs-19.30/man/gnus.texi emacs-19.31/man/gnus.texi
*** emacs-19.30/man/gnus.texi	Sat Nov  4 01:59:40 1995
--- emacs-19.31/man/gnus.texi	Fri Feb  9 22:36:19 1996
*************** distribution point for the new and spiff
*** 116,120 ****
  The Site That Destroys Newsrcs And Drives People Mad.
  
! During the first extended alpha period of develpment, the new Gnus was
  called "(ding) Gnus".  @dfn{(ding)}, is, of course, short for @dfn{ding
  is not Gnus}, which is a total and utter lie, but who cares? (Besides,
--- 116,120 ----
  The Site That Destroys Newsrcs And Drives People Mad.
  
! During the first extended alpha period of development, the new Gnus was
  called "(ding) Gnus".  @dfn{(ding)}, is, of course, short for @dfn{ding
  is not Gnus}, which is a total and utter lie, but who cares? (Besides,
*************** think?)
*** 125,129 ****
  In any case, after spending all that energy with coming up with a new
  and spiffy name, we decided that the name was @emph{too} spiffy, so we
! renamamed it back again to "Gnus".  But in mixed case.  "Gnus" vs.
  @sc{gnus}.  New vs. old.
  
--- 125,129 ----
  In any case, after spending all that energy with coming up with a new
  and spiffy name, we decided that the name was @emph{too} spiffy, so we
! renamed it back again to "Gnus".  But in mixed case.  "Gnus" vs.
  @sc{gnus}.  New vs. old.
  
*************** and won't be released until February.  C
*** 138,141 ****
--- 138,142 ----
  * New Features::        Pointers to some of the new stuff in Gnus.
  * Newest Features::     Features so new that they haven't been written yet.
+ * Censorship::          This manual has been censored.
  @end menu
  
*************** Hierarchal group buffers.
*** 529,533 ****
  Don't kill summary buffers upon exit from the groups.
  @item
! Allow adaption on secondary marks.
  @end itemize
  
--- 530,534 ----
  Don't kill summary buffers upon exit from the groups.
  @item
! Allow adaptation on secondary marks.
  @end itemize
  
*************** You can probably sneak a look at the act
*** 538,541 ****
--- 539,556 ----
  by snooping @code{<URL:http://www.ifi.uio.no/~larsi/sgnus/todo>}. 
  
+ @node Censorship
+ @section Censorship
+ @cindex censorship
+ 
+ This version of the Gnus manual (as well as Gnus itself) has been
+ censored in accord with the Communications Decency Act.  This law was
+ described by its proponents as a ban on pornography---which was a
+ deception, since it prohibits far more than that.  This manual did not
+ contain pornography, but part of it was prohibited nonetheless.
+ 
+ For information on US government censorship of the Internet, and
+ what you can do to bring back freedom of the press, see the web
+ site @samp{http://www.vtw.org/}.
+ 
  @node Terminology
  @chapter Terminology
*************** asterisk at the beginning of the line?)
*** 1038,1042 ****
  
  @vindex gnus-group-line-format
! You can fuck that up to your heart's delight by fiddling with the
  @code{gnus-group-line-format} variable.  This variable works along the
  lines of a @code{format} specification, which is pretty much the same as
--- 1053,1057 ----
  
  @vindex gnus-group-line-format
! You can change that format to whatever you want by fiddling with the
  @code{gnus-group-line-format} variable.  This variable works along the
  lines of a @code{format} specification, which is pretty much the same as
*************** All groups with a level less than or equ
*** 1387,1392 ****
  by default.
  
! @vindex gnus-group-use-permament-levels
! If @code{gnus-group-use-permament-levels} is non-@code{nil}, once you
  give a level prefix to @kbd{g} or @kbd{l}, all subsequent commands will
  use this level as the "work" level.
--- 1402,1407 ----
  by default.
  
! @vindex gnus-group-use-permanent-levels
! If @code{gnus-group-use-permanent-levels} is non-@code{nil}, once you
  give a level prefix to @kbd{g} or @kbd{l}, all subsequent commands will
  use this level as the "work" level.
*************** Quit Gnus without saving any startup fil
*** 2773,2777 ****
  If you wish to completely unload Gnus and all its adherents, you can use
  the @code{gnus-unload} command.  This command is also very handy when
! trying to custoize meta-variables.
  
  Note:
--- 2788,2792 ----
  If you wish to completely unload Gnus and all its adherents, you can use
  the @code{gnus-unload} command.  This command is also very handy when
! trying to customize meta-variables.
  
  Note:
*************** Three variables for customizing what to 
*** 3426,3430 ****
  @vindex gnus-mail-reply-method
  @item gnus-mail-reply-method
! This function is used to compose replies.  The three functions avaibale
  are:
  
--- 3441,3445 ----
  @vindex gnus-mail-reply-method
  @item gnus-mail-reply-method
! This function is used to compose replies.  The three functions available
  are:
  
*************** are:
*** 3443,3447 ****
  @vindex gnus-mail-forward-method
  @item gnus-mail-forward-method
! This function is used to forward messages.  The three functions avaibale
  are:
  
--- 3458,3462 ----
  @vindex gnus-mail-forward-method
  @item gnus-mail-forward-method
! This function is used to forward messages.  The three functions available
  are:
  
*************** are:
*** 3460,3464 ****
  @vindex gnus-mail-other-window-method
  @item gnus-mail-other-window-method
! This function is used to send mails.  The three functions avaibale are:
  
  @findex gnus-mail-other-window-using-vm
--- 3475,3479 ----
  @vindex gnus-mail-other-window-method
  @item gnus-mail-other-window-method
! This function is used to send mails.  The three functions available are:
  
  @findex gnus-mail-other-window-using-vm
*************** post buffer has been initialized, and ca
*** 3634,3639 ****
  signature.  Nice if you use different signatures in different groups.
  
! @item gnus-post-prepapare-hook
! @vindex gnus-post-prepapare-hook
  This hook is called after a post buffer has been prepared. If you want
  to insert a signature at this point, you could put
--- 3649,3654 ----
  signature.  Nice if you use different signatures in different groups.
  
! @item gnus-post-prepare-hook
! @vindex gnus-post-prepare-hook
  This hook is called after a post buffer has been prepared. If you want
  to insert a signature at this point, you could put
*************** If non-@code{nil}, Gnus will attempt to 
*** 3693,3697 ****
  headers, as well as some other stuff, before posting.  You can control
  the granularity of the check by adding or removing elements from this
! list.  Legal elemetents are:
  
  @table @code
--- 3708,3712 ----
  headers, as well as some other stuff, before posting.  You can control
  the granularity of the check by adding or removing elements from this
! list.  Legal elements are:
  
  @table @code
*************** in your @file{all.SCORE} file:
*** 5887,5891 ****
  You may also consider doing something similar with @code{expunge}.  
  
! @item Negated charater classes
  If you say stuff like @code{[^abcd]*}, you may get unexpected results.
  That will match newlines, which might lead to, well, The Unknown.  Say
--- 5902,5906 ----
  You may also consider doing something similar with @code{expunge}.  
  
! @item Negated character classes
  If you say stuff like @code{[^abcd]*}, you may get unexpected results.
  That will match newlines, which might lead to, well, The Unknown.  Say
*************** Expire all expirable articles in the gro
*** 6063,6067 ****
  Expunge all the expirable articles in the group
  (@code{gnus-summary-expire-articles-now}). This means that @strong{all}
! articles that are eligeble for expiry in the current group will
  disappear forever into that big @file{/dev/null} in the sky.
  
--- 6078,6082 ----
  Expunge all the expirable articles in the group
  (@code{gnus-summary-expire-articles-now}). This means that @strong{all}
! articles that are eligible for expiry in the current group will
  disappear forever into that big @file{/dev/null} in the sky.
  
*************** over.
*** 6579,6583 ****
  * Interactive::                Making Gnus ask you many questions.
  * Windows Configuration::      Configuring the Gnus buffer windows.
! * Buttons::                    Get tendonitis in ten easy steps!
  * Various Various::            Things that are really various.
  @end menu
--- 6594,6598 ----
  * Interactive::                Making Gnus ask you many questions.
  * Windows Configuration::      Configuring the Gnus buffer windows.
! * Buttons::                    Get tendinitis in ten easy steps!
  * Various Various::            Things that are really various.
  @end menu
*************** and that it is placed over the article b
*** 6653,6657 ****
  calculator there).  However, the special number @code{1.0} is used to
  signal that this buffer should soak up all the rest of the space
! avaiable after the rest of the buffers have taken whatever they need.  
  There should be only one buffer with the @code{1.0} size spec.
  
--- 6668,6672 ----
  calculator there).  However, the special number @code{1.0} is used to
  signal that this buffer should soak up all the rest of the space
! available after the rest of the buffers have taken whatever they need.  
  There should be only one buffer with the @code{1.0} size spec.
  
*************** Not complicated enough for you?  Well, t
*** 6689,6693 ****
  
  Whoops.  Two buffers with the mystery 100% tag.  And what's that
! @code{horizontal} thingie?  
  
  If the first element in one of the rule lists is a list with
--- 6704,6708 ----
  
  Whoops.  Two buffers with the mystery 100% tag.  And what's that
! @code{horizontal} thingy?  
  
  If the first element in one of the rule lists is a list with
*************** considering the highest and lowest artic
*** 7240,7244 ****
  may have been cancelled.  Gnus just discards the total-number, so
  whether one should take the bother to generate it properly (if that is a
! problem) is left as an excercise to the reader.
  
  @example
--- 7255,7259 ----
  may have been cancelled.  Gnus just discards the total-number, so
  whether one should take the bother to generate it properly (if that is a
! problem) is left as an exercise to the reader.
  
  @example
*************** would generally expect that if one later
*** 7366,7370 ****
  instance, some sort of asynchronous fetching of the articles after 4
  (which might be 5, 6, 7 or 11, 3, 909 depending on the order in that
! alist) would be fetched asynchronouly, but that is left up to the
  backend.  Gnus doesn't care.
  
--- 7381,7385 ----
  instance, some sort of asynchronous fetching of the articles after 4
  (which might be 5, 6, 7 or 11, 3, 909 depending on the order in that
! alist) would be fetched asynchronously, but that is left up to the
  backend.  Gnus doesn't care.
  
*************** There should be no data returned.
*** 7465,7469 ****
  
  Score files are meant to be easily parsable, but yet extremely
! mallable.   It was decided that something that had the same read syntax
  as an Emacs Lisp list would fit that spec.
  
--- 7480,7484 ----
  
  Score files are meant to be easily parsable, but yet extremely
! malleable.   It was decided that something that had the same read syntax
  as an Emacs Lisp list would fit that spec.
  
*************** to talk about lines in the head of an ar
*** 7548,7552 ****
  used by many people as a synonym for "head" -- "the header and the
  body".  (That should be avoided, in my opinion.)  And Gnus uses a format
! interanally that it calls "header", which is what I'm talking about
  here.  This is a 9-element vector, basically, with each header (ouch)
  having one slot. 
--- 7563,7567 ----
  used by many people as a synonym for "head" -- "the header and the
  body".  (That should be avoided, in my opinion.)  And Gnus uses a format
! internally that it calls "header", which is what I'm talking about
  here.  This is a 9-element vector, basically, with each header (ouch)
  having one slot. 
diff -2rcpP --exclude=*.elc emacs-19.30/man/help.texi emacs-19.31/man/help.texi
*** emacs-19.30/man/help.texi	Sat Nov 18 10:49:01 1995
--- emacs-19.31/man/help.texi	Tue Apr 30 14:26:21 1996
***************
*** 7,10 ****
--- 7,13 ----
  @cindex help
  @cindex self-documentation
+ @findex help-command
+ @kindex C-h
+ @kindex @key{F1}
  
    Emacs provides extensive help features accessible through a single
*************** that is how you ask for help about using
*** 15,21 ****
  @kbd{C-g}.  The function key @key{F1} is equivalent to @kbd{C-h}.
  
!   @kbd{C-h C-h} displays a list of the possible help options, each with
! a brief description.  Before you type a help option, you can use
! @key{SPC} or @key{DEL} to scroll through the list.
  
    @kbd{C-h} or @key{F1} means ``help'' in various other contexts as well.  For
--- 18,26 ----
  @kbd{C-g}.  The function key @key{F1} is equivalent to @kbd{C-h}.
  
! @kindex C-h C-h
! @findex help-for-help
!   @kbd{C-h C-h} (@code{help-for-help}) displays a list of the possible
! help options, each with a brief description.  Before you type a help
! option, you can use @key{SPC} or @key{DEL} to scroll through the list.
  
    @kbd{C-h} or @key{F1} means ``help'' in various other contexts as well.  For
*************** Print which keys run the command named @
*** 91,98 ****
  @item C-h C-f @var{function} @key{RET}
  Enter Info and go to the node documenting the Emacs function @var{function}
! (@code{info-goto-emacs-command-node}).
  @item C-h C-k @var{key}
  Enter Info and go to the node where the key sequence @var{key} is
! documented (@code{info-goto-emacs-key-command-node}).
  @item C-h C-c
  Display the copying conditions for GNU Emacs.
--- 96,103 ----
  @item C-h C-f @var{function} @key{RET}
  Enter Info and go to the node documenting the Emacs function @var{function}
! (@code{Info-goto-emacs-command-node}).
  @item C-h C-k @var{key}
  Enter Info and go to the node where the key sequence @var{key} is
! documented (@code{Info-goto-emacs-key-command-node}).
  @item C-h C-c
  Display the copying conditions for GNU Emacs.
diff -2rcpP --exclude=*.elc emacs-19.30/man/info-stnd.texi emacs-19.31/man/info-stnd.texi
*** emacs-19.30/man/info-stnd.texi	Sat Nov 13 02:03:47 1993
--- emacs-19.31/man/info-stnd.texi	Thu Jan  4 15:54:55 1996
*************** move the cursor about the screen.  The n
*** 146,150 ****
  describe keystrokes is identical to the notation used within the Emacs
  manual, and the GNU Readline manual.  @xref{Characters, , Character
! Conventions, emacs, the GNU Emacs Manual}, if you are unfamilar with the
  notation.
  
--- 146,150 ----
  describe keystrokes is identical to the notation used within the Emacs
  manual, and the GNU Readline manual.  @xref{Characters, , Character
! Conventions, emacs, the GNU Emacs Manual}, if you are unfamiliar with the
  notation.
  
*************** Moves to the node containing the next ma
*** 484,488 ****
  The most basic searching command is @samp{s} (@code{search}).  The
  @samp{s} command prompts you for a string in the echo area, and then
! searches the remainder of the info file for an ocurrence of that string.
  If the string is found, the node containing it is selected, and the
  cursor is left positioned at the start of the found string.  Subsequent
--- 484,488 ----
  The most basic searching command is @samp{s} (@code{search}).  The
  @samp{s} command prompts you for a string in the echo area, and then
! searches the remainder of the info file for an occurrence of that string.
  If the string is found, the node containing it is selected, and the
  cursor is left positioned at the start of the found string.  Subsequent
*************** Info, as well as display them.
*** 1226,1230 ****
  @chapter Info for System Administrators
  
! This text describes some common ways of setting up an Info heierarchy
  from scratch, and details the various options that are available when
  installing Info.  This text is designed for the person who is installing
--- 1226,1230 ----
  @chapter Info for System Administrators
  
! This text describes some common ways of setting up an Info hierarchy
  from scratch, and details the various options that are available when
  installing Info.  This text is designed for the person who is installing
*************** use GNU Info.
*** 1236,1242 ****
  * Setting the INFOPATH::	Where are my Info files kept?
  * Editing the DIR node::	What goes in `DIR', and why?
! * Storing Info files::		Alternate formats allow flexibilty in setups.
  * Using `localdir'::		Building DIR on the fly.
! * Example setups::		Some common ways to origanize Info files.
  @end menu
  
--- 1236,1242 ----
  * Setting the INFOPATH::	Where are my Info files kept?
  * Editing the DIR node::	What goes in `DIR', and why?
! * Storing Info files::		Alternate formats allow flexibility in setups.
  * Using `localdir'::		Building DIR on the fly.
! * Example setups::		Some common ways to organize Info files.
  @end menu
  
*************** What goes in `DIR', and why?
*** 1251,1255 ****
  @node Storing Info files
  @section Storing Info files
! Alternate formats allow flexibilty in setups.
  
  @node Using `localdir'
--- 1251,1255 ----
  @node Storing Info files
  @section Storing Info files
! Alternate formats allow flexibility in setups.
  
  @node Using `localdir'
*************** Building DIR on the fly.
*** 1259,1263 ****
  @node Example setups
  @section Example setups
! Some common ways to origanize Info files.
  @end ifset
  
--- 1259,1263 ----
  @node Example setups
  @section Example setups
! Some common ways to organize Info files.
  @end ifset
  
diff -2rcpP --exclude=*.elc emacs-19.30/man/info.texi emacs-19.31/man/info.texi
*** emacs-19.30/man/info.texi	Sun Apr 30 00:25:12 1995
--- emacs-19.31/man/info.texi	Sun Mar 24 23:41:32 1996
*************** the two lines from the top and moves the
*** 308,314 ****
  above them they may not make it all the way to the bottom.
  
!   If you type Space when there is no more to see, it rings the
! bell and otherwise does nothing.  The same goes for Delete when
! the header of the node is visible.
  
    If your screen is ever garbaged, you can tell Info to print it out
--- 308,317 ----
  above them they may not make it all the way to the bottom.
  
!   Space and Delete scroll through all the nodes in an Info file as a
! single logical sequence.  In this sequence, a node's subnodes appear
! following their parent.  If a node's menu is on the screen, Space takes
! you into the subnodes listed in the menu, one by one.  Once you reach
! the end of a node, Space takes you to the next node or back to the
! parent node.
  
    If your screen is ever garbaged, you can tell Info to print it out
*************** the subtopic of the line you are on.
*** 457,468 ****
  Here is a menu to give you a chance to practice.
  
! * Menu:	   The menu starts here.
! 
  This menu gives you three ways of going to one place, Help-FOO.
  
! * Foo:  Help-FOO.       A node you can visit for fun.@*
! * Bar:  Help-FOO.       Strange!  two ways to get to the same place.@*
! * Help-FOO::            And yet another!@*
! 
  
  @format
--- 460,470 ----
  Here is a menu to give you a chance to practice.
  
! @menu
  This menu gives you three ways of going to one place, Help-FOO.
  
! * Foo:  Help-FOO.       A node you can visit for fun.
! * Bar:  Help-FOO.       Strange!  two ways to get to the same place.
! * Help-FOO::            And yet another!
! @end menu
  
  @format
*************** cancel one character at a time if you ma
*** 502,512 ****
  @c It is an accident of the menu updating command.
  
- Here is another way to get to  Help-FOO, a menu.  You can ignore this
- if you want, or else try it (but then please come back to here).
- 
- @menu
- * Help-FOO::
- @end menu
- 
  @node Help-FOO,  ,  , Help-M
  @comment  node-name,  next,  previous,  up
--- 504,507 ----
*************** records the nodes where you have been in
*** 543,547 ****
  @kbd{l} command moves one step back through the history.
  
!   If you have been following directions, ad @kbd{l} command now will get
  you back to @samp{Help-M}.  Another @kbd{l} command would undo the
  @kbd{u} and get you back to @samp{Help-FOO}.  Another @kbd{l} would undo
--- 538,542 ----
  @kbd{l} command moves one step back through the history.
  
!   If you have been following directions, an @kbd{l} command now will get
  you back to @samp{Help-M}.  Another @kbd{l} command would undo the
  @kbd{u} and get you back to @samp{Help-FOO}.  Another @kbd{l} would undo
diff -2rcpP --exclude=*.elc emacs-19.30/man/mark.texi emacs-19.31/man/mark.texi
*** emacs-19.30/man/mark.texi	Fri Jun 30 20:30:13 1995
--- emacs-19.31/man/mark.texi	Sun Mar 24 23:42:56 1996
*************** mark also activates it, and nothing ever
*** 190,194 ****
  
  @vindex mark-even-if-inactive
!   If you the variable @code{mark-even-if-inactive} is non-@code{nil} in
  Transient Mark mode, then commands can use the mark and the region
  even when it is inactive.  Region highlighting appears and disappears 
--- 190,194 ----
  
  @vindex mark-even-if-inactive
!   If the variable @code{mark-even-if-inactive} is non-@code{nil} in
  Transient Mark mode, then commands can use the mark and the region
  even when it is inactive.  Region highlighting appears and disappears 
diff -2rcpP --exclude=*.elc emacs-19.30/man/mh-e.texi emacs-19.31/man/mh-e.texi
*** emacs-19.30/man/mh-e.texi	Thu Nov  2 18:33:19 1995
--- emacs-19.31/man/mh-e.texi	Thu Jan  4 15:55:06 1996
*************** to use the default format file or to a f
*** 2344,2348 ****
  format file (@code{mhl}(1) tells you how to write one).  When writing
  your own format file, use a nonzero value for @code{overflowoffset} to
! ensure the header is RFC 822 compliant and parseable by mh-e.
  @code{mhl} is always used for printing and forwarding; in this case, the
  value of @code{mhl-formfile} is consulted if it is a filename.
--- 2344,2348 ----
  format file (@code{mhl}(1) tells you how to write one).  When writing
  your own format file, use a nonzero value for @code{overflowoffset} to
! ensure the header is RFC 822 compliant and parsable by mh-e.
  @code{mhl} is always used for printing and forwarding; in this case, the
  value of @code{mhl-formfile} is consulted if it is a filename.
diff -2rcpP --exclude=*.elc emacs-19.30/man/misc.texi emacs-19.31/man/misc.texi
*** emacs-19.30/man/misc.texi	Wed Nov 15 22:26:00 1995
--- emacs-19.31/man/misc.texi	Tue May 21 13:32:54 1996
*************** You can then give commands interactively
*** 375,386 ****
  @findex shell-command
    @kbd{M-!} (@code{shell-command}) reads a line of text using the
! minibuffer executes it as a shell command in a subshell made just for
! this command.  Standard input for the command comes from the null
  device.  If the shell command produces any output, the output goes into
  an Emacs buffer named @samp{*Shell Command Output*}, which is displayed
  in another window but not selected.  A numeric argument, as in @kbd{M-1
! M-!}, directs this command to insert any output into the current
! buffer.  In that case, point is left before the output and the mark is
! set after the output.
  
    If the shell command line ends in @samp{&}, it runs asynchronously.
--- 375,386 ----
  @findex shell-command
    @kbd{M-!} (@code{shell-command}) reads a line of text using the
! minibuffer and executes it as a shell command in a subshell made just
! for that command.  Standard input for the command comes from the null
  device.  If the shell command produces any output, the output goes into
  an Emacs buffer named @samp{*Shell Command Output*}, which is displayed
  in another window but not selected.  A numeric argument, as in @kbd{M-1
! M-!}, directs this command to insert any output into the current buffer.
! In that case, point is left before the output and the mark is set after
! the output.
  
    If the shell command line ends in @samp{&}, it runs asynchronously.
*************** most common command syntax; it may not w
*** 486,490 ****
  @cindex mode, Shell
  
!   Shell buffer use Shell mode, which defines several special keys
  attached to the @kbd{C-c} prefix.  They are chosen to resemble the usual
  editing and job control characters present in shells that are not under
--- 486,490 ----
  @cindex mode, Shell
  
!   Shell buffers use Shell mode, which defines several special keys
  attached to the @kbd{C-c} prefix.  They are chosen to resemble the usual
  editing and job control characters present in shells that are not under
*************** command plus the output that follows it 
*** 667,671 ****
  communicating with interactive subprocesses.  Most of the features of
  Shell mode actually come from Comint mode, as you can see from the
! command names listed above.  The specialization of Shell mode in
  particular include the choice of regular expression for detecting
  prompts, the directory tracking feature, and a few user commands.
--- 667,671 ----
  communicating with interactive subprocesses.  Most of the features of
  Shell mode actually come from Comint mode, as you can see from the
! command names listed above.  The special features of Shell mode in
  particular include the choice of regular expression for detecting
  prompts, the directory tracking feature, and a few user commands.
*************** list if you edit the input text in the b
*** 789,793 ****
  
    Various shells including csh and bash support @dfn{history references}
! that begin with @samp{!} and @samp{^}.  Shell mode can understands these
  constructs and perform the history substitution for you.  If you insert
  a history reference and type @key{TAB}, this searches the input history
--- 789,793 ----
  
    Various shells including csh and bash support @dfn{history references}
! that begin with @samp{!} and @samp{^}.  Shell mode can understand these
  constructs and perform the history substitution for you.  If you insert
  a history reference and type @key{TAB}, this searches the input history
*************** tracks the shell commands that change th
*** 926,929 ****
--- 926,939 ----
  Shell mode.
  
+ @findex rlogin-directory-tracking-mode
+   There are two ways of doing directory tracking in an Rlogin
+ buffer---either with remote directory names
+ @file{/@var{host}:@var{dir}/} or with local names (that works if the
+ ``remote'' machine shares file systems with your machine of origin).
+ You can use the command @code{rlogin-directory-tracking-mode} to switch
+ modes.  No argument means use remote directory names, a positive
+ argument means use local names, and a negative argument means turn
+ off directory tracking.
+ 
  @node Emacs Server, Hardcopy, Shell, Top
  @section Using Emacs as a Server
*************** an option starting with @samp{-}.  For e
*** 1046,1058 ****
  @end example
  
! @vindex lpr-header-switches
  @vindex lpr-commands
  @vindex lpr-add-switches
!   The variable @code{lpr-header-switches} similarly specifies the extra
! switches to use to make page headers.  The variable
! @code{lpr-add-switches} controls whether to supply @samp{-T} and
! @samp{-J} options for the printer program: @code{nil} means don't do so.
! The variable @code{lpr-command} specifies the name of the printer
  program to run; the default value depends on your operating system type.
  
  @node Postscript, Sorting, Hardcopy, Top
--- 1056,1071 ----
  @end example
  
! @vindex lpr-headers-switches
  @vindex lpr-commands
  @vindex lpr-add-switches
!   The variable @code{lpr-command} specifies the name of the printer
  program to run; the default value depends on your operating system type.
+ On most systems, the default is @code{"lpr"}.  The variable
+ @code{lpr-headers-switches} similarly specifies the extra switches to use
+ to make page headers.  The variable @code{lpr-add-switches} controls
+ whether to supply @samp{-T} and @samp{-J} options (suitable for
+ @code{lpr}) to the printer program: @code{nil} means don't do
+ so.@code{lpr-add-switches} should be @code{nil} if your printer program
+ is not like @code{lpr}.
  
  @node Postscript, Sorting, Hardcopy, Top
*************** and using buffer @var{buffer} as the rig
*** 1370,1386 ****
  @end table
  
!   @kbd{f2 s} or @kbd{C-x 6 s} looks for a column separator which is a string
! that appears on each line between the two columns.  You can specify the width
! of the separator with a numeric argument to @kbd{f2 s}; that many characters,
! before point, constitute the separator string.  By default, the width is 1, so
! the column separator is the character before point.
! 
!   When a line has the separator at the proper place, @kbd{f2 s} puts the text
! after the separator into the right-hand buffer, and deletes the separator.
! Lines that don't have the column separator at the proper place remain unsplit;
! they stay in the left-hand buffer, and the right-hand buffer gets an empty
! line to correspond.  (This is the way to write a line which ``spans both
! columns while in two-column mode'': write it in the left-hand buffer, and put
! an empty line in the right-hand buffer.)
  
  @kindex f2 @key{RET}
--- 1383,1401 ----
  @end table
  
!   @kbd{f2 s} or @kbd{C-x 6 s} looks for a column separator which is a
! string that appears on each line between the two columns.  You can
! specify the width of the separator with a numeric argument to @kbd{f2
! s}; that many characters, before point, constitute the separator string.
! By default, the width is 1, so the column separator is the character
! before point.
! 
!   When a line has the separator at the proper place, @kbd{f2 s} puts the
! text after the separator into the right-hand buffer, and deletes the
! separator.  Lines that don't have the column separator at the proper
! place remain unsplit; they stay in the left-hand buffer, and the
! right-hand buffer gets an empty line to correspond.  (This is the way to
! write a line which ``spans both columns while in two-column mode'':
! write it in the left-hand buffer, and put an empty line in the
! right-hand buffer.)
  
  @kindex f2 @key{RET}
*************** the two-column text while editing it in 
*** 1395,1409 ****
  @kindex C-x 6 1
  @findex 2C-merge
!   When you have edited both buffers as you wish, merge them with @kbd{f2 1} or
! @kbd{C-x 6 1} (@code{2C-merge}).  This copies the text from the right-hand
! buffer as a second column in the other buffer.  To go back to two-column
! editing, use @kbd{f2 s}.
  
  @kindex f2 d
  @kindex C-x 6 d
  @findex 2C-dissociate
!   Use @kbd{f2 d} or @kbd{C-x 6 d} to disassociate the two buffers, leaving
! each as it stands (@code{2C-dissociate}).  If the other buffer, the one not
! current when you type @kbd{f2 d}, is empty, @kbd{f2 d} kills it.
  
  @node Editing Binary Files, Saving Emacs Sessions, Two-Column, Top
--- 1410,1425 ----
  @kindex C-x 6 1
  @findex 2C-merge
!   When you have edited both buffers as you wish, merge them with @kbd{f2
! 1} or @kbd{C-x 6 1} (@code{2C-merge}).  This copies the text from the
! right-hand buffer as a second column in the other buffer.  To go back to
! two-column editing, use @kbd{f2 s}.
  
  @kindex f2 d
  @kindex C-x 6 d
  @findex 2C-dissociate
!   Use @kbd{f2 d} or @kbd{C-x 6 d} to disassociate the two buffers,
! leaving each as it stands (@code{2C-dissociate}).  If the other buffer,
! the one not current when you type @kbd{f2 d}, is empty, @kbd{f2 d} kills
! it.
  
  @node Editing Binary Files, Saving Emacs Sessions, Two-Column, Top
*************** the same set of buffers, major modes, bu
*** 1465,1470 ****
  the previous Emacs session had.
  
!   To use Desktop, you should first add these lines to your @file{.emacs}
! file, preferably at or near the end:
  
  @example
--- 1481,1486 ----
  the previous Emacs session had.
  
!   To use Desktop, you should first add these lines at the end of your
! @file{.emacs} file:
  
  @example
diff -2rcpP --exclude=*.elc emacs-19.30/man/msdog.texi emacs-19.31/man/msdog.texi
*** emacs-19.30/man/msdog.texi	Thu Jun  1 21:15:50 1995
--- emacs-19.31/man/msdog.texi	Sun May 19 18:49:30 1996
***************
*** 1,35 ****
  @c This is part of the Emacs manual.
! @c Copyright (C) 1985, 1986, 1987, 1993, 1994, 1995 Free Software Foundation, Inc.
  @c See file emacs.texi for copying conditions.
  @node MS-DOS, Manifesto, Antinews, Top
  @appendix MS-DOS Issues
  @cindex MS-DOG
! @cindex MS-DOS
  
    This section briefly describes the peculiarities of using Emacs under
! the MS-DOS ``operating system'' (also known as ``MS-DOG'').
  
    MS-DOS normally uses a backslash, @samp{\}, to separate name units
! within a file name, instead of the slash used on other systems.
! Emacs on MS-DOS permits use of either slash or backslash.
  
    On MS-DOS, file names are case-insensitive and limited to eight
  characters, plus optionally a period and three more characters.  Emacs
! does not know about this limitation; it is up to you to specify valid
! file names.  Excess characters before or after the period are generally
! ignored.
! 
!   Display on MS-DOS does not support menus or multiple fonts.  Support
! for multiple faces that specify different colors may be added later.
! 
!   Emacs on MS-DOS does support a mouse (on the default terminal only).
! The mouse commands work as documented, aside from those that try to use
! menus.  @xref{Mouse Commands}.
! 
!   Because MS-DOS is a single-process ``operating system'', asynchronous
! subprocesses are not available.  In particular, Shell mode and its
! derivatives do not work.  Compilation under Emacs with @kbd{M-x compile}
! does work, but the compiler runs synchronously; you cannot do any more
! editing until the compilation finishes.
  
    When you run a subprocess synchronously on MS-DOS, make sure the
--- 1,344 ----
  @c This is part of the Emacs manual.
! @c Copyright (C) 1985, 86, 87, 93, 94, 95, 1996 Free Software Foundation, Inc.
  @c See file emacs.texi for copying conditions.
  @node MS-DOS, Manifesto, Antinews, Top
  @appendix MS-DOS Issues
  @cindex MS-DOG
! @cindex MS-DOS peculiarities
  
    This section briefly describes the peculiarities of using Emacs under
! the MS-DOS ``operating system'' (also known as ``MS-DOG'').  If you
! build Emacs for MS-DOS, the binary will also run on Windows 3, Windows
! NT, Windows 95, or OS-2 as a DOS application; the information in this
! chapter applies for all of those systems, if you use an Emacs that was
! built for MS-DOS.
! 
!   Note that it is possible to build Emacs specifically for Windows NT or
! Windows 95.  If you do that, most of this chapter does not apply;
! instead, you get behavior much closer to what is documented in the rest
! of the manual, including support for long file names, multiple frames,
! scroll bars, mouse menus, and subprocesses.  However, the section on
! text files and binary files does still apply.
! 
! @menu
! * Keyboard and Mouse on MS-DOS::
! * Display on MS-DOS::
! * File Names on MS-DOS::
! * Text and Binary::
! * Printing and MS-DOS::
! * Subprocesses on MS-DOS::
! * Windows 95 Subprocesses::
! @end menu
! 
! @node Keyboard and Mouse on MS-DOS
! @section Keyboard and Mouse on MS-DOS
! 
! @cindex Meta (under MS-DOS)
! @cindex Hyper (under MS-DOS)
! @cindex Super (under MS-DOS)
! @vindex dos-super-key
! @vindex dos-hyper-key
!   The PC keyboard maps use the left @key{Alt} key as the @key{META}
! key.  You have two choices for emulating the @key{SUPER} and
! @key{HYPER} keys: either the right @key{CONTROL} key or the right
! @key{ALT} key by setting the variables @code{dos-hyper-key} and
! @code{dos-super-key} to 1 or 2 respectively.
! 
! @kindex LFD (MS-DOS)
! @vindex dos-keypad-mode
!   The variable @code{dos-keypad-mode} is a flag variable which controls
! what key codes are returned by keys in the numeric keypad.  There is
! no dedicated @key{LFD} key; use @kbd{C-j} instead.  You can also
! define the @key{kp-enter} key to act as @key{LFD}, by putting the
! following line into your @file{_emacs} file:
! 
! @smallexample
! ;; Make the Enter key from the Numeric keypad act as LFD.
! (define-key function-key-map [kp-enter] [?\C-j])
! @end smallexample
! 
! @kindex DEL (MS-DOS)
! @kindex BS (MS-DOS)
!   The key which is called @key{DEL} in Emacs (because that's how it is
! designated on most workstations) is known as @key{BS} (backspace) on a
! PC.  That is why the PC-specific terminal initialization remaps the
! @key{BS} key to act as @key{DEL}; the @key{DEL} key is remapped to act
! as @kbd{C-d} for the same reasons.
! 
! @cindex mouse support under MS-DOS
!   Emacs on MS-DOS supports a mouse (on the default terminal only).
! The mouse commands work as documented, including those that use menus
! and the menu bar (@pxref{Menu Bars}).  Scroll bars don't work in
! MS-DOS Emacs.  PC mice usually have only two buttons; these act as
! @kbd{Mouse-1} and @kbd{Mouse-2}, but if you press both of them
! together, that has the effect of @kbd{Mouse-3}.
! 
! @vindex dos-display-scancodes
!   The variable @code{dos-display-scancodes}, when non-@code{nil},
! directs Emacs to display the ASCII value and the keyboard scan code of
! each keystroke; this feature serves as a complement to the
! @code{view-lossage} command, for debugging.
! 
! @node Display on MS-DOS
! @section Display on MS-DOS
! @cindex faces under MS-DOS
! @cindex fonts, emulating under MS-DOS
! 
!   Display on MS-DOS cannot use multiple fonts, but it does support
! multiple faces, each of which can specify a foreground and a background
! color.  Therefore, you can get the full functionality of Emacs
! packages which use fonts (such as @code{font-lock}, Enriched Text
! mode, and others) by defining the relevant faces to use different
! colors.  Use the @code{list-colors-display} and
! @code{list-faces-display} commands (@pxref{Modifying Faces}) to see
! what colors and faces are available and what they look like.
! 
!   Multiple frames (@pxref{Frames}) are not supported on MS-DOS.  You
! have only a single frame which occupies the entire screen.  When you run
! Emacs under MS-Windows 3.x, the single frame can take less than the full
! screen, but you still cannot have more than a single frame.
! 
! @cindex frame size under MS-DOS
! @findex mode4350
! @findex mode25
!   The @code{mode4350} command switches the display to 43 or 50
! lines, depending on your hardware; the @code{mode25} command switches
! to the default 80x25 screen size.
! 
!   By default, Emacs only knows how to set screen sizes of 80 columns
! by 25 or 43/50 rows.  However, if your video adapter has special video
! modes that will switch the display to other sizes, you can have Emacs
! support those too.  When you ask Emacs to switch the (single) frame to
! @var{n} rows by @var{m} cols dimensions, it checks if there is a
! variable called @code{screen-dimensions-@var{n}x@var{m}}, and if so,
! uses its value (which must be an integer) as the video mode to switch
! to.  (Emacs switches to that video mode by calling the BIOS @code{Set
! Video Mode} function with the value of
! @code{screen-dimensions-@var{n}x@var{m}} in the @code{AL} register.)
! For example, suppose your adapter will switch to 66x80 dimensions when
! put into video mode 85.  Then you can make Emacs support this screen
! size by putting the following into your @file{_emacs} file:
! 
! @example
! (setq screen-dimensions-66x80 85)
! @end example
! 
!   Since Emacs on MS-DOS can only set the frame size to specific
! supported dimensions, it cannot honor every possible frame resizing
! request.  When an unsupported size is requested, Emacs chooses the next
! larger supported size beyond the specified size.  For example, if you
! ask for 36x80 frame, you will get 50x80 instead.
! 
!   The variables @code{screen-dimensions-@var{n}x@var{m}} are used only
! when they exactly match the specified size; the search for the next
! larger supported size ignores them.  In the above example, even if your
! VGA supports 44x80 dimensions and you define a variable
! @code{screen-dimensions-44x80} with a suitable value, you will still get
! 50x80 screen when you ask for a 36x80 frame.  If you want to get the
! 44x80 size in this case, you can do it by setting the variable named
! @code{screen-dimensions-36x80} with the same video mode value as
! @code{screen-dimensions-44x80}.
! 
! @node File Names on MS-DOS
! @section File Names on MS-DOS
! @cindex file names under MS-DOS
! @cindex init file, default name under MS-DOS
  
    MS-DOS normally uses a backslash, @samp{\}, to separate name units
! within a file name, instead of the slash used on other systems.  Emacs
! on MS-DOS permits use of either slash or backslash, and also knows
! about drive letters in file names.
  
    On MS-DOS, file names are case-insensitive and limited to eight
  characters, plus optionally a period and three more characters.  Emacs
! knows enough about these limitations to handle file names that were
! meant for other operating systems.  For instance, leading dots
! @samp{.} in file names are invalid in MS-DOS, so Emacs transparently
! converts them to underscores @samp{_}; thus your default init file
! (@pxref{Init File}) is called @file{_emacs} on MS-DOS.  Excess
! characters before or after the period are generally ignored by MS-DOS
! itself, so if you, e.g., visit a file
! @file{LongFileName.EvenLongerExtension}, you will silently get
! @file{longfile.eve}; but Emacs will still display the long file name
! on the mode line.  Other than that, it's up to you to specify file
! names which are valid under MS-DOS; the transparent conversion as
! described above only works on file names built into Emacs.
! 
! @cindex backup file names on MS-DOS
!   The above restrictions on the file names on MS-DOS make it almost
! impossible to construct the name of a backup file (@pxref{Backup
! Names}) without losing some of the original file name characters.  For
! example, the name of a backup file for @file{docs.txt} is
! @file{docs.tx~} even if single backup is used.
! 
! @cindex file names under Win95 DOS box
! @cindex long filenames on MS-DOS under Win95
!   When Emacs runs as DOS application under Win95, it can support long
! filenames like other Win95 programs.  If long filenames are supported,
! Emacs doesn't truncate and doesn't change filenames you type, but uses
! them verbatim.  It also doesn't convert filenames to lower case.  To get
! long filename support, you should set @code{LFN} to @code{y} in the
! environment before starting Emacs.
! 
! @cindex @code{HOME} directory under MS-DOS
!   MS-DOS has no notion of home directory, so Emacs on MS-DOS pretends
! that the directory where it is installed is the value of @code{HOME}
! environment variable.  That is, if your Emacs binary,
! @file{emacs.exe}, is in the directory @file{c:/utils/emacs/bin}, then
! Emacs acts as if @code{HOME} were set to @samp{c:/utils/emacs}.  In
! particular, that is where Emacs looks for the init file @file{_emacs}.
! With this in mind, you can use @samp{~} in file names as an alias for
! the home directory, as you would in Unix.  You can also set @code{HOME}
! variable in the environment before starting Emacs; its value will then
! override the above default behavior.
! 
! @node Text and Binary
! @section Text Files and Binary Files
! @cindex text and binary files on MS-DOS
! 
! @vindex file-name-buffer-file-type-alist
!   Emacs on MS-DOS distinguishes between text and binary files.  This
! distinction is not part of MS-DOS; it is made by Emacs only.  Emacs
! treats files of human-readable text (including program source code) as
! text files, and treats executable programs, compressed archives, etc.,
! as binary files.  Emacs uses the file name to decide whether to treat
! a file as text or binary: the variable
! @code{file-name-buffer-file-type-alist} defines the file name patterns
! which denote binary files.
! 
!   Emacs reads and writes binary files verbatim.  Text files use a two
! character sequence to end a line: carriage-return (control-m) followed
! by newline (control-j).  When you visit a text file, Emacs strips off
! these control-m characters; when you write a text file to disk, Emacs
! puts them back in.  Thus, the text appears within Emacs with just a
! newline character at the end of each line.
! 
!   You can tell whether Emacs considers the visited file as text or
! binary based on the mode line (@pxref{Mode Line}).  Text files have a
! @samp{T:} marker prefixed to the major mode name; binary files have a
! @samp{B:} prefix.
! 
! @cindex cursor location, under MS-DOS
! @cindex point location, under MS-DOS
! @findex what-cursor-position (@r{MS-DOS})
!   One consequence of this special format-conversion of text files is
! that character positions as reported by Emacs (@pxref{Position Info})
! do not agree with the file size information known to the operating
! system.
! 
! @node Printing and MS-DOS
! @section Printing and MS-DOS
! 
! @vindex dos-printer
!   Printing commands, such as @code{lpr-buffer} (@pxref{Hardcopy}) and
! @code{ps-print-buffer} (@pxref{Postscript}) can work in MS-DOS by
! sending the output to one of the printer ports, if Unix-style @code{lpr}
! program is is unavailable.  A few DOS-specific variables determine how
! this works.  If you want to use your local printer in the usual
! DOS-style printing, set the @code{dos-printer} variable to the name of
! the port to which your printer is connected, like @code{"LPT2"} or
! @code{"COM1"} (for serial printers); the default is @code{"PRN"}, the
! default local printer port.  You can set @code{dos-printer} to a name of
! the file, in which case the output will be appended to that file; or you
! can set it to @code{"NUL"} to make the printed output silently disappear
! into the great void.  If you set @code{dos-printer} to a name of a file,
! it's best to make its pathname absolute or relative to the Emacs home
! directory (like @file{"~/printed.dat"}).  That is because Emacs actually
! changes the working directory to the directory of the file you are
! editing, so if the name of the file in @code{dos-printer} is relative,
! you will end up with several such files, each one in the directory of
! the buffer from which the printing was done, which is probably not what
! you wanted.
! 
! @findex print-buffer, under MS-DOS
! @findex print-region, under MS-DOS
! @vindex lpr-headers-switches, under MS-DOS
!   The commands @code{print-buffer} and @code{print-region} call the
! @code{pr} program, or use special switches to the @code{lpr} program, to
! produce headers on each printed page.  MS-DOS doesn't have these programs
! usually, so by default, the variable @code{lpr-headers-switches} is set
! so that the requests to print page headers are silently ignored, and
! @code{print-buffer} and @code{print-region} produce the same output as
! @code{lpr-buffer} and @code{lpr-region}, respectively.  If you have a
! port of @code{pr} program (e.g., from GNU Textutils), set
! @code{lpr-headers-switches} to nil; Emacs will then call @code{pr} to
! produce the page headers, and will then write the output to the printer
! port named by @code{dos-printer}.
! 
! @vindex print-region-function under MS-DOS
! @cindex lpr usage under MS-DOS
! @vindex lpr-command, under MS-DOS
! @vindex lpr-switches, under MS-DOS
!   Finally, if you do have an @code{lpr} work-alike, you can set
! @code{print-region-function} to nil.  This will cause Emacs to use
! @code{lpr} for printing, as it does under Unix.  (If the name of the
! program isn't @code{lpr}, you can set @code{lpr-command} variable and
! @code{lpr-switches} as appropriate.)
! 
! @findex ps-print-buffer, under MS-DOS
! @findex ps-print-buffer-with-faces, under MS-DOS
! @findex ps-print-region, under MS-DOS
! @findex ps-print-region-with-faces, under MS-DOS
! @findex ps-spool-buffer, under MS-DOS
! @findex ps-spool-buffer-with-faces, under MS-DOS
! @findex ps-spool-region, under MS-DOS
! @findex ps-spool-region-with-faces, under MS-DOS
! @vindex dos-ps-printer
! @vindex ps-lpr-command, under MS-DOS
! @vindex ps-lpr-switches, under MS-DOS
!   A separate variable, @code{dos-ps-printer}, defines how PostScript
! files should be printed.  If its value is a string, it is used as the
! name of the device (or a file) to which PostScript output is sent, like
! @code{dos-printer} is used for non-PostScript printing.  (These are two
! distinct variables because on MS-DOS, you might have two different
! printers attached to two different ports, only one of which is a
! PostScript printer.)  If @code{dos-ps-printer} is anything else but a
! string, Emacs will use the variables @code{ps-lpr-command} and
! @code{ps-lpr-switches} (@pxref{Postscript}) to print PostScript files.
! Thus, if you have a non-PostScript printer, you can set these variables
! to the name and the switches appropriate for a PostScript interpreter
! program (e.g., Ghostscript).  For example, to use Ghostscript for
! printing on an Epson printer connected to @code{"LPT2"} port, put this
! on your @file{.emacs} file:
! 
! @example
! (setq dos-ps-printer t)  ; anything but a string
! (setq ps-lpr-command "c:/gs/gs386")
! (setq ps-lpr-switches '("-q" "-dNOPAUSE"
! 			"-sDEVICE=epson"
! 			"-r240x72"
! 			"-sOutputFile=LPT2"
! 			"-Ic:/gs"
! 			"-"))
! @end example
! 
! @noindent
! (This assumes that Ghostscript is installed in the @file{"c:/gs"}
! directory.)
! 
! @node Subprocesses on MS-DOS
! @section Subprocesses on MS-DOS
! 
! @cindex compilation under MS-DOS
! @cindex inferior processes under MS-DOS
! @findex compile (@r{MS-DOS})
! @findex grep (@r{MS-DOS})
!   Because MS-DOS is a single-process ``operating system'',
! asynchronous subprocesses are not available.  In particular, Shell
! mode and its variants do not work.  Most Emacs features that use
! asynchronous subprocesses also don't work on MS-DOS, including
! spelling correction and GUD.  When in doubt, try and see; commands that
! don't work print an error message saying that asynchronous processes
! aren't supported.
! 
!   Compilation under Emacs with @kbd{M-x compile} and grep with
! @kbd{M-x grep} do work, by running the inferior processes synchronously.
! This means you cannot do any more editing until the compilation or the
! grep process finishes.
! 
! @cindex printing under MS-DOS
!   Printing commands, such as @code{lpr-buffer} (@pxref{Hardcopy}) and
! @code{ps-print-buffer} (@pxref{Postscript}), work in MS-DOS by sending
! the output to one of the printer ports.  @xref{Printing and MS-DOS}.
  
    When you run a subprocess synchronously on MS-DOS, make sure the
*************** program does not terminate on its own, y
*** 38,39 ****
--- 347,400 ----
  it, because MS-DOS provides no general way to terminate a process.
  
+   Accessing files on other machines is not supported on MS-DOS.  Other
+ network-oriented commands such as sending mail, Web browsing, remote
+ login, etc., don't work either, unless network access is built into
+ MS-DOS with some network redirector.
+ 
+ @cindex directory listing on MS-DOS
+ @vindex dired-listing-switches (@r{MS-DOS})
+   Dired on MS-DOS uses the @code{ls-lisp} package where other
+ platforms use the system @code{ls} command.  Therefore, Dired on
+ MS-DOS supports only some of the possible options you can mention in
+ the @code{dired-listing-switches} variable.  The options that work are
+ @samp{-A}, @samp{-a}, @samp{-c}, @samp{-i}, @samp{-r}, @samp{-S},
+ @samp{-s}, @samp{-t}, and @samp{-u}.
+ 
+ @node Windows 95 Subprocesses
+ @section Windows 95 Subprocesses
+ 
+ Subprocesses, both synchronous and asynchronous, work fine on Windows 95
+ as long as you run only 32-bit Windows applications in them.  However,
+ when you run a DOS application in a subprocess, it doesn't completely
+ work; and if you run two DOS applications at the same time in two
+ subprocesses, the operating system can get badly confused.
+ 
+ Since the command interpreter shells run as DOS applications, these
+ problems are significant.  But there's nothing we can do about them;
+ only Microsoft can fix them.  Windows 95 simply cannot cope when one
+ Windows process tries to run two separate DOS subprocesses.
+ 
+ If you run just one DOS application subprocess, then the application is
+ likely to busy-wait when idle, which means that your machine will be
+ 100% busy as long as the application is running.  However, aside from
+ the heavy load, the subprocess will work as expected---provided you
+ terminate it before you start any other DOS application as a subprocess.
+ 
+ Emacs is unable to terminate or interrupt a DOS subprocess.  The only
+ way you can terminate such a subprocess is by giving it a command that
+ tells its program to exit.
+ 
+ If you run two DOS applications at the same time in two separate
+ subprocesses, even if one of them is asynchronous, you will probably
+ find that one of the subprocesses is hung.  If the second subprocess is
+ asynchronous, then Emacs itself will be hung.  Meanwhile, your machine
+ will be 100% busy.
+ 
+ If you can go to the first subprocess (possible if Emacs is not hung),
+ and tell it to exit, that should clear up the problem.  Otherwise you
+ will have to reboot.
+ 
+ If you have to reboot in this situation, do not use the @code{Shutdown}
+ command on the @code{Start} menu; that usually hangs the system.
+ Instead, type @kbd{CTL-ALT-@key{DEL}} and then choose @code{Shutdown}.
+ That usually works, although it may take a few minutes to do its job.
diff -2rcpP --exclude=*.elc emacs-19.30/man/picture.texi emacs-19.31/man/picture.texi
*** emacs-19.30/man/picture.texi	Thu Jun  1 21:14:53 1995
--- emacs-19.31/man/picture.texi	Thu May  9 22:14:38 1996
*************** together with @key{TAB}, can get the eff
*** 205,208 ****
--- 205,213 ----
  @kbd{M-@key{TAB}} is more convenient in the cases where it is sufficient.
  
+   It may be convenient to prevent use of actual tab characters in
+ pictures.  For example, this prevents @kbd{C-x @key{TAB}} from messing
+ up the picture.  You can do this by setting the variable
+ @code{indent-tabs-mode} to @code{nil}.  @xref{Just Spaces}.
+ 
  @node Rectangles in Picture,, Tabs in Picture, Picture
  @section Picture Mode Rectangle Commands
diff -2rcpP --exclude=*.elc emacs-19.30/man/programs.texi emacs-19.31/man/programs.texi
*** emacs-19.30/man/programs.texi	Thu Nov 16 03:22:50 1995
--- emacs-19.31/man/programs.texi	Fri May 17 17:19:59 1996
*************** indentation offset which you can customi
*** 580,587 ****
  * Syntactic Symbols::
  * Variables for C Indent::
  @end menu
  
  @node Syntactic Analysis
! @subsubsection Step 1 -- Syntactic Analysis
  @cindex Syntactic Analysis
  
--- 580,588 ----
  * Syntactic Symbols::
  * Variables for C Indent::
+ * C Indent Styles::
  @end menu
  
  @node Syntactic Analysis
! @subsubsection Step 1---Syntactic Analysis
  @cindex Syntactic Analysis
  
*************** where each component on the list contain
*** 592,596 ****
  relative buffer position.  Syntactic symbols describe grammatical
  elements such as @var{statement}, @var{substatement}, @var{class-open},
! @var{class-close}, @var{k&r-argdecl}, etc.
  
    Conceptually, a line of C code is always indented relative to the
--- 593,597 ----
  relative buffer position.  Syntactic symbols describe grammatical
  elements such as @var{statement}, @var{substatement}, @var{class-open},
! @var{class-close}, @var{knr-argdecl}, etc.
  
    Conceptually, a line of C code is always indented relative to the
*************** you can customize the handling of indivi
*** 758,762 ****
  @table @kbd
  @item M-x c-set-style @key{RET} @var{style} @key{RET}
! Select predefined indentation style @var{style}.
  
  @item C-c C-o @var{symbol} @key{RET} @var{offset} @key{RET}
--- 759,765 ----
  @table @kbd
  @item M-x c-set-style @key{RET} @var{style} @key{RET}
! Select predefined indentation style @var{style}.  Type @kbd{?} when
! entering @var{style} to see a list of supported styles; to find out what
! a style looks like, select it and reindent some C code.
  
  @item C-c C-o @var{symbol} @key{RET} @var{offset} @key{RET}
*************** In the nether region between an ANSI fun
*** 834,841 ****
  and the defun opening brace.
  
! @item k&r-argdecl-intro
  On the first line of a K&R C argument declaration.
  
! @item k&r-argdecl
  In one of the subsequent lines in a K&R C argument declaration.
  
--- 837,844 ----
  and the defun opening brace.
  
! @item knr-argdecl-intro
  On the first line of a K&R C argument declaration.
  
! @item knr-argdecl
  In one of the subsequent lines in a K&R C argument declaration.
  
*************** Indent Style}.
*** 974,981 ****
  Variable for specifying styles of indentation; see below.
  
- @item c-argdecl-indent
- @vindex c-argdecl-indent
- Indentation level of declarations of C function arguments.
- 
  @item c-basic-offset
  @vindex c-basic-offset
--- 977,980 ----
*************** Amount of basic offset used by @code{+} 
*** 983,1009 ****
  @code{c-offsets-alist}.@refill 
  
! @item c-brace-imaginary-offset
! @vindex c-brace-imaginary-offset
! Imagined indentation of a C open brace that actually follows a statement.
! 
! @item c-brace-offset
! @vindex c-brace-offset
! Extra indentation for braces, compared with other text in same context.
! 
! @item c-continued-statement-offset
! @vindex c-continued-statement-offset
! Extra indentation for lines not starting new statements.
! 
! @item c-continued-brace-offset
! @vindex c-continued-brace-offset
! Extra indentation for substatements that start with open-braces.  This
! is in addition to @code{c-continued-statement-offset}.@refill
! 
! @item c-label-offset
! @vindex c-label-offset
! Offset of C label lines and case statements relative to usual indentation.
! 
! @item c-recognize-k&r-p
! @vindex c-recognize-k&r-p
  If this variable is non-@code{nil}, C mode and Objective C mode
  recognize K&R constructs.  This variable is needed because of
--- 982,987 ----
  @code{c-offsets-alist}.@refill 
  
! @item c-recognize-knr-p
! @vindex c-recognize-knr-p
  If this variable is non-@code{nil}, C mode and Objective C mode
  recognize K&R constructs.  This variable is needed because of
*************** This variable is @code{nil} by default i
*** 1015,1022 ****
  default in C mode and Objective C mode.
  
- @item c-indent-level
- @vindex c-indent-level
- Level of indentation of C statements with respect to containing block.
- 
  @item c-special-indent-hook
  @vindex c-special-indent-hook
--- 993,996 ----
*************** for which the style differs from the def
*** 1042,1045 ****
--- 1016,1052 ----
  the variable @code{c-comment-only-line-offset} (@pxref{Comments in C}).
  
+ @node C Indent Styles
+ @subsubsection C Indentation Styles
+ @cindex c indentation styles
+ 
+   A @dfn{C style} is a collection of indentation style customizations.
+ Emacs comes with several predefined indentation styles for C code
+ including @code{gnu}, @code{k&r}, @code{bsd}, @code{stroustrup}
+ @code{whitesmith}, @code{ellemtel}, and @code{cc-mode}.  The default
+ style is @code{gnu}.
+ 
+ @findex c-set-style
+   To choose the style you want, use the command @kbd{M-x c-set-style}.
+ Specify a style name as an argument (case is not significant in C style
+ names).  The chosen style affects all buffers including those you will
+ create later.
+ 
+ @findex c-add-style
+   To define a new C indentation style, call the function
+ @code{c-add-style}:
+ 
+ @example
+ (c-add-style @var{name} @var{values} @var{use-now})
+ @end example
+ 
+ @noindent
+ Here @var{name} is the name of the new style (a string), and
+ @var{values} is an alist whose elements have the form
+ @code{(@var{variable} . @var{value})}.  The variables you specify should
+ be among those documented in @ref{Variables for C Indent}.
+ 
+ If @var{use-now} is non-@code{nil}, @code{c-add-style} switches to the
+ new style after defining it.
+ 
  @node Matching
  @section Automatic Display Of Matching Parentheses
*************** entry is considered a page.  This facili
*** 1447,1451 ****
  this is convenient for entering the contents of an entry.
  
!   Version control systems are another way keep track of changes in your
  program and keep a change log.  @xref{Log Entries}.
  
--- 1454,1458 ----
  this is convenient for entering the contents of an entry.
  
!   Version control systems are another way to keep track of changes in your
  program and keep a change log.  @xref{Log Entries}.
  
*************** In Prolog code, a tag name appears at th
*** 1527,1530 ****
--- 1534,1541 ----
  
  @item
+ In Erlang code, the tags are the functions, records, and macros defined
+ in the file.
+ 
+ @item
  In assembler code, labels appearing at the beginning of a line,
  followed by a colon, are tags.
*************** contained all the files specified in the
*** 1604,1607 ****
--- 1615,1631 ----
  files it directly contains.
  
+   If you specify the source files with relative file names when you run
+ @code{etags}, the tags file will contain file names relative to the
+ directory where the tags file was initially written.  This way, you can
+ move an entire directory tree containing both the tags file and the
+ source files, and the tags file will still refer correctly to the source
+ files.
+ 
+   If you specify absolute file names as arguments to @code{etags}, then
+ the tags file will contain absolute file names.  This way, the tags file
+ will still refer to the same files even if you move it, as long as the
+ source files remain in the same place.  Absolute file names start with
+ @samp{/}, or with @samp{@var{device}:/} on MS-DOS and Windows.
+ 
    When you want to make a tags table from a great number of files, you
  may have problems listing them on the command line, because some systems
*************** With prefix argument @var{n}, move @var{
*** 2421,2425 ****
  
    In C mode and related modes, certain printing characters are
! ``electric''--in addition to inserting themselves, they also reindent
  the current line and may insert newlines.  This feature is controlled by
  the variable @code{c-auto-newline}.  The ``electric'' characters are
--- 2445,2449 ----
  
    In C mode and related modes, certain printing characters are
! ``electric''---in addition to inserting themselves, they also reindent
  the current line and may insert newlines.  This feature is controlled by
  the variable @code{c-auto-newline}.  The ``electric'' characters are
*************** To turn this feature on or off, use @kbd
*** 2535,2539 ****
  @findex c-toggle-hungry-state
  Toggle the hungry-delete feature (@code{c-toggle-hungry-state}.  With a
! prefix argument, this command turns the auto-newline feature on if the
  argument is positive, and off if it is negative.
  
--- 2559,2563 ----
  @findex c-toggle-hungry-state
  Toggle the hungry-delete feature (@code{c-toggle-hungry-state}.  With a
! prefix argument, this command turns the hungry-delete feature on if the
  argument is positive, and off if it is negative.
  
*************** For the styles 1 through 4, @code{c-bloc
*** 2639,2643 ****
  
  This variable has no effect on the indentation of the comment-start
! itself or on insertion of asteristks when auto-filling C comments.
  @c ???   In any case, you still have to insert the asterisks
  @c ???   manually.
--- 2663,2667 ----
  
  This variable has no effect on the indentation of the comment-start
! itself or on insertion of asterisks when auto-filling C comments.
  @c ???   In any case, you still have to insert the asterisks
  @c ???   manually.
*************** itself or on insertion of asteristks whe
*** 2646,2650 ****
  @vindex c-comment-only-line-offset
  Extra offset for line which contains only the start of a comment.  It
! can contain be an integer or a cons cell of the form
  @code{(@var{non-anchored-offset} . @var{anchored-offset})}, where
  @var{non-anchored-offset} is the amount of offset given to
--- 2670,2674 ----
  @vindex c-comment-only-line-offset
  Extra offset for line which contains only the start of a comment.  It
! can be either an integer or a cons cell of the form
  @code{(@var{non-anchored-offset} . @var{anchored-offset})}, where
  @var{non-anchored-offset} is the amount of offset given to
diff -2rcpP --exclude=*.elc emacs-19.30/man/regs.texi emacs-19.31/man/regs.texi
*** emacs-19.30/man/regs.texi	Fri Nov 17 12:08:21 1995
--- emacs-19.31/man/regs.texi	Tue Apr 30 14:28:51 1996
*************** Save all the current bookmark values in 
*** 255,260 ****
  Delete the bookmark named @var{bookmark}.
  
! @item M-x bookmark-locate @key{RET} @var{bookmark} @key{RET}
! @findex bookmark-locale
  Insert in the buffer the name of the file that bookmark @var{bookmark}
  points to.
--- 255,260 ----
  Delete the bookmark named @var{bookmark}.
  
! @item M-x bookmark-insert-location @key{RET} @var{bookmark} @key{RET}
! @findex bookmark-insert-location
  Insert in the buffer the name of the file that bookmark @var{bookmark}
  points to.
diff -2rcpP --exclude=*.elc emacs-19.30/man/rmail.texi emacs-19.31/man/rmail.texi
*** emacs-19.30/man/rmail.texi	Wed Nov 15 23:11:53 1995
--- emacs-19.31/man/rmail.texi	Tue May 21 11:44:39 1996
*************** repeat count.
*** 562,566 ****
    The command @kbd{C-M-l @var{labels} @key{RET}}
  (@code{rmail-summary-by-labels}) displays a summary containing only the
! messages that have at least one of a specified set of messages.  The
  argument @var{labels} is one or more label names, separated by commas.
  @xref{Rmail Summary}, for information on summaries.@refill
--- 562,566 ----
    The command @kbd{C-M-l @var{labels} @key{RET}}
  (@code{rmail-summary-by-labels}) displays a summary containing only the
! messages that have at least one of a specified set of labels.  The
  argument @var{labels} is one or more label names, separated by commas.
  @xref{Rmail Summary}, for information on summaries.@refill
*************** you have to do is fill in the recipients
*** 689,692 ****
--- 689,704 ----
  message, recipients get a message which is ``from'' you, and which has
  the original message in its contents.
+ 
+ @findex unforward-rmail-message
+   Forwarding a message encloses it between two delimiter lines.  It also
+ modifies every line that starts with a dash, by inserting @w{@samp{- }}
+ at the start of the line.  When you receive a forwarded message, if it
+ contains something besides ordinary text---for example, program source
+ code---you might find it useful to undo that transformation.  You can do
+ this by selecting the forwarded message and typing @kbd{M-x
+ unforward-rmail-message}.  This command extracts the original forwarded
+ message, deleting the inserted @w{@samp{- }} strings, and inserts it
+ into the Rmail file as a separate message immediately following the
+ current one.
  
  @findex rmail-resend
diff -2rcpP --exclude=*.elc emacs-19.30/man/sc.texi emacs-19.31/man/sc.texi
*** emacs-19.30/man/sc.texi	Fri Jun  2 20:21:48 1995
--- emacs-19.31/man/sc.texi	Thu Jan  4 15:55:23 1996
*************** themselves with it.  It is important to 
*** 1739,1743 ****
  conceivable citation style that can be described by a regular expression
  can be recognized by Supercite.  This leads to some interesting
! applications.  For example, if you regularly recieve email from a
  co-worker that uses an uncommon citation style (say one that employs a
  @samp{|} or @samp{@}} character at the front of the line), it is
--- 1739,1743 ----
  conceivable citation style that can be described by a regular expression
  can be recognized by Supercite.  This leads to some interesting
! applications.  For example, if you regularly receive email from a
  co-worker that uses an uncommon citation style (say one that employs a
  @samp{|} or @samp{@}} character at the front of the line), it is
*************** been matched against the current line.
*** 1802,1806 ****
  
  Note that @var{negate-p} and @var{case-fold-search} are ignored if
! @var{pred} is one of these special symbols.  Only the first occurance of
  each symbol in a frame is used; any duplicates are ignored.  Also
  note that for performance reasons, the entries associated with these
--- 1802,1806 ----
  
  Note that @var{negate-p} and @var{case-fold-search} are ignored if
! @var{pred} is one of these special symbols.  Only the first occurrence of
  each symbol in a frame is used; any duplicates are ignored.  Also
  note that for performance reasons, the entries associated with these
*************** to this interface ``out of the box.''
*** 2350,2354 ****
  @cindex sc-unsupp.el file
  With version 3, Supercite has undergone an almost complete rewrite, and
! has hopefully benefitted in a number of ways, including vast
  improvements in the speed of performance, a big reduction in size of the
  code and in the use of Emacs resources, and a much cleaner and flexible
--- 2350,2354 ----
  @cindex sc-unsupp.el file
  With version 3, Supercite has undergone an almost complete rewrite, and
! has hopefully benefited in a number of ways, including vast
  improvements in the speed of performance, a big reduction in size of the
  code and in the use of Emacs resources, and a much cleaner and flexible
diff -2rcpP --exclude=*.elc emacs-19.30/man/screen.texi emacs-19.31/man/screen.texi
*** emacs-19.30/man/screen.texi	Wed Nov 15 01:39:26 1995
--- emacs-19.31/man/screen.texi	Thu Dec 21 01:13:15 1995
*************** buffer'', we are talking about the curre
*** 201,205 ****
    @var{line} is @samp{L} followed by the current line number of point.
  This is present when Line Number mode is enabled (which it normally is).
! @xref{Optional Mode Line}.
  
    @var{pos} tells you whether there is additional text above the top of
--- 201,207 ----
    @var{line} is @samp{L} followed by the current line number of point.
  This is present when Line Number mode is enabled (which it normally is).
! You can optionally display the current column number too, by turning on
! Column Number mode (which is not enabled by default because it is
! somewhat slower).  @xref{Optional Mode Line}.
  
    @var{pos} tells you whether there is additional text above the top of
diff -2rcpP --exclude=*.elc emacs-19.30/man/search.texi emacs-19.31/man/search.texi
*** emacs-19.30/man/search.texi	Wed Nov 15 19:40:05 1995
--- emacs-19.31/man/search.texi	Wed May 15 10:44:08 1996
*************** sense.  For example, @samp{*foo} treats 
*** 470,474 ****
  no preceding expression on which the @samp{*} can act.  It is poor practice
  to depend on this behavior; better to quote the special character anyway,
! regardless of where is appears.@refill
  
  For the most part, @samp{\} followed by any character matches only that
--- 470,474 ----
  no preceding expression on which the @samp{*} can act.  It is poor practice
  to depend on this behavior; better to quote the special character anyway,
! regardless of where it appears.@refill
  
  For the most part, @samp{\} followed by any character matches only that
diff -2rcpP --exclude=*.elc emacs-19.30/man/sending.texi emacs-19.31/man/sending.texi
*** emacs-19.30/man/sending.texi	Mon Jun  5 22:49:53 1995
--- emacs-19.31/man/sending.texi	Tue May 21 11:44:41 1996
*************** file when it is sent.
*** 156,162 ****
  @item From
  Use the @samp{From} field to say who you are, when the account you are
! using to send the mail is not your own.  The contents of the
! @samp{From} field should be a valid mailing address, since replies
! will normally go there.
  
  @item Reply-to
--- 156,163 ----
  @item From
  Use the @samp{From} field to say who you are, when the account you are
! using to send the mail is not your own.  The contents of the @samp{From}
! field should be a valid mailing address, since replies will normally go
! there.  If you don't specify the @samp{From} field yourself, Emacs uses
! the value of @code{user-mail-address} as the default.
  
  @item Reply-to
*************** afterward.  However, you can rebind @kbd
*** 312,319 ****
  expansion as well.  Here's how to do that:
  
! @example
! (define-key mail-mode-map "\C-n" 'mail-abbrev-next-line)
! (define-key mail-mode-map "\M->" 'mail-abbrev-end-of-buffer)
! @end example
  
  @node Mail Mode
--- 313,326 ----
  expansion as well.  Here's how to do that:
  
! @smallexample
! (add-hook 'mail-setup-hook
!           '(lambda ()
!              (substitute-key-definition
!                'next-line 'mail-abbrev-next-line
!                mail-mode-map global-map)
!              (substitute-key-definition
!                'end-of-buffer 'mail-abbrev-end-of-buffer
!                mail-mode-map global-map)))
! @end smallexample
  
  @node Mail Mode
*************** Send the message, and leave the mail buf
*** 331,334 ****
--- 338,343 ----
  @item C-c C-c
  Send the message, and select some other buffer (@code{mail-send-and-exit}).
+ @item M-@key{TAB}
+ Complete a mailing address (@code{mail-complete}).
  @item C-c C-f C-t
  Move to the @samp{To} header field, creating one if there is none
*************** priority for reselection by default, sin
*** 376,379 ****
--- 385,405 ----
  it.  This is the usual way to send the message.
  
+ @findex mail-complete
+ @kindex M-@key{TAB}
+ @vindex mail-directory-process
+ @vindex mail-directory-stream
+   While editing a header field that contains mailing addresses, such as
+ @samp{To:}, @samp{CC:} and @samp{BCC:}, you can complete a mailing
+ address by typing @kbd{M-@key{TAB}} (@code{mail-complete}).  For
+ completion purposes, the valid mailing addresses are taken to be the
+ local users' names plus your personal mail aliases.  Additionally, if
+ your site provides a mail directory or a specific host to use for any
+ unrecognized user name, you can arrange to query that host for
+ completion---see the variables @code{mail-directory-process} and
+ @code{mail-directory-stream} in the source code.
+ 
+   If you type @kbd{M-@key{TAB}} in the body of the message, it invokes
+ @code{ispell-complete-word}, as in Text mode.
+ 
  @kindex C-c C-f C-t @r{(Mail mode)}
  @findex mail-to
*************** mail message.  The keywords are chosen f
*** 486,492 ****
  you are discussing something subversive.
  
!   The idea behind this feature is that the suspicion that the NSA snoops
! on all electronic mail messages that contain keywords suggesting they
! might be interested.  (The NSA says they don't, but that's what they
  @emph{would} say.)  The idea is that if lots of people add suspicious
  words to their messages, the NSA will get so busy with spurious input
--- 512,518 ----
  you are discussing something subversive.
  
!   The idea behind this feature is the suspicion that the NSA snoops on
! all electronic mail messages that contain keywords suggesting they might
! find them interesting.  (The NSA says they don't, but that's what they
  @emph{would} say.)  The idea is that if lots of people add suspicious
  words to their messages, the NSA will get so busy with spurious input
diff -2rcpP --exclude=*.elc emacs-19.30/man/texinfo.tex emacs-19.31/man/texinfo.tex
*** emacs-19.30/man/texinfo.tex	Sat Nov 25 01:04:17 1995
--- emacs-19.31/man/texinfo.tex	Sat May 25 20:21:23 1996
***************
*** 1,5 ****
  %% TeX macros to handle texinfo files
  
! %   Copyright (C) 1985, 86, 88, 90, 91, 92, 93, 1994 Free Software Foundation, Inc.
  
  %This texinfo.tex file is free software; you can redistribute it and/or
--- 1,6 ----
  %% TeX macros to handle texinfo files
  
! %  Copyright (C) 1985, 86, 88, 90, 91, 92, 93,
! %                94, 95, 1996 Free Software Foundation, Inc.
  
  %This texinfo.tex file is free software; you can redistribute it and/or
***************
*** 15,20 ****
  %You should have received a copy of the GNU General Public License
  %along with this texinfo.tex file; see the file COPYING.  If not, write
! %to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139,
! %USA.
  
  
--- 16,21 ----
  %You should have received a copy of the GNU General Public License
  %along with this texinfo.tex file; see the file COPYING.  If not, write
! %to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
! %Boston, MA 02111-1307, USA.
  
  
***************
*** 35,39 ****
  % This automatically updates the version number based on RCS.
  \def\deftexinfoversion$#1: #2 ${\def\texinfoversion{#2}}
! \deftexinfoversion$Revision: 2.150 $
  \message{Loading texinfo package [Version \texinfoversion]:}
  
--- 36,40 ----
  % This automatically updates the version number based on RCS.
  \def\deftexinfoversion$#1: #2 ${\def\texinfoversion{#2}}
! \deftexinfoversion$Revision: 2.172 $
  \message{Loading texinfo package [Version \texinfoversion]:}
  
***************
*** 70,74 ****
   % if the definition is written into an index file.
   \global\let\tiepenalty = \@M
!  \gdef\tie{\lvvmode\penalty\tiepenalty\ }
  }
  \let\~ = \tie                  % And make it available as @~.
--- 71,75 ----
   % if the definition is written into an index file.
   \global\let\tiepenalty = \@M
!  \gdef\tie{\leavevmode\penalty\tiepenalty\ }
  }
  \let\~ = \tie                  % And make it available as @~.
*************** where each line of input produces a line
*** 537,551 ****
  \leftline{\hskip\leftskip{\rm#1}}}}
  
  %\hbox{{\rm#1}}\hfil\break}}
  
  % @include file    insert text of that file as input.
! 
! \def\include{\parsearg\includezzz}
! %Use \input\thisfile to avoid blank after \input, which may be an active
! %char (in which case the blank would become the \input argument).
! %The grouping keeps the value of \thisfile correct even when @include
! %is nested.
! \def\includezzz #1{\begingroup
! \def\thisfile{#1}\input\thisfile
  \endgroup}
  
--- 538,569 ----
  \leftline{\hskip\leftskip{\rm#1}}}}
  
+ % @inmargin{TEXT} puts TEXT in the margin next to the current paragraph.
+ 
+ \def\inmargin#1{%
+ \strut\vadjust{\nobreak\kern-\strutdepth
+   \vtop to \strutdepth{\baselineskip\strutdepth\vss
+   \llap{\rightskip=\inmarginspacing \vbox{\noindent #1}}\null}}}
+ \newskip\inmarginspacing \inmarginspacing=1cm
+ \def\strutdepth{\dp\strutbox}
+ 
  %\hbox{{\rm#1}}\hfil\break}}
  
  % @include file    insert text of that file as input.
! % Allow normal characters that  we make active in the argument (a file name).
! \def\include{\begingroup
!   \catcode`\\=12
!   \catcode`~=12
!   \catcode`^=12
!   \catcode`_=12
!   \catcode`|=12
!   \catcode`<=12
!   \catcode`>=12
!   \catcode`+=12
!   \parsearg\includezzz}
! % Restore active chars for included file.
! \def\includezzz#1{\endgroup\begingroup
!   % Read the included file in a group so nested @include's work.
!   \def\thisfile{#1}%
!   \input\thisfile
  \endgroup}
  
*************** where each line of input produces a line
*** 632,635 ****
--- 650,662 ----
    \let\pxref = \relax
    \let\settitle = \relax
+   \let\setchapternewpage = \relax
+   \let\setchapterstyle = \relax
+   \let\everyheading = \relax
+   \let\evenheading = \relax
+   \let\oddheading = \relax
+   \let\everyfooting = \relax
+   \let\evenfooting = \relax
+   \let\oddfooting = \relax
+   \let\headings = \relax
    \let\include = \relax
    \let\lowersections = \relax
*************** where each line of input produces a line
*** 655,658 ****
--- 682,690 ----
  \def\direntry{\doignore{direntry}}
  
+ % @dircategory CATEGORY  -- specify a category of the dir file
+ % which this file should belong to.  Ignore this in TeX.
+ 
+ \def\dircategory{\comment}
+ 
  % Ignore text until a line `@end #1'.
  %
*************** where each line of input produces a line
*** 690,694 ****
      \immediate\write16{  to use a workaround.}
      \immediate\write16{}
!     \warnedobstrue
      \fi
  }
--- 722,726 ----
      \immediate\write16{  to use a workaround.}
      \immediate\write16{}
!     \global\warnedobstrue
      \fi
  }
*************** where each line of input produces a line
*** 766,772 ****
  % empty), we can't just use \parsearg; we have to insert a space of our
  % own to delimit the rest of the line, and then take it out again if we
! % didn't need it.
  %
! \def\set{\parsearg\setxxx}
  \def\setxxx#1{\setyyy#1 \endsetyyy}
  \def\setyyy#1 #2\endsetyyy{%
--- 798,805 ----
  % empty), we can't just use \parsearg; we have to insert a space of our
  % own to delimit the rest of the line, and then take it out again if we
! % didn't need it.  Make sure the catcode of space is correct to avoid
! % losing inside @example, for instance.
  %
! \def\set{\begingroup\catcode` =10 \parsearg\setxxx}
  \def\setxxx#1{\setyyy#1 \endsetyyy}
  \def\setyyy#1 #2\endsetyyy{%
*************** where each line of input produces a line
*** 775,778 ****
--- 808,812 ----
    \else \setzzz{#1}#2\endsetzzz % Remove the trailing space \setxxx inserted.
    \fi
+   \endgroup
  }
  % Can't use \xdef to pre-expand #2 and save some time, since \temp or
*************** where each line of input produces a line
*** 911,914 ****
--- 945,963 ----
    node \samp{\ignorespaces#1{}}}
  
+ \def\macro#1{\begingroup\ignoresections\catcode`\#=6\def\macrotemp{#1}\parsearg\macroxxx}
+ \def\macroxxx#1#2 \end macro{%
+ \expandafter\gdef\macrotemp#1{#2}%
+ \endgroup}
+ 
+ %\def\linemacro#1{\begingroup\ignoresections\catcode`\#=6\def\macrotemp{#1}\parsearg\linemacroxxx}
+ %\def\linemacroxxx#1#2 \end linemacro{%
+ %\let\parsearg=\relax
+ %\edef\macrotempx{\csname M\butfirst\expandafter\string\macrotemp\endcsname}%
+ %\expandafter\xdef\macrotemp{\parsearg\macrotempx}%
+ %\expandafter\gdef\macrotempx#1{#2}%
+ %\endgroup}
+ 
+ %\def\butfirst#1{}
+ 
  \message{fonts,}
  
*************** where each line of input produces a line
*** 921,924 ****
--- 970,976 ----
  \let\li = \sf % Sometimes we call it \li, not \sf.
  
+ % We don't need math for this one.
+ \def\ttsl{\tenttsl}
+ 
  %% Try out Computer Modern fonts at \magstephalf
  \let\mainmagstep=\magstephalf
*************** where each line of input produces a line
*** 926,930 ****
  % Set the font macro #1 to the font named #2, adding on the
  % specified font prefix (normally `cm').
! \def\setfont#1#2{\font#1=\fontprefix#2}
  
  % Use cm as the default font prefix.
--- 978,983 ----
  % Set the font macro #1 to the font named #2, adding on the
  % specified font prefix (normally `cm').
! % #3 is the font's design size, #4 is a scale factor
! \def\setfont#1#2#3#4{\font#1=\fontprefix#2#3 scaled #4}
  
  % Use cm as the default font prefix.
*************** where each line of input produces a line
*** 934,960 ****
  \def\fontprefix{cm}
  \fi
  
  \ifx\bigger\relax
  \let\mainmagstep=\magstep1
! \setfont\textrm{r12}
! \setfont\texttt{tt12}
  \else
! \setfont\textrm{r10 scaled \mainmagstep}
! \setfont\texttt{tt10 scaled \mainmagstep}
  \fi
  % Instead of cmb10, you many want to use cmbx10.
  % cmbx10 is a prettier font on its own, but cmb10
  % looks better when embedded in a line with cmr10.
! \setfont\textbf{b10 scaled \mainmagstep}
! \setfont\textit{ti10 scaled \mainmagstep}
! \setfont\textsl{sl10 scaled \mainmagstep}
! \setfont\textsf{ss10 scaled \mainmagstep}
! \setfont\textsc{csc10 scaled \mainmagstep}
  \font\texti=cmmi10 scaled \mainmagstep
  \font\textsy=cmsy10 scaled \mainmagstep
  
  % A few fonts for @defun, etc.
! \setfont\defbf{bx10 scaled \magstep1} %was 1314
! \setfont\deftt{tt10 scaled \magstep1}
  \def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf}
  
--- 987,1030 ----
  \def\fontprefix{cm}
  \fi
+ % Support font families that don't use the same naming scheme as CM.
+ \def\rmshape{r}
+ \def\rmbshape{bx}		%where the normal face is bold
+ \def\bfshape{b}
+ \def\bxshape{bx}
+ \def\ttshape{tt}
+ \def\ttbshape{tt}
+ \def\ttslshape{sltt}
+ \def\itshape{ti}
+ \def\itbshape{bxti}
+ \def\slshape{sl}
+ \def\slbshape{bxsl}
+ \def\sfshape{ss}
+ \def\sfbshape{ss}
+ \def\scshape{csc}
+ \def\scbshape{csc}
  
  \ifx\bigger\relax
  \let\mainmagstep=\magstep1
! \setfont\textrm\rmshape{12}{1000}
! \setfont\texttt\ttshape{12}{1000}
  \else
! \setfont\textrm\rmshape{10}{\mainmagstep}
! \setfont\texttt\ttshape{10}{\mainmagstep}
  \fi
  % Instead of cmb10, you many want to use cmbx10.
  % cmbx10 is a prettier font on its own, but cmb10
  % looks better when embedded in a line with cmr10.
! \setfont\textbf\bfshape{10}{\mainmagstep}
! \setfont\textit\itshape{10}{\mainmagstep}
! \setfont\textsl\slshape{10}{\mainmagstep}
! \setfont\textsf\sfshape{10}{\mainmagstep}
! \setfont\textsc\scshape{10}{\mainmagstep}
! \setfont\textttsl\ttslshape{10}{\mainmagstep}
  \font\texti=cmmi10 scaled \mainmagstep
  \font\textsy=cmsy10 scaled \mainmagstep
  
  % A few fonts for @defun, etc.
! \setfont\defbf\bxshape{10}{\magstep1} %was 1314
! \setfont\deftt\ttshape{10}{\magstep1}
  \def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf}
  
*************** where each line of input produces a line
*** 964,1020 ****
  % Do not make many font distinctions in general in the index, since they
  % aren't very useful.
! \setfont\ninett{tt9}
! \setfont\indrm{r9}
! \setfont\indit{sl9}
  \let\indsl=\indit
  \let\indtt=\ninett
  \let\indsf=\indrm
  \let\indbf=\indrm
! \setfont\indsc{csc10 at 9pt}
  \font\indi=cmmi9
  \font\indsy=cmsy9
  
  % Fonts for headings
! \setfont\chaprm{bx12 scaled \magstep2}
! \setfont\chapit{ti12 scaled \magstep2}
! \setfont\chapsl{sl12 scaled \magstep2}
! \setfont\chaptt{tt12 scaled \magstep2}
! \setfont\chapsf{ss12 scaled \magstep2}
  \let\chapbf=\chaprm
! \setfont\chapsc{csc10 scaled\magstep3}
  \font\chapi=cmmi12 scaled \magstep2
  \font\chapsy=cmsy10 scaled \magstep3
  
! \setfont\secrm{bx12 scaled \magstep1}
! \setfont\secit{ti12 scaled \magstep1}
! \setfont\secsl{sl12 scaled \magstep1}
! \setfont\sectt{tt12 scaled \magstep1}
! \setfont\secsf{ss12 scaled \magstep1}
! \setfont\secbf{bx12 scaled \magstep1}
! \setfont\secsc{csc10 scaled\magstep2}
  \font\seci=cmmi12 scaled \magstep1
  \font\secsy=cmsy10 scaled \magstep2
  
! % \setfont\ssecrm{bx10 scaled \magstep1}    % This size an font looked bad.
! % \setfont\ssecit{cmti10 scaled \magstep1}    % The letters were too crowded.
! % \setfont\ssecsl{sl10 scaled \magstep1}
! % \setfont\ssectt{tt10 scaled \magstep1}
! % \setfont\ssecsf{ss10 scaled \magstep1}
! 
! %\setfont\ssecrm{b10 scaled 1315}	% Note the use of cmb rather than cmbx.
! %\setfont\ssecit{ti10 scaled 1315}	% Also, the size is a little larger than
! %\setfont\ssecsl{sl10 scaled 1315}	% being scaled magstep1.
! %\setfont\ssectt{tt10 scaled 1315}
! %\setfont\ssecsf{ss10 scaled 1315}
  
  %\let\ssecbf=\ssecrm
  
! \setfont\ssecrm{bx12 scaled \magstephalf}
! \setfont\ssecit{ti12 scaled \magstephalf}
! \setfont\ssecsl{sl12 scaled \magstephalf}
! \setfont\ssectt{tt12 scaled \magstephalf}
! \setfont\ssecsf{ss12 scaled \magstephalf}
! \setfont\ssecbf{bx12 scaled \magstephalf}
! \setfont\ssecsc{csc10 scaled \magstep1}
  \font\sseci=cmmi12 scaled \magstephalf
  \font\ssecsy=cmsy10 scaled \magstep1
--- 1034,1094 ----
  % Do not make many font distinctions in general in the index, since they
  % aren't very useful.
! \setfont\ninett\ttshape{9}{1000}
! \setfont\indrm\rmshape{9}{1000}
! \setfont\indit\slshape{9}{1000}
  \let\indsl=\indit
  \let\indtt=\ninett
+ \let\indttsl=\ninett
  \let\indsf=\indrm
  \let\indbf=\indrm
! \setfont\indsc\scshape{10}{900}
  \font\indi=cmmi9
  \font\indsy=cmsy9
  
  % Fonts for headings
! \setfont\chaprm\rmbshape{12}{\magstep2}
! \setfont\chapit\itbshape{10}{\magstep3}
! \setfont\chapsl\slbshape{10}{\magstep3}
! \setfont\chaptt\ttbshape{12}{\magstep2}
! \setfont\chapttsl\ttslshape{10}{\magstep3}
! \setfont\chapsf\sfbshape{12}{\magstep2}
  \let\chapbf=\chaprm
! \setfont\chapsc\scbshape{10}{\magstep3}
  \font\chapi=cmmi12 scaled \magstep2
  \font\chapsy=cmsy10 scaled \magstep3
  
! \setfont\secrm\rmbshape{12}{\magstep1}
! \setfont\secit\itbshape{10}{\magstep2}
! \setfont\secsl\slbshape{10}{\magstep2}
! \setfont\sectt\ttbshape{12}{\magstep1}
! \setfont\secttsl\ttslshape{10}{\magstep2}
! \setfont\secsf\sfbshape{12}{\magstep1}
! \let\secbf\secrm
! \setfont\secsc\scbshape{10}{\magstep2}
  \font\seci=cmmi12 scaled \magstep1
  \font\secsy=cmsy10 scaled \magstep2
  
! % \setfont\ssecrm\bxshape{10}{\magstep1}    % This size an font looked bad.
! % \setfont\ssecit\itshape{10}{\magstep1}    % The letters were too crowded.
! % \setfont\ssecsl\slshape{10}{\magstep1}
! % \setfont\ssectt\ttshape{10}{\magstep1}
! % \setfont\ssecsf\sfshape{10}{\magstep1}
! 
! %\setfont\ssecrm\bfshape{10}{1315}	% Note the use of cmb rather than cmbx.
! %\setfont\ssecit\itshape{10}{1315}	% Also, the size is a little larger than
! %\setfont\ssecsl\slshape{10}{1315}	% being scaled magstep1.
! %\setfont\ssectt\ttshape{10}{1315}
! %\setfont\ssecsf\sfshape{10}{1315}
  
  %\let\ssecbf=\ssecrm
  
! \setfont\ssecrm\rmbshape{12}{\magstephalf}
! \setfont\ssecit\itbshape{10}{1315}
! \setfont\ssecsl\slbshape{10}{1315}
! \setfont\ssectt\ttbshape{12}{\magstephalf}
! \setfont\ssecttsl\ttslshape{10}{\magstep1}
! \setfont\ssecsf\sfbshape{12}{\magstephalf}
! \let\ssecbf\ssecrm
! \setfont\ssecsc\scbshape{10}{\magstep1}
  \font\sseci=cmmi12 scaled \magstephalf
  \font\ssecsy=cmsy10 scaled \magstep1
*************** where each line of input produces a line
*** 1023,1027 ****
  
  % Fonts for title page:
! \setfont\titlerm{bx12 scaled \magstep3}
  \let\authorrm = \secrm
  
--- 1097,1101 ----
  
  % Fonts for title page:
! \setfont\titlerm\rmbshape{12}{\magstep3}
  \let\authorrm = \secrm
  
*************** where each line of input produces a line
*** 1042,1072 ****
  % of just \STYLE.  We do this so that font changes will continue to work
  % in math mode, where it is the current \fam that is relevant in most
! % cases, not the current.  Plain TeX does, for example,
! % \def\bf{\fam=\bffam \tenbf}  By redefining \tenbf, we obviate the need
! % to redefine \bf itself.
  \def\textfonts{%
    \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
    \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
!   \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy
    \resetmathfonts}
  \def\chapfonts{%
    \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
    \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
!   \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy
    \resetmathfonts}
  \def\secfonts{%
    \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
    \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
!   \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy
    \resetmathfonts}
  \def\subsecfonts{%
    \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
    \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
!   \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy
    \resetmathfonts}
  \def\indexfonts{%
    \let\tenrm=\indrm \let\tenit=\indit \let\tensl=\indsl
    \let\tenbf=\indbf \let\tentt=\indtt \let\smallcaps=\indsc
!   \let\tensf=\indsf \let\teni=\indi \let\tensy=\indsy
    \resetmathfonts}
  
--- 1116,1146 ----
  % of just \STYLE.  We do this so that font changes will continue to work
  % in math mode, where it is the current \fam that is relevant in most
! % cases, not the current font.  Plain TeX does \def\bf{\fam=\bffam
! % \tenbf}, for example.  By redefining \tenbf, we obviate the need to
! % redefine \bf itself.
  \def\textfonts{%
    \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
    \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
!   \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy \let\tenttsl=\textttsl
    \resetmathfonts}
  \def\chapfonts{%
    \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
    \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
!   \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl
    \resetmathfonts}
  \def\secfonts{%
    \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
    \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
!   \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy \let\tenttsl=\secttsl
    \resetmathfonts}
  \def\subsecfonts{%
    \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
    \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
!   \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \let\tenttsl=\ssecttsl
    \resetmathfonts}
  \def\indexfonts{%
    \let\tenrm=\indrm \let\tenit=\indit \let\tensl=\indsl
    \let\tenbf=\indbf \let\tentt=\indtt \let\smallcaps=\indsc
!   \let\tensf=\indsf \let\teni=\indi \let\tensy=\indsy \let\tenttsl=\indttsl
    \resetmathfonts}
  
*************** where each line of input produces a line
*** 1079,1085 ****
  
  % Fonts for short table of contents.
! \setfont\shortcontrm{r12}
! \setfont\shortcontbf{bx12}
! \setfont\shortcontsl{sl12}
  
  %% Add scribe-like font environments, plus @l for inline lisp (usually sans
--- 1153,1159 ----
  
  % Fonts for short table of contents.
! \setfont\shortcontrm\rmshape{12}{1000}
! \setfont\shortcontbf\bxshape{12}{1000}
! \setfont\shortcontsl\slshape{12}{1000}
  
  %% Add scribe-like font environments, plus @l for inline lisp (usually sans
*************** where each line of input produces a line
*** 1113,1120 ****
  \let\ttfont=\t
  \def\samp #1{`\tclose{#1}'\null}
! \def\key #1{{\tt \nohyphenation \uppercase{#1}}\null}
  \def\ctrl #1{{\tt \rawbackslash \hat}#1}
  
  \let\file=\samp
  
  % @code is a modification of @t,
--- 1187,1195 ----
  \let\ttfont=\t
  \def\samp #1{`\tclose{#1}'\null}
! \def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null}
  \def\ctrl #1{{\tt \rawbackslash \hat}#1}
  
  \let\file=\samp
+ \let\url=\samp % perhaps include a hypertex \special eventually
  
  % @code is a modification of @t,
*************** where each line of input produces a line
*** 1142,1146 ****
  
  % We *must* turn on hyphenation at `-' and `_' in \code.
! % Otherwise, it is too hard to avoid overful hboxes
  % in the Emacs manual, the Library manual, etc.
  
--- 1217,1221 ----
  
  % We *must* turn on hyphenation at `-' and `_' in \code.
! % Otherwise, it is too hard to avoid overfull hboxes
  % in the Emacs manual, the Library manual, etc.
  
*************** where each line of input produces a line
*** 1171,1180 ****
  % @kbd is like @code, except that if the argument is just one @key command,
  % then @kbd has no effect.
! 
  \def\xkey{\key}
  \def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%
  \ifx\one\xkey\ifx\threex\three \key{#2}%
! \else\tclose{\look}\fi
! \else\tclose{\look}\fi}
  
  % Typeset a dimension, e.g., `in' or `pt'.  The only reason for the
--- 1246,1262 ----
  % @kbd is like @code, except that if the argument is just one @key command,
  % then @kbd has no effect.
! %
  \def\xkey{\key}
  \def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%
  \ifx\one\xkey\ifx\threex\three \key{#2}%
! \else{\tclose{\ttsl\look}}\fi
! \else{\tclose{\ttsl\look}}\fi}
! 
! % Check if we are currently using a typewriter font.  Since all the
! % Computer Modern typewriter fonts have zero interword stretch (and
! % shrink), and it is reasonable to expect all typewriter fonts to have
! % this property, we can check that font parameter.
! % 
! \def\ifmonospace{\ifdim\fontdimen3\font=0pt }
  
  % Typeset a dimension, e.g., `in' or `pt'.  The only reason for the
*************** July\or August\or September\or October\o
*** 1441,1445 ****
  \newif\ifitemxneedsnegativevskip
  
! \def\itemxpar{\par\ifitemxneedsnegativevskip\vskip-\parskip\nobreak\fi}
  
  \def\internalBitem{\smallbreak \parsearg\itemzzz}
--- 1523,1527 ----
  \newif\ifitemxneedsnegativevskip
  
! \def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi}
  
  \def\internalBitem{\smallbreak \parsearg\itemzzz}
*************** July\or August\or September\or October\o
*** 1712,1719 ****
  
  % @multitable macros
! % Amy Hendrickson, 8/18/94
  %
! % @multitable ... @endmultitable will make as many columns as desired.
! % Contents of each column will wrap at width given in preamble. Width
  % can be specified either with sample text given in a template line,
  % or in percent of \hsize, the current width of text on page.
--- 1794,1801 ----
  
  % @multitable macros
! % Amy Hendrickson, 8/18/94, 3/6/96
  %
! % @multitable ... @end multitable will make as many columns as desired.
! % Contents of each column will wrap at width given in preamble.  Width
  % can be specified either with sample text given in a template line,
  % or in percent of \hsize, the current width of text on page.
*************** July\or August\or September\or October\o
*** 1724,1731 ****
  %
  % Either define widths of columns in terms of percent of \hsize: 
! %   @multitable @percentofhsize .2 .3 .5
  %   @item ...
  %
! %   Numbers following @percentofhsize are the percent of the total
  %   current hsize to be used for each column. You may use as many
  %   columns as desired.
--- 1806,1813 ----
  %
  % Either define widths of columns in terms of percent of \hsize: 
! %   @multitable @columnfractions .25 .3 .45
  %   @item ...
  %
! %   Numbers following @columnfractions are the percent of the total
  %   current hsize to be used for each column. You may use as many
  %   columns as desired.
*************** July\or August\or September\or October\o
*** 1735,1739 ****
  %   @item ...
  %   using the widest term desired in each column.
! 
  
  % Each new table line starts with @item, each subsequent new column 
--- 1817,1830 ----
  %   @item ...
  %   using the widest term desired in each column.
! %
! % For those who want to use more than one line's worth of words in
! % the preamble, break the line within one argument and it
! % will parse correctly, i.e.,
! %
! %     @multitable {Column 1 template} {Column 2 template} {Column 3 
! %      template}
! % Not:
! %     @multitable {Column 1 template} {Column 2 template} 
! %      {Column 3 template}
  
  % Each new table line starts with @item, each subsequent new column 
*************** July\or August\or September\or October\o
*** 1760,1782 ****
  %         They will wrap at the width determined by the template.
  %   @item@tab@tab This will be in third column.
! %   @endmultitable
  
  % Default dimensions may be reset by user.
! % @intableparskip will set vertical space between paragraphs in table.
! % @intableparindent will set paragraph indent in table.
! % @spacebetweencols will set horizontal space to be left between columns.
! % @spacebetweenlines will set vertical space to be left between lines.
  
  %%%%
  % Dimensions 
  
! \newdimen\intableparskip
! \newdimen\intableparindent
! \newdimen\spacebetweencols
! \newdimen\spacebetweenlines
! \intableparskip=0pt
! \intableparindent=6pt
! \spacebetweencols=12pt
! \spacebetweenlines=12pt
  
  %%%%
--- 1851,1875 ----
  %         They will wrap at the width determined by the template.
  %   @item@tab@tab This will be in third column.
! %   @end multitable
  
  % Default dimensions may be reset by user.
! % @multitableparskip is vertical space between paragraphs in table.
! % @multitableparindent is paragraph indent in table.
! % @multitablecolmargin is horizontal space to be left between columns.
! % @multitablelinespace is space to leave between table items, baseline
! %                                                            to baseline.
! %   0pt means it depends on current normal line spacing.
  
  %%%%
  % Dimensions 
  
! \newskip\multitableparskip
! \newskip\multitableparindent
! \newdimen\multitablecolspace
! \newskip\multitablelinespace
! \multitableparskip=0pt
! \multitableparindent=6pt
! \multitablecolspace=12pt
! \multitablelinespace=0pt
  
  %%%%
*************** July\or August\or September\or October\o
*** 1784,1802 ****
  \let\endsetuptable\relax
  \def\xendsetuptable{\endsetuptable}
! \let\percentofhsize\relax
! \def\xpercentofhsize{\percentofhsize}
  \newif\ifsetpercent
  
  \newcount\colcount
  \def\setuptable#1{\def\firstarg{#1}%
  \ifx\firstarg\xendsetuptable\let\go\relax%
  \else
!   \ifx\firstarg\xpercentofhsize\global\setpercenttrue%
    \else
      \ifsetpercent
!        \if#1.\else%
!        \global\advance\colcount by1 %
!        \expandafter\xdef\csname col\the\colcount\endcsname{.#1\hsize}%
!        \fi
      \else
         \global\advance\colcount by1
--- 1877,1900 ----
  \let\endsetuptable\relax
  \def\xendsetuptable{\endsetuptable}
! \let\columnfractions\relax
! \def\xcolumnfractions{\columnfractions}
  \newif\ifsetpercent
  
+ %% 2/1/96, to allow fractions to be given with more than one digit.
+ \def\pickupwholefraction#1 {\global\advance\colcount by1 %
+ \expandafter\xdef\csname col\the\colcount\endcsname{.#1\hsize}%
+ \setuptable}
+ 
  \newcount\colcount
  \def\setuptable#1{\def\firstarg{#1}%
  \ifx\firstarg\xendsetuptable\let\go\relax%
  \else
!   \ifx\firstarg\xcolumnfractions\global\setpercenttrue%
    \else
      \ifsetpercent
!        \let\go\pickupwholefraction   % In this case arg of setuptable
!                                      % is the decimal point before the
!                                      % number given in percent of hsize.
!                                      % We don't need this so we don't use it.
      \else
         \global\advance\colcount by1
*************** July\or August\or September\or October\o
*** 1805,1828 ****
      \fi%
    \fi%
!   \let\go\setuptable%
  \fi\go}
  %%%%
  % multitable syntax
! \def\tab{&}
  
  %%%%
! % @multitable ... @endmultitable definitions:
  
! \def\multitable#1\item{\bgroup
  \let\item\cr
  \tolerance=9500
  \hbadness=9500
! \parskip=\intableparskip
! \parindent=\intableparindent
  \overfullrule=0pt
  \global\colcount=0\relax%
  \def\Emultitable{\global\setpercentfalse\global\everycr{}\cr\egroup\egroup}%
   % To parse everything between @multitable and @item :
! \def\one{#1}\expandafter\setuptable\one\endsetuptable
   % Need to reset this to 0 after \setuptable.
  \global\colcount=0\relax% 
--- 1903,1933 ----
      \fi%
    \fi%
! \ifx\go\pickupwholefraction\else\let\go\setuptable\fi%
  \fi\go}
+ 
  %%%%
  % multitable syntax
! \def\tab{&\hskip1sp\relax} % 2/2/96
!                            % tiny skip here makes sure this column space is
!                            % maintained, even if it is never used.
! 
  
  %%%%
! % @multitable ... @end multitable definitions:
! 
! \def\multitable{\parsearg\dotable}
  
! \def\dotable#1{\bgroup
  \let\item\cr
  \tolerance=9500
  \hbadness=9500
! \setmultitablespacing
! \parskip=\multitableparskip
! \parindent=\multitableparindent
  \overfullrule=0pt
  \global\colcount=0\relax%
  \def\Emultitable{\global\setpercentfalse\global\everycr{}\cr\egroup\egroup}%
   % To parse everything between @multitable and @item :
! \setuptable#1 \endsetuptable
   % Need to reset this to 0 after \setuptable.
  \global\colcount=0\relax% 
*************** July\or August\or September\or October\o
*** 1833,1841 ****
   % continue for many paragraphs if desired.
  \halign\bgroup&\global\advance\colcount by 1\relax%
! \vtop{\hsize=\expandafter\csname col\the\colcount\endcsname
   % In order to keep entries from bumping into each other
!  % we will add a \leftskip of \spacebetweencols to all columns after
   % the first one.
!  %  If a template has been used, we will add \spacebetweencols 
   % to the width of each template entry.
   %  If user has set preamble in terms of percent of \hsize
--- 1938,1946 ----
   % continue for many paragraphs if desired.
  \halign\bgroup&\global\advance\colcount by 1\relax%
! \multistrut\vtop{\hsize=\expandafter\csname col\the\colcount\endcsname
   % In order to keep entries from bumping into each other
!  % we will add a \leftskip of \multitablecolspace to all columns after
   % the first one.
!  %  If a template has been used, we will add \multitablecolspace 
   % to the width of each template entry.
   %  If user has set preamble in terms of percent of \hsize
*************** July\or August\or September\or October\o
*** 1849,1857 ****
    \else
     % If user has <not> set preamble in terms of percent of \hsize
!    % we will advance \hsize by \spacebetweencols 
!   \advance\hsize by \spacebetweencols
    \fi
!  % In either case we will make \leftskip=\spacebetweencols:
! \leftskip=\spacebetweencols
  \fi
  \noindent##}\cr%
--- 1954,1962 ----
    \else
     % If user has <not> set preamble in terms of percent of \hsize
!    % we will advance \hsize by \multitablecolspace 
!   \advance\hsize by \multitablecolspace
    \fi
!  % In either case we will make \leftskip=\multitablecolspace:
! \leftskip=\multitablecolspace
  \fi
  \noindent##}\cr%
*************** July\or August\or September\or October\o
*** 1860,1867 ****
   % The table preamble
   % looks at the current \colcount to find the correct column width.
! \global\everycr{\noalign{\nointerlineskip\vskip\spacebetweenlines
  \filbreak%% keeps underfull box messages off when table breaks over pages.
! \global\colcount=0\relax}}}
  
  \message{indexing,}
  % Index generation facilities
--- 1965,1997 ----
   % The table preamble
   % looks at the current \colcount to find the correct column width.
! \global\everycr{\noalign{%
  \filbreak%% keeps underfull box messages off when table breaks over pages.
! \global\colcount=0\relax}}
! }
  
+ \def\setmultitablespacing{% test to see if user has set \multitablelinespace.
+ % If so, do nothing. If not, give it an appropriate dimension based on
+ % current baselineskip.
+ \setbox0=\vbox{Xy}
+ \ifdim\multitablelinespace=0pt
+ %% strut to put in table in case some entry doesn't have descenders,
+ %% to keep lines equally spaced
+ \gdef\multistrut{\vrule height\ht0 depth\dp0 width0pt\relax}
+ %% Test to see if parskip is larger than space between lines of
+ %% table. If not, do nothing. 
+ %%        If so, set to same dimension as multitablelinespace.
+ \else
+ \gdef\multistrut{\vrule height\multitablelinespace depth\dp0
+ width0pt\relax} \fi
+ \ifdim\multitableparskip>\multitablelinespace
+ \global\multitableparskip=\multitablelinespace
+ \global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
+                                       %% than skip between lines in the table.
+ \fi%
+ \ifdim\multitableparskip=0pt
+ \global\multitableparskip=\multitablelinespace
+ \global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
+                                       %% than skip between lines in the table.
+ \fi}
  \message{indexing,}
  % Index generation facilities
*************** July\or August\or September\or October\o
*** 2545,2548 ****
--- 2675,2682 ----
  }}
  
+ % @centerchap is like @unnumbered, but the heading is centered.
+ \outer\def\centerchap{\parsearg\centerchapyyy}
+ \def\centerchapyyy #1{{\let\unnumbchapmacro=\centerchapmacro \unnumberedyyy{#1}}}
+ 
  \outer\def\top{\parsearg\unnumberedyyy}
  \outer\def\unnumbered{\parsearg\unnumberedyyy}
*************** July\or August\or September\or October\o
*** 2795,2799 ****
  \def\CHAPFplain{
  \global\let\chapmacro=\chfplain
! \global\let\unnumbchapmacro=\unnchfplain}
  
  \def\chfplain #1#2{%
--- 2929,2934 ----
  \def\CHAPFplain{
  \global\let\chapmacro=\chfplain
! \global\let\unnumbchapmacro=\unnchfplain
! \global\let\centerchapmacro=\centerchfplain}
  
  \def\chfplain #1#2{%
*************** July\or August\or September\or October\o
*** 2814,2817 ****
--- 2949,2960 ----
                    \rm #1\hfill}}\bigskip \par\penalty 10000 %
  }
+ 
+ \def\centerchfplain #1{%
+ \pchapsepmacro %
+ {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+                   \parindent=0pt
+                   {\rm #1}\hfill}}\bigskip \par\penalty 10000 %
+ }
+ 
  \CHAPFplain % The default
  
*************** July\or August\or September\or October\o
*** 2827,2833 ****
  }
  
  \def\CHAPFopen{
  \global\let\chapmacro=\chfopen
! \global\let\unnumbchapmacro=\unnchfopen}
  
  % Parameter controlling skip before section headings.
--- 2970,2983 ----
  }
  
+ \def\centerchfopen #1{%
+ \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+                        \parindent=0pt
+                        \hfill {\rm #1}\hfill}}\bigskip \par\penalty 10000 %
+ }
+ 
  \def\CHAPFopen{
  \global\let\chapmacro=\chfopen
! \global\let\unnumbchapmacro=\unnchfopen
! \global\let\centerchapmacro=\centerchfopen}
  
  % Parameter controlling skip before section headings.
*************** July\or August\or September\or October\o
*** 3111,3114 ****
--- 3261,3266 ----
  \let\*=\ptexstar
  \let\dots=\ptexdots
+ \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}
+ \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}
  \def\@{@}%
  \let\bullet=\ptexbullet
*************** July\or August\or September\or October\o
*** 3848,3852 ****
    \ifdim \wd0 = 0pt
      % No printed node name was explicitly given.
!     \ifx\SETxref-automatic-section-title\thisisundefined
        % Use the node name inside the square brackets.
        \def\printednodename{\ignorespaces #1}%
--- 4000,4004 ----
    \ifdim \wd0 = 0pt
      % No printed node name was explicitly given.
!     \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax
        % Use the node name inside the square brackets.
        \def\printednodename{\ignorespaces #1}%
*************** July\or August\or September\or October\o
*** 4251,4259 ****
  
  % Allow control of the text dimensions.  Parameters in order: textheight;
! % textwidth; \voffset; \hoffset (!); binding offset.  All require a dimension;
  % header is additional; added length extends the bottom of the page.
  
! \def\changepagesizes#1#2#3#4#5{
   \global\vsize= #1
   \advance\vsize by \topskip
   \global\voffset= #3
--- 4403,4413 ----
  
  % Allow control of the text dimensions.  Parameters in order: textheight;
! % textwidth; voffset; hoffset; binding offset; topskip.
! % All require a dimension;
  % header is additional; added length extends the bottom of the page.
  
! \def\changepagesizes#1#2#3#4#5#6{
   \global\vsize= #1
+  \global\topskip= #6
   \advance\vsize by \topskip
   \global\voffset= #3
*************** July\or August\or September\or October\o
*** 4268,4278 ****
   \global\bindingoffset= #5}
  
! % This layout is compatible with Latex on A4 paper.
! 
! \def\afourlatex{\changepagesizes{22cm}{15cm}{7mm}{4.6mm}{5mm}}
  
  % Use @afourwide to print on European A4 paper in wide format.
  \def\afourwide{\afourpaper
! \changepagesizes{9.5in}{6.5in}{\hoffset}{\normaloffset}{\bindingoffset}}
  
  % Define macros to output various characters with catcode for normal text.
--- 4422,4439 ----
   \global\bindingoffset= #5}
  
! % A specific text layout, 24x15cm overall, intended for A4 paper.  Top margin
! % 29mm, hence bottom margin 28mm, nominal side margin 3cm.
! \def\afourlatex
!         {\global\tolerance=700
!         \global\hfuzz=1pt
!         \setleading{12pt}
!         \global\parskip 15pt plus 1pt
!         \advance\baselineskip by 1.6pt
!         \changepagesizes{237mm}{150mm}{3.6mm}{3.6mm}{3mm}{7mm}
!         }
  
  % Use @afourwide to print on European A4 paper in wide format.
  \def\afourwide{\afourpaper
! \changepagesizes{9.5in}{6.5in}{\hoffset}{\normaloffset}{\bindingoffset}{7mm}}
  
  % Define macros to output various characters with catcode for normal text.
*************** July\or August\or September\or October\o
*** 4323,4334 ****
  \def_{\ifusingtt\normalunderscore\_}
  % Subroutine for the previous macro.
! \def\_{\lvvmode \kern.06em \vbox{\hrule width.3em height.1ex}}
! 
! % \lvvmode is equivalent in function to \leavevmode.
! % Using \leavevmode runs into trouble when written out to
! % an index file due to the expansion of \leavevmode into ``\unhbox
! % \voidb@x'' ---which looks to TeX like ``\unhbox \voidb\x'' due to our
! % magic tricks with @.
! \def\lvvmode{\vbox to 0pt{}}
  
  \catcode`\|=\active
--- 4484,4488 ----
  \def_{\ifusingtt\normalunderscore\_}
  % Subroutine for the previous macro.
! \def\_{\leavevmode \kern.06em \vbox{\hrule width.3em height.1ex}}
  
  \catcode`\|=\active
diff -2rcpP --exclude=*.elc emacs-19.30/man/text.texi emacs-19.31/man/text.texi
*** emacs-19.30/man/text.texi	Sat Nov 18 12:30:36 1995
--- emacs-19.31/man/text.texi	Wed May 15 10:58:05 1996
*************** that separate paragraphs without being p
*** 287,292 ****
  that start a new paragraph and are contained in it must match only
  @code{paragraph-start}, not @code{paragraph-separate}.  For example,
! normally @code{paragraph-start} is @code{"^[ @t{\}t@t{\}n@t{\}f]"} and
! @code{paragraph-separate} is @code{"^[ @t{\}t@t{\}f]*$"}.@refill
  
    Normally it is desirable for page boundaries to separate paragraphs.
--- 287,292 ----
  that start a new paragraph and are contained in it must match only
  @code{paragraph-start}, not @code{paragraph-separate}.  For example,
! normally @code{paragraph-start} is @code{"[ @t{\}t@t{\}n@t{\}f]"} and
! @code{paragraph-separate} is @code{"[ @t{\}t@t{\}f]*$"}.@refill
  
    Normally it is desirable for page boundaries to separate paragraphs.
*************** produces this:
*** 607,611 ****
  
    Lines that do not start with the fill prefix are considered to start
! paragraphs, both in @kbd{M-q} and the paragraph commands; this is gives
  good results for paragraphs with hanging indentation (every line
  indented except the first one).  Lines which are blank or indented once
--- 607,611 ----
  
    Lines that do not start with the fill prefix are considered to start
! paragraphs, both in @kbd{M-q} and the paragraph commands; this gives
  good results for paragraphs with hanging indentation (every line
  indented except the first one).  Lines which are blank or indented once
*************** this hook, followed by hooks of their ow
*** 752,761 ****
  which of these modes is actually being entered.  @xref{Hooks}.
  
! @menu
    Emacs provides two other modes for editing text that is to be passed
  through a text formatter to produce fancy formatted printed output.
! 
! * Nroff Mode::	  The major mode for editing input to the formatter nroff.
! * TeX Mode::	  The major modes for editing input to the formatter TeX.
  
    Another mode is used for editing outlines.  It allows you to view the
--- 752,760 ----
  which of these modes is actually being entered.  @xref{Hooks}.
  
! @ifinfo
    Emacs provides two other modes for editing text that is to be passed
  through a text formatter to produce fancy formatted printed output.
! @xref{Nroff Mode}, for editing input to the formatter nroff.
! @xref{TeX Mode}, for editing input to the formatter TeX.
  
    Another mode is used for editing outlines.  It allows you to view the
*************** text at various levels of detail.  You c
*** 763,770 ****
  headings alone or both headings and text; you can also hide some of the
  headings at lower levels from view to make the high level structure more
! visible.
! 
! * Outline Mode::  The major mode for editing outlines.
! @end menu
  
  @node Outline Mode
--- 762,767 ----
  headings alone or both headings and text; you can also hide some of the
  headings at lower levels from view to make the high level structure more
! visible.  @xref{Outline Mode}.
! @end ifinfo
  
  @node Outline Mode
*************** Move point up to a lower-level (more inc
*** 926,931 ****
  @kindex C-c C-n @r{(Outline mode)}
  @kindex C-c C-p @r{(Outline mode)}
!   @kbd{C-c C-n} (@code{next-visible-heading}) moves down to the next
! heading line.  @kbd{C-c C-p} (@code{previous-visible-heading}) moves
  similarly backward.  Both accept numeric arguments as repeat counts.  The
  names emphasize that invisible headings are skipped, but this is not really
--- 923,928 ----
  @kindex C-c C-n @r{(Outline mode)}
  @kindex C-c C-p @r{(Outline mode)}
!   @kbd{C-c C-n} (@code{outline-next-visible-heading}) moves down to the next
! heading line.  @kbd{C-c C-p} (@code{outline-previous-visible-heading}) moves
  similarly backward.  Both accept numeric arguments as repeat counts.  The
  names emphasize that invisible headings are skipped, but this is not really
diff -2rcpP --exclude=*.elc emacs-19.30/man/trouble.texi emacs-19.31/man/trouble.texi
*** emacs-19.30/man/trouble.texi	Mon Jul 17 16:56:31 1995
--- emacs-19.31/man/trouble.texi	Mon Mar 25 10:41:44 1996
*************** the doctor, you must end it by typing @k
*** 325,329 ****
  the doctor know you are finished.
  
! @node Bugs, Service, Lossage, Top
  @section Reporting Bugs
  
--- 325,329 ----
  the doctor know you are finished.
  
! @node Bugs, Contributing, Lossage, Top
  @section Reporting Bugs
  
*************** The precise commands we need to type to 
*** 526,530 ****
  @findex open-dribble-file
  @cindex dribble file
!   The easy way to record the input to Emacs precisely is to to write a
  dribble file.  To start the file, execute the Lisp expression
  
--- 526,530 ----
  @findex open-dribble-file
  @cindex dribble file
!   The easy way to record the input to Emacs precisely is to write a
  dribble file.  To start the file, execute the Lisp expression
  
*************** form that is clearly safe to install.
*** 890,894 ****
  @end itemize
  
! @node Service, Command Arguments, Bugs, Top
  @section How To Get Help with GNU Emacs
  
--- 890,910 ----
  @end itemize
  
! @node Contributing, Service, Bugs, Top
! @section Contributing to Emacs Development
! 
! If you would like to help pretest Emacs releases to assure they work
! well, or if you would like to work on improving Emacs, please contact
! the maintainers at @code{bug-gnu-emacs@@prep.ai.mit.edu}.  A pretester
! should be prepared to investigate bugs as well as report them.  If you'd
! like to work on improving Emacs, please ask for suggested projects or
! suggest your own ideas.
! 
! If you have already written an improvement, please tell us about it.  If
! you have not yet started work, it is useful to contact
! @code{bug-gnu-emacs@@prep.ai.mit.edu} before you start; it might be
! possible to suggest ways to make your extension fit in better with the
! rest of Emacs.
! 
! @node Service, Command Arguments, Contributing, Top
  @section How To Get Help with GNU Emacs
  
diff -2rcpP --exclude=*.elc emacs-19.30/man/viper-cmd.texi emacs-19.31/man/viper-cmd.texi
*** emacs-19.30/man/viper-cmd.texi	Mon Nov 20 12:15:23 1995
--- emacs-19.31/man/viper-cmd.texi	Thu Jan  4 15:55:27 1996
*************** Successive typing of @kbd{C-c M-p} cause
*** 494,498 ****
  the direction 
  of older commands, while hitting @kbd{C-c M-n} does so in reverse
! order. Each command in the history is displayed in the Monibuffer. The
  displayed command can 
  then be executed by typing `@kbd{.}'.
--- 494,498 ----
  the direction 
  of older commands, while hitting @kbd{C-c M-n} does so in reverse
! order. Each command in the history is displayed in the Minibuffer. The
  displayed command can 
  then be executed by typing `@kbd{.}'.
diff -2rcpP --exclude=*.elc emacs-19.30/man/viper.texi emacs-19.31/man/viper.texi
*** emacs-19.30/man/viper.texi	Mon Nov 20 12:14:27 1995
--- emacs-19.31/man/viper.texi	Mon Feb 26 16:16:48 1996
***************
*** 13,17 ****
  @title Viper Is a Package for Emacs Rebels
  @subtitle a Vi emulator for GNU Emacs 19 and XEmacs 19
! @subtitle July 1995, Viper Version 2.80
  
  @author Masahiko Sato (VIP 3.5)
--- 13,17 ----
  @title Viper Is a Package for Emacs Rebels
  @subtitle a Vi emulator for GNU Emacs 19 and XEmacs 19
! @subtitle January 1996, Viper Version 2.85
  
  @author Masahiko Sato (VIP 3.5)
*************** To get the full list of Vi variables, ty
*** 1607,1619 ****
  @item vip-auto-indent nil
  @itemx :se ai (:se autoindent)
! If @code{t} then enable auto indentation.
! by @kbd{o} or @kbd{O} command.
  @item vip-case-fold-search nil
  @itemx :se ic (:se ignorecase)
! If @code{t} search ignores cases.
  @item vip-re-search nil
  @itemx :se magic
  If @code{t} then search is reg-exp search, if @code{nil} then vanilla
  search.
  @item buffer-read-only
  @itemx :se ro (:se readonly)
--- 1607,1639 ----
  @item vip-auto-indent nil
  @itemx :se ai (:se autoindent)
! @itemx :se gai (:se global-autoindent)
! If @code{t}, enable auto indentation.
! by @kbd{RET}, @kbd{o} or @kbd{O} command.
! 
! @code{vip-auto-indent} is a local variable. To change the value globally, use
! @code{setq-default}. It may be useful for certain major modes to have their
! own values of @code{vip-auto-indent}. This can be achieved by using
! @code{setq} to change the local value of this variable in the hooks to the
! appropriate major modes.
! 
! @kbd{:se ai} changes the value of @code{vip-auto-indent} in the current
! buffer only; @kbd{:se gai} does the same globally.
! @item vip-electric-mode t
! If @code{t}, auto-indentation becomes electric, which means that @kbd{RET},
! @kbd{O}, and @kbd{o} indent cursor according to the current major mode. In
! the future, this variable may control additional electric features.
! 
! This is a local variable: @code{setq} changes the value of this variable
! in the current buffer only. Use @code{setq-default} to change the value in
! all buffers.
  @item vip-case-fold-search nil
  @itemx :se ic (:se ignorecase)
! If @code{t}, search ignores cases.
! This can also be toggled by quickly hitting @kbd{/} twice.
  @item vip-re-search nil
  @itemx :se magic
  If @code{t} then search is reg-exp search, if @code{nil} then vanilla
  search.
+ This behavior can also be toggled by quickly hitting @kbd{/} trice.
  @item buffer-read-only
  @itemx :se ro (:se readonly)
*************** Set current buffer to read only. To chan
*** 1623,1632 ****
  @itemx :se sm (:se showmatch)
  Show matching parens by blinking cursor. 
! @item tab-width t (default setting, via @code{setq-default})
  @itemx :se ts=value (:se tabstop=value)
! Set tab width to value for all buffers where the tab is not yet set locally
! (see next), including the new buffers. Note that typing @kbd{TAB} normally
  doesn't insert the tab, since this key is usually bound to 
! text-formatting function, @code{indent-for-tab-command} (which facilitates
  programming and document writing). Instead, the tab is inserted via the
  command @code{vip-insert-tab}, which is bound to @kbd{S-tab} (shift + tab).
--- 1643,1664 ----
  @itemx :se sm (:se showmatch)
  Show matching parens by blinking cursor. 
! @item tab-width t (default setting via @code{setq-default})
  @itemx :se ts=value (:se tabstop=value)
! @itemx :se gts=value (:se global-tabstop=value)
! @code{tab-width} is a local variable that controls the width of the tab stops.
! To change the value globally, use @code{setq-default}; for local settings,
! use @code{setq}.
! 
! The command @kbd{:se ts}
! sets the tab width in the current
! buffer only; it has no effect on other buffers.
! 
! The command @kbd{:se gts} sets tab width globally,
! for all buffers where the tab is not yet set locally,
! including the new buffers.
! 
! Note that typing @kbd{TAB} normally
  doesn't insert the tab, since this key is usually bound to 
! a text-formatting function, @code{indent-for-tab-command} (which facilitates
  programming and document writing). Instead, the tab is inserted via the
  command @code{vip-insert-tab}, which is bound to @kbd{S-tab} (shift + tab).
*************** On some non-windowing terminals, Shift d
*** 1636,1643 ****
  to bind @code{vip-insert-tab} to some other convenient key.
  
- @item tab-width t (local setting via @code{setq})
- @itemx :se tab-stop-local=value
- Like @kbd{:se ts}, except that @code{tab-width} is set only for the current
- buffer; it will have no effect on other buffers.
  @item vip-shift-width 8
  @itemx :se sw=value  (:se shiftwidth=value)
--- 1668,1671 ----
*************** can include a line like this in your @fi
*** 1819,1822 ****
--- 1847,1851 ----
  @end example
  @vindex @code{vip-auto-indent}
+ @vindex @code{vip-electric-mode}
  @vindex @code{vip-case-fold-search}
  @vindex @code{vip-re-search}
*************** As with global bindings, customized loca
*** 2063,2066 ****
--- 2092,2102 ----
  are not inherited by Insert state.
  
+ On rare occasions, local keys may be added by mistake. Usually this is done
+ indirectly, by invoking a major mode that adds local keys (e.g.,
+ @code{shell-mode} redefines @kbd{RET}). In such a case, exiting the wrong
+ major mode won't rid you from unwanted local keys, since these keys are
+ local to Viper state and the current buffer, not to the major mode.
+ In such situations, the remedy is to type @kbd{M-x vip-zap-local-keys}.
+ 
  So much about Viper-specific bindings.
  @xref{Customization,,Customization,emacs,The GNU Emacs
*************** bindings in Emacs.
*** 2073,2076 ****
--- 2109,2113 ----
  @vindex @code{vip-emacs-global-user-map}
  @findex @code{vip-add-local-keys}
+ @findex @code{vip-zap-local-keys}
  
  @node Packages that Change Keymaps,Viper Specials,Keybindings,Customization
*************** vanilla search. Thus, quickly hitting @k
*** 2230,2234 ****
  case sensitive search to case-insensitive. Repeating this once again will
  restore the original state. Likewise, quickly hitting @kbd{/} three times
! will switch you from vanila-style search to search via regular expressions.
  If you hit something other than @kbd{/} after the first @kbd{/} or if the
  second @kbd{/} doesn't follow quickly enough, then Viper will issue the
--- 2267,2271 ----
  case sensitive search to case-insensitive. Repeating this once again will
  restore the original state. Likewise, quickly hitting @kbd{/} three times
! will switch you from vanilla-style search to search via regular expressions.
  If you hit something other than @kbd{/} after the first @kbd{/} or if the
  second @kbd{/} doesn't follow quickly enough, then Viper will issue the
*************** is available). Clicking the mouse when E
*** 2413,2426 ****
  @table @code
  @cindex mouse
! @item S-mouse-1 (Emacs)
  @item meta shift button1up (XEmacs)
! Holding Shift and clicking mouse button 1 (or holding Meta and Control keys
! while clicking, if in XEmacs) will initiate search for a region under the
  mouse pointer (defined below).  This command can take a prefix argument,
  which indicates the occurrence of the pattern to search for.
  
  Note: Viper binds this mouse action only if it is not already bound to
! something else. If you want to use this feature and @kbd{S-mouse-1}
! is already used for something else, you can rebind mouse-search as follows:
  @lisp
  (global-set-key [M-mouse-1] 'vip-mouse-click-search-word)
--- 2450,2464 ----
  @table @code
  @cindex mouse
! @item M-S-mouse-1 (Emacs)
  @item meta shift button1up (XEmacs)
! Holding Meta and Shift while clicking mouse button 1
! will initiate search for a region under the
  mouse pointer (defined below).  This command can take a prefix argument,
  which indicates the occurrence of the pattern to search for.
  
  Note: Viper binds this mouse action only if it is not already bound to
! something else. If you want to use this feature and @kbd{M-S-mouse-1}
! is already used for something else, you can rebind mouse-search as, for
! example, in the following example:
  @lisp
  (global-set-key [M-mouse-1] 'vip-mouse-click-search-word)
*************** In XEmacs, you can change bindings as fo
*** 2441,2447 ****
  @end lisp
  if, say, you prefer to hold both meta and control while clicking.
- The reason why Viper uses different bindings for Emacs and XEmacs is
- because these two incarnations of Emacs have different default bindings for
- mouse actions.
  
  Like in Emacs, there are special rules for binding these functions: the
--- 2479,2482 ----
*************** should not be bound (or it should be bou
*** 2455,2468 ****
  The region that is chosen as a pattern to search for is determined as
  follows. If search is invoked via a single click, Viper chooses the region
! that lies between the beginning of the ``word'' under the pointer (``word'' is
! understood in Vi sense) and the end of that word.
! The only difference with Vi's words is that in Lisp
! major modes `-' is considered an alphanumeric symbol. This is done for the
! convenience of working with Lisp symbols, which often have an `-' in them.
! Also, if you click on a non-alphanumeric character that is not a word
! separator (in Vi) then this character will also be considered alphanumeric,
! provided that it is adjacent (from either side) to an alphanumeric character.
! This useful feature gives added control over the patterns selected by the
! mouse click.
  
  On a double-click, the region is determined by the beginning of the current
--- 2490,2502 ----
  The region that is chosen as a pattern to search for is determined as
  follows. If search is invoked via a single click, Viper chooses the region
! that lies between the beginning of the ``word'' under the pointer (``word''
! is understood in Vi sense) and the end of that word.  The only difference
! with Vi's words is that in Lisp major modes `-' is considered an
! alphanumeric symbol. This is done for the convenience of working with Lisp
! symbols, which often have an `-' in them.  Also, if you click on a
! non-alphanumeric character that is not a word separator (in Vi sense) then
! this character will also be considered alphanumeric, provided that it is
! adjacent (from either side) to an alphanumeric character.  This useful
! feature gives added control over the patterns selected by the mouse click.
  
  On a double-click, the region is determined by the beginning of the current
*************** Vi's ``Word'' (i.e., the largest non-sep
*** 2470,2480 ****
  of that ``Word'' (as determined by the @kbd{E} command).
  
! On a triple-click, the region consists of the line where the click occurred
! with all leading and trailing spaces and tabs removed.
  
! @item S-mouse-2 (Emacs)
  @item meta shift button2up (XEmacs)
! Holding Shift and clicking button 2 (or holding Meta and Shift keys while
! clicking, if in XEmacs) of the mouse will insert the region surrounding the
  mouse pointer.  The rules defining this region are the same as for
  mouse-search.  This command takes an optional prefix argument, which
--- 2504,2514 ----
  of that ``Word'' (as determined by the @kbd{E} command).
  
! On a triple-click, the region consists of the entire line where the click
! occurred with all leading and trailing spaces and tabs removed.
  
! @item M-S-mouse-2 (Emacs)
  @item meta shift button2up (XEmacs)
! Holding Meta and Shift while clicking mouse button 2
! will insert the region surrounding the
  mouse pointer.  The rules defining this region are the same as for
  mouse-search.  This command takes an optional prefix argument, which
*************** during the execution will simply termina
*** 2713,2717 ****
  
  A macro name can be a string of characters or a vector of keys.
! The latter makes it possible to define macros bound to, say, double-hitts
  on a function key, such as @kbd{up} or @kbd{f13}.
  This is very useful if you run out of function keys on your keyboard; it
--- 2747,2751 ----
  
  A macro name can be a string of characters or a vector of keys.
! The latter makes it possible to define macros bound to, say, double-hits
  on a function key, such as @kbd{up} or @kbd{f13}.
  This is very useful if you run out of function keys on your keyboard; it
*************** jackr@@dblues.engr.sgi.com (Jack Repenni
*** 2864,2868 ****
  pogrell@@informatik.hu-berlin.de (Lutz Pogrell),
  csdayton@@midway.uchicago.edu (Soren Dayton),
! pradyut@@cs.uchicago.edu (Pradyut Shah)
  @end example
  
--- 2898,2907 ----
  pogrell@@informatik.hu-berlin.de (Lutz Pogrell),
  csdayton@@midway.uchicago.edu (Soren Dayton),
! pradyut@@cs.uchicago.edu (Pradyut Shah),
! vrenjak@@sun1.racal.com (Milan Vrenjak),
! georger@@microcrafts.com (George V. Reilly),
! whicken@@dragon.parasoft.com (Wendell Hicken),
! terra@@diku.dk (Morten Welinder),
! James Kanze (kanze@@gabi-soft.fr)
  @end example
  
diff -2rcpP --exclude=*.elc emacs-19.30/mkinstalldirs emacs-19.31/mkinstalldirs
*** emacs-19.30/mkinstalldirs	Sat Nov 25 01:01:24 1995
--- emacs-19.31/mkinstalldirs	Sat May 25 20:17:33 1996
***************
*** 5,8 ****
--- 5,10 ----
  # Public domain
  
+ # $Id: mkinstalldirs,v 1.10 1996/05/03 07:37:52 friedman Exp $
+ 
  errstatus=0
  
*************** do
*** 13,17 ****
  
     pathcomp=
!    for d in ${1+"$@"} ; do
       pathcomp="$pathcomp$d"
       case "$pathcomp" in
--- 15,20 ----
  
     pathcomp=
!    for d
!    do
       pathcomp="$pathcomp$d"
       case "$pathcomp" in
*************** do
*** 21,25 ****
       if test ! -d "$pathcomp"; then
          echo "mkdir $pathcomp" 1>&2
!         mkdir "$pathcomp" || errstatus=$?
       fi
  
--- 24,33 ----
       if test ! -d "$pathcomp"; then
          echo "mkdir $pathcomp" 1>&2
! 
!         mkdir "$pathcomp" || lasterr=$?
! 
!         if test ! -d "$pathcomp"; then
!   	  errstatus=$lasterr
!         fi
       fi
  
diff -2rcpP --exclude=*.elc emacs-19.30/msdos/ChangeLog emacs-19.31/msdos/ChangeLog
*** emacs-19.30/msdos/ChangeLog	Fri Nov 24 23:43:47 1995
--- emacs-19.31/msdos/ChangeLog	Sat May 25 15:32:24 1996
***************
*** 1,2 ****
--- 1,39 ----
+ Sat May 25 15:30:10 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
+ 
+ 	* Version 19.31 released.
+ 
+ Wed Apr 17 14:42:04 1996  Eli Zaretskii  <eliz@is.elta.co.il>
+ 
+ 	* sed1.inp: Replace `make-docfile' with `make-doc.exe'.  In case
+ 	src/Makefile needs to rebuild `make-doc.exe', use one command per line.
+ 	Undo the previous change.
+ 	
+ Mon Apr 15 17:02:26 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* sed1.inp: Change make-docfile to make-doc.exe in a second place. 
+ 
+ Mon Apr 15 19:30:39 1996  Eli Zaretskii  <eliz@is.elta.co.il>
+ 
+ 	* mainmake.v2 (src): Create a file with sed commands instead of using
+ 	a long sed command line (some versions of Sed don't handle that).
+ 	(gdb): Merged back into src, undoing April 13 change.
+ 	(install): Do use if statements, but not a loop.
+ 	
+ Sat Apr 13 00:42:03 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* mainmake.v2 (gdb): New target, broken out of src.
+ 	(install): Use simple explicit copy commands, not a loop.
+ 
+ Wed Apr 10 13:40:23 1996  Eli Zaretskii  <eliz@is.elta.co.il>
+ 
+ 	* sed2.inp: Under DJGPP v2, use <sys/config.h> instead of most of
+ 	config.h.in.
+ 
+ 	* sed1v2.inp, sed3v2.inp, mainmake.v2: New files.
+ 
+ Tue Jan 23 12:44:30 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
+ 
+ 	* sed2.inp (LOCALTIME_CACHE, HAVE_TZSET): Define these.
+ 
  Fri Nov 24 23:43:45 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
diff -2rcpP --exclude=*.elc emacs-19.30/msdos/mainmake.v2 emacs-19.31/msdos/mainmake.v2
*** emacs-19.30/msdos/mainmake.v2	Wed Dec 31 19:00:00 1969
--- emacs-19.31/msdos/mainmake.v2	Mon Apr 15 14:46:19 1996
***************
*** 0 ****
--- 1,95 ----
+ # Top-level Makefile for Emacs under MS-DOS/DJGPP v2.0 or higher. -*-makefile-*-
+ #
+ # make all	to compile and build Emacs.
+ # make install	to install it.
+ # make TAGS	to update tags tables.
+ #
+ # make clean  or  make mostlyclean
+ #      Delete all files from the current directory that are normally
+ #      created by building the program.	 Don't delete the files that
+ #      record the configuration.  Also preserve files that could be made
+ #      by building, but normally aren't because the distribution comes
+ #      with them.
+ #
+ #      Delete `.dvi' files here if they are not part of the distribution.
+ # 
+ # make distclean
+ #      Delete all files from the current directory that are created by
+ #      configuring or building the program.  If you have unpacked the
+ #      source and built the program without creating any other files,
+ #      `make distclean' should leave only the files that were in the
+ #      distribution.
+ # 
+ # make realclean
+ #      Delete everything from the current directory that can be
+ #      reconstructed with this Makefile.  This typically includes
+ #      everything deleted by distclean, plus more: C source files
+ #      produced by Bison, tags tables, info files, and so on.
+ #
+ # make extraclean
+ #      Still more severe - delete backup and autosave files, too.
+ 
+ # Generate a full pathname of the top-level installation directory
+ topdir := $(subst \,/,$(shell cd))
+ 
+ all:	lib-src src
+ 
+ lib-src: FRC
+ 	cd lib-src
+ 	$(MAKE)
+ 	cd ..
+ 
+ src: FRC
+ 	cd src
+ 	$(MAKE)
+ 	redir -o gdb.sed echo '/-geometry/s,^.*,set environment HOME $(topdir),'
+ 	redir -oa gdb.sed echo '/environment *TERM/s/^.*/set environment TERM internal/'
+ 	redir -oa gdb.sed echo '/x_error_quitter/s/^.*/set environment NAME root/'
+ 	redir -o gdb.tmp sed -f gdb.sed _gdbinit
+ 	redir -oa gdb.tmp echo 'set environment USER root'
+ 	redir -oa gdb.tmp echo 'set environment EMACSPATH $(topdir)/bin'
+ 	redir -oa gdb.tmp echo 'set environment SHELL $(subst \,/,$(COMSPEC))'
+ 	redir -oa gdb.tmp echo 'set environment PATH $(subst \,/,$(PATH))'
+ 	update gdb.tmp gdb.ini
+ 	rm -f gdb.tmp gdb.sed
+ 	cd ..
+ 
+ install: all
+ 	if not exist bin\\nul md bin
+ 	cd lib-src
+ 	if exist hexl.exe mv -f hexl.exe ../bin
+ 	if exist etags.exe mv -f etags.exe ../bin
+ 	if exist ctags.exe mv -f ctags.exe ../bin
+ 	if exist b2m.exe mv -f b2m.exe ../bin
+ 	cd ..
+ 	cd src
+ 	stubify emacs
+ 	stubedit emacs.exe minstack=512k
+ 	mv -f emacs.exe ../bin/
+ 	cd ..
+ 
+ FRC:
+ 
+ TAGS tags:	lib-src
+ 	cd lisp
+ 	../bin/etags [a-zA-Z]*.el term/[a-zA-Z]*.el
+ 	cd ..
+ 	cd src
+ 	../bin/etags --include=../lisp/TAGS \
+ 	'--regex=/[ 	]*DEFVAR_[A-Z_ 	(]+"\([^"]+\)"/' *.c *.h s/msdos.h m/intel386.h
+ 	cd ..
+ 	./bin/etags --include=src/TAGS
+ 
+ check:
+ 	@echo "We don't have any tests for GNU Emacs yet."
+ 
+ clean:
+ 	cd lib-src
+ 	$(MAKE) clean
+ 	cd ..
+ 	cd src
+ 	$(MAKE) clean
+ 	cd ..
+ 	cd oldxmenu
+ 	-$(MAKE) clean
+ 	cd ..
diff -2rcpP --exclude=*.elc emacs-19.30/msdos/sed1.inp emacs-19.31/msdos/sed1.inp
*** emacs-19.30/msdos/sed1.inp	Wed Oct 11 10:43:30 1995
--- emacs-19.31/msdos/sed1.inp	Wed Apr 17 14:35:53 1996
***************
*** 2,5 ****
--- 2,9 ----
  # Configuration script for src/makefile
  # ----------------------------------------------------------------------
+ #
+ # In case src/Makefile needs to rebuild `make-doc.exe' (might happen under
+ # Win95), make sure it gets built with commands that DOS
+ # understands (one command per line).
  s/^#.*//
  s/^[ \f\t][ \f\t]*$//
*************** s!/bin/sh!command.com!
*** 21,24 ****
--- 25,37 ----
  /^.\${libsrc}make-docfile.*>/s!make-docfile!make-doc.exe -o ../etc/DOC!
  /^.\${libsrc}make-doc/s!>.*$!!
+ /^\${libsrc}make-docfile:/c\
+ ${libsrc}make-doc.exe:\
+ 	cd ..\
+ 	cd lib-src\
+ 	$(MAKE) ${MFLAGS} make-docfile -W make-docfile.c\
+ 	cd ..\
+ 	cd src
+ /^	cd \${libsrc}; \${MAKE} \${MFLAGS} make-docfile/d
+ /\${libsrc}make-docfile/s/-docfile[ 	]/-doc.exe /
  /^[ 	]*$/d
  /^temacs:/s/prefix-args//
diff -2rcpP --exclude=*.elc emacs-19.30/msdos/sed1v2.inp emacs-19.31/msdos/sed1v2.inp
*** emacs-19.30/msdos/sed1v2.inp	Wed Dec 31 19:00:00 1969
--- emacs-19.31/msdos/sed1v2.inp	Sat Apr 13 00:46:54 1996
***************
*** 0 ****
--- 1,25 ----
+ # -sed1v2.inp-----------------------------------------------------------
+ # Configuration script for src/makefile under DJGPP v2.x
+ # ----------------------------------------------------------------------
+ s/^#.*//
+ s/^[ \f\t][ \f\t]*$//
+ s/^ /	/
+ s/\.h\.in/.h-in/
+ /^	\.\/temacs/i\
+ 	stubedit temacs.exe minstack=40k
+ /^MAKE *=/s/^/# /
+ /^SHELL *=/s/^/# /
+ /^srcdir *=/s/@[^@\n]*@/./
+ /^VPATH *=/s/@[^@\n]*@/./
+ /^CC *=/s/@[^@\n]*@/gcc/
+ /^CPP *=/s/@[^@\n]*@/gcc -e/
+ /^CFLAGS *=/s/@[^@\n]*@/-O2 -g/
+ /^LN_S *=/s/@[^@\n]*@/ln -s/
+ /^M_FILE *=/s!@[^@\n]*@!m/intel386.h!
+ /^S_FILE *=/s!@[^@\n]*@!s/msdos.h!
+ /^@SET_MAKE@$/s/@SET_MAKE@//
+ /^.\${libsrc}make-docfile.*>/s!make-docfile!make-docfile -o ../etc/DOC!
+ /^.\${libsrc}make-doc/s!>.*$!!
+ /^[ 	]*$/d
+ /^temacs:/s/prefix-args//
+ /^	#/d
diff -2rcpP --exclude=*.elc emacs-19.30/msdos/sed2.inp emacs-19.31/msdos/sed2.inp
*** emacs-19.30/msdos/sed2.inp	Tue Aug 29 16:20:44 1995
--- emacs-19.31/msdos/sed2.inp	Fri Apr 12 11:41:25 1996
***************
*** 4,10 ****
  /^#undef LISP_FLOAT_TYPE *$/s/undef/define/
  /^#undef GNU_MALLOC *$/s/undef/define/
- # To use the djgpp malloc, deactivate the following line and active the next
  /^#undef REL_ALLOC *$/s/undef/define/
! # /^#define GNU_MALLOC *$/s/GNU_MALLOC/SYSTEM_MALLOC/
  /^#undef STDC_HEADERS *$/s/undef/define/
  /^#undef HAVE_SYS_TIMEB_H *$/s/undef/define/
--- 4,19 ----
  /^#undef LISP_FLOAT_TYPE *$/s/undef/define/
  /^#undef GNU_MALLOC *$/s/undef/define/
  /^#undef REL_ALLOC *$/s/undef/define/
! /^#undef HAVE_SYS_SELECT/i\
! #if defined(__DJGPP__) && __DJGPP__ > 1\
! /* In v2.0 and later almost everything is defined in <sys/config.h>  */\
! #include <sys/config.h>\
! #undef HAVE_SELECT\
! #undef _LIBC\
! #define HAVE_VFORK 1\
! #define HAVE_STRUCT_UTIMBUF 1\
! #define LOCALTIME_CACHE 1\
! #define HAVE_TZSET 1\
! #else /* not __DJGPP__ > 1 */
  /^#undef STDC_HEADERS *$/s/undef/define/
  /^#undef HAVE_SYS_TIMEB_H *$/s/undef/define/
***************
*** 15,18 ****
--- 24,29 ----
  /^#undef HAVE_DUP2 *$/s/undef/define/
  /^#undef HAVE_TM_ZONE *$/s/undef/define/
+ /^#undef LOCALTIME_CACHE *$/s/undef/define/
+ /^#undef HAVE_TZSET *$/s/undef/define/
  /^#undef TM_IN_SYS_TIME *$/s/undef/define/
  /^#undef TIME_WITH_SYS_TIME *$/s/undef/define/
***************
*** 26,32 ****
  /^#undef HAVE_FREXP *$/s/undef/define/
  /^#undef HAVE_FTIME *$/s/undef/define/
  /^#undef HAVE_STRERROR *$/s/undef/define/
  /^#undef HAVE_TIMEVAL *$/s/undef/define/
! /^#undef HAVE_MKTIME *$/s/undef/define/
  /^#define MULTI_FRAME *$/s/define/undef/
  s/^#define USER_FULL_NAME .*$/#define USER_FULL_NAME (getenv ("NAME"))/
--- 37,45 ----
  /^#undef HAVE_FREXP *$/s/undef/define/
  /^#undef HAVE_FTIME *$/s/undef/define/
+ /^#undef HAVE_MKTIME *$/s/undef/define/
  /^#undef HAVE_STRERROR *$/s/undef/define/
  /^#undef HAVE_TIMEVAL *$/s/undef/define/
! / HAVE_TIMEVAL/a\
! #endif /* not __DJGPP__ > 1 */
  /^#define MULTI_FRAME *$/s/define/undef/
  s/^#define USER_FULL_NAME .*$/#define USER_FULL_NAME (getenv ("NAME"))/
diff -2rcpP --exclude=*.elc emacs-19.30/msdos/sed3v2.inp emacs-19.31/msdos/sed3v2.inp
*** emacs-19.30/msdos/sed3v2.inp	Wed Dec 31 19:00:00 1969
--- emacs-19.31/msdos/sed3v2.inp	Sat Apr 13 00:46:57 1996
***************
*** 0 ****
--- 1,25 ----
+ # -sed3v2.inp-------------------------------------------------------------
+ # Configuration script for lib-src/makefile under DJGPP v2
+ # ----------------------------------------------------------------------
+ /^# DIST: /d
+ /^SHELL *=/s/^/# /
+ /^CC *=/s/=.*$/=gcc/
+ # Actually, here we should patch in the exact version number, but only
+ # [ce]tags uses it.  Don't pass it.  This is more update-resistant.
+ /-DVERSION=/s/-DVERSION="\\"\${version}\\""//
+ /^configname *=/s/=.*$/=msdos/
+ /^archlibdir *=/s!=.*$!=/emacs/bin!
+ /^bindir *=/s!=.*$!=/emacs/bin!
+ /^libdir *=/s!=.*$!=/emacs/bin!
+ /^srcdir *=/s!=.*$!=.!
+ /^VPATH *=/s!=.*$!=.!
+ /^CFLAGS *=/s!=.*$!=-O2 -g!
+ /^C_SWITCH_SYSTEM *=/s!=.*$!=-DMSDOS!
+ /^LOADLIBES *=/s!=.*$!=!
+ /^ALLOCA *=/s!=.*$!=alloca.o!
+ /^INSTALLABLES/s/emacsclient *//
+ s!^	\./!	!
+ /^UTILITIES=/s/ wakeup//
+ /^UTILITIES=/s/ movemail//
+ /^UTILITIES=/s/ emacsserver//
+ /^UTILITIES=/s/ timer//
diff -2rcpP --exclude=*.elc emacs-19.30/nt/ChangeLog emacs-19.31/nt/ChangeLog
*** emacs-19.30/nt/ChangeLog	Fri Nov 24 23:44:10 1995
--- emacs-19.31/nt/ChangeLog	Sat May 25 15:32:39 1996
***************
*** 1,2 ****
--- 1,59 ----
+ Sat May 25 15:30:10 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
+ 
+ 	* Version 19.31 released.
+ 
+ Mon May 13 17:35:11 1996  Andrew Innes  <andrewi@harlequin.co.uk>
+ 
+ 	* install.bat: Set BUILD_TYPE and INSTALL_DIR before calling make;
+ 	undo settings afterwards.
+ 
+ Wed May  8 15:28:59 1996  Andrew Innes  <andrewi@harlequin.co.uk>
+ 
+ 	* addpm.c (env_vars): Set SHELL registry entry to value of COMSPEC
+  	environment variable.
+ 
+ Fri May  3 15:02:44 1996  Andrew Innes <andrewi@harlequin.co.uk>
+ 
+ 	* install.bat: Allow for optimized build.
+ 	* makefile.def [BUILD_TYPE]: Build optimized version in its own dir.
+ 	(ARCH_CFLAGS) [BUILD_TYPE == spd]: Build optimized version.
+ 
+ Fri May  3 14:18:18 1996  Andrew Innes <andrewi@harlequin.co.uk>
+ 
+ 	* addpm.c (REG_ROOT): Don't use a trailing backslash.
+ 	(env_vars): Rename field emacs_path to emacs_dir.
+ 	(main): Add link to runemacs instead of emacs.
+ 
+ 	* install.bat: Check if INSTALL_DIR is passed as an argument.
+ 
+ 	* makefile.def (CONFIG_H) [WIN95]: Use config.nt.
+ 
+ 	* makefile.nt: Build and install runemacs.exe.
+ 
+ 	* runemacs.c: New file.
+ 
+ 	* config.w95: File removed.
+ 
+ 	* inc/netdb.h, inc/unistd.h, inc/arpa/inet.h, inc/netinet/in.h,
+ 	inc/sys/socket.h, inc/sys/time.h: New header files.
+ 
+ 	* inc/sys/file.h (F_OK, X_OK, W_OK, R_OK): New macros.
+ 	
+ Wed Mar 27 23:37:07 1996  Geoff Voelker  <voelker@cs.washington.edu>
+ 
+ 	* makefile.def (DEL): Defined.
+ 	(DEL_TREE) [win95]: Defined.
+ 	(SYS_LDFLAGS): Set executable versions to 3.10.
+ 	
+ 	* makefile.nt: Change uses of del to $(DEL).
+ 
+ Wed Jan 17 14:48:00 1996  Erik Naggum  <erik@naggum.no>
+ 
+ 	* All files: Update FSF's address in comment preamble.
+ 
+ Wed Jan  3 22:10:17 1996  George V. Reilly  <georger@microcrafts.com>
+ 
+ 	* emacs.ico: Now the proverbial kitchen sink icon.
+ 
  Fri Nov 24 23:44:08 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
diff -2rcpP --exclude=*.elc emacs-19.30/nt/addpm.c emacs-19.31/nt/addpm.c
*** emacs-19.30/nt/addpm.c	Tue Nov  7 02:54:42 1995
--- emacs-19.31/nt/addpm.c	Wed May  8 13:49:55 1996
***************
*** 2,21 ****
     Copyright (C) 1995 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.
! */
  
  /****************************************************************************
--- 2,21 ----
     Copyright (C) 1995 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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /****************************************************************************
*************** DdeCallback (UINT uType, UINT uFmt, HCON
*** 45,49 ****
  		              CF_TEXT, XTYP_EXECUTE, 30000, NULL)
  
! #define REG_ROOT "SOFTWARE\\GNU\\Emacs\\"
  
  static struct entry
--- 45,49 ----
  		              CF_TEXT, XTYP_EXECUTE, 30000, NULL)
  
! #define REG_ROOT "SOFTWARE\\GNU\\Emacs"
  
  static struct entry
*************** static struct entry
*** 54,65 ****
  env_vars[] = 
  {
!   {"emacs_path", NULL},
!   {"EMACSLOADPATH", "%emacs_path%\\lisp"},
!   {"SHELL", "cmd"},
!   {"EMACSDATA", "%emacs_path%\\etc"},
!   {"EMACSPATH", "%emacs_path%\\bin"},
!   {"EMACSLOCKDIR", "%emacs_path%\\lock"},
!   {"INFOPATH", "%emacs_path%\\info"},
!   {"EMACSDOC", "%emacs_path%\\etc"},
    {"TERM", "cmd"}
  };
--- 54,65 ----
  env_vars[] = 
  {
!   {"emacs_dir", NULL},
!   {"EMACSLOADPATH", "%emacs_dir%\\lisp"},
!   {"SHELL", "%COMSPEC%"},
!   {"EMACSDATA", "%emacs_dir%\\etc"},
!   {"EMACSPATH", "%emacs_dir%\\bin"},
!   {"EMACSLOCKDIR", "%emacs_dir%\\lock"},
!   {"INFOPATH", "%emacs_dir%\\info"},
!   {"EMACSDOC", "%emacs_dir%\\etc"},
    {"TERM", "cmd"}
  };
*************** main (argc, argv)
*** 129,133 ****
        DdeCommand ("[CreateGroup (Gnu Emacs)]");
        DdeCommand ("[ReplaceItem (Emacs)]");
!       sprintf (additem, "[AddItem (%s\\bin\\emacs.%s, Emacs%c%s)]",
  	       argv[1], lpext, (argc>2 ? ',' : ' '),
  	       (argc>2 ? argv[2] : ""));
--- 129,133 ----
        DdeCommand ("[CreateGroup (Gnu Emacs)]");
        DdeCommand ("[ReplaceItem (Emacs)]");
!       sprintf (additem, "[AddItem (%s\\bin\\runemacs.%s, Emacs%c%s)]",
  	       argv[1], lpext, (argc>2 ? ',' : ' '),
  	       (argc>2 ? argv[2] : ""));
diff -2rcpP --exclude=*.elc emacs-19.30/nt/config.h emacs-19.31/nt/config.h
*** emacs-19.30/nt/config.h	Wed Dec 31 19:00:00 1969
--- emacs-19.31/nt/config.h	Mon Jan 15 03:32:40 1996
***************
*** 0 ****
--- 1,319 ----
+ /* GNU Emacs site configuration template file.  -*- C -*-
+    Copyright (C) 1988, 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, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.  */
+ 
+ 
+ /* No code in Emacs #includes config.h twice, but some of the code
+    intended to work with other packages as well (like gmalloc.c) 
+    think they can include it as many times as they like.  */
+ #ifndef EMACS_CONFIG_H
+ #define EMACS_CONFIG_H
+ 
+ 
+ /* These are all defined in the top-level Makefile by configure.
+    They're here only for reference.  */
+ 
+ /* Define LISP_FLOAT_TYPE if you want emacs to support floating-point
+    numbers. */
+ #undef LISP_FLOAT_TYPE
+ 
+ /* Define GNU_MALLOC if you want to use the *new* GNU memory allocator. */
+ #undef GNU_MALLOC
+ 
+ /* Define REL_ALLOC if you want to use the relocating allocator for
+    buffer space. */
+ #undef REL_ALLOC
+   
+ /* Define HAVE_X_WINDOWS if you want to use the X window system.  */
+ #undef HAVE_X_WINDOWS
+ 
+ /* Define HAVE_X11 if you want to use version 11 of X windows.
+    Otherwise, Emacs expects to use version 10.  */
+ #undef HAVE_X11
+ 
+ /* Define if using an X toolkit.  */
+ #undef USE_X_TOOLKIT
+ 
+ /* Define this if you're using XFree386.  */
+ #undef HAVE_XFREE386
+ 
+ /* Define HAVE_X_MENU if you want to use the X window menu system.
+    This appears to work on some machines that support X
+    and not on others.  */
+ #undef HAVE_X_MENU
+ 
+ /* Define if we have the X11R6 or newer version of Xt.  */
+ #undef HAVE_X11XTR6
+ 
+ /* Define if netdb.h declares h_errno.  */
+ #undef HAVE_H_ERRNO
+ 
+ /* Nowadays we have frame objects even if we support only ASCII terminals.  */
+ #define MULTI_FRAME
+ 
+ /* If we're using any sort of window system, define some consequences.  */
+ #ifdef HAVE_X_WINDOWS
+ #define MULTI_KBOARD
+ #define HAVE_FACES
+ #define HAVE_MOUSE
+ #endif
+ 
+ /* Define USE_TEXT_PROPERTIES to support visual and other properties
+    on text. */
+ #define USE_TEXT_PROPERTIES
+ 
+ /* Define USER_FULL_NAME to return a string
+    that is the user's full name.
+    It can assume that the variable `pw'
+    points to the password file entry for this user.
+ 
+    At some sites, the pw_gecos field contains
+    the user's full name.  If neither this nor any other
+    field contains the right thing, use pw_name,
+    giving the user's login name, since that is better than nothing.  */
+ #define USER_FULL_NAME pw->pw_gecos
+ 
+ /* Define AMPERSAND_FULL_NAME if you use the convention
+    that & in the full name stands for the login id.  */
+ #undef AMPERSAND_FULL_NAME
+ 
+ /* Things set by --with options in the configure script.  */
+ 
+ /* Define to support POP mail retrieval.  */
+ #undef MAIL_USE_POP
+ 
+ /* Define to support Kerberos-authenticated POP mail retrieval.  */
+ #undef KERBEROS
+ 
+ /* Define to support using a Hesiod database to find the POP server.  */
+ #undef HESIOD
+ 
+ /* Some things figured out by the configure script, grouped as they are in
+    configure.in.  */
+ #ifndef _ALL_SOURCE  /* suppress warning if this is pre-defined */
+ #undef _ALL_SOURCE
+ #endif
+ #undef HAVE_SYS_SELECT_H
+ #undef HAVE_SYS_TIMEB_H
+ #undef HAVE_SYS_TIME_H
+ #undef HAVE_UNISTD_H
+ #undef HAVE_UTIME_H
+ #undef STDC_HEADERS
+ #undef TIME_WITH_SYS_TIME
+ 
+ #undef HAVE_LIBDNET
+ #undef HAVE_LIBRESOLV
+ 
+ #undef HAVE_ALLOCA_H
+ 
+ #undef HAVE_GETTIMEOFDAY
+ #undef HAVE_GETHOSTNAME
+ #undef HAVE_DUP2
+ #undef HAVE_RENAME
+ #undef HAVE_CLOSEDIR
+ 
+ #undef TM_IN_SYS_TIME
+ #undef HAVE_TM_ZONE
+ #undef HAVE_TZNAME
+ 
+ #undef const
+ 
+ #undef HAVE_LONG_FILE_NAMES
+ 
+ #undef CRAY_STACKSEG_END
+ 
+ #undef UNEXEC_SRC
+ 
+ #undef HAVE_LIBXBSD
+ #undef HAVE_XRMSETDATABASE
+ #undef HAVE_XSCREENRESOURCESTRING
+ #undef HAVE_XSCREENNUMBEROFSCREEN
+ #undef HAVE_XSETWMPROTOCOLS
+ 
+ #undef HAVE_MKDIR
+ #undef HAVE_RMDIR
+ #undef HAVE_RANDOM
+ #undef HAVE_LRAND48
+ #undef HAVE_BCOPY
+ #undef HAVE_BCMP
+ #undef HAVE_LOGB
+ #undef HAVE_FREXP
+ #undef HAVE_FMOD
+ #undef HAVE_FTIME
+ #undef HAVE_RES_INIT /* For -lresolv on Suns.  */
+ #undef HAVE_SETSID
+ #undef HAVE_FPATHCONF
+ #undef HAVE_SELECT
+ #undef HAVE_MKTIME
+ #undef HAVE_EACCESS
+ #undef HAVE_GETPAGESIZE
+ #undef HAVE_INET_SOCKETS
+ 
+ #undef HAVE_AIX_SMT_EXP
+ 
+ /* Define if you have the ANSI `strerror' function.
+    Otherwise you must have the variable `char *sys_errlist[]'.  */
+ #undef HAVE_STRERROR
+ 
+ #undef HAVE_UTIMES
+ 
+ /* Define if `sys_siglist' is declared by <signal.h>.  */
+ #undef SYS_SIGLIST_DECLARED
+ 
+ /* Define if `struct utimbuf' is declared by <utime.h>.  */
+ #undef HAVE_STRUCT_UTIMBUF
+ 
+ /* Define if `struct timeval' is declared by <sys/time.h>.  */
+ #undef HAVE_TIMEVAL
+ 
+ /* If using GNU, then support inline function declarations. */
+ #ifdef __GNUC__
+ #define INLINE __inline__
+ #else
+ #define INLINE
+ #endif
+ 
+ #undef EMACS_CONFIGURATION
+ 
+ #undef EMACS_CONFIG_OPTIONS
+ 
+ /* The configuration script defines opsysfile to be the name of the
+    s/SYSTEM.h file that describes the system type you are using.  The file
+    is chosen based on the configuration name you give.
+ 
+    See the file ../etc/MACHINES for a list of systems and the
+    configuration names to use for them.
+ 
+    See s/template.h for documentation on writing s/SYSTEM.h files.  */
+ #undef config_opsysfile 
+ #include "s/windowsnt.h"
+ 
+ /* The configuration script defines machfile to be the name of the
+    m/MACHINE.h file that describes the machine you are using.  The file is
+    chosen based on the configuration name you give.
+ 
+    See the file ../etc/MACHINES for a list of machines and the
+    configuration names to use for them.
+ 
+    See m/template.h for documentation on writing m/MACHINE.h files.  */
+ #undef config_machfile
+ #include "m/intel386.h"
+ 
+ /* These typedefs shouldn't appear when alloca.s or Makefile.in
+    includes config.h.  */
+ #ifndef NOT_C_CODE
+ #ifndef SPECIAL_EMACS_INT
+ typedef long EMACS_INT;
+ typedef unsigned long EMACS_UINT;
+ #endif
+ #endif
+ 
+ /* Load in the conversion definitions if this system
+    needs them and the source file being compiled has not
+    said to inhibit this.  There should be no need for you
+    to alter these lines.  */
+ 
+ #ifdef SHORTNAMES
+ #ifndef NO_SHORTNAMES
+ #include "../shortnames/remap.h"
+ #endif /* not NO_SHORTNAMES */
+ #endif /* SHORTNAMES */
+ 
+ /* If no remapping takes place, static variables cannot be dumped as
+    pure, so don't worry about the `static' keyword. */
+ #ifdef NO_REMAP
+ #undef static
+ #endif
+ 
+ /* Define `subprocesses' should be defined if you want to
+    have code for asynchronous subprocesses
+    (as used in M-x compile and M-x shell).
+    These do not work for some USG systems yet;
+    for the ones where they work, the s/SYSTEM.h file defines this flag.  */
+ 
+ #ifndef VMS
+ #ifndef USG
+ /* #define subprocesses */
+ #endif
+ #endif
+ 
+ /* Define LD_SWITCH_SITE to contain any special flags your loader may need.  */
+ #undef LD_SWITCH_SITE
+ 
+ /* Define C_SWITCH_SITE to contain any special flags your compiler needs.  */
+ #undef C_SWITCH_SITE
+ 
+ /* Define LD_SWITCH_X_SITE to contain any special flags your loader
+    may need to deal with X Windows.  For instance, if you've defined
+    HAVE_X_WINDOWS above and your X libraries aren't in a place that
+    your loader can find on its own, you might want to add "-L/..." or
+    something similar.  */
+ #undef LD_SWITCH_X_SITE
+ 
+ /* Define LD_SWITCH_X_SITE_AUX with an -R option
+    in case it's needed (for Solaris, for example).  */
+ #undef LD_SWITCH_X_SITE_AUX
+ 
+ /* Define C_SWITCH_X_SITE to contain any special flags your compiler
+    may need to deal with X Windows.  For instance, if you've defined
+    HAVE_X_WINDOWS above and your X include files aren't in a place
+    that your compiler can find on its own, you might want to add
+    "-I/..." or something similar.  */
+ #undef C_SWITCH_X_SITE
+ 
+ /* Define STACK_DIRECTION here, but not if m/foo.h did.  */
+ #ifndef STACK_DIRECTION
+ #undef STACK_DIRECTION
+ #endif
+ 
+ /* Define the return type of signal handlers if the s-xxx file
+    did not already do so.  */
+ #define RETSIGTYPE void
+ 
+ /* SIGTYPE is the macro we actually use.  */
+ #ifndef SIGTYPE
+ #define SIGTYPE RETSIGTYPE
+ #endif
+ 
+ /* The rest of the code currently tests the CPP symbol BSTRING.
+    Override any claims made by the system-description files.
+    Note that on some SCO version it is possible to have bcopy and not bcmp.  */
+ #undef BSTRING
+ #if defined (HAVE_BCOPY) && defined (HAVE_BCMP)
+ #define BSTRING
+ #endif
+ 
+ /* Non-ANSI C compilers usually don't have volatile.  */
+ #ifndef HAVE_VOLATILE
+ #ifndef __STDC__
+ #define volatile
+ #endif
+ #endif
+ 
+ /* 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.
+ 
+    This declaration shouldn't appear when alloca.s or Makefile.in
+    includes config.h.  */
+ #ifndef NOT_C_CODE
+ extern char *getenv ();
+ #endif
+ 
+ #endif /* EMACS_CONFIG_H */
diff -2rcpP --exclude=*.elc emacs-19.30/nt/config.nt emacs-19.31/nt/config.nt
*** emacs-19.30/nt/config.nt	Tue Nov  7 02:54:45 1995
--- emacs-19.31/nt/config.nt	Mon Jan 15 03:32:46 1996
***************
*** 4,21 ****
  This file is part of GNU Emacs.
  
  GNU Emacs is distributed in the hope that it will be useful,
! but WITHOUT ANY WARRANTY.  No author or distributor
! accepts responsibility to anyone for the consequences of using it
! or for whether it serves any particular purpose or works at all,
! unless he says so in writing.  Refer to the GNU Emacs General Public
! License for full details.
  
! Everyone is granted permission to copy, modify and redistribute
! GNU Emacs, but only under the conditions described in the
! GNU Emacs General Public License.   A copy of this license is
! supposed to have been given to you along with GNU Emacs so you
! can know your rights and responsibilities.  It should be in a
! file named COPYING.  Among other things, the copyright notice
! and this notice must be preserved on all copies.  */
  
  
--- 4,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
Binary files emacs-19.30/nt/emacs.ico and emacs-19.31/nt/emacs.ico differ
diff -2rcpP --exclude=*.elc emacs-19.30/nt/inc/arpa/inet.h emacs-19.31/nt/inc/arpa/inet.h
*** emacs-19.30/nt/inc/arpa/inet.h	Wed Dec 31 19:00:00 1969
--- emacs-19.31/nt/inc/arpa/inet.h	Fri May  3 12:36:09 1996
***************
*** 0 ****
--- 1 ----
+ /* null version of <arpa/inet.h> - <sys/socket.h> has everything */
diff -2rcpP --exclude=*.elc emacs-19.30/nt/inc/netdb.h emacs-19.31/nt/inc/netdb.h
*** emacs-19.30/nt/inc/netdb.h	Wed Dec 31 19:00:00 1969
--- emacs-19.31/nt/inc/netdb.h	Fri May  3 12:36:09 1996
***************
*** 0 ****
--- 1 ----
+ /* null version of <netdb.h> - <sys/socket.h> has everything */
diff -2rcpP --exclude=*.elc emacs-19.30/nt/inc/netinet/in.h emacs-19.31/nt/inc/netinet/in.h
*** emacs-19.30/nt/inc/netinet/in.h	Wed Dec 31 19:00:00 1969
--- emacs-19.31/nt/inc/netinet/in.h	Fri May  3 12:36:09 1996
***************
*** 0 ****
--- 1 ----
+ /* null version of <netinet/in.h> - <sys/socket.h> has everything */
diff -2rcpP --exclude=*.elc emacs-19.30/nt/inc/sys/file.h emacs-19.31/nt/inc/sys/file.h
*** emacs-19.30/nt/inc/sys/file.h	Mon May  8 22:12:09 1995
--- emacs-19.31/nt/inc/sys/file.h	Fri May  3 14:15:47 1996
***************
*** 1,5 ****
  /*
!  * sys\file.h doesn't exist on NT...rather than including it conditionally
!  * in some of the source files, we just extend the include path so that the
!  * compiler will pick up this empty header instead.
   */
--- 1,8 ----
  /*
!  * sys\file.h doesn't exist on NT - only needed for these constants
   */
+ 
+ #define F_OK 0
+ #define X_OK 1
+ #define W_OK 2
+ #define R_OK 4
diff -2rcpP --exclude=*.elc emacs-19.30/nt/inc/sys/socket.h emacs-19.31/nt/inc/sys/socket.h
*** emacs-19.30/nt/inc/sys/socket.h	Wed Dec 31 19:00:00 1969
--- emacs-19.31/nt/inc/sys/socket.h	Fri May  3 12:36:09 1996
***************
*** 0 ****
--- 1,119 ----
+ /* Workable version of <sys/socket.h> based on winsock.h */
+ 
+ #ifndef _SOCKET_H_
+ #define _SOCKET_H_
+ 
+ /* defeat the multiple include protection */
+ #ifdef _WINSOCKAPI_
+ #undef _WINSOCKAPI_
+ #endif
+ 
+ /* avoid confusion with our version of select */
+ #ifdef select
+ #undef select
+ #define MUST_REDEF_SELECT
+ #endif
+ 
+ /* avoid clashing with our version of FD_SET if already defined */
+ #ifdef FD_SET
+ #undef FD_SET
+ #undef FD_CLR
+ #undef FD_ISSET
+ #undef FD_ZERO
+ #endif
+ 
+ /* allow us to provide our own version of fd_set */
+ #define fd_set ws_fd_set
+ 
+ /* avoid duplicate definition of timeval */
+ #ifdef HAVE_TIMEVAL
+ #define timeval ws_timeval
+ #endif
+ 
+ #include <winsock.h>
+ 
+ /* redefine select to reference our version */
+ #ifdef MUST_REDEF_SELECT
+ #define select sys_select
+ #undef MUST_REDEF_SELECT
+ #endif
+ 
+ /* revert to our version of FD_SET */
+ #undef FD_SET
+ #undef FD_CLR
+ #undef FD_ISSET
+ #undef FD_ZERO
+ #undef fd_set
+ #include "nt.h"
+ 
+ #ifdef HAVE_TIMEVAL
+ #undef timeval
+ #endif
+ 
+ /* shadow functions where we provide our own wrapper */
+ #define socket         sys_socket
+ #define bind           sys_bind
+ #define connect        sys_connect
+ #define htons          sys_htons
+ #define ntohs          sys_ntohs
+ #define inet_addr      sys_inet_addr
+ #define gethostname    sys_gethostname
+ #define gethostbyname  sys_gethostbyname
+ #define getservbyname  sys_getservbyname
+ 
+ int sys_socket(int af, int type, int protocol);
+ int sys_bind (int s, const struct sockaddr *addr, int namelen);
+ int sys_connect (int s, const struct sockaddr *addr, int namelen);
+ u_short sys_htons (u_short hostshort);
+ u_short sys_ntohs (u_short netshort);
+ unsigned long sys_inet_addr (const char * cp);
+ int sys_gethostname (char * name, int namelen);
+ struct hostent * sys_gethostbyname(const char * name);
+ struct servent * sys_getservbyname(const char * name, const char * proto);
+ 
+ /* we are providing a real h_errno variable */
+ #undef h_errno
+ extern int h_errno;
+ 
+ /* map winsock error codes to standard names */
+ #define EWOULDBLOCK             WSAEWOULDBLOCK
+ #define EINPROGRESS             WSAEINPROGRESS
+ #define EALREADY                WSAEALREADY
+ #define ENOTSOCK                WSAENOTSOCK
+ #define EDESTADDRREQ            WSAEDESTADDRREQ
+ #define EMSGSIZE                WSAEMSGSIZE
+ #define EPROTOTYPE              WSAEPROTOTYPE
+ #define ENOPROTOOPT             WSAENOPROTOOPT
+ #define EPROTONOSUPPORT         WSAEPROTONOSUPPORT
+ #define ESOCKTNOSUPPORT         WSAESOCKTNOSUPPORT
+ #define EOPNOTSUPP              WSAEOPNOTSUPP
+ #define EPFNOSUPPORT            WSAEPFNOSUPPORT
+ #define EAFNOSUPPORT            WSAEAFNOSUPPORT
+ #define EADDRINUSE              WSAEADDRINUSE
+ #define EADDRNOTAVAIL           WSAEADDRNOTAVAIL
+ #define ENETDOWN                WSAENETDOWN
+ #define ENETUNREACH             WSAENETUNREACH
+ #define ENETRESET               WSAENETRESET
+ #define ECONNABORTED            WSAECONNABORTED
+ #define ECONNRESET              WSAECONNRESET
+ #define ENOBUFS                 WSAENOBUFS
+ #define EISCONN                 WSAEISCONN
+ #define ENOTCONN                WSAENOTCONN
+ #define ESHUTDOWN               WSAESHUTDOWN
+ #define ETOOMANYREFS            WSAETOOMANYREFS
+ #define ETIMEDOUT               WSAETIMEDOUT
+ #define ECONNREFUSED            WSAECONNREFUSED
+ #define ELOOP                   WSAELOOP
+ /* #define ENAMETOOLONG            WSAENAMETOOLONG */
+ #define EHOSTDOWN               WSAEHOSTDOWN
+ #define EHOSTUNREACH            WSAEHOSTUNREACH
+ /* #define ENOTEMPTY               WSAENOTEMPTY */
+ #define EPROCLIM                WSAEPROCLIM
+ #define EUSERS                  WSAEUSERS
+ #define EDQUOT                  WSAEDQUOT
+ #define ESTALE                  WSAESTALE
+ #define EREMOTE                 WSAEREMOTE
+ 
+ #endif /* _SOCKET_H_ */
+ 
+ /* end of socket.h */
diff -2rcpP --exclude=*.elc emacs-19.30/nt/inc/sys/time.h emacs-19.31/nt/inc/sys/time.h
*** emacs-19.30/nt/inc/sys/time.h	Wed Dec 31 19:00:00 1969
--- emacs-19.31/nt/inc/sys/time.h	Fri May  3 12:36:09 1996
***************
*** 0 ****
--- 1,18 ----
+ /*
+  * sys/time.h doesn't exist on NT
+  */
+ 
+ struct timeval 
+   {
+     long tv_sec;	/* seconds */
+     long tv_usec;	/* microseconds */
+   };
+ struct timezone 
+   {
+     int	tz_minuteswest;	/* minutes west of Greenwich */
+     int	tz_dsttime;	/* type of dst correction */
+   };
+ 
+ void gettimeofday (struct timeval *, struct timezone *);
+ 
+ /* end of sys/time.h */
diff -2rcpP --exclude=*.elc emacs-19.30/nt/inc/unistd.h emacs-19.31/nt/inc/unistd.h
*** emacs-19.30/nt/inc/unistd.h	Wed Dec 31 19:00:00 1969
--- emacs-19.31/nt/inc/unistd.h	Fri May  3 12:36:09 1996
***************
*** 0 ****
--- 1 ----
+ /* Fake unistd.h: config.h already provides most of the relevant things. */
diff -2rcpP --exclude=*.elc emacs-19.30/nt/install.bat emacs-19.31/nt/install.bat
*** emacs-19.30/nt/install.bat	Sat May 27 22:14:32 1995
--- emacs-19.31/nt/install.bat	Mon May 13 14:19:24 1996
***************
*** 1 ****
! nmake -f makefile.nt install
--- 1,7 ----
! @echo off
! if (%1) == (speed) set BUILD_TYPE=spd
! if (%1) == (speed) shift
! if not (%1) == () set INSTALL_DIR=%1
! nmake -f makefile.nt install
! set INSTALL_DIR=
! set BUILD_TYPE=
diff -2rcpP --exclude=*.elc emacs-19.30/nt/makefile.def emacs-19.31/nt/makefile.def
*** emacs-19.30/nt/makefile.def	Wed Nov 22 13:52:51 1995
--- emacs-19.31/nt/makefile.def	Fri May  3 15:00:15 1996
***************
*** 14,18 ****
  #  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)         9-6-94
--- 14,19 ----
  #  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, Inc., 59 Temple Place - Suite 330,
! #  Boston, MA 02111-1307, USA.
  #
  #     Geoff Voelker (voelker@cs.washington.edu)         9-6-94
*************** ARCH		= ppc
*** 81,85 ****
  ARCH		= i386
  CPU		= i386
! CONFIG_H	= config.w95
  OS_TYPE		= win95
  !endif
--- 82,86 ----
  ARCH		= i386
  CPU		= i386
! CONFIG_H	= config.nt
  OS_TYPE		= win95
  !endif
*************** BASE_LIBS	= $(libc) $(baselibs)
*** 126,130 ****
  SYS_LDFLAGS	= 
  !else
! SYS_LDFLAGS	= -pdb:none -release -incremental:no
  !endif
  
--- 127,131 ----
  SYS_LDFLAGS	= 
  !else
! SYS_LDFLAGS	= -pdb:none -release -incremental:no -version:3.10
  !endif
  
*************** CFLAGS          = $(CFLAGS) -DHAVE_NTGUI
*** 140,144 ****
--- 141,149 ----
  !endif
  
+ !ifdef BUILD_TYPE
+ OBJDIR          = obj-$(BUILD_TYPE)
+ !else
  OBJDIR          = obj
+ !endif
  $(OBJDIR):;	-mkdir $(OBJDIR)
  BLD             = $(OBJDIR)\$(ARCH)
*************** CP		= copy
*** 149,154 ****
--- 154,165 ----
  CP_DIR		= xcopy /f/r/i/e/d
  
+ !if "$(OS_TYPE)" == "win95"
+ DEL		= deltree /y
+ DEL_TREE	= deltree /y
+ !else
+ DEL		= del
  # This is completely braindamaged, but it's the only routine known to be there
  DEL_TREE	= echo y | rmdir /s
+ !endif
  
  # The location of the icon file
*************** ADDPM		= ..\nt\$(BLD)\addpm.exe
*** 159,163 ****
--- 170,178 ----
  
  !if "$(ARCH)" == "i386"
+ !if "$(BUILD_TYPE)" == "spd"
+ ARCH_CFLAGS     = -nologo -D_X86_=1 -c -Zel -W2 -H63 -O2b2 -G5d -Zi
+ !else
  ARCH_CFLAGS     = -nologo -D_X86_=1 -c -Zel -W2 -H63 -G3d -Zi -Od
+ !endif
  ARCH_LDFLAGS	= -align:0x1000 $(SYS_LDFLAGS)
  
diff -2rcpP --exclude=*.elc emacs-19.30/nt/makefile.nt emacs-19.31/nt/makefile.nt
*** emacs-19.30/nt/makefile.nt	Wed Nov 22 13:52:47 1995
--- emacs-19.31/nt/makefile.nt	Fri May  3 14:15:42 1996
***************
*** 16,20 ****
  #  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)	11-20-93
--- 16,21 ----
  #  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, Inc., 59 Temple Place - Suite 330,
! #  Boston, MA 02111-1307, USA.
  #
  #   Geoff Voelker (voelker@cs.washington.edu)	11-20-93
***************
*** 22,26 ****
  !include makefile.def
  
! ALL		= $(BLD)\addpm.exe
  
  .c{$(BLD)}.obj:
--- 23,32 ----
  !include makefile.def
  
! ALL		= $(BLD)\addpm.exe $(BLD)\runemacs.exe
! !if $(MSVCNT11)
! TRES		= $(BLD)\emacs.res
! !else
! TRES		= $(BLD)\emacs.rbj
! !endif
  
  .c{$(BLD)}.obj:
*************** $(BLD)\addpm.exe: $(BLD)\addpm.obj
*** 33,36 ****
--- 39,58 ----
  		  $(SYS_LDFLAGS) $** $(BASE_LIBS) $(ADVAPI32) user32.lib
  
+ #
+ # The resource file.  NT 3.10 requires the use of cvtres; even though
+ # it is not necessary on later versions, it is still ok to use it.
+ #
+ $(TRES):	emacs.rc
+ 		$(RC) -Fo$(BLD)\emacs.res $**
+ !if !$(MSVCNT11)
+ 		$(CVTRES) -r -$(ARCH) -o $@ $(BLD)\emacs.res
+ !endif
+ 
+ runemacs:	  $(BLD) $(BLD)\runemacs.exe
+ $(BLD)\runemacs.obj: runemacs.c
+ $(BLD)\runemacs.exe: $(BLD)\runemacs.obj $(TRES)
+ 		  $(LINK) -out:$@ -subsystem:windows -entry:WinMainCRTStartup \
+ 		  $(SYS_LDFLAGS) $** $(BASE_LIBS) $(ADVAPI32) user32.lib
+ 
  # Since Windows 95 does not support multiple commands on one command line
  # (e.g., in for loops), we cannot use for loops any more.
*************** install:	all emacs.bat
*** 71,81 ****
  		cd ..\nt		
  		- $(CP) emacs.bat $(INSTALL_DIR)\bin
  		- $(ADDPM) $(INSTALL_DIR)
! 		- del ..\same-dir.tst
! 		- del $(INSTALL_DIR)\same-dir.tst
  		echo SameDirTest > $(INSTALL_DIR)\same-dir.tst
  		if not exist ..\same-dir.tst $(MAKE) -f makefile.nt real_install
! 		- del ..\same-dir.tst
! 		- del $(INSTALL_DIR)\same-dir.tst
  
  #
--- 93,105 ----
  		cd ..\nt		
  		- $(CP) emacs.bat $(INSTALL_DIR)\bin
+ 		- $(CP) $(BLD)\addpm.exe $(INSTALL_DIR)\bin
+ 		- $(CP) $(BLD)\runemacs.exe $(INSTALL_DIR)\bin
  		- $(ADDPM) $(INSTALL_DIR)
! 		- $(DEL) ..\same-dir.tst
! 		- $(DEL) $(INSTALL_DIR)\same-dir.tst
  		echo SameDirTest > $(INSTALL_DIR)\same-dir.tst
  		if not exist ..\same-dir.tst $(MAKE) -f makefile.nt real_install
! 		- $(DEL) ..\same-dir.tst
! 		- $(DEL) $(INSTALL_DIR)\same-dir.tst
  
  #
*************** fast_install:
*** 88,93 ****
  		- mkdir $(INSTALL_DIR)\bin
  		- $(CP) emacs.bat $(INSTALL_DIR)\bin
! 		- del ..\same-dir.tst
! 		- del $(INSTALL_DIR)\same-dir.tst
  		echo SameDirTest > $(INSTALL_DIR)\same-dir.tst
  		if not exist ..\same-dir.tst $(CP) ..\bin\emacs.exe $(INSTALL_DIR)\bin
--- 112,119 ----
  		- mkdir $(INSTALL_DIR)\bin
  		- $(CP) emacs.bat $(INSTALL_DIR)\bin
! 		- $(CP) $(BLD)\addpm.exe $(INSTALL_DIR)\bin
! 		- $(CP) $(BLD)\runemacs.exe $(INSTALL_DIR)\bin
! 		- $(DEL) ..\same-dir.tst
! 		- $(DEL) $(INSTALL_DIR)\same-dir.tst
  		echo SameDirTest > $(INSTALL_DIR)\same-dir.tst
  		if not exist ..\same-dir.tst $(CP) ..\bin\emacs.exe $(INSTALL_DIR)\bin
*************** fast_install:
*** 95,104 ****
  		if not exist ..\same-dir.tst $(CP) ..\bin\ctags.exe $(INSTALL_DIR)\bin
  		if not exist ..\same-dir.tst nmake -f $(MAKE) real_install
! 		- del ..\same-dir.tst
! 		- del $(INSTALL_DIR)\same-dir.tst
  
  real_install:
! 		- del ..\same-dir.tst
! 		- del $(INSTALL_DIR)\same-dir.tst
  		echo SameDirTest > $(INSTALL_DIR)\same-dir.tst
  		- mkdir $(INSTALL_DIR)\etc
--- 121,130 ----
  		if not exist ..\same-dir.tst $(CP) ..\bin\ctags.exe $(INSTALL_DIR)\bin
  		if not exist ..\same-dir.tst nmake -f $(MAKE) real_install
! 		- $(DEL) ..\same-dir.tst
! 		- $(DEL) $(INSTALL_DIR)\same-dir.tst
  
  real_install:
! 		- $(DEL) ..\same-dir.tst
! 		- $(DEL) $(INSTALL_DIR)\same-dir.tst
  		echo SameDirTest > $(INSTALL_DIR)\same-dir.tst
  		- mkdir $(INSTALL_DIR)\etc
*************** real_install:
*** 108,113 ****
  		if not exist ..\same-dir.tst $(CP_DIR) ..\etc $(INSTALL_DIR)\etc
  		if not exist ..\same-dir.tst $(CP_DIR) ..\info $(INSTALL_DIR)\info
! 		- del ..\same-dir.tst
! 		- del $(INSTALL_DIR)\same-dir.tst
  
  #
--- 134,139 ----
  		if not exist ..\same-dir.tst $(CP_DIR) ..\etc $(INSTALL_DIR)\etc
  		if not exist ..\same-dir.tst $(CP_DIR) ..\info $(INSTALL_DIR)\info
! 		- $(DEL) ..\same-dir.tst
! 		- $(DEL) $(INSTALL_DIR)\same-dir.tst
  
  #
*************** real_install:
*** 115,125 ****
  # 
  CLEAN_CMD	= $(MAKE) -f makefile.nt clean
! clean:;		- del /s *~ *.pdb
  		- $(DEL_TREE) deleted
  		- $(DEL_TREE) obj
  		- $(DEL_TREE) ..\bin
! 		- del ..\etc\DOC
! 		- del ..\etc\DOC-X
! 		- del emacs.bat
  		cd ..\lib-src
  		$(CLEAN_CMD)
--- 141,150 ----
  # 
  CLEAN_CMD	= $(MAKE) -f makefile.nt clean
! clean:;		- $(DEL) *~ *.pdb
  		- $(DEL_TREE) deleted
  		- $(DEL_TREE) obj
  		- $(DEL_TREE) ..\bin
! 		- $(DEL) ..\etc\DOC ..\etc\DOC-X
! 		- $(DEL) emacs.bat
  		cd ..\lib-src
  		$(CLEAN_CMD)
diff -2rcpP --exclude=*.elc emacs-19.30/nt/runemacs.c emacs-19.31/nt/runemacs.c
*** emacs-19.30/nt/runemacs.c	Wed Dec 31 19:00:00 1969
--- emacs-19.31/nt/runemacs.c	Fri May  3 12:34:26 1996
***************
*** 0 ****
--- 1,80 ----
+ /*
+   Simple program to start Emacs with its console window hidden.
+ 
+   This program is provided purely for convenience, since most users will
+   use Emacs in windowing (GUI) mode, and will not want to have an extra
+   console window lying around.  */
+ 
+ #define WIN32
+ 
+ #include <windows.h>
+ #include <string.h>
+ #include <malloc.h>
+ 
+ int WINAPI
+ WinMain (HINSTANCE hSelf, HINSTANCE hPrev, LPSTR cmdline, int nShow)
+ {
+   STARTUPINFO start;
+   SECURITY_ATTRIBUTES sec_attrs;
+   SECURITY_DESCRIPTOR sec_desc;
+   PROCESS_INFORMATION child;
+   int wait_for_child = FALSE;
+   DWORD ret_code = 0;
+   char * new_cmdline;
+   char * p;
+   char modname[MAX_PATH];
+ 
+   if (!GetModuleFileName (NULL, modname, MAX_PATH))
+     goto error;
+   if ((p = strrchr (modname, '\\')) == NULL)
+     goto error;
+   *p = 0;
+ 
+   new_cmdline = alloca (MAX_PATH + strlen (cmdline) + 1);
+   strcpy (new_cmdline, modname);
+   strcat (new_cmdline, "\\emacs.exe ");
+ 
+   /* append original arguments if any; first look for -wait as first
+      argument, and apply that ourselves */
+   if (strncmp (cmdline, "-wait", 5) == 0)
+   {
+     wait_for_child = TRUE;
+     cmdline += 5;
+   }
+   strcat (new_cmdline, cmdline);
+ 
+   /* set emacs_dir variable if runemacs was in "%emacs_dir%\bin" */
+   if ((p = strrchr (modname, '\\')) && stricmp (p, "\\bin") == 0)
+   {
+     *p = 0;
+     SetEnvironmentVariable ("emacs_dir", modname);
+   }
+ 
+   memset (&start, 0, sizeof (start));
+   start.cb = sizeof (start);
+   start.dwFlags = STARTF_USESHOWWINDOW;
+   start.wShowWindow = SW_HIDE;
+ 
+   sec_attrs.nLength = sizeof (sec_attrs);
+   sec_attrs.lpSecurityDescriptor = NULL;
+   sec_attrs.bInheritHandle = FALSE;
+ 
+   if (CreateProcess (NULL, new_cmdline, &sec_attrs, NULL, TRUE, 0,
+ 		     NULL, NULL, &start, &child))
+     {
+       if (wait_for_child)
+ 	{
+ 	  WaitForSingleObject (child.hProcess, INFINITE);
+ 	  GetExitCodeProcess (child.hProcess, &ret_code);
+ 	}
+       CloseHandle (child.hThread);
+       CloseHandle (child.hProcess);
+     }
+   else
+     goto error;
+   return (int) ret_code;
+ 
+ error:
+   MessageBox (NULL, "Could not start Emacs.", "Error", MB_ICONSTOP);
+   return 1;
+ }
diff -2rcpP --exclude=*.elc emacs-19.30/oldXMenu/Activate.c emacs-19.31/oldXMenu/Activate.c
*** emacs-19.30/oldXMenu/Activate.c	Mon Nov 13 00:15:37 1995
--- emacs-19.31/oldXMenu/Activate.c	Thu Jan  4 15:55:40 1996
***************
*** 17,21 ****
   *			a highlight box around the selection as the mouse
   *			cursor enters its active region.  Inactive selections
!  *			will not be highlited.	As the mouse cursor moved
   *			from one menu pane to another menu pane the pane being
   *			entered is raised and made current and the pane being
--- 17,21 ----
   *			a highlight box around the selection as the mouse
   *			cursor enters its active region.  Inactive selections
!  *			will not be highlighted.  As the mouse cursor moved
   *			from one menu pane to another menu pane the pane being
   *			entered is raised and made current and the pane being
***************
*** 63,67 ****
   *
   *			3)	The application has enabled asynchronous event
!  *				queueing mode.  In this mode all foreign events
   *				will be	queued up untill XMenuActivate
   *				terminates; at which time they will be
--- 63,67 ----
   *
   *			3)	The application has enabled asynchronous event
!  *				queuing mode.  In this mode all foreign events
   *				will be	queued up untill XMenuActivate
   *				terminates; at which time they will be
diff -2rcpP --exclude=*.elc emacs-19.30/oldXMenu/ChangeLog emacs-19.31/oldXMenu/ChangeLog
*** emacs-19.30/oldXMenu/ChangeLog	Fri Nov 24 23:42:48 1995
--- emacs-19.31/oldXMenu/ChangeLog	Sat May 25 15:32:51 1996
***************
*** 1,2 ****
--- 1,6 ----
+ Sat May 25 15:30:10 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
+ 
+ 	* Version 19.31 released.
+ 
  Fri Nov 24 23:42:45 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
diff -2rcpP --exclude=*.elc emacs-19.30/oldXMenu/ChgPane.c emacs-19.31/oldXMenu/ChgPane.c
*** emacs-19.30/oldXMenu/ChgPane.c	Sat Mar 11 17:44:51 1995
--- emacs-19.31/oldXMenu/ChgPane.c	Thu Jan  4 15:55:41 1996
*************** XMenuChangePane(menu, p_num, label)
*** 24,28 ****
      register XMPane *p_ptr;	/* XMPane pointer. */
  
!     int label_length;		/* Label lenght in characters. */
      int label_width;		/* Label width in pixels. */
  
--- 24,28 ----
      register XMPane *p_ptr;	/* XMPane pointer. */
  
!     int label_length;		/* Label length in characters. */
      int label_width;		/* Label width in pixels. */
  
diff -2rcpP --exclude=*.elc emacs-19.30/oldXMenu/ChgSel.c emacs-19.31/oldXMenu/ChgSel.c
*** emacs-19.30/oldXMenu/ChgSel.c	Sat Mar 11 17:44:52 1995
--- emacs-19.31/oldXMenu/ChgSel.c	Thu Jan  4 15:55:42 1996
*************** XMenuChangeSelection(display, menu, p_nu
*** 30,34 ****
      register XMSelect *s_ptr;	/* XMSelect pointer. */
      
!     int label_length;		/* Label lenght in characters. */
      int label_width;		/* Label width in pixels. */
  
--- 30,34 ----
      register XMSelect *s_ptr;	/* XMSelect pointer. */
      
!     int label_length;		/* Label length in characters. */
      int label_width;		/* Label width in pixels. */
  
diff -2rcpP --exclude=*.elc emacs-19.30/oldXMenu/Create.c emacs-19.31/oldXMenu/Create.c
*** emacs-19.30/oldXMenu/Create.c	Mon Nov 13 00:15:40 1995
--- emacs-19.31/oldXMenu/Create.c	Thu Jan  4 15:55:44 1996
*************** XMenuCreate(display, parent, def_env)
*** 187,191 ****
    Pixmap cursor;		/* Cursor pixmap holder. */
    Pixmap cursor_mask;		/* Cursor mask pixmap holder. */
!   Pixmap stipple_pixmap;	/* Stippple mask for half-tone text. */
    unsigned long valuemask;
    XGCValues *values;
--- 187,191 ----
    Pixmap cursor;		/* Cursor pixmap holder. */
    Pixmap cursor_mask;		/* Cursor mask pixmap holder. */
!   Pixmap stipple_pixmap;	/* Stipple mask for half-tone text. */
    unsigned long valuemask;
    XGCValues *values;
diff -2rcpP --exclude=*.elc emacs-19.30/oldXMenu/InsPane.c emacs-19.31/oldXMenu/InsPane.c
*** emacs-19.30/oldXMenu/InsPane.c	Mon Nov 13 00:15:41 1995
--- emacs-19.31/oldXMenu/InsPane.c	Thu Jan  4 15:55:45 1996
*************** XMenuInsertPane(menu, p_num, label, acti
*** 29,33 ****
      register XMSelect *select;	/* Initial selection for the new pane. */
          
!     int label_length;		/* Label lenght in characters. */
      int label_width;		/* Label width in pixels. */
  
--- 29,33 ----
      register XMSelect *select;	/* Initial selection for the new pane. */
          
!     int label_length;		/* Label length in characters. */
      int label_width;		/* Label width in pixels. */
  
diff -2rcpP --exclude=*.elc emacs-19.30/oldXMenu/InsSel.c emacs-19.31/oldXMenu/InsSel.c
*** emacs-19.30/oldXMenu/InsSel.c	Mon Nov 13 00:15:41 1995
--- emacs-19.31/oldXMenu/InsSel.c	Thu Jan  4 15:55:46 1996
*************** XMenuInsertSelection(menu, p_num, s_num,
*** 31,35 ****
      XMSelect *select;		/* Newly created selection. */
  
!     int label_length;		/* Label lenght in characters. */
      int label_width;		/* Label width in pixels. */
      
--- 31,35 ----
      XMSelect *select;		/* Newly created selection. */
  
!     int label_length;		/* Label length in characters. */
      int label_width;		/* Label width in pixels. */
      
diff -2rcpP --exclude=*.elc emacs-19.30/oldXMenu/Internal.c emacs-19.31/oldXMenu/Internal.c
*** emacs-19.30/oldXMenu/Internal.c	Mon Nov 13 00:15:43 1995
--- emacs-19.31/oldXMenu/Internal.c	Thu Jan  4 15:55:48 1996
***************
*** 7,11 ****
   * XMenu:	MIT Project Athena, X Window system menu package
   *
!  * 	XMenuInternal.c - XMenu internal (not user visable) routines.
   *
   *	Author:		Tony Della Fera, DEC
--- 7,11 ----
   * XMenu:	MIT Project Athena, X Window system menu package
   *
!  * 	XMenuInternal.c - XMenu internal (not user visible) routines.
   *
   *	Author:		Tony Della Fera, DEC
diff -2rcpP --exclude=*.elc emacs-19.30/oldXMenu/Post.c emacs-19.31/oldXMenu/Post.c
*** emacs-19.30/oldXMenu/Post.c	Sat Mar 11 17:44:56 1995
--- emacs-19.31/oldXMenu/Post.c	Thu Jan  4 15:55:49 1996
***************
*** 21,25 ****
   *			As the mouse cursor moved from one menu pane
   *			to another menu pane the pane being entered is raised
!  *			and activated and the pane being left is inactivated.
   *			If an error occurs NULL will be returned with the
   *			p_num set to POST_ERROR, s_num set to
--- 21,25 ----
   *			As the mouse cursor moved from one menu pane
   *			to another menu pane the pane being entered is raised
!  *			and activated and the pane being left is deactivated.
   *			If an error occurs NULL will be returned with the
   *			p_num set to POST_ERROR, s_num set to
diff -2rcpP --exclude=*.elc emacs-19.30/oldXMenu/SetAEQ.c emacs-19.31/oldXMenu/SetAEQ.c
*** emacs-19.30/oldXMenu/SetAEQ.c	Sat Mar 11 17:44:57 1995
--- emacs-19.31/oldXMenu/SetAEQ.c	Thu Jan  4 15:55:50 1996
***************
*** 7,11 ****
   * XMenu:	MIT Project Athena, X Window system menu package
   *
!  *	XMenuSetAEQ - Set Asynchronous event queueing mode.
   *		      When enabled asynchronous events will be queue while
   *		      a menu is being displayed and restored to the X
--- 7,11 ----
   * XMenu:	MIT Project Athena, X Window system menu package
   *
!  *	XMenuSetAEQ - Set Asynchronous event queuing mode.
   *		      When enabled asynchronous events will be queue while
   *		      a menu is being displayed and restored to the X
diff -2rcpP --exclude=*.elc emacs-19.30/oldXMenu/XMenu.h emacs-19.31/oldXMenu/XMenu.h
*** emacs-19.30/oldXMenu/XMenu.h	Sat Mar 11 17:44:50 1995
--- emacs-19.31/oldXMenu/XMenu.h	Thu Jan  4 15:55:51 1996
*************** typedef struct _xmenu {
*** 179,183 ****
      XMMode menu_mode;		/* Menu display mode. */
      int freeze;			/* Freeze server mode? */
!     int aeq;			/* Asynchronous Event Queueing mode? */
      int recompute;		/* Recompute menu dependencies? */
      Window parent;		/* Menu's parent window. */
--- 179,183 ----
      XMMode menu_mode;		/* Menu display mode. */
      int freeze;			/* Freeze server mode? */
!     int aeq;			/* Asynchronous Event Queuing mode? */
      int recompute;		/* Recompute menu dependencies? */
      Window parent;		/* Menu's parent window. */
diff -2rcpP --exclude=*.elc emacs-19.30/src/ChangeLog emacs-19.31/src/ChangeLog
*** emacs-19.30/src/ChangeLog	Fri Nov 24 23:40:12 1995
--- emacs-19.31/src/ChangeLog	Sat May 25 19:40:28 1996
***************
*** 1,9128 ****
! Fri Nov 24 22:01:33 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* Version 19.30 released.
  
! 	* msdos.c (IT_set_menu_bar_lines): Clear last_modified field.
  
! Thu Nov 23 15:07:13 1995  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
  
! 	* keyboard.c (read_char): Handle unread events from popup menus.
  
! Wed Nov 22 13:58:36 1995  Geoff Voelker  <voelker@cs.washington.edu>
  
! 	* makefile.nt (DOC, clean): Don't use switches to del not supported
! 	by Win95.
  
! Wed Nov 22 07:35:25 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xterm.c (XTmouse_position): Exit the loop if child == win.
! 	(x_iconify_frame): Call FRAME_SAMPLE_VISIBILITY.
! 	(XTframe_up_to_date): Block and unblock input.
  
! Wed Nov 22 05:46:28 1995  Eli Zaretskii  <eliz@is.elta.co.il>
  
! 	* msdos.c (internal_terminal_init): Initialize the_only_x_display.font.
  
! 	* xfaces.c (Fset_face_attribute_internal) [MSDOS]:
! 	Set font field to 1.
  
! Wed Nov 22 05:46:28 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* msdos.c (dos_set_keyboard): If CODE is not recognized,
! 	initialize to the US keyboard table.
  
! Tue Nov 21 01:48:52 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* s/linux.h (LIB_MOTIF): New definition.
  
! 	* editfns.c (Fcurrent_time): Doc fix.
  
! 	* s/hpux10.h (FORCE_ALLOCA_H): Defined (for getdate.y).
! 	(HPUX10): Defined.
  
! 	* window.c (Fdisplay_buffer): Always deiconify the window's frame.
! 	(display_buffer_1): New subroutine.
  
! 	* m/alpha.h [LINUX] (LINUX_SBRK_BUG): Defined.
! 	* emacs.c (main): Add LINUX_SBRK_BUG conditional call to __sbrk.
  
! 	* s/msdos.h (SYSTEM_PURESIZE_EXTRA): Increased.
  
! 	* dosfns.c (syms_of_dosfns): Use 0x75 for dos_keypad_mode.
  
! Mon Nov 20 13:37:56 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* alloc.c (Flist): Avoid using -- in while condition.
  
! 	* xfaces.c (unload_color, unload_font): Never invalidate computed
! 	faces 0 and 1.
  
! 	* minibuf.c (choose_minibuf_frame): On MSDOS, just use minibuf_window.
  
! Sun Nov 19 15:29:11 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xterm.c (show_mouse_face):
! 	When clearing cursor, use proper column range.
  
! 	* lread.c (Vsource_directory): New variable.
! 	(init_lread): Initialize it.
! 	(syms_of_lread): Set up Lisp var.
  
! Sat Nov 18 09:24:58 1995  Fred Fish  <fnf@cygnus.com>
  
! 	* s/linux.h: #undef SIGPOLL and SIGURG as well as SIGIO.
  
! Sat Nov 18 14:03:38 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* data.c (Fmake_local_variable): Call find_symbol_value
! 	before making a new local binding.
  
! Wed Nov 15 20:47:36 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* mem-limits.h [_LIBC] (start_of_data): Use weak ref to
! 	__data_start; use &etext if not present.
  
! Wed Nov 15 11:56:58 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xterm.c (XTread_socket): Verify a ButtonPress was actually in the
! 	menu bar before generating a menu_bar_activate_event event.
  
! 	* s/hpux10.h: New file.
  
! 	* textprop.c (Fset_text_properties): Call set_properties
! 	even if we also merge an interval.
  
! 	* xselect.c (x_clear_frame_selections): Get selection_symbol properly.
! 	(syms_of_xselect): Doc fix.
  
! 	* doprnt.c (doprnt1): Add a cast.
  
! 	* alloc.c (mark_object): Don't overwrite original argument value.
  
! 	* .gdbinit (xsymbol): Cast name explicitly to (char *).
  
! Tue Nov 14 14:15:23 1995  Geoff Voelker  <voelker@cs.washington.edu>
  
! 	* w32term.h: New file.
  
! Tue Nov 14 12:36:49 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* keyboard.c (Fexecute_extended_command):
! 	Call Fwhere_is_internal just once to handle all the maps.
  
! 	* xdisp.c (Qredisplay_end_trigger_functions): Renamed from ..._hook.
! 	(syms_of_xdisp): Set up new name.
! 	(display_text_line): Call them with arguments.
  
! 	* window.c (Fset_window_redisplay_end_trigger): Doc fix.
  
! 	* fileio.c (check_executable) [DOS_NT]: Treat all dirs as executable.
  
! Mon Nov 13 00:06:01 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* frame.h (FRAME_WINDOW_P): Always define it one way or another.
  
! 	* m/alpha.h: Declare calloc like malloc.
  
! Sun Nov 12 00:19:44 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xselect.c (x_clear_frame_selections): Undo previous change.
  
! 	* fileio.c (Fcopy_file): Don't chmod output file on MSDOS
! 	unless we have DJGPP version 2.
  
! 	* s/usg5-4.h (LIBS_STANDARD): Definition deleted.
  
! 	* s/isc2-2.h (LIBS_SYSTEM): Fix typo in prev change.
  
! 	* dispnew.c: Always include dispextern.h before cm.h.
  
! Sat Nov 11 01:16:45 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xdisp.c (display_text_line): Handle redisplay_end_trigger
! 	before getting the face of the next character.  Reset next_face_change.
  
! 	* frame.c (syms_of_frame_1): Set up Vdefault_frame_alist here.
! 	(syms_of_frame): Not here.
! 	(Vdefault_frame_alist): Definition now unconditional.
  
! 	* msdos.c (dos_menubar_clock_displayed): New variable.
! 	(check_timer): Erase the clock if it has been turned off.
  
! 	* doc.c (Fdocumentation): Reject a file reference
! 	at the end of a lambda body.
  
! 	* xdisp.c (display_menu_bar): Fix backwards conditional.
! 	(update_menu_bar, redisplay_window): Don't use FRAME_EXTERNAL_MENU_BAR
! 	in #ifdef, since it is always defined.
  
! Fri Nov 10 18:44:42 1995  Simon Leinen  <simon@lia.di.epfl.ch>
  
! 	* s/hpux9.h (NO_EDITRES): Defined.
! 	(LIBXMU): Define once again.
  
! 	* xfns.c (HACK_EDITRES): Don't define if NO_EDITRES is defined.
  
! 	* xterm.c (HACK_EDITRES): Define here as in xfns.c.
! 	(XTread_socket): Test HACK_EDITRES.
  
! Fri Nov 10 10:53:51 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* s/isc2-2.h (LIB_STANDARD_1): New macro.
! 	(LIB_STANDARD): Use LIB_STANDARD_1.
! 	(LIBS_SYSTEM): Use it here too.
  
! 	* print.c (debug_print): Explicitly print a CR.
  
! 	* keyboard.c (interrupt_signal): Do special things in GC.
  
! Fri Nov 10 00:02:48 1995  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
  
! 	* frame.c (set_menu_bar_lines): Record the fact that the window
! 	configuration changes.
! 	(set_menu_bar_lines_1): Mark the window as modified.
  
! Thu Nov  9 23:28:43 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* floatfns.c (Fexpt): Doc fix.
  
! 	* window.h (struct window): New field redisplay_end_trigger.
  
! 	* window.c (Fwindow_redisplay_end_trigger): New function.
! 	(Fset_window_redisplay_end_trigger): Likewise.
! 	(syms_of_window): defsubr them.
  
! 	* xdisp.c (display_text_line): Get redisplay_end_trigger from window.
  
! Thu Nov  9 19:29:39 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* buffer.c (syms_of_buffer): Delete the buffer-redisplay-end-trigger
! 	local variable.
  
! Thu Nov  9 19:15:56 1995  Simon Leinen  <simon@lia.di.epfl.ch>
  
! 	* xmenu.c: Don't include Xaw/Paned.h unless USE_LUCID is defined.
! 	(set_frame_menubar): Conditionalized some code on USE_LUCID that
! 	depends on the fact that the parent widget of the menu bar is an Xaw
! 	"Paned" widget.
  
! Thu Nov  9 02:43:32 1995  Erik Naggum  <erik@naggum.no>
  
! 	* eval.c (run-hook-with-args, run-hook-list-with-args): Safeguard
!  	against a t in the global value of hook variables.
  
! Wed Nov  8 16:36:20 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* s/msdos.h (SYMS_SYSTEM): Add syms_of_msdos.
  
! 	* Makefile.in (lisp): Add loadup.el.
  
! 	* indent.c (compute_motion): Update next_boundary
! 	when we skip to next newline.
  
! Tue Nov  7 14:46:06 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* lread.c (oblookup): Clear ARRAY_MARK_FLAG in obsize.
  
! 	* callint.c (syms_of_callint): Set up Qlet, Qletx, Qsave_excursion.
! 	(Fcall_interactively): Look past those special forms
! 	when checking for a call to `list'.
  
! Tue Nov  7 02:12:16 1995  Geoff Voelker  <voelker@cs.washington.edu>
  
! 	* config.in [HAVE_X_WINDOWS] (HAVE_WINDOW_SYSTEM): New macro.
! 	* s/windowsnt.h [HAVE_NTGUI] (HAVE_WINDOW_SYSTEM): New macro.
! 	* dispextern.h dispnew.c, emacs.c, frame.c, keyboard.c, process.c,
! 	scroll.c, sysdep.c, window.c, xdisp.c: Use HAVE_WINDOW_SYSTEM
! 	instead of testing for specific window systems.
  
! 	* frame.h [HAVE_X_WINDOWS] (FRAME_WINDOW_P): Macro defined.
! 	[HAVE_NTGUI] (FRAME_WINDOW_P): Macro defined.
! 	* dispnew.c, frame.c, scroll.c, xdisp.c: Use FRAME_WINDOW_P
! 	instead of testing for specific window system frames.
  
! 	* xdisp.c (update_menu_bar, redisplay_window): Test for definition
! 	of FRAME_EXTERNAL_MENU_BAR before using it.
  
! Mon Nov 6 15:52:37 1995  Kevin Gallo  <kgallo@microsoft.com>
  
! 	* xterm.h (FRAME_INTERNAL_BORDER_WIDTH, FRAME_LINE_HEIGHT): New macros.
! 	* dispnew.c (update_frame): Use FRAME_INTERNAL_BORDER_WIDTH.
! 	(update_line): Use FRAME_LINE_HEIGHT and FRAME_FONT.
  
! 	* xdisp.c [HAVE_NTGUI] (set_menu_framebar): Declare external.
! 	[HAVE_NTGUI] (frame_title_buf, frame_title_ptr): Include variables
! 	for Win32 window system.
! 	[HAVE_NTGUI] (store_frame_title, x_consider_frame_title): Include
! 	procedures for Win32 window system.
! 	[HAVE_NTGUI] (x_consider_frame_title): Test for Win32 frame.
! 	[HAVE_NTGUI] (display_text_line): Test for Win32 frame on face change.
! 	[HAVE_NTGUI] (display_menu_bar): Perform no-op for NT window system.
  
! 	* window.c [HAVE_NTGUI] (Fset_window_configuration): Set menu
! 	bar lines.
  
! 	* term.c [HAVE_NTGUI] (FRAME_TERMCAP_P): Don't redefine.
  
! 	* sysdep.c [HAVE_NTGUI] (init_sys_modes, reset_sys_modes):
! 	Don't initialize terminal mode when using window system.
! 	[HAVE_NTGUI] (BUFFER_SIZE_FACTOR): Increase for use with window system.
  
! 	* scroll.c [HAVE_NTGUI] (do_scrolling, do_direct_scrolling):
! 	Update frame geometry.
  
! 	* process.c [HAVE_NTGUI] (POLL_FOR_INPUT): Define macro.
  
! 	* keyboard.c [HAVE_NTGUI]: Include w32term.h.
! 	[HAVE_NTGUI] (KBD_BUFFER_SIZE): Increase for NT window system.
! 	[HAVE_NTGUI] (POLL_FOR_INPUT): Define.
! 	[HAVE_NTGUI] (kbd_buffer_get_event): Enable windowing and menu events.
! 	[HAVE_NTGUI] (lispy_function_keys): Define array for NT.
! 	[HAVE_NTGUI] (make_lispy_event): Enable menu bar events.
! 	[HAVE_NTGUI] (modify_event_symbol): Map symbol to keysym.
! 	[HAVE_NTGUI] (read_char_x_menu_prompt): Display menus.
  
! 	(FUNCTION_KEY_OFFSET): New macro.
! 	(make_lispy_event): Use FUNCTION_KEY_OFFSET to modify event codes
! 	before applying modifiers.
  
! 	* frame.c [HAVE_NTGUI]: Test for a Win32 frame in procedures
! 	that test for an X frame.
  
! 	* frame.h (output_method): New method: output_win32.
! 	(output_data): New data: win32.
! 	(FRAME_WIN32_P): New macro.
! 	[HAVE_NTGUI] (external_menu_bar): Define variable.
! 	[HAVE_NTGUI] (FRAME_EXTERNAL_MENU_BAR): Defined macro.
  
! 	* fns.c [HAVE_NTGUI] (Fy_or_n_p, Fyes_or_no_p): Allow popup.
  
! 	* emacs.c [HAVE_NTGUI]: Declare Vwindow_system.
! 	[HAVE_NTGUI] (main): Enable inhibit_window_system.
! 	Initialize environment from registry.
! 	Declare syms of Win32 windowing modules.
  
! 	* dispnew.c [HAVE_NTGUI]: Include w32term.h.
! 	Include dispextern.h before cm.h since dispextern.h includes windows.h.
! 	[HAVE_NTGUI] (make_frame_glyphs, free_frame_glyphs, scroll_frame_lines,
! 	update_frame, update_line): Test for WIN32 frame.
! 	[HAVE_NTGUI] (init_display): Initialize WIN32 window system.
  
! 	* dispextern.h [HAVE_NTGUI]: Include win32.h.
! 	[HAVE_NTGUI] (struct frame_glyphs): Include pixel fields.
  
! 	* w32term.c, w32xfns.c, w32fns.c, w32faces.c, w32select.c,
! 	w32menu.c, w32reg.c, win32.h: New files.
  
! 	* s/windowsnt.h [HAVE_NTGUI] (abort): New macro.
! 	[HAVE_NTGUI] (HAVE_FACES): Defined.
  
! 	* unexnt.c [HAVE_NTGUI] (WinMain): New procedure.
! 	[HAVE_NTGUI] (hinst, hprevinst, lpCmdLine, nCmdShow): New variables.
! 	[HAVE_NTGUI] (_start): Invoke WinMainCRTStartup.
  
! 	* ntterm.c (nt_ring_bell): Renamed from ring_bell, now global.
! 	(initialize_win_nt_display): Use nt_ring_bell.
! 	[HAVE_NTGUI] (pixel_to_glyph_coords, glyph_to_pixel_coords):
! 	Don't define.
  
! 	* ntproc.c [HAVE_NTGUI] (create_child): Pass handles to children.
! 	[HAVE_NTGUI1] (sys_select): Support alternate keyboard handling.
  
! 	* nt.h (nt_get_resource): Prototype defined.
  
! 	* nt.c (nt_get_resource, init_environment): Defined.
! 	(prepare_standard_handles, restore_standard_handles) [HAVE_NTGUI]:
! 	Don't duplicate or restore standard handles.
  
! 	* makefile.nt (SUBSYSTEM, TLIBW32, TLASTLIB, WIN32OBJ): Defined.
! 	(w32term.obj, w32xfns.obj, w32fns.obj w32faces.obj, w32select.obj,
! 	w32menu.obj, w32reg.obj): Defined.
! 	(LINK_FLAGS): Use SUBSYSTEM.
! 	(OBJ1): Remove lastfile.obj.
! 	(LIBS, TEMACS): Use TLASTLIB.
! 	(LIBS) [NTGUI]: Use TLIBW32 and GUI libs.
! 	(EMACS): Remove Win95 conditional.
! 	(clean): Remove paths.h.
  
! Mon Nov  6 15:06:38 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* xdisp.c (display_string): Detect truncation more carefully.
  
! 	* dispnew.c (update_line): Avoid indexing into obody by -1.
  
! 	* s/hpux9.h (LIBXMU): Never define this.
  
! Mon Nov  6 13:31:18 1995  Erik Naggum  <erik@naggum.no>
  
! 	* print.c (debug_print): Print newline to stderr, too.
  
! Sun Nov  5 16:28:43 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* xfaces.c (unload_font): Invalidate computed faces.
! 	(unload_color): Likewise.
! 	(new_computed_face): Reuse invalidated computed faces.
  
! Sat Nov  4 10:40:11 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* indent.c (Fmove_to_column): Doc fix.
  
! 	* buffer.c (Fmake_overlay): New args front-advance
! 	and rear-advance.
  
! 	* fileio.c (Fwrite_region): Move the code that writes annotations
! 	for empty files.
  
! Fri Nov  3 19:04:15 1995  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* msdos.h (struct x_output): Rename from struct x_display.
! 	* msdos.c (the_only_x_display): Type is now struct x_output.
! 	(internal_terminal_init): frame member is now named output_data.
! 	(init_environment): Fix timezone rules.
! 	* emacs.c (main): [MSDOS] Call init_gettimeofday.
! 	* frame.c [!MULTI_FRAME] (Fmodify_frame_parameters): Add missing
! 	declaration and initialization.
! 	[MULTI_FRAME] (choose_minibuf_frame): Moved to minibuf.c; now
! 	unconditional.
! 	* minibuf.c (choose_minibuf_frame): Moved here from frame.c.
  
! Wed Nov  1 16:49:13 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* Makefile.in (USE_@X_TOOLKIT_TYPE@): Define here, if appropriate.
! 	(THIS_IS_YMAKEFILE): Definition deleted.
  
! Tue Oct 31 19:03:18 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* doprnt.c: Include lisp.h.
!  	(doprnt1): Renamed from doprnt.  New arg LISPSTRINGS.
! 	This is now a static subroutine.
! 	(doprnt): New definition calls doprnt1.
! 	(doprnt_lisp): New function.
  
! 	* editfns.c (Fformat): Use doprnt_lisp.
  
! 	* s/dgux.h: Test NOT_C_CODE instead of THIS_IS_YMAKEFILE.
! 	Get fatal error if not using GCC.
  
! 	* xdisp.c (redisplay_window): On non-X frame, always use
! 	FRAME_MENU_BAR_LINES as criterion for whether to display menu bar.
! 	(update_menu_bar): Likewise.
! 	(display_menu_bar): Do the work here for non-X frames
! 	regardless of USE_X_TOOLKIT.
  
! 	* m/alpha.h: Don't test THIS_IS_YMAKEFILE.
  
! 	* s/usg5-4.h: Always include sys/wait.h unless NOT_C_CODE;
! 	don't test #ifdef emacs for that.
  
! Tue Oct 31 12:11:36 1995  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* m/7300.h, m/acorn.h, m/alliant-2800.h, m/alliant.h, m/altos.h:
! 	* m/amdahl.h, m/apollo.h, m/att3b.h, m/aviion.h, m/celerity.h:
! 	* m/clipper.h, m/cnvrgnt.h, m/cydra5.h, m/delta.h, m/delta88k.h:
! 	* m/dpx2.h, m/dual.h, m/elxsi.h, m/gec63.h, m/gould.h, m/hp9000s300.h:
! 	* m/i860.h, m/ibmps2-aix.h, m/ibmrs6000.h, m/ibmrt-aix.h, m/ibmrt.h:
! 	* m/irist.h, m/isi-ov.h, m/masscomp.h, m/mega68.h, m/mg1.h, m/news.h:
! 	* m/next.h, m/nh3000.h, m/nh4000.h, m/ns16000.h, m/ns32000.h, m/nu.h:
! 	* m/orion.h, m/orion105.h, m/pfa50.h, m/plexus.h, m/pyramid.h:
! 	* m/sequent.h, m/sparc.h, m/sps7.h, m/stride.h, m/sun1.h, m/sun2.h:
! 	* m/tad68k.h, m/tahoe.h, m/targon31.h, m/tek4300.h, m/tekxd88.h:
! 	* m/template.h, m/tower32.h, m/tower32v3.h, m/ustation.h, m/vax.h:
! 	* m/wicat.h, m/windowsnt.h, m/xps100.h:
! 	(SHORTBITS, INTBITS, LONGBITS): Deleted; now in config.h.
  
! Mon Oct 30 21:28:51 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* alloc.c, data.c, doprnt.c, floatfns.c, fns.c, indent.c
! 	* insdel.c, lisp.h, lread.c, print.c, xdisp.c, xfaces.c, xterm.c
! 	(BITS_PER_SHORT, BITS_PER_INT, BITS_PER_LONG): Rename from
! 	SHORTBITS, INTBITS, LONGBITS.
! 	* m/alpha.h, m/convex.h, m/hp800.h, m/intel386.h, m/iris4d.h
! 	* m/iris5d.h, m/mips-siemens.h, m/mips.h:
! 	(SHORTBITS, INTBITS, LONGBITS): Deleted; now in config.h
! 	Used new names for those macros in all references.
  
! Mon Oct 30 12:52:49 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* config.in (BITS_PER_CHAR, BITS_PER_INT, BITS_PER_SHORT)
! 	(BITS_PER_LONG): Define if not already defined.
  
! 	* print.c (debug_print): Print a newline here.
  
! 	* .gdbinit (pr): Don't print newline here.
  
! 	* syntax.c (check_syntax_table): Check the purpose slot.
! 	Use Qsyntax_table_p for the error message.
  
! 	* lisp.h (CHECK_CHAR_TABLE): Don't accept nil.
  
! 	* Makefile.in (prefix-args): Use LDFLAGS, not ALL_LDFLAGS.
  
! 	* unexalpha.c (fatal_unexec): Don't use varargs.
  
! 	* editfns.c (Fencode_time): Add cast.
! 	(Fset_time_zone_rule): Add cast.
  
! 	* xterm.h: Move the include of Xlocale.h after setting HAVE_X11R5.
  
! 	* keyboard.c (command_loop_1): Test pre- and post-command hooks
! 	for non-nil-ness by looking at the V... variable.
  
! Sun Oct 29 17:02:58 1995  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
  
! 	* m/m68k.h [linux]: Define NO_REMAP and TEXT_START,
! 	and also DATA_SEG_BITS if compiling for ELF.
! 	(HAVE_ALLOCA, alloca): Define if compiling with GCC.
  
! 	* keymap.c (describe_translation): Insert newline after key
! 	description.
  
! 	* fns.c (Fsafe_length): Add missing parentheses around &
! 	within comparison.
  
! 	* minibuf.c (temp_echo_area_glyphs): Only delete the temporary
! 	message.
  
! Sun Oct 29 14:00:09 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* syssignal.h [POSIX_SIGNALS] (signal): Undef before defining.
  
! 	* unexelfsgi.c (find_section): New arg old_section_h.
! 	Rename file_h to old_file_h and fix type.
! 	Calls changed.
  
! 	* syntax.c (Fmodify_syntax_entry): Don't fail to init MATCH.
  
! 	* lisp.h (PVEC_TYPE_MASK): Remove the 0x100 bit.
  
! 	* keyboard.c (command_loop_1): No direct display if Column Number mode.
! 	(Vcolumn_number_mode): New variable.
! 	(syms_of_keyboard): Set up Lisp variable.
  
! 	* marker.c (Fset_marker_insertion_type): Doc fix.
  
! 	* alloc.c (Fmake_char_table): Doc fix.
  
! 	* casetab.c (Fset_case_table): Doc fix.
  
! 	* alloc.c: Cast first arg to bzero.
  
! Sat Oct 28 11:15:20 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xterm.h (FRAME_XIC): Fix wrong field name.
  
! 	* alloc.c (Fmemory_use_counts): Cast 1 to EMACS_INT before shift.
  
! 	* eval.c (run_hook_with_args): Add forward declaration.
  
! Fri Oct 27 16:23:30 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* Makefile.in (TAGS): Separate export DIR=`pwd` into two commands.
  
! 	* syntax.h (SYNTAX, SYNTAX_WITH_FLAGS, SYNTAX_MATCH):
! 	Fix the non-GCC definitions.
  
! 	* callint.c (Fcall_interactively): New arg KEYS.
  
! 	* keyboard.c (Fcommand_execute): New arg KEYS.  Callers changed.
! 	(read_char): Specify KEYS when handling Vspecial_event_map.
  
! Thu Oct 26 15:03:54 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* msdos.c (IT_ring_bell): Use intdos, not write.
  
! Wed Oct 25 15:19:08 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* data.c [!HAVE_FMOD] (fmod): Make consistent with ANSI definition.
! 	Don't use drem; it's not the same function.
  
! Tue Oct 24 12:29:33 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* s/linux.h (REGEXP_IN_LIBC): Definition turned off.
  
! 	* minibuf.c (syms_of_minibuf): Doc fix.
  
! Mon Oct 23 00:32:39 1995  Erik Naggum  <erik@churchy.gnu.ai.mit.edu>
  
! 	* fns.c (map_char_table): Map over only CHAR_TABLE_ORDINARY_SLOTS
! 	slots, not vector size.
  
! 	* casetab.c (Fcase_table_p, Fcurrent_case_table): Delete unused
! 	local variables.
! 	(set_case_table): Delete obsolete local variable `down', use
! 	`table' where referenced.  Fix assignment to `canon' when nil.
! 	Store eqv in extras[2], not extras[0].
! 	(init_casetab_once): Case-tables have 3 extra slots, not 4.
  
! Sun Oct 22 12:39:41 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* msdos.c (recent_doskeys_index, total_doskeys, recent_doskeys):
! 	New variables.
! 	(Frecent_doskeys): New function.
! 	(syms_of_msdos): New function.
  
! 	* search.c (string_match_1): Pass the POSIX arg to compile_pattern.
  
! 	* keyboard.c (ok_to_echo_at_next_pause): Make it a char *.
! 	(read_char): Copy and compare with echo_area_glyphs.
  
! 	* buffer.c (reset_buffer_local_variables): Call
!  	Fset_standard_case_table if std case table seems to have been changed.
  
! Sat Oct 21 13:04:57 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* buffer.c (reset_buffer): Initialize redisplay_end_trigger slot.
! 	Initialize extra1, extra2 and extra3 slots.
  
! 	* textprop.c (Fnext_single_property_change): Rearrange handling of
! 	limit = t; don't return t.
  
! 	* xdisp.c (try_window_id): Stop the compute_motion at ZV, not Z,
! 	when checking if all changes are below the window.
  
! 	* keyboard.c (read_char): If we reread a char, the next pause
! 	can start echoing despite a remaining echo area message.
! 	(ok_to_echo_at_next_pause): New variable.
! 	(cancel_echoing): Clear ok_to_echo_at_next_pause.
  
! Fri Oct 20 19:20:42 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xdisp.c (Qredisplay_end_trigger_hook): New variable.
! 	(syms_of_xdisp): Set up Lisp variable.
! 	(display_text_line): Run the hook when appropriate.
  
! 	* buffer.c (init_buffer_once): Mark redisplay_end_trigger always local.
! 	Also fix previous change.
! 	(syms_of_buffer): Set up Lisp var buffer-redisplay-end-trigger.
  
! 	* buffer.h (struct buffer): New slot redisplay_end_trigger.
! 	Also extra1, extra2, extra3.
  
! Thu Oct 19 09:36:12 1995  Erik Naggum  <erik@naggum.no>
  
! 	* fns.c (Fmap_char_table): Call map_char_table with correct args.
  
! Wed Oct 18 16:44:29 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* config.in (RE_TRANSLATE_TYPE): New definition.
  
! 	* casetab.c: Case tables are now char-tables,
! 	and the case table is stored in the downcase_table slot only.
! 	(Fcurrent_case_table, Fstandard_case_table, set_case_table)
! 	(compute_trt_inverse, init_casetab_once): Use new data format.
  
! 	* buffer.c (reset_buffer_local_variables):
! 	Get the up, eqv and canon tables from within the down case table.
  
! 	* editfns.c (Fchar_equal): Handle char-table as case table.
  
! 	* fns.c (Fchar_table_subtype): New function.
! 	(syms_of_fns): defsube it.
  
! 	* fns.c (map_char_table): When possible, use a number
! 	to describe the range.
  
! 	* doc.c (Fsubstitute_command_keys): Pass new arg to describe_map_tree.
  
! 	* keymap.c (describe_map_tree): New arg always_title.  Callers changed.
  
! 	* search.c (compile_pattern_1, compile_pattern, search_buffer):
! 	Case tables are char-tables now.
  
! Mon Oct 16 17:35:25 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* lisp.h (UPCASE_TABLE): Definition deleted.
! 	(UPPERCASEP, LOWERCASEP, NOCASEP, UPCASE, UPCASE1, DOWNCASE)
! 	(DOWNCASE_TABLE): Case tables are now char-tables.
! 	(Vascii_upcase_table, Vascii_canon_table, Vascii_eqv_table):
! 	Declarations deleted.
  
! 	* keyboard.c (read_char): Let Vkeyboard_translate_table	be char-table.
! 	(syms_of_keyboard): Doc fix.
  
! Sun Oct 15 12:05:50 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* lread.c (read1): Handle #' as prefix.
! 	(Qfunction): New variable.
! 	(syms_of_lread): Set up Qfunction.
  
! 	* fns.c (Fchar_table_range): New function.
! 	(syms_of_fns): defsubr it.
  
! Sat Oct 14 20:57:54 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* unexelfsgi.c (find_section): New function.
! 	(unexec): Use it.  Also simplify previous changes.
  
! Fri Oct 13 21:31:43 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* unexelfsgi.c (unexec): Find the old data section.
! 	New variable new_offsets_shift used instead of new_data2_size
! 	since they are not always the same.  Simplify logic for copying
! 	the headers and inserting new ones.
  
! 	* xterm.c (x_term_init, XTread_socket): Add HAVE_X_I18N support.
  
! 	* xfns.c (x_window, both versions): Add HAVE_X_I18N support.
  
! Thu Oct 12 11:44:24 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xterm.h (HAVE_X_I18N): New macro.
! 	Maybe include Xlocale.h.
! 	(struct x_output): New field xic.
! 	(FRAME_XIC): New macro.
  
! 	* window.c (Fdelete_other_windows): Set w->force_start.
  
! 	* xdisp.c (syms_of_xdisp): Doc fix.
  
! Wed Oct 11 13:01:50 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* fileio.c (Finsert_file_contents): If replacing,
! 	set selected_window->start_at_line_beg.
  
! Wed Oct 11 15:12:35 1995  Kim Storm  <kfstorm@wombat.gnu.ai.mit.edu>
  
! 	* keyboard.c (make_lispy_event) [!USE_X_TOOLKIT]: Dragging
!  	the mouse into the menu-bar and releasing it there did
!  	not create a drag-mouse event.
! 	(set-input-mode) [MSDOS]: Do not call reset_sys_modes and
! 	init_sys_modes.
  
! 	* dosfns.c (insert-startup-screen): New function.
! 	(msdos-memget, msdos-memput): New functions.
! 	(msdos-set-keyboard, insert-startup-screen): New functions.
! 	(dos-timezone-offset, dos-display-scancodes, dos-menubar-clock,
! 	dos-hyper-key, dos-super-key, dos-keypad-mode, dos-keyboard-layout,
! 	dos-decimal-point): New variables.
  
! 	* dosfns.h (dos_timezone_offset, dos_display_scancodes,
! 	dos_menubar_clock, dos_hyper_key, dos_super_key, dos_keypad_mode,
! 	dos_keyboard_layout, dos_decimal_point): New variables.
  
! 	* msdos.c: [!HAVE_X_WINDOWS]:
! 	Reworked display code to perform immediate screen output.
! 	Added menu-bar clock.
! 	Reworked keyboard code to support international keyboards.
! 	Improved keypad handling (see dos-keypad-mode).
! 	Properly distinguish between C-end and C-kp-1 etc.
! 	Corrected M-return & M-kp-enter.
! 	Added support for hyper and super keys.
! 	Reworked mouse code to avoid mouse flicker.
! 	Saves and restores DOS-screen prior to emacs startup.
! 	(sys_select): Would abort if rfds = NULL.
! 	(dos_direct_output): New function.
! 	(dos_dump_scancodes): New variable.
  
! 	* msdos.h (internal_flush): Removed
! 	(mouse_init1, mouse_check_moved, mouse_pressed, mouse_released): Removed.
! 	(dos_get_saved_screen, dos_set_keyboard): New functions.
  
! 	* s/msdos.h: Check that DJGPP v. 1 is used.
! 	Define __DJGPP__ to 1.
! 	Simplified INTERNAL_TERMINAL termcap definition.
! 	Removed #define fflush internal_flush.
  
! 	* sysdep.c: (init_sys_modes) [!HAVE_X_WINDOWS (MSDOS)]:
! 	Always call set_terminal_modes.
! 	(reset_sys_modes) [MSDOS]: Do not look at EMACSCOLORS.
  
  
! Wed Oct 11 02:24:27 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* buffer.c (Fkill_buffer): Don't kill auto save file if not recent.
  
! 	* keymap.c (describe_vector): Support nested char-tables.
  
! Tue Oct 10 12:26:49 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* Give char-tables a new slot `purpose'.
  
! 	* lisp.h (struct Lisp_Char_Table): New slot `purpose'.
! 	(CHAR_TABLE_STANDARD_SLOTS): Add one.
  
! 	* alloc.c (Qchar_table_extra_slots): New variable.
! 	(syms_of_alloc): Initialize it.
! 	(Fmake_char_table): Take new arg PURPOSE and get N from a property.
  
! 	* fns.c (Fcopy_sequence): Call Fmake_char_table the new way.
! 	(map_char_table): No longer static.  New arg C_FUNCTION.
! 	(Fmap_char_table): Call to map_char_table changed.
! 	(Fset_char_table_parent): Allow nil s new parent.
! 	Fix the code that checks for a loop in parents.
  
! 	* syntax.c (Qsyntax_table): New variable.
! 	(init_syntax_once): Call Fmake_char_table the new way.
! 	Set up Qsyntax_table.
! 	(Fsyntax_table_p): Check the `purpose' field.
  
! 	* disptab.h (DISP_TABLE_P): Check the `purpose' slot.
! 	(Qdisplay_table): Declared.
! 	* dispnew.c (Qdisplay_table): New variable.
! 	(syms_of_display): Initialize it.
  
! Mon Oct  9 17:05:16 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* data.c (Qvector_or_char_table_p): New variable.
! 	(Fvector_or_char_table_p): New function.
! 	(syms_of_data): Set up Lisp var and function.
! 
! 	* lisp.h (CHECK_VECTOR_OR_CHAR_TABLE): New macro.
! 
! Mon Oct  9 16:51:42 1995  Erik Naggum  <erik@naggum.no>
! 
! 	* buffer.c (buffer-display-table): Document new implementation.
! 
! Mon Oct  9 12:26:25 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* minibuf.c (temp_echo_area_glyphs): Restore the old point value.
! 
! Sun Oct  8 15:25:18 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* process.c (exec_sentinel, read_process_output):
! 	Call record_asynch_buffer_change only if caller is reading kbd input.
! 
! 	* buffer.c (init_buffer_once): Make file_format always local,
! 	not just local when set.
! 
! Sat Oct  7 22:55:46 1995  Erik Naggum  <erik@naggum.no>
! 
! 	* alloc.c (Fmake_char_table): Initialize parent to nil.
! 
! Sat Oct  7 12:06:49 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* keyboard.c (command_loop_1): Access display tables as char-tables.
! 
! 	* indent.c (buffer_display_table): Use DISP_TABLE_P.  Return type
! 	struct Lisp_Char_Table * since display tables are now char-tables.
! 	(character_width, disptab_matches_widthtab, recompute_width_table)
! 	(current_column, Fmove_to_column, compute_motion):
! 	Corresponding changes.
! 
! 	* window.c (window_display_table): Use DISP_TABLE_P.  Return type
! 	struct Lisp_Char_Table * since display tables are now char-tables.
! 	* xdisp.c (redisplay_window, redisplay_window, display_text_line):
! 	Fix up calls to window_display_table.  Access display tables
! 	as char-tables.
! 
! 	* disptab.h (DISP_TABLE_EXTRA_SLOTS, DISP_TABLE_P): New macros.
! 	(DISP_TRUNC_GLYPH, DISP_CONTINUE_GLYPH, DISP_ESCAPE_GLYPH)
! 	(DISP_CTRL_GLYPH, DISP_INVIS_VECTOR, DISP_BORDER_GLYPH):
! 	Use the `extras' field.
! 	(window_display_table, buffer_display_table): Change return type.
! 
! 	* keymap.c (describe_vector): Use Flength to get length of vector.
! 
! 	* Makefile.in (bytecode.o): Depend on syntax.h.
! 
! Fri Oct  6 15:33:24 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* syntax.c (describe_syntax): Handle new syntax-table data format.
! 	(Fmodify_syntax_entry, init_syntax_once): Use SET_RAW_SYNTAX_ENTRY.
! 	Handle new syntax-table data format.
! 	(check_syntax_table): Use CHECK_CHAR_TABLE.  Now static.
! 	Don't return anything; callers changed.
! 	(Fcopy_syntax_table): Use Fcopy_sequence.
! 	(Fchar_syntax, Fmatching_paren, Fforward_comment): Copy complex args
! 	to SYNTAX into variables before using them.
! 	(Fsyntax_table_p): Accept any char-table.
! 	(syntax_parent_lookup): New function.
! 	(syntax_temp): New variable.
! 
! 	* syntax.h: Use char tables as syntax tables.
! 	(RAW_SYNTAX, RAW_SYNTAX_MATCH): Macros deleted.
! 	(RAW_SYNTAX_ENTRY, SET_RAW_SYNTAX_ENTRY): New macros.
! 	(SYNTAX, SYNTAX_MATCH): Rewritten.
! 	(SYNTAX_ENTRY, SYNTAX_WITH_FLAGS): New macros.
! 	(SYNTAX_COMSTART_SECOND, SYNTAX_COMEND_FIRST, SYNTAX_COMEND_SECOND)
! 	(SYNTAX_PREFIX, SYNTAX_COMMENT_STYLE): Use SYNTAX_WITH_FLAGS.
! 
! 	* callint.c (callint_message, callint_message_size): New vars.
!  	(syms_of_callint): Set up new vars.
! 	(Fcall_interactively): Keep the prompt in the heap.
! 
! Thu Oct  5 19:14:59 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* window.c (Fset_window_hscroll): Don't reject args > SHORTBITS.
! 
! 	* indent.c (Fmove_to_column): Make it interactive.
! 
! Wed Oct  4 11:45:53 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* lisp.h (struct Lisp_Char_Table): New structure.
! 	(CHAR_TABLE_STANDARD_SLOTS, CHAR_TABLE_ORDINARY_SLOTS): New macros.
! 	(CHAR_TABLE_EXTRA_SLOTS): New macro.
! 
! 	* buffer.c (Fmake_indirect_buffer): Was taking marker positions
! 	from current buffer, which is irrelevant.
! 	(init_buffer_once): Make buffer-file-format always local.
! 
! Tue Oct  3 05:08:53 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* unexec.c (write_segment): Write valid data in units of 1<<13,
! 	but write zeros only a page at a time.
! 
! 	* window.c (window_scroll): Always set force_start.
! 
! Mon Oct  2 11:52:24 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* eval.c (run_hook_with_args_2): New function.
! 
! 	* unexec.c (write_segment): Use pagesize as unit of writing
! 	instead of 128.
! 
! 	* lisp.h (CHECK_CHAR_TABLE): New macro.
! 
! 	* frame.c (Qmouse_leave_buffer_hook): New variable.
!  	(syms_of_frame_1): Initialize it.
! 	(Fhandle_switch_frame): Run the hooks.
! 
! 	* keyboard.c (Vsuggest_key_bindings): New variable.
! 	(syms_of_keyboard): Set up Lisp variable.
! 	(Fexecute_extended_command): When enabled, show an equivalent
! 	key binding.
! 
! Sun Oct  1 00:11:20 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* xterm.c (x_connection_signal_1): New function.
! 	(x_connection_signal): Try all the server connections
! 	to see which one was lost.
! 
! Fri Sep 29 00:12:53 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* xdisp.c (Qwindow_scroll_functions, Vwindow_scroll_functions):
! 	New variables.
! 	(syms_of_xdisp): Initialize them.
! 	(redisplay_window): Call the functions when appropriate.
! 
! 	* xterm.c (XTcondemn_scroll_bars): No error if
! 	FRAME_CONDEMNED_SCROLL_BARS is non-nil already.
! 	Just move all the scroll bars into there.
! 
! 	* dispnew.c (get_display_line): Don't abort if there's text
! 	in the line to the right beyond HPOS.
! 	(quit_error_check): Make this a no-op.
! 
! 	* fileio.c (barf_or_query_if_file_exists): New arg STATPTR.
! 	Callers changed.
! 	(Fcopy_file): Error if input and output are the same file.
! 
! Thu Sep 28 19:02:17 1995  Carsten Bormann  <cabo@informatik.uni-bremen.de>
! 
! 	* m/ibmrs6000.h: Add early support for Solaris 2.5 on PowerPCs.
! 	[USG5_4] (CANNOT_DUMP): Define this if USG5_4.
! 	(UNEXEC): Don't define if already defined.
! 	[USG5_4] (DATA_SEG_BITS, LIBS_MACHINE): Alternate definitions.
! 	(C_SWITCH_MACHINE, LD_SWITCH_MACHINE, NLIST_STRUCT, WORDS_BIG_ENDIAN)
! 	(TEXT_START, DATA_START, TEXT_END, DATA_END):
! 	Don't define, if USG5_4.
! 
! Wed Sep 27 16:16:38 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* lisp.h (pvec_type): Add PVEC_CHARTABLE and PVEC_BOOLVECTOR.
! 	Move PVEC_BUFFER to a higher bit.
! 	(CHARTABLEP, GC_CHARTABLEP, XSETCHARTABLE, XCHARTABLE): New macros.
! 	(XBOOLVECTOR, XSETBOOLVECTOR, BOOLVECTORP, GC_BOOLVECTORP): New macros.
! 	(struct Lisp_Boolvector): New data type.
! 
! 	* lread.c (read1): Handle chartables and boolvectors.
! 	* print.c (print): Handle chartables and boolvectors.
! 	(print_boolvector): New function.
! 	* data.c (Fchartablep, Fboolvectorp): New functions.
! 	(syms_of_data): defsubr them.
! 	(Faref, Faset, Fsequencep): Handle chartables and boolvectors.
! 
! 	* fns.c (Fset_char_table_range): New function.
! 	(make_char_table, Fmap_char_table): New function.
! 	(Fchar_table_extra_slot, Fset_char_table_extra_slot): New functions.
! 
! 	* fns.c (Fcopy_sequence, Felt, internal_equal, Ffillarray):
! 	Handle chartables and boolvectors.
! 	(Flength, concat): Handle boolvectors as args.
! 	(Flength): Handle chartables as args.
! 
! 	* alloc.c (Fmake_chartable, Fmake_boolvector): New functions.
! 	(syms_of_alloc): defsubr them.
! 
! 	* buffer.c (Fmake_overlay): Set end-marker's insertion_type to 1.
! 
! Fri Sep 22 14:34:22 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
! 
! 	* xfns.c (Fx_create_frame): Set up buffer-predicate slot.
! 
! 	* gmalloc.c (current_core_address): New function.
! 	(_malloc_internal): Use current_core_address.
! 	(morecore): Avoid using __morecore (0).
! 
! 	* ralloc.c (r_alloc_sbrk): Round up amount being returned.
! 
! Wed Sep 20 03:27:58 1995  Paul Eggert  <eggert@twinsun.com>
! 
! 	* msdos.c (gettimeofday, init_gettimeofday, daylight, gmtoffset):
! 	Undo previous change to msdos.c.
! 	(init_environment): No need to call tzset and init_gettimeofday,
! 	since `main' now does that for us.
! 	(gettimeofday): Ignore tzp; it's obsolescent.
! 	(init_gettimeofday): Invoke tzset first.
! 	* s/msdos.h (LOCALTIME_CACHE, tzset): New macros.
! 
! Sun Sep 17 10:28:39 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
! 
! 	* xfns.c (x_decode_color): Get error if color not defined.
! 
! 	* xmenu.c (popup_get_selection): Pop menu down if button is pressed
! 	outside the menu.
! 
! 	* minibuf.c (read_minibuf_unwind): Use safe_run_hooks.
! 
! 	* keyboard.c (safe_run_hooks): No longer static.
! 
! 	* keyboard.c (read_char_x_menu_prompt):
! 	When unreading events generated by a menu,
! 	turn symbols and integers into lists,
! 	for the sake of last_nonmenu_event and thus y-or-n-p.
! 
! Fri Sep 15 12:45:31 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
! 
! 	* lread.c (Fload): Rename arg STR to FILE.
! 
! Thu Sep 14 03:11:15 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
! 
! 	* ralloc.c (r_alloc_sbrk): Get the right heap data address
! 	in multi-heap case.
! 
! Tue Sep 12 13:33:31 1995  Karl Heuer  <kwzh@gnu.ai.mit.edu>
! 
! 	* s/isc2-2.h (BROKEN_SELECT_NON_X): Define this instead of turning
! 	off HAVE_SELECT.
! 	* s/isc3-0.h (BROKEN_SELECT_NON_X): Moved to s/isc2-2.h.
! 	(HAVE_SELECT): Deleted; s/isc2-2.h no longer undefs this.
! 
! Tue Sep 12 01:39:15 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* insdel.c (signal_after_change): Call report_interval_modification.
! 
! 	* textprop.c (call_mod_hooks): Moved from intevals.c
! 	(verify_interval_modification): Moved from intervals.c.
! 	(interval_insert_behind_hooks, interval_insert_in_front_hooks):
! 	New variables.
! 	(report_interval_modification): New function.
! 	* intervals.c (call_mod_hooks, verify_interval_modification):
! 	Functions moved to textprop.c.
! 
! Sun Sep 10 20:12:36 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* xmenu.c (xmenu_show): Ignore `quote' when looking up the result.
! 
! Sun Sep 10 04:06:23 1995  Paul Eggert  <eggert@twinsun.com>
! 
! 	* editfns.c (Fencode_time): Use mktime to do the real work;
! 	this fixes bugs involving out-of-range dates and leap seconds,
! 	and allows date arithmetic via out-of-range values for arguments.
! 	Allow the ZONE parameter to be a TZ-style string.
! 	Doc string fix: `1900' -> `this century'.
! 	(set_time_zone_rule): New function.
! 	(Fset_time_zone_rule): Use it.
! 	(environ, make_time): Add extern declarations.
! 	(days_per_month): Remove.
! 
! Sat Sep  9 15:31:15 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* keyboard.c (command_loop_1): Set this_command to nil
! 	before reading a command.
! 
! 	* editfns.c (Fdecode_time): Doc fix.
! 
! Fri Sep  8 12:24:20 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* m/apollo.h (HAVE_UNISTD_H): Add #undef.
! 
! Thu Sep  7 06:12:50 1995  Paul Eggert  <eggert@twinsun.com>
! 
! 	* editfns.c (Fset_time_zone_rule): New function.
! 	(syms_of_editfns): defsubr it.
! 	* msdos.c (gettimeofday): Don't bother setting time zone,
! 	since nobody uses it, and our hacks to get it get in the way
! 	of the above fix.  Use simpler method for getting time stamp.
! 	(init_gettimeofday, daylight, gmtoffset): Remove.
! 	* msdos.h (init_gettimeofday): Remove declaration.
! 
! Wed Sep  6 04:25:50 1995  Paul Eggert  <eggert@twinsun.com>
! 
! 	* configure.in (LOCALTIME_CACHE): Define if tzset exists and
! 	if localtime caches TZ.  Check for tzset.
! 
! 	* emacs.c (main): Call tzset only if LOCALTIME_CACHE is	defined;
! 	not all Suns have this bug.
! 	* m/pmax.h, s/386bsd.h, s/bsd386.h, s/freebsd.h, s/gnu.h,
! 	s/netbsd.h (LOCALTIME_CACHE): Remove; now configured automatically.
! 
! Wed Sep  6 03:41:34 1995  Erik Naggum  <erik@naggum.no>
! 
! 	* alloc.c (Fmake_marker): Initialize insertion_type to 0.
! 
! Sun Sep  3 13:28:58 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* insdel.c (adjust_markers_for_insert): New function.
! 	(insert_from_buffer_1, insert_from_string_1, insert_1): Call it.
! 
! Fri Sep  1 21:19:14 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* fileio.c (Fmake_symbolic_link, Fadd_name_to_file):
! 	Look for handler for the new name as well as for the target.
! 
! 	* dired.c (Ffile_name_all_completions, Ffile_name_completion):
! 	Look for handler for FILE as well as for DIRNAME.
! 
! Thu Aug 31 22:00:41 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* marker.c (Fcopy_marker): New arg TYPE.
! 	(Fmarker_insertion_type, Fset_marker_insertion_type): New functions.
! 	(syms_of_marker): defsubr them.
! 
! 	* buffer.c (Fmake_indirect_buffer): Set the insertion_type of the
! 	zv_marker markers to 1.
! 
! 	* window.c (save_window_save): Pass the new arg to Fcopy_marker.
! 
! 	* editfns.c (save_excursion_save): Pass the new arg to Fcopy_marker.
! 
! Thu Aug 31 20:58:21 1995  Erik Naggum  <erik@naggum.no>
! 
! 	* keyboard.c (Fcommand_execute): Ignore `disabled' property on
! 	commands if `disable-command-hook' is nil.
! 
! Wed Aug 30 11:56:09 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* keyboard.c (read_key_sequence): Validate the event position
! 	before calling get_local_map.
! 
! Tue Aug 29 14:56:45 1995 Jack Repenning <jackr@sgi.com>
! 
!         * unexelfsgi.c: Compute new data offset based on memory
!         address; also, copy .got from memory not temacs.
! 
! Tue Aug 29 17:50:16 1995  Kim Storm  <kfs@olicom.dk>
! 
! 	* dosfns.c (Fmsdos_mouse_enable, Fmsdos_mouse_disable)
! 	(Fmsdos_mouse_init): New functions.
! 	(syms_of_dosfns): defsubr them.
! 	(Fmode25, Fmode4350): Call mouse_off unconditionally.
! 	(Fset_mouse_position): Return nil.
! 
! 	* msdos.h (sleep_or_kbd_init): Delete declaration.
! 
! 	* frame.c [!MULTI_FRAME] (Factive_minibuffer_window): New function.
! 	[!MULTI_FRAME] (syms_of_frame): defsubr it.
! 
! 	* sysdep.c (sys_subshell) [MSDOS]: Handle SUSPEND env var.
! 	Disable error report from subshell if system returns non-zero.
! 	Don't call vfork before calling system.
! 	Don't call wait_for_termination.
! 	(sys_select): Turn it off if MSDOS.
! 	(reset_sys_modes): Support EMACSCOLORS env var.
! 
! 	* puresize.h (SITELOAD_PURESIZE_EXTRA): New macro.
! 	(BASE_PURESIZE): Use SITELOAD_PURESIZE_EXTRA.
! 
! 	* msdos.c (putchar): Call internal_flush instead of _flsbuf.
! 	(DO_TERMSCRIPT): New macro to support open-termscript.
! 	(internal_flush): Corrected handling of flush in middle of
! 	escape sequences. Handle screen width > 127.
! 	(flush_escape): New function for use by internal_flush.
! 	(sys_select): New MS-DOS specific version with us timing.
! 	(EMACSCOLORS): New environment variable.
! 	(IT_clear_end_of_line): Set default face.
! 	(run_msdos_command): Restore mouse position after command.
! 	Close "backup fd"s.
! 	Corrected switch to cooked mode while running command.
! 	(mouse_on, mouse_off): Now checks have_mouse > 0.
! 	Note: "have_mouse < 0" means that a mouse is present, but
! 	it has been disabled via msdos-mouse-disable.
! 	(IT_write_glyphs): Allow esc-character itself to be printed.
! 	(event_timestamp): New function to make reliable times stamps.
! 	(sys_chdir): Skip drive letter before calling chdir.
! 	(sleep_or_kbd_hit): Handle 60 seconds time wrap.
! 	(mouse_get_pos): Return event_timestamp.
! 
! 
! Tue Aug 29 00:34:55 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* msdos.c (struct IT_menu_state): Refer to it as struct, not typedef.
! 
! 	* editfns.c (Fdecode_time): Doc fix.
! 
! 	* minibuf.c (Fdisplay_completion_list): Clear all text properties
! 	for the whitespace between completion items.
! 
! 	* xterm.c (x_wm_set_icon_pixmap): If trying to turn off icon
! 	pixmap, do nothing.
! 
! Mon Aug 28 16:38:40 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
! 
! 	* s/gnu.h (GETPGRP_NO_ARG, WAIT_USE_INT, UNEXEC): New macros.
! 	(HAVE_SOCKETS, A_TEXT_SEEK, NO_REMAP): Macros removed.
! 
! Sun Aug 27 19:52:53 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* doprnt.c (doprnt): Fix typo in error message.
! 
! Sat Aug 26 13:09:28 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* emacs.c (decode_env_path): Use ".", not nil, for current dir.
! 
! Tue Aug 22 17:00:39 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* keyboard.c (modifier_names): Add 4 bits to modifier bit positions.
! 
! Mon Aug 21 20:27:37 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* xdisp.c (display_text_line): Write blanks under the entire
! 	scroll bar, not just the first column.
! 
! Mon Aug 21 15:20:39 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* s/irix5-2.h (SA_RESTART): Add #undef.
! 
! 	* keyboard.c:
! 	(Qpost_command_idle_hook, Vpost_command_idle_hook): New vars.
! 	(syms_of_keyboard): Set up new vars.
! 	(command_loop_1): Run Qpost_command_idle_hook.
! 
! Sun Aug 20 11:45:10 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* s/aix3-1.h (SYSTEM_TYPE): Change to just "aix".
! 
! 	* s/aix4.h: Include aix3-2-5.h, not aix3-2.h.
! 	* s/aix4-1.h (sigsetmask, _setjmp, _longjmp): Delete undefs.
! 	[__GNUC__] (_NO_PROTO): Add undef.
! 
! 	* s/aix3-2-5.h (POSIX_SIGNALS, CLASH_DETECTION): Defined.
! 	(SIGNALS_VIA_CHARACTERS, MAIL_USE_LOCKF): Defined.
! 	(sigmask, sigsetmask, _setjmp, _longjmp): Add undefs.
! 
! Sat Aug 19 01:38:16 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* dispnew.c: Include syssignal.h.
! 
! 	* lisp.h (struct Lisp_Marker): Make insertion_type an unsigned int.
! 
! Wed Aug 16 15:27:26 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* syntax.c (scan_sexps_forward): Fix previous change.
! 
! Tue Aug 15 14:46:52 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* emacs.c (sort_args): Initialize best_priority smaller than any
! 	actual priority.
! 
! Mon Aug 14 13:12:24 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* fileio.c (Fwrite_region): New arg lockname.
! 	(auto_save_1): Pass new arg.
! 
! 	* callproc.c (Fcall_process_region): Pass new arg to Fwrite_region.
! 
! 	* emacs.c (standard_args): Fix previous change.
! 
! Mon Aug 14 12:01:33 1995  Erik Naggum  <erik@naggum.no>
! 
! 	* emacs.c (standard_args): Add option --eval to evalute an
!  	expression on the command line and print the result.
! 
! Mon Aug 14 04:09:24 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* cmds.c (Fself_insert_command): Optimize the case with arg > 2
! 	to avoid running change hooks lots of times.
! 
! Sun Aug 13 00:56:51 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* s/isc4-1.h (NO_SOCKETS_IN_FILE_SYSTEM): Defined.
! 	(START_FILES): Defined.
! 	(LIB_STANDARD): New definition, details depending on __GNUC__.
! 
! 	* syntax.c (scan_sexps_forward): Use the initial depth
! 	in the starting state for tracking when we reach TARGETDEPTH.
! 
! Fri Aug 11 18:35:14 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* m/alpha.h: Test OSF1, not __osf1__.
! 	(ORDINARY_LINK): Define only if OSF1.
! 	(PTY_ITERATION, PTY_NAME_SPRINTF, PTY_TTY_NAME_SPRINTF, PTY_OPEN):
! 	Define only if OSF1.
! 	(TEXT_END, DATA_END): Fix the definitions.
! 
! Thu Aug 10 00:48:40 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* s/linux.h (ULIMIT_BREAK_VALUE, SEGMENT_MASK): Moved to intel386.h
! 	(LIBS_SYSTEM): Define this instead of LIBS_MACHINE.
! 
! 	* m/intel386.h [linux] (ULIMIT_BREAK_VALUE, SEGMENT_MASK):
! 	Moved from linux.h.
! 
! 	* m/alpha.h [linux] (COFF, NO_TERMIO): Defined.
! 	[linux] (TEXT_END, DATA_END): New definitions.
! 
! 	* unexalpha.c (fatal_unexec): Use vfprintf, not _doprnt.
! 
! 	* m/alpha.h (LIBS_DEBUG, START_FILES, LIBS_MACHINE):
! 	Define only if __osf1__.
! 
! 	* macros.c (Fcancel_kbd_macro_events): New function.
! 	(syms_of_macros): defsubr it.
! 
! 	* frame.c (store_frame_param): Don't call set_menu_bar_lines if X.
! 
! Mon Aug  7 18:51:11 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* keyboard.c (read_key_sequence): Undo previous change.
! 	Instead, put back the orig_uppercase event if key is not defined.
! 	When downcasing, back up one step in key-translation processing.
! 
! 	* doprnt.c (doprnt): Error if %-width is too big.
! 
! 	* editfns.c (Fformat): Limit minlen to avoid stack overflow.
! 
! Mon Aug  7 13:48:47 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* insdel.c (signal_before_change, signal_after_change): Fix
! 	spelling of Vbefore_change_functions and Vafter_change_functions.
! 
! Mon Aug  7 13:51:48 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* doprnt.c (doprnt): Don't let size_bound be gigantic.
! 	Fix error message.
! 
! Sun Aug  6 01:02:06 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* buffer.c (get_truename_buffer): New function.
! 	* filelock.c (lock_file): Use get_truename_buffer.
! 
! 	* emacs.c (main) [USG5]: Call setpgrp without testing INTERRUPT_INPUT.
! 
! 	* xdisp.c (redisplay): Compute mini_frame the same way
!  	echo_area_display does.
! 
! 	* keyboard.c (kbd_buffer_store_event):
! 	Don't insert two buffer_switch_event's in a row.
! 
! 	* xfns.c (x_set_menu_bar_lines) [USE_X_TOOLKIT]: When turning
! 	menu bar on, make sure next redisplay creates it.
! 
! 	* eval.c (run_hook_with_args): Move the GCPRO2; add UNGCPRO.
! 
! 	* process.c (read_process_output, exec_sentinel): Call
!  	record_asynch_buffer_change after any eval.  Don't call
!  	prepare_menu_bars.
! 	(wait_reading_process_input): Don't call prepare_menu_bars.
! 
! Sat Aug  5 01:04:16 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* search.c (Freplace_match): New arg SUBEXP.
! 
! 	* eval.c (run_hook_with_args): Add gcpros.
! 	* print.c (print_string): Use insert_from_string for output to buffer.
! 	* minibuf.c (Fdisplay_completion_list): gcpro elt.
! 
! 	* insdel.c (signal_before_change, signal_after_change): Major rewrite.
! 	(before_change_function_restore, after_change_function_restore)
! 	(before_change_functions_restore, after_change_functions_restore):
! 	Functions deleted.
! 	* eval.c (run_hook_list_with_args): New function.
! 	* buffer.c (Qbefore_change_functions, Qafter_change_functions):
! 	New variables.
! 	(syms_of_buffer): Initialize them.
! 	* buffer.h (Qbefore_change_functions, Qafter_change_functions):
! 	Declared.
! 
! 	* frame.c (Fset_mouse_position, Fset_mouse_pixel_position): Doc fixes.
! 	[not MULTI_FRAME] (Fframe_visible_p): New function.
! 	[not MULTI_FRAME] (syms_of_frame): defsubr it.
! 
! 	* xfns.c (Ffocus_frame, Funfocus_frame): Make them no-ops.
! 
! Fri Aug  4 15:38:18 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* xterm.c (x_delete_display) [AIX]: Don't call XRmDestroyDatabase.
! 
! 	* msdos.c (IT_write_glyphs): Call ScreenSetCursor.
! 
! 	* lread.c (saved_doc_string*): New variables.
! 	(load_force_doc_strings): New variable.
! 	(syms_of_lread): Set up Lisp var load-force-doc-strings.
! 	(read_list): Handle load_force_doc_strings.
! 	Use the saved_doc_string, if it's right; otherwise, reread from file.
! 	(read1): Save last doc string in saved_doc_string.
! 
! Thu Aug  3 04:28:29 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* frame.c (set_menu_bar_lines, set_menu_bar_lines_1): New functions.
! 	(store_frame_parameter): Call set_menu_bar_lines.
! 	[!MULTI_FRAME] (Fmodify_frame_parameters): Call set_menu_bar_lines.
! 
! 	* frame.c: Move various Q... vars to top of file, unconditional.
! 	(Vterminal_frame): Just one definition, at top of file, unconditional.
! 	(syms_of_frame_1): New function.
! 	(syms_of_frame. both definitions): Call syms_of_frame_1.
! 
! Wed Aug  2 00:14:16 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* keyboard.c (read_key_sequence): Don't downshift an event
! 	if that fails to make it bound.
! 	(follow_key): Don't alter contents of NEXT until the end.
! 
! 	* xmenu.c [USE_X_TOOLKIT] (xmenu_show): Compute root-based
!  	coordinates.  Make a dummy event to pass them to lw_popup_menu.
! 
! 	* lread.c (Funintern): Fix deleting the last symbol in a chain.
! 
! Tue Aug  1 03:19:17 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* xdisp.c (redisplay): When displaying a terminal frame,
! 	if it isn't the same one as last time, clear it and redraw.
! 	Don't redisplay mini_frame as well, if it is a termcap frame.
! 
! 	* frame.c (do_switch_frame): Do nothing special when switching
! 	between terminal frames.
! 
! Mon Jul 31 14:17:30 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* s/usg5-4.h, s/sol2-5.h (GETTIMEOFDAY_ONE_ARGUMENT): Deleted;
! 	configure handles this now.
! 
! Mon Jul 31 06:04:12 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
! 
! 	* eval.c (run_hook_with_args): Renamed from Frun_hook_with_args.
! 	Take extra arg CONDITION, and return appropriately based on hook
! 	function value if CONDITION is until_success or until_failure.
! 	(Frun_hooks, Frun_hook_with_args,
! 	Frun_hook_with_args_until_success,
! 	Frun_hook_with_args_until_failure): New functions, use it.
! 	(syms_of_eval): defsubr them.
! 
! 	* lisp.h (Frun_hook_with_args,
! 	Frun_hook_with_args_until_success,
! 	Frun_hook_with_args_until_failure): Declare them.
! 
! Mon Jul 31 01:34:30 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* xterm.c (XTread_socket): For UnmapNotify, use x_top_window_to_frame.
! 
! 	* keyboard.c (kbd_buffer_get_event, swallow_events): Fix prev change.
! 
! Sun Jul 30 02:23:55 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* xmenu.c (single_submenu):
! 	Only ignore 1st char of pane name if that is an @.
! 
! 	* frame.c (Fmake_terminal_frame): Copy face_alist from selected frame.
! 
! 	* s/linux.h (HAVE_XRMSETDATABASE): Define if not defined.
! 
! Fri Jul 28 20:07:35 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* s/isc3-0.h (HAVE_SELECT): Defined.
! 
! 	* s/isc4-1.h (HAVE_SOCKETS, NEED_NET_ERRNO_H): Defined.
! 	(HAVE_TERMIOS): Defined.
! 	(HAVE_TERMIO): Add undef.
! 
! 	* s/isc4-0.h (sigblock, SIG_BLOCK): Don't define them if POSIX_SIGNALS.
! 
! 	* process.c: Maybe include net/errno.h.
! 
! 	* alloc.c (cons_cells_consed, floats_consed, vector_cells_consed)
! 	(symbols_consed, string_chars_consed, misc_objects_consed)
! 	(intervals_consed): New vars.
! 	(make_float, Fcons, make_interval, allocate_vectorlike, Fmake_symbol)
! 	(allocate_misc, make_uninit_string): Increment them.
! 	(Fmemory_use_counts): New function.
! 	(syms_of_alloc): defsubr it.
! 
! Fri Jul 28 14:49:20 1995  Gvran Uddeborg  <uddeborg@carmen.se>
! 
! 	* s/isc4-1.h: ISC 4.1 has termios.
! 
! Thu Jul 27 22:54:05 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* config.in (GETTIMEOFDAY_ONE_ARGUMENT): Add #undef.
! 
! Thu Jul 27 17:22:19 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* eval.c (syms_of_eval): Add missing defsubr.
! 
! 	* buffer.c: (struct sortstrlist): New type.
! 	(overlay_heads, overlay_tails): Change to struct sortstrlist.
! 	(overlay_heads_len, overlay_tails_len): Deleted; now part of struct.
! 	(record_overlay_string): New function.
! 	(overlay_strings): Simplify.  Use record_overlay_string.
! 	Check for window match in overlays_after loop, not just in
! 	overlays_before.
! 	Handle zero-sized overlays better.
! 
! Thu Jul 27 03:17:48 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* keymap.c (describe_buffer_bindings): Print bindings from
! 	Vfunction_key_map and from Vkey_translation_map.
! 	(describe_translation): New function.
! 	(describe_command): Handle vector like string.
! 	(describe_map_tree): New arg TRANSL.  Callers changed.
! 
! 	* keymap.c (Vkey_translation_map): Defined.
! 	(syms_of_keymap): Set up Lisp var.
! 	* keyboard.c (Vkey_translation_map): Just declare, don't define.
! 	(syms_of_keyboard): Don't set up Lisp var.
! 
! Wed Jul 26 04:21:28 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* Makefile.in (prefix-args): Pass ALL_LDFLAGS.
! 
! 	* xdisp.c (syms_of_xdisp): Doc fix.
! 
! 	* keyboard.c (kbd_buffer_get_event): Update input_pending after
! 	discarding one event from the queue, if we process the event here.
! 	(swallow_events): Likewise.
! 
! Tue Jul 25 16:18:18 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* m/iris4d.h (LIBS_MACHINE): Delete -lsun.
! 	* s/irix3-3.h (LIBS_SYSTEM): Defined.
! 
! 	* frame.h (struct frame): Rename `display' member to `output_data'.
! 	Use new data type name for output_data.x.
! 	* xterm.h (struct x_output): Renamed from struct x_display.
! 	* xterm.c, xfns.c, xmenu.c, dispnew.c, frame.c, xfaces.c: Do renamings:
! 	frame->display => frame->output, struct x_display -> struct x_output.
! 
! Tue Jul 25 15:25:56 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* lisp.h (Frun_hook_with_args): Declare this function.
! 	* eval.c (Frun_hook_with_args): New C function, formerly in subr.el.
! 	* insdel.c (signal_before_change): Use Frun_hook_with_args.
! 	(signal_after_change): Likewise.
! 
! Mon Jul 24 22:28:24 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* xterm.c (next_noop_dpyinfo): New variable.
! 	(XTread_socket): Use that to cycle through all displays for XNoOp.
! 
! Mon Jul 24 22:06:44 1995  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
! 
! 	* undo.c (Fprimitive_undo): Don't end inner loop
! 	just because a previous-modtime doesn't match any more.
! 
! Mon Jul 24 21:41:23 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* process.c (Fstart_process):
! 	Don't expand the file name before trying openp.
! 
! Sun Jul 23 03:09:39 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* xterm.h (struct x_display): New fields saved_button_event, id.
! 	* termhooks.h (enum event_kind): Added menu_bar_activate_event.
! 	* xterm.c (XTread_socket) [USE_X_TOOLKIT]: For ButtonPress in menu bar,
! 	save the event--don't pass to Xt yet.  Make a menu_bar_activate_event.
! 	(temp_index, temp_buffer): Now static.
! 	* keyboard.c (kbd_buffer_get_event) [USE_X_TOOLKIT]:
! 	Handle menu_bar_activate_event by calling x_activate_menubar.
! 	* xmenu.c: Include buffer.h.
! 	(x_activate_menubar): New function.
! 	(set_frame_menubar): New arg deep_p.  Callers changed.
! 	Run various hooks here when deep_p is true.
! 	(frame_vector): Variable deleted.
! 	(syms_of_xmenu): Don't staticpro it.
! 	(frame_vector_add_frame): Function deleted.
! 	(menubar_id_to_frame): New function.
! 	(menubar_selection_callback): Use menubar_id_to_frame.
! 	(next_menubar_widget_id): New variable.
! 	(set_frame_menubar): Use next_menubar_widget_id.
! 	(free_frame_menubar): Get id from f->display.x->id.
! 
! 	* xdisp.c (update_menu_bar): Pass new arg to set_frame_menubar.
! 	* xfns.c (x_menubar_window_to_frame): New function.
! 
! 	* window.c (Fprevious_window, Fnext_window): When minibuf = nil,
! 	accept only the minibuffer window that is currently active.
! 
! Fri Jul 21 01:11:06 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* lread.c (read_list): When a file loaded from site-init.el uses #$,
! 	turn it into a relative file name starting with ../lisp.
! 
! 	* dispnew.c (update_frame): Check that the echo area is in the
! 	frame being displayed.
! 
! 	* keyboard.c (command_loop_1): Clear echo area after 2 sec
! 	only if the minibuffer is in the same place as the echo area.
! 
! 	* window.h (echo_area_window): Declared.
! 
! 	* xdisp.c (echo_area_display): Use selected frame's minibuf window
! 	but don't set the minibuf_window (don't call choose_minibuffer_frame).
! 	(message2_nolog, message): Likewise.
! 	(echo_area_window): New variable.
! 	(echo_area_display): Set echo_area_window.
! 	(redisplay_window): Distinguish minibuf_window and echo_area_window.
! 
! 	* fileio.c (do_auto_save_unwind): Set auto_saving to 0.
! 	(Fdo_auto_save): Don't clear auto_saving here.  Set it to 1
! 	only when we make the unwind-protect.
! 
! 	* xdisp.c (redisplay): Skip shortcuts if buffer's clip_changed is set.
! 	(redisplay_window): If buffer's clip_changed is set, update mode line.
! 
! 	* frame.c (do_switch_frame): Don't call choose_minibuffer_frame.
! 	(choose_minibuf_frame): Choose frame regardless of minibuffer level.
! 	* minibuf.c (read_minibuf): Call choose_minibuffer_frame.
! 	First save the previous minibuf_window.
! 	(read_minibuf_unwind): Restore old minibuf_window.
! 
! Thu Jul 20 17:07:19 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* s/aix4.h (AIX4): New definition.
! 	* m/ibmrs6000.h (LD_SWITCH_MACHINE) [AIX4]: New alternate definition.
! 
! 	* xmenu.c (set_frame_menubar): If the Lisp-level menu bar menus
! 	are unchanged, don't recompute the widgets.
! 
! 	* xmenu.c (syms_of_xmenu): Set up Qdebug_on_next_call.
! 	(set_frame_menubar): Bind it to nil.
! 
! 	* fileio.c (Ffile_modes) [DOS_NT]: Use check_executable.
! 	(check_executable): DOS_NT code moved here from Ffile_modes.
! 	(check_writable): New code for MSDOS.
! 
! 	* editfns.c (Fformat): Doc fix.
! 
! Thu Jul 20 16:23:21 1995  Karl Heuer  <kwzh@gnu.ai.mit.edu>
! 
! 	* fns.c (Fsafe_length): Return a conservative upper bound.
! 
! Thu Jul 20 13:43:28 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* editfns.c (Fsubst_char_in_region):
! 	Bind buffer-file-name to nil if NOUNDO is true.
! 
! 	* insdel.c (prepare_to_modify_buffer): Don't lock the file
! 	if current_buffer->filename is nil.
! 
! 	* msdos.c (init_environment): Move alloca call out of function arg.
! 
! 	* puresize.h [!MULTI_FRAME] (BASE_PURESIZE): Increased to 325000.
! 
! Wed Jul 19 11:51:23 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* textprop.c (Fget_char_property): If OBJECT is non-current buffer,
! 	use it properly for overlays_at.
! 
! Tue Jul 18 00:35:09 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* alloc.c (init_alloc_once): Set gc_cons_threshold from Lisp obj size.
! 
! 	* editfns.c (Fmessage): Doc fix.
! 	(Fformat): Increment total for size of control string.
! 
! 	* window.c (Fwindow_start): Doc fix.
! 
! 	* xfaces.c (unload_color): Don't free colors if immutable colormap.
! 
! 	* eval.c (Ffuncall, Fapply): Doc fix.
! 
! 	* callint.c (Fcall_interactively): Doc fix.
! 
! 	* fileio.c (Fexpand_file_name): Initial ~ means name is absolute.
! 
! 	* config.in: Renamed from config.h.in.
! 	* paths.in: Renamed from paths.h.in.
! 	* Makefile.in: Renamed from Makefile.in.in.
! 	(paths.h): Depend on paths.in.
! 	(config.h): Depend on config.in.
! 	(distclean): Delete Makefile.c, not Makefile.in.
! 	(SOURCES): Corresponding changes.
! 
! 	* callproc.c (init_callproc): Set Vdoc_directory based on
! 	Vinstallation_directory when that's non-nil, regardless of whether
! 	we had to set Vexec_directory.
! 
! 	* unexsunos4.c (unexec): If not SUNOS4_SHARED_LIBRARIES
! 	or if apparently not dynamically linked, just clear rel and erel.
! 
! 	* s/sunos4shr.h (SUNOS4_SHARED_LIBRARIES): Defined.
! 
! Tue Jul 18 00:35:09 1995  Mikael Djurfeldt  <mdj@kidjo.nada.kth.se>
! 
! 	* xdisp.c (decode_mode_spec): New arg spec_width.
!   	Use pint2str for %l and %c.  New code to output ??.
!  	(display_mode_element): New var minendcol.
! 	Pass new arg to decode_mode_spec.
! 	(pint2str): New function.
! 
! Mon Jul 17 20:29:54 1995  Karl Heuer  <kwzh@kropotkin.gnu.ai.mit.edu>
! 
! 	* bytecode.c (Fbyte_code): Fix variable names in previous change.
! 
! Mon Jul 17 20:12:34 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* xfns.c [USE_MOTIF]: Don't include X11/Xaw/Paned.h, X11/Xaw/Label.h.
! 
! Sun Jul 16 12:51:08 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
! 
! 	* keyboard.c (kbd_buffer_get_event): Discard a selection_clear_event
! 	before processing it.
! 
! 	* bytecode.c (Fbyte_code): For Beqlsign, if both args are ints,
! 	compare as ints.
! 
! 	* xterm.c [HAVE_X11XTR6]: Include locale.h
! 	(x_term_init) [HAVE_X11XTR6]: Set LC_NUMERIC and LC_TIME back to C.
! 
! 	* data.c (Fnumber_to_string): Make `buffer' long enough.
! 
! Sat Jul 15 10:41:35 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
! 
! 	* xselect.c (x_clear_frame_selections): Delete duplicate code.
! 
! 	* alloc.c (Flist): Rewritten.
! 
! Thu Jul 13 07:17:08 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
! 
! 	* dispnew.c (Fsit_for): Don't call prepare_menu_bars here.
! 
! 	* emacs.c (main): Add to usage message.
! 
! 	* s/netbsd.h (AMPERSAND_FULL_NAME): Defined.
! 
! Wed Jul 12 23:13:15 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
! 
! 	* s/sco4.h (SCO_R4): Defined.
! 
! Mon Jul 10 02:14:37 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
! 
! 	* floatfns.c (Fexpt): Use EMACS_INT for integer calculation.
! 	(Ffloor): Likewise.
! 
! Sun Jul  9 03:10:06 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
! 
! 	* buffer.c (last_overlay_modification_hooks): New variable.
! 	(last_overlay_modification_hooks_used): Likewise.
! 	(syms_of_buffer): Init last_overlay_modification_hooks.
! 	(add_overlay_mod_hooklist): New function.
! 	(call_overlay_mod_hooks): Call add_overlay_mod_hooklist.
! 	(report_overlay_modification): When AFTER is non-nil,
! 	call the functions recorded in last_overlay_modification_hooks.
! 
! 	* s/aix4-1.h (_setjmp, _longjmp): Add #undef's.
! 
! 	* alloc.c (allocating_for_lisp): New variable.
! 	(init_intervals, make_interval, init_symbol, Fmake_symbol)
! 	(init_float, make_float, init_cons, Fcons)
! 	(allocate_vectorlike, init_marker, allocate_misc)
! 	(init_strings, make_uninit_string): Set allocate_misc temporarily.
! 
! 	* Makefile.in.in (TAGS): Use etags from build dir, but make TAGS
! 	file in source dir.
! 	(${lispsource}TAGS): Renamed from ../lisp/TAGS.  Deps changed too.
! 	(tags): Corresponding changes.
! 	(lisptagsfiles): Delete the term/*.el files.
! 
! 	* fileio.c (Fwrite_region): If fsync fails with EINTR, don't
! 	report a Lisp error.
! 
! Sat Jul  8 11:59:50 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
! 
! 	* process.c (keyboard_bit_set): Fix one-off in loop end.
! 
! Fri Jul  7 01:00:29 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
! 
! 	* keymap.c (current_minor_maps): Catch errors in Findirect_function.
! 	(current_minor_maps_error): New function.
! 
! Thu Jul  6 06:40:37 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
! 
! 	* frame.h (struct frame): New field `mouse_moved'.
! 	* keyboard.c (mouse_moved): Variable deleted.
! 	(kbd_buffer_get_event, readable_events):
! 	Check mouse_moved in all frames.
! 	Check do_mouse_tracking for non-nil ness.
! 	(Ftrack_mouse): Set do_mouse_tracking to t.
! 	* xterm.c (note_mouse_movement): Set mouse_moved in the x_display_info.
! 	(XTmouse_position, x_scroll_bar_note_movement): Likewise.
! 	(x_scroll_bar_report_motion): Likewise.
! 
! 	* xterm.c (x_draw_box, x_display_box_cursor, x_display_bar_cursor):
! 	New args x, y.  Don't use curs_x or curs_y here.  Callers changed.
! 
! 	* ntinevt.c (win32_mouse_position, mouse_moved_to):
! 	Access mouse_moved in selected_frame.
! 	* msdos.c (mouse_get_pos, mouse_check_moved, XMenuActivate):
! 	Access mouse_moved in selected_frame.
! 
! 	* lread.c (Fread): Rename arg READCHARFUN to STREAM.
! 
! 	* xfns.c (Fx_list_fonts): Don't free thisinfo if it is 0.
! 
! 	* sysdep.c (sys_close): Handle Sunos 4.1 bug in close errno value.
! 
! Wed Jul  5 07:17:02 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
! 
! 	* Makefile.in.in (lispsource): Renamed from lispdir.
! 
! 	* sysdep.c (init_system_name): Add cast in init for fqdn.
! 
! Mon Jul  3 09:51:41 1995  Michael Shields  <shields@tembel.org>
! 
! 	* m/intel386.h [linux]: Include values.h and #undef
! 	certain macros, to avoid conflict later.
! 
! Thu Jul  6 14:29:14 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* s/irix6-0.h [!__GNUC__] (LD_SWITCH_SYSTEM): Define this.
! 
! 	* s/usg5-4-2.h (LIB_MOTIF, VFORK_RETURN_TYPE): Define these.
! 
! 	* xterm.c (x_initialize) [USE_X_TOOLKIT]: Set fallback resources.
! 
! 	* window.c (Fset_window_hscroll): Set clip_changed in the buffer.
! 	(temp_output_buffer_show): Likewise.
! 
! 	* lisp.h (get_keymap_1): Declared.
! 
! 	* editfns.c (Fwiden): Set clip_changed in current buffer.
! 	(Fnarrow_to_region, save_restriction_restore): Likewise.
! 
! 	* buffer.c (overlays_in): Don't count empty overlays at END.
! 	(Foverlays_in): Likewise.
! 
! Sun Jul  2 02:02:44 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* keyboard.c (read_char): Temporarily clear Vquit_flag
! 	while checking Vspecial_event_map.
! 
! 	* xdisp.c (redisplay_window): Fix typos in clip_changed change.
! 
! 	* buffer.h (struct buffer): New field clip_changed.
! 
! 	* xdisp.c (clip_changed): Variable deleted.
! 	(prepare_menu_bars): Don't look at clip_changed.
! 	(redisplay): Don't set clip_changed.  Do set b's clip_changed.
! 	(redisplay_window): Check clip_changed in current_buffer.
! 	(mark_window_display_accurate): Clear clip_changed
! 	in the window's buffer.
! 
! Sat Jul  1 01:01:17 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* keyboard.c (Vspecial_event_map): New variable.
! 	(syms_of_keyboard): Define Lisp var; init the map.
! 	(read_char): Look up each event in Vspecial_event_map; if bound,
! 	execute the binding here and read another event.
! 	(keys_of_keyboard): Make bindings for iconify-frame,
! 	make-frame-visible and delete-frame.
! 
! 	* fns.c (Fsafe_length): New function.
! 	(syms_of_fns): defsubr it.
! 	* lisp.h (Fsafe_length): Declared.
! 	* xfaces.c (compute_char_face): Use Fsafe_length.
! 
! 	* s/aix4-1.h (sigsetmask): Add #undef.
! 
! 	* s/riscos5.h: New file.
! 
! 	* xfns.c (x_set_icon_type, x_set_icon_name): Don't ever remap the
!  	frame window; changing the icon doesn't make it disappear.
! 
! 	* process.c (Fstart_process): Expand PROGRAM.
!   	Error if it is a directory.
! 
! 	* s/sunos4shr.h (LIBXMU): New definitions (two alternative ones).
! 
! 	* s/sunos4-1-3.h: Don't use sunos4shr.h; go back to 19.28 definition.
! 
! Fri Jun 30 16:58:15 1995  Geoff Voelker  (voelker@cs.washington.edu)
! 
! 	* nt.c (PASSWD_FIELD_SIZE): Defined.
! 	(the_passwd_name, the_passwd_passwd, the_passwd_gecos,
! 	the_passwd_dir, the_passwd_shell, getpwuid): Use PASSWD_FIELD_SIZE.
! 	(get_emacs_configuration): Check if processor macros are defined.
! 
! 	* ntheap.c: Include config.h.
! 	(syspage_mask, real_data_region_end): Defined.
! 	(allocate_heap) [WINDOWS95]: Reverse conditional, end search
! 	at 0xD00000.
! 	(sbrk): Commit and uncommit memory in machine dependent
! 	page size chunks.
! 
! 	* s/windows95.h (CANNOT_DUMP): Undefined.
! 	* makefile.nt (EMACS) [win95]: Removed.
! 
! 	* makefile.nt (TLASTLIB): Defined.
! 	(TEMACS): Use TLASTLIB.
! 	* unexnt.c (get_section_info): Set the end of the data region
! 	to be just before the start of the shared library data.
! 	(read_in_bss): Read directly into memory.
! 	(map_in_heap): Read directly into memory if unable to map.
! 
! Fri Jun 30 03:58:33 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* s/hpux9.h (LIBX11_SYSTEM): Add undef.
! 
! 	* m/intel386.h [SOLARIS] (LIBS_MACHINE): Move this out of the
! 	SOLARIS2_4 conditional.
! 
! 	* xdisp.c (redisplay_window): Update individual window's mode line
! 	if %c calls for an update.
! 	(redisplay): Set update_mode_line for selected window only,
! 	if it needs this because of %c.
! 
! Thu Jun 29 11:54:39 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* s/aix3-2-5.h (C_OPTIMIZE_SWITCH, C_DEBUG_SWITCH): Use these
! 	names instead of C_SWITCH_OPTIMIZE, C_SWITCH_DEBUG.
! 
! 	* s/aix4.h: Include aix3-2.h, not aix3-2-5.h.
! 
! 	* callproc.c (child_setup): Don't get confused if in == err.
! 
! 	* xterm.c (XTread_socket): Turn off meta, super, hyper and alt bits
! 	in the arg for XLookupKey.
! 
! Wed Jun 28 18:50:19 1995  Morten Welinder  <terra+@cs.cmu.edu>
! 
! 	* unexmips.c [MACH]: Include a.out.h.
! 	[MACH] (STYP_INIT, _RDATA, STYP_RDATA, _SDATA, STYP_SDATA): Defined.
! 	[MACH] (_SBSS, STYP_SBSS, HDRR, pHDRR): New definitions.
! 	(unexec): Add MACH conditionals.
! 
! 	* m/pmax.h [MACH]: Use built-in alloca, set START_FILES.
! 
! 	* s/mach-bsd4-3.h: New file.
! 
! Wed Jun 28 02:07:24 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* term.c (term_init): Alternative error messages for TERMCAP/TERMINFO.
! 
! 	* m/alpha.h (PTY_ITERATION, PTY_NAME_SPRINTF, PTY_OPEN)
! 	(PTY_TTY_NAME_SPRINTF): New definitions.
! 
! 	* dispnew.c (update_frame): Pretend cursor is in echo area
! 	rather than put it in a minuffer hidden by the echo area.
! 
! Tue Jun 27 04:28:21 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* s/hpux9.h (LIBXMU): New definition.
! 
! 	* s/hpux9-x11r4.h, s/hpux9shxr4.h: New files.
! 
! 	* xmenu.c (single_submenu): Handle commands appearing directly
! 	in the menu bar.
! 
! Mon Jun 26 02:40:10 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* xterm.c (x_display_bar_cursor, x_display_box_cursor):
! 	Don't alter curs_x or curs_y here.
! 	(x_display_cursor): Copy them from the frame cursor here.
! 	(x_update_cursor): New function.
! 	(frame_highlight, frame_unhighlight): Use x_update_cursor.
! 
! 	* xdisp.c (echo_area_display): Don't set FRAME_CURSOR_... here.
! 	(redisplay): In the "point hasn't moved" shortcut,
! 	make sure that the cursor is in the right window already.
! 
! 	* msdos.c (IT_cursor_to, IT_clear_end_of_line, IT_write_glyphs):
! 	(IT_set_face): Call internal_flush if short of room.
! 
! Sun Jun 25 16:38:41 1995  Morten Welinder  <terra+@cs.cmu.edu>
! 
! 	* emacs.c (init_cmdargs): Make Vinvocation_directory
! 	absolute if it isn't already.
! 
! Sun Jun 25 01:15:31 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* frame.c (Fdelete_frame): It's ok to have no minibuffer left on
! 	a kboard if there are no frames on it either.
! 
! 	* buffer.c (overlays_in): New function.
! 	(Foverlays_in): New function.
! 	(syms_of_buffer): defsubr it.
! 
! 	* xfns.c (Fx_open_connection, x_display_info_for_name):
! 	Error if window-system is not x.
! 
! 	* process.c (Fopen_network_stream): Sleep 1 sec before connect retry.
! 
! 	* frame.c (next_frame, prev_frame): Consider only frames on same kbd.
! 	(Fdelete_frame): If next_frame finds nothing, try an alternative.
! 
! 	* buffer.c (overlay_strings): Fix calls to xrealloc.
! 
! Sat Jun 24 00:06:46 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* s/aix4-1.h (LIB_MOTIF): Defined.
! 
! 	* emacs.c (main): Fix --help message.
! 
! 	* window.c (Fsplit_window): Nicer error if split size is too small.
! 
! 	* Makefile.in.in (LIBXMU): New macro.
! 	(LIBXT): Use LIBXMU.
! 
! Fri Jun 23 19:29:53 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* fileio.c (directory_file_name): Don't get confused by // at end
! 	on Unix-like systems.
! 
! Thu Jun 22 10:47:43 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* xmenu.c (menu_item_enabled_p_1): Special handling for quit.
! 	(set_frame_menubar): Inhibit quitting.
! 
! Wed Jun 21 19:06:36 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* buffer.c (syms_of_buffer): Doc fix.
! 
! 	* Makefile.in.in (SOME_MACHINE_OBJECTS): Add dosfns.o,
! 	intervals.o, textprop.o.
! 
! Wed Jun 21 14:08:45 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* Version 19.29 released.
! 
! 	* xfns.c (Fx_display_grayscale_p): Return t or nil.
! 	Return t for color displays.
! 
! 	* s/msdos.h (SYSTEM_PURESIZE_EXTRA): Increased to 68000.
! 
! 	* xdisp.c (decode_mode_spec) [!MULTI_FRAME]: Handle %F properly.
! 
! Tue Jun 20 10:58:14 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* keyboard.c (read_key_sequence): Don't use Vprefix_help_command
! 	for the first character in a key seq.
! 
! 	* ntinevt.c (map_virt_key): Mark some additional chars as valid ASCII.
! 
! 	* ntterm.c (ctrl_c_handler): Ignore CTRL_BREAK_EVENT signals.
! 
! Mon Jun 19 12:13:38 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* sysdep.c (rmdir): Fix up Aug 19 1993 change that wasn't done right.
! 
! 	* ntproc.c (win32_wait): Massage retval into what is expected in Unix.
! 
! 	* process.c (sigchld_handler): Change XSETFASTINT to XSETINT.
! 
! 	* keyboard.c (Freset_this_command_lengths): New function.
! 	(before_command_key_count, before_command_echo_length)
! 	(before_command_restore_flag): New variables.
! 	(add_command_key): If requested, reset the lengths.
! 	(command_loop_1): Record current lengths before reading cmd.
! 	(read_char): Update the recorded length before echoing.
! 
! 	* xfns.c (Fx_create_frame): Fix last arg to x_get_arg for Qdisplay.
! 
! 	* s/linux.h (LIB_GCC): Fix previous change.
! 	If we redefine it later, #undef it first.
! 
! Sun Jun 18 14:24:37 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* keyboard.c (quit_throw_to_read_char): Turn off the error check
! 	testing poll_suppress_count.
! 
! 	* s/linux.h (LIB_GCC): Define here, overriding Makefile.in.in,
! 	so as to use C_SWITCH_X_MACHINE.
! 
! Sat Jun 17 10:05:04 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* m/alpha.h (SYSTEM_MALLOC): Definition deleted.
! 
! 	* keymap.c (Vdefine_key_rebound_commands): New variable.
! 	(syms_of_keymap): Set up Lisp var.
! 	(Fdefine_key): Put new definition onto Vdefine_key_rebound_commands.
! 
! 	* xmenu.c (menu_item_equiv_key): Do reconsider a command that had
!  	no equivalent before, if it is in Vdefine_key_rebound_commands.
! 
! 	* data.c (Flocal_variable_if_set_p): New function.
! 	(syms_of_data): Call defsubr.
! 
! 	* xdisp.c (display_text_line): Fill in charstart for end of buffer.
! 
! Fri Jun 16 18:26:08 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* puresize.h [MULTI_FRAME] (BASE_PURESIZE): Increase to 315000.
! 
! 	* frame.c (Fdelete_frame): Use do_switch_frame directly.
! 	(do_switch_frame): No longer static.
! 	* window.c (Fset_window_configuration): Use do_switch_frame directly.
! 	* keyboard.c (quit_throw_to_read_char): Use do_switch_frame directly.
! 	* lisp.h (do_switch_frame): Declared.
! 
! Fri Jun 16 18:17:59 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* frame.c [MULTI_FRAME] (Fignore_event): New function.
! 	[MULTI_FRAME] (keys_of_frame): Bind iconify-frame and
! 	make-frame-visible to it.
! 
! Fri Jun 16 00:30:17 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* .gdbinit: Use long, not EMACS_INT.
! 	Do `set main' to make gdb_valbits etc. available.
! 
! 	* frame.h (struct frame): New field icon_name.
! 	* xterm.h (struct x_display): icon_name deleted.
! 	* xfns.c (x_report_frame_params, x_set_icon_type, x_set_icon_name)
! 	(x_set_name, x_icon, Fx_create_frame): Use moved icon_name field.
! 	* alloc.c (mark_object): Mark icon_name field.
! 
! Thu Jun 15 16:48:21 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* keyboard.h (struct kboard): Add Voverriding_terminal_local_map.
! 	* keyboard.c (init_kboard): Initialize it.
! 	(syms_of_keyboard): Defvar it.
! 	(read_key_sequence, menu_bar_items):
! 	Check Voverriding_terminal_local_map before Voverriding_local_map.
! 	* doc.c (Fsubstitute_command_keys): Likewise.
! 	* keymap.c (Fkey_binding, describe_buffer_bindings): Likewise.
! 
! 	* xdisp.c (Qoverriding_terminal_local_map): New variable.
! 	(syms_of_xdisp): staticpro it.
! 	(update_menu_bar): If we bind overriding-local-map, also bind
! 	overriding-terminal-local-map.
! 
! 	* frame.c (Fhandle_switch_frame): Preserve prefix arg.
! 	* keyboard.c (command_loop_1): In special handling for commands
! 	that create a prefix arg, don't handle commands that merely
! 	preserve one that was previously created.
! 
! 	* .gdbinit ($valmask): Use EMACS_INT, not int.
! 
! 	* lisp.h (enum pvec_type): Don't use trailing comma.
! 
! Thu Jun 15 09:58:49 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* m/alpha.h (malloc, realloc): If not _MALLOC_INTERNAL,
! 	always use void *.
! 
! Thu Jun 15 22:12:04 1995  Geoff Voelker  <voelker@cs.washington.edu>
! 
! 	* callproc.c (call-process-region) [DOS_NT]: Use IS_DIRECTORY_SEP.
! 	(call-process-region) [WINDOWSNT]: Use proper temp file template.
! 
! 	* ntproc.c (win32_spawnve): Accept program names without executable
! 	suffixes.
! 
! 	* makefile.nt (TRES) [MSVCNT11]: Use emacs.res, and don't compile it.
! 
! Thu Jun 15 01:30:14 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* m/alpha.h (LD_SWITCH_MACHINE): Don't define it.
! 	(malloc, realloc): If non-ANSI C, declare value as char *.
! 
! Wed Jun 14 19:10:35 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* sysdep.c (emacs_set_tty): Swap TCSETAF and TCSETAW.
! 	Rename arg waitp to flushp.
! 
! Wed Jun 14 18:07:40 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* callint.c (Fprefix_numeric_value): Fix type check.
! 
! 	* keyboard.c (command_loop_1): Clear prefix arg (undo Feb 1 change).
! 
! Wed Jun 14 15:52:55 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* data.c (Flocal_variable_p): Fix backwards logical operator.
! 
! Wed Jun 14 14:47:53 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* m/intel386.h: If NOT_C_CODE, don't include alloca.h.
! 	[!__GNUC__] (C_SWITCH_MACHINE): Disable this; it seems to confuse cpp.
! 
! Wed Jun 14 08:21:18 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* frame.c (Fdelete_frame): If the minibuf window was selected,
! 	make that remain so.
! 
! 	* process.c (status_notify): Undo May 18 change.
! 	Set update_tick at the beginning not at end.
! 
! 	* buffer.c (Fprevious_overlay_change): Check for overlays that
! 	end at POS.
! 
! Tue Jun 13 20:40:48 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* xfns.c (syms_of_xfns): Initialize Vx_no_window_manager.  Doc fix.
! 
! Tue Jun 13 17:43:12 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* m/ibmrs6000.h (LIBS_MACHINE): Use -lpthreads, not -lpthread.
! 	* config.h.in (HAVE_LIBPTHREADS): Add #undef.
! 
! Mon Jun 12 13:21:15 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
! 
! 	* mem-limits.h [_LIBC] (start_of_data): Define to &__data_start
!  	for GNU libc.
! 
! Sun Jun 11 16:46:37 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
! 
! 	* xmenu.c (frame_vector_add_frame): Don't forget to store
! 	the longer vector.
! 
! 	* xterm.h (struct x_display): New field asked_for_visible.
! 	* xterm.c (x_make_frame_visible): Test and set asked_for_visible.
! 
! 	* widget.c (EmacsFrameSetCharSize): Manually alter the height
! 	and width of the outer widget (and the width of the column widget)
! 	carefully using deltas.
! 	Set update_hints_inhibit nonzero while updating.
! 	Then call update_wm_hints explicitly.
! 	(update_wm_hints): Use 0 for min_rows, min_cols.
! 	Do nothing if update_hints_inhibit is nonzero.
! 
! 	* xterm.c: Include widget.h.
! 	(x_wm_set_size_hint) [USE_X_TOOLKIT]:
! 	Get the size from the outer widget.
! 	Copy the base and minimum sizes from the old hint.
! 
! 	* xfns.c [USE_X_TOOLKIT] (x_window): If using Motif,
! 	add some extra to sizes, for consistent behavior.
! 
! Sat Jun 10 00:57:13 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
! 
! 	* dispnew.c (Fframe_or_buffer_changed_p): Calculate vector size right.
! 	Add hysteresis when making it larger.  Fill it up reliably
! 	and check at the end for overflowing it.
! 	(syms_of_display): Make frame_and_buffer_state initially with 20 elts.
! 
! 	* keyboard.c (read_char_minibuf_menu_prompt):
! 	If the char to type doesn't match the prompt string,
! 	show the char explicitly.
! 
! Sat Jun 10 17:44:38 1995  Geoff Voelker  <voelker@cs.washington.edu>
! 
! 	* ntterm.c,ntproc.c,nt.c: Include config.h before stdio.h.
! 
! Fri Jun  9 22:11:59 1995  Geoff Voelker  <voelker@cs.washington.edu>
! 
! 	* makefile.nt (TEMACS): Depend upon $(BLD).
! 	(temacs): Remove $(BLD) dependency.
! 
! Fri Jun  9 17:05:27 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
! 
! 	* xterm.c (x_get_keysym_name): New function.
! 	* keyboard.c (modify_event_symbol): Mask out high bits here,
! 	and only for certain purposes.  table_size now unsigned.
! 	(modify_event_symbol) [HAVE_X_WINDOWS]:	Use x_get_keysym_name.
! 	(make_lispy_event): Don't mask high bits here.
! 	Supply -1 as table_size for system-specific keys.
! 
! 	* xdisp.c (update_menu_bar): Use set_buffer_internal_1 to switch bufs.
! 	Run the hooks in the proper buffer.
! 	Normally bind overriding-local-map to nil.
! 	(Qoverriding_local_map): New variable.
! 	(syms_of_xdisp): staticpro it.
! 
! Fri Jun  9 11:44:06 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* keyboard.h (struct kboard): New member system_key_syms.
! 	* alloc.c (mark_kboards): Mark it.
! 	* keyboard.c (system_key_syms): Deleted; now part of struct kboard.
! 	(make_lispy_event): Use the struct member.
! 	(init_kboard): Initialize it.
! 	(syms_of_keyboard): Delete initialization and staticpro.
! 
! 	* Makefile.in.in (SOURCES): Makefile isn't source; Makefile.in.in is.
! 
! Thu Jun  8 15:00:47 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
! 
! 	* keyboard.c (Fevent_convert_list): Renamed from
! 	convert_event_type_list.
! 	(syms_of_keyboard): defsubr it.
! 	* keymap.c (Flookup_key, Fdefine_key): Use Fevent_convert_list.
! 
! 	* xmenu.c (xmenu_show): Do call lw_destroy_all_widgets.
! 	(xdialog_show): Likewise.
! 	(popup_get_selection): Don't call it here.
! 
! 	* search.c (Freplace_match): Fix check for valid reg in string replace.
! 	Do the right thing with backslash.
! 
! 	* keyboard.c (Vhelp_event_list): New var.
! 	(syms_of_keyboard): Set up Lisp var.
! 	(help_char_p): New function.
! 	(read_char, echo_char, read_key_sequence): Use help_char_p.
! 
! 	* keyboard.h (Vlucid_menu_bar_dirty_flag): Declare this variable.
! 	(Qrecompute_lucid_menubar, Qactivate_menubar_hook): Likewise.
! 
! 	* keyboard.c (read_key_sequence): Don't run activate-menubar-hook
! 	or call recompute-lucid-menubar.
! 
! 	* xdisp.c (update_menu_bar): Run activate-menubar-hook
! 	and call recompute-lucid-menubar.
! 
! Thu Jun  8 15:13:39 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* commands.h (last_command): Declaration deleted.
! 	* keyboard.h (struct kboard): New member Vlast_command.
! 	* keyboard.c (last_command): Var deleted; now part of struct kboard.
! 	(init_kboard): Initialize it.
! 	(syms_of_keyboard): Defvar it.
! 	(command_loop_1): Make last_command be kboard-local.
! 	* cmds.c (internal_self_insert): Likewise.
! 	* minibuf.c (Fminibuffer_complete): Likewise.
! 
! 	* m/ibmrs6000.h (LIBS_MACHINE): Use -lpthread if it exists.
! 
! 	* m/alpha.h (LIBS_MACHINE): Define to -ldnet or -ldnet_stub.
! 
! 	* s/msdos.h (SYSTEM_PURESIZE_EXTRA) [!HAVE_X_WINDOWS]:
! 	Increase to 62000.
! 
! 	* process.c [!subprocesses]: Include sysselect.h.
! 
! 	* xmenu.c (xmenu_show): If !HAVE_X_WINDOWS, don't reference X display.
! 
! Wed Jun  7 14:37:31 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* keyboard.h (struct kboard): member Vprefix_arg restored, replacing
! 	prefix_factor, prefix_value, prefix_sign, and prefix_partial.
! 	* callint.c (current_prefix_partial): Deleted.
! 	(Vprefix_arg): Deleted; not part of struct kboard again.
! 	(Funiversal_argument, Fnegative_argument, Fdigit_argument)
! 	(clear_prefix_arg, finalize_prefix_arg, describe_prefix_arg): Deleted.
! 	(syms_of_callint): Use DEFVAR_KBOARD for Vprefix_arg.
! 	Remove defsubrs for deleted functions.
! 	* lisp.h: Remove declarations for deleted vars and functions.
! 	* alloc.c (mark_kboards): Mark Vprefix_arg instead of
! 	prefix_factor and prefix_value.
! 	* macros.c (Fexecute_kbd_macro): Vprefix_arg is now part of kboard.
! 	* keyboard.c (cmd_error, command_loop_1, Fcommand_execute)
! 	(Fexecute_extended_command, init_kboard, syms_of_keyboard):
! 	Undo Feb 28 change; prefix arg handling is now in Lisp code again.
! 
! 	* buffer.c: (syms_of_buffer): Doc fix.
! 
! 	* buffer.c: (Fbuffer_disable_undo): Make this function interactive.
! 
! Wed Jun  7 11:08:58 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
! 
! 	* data.c (Flocal_variable_p): New optional arg BUFFER.
! 	Really check whether var is local in *that* buffer.
! 
! 	* xfns.c (x_real_positions): Uncatch and recatch X errors in the loop.
! 
! 	* filelock.c (unlock_file, lock_file): Call Fexpand_file_name.
! 
! Mon Jun  5 13:30:54 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* Makefile.in.in (TOOLKIT_DEFINES): Define.
! 	(ALL_CFLAGS): Insert $(TOOLKIT_DEFINES) here.
! 	* xfns.c (syms_of_xfns): Provide motif in Motif version.
! 
! 	* lisp.h: (Fwaiting_for_user_input_p): Function declared.
! 	(Fupcase_initials, Fupcase_initials_region): Likewise.
! 	(Fplist_get, get_local_map, Fx_popup_menu, Fx_popup_dialog): Likewise.
! 	(Fframe_first_window): Likewise.
! 	* keyboard.c (cmd_error): Use NULL, not 0, as arg to
! 	cmd_error_internal.
! 	(menu_bar_items): Likewise, for arg of current_minor_maps.
! 	(record_char): Add cast.
! 	* indent.c (Fvertical_motion): Add cast.
! 	* undo.c (record_insert): Change args to be ints, not Lisp_Objects.
! 	* casefiddle.c (casify_region): Use explicit local vars for start
! 	and end, so that the type will be correct.
! 	(operate_on_word): Likewise for iarg in this function.
! 	(upcase_initials, upcase_initials_region): Deleted; these were
! 	redundant copies of Fupcase_initials and Fupcase_initials_region.
! 	* abbrev.c (Fexpand_abbrev): Call to upcase_initials_region
! 	changed to Fupcase_initials_region for consistency.
! 	* search.c (Freplace_match): Likewise.
! 	* alloc.c: Declare sbrk.
! 
! 	* xdisp.c: Include keyboard.h.
! 
! 	* s/irix5-0.h (POSIX_SIGNALS): Defined.
! 
! Sat Jun  3 19:02:35 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
! 
! 	* xterm.c (x_wm_set_icon_pixmap): Set IconPixmapHint in both cases.
! 
! 	* buffer.c (Fkill_buffer): When killing indirect buffer,
! 	unchain that buffer's markers (only) from the common chain.
! 	Don't rekill this buffer's indirect buffers that are dead.
! 	Do nothing if this buffer is already dead.
! 
! Sat Jun  3 12:57:01 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* editfns.c (Fencode_time): Doc fix.
! 
! 	* fns.c (NULL): Define if not defined.
! 
! Fri Jun  2 17:05:37 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
! 
! 	* xfns.c (Fx_create_frame): Make sure icon_name is a string or nil.
! 
! 	* xterm.h (struct x_display): Rename icon_label to icon_name
! 	and make it a Lisp_Object.
! 
! 	* xfns.c (Qicon_name): New variable.
! 	(Fx_create_frame): Look for icon-name parm and set icon_label field.
! 	(x_set_icon_type): Compute arg to x_text_icon
! 	based on frame name and icon_name fields.
! 	(x_set_icon_name): New function.
! 	(x_icon): Call x_text_icon.
! 	(x_set_name): Look at icon_name field when setting the icon name,
! 	(x_frame_parms): Add icon-name.
! 	(syms_of_xfns): Set up Qicon_name.
! 
! 	* xterm.c (x_text_icon): Do call XSetIconName or XSetWMIconName.
! 	Don't save ICON_NAME anywhere.
! 
! 	* sysdep.c (old_tty_valid): New variable.
! 	(init_sys_modes): Set old_tty_valid if we set old_tty.
! 	(reset_sys_modes): Restore tty settings only if old_tty_valid.
! 
! 	* term.c (cursor_to, clear_to_end_of_line_raw):
! 	If chars_wasted is 0, do nothing.
! 	(clear_end_of_line): Don't die if chars_wasted is 0.
! 
! 	* search.c (trivial_regexp_p): = is special after \.
! 
! 	* s/ptx.h (HAVE_SELECT, HAVE_TIMEVAL): Definitions deleted.
! 
! Thu Jun  1 18:47:56 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* xfns.c (x_destroy_bitmap): Block and unblock input.
! 	(Fx_horizontal_line): Add one UNBLOCK_INPUT to fix a misbalance,
! 	and move another one to include the call to XFreeGC, in case we
! 	someday remove the "#if 0" conditions.
! 	* widget.c (EmacsFrameDestroy): Block and unblock input.
! 
! Wed May 31 23:08:12 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
! 
! 	* xfns.c (x_display_info_for_name): Fix error message.
! 	(Fx_open_connection): Fix error messages.
! 
! Tue May 30 17:49:03 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* s/sol2-4.h (LD_SWITCH_SYSTEM): Copied back from s/sol2-3.h;
! 	added references to /usr/dt/lib.
! 
! 	* xfns.c (syms_of_xfns): Allow PATH_BITMAPS to be a
! 	colon-separated list.
! 
! 	* editfns.c (syms_of_editfns): user-login-name renamed from user-name.
! 	user-real-login-name renamed from user-real-name.
! 	C names changed to Vuser_real_login_name, Vuser_login_name as well.
! 	* nt.c: Change Vuser_real_name to Vuser_real_login_name.
! 
! Tue May 30 12:13:28 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
! 
! 	* xfns.c (x_top_window_to_frame): Don't match menu-bar widget.
! 
! 	* xdisp.c (update_menu_bar): Reverse test of save_match_data.
! 
! 	* xmenu.c (set_frame_menubar): Always call update_frame_menubar.
! 
! 	* xfns.c (x_window): Use applicationShellWidgetClass,
! 	not topLevelShellWidgetClass.  Call lw_set_main_areas after
! 	creating the menubar widget.
! 
! Mon May 29 16:53:49 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* xdisp.c (update_menu_bar): Do update if region display has changed.
! 
! 	* frame.c (make_frame_without_minibuffer): New arg DISPLAY.
! 	If there's no minibuffer frame to use, create one.
! 	* xfns.c (Fx_create_frame): Pass new arg to
! 	make_frame_without_minibuffer.
! 
! 	* fns.c (Frandom): Use EMACS_INT, not int.
! 	Use NULL, not 0, as arg of `time'.
! 
! 	* frame.c: Declare x_get_focus_frame.
! 	(Fmouse_position): Use NULL, not 0, as arg of pixel_to_glyph_coords.
! 	* keyboard.c (make_lispy_event, make_lispy_movement): Likewise.
! 
! Mon May 29 20:10:20 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
! 
! 	* xterm.c (XTread_socket) [USE_X_TOOLKIT]: Do pass MotionNotify events
! 	to the toolkit.
! 
! 	* keyboard.c (Fset_input_mode): When read_socket_hook, ignore
! 	what the user specified, and set interrupt_input in the preferred
! 	way for this system.
! 
! 	* xterm.c (x_term_init): Call init_sigio only if interrupt_input.
! 
! Sun May 28 23:58:00 1995  Morten Welinder  <terra+@cs.cmu.edu>
! 
!         * s/osf1.h (COFF): Define.
!         * m/alpha.h (LD_SWITCH_MACHINE) [!__GNUC__]: Don't define.
!         (r_alloc, r_re_alloc, r_alloc_free) [REL_ALLOC,
!         !_MALLOC_INTERNAL, !NOT_C_CODE]: Prototype.
! 
! Sun May 28 17:11:38 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
! 
! 	* xterm.c (x_set_offset): Distinguish CHANGE_GRAVITY < 0 case.
! 	* xfns.c (x_set_frame_parameters): Pass -1 to x_set_offset.
! 
! 	* xfns.c (x_report_frame_params): Report top and left
! 	in a way that represents negative offsets correctly.
! 
! 	* syntax.c (describe_syntax_1): Pass new arg to describe_vector.
! 
! 	* keymap.c (describe_vector): New arg entire_map.
! 	Don't show bindings shadowed earlier on in the same map.
! 	(Fdescribe_vector, describe_map): Pass new arg.
! 
! 	* xdisp.c (redisplay_window): Don't use try_window_id if
! 	newline has a display table entry.
! 
! 	* xdisp.c (update_menu_bar):
! 	Call set_frame_menubar with proper buffer current.
! 
! Fri May 26 20:17:46 1995  Geoff Voelker  <voelker@cs.washington.edu>
! 
! 	* lread.c (init_lread) [CANNOT_DUMP]: Set Vload_path to EMACSLOADPATH.
! 
! Fri May 26 18:46:15 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
! 
! 	* xfns.c (x_window): Call initialize_frame_menubar
! 	near the end, after UNBLOCK_INPUT.
! 
! 	* xmenu.c (popup_get_selection): Force deactivation if key pressed.
! 	New arg `id'.
! 	(xdialog_show, xmenu_show): Pass new arg to popup_get_selection.
! 	* xterm.c (XTread_socket): Don't call popup_get_selection here.
! 
! Fri May 26 17:53:58 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* sysdep.c (VFORK_RETURN_TYPE): Use int if not already defined.
! 	(vfork): Declare the return type.
! 	* s/sol2-3.h (HAVE_VFORK): Moved here from s/sol2-4.h.
! 	(VFORK_RETURN_TYPE): Defined.
! 	* s/sol2-4.h (HAVE_VFORK): Moved to s/sol2-3.h.
! 	(pid_t): Deleted; s/sol2-3.h now defines a symbol for this.
! 
! 	* xdisp.c (x_consider_frame_title): Use FRAME_KBOARD.
! 
! Fri May 26 01:23:03 1995  Geoff Voelker  <voelker@cs.washington.edu>
! 
! 	* s/windows95.h: New file.
! 
! 	* ntheap.h (get_data_region_base): Undefined.
! 	(get_reserved_heap_size): Use reserved_heap_size.
! 	(reserved_heap_size): Declared.
! 	* ntheap.c (reserved_heap_size,allocate_heap): Defined.
! 	(sbrk): Use allocate_heap.
! 
! 	* ntterm.c (set_terminal_modes): Set cursor size appropriate for Win95.
! 	(write_glyphs): Don't memset attrs, which is a word array.
! 
! 	* nt.c (configuration_buffer): Increase size.
! 	(get_emacs_configuration) [WINDOWS95]: Use appropriate string.
! 	(prepare_standard_handles) [WINDOWS95]: Disable subprocesses.
! 	(reset_standard_handles): Check error number on failure.
! 
! 	* makefile.nt (LIBS): Use BASE_LIBS and ADVAPI32.
! 	(config.h,paths.h): Use $(CP) instead of cp.
! 	(config.h): Use $(CONFIG_H).
! 	(EMACS) [WINDOWS95]: Don't dump temacs.exe.
! 	(clean): Cleanup MSVC files and config.h.
! 	(cleandump): Separate commands onto multiple lines.
! 	Cleanup comments.
! 
! Fri May 26 00:16:42 1995  Michael Ernst  <mernst@research.microsoft.com>
! 
! 	* emacs.c (standard_args): -i, -itype, --icon-type take 0, not 1, args
! 
! Thu May 25 10:26:10 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* process.c (create_process, send_process): Add volatile qualifiers.
! 	(wait_reading_process_input) [both versions]: Cast args of select.
! 
! 	* syntax.c (scan_lists): Make stringterm an unsigned char.
! 
! 	* dispnew.c (change_frame_size_1): Declare arg DELAY.
! 
! 	* insdel.c (adjust_point): Declare arg AMOUNT.
! 
! 	* lisp.h (do_symval_forwarding): Declare this function.
! 	(frame_buffer_predicate, Foverlay_start, Foverlay_end): Ditto.
! 	(Fprevious_single_property_change, Fend_of_line, Felt): Ditto.
! 	(Fforward_line, Fforward_word, Fdelete_region, Fforward_char): Ditto.
! 	(Fnarrow_to_region, Fwiden, Fmatch_beginning, Fmatch_end): Ditto.
! 	(Fskip_chars_forward, Fskip_chars_backward): Ditto.
! 	(Ffile_name_absolute_p, read_doc_string): Ditto.
! 	(get_frame_param, store_frame_param, store_in_alist): Ditto.
! 	(describe_map_tree): Declaration moved here from keymap.c.
! 	* keymap.c (describe_map_tree): Move declaration to lisp.h.
! 
! 	* doc.c (Fsubstitute_command_keys): Cast arg of describe_map_tree.
! 	* frame.c [MULTI_FRAME] (Fmouse_position): Cast arg of
! 	pixel_to_glyph_coords.
! 	* callint.c (Fcall_interactively): Cast arg of doprnt.
! 	* editfns.c (format1): Likewise.
! 	* xdisp.c (message): Likewise.
! 	(scroll_bottom_vpos, fmodetrunc): Declarations deleted.
! 
! Thu May 25 10:16:58 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
! 
! 	* dispnew.c (Fframe_or_buffer_changed_p): Record frame names
! 	as well as the frame objects.
! 
! 	* xterm.c (XTread_socket):
! 	For MapNotify, call record_asynch_buffer_change.
! 
! 	* xdisp.c (prepare_menu_bars): Update frame titles before menu bars.
! 
! 	* xfns.c (Fx_get_resource): Major rewrite to make it clearer.
! 	(validate_x_resource_name): Use build_string, not make_string.
! 	(Fx_create_frame): Initially use Vinvocation_name as resource name.
! 	Switch to frame name if frame name is explicit.
! 	(x_display_info_for_name, Fx_open_connection): Add casts.
! 	Initially use Vinvocation_name as resource name.
! 	[USE_X_TOOLKIT] (x_window): Use Vx_resource_name for widget names.
! 
! 	* xmenu.c (xmenu_show, xdialog_show): Increment widget_id_tick
! 	in the same way as in xfns.c.  Use LWLIB_ID type where appropriate.
! 	(set_frame_menubar, free_frame_menubar): Add casts to LWLIB_ID.
! 
! 	* xterm.c (XTflash): Use pointers as args to select.
! 	(XTread_socket, x_set_offset, x_set_window_size)
! 	(x_make_frame_invisible): Cast 2nd arg to x_wm_set_size_hint.
! 	(XTclear_end_of_line): Don't specify return type.
! 	(note_mouse_highlight): Declare args x and y.
! 	(x_icon_type): New declaration.
! 	(flashback): Declaration deleted.
! 
! Wed May 24 18:45:51 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* lisp.h (menu_bar_items): Declare this function.
! 
! Wed May 24 16:33:26 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
! 
! 	* xmenu.c (Fx_popup_dialog): Treat (menu-bar) like t, for POSITION.
! 
! 	* frame.c (Fdelete_frame): When updating Vdefault_minibuffer_frame,
! 	insist on a frame on the proper keyboard.
! 
! 	* xterm.c (x_connection_closed): Unblock input, first thing.
! 	Set Vdefault_minibuffer_frame to t
! 	before deleting a frame that might have its own minibuffer.
! 
! Tue May 23 23:48:54 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* xfns.c (hack_wm_protocols): Use cast instead of suffix.
! 
! Tue May 23 20:40:43 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
! 
! 	* xfns.c (x_set_frame_parameters): Pass 1 as change_gravity
! 	when calling x_set_offset.
! 	(x_real_positions): Don't add border_width into win_x, win_y.
! 	* xterm.c (x_set_offset): Add border_width when calling XMoveWindow.
! 
! 	* xterm.h (struct x_display): New field menubar_height.
! 	* xmenu.c (set_frame_menubar): Set menubar_height field.
! 	* xfns.c (x_window) [both versions]: Set menubar_height.
! 
! 	* xfns.c [USE_X_TOOLKIT] (x_window): Don't call XMoveWindow
! 	or x_calc_absolute_position.  Do use the border_width.
! 
! 	* xterm.c (x_calc_absolute_position): Use menubar_height field.
! 	In toolkit case, use outermost Emacs widget and its parent.
! 	[USE_X_TOOLKIT] (x_make_frame_visible): Do call x_set_offset.
! 
! 
! 	* xfns.c [USE_X_TOOLKIT] (x_window): Pass position to toolkit
! 	only if user-specified.  But always use XMoveWindow to move the
! 	window to that position.
! 
! 	* alloc.c (Fgarbage_collect): Clear consing_since_gc first thing.
! 
! 	* xdisp.c (redisplay_window): Use set_buffer_internal_1.
! 
! 	* buffer.c (set_buffer_internal_1): New subroutine.
! 	(Fmove_overlay): Don't set windows_or_buffers_changed.
! 
! Mon May 22 18:09:46 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* xselect.c (x_get_window_property): Cast args of XGetWindowProperty.
! 	* xfaces.c (unload_color): Cast args of XFreeColors.
! 	* xfns.c (hack_wm_protocols): Cast args of XGetWindowProperty.
! 	(x_set_border_pixel): Cast args of XSetWindowBorder.
! 	* widget.c (create_frame_gcs): Cast args of XCreateGC.
! 	(setup_frame_gcs): Cast args of XCreatePixmapFromBitmapData.
! 
! 	* data.c (long_to_cons): Don't assume 32-bit longs.
! 	* fileio.c (Fvisited_file_modtime): Cast arg of long_to_cons.
! 
! 	* editfns.c (Fformat): Split double into two pointers, not two ints.
! 
! 	* s/hpux9.h: Delete HAVE_FMOD; configure handles that correctly now.
! 
! Mon May 22 16:14:07 1995  Richard Stallman  <rms@waves>
! 
! 	* xdisp.c (display_text_line): Enter a char in charstarts
! 	at the very end of the character loop.
! 	Enter newline or ^M (if selective display) separately.
! 
! 	* lisp.h (gdb_lisp_params): New enum type.
! 	* .gdbinit: Use gdb_lisp_params to get storage layout info.
! 	Set and use $valmask and $nonvalbits.
! 
! 	* lread.c (oblookup): Delete argument hashp.
! 
! Fri May 19 23:35:57 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* floatfns.c (Flogb): frexp needs a pointer to int, not EMACS_INT.
! 
! Fri May 19 17:52:46 1995  Richard Stallman  <rms@waves>
! 
! 	* dispnew.c (buffer_posn_from_coords): Don't let startp be before BEGV.
! 
! Thu May 18 18:42:37 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* indent.c (compute_motion): Handle overlay strings.
! 	New arg DID_MOTION.  All callers changed.
! 	* dispnew.c, window.c: Add new argument to calls of compute_motion.
! 	* xdisp.c: Add new argument to calls of compute_motion.
! 	(zv_strings_seen): New variable.
! 	(redisplay, try_window, try_window_id): Clear zv_strings_seen.
! 	(display_text_line): Handle overlay strings.
! 
! Thu May 18 12:54:22 1995  Richard Stallman  <rms@waves>
! 
! 	* s/sol2-4.h: Undo previous change.
! 
! 	* emacs.c (Fkill_emacs): Delete the auto-save-list file
! 	after shut_down_emacs.
! 
! 	* process.c (status_notify): If Vprocess_alist changes within
! 	the loop, do the whole loop again.
! 
! Wed May 17 03:26:09 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* emacs.c (Fdump_emacs): Don't take address of array.
! 
! 	* buffer.c (Fmake_indirect_buffer): Fix interactive spec.
! 
! 	* Makefile.in.in (SOURCES): Fix reference to ymakefile.
! 
! 	* keyboard.c (syms_of_keyboard): Always define track-mouse.
! 	(do_mouse_tracking): Always declare this var.
! 
! Mon May 15 21:28:52 1995  Marcus Daniels  <marcus@ee.pdx.edu>
! 
! 	* s/linux.h: Test _STDIO_USES_IOSTREAM as well as _IO_STDIO_H.
! 	[__ELF__] (START_FILES, LIB_STANDARD, LIB_GCC, UNEXEC): Define these.
! 	[__ELF__] (UNEXEC_USE_MAP_PRIVATE): Define this.
! 
! 	* unexelf.c (unexec) [UNEXEC_USE_MAP_PRIVATE]: New logic for
! 	systems that don't support MAP_SHARED with PROT_WRITE.
! 
! Mon May 15 19:26:40 1995  Richard Stallman  <rms@churchy.gnu.ai.mit.edu>
! 
! 	* s/sol2-4.h (LD_SWITCH_SYSTEM): Define.
! 
! Mon May 15 17:46:47 1995  Simon Leinen  <simon@lia.di.epfl.ch>
! 
! 	* indent.c (vmotion): handle the case where `minibuf_prompt' is nil.
! 
! Fri May 12 18:23:15 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* indent.c (vmotion): Simplify.  Replace last three args with a single
! 	struct window *.  All callers changed.
! 	* xdisp.c (minmax): New macro.
! 	(redisplay, redisplay_window, try_window_id): Clip cursor hpos at both
! 	low and high extremes, in anticipation of a change to compute_motion.
! 
! 	* xterm.c (Qvendor_specific_keysyms): New var.
! 	(syms_of_xterm): Initialize and staticpro it.
! 	(x_term_init): Initialize Vsystem_key_alist according to vendor.
! 
! 	* emacs.c (main) [NeXT]: Add missing braces.
! 
! Thu May 11 18:16:36 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* sysdep.c (init_system_name): Clean up signedness mismatch.
! 	* unexelf.c (unexec): Fix type mismatch.
! 	* print.c (float_to_string): Fix type mismatch and simplify.
! 
! 	* dispnew.c [!MULTI_FRAME] (Fredraw_frame): Delete extra docstring.
! 	* frame.c [!MULTI_FRAME] (Fframe_height, Frame_width): Likewise.
! 
! Tue May  9 00:45:23 1995  enami tsugutomo  <enami@sys.ptg.sony.co.jp>
! 
! 	* window.c [MULTI_FRAME] (init_window_once): Set Vterminal_frame
! 	to selected_frame.
! 	* frame.c [MULTI_FRAME] (make_terminal_frame): Don't set
! 	Vterminal_frame.
! 	(do_switch_frame): Set Vterminal_frame to selected_frame.
! 
! Mon May  8 14:30:19 1995  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
! 
! 	* Makefile.in.in (VMS_SUPPORT): Add missing `.elc'.
! 	(SOME_MACHINE_LISP): New variable.
! 	(${etc}DOC): Use it.
! 
! 	* buffer.c (syms_of_buffer): Doc fix.
! 
! 	* frame.c (frame-height, frame-width, set-screen-height,
! 	set-screen-width, termal-frame) [!MULTI_FRAME]: Delete doc strings.
! 
! Mon May  8 21:28:34 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* keyboard.c (init_kboard): Initialize Vdefault_minibuffer_frame.
! 	* keyboard.h (struct kboard): New member Vdefault_minibuffer_frame.
! 	* frame.c: Vdefault_minibuffer_frame is now part of KBOARD instead
! 	of a variable.  All references changed.
! 	(make_frame_without_minibuffer): New arg KB.
! 	Require the new frame's minibuffer to be on the same display.
! 	* xfns.c (Fx_create_frame): Pass kb to make_frame_without_minibuffer.
! 
! 	* xdisp.c (x_consider_frame_title): When setting multiple_frames,
! 	ignore invisible frames and frames on other displays.
! 
! 	* keyboard.c [MULTI_KBOARD] (read_char): If the character was for
! 	the wrong kboard, don't let it get processed twice.
! 
! Mon May  8 12:24:38 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* callproc.c (Fcall_process): Keep reading till buffer is nearly full.
! 
! 	* emacs.c (Fdump_emacs): Don't use & before my_edata.
! 
! Mon May  8 16:45:51 1995  Francesco Potorti`  (pot@cnuce.cnr.it)
! 
! 	* m/delta.h (C_SWITCH_MACHINE): Let configure decide if this is
! 	a 68040 or 68030.  Don't condition on __STDC__.
! 
! Mon May  8 18:40:21 1995  enami tsugutomo  <enami@sys.ptg.sony.co.jp>
! 
! 	* frame.c (Fraise_frame, Flower_frame): Make arg FRAME optional.
! 
! 	* keyboard.c (Fread_key_sequence): Doc fix.
! 
! Mon May  8 00:52:42 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* window.c (Fdisplay_buffer): Initialize other, upper, lower.
! 
! Sun May  7 18:26:25 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* lisp.h (Fmatch_data, Fstore_match_data): Declared.
! 
! 	* xdisp.c (prepare_menu_bars): Save and restore the match data.
! 	(update_menu_bar): New arg save_match_data.
! 	Maybe save and restore match data here.
! 
! Sun May  7 17:03:55 1995  Geoff Voelker  <voelker@cs.washington.edu>
! 
! 	* makefile.nt (region-cache.obj,vm-limit.obj): Dependencies defined.
! 	(OBJ1): Don't compile xfaces.c.
! 	(buffer.obj,indent.obj,search.obj): Add region-cache.h dependency.
! 
! Sun May  7 06:34:20 1995  Paul Eggert  <eggert@twinsun.com>
! 
! 	* data.c (Fmod): Fix the final adjustment, when f2 < 0 and f1 == 0.
! 
! 	* lread.c (isfloat_string): Reject strings like "0.5+".
! 
! Sun May  7 02:22:11 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* process.c (wait_reading_process_input): Pass arg in new call to
!  	set_waiting_for_input.
! 
! 	* xfns.c (Funfocus_frame): Check for live X frame.
! 
! 	* lread.c (init_lread): Don't warn about missing installation dirs
! 	when using dirs derived from the executable.
! 
! Sat May  6 22:37:07 1995  Geoff Voelker  <voelker@cs.washington.edu>
! 
! 	* makefile.nt (TRES): Defined.
! 	(TLIB1,TLIB2): Created out of TLIB.
! 	(TLIB): Split to reduce time to do library updates.
! 	(DOC): Use DOC-X.
! 	(strftime.obj): Compile with -Dstrftime=emacs_strftime.
! 
! Sat May  6 03:09:24 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* window.c (syms_of_window): Doc fix.
! 	(temp_output_buffer_show): If we use Vtemp_buffer_show_function,
! 	do nothing else.
! 
! 	* s/bsd386.h (GETPGRP_NO_ARG): New definition.
! 	(BSD): Include sys/param.h instead of redefining BSD.
! 	But do this only if emacs is defined.
! 
! 	* lisp.h (gc_cons_threshold): Change back to int.
! 	* alloc.c (gc_cons_threshold): Change back to int.
! 	(min): New macro.
! 	(inhibit_garbage_collection): Don't exceed value an int can hold.
! 
! 	* xdisp.c (prepare_menu_bars): Clear size-change flag before running
! 	size-change functions.
! 	(scroll_step, debug_end_pos, line_number_display_limit): Now static.
! 
! Fri May  5 00:35:42 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* emacs.c (Fdump_emacs_data): Don't use & before my_edata.
! 
! 	* editfns.c (Fencode_time): Rename arg from min to minute.
! 	(days_per_month): Move variable to top level.
! 
! 	* process.c (wait_reading_process_input): Don't call prepare_menu_bars.
! 	Clear waiting_for_input around calling redisplay_preserve_echo_area.
! 
! 	* xfns.c [USE_X_TOOLKIT] (x_window): Always pass position in geometry.
! 	Set XtNmappedWhenManaged to 0 for shell_widget.
! 	(Fx_create_frame): Always call x_wm_set_size_hints.
! 
! 	* s/sol2-4.h (HAVE_VFORK): Add #undef.
! 
! 	* s/netbsd.h (GETPGRP_NO_ARG): Defined.
! 
! Thu May  4 21:45:27 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* s/freebsd.h: (GETPGRP_NO_ARG): Defined
! 	(HAVE_GETPAGESIZE): Definition deleted.
! 
! 	* data.c (store_symval_forwarding): Error if value out of range
! 	for an integer variable.
! 	(Fstring_to_number): Avoid using make_number to return value.
! 	Maybe use atol.
! 
! Thu May  4 20:26:46 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* buffer.c (Qbefore_string, Qafter_string): New vars.
! 	(syms_of_buffer): Initialize and staticpro them.
! 	(cmp_for_strings, overlay_strings): New functions.
! 
! Thu May  4 01:13:53 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* indent.c (string_display_width): Renamed from string_width.
! 	(vmotion): Use new name.
! 
! 	* s/sco4.h [!__GNUC__] (LINKER): Defined.
! 
! 	* insdel.c (make_gap): Don't allow buffer size that won't fit in int.
! 	Make this new error check also check exceeding VALBITS.
! 	(insert_1): Delete old error test.
! 	(min): New macro.
! 
! 	* Makefile.in.in (${etc}DOC): Put SOME_MACHINE_OBJECTS before obj.
! 
! 	* xfaces.c (region_face, next_face_id): Make static.
! 
! 	* xselect.c (Vselection_converter_alist, x_selection_timeout)
! 	(Vx_sent_selection_hooks, Vx_lost_selection_hooks, Vselection_alist):
! 	Make static.
! 
! 	* alloc.c (inhibit_garbage_collection):
! 	Use XSETINT, and do arithmetic in type EMACS_INT.
! 
! 	* s/hpux9.h (HAVE_FMOD): Defined.
! 
! 	* sysdep.c (bcmp, bcopy): Fix backward BSTRING conditionals.
! 
! 	* emacs.c (Fkill_emacs): Delete the Vauto_save_list_file_name file.
! 
! Thu May  4 13:23:55 1995  Morten Welinder  <terra+@cs.cmu.edu>
! 
! 	* data.c (arith_driver): Make accum and next EMACS_INTs.
! 	(Fmod): i1 and i2 are EMACS_INT.
! 
! 	* editfns.c (Fformat): Allow 30 characters in the printed version
! 	of integers and floats.
! 
! 	* print.c (print): Handle long EMACS_INT in sprintf.
! 	* keyboard.c (Fexecute_extended_command):
! 	Handle long EMACS_INT in sprintf.
! 	* lread.c (read1): Handle long EMACS_INT in atol.
! 	* doprnt.c (doprnt): Handle long EMACS_INT in sprintf.
! 	* data.c (Fnumber_to_string, Fstring_to_number):
! 	Handle long EMACS_INT in sprintf and atol.
! 
! 	* process.c (list_processes_1): Cast XFASTINT for passing to sprintf.
! 
! 	* m/alpha.h (bcopy, bzero, bcmp): Don't let string.h prototype these.
! 
! Wed May  3 20:12:25 1995  Morten Welinder  <terra+@cs.cmu.edu>
! 
! 	* keyboard.c (parse_modifiers, apply_modifiers): Don't assume
! 	32-bit EMACS_INT.
! 	(parse_modifiers): modifiers is an int, not an EMACS_INT.
! 	(read_key_sequence): Pass modifiers as int, not EMACS_INT.
! 
! 	* buffer.h (Fdelete_overlay): Was mistakenly called Fdelete_overlays.
! 
! 	* lisp.h (gc_cons_threshold): Make this an EMACS_INT.
! 
! 	* alloc.c (gc_cons_threshold): Make this an EMACS_INT.
! 	(gc_sweep): Make already_free an EMACS_INT.
! 
! 	* search.c (search_buffer): Cast p_limit to EMACS_INT not int.
! 
! 	* s/osf1.h (GETPGRP_NO_ARG): Define.
! 
! Wed May  3 16:23:53 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* keyboard.c (reorder_modifiers): Use XINT.
! 	Cast apply_modifiers arg to int.
! 
! 	* unexapollo.c: New file.
! 
! 	* m/apollo.h (CANNOT_DUMP, VIRT_ADDR_VARIES, LIBS_TERMCAP)
! 	(NO_X_DESTROY_DATABASE): Macros deleted.
! 	(BSTRING): #undef deleted.
! 	(SYSTEM_TYPES): Redefinition deleted.
! 	(UNEXEC): New definition.
! 	(LD_SWITCH_SYSTEM): Define as empty.
! 	(C_SWITCH_MACHINE, LD_SWITCH_MACHINE): New definitions.
! 	(OLDXMENU_OPTIONS): New definition.
! 
! 	* fileio.c (directory_file_name): Add APOLLO conditional.
! 	(Fcopy_file, Fset_file_modes): Delete APOLLO conditionals.
! 
! 	* emacs.c: Delete all APOLLO conditionals.
! 
! Tue May  2 19:03:13 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* intervals.c (get_local_map): Use Fget_char_property, so that
! 	overlay properties will be considered as well as text properties.
! 
! Tue May  2 02:15:23 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* insdel.c (prepare_to_modify_buffer): Use file_truename for locking.
! 
! 	* fileio.c (Finsert_file_contents): Use file_truename for unlocking.
! 
! 	* buffer.c (Fset_buffer_modified_p): Use the truename for locking.
! 
! 	* lread.c (read1): New arg FIRST_IN_LIST; all callers changed.
! 	Special handling for backquote and comma.
! 	(Qbackquote, Qcomma, Qcomma_at, Qcomma_dot): New variables.
! 	(syms_of_lread): Initialize and staticpro them.
! 	(Fread, Fread_from_string): Initialize new_backquote_flag.
! 
! Mon May  1 19:11:28 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* xmenu.c (xmenu_show, menubar_selection_callback): Move declaration
! 	of entry to an outer block, to guarantee its value is preserved.
! 
! 	* keyboard.c (kbd_buffer_get_event): New arg USED_MOUSE_MENU.
! 	[USE_X_TOOLKIT]: Set *USED_MOUSE_MENU if returning menu-bar symbols.
! 	(read_char): Pass used_mouse_menu to kbd_buffer_get_event.
! 	This variable is now meaningful for toolkit menus as well as
! 	non-toolkit menus.
! 
! 	* dispnew.c (update_frame): Don't put cursor in echo area unless
! 	the echo area is on this frame.
! 	* xdisp.c (redisplay): Don't move the cursor if it's supposed to
! 	be in the echo area.
! 	(display_text_line): Likewise.
! 	(echo_area_display): Put cursor in echo area if appropriate.
! 
! Sun Apr 30 11:51:41 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* emacs.c (standard_args): Add #ifdef VMS for -map.
! 	(main): Delete duplicate code for -version.
! 	(standard_args): Add -help and -version.
! 
! 	* fileio.c (Fdo_auto_save): Record visited file name
! 	as well as auto-save file name in the auto-save-list-file-name file.
! 	Call Fexpand_file_name for auto-save-list-file-name.
! 
! Sat Apr 29 01:30:51 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* sysdep.c [HAVE_UNISTD_H]: Include unistd.h.
! 
! 	* emacs.c (standard_args): Add -L/--directory/-directory.
! 
! 	* s/sunos4shr.h (ORDINARY_LINK): Defined.
! 	(LINKER): Definition deleted.
! 
! Sat Apr 28 23:59:49 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* xfns.c (x_non_menubar_window_to_frame): New function.
! 	* xterm.h: Declare x_non_menubar_window_to_frame.
! 	* xmenu.c (popup_get_selection): Use x_non_menubar_window_to_frame.
! 	Either queue or dispatch the event, but not both.
! 	(dialog_selection_callback): Clear popup_activated_flag.
! 
! 	* xmenu.c (Fx_popup_menu): If POSITION is just (menu-bar), use the
! 	current mouse position.
! 	(menubar_selection_callback): Use (menu-bar) instead of 'menu-bar.
! 	* keyboard.c (read_char, read_char_x_menu_prompt): Exclude
! 	menu-bar clicks when processing mouse clicks.
! 
! 	* xterm.c (x_term_init): Add stub to initialize Vsystem_key_alist.
! 
! Thu Apr 27 21:38:08 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* process.c (create_process): Don't reference pty_name if !HAVE_PTYS.
! 
! Wed Apr 26 05:08:25 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* fileio.c (Ffile_regular_p): Use Qfile_regular_p.
! 	(syms_of_fileio): Set up Qfile_regular_p.
! 
! 	* emacs.c (standard_args): Move -iconic and --icon-type
! 	to the end of the initial args.
! 
! Tue Apr 25 19:46:40 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* alloc.c (mark_kboards): Mark the kbd macro and Vsystem_key_alist.
! 
! Mon Apr 24 14:43:07 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* s/linux.h (REGEXP_IN_LIBC): Defined.
! 
! 	* callproc.c (Fcall_process): Use bigger buffer, and grow it
! 	as we get more and more data.
! 
! Mon Apr 24 11:44:02 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* xterm.c (x_term_init): If the previous kboard was the dummy one,
! 	switch to the new one immediately.
! 
! 	* keyboard.h (struct kboard): New member Vsystem_key_alist.
! 	* keyboard.c (Vsystem_key_alist): Delete global variable.
! 	(init_kboard): Initialize Vsystem_key_alist member.
! 	(syms_of_keyboard): Change DEFVAR_LISP to DEFVAR_KBOARD.
! 	(make_lispy_event): Use the kboard's alist instead of the global.
! 
! 	* fns.c (Fplist_put): Don't signal an error if plist isn't a cons.
! 
! 	* xterm.c (x_focus_frame, x_focus_event_frame, x_highlight_frame):
! 	Delete these vars; now part of struct x_display_info.
! 	(x_new_focus_frame): New arg DPYINFO.  Callers changed.
! 	Use the struct members instead of the globals.
! 	Call x_frame_rehighlight instead of XTframe_rehighlight, so we can
! 	pass on the dpyinfo pointer.
! 	(x_mouse_leave): New arg DPYINFO.  Callers changed.
! 	(XTframe_rehighlight): New arg FRAME.  Callers changed.
! 	Now does all the work in x_frame_rehighlight.
! 	(x_frame_rehighlight): New function, code from XTframe_rehighlight.
! 	(XTread_socket): Use the struct members instead of the globals.
! 	(x_unfocus_frame, x_iconify_frame, x_destroy_window): Likewise.
! 	(x_display_box_cursor, x_make_frame_invisible): Likewise.
! 	(x_term_init): Initialize the struct members.
! 	(x_initialize): Delete initialization of deleted globals.
! 	* xfns.c (x_get_focus_frame): New arg FRAME.  Callers changed.
! 	(Funfocus_frame): Unfocus on selected_frame's display.
! 	* xterm.h (struct x_display_info): New members x_focus_frame,
! 	x_focus_event_frame, x_highlight_frame, replacing global vars.
! 	* frame.c (do_switch_frame): Don't try to refocus termcap frames.
! 
! 	* Makefile.in.in: Make dispnew.o and keyboard.o depend on xterm.h.
! 	Make intervals.o and term.o depend on keyboard.h.
! 
! 	* xfns.c (x_window): Fix type mismatch.
! 
! 	* xdisp.c (message_dolog): The message log doesn't need an undo list.
! 
! 	* term.c (term_init): MagicWrap implies AutoWrap.
! 
! Mon Apr 24 01:44:16 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* keyboard.c (safe_run_hooks_1, safe_run_hooks_error): New subroutines.
! 	(safe_run_hooks): Handle errors to clear the hook,
! 	instead of always clearing it temporarily.
! 
! 	* callproc.c (child_setup): Reword "can't exec" message.
! 	Add newline after message.
! 
! 	* process.c (create_process): Don't abort if can't reopen
! 	pty_name in the child.  Exit the child instead.
! 
! Thu Apr 20 14:36:54 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* abbrev.c (Fexpand_abbrev): Add some error checking.
! 
! 	* xmenu.c (Fx_popup_dialog): Don't pass menubarp arg to xdialog_show.
! 
! Wed Apr 19 16:49:52 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* frame.h (struct frame): New member namebuf.
! 	* frame.c (make_frame): Initialize it.
! 	(Fdelete_frame): Free it.
! 	* xfns.c (x_window): Use (or reuse) frame's namebuf instead of a
! 	temp var.  This avoids a storage leak.
! 
! Wed Apr 19 02:08:43 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* xmenu.c (xmenu_show, xdialog_show): Delete menubarp arg.
! 	(Fx_popup_menu): Don't compute menubarp.
! 
! Tue Apr 18 14:37:21 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* callproc.c (Fcall_process): Call Fexpand_file_name for error_file.
! 
! 	* keyboard.c (map_event_to_object): Declaration deleted.
! 
! Tue Apr 18 12:43:44 1995  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
! 
! 	* eval.c (Ffetch_bytecode): Check the type of the object being
! 	read from the file.
! 
! Mon Apr 17 23:21:24 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* editfns.c (Fencode_time): Don't treat years < 100 as special.
! 
! Mon Apr 17 19:12:11 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* lisp.h: Declare some functions.
! 	* buffer.c (adjust_overlays_for_insert): New function.
! 	(adjust_overlays_for_delete): New function.
! 	* insdel.c (insert_1): Adjust overlay center after inserting.
! 	(insert_from_string_1, insert_from_buffer_1): Likewise.
! 	(del_range_1): Adjust overlay center after deleting.
! 
! Mon Apr 17 02:09:36 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* editfns.c (Fencode_time): Rewrite by Naggum.
! 
! Sat Apr 15 14:32:31 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* xfns.c (x_report_frame_params): Report value of `display' parm.
! 
! 	* Makefile.in.in (really-lwlib, really-oldXMenu): Mark as .PHONY.
! 
! Fri Apr 14 17:04:56 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* editfns.c (Fencode_time): Fix missing \n\'s.
! 
! Fri Apr 14 14:20:50 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* editfns.c (init_editfns): Add casts.
! 
! 	* doc.c (get_doc_string): Add cast.
! 
! 	* keyboard.c (kbd_buffer_get_event): Don't use prototype.
! 
! 	* xdisp.c (message_log_check_duplicate): Make p1 and p2
! 	unsigned char *.
! 
! Thu Apr 13 23:56:21 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* xterm.c (x_term_init): Call XtSetLanguageProc only if HAVE_X11XTR6.
! 
! Thu Apr 13 13:38:56 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* editfns.c (Fbuffer_string): Doc clarification.
! 
! 	* alloc.c: Delete the #if that compares MARKBIT.
! 
! 	* window.c (Fdisplay_buffer): Search the proper frame when the
! 	current frame is minibuffer-only.
! 
! 	* fileio.c (Fexpand_file_name): Use IS_DIRECTORY_SEP instead of
! 	special code for WINDOWSNT.
! 
! Thu Apr 13 12:18:03 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* xfaces.c (compute_char_face): Don't use NULL.
! 
! 	* buffer.c (Foverlays_at, Fnext_overlay_change): Don't use NULL.
! 	(Fprevious_overlay_change): Don't use NULL.
! 
! 	* xfns.c (Fx_color_defined_p): Doc fix.
! 
! 	* xfaces.c [! HAVE_X_WINDOWS] (build_face): Deleted.
! 
! Wed Apr 12 19:30:30 1995  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
! 
! 	* callint.c (Fcall_interactively): Fix paren nesting.
! 
! 	* buffer.c (evaporate_overlays): Fix type error.
! 
! Thu Apr 13 01:09:02 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* xterm.c (XTmouse_position): Handle X errors in XTranslateCoordinates.
! 
! 	* lisp.h (MARKBIT): Do the shifting as unsigned int.
! 	Delete the #if that compares MARKBIT.
! 
! Wed Apr 12 01:52:55 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* xterm.c (XTread_socket): For ConfigureNotify,
! 	combine the USE_X_TOOLKIT and non-toolkit cases, which provides
! 	some things that were missing in the former.
! 
! 	* alloc.c (gc_sweep): If a misc has type Lisp_Misc_Free,
! 	keep it on the free list.  Sum pseudovector sizes properly.
! 
! 	* dispnew.c (Fframe_or_buffer_changed_p): Ignore buffers whose names
! 	start with space.
! 
! 	* editfns.c (Fencode_time): Use XINT to examine `zone'.
! 
! Tue Apr 11 21:53:28 1995  Geoff Voelker  <voelker@cs.washington.edu>
! 
! 	* ntinevt.c (nt_kdb_patch_event): Created.
! 
!         * callproc.c (child_setup) [WINDOWSNT]: Removed syntax errors.
! 
! 	* dired.c (Ffile_attributes) [WINDOWSNT]: Removed syntax errors.
! 
! 	* fileio.c (Fexpand_file_name) [DOS_NT]: Preserve drive letter case.
! 	Fix syntax errors.
!         Check drive letter when expanding ~\.
! 
! 	* sysdep.c (sys_subshell) [WINDOWSNT]: Don't invoke restore_console.
! 
! 	* ntproc.c (win32_wait): Reap synchronous subprocesses, and place
!         return code in synch_process_retcode.
! 
! 	* s/windowsnt.h (ctime): Defined to be nt_ctime.
! 	(NULL): Defined when missing from included system files.
! 	(EMACS_CONFIG_OPTIONS): Defined.
! 	(LISP_FLOAT_TYPE): Defined.
! 	(HAVE_TZNAME): Defined.
! 	(HAVE_TIMEVAL): Defined.
! 	(struct timeval): Defined.
! 	(struct timezone): Defined.
! 
! 	* nt.c (nt_ctime): Defined.
! 	(gettimeofday): Defined.
! 
! 	* ntinevt.c (do_mouse_event): Use XSETFASTINT.
! 	(SET_FRAME): Undefined.
! 	(select): Renamed to sys_select to correspond to routine in sysdep.c
! 	(sys_select): Support struct timeval.
! 	(key_event): Support German keyboard.
! 	Replace SET_FRAME with XSETFRAME.
! 	(nt_kbd_mods_to_emacs): Renamed to win32_kbd_mods_to_emacs.
! 	(win32_kbd_mods_to_emacs): Support AltGr on German keyboards.
! 	(win32_number_shift_map): Defined.
! 	(WIN32_KEY_SHIFTED): Defined.
! 	(win32_patch_key): Defined.
! 	(map_virt_key): Support VK_OEM_102 for German keyboards.
! 	(win32_mouse_position): Add arg insist.
! 	(do_mouse_event): Replace SET_FRAME with XSETFRAME.
! 	Use win32_kbd_mods_to_emacs.
! 
! 	* fileio.c (directory_file_name) [WINDOWSNT]: Handle UNC format.
! 
! 	* nt.c (nt_stat): Defined.
! 
! 	* s/windowsnt.h (struct nt_stat): Defined.
! 
! 	* ntinevt.h: Fixed function prototypes.
! 
! 	* makefile.nt (TEMACS): Add dependence on $(BLD).
! 
! 	* ntterm.c (Fset_message_beep): Defined.
! 	(ring_bell): Support audio cards.
! 
! 	* makefile.nt (DOC): Defined.
! 
! 	* s/windowsnt.h (HAVE_RANDOM): Defined.
! 	(random): Macro undefined.
! 	(srandom): Macro undefined.
! 	(HAVE_UTIME): Defined.
! 	(utime): Defined.
! 	(EMACS_CONFIGURATION): Defined.
! 
! 	* nt.c (random): Defined.
! 	(srandom): Defined.
! 
! 	* nt.c (readdir): Include "." and "..".
! 	(get_inode_and_device_vals): Handle directories.
! 
! 	* fileio.c (Fexpand_file_name) [DOS_NT]: Don't strip slash from
!         default dirs like "C:\\"
! 
! 	* makefile.nt (all): Use COMPAT_LIB in library list.
! 	Use DEL_TREE instead of delnode.
! 
! 	* ntheap.c (sbrk): Shrink heap by arbitrary amounts.
! 
! 	* m/intel386.h (NO_ARG_ARRAY) [WINDOWSNT]: Defined.
! 
! 	* s/windowsnt.h (_VARARGS_): Defined.
! 	(_CALLBACK_): Defined.
! 
! Tue Apr 11 18:46:27 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
! 
! 	* process.c (create_process): Set PROCESS's tty_name to Qnil when
!  	!PTY_FLAG, so Fprocess_tty_name returns nil for pipes as its
!  	docstring says.
! 
! Tue Apr 11 04:23:05 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* keyboard.c (read_char): Rearrange code so that getcjmp is set
! 	only around sit_for and kbd_buffer_get_event, and
! 	and polling is stopped only around the kbd_buffer_get_event call.
! 	(Ftrack_mouse, tracking_off, read_char): Don't call prepare_menu_bars.
! 
! 	* dispnew.c (init_desired_glyphs): New function.
! 	* xdisp.c (redisplay): Call init_desired_glyphs for each frame.
! 	Call prepare_menu_bars.
! 	(prepare_menu_bars): Delete code at beginning that duplicates
! 	things done at the beginning of redisplay.
! 
! 	* alloc.c (inhibit_garbage_collection): New function.
! 
! 	* xterm.c (XTread_socket): Pass dpyinfo to popup_get_selection.
! 
! 	* xmenu.c (popup_get_selection): Queue up events that aren't
! 	for the menu, and process them afterward.  New arg dpyinfo.
! 	(set_frame_menubar): Use inhibit_garbage_collection.
! 	[USE_X_TOOLKIT] (xmenu_show): Delete the queue code here.
! 	Pass dpyinfo to popup_get_selection.
! 	Don't call lw_destroy_all_widgets.
! 	[USE_X_TOOLKIT] (xdialog_show): Simplify using popup_get_selection.
! 
! Mon Apr 10 19:00:14 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* callint.c (Fcall_interactively): Fix handling of @
! 	when it tests whether the event has a window in it.
! 
! 	* s/sco4.h (NO_SOCKETS_IN_FILE_SYSTEM): Defined.
! 
! 	* eval.c (internal_condition_case): Abort if interrupt_input_blocked>0.
! 
! 	* xmenu.c (set_frame_menubar): Don't block input until after
! 	the menubar maps have been decoded.
! 
! Mon Apr 10 18:35:22 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* keyboard.c (push_frame_kboard, pop_frame_kboard): Do nothing if
! 	!MULTI_KBOARD.
! 
! 	* keyboard.c (init_keyboard): Don't malloc a new structure;
! 	initial_kboard should already exist for that.
! 	* frame.c (make_terminal_frame): Put initial_kboard on the list of
! 	all kboard objects.
! 
! Mon Apr 10 00:38:16 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* xmenu.c (popup_get_selection): For ButtonRelease event,
! 	clear dpyinfo->grabbed.
! 
! 	* window.c (temp_output_buffer_show): Select the chosen window
! 	temporarily for running temp-buffer-show-hook.
! 	(syms_of_window): Fix typo.
! 
! 	* s/osf1.h: Don't include alloca.h, string.h here.
! 	(malloc. realloc, xmalloc, xrealloc): Declarations moved to m/alpha.h.
! 	* m/alpha.h: Include alloca.h, string.h here.
! 	(malloc. realloc, xmalloc, xrealloc): Declarations moved from s/osf1.h.
! 
! 	* xdisp.c (display_mode_line): Use push_frame_kboard, pop_frame_kboard.
! 
! 	* xfns.c (x_window): Copy the frame name to non-Lisp string.
! 
! 	* keyboard.c (any_kboard_state): Renamed from unlock_kboard.
! 	Define it unconditionally, but it's a no-op unless MULTI_KBOARD.
! 	(single_kboard_state): New function.
! 	(push_frame_kboard, pop_frame_kboard): New functions.
! 	(single_kboard): Renamed from kboard_locked.
! 
! 	* keyboard.h (single_kboard): Renamed from kboard_locked.
! 	All refs renamed.
! 	(struct kboard): Move flag fields to the end, and make them chars.
! 	Delete the `unused' field.
! 
! 	* callint.c (Fcall_interactively): Call single_kboard_state
! 	to switch to the single-kboard state.
! 	* minibuf.c (read_minibuf): Call single_kboard_state
! 	to switch to the single-kboard state.
! 
! 	* alloc.c, data.c, macros.c, print.c: Include keyboard.h.
! 
! 	* Makefile.in.in (alloc.o, data.o, macros.o, print.o):
! 	Depend on keyboard.h.
! 
! 	* xterm.h (x_display_info): Use `struct kboard', not KBOARD.
! 	* frame.h (struct frame): Use `struct kboard', not KBOARD.
! 
! 	* keyboard.h (KBOARD, etc): Moved from lisp.h.
! 	(struct kboard): Renamed from struct KBOARD.
! 	* lisp.h (KBOARD, etc): Moved to keyboard.h.
! 
! Sun Apr  9 00:51:09 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* keyboard.c (unlock_kboard): Do nothing with Vunread_command_events.
! 	(read_char): Clean up logic for reading from KBOARD queues.
! 
! 	* xfns.c (defined_color): Fix typo (duplicate +).
! 
! 	* keyboard.c (kbd_buffer_get_event): Set copy by assignment, not init.
! 
! 	* xterm.c (XTread_socket): Make deiconify event
! 	only if frame was iconified.
! 
! 	* xrdb.c (xmalloc, xrealloc): Declare them here.
! 
! Sat Apr  8 20:42:00 1995  Erik Naggum  <erik@naggum.no>
! 
! 	* editfns.c (Fencode_time): New function, to match `decode-time'.
! 
! Sat Apr  8 00:19:38 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* intervals.c (set_point): When skipping intangible text,
! 	stop where property value changes.
! 
! 	* indent.c (Fmove_to_column): Fix minor bug in prev change.
! 
! 	* lread.c (read_escape): Undo Nov 15 change.
! 
! 	* xdisp.c (display_mode_line): Test mode_line_inverse_video
! 	before highlighting partial-width mode line.
! 
! 	* xmenu.c (popup_activate_callback): Increment popup_activated_flag.
! 	(popup_deactivate_callback): Decrement it.
! 
! 	* s/linux.h (HAVE_SELECT, HAVE_TIMEVAL): Definitions deleted.
! 	config.h should handle them.
! 
! 	* xdisp.c (redisplay): Don't call update_frame for non-selected
! 	termcap frame.
! 
! Sat Apr  8 04:37:32 1995  Noah Friedman  <friedman@prep.ai.mit.edu>
! 
!         * window.c (Fnext_window, Fprevious_window): If all_frames is a
!         frame and window is not on that frame, return the first window on
!         that frame.
! 
! Fri Apr  7 19:59:01 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* lread.c (init_lread): Add site-lisp under the installation dir
! 	to Vload_path if that exists.
! 
! 	* s/osf1.h (xmalloc, xrealloc): Declare them.
! 
! 	* frame.c (make_terminal_frame): Use Emacs, Emacs-2, ... as name.
! 
! 	* xdisp.c (decode_mode_spec): Add %F code.
! 	Order alternatives alphabetically.
! 
! 	* s/aix4.h: Use "..." in #include.
! 
! Fri Apr  7 10:16:44 1995  Morten Welinder  <terra+@cs.cmu.edu>
! 
! 	* s/osf1.h: Include alloca.h, string.h.  Test NOT_C_CODE.
! 
! 	* m/alpha.h (SPECIAL_EMACS_INT): Defined.
! 
! Fri Apr  7 19:09:53 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* keyboard.c (kbd_buffer_get_event): Check for frame buried in a cons.
! 	Delete menu_bar_event handling code.
! 	(make_lispy_event): Move it here, so it gets a switch-frame if needed.
! 
! 	* callint.c (Fcall_interactively): Fix previous change.
! 
! Fri Apr  7 00:02:45 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* doprnt.c (xmalloc, xrealloc): Declare them here.
! 
! 	* callint.c (Fcall_interactively): `+' is reserved for user changes.
! 
! 	* process.c (read_process_output_error_handler)
! 	(exec_sentinel_error_handler): Fsleep_for wants two args.
! 
! 	* xfns.c (validate_x_resource_name): Change invalid chars to `_'.
! 
! 	* doprnt.c (doprnt): Cast pointer to int by way of EMACS_INT.
! 
! 	* xmenu.c (menubar_selection_callback, dialog_selection_callback)
! 	(single_submenu): Cast pointer to int by way of EMACS_INT.
! 
! 	* floatfns.c (Flogb): Use EMACS_INT for `value'.
! 
! 	* editfns.c (Fformat): Cast int to pointer by way of EMACS_INT.
! 
! 	* search.c (search_buffer): Avoid casting trt to int.
! 	Use EMACS_INT for comparing pointers.
! 
! 	* buffer.h (Fdelete_overlays): Add declaration.
! 
! 	* keyboard.c (parse_modifiers): Use type EMACS_INT for `modifiers'.
! 
! 	* xterm.c (dumpglyphs): Cast FACE_DEFAULT to (XFontStruct *)
! 	for comparison with face->font.
! 
! 	* sysdep.c (bcopy): If NEED_BCOPY, do compile this.
! 
! 	* m/ncr386.h: New file.
! 
! 	* s/hpux9.h (LD_SWITCH_X_DEFAULT): New definition.
! 	(C_SWITCH_X_DEFAULT): New definition.
! 
! 	* doc.c (get_doc_string): In (STRING . INTEGER), if INTEGER
! 	is negative, negate it.
! 
! 	* eval.c (Fuser_variable_p): For (STRING . INTEGER), test sign.
! 
! 	* s/sol2.h (C_SWITCH_X_SYSTEM): Defined.
! 
! 	* s/usg5-4-2.h (LIBS_SYSTEM): New override definition.
! 
! 	* lisp.h (XMISCTYPE): New macro.
! 	(union Lisp_Misc): Delete the `type' field.
! 	Use XMISCTYPE instead of that.
! 
! 	* alloc.c (Fmake_marker, mark_object): Use XMISCTYPE.
! 	(clear_marks, gc_sweep): Use u_marker union elt to extrat misc type.
! 
! 	* lread.c (defvar_int, defvar_bool, defvar_lisp_nopro, defvar_kboard)
! 	(defvar_per_buffer): Use XMISCTYPE.
! 	* print.c (print): Use XMISCTYPE.
! 	* fns.c (internal_equal): Use XMISCTYPE.
! 	* buffer.c (Fmake_overlay): Use XMISCTYPE.
! 	* data.c (Ftype_of, do_symval_forwarding, store_symval_forwarding)
! 	(find_symbol_value, Fmake_variable_buffer_local, Fmake_local_variable):
! 	Use XMISCTYPE.
! 
! 	* xdisp.c (prepare_menu_bars): Do the frame titles last.
! 
! Thu Apr  6 17:54:20 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* xfaces.c (intern_face): Cast FACE_DEFAULT to (XFontStruct *)
! 	for comparison with face->font.
! 
! 	* puresize.h (CHECK_IMPURE): Remove & from before my_edata.
! 
! 	* editfns.c (Fformat_time_string): Use emacs_strftime.  Doc fix.
! 
! 	* Makefile.in.in (strftime.o): Define strftime as emacs_strftime.
! 
! 	* xmenu.c (frame_vector): New static variable.
! 	(syms_of_xmenu): staticpro it.
! 	(frame_vector_add_frame): New function.
! 	(set_frame_menubar): Use frame_vector; use index as the widget id.
! 	(free_frame_menubar): Likewise.  Remove the frame from frame_vector.
! 	(menubar_selection_callback): Use frame_vector to turn id into frame.
! 
! 	* emacs.c (main): Cast arg to `brk'.
! 
! 	* sysdep.c (init_sys_modes): Use TCOON only if defined.
! 
! 	* s/netbsd.h (NO_MATHERR): Defined.
! 	(LIBS_SYSTEM): Definition deleted.
! 
! 	* unexsunos4.c: Treat __NetBSD__ like __FreeBSD__.
! 
! Thu Apr  6 14:49:30 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* fns.c (Fplist_put): Fix missing \n\.
! 
! 	* xfns.c (x_window_to_frame): Skip non-X frames before testing dpyinfo.
! 	[USE_X_TOOLKIT] (x_any_window_to_frame, x_top_window_to_frame): Ditto.
! 
! Thu Apr  6 08:00:06 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
! 
! 	* data.c (Fcar, Fcdr, Fsetcar, Fsetcdr): Arg name doc fixes.
! 
! Thu Apr  6 01:18:11 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* puresize.h (BASE_PURESIZE): Increment to 310000.
! 
! 	* indent.c (string_width): New function.
! 	(vmotion): Compute the width of minibuf_prompt
! 	if it isn't already known.
! 
! 	* buffer.c (Fkill_buffer): Call reset_buffer_local_variables
! 	and swap_out_buffer_local_variables.
! 	(swap_out_buffer_local_variables): New subroutine.
! 	(Fkill_all_local_variables): Use that subroutine.
! 
! 	* search.c (Flooking_at, Fposix_looking_at): Change arg name.
! 
! Wed Apr  5 22:52:55 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* frame.c (Fraise_frame, Flower_frame): Now interactive.
! 
! Tue Apr  4 22:53:24 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* lisp.h: Declare Ffetch_bytecode.
! 	* eval.c (Ffetch_bytecode): New function.
! 	(funcall_lambda): Call it.
! 	(syms_of_eval): defsubr it.
! 
! Mon Apr  3 17:48:22 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* xfns.c (x_window_to_frame): New arg DPYINFO.  All callers changed.
! 	(x_any_window_to_frame, x_top_window_to_frame): Likewise.
! 
! 	* lisp.h (Vmessage_log_max): Declare this variable.
! 	(message_nolog): Declare this function.
! 	* emacs.c (main): Start with an empty message log.
! 	* xdisp.c (message_nolog): New function.
! 	* fns.c (Fy_or_n_p): Don't log prompt.
! 	(Fyes_or_no_p): Fix typo in doc string.
! 
! Sat Apr  1 01:13:50 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* lread.c (oblookup): Save bucket num in oblookup_last_bucket_number.
! 	(Funintern): New function.
! 	(syms_of_lread): defsubr it.
! 
! Fri Mar 31 23:31:22 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* dired.c (Fdirectory_files): Fix bug in IS_ANY_SEP usage
! 	introduced in Oct 30 change.
! 
! Fri Mar 31 14:25:43 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* keyboard.c (command_loop_1): If we ignore force_start, then also
! 	ignore beg_unchanged and end_unchanged.
! 
! Fri Mar 31 09:55:41 1995  Michael Ernst  <mernst@research.microsoft.com>
! 
! 	* lread.c (isfloat_string): Permit trailing space.
! 
! Thu Mar 30 19:07:04 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* keyboard.c (event_to_kboard): Ignore dead frames.
! 	(kbd_buffer_get_event): In batch mode, use current_kboard.
! 
! 	* xterm.c (x_delete_display): Extract kboard deletion, for modularity.
! 	* keyboard.c (wipe_kboard): Make this function static.
! 	(delete_kboard): New function, extracted from x_delete_display.
! 
! 	* lisp.h: Declare function delete_kboard.
! 
! 	* xterm.h (struct x_display_info): New member cut_buffers_initialized.
! 	* xterm.c (x_term_init): Initialize it.
! 	* xselect.c (Fx_store_cut_buffer_internal): Use the flag in the
! 	frame's x_display_info, not a global flag.
! 	(Fx_rotate_cut_buffers_internal): Likewise.
! 
! 	* emacs.c (sort_args): Skip strncmp if longname is a null pointer.
! 
! Thu Mar 30 04:22:00 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* data.c (Fmod): Fix the final adjustment, when i2 < 0 and i1 == 0.
! 
! Wed Mar 29 01:07:28 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* frame.c [MULTI_FRAME] (Factive_minibuffer_window): New function.
! 	[MULTI_FRAME] (syms_of_frame): Defsubr it.
! 
! Tue Mar 28 18:32:08 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* process.c (Fsignal_process): SIGCODE is a symbol, not a string.
! 
! Tue Mar 28 02:38:16 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* fns.c (Fconcat): Undo previous change.
! 
! Mon Mar 27 16:10:46 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* fns.c (Fget, Fput): Fetch and store symbol's plist directly.
! 
! Mon Mar 27 10:26:49 1995  Boris Goldowsky  <boris@cs.rochester.edu>
! 
! 	* fns.c (Fplist_put, Fplist_get): New fns.
! 	(Fget): Use Fplist_get to do the work.
! 	(Fput): Use Fplist_put to do the work.
! 
! 	* textprop.c (Vdefault_text_properties): name changed from
! 	Vdefault_properties.
! 	* intervals.h: As above.
! 	* intervals.c (textget): As above.
! 
! 	* intervals.c (textget_direct): Fn deleted.
! 	(textget, verify_interval_modification): Use Fplist_get instead.
! 	* intervals.h: Remove declaration.
! 
! Sun Mar 26 03:45:13 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* xterm.c (XTmouse_position): New arg `insist'.
! 	* ntinevt.c (win32_mouse_position): New arg `insist'.
! 	* msdos.c (mouse_get_pos): New arg `insist'.
! 
! 	* xmenu.c (Fx_popup_menu): Pass 1 for `insist' arg.
! 	(Fx_popup_dialog): Likewise.
! 	* frame.c (Fmouse_position--both definitions): Pass 0 for `insist'.
! 	(Fmouse_pixel_position): Pass 0 for `insist'.
! 	Add HAVE_MOUSE conditional.
! 	* keyboard.c (kbd_buffer_get_event): Pass 0 for `insist' arg.
! 
! 	* m/intel386.h (C_SWITCH_SYSTEM): Don't #undef or define it.
!  	[SOLARIS2, SOLARIS2_4, !__GNUC__] (C_SWITCH_MACHINE): Define instead.
! 
! Sun Mar 26 03:02:28 1995  Germano Caronni <caronni@tik.ethz.ch>
! 
! 	* ralloc.c (r_re_alloc): Correct realloc behavior--allow shrinking
!  	of blocks while reallocating, if shrinking by more than one page.
! 	(relocate_blocs, resize_blocs): Added failsafe to protect future
! 	calling of these routines when in frozen state.
! 	(r_alloc_thaw): Added call to r_alloc_init.
! 	(relocate_blocks, resize_bloc, r_alloc_sbrk, r_alloc_thaw): Extended
! 	functionality to let ralloc package work in frozen state, allowing
! 	for the existence of unused blocks.
! 
! Sat Mar 25 21:02:37 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* process.c (Fsignal_process): Allow signal names as well as numbers.
! 
! Fri Mar 24 23:47:47 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* editfns.c (init_editfns): Use NAME envvar to init user-full-name.
! 
! Fri Mar 24 17:38:35 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* textprop.c (Fnext_property_change): Fix previous change.
! 
! Thu Mar 23 19:40:04  Kevin Rodgers <kevinr@ihs.com>
! 
! 	* print.c (temp_output_buffer_setup): (Re)set the default
! 	directory of the temp buffer to that of the current buffer.
! 
! Thu Mar 23 16:30:17 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* buffer.c (syms_of_buffer): Doc fix.
! 
! 	* xdisp.c (redisplay): Make sure pause is set before used.
! 	Delete unused vars.
! 	(redisplay_window): Make sure update_mode_line is set before used.
! 	If startp might not have been set, use w->start directly.
! 	(try_window_id): In the easy case, find cursor pos before returning.
! 	(try_window_id): Stop scan at bottom of window, not one line later.
! 	Don't fail on account of continuation line below window.
! 	(redisplay_window): Stop scan at bottom of window.
! 	Fix reversed condition.
! 
! 	* Makefile.in.in (FRAME_SUPPORT, MSDOS_SUPPORT): Don't list face
! 	and mouse related files here.
! 	(FACE_SUPPORT, MOUSE_SUPPORT): New lists.
! 	(FACE_SUPPORT): Add facemenu.elc.
! 	(WINNT_SUPPORT): New list.
! 	(lisp): Add format.elc, FACE_SUPPORT, MOUSE_SUPPORT, WINNT_SUPPORT.
! 
! Thu Mar 23 12:01:22 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* m/sparc.h: Don't include alloca.h if NOT_C_CODE.
! 
! 	* m/mips-siemens.h (UNEXEC): Override the definition.
!   	(LIBS_DEBUG, ORDINARY_LINK): Add #undefs.
! 
! Wed Mar 22 12:43:34 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* dispnew.c (direct_output_forward_char): Don't use direct output
! 	at an overlay boundary.
! 	* buffer.c (overlay_touches_p): New function.
! 	* lisp.h: Declare overlay_touches_p.
! 
! 	* fns.c (concat): Treat integers as characters, not strings.
! 	This makes `concat' more like `insert'.
! 
! 	* window.c (syms_of_window): Fix missing \n\.
! 	* keymap.c (Fwhere_is_internal): Fix missing \n\.
! 	* fileio.c (syms_of_fileio): Fix missing \n\.
! 
! Tue Mar 21 01:15:00 1995  Marco Walther  <Marco.Walther@mch.sni.de.>
! 
! 	* unexelfsni.c: New file.
! 
! 	* m/mips-siemens.h: Total rewrite.
! 
! Mon Mar 20 18:32:13 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* xdisp.c (redisplay_window): Skip the only-point-has-changed
! 	optimization if updating the window's mode line.
! 
! Sun Mar 19 13:47:20 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* xdisp.c (invisible_p, invisible_ellipsis_p): Handle list
! 	as invisible property value.
! 
! Sat Mar 18 18:07:21 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* xdisp.c (display_menu_bar): Just one space between menu items.
! 
! Sat Mar 18 06:15:50 1995  Ted Lemon  <mellon@toccata.fugue.com>
! 
! 	* emacs.c (dump-emacs-data, dump-emacs): Declare my_edata as
! 	char array.
! 	* lastfile.c (my_edata): Declare as char array, not int.
! 	* puresize.h (CHECK_IMPURE): Declare my_edata as char array.
! 
! Fri Mar 17 20:30:51 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* lread.c (Vload_read_function): New variable.
! 	(readevalloop): Use that variable.
! 	(syms_of_lread): Set up Lisp variable.
! 
! Fri Mar 17 13:16:53 1995  Boris Goldowsky  <boris@spiff.gnu.ai.mit.edu>
! 
! 	* buffer.h (struct buffer): Add file_format member.
! 
! 	* buffer.c (reset_buffer): Reset file_format element too.
! 	(init_buffer_once): Define file_format flag; reset file_format.
! 	(syms_of_buffer): New vbl buffer-file-format.
! 
! 	* fileio.c (Finsert_file_contents): Call format-decode.
! 	(build_annotations): Call format-annotate-function for each element of
! 	buffer-file-format.
! 	(Vauto_save_file_format): New vbl.
! 	(build_annotations): Use it.
! 
! Fri Mar 17 02:40:46 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* alloc.c (init_alloc_once): Increase gc_cons_threshold to 300000.
! 
! Wed Mar 15 16:37:33 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* xfns.c (x_decode_color): Don't use cdef if defined_color failed.
! 
! Wed Mar 15 15:10:47 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* config.h.in [HAVE_X_WINDOWS] (MULTI_KBOARD): Define this symbol.
! 
! Tue Mar 14 19:03:03 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* lisp.h (struct KBOARD, MULTI_KBOARD, current_kboard, all_kboards):
! 	(Lisp_Misc_Kboard_Objfwd, Lisp_Kboard_Objfwd, XKBOARD_OBJFWD):
! 	(KBOARD_OBJFWDP, GC_KBOARD_OBJFWDP, kboard_locked, the_only_kboard):
! 	(DEFVAR_KBOARD): Renamed from PERDISPLAY, MULTI_PERDISPLAY,
! 	current_perdisplay, all_perdisplays, Lisp_Misc_Display_Objfwd,
! 	Lisp_Display_Objfwd, XDISPLAY_OBJFWD, DISPLAY_OBJFWDP,
! 	GC_DISPLAY_OBJFWDP, display_locked, the_only_perdisplay,
! 	DEFVAR_DISPLAY.  All uses changed.
! 	(struct KBOARD): New member reference_count.
! 	(initial_kboard): Declare this var.
! 	* .gdbinit (xkbobjfwd): Renamed from xdispobjfwd.
! 	* frame.h (struct frame): New member kboard.
! 	(FRAME_KBOARD): Accessor macro for that member, replacing
! 	get_perdisplay.
! 	* xterm.h (struct x_display_info): member kboard (formerly
! 	perdisplay) is now a pointer, not an actual struct.
! 	(get_perdisplay, get_perdisplay_macro): Deleted.
! 	* xfns.c (Fx_create_frame): set the frame's kboard member.
! 	* xterm.c (get_perdisplay): Deleted.
! 	(same_x_server): New function.
! 	(x_term_init): If this display shares a keyboard with one we've
! 	already opened, then share the structure.
! 	(x_delete_display): Don't delete the kboard until the reference
! 	count becomes zero.
! 	* lread.c (defvar_kboard): Renamed from defvar_display.
! 	* alloc.c (mark_kboards): Renamed from mark_perdisplays.
! 	* frame.c (make_frame): Initialize kboard member.
! 	(make_terminal_frame): Create initial_kboard if not already set.
! 	* keyboard.c (unlock_kboard): Renamed from unlock_display.
! 	(wrong_kboard_jmpbuf): Renamed from wrong_display_jmpbuf.
! 	(event_to_kboard): Renamed from event_to_perdisplay.
! 	(kbd_buffer_get_event): If no associated kboard, store
! 	current_kboard rather than the first kboard in the global list.
! 	(init_kboard): Renamed from init_perdisplay.  Initialize reference
! 	count.
! 	(wipe_kboard): Renamed from wipe_perdisplay.
! 	* data.c (find_symbol_value): current_perdisplay now is never null.
! 	(store_symval_forwarding, do_symval_forwarding): Likewise.
! 
! Tue Mar 14 00:45:13 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* data.c (Fash): Fix previous change.
! 
! 	* buffer.c (Fmake_indirect_buffer): Invert the arguments.
! 
! 	* marker.c (unchain_marker): Allow differing buffers
! 	as long as they have the same text.
! 
! Mon Mar 13 16:47:12 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* keyboard.c (event_to_perdisplay): New function.
! 	(kbd_buffer_get_event): Use event_to_perdisplay.
! 	(kbd_buffer_store_event): If C-g arrives while we're in the run
! 	state on behalf of another display, just clear the queue and
! 	deposit the C-g to be read later.
! 	(read_key_sequence): After a throw, unwind delayed_switch_frame as
! 	well as keybuf.  Don't insert an extra switch-frame if empty.
! 
! 	* print.c (print): current_perdisplay now is never null.
! 	* callint.c (clear_prefix_arg): Likewise.
! 	* macros.c (Fexecute_kbd_macro): Likewise.
! 
! Mon Mar 13 02:19:09 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* minibuf.c (read_minibuf): Save Voverriding_local_map.
! 	(read_minibuf_unwind): Restore Voverriding_local_map.
! 
! Mon Mar 13 01:33:40 1995  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
! 
! 	* unexelf.c (unexec): Adjust the file offset of sections located
! 	after the section header table.
! 
! Sun Mar 12 21:49:33 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* keyboard.c (unlock_display): current_perdisplay now is never null.
! 	(cmd_error, command_loop_1, read_char): Likewise.
! 	(kbd_buffer_get_event, read_key_sequence): Likewise.
! 	(read_char): Handle synchronous quit_char on a different display.
! 	(read_char): Rewrite queue-searching code.
! 	(read_key_sequence): Save selected_frame.
! 	(init_keyboard): Initialize current_perdisplay.
! 
! Sun Mar 12 00:01:03 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* keyboard.c (parse_modifiers_uncached): Delete the code for
! 	multi-character modifiers and for recognizing a modifier alone.
! 	(parse_solitary_modifier): New function.
! 	(convert_event_type_list): Use parse_solitary_modifier.
! 	Also convert symbol A to character A.
! 	Handle shift modifier with lower-case letters.
! 
! 	* window.c (Fdisplay_buffer): Fix prev change--return sel window.
! 
! 	* indent.c (compute_motion, Fmove_to_column, current_column)
! 	(character_width): Let display table handle \n, \r, \t.
! 	(compute_motion): Fix logic in previous change wrt skipping invisible.
! 
! Sat Mar 11 01:01:42 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* xdisp.c (display_text_line): When setting selective_rlen,
! 	ignore whether selective display is on or off.
! 
! 	* textprop.c (Fnext_property_change): Handle LIMIT = t.
! 
! 	* indent.c (compute_motion): Call recenter_overlay_lists sooner.
! 	Use Fnext_property_change to get a quick lower bound for
! 	where `invisible' changes.
! 
! Fri Mar 10 19:50:03 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* data.c (Fash, Flsh): Change arg names.
! 
! Thu Mar  9 18:45:06 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* intervals.h (TEXT_PROP_MEANS_INVISIBLE): New macro.
! 	(TEXT_PROP_MEANS_INVISIBLE_WITH_ELLIPSIS): New macro.
! 
! 	* xdisp.c (display_text_line, try_window): Check `invisible' prop
! 	using TEXT_PROP_MEANS_INVISIBLE.
! 	(display_text_line): Check TEXT_PROP_MEANS_INVISIBLE_WITH_ELLIPSIS;
! 	if it says so, use ellipses after invisible text.
! 	(invisible_p, invisible_ellipsis_p): New functions.
! 
! 	* indent.c (compute_motion, vmotion): Check `invisible' prop
! 	using TEXT_PROP_MEANS_INVISIBLE.
! 
! 	* buffer.h (struct buffer): New field `invisibility_spec'.
! 	* buffer.c (reset_buffer_local_variables): Init invisibility.
! 	(init_buffer_once): Set up buffer_local_flags for it.
! 	(syms_of_buffer): New variable `buffer-invisibility-spec'.
! 
! Wed Mar  8 21:57:52 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* syntax.c (Fforward_comment): Always clear immediate_quit for return.
! 
! Wed Mar  8 17:47:37 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* sysdep.c (read_input_waiting): Fix Lisp_Object vs. int problem.
! 
! Tue Mar  7 19:41:09 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* lisp.h (struct PERDISPLAY): New member kbd_queue_has_data.
! 	* keyboard.c (unlock_display): If adding to kbd_queue, set
! 	kbd_queue_has_data.
! 	(read_char): Set and clear kbd_queue_has_data appropriately, but
! 	leave it unset when we push back an incomplete sequence.
! 	(read_char): Take the longjmp even if current_perdisplay was null.
! 	(readable_events): Check kbd_queue_has_data instead of kbd_queue.
! 	(init_perdisplay): Initialize kbd_queue_has_data.
! 
! 	* keyboard.c (command_loop_1): Removed inline code for prefix args.
! 	* callint.c (current_prefix_partial): New var.
! 	(Funiversal_argument): New function, formerly inlined in keyboard.c.
! 	(Fnegative_argument, Fdigit_argument): Likewise.
! 	(clear_prefix_arg): Moved here from keyboard.c.
! 	Don't clear the internal state if we're still building a prefix arg.
! 	(finalize_prefix_arg, describe_prefix_arg): Moved from keyboard.c.
! 	(syms_of_callint): defsubr the new functions.
! 	* lisp.h: Declare new var and functions.
! 
! 	* lisp.h (struct PERDISPLAY): New member Vlast_kbd_macro.
! 	* alloc.c (mark_perdisplays): Mark it here.
! 	* keyboard.c (init_perdisplay): Initialize it here.
! 
! 	* macros.c (Fstart_kbd_macro): Access Vlast_kbd_macro via perdisplay.
! 	(Fend_kbd_macro, Fcall_last_kbd_macro): Likewise.
! 	(init_macros): Delete initialization.
! 	(syms_of_macros): Use DEFVAR_DISPLAY for Vlast_kbd_macro.
! 	Doc fix for executing-macro, executing-kbd-macro, last-kbd-macro.
! 
! 	* keyboard.c (cmd_error): Bind Vprint_level and Vprint_length.
! 
! Mon Mar  6 23:55:38 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* keyboard.c (command_loop_1): Fix test for prefix arg.
! 
! Mon Mar  6 10:17:14 1995  Boris Goldowsky  <boris@cs.rochester.edu>
! 
! 	* textprop.c (Vdefault_properties): New variable.
! 	* intervals.h: Declare it.
! 	* intervals.c (textget): Check it.
! 
! Fri Mar  3 02:01:52 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* callint.c (Fcall_interactively): Fix Feb 22 change.
! 
! 	* keyboard.c (read_key_sequence): Update orig_local_map
! 	for some additional gotos to replay_sequence.
! 
! 	* process.c (exec_sentinel, read_process_output): If running filter
! 	or sentinel changes the local map, call record_asynch_buffer_change.
! 
! Thu Mar  2 20:45:08 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* xdisp.c (display_mode_line): Temporarily set current_perdisplay
! 	to reference the frame we're updating.
! 
! 	* lisp.h (struct PERDISPLAY): New members defining_kbd_macro,
! 	kbd_macro_buffer, kbd_macro_ptr, kbd_macro_end, kbd_macro_bufsize.
! 	* macros.h (defining_kbd_macro): Delete declaration.
! 	* macros.c (defining_kbd_macro): Delete; now part of perdisplay.
! 	All uses changed.
! 	(kbd_macro_buffer, kbd_macro_ptr, kbd_macro_end): Likewise.
! 	(kbd_macro_bufsize): Likewise.
! 	(Fstart_kbd_macro): Initialize kbd_macro_buffer if not already done.
! 	(init_macros): Delete initialization of defining_kbd_macro.
! 	(syms_of_macros): Delete initialization of kbd_macro_buffer.
! 	* keyboard.c (read_char_minibuf_menu_prompt): orig_defn_macro is
! 	now a Lisp_Object, not an int.
! 	(init_perdisplay): Initialize some of the new members.
! 	(wipe_perdisplay): Free kbd_macro_buffer.
! 
! 	* keyboard.c (cmd_error): Allow current_perdisplay to be null.
! 
! 	* keyboard.c (read_key_sequence): New arg can_return_switch_frame.
! 	All callers changed.
! 	(Fread_key_sequence): Likewise.
! 	* callint.c (Fcall_interactively): Defer switch-frame events when
! 	reading `k' or `K' specification.
! 
! Thu Mar  2 14:37:26 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* emacs.c (syms_of_emacs): Doc fix.
! 
! Thu Mar  2 02:28:04 1995  John Grabowski  <johng@media.mit.edu>
! 
! 	* xfns.c (defined_color): If colormap is full, find closest match.
! 	* xfaces.c (load_color): Call defined_color to allocate the color.
! 
! Wed Mar  1 01:58:34 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* xterm.c (x_connection_closed): Ignore non-X frames.
! 	Fix the logic for deleting frames that use separate minibuffers
! 	that are on the dead connection.
! 
! 	* buffer.c (Fpop_to_buffer): Call Fset_buffer_major_mode
! 	if we create a buffer.
! 
! Tue Feb 28 18:33:11 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* keyboard.c (cmd_error): Use clear_prefix_arg.
! 	(internal_last_event_frame, Vlast_event_frame): Normal vars again.
! 	All uses changed.
! 	(Quniversal_argument, Qdigit_argument, Qnegative_argument): Declare.
! 	(clear_prefix_arg, finalize_prefix_arg, describe_prefix_arg): New fns.
! 	(command_loop_1): Handle digits and minus specially, when they're
! 	part of a prefix arg.
! 	Handle universal-argument and digit-argument and negative-argument
! 	bindings here, rather than doing I/O in the Lisp code.
! 	(read_char): When reading switch-frame events from the side queue,
! 	set internal_last_event_frame.
! 	(readable_events): Return non-zero if a side queue has data.
! 	(kbd_buffer_get_event): Don't abort if event has no associated frame.
! 	(read_key_sequence): Improve behavior when there's no current display.
! 	(init_perdisplay): Initialize the new members.
! 	* callint.c (Fcall_interactively, syms_of_callint): Undo Jan 31 change.
! 	(Vprefix_arg, Vcurrent_prefix_arg): Undo Jan 31 change.
! 	* mocklisp.c (Fml_provide_prefix_argument, Fml_prefix_argument_loop):
! 	Undo Jan 31 change.
! 	* minibuf.c (read_minibuf, read_minibuf_unwind): Undo Jan 31 change.
! 	* frame.c (do_switch_frame): Undo Feb 6 change.
! 	* macros.c (Fexecute_kbd_macro): Use clear_prefix_arg.
! 	* lisp.h (struct PERDISPLAY): Add prefix_factor, prefix_value,
! 	prefix_sign, prefix_partial.  Delete Vcurrent_prefix_arg and
! 	Vprefix_arg; those are now plain vars again.
! 	* alloc.c (mark_perdisplays): Update to reflect current Lisp_Objects.
! 	(NSTATICS): Increase to 768.
! 
! Tue Feb 28 12:56:36 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* frame.c (Fframep): Doc fix.
! 
! Tue Feb 28 00:20:50 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* callint.c (Fcall_interactively): Lock the display before
! 	executing the command, no matter how we execute it.
! 
! Sun Feb 26 02:44:35 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* keyboard.c (convert_event_type_list): New function.
! 	(lucid_event_type_list_p): New function.
! 	(parse_modifiers_uncached): If MODIFIERS_END is -1,
! 	look for just a modifier.  Guts rewritten.
! 
! 	* keymap.c (Fdefine_key): Handle Lucid-style (crtl backspace) etc.
! 	(Flookup_key): Likewise.
! 
! 	* callproc.c (Fcall_process): Extend BUFFER arg so it can specify
! 	a separate output file for stderr output.
! 	(Fcall_process_region): Doc fix.
! 
! Sat Feb 25 03:31:33 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* xmenu.c (Fx_popup_menu): Init f from selected_frame
! 	before calling mouse_position_hook.
! 
! 	* window.c (Vsame_window_buffer_names, Vsame_window_regexps): New vars.
! 	(syms_of_window): Set up Lisp vars.
! 	(Fdisplay_buffer): Use those vars--if requested, use current window.
! 
! Fri Feb 24 23:03:10 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* keyboard.c (unlock_display): New function.
! 	(cmd_error, command_loop_1): Call it when appropriate.
! 	(read_char): If no current display, don't try to echo.
! 
! 	* term.c (term_init) [TERMINFO]: Make error message more accurate.
! 
! Thu Feb 23 22:35:58 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* keymap.c (Fglobal_set_key, Flocal_set_key, Fglobal_unset_key)
! 	(Flocal_unset_key): Functions deleted (moved to simple.el).
! 	(syms_of_keymap): Don't defsubr them.
! 
! Thu Feb 23 21:25:41 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* keyboard.c (display_locked): New var to indicate when we're in
! 	the run state.  current_perdisplay is now meaningful in the wait
! 	state as well.
! 	(cmd_error): Clear display_locked in addition to current_perdisplay.
! 	(command_loop_1): outer_perdisplay renamed from global_perdisplay.
! 	Restore display_locked as well as current_perdisplay.
! 	(read_char): read_char_perdisplay merged with current_perdisplay.
! 	(read_key_sequence): Likewise.
! 	* minibuf.c (read_minibuf): Make sure the display is locked.
! 	* callint.c (Fcall_interactively): If the display hasn't already
! 	been locked by reading from the minibuffer, lock it before
! 	executing the command.
! 	* lisp.h (display_locked): Declare this var.
! 
! Thu Feb 23 01:00:04 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* window.c (syms_of_window): Doc fixes.
! 
! 	* keymap.c (Fwhere_is_internal): If FIRSTONLY is not nil or non-ascii,
! 	completely ignore menu bindings.
! 	* xmenu.c (menu_item_equiv_key): Delete the code that rejected
! 	menu bindings returned by Fwhere_is_internal.
! 
! 	* window.c (window_loop): Handle special display buffer frames
! 	for DELETE_BUFFER_WINDOWS as for UNSHOW_BUFFER.
! 
! Wed Feb 22 23:54:22 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* callint.c (Fcall_interactively): Use markers temporarily in
! 	args vector to stand for point and mark values; replace them
! 	with integers just before calling the command.
! 
! Tue Feb 21 22:01:17 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* lisp.h (struct PERDISPLAY): New member kbd_queue.
! 	Delete obsolete members kbd_buffer_frame_or_window, kbd_buffer,
! 	kbd_fetch_ptr, kbd_store_ptr; these are regular vars again.
! 	* alloc.c (mark_perdisplays): Mark kbd_queue.
! 	Remove reference to obsolete kbd_buffer_frame_or_window.
! 	* xmenu.c (menubar_selection_callback): frame_or_window field of a
! 	menu-bar event now includes both the frame and the magic cookie.
! 	* keyboard.c (kbd_buffer_frame_or_window): Restored old var.
! 	(kbd_buffer, kbd_fetch_ptr, kbd_store_ptr): Likewise.
! 	(read_char_perdisplay): New var.
! 	(read_char): Search all appropriate perdisplay objects, and do the
! 	right thing if the next event comes from a different source.
! 	(read_key_sequence): If there's a change of display in mid-stream,
! 	retreat and try reading the new display.
! 	(find_active_event_queue): Function deleted.  All callers changed
! 	to just test the main kbd_buffer instead.
! 	(kbd_buffer_store_event): Write to the main kbd_buffer again.
! 	(kbd_buffer_get_event): Read from the main kbd_buffer again.
! 	Now returns a perdisplay pointer in addition to a lispy event.
! 	(Fdiscard_input, swallow_events): Use the main kbd_buffer again.
! 	(stuff_buffered_input): Likewise.
! 	(init_perdisplay): Initialize member kbd_queue.
! 	Remove references to obsolete members.
! 	(wipe_perdisplay): Remove obsolete reference.
! 	(init_keyboard, syms_of_keyboard): Restore initialization of vars.
! 
! Tue Feb 21 20:19:45 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* xdisp.c (display_string, display_text_line):
! 	Display table overrides ordinary display even for \t, \n, etc.
! 
! Sun Feb 19 14:06:47 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* frame.c (Fmake_terminal_frame): Doc fix.
! 
! Sat Feb 18 04:05:41 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* s/hpux9.h (LIB_X11_LIB, C_SWITCH_X_SYSTEM, LD_SWITCH_X_DEFAULT):
! 	Add #undef's to cancel hpux8.h's definitions.
! 
! Fri Feb 17 03:44:55 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* config.h.in (MULTI_FRAME): Define unconditionally.
! 
! Thu Feb 16 01:36:39 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* dispnew.c (change_frame_size_1): New subroutine.
! 	(change_frame_size): If f is termcap frame, change size of all of them.
! 	(remake_frame_glyphs): No longer static.
! 	Don't mark nonselected termcap frame as garbaged.
! 
! 	* term.c (calculate_costs): Update max_frame_height, max_frame_width.
! 	They determine length of chars_wasted, copybuf and char_ins_del_vector.
! 
! 	* xdisp.c (redisplay): Don't display nonselected terminal frames.
! 
! 	* frame.c (Fmake_terminal_frame): New function.
! 	(syms_of_frame): defsubr it.
! 	(make_terminal_frame): Init Vframe_list only the first time.
! 	Set visible and async_visible directly.
! 	Give each terminal frame a unique name.
! 
! 	* ralloc.c (r_alloc_check): Return void.
! 	(r_alloc_freeze): Initialize if it hasn't been done.
! 	(r_re_alloc, r_alloc_free, r_alloc_sbrk): Likewise.
! 	(r_alloc_init): Set __malloc_extra_blocks.
! 
! Wed Feb 15 07:10:41 1995  Paul Reilly  <pmr@geech.gnu.ai.mit.edu>
! 
! 	* s/dgux.h (LIB_MOTIF): Add -lgen to provide provide the symbols
! 	`regcmp' and `regex'.
! 
! Wed Feb 15 03:05:34 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* xmenu.c (xmenu_show, both versions): New arg for_click.
! 	(Fx_popup_menu): Compute it and pass it.
! 
! Tue Feb 14 19:02:33 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* callint.c: Doc fix.
! 
! Tue Feb 14 21:48:14 1995  Paul Reilly  <pmr@geech.gnu.ai.mit.edu>
! 
! 	* xterm.c (x_bitmap_icon): Fix test for unallocated icon bitmap.
! 
! Tue Feb 14 16:33:49 1995  Richard Stallman  <rms@geech.gnu.ai.mit.edu>
! 
! 	* filelock.c: (unlock_buffer, unlock_all_files, Flock_buffer)
! 	(Funlock_buffer): Use buffer's file_truename, not filename.
! 
! 	* buffer.c (syms_of_buffer): Set up Lisp var buffer-file-truename.
! 	(init_buffer_once): Set up flag and default value for file_truename.
! 	(reset_buffer): Init file_truename slot.
! 
! 	* buffer.h (struct buffer): New field file_truename.
! 
! 	* ralloc.c (r_alloc_free): Call refill_memory_reserve only if emacs.
! 
! 	Include getpagesize.h unconditionally.
! 	(free_bloc): Don't die if bloc->next or bloc->prev is null.
! 	[!emacs] (bzero): New macro definition.
! 
! 	* keyboard.c (input_poll_signal): Add ignored argument.
! 	(interrupt_signal): Likewise.
! 
! 	* dispnew.c (window_change_signal): Add ignored argument.
  
! 	* process.c (Fstart_process): Make process marker point into proc buf.
  
! 	* xterm.c (x_display_bar_cursor): Use frame's cursor_width.
  
! 	(x_connection_signal): New function.
! 	(x_initialize): Use it as signal handler.
  
! 	* xfns.c (x_set_cursor_type): Set cursor_width field.
! 	Handle args of form (bar . WIDTH).
  
! 	* xterm.h (struct x_display): New element cursor_width.
  
! Tue Feb 14 04:15:32 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
  
! 	* filelock.c (unlock_buffer, unlock_all_files, Flock_buffer)
! 	(Funlock_buffer): Use buffer's file_truename, not filename.
  
! 	* buffer.h (struct buffer): New field file_truename.
! 	* buffer.c (syms_of_buffer): Set up Lisp var buffer-file-truename.
! 	(init_buffer_once): Set up flag and default value for file_truename.
! 	(reset_buffer): Init file_truename slot.
  
! 	* xterm.h (struct x_display): New element cursor_width.
! 	* xfns.c (x_set_cursor_type): Set cursor_width field.
! 	Handle args of form (bar . WIDTH).
! 	* xterm.c (x_display_bar_cursor): Use frame's cursor_width.
  
! Mon Feb 13 01:32:38 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
  
! 	* m/iris4d.h (STACK_DIRECTION): Undef before defining.
! 	[__GNUC__] (C_SWITCH_MACHINE): Remove -cckr.
! 	Add -32, only if IRIX_FORCE_32_BITS.
! 	* s/irix5-0.h [__GNUC__] (C_SWITCH_SYSTEM): Defined.
! 	* s/irix4-0.h [__GNUC__] (C_SWITCH_SYSTEM): Define this.
! 	(C_SWITCH_MACHINE): Instead of this.
  
! 	* ralloc.c (r_alloc_free): Call refill_memory_reserve only if emacs.
  
! 	* s/irix6-0.h: New file.
  
! 	* fileio.c (Fexpand_file_name): Copy default-directory
! 	before looking for a handler on the directory arg.
  
! 	* cmds.c (Vself_insert_face, Vself_insert_face_command): New variables.
! 	(syms_of_cmds): Set up Lisp variables.  Doc syntax fix.
! 	(internal_self_insert): Handle Vself_insert_face.
  
! 	* lisp.h (Qprocessp): Declared.
  
! 	* xdisp.c (redisplay_window): If we update the mode line,
! 	switch to the buffer for real, and switch back for real.
  
! Sun Feb 12 00:22:18 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
  
! 	* xterm.c (x_connection_signal): New function.
! 	(x_initialize): Use it as signal handler.
  
! 	* keyboard.c (input_poll_signal): Add ignored argument.
! 	(interrupt_signal): Likewise.
  
! 	* dispnew.c (window_change_signal): Add ignored argument.
  
! Sat Feb 11 16:56:31 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
  
! 	* fileio.c (Fexpand_file_name): Look for a handler for defalt.
! 	(syms_of_fileio): Minor rearrangement.
  
! 	* ralloc.c: Include getpagesize.h unconditionally.
! 	(free_bloc): Don't die if bloc->next or bloc->prev is null.
! 	[!emacs] (bzero): New macro definition.
  
! 	* xmenu.c (menu_item_equiv_key): If command is an alias,
! 	check only the underlying command for a keyboard equivalent.
  
! 	* s/netbsd.h (WAIT_USE_INT): Defined.
! 	* syswait.h: New alternative specified by WAIT_USE_INT.
  
! 	* process.c (Fstart_process): Make process marker point into proc buf.
  
! Fri Feb 10 01:37:34 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
  
! 	* data.c: Rename arg OBJ to OBJECT in all type predicates.
! 	(Ftype_of): New function.
  
! Thu Feb  9 04:30:09 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
  
! 	* xfaces.c (load_color): Ignore failure from XAllocColor.
! 	* xfns.c (x_decode_color): Ignore failure from defined_color.
  
! 	* m/intel386.h [SOLARIS2_4, !__GNUC__] (C_SWITCH_SYSTEM): Defined..
! 	[SOLARIS2_4, !__GNUC__]: Include alloca.h.
  
! Tue Feb  7 18:50:09 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
  
! 	* Makefile.in.in (maintainer-clean): Renamed from realclean.
! 	Print warning message.
  
! Tue Feb  7 18:18:54 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* keyboard.c (command_loop_1): Put back cancel_echoing call, if
! 	there's a perdisplay for it to apply to.
! 	(init_perdisplay): Initialize echo vars.
  
! 	* xdisp.c (message_log_check_duplicate): New function.
! 	(message_dolog): Delete previous line if the new one is a
! 	duplicate.  Include a counter if appropriate.
! 	Don't bother truncating the buffer until after adding newline.
  
! Mon Feb  6 20:00:22 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* lisp.h (struct PERDISPLAY): Add Vlast_event_frame.
! 	Define internal_last_event_frame only #if MULTI_FRAME.
! 	Add some placeholders so we don't need to rebuild every time this
! 	struct changes.
! 	* keyboard.c (internal_last_event_frame, Vlast_event_frame):
! 	Deleted; now part of perdisplay.  All uses changed.
! 	(MOUSE_ACTIVITY_AVAILABLE) Deleted.
! 	(find_active_event_queue): New arg check_mouse.  All callers changed.
! 	(Vlast_event_frame): Change from DEFVAR_LISP to DEFVAR_DISPLAY.
! 	* frame.c (do_switch_frame): internal_last_event_frame is now in
! 	perdisplay.
  
! Sun Feb  5 01:57:28 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
  
! 	* ralloc.c (r_alloc_size_in_use): New function.
  
! 	* alloc.c (emacs_blocked_malloc): Set __malloc_extra_blocks here.
! 	(malloc_hysteresis): New variable.
! 	(init_alloc_once): Initialize malloc_hysteresis.
! 	(buffer_memory_full): New function.
! 	* emacs.c (main): Undo previous change.
! 	* buffer.c (Fget_buffer_create): Call buffer_memory_full.
  
! 	* alloc.c (refill_memory_reserve): New function.
! 	* ralloc.c (r_alloc_free): Call refill_memory_reserve.
  
! Sat Feb  4 00:24:07 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
  
! 	* alloc.c (SPARE_MEMORY): New macro.
! 	(emacs_blocked_free): If no spare_memory now, and enough free
! 	space is available, get a new spare.
! 	(__malloc_size_t, _bytes_used): Declared.
! 	(bytes_used_when_full): New variable.
  
! 	* frame.h (struct frame): New field window_sizes_changed.
! 	(FRAME_WINDOW_SIZES_CHANGED): New macro (two definitions).
! 	* window.c (Fdelete_window, set_window_height, set_window_width)
! 	(Fsplit_window, Fset_window_configuration): Set
! 	FRAME_WINDOW_SIZES_CHANGED to 1 in the frame being changed.
! 	* xdisp.c (Vwindow_size_change_functions): New variable.
! 	(prepare_menu_bars): Call those functions.  Add gcproing.
! 	(syms_of_xdisp): Set up Lisp variable.
! 
! 	* alloc.c (syms_of_alloc): Improve memory exhausted error message.
! 	(init_alloc_once): Allocate spare_memory.
! 	(memory_full): Free spare_memory.
! 
! Fri Feb  3 22:15:54 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* xselect.c (x_get_foreign_selection, x_reply_selection_request):
! 	Use an unwind-protect to call x_stop_queuing_selection_requests.
! 	(some_frame_on_display): New function.
! 	(queue_selection_requests_unwind): New function.
! 
! Fri Feb  3 16:00:41 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* callint.c (syms_of_callint): Move DEFVAR_DISPLAY's ...
! 	* keyboard.c (syms_of_keyboard): ... to here.
! 	[MULTI_PERDISPLAY] (current_perdisplay, all_perdisplays): New vars.
! 	(find_active_event_queue): Search all perdisplays.
! 	(init_perdisplay, wipe_perdisplay): New functions.
! 	(init_keyboard): Move perdisplay initialization to init_perdisplay.
! 	(syms_of_keyboard): Likewise.
! 	(cmd_error): Cancel echoing here.
! 	(command_loop_1): Not here.
! 
! 	* lisp.h (all_perdisplays): New var.
! 	(struct PERDISPLAY): New member next_perdisplay.
! 	* alloc.c (mark_perdisplays): New function.
! 	(Fgarbage_collect): Call it.
! 	* lread.c (defvar_display): Don't staticpro; these objects are now
! 	protected through mark_perdisplays.
! 	* xterm.c [MULTI_PERDISPLAY] (x_term_init): Initialize perdisplay.
! 	[MULTI_PERDISPLAY] (x_delete_display): Destroy perdisplay.
! 	(x_delete_display): Use xfree, not free.
! 
! 	* lisp.h (defvar_display): Declare this function.
! 	(DEFVAR_DISPLAY): Use current_perdisplay, not get_perdisplay.
! 	* data.c (do_symval_forwarding): Likewise.
! 	(store_symval_forwarding, find_symbol_value): Likewise.
! 	* print.c (print): Likewise.
! 	* keyboard.c (echo_prompt, echo_char, echo_dash, echo): Likewise.
! 	(cancel_echoing, echo_length, read_char, Fdiscard_input): Likewise.
! 	(stuff_buffered_input): Likewise.
! 
! Fri Feb  3 04:27:31 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* xdisp.c (display_text_line): Deduct minibuf prompt from taboffset.
! 	(try_window): Deduct minibuf prompt from tab_offset, after 1st line.
! 
! Thu Feb  2 05:45:20 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* xselect.c (wait_for_property_change): Avoid unlikely timing error.
! 
! 	* keyboard.c (kbd_buffer_get_event, swallow_events):
! 	Remove selection_request event from input queue before processing it.
! 
! Wed Feb  1 16:37:16 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* macros.c (Fexecute_kbd_macro): Clear prefix arg here.
! 	* keyboard.c (cmd_error): And here.
! 	(command_loop_1): Not here.
! 	(command_loop_1): Save original perdisplay in case we're already
! 	locked to a particular display.
! 	Move display-specific cleanup to end of main loop.
! 	Use perdisplay to access prefix arg.
! 	(Fcommand_execute, Fexecute_extended_command): Use perdisplay.
! 
! Wed Feb  1 14:35:15 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* xterm.c (x_unqueue_events): Arg is now a Display *.
! 	(x_start_queuing_selection_requests): Likewise.
! 	(x_stop_queuing_selection_requests): Likewise.
! 	* xselect.c (x_get_foreign_selection): Pass display to
! 	x_start_queueing_selection_events and x_stop_queueing_selection_events.
! 
! 	* xselect.c (x_reply_selection_request): Call
! 	x_start_queueing_selection_events and x_stop_queueing_selection_events.
! 	Handle X protocol errors.
! 
! Tue Jan 31 17:30:45 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* callint.c (Fcall_interactively): Use perdisplay.
! 	(Vprefix_arg, Vcurrent_prefix_arg): Delete vars; now in perdisplay.
! 	(syms_of_callint): Use DEFVAR_DISPLAY for prefix-arg and
! 	current-prefix-arg.
! 	* minibuf.c (read_minibuf, read_minibuf_unwind): Use perdisplay.
! 	* mocklisp.c (Fml_provide_prefix_argument): Use perdisplay.
! 	(Fml_prefix_argument_loop): Likewise.
! 	* lisp.h (current_perdisplay): New var.
! 	(DEFVAR_DISPLAY): Add missing ampersand.
! 	(Vprefix_arg, Vcurrent_prefix_arg): Delete; now in perdisplay.
! 
! 	* lread.c [!MULTI_PERDISPLAY] (defvar_display): Use staticpro.
! 
! Tue Jan 31 15:09:36 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* emacs.c (main) [REL_ALLOC]: Set __malloc_extra_blocks.
! 
! Mon Jan 30 23:54:38 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* buffer.c (syms_of_buffer): overwrite-mode doc fix.
! 
! Mon Jan 30 19:01:56 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* lisp.h [MULTI_PERDISPLAY]: Declare get_perdisplay as a function.
! 	* xterm.c [MULTI_PERDISPLAY] (get_perdisplay): Define this as an
! 	exported function.
! 	* xterm.h [MULTI_PERDISPLAY] (get_perdisplay): Define this as a
! 	macro, for sources that include this header.
! 	[MULTI_PERDISPLAY] (get_perdisplay_macro): Internal macro version.
! 
! 	* lisp.h (DEFVAR_DISPLAY): New macro.
! 	* lread.c (defvar_display): New function.
! 
! 	* lisp.h: Declare store_symval_forwarding here.
! 	* eval.c (specbind): Not here.
! 	(specbind): Handle display-local vars.
! 	* data.c (do_symval_forwarding): Handle display-local vars.
! 	(store_symval_forwarding, find_symbol_value): Likewise.
! 	(Fmake_variable_buffer_local): Disallow display-local vars here.
! 	(Fmake_local_variable): Likewise.
! 
! 	* keyboard.c (syms_of_keyboard): Fix missing backslashes.
! 
! Sun Jan 29 17:01:33 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* fns.c (Frassoc): New function.
! 	(syms_of_fns): defsubr it.
! 
! Sat Jan 28 03:36:05 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* ecrt0.c: Renamed from crt0.c.
! 	* Makefile.in.in (ecrt0.o): Target renamed from crt0.o.
! 	(START_FILES): Use ecrt0.o.
! 
! Fri Jan 27 13:48:20 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* lisp.h (PERDISPLAY, the_only_perdisplay, get_perdisplay):
! 	Renamed from PERD, etc.  All uses changed.
! 	(ECHOBUFSIZE): New constant, replaces sizeof (echobuf).
! 	(enum Lisp_Misc_Type): New enumeration Lisp_Misc_Display_Local.
! 	(struct Lisp_Display_Objfwd): New structure.
! 	(XDISPLAY_OBJFWD, DISPLAY_OBJFWDP): Access the new structure.
! 	(union Lisp_Misc): Add new member.
! 	* keyboard.c (kbd_buffer_frame_or_window): Delete; now in perdisplay.
! 	(immediate_echo, echobuf, echoptr, echo_after_prompt): Likewise.
! 	(echo_prompt, echo_char, echo_dash): use perdisplay and ECHOBUFSIZE.
! 	(echo, cancel_echoing, echo_length, echo_truncate): Likewise.
! 	(read_char, kbd_buffer_store_event, kbd_buffer_get_event): Likewise.
! 	(Fdiscard_input, stuff_buffered_input): Likewise.
! 	(init_keyboard, syms_of_keyboard): Likewise.
! 	* alloc.c (mark_object): Ignore Lisp_Misc_Display_Objfwd objects.
! 	* print.c (print): Handle internal display-local object.
! 	* .gdbinit (xdispobjfwd): New macro.
! 
! 	* xdisp.c (message_log_need_newline): This var is now static.
! 	(message_dolog): Set message_log_need_newline appropriately.
! 	Don't change it at all if message logging is currently disabled.
! 	(message_log_maybe_newline): New function.
! 	(message2): Use message_log_maybe_newline.
! 	* print.c (printchar, strout): Use message_log_maybe_newline.
! 	Leave all of the newline bookkeeping to message_dolog.
! 	* lisp.h (message_log_maybe_newline): Function declared.
! 
! 	* xdisp.c (message_dolog): Rename " *Messages*" buffer to "*Messages*"
! 
! Fri Jan 27 04:44:35 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* minibuf.c (Fread_string): Add third arg HISTORY.
! 	* callint.c (Fcall_interactively): Pass new arg to Fread_string.
! 
! Fri Jan 27 02:20:24 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* insdel.c (modify_region): Clear point_before_scroll field.
! 
! Wed Jan 25 23:46:56 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* buffer.h (struct buffer): New field point_before_scroll.
! 	* buffer.c (init_buffer_once, syms_of_buffer):
! 	Set up buffer-local var point_before_scroll.
! 	(reset_buffer): Init point_before_scroll.
! 	* intervals.c (set_point): Set point_before_scroll to nil.
! 
! Tue Jan 24 21:01:58 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* lisp.h (PERD): New struct containing per-display data.
! 	(the_only_perd): Declare an instance of it.
! 	(get_perd): Macro to retrieve it.
! 	* keyboard.c (the_only_perd): Define this var here.
! 	(kbd_buffer, kbd_fetch_ptr, kbd_store_ptr): Delete; now part of perd.
! 	(find_active_event_queue): New function.
! 	(readable_events, kbd_buffer_get_event, swallow_events): Use it.
! 	(kbd_buffer_store_event): Store in EVENT's frame's queue.
! 	(Fdiscard_input, stuff_buffered_input): Use perd.
! 	(init_keyboard): Initialize the new vars.
! 	kbd_buffer is now a pointer, not an array.
! 	* xterm.h (struct x_display_info): New member display_perd.
! 
! 	* process.c (process_tick, update_tick): Make non-static.
! 
! Tue Jan 24 02:55:05 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* keyboard.c (read_key_sequence): New arg dont_downcase_last
! 	inhibits downcasing the last event, when it's uppercase and undefined.
! 	(Fread_key_sequence): Likewise new arg.
! 	* callint.c (Fcall_interactively): Define K mostly like k.
! 	Pass new arg to Fread_key_sequence.
! 	* keymap.c (Flocal_set_key, Fglobal_set_key): Use K, not k, to read key seq arg.
! 
! Mon Jan 23 17:16:38 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* indent.c (compute_motion): Don't get hung in selective-display loop.
! 
! 	* syssignal.h: Don't use function prototypes.
! 
! 	* keyboard.c (read_key_sequence): Don't wait for a possible key
! 	translation sequence if we already have a binding.
! 	Add missing break statement.
! 
! 	* sysselect.h: New file, mostly extracted from process.c and xterm.c.
! 	* process.c: #include sysselect.h instead of defining things by hand.
! 	* sysdep.c (sys_select): Renamed from select.  Use SELECT_TYPE
! 	instead of int.  Defer to native select if that function is usable.
! 	* config.h (HAVE_SYS_SELECT_H): Add #undef for configure.
! 	* s/isc3-0.h (BROKEN_SELECT_NON_X): #define this.
! 
! 	* s/isc3-0.h [__GNUC__] (POSIX_SIGNALS): #define this.
! 	[__GNUC__] (sigsetmask, HAVE_SYSV_SIGPAUSE): #undef these.
! 	(LIBX11_SYSTEM): Don't use -lc; loading this before -lcposix gives
! 	us the wrong signal functions.
! 	(C_SWITCH_SYSTEM): Add _XOPEN_SOURCE.
! 	(EXTRA_INITIALIZE): Make conditional on __GNUC__.
! 
! Sun Jan 22 02:14:04 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* minibuf.c (read_minibuf): Don't print the prompt in batch mode.
! 
! 	* emacs.c (sort_args): Ordinary args get priority 0.
! 	So do -f, -l, -insert, etc.  --kill gets negative priority.
! 	Everything else gets positive priority.
! 
! Sat Jan 21 20:44:42 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* xterm.c (x_destroy_window): Don't let frame being destroyed
! 	remain in x_focus_event_frame.
! 
! Sat Jan 21 17:23:02 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
! 
! 	* config.h.in [NO_REMAP]: #undef static.
! 
! Fri Jan 20 15:10:06 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* lisp.h (union Lisp_Misc): Make the `type' field just 16 bits,
! 	to match the substructures.
! 
! Fri Jan 20 00:04:44 1995  Morten Welinder  <terra@diku.dk>
! 
! 	* fileio.c (file_name_as_directory, Ffile_name_directory)
! 	(Ffile_name_nondirectory): Delete special MSDOG code now covered by macros.
! 
! 	* s/msdos.h (DEVICE_SEP, IS_DIRECTORY_SEP, IS_ANY_SEP): Defined.
! 
! 	* msdos.c (XMenuCreate, XMenuAddPane, XMenuAddSelection, XMenuLocate)
! 	(XMenuActivate, XMenuDestroy): Add dummy `display *' argument.
! 
! 	* xmenu.c [MSDOS]: #include msdos.h.
! 	* msdos.h (x_mouse_leave): Add neutralizing define.
! 	(XMenuCreate, XMenuAddPane, XMenuAddSelection, XMenuLocate)
! 	(XMenuActivate, XMenuDestroy): Add prototype.
! 	* Makefile.in.in (xmenu.o): Add msdos.h as dependency.
! 
! 	* buffer.c (syms_of_buffer) [DOS_NT]: Add missing ';'.
! 
! Thu Jan 19 16:02:32 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* textprop.c (Ftext_property_any): Handle the trivial case specially.
! 
! 	* sysdep.c (seed_random): Renamed from srandom.
! 	(get_random): Renamed from random.  Return VALBITS random bits.
! 	* fns.c (Frandom): Call seed_random and get_random.
! 
! 	* print.c (print): Print internal types too, for debugging.
! 	Print appropriate message for invalid pseudovector or misc type.
! 
! 	* .gdbinit (xboolfwd, xbuflocal, xbufobjfwd, xcompiled): New macros.
! 	(xintfwd, xmiscfree, xobjfwd, xoverlay, xwinconfig): New macros.
! 
! Thu Jan 19 15:01:19 1995  Abramo Bagnara  <abramo@sssup2.sssup.it>
! 
! 	* term.c (term_get_fkeys_1): Bug fix for function key above f19.
! 
! Wed Jan 18 18:23:12 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* editfns.c (subst_char_in_region_unwind): New function.
! 	(Fsubst_char_in_region): Use it to make undo_list t temporarily.
! 
! 	* buffer.c (Fbuffer_local_variables): Unconditionally call
! 	find_symbol_value, but conditionally use its value.
! 
! 	* xrdb.c: Don't include sys/param.h.
! 	(MAXPATHLEN): Definition deleted.
! 
! Wed Jan 18 15:56:39 1995  Boris Goldowsky  <boris@cs.rochester.edu>
! 
! 	* cmds.c (internal_self_insert): Don't test current_column
! 	when deciding to call auto_fill_function.
! 
! Wed Jan 18 15:12:38 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* lisp.h (SWITCH_ENUM_CAST): New macro.
! 	* alloc.c, data.c, keyboard.c, syntax.c, xdisp.c: Change all
! 	occurences of SWITCH_ENUM_BUG to use SWITCH_ENUM_CAST instead.
! 
! Wed Jan 18 03:58:07 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* window.c (Qtemp_buffer_show_hook): New hook.
! 	(syms_of_window): Init and staticpro it.
! 	(temp_output_buffer_show): Run the hook.
! 
! Mon Jan 16 19:08:16 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* xdisp.c (message_dolog): Ignore narrowing.
! 	Use low-level functions, to bypass modification and motion hooks.
! 
! 	* window.h (struct window): New member column_number_displayed.
! 	* xdisp.c (redisplay): Use that field instead of a global flag.
! 	(redisplay_window, display_mode_line, decode_mode_spec): Likewise.
! 
! 	* cm.c (cmcheckmagic): New function.
! 	* cm.h: Declare it.
! 	* term.c (write_glyphs, insert_glyphs): Call it.
! 
! Mon Jan 16 01:38:08 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* keyboard.c (kbd_buffer_store_event): Cast arg of bcopy.
! 
! Sun Jan 15 08:05:06 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
! 
! 	* ralloc.c (r_alloc_init): Remove unused variable END.
! 
! Fri Jan 13 21:17:20 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* alloc.c (Fpurecopy): Mask size field when copying pseudovector.
! 
! Thu Jan 12 15:27:50 1994  Boris Goldowsky  <boris@cs.rochester.edu>
! 
! 	* lisp.h: Declare Qrear_nonsticky.
! 
! 	* cmds.c (Vuse_hard_newlines): New variable.
! 	(Fnewline): If use_hard_newlines is on, mark inserted
! 	newline(s) with `hard' property, marked rear-nonsticky.
! 
! Thu Jan 12 10:35:51 1994  Tom Tromey  <tromey@drip.colorado.edu>
! 
! 	* buffer.c (list_buffers_1, Flist_buffers): Functions deleted.
! 
! Thu Jan 12 18:12:22 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* xdisp.c (message_log_need_newline): New var.
! 	(message_dolog): New function, extracted from message2.
! 	* print.c (printchar, strout): Call message_dolog.
! 	* lisp.h: Declare message_dolog.
! 
! 	* alloc.c (DONT_COPY_FLAG): Default this to 1.
! 	Check to make sure it's not the same as MARKBIT.
! 	(mark_object): Use the same XOR expression as elsewhere.
! 	(gc_sweep): Don't touch DONT_COPY_FLAG here; this one is a real
! 	size field, not a mangled pointer.
! 
! 	* fns.c (internal_equal): Delete redundant tests.
! 	Mask size field when comparing pseudovectors.
! 
! 	* fns.c (Frandom): Use VALBITS instead of hardcoded constants.
! 
! Tue Jan 10 20:38:37 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* alloc.c (DONT_COPY_FLAG): Fix typo.
! 
! 	* lisp.h: Use large constants for Lisp_Misc_Type.
! 
! 	* lisp.h: Add some function declarations.
! 	* insdel.c: Declare all non-returning functions `void'.
! 	(insert_1): Make non-static.  New arg PREPARE.  All callers changed.
! 	* xdisp.c (Vmessage_log_max): New var.
! 	(syms_of_xdisp): defvar and initialize it.
! 	(message2_nolog): Renamed from message2.
! 	(message2): Log messages, then call message2_nolog.
! 	(message1_nolog): New function.
! 	* keyboard.c (echo): Don't log the key echoes.
! 	* alloc.c (Fgarbage_collect): Don't log the GC message.
! 
! Tue Jan 10 18:20:12 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* emacs.c (main): Handle SIGABRT, SIGHWE, SIGPRE, SIGORE, SIGDLK,
!         SIGCPULIM, if they are defined.
! 
! 	* alloc.c (DONT_COPY_FLAG): New bit flag.
! 	(mark_object, gc_sweep, compact_strings): Use it.
! 
! Tue Jan 10 15:36:34 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* editfns.c (Finsert_char): Check inherit flag for long strings too.
! 
! 	* editfns.c (Fnarrow_to_region): Swap using temp Lisp_Object, not int.
! 
! Tue Jan 10 01:45:56 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* keyboard.c (syms_of_keyboard): Doc fix.
! 
! 	* unexsunos4.c (unexec): Cast value of sbrk.
! 	(run_time_remap): Cast arg to brk.
! 	(brk_value): Renamed from Brk.
! 	(is_it): Cast 1st arg of mmap.
! 
! Mon Jan  9 20:33:14 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* keyboard.c (read_key_sequence): If first event is mouse click,
! 	use the text property keymap from where the click was.
! 	New local var orig_local_map.
! 
! Mon Jan  9 19:05:02 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* window.c (Fscroll_other_window): On small windows, scroll by 1 line.
! 
! Mon Jan  9 04:59:26 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* fns.c (internal_equal): Once again use a switch.
! 
! 	* lisp.h (struct Lisp_Free, struct Lisp_Marker, etc.):
! 	Make the `type' field just 16 bits, and declare as int.
! 	Add explicit spacer field after it.
! 	(struct Lisp_Marker): New field insertion_type.
! 
! Sun Jan  8 14:21:13 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* keymap.c (store_in_keymap): Copy a cons only if car is a string.
! 
! 	* xterm.c: Don't include param.h.
! 
! 	* buffer.c (syms_of_buffer): Doc fix.
! 
! Fri Jan  6 18:52:20 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* m/alliant-2800.h (VALBITS, GCTYPEBITS): Deleted; default is better.
! 	* m/apollo.h, m/aviion.h, m/delta.h, m/hp800.h, m/ibmrt.h: Likewise.
! 	* m/intel386.h, m/nh4000.h, m/tower32v3.h: Likewise.
! 	* m/att3b.h (VALBITS, XTYPE): Adjust for new bit layout.
! 	* m/alpha.h, m/gec63.h, m/pfa50.h: Likewise.
! 
! Thu Jan  5 17:18:26 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* frame.c [!MULTI_FRAME] (window_frame): New function.
! 	[!MULTI_FRAME] (syms_of_frame): defsubr it.
! 
! Thu Jan  5 02:05:24 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
! 
! 	* doc.c (store_function_docstring, Fdocumentation): Use &
! 	PSEUDOVECTOR_SIZE_MASK on `size' field of compiled byte-code object.
! 	* callint.c (Fcall_interactively): Likewise.
! 	* eval.c (Fcommandp): Likewise.
! 
! Wed Jan  4 13:10:21 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* alloc.c (mark_object, mark_buffer): Don't mark buffer twice.
! 
! 	* .gdbinit (xint, xcar, xcdr): Use correct shift and mask values.
! 
! 	* lisp.h [EXPLICIT_SIGN_EXTEND] (XINT): Use symbolic constants.
! 
! Wed Jan  4 02:19:35 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* doc.c (store_function_docstring): Arg is now EMACS_INT.
! 
! Mon Jan  2 20:19:13 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* lisp.h (enum Lisp_Type): Don't use trailing comma.
! 	(VALBITS, GCTYPEBITS): Define these regardless of NO_UNION_TYPE.
! 	[!NO_UNION_TYPE] (union Lisp_Object): Use symbolic constants.
! 
! 	* alloc.c (mark_object): Make `else' visible outside MULTI_FRAME.
! 
! Mon Jan  2 00:07:44 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* keymap.c (store_in_keymap): While dumping, copy DEF if it's a cons.
! 
! 	* buffer.c (reset_buffer): Don't alter intervals here.
! 	(Fget_buffer_create): Use BUF_MARKERS.  Init BUF_INTERVALS here.
! 	(Fkill_buffer): Use BUF_MARKERS; but don't touch it in indir buf.
! 	Likewise BUF_INTERVALS.  Don't free the text in indirect buffer.
! 	When killing a base buffer, kill its indirect buffers first.
! 	(init_buffer_once): Set up .text and BUF_INTERVALS
! 	in buffer_local_symbols and buffer_defaults.
! 
! 	* alloc.c (mark_buffer, gc_sweep): Use BUF_INTERVALS.
! 	* editfns.c (Ftranspose_regions): Use BUF_INTERVALS.
! 	(transpose_markers): Use BUF_MARKERS.
! 
! 	* insdel.c (insert_1, prepare_to_modify_buffer, insert_from_buffer_1):
! 	Use BUF_INTERVALS.
! 	(adjust_markers): Use BUF_MARKERS.
  
! 	* buffer.h (struct buffer): Fields markers and intervals moved out.
! 	(struct buffer_text): Fields markers and intervals moved here.
! 	(BUF_MARKERS, BUF_INTERVALS): New macros.
! 	* textprop.c (validate_interval_range): Use BUF_INTERVALS.
! 	* intervals.c: Use BUF_INTERVALS throughout.
! 	* marker.c: Use BUF_MARKERS throughout.
  
! 	* undo.c (Fprimitive_undo): Use base buffer's modtime field.
  
! Sun Jan  1 17:04:27 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* .gdbinit: Adapt to new Lisp_Object format.
! 	(xvectype, xmisctype): New commands.
! 	(xtype): Print the misc or vectorlike subtype too.
  
! 	* xdisp.c (redisplay_window): Call set_buffer_temp.
  
! 	* buffer.c (set_buffer_temp): New function.
  
! 	* buffer.h (struct buffer): Make buffer_file_type field unconditional.
! 	* buffer.c (reset_buffer_local_variables): Initialize
! 	buffer_file_type field.
  
! 	* lisp.h (PVEC_BUFFER, PVEC_PROCESS, PVEC_FRAME, PVEC_COMPILED)
! 	(PVEC_WINDOW, PVEC_WINDOW_CONFIGURATION, PVEC_SUBR):
! 	Now enumeration constants, not macros.
! 	(PVEC_FLAG): Enumeration alias for PSEUDOVECTOR_FLAG.
  
! 	* buffer.h (struct buffer): save_modiff field deleted.
! 	(struct buffer_text): save_modiff field moved here.
! 	(SAVE_MODIFF, BUF_SAVE_MODIFF): New macros.
! 	Use them instead of direct access to save_modiff field.
! 	* buffer.c, editfns.c, fileio.c, filelock.c, insdel.c, keyboard.c:
! 	* undo.c, xdisp.c: Use SAVE_MODIFF and BUF_SAVE_MODIFF
! 	instead of direct access to the save_modiff field.
! 	* window.c (temp_output_buffer_show): Use BUF_SAVE_MODIFF.
  
! 	* buffer.h (struct buffer): New field pt_marker.
! 	New fields begv_marker, zv_marker.
! 	* buffer.c (Fget_buffer_create): Initialize pt_marker, begv/zv_marker.
! 	(set_buffer_internal): Use and update this markers.
! 	Copy undo_list in and out of the base buffer.
! 	(Fget_buffer_create): Init save_modiff field here.
! 	(reset_buffer): Not here.
! 	(Fbuffer_modified_p): Use BUF_SAVE_MODIFF.
! 	(Fset_buffer_modified_p): Use SAVE_MODIFF.
! 	(Fkill_buffer, list_buffers_1): Use BUF_SAVE_MODIFF.
  
! 	* term.c (term_init): Fatal error if screen is too small.
  
! Sat Dec 31 00:58:51 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xdisp.c (redisplay_window): For buffer_shared count,
! 	treat an indirect buffer as equivalent to its base.
  
! 	* print.c (print): Don't drop thru to error for markers and overlays.
  
! Fri Dec 30 21:03:19 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* insdel.c (adjust_point): Use BUF_PT.
  
! 	* intervals.c (temp_set_point, set_point): Use BUF_PT.
! 	(get_local_map): Get keymap from specified buffer, not current one.
  
! 	* fileio.c (Finsert_file_contents, Fwrite_region):
! 	Error if buffer is indirect.
! 	(Fdo_auto_save): Do nothing for an indirect buffer.
  
! 	* alloc.c (mark_buffer): In indirect buffer, mark the base buffer.
  
! 	* buffer.c (Fmake_indirect_buffer): New function.
! 	(Fbuffer_base_buffer): New function.
! 	(syms_of_buffer): defsubr them.
! 	(Fget_buffer_create): Initialize the size field.
  
! 	* print.c (print): Make buffer case a branch of
! 	the Lisp_Vectorlike case.
  
! 	* alloc.c (mark_object): Make buffer case a branch of
! 	the Lisp_Vectorlike case.
  
! 	* buffer.h (struct buffer): Make text field be a pointer.
! 	The struct buffer_text field renamed to own_text.
! 	Add fields indirect_to_buffer and size.
! 	Move pt, begv and zv fields here.
! 	(struct buffer_text): Moved from here.
! 	(BEGV, PT, ZV, BEGV_ADDR, PT_ADDR, ZV_ADDR): Corresponding changes.
! 	(BUF_BEGV, BUF_PT, BUF_ZV): Corresponding changes.
! 	(SET_BUF_ZV, SET_BUF_PT, point):
  
! 	* lisp.h (XSETBUFFER, BUFFERP, GC_BUFFERP): Rewrite: use pseudovectors.
! 	(enum Lisp_Type): Delete Lisp_Buffer.
! 	(enum Lisp_Misc_Type): Add Lisp_Misc_Float (not yet used).
  
! Thu Dec 29 14:55:56 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* lisp.h (VALBITS): Default now 28.
! 	(GCTYPEBITS): Default now 3.
! 
! 	* lisp.h (enum Lisp_Type): Lisp_Process, Lisp_Window, Lisp_Frame,
! 	Lisp_Subr deleted.
! 	(PSEUDOVECTORP, GC_PSEUDOVECTORP):  Add paren for proper nesting.
! 	(PROCESSP, GC_PROCESSP, XSETPROCESS): Rewrite to use pseudovectors.
! 	(WINDOWP, GC_WINDOWP, XSETWINDOW): Likewise.
! 	(FRAMEP, GC_FRAMEP): Likewise.
! 	(SUBRP, GC_SUBRP, XSETSUBR): Likewise.
! 	(PVEC_SUBR): New macro.
! 	(struct Lisp_Subr): Add a size field.
! 	(DEFUN (both definitions)): Store that size field.
! 
! 	* frame.h (XSETFRAME): Use pseudovector.
! 
! 	* alloc.c (mark_object): Don't use Lisp_Process, Lisp_Window.
! 	Handle frames, compileds and subrs as branch of Lisp_Vectorlike case.
! 	(Fmake_byte_code): Use XSETCOMPILED.
! 
! 	* data.c (Faref): Handle compiled function as pseudovector.
! 
! 	* fns.c (Flength): Handle compiled function as pseudovector.
! 
! 	* xterm.c (x_scroll_bar_handle_click): Use GC_WINDOWP.
! 	(XTframe_rehighlight, x_window_to_scroll_bar): Use GC_FRAMEP.
! 
! 	* print.c (print): Get size of compiled function as pseudovector.
! 	Use a switch statement again.
! 
! 	* process.h: Make size field an EMACS_INT.
! 
! Wed Dec 28 13:00:24 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* unexsunos4.c [! sparc] (REL_INFO_TYPE): Use `struct relocation_info'.
! 
! Tue Dec 27 12:54:19 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* keyboard.c (make_lispy_event) [USE_X_TOOLKIT]: Turn off
! 	special handling of menu bar mouse events.
! 	(make_lispy_event): Tell pixel_to_glyph_coords not to clip.
! 
! 	* xterm.c (XTupdate_begin): Fix backward test in previous change.
! 	(x_display_box_cursor): Don't redraw old cursor spot in mouse face
! 	if cursor was on a newline.
! 
! 	* s/isc4-1.h: New file.
! 
! Mon Dec 26 10:57:15 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* xterm.c (XTread_socket): Handle button events from outside
! 	the frame, received due to grabbing the mouse with a button.
! 
! Sun Dec 25 12:28:28 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* callint.c (Vmouse_leave_buffer_hook, Qmouse_leave_buffer_hook):
! 	New variables.
! 	(syms_of_callint): Set them up.
! 	(Fcall_interactively): Run the hook, for `@'.
! 
! 	* buffer.c (syms_of_buffer): Doc fix for buffer-file-type.
! 
! 	* search.c (set_search_regs): Really set search_regs.start and .end.
! 	(save_search_regs): Set them to 0 here.
! 
! 	* minibuf.c (read_minibuf): GCPRO things.
! 
! 	* lisp.h (enum Lisp_Type): Add Lisp_Type_Limit.
! 	* data.c (wrong_type_argument): Abort if VALUE is invalid Lisp object.
! 	Use Lisp_Type_Limit.
! 
! Sat Dec 24 11:42:13 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* puresize.h (BASE_PURESIZE): Incremented by 20k.
! 
! Fri Dec 23 23:48:53 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* xfns.c (x_figure_window_size): Treat missing user-position parm
! 	as nil.
! 
! Fri Dec 23 12:13:57 1994  Steven Suhr  <ssuhr@riacs.edu>
! 
! 	* scroll.c (scrolling_1): When scroll_region_ok is set, use a
! 	new scrolling method which scrolls groups of lines directly
! 	to their final vertical positions.
! 	(struct matrix_elt): New field writecount.
! 	(calculate_direct_scrolling): New function.
! 	(do_direct_scrolling): New function.
! 
! 	* term.c (scroll_region_cost): New variable.
! 	(calculate_costs): Put scroll region overhead in scroll_region_cost.
! 
! 	* termchar.h (scroll_region_cost): Declared.
! 
! 	* dispnew.c (scrolling): Fewer restrictions if scroll_region_ok is
! 	set.  New vector old_draw_cost for direct scrolling method.
! 
! Fri Dec 23 22:00:00 1994 Michal Jankowski (Michal.Jankowski@fuw.edu.pl)
! 
! 	* keyboard.c (read_char): Don't echo keys when echo_keystrokes is 0.
! 
! Thu Dec 22 18:07:34 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* xfns.c (x_set_frame_parameters): Handle icon-left, icon-top parms.
! 
! Wed Dec 21 00:10:24 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* buffer.c (Fget_buffer_create): Copy the name, and clear text props.
! 
! Tue Dec 20 18:14:44 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* eval.c (Fdefvar): Fix minor error in previous change.
! 	(funcall_lambda): Fetch bytecode and constants vector from file if nec.
  
! 	* lread.c (Qload_file_name, Vload_file_name): New variables.
! 	(syms_of_lread): Initialize and staticpro it.
! 	(Fload): Bind it.
! 	(read_list): Before dumping, ignore (#$ . WHATEVER)--return 0.
  
! 	* lread.c (read1): Implement #@ and #$ constructs.
  
! 	* frame.c (make_frame): Init buffer_predicate field.
  
! 	* doc.c (get_doc_string): Now static.  Arg now Lisp_Object.
! 	Allow (FILE . POS) as position argument.
! 	(Fdocumentation, Fdocumentation_property): Fix calls to get_doc_string.
! 	(Fdocumentation_property): Handle cons as value via get_doc_string.
! 	(read_doc_string): New function.
  
! 	* buffer.c (assoc_ignore_text_properties): New function.
! 	(Fget_buffer): Use assoc_ignore_text_properties.
  
! Mon Dec 19 18:22:24 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* s/dgux.h (C_DEBUG_SWITCH): Define this only if __GNUC__.
  
! Sun Dec 18 14:38:25 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* buffer.c (Fother_buffer): Take account of frame's buffer predicate.
  
! 	* frame.h (struct frame): New field buffer_predicate.
! 	Move all the Lisp_Object fields to the top.
  
! 	* frame.c (Fmodify_frame_parameters): For non-X frames,
! 	call store_frame_param for each parameter set.
! 	(store_frame_param): Handle buffer_predicate field.
! 	(frame_buffer_predicate): New function.
! 	(Qbuffer_predicate): New variable.
! 	(syms_of_frame): Set it up.
  
! 	* alloc.c (mark_object): In a frame, mark the buffer_predicate.
! 	Don't mark the height and width fields.
  
! Thu Dec 15 08:12:37 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* minibuf.c (Fall_completions): New arg hide_spaces.
! 	(Fminibuffer_completion_help): Pass new arg.
  
! Wed Dec 14 08:59:56 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* emacs.c (main): Fix conversion of --display to -d.
  
! 	* xmenu.c (push_menu_item): New arg DEF.
! 	(single_keymap_panes, list_of_items): Pass new arg.
! 	(MENU_ITEMS_ITEM_DEFINITION): New macro.
! 	(MENU_ITEMS_ITEM_LENGTH): Now 5.
! 	[USE_X_TOOLKIT] (xmenu_show): Store 0 in call_data if item def is 0.
! 	(single_submenu): Likewise.
  
! 	* emacs.c (main): Implement --version.
  
! 	* xterm.c (XTupdate_begin): Discard records of prior mouse highlight
! 	when frame must be redrawn.
  
! 	* textprop.c (add_properties): Add gcpro's.
! 	(Fadd_text_properties, copy_text_properties): Likewise.
  
! Tue Dec 13 16:23:55 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* s/sunos4-1-3.h: Just include sunos4shr--do nothing else.
  
! 	* eval.c (Fdefconst, Fdefvar): Error if too many arguments.
  
! Tue Dec 13 09:30:54 1994  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
  
! 	* emacs.c (sort_args): Make `options' a vector of ints.
  
! Sun Dec 11 17:13:22 1994  Richard Stallman  <rms@kepa>
  
! 	* buffer.c (report_overlay_modification): Renamed from
! 	verify_overlay_modification.
! 	* insdel.c: Calls changed.
  
! 	* insdel.c (signal_before_change, signal_after_change):
! 	Call verify_overlay_modification here.
! 	(prepare_to_modify_buffer): Don't call verify_overlay_modification.
  
! 	* buffer.c (call_overlay_mod_hooks): New args AFTER, ARG1, ARG2, ARG3.
! 	Args START, END deleted.  Pass each function AFTER, ARG1 and ARG2,
! 	and ARG3 if ARG3 is not nil.
! 	(verify_overlay_modification): New args AFTER, ARG1, ARG2, ARG3.
! 	Pass them to call_overlay_mod_hooks.
  
! 	* search.c (compile_pattern): Call re_set_registers here.
! 	And no need to BLOCK_INPUT for that.
! 	(compile_pattern_1): Instead of here.
  
! Sat Dec 10 16:45:12 1994  Richard Stallman  <rms@kepa>
  
! 	* s/aix4-1.h: New file.
  
! 	* unexaix.c (unrelocate_symbols): Add AIX4_1 conditionals and code.
  
! 	* sysdep.c (sys_siglist) [AIX]: Add AIXHFT conditional.
  
! 	* systty.h: Change AIX conditional around HFNKEYS to AIXHFT.
  
! Fri Dec  9 23:14:19 1994  Richard Stallman  <rms@green-hill>
  
! 	* bytecode.c (Fbyte_code): Call Ffollowing_char and Fprevious_char
! 	as functions.  Don't mask char-syntax arg to just 8 bits.
  
! Thu Dec  8 00:18:05 1994  Richard Stallman  <rms@green-hill>
  
! 	* keyboard.c (read_char): After auto-saving, redisplay.
  
! Tue Dec  6 17:11:20 1994  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* xfns.c (Fx_color_values): Doc fix.
  
! 	* buffer.c (list_buffers_1): Right-align the size values.
  
! 	* frame.h (struct frame): New field cost_calculation_baud_rate.
! 	(FRAME_COST_BAUD_RATE): New macro.
! 	* term.c (calculate_costs): Set FRAME_COST_BAUD_RATE.
! 	Don't test dont_calculate_costs.
! 	(dont_calculate_costs): Variable deleted.
! 	(term_init): Don't set dont_calculate_costs.
! 	* dispnew.c (update_frame): Call calculate_costs if baud_rate changed.
  
! Mon Dec  5 23:21:50 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* emacs.c (sort_args): Don't overwrite the terminating null pointer.
  
! Mon Dec  5 20:00:05 1994  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* keyboard.c (read_key_sequence): Downcase undefined shifted fn keys.
  
! Sun Dec  4 17:01:31 1994  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* emacs.c (argmatch): Take argc as arg; don't go past end of argv.
! 	(main): Change calls to argmatch.
  
! 	* intervals.h (INTERVAL_LAST_POS): Don't subtract 1 here.
  
! 	* intervals.c (compare_string_intervals): New function.
! 	* fns.c (internal_equal): Call compare_string_intervals.
! 	(Fstring_equal): Doc fix.
  
! 	* scroll.c (scroll_cost): FRAME_DELETE_COST and FRAME_DELETEN_COSTS
! 	were confused.  Fixed.
  
! 	* xterm.c (x_make_frame_visible, x_make_frame_invisible)
! 	(x_iconify_frame): Give error if frame has explicit_parent.
! 	(x_new_font): Don't set window height if frame has explicit_parent.
  
! 	* xfns.c (Fx_create_frame): Check for parent-id parameter.
! 	Set explicit_parent and parent fields.
! 	Don't set visibility if explicit_parent.
! 	[! USE_X_TOOLKIT] (x_window): Specify parent window.
  
! 	* xterm.h (struct x_display): New field explicit_parent.
  
! 	* s/ultrix4-3.h (SET_LINE_DISCIPLINE): Defined.
  
! 	* sysdep.c (child_setup_tty): Use CDISABLE for setting VERASE, VKILL.
! 	(init_sys_modes) [SET_LINE_DISCIPLINE]: Set specified line discipline.
! 	(reset_sys_modes) [SET_LINE_DISCIPLINE]: Restore old line discipline.
  
! Sat Dec  3 14:49:28 1994  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* lread.c (readevalloop): Ignore ^M here.
  
! 	* emacs.c (argmatch): Handle lstr == 0.
  
! Mon Nov 28 17:13:27 1994  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* regex.c (re_match_2_internal):
! 	Rename label `succeed' to `succed_label'.
  
! 	* xfns.c (Fx_synchronize): Fix doc string syntax.
  
! 	* xmenu.c: Don't include ../oldXMenu/XMenu.h if USE_X_TOOLKIT.
  
! 	* Makefile.in.in: Fix erroneous comment syntax.
  
! 	* s/ultrix4-3.h: New file.
  
! 	* systty.h: Have just one conditional to include unistd.h.
! 	Test NEED_UNISTD_H, not AIX and IRIX4.
! 	(UNISTD_H_INCLUDED): Don't define or test this.
! 	* m/ibm370aix.h (NEED_UNISTD_H): Defined.
! 	* s/aix3-1.h (NEED_UNISTD_H): Defined.
! 	* s/irix4-0.h (NEED_UNISTD_H): Defined.
  
! 	* fileio.c (internal_delete_file, internal_delete_file_1):
! 	New functions.
! 	* buffer.c (Fkill_buffer): Use internal_delete_file.
! 	* callproc.c (delete_temp_file): Use internal_delete_file.
  
! Fri Nov 25 19:15:07 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* search.c (search_regs_saved): Don't initialize; it dumps as pure.
  
! Thu Nov 24 09:47:31 1994  Francesco Potorti`  <pot@cnuce.cnr.it>
  
! 	* m/delta.h (C_SWITCH_MACHINE): -inline-functions removed,
!         because the compiler shipped with R3V7 is not stable.
  
! Thu Nov 24 03:33:11 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* keyboard.c (command_loop_1): Use safe_run_hooks to run
! 	deferred-action-function.
! 	(Qdeferred_action_function): New variable.
! 	(syms_of_keyboard): Initialize and staticpro Qdeferred_action_function.
  
! Wed Nov 23 03:59:27 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
  	* keyboard.c (syms_of_keyboard): Doc fix.
  
! 	* fns.c (Fy_or_n_p): Handle exit-prefix in query-replace-map.
  
! Tue Nov 22 14:22:37 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* search.c (save_search_regs): Add declaration.
  
! 	* minibuf.c (Fminibuffer_complete_and_exit):
! 	Catch errors in do_completion.
! 	(complete_and_exit_1, complete_and_exit_2): New subroutines.
  
! 	* s/aix4.h: New file.
! 	* s/aix3-1.h (AIXHFT): Defined.
! 	* m/ibmrs6000.h (OBJECTS_MACHINE): Define only if AIXHFT.
  
! 	* sysdep.c (init_sys_modes): Tes AIXHFT, not AIX.
! 	(reset_sys_modes): Test AIXHFT.
! 	(hft_init, hft_reset): Test AIXHFT, not AIX.
  
! Mon Nov 21 23:49:31 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* window.c (Fdisplay_buffer): Use `b' to read existing buffer name.
  
! Mon Nov 21 22:25:15 1994  David J. MacKenzie  (djm@mole.gnu.ai.mit.edu)
  
! 	* config.h.in: Add #undefs for --with-pop, --with-kerberos, and
! 	--with-hesiod.
  
! Sat Nov 19 15:02:31 1994  Francesco Potorti`  <pot@cnuce.cnr.it>
  
! 	* lisp.h: (running_asynch_code): New global flag.
! 	* emacs.c (running_asynch_code): New global flag.
! 	(main): Initialise it.
! 	* process.c (read_process_output, exec_sentinel): Set and
! 	reset the running_asynch_code global flag and restore match data.
  
! 	* search.c (Flooking_at, Fstring_match, search_buffer,
! 	Fstore_match_data): Save the match data if a filter or a sentinel
! 	is running.
! 	(search_regs_saved, saved_search_regs): New variables.
! 	(save_search_regs, restore_match_data): New functions.
  
! Sat Nov 19 10:47:43 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* emacs.c (sort_args): New function.
! 	(main): Call sort_args.
! 	Check for -d/-display after -nw, -batch, -help.
! 	Accept --display, with arg attached or separate.
  
! Fri Nov 18 15:25:48 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* filelock.c (init_filelock): Add missing semicolon.
  
! Fri Nov 18 02:02:45 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* indent.c (recompute_width_table): Do the right thing if no previous
! 	table existed.
! 	Fix Lisp_Object vs. integer problem.
! 	(width_run_cache_on_off): Let recompute_width_table create the vector.
  
! Thu Nov 17 21:01:28 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* lisp.h: (enum Lisp_Misc_Type): Rename Lisp_Vector to
! 	Lisp_Vectorlike.  Mark Lisp_Window_Configuration as obsolete.
! 	(PSEUDOVECTOR_FLAG, PSEUDOVECTOR_SIZE_MASK, PVEC_BUFFER,
! 	PVEC_PROCESS, PVEC_FRAME, PVEC_COMPILED, PVEC_WINDOW,
! 	PVEC_WINDOW_CONFIGURATION): New constants.
! 	(XSETPSEUDOVECTOR, PSEUDOVECTORP, VECTORLIKEP): New macros.
! 	(XSETVECTOR, XSETWINDOW_CONFIGURATION, VECTORP,
! 	WINDOW_CONFIGURATIONP): Use the new convention.
! 	(XSETCOMPILED): New macro.
! 	* print.c (print): Use type test macros.
! 	* keymap.c (Fsingle_key_description): Likewise.
! 	* doc.c (Fdocumentation): Likewise.
! 	* alloc.c (Fpurecopy): Likewise.
! 	(mark_object): Use the new pseudovector convention.
! 	* fns.c (Fvconcat, concat): Use Lisp_Vectorlike.
! 	* ntinevt.c (SET_FRAME): Use accessor macros.
! 	(key_event, do_mouse_event): Likewise.
  
! Thu Nov 17 11:10:17 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* filelock.c (init_filelock): Always copy lock_path.
! 	(lock_dir, superlock_file, MAKE_LOCK_NAME):
! 	Renamed from lock_path, superlock_path, MAKE_LOCK_PATH.
  
! Wed Nov 16 19:13:12 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* s/domain.h: New file.
  
! Wed Nov 16 15:32:55 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* s/gnu.h [NOT_C_CODE]: Include fcntl.h.
  
! Wed Nov 16 12:35:01 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xdisp.c (try_window, display_text_line): Undo previous change.
  
! 	* dired.c (Fdirectory_files): Pass new arg to `compile_pattern'.
  
! 	* search.c (struct regexp_cache): New field `posix'.
! 	(compile_pattern_1): New arg `posix'.  Controls the syntax spec
! 	for parsing; also record it in the cache.
! 	(compile_pattern): New arg `posix'.
! 	(looking_at_1, string_match_1, fast_string_match): Pass 0 for new arg.
! 	(search_buffer): New arg `posix'.  Now static.
! 	(search_command): New arg `posix'.  All callers changed.
! 	(Fposix_search_forward, Fposix_search_backward): New functions.
! 	(string_match_1, looking_at_1): New subroutines broken out.
! 	(Fstring_match, Flooking_at): Use them.
! 	(Fposix_string_match, Fposix_looking_at): New functions.
! 	(syms_of_search): defsubr new functions.
  
! Wed Nov 16 11:57:48 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* xdisp.c (try_window): Don't pass window to Fget_char_property;
!         pass its buffer.
! 	(display_text_line): Likewise.
  
! Wed Nov 16 15:26:06 1994  Francesco Potorti`  (pot@cnuce.cnr.it)
! 
! 	* Makefile.in.in (TAGS): The new etags allows tagging DEFVARs.
! 
! Tue Nov 15 19:26:52 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* lread.c (Fload): Call Fsubstitute_in_file_name after trying handler.
! 
! 	* fileio.c (Fread_file_name_internal): Protect orig_string.
! 
! Tue Nov 15 15:00:56 1994  enami tsugutomo  <enami@sys.ptg.sony.co.jp>
! 
! 	* keyboard.c (Fopen_dribble_file): Call fclose only when
! 	dribble is non zero.
! 
! Tue Nov 15 16:32:31 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* keymap.c (access_keymap): Use type test macros.
! 
! 	* alloc.c (Fmake_vector): Call allocate_vectorlike.
! 	(allocate_vectorlike): New function, extracted from Fmake_vector.
! 	* lisp.h: Declare allocate_vectorlike.
! 	(VECSIZE): New macro.
! 	* process.c (make_process): Use allocate_vectorlike and VECSIZE.
! 	* frame.c (make_frame): Likewise.
! 	* window.c (make_dummy_parent, make_window): Likewise.
! 	(Fcurrent_window_configuration): Likewise.
! 	(SAVE_WINDOW_DATA_SIZE): Macro deleted.
! 
! 	* lisp.h: Delete declaration of Farray_length.
! 	* data.c (Farray_length): Delete this obsolete function.
! 	(Faref, Faset): If object is a string, use XSTRING, not XVECTOR.
! 	* fns.c (Flength): Don't call Farray_length, just use size field.
! 
! 	* xterm.h (XSCROLL_BAR): Extract from Lisp_Vector, not generic pointer.
  
! 	* xselect.c (wait_for_property_change): Encode location as a cons
! 	of two integers instead of lying about the type.
! 	(wait_for_property_change_unwind): Decode it likewise.
  
! 	* eval.c (Finteractive_p): Use XSUBR instead of its expansion.
  
! 	* lisp.h (GC_INTEGERP, etc): New type-test macros for use during GC.
! 	* buffer.h (OVERLAY_POSITION): Use the new type-test macros.
! 	* process.c (NETCONN_P, kill_buffer_processes): Likewise.
! 	* buffer.c (overlays_at): Likewise.
! 	* filelock.c (unlock_all_files): Likewise.
! 	* xfns.c (x_window_to_frame): Likewise.
! 	(x_any_window_to_frame, x_top_window_to_frame): Likewise.
! 	* fileio.c (Fdo_auto_save): Likewise.
  
! 	* xfaces.c (Fpixmap_spec_p): Avoid function calls and assignments
! 	as arguments to a type-test macro.
! 	* textprop.c (PLIST_ELT_P): Likewise.
! 	* keymap.c (current_minor_maps): Likewise.
  
! 	* lisp.h (NATNUMP): New macro.
! 	(CHECK_NATNUM): Use that macro instead of its expansion.
! 	* data.c (Fnatnump): Likewise.
! 	* xfns.c (x_set_frame_parameters): Likewise.
! 	* keymap.c (access_keymap, store_in_keymap): Likewise.
! 	* doc.c (Fdocumentation): Likewise.
! 	* alloc.c (Fmake_list): Use CHECK_NATNUM instead of its expansion.
! 	Now signals using `wholenump' instead of `natnump'.
! 	(Fmake_vector, Fmake_string): Likewise.
  
! 	* data.c (syms_of_data): Set Qwholenump as function, not variable.
  
! 	* alloc.c (free_float): Don't assume XFASTINT accesses the raw bits.
! 	(make_float, free_cons, Fcons, Fmake_symbol, gc_sweep): Likewise.
  
! Tue Nov 15 09:00:43 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xterm.c (x_mouse_leave): New function broken out of XTread_socket.
! 	When x_focus_event_frame is nonzero, assume that frame gets focus.
! 	(XTread_socket): Use x_mouse_leave for LeaveNotify.
! 	* xmenu.c (xmenu_show): Call x_mouse_leave.
  
! 	* fileio.c (Fsubstitute_in_file_name): Run a handler.
! 	(Qsubstitute_in_file_name): New variable.
! 	(syms_of_fileio): Set it up.
  
! 	* lread.c (read_escape): For \S-a, return A.
  
! 	* buffer.c (Frename_buffer): Rename arg NAME to NEWNAME.
  
! Mon Nov 14 21:54:45 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* s/freebsd.h (LD_SWITCH_SYSTEM): Add -dc and -dp.
! 	(HAVE_GETPAGESIZE): Defined.
  
! 	* sysdep.c (init_sys_modes): Maybe call tcflow.
  
! Mon Nov 14 20:39:03 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* lisp.h: (enum Lisp_Misc_Type): Add new enumeration Lisp_Misc_Overlay.
! 	(enum Lisp_Type): Delete the corresponding enumeration from here.
! 	(struct Lisp_Overlay): New structure.
! 	(XOVERLAY, OVERLAYP): Access the new structure.
! 	(union Lisp_Misc): Add new member.
! 	* buffer.h (OVERLAY_START, OVERLAY_END): Use the new substructure.
! 	* alloc.c (mark_object, gc_sweep): Likewise.
! 	* print.c (print): Likewise.
! 	* buffer.c (Fmake_overlay): Likewise.
! 	(Foverlay_properties, Foverlay_get, Foverlay_put): Likewise.
! 	* fns.c (internal_equal): Likewise.
! 	Simplify by returning int.
! 	(Fequal): Use new interface to internal_equal.
  
! 	* buffer.c (list_buffers_1): Use PT, not point.
  
! Mon Nov 14 19:30:28 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* fileio.c (Finsert_file_contents): Init not_regular at the beginning.
  
! Mon Nov 14 19:03:39 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* buffer.c (Fkill_all_local_variables): Use XBUFFER_LOCAL_VALUE,
! 	not XCONS.
  
! Mon Nov 14 18:28:51 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* s/gnu.h (A_TEXT_OFFSET): Macro removed.
! 	(A_TEXT_SEEK): Define to just sizeof (struct exec).
  
! Mon Nov 14 17:15:08 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* lread.c (defvar_int): Use accessor macro.
! 	(defvar_bool, defvar_lisp_nopro, defvar_per_buffer): Likewise.
  
! Sun Nov 13 11:53:42 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xfaces.c (load_pixmap): Handle bitmap_id < 0.  F is a FRAME_PTR.
  
! 	* frame.c (syms_of_frame): Fix typo.
  
! 	* minibuf.c (Fdisplay_completion_list): Update COLUMN unconditionally.
! 	If a name is long, put it on its own line.
  
! Sun Nov 13 14:00:52 1994  Brendan Kehoe  (brendan@lisa.cygnus.com)
  
! 	* s/hpux9.h (C_SWITCH_SYSTEM) [__GNUC__]: Set -D_BSD to get the
! 	correct definitions from sys/wait.h.
  
! Sat Nov 12 15:04:53 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* frame.c (syms_of_frame): Doc fix for default-frame-alist.
  
! Fri Nov 11 09:52:11 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* fileio.c (Finsert_file_contents): If VISIT, set the buffer components
! 	such as the filename even before signaling error for non-regular file.
  
! 	* s/iris3-5.h, s/iris3-6.h (MAIL_USE_FLOCK): Defined.
! 	* s/irix3-3.h, s/irix5-0.h (MAIL_USE_FLOCK): Defined.
! 	* s/irix5-2.h: New file.
  
! 	* m/paragon.h: New file.
  
! Fri Nov 11 02:31:19 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* lisp.h: (enum Lisp_Misc_Type): Add new enumerations
! 	Lisp_Misc_Buffer_Local_Value and Lisp_Misc_Some_Buffer_Local_Value.
! 	(enum Lisp_Type): Delete the corresponding enumerations from here.
! 	(struct Lisp_Buffer_Local_Value): New structure.
! 	(XBUFFER_LOCAL_VALUE): Access the new structure.
! 	(BUFFER_LOCAL_VALUEP, BUFFER_SOME_LOCAL_VALUEP): Likewise.
! 	(union Lisp_Misc): Add new member.
! 	* alloc.c (mark_object): New code to handle buffer-local substructure.
! 	(gc_sweep): Generalize marker code to handle other substructures.
! 	* bytecode.c (Fbyte_code): Special case for buffer-local objects is
! 	now handled by the more general test.  Simplify.
! 	* buffer.c (set_buffer_internal): Use XBUFFER_LOCAL_VALUE, not XCONS.
! 	* data.c (store_symval_forwarding): Likewise.
! 	(swap_in_symval_forwarding, Fset, default_value, Fset_default,
! 	Fkill_local_variable): Likewise.
! 	(Fmake_variable_buffer_local): Use the new substructure.
! 	(Fmake_local_variable): Likewise.
  
! Thu Nov 10 02:56:12 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* process.c (create_process) [OSF1]: Use setpgid, not setpgrp.
  
! Wed Nov  9 15:44:17 1994  Boris Goldowsky  <boris@cs.rochester.edu>
  
! 	* cmds.c (Fnewline): Always use insert_and_inherit.
  
! Wed Nov  9 22:41:04 1994  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
  
! 	* lisp.h (FRAMEP): Use the second definition whenever HAVE_MOUSE.
  
! 	* keyboard.c (tracking_off): Test old value with NILP.
! 	Restore the old value whatever it may be.
! 	(syms_of_keyboard): Use DEFVAR_LISP for track-mouse.
  
! Wed Nov  9 00:54:09 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* data.c (Fboundp, find_symbol_value): Use type test macros
! 	instead of checking XTYPE directly.
  
! 	* keyboard.c (print_help): Set help-mode in *Help* buffer.
! 	* keymap.c (describe_buffer_bindings): Likewise.
! 	* syntax.c (describe_syntax_1): Likewise.
  
! Tue Nov  8 22:43:40 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* keyboard.c (EVENT_QUEUES_EMPTY): Only test do_mouse_tracking and
! 	mouse_moved #ifdef HAVE_MOUSE.
! 	(Ftrack_mouse): Protect with #ifdef HAVE_MOUSE.
! 	(syms_of_keyboard): Protect initialization of do_mouse_tracking,
! 	defsubr of Strack_mouse, and DEFVAR of track-mouse with #ifdef
! 	HAVE_MOUSE.
  
! Mon Nov  7 21:43:01 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* frame.c (Fset_frame_height): Compare against height, not width.
  
! Mon Nov  7 21:37:36 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* keyboard.c: Move decl of input_fd outside of #ifdef
!         HAVE_X_WINDOWS.
  
! Thu Nov  3 22:48:14 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* xterm.c (XTread_socket): Generate iconify and deiconify events.
  
! Thu Nov  3 15:45:02 1994  Geoff Voelker  <voelker@cs.washington.edu>
  
! 	* m/intel386.h (VIRT_ADDR_VARIES) [WINDOWSNT]: Defined.
! 	(DATA_END) [WINDOWSNT]: Defined.
! 	(DATA_START) [WINDOWSNT]: Defined.
! 	(HAVE_ALLOCA) [WINDOWSNT]: Defined.
  
! 	* s/windowsnt.h: Include malloc.h.
! 	(MODE_LINE_BINARY_TEXT): Defined.
! 	(HAVE_MOUSE): Defined.
  
! 	* ntheap.c (sbrk): Allow request sizes to be different than the
!         page size.
  
! 	* makefile.nt: Changed references of m\m-windowsnt.h to
! 	m\intel386.h and of s\s-windowsnt.h to s\windowsnt.h.
  
! Tue Nov  1 23:19:30 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* xfns.c (Fx_list_fonts): Don't bother to retrieve font info when
! 	there's no size_ref to compare it against.
  
! 	* editfns.c: (Fdecode_time): Fix Lisp_Object vs. integer problems.
! 	Don't use tm_gmtoff; it's not portable.
  
! 	* lisp.h: Leave DEVICE_SEP undefined by default.
  
! Tue Nov  1 05:31:17 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* buffer.c (init_buffer): Fix error message syntax.
  
! 	* fileio.c (Fsubstitute_in_file_name): Add missing #endif.
  
! 	* lread.c: Don't include ctype.h.
! 	(isfloat_string, read1): Don't use isdigit.
  
! 	* editfns.c (Fdecode_time): Change one XFASTINT to XINT.
  
! 	* s/windowsnt.h (SYSTEM_PURESIZE_EXTRA): Defined.
  
! Mon Oct 31 20:48:15 1994  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
  
! 	* xfns.c (x_window): Make ibw 0 by default.
  
! Mon Oct 31 16:47:47 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* xterm.c (XTclear_end_of_line): Finish the line dance here too,
! 	just as was done in XTwrite_glyphs.
  
! 	* xdisp.c (column_number_displayed): New variable.
! 	(redisplay, redisplay_window): If that var is set, do mode line.
! 	(display_mode_line): Unset the var.
! 	(decode_mode_spec): Set the var if %c was seen.
  
! Sun Oct 30 13:47:05 1994  voelker  <voelker@cs.washington.edu>
  
! 	* makefile.nt: New file.
! 	* nt.c, nt.h: New files.
! 	* ntheap.c, ntheap.h: New files.
! 	* ntinevt.c, ntinevt.h: New files.
! 	* ntproc.c, ntterm.c: New files.
  
! 	* m/windowsnt.h, s/windowsnt.h: New files.
  
! 	* nt.c: New file.
  
! 	* makefile.nt:New file.
  
! 	* lisp.h (DEVICE_SEP, DIRECTORY_SEP, IS_DEVICE_SEP)
! 	(IS_DIRECTORY_SEP, IS_ANY_SEP): New macros, defined if not already def.
  
! 	* s/msdos.h (DOS_NT): Defined.
  
! 	* term.c (term_init) [WINDOWSNT]: Do some Windows-specific
! 	initialization, then skip the rest of the code.
! 	(FRAME_TERMCAP_P) [WINDOWSNT]: Always return 0.
  
! 	* systty.h: Test DOS_NT, not MSDOS.
  
! 	* syssignal.h [WINDOWSNT] (EMACS_KILLPG): Use win32_kill_process.
  
! 	* sysdep.c [WINDOWSNT]: Add includes for NT.
! 	Define _P_WAIT.  Declare _spawnlp, _getpid.
! 	[WINDOWSNT] (select, strerror, vfork): Don't use these definitions.
  
! 	* sysdep.c (init_sys_modes): Test DOS_NT, not MSDOS.
! 	(emacs_get_tty, emacs_set_tty,(child_setup_tty, init_baud_rate): Ditto.
  
! 	* sysdep.c (sys_subshell) [WINDOWSNT]: Use _spawnlp. not vfork.
! 	(wait_for_termination) [WINDOWSNT]: Use wait.
! 	(discard_tty_input) [WINDOWSNT]: Do nothing at all.
  
! 	* process.c: Use macros IS_ANY_SEP, IS_DIRECTORY_SEP,
! 	IS_DEVICE_SEP, DIRECTORY_SEP, and DEVICE_SEP.
! 	[WINDOWSNT]: Add includes.  Don't define sys_siglist.
  
! 	* process.c (sigchld_handler): Work around bug in MS C compiler.
! 	(sigchld_handler) [WINDOWSNT]: Do not call signal.
! 	(signal_process) [WINDOWSNT]: Use win32_kill_process instead of kill.
! 	(read_process_output) [WINDOWSNT]: Use read_child_output instead of
! 	read.
  
! 	* process.c (create_process) [WINDOWSNT]: Use
! 	pipe_with_inherited_out  and pipe_with_inherited_in.
! 	Use the pid returned by child_setup.  Deal with not having vfork,
! 	Call register_child.
! 	(close_process_descs): Do nothing if WINDOWSNT.
  
! 	* process.c (proc_buffer_char): No longer static.
  
! 	* ndir.h (MAXNAMLEN) [WINDOWSNT]: Define as 255.
  
! 	* mem-limits.h [WINDOWSNT]: Don't include vlimit.h.
! 	(get_lim_data): Alternate definition for WINDOWSNT.
  
! 	* lread.c: Change explicit uses of the Unix directory separator
! 	'/' to uses of the macros IS_ANY_SEP, IS_DIRECTORY_SEP,
! 	IS_DEVICE_SEP, DIRECTORY_SEP, and DEVICE_SEP.
  
! 	* lread.c (init_lread) [WINDOWSNT]: Disable warnings about
! 	directories in the load path not existing.
  
! 	* lread.c (load): Test DOS_NT instead of MSDOS.
  
! 	* keyboard.c (read_key_sequence): Use flags instead of gotos to
! 	enable the Microsoft C compiler to compile the routine.
  
! 	* keyboard.c (read_avail_input) [WINDOWSNT]: Just return 0.
  
! 	* fileio.c: Change explicit uses of the Unix directory separator
! 	'/' to uses of the macros IS_ANY_SEP, IS_DIRECTORY_SEP,
! 	IS_DEVICE_SEP, DIRECTORY_SEP, and DEVICE_SEP.
  
! 	* fileio.c [WINDOWSNT]: Don't define HAVE_FSYNC; add includes for NT.
  
! 	* fileio.c (Ffile_name_absolute_p): Test DOS_NT instead of MSDOS.
! 	(Fwrite_region, Fdo_auto_save, Ffile_modes): Likewise.
  
! 	* fileio.c (Qfind_buffer_file_type): Test DOS_NT instead of MSDOS.
! 	(syms_of_files): Likewise.
! 	(Finsert_file_types): Test DOS_NT instead of MSDOS.
! 	Rename local var try to trytry.
  
! 	* fileio.c (Fadd_name_to_file): Wlways fail.
! 	(Frename_file) [WINDOWSNT]: Use MoveFile, not link and unlink,
! 	and check for both ERROR_FILE_EXISTS and ERROR_ALREADY_EXISTS.
! 	(Fmake_directory_internal) [WINDOWSNT]: Invoke mkdir without the mask.
  
! 	* fileio.c (Fexpand_file_name): Test DOS_NT, not MSDOS.
! 	(Fexpand_file_name) [WINDOWSNT]: Accept // or \\ at start.
! 	Call dostonunix_filename for HOME envvar, for ~USER.
! 	Quote directory separators found in environment variables.
! 	(Fsubstitute_in_file_name): Test DOS_NT instead of MSDOS.
! 	(Fsubstitute_in_file_name) [WINDOWSNT]: Accept // or \\ at start.
! 	Work around alloca bug in MS compiler.
! 	(Ffile_name_directory): Test DOS_NT instead of MSDOS sometimes.
! 	But don't insert a drive letter on windows.
  
! 	* emacs.c (Fdump_emacs): Don't reset the data start address by
! 	invoking memory_warnings just before unexec-ing.
  
! 	* editfns.c (init_editfns): Get the username from the environment
! 	variable USERNAME instead of USER.
  
! 	* dired.c: Use macros IS_ANY_SEP, IS_DIRECTORY_SEP, and DIRECTORY_SEP.
! 	(file-attributes) [WINDOWSNT]: Set st_gid and st_uid to Qnil; use
! 	get_inode_and_device_vals to fake up inode number and device number.
  
! 	* callproc.c (getenv_internal) [WINDOWSNT]: Use strnicmp, not bcmp.
  
! 	* callproc.c (child_setup): Use IS_DIRECTORY_SEP.
! 	[WINDOWSNT]: Call prepare_standard_handles.  Use spawnve.
! 	Use reset_standard_handles.
  
! 	* callproc.c (Fcall_process_region): Test DOS_NT, not MSDOS.
! 	(Fcall_process) [WINDOWSNT]: Call pipe_with_inherited_out.
! 	Use the return value of child_setup to get the child's pid;
! 	don't call vfork etc. explicitly.
  
! 	* callproc.c [WINDOWSNT]: Add includes.	 Defone NOMINMAX, _P_NOWAIT.
! 	(Vbinary_process_input, Vbinary_process_output)
! 	(Qbuffer_file_type): Test DOS_NT, not MSDOS.
! 	(syms_of_callproc): Test DOS_NT, not MSDOS.
  
! 	* callproc.c (init_callproc): Test DOS_NT, not MSDOS.
  
! 	* buffer.h (struct buffer): Test DOS_NT, not MSDOS.
  
! 	* buffer.c (init_buffer): Use DIRECTORY_SEP, IS_DIRECTORY_SEP macros,
! 	not character constants.
! 	(init_buffer_once, syms_of_buffer): Test DOS_NT, not MSDOS.
  
! Sun Oct 30 04:21:48 1994  Erik Naggum  <erik@naggum.no>
  
! 	* editfns.c (Fdecode_time): New function.
! 	(syms_of_editfns): defsubr it.
  
! Sun Oct 30 03:20:24 1994  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
  
! 	* keyboard.c (make_lispy_event): Record double and triple for drags.
! 	Put in click_modifier for multi-clicks.
! 	(read_key_sequence): Convert double-drag first to plan drag,
! 	and only later try a click.
  
! 	* unexsunos4.c (unexec): Don't print number of pure bytes used.
  
! Sat Oct 29 19:28:05 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xfns.c (Fx_create_frame):
! 	Don't set xlwmenu_default_font if not USE_X_TOOLKIT.
  
! 	* puresize.h (BASE_PURESIZE): Increment MULTI_FRAME value.
  
! Sat Oct 29 14:23:39 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* keyboard.c (read_avail_input): Fix Lisp_Object vs. int problem.
  
! Sat Oct 29 05:40:20 1994  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
  
! 	* xterm.c (fast_find_position): Special case if POS is end of buffer.
  
! 	* xterm.c (x_delete_display): Call XrmDestroyDatabase.
  
! Fri Oct 28 14:54:18 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* s/osf1.h (LD_SWITCH_SYSTEM): Definitions deleted.
  
! 	* m/alpha.h (LD_SWITCH_MACHINE): New definition.
  
! Fri Oct 28 10:06:02 1994  Rainer Schoepf  <Schoepf@Uni-Mainz.de>
  
! 	* s/osf1.h (INTERRUPTIBLE_IO, INTERRUPTIBLE_OPEN, INTERRUPTIBLE_CLOSE)
! 	(read, write, open, close): New definitions.
  
! Thu Oct 27 13:43:54 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* buffer.c (Fset_buffer_major_mode): New function.  Set the
! 	default major mode here.
! 	(Fget_buffer_create): Not here.
! 	(Fswitch_to_buffer): Call Fset_buffer_major_mode.
! 	(syms_of_buffer): defsubr the new function.
  
! 	* termhooks.h (iconify_event, deiconify_event): New enum event_kind's.
! 	* keyboard.c (kbd_buffer_get_event): Translate them to lispy events.
! 	(head_table): Initialize those new symbols appropriately.
! 	* frame.c (keys_of_frame): Bind those events to 'ignore, since the
! 	window manager has already done the work.
  
! 	* xmenu.c (set_frame_menubar): Don't copy string during GC risk.
  
! Wed Oct 26 04:07:28 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* config.h.in (HAVE_GETPAGESIZE): Add #undef.
! 	* m/sequent-ptx.h (HAVE_GETPAGESIZE): Explicitly #undef.
! 	* s/linux.h, s/msdos.h (HAVE_GETPAGESIZE): Definition deleted.
! 	* m/symmetry.h (HAVE_GETPAGESIZE): Definition deleted.
  
! 	* xterm.c (x_destroy_window): Rewrite to fetch dpyinfo just once.
  
! 	* xfns.c (Fx_create_frame): Set xlwmenu_default_font.
  
! 	* widget.c (set_frame_size): Set app_shell and wmshell the same.
  
! 	* xterm.c [USE_X_TOOLKIT]: Make application context explicitly
! 	and support multiple top-level shells.
! 	(x_initialize): Call XtToolkitInitialize, XtCreateApplicationContext;
! 	don't open display or make a shell.
! 	(x_term_init): Call XtOpenDisplay.
  
! 	* xfns.c [USE_X_TOOLKIT] (x_window): Use XtAppCreateShell.
! 	(Xt_app_shell, Xt_app_con): Variables deleted.
! 	(Fx_close_connection) [USE_X_TOOLKIT]: Call XtCloseDisplay.
  
! 	* xterm.c (x_scroll_bar_create): Use XMapRaised directly.
! 	(x_make_frame_visible, x_iconify_frame): Likewise.
! 	(XMapWindow): Macro definition deleted.
! 	(METABIT): Macro deleted.
! 	(MAXDESC, FD_SETSIZE, FD_SET, FD_CLEAR, FD_ZERO, FD_ISSET): Likewise.
! 	(x_id_name): Variable deleted.
  
! 	* process.c (status_message): Add a cast.
! 	(sigchld_handler): Add a cast.
  
! 	* xfns.c (x_window): Pass new arg f to hack_wm_protocols.
  
! 	* xdisp.c (display_text_line): Truncate the minibuf_prompt if nec.
  
! Wed Oct 26 02:17:20 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* window.c (syms_of_window): Fix missing \n\'s.
  
! Wed Oct 26 00:52:17 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xselect.c (x_own_selection, x_get_foreign_selection): Change calls
! 	to x_catch_errors and friends.
  
! 	* xfns.c (x_set_mouse_color, x_real_positions): Change calls
! 	to x_catch_errors and friends.
  
! 	* xterm.c (x_catch_errors, x_check_errors, x_had_errors_p)
! 	(x_uncatch_errors): Make the argument a display, not a frame.
  
! 	* xterm.c (XTread_socket_fake_io_error): New variable.
! 	(XTread_socket): Obey XTread_socket_fake_io_error.
  
! Tue Oct 25 20:20:20 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* process.c (list_processes_1): Print tty name.
  
! Tue Oct 25 09:39:37 1994  Karl Fogel  (kfogel@phylo.life.uiuc.edu)
  
!         * window.c (Vtemp_buffer_show_function): Doc fix.
  
! Tue Oct 25 03:55:52 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xterm.h: Delete X10 code.
  
! 	* xfns.c (Fx_create_frame): Don't increment refernce_count
! 	until the frame is put on the frame list.
  
! 	* xterm.c (x_initialize): Init x_noop_count, x_focus_frame
! 	and x_highlight_frame here.
! 	(x_term_init): Not here.
  
! 	* xterm.c (x_term_init): Open the connection first thing;
! 	if that fails, don't allocate dpyinfo.
  
! Mon Oct 24 20:43:57 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* xdisp.c (decode_mode_spec): New spec %c, for current column.
  
! Mon Oct 24 02:03:34 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xselect.c (Fx_selection_exists_p): Fix backwards if.
  
! 	* xterm.c (x_delete_display): New function.
! 	(x_connection_closed): New args dpyinfo and error_message.
! 	Delete all frames on the dead display
! 	and all frames using them for minibuffers.
! 	Call x_delete_display.
! 	Maybe signal a Lisp error.
! 	* xfns.c (Fx_close_connection): Call x_delete_display.
  
! 	* xselect.c (Fx_selection_exists_p):
! 	If selected_frame isn't an x frame, return nil.
  
! 	* keyboard.c (record_char): New subroutine.
! 	(read_char): Use record_char.
! 	Split up menu-bar mouse click events here.
! 	Call record_char for both halves; likewise echo_char
! 	and add_command_key.
  
! Sun Oct 23 01:39:05 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xfns.c (x_display_info_for_name, Fx_open_connection):
! 	Signal error if x_term_init fails.
! 	(Fx_open_connection): New arg must_succeed.
  
! 	* xfns.c (x_real_positions): Catch errors and retry if error happens.
! 	No need to block input here.
  
! 	* xterm.c (x_term_init): Don't report error here--just return 0.
  
! 	* xfns.c (Fx_create_frame): Don't store the frame name
! 	till after FRAME_X_DISPLAY_INFO is set up.
! 	(Fx_close_connection): Renamed from Fx_close_current_connection
  
! 	* xfns.c: Many doc fixes and Lisp function arg renamings.
  
! 	* xterm.c (x_scroll_bar_report_motion): Store proper value in
! 	*bar_window (the Emacs window, not the X window number).
  
! Sat Oct 22 00:54:08 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* keyboard.c (kbd_buffer_get_event):
! 	Cope if mouse_position_hook does not store anything.
  
! 	* xterm.c (x_scroll_bar_report_motion): Don't clear *fp.
  
! 	* xterm.h (struct x_display_info):
! 	New fields bitmaps, bitmaps_size, bitmaps_last.
! 	(struct x_bitmap_record): Structure moved here.
! 	* xfns.c (x_bitmaps, x_bitmap_size, x_bitmap_last):
! 	Variables deleted.  Use fields in x_display_info instead.
! 	(x_bitmaps_free): Variable deleted.
! 	(x_destroy_bitmap, x_allocate_bitmap_record): Don't use or set it.
! 	(x_allocate_bitmap_record): New arg f.  Callers changed.
! 	(x_lookup_pixmap): Function deleted.
! 	(x_destroy_all_bitmaps): New function.
! 	(Fx_close_current_connection): Call x_destroy_all_bitmaps.
! 	Free the fonts in the font table.  Free various other data
! 	that dpyinfo points to.  Avoid using Fdelq.
  
! 	* xterm.c (x_wm_set_icon_pixmap): Use x_bitmap_pixmap.
  
! 	* xterm.c:
! 	(show_mouse_face): New arg dpyinfo.  All callers changed.
! 	(clear_mouse_face): New arg dpyinfo.  All callers changed.
  
! 	* xterm.h (struct font_info): New type.
! 	(struct x_display_info): New fields font_table, font_table_size
! 	and n_fonts.
  
! 	* xterm.h (struct x_display_info): New field scratch_cursor_gc.
! 	* xterm.c (scratch_cursor_gc): Variable deleted.
! 	(dumpglyphs): Use scratch_cursor_gc in x_display_info.
  
! 	* xterm.h (mouse_face_*): New fields.
! 	* xterm.c (mouse_face_*): Variables deleted.
! 	Use fields in x_display_info instead.
! 	* xterm.c (syms_of_xterm): Don't staticpro mouse_face_window.
  
! 	* xterm.c (expose_all_windows, expose_all_icons): Variables deleted.
! 	(BLOCK_INPUT_mask): Variable deleted.
  
! 	* xterm.h (struct x_display_info): New field x_id_name.
! 	* xfns.c (x_set_name, Fx_create_frame): Use x_id_name field.
! 	* xterm.c (x_term_init): Set up x_id_name field.
! 	(x_id_name): Variable deleted.
  
! 	* xterm.c (x_font_table, x_font_table_size, x_n_fonts): Vars deleted.
! 	(x_new_font): Use new fields.
! 	(warp_mouse_on_deiconify): Unused variable deleted.
  
! 	* xterm.c (x_term_init): Set up dpyinfo->xrdb.
! 	Set up dpyinfo->vertical_scroll_bar_cursor.
! 	(x_scroll_bar_create): Use vertical_scroll_bar_cursor slot.
! 	(x_vertical_scroll_bar_cursor): Variable deleted.
  
! 	* xterm.c (x_term_init): Really return dpyinfo.
  
! 	* insdel.c (insert_from_buffer_1): Don't use min.
  
! 	* xterm.c (x_term_init): Call add_keyboard_wait_descriptor,
! 	not change_keyboard_wait_descriptor.
  
! 	* xfns.c (Fx_close_current_connection):
! 	Call delete_keyboard_wait_descriptor.
  
! 	* process.c: Handle multiple keyboard input descriptors.
! 	(non_keyboard_wait_mask): New variable.
! 	(Fset_process_filter): Update non_keyboard_wait_mask
! 	(create_process, Fopen_network_stream, deactivate_process):
! 	(init_process, sigchld_handler): Likewise.
! 	(wait_reading_process_input): Maybe use non_keyboard_wait_mask.
! 	(add_keyboard_wait_descriptor):
! 	Renamed from change_keyboard_wait_descriptor.
! 	Clear the old descriptor's bit only the first call.
! 	(delete_keyboard_wait_descriptor): New function.
! 	(keyboard_bit_set): New function.
! 	(wait_reading_process_input): Use keyboard_bit_set.
! 	Start the loop over process descs from 0, and explicitly
! 	ignore non-process input descs.
! 	(init_process): Don't init keyboard_descriptor.
! 	(keyboard_descriptor): Variable deleted.
! 	(add_keyboard_wait_descriptor): Don't set keyboard_descriptor.
! 	(delete_keyboard_wait_descriptor): New function.
  
! 	* xterm.c (x_term_init): Pass new arg to init_sigio.
! 	Don't set old_fcntl_owner.
! 	Don't call change_input_fd.
! 	(XTread_socket): Loop over displays and process input from each.
  
! 	* sysdep.c: Never use input_fd if using X.
! 	(stuff_char): Do nothing if read_socket_hook.
! 	(setpgrp_of_tty): Function deleted.
! 	(init_sigio): Take fd as argument.  Callers changed.
! 	Don't call request_sigio; do the work here.
! 	(request_sigio, unrequest_sigio): Do nothing if read_socket_hook.
! 	(init_sys_modes): Don't call EMACS_GET_TTY unless we are going
! 	to change the settings.
  
! 	* xfns.c (Fx_close_current_connection): Call check_x_display_info.
! 	Delete the display from x_display_list and x_display_name_list.
! 	(Fx_display_list): New function.
! 	(syms_of_xfns): defsubr it.
  
! 	* xterm.c (x_display_name_list): New variable.
! 	(syms_of_xterm): staticpro it.
! 	Don't staticpro slots in the_x_screen.
! 	(x_term_init): Update x_display_name_list along with x_display_list.
! 	Actually malloc the x_display_info.
! 	(the_x_screen): Variable deleted.
  
! 	* xfns.c (Fx_list_fonts): Use `name_list_element' field.
! 	(x_display_info_for_name): Scan x_display_name_list
! 	along with x_display_list.
  
! 	* xterm.h (struct x_display_info): Replace elements `name'
! 	and `face_list_cache' with one cons cell `name_list_element'.
! 	(x_display_name_list): Variable declared.
  
! Sat Oct 22 00:44:29 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* insdel.c (insert_from_buffer, insert_from_buffer_1): New functions.
! 	* editfns.c (Finsert_buffer_substring): Use insert_from_buffer
! 	instead of insert.
  
! Fri Oct 21 23:17:22 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xmenu.c (xmenu_show): Get the screen number for DisplayHeight
! 	and DisplayWidth.  Use root_window slot in the x_display_info.
  
! 	* xfns.c (x_sync): Take frame ptr as arg.
! 	* frame.c (other_visible_frames): Pass a frame ptr to x_sync.
! 	* xterm.c (x_make_frame_visible, x_make_frame_invisible):
! 	Pass a frame ptr to x_sync.
  
! Fri Oct 21 22:52:16 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* insdel.c (insert_before_markers): Don't inherit;
! 	insert_before_markers_and_inherit does that.
  
! Fri Oct 21 03:06:38 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* dispnew.c (Fframe_or_buffer_changed_p):
! 	Detect deletion of a buffer at the end of the buffer list.
  
! 	* xterm.c (x_term_init): Init all the components of dpyinfo.
  
! 	* sysdep.c (input_fd): No longer static.
! 	* keyboard.c (read_avail_input): Use input_fd.
  
! Thu Oct 20 20:45:32 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xfns.c (check_x_display_info): New function.
! 	(Fx_create_frame): Use it.
! 	(Fx_display_*, Fx_server_*): Use fields in the x_display_info,
! 	not static variables.  Call check_x_display_info.
  
! Thu Oct 20 15:06:33 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* window.c (Fdisplay_buffer): Make old_selected_window a Lisp_Object.
  
! Thu Oct 20 11:49:26 1994  Tom Tromey  <tromey@drip.colorado.edu>
  
! 	* buffer.c (list_buffers_1): Always mark current_buffer read-only.
  
! Thu Oct 20 10:56:01 1994  Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
  
! 	* m/dpx2.h (LD_SWITCH_MACHINE): Defined.
  
! Thu Oct 20 00:36:46 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* term.c (calculate_costs): Call x_screen_planes.
! 	* xfns.c (x_screen_planes): New function.
  
! 	* xterm.h (EMACS_CLASS): Macro moved here.
! 	* xfns.c (EMACS_CLASS): Macro moved to xterm.h.
  
! 	* xfns.c (Qdisplay): New variable.
! 	(syms_of_xfns): Set it up.
! 	(Fx_create_frame): Handle display parameter
! 	which says where to get the FRAME_X_DISPLAY_INFO.
! 	(x_display_info_for_name): New function.
  
! 	* xterm.c (x_display_info_for_display): New function.
  
! 	* xselect.c (Xatom_*): Variables deleted.
! 	Use slots in x_display_info structure instead.
! 	(symbol_to_x_atom, x_atom_to_symbol):
! 	New arg dpyinfo.  All callers changed.
! 	(xatoms_of_xselect): Function deleted.
  
! 	* xfns.c (select_visual): New arg dpy.
  
! 	* xterm.h (struct x_display_info): New fields *_mod_mask.
! 	* xterm.c (x_*_mod_mask): Variables deleted.
! 	(x_x_to_emacs_modifiers, x_emacs_to_x_modifiers):
! 	New arg dpyinfo; all callers changed.
! 	Store the masks in that structure.
  
! 	* xterm.h (struct x_display_info): New field icon_bitmap_id.
! 	* xterm.c (icon_bitmap): Variable deleted.
! 	(x_bitmap_icon): Use icon_bitmap_id in x_display_info.
  
! 	* xterm.c (icon_font_info): Variable deleted.
  
! 	* xterm.h (struct x_display_info): New field `connection'.
! 	* xterm.c (x_term_init): Set up `connection' field.
  
! 	* xterm.h (x_display_list): New variable.
! 	* xterm.c (x_find_modifier_meanings):
! 	Arg is now struct x_display_info *.
! 	(x_term_init): Return an x_display_info *.
! 	Store all the data in it, including X atoms and xrdb.
! 	Put the x_display_info structure on x_display_list.
! 	Pass name as Lisp_Object.
! 	(the_x_screen): Variable moved here.
! 	(syms_of_xterm): Staticpro parts of the_x_screen.
! 	* xfns.c (Fx_open_connection): Get dpyinfo from x_term_init.
! 	Don't set up atoms, xrdb here.	Pass name as Lisp_Object.
! 	(the_x_screen): Variable moved to xterm.c.
! 	(syms_of_xfns): Don't staticpro it here.
  
! 	* xterm.h (struct x_display_info): New field xrdb.
! 	* xfns.c (xrdb): Variable deleted.
! 	(Fx_get_resource): Use selected_frame's xrdb.
! 	(x_get_resource_string): Likewise.
  
! 	* xterm.h (XExposeRegionEvent): Unused macro deleted.
! 	(XGetWindowInfo, XGetFont, XLoseFont): Unused macros deleted.
! 	(MINWIDTH, MINHEIGHT, MAXWIDTH, MAXHEIGHT): Unused macros deleted.
! 	(MAX_FACES_AND_GLYPHS, Bitmap): Unused macros deleted.
! 	(struct event_queue): Structure deleted (was unused).
! 	(EVENT_BUFFER_SIZE): Macro deleted.
  
! 	* xterm.h (XClear): Macro deleted.  Callers use XClearWindow.
! 	(XWarpMousePointer): Macro deleted.  Callers use XWarpPointer.
! 	(XStuffPending): Macro deleted.  Callers use XPending.
! 	(XHandleError, XHandleIOError): Macros deleted.
! 	Callers use XSet...ErrorHandler.
! 	(XChangeWindowSize): Macro deleted.  Callers use XResizeWindow.
! 	(Color): Macro deleted; replaced with XColor.
! 	(FONT_TYPE): Macro deleted; replaced with XFontStruct.
! 	(PIX_TYPE): Macro deleted; replaced with unsigned long.
  
! 	* xterm.h (FRAME_X_SCREEN): New macro.
! 	(WHITE_PIX_DEFAULT, BLACK_PIX_DEFAULT): Take arg f.
! 	* xfaces.c (unload_color): Pass arg f to WHITE_PIX_DEFAULT
! 	and BLACK_PIX_DEFAULT.
  
! 	* xterm.c (windowinfo): Variable deleted.
  
! 	* xterm.h (ROOT_WINDOW): Macro deleted.
! 	(struct x_display_info): New field root_window.
! 	All uses changed.
  
! 	* xterm.h (XDISPLAY): Macro deleted.
! 	(XFlushQueue): Macro deleted.  All callers changed.
! 	(DISPLAY_SCREEN_ARG): Maco deleted.
! 	(DISPLAY_CELLS): Macro deleted.
! 	(WINDOWINFO_TYPE): Macro deleted.
  
! 	* xterm.h (struct x_display_info): New fields Xatom...
! 	* xterm.c (Xatom_*): Variables deleted.
! 	(x_iconify_frame, XTread_socket): Get atoms from the x_display_info,
  
! 	* xfns.c (Fx_open_connection): Store the atoms in x_display_info.
! 	(hack_wm_protocols): New arg f.  Get atoms from x_display_info.
! 	(x_window): Get atoms from x_display_info.
  
! 	* xfns.c (Vmouse_depressed, mouse_buffer_offset): Variables deleted.
! 	(syms_of_xfns): Delete Lisp variables too.
! 	(Fx_synchronize): Take frame as arg.
! 	(Fx_close_current_connection): Take frame as arg.   Error is not fatal.
! 	* xterm.c (XTread_socket): Don't update Vmouse_depressed.
  
! 	* xterm.h (struct x_display_info): New field grabbed.
! 	* xterm.c (x_mouse_grabbed): Variable deleted.
! 	(note_mouse_highlight): Use grabbed field instead.
! 	(XTmouse_position, XTread_socket): Likewise.
! 	* xmenu.c (xdialog_show, xmenu_show):
! 	Use grabbed field instead of x_mouse_grabbed.
  
! 	* xfns.c (mouse_timestamp): Variable deleted.
  
! 	* xterm.h (struct x_display_info): Struct renamed from x_screen.
! 	(x_display): x_screen field renamed to display_info.
! 	(FRAME_X_DISPLAY): Use new name.
! 	(FRAME_X_DISPLAY_INFO): Likewise; also renamed from FRAME_X_SCREEN.
  
! 	* xterm.h (struct x_display_info):
! 	New fields height, width, screen, visual, n_planes.
! 	* xfns.c (screen_visual, x_screen_planes): Variables deleted.
! 	(x_screen, x_screen_height, x_screen_width): Variables deleted.
! 	(Fx_open_connection): Don't set them here.
! 	Put that info in the x_display_info structure.
! 	(x_window): Get the visual from x_display_info structure.
! 	(x_decode_color): Use n_planes from x_display_info structure.
! 	* xterm.c (x_calc_absolute_position, x_wm_set_size_hint):
! 	Get screen height, width from the x_display_info structure.
! 	* xmenu.c (xmenu_show): Use the screen in FRAME_X_DISPLAY_INFO,
! 	not the default screen.
  
! 	* xterm.c: Use FRAME_X_DISPLAY instead of x_current_display
! 	and XDISPLAY.
  
! 	* xfns.c: Use FRAME_X_DISPLAY instead of x_current_display
! 	and XDISPLAY.
! 	(x_in_use): New variable,
! 	(check_x, using_x_p): Test x_in_use.
! 	(Fx_open_connection): Set x_in_use.
! 	(check_x_frame): New function.
! 	(defined_color): New arg f specifies frame.  Callers changed.
! 	(x_decode_color): New arg f.  All callers changed.
! 	(Fx_color_values, Fx_color_defined_p): New arg FRAME.
! 	Use check_x_frame.
! 	(Fx_list_fonts): Use check_x_frame.
  
! 	* keyboard.c (do_mouse_tracking): Now a FRAME_PTR.
! 	(EVENT_QUEUES_EMPTY, Ftrack_mouse, tracking_off): Changed accordingly.
! 	(kbd_buffer_get_event): Let do_mouse_tracking specify the display
! 	for mouse tracking.
  
! 	* minibuf.c (read_minibuf): Undo previous change.
  
! Wed Oct 19 04:53:18 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* window.c (Fdisplay_buffer): If the other window is smaller
! 	than its peer, even out their heights.
  
! 	* xterm.c (x_catch_errors, x_check_errors, d_errors_p)
! 	(x_uncatch_errors): Take frame as arg.
! 	(x_stop_queuing_selection_requests, x_unqueue_events, x_queue_event)
! 	(x_start_queuing_selection_requests): Take frame as arg.
! 	(x_find_modifier_meanings): New arg `display'.  All callers changed.
! 	(x_scroll_bar_create, x_scroll_bar_set_handle)
! 	(x_scroll_bar_move): New local var f.
! 	(x_scroll_bar_report_motion): Rename arg f to fp.
! 	New local var f.
! 	(XTmouse_position): Lossage.
! 	(frame_highlight, frame_unhighlight): Arg frame renamed to f.
  
! 	* callproc.c (child_setup): Always use _exit.
  
! 	* xselect.c (x_own_selection, x_get_foreign_selection): Pass frame
! 	to x_catch_errors, x_check_errors, x_uncatch_errors.
  
! 	* xfns.c (x_set_mouse_color): Pass frame to x_catch_errors,
! 	x_check_errors, x_uncatch_errors.
  
! 	* xselect.c (x_get_foreign_selection): Get display from
! 	selected_frame.  Pass frame to x_stop_queuing_selection_requests and
! 	x_start_queuing_selection_requests.
! 	(x_own_selection, Fx_disown_selection_internal, Fx_selection_exists_p)
! 	(Fx_store_cut_buffer_internal, Fx_get_cut_buffer_internal)
! 	(Fx_rotate_cut_buffers_internal): Get display from selected_frame.
  
! 	* xmenu.c: Use FRAME_X_DISPLAY, not XDISPLAY or x_current_display.
! 	(menu_item_equiv_key): Reject equiv sequences
! 	that start with mouse clicks.
  
! Wed Oct 19 00:26:03 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* search.c: (searchbufs): New variable, replaces searchbuf and
! 	last_regexp and search_fastmap.
! 	(syms_of_search): Initialize it.
! 	(searchbuf_head): New variable.
! 	(compile_pattern_1): Renamed from compile_pattern and made static.
! 	Copy the regexp string in case the caller modifies it in place later.
! 	(compile_pattern): New code, uses a cached entry if one is available.
! 	The pattern buffer is now a return value instead of an arg.
! 	(set_search_regs): Set num_regs directly, since there's no active
! 	pattern buffer to pass to re_set_registers.
! 	(Fstore_match_data): Likewise.
! 	(Flooking_at): Use the new calling convention for compile_pattern.
! 	(Fstring_match, fast_string_match, search_buffer): Likewise.
! 	* dired.c (Fdirectory_files): Likewise.
  
! Tue Oct 18 16:34:10 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* keyboard.c (Voverriding_local_map_menu_flag): New variable.
! 	(syms_of_keyboard): Set up Lisp var.
! 	(menu_bar_items): Obey Voverriding_local_map_menu_flag.
  
! 	* ralloc.c (struct heap): New fields first_bloc, last_bloc.
! 	(struct bp): New field heap.
! 	(get_bloc, free_bloc, obtain, r_alloc_sbrk): Update new fields.
! 	(reorder_bloc): New function.
! 	(update_heap_bloc_correspondence):
! 	Renamed from update_heap_free_pointers.  Update new fields.
! 	(relinquish): Add error check for new fields.
! 
! 	* Makefile.in.in (SOME_MACHINE_OBJECTS): Add msdos.o and x*.o files.
! 
! Mon Oct 17 21:28:13 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* minibuf.c (read_minibuf): Store the object, not the string, into
! 	the history variable.
! 
! 	* xfns.c (x_set_unsplittable): New function.
! 	(x_frame_parms): Add that function to the table.
! 
! 	* xterm.c (do_line_dance): Decrement index only once per loop.
! 
! 	* scroll.c (do_line_insertion_deletion_costs): Fix argument order.
! 
! Mon Oct 17 04:43:21 1994  Morten Welinder  <terra@mole.gnu.ai.mit.edu>
! 
! 	* fileio.c (Fexpand_file_name) [MSDOS]: Correct the for absolute
! 	default directory.
! 
! 	* config.h.in [HAVE_X_WINDOWS]: #define HAVE_FACES and HAVE_MOUSE.
! 
! 	* dispextern.h: Guard entire file from being include more than once.
! 	[MSDOS]: Include msdos.h.
! 
! 	* dispnew.c (direct_output_for_insert): Check HAVE_FACES, not
! 	HAVE_X_WINDOWS.
! 	(selected_frame, last_minibuffer_frame): Doc fix.
! 
! 	* dosfns.c (Fset_mouse_position, Fmsdos_mouse_p) [!HAVE_X_WINDOWS]:
! 	New functions.
! 	(syms_of_dosfns) [!HAVE_X_WINDOWS]: Defsubr them.  Also define
! 	Qmsdos_color_translate.
! 	(init_dosfns) [SYSTEM_MALLOC]: Don't call non-existing get_lim_data.
! 
! 	* dosfns.h (Qmsdos_color_translate) [!HAVE_X_WINDOWS]: New variable.
! 
! 	* editfns.c (init_editfns) [MSDOS]: Let the user name default to
! 	"root".
! 
! 	* emacs.c (main) [MSDOS && !HAVE_X_WINDOWS]: Call syms_of_xfaces
! 	and syms_of_xmenu.
! 
! 	* frame.c [MSDOS]: Include msdos.h.
! 	(Fframep #1) [MSDOS]: Doc change for the following.
! 	(Fframep #2) [MSDOS]: Return 'pc for when termcap is not used.
! 	(Fmouse_position #2) [HAVE_MOUSE]: Return useful information.
! 	(Fframe_parameters #2): Show "font" as "default".
! 	(Fframe_parameters #2) [MSDOS]: Show fore- and background colours.
! 	(Fmodify_frame_parameters #2) [MSDOS]: Call IT_set_frame_parameters.
! 	(Fframe_list #2): New stub function.
! 	(syms_of_frame #2): defsubr frame_list.
! 	(syms_of_frame #2) [MSDOS]: Initialize the_only_frame.
! 	(Fselected_frame #2): Doc fix.
! 
! 	* frame.h [!MULTI_FRAME]: We give up having selected_frame be
! 	an always-zero integer variable.  From now on it will be a
! 	pointer to a `struct frame' just like in the MULTI_FRAME case.
! 	(selected_frame, last_nonminibuf_frame): use FRAME_PTR,	not EMACS_INT.
! 	(XFRAME): Redefine to use the_only_frame.
! 	(XSETFRAME): Define to set Lisp value.
! 	(WINDOW_FRAME): Redefine to return Lisp value.
! 	(FOR_EACH_FRAME): Set the frame variable to Lisp value.
! 	(output_method): New method: output_msdos_raw.
! 	(FRAME_TERMCAP_P, FRAME_X_P) [MSDOS]: Define non-stub versions.
! 
! 	* keyboard.c (read_char_x_menu_prompt): Include menu code also in
! 	case MSDOS.
! 	(gobble_input): Complete Sep 15 change.
! 
! 	* lisp.h: #define glyph-stuff when HAVE_FACES, not only when
! 	HAVE_X_WINDOWS.
! 	(FRAMEP): Define different versions for MULTI_FRAME and MSDOS.
! 	Otherwise, don't define at all.
! 
! 	* makefile.in.in (MSDOS_SUPPORT): Add faces.elc.
! 	(msdos.o, dosfns.o): Add dependencies.
! 	(MSDOS_OBJ): New set of object files.
! 	(obj): Include MSDOS_OBJ.
! 
! 	* msdos.c: #include dispextern.h, termopt.h, and window.h needed
! 	for the following.
! 	(highlight): New variable.
! 	(rien_du_tout, IT_ring_bell, IT_set_face, IT_write_glyphs,
! 	IT_clear_end_of_line, IT_cursor_to, IT_reassert_line_highlight,
! 	IT_change_line_highlight, IT_update_begin, IT_set_menu_bar_lines,
! 	IT_set_frame_parameters): New functions like their XT_* counterparts.
! 	(internal_terminal_init): Initialize Vwindow_system,
! 	Vwindow_system_version, the_only_x_display, and terminal hooks.
! 	(mouse_get_xy): New function.
! 	(mouse_get_pos, mouse_check_moved): Use mouse_get_xy.
! 	(IT_menu_create, IT_menu_make_room, IT_menu_search_pane,
! 	IT_menu_calc_size, IT_menu_display, XMenuCreate, XMenuAddPane,
! 	XMenuAddSelection, XMenuLocate, XMenuActivate, XMenuDestroy,
! 	x_pixel_width, x_pixel_height): New functions.
! 	(init_environment) [HAVE_X_WINDOWS]: Let DISPLAY default to "unix:0.0".
! 	(init_environment): Handle the case of a relative argv[0].
! 	(dos_rawgetc): Use XSETFRAME.
! 	(the_only_x_display, x_current_display) [!HAVE_X_WINDOWS]: New
! 	variables.
! 
! 	* msdos.h: (XFontStruct, GC, Pixmap, Display, Window) [MSDOS_NO_X]:
! 	Dummy types.
! 	(struct face, FACE_HAS_GC, FACE_GC, FACE_FOREGROUND, FACE_BACKGROUND,
! 	FACE_FONT, FACE_STIPPLE, FACE_UNDERLINE_P) [MSDOS_NO_X]: Define like
! 	corresponding X-versions.
! 	(struct x_display) [MSDOS_NO_X]: Define cut-down version.
! 	(FRAME_PARAM_FACES, FRAME_N_PARAM_FACES, FRAME_DEFAULT_PARAM_FACE,
! 	FRAME_MODE_LINE_PARAM_FACE, FRAME_COMPUTED_FACES,
! 	FRAME_N_COMPUTED_FACES, FRAME_SIZE_COMPUTED_FACES, FRAME_DEFAULT_FACE,
! 	FRAME_MODE_LINE_FACE, x_current_display, XFreeGC, same_size_fonts,
! 	unload_font, unload_color, XGetGeometry, DisplayWidth,
! 	DisplayHeight, XMenuSetAEQ, XMenuSetFreeze, XMenuRecompute,
! 	FONT_WIDTH, check_x, ButtonReleased) [MSDOS_NO_X]: Define suitable
! 	stubs.
! 	(XM_FAILURE, XM_SUCCESS, XM_NO_SELECT, XM_IA_SELECT) [MSDOS_NO_X]:
! 	Define like old-x-menu versions.
! 	Guard the entire file from being included more than once.
! 	(internal_flush): Correct guarding conditional.
! 	Don't include <time.h>.
! 
! 	* puresize.h (SYSTEM_PURESIZE_EXTRA): Default to 0.
! 	(BASE_PRESIZE): Increase by SYSTEM_PURESIZE_EXTRA.
! 
! 	* s/msdos.h: #define HAVE_FACES.
! 	(LIBX11_SYSTEM, HAVE_X11R5) [HAVE_X_WINDOWS]: Define.
! 	(PURESIZE): Don't define.
! 	(SYSTEM_PURESIZE_EXTRA): Define.
! 
! 	* sysdep.c (init_sys_modes): Make sure that internal_terminal_init
! 	is only called once.
! 	(init_sys_modes, reset_sys_modes) [HAVE_X_WINDOWS]: Add conditional.
! 	(reset_sys_modes) [MSDOS]: Change to MSDOG's default colours.
! 	(kbd_input_ast): Use just XSETFRAME.
! 
! 	* window.c (init_window_once) [!MULTI_FRAME]: Set selected_frame and
! 	last_nonminibuf_frame once and for all.
! 
! 	* xdisp.c (redisplay, copy_part_of_rope, fix_glyph,
! 	display_text_line, display_mode_line): Check HAVE_FACES, not
! 	HAVE_X_WINDOWS.
! 
! 	* xfaces.c: Guard the file by HAVE_FACES, not HAVE_X_WINDOWS.
! 	[MSDOS]: Include dosfns.h needed for the following.
! 	[!HAVE_X_WINDOWS]: Don't #include xterm.h or Xos.h.
! 	[!HAVE_X_WINDOWS] (intern_face, clear_face_cache, load_font,
! 	load_color, unload_color, Fpixmap_spec_p, load_pixmap,
! 	same_size_fonts, frame_update_line_height): Don't define.
! 	[!HAVE_X_WINDOWS] (intern_face, clear_face_cache, build_face): Define
! 	stubs.
! 	(load_color) [MSDOS && !HAVE_X_WINDOWS]: Special version.
! 	(Fset_face_attribute_internal) [MSDOS && !HAVE_X_WINDOWS]: Stubify
! 	font setting, mask away 0x08 (the blink bit) from background colour.
! 	(syms_of_xfaces) [!HAVE_X_WINDOWS]: Don't defsubr Spixmap_spec_p.
! 	(Fmake_face_internal): Use FOR_EACH_FRAME.
! 	(init_frame_faces): Guard multi-frame stuff with MULTI_FRAME.
! 
! 	* xmenu.c [!HAVE_X_WINDOWS]: Don't #include xterm.h.
! 	[!HAVE_X_MENU]: Don't #include XMenu.h.
! 	(xmenu_show, xdialog_show) [!HAVE_X_WINDOWS]: We don't need the
! 	button hack for msdos.
! 	(xmenu_show) [!HAVE_X_WINDOWS]: Don't adjust coordinates with
! 	respect to the (non-existing) outer window manager.
! 
! 	* xterm.c (x_term_init) [!subprocesses]: Don't set input descriptor.
! 
! 
! Mon Oct 17 02:44:30 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* xfaces.c (intern_face): Update mask properly to set stipple
! 	and fill_style.  Set everything all at once in XCreateGC.
! 
! 	* window.c (Fdisplay_buffer): In desperation case of looking for
! 	something to split, verify that a window's frame is splittable.
! 
! Sun Oct 16 21:16:38 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* Makefile.in.in (xfns.o): Depend on paths.h.
! 
! 	* xfns.c: Include paths.h.
! 
! Sun Oct 16 07:06:52 1994  Morten Welinder  <terra@mole.gnu.ai.mit.edu>
! 
! 	* editfns.c (Fuser_login_name): Optional argument uid decides
! 	which user's login name to return.
! 
! Sun Oct 16 01:57:47 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* xterm.c (dumpglyphs): Explicitly draw background stipple.
! 
! 	* xfaces.c (intern_face): Set the fill_style.
! 
! 	* paths.h.in (PATH_BITMAPS): New macro.
! 
! 	* xterm.c (x_bitmap_icon): Arg FILE is now a Lisp_Object.
! 	(x_iconify_frame, x_make_frame_visible): Supply FILE arg to it.
! 	* xfns.c (x_set_icon_type): Pass x_bitmap_icon 2nd arg as Lisp_Object.
! 	(x_icon_type): Return a Lisp_Object.
  
! 	* xfns.c (x_destroy_bitmap, x_reference_bitmap): Take frame as arg.
! 	Callers changed.
! 	(struct x_bitmap_record): New fields height, width, depth.
! 	(x_create_bitmap_from_data): Fill in those fields.
! 	(x_bitmap_height, x_bitmap_width, x_bitmap_pixmap): New functions.
! 	(x_create_bitmap_from_file): Arg FILE is now a Lisp_Object.
! 	Search Vbitmap_file_path for it.  Fill in new fields.
! 	(syms_of_xfns): Set up Vbitmap_file_path.
! 
! 	* xterm.c (x_bitmap_icon): Properly discard the previous bitmap.
! 	(x_text_icon): Discard bitmap only if we have one.
! 
! 	* xfaces.c (copy_face, merge_faces): Copy the pixmap_h and pixmap_w.
! 	(intern_face): Store the stipple in the GC.
! 	(unload_color): Really do free the color.
! 	(free_frame_faces): Call unload_pixmap.
! 	(Fset_face_attribute_internal): Handle background pixmap.
! 	Destroy old pixmap when necessary.
! 	(free_frame_faces): Destroy pixmaps.
! 	(load_pixmap): New function.
! 	(Fpixmap_spec_p): New function.
! 	(syms_of_xfaces): Set up Lisp function pixmap-spec-p.
! 	Set up Qpixmap_spec_p.
! 
! 	* dispextern.h (struct face): Delete cached_index field.
! 	* xfaces.c (compute_base_face): Don't set cached_index field.
! 
! 	* ralloc.c (heap_base): Move static var to top level.
! 	(struct heap): New slot `free'.
! 	(obtain): Set `free' for new heap.
! 	(get_bloc): Update `free'.
! 	(find_heap): New function.
! 	(update_heap_free_pointers): New function.
! 	(resize_bloc, r_alloc_sbrk): Call update_heap_free_pointers.
! 
! Sat Oct 15 19:46:29 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* lread.c (load_unwind): Cast argument of fclose.
! 
! 	* xmenu.c: Delete HAVE_X11 conditionals.
! 
! 	* xfaces.c (compute_base_face): Use FRAME_FOREGROUND_PIXEL,
!         FRAME_BACKGROUND_PIXEL, FRAME_FONT.
! 
! 	* xterm.h (FRAME_FOREGROUND_PIXEL, FRAME_BACKGROUND_PIXEL)
! 	(FRAME_FONT): New macros.
! 
! Sat Oct 15 20:44:50 1994  Tom Tromey  <tromey@drip.colorado.edu>
! 
! 	* xterm.c (x_bitmap_icon): Allow bitmap to come from file.
! 	(x_wm_set_icon_pixmap): Second arg is now pixmap_id;
! 	call x_lookup_pixmap.
! 	(x_text_icon): Call x_destroy_bitmap.
! 
! 	* xfns.c (x_set_icon_type): If icon-type is a string, then use
! 	bitmap from that file.
! 	(Fx_create_frame): Set icon_bitmap field to -1.
! 	(struct x_bitmap_record): New structure type.
! 	(x_bitmaps, x_bitmaps_size, x_bitmaps_last, x_bitmaps_free):
! 	New variables.
! 	(x_allocate_bitmap_record): New function.
! 	(x_reference_bitmap, x_create_bitmap, x_create_bitmap_from_file)
! 	(x_destroy_bitmap, x_lookup_pixmap): New functions.
! 
! 	* xterm.h (x_display): Changed icon_bitmap_flag to icon_bitmap.
! 	Changed all users.
! 
! Sat Oct 15 15:55:25 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* textprop.c (Fset_text_properties): Special case for getting
! 	rid of all properties of a string.
! 
! Sat Oct 15 00:00:27 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* xterm.c (stuffline, scraplines): Functions deleted.
! 	(line_dance, line_dance_len, line_dance_in_progress): New vars.
! 	(XTins_del_lines): Don't do any X calls; just update the array.
! 	(do_line_dance): New function.  Do the X calls here.
! 	(XTupdate_end, XTwrite_glyphs): Call do_line_dance.
! 
! Fri Oct 14 00:44:48 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* s/isc4-0.h (LIBS_SYSTEM): Add -lcposix.
! 	(sigblock, SIG_BLOCK): Define if not defined.
! 
! 	* sysdep.c (read_input_waiting): Set e.frame_or_window w/ XSETFRAME.
! 
! 	* xterm.c (x_new_font): Don't keep looping after the FONT property.
! 
! Thu Oct 13 22:41:07 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* term.c (term_get_fkeys_1): Workaround for IBM's dialect of terminfo.
! 
! Thu Oct 13 02:21:03 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* xfns.c (Fx_create_frame): Init the FRAME_X_SCREEN
! 	as soon as can be done.
! 
! 	* xdisp.c (redisplay): Call clear_face_cache instead
! 	of clear_face_vector.  Do it at most once per 1000 redisplays.
! 
! 	* xfaces.c: Eliminate the "display faces"; store GCs in the
! 	"computed faces".
! 	(face_vector, nfaces, nfaces_allocated): Vars deleted.
! 	(free_frame_faces): Free GCs in the computed faces.
! 	Free the computed faces themselves.
! 	(clear_face_cache): Renamed from clear_face_vector
! 	and completely rewritten to free GCs in the computed faces.
! 	(get_cached_face): Function deleted.
! 	(build_face): Function deleted; code moved into intern_face.
! 	(intern_face): Don't treat default and modeline faces specially.
! 	(recompute_basic_faces): Call intern_face, not build_face.
! 
! 	* xfaces.c (intern_face, clear_face_vector, load_font, unload_font)
! 	(load_color, free_frame_faces, recompute_basic_faces):
! 	Use FRAME_X_DISPLAY.
! 
! 	* m/mips-siemens.h (C_ALLOCA): Defined.
! 	(HAVE_ALLOCA): Definition deleted.
! 
! 	* editfns.c (Fuser_login_name, Fuser_real_login_name):
! 	Call init_editfns now if it was not done before.
! 
! 	* puresize.h (BASE_PURESIZE): Incremented.
! 
! 	* lisp.h (Funhandled_file_name_directory): Declared.
! 
! Mon Oct 10 11:58:00 1994  Rainer Schoepf  (Schoepf@Uni-Mainz.de)
! 
! 	* unexalpha.c (Brk): Declare as unsigned long.
! 	(unexec): Do CHECH_SCNHDR on _RCONST if that's defined.
! 	Ignore rdata_section if there is none.
! 	(update_dynamic_symbols): New arg new_name.  Call changed.
! 	Fix some calls to WRITE.
! 	(fatal_unexec): Declare all arguments.
! 
! Wed Oct 12 19:27:27 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* unexelf.c: Include config.h.
! 
! 	* s/freebsd.h (LD_SWITCH_SYSTEM): New definition.
! 
! Tue Oct 11 20:41:25 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* lisp.h (enum Lisp_Misc_Type): Add new enumerations
! 	Lisp_Misc_Intfwd, Lisp_Misc_Boolfwd, Lisp_Misc_Objfwd,
! 	Lisp_Misc_Buffer_Objfwd.
! 	(enum Lisp_Type): Delete the corresponding enumerations from here.
! 	(struct Lisp_Buffer_Objfwd): New structure.
! 	(struct Lisp_Intfwd, struct Lisp_Boolfwd, struct Lisp_Objfwd): Ditto.
! 	(XINTFWD, XBOOLFWD, XOBJFWD, XBUFFER_OBJFWD): Access the new structure.
! 	(INTFWDP, BOOLFWDP, OBJFWDP, BUFFER_OBJFWDP): Ditto.
! 	(XSETINTFWD, XSETBOOLFWD, XSETOBJFWD, XSETBUFFER_OBJFWD): Deleted.
! 	(union Lisp_Misc): Add new members.
! 	(allocate_misc): Declare this function.
! 	(XINTPTR): Deleted.
! 	* alloc.c (mark_object): Use the new substructure.
! 	* buffer.c (buffer_slot_type_mismatch): Take just the offset as
! 	argument.  Only check against types that are actually used.
! 	* bytecode.c (Fbyte_code): Skip optimization for all Lisp_Misc types.
! 	* data.c (do_symval_forwarding, store_symval_forwarding,
! 	find_symbol_value, Fset, default_value, Fset_default,
! 	Fkill_local_variable): Use the new substructure.
! 	(store_symval_forwarding): Change args to buffer_slot_type_mismatch.
! 	* lread.c (defvar_int, defvar_bool, defvar_lisp,
! 	defvar_lisp_nopro, defvar_per_buffer): Use the new substructure.
! 
! 	* minibuf.c (test_completion): Fix reversed condition.
! 
! 	* ralloc.c: Install Hiroshi Nakano's rewrite to allow multiple
! 	heaps, for implementations where the C library makes calls to
! 	sbrk directly.
! 
! Tue Oct 11 15:38:19 1994  Jim Blandy  <jimb@geech.gnu.ai.mit.edu>
! 
! 	* search.c (scan_buffer): After temporarily turning immediate_quit
! 	off, turn it back on by setting it to allow_quit, never 1.
! 
! 	* search.c (find_before_next_newline): Declare the arguments'
! 	types explicitly; don't let them default to int.
! 
! 	* xdisp.c (display_scan_buffer): Pass the correct number of
! 	arguments to scan_buffer.
! 
! Tue Oct 11 03:05:17 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* keyboard.c (read_key_sequence): The output of function-key-map
! 	goes to key-translation-map, but not vice versa.
! 	Don't exit if either of them is a possibility.
! 
! Tue Oct 11 02:10:44 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
! 
! 	* lisp.h (Lisp_Misc): new type code, replacing Lisp_Marker (and
! 	soon to replace other type codes as well).
! 	(XMARKER, SETMARKER, MARKERP): Check/set the new type field.
! 	(XMISC, SETMISC, MISCP): New accessor macros for the superset type.
! 	(struct Lisp_Free): New structure.
! 	(Lisp_Misc_Free): Type code for that structure.
! 	* buffer.h (OVERLAY_POSITION): Marker assert now tests substructure.
! 	* alloc.c: (MARKER_BLOCK_SIZE, marker_block, marker_free_list):
! 	Now refers to the superset type, not just markers.
! 	(allocate_misc): New function, extracted from Fmake_marker.
! 	(Fpurecopy): Check the substructure.
! 	(clear_marks, mark_object, gc_sweep): Likewise.
! 	* buffer.c (buffer_slot_type_mismatch): Test against Lisp_Misc.
! 	* fns.c (internal_equal): Check the substructure.
! 	* print.c (print): Check the substructure.
! 
! Mon Oct 10 21:44:18 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
! 
! 	* sysdep.c (sys_subshell): Use NILP macro directly, not its
! 	expansion.  Previous code was leftover from when NULL was a bad
! 	word.
! 
! Mon Oct 10 17:29:59 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* fileio.c (Finsert_file_contents): Use original unexpanded
! 	FILENAME arg to set buffer-file-name.
! 
! 	* buffer.c (list_buffers_1): Fix indentation in header lines.
! 
! 	* xdisp.c (redisplay_window): Fix Oct 1 change:
! 	don't call cancel_my_columns unless we will call try_window.
! 
! Mon Oct 10 12:02:15 1994  Jim Blandy  <jimb@geech.gnu.ai.mit.edu>
! 
! 	* buffer.c (syms_of_buffer): Doc fix for cache-long-line-scans.
! 
! Mon Oct 10 01:07:44 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
! 
! 	* syntax.c (scan_sexps_forward): At startincomment,
! 	do notice a 2-char comment ender that straddles FROM.
! 
! Sun Oct  9 17:47:37 1994  Jim Blandy  <jimb@geech.gnu.ai.mit.edu>
! 
!         Cache the results of some scans, to improve performance in buffers
!         containing very long lines.
!         * region-cache.c, region-cache.h: New files.
!         * Makefile.in.in (obj) Add region-cache.o to the list of files.
!         (region-cache.o): New target.
!         (buffer.o, indent.o, search.o): Depend on region-cache.h.
!         * buffer.h (struct buffer): New members: newline_cache,
!         width_run_cache, width_table, and cache_long_line_scans.
!         * buffer.c: #include region-cache.h.
!         (Fget_buffer_create): Initialize new members of struct buffer.
!         (Fkill_buffer): Free memory occupied by caches.
!         (init_buffer_once): Set default value for cache_long_line_scans in
!         buffer_defaults, and give it a bit in buffer_local_flags.
!         (syms_of_buffer): Add DEFVAR_PER_BUFFER for cache_long_line_scans.
!         * insdel.c (prepare_to_modify_buffer): Invalidate width run and
!         newline caches, if they exist.
!         * search.c: #include "region-cache.h".
!         (max, min): Make these functions, not macros; we'd like to pass
!         them arguments that would be bad to evaluate more than once.
!         (newline_cache_on_off): New function.
!         (scan_buffer): New argument END.  Call newline_cache_on_off.  If
!         this buffer's newline cache is enabled, consult it to see if we
!         need to scan a region for newlines, and store information in the
!         cache after doing so.
!         (find_next_newline): Pass new arg to scan_buffer.
!         (find_before_next_newline): New function.
!         * cmds.c (Fforward_line): Call scan_buffer with new args.
!         (Fend_of_line): Replace call to Fforward_line and search loop with
!         call to find_before_next_newline.
!         * syntax.c (find_defun_start): Call scan_buffer with new args.
!         * indent.c: #include "region-cache.h".
!         (character_width, disptab_matches_widthtab, recompute_width_table,
!         width_run_cache_on_off): New functions.
!         (compute_motion): Call width_run_cache_on_off.  If this buffer's
!         width run cache is enabled, consult it to see if we need to
!         traverse a region character-by-character; store information in the
!         cache after doing so.  Call find_before_next_newline instead of
!         writing out an equivalent loop explicitly, to take advantage of
!         the newline cache.
!         Doc fixes.
!         * xdisp.c (redisplay_window): Invalidate width_run_cache, if the
!         buffer's display table doesn't match the width table the cache was
!         built for.
!         (display_text_line): Use compute_motion to skip forward to the
!         left edge of the window when the window is hscrolled; this is
!         faster than rendering all the characters into the bit bucket when
!         the hscroll is large.
!         Doc fixes.
!         (display_count_lines): Call scan_buffer with new args.
!         * disptab.h (window_display_table): Doc fix.
!         (buffer_display_table): New declaration.
!         * indent.h (disptab_matches_widthtab, recompute_width_table): New
!         declarations.
  
! Sat Oct  8 00:28:16 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* keyboard.c (inhibit_local_menu_bar_menus): New variable.
! 	(read_char_x_menu_prompt): Optionally don't use local maps.
! 	(syms_of_keyboard): Set up Lisp variable.
  
! Fri Oct  7 17:42:10 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* lisp.h (enum Lisp_Misc_Type): New type.
! 	(struct Lisp_Marker): Add a member of that type.  Delete unused
! 	member `modified'.
  
! Fri Oct  7 09:51:47 1994  Morten Welinder  <terra@frigg.diku.dk>
  
! 	* minibuf.c (test_completion): New function, extracted from
! 	do_completion.
! 	(do_completion): Use test_completion.
! 	(Fminibuffer_complete_and_exit): If completion is already
! 	exact, don't try to complete it.
  
! 	* dired.c (file_name_completion): Ignore files "." and ".."
! 	in first pass.
! 	(Ffile_name_completion): Perform the completion even if the
! 	name part is empty.
  
! Fri Oct  7 04:35:31 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* insdel.c (make_gap): Keep input blocked till after we set BEG_ADDR.
  
! 	* fileio.c (check_writable, check_executable): Test HAVE_EACCESS.
  
! 	* config.h.in (HAVE_EACCESS): Add #undef.
  
! Thu Oct  6 17:21:29 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* alloc.c (mark_object): Don't check for Lisp_Void; nothing ever
! 	creates that type.
! 	* bytecode.c (Fbyte_code): Likewise.
! 	* data.c (Fboundp, Ffboundp, find_symbol_value, Fset,
! 	Fdefault_boundp, Fdefault_value): Likewise.
! 	* lisp.h (Lisp_Void, VOIDP): Deleted.
  
! 	* floatfns.c (Fabs): Don't use XFASTINT when negative.
! 	* data.c (Flsh, Fadd1, Fsub1, Flognot): Likewise.
  
! 	* buffer.c (init_buffer_once): Don't use XSETFASTINT when negative.
! 	(reset_buffer_local_variables, Fbuffer_local_variables): Access
! 	buffer_local_flags as Lisp_Object, not int.
! 	* data.c (Fset, default_value, Fset_default,
! 	Fkill_local_variable): Likewise.
! 	* lread.c (defvar_per_buffer): Likewise.
! 	Give XSETBUFFER_OBJFWD an integer offset, not a pointer.
  
! 	* lread.c (read1): New argument for returning out-of-band data,
! 	obviating the need for Lisp_Internal datatype.
! 	(read0, read1, read_list): Use that new calling sequence.
! 	* lisp.h (Lisp_Internal, XSETINTERNAL, INTERNALP): Deleted.
  
! 	* lread.c (Fload, load_unwind): Store stream pointer as a cons of
! 	two integers, obviating the need for Lisp_Internal_Stream datatype.
! 	* lisp.h (Lisp_Internal_Stream, XSETINTERNAL_STREAM,
! 	INTERNAL_STREAMP): Deleted.
! 	* alloc.c (mark_object): Delete case Lisp_Internal_Stream.
  
! Wed Oct  5 01:49:26 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* unexec.c (make_hdr): Undo June 16 change.
  
! 	* fileio.c (Ffile_regular_p): New function.
! 	(syms_of_fileio): defsubr it.
  
! 	* xterm.c (x_term_init): Call XtSetLanguageProc or XSetLocaleModifiers.
  
! Tue Oct  4 18:55:23 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xfns.c (x_set_icon_type): Remove period from error message.
  
! 	* xterm.c (x_make_frame_visible, x_iconify_frame):
! 	Call x_bitmap_icon if frame wants a bitmap icon.
  
! 	* xfns.c (x_icon_type): New function.
  
! 	* callint.c (Finteractive): Doc fix.
  
! Tue Oct  4 06:06:48 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* buffer.c (validate_region): Swap using temp Lisp_Object, not int.
  
! 	* lisp.h (XSETINT): Set object type as well as value.
! 	(XSETCONS, XSETBUFFER, XSETVECTOR, XSETSUBR, XSETSTRING,
! 	XSETSYMBOL, XSETMARKER, XSETOBJFWD, XSETWINDOW, XSETPROCESS,
! 	XSETFLOAT): Likewise.
! 	(XSETBOOLFWD, XSETBUFFER_OBJFWD, XSETWINDOW_CONFIGURATION,
! 	XSETINTERNAL_STREAM, XSETINTFWD, XSETINTERNAL): New macros.
! 	(XSETUINT, XSETPNTR, XFUNCTION, XSETFUNCTION, XSETINTPTR): Deleted.
  
! 	* frame.h (XSETFRAME): Set object type as well as value.
! 	* m/alpha.h, m/gec63.h, m/hp800.h, m/iris4d.h, m/iris5d.h, m/mips.h:
! 	Don't override the (new) definition of XSETINT from lisp.h.
! 	Delete XSETUINT and XSETPNTR, which are no longer used.
! 	* *.c: Use new accessor macros instead of calling XSET directly.
! 	* xterm.h (SCROLL_BAR_UNPACK): Likewise.
! 	* fns.c (Fstring_equal): No longer necessary to set type separately.
! 	(Fstring_lessp): Likewise.
! 	* callint.c (Fprefix_numeric_value): Likewise.
! 	* fileio.c (Finsert_file_contents): Likewise.
  
! 	* lisp.h (XSETFASTINT): New macro.
! 	(XFASTINT): Changed to non-lvalue syntax, to ensure that callers
! 	will use XSETFASTINT instead.
! 	(CHECK_NUMBER_COERCE_MARKER): Don't use XFASTINT as an lvalue.
! 	(CHECK_NUMBER_OR_FLOAT_COERCE_MARKER): Likewise.
! 	* *.c: Likewise.
! 	* frame.h (FOR_EACH_FRAME): Likewise.
  
! Tue Oct  4 00:47:57 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* Makefile.in.in (MKTIME_OBJ): New variable.
! 	(obj): Use MKTIME_OBJ.
  
! 	* config.h.in (HAVE_MKTIME): Add #undef.
  
! 	* xmenu.c (widget_id_tick): Move definition into conditional.
! 	(syms_of_xmenu): Conditionalize initialization of widget_id_tick.
  
! 	* xmenu.c (last_menu_bar_item_end): Var deleted.
! 	(this_menu_bar_item_beg, this_menu_bar_item_end): Vars deleted.
! 	(other_menu_bar_item_p, unread_menu_bar_button)
! 	(check_mouse_other_menu_bar): Functions deleted.
! 	(last_event_timestamp, Vdouble_click_time, Vmouse_depressed):
! 	Decls deleted.
! 	(xmenu_show): XMENU_FOO conditional and its contents deleted.
  
! 	* xterm.c (input_signal_count): New variable.
! 	(XTread_socket): Increment it.
! 	(x_make_frame_visible): Exit final loop when XTread_sockets has run.
  
! Sun Oct  2 17:28:26 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* window.c (Frecenter): Don't trigger point-motion hooks.
  
! 	* fileio.c (Finsert_file_contents): set type of `end', not just
! 	the value.
  
! 	* xfns.c (x_figure_window_size): Use new formula for scroll bar width.
  
! 	* config.h.in (HAVE_UTIME_H): Add #undef.
! 	* systime.h: Don't include <utime.h> here.
! 	* sysdep.c: Include it here instead.
! 	(set_file_times): Move struct declaration to top of file.
  
! Sun Oct  2 17:24:08 1994  Paul Reilly  <pmr@churchy.gnu.ai.mit.edu>
  
! 	* xmenu.c (popup_get_selection): Remove BLOCK_INPUT, UNBLOCK_INPUT
! 	since the calls to popup_get_selection provide the protection.
  
! Sun Oct  2 08:27:06 1994  Paul Reilly  <pmr@geech.gnu.ai.mit.edu>
  
! 	* xfns.c: (HACK_EDITRES): Declare if using X11R5.
! 	(widget_id_tick): New variable.
! 	(x_any_window_to_frame): Use lw_window_is_in_menubar for
! 	widget set independence.
! 	(x_window): Renamed screen_widget to frame_widget.  Use
! 	lw_create_widget and lw_set_main_areas for widget set
! 	independence.  Enable using editres for X11R5.
  
! 	* widget.c (EmacsFrameSetCharSize): Use lw_refigure_widget for
!         widget set independence.
  
! 	* widget.h: Declare resources showGrip, allowResize, and
!         resizeToPreferred.
  
! 	* keyboard.c (make_lispy_event): Do not set item.  Now handled in
!         xmenu.c by popup_get_selection.
  
! Sat Oct  1 00:42:02 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* frame.c (keys_of_frame): Make binding for delete-frame.
  
! 	* xdisp.c (redisplay_window): If we set PT, and that alters a region
! 	being highlighted, call try_window again.
  
! 	* Makefile.in.in (LIBXTR6): If NEED_LIBW, add -lw.
! 	* s/usg5-4-2.h (NEED_LIBW): Defined.
  
! 	* Makefile.in.in (LDFLAGS): New variable.
! 	(LIBX): Use LDFLAGS.
  
! Fri Sep 30 16:31:45 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* data.c (Fmake_local_variable): Doc fix.
  
! Thu Sep 29 18:59:13 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* fileio.c (check_writable, check_executable) [__HURD__]:
! 	Use eaccess.
  
! 	* xfaces.c (compute_char_face): Handle list as overlay face property.
  
! Thu Sep 29 15:21:56 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* minibuf.c (scmp): Use unsigned chars, to avoid confusing DOWNCASE.
  
! 	* unexaix.c (CHECK_SCNHDR, write_segment): Fix format/arg mismatch.
! 	* xfns.c (x_report_frame_params): Likewise.
  
! Thu Sep 29 09:57:38 1994  Boris Goldowsky  <boris@cs.rochester.edu>
  
! 	* xfaces.c (compute_char_face): If face text-property is a list,
! 	merge the attributes of the faces in the list.
  
! Thu Sep 29 00:39:15 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* buffer.c (Foverlay_get): Handle `category' property on overlay.
  
! 	* xfaces.c (Fset_face_attribute_internal): Mark frame garbaged whenever
! 	any face's font or color is changed.
  
! 	* keyboard.c (head_table): Set up Qdelete_frame.
! 	(kbd_buffer_get_event): Handle delete_window_event by making
! 	a delete-frame event.
  
! Wed Sep 28 18:54:46 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* data.c (Flocal_variable_p): New function.
! 	(syms_of_data): defsubr it.
  
! Wed Sep 28 16:41:39 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* fileio.c (Fdelete_file): Undo Sep 16 change.
! 	* dired.c (syms_of_dired): Likewise.
  
! Tue Sep 27 00:01:45 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* frame.h (scroll_bar_pixel_width, scroll_bar_cols): Update comment.
! 	* xfns.c (x_set_scroll_bar_width): Nil now means 2 columns' worth.
! 	(Fx_create_frame): Default scroll bar width is now nil.
! 	* xterm.c (x_new_font): New rule for computing column width.
! 	Factored out common code.
! 	(XTset_vertical_scroll_bar): Use new width formula.
! 	[!USE_X_TOOLKIT] (x_set_window_size): Likewise.
! 	* widget.c (set_frame_size, EmacsFrameSetCharSize): Likewise.
  
! 	* lisp.h (BOOLFWDP, INTERNALP, INTFWDP, OBJFWDP, INTERNAL_STREAMP,
! 	BUFFER_LOCAL_VALUEP, SOME_BUFFER_LOCAL_VALUEP, BUFFER_OBJFWDP,
! 	VOIDP): New type test macros.
! 	* *.h, *.c: Use type test macros instead of checking XTYPE directly.
  
! Mon Sep 26 21:36:54 1994  Richard Stallman  <rms@churchy.gnu.ai.mit.edu>
  
! 	* window.c (syms_of_window): Doc fix.
  
! Mon Sep 26 18:56:01 1994  Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
  
! 	* m/dpx2.h (POSIX_SIGNALS): Define it.
! 	(sigsetmask): Add #undef.
  
! Mon Sep 26 14:12:21 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* m/*.h, s/*.h (WORDS_BIG_ENDIAN): Renamed from BIG_ENDIAN,
! 	and restored where mistakenly deleted by earlier change.
  
! 	* emacs.c (argmatch): New function.
! 	(main): Recognize --longopt synonyms for all options handled here.
! 	Add --help and --version.
  
! Sun Sep 25 14:00:18 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* unexsunos4.c: Delete __FreeBSD__ conditional macro definitions.
! 	(unexec): Major changes in UNDO_RELOCATION code.
  
! 	* unexsunos4.c (is_it): Rename argument and local variable.
  
! Sun Sep 25 02:40:01 1994  Richard Stallman  <rms@churchy.gnu.ai.mit.edu>
  
! 	* Makefile.in.in (${etc}DOC): Run make-docfile twice--two batches.
  
! Sat Sep 24 19:34:26 1994  Richard Stallman  <rms@churchy.gnu.ai.mit.edu>
  
! 	* sysdep.c (set_file_times): Don't test HAVE_UTIME.
! 	Assume utime exists if utimes does not.
  
! 	* config.h.in (HAVE_UTIMES): Add #undef.
  
! 	* editfns.c (Fformat_time_string): Mostly rewritten, to handle
! 	unlimited size, and report errors properly.
  
! 	* Makefile.in.in (strftime.o, mktime.o): New target.
! 	(obj): Add strftime.o and mktime.o.
  
! 	* strftime.c, mktime.c: New files (shared from libc).
  
! Sat Sep 24 03:54:02 1994  Erik Naggum  (erik@naggum.no)
  
! 	* editfns.c (Fformat_time_string): New function.
! 	(syms_of_editfns): Defsubr it.
  
! Sat Sep 24 01:09:16 1994  Richard Stallman  <rms@churchy.gnu.ai.mit.edu>
  
! 	* sysdep.c [USE_DL_STUBS] (dlopen, dlsym, dlclose): New functions.
! 	* s/sunos4-1.h (USE_DL_STUBS): Defined.
! 	* s/sunos4shr.h (USE_DL_STUBS): Add #undef.
  
! 	* fileio.c (Ffile_writable_p): Use stat to test for existence.
! 	(check_executable, check_writable): New functions.
! 	(Ffile_executable_p, Ffile_writable_p): Use the new functions.
  
! 	* intervals.c (set_point):
! 	If Vinhibit_point_motion_hooks, ignore intangible properties.
! 	If move backwards into intangible text, move back over it.
  
! 	* textprop.c (syms_of_textprop): Doc fix.
  
! 	* config.h.in (STACK_DIRECTION): Don't redefine if defined already.
! 	Move definition down past #include's.
  
! Fri Sep 23 20:15:02 1994  Richard Stallman  <rms@churchy.gnu.ai.mit.edu>
  
! 	* s/linux.h: Don't include signal.h, values.h.
! 	(signal): Definition deleted.
  
! 	* abbrev.c (Fexpand_abbrev): Instead of Fcapitalize_region,
! 	just upcase the first initial.
  
! 	* casefiddle.c (Fupcase_initials_region): New function.
! 	(Fupcase_initials): New function.
! 	(syms_of_casefiddle): defsubr them.
  
! 	* minibuf.c (read_minibuf_unwind): Preserve Vdeactivate_mark.
  
! 	* s/isc2-2.h (DONT_DEFINE_SIGNAL): Macro deleted.
  
! 	* m/next.h (DK_HEADER_FILE): Macro deleted.
  
! 	* m/tahoe.h (DKSTAT_HEADER_FILE): Macro deleted.
  
! 	* m/hp800.h (CPTIME_SYMBOL, DKXFER_SYMBOL): Macros deleted.
  
! 	* sysdep.c (start_of_text): Don't test CANNOT_UNEXEC.
! 	* unexec.c: Don't test CANNOT_UNEXEC.
! 	* unexaix.c: Don't test CANNOT_DUMP or CANNOT_UNEXEC.
  
! 	* sysdep.c: Delete BROKEN_FASYNC conditional.
  
! 	* data.c (Fset_default, Fset): Delete RTPC_REGISTER_BUG conditionals.
  
! 	* process.c (Fprocess_send_eof): Delete DID_REMOTE conditional.
  
!         * buffer.c (get-file-buffer): Doc fix.
  
! Fri Sep 23 00:54:08 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* frame.c (prev_frame): Fix typo.
  
! 	* unexec.c (copy_text_and_data): Delete some printf's.
  
! 	* m/acorn.h (PURESIZE): Definition deleted.
  
! 	* xfns.c (x_figure_window_size): Decode (- N), (+ N) for position.
! 	(x_set_frame_parameters): Handle (+ N) and (- N).
! 	Preserve negative positions properly too.
! 	[USE_X_TOOLKIT] (x_window): Let xneg, yneg specify whether to
! 	negate left and top.
! 	(Fx_parse_geometry): Handle [XY]Negative with positive number
! 	or negative number without [XY]Negative.
  
! 	* callint.c (Qplus): New variable.
! 	(syms_of_callint): Set it up.
! 	* lisp.h (Qplus): Declared.
  
! 	* xfns.c (Fx_create_frame): Rename menuBarLines resource to menuBar.
  
! 	* s/sunos4-1-3.h, s/sunos4shr.h (X_IO_BUG): Definition deleted.
  
! 	* textprop.c (Fset_text_properties): Don't let validate_interval_range
! 	increment START and END twice.
  
! 	* xterm.h (FRAME_X_DISPLAY): New macro.
  
! 	* s/freebsd.h (BSD): Have two definitions according to version number.
  
! Thu Sep 22 16:50:11 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xterm.c (x_destroy_window): Decrement ref count of x_screen struct.
  
! 	* xfns.c (the_x_screen): New variable.
! 	(syms_of_xfns): Staticpro parts of it.
! 	(Fx_open_connection): Initialize it.
! 	(Fx_create_frame): Make frame point to it.
! 	(Fx_list_fonts): Use a cache stored in FRAME_X_SCREEN.
  
! 	* xterm.h (struct x_screen): New structure.
! 	(struct x_display): New field x_screen.
! 	(FRAME_X_SCREEN): New macro.
  
! 	* process.c (exec_sentinel_error_handler): Call update_echo_area.
! 	(read_process_output_error_handler): Likewise.
  
! 	* xdisp.c (update_echo_area): New function.
  
! Thu Sep 22 15:20:12 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* buffer.c (evaporate_overlays): Overlay is in car, not cdr.
  
! Wed Sep 21 21:46:06 1994  Tom Tromey  <tromey@creche.colorado.edu>
  
! 	* doc.c (get_doc_string): Look in ../etc while dumping.
! 	(munge_doc_file_name): New subroutine.
  
! Thu Sep 22 02:25:07 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* minibuf.c (Fcompleting_read): Doc fix.
  
! 	* puresize.h (BASE_PURESIZE): Increment both values.
  
! 	* window.c (Fdelete_other_windows): Nice error if WINDOW is minibuf.
  
! 	* lisp.h (Vdebug_on_error): Declared.
  
! 	* process.c (exec_sentinel_error_handler): New function.
! 	(exec_sentinel): Catch all errors in the sentinel.
  
! 	* keyboard.c (read_char): Don't return right away when
! 	read_char_minibuf_menu_prompt returns non-nil.
! 	Instead, set key_already_recorded, which inhibits most but not all
! 	of the work at non_reread.
  
! Wed Sep 21 17:22:44 1994  Simon Leinen  <simon@lia.di.epfl.ch>
  
! 	* cm.h (cmputc): Return int rather than void.
! 	* cm.c (evalcost, cmputc): They now return their arguments.
  
! Wed Sep 21 10:09:42 1994  Per Abrahamsen  <abraham@iesd.auc.dk>
  
! 	* window.c (display-buffer, special-display-buffer-names)
! 	(special-display-regexps, special-display-function): Accept cons
! 	cells in `special-display-buffer-names' and
! 	`special-display-regexps'.  If the buffer name matches the car,
! 	call `special-display-function' with the cdr as a second argument.
  
! Wed Sep 21 14:52:44 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* s/bsd386.h (HAVE_TERMIOS, NO_TERMIO): Defined.
  
! 	* editfns.c (Fmessage_or_box): Use Fmessage_box with new name.
  
! 	* process.c (read_process_output_error_handler): New function.
! 	(read_process_output_call): New function.
! 	(read_process_output): Catch and report errors in filters.
  
! 	* keyboard.c (cmd_error_internal):
! 	New function, broken out of cmd_error.
  
! 	* fileio.c (Fread_file_name): If DEFAULT is nil and INITIAL is not,
! 	use INITIAL to set DEFAULT.
  
! 	* editfns.c (Fmessage_box): Renamed from Fbox_message.
  
! Fri Sep 17 08:40:48 1994  Michael Ben-Gershon (mybg@cs.huji.ac.il)
  
! 	* unexec.c (copy_text_and_data): Add RISCiX changes.
  
! 	* m/acorn.h, s/riscix1-1.h, s/riscix1-2.h: New files added.
  
! Wed Sep 21 15:39:33 1994  Bill Burton  (billb@progress.com)
  
! 	* s/ptx.h: New file for Sequent DYNIX/ptx 1.x/2.x
  
! 	* m/sequent-ptx.h: New file for Sequent DYNIX/ptx 1.x/2.x
  
! Wed Sep 21 11:10:40 1994  Frederic Pierresteguy  <F.Pierresteguy@frcl.bull.fr>
  
! 	* editfns.c (Fbox_message): New function to print a message in
! 	a dialog box.
! 	(Fmessage_or_box): New function that choose whether to print a
! 	message in a dialog or in the echo area.
  
! Wed Sep 21 01:13:51 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* search.c (Freplace_match): New 4th arg OBJECT can specify string
! 	to replace in.
  
! 	* casefiddle.c (upcase_initials): New function.
! 	(casify_object): Handle CASE_CAPITALIZE_UP.
  
! 	* fns.c (concat3): New function.
  
! 	* xfns.c (Fx_get_resource): Doc fix.
  
! 	* buffer.c (overlays_at): New arg PREV_PTR.
! 	Return previous overlay end.
! 	(Foverlays_at): Pass NULL for last 2 args of overlays_at.
! 	(Fnext_overlay_change): Pass new arg to overlays_at.
! 	(Fprevious_overlay_change): New function.
! 	* xterm.c (note_mouse_highlight): Pass new arg to overlays_at.
! 	* xfaces.c (compute_char_face): Pass new arg to overlays_at.
! 	* textprop.c (Fget_char_property): Pass new arg to overlays_at.
! 	(NULL): Define if not defined.
  
! 	* minibuf.c (get_minibuffer): Make BUF current to kill its local vars.
  
! Tue Sep 20 01:49:37 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* ralloc.c (r_alloc_freeze_level): New variable.
! 	(r_alloc_freeze, r_alloc_thaw): New functions.
! 	(r_alloc_sbrk): Refuse to move blocs, if frozen.
  
! 	* unexaix.c (report_error): Include reason in error message.
  
! Tue Sep 20 01:05:50 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* eval.c (init_eval_once): Init Vrun_hooks here.
! 	(syms_of_eval): Not here.
  
! Tue Sep 20 00:06:50 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* search.c (trivial_regexp_p): New function.
! 	(search_buffer): Don't depend on internal format of re_pattern_buffer.
  
! 	* frame.h (FRAME_SCROLL_BAR_PIXEL_WIDTH): New macro, supersedes
! 	VERTICAL_SCROLL_BAR_PIXEL_WIDTH; no longer device-dependent.
! 	All callers changed.
! 	(FRAME_SCROLL_BAR_COLS): New macro, supersedes
! 	VERTICAL_SCROLL_BAR_WIDTH; no longer constant.  All callers changed.
! 	(scroll_bar_pixel_width, scroll_bar_cols): New members of struct frame.
! 	* xterm.h (VERTICAL_SCROLL_BAR_PIXEL_WIDTH): Deleted.
! 	* xfns.c (x_set_scroll_bar_width): New function.
! 	(x_frame_parms): Add that function to this table.
! 	(Qscroll_bar_width): New symbol.
! 	(syms_of_xfns): Initialize and staticpro it.
! 	(Fx_create_frame): Set default scroll bar width.
! 	* xterm.c (x_new_font): Compute number of scrollbar columns.
! 
! 	* keyboard.c (kbd_store_ptr): Declare storage class before qualifier.
! 	(make_lispy_event): Fix Lisp_Object vs. int problems.
! 	(read_avail_input, menu_bar_items_index, read_key_sequence): Likewise.
! 	* window.c (Fset_window_buffer): Likewise.
! 	* alloc.c (make_float, make_pure_float): Likewise.
  
! 	* sysdep.c (set_file_times): Move this out of the USG conditional.
  
! Mon Sep 19 22:29:09 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* s/sco4.h (POSIX_SIGNALS): Defined.
  
! Mon Sep 19 13:46:04 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* buffer.c (syms_of_buffer): Doc fix.
  
! 	* keymap.c (Fkey_description): Reverse condition.
  
! Mon Sep 19 13:23:44 1994  Jim Blandy  <jimb@geech.gnu.ai.mit.edu>
  
!         Add a new element to display tables controlling side-by-side
! 	window borders.
! 	* buffer.c (syms_of_buffer): Update doc string for
! 	`buffer-display-table'.
! 	* disptab.h (DISP_TABLE_SIZE): Bump to 262.
! 	(DISP_BORDER_GLYPH): New accessor macro.
! 	* xdisp.c (display_text_line): Consult the display table when
! 	building side-by-side window borders.
  
! Mon Sep 19 01:05:21 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* s/netbsd.h (SYSTEM_TYPE): Delete definition.
  
! 	* lisp.h (RETURN_UNGCPRO): Use if (1) .. else, not do ... while (0).
  
! Sun Sep 18 19:56:33 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* lisp.h (Fmember): Declare this function.
! 	* intervals.c: #include "keyboard.h"
! 	* term.c: Declare Fmake_sparse_keymap.
! 	* minibuf.c (read_minibuf): Fix Lisp_Object vs. int problems.
! 	* frame.h [!MULTI_FRAME] (FOR_EACH_FRAME): Likewise.
! 	* fns.c (Frandom): Likewise.
! 	* eval.c (Fsignal): Likewise.
! 	* frame.c (Fframe_parameters): Likewise.
! 	* indent.c (vmotion, Fvertical_motion): Likewise.
! 	* lread.c (openp): Likewise.
! 	* dispnew.c (direct_output_for_insert, direct_output_forward_char):
! 	Likewise.
! 	* textprop.c (validate_interval_range, property_value,
! 	Fget_char_property, Fnext_property_change,
! 	Fnext_single_property_change, Fprevious_property_change,
! 	Fprevious_single_property_change): Likewise.
  
! Sun Sep 18 16:00:13 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* process.c (pty_name): Move it up; make it static.
! 	(create_process): Set the tty_name field.
! 	(Fprocess_tty_name): New function.
! 	(syms_of_process): defsubr it.
  
! 	* process.h (struct process): New field tty_name.
  
! 	* s/sol2.h (HAVE_VFORK): Defined.
! 	(C_SWITCH_SYSTEM): Deleted.
! 	(const): Definition deleted.
  
! 	* fileio.c (Ffile_writable_p): Don't use ro_fsys.
! 	(ro_fsys): Deleted.
  
! Sun Sep 18 14:57:23 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* config.h.in (_ALL_SOURCE): Don't redefine if already defined.
  
! 	* xdisp.c [!HAVE_X_WINDOWS] (store_frame_title): Dummy macro.
  
! 	* sysdep.c (set_file_times): New function, replaces EMACS_SET_UTIMES.
! 	* fileio.c (Fcopy_file): Use it, and check for the error return.
! 	* systime.h: Declare it.
! 	[HAVE_UTIME_H]: #include <utime.h>.
  
! 	* config.h.in (_ALL_SOURCE, HAVE_STRUCT_UTIMBUF, HAVE_SELECT,
! 	HAVE_TIMEVAL): Add #undefs.
  
! 	* s/*.h, m/*.h: Delete obsolete symbols USE_UTIME, MISSING_UTIMES,
! 	IRIS_UTIME, USG_SYS_TIME, HAVE_SELECT, HAVE_TIMEVAL, BIG_ENDIAN.
  
! Sun Sep 18 00:00:16 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* dispnew.c (preserve_other_columns): Fix arg to sizeof in bcopy call.
  
! 	* minibuf.c (get_minibuffer): Call Fkill_all_local_variables.
  
! 	* buffer.c (reset_buffer): Don't call reset_buffer_local_variables.
! 	(Fget_buffer_create): Call it here.
! 	(init_buffer_once): And here.
  
! 	* window.c (struct saved_window_data): New slots min_width, min_height.
! 	(Fcurrent_window_configuration): Set slots from window_min_...
! 	(Fset_window_configuration): Restore them.
! 	Set window_min_height and window_min_width to 1
! 	while restoring windows.
  
! 	* unexsunos4.c (SUNOS4 or __FreeBSD__): Define UNDO_RELOCATION.
! 	(unexec): Test UNDO_RELOCATION.  Distinguish the relocation formats
! 	of __FreeBSD__ and SUNOS4.
  
! 	* s/sol2.h (REL_ALLOC): #undef deleted.
  
! 	* keymap.c (Fkey_description): Give error if KEYS not an array.
! 	(get_keyelt, access_keymap, get_keymap_1): Use type test macros.
  
! Sat Sep 17 01:21:19 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* unexsunos4.c (unexec): Fix logic for rounding section boundaries.
  
! 	* config.h.in (EMACS_CONFIG_OPTIONS): Add #undef.
  
! 	* textprop.c (property_value): Declare args plist, prop.
  
! 	* s/osf1.h (malloc, realloc): Declared.
  
! 	* print.c (print): sprintf arg for frame depends on VALBITS.
  
! 	* callproc.c (Fcall_process) [__osf__ && __alpha]:
! 	Don't stop reading if read returns negative.
  
! 	* puresize.h (PURESIZE_RATIO, BASE_PURESIZE): Defined.
! 	(PURESIZE): Define it based on those.
! 	* m/alpha.h (PURESIZE): Definitions deleted.
  
! Fri Sep 16 23:09:34 1994  Karl Heuer  <kwzh@churchy.gnu.ai.mit.edu>
  
! 	* buffer.h: Declare some functions.
! 	* intervals.h: Declare some functions.
! 	* lisp.h: Declare some functions.
! 	* xterm.c, xfaces.c: Add #include "intervals.h"
! 	* fileio.c (barf_or_query_if_file_exists): Fix declaration.
! 	* xmenu.c (menu_item_enabled_p): Fix declaration.
  
! Fri Sep 16 22:15:28 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xfns.c (hack_wm_protocols): Arrange to handle WM_SAVE_YOURSELF.
  
! 	* s/hpux9.h (HAVE_TERMIO, HAVE_TERMIOS, NO_TERMIO): Undo Jul 28 change.
  
! Fri Sep 16 21:49:50 1994  Karl Heuer  <kwzh@churchy.gnu.ai.mit.edu>
  
! 	* emacs.c (Vsystem_configuration_options): New variable.
! 	(syms_of_emacs): Initialize it.
  
! 	* buffer.h: Declare evaporate_overlays.
! 	* buffer.c: Declare new symbol Qevaporate.
! 	(syms_of_buffer): Initialize it.
! 	(Fmove_overlay): Check if overlay is empty.
! 	(Foverlay_put): Check if setting evaporate property on empty overlay.
! 	(evaporate_overlays): New function.
! 	* insdel.c (del_range_1): Call evaporate_overlays after deleting text.
  
! Fri Sep 16 20:13:01 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* m/intel386.h (HAVE_VFORK): Defined.
! 	[__GNUC__] (C_SWITCH_SYSTEM): Add #undef.
  
! 	* emacs.c (shut_down_emacs): Don't call Fx_close_current_connection.
  
! 	* lisp.h (EMACS_INT, EMACS_UINT): Define, if not already defined.
  
! 	* alpha.h (EMACS_INT, EMACS_UINT): Defined.
  
! Fri Sep 16 19:56:09 1994  Rainer Schoepf  <schoepf@sc.ZIB-Berlin.DE>
  
! 	* s/osf1.h [__alpha] (LD_SWITCH_SYSTEM): Alternate definition.
  
! 	* unexalpha.c, m/alpha.h: New files.
  
! 	* alloc.c (pure, pure_size): Use EMACS_INT.
! 	(free_float, free_cons, PAD, STRING_FULLSIZE, struct string_block)
! 	(make_pure_string, make_pure_vector, Fgarbage_collect, mark_object)
! 	(gc_sweep, compact_strings, Fmemory_limit): Use EMACS_INT.
  
! 	* buffer.c (reset_buffer_local_variables, Fbuffer_local_variables)
! 	(init_buffer_once): Use EMACS_INT.
  
! 	* callint.c (Fcall_interactively): Use EMACS_INT.
  
! 	* data.c (sign_extend_lisp_int): Use EMACS_INT.
  
! 	* dispextern.h (struct face): Use EMACS_UINT.
  
! 	* doc.c (Fdocumentation): Use EMACS_INT.
  
! 	* editfns.c (Fnarrow_to_region, format1): Use EMACS_INT.
  
! 	* floatfns.c (FLOAT_TO_INT, FLOAT_TO_INT2): Use EMACS_INT.
  
! 	* frame.h (struct frame, selected_frame, last_nonminibuf_frame):
! 	Use EMACS_INT.
  
! 	* lisp.h (Lisp_Object): Use EMACS_INT.
! 	(MARKBIT): Don't define if already defined.
! 	(VALMASK, GCTYPEMASK, XSETTYPE, XSET)
! 	(XSETCONS, XSETBUFFER, XSETVECTOR, XSETSUBR, XSETSTRING)
! 	(XSETSYMBOL, XSETFUNCTION, XSETMARKER, XSETOBJFWD)
! 	(XSETINTPTR, XSETWINDOW, XSETPROCESS, XSETFLOAT)
! 	(struct Lisp_String, struct Lisp_Vector): Use EMACS_INT.
  
! 	* lread.c (Fload): Use EMACS_INT.
  
! 	* marker.c (unchain_marker): Use EMACS_INT.
  
! 	* mem-limits.h: Check for __alpha, in __osf__ conditional.
! 	(EXCEEDS_LISP_PTR): Use EMACS_UINT.
  
! 	* print.c (print): Use EMACS_UINT.
  
! 	* puresize.h (CHECK_IMPURE, all versions): Use EMACS_INT.
  
! 	* window.h (struct window): Use EMACS_INT.
  
! 	* xdisp.c (message): Use EMACS_INT.
  
! 	* xterm.h (struct scroll_bar, SCROLL_BAR_VEC_SIZE): Use EMACS_INT.
  
! Fri Sep 16 19:39:30 1994  Morten Welinder  <terra@diku.dk>
  
! 	* fileio.c (Finsert_file_contents) [MSDOS]: Don't re-gc-protect
! 	filename; delete unused variables.
  
! Fri Sep 16 19:35:04 1994  Karl Heuer  <kwzh@churchy.gnu.ai.mit.edu>
  
! 	* term.c (clear_to_end): Fix reversed condition.
  
! Fri Sep 16 18:16:48 1994  K. Berry <kb@cs.umb.edu>
  
! 	* dired.c (Qcompletion_ignored_extensions): New symbol.
! 	(syms_of_dired): Initialize it.
! 	* fileio.c (Fdelete_file): Bind completion-ignored-extensions to nil.
  
! Fri Sep 16 17:56:25 1994  Morten Welinder  (terra@diku.dk)
  
! 	* s/msdos.h (MODE_LINE_BINARY_TEXT): Define this symbol.
! 	* xdisp.c (decode_mode_spec): Use it when defined.
  
! Fri Sep 16 17:29:48 1994  Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
! 	* minibuf.c (read_minibuf): Don't add to the history list if the
! 	minibuffer string is empty, since it is not very useful.
  
! Fri Sep 16 16:07:35 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* m/hp9000s300.h [not BSD4_3] [__GNUC__] (HAVE_ALLOCA): Defined.
  
! Fri Sep 16 07:15:51 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* xdisp.c [!HAVE_X_WINDOWS] (frame_title_ptr): define as always null.
  
! Fri Sep 16 03:42:39 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xterm.c: Delete X11 conditionals.
! 	(XTupdate_end, XTupdate_begin, XTclear_end_of_line)
! 	(XTclear_frame, XRINGBELL, stufflines, scraplines, dumprectangle)
! 	(XTread_socket, x_draw_box, clear_cursor, refreshicon, x_iconify_frame)
! 	(x_bitmap_icon, x_text_icon, x_new_font, x_term_init)
! 	(x_calc_absolute_position, x_set_window_size)
! 	(x_make_frame_visible, x_make_frame_invisible): Delete X10 code.
! 	(dumpqueue, x_do_pending_expose, dumpborder, XEvent, x_read_exposes)
! 	(enqueue_event, dequeue_event, queue_event_count)
! 	(mouse_event_pending_p, x_set_resize_hint): Delete X10 versions.
  
! 	* xfns.c: Delete X11 conditionals.
! 	(defined_color, x_decode_color, x_set_foreground_color)
! 	(x_set_background_color, x_set_mouse_color, x_set_cursor_color)
! 	(x_set_border_color, x_set_border_pixel, Fx_create_frame)
! 	(Fx_open_connection, Fx_close_current_connection, syms_of_xfns):
! 	Delete X10 code.
! 	(Fx_get_default, Fx_get_resource, Fx_rubber_band)
! 	(Fx_store_cut_buffer, Fx_get_cut_buffer): Delete X10 definitions.
  
! 	* xfns.c (Fx_display_grayscale_p): New function.
! 	(syms_of_xfns): defsubr it.
  
! 	* s/bsd386.h (__bsdi__): Define, unless already defined.
! 	(DECLARE_GETPWUID_WITH_UID_T): Define.
  
! 	* filelock.c (getpwuid): Test just DECLARE_GETPWUID_WITH_UID_T,
! 	not __bsdi__.
! 	* xrdb.c (getpwuid, getpwnam): Test just DECLARE_GETPWUID_WITH_UID_T,
! 	not __bsdi__.
  
! Thu Sep 15 20:40:47 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* editfns.c (syms_of_editfns): Make Vsystem_name and Vuser...name
! 	lisp variables again.
! 	* xdisp.c (multiple_frames, Vframe_title_format,
! 	Vicon_title_format): New variables.
! 	(store_frame_title): New function.
! 	(x_consider_frame_title): Format title according to template.
! 	(display_mode_element): Handle frame title as well as mode line.
! 	(decode_mode_spec): Use w->buffer, not current_buffer.
  
! Thu Sep 15 01:50:12 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* s/freebsd.h (DECLARE_GETPWUID_WITH_UID_T): Defined.
! 	[NO_SHARED_LIBS and __FreeBSD__]:
! 	(LD_SWITCH_SYSTEM, A_TEXT_OFFSET, A_TEXT_SEEK): Alternate definitions.
  
! 	* textprop.c (syms_of_textprop):
! 	Delete Lisp var interval-balance-threshold.
  
! 	* intervals.c, intervals.h (interval_balance_threshold): Var deleted.
  
! 	* xfns.c (Fx_create_frame): Make 1 the default for menu-bar-lines.
  
! 	* keyboard.c (gobble_input): Use sigblockx only if it is defined.
  
! 	* unexsunos4.c [SUNOS4]: Include link.h.
! 	(unexec) [SUNOS4]: Cancel relocations that ld.so did.
  
! 	* s/sunos4-0.h (SUNOS4): Defined.
  
! Wed Sep 14 04:24:09 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* Makefile.in.in (xmenu.o): Depend on puresize.h.
! 	(cmds.o): Depend on window.h.
  
! 	* cmds.c: Include window.h.
! 	(Fnewline): Inhibit the insert-at-end-of-line hack
! 	when at the top of the window.
  
! 	* minibuf.c (Fcompleting_read): Doc fix.
  
! 	* xmenu.c: Include puresize.h.
! 	(menu_item_equiv_key): Use CHECK_IMPURE.
  
! 	* syntax.c (Fforward_comment): Do increment from, when reaching
! 	single-char comment end going forward.
  
! 	* callproc.c (delete_temp_file): Use Fdelete_file.
  
! 	* fileio.c (Fset_default_file_modes): Doc fix.
  
! 	* Makefile.in.in (OLDXMENU variable): Refer to the library in the
! 	dir where it is compiled.
! 	(OLDXMENU rule): Delete the commands; keep just a dep.
  
! Sun Sep 11 14:56:01 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* Version 19.27 released.
  
! Sat Sep 10 01:10:04 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* keymap.c (syms_of_keymap): Doc fix.
  
! 	* keyboard.c (gobble_input): Block SIGALRM if we are using it.
  
! 	* gmalloc.c: Bug fix affecting __ptrdiff_t in non-ANSI case.
  
! Wed Sep  7 03:54:08 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* Version 19.26 released.
  
! Thu Sep  8 15:13:32 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* keyboard.c (record_asynch_buffer_change): Don't test
! 	Fwaiting_for_user_input_p if no subprocesses.
  
! Mon Sep  5 21:33:48 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* s/sol2.h [USE_X_TOOLKIT && HAVE_X11XTR6] (REL_ALLOC): Undefine it.
  
! Sun Sep  4 23:20:51 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* emacs.c (init_cmdargs): After chasing link, use only the
! 	expanded name.
  
! Sun Sep  4 20:12:07 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* fileio.c (Ffile_accessible_directory_p): Put back the gcpro.
  
! 	* sysdep.c (srandom): Pass arg to srand48; no return value.
  
! Sun Sep  4 00:35:24 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* emacs.c (init_cmdargs): When setting dir, expand the dir name.
  
! 	* sysdep.c (random, srandom): Check HAVE_LRAND48, not HAVE_RAND48.
! 	Call lrand48, nor rand48.
  
! 	* config.h.in (HAVE_LRAND48): Replaces HAVE_RAND48.
  
! Sat Sep  3 14:44:42 1994  Kaveh R. Ghazi  (ghazi@noc.rutgers.edu)
  
! 	* m/delta88k.h [__GNUC__] (HAVE_ALLOCA): Defined.
! 	[__GNUC__] (C_ALLOCA): Add #undef
! 	(LIB_X11_LIB): Add #undef.
! 	(HAVE_TERMIOS): Defined.
! 	(HAVE_TERMIO): Add #undef.
! 	(NO_TERMIO): Defined.
! 	(sigsetmask): Add #undef.
! 	(USE_GETOBAUD): Defined.
  
! Sat Sep  3 00:33:58 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* sysdep.c (init_baud_rate): Test that getobaud is actually defined.
  
! 	* sysdep.c (init_baud_rate) [USE_GETOBAUD]: Use getobaud.
  
! Fri Sep  2 17:57:36 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* insdel.c (prepare_to_modify_buffer): Don't call
! 	verify_overlay_modification if no overlays or
! 	verify_interval_modification no intervals.
  
! 	* textprop.c (Fset_text_properties):
! 	Return early if buffer has no intervals and PROPS is nil.
  
! Fri Sep  2 03:01:48 1994  Lennart Staflin  (lenst@rudolf)
  
! 	* xdisp.c (display_text_line): Don't overrun the charstart area.
  
! Fri Sep  2 01:31:58 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* insdel.c (insert_1): Don't call interval fns if buffer has none.
  
! 	* textprop.c (Fset_text_properties): Don't create or split an interval
! 	if we trivially do not need to change anything.
  
! Wed Aug 31 16:39:57 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xfns.c (defined_color): New arg ALLOC--optionally don't allocate
! 	the color.
! 	(x_decode_color, Fx_color_defined_p): Pass new arg.
! 	(Fx_color_values): New function.
  
! Tue Aug 30 04:24:59 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* frame.c (Fdelete_frame): Fix previous change.
  
! Tue Aug 30 11:11:59 1994  enami tsugutomo  <enami@sys.ptg.sony.co.jp>
  
! 	* fileio.c (Fwrite_region): unbind_to should take two args.
  
! Tue Aug 30 00:21:51 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* fileio.c (Ffile_accessible_directory_p): No need for gcpro.
  
! 	* keyboard.c (input_polling_used): New function.
! 	* xterm.c (x_make_frame_visible): Call input_polling_used.
  
! Sun Aug 28 01:53:01 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* frame.c (Fdelete_frame): Free the frame's glyphs arrays.
! 	Free the line insert/delete cost vectors.
  
! 	* dispnew.c (free_frame_glyphs): No longer static.
  
! 	* m/next.h (HAVE_MACH_MACH_H): Defined.
  
! 	* editfns.c (Finsert_and_inherit_before_markers):
! 	Use insert_before_markers_and_inherit for character args.
! 	(Finsert_and_inherit): Use insert_and_inherit for character args.
  
! 	* insdel.c (insert_before_markers_and_inherit): New function.
  
! 	* cmds.c (internal_self_insert): Use insert_and_inherit.
  
! Sat Aug 27 18:45:24 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* indent.c (Findent_to): Pass new arg to Finsert_char.
  
! 	* editfns.c (Finsert_char): New arg INHERIT.
! 	Use insert_and_inherit if requested.
  
! 	* insdel.c (insert_1): New arg INHERIT.
! 	(insert_and_inherit): New function.
  
! Fri Aug 26 17:19:52 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* keyboard.c (polling_for_input): Define var unconditionally.
! 	* keyboard.h (polling_for_input): Declared.
! 	* xterm.c: Include keyboard.h.
! 	(x_make_frame_visible): Fix previous change: test polling_for_input
! 	instead of whether SIGIO is defined.
! 	* Makefile.in.in (xterm.o): Depend on keyboard.h.
  
! Fri Aug 26 16:35:06 1994  Kevin Rodgers <kevinr@ihs.com>
  
! 	* xfns.c (Fx_color_defined_p): Return list of RGB values, not just t.
  
! Fri Aug 26 01:17:17 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* xterm.c (x_make_frame_visible): Call signal handler directly.
  
! Thu Aug 25 18:18:50 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* s/linux.h: Add LINUX_QMAGIC conditional.
  
! 	* m/alliant-2800.h (USE_NONANSI_DEFUN): Defined.
  
! 	* lisp.h (DEFUN): Check USE_NONANSI_DEFUN.
  
! 	* Makefile.in.in (obj): Put cm.o before term.o.
! 	(Avoids mysterious lossage on Irix.)
  
! 	* xmenu.c (xmenu_show): Don't queue events that are in the menu bar.
  
! Wed Aug 24 15:40:04 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xmenu.c (xmenu_show): Do nothing special for ButtonPress in the menu.
! 	Call XtDispatchEvent for all ButtonRelease events.
! 	xlwmenu.c now deals with posting the menu.
! 	Check for events in subwidgets of the menu
! 	when deciding whether to queue them for later handling.
  
! 	* unexelfsgi.c (unexec): Copy previous change in unexelf.c.
  
! 	* s/irix5-0.h [__GNUC__] (LD_SWITCH_SYSTEM): Defined.
  
! Wed Aug 24 17:40:38 1994  Simon Leinen  <simon@lia.di.epfl.ch>
  
- 	* term.c (term_init): Added missing argument to tgetstr.
- 	(tgetstr): Move declarations to top level.
  
! Wed Aug 24 02:26:54 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* xterm.c (x_make_frame_visible): Raise a signal to cause the
! 	pending X I/O to be read.
  
! Wed Aug 24 01:16:45 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xdisp.c (display_scan_buffer): New function.
! 	(display_count_lines): Use that.
  
! 	* intervals.c (textget): Ignore category prop if not a symbol.
  
! Tue Aug 23 22:04:05 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* s/gnu.h: New file.
  
! Tue Aug 23 18:56:19 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* indent.c (pos_tab_offset): Don't trigger point-motion hooks.
  
! 	* buffer.c (Frename_buffer): Fix gcpro problems.
! 	* fileio.c (Fmake_symbolic_link, Ffile_accessible_directory_p,
! 	Finsert_file_contents, auto_save_error, Fwrite_region): Likewise.
! 	(Fcopy_file, build_annotations, Fdo_auto_save): Delete unused
! 	 variables.
  
! Tue Aug 23 03:04:51 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* fileio.c (O_RDONLY): Defined.
! 	(Finsert_file_contents, Fcopy_file): use it.
! 	(barf_or_query_if_file_exists, Ffile_exists_p): Use stat, not access.
! 	(Ffile_readable_p): Use open, not access.
  
! 	* lread.c (O_RDONLY): Defined.
! 	(openp): Use it.
  
! 	* unexelf.c (unexec): Don't alter the info field
! 	of SHT_SYMTAB and SHT_DYNSYM sections.
  
! 	* xdisp.c (redisplay_window): Don't access text before BEGV.
  
! 	* keyboard.c (read_char): After read_char_minibuf_menu_prompt,
! 	don't just return; jump to non_reread.
  
! 	* fileio.c (Fmake_directory_internal): Pass just 2 args to handler.
  
! Tue Aug 23 00:46:27 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* frame.c (Fmake_frame_invisible, Ficonify_frame): Don't switch frames.
  
! Mon Aug 22 19:17:08 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* search.c (Fstring_match): Fix sign error.
  
! 	* m/ibmrs6000.h (LD_SWITCH_MACHINE): Use full path to ibmrs6000.inp.
  
! Sun Aug 21 14:03:32 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* m/ibmrs6000.h (LD_SWITCH_MACHINE): Supply m/ibmrs6000.inp as input.
  
! 	* m/ibmrs6000.inp: New file.
  
! Fri Aug 19 20:47:38 1994  Hiroshi NAKANO  <nakano@whale.math.ryukoku.ac.jp>
  
! 	* unexelf.c: Eliminate local var bss_end.
! 	Update the symbol values of _edata and _end.
  
! Fri Aug 19 01:37:54 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* process.c (wait_reading_process_input):
! 	Clear waiting_for_user_input_p before returning.
  
! 	* xterm.c (x_make_frame_visible): Quit if requested, in loop at end.
  
! Wed Aug 17 22:07:20 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* keyboard.c (read_char): Don't show buffer-events to the user.
! 	Handle chars over 255 in dribble files.
  
! Wed Aug 17 17:43:22 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* callproc.c (Fcall_process_region): gcpro filename_string.
  
! Wed Aug 17 16:05:56 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* doc.c (store_function_docstring): Do nothing for bytecode object
! 	which has no slot for doc string.
  
! Tue Aug 16 19:51:36 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* buffer.c (list_buffers_1): Update header line layout.
  
! Sat Aug 13 19:11:21 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* s/sol2-4.h (pid_t): New definition.
! 	(vfork): Definition deleted.
  
! 	* xmenu.c (xmenu_show): Unconditionally update x_mouse_grabbed
! 	and Vmouse_depressed.
  
! 	* window.c (window_loop, case UNSHOW_BUFFER):
! 	When we delete a frame, skip all the windows on that frame.
  
! Fri Aug 12 19:11:43 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
  
! 	* s/isc4-0.h (NEED_SIOCTL): moved to isc-3.0.h.
! 	* s/isc3-0.h (NEED_SIOCTL): moved from isc-4.0.h, and disabled
! 	BROKEN_TIOCGWINSZ since it works fine when you use <sioctl.h>.
! 	(C_SWITCH_SYSTEM): Add -D_SYSV3 to ensure availability of
! 	traditional non-standard functions.
! 	(memmove): Delete this macro; it screws up <string.h> if you
! 	use the native cc.  (Emacs already does the right thing anyway.)
  
! Fri Aug 12 01:22:45 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* indent.c (compute_motion): Use WIN's frame, not selected one.
  
! 	* xterm.c (x_new_font): Don't set filename = full_name if that's null.
  
! Thu Aug 11 15:45:00 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* Makefile.in.in (FRAME_SUPPORT): Add faces.elc.
  
! 	* search.c (Freplace_match): Treat caseless initial like a
!         lowercase initial.
  
! 	* keymap.c (Fdefine_key): Fix error message.
! 	(Fsingle_key_description): Likewise.
  
! Wed Aug 10 16:28:47 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* s/sol2-3.h (POSIX_SIGNALS): Define it.
! 	(PTY_TTY_NAME_SPRINTF): New overriding definition.
! 	(sigsetmask): Add #undefs.
  
! 	* s/sol2-4.h (POSIX_SIGNALS, PTY_TTY_NAME_SPRINTF, sigsetmask):
! 	Delete those things (moved to sol2-3.h).
  
! 	* s/sol2-4.h (HAVE_VFORK): Deleted.
! 	(vfork): Define as emacs_vfork.
  
! 	* window.c (Fwindow_end): Undo previous change.
  
! Tue Aug  9 13:39:31 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* keyboard.c (record_asynch_buffer_change): Do nothing
! 	except when waiting_for_user_input_p.
  
! 	* m/i860.h [USG5_4] (SVR4): Defined.
  
! 	* xdisp.c (display_text_line):
! 	Make previous change #ifdef HAVE_X_WINDOWS.
  
! Mon Aug  8 05:03:18 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* puresize.h [MULTI_FRAME] (PURESIZE): Increased.
  
! 	* window.c (Fwindow_end): If window_end_valid is nil, return nil.
  
! 	* window.c (Fpos_visible_in_window_p): Do something reasonable
! 	if w->start is outside the buffer bounds.
  
! Sun Aug  7 02:40:34 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* s/sol2-4.h (PTY_TTY_NAME_SPRINTF): New definition.
! 	(sigsetmask): Add #undef.
  
! 	* keymap.c (Faccessible_keymaps): Fix previous change.
  
! Sat Aug  6 20:58:03 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xdisp.c (display_text_line): Use the face properties
! 	of the overlay arrow, if any.
  
! 	* xfaces.c (compute_glyph_face_1): New function.
  
! 	* m/intel386.h (LIBS_MACHINE): If SOLARIS2_4, don't define this.
! 	* s/sol2-4.h (SOLARIS2_4): Defined.
  
! Fri Aug  5 23:06:16 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* keymap.c (Fuse_global_map, Fuse_local_map):
! 	Call record_asynch_buffer_change.
  
! 	* xterm.c (XTread_socket):
! 	Don't test X_IO_BUG; make that code unconditional.
! 	(x_noop_count, x_term_init): Likewise.
  
! Thu Aug  4 17:00:11 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* data.c (Fdefine_function, Fdefalias): Handle advice as in Ffset.
! 	(Qad_advice_info): Lisp and C names renamed from Qadvice_info.
! 	(Qad_activate): C name renamed from Qactivate_advice.
  
! 	* fileio.c (Fread_file_name_internal): Call double_dollars
! 	when `changed' is set.
  
! Wed Aug  3 21:53:58 PDT 1994  Caveh Jalali  (caveh@eng.sun.com)
  
! 	* m/intel386.h [SOLARIS2] (VALBITS, GCTYPEBITS): New definitions.
  
! 	* s/sol2-4.h: New file.
  
! Wed Aug  3 00:38:43 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* buffer.c (list_buffers_1): Add one column to size column.
  
! 	* xterm.c (x_make_frame_visible): Start one_in_four at 1.
  
! 	* window.c (Fwindow_end): Doc fix.
  
! 	* xterm.c (construct_mouse_click, construct_menu_click):
! 	Don't update x_mouse_grabbed, Vmouse_depressed, last_mouse_frame here.
! 	(XTread_socket): Update them here, so we do it without fail.
! 	(XTmouse_position, XTread_socket case MotionNotify):
! 	Check last_mouse_frame is nonzero before using it.
  
! 	* Makefile.in.in (alloca.o): Use -f in all rm's.
  
! Tue Aug  2 18:08:18 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* keymap.c (Faccessible_keymaps): Use PREFIX to set loop starting
! 	point; don't even consider maps except those reached via prefix.
  
! 	* keyboard.c (make_lispy_event): If the position is not in a window,
! 	at least pass along the frame it is in.
  
! Mon Aug  1 18:28:32 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* data.c (Ffset): Don't call Fget unless SYM's plist is consp.
  
! Mon Aug  1 14:58:58 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* eval.c (Fprog2): Doc fix.
  
! 	* window.c (Fmove_to_window_line): Doc fix.
  
! Mon Aug  1 11:10:40 1994  Frederic Pierresteguy  (F.Pierresteguy@frcl.bull.fr)
  
! 	* xmenu.c (xmenu_show): Ignore any geometry resource from the user.
  
! Sun Jul 31 02:37:25 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xfns.c (Fx_get_resource): Doc fix.
  
! 	* data.c (syms_of_data): Set up Qadvice_info, Qactivate_advice.
! 	(Ffset): Activate advice if symbol has advice-info property.
  
! 	* xdisp.c (redisplay_window): Avoid using SET_PT to change point
! 	temporarily.
  
! 	* dispnew.c (sit_for): Undo previous change.
  
! Sat Jul 30 14:26:59 1994  enami tsugutomo  <enami@sys.ptg.sony.co.jp>
  
! 	* dispnew.c (direct_output_for_insert): Pass missing 8th
! 	argument to compute_char_face.
  
! Sat Jul 30 16:36:38 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* keyboard.c (follow_key): Don't downcase letters here.
! 	Delete arg `case_converted'.
! 	(read_key_sequence): Do it here; but not if in middle of fcn key.
  
! 	* fns.c (Frandom): Handle LIMIT >= 40000000.
  
! 	* xdisp.c (decode_mode_spec): Handle %&.
  
! Fri Jul 29 21:21:09 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* process.c (create_process): Set default handling for SIGINT, etc.
  
! Thu Jul 28 08:46:00 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* process.c (wait_reading_process_input): Fix previous change.
  
! 	* s/hpux9.h (HAVE_TERMIOS, NO_TERMIO): Defined.
! 	(HAVE_TERMIO): Add #undef.
  
! 	* sysdep.c (random): Use rand differently, and distinguish BSD/USG.
  
! 	* fns.c (Frandom): Fix previous change.
  
! Wed Jul 27 13:29:53 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* syssignal.h [POSIX_SIGNALS] (signal): New definition.
  
! 	* config.h.in (HAVE_RAND48): Add #undef.
  
! Tue Jul 26 11:25:58 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xterm.c (x_queue_event, x_unqueue_events): New functions.
! 	(x_start_queuing_selection_requests): New function.
! 	(x_stop_queuing_selection_requests): New function.
! 	(XTread_socket): Queue up SelectionRequest events sometimes.
! 	* xselect.c (x_get_foreign_selection): Use the new feature
! 	to queue up SelectionRequest events.
  
! 	* process.c (wait_reading_process_input): If wait_for_cell,
! 	do check for keyboard input and handle it.
  
! 	* fns.c (Frandom): Use just the low 30 bits of random's value.
  
! 	* sysdep.c (random, srandom): Obey HAVE_RAND48 flag.
! 	Test that random is not a macro.  Don't test USG or BSD4_1.
  
! 	* m/tek4300.h (tek4300): Don't define if already defined.
  
! Mon Jul 25 14:39:34 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
- 	* m/tek4300.h (BSD_PGRPS): Defined.
  
! 	* puresize.h (PURESIZE): Increase non-MULTI_FRAME value.
  
! 	* editfns.c (get_system_name): Add a cast.
  
! 	* config.h.in: Add #undef HAVE_H_ERRNO.
! 	* process.c, sysdep.c [!HAVE_H_ERRNO]: Declare h_errno.
! 	* sysdep.c (init_system_name): Set h_errno to 0 initially.
! 	* process.c (Fopen_network_stream): Set h_errno to 0 initially.
  
! 	* window.c (Fdisplay_buffer): Add MULTI_FRAME cond in last change.
  
! 	* Makefile.in.in: Add #undef alloca.
  
! Sat Jul 23 21:20:05 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* minibuf.c (Fdisplay_completion_list): gcpro `completions'.
  
! 	* print.c (internal_with_output_to_temp_buffer): gcpro things.
  
! 	* puresize.h (PURESIZE): Incremented to 252000.
  
! Sat Jul 23 12:26:36 1994  Jim Blandy  (jimb@totoro.bio.indiana.edu)
  
!         * .gdbinit: Set the breakpoint in x_error_quitter instead of
!         _XPrintDefaultError.
  
! Wed Jul 20 00:56:24 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* window.c (Fnext_window, Fprevious_window): Don't get stuck in a loop
! 	in the minibuffer frame.
  
! 	* dispnew.c (direct_output_for_insert): Dpn't call compute_char_face
! 	for a non-X frame.
  
! 	* s/usg5-4.h: Move #undef static before the includes.
  
! 	* xrdb.c [USG5] (SYSV): Don't define if already defined.
  
! 	* fileio.c (Fwrite_region): Do unwind the new unwind protect.
  
! Tue Jul 19 12:05:00 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* xterm.c (struct font_info): New field full_name.
! 	(x_new_font): Record, and return, the full name of the font.
  
! 	* widget.c (EmacsFrameSetCharSize): Delete the code to make rows at
! 	least 3.
  
! 	* fileio.c (Vwrite_region_annotations_so_far): New variable.
! 	(syms_of_fileio): Set up Lisp var.
! 	(build_annotations): Handle annotate functions that switch buffers.
! 	Set Vwrite_region_annotations_so_far.
! 	(Fwrite_region): Handle change of buffer in build_annotations.
! 	Add an unwind protect to restore original buffer and kill the temp.
  
! 	* sysdep.c (init_system_name): Retry gethostbyname after TRY_AGAIN
!         failure.
  
! 	* process.c (Fopen_network_stream):
! 	Retry gethostbyname after TRY_AGAIN failure.
  
! 	* s/isc4-0.h [__GNUC__] (LIBX11_SYSTEM): Add -lcposix.
  
! 	* s/usg5-4.h (PTY_TTY_NAME_SPRINTF): Fail smoothly if cannot get pty.
  
! 	* sysdep.c (sys_subshell): Expand ~ in dir.
! 	Do the processing of dir before calling fork.
! 	Use vfork.
  
! Mon Jul 18 02:09:30 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* xterm.c (note_mouse_movement): Use proper data type for window
! 	args to XQueryPointer.
! 	(x_scroll_bar_note_movement): Likewise.
  
! 	* keyboard.c (Vdeferred_action_list, Vdeferred_action_function):
! 	New variables.
! 	(command_loop_1): Handle them.
! 	(syms_of_keyboard): Set up Lisp variables.
  
! 	* s/linux.h [emacs]: Include stdio.h.
  
! 	* commands.h (unread_command_char): Declared.
! 	* dispnew.c (sit_for): Return immediately if unread events exist.
  
! Sun Jul 17 19:52:42 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* textprop.c (Fget_text_property): Simplify using Ftext_properties_at.
  
! Sun Jul 17 02:41:19 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xfns.c (Fx_create_frame): Use 140 as default font size.
  
! 	* xmenu.c [USE_X_TOOLKIT] (xmenu_show): Handle UnmapNotify events.
  
! Sat Jul 16 14:31:34 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* window.c (Fdisplay_buffer): Cope with unsplittable frames
! 	and dedicated windows.
  
! 	* frame.c [!MULTI_FRAME] (Fframe_first_window): Defined.
! 	(syms_of_frame): Defvar it.
  
! Thu Jul 14 19:56:33 1994  Morten Welinder  (terra@diku.dk)
  
! 	* s/msdos.h (HAVE_VOLATILE): Define.
  
! Thu Jul 14 00:59:50 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* keyboard.c (safe_run_hooks): Use local var to restore hook's value.
  
! Wed Jul 13 20:55:47 1994  Morten Welinder  (terra@diku.dk)
  
! 	* keyboard.c (kbd_buffer_get_event) [HAVE_MOUSE]: Include code
! 	to check for mouse dragging.
! 	(make_lispy_movement) [HAVE_MOUSE]: Define also in this case,
! 	but only include the non-multiframe stuff.
  
! 	* msdos.c (mouse_init1): Use alternate mouse detection for old
! 	mouse drivers.
! 	(mouse_get_pos): Downscale coordinates by 8.
  
! Wed Jul 13 00:11:17 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* window.c (Fselect_window): Fix bug checking new_point is in range.
  
! 	* fileio.c (syms_of_fileio): Finish previous change.
  
! 	* keyboard.c (command_loop_1): Do direct output for cursor motion
! 	over text chars when disp tab exists but says nothing for them.
  
! 	* frame.h (FRAME_EXTERNAL_MENU_BAR) [!USE_X_TOOLKIT]: Give zero.
  
! 	* xdisp.c [!HAVE_X_WINDOWS] (compute_char_face, compute_glyph_face):
! 	Add simple alternate definitions for non-X case.
  
! Tue Jul 12 15:09:25 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* process.c (Qlast_nonmenu_event): New variable.
! 	(syms_of_process): Set it up.
! 	(read_process_output, exec_sentinel): Bind it to t around filter.
  
! 	* fileio.c (Fmake_directory_internal): Use Qmake_directory_internal.
! 	(syms_of_fileio): Set up Qmake_directory_internal, not Qmake_directory.
  
! 	* frame.c [MULTI_FRAME] (Fframe_parameters): For non-X frames,
! 	fill in menu-bar-lines value.
  
! Mon Jul 11 20:46:53 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* xmenu.c (xmenu_show): Don't call XtUngrabPointer here.
  
! 	* Makefile.in.in (ctagsfiles): Rewrite to avoid compiler bug.
  
! Sun Jul 10 20:37:09 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* window.c (Fdisplay_buffer): Add MULTI_FRAME conditional
! 	in previous change.
  
! Sun Jul 10 19:11:24 1994  Morten Welinder  (terra@diku.dk)
  
! 	* m/intel386.h [MSDOS] (NO_REMAP): Defined.
! 	* s/msdos.h (HAVE_MOUSE, PURESIZE): Definitions moved here.
! 	* m/dos386.h: File obsolete and deleted.
  
! 	* msdos.c (dos_rawgetc): Use bios, not kbhit.
  
! Sat Jul  9 14:20:11 1994  Morten Welinder  (terra@diku.dk)
  
! 	* fileio.c (Ffile_name_directory, Ffile_name_nondirectory,
! 	file_name_as_directory, directory_file_name, Fexpand_file_name,
! 	Ffile_name_absolute_p, Fsubstitute_in_file_name) [MSDOS]:
! 	Allow backslashed file names.
  
! Sat Jul  9 00:43:51 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* puresize.h (PURESIZE) [MULTI_FRAME]: Increased to 250000.
  
! 	* lread.c (readevalloop): Correctly unbind the unwind protect.
  
! Fri Jul  8 16:24:59 1994  Morten Welinder  (terra@diku.dk)
  
! 	* msdos.c (do_visible_bell): Clean-up using GNU assembly extension.
  
! Thu Jul  7 00:52:10 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* m/sparc.h (BIG_ENDIAN): Don't redefine if defined.
  
! 	* Makefile.in.in (alloca.o): Delete allocatem.c first thing.
  
! 	* xmenu.c (xmenu_show) {USE_X_TOOLKIT}: ButtonPress no longer pops
! 	down; instead it forces the next ButtonRelease to exit.  Don't
! 	dispatch on ButtonPress events.
  
! 	* xfns.c (syms_of_xfns): Provide x-toolkit in toolkit version.
! 	Undo previous change.
! 	(x_toolkit): Variable deleted.
  
! 	* xfns.c (x_toolkit): New variable.
! 	(syms_of_xfns): Set up Lisp var x-toolkit.
  
! 	* window.c (Fnext_window, Fprevious_window): ALL_FRAMES = 0 means
! 	try both visible frames and iconified frames.
! 	(window_loop): Likewise, for FRAMES = 0.
! 	(Fget_buffer_window): Likewise, for FRAME = 0.
! 	(Fdisplay_buffer): Pass 0 to Fget_buffer_window;
! 	if the frame is iconified, make it visible.
  
! 	* frame.c (next_frame, prev_frame):
! 	MINIBUF = 0 means try visible frames and iconified frames.
  
! Wed Jul  6 15:30:48 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* xmenu.c (xmenu_show) [USE_X_TOOLKIT]: Keyboard input exits the menu.
! 	ButtonRelease does so if within Vdouble_click_time.
! 	Ignore mouse motion if button was already released.
! 	(menu_item_selection): Declare volatile, if __STDC__.
  
! 	* keyboard.c (make_lispy_event): Ignore menu bar up events.
  
! Tue Jul  5 02:18:22 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* doprnt.c (doprnt): Handle padding on %c.
  
! 	* frame.c (next_frame, prev_frame): Change which frames to use
! 	when MINIBUF is a window.
! 	(Fnext_frame, Fprevious_frame): Doc fixes.
  
! 	* window.c: Doc fixes.
  
! Mon Jul  4 23:54:05 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* xterm.c (XTread_socket, construct_menu_click) [USE_X_TOOLKIT]:
! 	Update x_mouse_grabbed and Vmouse_depressed.
  
! Sat Jul  2 00:23:23 1994  Richard Stallman  (rms@gnu.ai.mit.edu)
  
! 	* xdisp.c (decode_mode_spec): %+ makes % for unmodified RO buffer.
  
! 	* buffer.c (syms_of_buffer): Doc fix.
  
! 	* xfaces.c (get_cached_face): Set the cached_index field.
  
! Fri Jul  1 11:34:08 1994  Richard Stallman  (rms@gnu.ai.mit.edu)
  
! 	* sysdep.c (init_sys_modes): Turn off VSTART and VSTOP chars.
! 	On DGUX, turn off INPCK.
  
! Fri Jul  1 03:13:06 1994  Paul Reilly  (pmr@churchy.gnu.ai.mit.edu)
  
! 	* xfns.c (Fx_create_frame): Add GC protection for frame being made.
  
! Thu Jun 30 00:27:11 1994  Richard Stallman  (rms@gnu.ai.mit.edu)
  
! 	* xterm.c (x_make_frame_visible): In x_sync loop at the end,
! 	every fourth time, sleep for 1/4 second.
  
! 	* xselect.c (x_own_selection, x_get_foreign_selection):
! 	Get rid of spurious X_TOOLKIT conditional.
  
! 	* frame.c (Fdelete_frame): Call x_clear_frame_selections.
  
! 	* xselect.c (x_own_selection): Put the frame in Vselection_alist.
! 	(x_clear_frame_selections): New function.
  
! 	* xterm.c (x_draw_box): Use curs_x and curs_y, not f->cursor_[xy].
  
! 	* xfns.c (XLIB_ILLEGAL_ACCESS): Defined.
  
! Wed Jun 29 14:57:27 1994  Richard Stallman  (rms@gnu.ai.mit.edu)
  
! 	* s/hpux.h (random, srandom): Defined.
  
! 	* cmds.c (internal_self_insert): Now can return 2.
! 	* keyboard.c (command_loop_1): Don't clear nonundocount
! 	when internal_self_insert returns 1.
  
! Tue Jun 28 18:21:08 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* xfns.c (x_set_frame_parameters): Call x_set_offset directly.
! 	Handle `-' for position parameters.
  
! Tue Jun 28 17:50:22 1994  Karl Heuer  (kwzh@hal.gnu.ai.mit.edu)
  
! 	* lread.c (readchar): Restart interrupted I/O.
  
! Tue Jun 28 15:00:45 1994  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)
  
! 	* fileio.c (a_write): Loop while *ANNOT is listp, not consp.
! 	Previous code omitted all data from output files when *ANNOT was
! 	nil.
  
! Tue Jun 28 05:25:06 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* xfns.c (x_set_name): If no change needed, avoid consing.
  
! 	* xdisp.c (prepare_menu_bars): Call x_consider_frame_title
! 	only if windows_or_buffers_changed.
  
! 	* keyboard.c (safe_run_hooks): Take symbol as arg.
! 	Use Fsymbol_value and Fset.
! 	(command_loop_1): Pass symbol to safe_run_hooks.
! 	Look in the value cell to check for trivial case (no hooks).
  
! 	* xdisp.c (redisplay_region): For special treatment, BUF most be
! 	both current and displayed in selected window.
  
! 	* buffer.c (Foverlay_put): Pass redisplay_region a struct buffer *.
  
! Mon Jun 27 16:43:46 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* fileio.c (a_write): Verify that *annot is a cons.
  
! Sun Jun 26 12:28:23 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* keyboard.c (echo_dash): Fix backwards conditional.
! 	(read_key_sequence): Don't echo if echo_keystrokes is 0.
  
! 	* m/news-risc.h (C_DEBUG_SWITCH) [not NEWSOS5]:
! 	Don't define if __GNUC__.
! 	(KERNEL_FILE) [not NEWSOS5]: New override definition.
  
! Sat Jun 25 12:28:24 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* process.c (send_process): Major rewrite.
! 	Don't put in a C-d unless a single line is too long.
! 	Read process input whenever output gets stuck.
! 	Relocate BUF if we read input.  New arg OBJECT.
! 	(Fprocess_send_region, Fprocess_send_string, process_send_signal)
! 	(Fprocess_send_eof): Pass new arg OBJECT.
  
! 	* buffer.h (BUF_PTR_CHAR_POS): New macro.
  
! 	* window.c (Fsave_window_excursion): Doc fix.
  
! 	* s/hpux9.h (C_SWITCH_SYSTEM): Add -D_BSD.
  
! 	* frame.c (Fframe_parameters): Don't handle menu-bar-lines explicitly.
  
! 	* window.c (Fother_window_for_scrolling): New function.
! 	(Fscroll_other_window): Use that.
! 	(syms_of_window): defsubr it.
  
! Fri Jun 24 20:13:01 1994  Karl Heuer  (kwzh@nutrimat.gnu.ai.mit.edu)
  
! 	* fileio.c (Finsert_file_contents): Fix check for non-regular files.
  
! Fri Jun 24 10:09:46 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* syntax.c (scan_lists, Fforward_comment): When moving backward over
! 	a comment, ignore a comment-starter that overlaps the comment-ender.
  
! 	* minibuf.c (Fcompleting_read): Doc fix.
  
! Thu Jun 23 20:33:17 1994  Karl Heuer  (kwzh@hal.gnu.ai.mit.edu)
  
! 	* keyboard.c (syms_of_keyboard): Don't staticpro the same var twice.
  
! Thu Jun 23 15:15:09 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* s/convexos.h: File deleted.
  
! 	* xterm.c: Don't include string.h or strings.h.
  
! 	* term.c (term_get_fkeys): Don't redeclare term_get_fkeys_1 here.
  
! 	* m/convex.h (LIBS_MACHINE, GETPGRP_NO_ARG): Defined.
! 	(NLIST_NAME_UNION, DECLARE_GETPWUID_WITH_UID_T): Defined.
! 	(CRT0_DUMMIES): Conditionalize according to __GNUC__.
! 	(convex): Define if necessary.
! 	(C_SWITCH_MACHINE): Definition deleted.
  
! Wed Jun 22 00:15:49 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* buffer.c (Fmove_overlay): Fix typo in previous change.
  
! 	* s/sunos4shr.h (X_IO_BUG): Defined.
  
! Tue Jun 21 13:51:44 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* minibuf.c (read_minibuf_unwind): Run Qminibuffer_exit_hook here.
! 	(read_minibuf): Not here.
  
! 	* buffer.c (Fkill_buffer): Don't delete auto save file
! 	if it didn't come from this Emacs session.
! 	(Fmove_overlay): Add missing XINT calls in previous change.
  
! Mon Jun 20 20:40:37 1994  Karl Heuer  (kwzh@hal.gnu.ai.mit.edu)
  
! 	* xfns.c (x_window): Delete duplicate computation.
! 	Change type of reference argument from int to Dimension.
  
! Mon Jun 20 10:50:29 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* config.h.in: Move #undef HAVE_STRERROR before the #includes.
  
! 	* m/mips4.h (HAVE_STRERROR, HAVE_XRMSETDATABASE)
! 	(HAVE_XSCREENRESOURCESTRING, HAVE_SETSID): Add #undefs.
  
! 	* buffer.c (Fmove_overlay): Call redisplay_region even when
! 	changing to a different buffer.
  
! 	* syntax.c (Fmatching_paren): Fix typo.
  
! 	* xterm.c (show_mouse_face): Set endcolumn ok in side-by-side windows.
  
! Sun Jun 19 01:01:42 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* s/linux.h (SEGMENT_MASK): Defined.
  
! 	* xfns.c (x_window): Take account of pane widget internal border width.
  
! 	* s/linux.h (C_OPTIMIZE_SWITCH): Definition deleted.
  
! 	* lisp.h (RETURN_UNGCPRO): Swallow semicolon.
! 	(GCPRO5): New macro.
  
! 	* xmenu.c (single_keymap_panes): Put menu_item_equiv_key in the gcpro.
! 	(menu_item_equiv_key): GCPRO things.
  
! 	* keymap.c (Flookup_key): Add gcpro.
! 	(Fkey_binding, Fminor_mode_key_binding): Likewise.
! 	(Fwhere_is_internal): Likewise.
  
! 	* keyboard.c (apply_modifiers): Use assq_no_quit.
  
! Sun Jun 19 03:54:02 1994  Erik Naggum  (erik@naggum.no)
  
! 	* syntax.h (SYNTAX_MATCH): Fix typo (syntax -> matcher).
  
! 	* syntax.c (Fmatching_paren): New function.
! 	(Fchar_syntax): Pass arg directly to SYNTAX, no masking.
  
! Sat Jun 18 15:20:10 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* .gdbinit: Doc fixes.
! 	(xsymbol): Cast $ to int.
! 	(xvector, xstring): Don't use a string constant.
! 	Reduce size limit for printing contents.
  
! 	* s/sol2.h (GETTIMEOFDAY_ONE_ARGUMENT): Undo previous change.
  
! Sat Jun 18 19:52:15 1994  Francesco Potorti`  (pot@fly.cnuce.cnr.it)
  
! 	* m/delta.h (memmove): switch the first two args.
  
! Sat Jun 18 09:00:50 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* xterm.c (x_make_frame_visible): At end, wait till Emacs sees
! 	frame is visible.
  
! 	* keyboard.c (echo_after_prompt): New variable.
! 	(echo_prompt, cancel_echoing): Set it.
! 	(echo_dash): Test it.
  
! 	* s/linux.h (C_DEBUG_SWITCH): Define, if THIS_IS_CONFIGURE.
! 	(HAVE_GETTIMEOFDAY, HAVE_MKDIR, HAVE_RMDIR):
! 	(HAVE_XSCREENNUMBEROFSCREEN, HAVE_XRMSETDATABASE):
! 	Comment out these definitions.
  
! 	* Makefile.in.in (doprnt.o): Depend on config_h.
  
! Fri Jun 17 19:30:46 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* systime.h (EMACS_GET_TIME): Test GETTIMEOFDAY_ONE_ARGUMENT,
! 	not USG5_4.
! 	* s/usg5-4.h (GETTIMEOFDAY_ONE_ARGUMENT): Define it.
! 	* s/sol2.h (GETTIMEOFDAY_ONE_ARGUMENT): Undef it.
  
! 	* xfns.c (x_real_positions): Make sure we know the parent window.
  
! Fri Jun 17 16:01:55 1994  Karl Heuer  (kwzh@hal.gnu.ai.mit.edu)
  
! 	* window.h (minibuf_prompt): Now a Lisp_Object.  All uses changed.
  
! 	* minibuf.c (minibuf_save_list): New variable, replaces
! 	minibuf_save_vector.
! 	(read_minibuf): Cons it up.
! 	(read_minibuf_unwind): Pop back the saved values.
! 	(syms_of_minibuf): staticpro it.
  
! 	* indent.c (compute_motion): Recenter overlays, for speed.
  
! Fri Jun 17 09:33:21 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* xterm.c (scratch_cursor_gc): New variable.
! 	(dumpglyphs): Rework handling of GCs for cursor display
! 	to use scratch_cursor_gc, and reuse the GC more.
  
! Thu Jun 16 14:50:43 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* unexec.c (make_hdr): Handle case of no "additional header".
  
! 	* xdisp.c (redisplay_region): Treat selected window's buffer
! 	specially, not current buffer.
  
! 	* syssignal.h [USG5_4] (sigblock): Use |, not &.
  
! Thu Jun 16 11:36:35 1994  Karl Heuer  (kwzh@hal.gnu.ai.mit.edu)
  
! 	* xdisp.c (redisplay_window): Don't use shortcut if window_end_vpos
! 	is out of date.
  
! Thu Jun 16 11:01:33 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* process.c (Fprocess_status): Return nil for process name
! 	that has no process.
  
! 	* dispnew.c (syms_of_display): Make baud-rate a user var.
  
! 	* syntax.c (scan_lists): Get error if eob within comment with depth!=0.
  
! Thu Jun 16 02:55:51 1994  Roland McGrath  (roland@geech.gnu.ai.mit.edu)
  
! 	* unexec.c: Include <sys/file.h> and [USG5] <fcntl.h> to define
!         O_* macros.
! 	(O_RDONLY, O_RDWR): Define if undefined.
! 	[emacs] (report_error): Use report_file_error so the user can tell
! 	what the errno code was.
! 	(unexec): Use O_RDONLY instead of explicit 0.
! 	(make_hdr): Don't undo A_TEXT_OFFSET adjustment #ifndef NO_REMAP,
! 	since it was never adjusted earlier #ifndef NO_REMAP.
! 	(adjust_lnnoptrs): Use O_RDWR instead of explicit 2.
  
! Wed Jun 15 16:11:16 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* xterm.c (x_noop_count): New variable.
! 	(x_term_init) [X_IO_BUG]: Init it.
! 	(XTread_socket) [X_IO_BUG]: Don't do XNoOp every time, just 1 in 100.
  
! Wed Jun 15 00:03:36 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* syssignal.h (sigblock) [USG5_4]: Define if not defined.
  
! Tue Jun 14 23:40:29 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* lread.c: Put config.h first.
  
! 	* hftctl.c: Put sys/signal.h and errno.h first, then config.h.
  
! 	* dired.c: Put stdio.h, sys/types.h and sys/stat.h after config.h.
  
! 	* callproc.c, dispnew.c, frame.c, term.h: Put stdio.h after config.h.
! 	* widget.c, xmenu.c, xterm.c: Put stdio.h after config.h.
  
! Tue Jun 14 20:17:16 1994  Karl Heuer  (kwzh@hal.gnu.ai.mit.edu)
  
! 	* sysdep.c (init_system_name): New function, replaces get_system_name.
! 	* lisp.h: declare it.
! 	* editfns.c (init_editfns): Call it.
! 	(get_system_name): New function, now just uses Vsystem_name.
! 	* xterm.c (x_term_init): Use Vsystem_name instead of calling
! 	get_system_name.
  
! 	* keymap.c (Fsingle_key_description): Allow strings as keys.
  
! 	* process.c (create_process): Set input_wait_mask before forking.
  
! Tue Jun 14 15:45:44 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* indent.c (vmotion): Use find_next_newline_no_quit.
! 	(indented_beyond_p): Likewise.
  
! 	* search.c (find_next_newline_no_quit): New function.
  
! 	* sysdep.c (init_sys_modes): Don't set up sigio here if window system.
  
! 	* keyboard.c (read_key_sequence): Verify event has a POSN_BUFFER_POSN
! 	before trying to extract it.
  
! 	* eval.c (init_eval_once): Call xmalloc, not malloc.
  
! 	* process.c (Fprocess_send_eof): Doc fix.
  
! Mon Jun 13 17:07:59 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* keyboard.c (interrupt_signal, init_keyboard):
! 	Don't handle SIGINT and SIGQUIT if using window system directly.
  
! 	* sysdep.c (init_sys_modes): Don't call set_terminal_modes
! 	if using a window system.
  
! 	* xterm.c (XTread_socket): Use x_top_window_to_frame in prev change.
  
! 	* s/sol2.h (SOLARIS2): Defined.
  
! 	* m/intel386.h: Add conditional for SOLARIS2.
  
! Mon Jun 13 16:55:30 1994  Karl Heuer  (kwzh@hal.gnu.ai.mit.edu)
  
! 	* xmenu.c (single_keymap_panes): gcpro some things.
  
! Mon Jun 13 15:44:51 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* xterm.c (XTread_socket): Handle Xatom_wm_save_yourself
! 	by calling XSetCommand.
  
! 	* emacs.c (init_cmdargs): Set up initial_argv, initial_argc.
  
! 	* keyboard.c (syms_of_keyboard): Properly init Vsystem_key_alist.
  
! 	* unexaix.c (adjust_lnnoptrs): Handle multiple aux symbols.
  
! Sun Jun 12 15:57:02 1994  Karl Heuer  (kwzh@hal.gnu.ai.mit.edu)
  
! 	* editfns.c (transpose_markers): Allow for gap at start of region.
! 	(Ftranspose_regions): Don't precompute pointers into buffer text.
  
! Sun Jun 12 08:42:36 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* xfns.c (x_window): Request "save yourself" commands.
  
! 	* callint.c (Fcall_interactively): Ignore `-' in string.
! 	(Fcall_interactively): Don't call minibuffer-window-active-p;
! 	determine directly whether a minibuf window is active.
  
! 	* keyboard.c (read_char): When we loop and call redisplay,
! 	do prepare_menu_bars first.
  
! Sat Jun 11 08:12:46 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* search.c (Freplace_match): Be sure not to treat non-digit like digit.
  
! 	* xmenu.c (xmenu_show): Don't call XMenuDestroy twice
! 	in XM_FAILURE case.
  
! 	* Makefile.in.in (xterm.o): Depend on dispextern.h.
  
! 	* s/sunos4-1-3.h (X_IO_BUG): Defined.
  
! Fri Jun 10 16:31:19 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* s/linux.h (CLASH_DETECTION): Defined.
  
! 	* minibuf.c (Fdisplay_completion_list):
! 	Require at least two spaces between items.
  
! Tue Jun  7 13:33:23 1994  Richard Stallman  (rms@geech.gnu.ai.mit.edu)
  
! 	* keyboard.c (command_loop_1):
! 	Treat nil in display tab like no display tab.
  
! Tue Jun  7 11:50:49 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* mips-siemens.h:  Include pyramid.h, not mips.h.
! 	(LOAD_AVE_TYPE, LOAD_AVE_CVT): Definitions deleted.
! 	(NO_ARG_ARRAY, HAVE_ALLOCA): Defined.
! 	(BROKEN_FIONREAD): Add #undef.
  
! Tue Jun  7 19:19:04 1994  Morten Welinder  (terra@diku.dk)
  
! 	* msdos.c (init_environment): Clean up code and make the default
! 	EMACSPATH equal to the directory from which Emacs was started.
! 	(emacsroot): New variable.
! 	(rootrelativepath): New function.
! 	* msdos.h: Add template for rootrelativepath.
! 	* lread.c [MSDOS]: #include "msdos.h".
! 	* callproc.c (init_callproc) [MSDOS]: Exclude less code, so ../etc
! 	is still tested for doc file.
  
! Mon Jun  6 21:11:13 1994  Karl Heuer  (kwzh@hal.gnu.ai.mit.edu)
  
! 	* fns.c (Fy_or_n_p, Fyes_or_no_p) [HAVE_X_MENU]: Redisplay before
! 	popping up a menu.
  
! 	* dispnew.c (Fframe_or_buffer_changed_p): Reuse the state vector.
  
! Mon Jun  6 08:37:39 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* frame.c (Ficonify_frame, Fmake_frame_invisible, Fmake_frame_visible):
! 	Increment windows_or_buffers_changed.
  
! 	* xdisp.c (redisplay): Don't call x_consider_frame_title.
! 	(display_mode_line): Likewise.
! 	(prepare_menu_bars): Call it here.
  
! Mon Jun  6 01:02:32 1994  Karl Heuer  (kwzh@hal.gnu.ai.mit.edu)
  
! 	* dispnew.c (Fframe_or_buffer_changed_p): New function.
  
! Sun Jun  5 07:13:01 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* xterm.c (x_wm_set_icon_position, x_wm_set_icon_pixmap):
! 	[USE_X_TOOLKIT]: Use top-level widget's window.
  
! 	* s/bsd386.h (BSD): Redefine.
! 	(WAITTYPE, WRETCODE, WCOREDUMP): New definitions.
! 	Include wait.h.
  
! 	* m/sun386.h (LIBS_MACHINE) [USG]: New #define.
  
! 	* xterm.c (x_term_init): New args xrm_option and resource_string.
! 	Pass an -xrm option to XtAppInitialize if appropriate.
  
! 	* xfns.c (Fx_open_connection): Set up Vx_resource_name and xrm_option
! 	before calling x_term_init.  Pass new args.
  
! 	* keyboard.c (modify_event_symbol): Return nil if out of range.
  
! 	* keymap.c (Fkey_description): Avoid using Fmapconcat--do it directly.
  
! 	* keyboard.c, dispnew.c: Include systime.h after xterm.h.
  
! 	* xfns.c (x_window): Take account of internal border of paned widget.
  
! 	* m/dos386.h (PURESIZE): Increased to 240000.
  
! 	* xfns.c (using_x_p): New function.
! 	* fns.c (Fy_or_n_p): Don't use dialog box if not an X frame.
! 	(Fyes_or_no_p): Likewise.
  
! Sat Jun  4 14:35:09 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* s/hpux9shr.h (C_DEBUG_SWITCH): Define as empty.
  
! Fri Jun  3 20:14:30 1994  Morten Welinder  (terra@diku.dk)
  
! 	* callproc.c [MSDOS]: #include "msdos.h" for rootrelativepath
! 	template.
  
! 	* msdos.c (run_msdos_command): Make local copy of argv[2] on stack,
! 	not on heap.
! 	(run_msdos_command): When changing argv[2] from using slashes to
! 	using backslashes, only do so on the first white-space delimited
! 	part.
  
! Thu Jun  2 19:41:08 1994  Karl Heuer  (kwzh@hal.gnu.ai.mit.edu)
  
! 	* textprop.c (Fprevious_single_property_change): Check for null
! 	interval after correcting for edge effects.
  
! 	* xdisp.c (display_text_line): Make sure pointer is in range.
  
! 	* xmenu.c (xdialog_show): Fix problem with message in dialog box.
  
! Thu Jun  2 15:11:57 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* emacs.c (main): Do the setpgrp after checking for -batch.
  
! 	* keyboard.c (command_loop_1): Properly handle nil in display table.
  
! 	* s/hpux9.h (C_SWITCH_SYSTEM): Put inside __GNUC__ conditional.
  
! Wed Jun  1 14:55:45 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
! 	* process.c (kill_buffer_processes): For net conn, use Fdelete_process.
  
! See ChangeLog.4 for earlier changes.
--- 1,4536 ----
! Sat May 25 15:30:10 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* Version 19.31 released.
  
! Sat May 25 10:41:39 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* m/sparc.h [__linux__] (A_TEXT_OFFSET, A_TEXT_SEEK): Don't define.
  
! Fri May 24 09:57:12 1996  Marcus Daniels  <marcus@sayre.sysc.pdx.edu>
  
! 	* xterm.c [SOLARIS2]: Include string.h.
  
! Fri May 24 15:06:04 1996  Andrew Innes  <andrewi@harlequin.co.uk>
  
! 	* w32fns.c: (Vwin32_mouse_move_interval): New lisp variable.
! 	(syms_of_win32fns): Add Vwin32_mouse_move_interval to syms.
! 	(saved_mouse_msg): Renamed to saved_mouse_button_msg.
! 	(timer_id): Renamed to mouse_button_timer.
! 	(saved_mouse_move_msg, mouse_move_timer): New variables.
! 	(win_msg_worker): Delete WM_TIMER code.
! 	(win32_wnd_proc): Handle WM_TIMER events here. Use separate timers
!  	for mouse down and mouse move (including scroll bar drag) events.
! 	Add new handling code for WM_VSCROLL and WM_MOUSEMOVE events.
! 	Only filter WM_MOUSEMOVE events when a button is held down.
! 	Always pass on message to DefWindowProc after calling 
! 	TranslateMessage.  Reset keyboard modifiers when losing focus.
  
! 	* w32term.c (x_scroll_bar_handle_click): Repaint scroll bar handle
! 	when drag is finished.
  
! Fri May 23 19:28:30 1996  Geoff Voelker  <voelker@joker.cs.washington.edu>
  
! 	* w32fns.c (win32_wnd_proc): When passing modifier keystrokes back
! 	to Windows, invoke TranslateMessage on them.
! 	(reset_modifiers): Don't reset Window's keyboard state.
  
! Thu May 23 12:15:27 1996  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* lread.c (init_lread): Init Vload_file_name to Qnil.
  
! Tue May 21 23:26:40 1996  Geoff Voelker  <voelker@joker.cs.washington.edu>
  
! 	* w32fns.c (modifier_set): Check toggle state of CapsLock even
! 	if modifiers are not being recorded.
  
! Tue May 21 20:35:54 1996  Andrew Innes  <andrewi@harlequin.co.uk>
  
! 	* nt.c (get_volume_info): Always update *pPath correctly, even if
! 	UNC header is incomplete.
  
! Tue May 21 10:29:10 1996  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* indent.c (compute_motion): When calling Fget_char_property,
! 	don't pass window if window is displaying the wrong buffer.
  
! 	* dispnew.c (init_display) [HAVE_LIBNCURSES]: If X, call tgetent.
  
! 	* keyboard.c (Fexecute_extended_command): Don't look for
! 	a key binding if executing a kbd macro.
  
! 	* print.c (Fprin1_to_string): Preserve Vdeactivate_mark.
  
! 	* systty.h [__GNU_LIBRARY__]: #include <sys/ioctl.h>.
  
! 	* cmds.c (internal_self_insert): Don't return 2 for auto-fill
! 	unless the auto_fill_function returns non-nil.
  
! Fri May 17 17:12:28 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* nt.h (struct _child_process): New member is_dos_process.
! 	* nt.c (_sys_read_ahead): Handle sleep here.
! 	(sys_read): Not here.
! 	(init_ntproc): Initialize can_run_dos_process, dos_process_running.
! 	* ntproc.c (Vwin32_pipe_read_delay): New var.
! 	(can_run_dos_process, dos_process_running): New vars.
! 	(win32_is_dos_binary): New function.
! 	(reap_subprocess, sys_spawnve): Use them.
! 	(syms_of_ntproc): Defvar and initialize Vwin32_pipe_read_delay.
  
! 	* xdisp.c (display_menu_bar) [HAVE_NTGUI]: Enable the display of
! 	menus in --no-window mode on NT.
  
! Fri May 17 02:10:20 1996  Geoff Voelker  <voelker@cs.washington.edu>
  
! 	* w32term.c (w32_read_socket): Mask out lower 4 bits of wParam
! 	for WM_SYSCOMMAND messages.
  
! Wed May 15 10:41:41 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* makefile.nt: Fix typo in previous patch.
  
! 	* callproc.c (Fcall_process): Don't close the same fd twice.
  
! Wed May 15 10:39:00 1996  Kim Storm  <storm@olicom.dk>
  
! 	* nt.c (sys_read): Introduce a small delay before reading from
! 	a pipe or socket to allow more data to be buffered; otherwise,
! 	process output is read one byte at a time on fast machines
! 	(which is slow).
  
! Tue May 14 14:59:18 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* w32select.c (QCLIPBOARD): New symbol.
! 	(Fx_selection_exists_p): New function.
! 	(syms_of_win32select): Initialize/staticpro and defsubr them.
  
! Mon May 13 15:56:50 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* makefile.nt (w32*.obj): Fix deps.
  
! Mon May 13 17:35:11 1996  Andrew Innes  <andrewi@harlequin.co.uk>
  
! 	* eval.c (Fsignal) [HAVE_WINDOW_SYSTEM]: Changed from
!  	HAVE_X_WINDOWS, so that TOTALLY_UNBLOCK_INPUT is called on Windows.
  
! 	* w32fns.c (win32_wnd_proc): Reenable quit_char detection.
  
! Mon May 13 11:24:15 1996  Richard Stallman  <rms@delasyd.gnu.ai.mit.edu>
  
! 	* w32menu.c: Include buffer.h.
!  	(set_frame_menubar): Make sure input is unblocked
! 	when we call create_menu_items.
! 	Switch temporarily to proper buffer, bind inhibit-quit to t,
! 	and run the same hooks as in smenu.c.
! 	(syms_of_win32menu): Initialize and staticpro Qdebug_on_next_call.
  
! 	* w32term.c (note_mouse_movement): Upwards mouse movement
! 	recognition corrected.
  
! Sun May 12 18:49:48 1996  Richard Stallman  <rms@delasyd.gnu.ai.mit.edu>
  
! 	* callproc.c (Fcall_process): Fix previous change (now !MSDOS only).
  
! Sun May 12 16:06:46 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* macros.c (Fstart_kbd_macro): Add missing xrealloc arg.
  
! Sun May 12 13:42:54 1996  Richard Stallman  <rms@delasyd.gnu.ai.mit.edu>
  
! 	* Makefile.in (MSDOS_SUPPORT): Use full name disp-table.elc.
  
! Sun May 12 11:32:48 1996  Eli Zaretskii  <eliz@is.elta.co.il>
  
! 	* dosfns.c (init_dosfns) [DJGPP >= 2]: Make `opendir' preserve
! 	filename case (under Win95) and find hidden files.
  
! 	* msdos.c (Fmsdos_downcase_filename): Don't change the argument,
! 	return a copy.
  
! Sat May 11 13:19:39 1996  Eli Zaretskii  <eliz@is.elta.co.il>
  
! 	* msdos.c (msdos_downcase_filename): New function to convert case
! 	in filenames.
! 	(Fmsdos_downcase_filename): New function.
! 	(syms_of_msdos): Defsubr it.
  
! 	* s/msdos.h (FILE_SYSTEM_CASE): Call Fmsdos_downcase_filename
! 	instead of Fdowncase.
  
! Sat May 11 16:56:25 1996  Geoff Voelker  <voelker@cs.washington.edu>
  
! 	* s/windowsnt.h (SYSTEM_PURESIZE_EXTRA): Macro defined.
  
! Sat May 11 14:39:08 1996  Andrew Innes  <andrewi@harlequin.co.uk>
  
! 	* w32term.c (x_scroll_bar_set_handle): Always use start
! 	in calling SetScrollPos.
! 	(x_scroll_bar_handle_click): In line up/down cases, don't alter y.
! 	Don't call x_scroll_bar_set_handle.
  
! 	* nt.c (map_win32_filename): If not a fat volume, cvt name to dos.
  
! Sat May 11 06:55:09 1996  Richard Stallman  <rms@delasyd.gnu.ai.mit.edu>
  
! 	* ntheap.c (allocate_heap): Clean up conditional.
  
! Sat May 11 02:37:28 1996  Geoff Voelker  <voelker@cs.washington.edu>
  
! 	* ntheap.c (allocate_heap): Bump heap base up to 27MB to
! 	satisfy Win95.
  
! Fri May 10 20:47:16 1996  Richard Stallman  <rms@delasyd.gnu.ai.mit.edu>
  
! 	* callproc.c (Fcall_process): Close fd_error if successful.
  
! Fri May 10 19:03:13 1996  Geoff Voelker  <voelker@cs.washington.edu>
  
! 	* w32fns.c (win32_wnd_proc): Disable setting of Vquit_flag
! 	at this point.
  
! Fri May 10 12:03:00 1996  Andrew Innes  <andrewi@harlequin.co.uk>
  
! 	* w32fns.c (win_msg_worker): Use post_msg.
! 	(win32_wnd_proc): Don't abort if button_state & this, just return.
! 	Use post_msg instead of my_post_msg in some places.
! 	(win32_to_x_font): Major rewrite.
! 	(struct enumfont_t): New element logfont.
! 	(enum_font_cb2): Add special code for TRUETYPE_FONTTYPE.
! 	(Fx_list_fonts): Call x_to_win32_font.
  
! 	* w32term.c (x_scroll_bar_move): Call my_show_window.
! 	(x_scroll_bar_clear): Likewise.
  
! 	* ntterm.c (prev_console_mode): New variable.
! 	(unset_kbd): Use prev_console_mode.
! 	(reset_kbd): Set prev_console_mode.  Call Fset_input_mode.
  
! 	* emacs.c (main) [WINDOWSNT]: Call syms_of_ntproc.
  
! 	* ntproc.c (Vwin32_quote_process_args): New variable.
! 	(sys_spawnve): If Vwin32_quote_process_args, quote the args.
! 	(syms_of_ntproc): Set up Lisp variable.
  
! Fri May 10 12:03:00 1996  Richard Stallman  <rms@delasyd.gnu.ai.mit.edu>
  
! 	* xterm.c (x_connection_signal_1): Call x_connection_closed properly.
  
! Wed May  8 13:13:26 1996  Richard Stallman  <rms@delasyd.gnu.ai.mit.edu>
  
! 	* msdos.c (syms_of_msdos): Fix typo.
  
! Tue May  7 20:03:37 1996  Richard Stallman  <rms@delasyd.gnu.ai.mit.edu>
  
! 	* termhooks.h (enum scroll_bar_part): Delete extra comma.
  
! Mon May  6 00:04:12 1996  Richard Stallman  <rms@delasyd.gnu.ai.mit.edu>
  
! 	* msdos.c (Fmsdos_long_file_names): New function.
! 	(syms_of_msdos): Defsubr it.
  
! 	* s/msdos.h (GMALLOC_INHIBIT_VALLOC): Defined.
  
! 	* casetab.c (set_case_table): Set upcase_table, case_canon_table
! 	and case_eqv_table in the buffer.
  
! 	* casefiddle.c (casify_region, casify_object):
! 	If case table has been changed, call Fset_case_table.
  
! Sat May  4 23:58:05 1996  Richard Stallman  <rms@delasyd.gnu.ai.mit.edu>
  
! 	* editfns.c (Fencode_time): Accept MANY args, so as to cope
! 	with the value of decode-time.
  
! Fri May 03 16:31:54 1996  Andrew Innes  <andrewi@harlequin.co.uk>
  
! 	* keyboard.c (Qup, Qdown): New variables.
! 	(syms_of_keyboard): Initialize and staticpro.
! 	(scroll_bar_parts): Add Qup and Qdown.
! 	(make_lispy_event) [WINDOWSNT]: Handle win32_scroll_bar_click.
  
! 	* termhooks.h (enum scroll_bar_part): New alternatives
! 	scroll_bar_up_arrow, scroll_bar_down_arrow.
! 	(win32_scroll_bar_click): New enum constant.
! 	
! Fri May  3 14:30:22 1996  Andrw Innes <andrewi@harlequin.co.uk>
  
! 	* makefile.nt (SUBSYSTEM) [NTGUI]: Remove conditional.
! 	(LINK_FLAGS): Explicitly set base address, and stack and heap sizes.
! 	(nt.obj): Add dependency to nt.h.
  
! 	* nt.c (nt_ctime): Function renamed to sys_ctime.  
  
! 	Undefine macros for shadowed CRT functions.
! 	(nt_stat, get_unassigned_drive_letter, is_toplevel_share_name,
!  	stat_toplevel_share): Functions deleted.
  
! 	Include sys/socket.h and
!  	undefine macros for shadowed socket functions.
  
! 	(getwd): Return NULL if GetCurrentDirectory fails.
  
! 	(gethostname) [!HAVE_SOCKETS]: Replace with winsock version.
  
! 	(nt_sleep): Renamed to sys_sleep.
  
! 	(rename): Renamed to sys_rename. Always rename to a temporary name
!  	first on Windows 95.  Unlink new name first if necessary.
  
! 	(dir_finding): Variable deleted.
! 	(dir_is_fat, dir_pathname): New variables.
  
! 	(openddir): Fail if dir_find_handle is in use. Save directory name
!  	in dir_pathname, and set dir_is_fat appropriately.
! 	(closedir, readdir): Use dir_find_handle in place of dir_finding.
! 	(readdir): Copy directory name from dir_pathname on first
!  	call. Use IS_DIRECTORY_SEP instead of IS_ANY_SEP.  Force filename
!  	to be lower case on FAT volumes.
  
! 	(getpwuid): Move struct passwd initialization to init_user_info,
! 	return information for current user if uid matches.
  
! 	(getuid, geteuid): Return uid determined by init_user_info.
! 	(getgid, getegid): New functions.
  
! 	(getpwnam): Ignore case when comparing name.
! 	(init_user_info): New function.  Determine user name and id from
! 	NT security calls if possible, otherwise try Windows networking
! 	calls before falling back to hard-coded defaults.  Ensure HOME and
! 	SHELL environment variables are set.
  
! 	(unixtodos_filename): New function.
  
! 	(REG_ROOT): Trailing backslash removed.
  
! 	(init_environment): Call init_user_info.
  
! 	(get_inode_and_device_vals, pipe_with_inherited_out,
!  	pipe_with_inherited_in): Functions deleted.
  
! 	(prepare_standard_handles, reset_standard_handles): Moved to
! 	ntproc.c and simplified to match other changes (all handles are
! 	already non-inheritable).
  
! 	(get_emacs_configuration): Detect Windows flavour (Win95 or NT) at
! 	run-time.  Change OS name for Windows 95 to be "win95".
  
! 	(fd_info): New variable. Array of extra info for file descriptors
! 	needed for pipe/socket support.
  
! 	(utc_base_ft, utc_base, init): New internal variables used for
! 	implementing stat.
! 	
! 	(get_volume_info, is_fat_volume, map_win32_filename, convert_time,
! 	convert_from_time_t, hashval, generate_inode_val): New
! 	internal support functions for shadowed C library functions.
  
! 	(sys_access, sys_chdir, sys_chmod, sys_link, sys_mkdir,
! 	sys_mktemp, sys_rmdir, sys_unlink): Call map_win32_filename
! 	before calling shadowed C library function.
  
! 	(sys_fopen, sys_open): Map file names, and ensure file handle is
!  	non-inheritable.
  
! 	(stat): Replace buggy library function.  Fake reaonsable i-node
! 	values by hashing the canonical file name, and use uid/gid values
! 	determined by init_user_info.
  
! 	(term_winsock, init_winsock, set_errno, check_errno)
!  	[HAVE_SOCKETS]: New internal socket support functions (plus
!  	associated variables) required to support dynamic linking to
!  	Windows socket library.
  
! 	(sys_socket, sys_bind, sys_connect, sys_htons, sys_ntohs,
!  	sys_inet_addr, sys_gethostname, sys_gethostbyname,
!  	sys_getservbyname) [HAVE_SOCKETS]: New functions to provide
!  	dynamically loaded interface to Windows socket library.
  
! 	(sys_close, sys_dup, sys_dup2, sys_read, sys_write): New wrappers
! 	for C library functions to handle sockets and pipes.
  
! 	(sys_pipe): Make pipe handles non-inheritable, and set binary mode
! 	as required.
  
! 	(_sys_read_ahead): New internal support function for pipe/socket
!  	support in sys_select.
  
! 	(term_ntproc): New function.
! 	(init_ntproc): New function to initialise socket support and make
! 	initial std handles non-inheritable.  Also ensure stdin, stdout
! 	and stderr have valid handles so that pipes and sockets can't
! 	inadvertently use fd 0, 1, or 2.
  
! 	* nt.h: Check to see if already included.
! 	(fd_set, filedesc): New structures.
! 	(child_process, MAX_CHILDREN, CHILD_ACTIVE): Definitions moved 
! 	from ntproc.c.
! 	(FD_SET, FD_CLR, FD_ISSET, FD_ZERO): Operate on fd_set structures.
! 	(SELECT_TYPE): New macro.
! 	New child process status enumeration.
! 	(FILE_READ, FILE_WRITE, FILE_BINARY, FILE_PIPE, FILE_SOCKET): 
! 	New macros.
! 	(fd_info, new_child, delete_child): Declared.
  
! 	* ntheap.c: Include lisp.h.
! 	(allocate_heap): Use VALBITS to determine size of heap.
! 	(allocate_heap) [WINDOWS95]: Conditional code removed.
! 	(sbrk): Use VALMASK instead of an unsigned integer mask.
  
! 	* ntinevt.c (win32_kdb_patch_key): Initialize isdead.
! 	(key_event) [HAVE_NTGUI]: Use Windows key code.
  
! 	* ntproc.c: Include config.h after CRT headers. Include fcntl.h.
! 	(child_process, MAX_CHILDREN, CHILD_ACTIVE): Moved to nt.h.	
! 	(DebugPrint): New macro.
! 	(new_child): Create input event structures for child processes.
! 	(delete_child): New function.
! 	(reader_thread): Return nonzero upon failure.  Use _sys_read_ahead.
! 	(create_child): Add child_process and parent PID arguments.  
! 	Don't create input event or thread structures here.
! 	Fixup Win95 negative process IDs.
! 	(register_child): Don't set consumed event; instead, set thread
! 	status so that select will release it.
! 	(remove_child): Renamed to reap_process.  Only free resources
! 	of synchronous children.
! 	(win32_wait): Renamed to sys_wait.  Sanity check to make sure
! 	handle to subprocess exists.  Don't reclaim thread resources here.
! 	(win32_spawnve): Renamed to sys_spawnve.  
! 	Check for proper wait mode first thing.
! 	Convert command name to DOS format.
! 	Quote whitespace and quotes in arguments to subprocess.
! 	Use alloca instead of malloc.
! 	If max subprocesses, return EAGAIN in hopes of another completing.
! 	(sys_select): Add support for socket input.  Remove dead code.
! 	Check input from children fairly.
! 	(sys_select) [HAVE_TIMEVAL]: Remove conditional check and code.
! 	(win32_kill_process): Renamed to sys_kill.  Use OpenProcess
! 	to terminate process.
! 	(prepate_standard_handles, reset_standard_handles): Moved here 
! 	from nt.c.
  
! 	* ntterm.c (reset_kbd): Try to use interrupt input.
! 	
! 	* unexnt.c (WinMain): Function removed.
! 	(_start) [HAVE_NTGUI]: Don't invoke WinMain, but do set up
! 	WinMain args as crt0.c would.
  
! 	* w32fns.c (quit_char, Vwin32_enable_italics, Vwin32_enable_palette): 
! 	New variables.
! 	(syms_of_win32fns): Set up new lisp variables.
! 	
! 	(Fwin32_rgb): Dead procedure removed.
! 	(Fwin32_define_rgb_color, Fwin32_load_color_file, win32_map_color,
! 	win32_regenerate_palette, win32_unmap_color): New functions.
! 	(syms_of_w32fns): Set up new lisp functions.
! 	(define_color): Use palettes.  Simulate use of PALETTE_RGB to
! 	use closest color instead of dithering.
! 	(map_mode): Function removed.
! 	(WIN32_COLOR, SET_WIN32_COLOR): New macros.
! 
! 	(win32_init_class): Don't set CS_OWNDC in the WNDCLASS style.
! 	(win32_createwindow): Invoke ShowWindow to discard defaults
! 	from parent.
! 	(win32_wnd_proc): Use separate critical sections appropriately.
! 	Handle palette change, show window, and set window position messages.
! 	Record WINDOWPLACEMENT structure length.
! 	Detect quit_char.
! 	(Fx_create_frame): Set scrollbar width to be the system standard.
! 
! 	(Ffocus_frame, Funfocus_frame): Functions now do nothing.
! 
! 	(x_to_win32_weight, win32_to_x_weight): Handle "heavy", "extrabold",
! 	"light", "extralight", and "thin" fonts.
! 	(x_to_win32_charset, win32_to_x_charset): New functions.
! 	(win32_to_x_font): Use new height units.  Use win32_to_x_charset.
! 	(x_to_win32_font): Use x_to_win32_charset.  Support Win32 font names
! 	in addition to X font names.
! 
! 	(win32_load_font, Fx_list_fonts, Fx_display_color_cells, 
! 	Fx_display_mm_height, Fx_display_mm_width: Use GetDC directly.
! 
! 	(Fx_open_connection): Support external color mapping files.
! 
! 	(win32_abort): Map abort button to abort, retry to debug, and
! 	ignore to continue.
! 
! 	* w32reg.c (REG_ROOT): Remove trailing backslash.
! 
! 	* w32select.c (Fwin32_set_clipboard_data, Fwin32_get_clipboard_data): 
! 	Calculate exact size of clipboard string with CRs removed or inserted.
! 
! 	* w32term.c (Vwindow_system): Declared.
! 	(win32_fill_rect, dumpglyphs, do_line_dance, x_draw_box): 
! 	Use Get/ReleaseFrameDC.
! 
! 	(pixel_to_glyph_coords): Support tty mode.
! 	(w32_read_socket): Explicitly use FALSE. 
! 	Handle WM_PALLETTECHANGED event.
! 	(parse_button): Handle mouse button emulation.
! 
! 	(my_show_window, my_set_window_pos): New functions.
! 	(x_set_offset, x_set_window_size, x_raise_frame, x_lower_frame): 
! 	Use my_set_window_pos.
! 	(x_make_frame_visible, x_iconify_frame): Use my_show_window.
! 
! 	(x_draw_box): Don't trim right and bottom.
! 	(x_make_frame_visible): Don't invoke SetForgroundWindow.
! 
! 	(win32_term_init): Use GetDC directly.  Initialize palette
! 	and win32_num_mouse_buttons.
! 	(win32_update_begin): Regenerate palette if necessary.
! 	(x_delete_display): Free palette.
! 
! 	(win32_initialize) [ATTACH_THREADS]: Only AttachThreadInput if
! 	conditional is defined.
! 
! 	* w32term.h (struct win32_palette_entry): New structure.
! 	(win32_display_info): New fields has_palette, p_colors_in_use, 
! 	n_colors_in_use, h_palette.
! 	(win32_output): New field h_old_palette.
! 	(WM_EMACS_SETWINDOWPOS): New macro.
! 	(WM_EMACS_DESTROY_WINDOW): Value redefined.
! 	(win32_window_pos): New structure.
! 	(GetFrameDC, ReleaseFrameDC): Functions declared.
! 
! 	(my_get_dc): Macro undefined.
! 	(map_mode): Function declaration removed.
! 	(enter_crit, leave_crit): Function declarations changed to macros.
! 
! 	* w32xfns.c: Include frame.h.
! 	(hEvent): Renamed to h_input_available.
! 	(init_crit, delete_crit, get_next_msg, post_msg): 
! 	Use h_input_available.
! 	(GetFrameDC, ReleaseFrameDC): New functions.
! 	(leave_crit): Function removed.
! 
! 	* s/windowsnt.h: Include string.h.
! 	(HAVE_FREXP, HAVE_FMOD): Macros removed.
! 	(struct timeval, struct timezone, gettimeofday): Declarations removed.
! 	(HAVE_SOCKETS, MAIL_USE_POP, MAIL_USE_SYSTEM_LOCK): Macros defined.
! 	(DIRECTORY_SEP): Use Vdirectory_sep_char.
! 	(EXEC_SUFFIXES): Add .cmd to list of suffixes.
! 	(HAVE_SYS_TIMEB_H, HAVE_SYS_TIME_H, HAVE_UNISTD_H, STDC_HEADERS,
! 	TIME_WITH_SYS_TIME, HAVE_GETTIMEOFDAY, HAVE_CLOSEDIR, 
! 	HAVE_LONG_FILE_NAMES, HAVE_BCOPY, HAVE_BCMP, HAVE_LOGB, HAVE_FREXP,
! 	HAVE_FMOD, HAVE_FTIME, HAVE_MKTIME, HAVE_H_ERRNO): New macros.
! 	(access, chdir, chmod, close, creat, ctime, dup, dup2, fopen,
! 	link, mkdir, mktemp, open, pipe, read, rename, rmdir, select,
! 	sleep, unlink, write, spawnve, wait, kill, signal): 
! 	Macros redefined from win32_* to sys_*.
! 	[__STDC__]: Define when including direct.h, io.h, stdio.h.
! 	(struct nt_stat): Definition removed.
! 	(stat, st_dev, st_ino, st_mode, st_nlink, st_uid, st_gid,
! 	st_rdev, st_size, st_atime, st_mtime, st_ctime): Macros undefined.
  
! 	* s/windows95.h: File removed.
  
! Thu May  2 18:07:27 1996  Richard Stallman  <rms@delasyd.gnu.ai.mit.edu>
  
! 	* keyboard.c (Fthis_single_command_keys): New function.
! 	(syms_of_keyboard): defsubr it.
! 	(this_single_command_key_start): New variable.
! 	(add_command_key): Reduce this_single_command_key_start if nec.
! 	(command_loop_1): Clear this_single_command_key_start if nec.
! 	(Fread_key_sequence, Fexecute_extended_command): Likewise.
! 	(read_key_sequence): Set this_single_command_key_start.
! 	(command_loop_1): Clear echo area while inhibit-quit is still t.
  
! Wed May  1 15:11:47 1996  Richard Stallman  <rms@delasyd.gnu.ai.mit.edu>
  
! 	* keyboard.c (Fevent_convert_list): Never treat last elt as modifier.
  
! 	* buffer.c (add_overlay_mod_hooklist): Fix call to bcopy.
  
! 	* insdel.c (signal_after_change): Correct the arg to
! 	report_overlay_modification.
  
! 	* s/sol2-4.h (C_SWITCH_X_SYSTEM): Definition moved from sol2.h.
  
! 	* s/sol2.h (C_SWITCH_X_SYSTEM): Definition moved to sol2-4.h.
  
! Wed May  1 09:57:52 1996  Eli Zaretskii  <eliz@is.elta.co.il>
  
! 	* msdos.c (dos_get_modifiers): Restore missing comment terminator.
! 	(getdefdir): Rewrite to call `_fixpath' instead of `intdos'.
! 	(run_msdos_command) [DJGPP > 1]: Work around some MSDOS
! 	command-line restrictions by running shell commands via `system'
! 	instead of `spawnve'.
  
! 	* fileio.c (Fexpand_file_name) [DOS_NT]: Correct the `if' clause
! 	to compile on all platforms.
  
! Tue Apr 30 15:08:07 1996  Richard Stallman  <rms@delasyd.gnu.ai.mit.edu>
  
! 	* xterm.c [USE_X_TOOLKIT]: Include X11/Shell.h.
!  	(x_wm_set_icon_pixmap) [USE_X_TOOLKIT]: Tell widget the new pixmap.
  
! Mon Apr 29 12:32:06 1996  Andrew Innes  <andrewi@harlequin.co.uk>
  
! 	* fileio.c (Fexpand_file_name) [DOS_NT]: Keep dir sep following ~
! 	or ~user, but don't collapse the newdir prefix in that case.
  
! Fri Apr 26 20:54:53 1996  Richard Stallman  <rms@delasyd.gnu.ai.mit.edu>
  
! 	* keyboard.c (make_lispy_event): FRAME_MENU_BAR_ITEMS now has
! 	four elements per item.  Add a separate slot for the hpos.
! 	(menu_bar_items): Likewise.
! 	(menu_bar_item): Initialize the hpos slot to 0.
  
! 	* xdisp.c (display_menu_bar): FRAME_MENU_BAR_ITEMS now has
! 	four elements per item.
! 	(update_menu_bar): If we update FRAME_MENU_BAR_ITEMS,
! 	also set w->update_mode_line.
  
! 	* xmenu.c (set_frame_menubar): FRAME_MENU_BAR_ITEMS now has
! 	four elements per item.
  
! 	* w32menu.c (get_frame_menubar_event, set_frame_menubar):
! 	FRAME_MENU_BAR_ITEMS now has four elements per item.
  
! 	* fileio.c (Fexpand_file_name, Ffile_name_absolute_p): Doc fixes.
! 	(Ffile_exists_p, Ffile_executable_p, Ffile_readable_p)
! 	(Ffile_writable_p, Ffile_directory_p, Ffile_regular_p) 
! 	(Ffile_modes, Fset_file_modes, Ffile_newer_than_file_p)
! 	(expand_and_dir_to_file): Rename abspath to absname.
  
! Fri Apr 26 16:28:47 1996  Andrew Innes  <andrewi@harlequin.co.uk>
  
! 	* fileio.c (Fexpand_file_name) [!DOS_NT]: Fix incorrect expansion of
! 	"/foo/../bar" -> "//bar".  Delete relpath variable.
  
! 	* fileio.c (CORRECT_DIR_SEPS) [DOS_NT]: New macro.
! 	(IS_DRIVE) [DOS_NT]: Added separate definitions for DOS and NT.
! 	(Ffile_name_directory) [DOS_NT]: Simplify code to match change in
!  	getdefdir in msdos.c.  Ignore embedded colons.  Correct dir seps.
! 	(Ffile_name_nondirectory) [DOS_NT]: Ignore embedded colons.
! 	Correct IS_ANY_SEP to IS_DIRECTORY_SEP.  
! 	(file_name_as_directory) [DOS_NT]: Correct dir seps.
! 	Correct IS_ANY_SEP to IS_DIRECTORY_SEP.
! 	(directory_file_name) [DOS_NT]: Correct dir seps.
! 	(Fmake_temp_name) [DOS_NT: Correct dir seps.
! 	(Fexpand_file_name) [DOS_NT]: Remove relpath, tmp and
!  	defdir variables; init drive to 0.
!   	Correctly detect when default_directory is absolute.
!   	Be strict when looking for MSDOS drive specifier; defer calling
! 	getdefdir.  Ignore drive specifier if name now has UNC prefix.
!   	Correctly recognise if name is not absolute when trying simple
!  	method to expand; return original string if possible.
!   	Skip dir sep after ~ or ~user.
!   	Use getpwnam instead of HOME for ~user on NT.
!   	Handle error return from getdefdir.
!   	Correctly detect if newdir is absolute before using default_directory.
!   	Handle case where newdir is not absolute - expand relative to
!  	current working dir if necessary (instead of calling getdisk
!  	later).  Only keep UNC prefix if nm starts with dir sep.
!   	Replace kludgy handling of drive spec in newdir.  Correct dir seps.
! 	(Fsubstitute_in_file_name) [DOS_NT]: Correct dir seps for NT as
!  	well.  Merge equivalent #ifdef APOLLO and WINDOWSNT cases.  Ignore
!  	embedded colons and be strict about drive specs.
! 	(Fcopy_file) [DOS_NT]: Do dev/inode check on NT.
! 	(Ffile_name_absolute_p) [DOS_NT]: Be strict about drive specs.
! 	(check_executable) [DOS_NT]: Test st_mode on NT.
! 	(Ffile_readable_p) [DOS_NT]: Use access instead of open on NT.
! 	(Ffile_modes) [DOS_NT]: Don't embelish st_mode value on NT.
! 	(Fread_file_name) [DOS_NT]: Correct dir seps in HOME.
! 	(syms_of_fileio): Add Vdirectory_sep_char.
  
! 	* msdos.c (getdefdir): Include drive letter and colon when
!  	constructing default directory for drive.
  
! Fri Apr 26 12:21:05 1996  Richard Stallman  <rms@delasyd.gnu.ai.mit.edu>
  
! 	* xterm.c (x_scroll_bar_clear): Do nothing if frame now has no
! 	scroll bars.
  
! 	* xfns.c (x_window) [! USE_X_TOOLKIT]: Initialize wm_hints.icon_pixmap.
  
! Fri Apr 26 00:10:48 1996  Andrew Innes  <andrewi@harlequin.co.uk>
  
! 	* callproc.c (Fcall_process) [WINDOWSNT]: Remove conditional NT code.
! 	(Fcall_process_region) [DOSNT]: Canonicalize slashes in filename.
! 	(child_setup) [WINDOWSNT]: Decrease handles array by one.
  
! 	* dired.c (Ffile_attributes) [WINDOWSNT]: Remove conditional NT code.
  
! 	* emacs.c (main) [WINDOWSNT]: Invoke init_ntproc.
! 	(shut_down_emacs) [WINDOWSNT]: Invoke term_ntproc.
  
! 	* lisp.h [WINDOWS_NT]: Declare Vdirectory_sep_char.
  
! 	* lread.c (close_load_descs) [WINDOWS_NT]: Don't actually do anything.
  
! 	* process.c (Fopen_network_stream): Set process infd to inch.
! 	(create_process, read_process_output, Fsignal_process) [WINDOWSNT]: 
! 	Remove conditional NT code.
  
! 	* syssignal.h (EMACS_KILLPG) [WINDOWSNT]: Invoke kill instead of
! 	win32_kill_process.
  
! 	* term.c (FRAME_TERMCAP_P) [WINDOWSNT && !HAVE_NTGUI]: Remove
! 	conditional for HAVE_NTGUI.
  
! Thu Apr 25 22:01:12 1996  Eli Zaretskii  <eliz@is.elta.co.il>
  
! 	* msdos.c (getdefdir) [DJGPP > 1]: Use 32-bit ESI to pass buffer
! 	address to `intdos' instead of SI which can be 16-bit.
  
! Thu Apr 25 13:31:31 1996  Richard Stallman  <rms@delasyd.gnu.ai.mit.edu>
  
! 	* lread.c (read_escape): Detect READCHAR reporting eof.
  
! 	* editfns.c (save_excursion_restore): Add gcpros.
  
! 	* unexelf.c (unexec): Add conditional for SOLARIS_POWERPC.
  
! 	* fileio.c (syms_of_fileio): Doc fix.
  
! Wed Apr 24 18:29:49 1996  Richard Stallman  <rms@delasyd.gnu.ai.mit.edu>
  
! 	* xfns.c (Fx_list_fonts) [BROKEN_XLISTFONTSWITHINFO]:
! 	Free the font, and the fontinfo too if we don't want it.
  
! 	* xterm.c (x_connection_signal): Call sigunblock properly.
  
! Tue Apr 23 14:53:05 1996  Richard Stallman  <rms@delasyd.gnu.ai.mit.edu>
  
! 	* dispnew.c: Include blockinput.h.
! 	(change_frame_size_1): Block input around the real work.
  
! 	* Makefile.in (dispnew.o): Depend on blockinput.h.
  
! Sun Apr 21 03:42:37 1996  Richard Stallman  <rms@delasyd.gnu.ai.mit.edu>
  
! 	* process.c (wait_reading_process_input, both definitions): 
! 	If wait_for_cell, don't call timer_check, and use
! 	detect_input_pending instead of detect_input_pending_run_timers.
  
! 	* frame.c (Fframe_parameters, both definitions): 
! 	Get sizes from FRAME_NEW_HEIGHT, FRAME_NEW_WIDTH if they are nonzero.
  
! Sat Apr 20 12:46:15 1996  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* indent.c (compute_motion): Pass window to Fget_char_property.
  
! Fri Apr 19 05:21:19 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* keyboard.c (read_key_sequence):
! 	Fix confusion between key and new_key.
  
! Thu Apr 18 02:04:22 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* keyboard.c (syms_of_keyboard): Doc fix.
  
! Wed Apr 17 23:38:46 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xterm.h (STANDARD_EVENT_SET): Remove PointerNotifyHintMask.
! 	* widget.c (EmacsFrameRealize): Use STANDARD_EVENT_SET.
! 	* xterm.c (note_mouse_movement): Don't call XQueryPointer.
! 	(x_scroll_bar_note_movement): Don't call XQueryPointer.
  
! 	* xterm.c (x_new_font): Intern FONT just once for finding full name.
  
! 	* xterm.h (CHECK_X_FRAME): Macro deleted.
! 	
! Tue Apr 16 18:29:34 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xdisp.c (decode_mode_spec): For %F, use explicit name or `Emacs'.
! 	(decode_mode_spec): Use frame F, not selected frame.
! 	On termcap frames, implicit names are ok.
  
! Tue Apr 16 17:48:40 1996  Andrew Innes  <andrewi@harlequin.co.uk>
  
! 	* w32term.c (w32_read_socket): Initialize frame_or_window field.
! 	(x_make_frame_visible): Don't call SetForegroundWindow
! 	after x_set_offset.
! 	(win32_initialize): Call AttachThreadInput at the end.
  
! 	* w32fns.c (defined_color): Map color to nearest in default palette.
! 	(win32_wnd_proc): Special handling for WM_CLOSE.
  
! Tue Apr 16 11:03:00 1996  Kim Storm <storm@olicom.dk>
  
! 	* msdos.c (check_timer): Removed; use gettime instead.
! 	(sys_select): Call __dpmi_yield while waiting for input to
! 	improve multitasking behaviour.
! 	Do not check timer when no timeout.
  
! Tue Apr 16 12:10:12 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* buffer.c (syms_of_buffer): Doc fix.
  
! Mon Apr 15 15:06:25 1996  Eli Zaretskii  <eliz@is.elta.co.il>
  
! 	* process.c (wait_reading_process_input) [!subprocesses]:
! 	Get rid of the loop around the detect_input_pending call.
  
! Sun Apr 14 18:05:26 1996  Eli Zaretskii  <eliz@is.elta.co.il>
  
! 	* process.c (wait_reading_process_input) [!subprocesses]: Handle
! 	the case of READ_KBD being a cons cell.  Retry the timer check
! 	after a timer fired.  (All of these make this definition
! 	consistent with the one that supports async subprocesses.)
  
! Sat Apr 13 00:36:55 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* process.c (wait_reading_process_input, both definitions):
! 	Use plain detect_input_pending just before the select call.
! 	(wait_reading_process_input) [subprocesses]: 
! 	Get rid of the loop around the detect_input_pending call.
! 	
! 	* editfns.c (Fcompare_buffer_substrings): Fix dumb bug handling
! 	buffer name as second arg.
  
! 	* xfns.c (x_set_frame_parameters): Get height and width from
! 	FRAME_NEW_WIDTH and FRAME_NEW_HEIGHT if nonzero.
  
! Fri Apr 12 11:27:30 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* emacs.c (main) [MSDOS]: Always call tzset, not init__gettimeofday.
  
! 	* editfns.c (Fformat_time_string): Doc fix. 
  
! Thu Apr 11 23:25:43 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* keyboard.c (read_char): Use detect_input_pending_run_timers
! 	before redisplay, not detect_input_pending.
! 	(readable_events): Don't touch timers at all if DO_TIMERS_NOW is 0.
! 	(timer_check): Always run timers directly.
! 	Bind inhibit-quit to t here.
  
! 	* process.c (wait_reading_process_input, both definitions):
! 	Don't call detect_input_pending; use detect_input_pending_run_timers.
  
! Thu Apr 11 15:31:25 1996  Erik Naggum  <erik@naggum.no>
  
! 	* emacs.c (standard_args): Synchronize with startup.el.
  
! Thu Apr 11 13:48:08 1996  Eli Zaretskii  <eliz@is.elta.co.il>
  
! 	* msdos.c: Include signal.h.
! 	(__write) [DJGPP == 2.0]: New function, avoids
! 	calling `malloc' while writing to a text file, so that buffer
! 	text being written won't be relocated.
! 	(abort) [DJGPP > 1]: Generate traceback, to identify the abort
! 	cause.
  
! 	* emacs.c (main) [DJGPP v2]: Make standard streams use binary mode.
! 	Call `tzset' instead of `init_gettimeofday'.
! 	
! 	* fileio.c [MSDOS]: If DJGPP version 2, include fcntl.h and string.h.
  
! 	* lread.c [MSDOS]: If DJGPP version 2, include unistd.h.
! 	Include msdos.h somewhat earlier.  For X_OK.
  
! 	* unexec.c [DJGPP v2]: Include fcntl.h.
! 	(copy_text_and_data) [DJGPP v2]: Momentarily restore
! 	the hardware exceptions table before dumping it.
  
! 	* sysdep.c [DJGPP]: Declare `etext' and `start'.
! 	(wait_for_termination) [DJGPP]: Do not wait for child on MS-DOS.
! 	(sys_subshell): Ignore signals while sub-shell runs.
  
! 	* sysdep.c [DJGPP v2] (etext, start): Declared.
! 	(wait_for_termination) [DJGPP v2]: Just exit.
  
! 	* s/msdos.h (DATA_START, TEXT_START, TEXT_END, _NAIVE_DOS_REGS)
! 	(POSIX_SIGNALS): Define if DJGPP v2.
!  	(LIBS_SYSTEM, chdir, NO_MODE_T, TEXT_START, NO_MATHERR)
! 	(LOCALTIME_CACHE, tzset): Don't define if DJGPP v2.
  
! 	* msdos.c [MSDOS]: If DJGPP version 2, include fcntl.h.
! 	(_crt0_startup_flags): Initialize to work
! 	correctly both with and without GNU `malloc' and `ralloc'.
! 	(internal_terminal_init): Use only 3 bits when setting background
! 	colors.
! 	(init_environment): Call tzset, not init_gettimeofday.
! 	(ctrl_break_vector, ctrl_break_regs): Don't define if DJGPP v2.
! 	(ctrl_break_func, install_ctrl_break_check): Don't define if DJGPP v2.
! 	(dos_ttraw) [DJGPP v2]: Don't call install_ctrl_break_check.
! 	Call setmode at the end and exit.
! 	(dos_ttcooked) [DJGPP v2]: Call setmode at the end and exit.
! 	(gethostname, gettimeofday): Don't define if DJGPP v2.
!  	(alarm, fork, kill, nicr, pause, sigsetask): Don't define if DJGPP v2.
  
! Thu Apr 11 11:19:38 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xdisp.c (redisplay_window): Move w->start marker before
! 	running window-scroll-functions (in scroll_step case).
  
! Thu Apr 11 01:54:10 1996  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
  
! 	* syswait.h: Remove `|| defined (LINUX)' from #if condition.
  
! 	* s/lignux.h: Define HAVE_WAIT_HEADER.
  
! Thu Apr 11 00:10:01 1996  Geoff Voelker  <voelker@cs.washington.edu>
  
! 	* w32fns.c (win32_color_map): Use PALETTERGB instead of RGB.
  
! 	* w32term.h (BLACK_PIX_DEFAULT, WHITE_PIX_DEFAULT): Use PALETTERGB
!  	instead of RGB.
  
! Wed Apr 10 13:04:06 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* term.c (calculate_ins_del_char_costs): Use proper frame's width.
  
! 	* frame.c (make_frame_without_minibuffer): Don't change the
! 	mini_window's buffer if it already displays a minibuffer.
  
! 	* xfns.c (Fx_list_fonts): Handle X protocol errors.
  
! Tue Apr  9 20:58:51 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* minibuf.c (read_minibuf): GCPRO ambient_dir.
  
! Mon Apr  8 19:11:41 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* frame.c (Fset_frame_size): Do call Fset_frame_size
! 	if size is specified and there is a pending size change already.
  
! 	* xfns.c (x_set_frame_parameters): Do call Fset_frame_size
! 	if size is specified and there is a pending size change already.
  
! 	* xterm.c: Include locale.h if HAVE_SETLOCALE.
! 	(x_term_init): Restore LC_TIME as well as LC_NUMERIC.
  
! Mon Apr  8 19:01:28 1996  Miles Bader  <miles@gnu.ai.mit.edu>
  
! 	* s/gnu.h (HAVE_PTYS): #undef removed.
  
! Mon Apr  8 09:45:18 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* config.in (HAVE_LIBNCURSES): Renamed from HAVE_NCURSES.
! 	* s/lignux.h: Test HAVE_LIBNCURSES, not HAVE_NCURSES.
  
+ Sat Apr  6 17:29:47 1996  Richard Stallman  <rms@lucy.gnu.ai.mit.edu>
  
! 	* dispnew.c (sit_for): Call swallow_events.
  
! Fri Apr  5 13:10:45 1996  Richard Stallman  <rms@lucy.gnu.ai.mit.edu>
  
! 	* s/lignux.h [HAVE_NCURSES] (LIBS_TERMCAP): New definition.
  
! 	* alloc.c (garbage_collection_messages): New variable.
! 	(syms_of_alloc): Set up Lisp variable.
! 	(Fgarbage_collect): Variable controls whether to display messages.
  
! 	* lread.c: Include locale.h.
! 	(init_lread): Specify LC_NUMERIC locale.
! 	* xterm.c (x_term_init): Respecify LC_NUMERIC locale.
  
! 	* config.in (HAVE_SETLOCALE): Add #undef.
  
! Thu Apr  4 14:56:57 1996  Richard Stallman  <rms@lucy.gnu.ai.mit.edu>
  
! 	* ralloc.c (r_alloc_check): Don't check alignment of h->start.
  
! 	* minibuf.c (read_minibuf): Rearrange operations, mainly putting
! 	the read_minibuf_unwind setup and the associated variable changes
! 	together after saving the frame configuration.
  
! Wed Apr  3 14:27:48 1996  Richard Stallman  <rms@lucy.gnu.ai.mit.edu>
  
! 	* process.c (wait_reading_process_input): Don't call
! 	wait_reading_process_input_1 if time_limit is -1.
  
! Tue Apr  2 10:58:32 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xterm.c (x_destroy_window): Do call XCloseIM if X11R6.
  
! Mon Apr  1 20:35:30 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* emacs.c (main): Initialize displayname.
  
! Sat Mar 30 11:09:14 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* s/lignux.h (TERMINFO): Do define (if HAVE_NCURSES).
  
! Fri Mar 29 18:06:55 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xterm.c (x_destroy_window) [SOLARIS2]: Don't free the IC or IM.
  
! Thu Mar 28 23:24:10 1996  Geoff Voelker  <voelker@cs.washington.edu>
  
! 	* nt.c (rename): New function.
  
! Thu Mar 28 13:35:20 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* fileio.c (Frename_file) [WINDOWSNT]: Remove conditional code.
  
! 	* keyboard.c (last_timer_event): New variable.
! 	(timer_check): Set that variable.
  
! Thu Mar 28 15:18:53 1996  Erik Naggum  <erik@naggum.no>
  
! 	* dispnew.c (make_frame_glyphs): Zero the correct number of bytes.
  
! 	* widget.c (EmacsFrameResize): We may be called from an interrupt,
! 	so delay the resize operation.
  
! Wed Mar 27 23:31:16 1996  Geoff Voelker  <voelker@cs.washington.edu>
  
! 	* makefile.nt: Change uses of del to $(DEL).
  
! Wed Mar 27 14:10:43 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xterm.c (x_connection_closed): Don't check _Xdebug.
  
! Tue Mar 26 21:32:19 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xterm.c (XTread_socket, MapNotify case):
! 	Call record_asynch_buffer_change only if >1 frames.
  
! 	* s/lignux.h: Renamed from s/linux.h.
!  	(SYSTEM_TYPE): Changed to "lignux".
  
! 	* process.c (wait_reading_process_input_1): New (empty) function.
! 	(wait_reading_process_input): Call wait_reading_process_input_1.
! 	If timer_check runs some timers, retry it.
  
! Sun Mar 24 07:32:34 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* Makefile.in (xfns.o, xmenu.o, widget.o): Depend on ../lwlib/lwlib.h.
  
! 	* callproc.c (Fcall_process, child_setup): If BSD_PGRPS, call
! 	setpgrp the BSD way even on USG.
  
! 	* s/linux.h (setpgrp): New macro.
! 	(BSD_PGRPS): Defined.
  
! Tue Mar 19 22:57:35 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* callint.c (Fcall_interactively): In `c' case, use message_nolog
! 	instead of message1_nolog.
  
! Tue Mar 19 03:05:44 1996  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
  
! 	* config.in (HAVE_LINUX_VERSION_H): Renamed from HAVE_VERSION_H.
! 	* s/linux.h: Test HAVE_LINUX_VERSION_H, not HAVE_VERSION_H.
  
! Sun Mar 17 23:59:23 1996  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
  
! 	* process.c (wait_reading_process_input): Eliminate bogus test
! 	that was trying to check read_kbd and failing.
  
! Sun Mar 17 13:10:58 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xfns.c (X_I18N_INHIBITED): New macro--define this
! 	instead of undefining HAVE_X_I18N.
! 	(x_window) [HAVE_X_I18N]: Set FRAME_XIM.
! 	[X_I18N_INHIBITED]: Set FRAME_XIM and FRAME_XIC to 0.
  
! 	* xterm.c (x_destroy_window) [HAVE_X_I18N]: Free xic and xim of frame.
  
! 	* xterm.h (struct x_output): New member xim.
! 	(FRAME_XIM): New macro.
  
! Sat Mar 16 17:34:41 1996  Geoff Voelker  <voelker@cs.washington.edu>
  
! 	* unexnt.c (WinMain): Allocate a console for stdout
! 	and stderr if necessary.
  
! 	* w32fns.c (Vwin32_pass_alt_to_system,
!  	Vwin32_pass_optional_keys_to_system): New variables.
! 	(reset_modifiers, map_keypad_keys): New functions.
! 	(win32_wnd_proc): Fixup keypad function keys.
! 	Handle the three new keys on Windows keyboards.
! 	Reset internal keyboard modifier state upon window focus.
! 	
! 	* w32term.h (VK_NUMPAD_*, VK_LWIN, VK_RWIN, VK_APPS):
! 	Define virtual keys for the numpad functions and the three
! 	new keys on Windows keyboards.
  
! Thu Mar 14 10:09:11 1996  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* s/aix3-2.h (X11R5_INHIBIT_I18N): Definition moved here.
! 	* s/aix3-2-5.h (X11R5_INHIBIT_I18N): Definition moved to aix3-2.h.
  
! 	* s/irix5-2.h (NEED_LIBW): Defined.
  
! Wed Mar 13 03:21:51 1996  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* widget.c (update_from_various_frame_slots)
! 	(update_various_frame_slots): Take account of menubar_height.
  
! 	* s/linux.h (LINUX_SIGIO_DOES_WORK): Define only if HAVE_VERSION_H.
  
! 	* config.in (HAVE_VERSION_H): Add #undef.
  
! Mon Mar 11 16:52:38 1996  Eli Zaretskii  <eliz@is.elta.co.il>
  
! 	* process.c (wait_reading_process_input) [! subprocesses]: Run
! 	timers and redisplay if they were run, like the code for systems
! 	which support subprocesses does.
  
! Sun Mar 10 09:37:51 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* s/linux.h (TERMINFO): Don't define this.
  
! 	* process.c [!subprocesses] (wait_reading_process_input): 
! 	Port the timer changes from the other wait_reading_process_input.
  
! Sat Mar  9 11:28:26 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xterm.c (x_calc_absolute_position): Don't explicitly subtract
! 	the external menu bar height--PIXEL_HEIGHT (f) includes that.
  
! Fri Mar  8 10:51:02 1996  Bill Mann  <dvmann@dvaix19.praxisint.com>
  
! 	* m/ibmrs6000.h (LD_SWITCH_MACHINE): Undo previous change--
! 	define this unconditionally.
! 	(LD_SWITCH_SITE): New conditional definition.
! 	For gcc 2.7.x, use /bin/ld instead of collect2,
  
! Thu Mar  7 21:17:19 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* emacs.c (main) [! HAVE_NTGUI]: Don't call syms_of_xmenu.
  
! Thu Mar  7 18:44:59 1996  Bill Mann  <dvmann@dvaix19.praxisint.com>
  
! 	* unexaix.c (write_segment,copy_sym): Increase blocking from
! 	128 to 4k bytes.
! 	(adjust_lnnoptrs): Handle include file names, mostly for dbx.
! 	(unrelocate_symbols): Remove some unnecessary tests.
  
! Thu Mar  7 13:57:20 1996  Eli Zaretskii  <eliz@is.elta.co.il>
  
! 	* Makefile.in (MSDOS_OBJ): Remove xmenu.o.
  
! 	* msdos.c (check_timer): Remove code for dos-display-time.
! 	(syms_of_msdos): Delete dos-display-time Lisp var.
  
! Thu Mar  7 06:44:22 1996  Bill Mann  <dvmann@dvaix19.praxisint.com>
  
! 	* unexaix.c: Handle both AIX 3.2 and 4.1 bind output.
! 	(make_hdr): Handle data_start being non-zero for 4.1.  Padding
!  	sections are omitted in 4.1, but padding bytes can still be
!  	present.  Calculate bias directly from first real section
!  	following bss.
! 	(copy_text_and_data): Correct data section starting point for 4.1.
! 	(adjust_lnnoptrs): Adjust line number pointers correctly for both
! 	3.2 and 4.1, based on published IBM documentation.
! 	(unrelocate_symbols): Compute and subtract relocation offsets for
! 	text and data sections.  Handle data_start being non-zero for 4.1.
! 	Skip unnecessary writes.
  
! Wed Mar  6 01:21:55 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* sysdep.c (init_sys_modes): Clear INLCR like ICRNL.
  
! 	* widget.c (pixel_to_char_size): Cast args to int.
  
! Tue Mar  5 23:36:01 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* alloc.c (struct string_block_head): Change to match string_block.
  
! Tue Mar  5 11:55:24 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* process.c (wait_reading_process_input):
! 	Redisplay after timer_check if timers were actually run.
  
! 	* keyboard.c (timers_run): New variable, incremented when a timer is
! 	run directly.
! 	(timer_check, swallow_events): Increment timers_run.
! 	(swallow_events): Redisplay if get_input_pending has run timers.
! 	(detect_input_pending_run_timers): New arg DO_DISPLAY.
  
! 	* dispnew.c (sit_for): Pass DISPLAY to detect_input_pending_run_timers.
  
! 	* process.c (wait_reading_process_input):
! 	Pass DO_DISPLAY to detect_input_pending_run_timers.
  
! Mon Mar  4 03:54:05 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* process.c (Fopen_network_stream):
! 	Set immediate_quit around gethostbyname.
  
! 	* dispnew.c (sit_for): Use detect_input_pending_run_timers.
  
! 	* xfns.c [AIX] [HAVE_X11R5] (XIMStatusNothing): Definition deleted.
  
! 	* config.in (HAVE_NCURSES): Add #undef.
! 	* s/linux.h (TERMINFO): Define, if HAVE_NCURSES.
  
! Sun Mar  3 13:07:31 1996  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
  
! 	* data.c (Fkill_local_variable): Call find_symbol_value directly,
! 	not via Fsymbol_value, to avoid getting void-variable error.
  
! Sun Mar  3 00:32:16 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xterm.c (x_connection_closed): Don't unblock input until the end.
  
! 	* s/linux.h (LINUX_SIGIO_DOES_WORK): Maybe define, based on Linux vers.
! 	[LINUX_SIGIO_DOES_WORK]: Don't undef SIGIO, SIGPOLL, SIGPOLL.
! 	Do define INTERRUPT_INPUT.
  
! 	* keyboard.c (init_keyboard): Initialize timer_idleness_start_time.
  
! 	* Makefile.in (obj): Add xmenu.o.
!  	(XOBJ): Delete xmenu.o.
! 	* emacs.c (main): Always call syms_of_xmenu.
! 	* xmenu.c: Put most of file into HAVE_MENUS conditional.
! 	(Fx_popup_menu): Put parts into HAVE_MENUS conditionals.
  
! 	* process.c (wait_reading_process_input):
! 	Use getpid when generating SIGIO.
  
! 	* keyboard.c (reinvoke_input_signal): Use getpid.
  
! Sat Mar  2 01:43:35 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* keyboard.c (input_poll_signal): Use start_polling
! 	after first incrementing poll_suppress_count.
  
! Fri Mar  1 03:06:16 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xterm.c [X_CONNECTION_LOCK_FLAG] (abort, exit): New definitions.
  
! 	* keymap.c (Fuse_global_map, Fuse_local_map):
! 	Don't call record_asynch_buffer_change.
  
! Wed Feb 28 16:19:27 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* s/aix3-2.h: Avoid the #pragma alloca on AIX 4.
  
! 	* s/aix4-1.h (REL_ALLOC): #undef deleted.
  
! Tue Feb 27 13:19:00 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xfns.c [AIX] [HAVE_X11R5] (XIMStatusNothing): Defined.
  
! 	* keyboard.c (timer_check): Walk down both timer lists in parallel.
  
! Mon Feb 26 15:24:03 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* keyboard.c (Fcommand_execute): New arg SPECIAL.
! 	All callers changed.
  
! 	* xterm.c (X_CONNECTION_LOCK_FLAG): New macro.
! 	(x_connection_close_if_hung): New subroutine, at the end of the file.
! 	Include X11/Xlibint.h only for this function.
! 	#undef bcopy, bzero, bcmp, min, max first.
! 	Define malloc and free to avoid type conflicts.
! 	(x_connection_signal): Use x_connection_close_if_hung.
  
! 	* doprnt.c (doprnt1): Move cast to unsigned inside a shift.
  
! Mon Feb 26 12:54:04 1996  enami tsugutomo  <enami@ba2.so-net.or.jp>
  
! 	* xdisp.c (redisplay_window): Pass preserve_echo_area as a missing
!  	second argument of redisplay_windows.
  
! Sun Feb 25 02:17:28 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* minibuf.c (read_minibuf):
! 	Bind inhibit-read-only to t around clearing the minibuffer.
! 	(read_minibuf_unwind): Likewise.  Also, clearing the buffer
! 	is now the last thing we do.
! 	
! 	* keyboard.c (command_loop_1): Explicitly clear the echo area
! 	with message2; don't just clear echo_area_glyphs.
! 	Don't set no_direct in that case.
  
! 	* lisp.h (Qinhibit_read_only): Declared.
  
! 	* xterm.c (x_set_window_size): Clear out the mouse-highlighting data
! 	if it applies to this frame.
! 	Clear out the frame cursor position in Xt version as in Xlib version.
  
! Sat Feb 24 00:37:50 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* fileio.c (Fexpand_file_name): Fix confusion in detecting
! 	that default_directory is already absolute so need not be expanded.
  
! 	* syntax.c (Fcopy_syntax_table): Set default to nil.
! 	Set the parent only if it was nil.
  
! 	* xterm.c (x_update_cursor): If no previous cursor position is known,
! 	leave the cursor off.
  
! Fri Feb 23 00:44:26 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xdisp.c (redisplay_internal): Renamed from redisplay.
! 	New arg PRESERVE_ECHO_AREA.
! 	(redisplay): New wrapper function calls redisplay_internal.
! 	(redisplay_window, redisplay_windows): New arg PRESERVE_ECHO_AREA.
  
! Thu Feb 22 22:35:49 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* process.c (Fopen_network_stream): Set immediate_quit for the connect.
  
! Thu Feb 22 05:47:35 1996  Erik Naggum  <erik@naggum.no>
  
! 	* dispnew.c (Fsleep_for): Accept sub-second intervals.
  
! Wed Feb 21 16:05:16 1996  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* xdisp.c (redisplay_window): If window-scroll-functions change
! 	the start position, redisplay from the new one.
  
! 	* xfns.c (defined_color): When we find a "near" color in the map,
! 	make sure it is really available as a read-only color.
  
! 	* process.c (wait_reading_process_input):
! 	Pass new arg to swallow_events.
  
! 	* process.c (wait_reading_process_input): If read_kbd is 1,
! 	use detect_input_pending_run_timers instead of detect_input_pending.
  
! 	* keyboard.c (swallow_events): New arg DO_DISPLAY.
  
! 	* keyboard.c (swallow_events): Process timer_event events here.
! 	(detect_input_pending_run_timers): New function.
  
! 	* keyboard.c (Vtimer_idle_list): New variable.
! 	(syms_of_keyboard): Set up Lisp var.
! 	(timer_check): Check for idle-time timers too.
! 	Expect timers to have 8 slots.  Initialize triggertime.
! 	(timer_start_idle, timer_stop_idle): New functions.
  
! 	* keyboard.c (get_input_pending): New arg do_timers_now.
! 	(readable_events): Likewise.
! 	(Finput_pending_p): Use get_input_pending, so we can specify
! 	1 for do_timers_now.
  
! 	* fns.c (map_char_table): Fix args in recursive call.
  
! 	* s/netbsd.h (vfork): Delete definition (kernel bug fixed).
  
! 	* fileio.c (Fdo_auto_save): Pause before restoring old message.
  
! 	* s/aix4-1.h (C_DEBUG_SWITCH) [not __GNUC__]: New definition.
! 	(C_OPTIMIZE_SWITCH) [not __GNUC__]: Add #undef.
! 	(X11R5_INHIBIT_I18N): #undef deleted.
  
! 	* s/aix4-1.h (REL_ALLOC): Add #undef.
  
! Wed Feb 21 16:05:04 1996  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
  
! 	* keyboard.c (timer_check): Check for difference being zero.
  
! Wed Feb 21 01:44:31 1996  Erik Naggum  <erik@naggum.no>
  
! 	* process.c (Faccept_process_output): Accept sub-second timeouts.
  
! Tue Feb 20 14:09:27 1996  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
  
! 	* eval.c (init_eval_once): Initialize specpdl_ptr.
  
! Mon Feb 19 02:40:07 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* xfns.c (Fx_create_frame): Title is a string, not a symbol.
  
! Sun Feb 18 00:22:03 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* unexelf.c: Use <config.h>, not "config.h".
  
! Sat Feb 17 23:52:28 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* doc.c (get_doc_string): Move static vars outside the function,
! 	and rename to get_doc_string_buffer and get_doc_string_buffer_size.
  
! Fri Feb 16 21:32:03 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
  	* keyboard.c (syms_of_keyboard): Doc fix.
+ 	(Fopen_dribble_file): Check for failure.
  
! Fri Feb 16 21:27:57 1996  enami tsugutomo  <enami@ba2.so-net.or.jp>
  
! 	* keyboard.c (Fopen_dribble_file): Close dribble file before
! 	opening new file.
  
! Thu Feb 15 19:16:24 1996  Eli Zaretskii  <eliz@is.elta.co.il>
  
! 	* fileio.c (Fmake_temp_name) [MSDOS]: Make sure there is at least
! 	one character before the dot, in case `prefix' is only a directory
! 	name.
  
! Tue Feb 13 13:23:57 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* xfns.c (x_real_positions): Cast arg of XFree.
  
! Mon Feb 12 05:04:37 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xterm.c (x_error_quitter): Add newline to error message.
  
! 	* xmenu.c (xmalloc_widget_value): Define only if USE_X_TOOLKIT.
  
! Mon Feb 12 04:48:20 1996  Erik Naggum  <erik@naggum.no>
  
! 	* doc.c (get_doc_string): Always read entire disk blocks.
  
! Sun Feb 11 14:08:34 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* keyboard.c [HAVE_NTGUI] (lispy_function_keys): Add mappings
! 	for keypad function keys and new PC optional keys.
  
! 	* xmenu.c (xmalloc_widget_value): Fix previous change.
  
! 	* xdisp.c (redisplay) [USE_X_TOOLKIT]: Do nothing if popup_activated.
  
! 	* xmenu.c (xmalloc_widget_value): New function.
! 	Use it instead of malloc_widget_value.
  
! Sat Feb 10 03:25:31 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* textprop.c (Fadd_text_properties): Don't return without ungcpro.
  
! Sat Feb 10 02:33:40 1996  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* window.c (display_buffer_1): Fix typo in last change.
  
! Sat Feb 10 02:09:07 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* window.c (display_buffer_1): Raise the frame if already visible.
  
! Fri Feb  9 02:20:20 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* keyboard.c (read_char, timer_check): Call any_kboard_state
! 	after calling Fcommand_execute, if was previously in that state.
  
! Thu Feb  8 18:51:33 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* dired.c (Fdirectory_files): Doc fix.
  
! 	* process.c (Fopen_network_stream): Use sizeof, not strlen,
! 	for numeric_addr.
  
! Thu Feb  8 16:11:52 1996  Eli Zaretskii  <eliz@is.elta.co.il>
  
! 	* fileio.c (Fmake_temp_name) [MS-DOS]: Allow upto 8 characters in
! 	the prefix of the temporary file name.
  
! Wed Feb  7 17:53:21 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* process.c (remove_process): Don't unlink the process marker.
  
! 	* m/paragon.h (LIB_STANDARD): Add -lmach.
! 	(LD_DATA_START): Definition deleted.
! 	(LD_SWITCH_SYSTEM): Definition and #undef deleted.
  
! Tue Feb  6 14:58:17 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* buffer.c (Fbuffer_live_p): New function.
! 	(syms_of_buffer): defsubr it.
  
! 	* xterm.c (min, max): Don't define if already defined.
  
! 	* xfns.c (x_real_positions): Use XFree.
  
! 	* Makefile.in (emacs.o): Depend on blockinput.h.
! 	* emacs.c: Include blockinput.h.
  
! Tue Feb  6 02:48:16 1996  Kevin Gallo   <kgallo@microsoft.com>
  
! 	* w32term.h (FONT_WIDTH): Use average character width, not maximum.
  
! Mon Feb  5 21:32:31 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* emacs.c (fatal_error_signal): Do TOTALLY_UNBLOCK_INPUT.
  
! Mon Feb  5 15:28:43 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* process.c (sigchld_handler): Use cleaner end-of-list test.
  
! Sun Feb  4 14:53:12 1996  Paul Eggert  <eggert@twinsun.com>
  
! 	* s/sol2-4.h (LIB_X11_LIB): Remove; this undoes the Jan 31 change,
! 	which didn't fix the Solaris linking problem.  The problem was
! 	fixed instead by the Feb 1 change to ../configure.in.
  
! Sun Feb  4 00:52:46 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* fns.c (syms_of_fns): Set yes-or-no-p-history to nil.
  
! 	* s/netbsd.h, s/freebsd.h (vfork): Define as fork.
  
! 	* lread.c (Fread_char_exclusive): Doc fix.
  
! Sat Feb  3 13:04:14 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xfns.c (x_frame_parms): Add "title" element.
! 	(x_set_title): New function.
! 	(x_set_name): Let title parm override name parm for title use.
! 	(x_set_icon_name): Use title parm before name parm, if no icon_name.
  
! 	* Properly undo the way deletion affects markers.
! 	* undo.c (record_marker_adjustment): New function.
! 	(Fprimitive_undo): Handle marker-adjustment elements.
! 	* insdel.c (adjust_markers): When a marker is inside text
! 	being deleted, call record_marker_adjustment for it.
! 	(del_range_1): Call adjust_markers before record_delete.
! 	* buffer.c (syms_of_buffer): Doc fix.
  
! Fri Feb  2 21:51:25 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xterm.c (x_connection_signal): Call x_connection_closed properly.
! 	(x_connection_closed): Set FRAME_X_DISPLAY to 0.
! 	(x_destroy_window): Don't do any X operations if FRAME_X_DISPLAY is 0.
  
! Fri Feb  2 16:32:51 1996  Darrin B. Jewell  <jewell@mit.edu>
  
! 	* lisp.h (VECSIZE): Round up when dividing.
  
! Thu Feb  1 20:32:41 1996  Geoff Voelker  <voelker@cs.washington.edu>
  
! 	* w32xfns.c (prepend_msg): New function.
  
! 	* w32fns.c (modifiers, modifier_key_support_tested,
! 	modifiers_recorded): New variables.
! 	(EMACS_LCONTROL, EMACS_RCONTROL, EMACS_LMENU,
! 	EMACS_RMENU): New macros.
! 	(test_modifier_support, record_keydown, record_keyup,
! 	modifier_set, construct_modifiers): New functions.
! 	(win32_wnd_proc): Monitor modifier keyup and keydown messages.
! 	Map window modifiers into console modifiers to unify input.
  
! 	(x_create_frame): Use the FixedSys font as the default font.
! 	(x_to_win32_font): For now, always use ANSI_CHARSET.
  
! 	* w32term.c (convert_to_key_event, is_dead_key): New functions.
! 	(w32_read-socket): Convert console modifiers to Emacs modifiers.
! 	Use console input routines to unify keyboard support.
! 	(x_make_frame_visible): Make frame foreground window.
  
! 	* ntinevt.c (win32_kbd_mods_to_emacs, win32_kbd_patch_key,
! 	key_event): Convert from static to global functions.
! 	(win32_kbd_patch_key): Set modifiers when AltGr is pressed.
! 	(key_event): Don't modify key code on window input.
  
! Thu Feb  1 18:53:20 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* keyboard.c (read_char_minibuf_menu_prompt): Use malloc to allocate
! 	the echo-area prompt buffer.
! 	(read_char_minibuf_menu_text, read_char_minibuf_menu_width):
! 	New variables.
  
! Thu Feb 1 12:27:47 1996  enami tsugutomo  <enami@ba2.so-net.or.jp>
  
! 	* dispnew.c (update_frame): Compare FRAME_MINIBUF_WINDOW(f)
! 	against with not minibuf_window but echo_area_window.
  
! Thu Feb  1 01:03:54 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xterm.c (x_term_init): Use "" as 2nd arg to setlocale.
  
! 	* process.c (wait_reading_process_input): If select times out,
! 	return only if we had no timers to shorten the wait.
! 	Don't shorten the wait for timers if time_limit is -1.
  
! 	* syssignal.h [POSIX_SIGNALS] (sigsetmask):
! 	Don't define if already defined.
  
! 	* keyboard.c (echo_now): Renamed from `echo'.  All callers changed.
  
! Wed Jan 31 17:34:35 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* process.h (synch_process_death, synch_process_retcode): Delete
! 	extra declaration.
  
! Wed Jan 31 16:00:47 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* s/sol2-4.h (LIB_X11_LIB): New definition.
  
! Tue Jan 30 15:35:35 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* s/isc2-2.h (HAVE_SOCKETS): Moved here from s/isc4-1.h.
! 	(NO_SOCKETS_IN_FILE_SYSTEM, NEED_NET_ERRNO_H): Likewise.
! 	(LIBS_SYSTEM): Use -linet unconditionally.
! 	* s/isc4-1.h (HAVE_SOCKETS): Moved to s/isc2-2.h.
! 	(NO_SOCKETS_IN_FILE_SYSTEM, NEED_NET_ERRNO_H): Likewise.
! 	* s/isc4-0.h (LIBS_SYSTEM): Use -linet unconditionally.
  
! Tue Jan 30 13:41:45 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* window.c (Fset_window_buffer): Set buffer temporarily around running
! 	the window-scroll-functions.
! 	(Fset_window_buffer_unwind): New function.
! 	(window_initialized): New variable.
! 	(init_window_once): Set it.
  
! 	* callproc.c (child_setup): Fix size in write call.
  
! Mon Jan 29 01:45:01 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* fns.c (Qcursor_in_echo_area): New variable.
!  	(syms_of_fns): Set up Lisp var.
! 	(Fy_or_n_p): Bind Qcursor_in_echo_area in case of nonlocal exit.
  
! 	* keyboard.c (make_lispy_event): Timer event is a list, not just cons.
! 	(timer_check): When DO_IT_NOW is true, handle events by running
! 	the definition of timer-event.  Don't get the current time if there
! 	are no pending timers.  If an event was generated, return 0,
! 	If all timers were handled, return -1.  Add gcpros.
  
! 	* xterm.c (x_connection_signal): Don't stop polling.
! 	Don't mess with SIGALRM.
! 	Those were relics of the superseded Dec 19 change.
  
! 	* process.c (wait_reading_process_input): Don't exit immediately
! 	if select returns due to timeout--loop around to check time left.
  
! 	* keyboard.c (readable_events): Tell timer_check to execute events.
  
! Sun Jan 28 18:45:58 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* keyboard.c (timer_check): Return an EMACS_TIME.
! 	(read_char, kbd_buffer_get_event): Calls changed accordingly.
  
! 	* process.c (wait_reading_process_input): Call timer_check
! 	and shorten the inner delay if appropriate.
  
! Sun Jan 28 16:47:55 1996  Morten Welinder  <terra@diku.dk>
  
! 	* termhooks.h (event_kind): New event type: timer_event.
  
! 	* keyboard.c (Qtimer_event): New symbol.
! 	(read_char, kbd_buffer_get_event): Don't sleep past the next timer.
! 	(readable_events, kbd_buffer_get_event): Check for timer events.
! 	(make_lispy_event): Handle timer events.
! 	(timer_check): New function.
! 	(Vtimer_list): New variable.
! 	(syms_of_keyboard): Set up Qtimer_event and Vtimer_list.
  
! Sun Jan 28 13:29:33 1996  enami tsugutomo  <enami@ba2.so-net.or.jp>
  
! 	* process.c (create_process): Set outchannel to be non-blocking.
  
! Sun Jan 28 00:08:08 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xfns.c (x_frame_parms): Alphabetize.
! 	(enum x_frame_parm): Data type deleted.
  
! 	* xterm.c (XTframe_raise_lower): Rename arg `raise' to `raise_flag'.
  
! Sat Jan 27 03:28:24 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* emacs.c (sort_args): Error if option is missing an arg.
  
! 	* editfns.c (syms_of_editfns): Make buffer-access-fontify-functions
! 	locally nil in the prin1 buffer.
  
! 	* fns.c (Fy_or_n_p): Call choose_minibuf_frame.
  
! 	* editfns.c (Fcompare_buffer_substrings): Access case_canon_table
! 	as a char_table.
  
! Sat Jan 27 13:14:34 1996  enami tsugutomo  <enami@ba2.so-net.or.jp>
  
! 	* sysdep.c (child_setup_tty): Turn off ISTRIP to pass 8bit.  Turn
!  	off TAB3 do don't expand tabs.
  
! Fri Jan 26 17:24:42 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* minibuf.c (Fset_minibuffer_window): New function.
! 	(keys_of_minibuf): defsubr it.
  
! 	* cmds.c (Fdelete_backward_char): In overwrite mode,
! 	insert spaces, unless we deleted a tab.
  
! Fri Jan 26 17:37:16 1996  Eli Zaretskii  <eliz@is.elta.co.il>
  
! 	* msdos.c (dos_rawgetc): Allow simulation of `Mouse-3' by
! 	simultaneous click/drag of `Mouse-1' and `Mouse-2'.
  
! Thu Jan 25 16:45:51 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xselect.c (xfree): Macro deleted.
! 	Callers changed to use `free' directly.
  
! 	* xselect.c (x_get_window_property_as_lisp_data): Use xfree, not XFree.
! 	(x_get_window_property): Use XFree for tmp_data.
  
! Thu Jan 25 12:30:35 1996  Eli Zaretskii  <eliz@is.elta.co.il>
  
! 	* dosfns.c (mode25, mode4350): Moved to `lisp/dos-fns.el'.
  
! 	* msdos.c (dos_set_window_size): Make the window size change
! 	faster for standard sizes.  Fix a bug in v2-specific code to
! 	change window size.
  
! Wed Jan 24 22:18:43 1996  Geoff Voelker  <voelker@cs.washington.edu>
  
! 	* w32fns.c, w32reg.c, w32term.c, w32term.h, w32xfns.c:
! 	Latest patches backed out.
  
! Wed Jan 24 18:52:14 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* termhooks.h (struct input_event): New field `padding'.
! 	Change `kind' field to an int.
  
! Wed Jan 24 17:28:38 1996  Eli Zaretskii  <eliz@is.elta.co.il>
  
! 	* msdos.c (dos_set_window_size): New function; switches the screen
! 	to the size as close as possible to requested frame dimensions.
  
! 	* msdos.h: (dos_set_window_size): Prototype for a new function.
  
! 	* dispnew.c (change_frame_size_1) [MSDOS]: Support frame size
! 	changing as best as possible.
  
! Wed Jan 24 16:55:17 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* Makefile.in (xmenu.o): Depend on termhooks.h.
  
! Wed Jan 24 16:20:27 1996  Eli Zaretskii  <eliz@is.elta.co.il>
  
! 	* process.c (wait_reading_process_input) [not subprocesses]: Do
! 	not assume SELECT_TYPE is an int.
  
! 	* msdos.c (sys_select): Use time macros to prevent time values
! 	from overflowing.
  
! Tue Jan 23 13:53:29 1996  Geoff Voelker  <voelker@cs.washington.edu>
  
! 	* xdisp.c (update_menu_bar, redisplay_window): Use FRAME_WINDOW_P
! 	instead of only testing for X11.
  
! Tue Jan 23 13:08:10 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* m/mips-siemens.h (UNEXEC): unexsni.o renamed from unexelfsni.o.
! 	* m/iris5d.h (UNEXEC): unexsgi.o renamed from unexelfsgi.o.
! 	* m/iris4d.h [USG5_4] (UNEXEC): Likewise.
  
! 	* config.in (LOCALTIME_CACHE): Delete extra #undef.
  
! Tue Jan 23 13:00:57 1996  Felix Lee  <flee@teleport.com>
  
! 	* data.c (kill-local-variable): Didn't update the value of
!  	forwarded objects.
  
! 	* xdisp.c (mark_window_display_accurate): buffer->clip_changed was
! 	being inappropriately cleared.
  
! Tue Jan 23 12:56:27 1996  Eli Zaretskii  <eliz@is.elta.co.il>
  
! 	* syssignal.h (sigblock): Delete this, undoing previous change.
! 	* msdos.c (sigblock): New (dummy) function.
  
! Mon Jan 22 03:30:50 1996  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
  
! 	* editfns.c (syms_of_editfns): Correct spelling of Lisp variable
! 	buffer-access-fontified-property.
  
! Sat Jan 20 23:17:01 1996  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* unexelf.c (unexec): Undo data relocations unconditionally, not
! 	#ifdef SOLARIS2.
  
! Sat Jan 20 22:53:00 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* syssignal.h [__DJGPP__] (sigblock): Define trivially.
  
! Sat Jan 20 19:56:38 1996  Andrew Innes  <andrewi@harlequin.co.uk>
  
! 	* w32term.c (x_make_frame_visible): Explicitly make the frame
! 	the selected frame.
  
! Sat Jan 20 19:18:03 1996  Andrew Innes  <andrewi@harlequin.co.uk>
  
! 	* w32xfns.c: Include frame.h.
! 	(critsect, h_input_available): New variables.
! 	(init_crit, delete_crit): Handle all three critical sections.
! 	(GetFrameDC, ReleaseFrameDC): New functions.
! 	(get_next_msg, post_msg): Use h_input_available.
! 	Use CRIT_MSG critical section.
  
! 	* w32term.h (win32_palette_entry): New structure.
! 	(has_palette, p_colors_in_use, n_colors_in_use, h_palette,
! 	regen_palette): Declare variables.
! 	(struct win32_output): New field.
! 	(my_get_dc): Macro removed.
! 	(GetFrameDC, ReleaseFrameDC): Declare functions.
  
! 	(critsect): Declare variable.
! 	(enum win32_critical_section): New enumeration.
! 	(enter_crit, leave_crit): Functions converted to macros.
  
! 	* w32term.c (win32_fill_rect): Remove unused variable.
! 	(x_iconify_frame): Conform to coding style.
! 	(x_draw_box): Don't trim right and bottom.
! 	(x_wm_set_size_hint): Use specific CRIT_MSG critical section.
  
! 	(win32_fill_rect, dumpglyphs, do_line_dance, x_draw_box):
! 	Use Get/ReleaseFrameDC.
! 	(win32_update_begin): Regenerate palette if required.
! 	(w32_read_socket): Use FALSE. Handle WM_PALETTECHANGED.
! 	(win32_term_init): Use GetDC directly.
! 	Enable palette in display structure.
! 	Predefine white and black.
! 	(x_delete_display): Free palette table.
  
! 	* w32reg.c (REG_ROOT): Don't use trailing backslash.
  
! 	* w32fns.c (Vwin32_enable_italics, Vwin32_enable_palette):
! 	New variables.
! 	(syms_of_win32fns): Set up new lisp variables.
  
! 	(x_set_frame_parameters, x_real_positions, win32_load_font,
! 	win32_abort): Conform to coding style.
  
! 	(Fwin32_define_rgb_color, Fwin32_load_color_file, Fwin32_map_color,
! 	Fwin32_unmap_color, Fwin32_regenerate_palette): New functions.
! 	(syms_of_win32fns): Set up new lisp subroutines.
! 	(defined_color): Use palettes.
! 	(map_mode): Function removed.
  
! 	(win32_init_class): Don't CS_OWNDC.
! 	(win32_wnd_proc): Use segregated critical sections appropriately.
! 	Handle WM_PALETTECHANGED.
! 	Record WINDOWPLACEMENT structure length.
  
! 	(x_to_win32_weight, win32_to_x_weight): Handle "heavy", "extrabold",
! 	"light", "extralight", and "thin" fonts.
! 	(x_to_win32_charset, win32_to_x_charset): New functions.
! 	(win32_to_x_font): Use win32_to_x_charset.
! 	(x_to_win32_font): Use x_to_win32_charset.
! 	Support Windows font names.
  
! 	(Fx_list_fonts, Fx_display_color_cells, Fx_display_mm_height.
! 	Fx_display_mm_width): Use GetDC directly.
  
! 	(Fx_open_connection): Support external color mapping files.
  
! Sat Jan 20 19:18:03 1996  Geoff Voelker  <voelker@cs.washington.edu>
  
! 	* ntterm.c (clear_frame): Use FillConsoleOutput* calls instead of
! 	ScrollConsoleScreenBuffer (which has a bug on Win95).
  
! 	* ntinevt.c (WIN32_KEY_SHIFTED): Macro undefined.
! 	(win32_number_shift_map): Array undefined.
! 	(win32_kbd_patch_key): Properly handle virtual keys for
! 	arbitrary keyboards.
! 	(map_virt_key, key_event, win32_mouse_position, do_mouse_event,
! 	win32_read_socket): Support for MULE.
  
! 	* nt.c (nt_stat): Use alloca instead of xmalloc.
! 	(get_unassigned_drive_letter, is_toplevel_share_name,
! 	stat_toplevel_share): New functions for stat on remote shares.
! 	(readdir): Use IS_ANY_SEP.
  
! 	* makefile.nt (keyboard.obj, dispnew.obj): Depend upon w32term.h.
! 	(LIBS): Link with mpr.lib for remote share support.
  
! Sat Jan 20 20:47:48 1996  Paul Eggert  <eggert@twinsun.com>
  
! 	* editfns.c (Fformat_time_string): Doc fix.
! 	Don't crash if the resulting string is empty.
  
! Fri Jan 19 17:37:48 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* buffer.c (Fother_buffer): If we have to create a new buffer, use
! 	default-major-mode.
  
! Fri Jan 19 02:25:44 1996  Erik Naggum  <erik@naggum.no>
  
! 	* frame.c (make_frame): Initialize frame title field to nil.
  
! Thu Jan 18 03:37:32 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* alloc.c (mark_object): Mark frame title field.
  
! Mon Jan 22 10:52:23 1996  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* xterm.c [SOLARIS2]: Include Xlibint.h.
! 	(x_connection_signal): Access XlibDisplayWriting properly.
! 	No need to sleep--if the flag is set, assume connection is dead.
  
! Sun Jan 21 11:12:23 1996  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* lisp.h (XCAR, XCDR, CAR, CDR): New macros.
  
! 	* xmenu.c (set_frame_menubar):
! 	Use safe_run_hooks for Qmenu_bar_update_hook.
  
! 	* xdisp.c (update_menu_bar):
! 	Use safe_run_hooks for Qmenu_bar_update_hook.
  
! 	* lread.c (syms_of_lread): Set Vsource_directory here.
! 	(init_lread): Not here.
  
! 	* macros.c (Fstart_kbd_macro): Use xmalloc.
! 	Shrink the kbd macro buffer if it is very big.
  
! 	* lisp.h (make_number): New macro definition.
! 	* data.c (make_number): Function deleted.
  
! Sat Jan 20 11:22:14 1996  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* keymap.c (Faccessible_keymaps): Doc fix.
  
! Fri Jan 19 21:54:27 1996  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* keymap.c (describe_command): Sometimes use col 32 for desc.
! 	Record that col in previous_description_column for hysteresis.
! 	(describe_map): Clear out previous_description_column.
  
! Fri Jan 19 12:46:15 1996  enami tsugutomo  <enami@sys.ptg.sony.co.jp>
  
! 	* frame.c (make_frame): Initialize title parameter to Qnil.
  
! Thu Jan 18 14:26:17 1996  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* xterm.c (x_connection_signal): Explicitly check the thread interlock
! 	on Solaris.
  
! Wed Jan 17 16:55:22 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* keyboard.c (safe_run_hooks): Use Qt, not Qerror, to avoid
! 	running the debugger.
  
! 	* eval.c (run_hook_with_args): Do nothing if Vrun_hooks is nil.
  
! 	* xfns.c (Qtitle): Declared.
! 	(Fx_create_frame): Initialize title parameter.
! 	Don't use the title resource to initialize the name parameter.
  
! 	* frame.c (syms_of_frame_1): Initialize Qtitle.
  
! 	* xdisp.c (decode_mode_spec, case 'F'): Use `title' field.
  
! 	* frame.h (struct frame): New field `title'.
  
! Wed Jan 17 13:40:49 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* window.c (replace_buffer_in_all_windows): Don't change selected
! 	window, even temporarily; that has undesirable side effects.
  
! Wed Jan 17 12:57:36 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* emacs.c (dump_environ): Variable deleted.
! 	(main): Don't free dump_environ.
! 	(Fdump_emacs): Don't set dump_environ.
! 	(environ): Declare only on VMS, as before.
  
! Mon Jan 15 16:25:32 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* s/aix4-1.h (X11R5_INHIBIT_I18N): Add undef.
! 	(LIB_MOTIF): Undef before defining.
  
! Sun Jan 14 23:58:17 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* window.c (display_buffer_1): Don't deiconify the selected frame.
  
! Sun Jan 14 00:21:01 1996  Paul Eggert  <eggert@twinsun.com>
  
! 	* emacs.c (Fdump_emacs): If HAVE_TZSET and not
! 	LOCALTIME_CACHE, call tzset to force a tz reload.
  
! Sat Jan 13 03:39:22 1996  eggert  <eggert@twinsun.com>
  
! 	* emacs.c (set_time_zone_rule): New decl.
! 	(environ): Always declare.
! 	(dump_tz, dump_environ): New vars.
! 	(main): Change TZ twice if the execution TZ happens to be the same as
! 	the dump TZ.  Free dump environ.
! 	(Fdump_emacs): Set TZ to unlikely value just before dumping.
! 	* editfns.c (set_time_zone_rule): Now extern, not static.
! 	* config.in (HAVE_TZSET): Add #undef.
  
! Fri Jan 12 14:53:03 1996  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* Makefile.in ($(OLDXMENU) rules): Fix conditionals so no rules
! 	are defined when !HAVE_MENUS.
  
! Fri Jan 12 14:44:24 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* msdos.c (dos_rawgetc): Make buf longer.
  
! Thu Jan 11 12:14:07 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xdisp.c (redisplay_window): Fix minor bug in Fset_marker call.
  
! 	* s/aix3-2-5.h (LIB_MOTIF): New macro definition.
  
! Wed Jan 10 19:47:57 1996  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* window.c (Fset_window_buffer): Call the window-scroll-functions.
  
! Mon Jan  8 21:30:14 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* keymap.c (Fapropos_internal): Fix previous change.
! 	* abbrev.c (Fdefine_abbrev_table): Fix previous change.
! 	* fns.c (Fset_char_table_parent): Fix previous change.
! 	* data.c (Flognot): Fix previous change.
! 	* macros.c (Fexecute_kbd_macro): Fix previous change.
  
! Mon Jan  8 21:30:14 1996  Erik Naggum  <erik@naggum.no>
  
! 	* abbrev.c (Fdefine_global_abbrev, Fdefine_mode_abbrev,
! 	Fabbrev_symbol, Finsert_abbrev_table_description,
! 	Fdefine_abbrev_table): Harmonize arguments with documentation.
  
! 	* alloc.c (Fmake_symbol): Harmonize arguments with documentation.
  
! 	* buffer.c (Fmake_indirect_buffer, Fset_buffer_major_mode,
! 	Fpop_to_buffer, Fbury_buffer, Foverlay_get): Harmonize arguments
! 	with documentation.
  
! 	* bytecode.c (Fbyte_code): Harmonize arguments with documentation.
  
! 	* callint.c (Fcall_interactively, Fprefix_numeric_value): Harmonize
! 	arguments with documentation.
  
! 	* casefiddle.c (Fupcase_region, Fdowncase_region,
! 	Fcapitalize_region, Fupcase_initials_region): Harmonize arguments
! 	with documentation.
  
! 	* casetab.c (Fcase_table_p): Harmonize arguments with
! 	documentation.
  
! 	* cmds.c (Fforward_line, Fbeginning_of_line, Fend_of_line,
!  	Fdelete_char, Fdelete_backward_char): Harmonize arguments with
!  	documentation.
  
! 	* data.c (Fboundp, Ffboundp, Fmakunbound, Ffmakunbound,
!  	Fsymbol_plist, Fsymbol_name, Ffset, Fdefalias, Fdefine_function,
!  	Fsetplist, store_symval_forwarding, swap_in_symval_forwarding,
!  	find_symbol_value, Fsymbol_value, Fset, default_value,
!  	Fdefault_boundp, Fdefault_value, Fset_default, Fsetq_default,
!  	Fmake_variable_buffer_local, Fmake_local_variable,
!  	Fkill_local_variable, Flocal_variable_p, Flocal_variable_if_set_p,
!  	Faref, Faset, Fzerop, Fnumber_to_string, Fstring_to_number, Frem,
!  	Fmod, Fadd1, Fsub1, Flognot): Harmonize arguments with
!  	documentation.
  
! 	* dired.c (Fdirectory_files, Ffile_name_completion,
! 	Ffile_name_all_completions, Ffile_name_all_versions): Harmonize
! 	arguments with documentation.
  
! 	* dispnew.c (Fsend_string_to_terminal, Fsit_for): Harmonize
! 	arguments with documentation.
  
! 	* doc.c (Fdocumentation, Fdocumentation_property,
!  	Fsubstitute_command_keys): Harmonize arguments with documentation.
  
! 	* dosfns.c (Fint86, Fdos_memget, Fdos_memput, Fmsdos_set_keyboard):
!  	Harmonize arguments with documentation.
  
! 	* editfns.c (Fchar_to_string, Fstring_to_char, Fgoto_char,
!  	Fencode_time, Finsert_char, Fbuffer_substring,
!  	Fbuffer_substring_no_properties, Finsert_buffer_substring,
!  	Fdelete_region, Fnarrow_to_region): Harmonize arguments with
!  	documentation.
! 	(Fformat_time_string): Allow TIME to default to current time.
  
! 	* emacs.c (Fdump_emacs_data, Fdump_emacs): Harmonize arguments with
! 	documentation.
  
! 	* eval.c (Fmacroexpand, Fthrow, Fbacktrace_frame): Harmonize
! 	arguments with documentation.
  
! 	* fileio.c (Ffile_name_directory, Ffile_name_nondirectory,
!  	Ffile_name_as_directory, Fdirectory_file_name, Fexpand_file_name,
!  	Fsubstitute_in_file_name, Fcopy_file, Fmake_directory_internal,
!  	Fdelete_directory, Fdelete_file, Frename_file, Fadd_name_to_file,
!  	Fdefine_logical_name, Ffile_modes, Fset_file_modes,
!  	Fset_default_file_modes, Fdo_auto_save, Fread_file_name): Harmonize
!  	arguments with documentation.
  
! 	* filelock.c (Flock_buffer, Ffile_locked_p): Harmonize arguments
! 	with documentation.
  
! 	* floatfns.c (Fbessel_jn, Fbessel_yn): Harmonize arguments with
! 	documentation.
  
! 	* fns.c (Frandom, Flength, Felt, Fsort, Fchar_table_subtype,
!  	Fchar_table_parent, Fset_char_table_parent, Fchar_table_extra_slot,
!  	Fset_char_table_extra_slot, Fchar_table_range,
!  	Fset_char_table_range, Fmap_char_table, Fmapconcat, Fmapcar):
!  	Harmonize arguments with documentation.
  
! 	* frame.c (Fhandle_switch_frame, Fset_frame_height): Harmonize
! 	arguments with documentation.
  
! 	* indent.c (Findent_to): Harmonize arguments with documentation.
  
! 	* keyboard.c (Fevent_convert_list, Fcommand_execute): Harmonize
! 	arguments with documentation.
  
! 	* keymap.c (Fkeymapp, Fdefine_prefix_command, Faccessible_keymaps,
!  	Ftext_char_description, Fapropos_internal): Harmonize arguments
!  	with documentation.
  
! 	* lread.c (Feval_buffer, Feval_region, Fintern, Fintern_soft):
! 	Harmonize arguments with documentation.
  
! 	* macros.c (Fend_kbd_macro, Fexecute_kbd_macro): Harmonize
! 	arguments with documentation.
  
! 	* marker.c (Fset_marker): Harmonize arguments with documentation.
  
! 	* minibuf.c (Ftry_completion, Fall_completions, Fcompleting_read):
! 	Harmonize arguments with documentation.
  
! 	* print.c (Fwrite_char, Fprin1, Fprin1_to_string, Fprinc, Fprint):
! 	Harmonize arguments with documentation.
  
! 	* process.c (Fprocessp, Fget_buffer_process, Fdelete_process,
!  	Fprocess_status, Fprocess_exit_status, Fprocess_id, Fprocess_name,
!  	Fprocess_command, Fprocess_tty_name, Fset_process_buffer,
!  	Fprocess_buffer, Fprocess_mark, Fset_process_filter,
!  	Fprocess_filter, Fset_process_sentinel, Fprocess_sentinel,
!  	Fset_process_window_size, Fprocess_kill_without_query,
!  	Faccept_process_output): Harmonize arguments with documentation.
  
! 	* search.c (Fmatch_end, Fregexp_quote): Harmonize arguments with
! 	documentation.
  
! 	* syntax.c (Fsyntax_table_p, Fchar_syntax, Fmatching_paren,
!  	Fmodify_syntax_entry): Harmonize arguments with documentation.
  
! 	* textprop.c (Ftext_properties_at, Fget_text_property,
!  	Fget_char_property, Fnext_property_change,
!  	Fnext_single_property_change, Fprevious_property_change,
!  	Fprevious_single_property_change, Fadd_text_properties,
!  	Fput_text_property, Fset_text_properties, Fremove_text_properties,
!  	Ftext_property_any, Ftext_property_not_all): Harmonize arguments
!  	with documentation.
  
! 	* window.c (Fwindowp, Fwindow_live_p, Fother_window,
!  	Fenlarge_window, Fshrink_window, Fscroll_up, Fscroll_down,
!  	Fscroll_other_window, Fscroll_left, Fscroll_right, Frecenter,
!  	Fwindow_configuration_p): Harmonize arguments with documentation.
  
! 	* xfaces.c (Fpixmap_spec_p): Harmonize arguments with
! 	documentation.
  
! Mon Jan  8 19:23:59 1996  Erik Naggum  <erik@naggum.no>
  
! 	* buffer.c (Fkill_buffer): Delete buffer from Vbuffer_alist after
! 	replacing it.
  
! Mon Jan  8 17:19:09 1996  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* s/sol2-3.h (PTY_TTY_NAME_SPRINTF): Make failure non-fatal.
  
! 	* unexelf.c (unexec) [SOLARIS2]: Undo relocations performed by the
! 	runtime linker.
  
! 	* config.in: (LOCALTIME_CACHE): Add #undef.
  
! Mon Jan  8 10:14:27 1996  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* xdisp.c (display_text_line): Clear out redisplay_end_trigger
! 	before calling the functions.
  
! 	* xselect.c (x_handle_selection_notify): Give an indication
! 	in reading_selection_reply of whether the request succeeded.
! 	(x_get_foreign_selection): Do error if foreign selection was cleared.
  
! 	* dispnew.c (init_display): Treat null string DISPLAY var like not set.
  
! Sun Jan  7 09:33:36 1996  Erik Naggum  <erik@naggum.no>
  
! 	* fns.c (Fplist_get): Rename arg `val' to `plist' as in doc.
  
! Sun Jan  7 08:26:39 1996  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* lread.c (read1): Use xmalloc and xrealloc, not malloc and realloc.
  
! 	* s/sol2-5.h: Add #if 0 around everything but the include of sol2-4.h.
  
! 	* process.c (create_process): Restore the signal state
! 	after vfork whether it succeeds or not.
  
! 	* m/hp800.h: Conditionalize many macro definitions on __hpux.
!  	(NEED_BSDTTY): Delete duplicate definition.
  
! 	* lread.c (dump_path): New static var.
! 	(init_lread): Use that to record dump-time initial path.
! 	Delete the local var dump_path; find Vsource_directory differently.
! 	(syms_of_lread): staticpro it.
  
! 	* config.in (LOCALTIME_CACHE): Add #undef.
  
! 	* editfns.c (update_buffer_properties): Delete superfluous &'s.
  
! 	* emacs.c (main): In batch mode, don't handle SIGHUP if was ignored.
! 	Block it while we decide what to do.
  
! Sat Jan  6 16:50:11 1996  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* keymap.c (describe_map): New arg nomenu.
! 	(describe_map_tree): Pass that arg.
  
! Fri Jan  5 18:41:03 1996  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* fileio.c (do_auto_save_unwind): Don't close DESC if DESC < 0.
! 	(Fdo_auto_save): Unconditionally set up unwind-protect.
  
! 	* s/linux.h (LIBS_TERMCAP): Definition deleted.
  
! Fri Jan  5 02:55:55 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* termhooks.h (struct input_event): Put frame_or_window last.
  
! Thu Jan  4 20:10:07 1996  Erik Naggum  <erik@naggum.no>
  
! 	* window.c (replace_buffer_in_all_windows): Only re-select old
! 	window if it is still live.
  
! Thu Jan  4 18:05:04 1996  Paul Eggert  <eggert@twinsun.com>
  
! 	Spelling corrections.
! 	* s/vms.h, s/vms5-5.h (SHARABLE_LIB_BUG): Renamed from
! 	SHAREABLE_LIB_BUG.
! 	* xselect.c (syms_of_xselect): Doc fix for x-selection-timeout.
! 	* sysdep.c (WRITABLE): Renamed from WRITEABLE.
! 	* unexelfsni.c (unexec): Message fix.
! 	* sysdep.c (sys_siglist): Message fix.
! 	* eval.c (syms_of_eval): Doc fix for inhibit-quit.
! 	* window.c (Fprevious_window, Fwindow_configuration_p): Doc fix.
! 	* keymap.c (Flookup_key): Doc fix.
  
! Thu Jan  4 00:00:29 1996  Geoff Voelker  <voelker@cs.washington.edu>
  
! 	* nt.c (getuid): Only return root uid if Administrator.
! 	(geteuid): Return getuid.
  
! Wed Jan  3 22:06:06 1996  Ulrich Leodolter  <ulrich@lab1.psy.univie.ac.at>
  
! 	* ntproc.c (win32_wait): fixed bad synch_process_retcode
! 	and initialized synch_process_death if signaled.
  
! Tue Jan  2 03:24:51 1996  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xterm.c (XTread_socket): For selection_clear_event and
! 	selection_request_event, initialize the frame_or_window field.
  
! 	* window.c (replace_buffer_in_all_windows): New function.
! 	Like Freplace_buffer_in_windows but really does all frames.
! 	* buffer.c (Fkill_buffer): Use replace_buffer_in_all_windows.
  
! Sun Dec 31 13:56:38 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xterm.c (XTread_socket): Pass KeyPress events to the toolkit.
! 	Make the OTHER label exist unconditionally, and make the gotos
! 	unconditional when that is convenient.
  
! Sun Dec 31 16:55:36 1995  Eli Zaretskii  <eliz@is.elta.co.il>
  
! 	* fileio.c (Ffile_readable_p) [MSDOS]: Use access rather than open.
  
! Sat Dec 30 07:01:58 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* Makefile.in (${etc}DOC): Remove spurious `cd' command line.
  
! Thu Dec 28 17:41:23 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xterm.c (x_find_modifier_meanings): Fix !X11R4 code to use dpyinfo.
  
! 	* s/hpux9.h (C_SWITCH_X_SYSTEM, LD_SWITCH_X_DEFAULT):
! 	Add options to specify /usr/lib/X11R5 and /usr/include/X11R5.
  
! Mon Dec 25 23:39:57 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xfns.c (check_x_display_info, check_x_frame, x_set_font)
! 	(Fx_list_fonts): Fix error messages.
  
! Mon Dec 24 13:51:32 1995  Eli Zaretskii  <eliz@is.elta.co.il>
  
! 	* dired.c (Ffile_attributes) [MSDOS]: Remove special detection of
! 	MS-DOS executable files by filename extension (library `stat' does
! 	this itself now).
  
! 	* msdos.c (XMenuActivate): Make sure the menu title is always
! 	displayed with `msdos-menu-active-face', no matter where the mouse
! 	pointer is.
  
! Sun Dec 23 09:18:47 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* msdos.c (have_menus_p): Defined.
  
! 	* s/msdos.h (HAVE_MENUS): Defined.
  
! 	* config.in (HAVE_MENUS): Renamed from HAVE_X_MENU.
  
! 	* Makefile.in (XOBJ, LIBXMENU, $(OLDXMENU), really-oldXMenu):
! 	HAVE_X_MENU renamed to HAVE_MENUS.
  
! 	* keyboard.c (read_char_x_menu_prompt):
! 	HAVE_X_MENU renamed to HAVE_MENUS.
  
! 	* emacs.c (main): Call syms_of_xmenu if and only if HAVE_MENUS.
  
! 	* editfns.c (Fmessage_box, Fmessage_or_box):
! 	HAVE_X_MENU renamed to HAVE_MENUS.  Doc fixes.
  
! 	* xfns.c (have_menus_p): Renamed from using_x_p.
! 	* w32xfns.c (have_menus_p): Renamed from using_x_p.
! 	* fns.c (Fy_or_n_p, Fyes_or_no_p): using_x_p renamed to have_menus_p.
! 	HAVE_X_MENU renamed to HAVE_MENUS.
  
! 	* keyboard.c (Fexecute_extended_command): Nice error if empty cmd name.
  
! 	* callint.c (Fcall_interactively): Undo previous change.
! 	* keyboard.c (Fcommand_execute): Undo previous change.
  
! 	* s/aix3-2.h: Add #pragma alloca.
  
! 	* Makefile.in (LIBXT): Use DYNAMIC_OPTION too.
! 	* s/sol2-5.h (STATIC_OPTION): For GCC, use -Xlinker.
! 	(DYNAMIC_OPTION): Define like STATIC_OPTION.
  
! 	* s/sunos4shr.h (LIBXMU): Replace previous change.
! 	Bring back the old definition, but conditionalize on ! HAVE_X11R6.
  
! 	* config.in (HAVE_X11R6): Add #undef.
! 	* xterm.h (HAVE_X11R6): Definition deleted (previous change undone).
  
! 	* xdisp.c (redisplay_window): Clear force_start field
! 	before running the Qwindow_scroll_functions.
! 	In the recenter case, set w->start before running them.
  
! Sun Dec 24 12:43:23 1995  Adrian Colley  <Adrian.Colley@three.serpentine.com>
  
! 	* s/aix3-2.h: Add #pragma alloca.
  
! Sat Dec 23 19:33:56 1995  Geoff Voelker  <voelker@cs.washington.edu>
  
! 	* makefile.nt (LINK_FLAGS): Dump symbol map when linking.
! 	* unexnt.c (get_bss_info_from_map_file): New function.
! 	(get_section_info): When .bss section parameters are not in the
! 	executable, search the symbol map file for them.
  
! Sat Dec 23 02:44:14 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* syntax.h (SYNTAX_ENTRY): Add cast in call to syntax_parent_lookup.
  
! 	* print.c (NULL): #undef deleted.
  
! 	* cmds.c (internal_self_insert): Declare arg c1 as unsigned char.
  
! Thu Dec 21 00:01:36 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* xdisp.c (prepare_menu_bars): If update_mode_lines,
! 	update all frame titles too.
  
! Wed Dec 20 12:15:57 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* eval.c (skip_debugger): New function.
! 	(find_handler_clause): Call skip_debugger.
! 	(Vdebug_ignored_errors): New variable.
! 	(syms_of_eval): Set up Lisp variable.
  
! 	* print.c (Ferror_message_string): New function.
! 	(syms_of_print): defsubr it.  Doc fix.
! 	(print_error_message): New subroutine.
  
! 	* keyboard.c (cmd_error_internal): Use print_error_message.
  
! Tue Dec 19 16:05:35 1995  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* callint.c (Fcall_interactively): Don't log prompt strings.
  
! 	* xfns.c: Use <paths.h>, not "paths.h".
  
! 	* frame.c [!MULTI_FRAME] (syms_of_frame): Make mouse-pixel-position
! 	a synonym for mouse-position, for the benefit of lisp packages
! 	that use it.
  
! Tue Dec 19 15:56:15 1995  Eli Zaretskii  <eliz@is.elta.co.il>
  
! 	* msdos.c (check_timer): Get rid of the DOS-specific menubar clock
! 	feature; call `display-time-filter' from time.el to display time
! 	on the modeline instead.  This makes `display-time' work under DOS.
! 	(abort): Use our own function instead of the one from the library
! 	which reverts the console device to cooked mode.
! 	(syms_of_msdos): `dos-display-time'--a new variable for
! 	communicating with `display-time'.
! 	* dosfns.c (syms_of_dosfns): Delete the `dos-menubar-clock' and
! 	`dos-timer-hooks' variables.
! 	* dosfns.h (Vdos_menubar_clock, Vdos_timer_hooks):
! 	Declarations deleted.
  
! Tue Dec 19 02:11:33 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* xterm.c (x_connection_signal): Set an alarm around XNoOp call.
  
! 	* xfns.c [X11R5_INHIBIT_I18N]: Undef HAVE_X_I18N if X11R5.
! 	* xterm.h (HAVE_X11R6): New macro, defined when appropriate.
! 	* s/aix3-2-5.h (X11R5_INHIBIT_I18N): Defined.
  
! Sun Dec 17 03:31:12 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* s/sol2-5.h (LIBXT_STATIC, STATIC_OPTION): Defined.
  
! 	* Makefile.in (LIBXT): Handle LIBXT_STATIC.
  
! 	* fileio.c (syms_of_fileio): Doc fix.
  
! 	* callint.c (Fcall_interactively): Handle an arg of form (FCN ARGS...).
  
! 	* keyboard.c (Fcommand_execute): Allow function + args list as cmd.
  
! Thu Dec 14 21:19:27 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* m/ibmrs6000.h (LD_SWITCH_MACHINE): Don't define if using GCC.
  
! Wed Dec 13 15:06:15 1995  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* xterm.c (x_connection_closed): Don't delete dpyinfo if it's null.
  
! Tue Dec 12 21:22:18 1995  Eli Zaretskii  <eliz@is.elta.co.il>
  
! 	* msdos.c (run_msdos_command): Support redirection of stderr.
! 	* callproc.c (Fcall_process) [MSDOS]: Support redirection of
! 	stderr.  Assign process exit code to `synch_process_retcode' and
! 	error description to `synch_process_death'.  Reset
! 	`synch_process_alive' to zero when the sub-process exits.
  
! 	* msdos.c (IT_set_terminal_modes): Save screen color attribute
! 	byte at startup, write saved screen dimensions to termscript
! 	file.
! 	(IT_reset_terminal_modes): When restoring startup screen contents,
! 	only restore as much as was saved, and only as much as the screen
! 	dimensions on exit can hold.  Blank the rest with the background
! 	color saved at startup.  Write restored screen dimensions to
! 	termscript file.
  
! 	* msdos.c (XMenuActivate): Display the menu pane title.
! 	(XMenuLocate): Do not ignore pane title length when deciding on
! 	menu location.
  
! Tue Dec 12 21:16:31 1995  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
  
! 	* emacs.c (main): Fix args to handle `--display DISPLAY'.
  
! 	* data.c (Ftype_of): Return `char-table' and `bool-vector' for
! 	char tables and bool vectors, resp.
! 	(Qchar_table, Qbool_vector): New variables.
! 	(syms_of_data): Initialize and staticpro them.
  
! Tue Dec 12 20:57:18 1995  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* window.c (Fsplit_window): Account for scroll bar width.
  
! 	* minibuf.c (choose_minibuf_frame): Test HAVE_X_WINDOWS.
  
! 	* m/alpha.h (PTY_OPEN): Block SIGCHLD during openpty.
  
! 	* s/sunos4shr.h (LIBXMU): Use dynamic linking.
  
! Tue Dec 12 20:50:06 1995  Paul Eggert  <eggert@twinsun.com>
  
! 	* process.c (create_process):  Use Posix signal handling to
! 	block signals, if available.  If HAVE_VFORK, save and restore
! 	signal handlers that the child might change, since in many
! 	systems (e.g. Solaris 2.4) if the child changes the signal
! 	handlers this munges the parent's handler.
! 	* s/sol2-3.h (HAVE_VFORK):  Remove #undef, since we now
! 	know how to use Solaris vfork.
! 	(VFORK_RETURN_TYPE): Remove definition.
  
! Tue Dec 12 00:38:53 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* callint.c (Fcall_interactively): Move have_prefix_arg label to 'p'.
  
! 	* process.c (Fopen_network_stream): Call bind_polling_period earlier.
  
! Sun Dec 10 05:22:31 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* keymap.c (Fkey_binding): Handle text-property keymaps.
  
! 	* Makefile.in (dotdot): New variable.
! 	(SOME_MACHINE_LISP): Use relative file names.
! 	(shortlisp): New variable.
! 	(${etc}DOC): Use shortlisp instead of lisp.
  
! 	* xdisp.c (redisplay_window): Don't do the scroll_step thing
! 	if startp is outside the accessible part of the buffer.
  
! 	* lread.c (init_lread): Add ../lisp (in build dir) to load-path
! 	when dumping.
  
! Sat Dec  9 07:45:52 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* editfns.c (Fset_time_zone_rule): Move static var environbuf
! 	to top level.
! 	(syms_of_editfns): Initialize environbuf explicitly.
  
! 	* window.c (Fsplit_window): Rename size to size_int and chsize to size.
  
! 	* cmds.c (Fbackward_char, Fforward_char): Rename arg to ARG.
  
! 	* buffer.h (struct buffer): Delete redisplay_end_trigger field.
! 	* buffer.c (reset_buffer, init_buffer_once): Delete code that touches
! 	redisplay_end_trigger field in buffer.
  
! Thu Dec  7 01:50:52 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* editfns.c (Vbuffer_access_fontified_property): New variable.
! 	(syms_of_editfns): Set up Lisp var.
! 	(make_buffer_string): Don't call the Vbuffer_access_fontify_functions
! 	if the text is already fontified.
! 	(Fbuffer_string): Pas 1 for PROPS arg.
! 	(update_buffer_properties): New subroutine.
! 	(Finsert_buffer_substring): Use update_buffer_properties.
  
! Wed Dec  6 00:35:37 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* textprop.c (add_properties, remove_properties, set_properties):
! 	Call signal_after_change.
  
! 	* s/hpux9.h (LIBXMU, NO_EDITRES): Define only if not HAVE_LIBXMU.
  
! Tue Dec  5 00:05:58 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* config.in (HAVE_LIBXMU): Add #undef.
  
! 	* s/hpux9shr.h (C_DEBUG_SWITCH): Definition turned off.
  
! 	* m/iris4d.h (C_SWITCH_MACHINE): Define only if THIS_IS_MAKEFILE.
  
! Mon Dec  4 03:34:10 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* editfns.c (make_buffer_string): New arg PROPS.
! 	(Fbuffer_string, Fbuffer_substring): Pass new arg.
! 	(Fbuffer_substring_no_properties): New function.
! 	(syms_of_editfns): defsubr it.
! 	(Vbuffer_access_fontify_functions): New variable.
! 	(Qbuffer_access_fontify_functions): New variable.
! 	(syms_of_editfns): Set up Lisp variable, initialize them.
! 	(make_buffer_string): Run this new hook.
  
! 	* minibuf.c (read_minibuf): Pass PROPS arg to make_buffer_string.
! 	Let make_buffer_string handle the gap.
  
! Sun Dec  3 17:41:35 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* config.h (EMACS_INT, EMACS_UINT): Definitions deleted
! 	because lisp.h also defines them.
  
! 	* Makefile.in (keymap.o): Depend on puresize.h.
  
! 	* keymap.c: Include puresize.h.
! 	(store_in_keymap): Check PURE_P (def) and copy if nec.
  
! 	* puresize.h (PURE_P): New macro (three definitions).
! 	(CHECK_IMPURE): Use PURE_P.
  
! 	* buffer.c (Fkill_buffer): Rename arg bufname to buffer.
! 	Don't gcpro it after the last use.
! 	(Fswitch_to_buffer, Fpop_to_buffer): Rename arg bufname to buffer.
! 	(Fset_buffer): Likewise, and rename local buffer to buf.
  
! Fri Dec  1 20:49:30 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* Makefile.in (THIS_IS_MAKEFILE): New definition.
! 	* s/irix6-0.h (C_SWITCH_SYSTEM): #undef this if THIS_IS_MAKEFILE.
  
! 	* macros.c (Fstore_kbd_macro_event): New function.
! 	(syms_of_macros): defsubr it.
  
! Wed Nov 29 18:32:05 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xdisp.c (message_dolog): Save and restore windows_or_buffers_changed.
  
! Tue Nov 28 04:04:59 1995  Paul Eggert  <eggert@twinsun.com>
  
! 	* src/Makefile.in (lisp): Remove c-mode.elc.
  
! Mon Nov 27 15:05:14 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* msdos.c (sys_select): Check timer once even if input is pending.
  
! Sun Nov 26 15:48:45 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xfns.c (x_set_menu_bar_lines) [USE_X_TOOLKIT]:
! 	Don't crash for non-X frame.
  
! 	* callint.c (Fcall_interactively): In `c' case, clear out the message
! 	after reading the character.
  
! 	* xdisp.c (decode_mode_spec): For p and P, avoid overflow with
! 	large buffer sizes.
  
! 	* xmenu.c (set_frame_menubar): When called with deep_p == 0,
! 	that invalidates the previous f->menu_bar_vector.
  
! Fri Nov 24 22:01:33 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* Version 19.30 released.
  
! 	* msdos.c (IT_set_menu_bar_lines): Clear last_modified field.
  
! Thu Nov 23 15:07:13 1995  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
  
! 	* keyboard.c (read_char): Handle unread events from popup menus.
  
! Wed Nov 22 13:58:36 1995  Geoff Voelker  <voelker@cs.washington.edu>
  
! 	* makefile.nt (DOC, clean): Don't use switches to del not supported
! 	by Win95.
  
! Wed Nov 22 07:35:25 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xterm.c (XTmouse_position): Exit the loop if child == win.
! 	(x_iconify_frame): Call FRAME_SAMPLE_VISIBILITY.
! 	(XTframe_up_to_date): Block and unblock input.
  
! Wed Nov 22 05:46:28 1995  Eli Zaretskii  <eliz@is.elta.co.il>
  
! 	* msdos.c (internal_terminal_init): Initialize the_only_x_display.font.
  
! 	* xfaces.c (Fset_face_attribute_internal) [MSDOS]:
! 	Set font field to 1.
  
! Wed Nov 22 05:46:28 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* msdos.c (dos_set_keyboard): If CODE is not recognized,
! 	initialize to the US keyboard table.
  
! Tue Nov 21 01:48:52 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* s/linux.h (LIB_MOTIF): New definition.
  
! 	* editfns.c (Fcurrent_time): Doc fix.
  
! 	* s/hpux10.h (FORCE_ALLOCA_H): Defined (for getdate.y).
! 	(HPUX10): Defined.
  
! 	* window.c (Fdisplay_buffer): Always deiconify the window's frame.
! 	(display_buffer_1): New subroutine.
  
! 	* m/alpha.h [LINUX] (LINUX_SBRK_BUG): Defined.
! 	* emacs.c (main): Add LINUX_SBRK_BUG conditional call to __sbrk.
  
! 	* s/msdos.h (SYSTEM_PURESIZE_EXTRA): Increased.
  
! 	* dosfns.c (syms_of_dosfns): Use 0x75 for dos_keypad_mode.
  
! Mon Nov 20 13:37:56 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* alloc.c (Flist): Avoid using -- in while condition.
  
! 	* xfaces.c (unload_color, unload_font): Never invalidate computed
! 	faces 0 and 1.
  
! 	* minibuf.c (choose_minibuf_frame): On MSDOS, just use minibuf_window.
  
! Sun Nov 19 15:29:11 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xterm.c (show_mouse_face):
! 	When clearing cursor, use proper column range.
  
! 	* lread.c (Vsource_directory): New variable.
! 	(init_lread): Initialize it.
! 	(syms_of_lread): Set up Lisp var.
  
! Sat Nov 18 09:24:58 1995  Fred Fish  <fnf@cygnus.com>
  
! 	* s/linux.h: #undef SIGPOLL and SIGURG as well as SIGIO.
  
! Sat Nov 18 14:03:38 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* data.c (Fmake_local_variable): Call find_symbol_value
! 	before making a new local binding.
  
! Wed Nov 15 20:47:36 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* mem-limits.h [_LIBC] (start_of_data): Use weak ref to
! 	__data_start; use &etext if not present.
  
! Wed Nov 15 11:56:58 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xterm.c (XTread_socket): Verify a ButtonPress was actually in the
! 	menu bar before generating a menu_bar_activate_event event.
  
! 	* s/hpux10.h: New file.
  
! 	* textprop.c (Fset_text_properties): Call set_properties
! 	even if we also merge an interval.
  
! 	* xselect.c (x_clear_frame_selections): Get selection_symbol properly.
! 	(syms_of_xselect): Doc fix.
  
! 	* doprnt.c (doprnt1): Add a cast.
  
! 	* alloc.c (mark_object): Don't overwrite original argument value.
  
! 	* .gdbinit (xsymbol): Cast name explicitly to (char *).
  
! Tue Nov 14 14:15:23 1995  Geoff Voelker  <voelker@cs.washington.edu>
  
! 	* w32term.h: New file.
  
! Tue Nov 14 12:36:49 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* keyboard.c (Fexecute_extended_command):
! 	Call Fwhere_is_internal just once to handle all the maps.
  
! 	* xdisp.c (Qredisplay_end_trigger_functions): Renamed from ..._hook.
! 	(syms_of_xdisp): Set up new name.
! 	(display_text_line): Call them with arguments.
  
! 	* window.c (Fset_window_redisplay_end_trigger): Doc fix.
  
! 	* fileio.c (check_executable) [DOS_NT]: Treat all dirs as executable.
  
! Mon Nov 13 00:06:01 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* frame.h (FRAME_WINDOW_P): Always define it one way or another.
  
! 	* m/alpha.h: Declare calloc like malloc.
  
! Sun Nov 12 00:19:44 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xselect.c (x_clear_frame_selections): Undo previous change.
  
! 	* fileio.c (Fcopy_file): Don't chmod output file on MSDOS
! 	unless we have DJGPP version 2.
  
! 	* s/usg5-4.h (LIBS_STANDARD): Definition deleted.
  
! 	* s/isc2-2.h (LIBS_SYSTEM): Fix typo in prev change.
  
! 	* dispnew.c: Always include dispextern.h before cm.h.
  
! Sat Nov 11 01:16:45 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xdisp.c (display_text_line): Handle redisplay_end_trigger
! 	before getting the face of the next character.  Reset next_face_change.
  
! 	* frame.c (syms_of_frame_1): Set up Vdefault_frame_alist here.
! 	(syms_of_frame): Not here.
! 	(Vdefault_frame_alist): Definition now unconditional.
  
! 	* msdos.c (dos_menubar_clock_displayed): New variable.
! 	(check_timer): Erase the clock if it has been turned off.
  
! 	* doc.c (Fdocumentation): Reject a file reference
! 	at the end of a lambda body.
  
! 	* xdisp.c (display_menu_bar): Fix backwards conditional.
! 	(update_menu_bar, redisplay_window): Don't use FRAME_EXTERNAL_MENU_BAR
! 	in #ifdef, since it is always defined.
  
! Fri Nov 10 18:44:42 1995  Simon Leinen  <simon@lia.di.epfl.ch>
  
! 	* s/hpux9.h (NO_EDITRES): Defined.
! 	(LIBXMU): Define once again.
  
! 	* xfns.c (HACK_EDITRES): Don't define if NO_EDITRES is defined.
  
! 	* xterm.c (HACK_EDITRES): Define here as in xfns.c.
! 	(XTread_socket): Test HACK_EDITRES.
  
! Fri Nov 10 10:53:51 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* s/isc2-2.h (LIB_STANDARD_1): New macro.
! 	(LIB_STANDARD): Use LIB_STANDARD_1.
! 	(LIBS_SYSTEM): Use it here too.
  
! 	* print.c (debug_print): Explicitly print a CR.
  
! 	* keyboard.c (interrupt_signal): Do special things in GC.
  
! Fri Nov 10 00:02:48 1995  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
  
! 	* frame.c (set_menu_bar_lines): Record the fact that the window
! 	configuration changes.
! 	(set_menu_bar_lines_1): Mark the window as modified.
  
! Thu Nov  9 23:28:43 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* floatfns.c (Fexpt): Doc fix.
  
! 	* window.h (struct window): New field redisplay_end_trigger.
  
! 	* window.c (Fwindow_redisplay_end_trigger): New function.
! 	(Fset_window_redisplay_end_trigger): Likewise.
! 	(syms_of_window): defsubr them.
  
! 	* xdisp.c (display_text_line): Get redisplay_end_trigger from window.
  
! Thu Nov  9 19:29:39 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* buffer.c (syms_of_buffer): Delete the buffer-redisplay-end-trigger
! 	local variable.
  
! Thu Nov  9 19:15:56 1995  Simon Leinen  <simon@lia.di.epfl.ch>
  
! 	* xmenu.c: Don't include Xaw/Paned.h unless USE_LUCID is defined.
! 	(set_frame_menubar): Conditionalized some code on USE_LUCID that
! 	depends on the fact that the parent widget of the menu bar is an Xaw
! 	"Paned" widget.
  
! Thu Nov  9 02:43:32 1995  Erik Naggum  <erik@naggum.no>
  
! 	* eval.c (run-hook-with-args, run-hook-list-with-args): Safeguard
!  	against a t in the global value of hook variables.
  
! Wed Nov  8 16:36:20 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* s/msdos.h (SYMS_SYSTEM): Add syms_of_msdos.
  
! 	* Makefile.in (lisp): Add loadup.el.
  
! 	* indent.c (compute_motion): Update next_boundary
! 	when we skip to next newline.
  
! Tue Nov  7 14:46:06 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* lread.c (oblookup): Clear ARRAY_MARK_FLAG in obsize.
  
! 	* callint.c (syms_of_callint): Set up Qlet, Qletx, Qsave_excursion.
! 	(Fcall_interactively): Look past those special forms
! 	when checking for a call to `list'.
  
! Tue Nov  7 02:12:16 1995  Geoff Voelker  <voelker@cs.washington.edu>
  
! 	* config.in [HAVE_X_WINDOWS] (HAVE_WINDOW_SYSTEM): New macro.
! 	* s/windowsnt.h [HAVE_NTGUI] (HAVE_WINDOW_SYSTEM): New macro.
! 	* dispextern.h dispnew.c, emacs.c, frame.c, keyboard.c, process.c,
! 	scroll.c, sysdep.c, window.c, xdisp.c: Use HAVE_WINDOW_SYSTEM
! 	instead of testing for specific window systems.
  
! 	* frame.h [HAVE_X_WINDOWS] (FRAME_WINDOW_P): Macro defined.
! 	[HAVE_NTGUI] (FRAME_WINDOW_P): Macro defined.
! 	* dispnew.c, frame.c, scroll.c, xdisp.c: Use FRAME_WINDOW_P
! 	instead of testing for specific window system frames.
  
! 	* xdisp.c (update_menu_bar, redisplay_window): Test for definition
! 	of FRAME_EXTERNAL_MENU_BAR before using it.
  
! Mon Nov 6 15:52:37 1995  Kevin Gallo  <kgallo@microsoft.com>
  
! 	* xterm.h (FRAME_INTERNAL_BORDER_WIDTH, FRAME_LINE_HEIGHT): New macros.
! 	* dispnew.c (update_frame): Use FRAME_INTERNAL_BORDER_WIDTH.
! 	(update_line): Use FRAME_LINE_HEIGHT and FRAME_FONT.
  
! 	* xdisp.c [HAVE_NTGUI] (set_menu_framebar): Declare external.
! 	[HAVE_NTGUI] (frame_title_buf, frame_title_ptr): Include variables
! 	for Win32 window system.
! 	[HAVE_NTGUI] (store_frame_title, x_consider_frame_title): Include
! 	procedures for Win32 window system.
! 	[HAVE_NTGUI] (x_consider_frame_title): Test for Win32 frame.
! 	[HAVE_NTGUI] (display_text_line): Test for Win32 frame on face change.
! 	[HAVE_NTGUI] (display_menu_bar): Perform no-op for NT window system.
  
! 	* window.c [HAVE_NTGUI] (Fset_window_configuration): Set menu
! 	bar lines.
  
! 	* term.c [HAVE_NTGUI] (FRAME_TERMCAP_P): Don't redefine.
  
! 	* sysdep.c [HAVE_NTGUI] (init_sys_modes, reset_sys_modes):
! 	Don't initialize terminal mode when using window system.
! 	[HAVE_NTGUI] (BUFFER_SIZE_FACTOR): Increase for use with window system.
  
! 	* scroll.c [HAVE_NTGUI] (do_scrolling, do_direct_scrolling):
! 	Update frame geometry.
  
! 	* process.c [HAVE_NTGUI] (POLL_FOR_INPUT): Define macro.
  
! 	* keyboard.c [HAVE_NTGUI]: Include w32term.h.
! 	[HAVE_NTGUI] (KBD_BUFFER_SIZE): Increase for NT window system.
! 	[HAVE_NTGUI] (POLL_FOR_INPUT): Define.
! 	[HAVE_NTGUI] (kbd_buffer_get_event): Enable windowing and menu events.
! 	[HAVE_NTGUI] (lispy_function_keys): Define array for NT.
! 	[HAVE_NTGUI] (make_lispy_event): Enable menu bar events.
! 	[HAVE_NTGUI] (modify_event_symbol): Map symbol to keysym.
! 	[HAVE_NTGUI] (read_char_x_menu_prompt): Display menus.
  
! 	(FUNCTION_KEY_OFFSET): New macro.
! 	(make_lispy_event): Use FUNCTION_KEY_OFFSET to modify event codes
! 	before applying modifiers.
  
! 	* frame.c [HAVE_NTGUI]: Test for a Win32 frame in procedures
! 	that test for an X frame.
  
! 	* frame.h (output_method): New method: output_win32.
! 	(output_data): New data: win32.
! 	(FRAME_WIN32_P): New macro.
! 	[HAVE_NTGUI] (external_menu_bar): Define variable.
! 	[HAVE_NTGUI] (FRAME_EXTERNAL_MENU_BAR): Defined macro.
  
! 	* fns.c [HAVE_NTGUI] (Fy_or_n_p, Fyes_or_no_p): Allow popup.
  
! 	* emacs.c [HAVE_NTGUI]: Declare Vwindow_system.
! 	[HAVE_NTGUI] (main): Enable inhibit_window_system.
! 	Initialize environment from registry.
! 	Declare syms of Win32 windowing modules.
  
! 	* dispnew.c [HAVE_NTGUI]: Include w32term.h.
! 	Include dispextern.h before cm.h since dispextern.h includes windows.h.
! 	[HAVE_NTGUI] (make_frame_glyphs, free_frame_glyphs, scroll_frame_lines,
! 	update_frame, update_line): Test for WIN32 frame.
! 	[HAVE_NTGUI] (init_display): Initialize WIN32 window system.
  
! 	* dispextern.h [HAVE_NTGUI]: Include win32.h.
! 	[HAVE_NTGUI] (struct frame_glyphs): Include pixel fields.
  
! 	* w32term.c, w32xfns.c, w32fns.c, w32faces.c, w32select.c,
! 	w32menu.c, w32reg.c, win32.h: New files.
  
! 	* s/windowsnt.h [HAVE_NTGUI] (abort): New macro.
! 	[HAVE_NTGUI] (HAVE_FACES): Defined.
  
! 	* unexnt.c [HAVE_NTGUI] (WinMain): New procedure.
! 	[HAVE_NTGUI] (hinst, hprevinst, lpCmdLine, nCmdShow): New variables.
! 	[HAVE_NTGUI] (_start): Invoke WinMainCRTStartup.
  
! 	* ntterm.c (nt_ring_bell): Renamed from ring_bell, now global.
! 	(initialize_win_nt_display): Use nt_ring_bell.
! 	[HAVE_NTGUI] (pixel_to_glyph_coords, glyph_to_pixel_coords):
! 	Don't define.
  
! 	* ntproc.c [HAVE_NTGUI] (create_child): Pass handles to children.
! 	[HAVE_NTGUI1] (sys_select): Support alternate keyboard handling.
  
! 	* nt.h (nt_get_resource): Prototype defined.
  
! 	* nt.c (nt_get_resource, init_environment): Defined.
! 	(prepare_standard_handles, restore_standard_handles) [HAVE_NTGUI]:
! 	Don't duplicate or restore standard handles.
  
! 	* makefile.nt (SUBSYSTEM, TLIBW32, TLASTLIB, WIN32OBJ): Defined.
! 	(w32term.obj, w32xfns.obj, w32fns.obj w32faces.obj, w32select.obj,
! 	w32menu.obj, w32reg.obj): Defined.
! 	(LINK_FLAGS): Use SUBSYSTEM.
! 	(OBJ1): Remove lastfile.obj.
! 	(LIBS, TEMACS): Use TLASTLIB.
! 	(LIBS) [NTGUI]: Use TLIBW32 and GUI libs.
! 	(EMACS): Remove Win95 conditional.
! 	(clean): Remove paths.h.
  
! Mon Nov  6 15:06:38 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* xdisp.c (display_string): Detect truncation more carefully.
  
! 	* dispnew.c (update_line): Avoid indexing into obody by -1.
  
! 	* s/hpux9.h (LIBXMU): Never define this.
  
! Mon Nov  6 13:31:18 1995  Erik Naggum  <erik@naggum.no>
  
! 	* print.c (debug_print): Print newline to stderr, too.
  
! Sun Nov  5 16:28:43 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* xfaces.c (unload_font): Invalidate computed faces.
! 	(unload_color): Likewise.
! 	(new_computed_face): Reuse invalidated computed faces.
  
! Sat Nov  4 10:40:11 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* indent.c (Fmove_to_column): Doc fix.
  
! 	* buffer.c (Fmake_overlay): New args front-advance
! 	and rear-advance.
  
! 	* fileio.c (Fwrite_region): Move the code that writes annotations
! 	for empty files.
  
! Fri Nov  3 19:04:15 1995  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* msdos.h (struct x_output): Rename from struct x_display.
! 	* msdos.c (the_only_x_display): Type is now struct x_output.
! 	(internal_terminal_init): frame member is now named output_data.
! 	(init_environment): Fix timezone rules.
! 	* emacs.c (main): [MSDOS] Call init_gettimeofday.
! 	* frame.c [!MULTI_FRAME] (Fmodify_frame_parameters): Add missing
! 	declaration and initialization.
! 	[MULTI_FRAME] (choose_minibuf_frame): Moved to minibuf.c; now
! 	unconditional.
! 	* minibuf.c (choose_minibuf_frame): Moved here from frame.c.
  
! Wed Nov  1 16:49:13 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* Makefile.in (USE_@X_TOOLKIT_TYPE@): Define here, if appropriate.
! 	(THIS_IS_YMAKEFILE): Definition deleted.
  
! Tue Oct 31 19:03:18 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* doprnt.c: Include lisp.h.
!  	(doprnt1): Renamed from doprnt.  New arg LISPSTRINGS.
! 	This is now a static subroutine.
! 	(doprnt): New definition calls doprnt1.
! 	(doprnt_lisp): New function.
  
! 	* editfns.c (Fformat): Use doprnt_lisp.
  
! 	* s/dgux.h: Test NOT_C_CODE instead of THIS_IS_YMAKEFILE.
! 	Get fatal error if not using GCC.
  
! 	* xdisp.c (redisplay_window): On non-X frame, always use
! 	FRAME_MENU_BAR_LINES as criterion for whether to display menu bar.
! 	(update_menu_bar): Likewise.
! 	(display_menu_bar): Do the work here for non-X frames
! 	regardless of USE_X_TOOLKIT.
  
! 	* m/alpha.h: Don't test THIS_IS_YMAKEFILE.
  
! 	* s/usg5-4.h: Always include sys/wait.h unless NOT_C_CODE;
! 	don't test #ifdef emacs for that.
  
! Tue Oct 31 12:11:36 1995  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* m/7300.h, m/acorn.h, m/alliant-2800.h, m/alliant.h, m/altos.h:
! 	* m/amdahl.h, m/apollo.h, m/att3b.h, m/aviion.h, m/celerity.h:
! 	* m/clipper.h, m/cnvrgnt.h, m/cydra5.h, m/delta.h, m/delta88k.h:
! 	* m/dpx2.h, m/dual.h, m/elxsi.h, m/gec63.h, m/gould.h, m/hp9000s300.h:
! 	* m/i860.h, m/ibmps2-aix.h, m/ibmrs6000.h, m/ibmrt-aix.h, m/ibmrt.h:
! 	* m/irist.h, m/isi-ov.h, m/masscomp.h, m/mega68.h, m/mg1.h, m/news.h:
! 	* m/next.h, m/nh3000.h, m/nh4000.h, m/ns16000.h, m/ns32000.h, m/nu.h:
! 	* m/orion.h, m/orion105.h, m/pfa50.h, m/plexus.h, m/pyramid.h:
! 	* m/sequent.h, m/sparc.h, m/sps7.h, m/stride.h, m/sun1.h, m/sun2.h:
! 	* m/tad68k.h, m/tahoe.h, m/targon31.h, m/tek4300.h, m/tekxd88.h:
! 	* m/template.h, m/tower32.h, m/tower32v3.h, m/ustation.h, m/vax.h:
! 	* m/wicat.h, m/windowsnt.h, m/xps100.h:
! 	(SHORTBITS, INTBITS, LONGBITS): Deleted; now in config.h.
  
! Mon Oct 30 21:28:51 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* alloc.c, data.c, doprnt.c, floatfns.c, fns.c, indent.c
! 	* insdel.c, lisp.h, lread.c, print.c, xdisp.c, xfaces.c, xterm.c
! 	(BITS_PER_SHORT, BITS_PER_INT, BITS_PER_LONG): Rename from
! 	SHORTBITS, INTBITS, LONGBITS.
! 	* m/alpha.h, m/convex.h, m/hp800.h, m/intel386.h, m/iris4d.h
! 	* m/iris5d.h, m/mips-siemens.h, m/mips.h:
! 	(SHORTBITS, INTBITS, LONGBITS): Deleted; now in config.h
! 	Used new names for those macros in all references.
  
! Mon Oct 30 12:52:49 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* config.in (BITS_PER_CHAR, BITS_PER_INT, BITS_PER_SHORT)
! 	(BITS_PER_LONG): Define if not already defined.
  
! 	* print.c (debug_print): Print a newline here.
  
! 	* .gdbinit (pr): Don't print newline here.
  
! 	* syntax.c (check_syntax_table): Check the purpose slot.
! 	Use Qsyntax_table_p for the error message.
  
! 	* lisp.h (CHECK_CHAR_TABLE): Don't accept nil.
  
! 	* Makefile.in (prefix-args): Use LDFLAGS, not ALL_LDFLAGS.
  
! 	* unexalpha.c (fatal_unexec): Don't use varargs.
  
! 	* editfns.c (Fencode_time): Add cast.
! 	(Fset_time_zone_rule): Add cast.
  
! 	* xterm.h: Move the include of Xlocale.h after setting HAVE_X11R5.
  
! 	* keyboard.c (command_loop_1): Test pre- and post-command hooks
! 	for non-nil-ness by looking at the V... variable.
  
! Sun Oct 29 17:02:58 1995  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
  
! 	* m/m68k.h [linux]: Define NO_REMAP and TEXT_START,
! 	and also DATA_SEG_BITS if compiling for ELF.
! 	(HAVE_ALLOCA, alloca): Define if compiling with GCC.
  
! 	* keymap.c (describe_translation): Insert newline after key
! 	description.
  
! 	* fns.c (Fsafe_length): Add missing parentheses around &
! 	within comparison.
  
! 	* minibuf.c (temp_echo_area_glyphs): Only delete the temporary
! 	message.
  
! Sun Oct 29 14:00:09 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* syssignal.h [POSIX_SIGNALS] (signal): Undef before defining.
  
! 	* unexelfsgi.c (find_section): New arg old_section_h.
! 	Rename file_h to old_file_h and fix type.
! 	Calls changed.
  
! 	* syntax.c (Fmodify_syntax_entry): Don't fail to init MATCH.
  
! 	* lisp.h (PVEC_TYPE_MASK): Remove the 0x100 bit.
  
! 	* keyboard.c (command_loop_1): No direct display if Column Number mode.
! 	(Vcolumn_number_mode): New variable.
! 	(syms_of_keyboard): Set up Lisp variable.
  
! 	* marker.c (Fset_marker_insertion_type): Doc fix.
  
! 	* alloc.c (Fmake_char_table): Doc fix.
  
! 	* casetab.c (Fset_case_table): Doc fix.
  
! 	* alloc.c: Cast first arg to bzero.
  
! Sat Oct 28 11:15:20 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xterm.h (FRAME_XIC): Fix wrong field name.
  
! 	* alloc.c (Fmemory_use_counts): Cast 1 to EMACS_INT before shift.
  
! 	* eval.c (run_hook_with_args): Add forward declaration.
  
! Fri Oct 27 16:23:30 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* Makefile.in (TAGS): Separate export DIR=`pwd` into two commands.
  
! 	* syntax.h (SYNTAX, SYNTAX_WITH_FLAGS, SYNTAX_MATCH):
! 	Fix the non-GCC definitions.
  
! 	* callint.c (Fcall_interactively): New arg KEYS.
  
! 	* keyboard.c (Fcommand_execute): New arg KEYS.  Callers changed.
! 	(read_char): Specify KEYS when handling Vspecial_event_map.
  
! Thu Oct 26 15:03:54 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* msdos.c (IT_ring_bell): Use intdos, not write.
  
! Wed Oct 25 15:19:08 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* data.c [!HAVE_FMOD] (fmod): Make consistent with ANSI definition.
! 	Don't use drem; it's not the same function.
  
! Tue Oct 24 12:29:33 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* s/linux.h (REGEXP_IN_LIBC): Definition turned off.
  
! 	* minibuf.c (syms_of_minibuf): Doc fix.
  
! Mon Oct 23 00:32:39 1995  Erik Naggum  <erik@churchy.gnu.ai.mit.edu>
  
! 	* fns.c (map_char_table): Map over only CHAR_TABLE_ORDINARY_SLOTS
! 	slots, not vector size.
  
! 	* casetab.c (Fcase_table_p, Fcurrent_case_table): Delete unused
! 	local variables.
! 	(set_case_table): Delete obsolete local variable `down', use
! 	`table' where referenced.  Fix assignment to `canon' when nil.
! 	Store eqv in extras[2], not extras[0].
! 	(init_casetab_once): Case-tables have 3 extra slots, not 4.
  
! Sun Oct 22 12:39:41 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* msdos.c (recent_doskeys_index, total_doskeys, recent_doskeys):
! 	New variables.
! 	(Frecent_doskeys): New function.
! 	(syms_of_msdos): New function.
  
! 	* search.c (string_match_1): Pass the POSIX arg to compile_pattern.
  
! 	* keyboard.c (ok_to_echo_at_next_pause): Make it a char *.
! 	(read_char): Copy and compare with echo_area_glyphs.
  
! 	* buffer.c (reset_buffer_local_variables): Call
!  	Fset_standard_case_table if std case table seems to have been changed.
  
! Sat Oct 21 13:04:57 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* buffer.c (reset_buffer): Initialize redisplay_end_trigger slot.
! 	Initialize extra1, extra2 and extra3 slots.
  
! 	* textprop.c (Fnext_single_property_change): Rearrange handling of
! 	limit = t; don't return t.
  
! 	* xdisp.c (try_window_id): Stop the compute_motion at ZV, not Z,
! 	when checking if all changes are below the window.
  
! 	* keyboard.c (read_char): If we reread a char, the next pause
! 	can start echoing despite a remaining echo area message.
! 	(ok_to_echo_at_next_pause): New variable.
! 	(cancel_echoing): Clear ok_to_echo_at_next_pause.
  
! Fri Oct 20 19:20:42 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xdisp.c (Qredisplay_end_trigger_hook): New variable.
! 	(syms_of_xdisp): Set up Lisp variable.
! 	(display_text_line): Run the hook when appropriate.
  
! 	* buffer.c (init_buffer_once): Mark redisplay_end_trigger always local.
! 	Also fix previous change.
! 	(syms_of_buffer): Set up Lisp var buffer-redisplay-end-trigger.
  
! 	* buffer.h (struct buffer): New slot redisplay_end_trigger.
! 	Also extra1, extra2, extra3.
  
! Thu Oct 19 09:36:12 1995  Erik Naggum  <erik@naggum.no>
  
! 	* fns.c (Fmap_char_table): Call map_char_table with correct args.
  
! Wed Oct 18 16:44:29 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* config.in (RE_TRANSLATE_TYPE): New definition.
  
! 	* casetab.c: Case tables are now char-tables,
! 	and the case table is stored in the downcase_table slot only.
! 	(Fcurrent_case_table, Fstandard_case_table, set_case_table)
! 	(compute_trt_inverse, init_casetab_once): Use new data format.
  
! 	* buffer.c (reset_buffer_local_variables):
! 	Get the up, eqv and canon tables from within the down case table.
  
! 	* editfns.c (Fchar_equal): Handle char-table as case table.
  
! 	* fns.c (Fchar_table_subtype): New function.
! 	(syms_of_fns): defsube it.
  
! 	* fns.c (map_char_table): When possible, use a number
! 	to describe the range.
  
! 	* doc.c (Fsubstitute_command_keys): Pass new arg to describe_map_tree.
  
! 	* keymap.c (describe_map_tree): New arg always_title.  Callers changed.
  
! 	* search.c (compile_pattern_1, compile_pattern, search_buffer):
! 	Case tables are char-tables now.
  
! Mon Oct 16 17:35:25 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* lisp.h (UPCASE_TABLE): Definition deleted.
! 	(UPPERCASEP, LOWERCASEP, NOCASEP, UPCASE, UPCASE1, DOWNCASE)
! 	(DOWNCASE_TABLE): Case tables are now char-tables.
! 	(Vascii_upcase_table, Vascii_canon_table, Vascii_eqv_table):
! 	Declarations deleted.
  
! 	* keyboard.c (read_char): Let Vkeyboard_translate_table	be char-table.
! 	(syms_of_keyboard): Doc fix.
  
! Sun Oct 15 12:05:50 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* lread.c (read1): Handle #' as prefix.
! 	(Qfunction): New variable.
! 	(syms_of_lread): Set up Qfunction.
  
! 	* fns.c (Fchar_table_range): New function.
! 	(syms_of_fns): defsubr it.
  
! Sat Oct 14 20:57:54 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* unexelfsgi.c (find_section): New function.
! 	(unexec): Use it.  Also simplify previous changes.
  
! Fri Oct 13 21:31:43 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* unexelfsgi.c (unexec): Find the old data section.
! 	New variable new_offsets_shift used instead of new_data2_size
! 	since they are not always the same.  Simplify logic for copying
! 	the headers and inserting new ones.
  
! 	* xterm.c (x_term_init, XTread_socket): Add HAVE_X_I18N support.
  
! 	* xfns.c (x_window, both versions): Add HAVE_X_I18N support.
  
! Thu Oct 12 11:44:24 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xterm.h (HAVE_X_I18N): New macro.
! 	Maybe include Xlocale.h.
! 	(struct x_output): New field xic.
! 	(FRAME_XIC): New macro.
  
! 	* window.c (Fdelete_other_windows): Set w->force_start.
  
! 	* xdisp.c (syms_of_xdisp): Doc fix.
  
! Wed Oct 11 13:01:50 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* fileio.c (Finsert_file_contents): If replacing,
! 	set selected_window->start_at_line_beg.
  
! Wed Oct 11 15:12:35 1995  Kim Storm  <kfstorm@wombat.gnu.ai.mit.edu>
  
! 	* keyboard.c (make_lispy_event) [!USE_X_TOOLKIT]: Dragging
!  	the mouse into the menu-bar and releasing it there did
!  	not create a drag-mouse event.
! 	(set-input-mode) [MSDOS]: Do not call reset_sys_modes and
! 	init_sys_modes.
  
! 	* dosfns.c (insert-startup-screen): New function.
! 	(msdos-memget, msdos-memput): New functions.
! 	(msdos-set-keyboard, insert-startup-screen): New functions.
! 	(dos-timezone-offset, dos-display-scancodes, dos-menubar-clock,
! 	dos-hyper-key, dos-super-key, dos-keypad-mode, dos-keyboard-layout,
! 	dos-decimal-point): New variables.
  
! 	* dosfns.h (dos_timezone_offset, dos_display_scancodes,
! 	dos_menubar_clock, dos_hyper_key, dos_super_key, dos_keypad_mode,
! 	dos_keyboard_layout, dos_decimal_point): New variables.
  
! 	* msdos.c: [!HAVE_X_WINDOWS]:
! 	Reworked display code to perform immediate screen output.
! 	Added menu-bar clock.
! 	Reworked keyboard code to support international keyboards.
! 	Improved keypad handling (see dos-keypad-mode).
! 	Properly distinguish between C-end and C-kp-1 etc.
! 	Corrected M-return & M-kp-enter.
! 	Added support for hyper and super keys.
! 	Reworked mouse code to avoid mouse flicker.
! 	Saves and restores DOS-screen prior to emacs startup.
! 	(sys_select): Would abort if rfds = NULL.
! 	(dos_direct_output): New function.
! 	(dos_dump_scancodes): New variable.
  
! 	* msdos.h (internal_flush): Removed
! 	(mouse_init1, mouse_check_moved, mouse_pressed, mouse_released): Removed.
! 	(dos_get_saved_screen, dos_set_keyboard): New functions.
  
! 	* s/msdos.h: Check that DJGPP v. 1 is used.
! 	Define __DJGPP__ to 1.
! 	Simplified INTERNAL_TERMINAL termcap definition.
! 	Removed #define fflush internal_flush.
  
! 	* sysdep.c: (init_sys_modes) [!HAVE_X_WINDOWS (MSDOS)]:
! 	Always call set_terminal_modes.
! 	(reset_sys_modes) [MSDOS]: Do not look at EMACSCOLORS.
  
  
! Wed Oct 11 02:24:27 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* buffer.c (Fkill_buffer): Don't kill auto save file if not recent.
  
! 	* keymap.c (describe_vector): Support nested char-tables.
  
! Tue Oct 10 12:26:49 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* Give char-tables a new slot `purpose'.
  
! 	* lisp.h (struct Lisp_Char_Table): New slot `purpose'.
! 	(CHAR_TABLE_STANDARD_SLOTS): Add one.
  
! 	* alloc.c (Qchar_table_extra_slots): New variable.
! 	(syms_of_alloc): Initialize it.
! 	(Fmake_char_table): Take new arg PURPOSE and get N from a property.
  
! 	* fns.c (Fcopy_sequence): Call Fmake_char_table the new way.
! 	(map_char_table): No longer static.  New arg C_FUNCTION.
! 	(Fmap_char_table): Call to map_char_table changed.
! 	(Fset_char_table_parent): Allow nil s new parent.
! 	Fix the code that checks for a loop in parents.
  
! 	* syntax.c (Qsyntax_table): New variable.
! 	(init_syntax_once): Call Fmake_char_table the new way.
! 	Set up Qsyntax_table.
! 	(Fsyntax_table_p): Check the `purpose' field.
  
! 	* disptab.h (DISP_TABLE_P): Check the `purpose' slot.
! 	(Qdisplay_table): Declared.
! 	* dispnew.c (Qdisplay_table): New variable.
! 	(syms_of_display): Initialize it.
  
! Mon Oct  9 17:05:16 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* data.c (Qvector_or_char_table_p): New variable.
! 	(Fvector_or_char_table_p): New function.
! 	(syms_of_data): Set up Lisp var and function.
  
! 	* lisp.h (CHECK_VECTOR_OR_CHAR_TABLE): New macro.
  
! Mon Oct  9 16:51:42 1995  Erik Naggum  <erik@naggum.no>
  
! 	* buffer.c (buffer-display-table): Document new implementation.
  
! Mon Oct  9 12:26:25 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* minibuf.c (temp_echo_area_glyphs): Restore the old point value.
  
! Sun Oct  8 15:25:18 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* process.c (exec_sentinel, read_process_output):
! 	Call record_asynch_buffer_change only if caller is reading kbd input.
  
! 	* buffer.c (init_buffer_once): Make file_format always local,
! 	not just local when set.
  
! Sat Oct  7 22:55:46 1995  Erik Naggum  <erik@naggum.no>
  
! 	* alloc.c (Fmake_char_table): Initialize parent to nil.
  
! Sat Oct  7 12:06:49 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* keyboard.c (command_loop_1): Access display tables as char-tables.
  
! 	* indent.c (buffer_display_table): Use DISP_TABLE_P.  Return type
! 	struct Lisp_Char_Table * since display tables are now char-tables.
! 	(character_width, disptab_matches_widthtab, recompute_width_table)
! 	(current_column, Fmove_to_column, compute_motion):
! 	Corresponding changes.
  
! 	* window.c (window_display_table): Use DISP_TABLE_P.  Return type
! 	struct Lisp_Char_Table * since display tables are now char-tables.
! 	* xdisp.c (redisplay_window, redisplay_window, display_text_line):
! 	Fix up calls to window_display_table.  Access display tables
! 	as char-tables.
  
! 	* disptab.h (DISP_TABLE_EXTRA_SLOTS, DISP_TABLE_P): New macros.
! 	(DISP_TRUNC_GLYPH, DISP_CONTINUE_GLYPH, DISP_ESCAPE_GLYPH)
! 	(DISP_CTRL_GLYPH, DISP_INVIS_VECTOR, DISP_BORDER_GLYPH):
! 	Use the `extras' field.
! 	(window_display_table, buffer_display_table): Change return type.
  
! 	* keymap.c (describe_vector): Use Flength to get length of vector.
  
! 	* Makefile.in (bytecode.o): Depend on syntax.h.
  
! Fri Oct  6 15:33:24 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* syntax.c (describe_syntax): Handle new syntax-table data format.
! 	(Fmodify_syntax_entry, init_syntax_once): Use SET_RAW_SYNTAX_ENTRY.
! 	Handle new syntax-table data format.
! 	(check_syntax_table): Use CHECK_CHAR_TABLE.  Now static.
! 	Don't return anything; callers changed.
! 	(Fcopy_syntax_table): Use Fcopy_sequence.
! 	(Fchar_syntax, Fmatching_paren, Fforward_comment): Copy complex args
! 	to SYNTAX into variables before using them.
! 	(Fsyntax_table_p): Accept any char-table.
! 	(syntax_parent_lookup): New function.
! 	(syntax_temp): New variable.
  
! 	* syntax.h: Use char tables as syntax tables.
! 	(RAW_SYNTAX, RAW_SYNTAX_MATCH): Macros deleted.
! 	(RAW_SYNTAX_ENTRY, SET_RAW_SYNTAX_ENTRY): New macros.
! 	(SYNTAX, SYNTAX_MATCH): Rewritten.
! 	(SYNTAX_ENTRY, SYNTAX_WITH_FLAGS): New macros.
! 	(SYNTAX_COMSTART_SECOND, SYNTAX_COMEND_FIRST, SYNTAX_COMEND_SECOND)
! 	(SYNTAX_PREFIX, SYNTAX_COMMENT_STYLE): Use SYNTAX_WITH_FLAGS.
  
! 	* callint.c (callint_message, callint_message_size): New vars.
!  	(syms_of_callint): Set up new vars.
! 	(Fcall_interactively): Keep the prompt in the heap.
  
! Thu Oct  5 19:14:59 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* window.c (Fset_window_hscroll): Don't reject args > SHORTBITS.
  
! 	* indent.c (Fmove_to_column): Make it interactive.
  
! Wed Oct  4 11:45:53 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* lisp.h (struct Lisp_Char_Table): New structure.
! 	(CHAR_TABLE_STANDARD_SLOTS, CHAR_TABLE_ORDINARY_SLOTS): New macros.
! 	(CHAR_TABLE_EXTRA_SLOTS): New macro.
  
! 	* buffer.c (Fmake_indirect_buffer): Was taking marker positions
! 	from current buffer, which is irrelevant.
! 	(init_buffer_once): Make buffer-file-format always local.
  
! Tue Oct  3 05:08:53 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* unexec.c (write_segment): Write valid data in units of 1<<13,
! 	but write zeros only a page at a time.
  
! 	* window.c (window_scroll): Always set force_start.
  
! Mon Oct  2 11:52:24 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* eval.c (run_hook_with_args_2): New function.
  
! 	* unexec.c (write_segment): Use pagesize as unit of writing
! 	instead of 128.
  
! 	* lisp.h (CHECK_CHAR_TABLE): New macro.
  
! 	* frame.c (Qmouse_leave_buffer_hook): New variable.
!  	(syms_of_frame_1): Initialize it.
! 	(Fhandle_switch_frame): Run the hooks.
  
! 	* keyboard.c (Vsuggest_key_bindings): New variable.
! 	(syms_of_keyboard): Set up Lisp variable.
! 	(Fexecute_extended_command): When enabled, show an equivalent
! 	key binding.
  
! Sun Oct  1 00:11:20 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xterm.c (x_connection_signal_1): New function.
! 	(x_connection_signal): Try all the server connections
! 	to see which one was lost.
  
! Fri Sep 29 00:12:53 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xdisp.c (Qwindow_scroll_functions, Vwindow_scroll_functions):
! 	New variables.
! 	(syms_of_xdisp): Initialize them.
! 	(redisplay_window): Call the functions when appropriate.
  
! 	* xterm.c (XTcondemn_scroll_bars): No error if
! 	FRAME_CONDEMNED_SCROLL_BARS is non-nil already.
! 	Just move all the scroll bars into there.
  
! 	* dispnew.c (get_display_line): Don't abort if there's text
! 	in the line to the right beyond HPOS.
! 	(quit_error_check): Make this a no-op.
  
! 	* fileio.c (barf_or_query_if_file_exists): New arg STATPTR.
! 	Callers changed.
! 	(Fcopy_file): Error if input and output are the same file.
  
! Thu Sep 28 19:02:17 1995  Carsten Bormann  <cabo@informatik.uni-bremen.de>
  
! 	* m/ibmrs6000.h: Add early support for Solaris 2.5 on PowerPCs.
! 	[USG5_4] (CANNOT_DUMP): Define this if USG5_4.
! 	(UNEXEC): Don't define if already defined.
! 	[USG5_4] (DATA_SEG_BITS, LIBS_MACHINE): Alternate definitions.
! 	(C_SWITCH_MACHINE, LD_SWITCH_MACHINE, NLIST_STRUCT, WORDS_BIG_ENDIAN)
! 	(TEXT_START, DATA_START, TEXT_END, DATA_END):
! 	Don't define, if USG5_4.
  
! Wed Sep 27 16:16:38 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
  
! 	* lisp.h (pvec_type): Add PVEC_CHARTABLE and PVEC_BOOLVECTOR.
! 	Move PVEC_BUFFER to a higher bit.
! 	(CHARTABLEP, GC_CHARTABLEP, XSETCHARTABLE, XCHARTABLE): New macros.
! 	(XBOOLVECTOR, XSETBOOLVECTOR, BOOLVECTORP, GC_BOOLVECTORP): New macros.
! 	(struct Lisp_Boolvector): New data type.
  
! 	* lread.c (read1): Handle chartables and boolvectors.
! 	* print.c (print): Handle chartables and boolvectors.
! 	(print_boolvector): New function.
! 	* data.c (Fchartablep, Fboolvectorp): New functions.
! 	(syms_of_data): defsubr them.
! 	(Faref, Faset, Fsequencep): Handle chartables and boolvectors.
  
! 	* fns.c (Fset_char_table_range): New function.
! 	(make_char_table, Fmap_char_table): New function.
! 	(Fchar_table_extra_slot, Fset_char_table_extra_slot): New functions.
  
! 	* fns.c (Fcopy_sequence, Felt, internal_equal, Ffillarray):
! 	Handle chartables and boolvectors.
! 	(Flength, concat): Handle boolvectors as args.
! 	(Flength): Handle chartables as args.
  
! 	* alloc.c (Fmake_chartable, Fmake_boolvector): New functions.
! 	(syms_of_alloc): defsubr them.
  
! 	* buffer.c (Fmake_overlay): Set end-marker's insertion_type to 1.
  
! Fri Sep 22 14:34:22 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* xfns.c (Fx_create_frame): Set up buffer-predicate slot.
  
! 	* gmalloc.c (current_core_address): New function.
! 	(_malloc_internal): Use current_core_address.
! 	(morecore): Avoid using __morecore (0).
  
! 	* ralloc.c (r_alloc_sbrk): Round up amount being returned.
  
! Wed Sep 20 03:27:58 1995  Paul Eggert  <eggert@twinsun.com>
  
! 	* msdos.c (gettimeofday, init_gettimeofday, daylight, gmtoffset):
! 	Undo previous change to msdos.c.
! 	(init_environment): No need to call tzset and init_gettimeofday,
! 	since `main' now does that for us.
! 	(gettimeofday): Ignore tzp; it's obsolescent.
! 	(init_gettimeofday): Invoke tzset first.
! 	* s/msdos.h (LOCALTIME_CACHE, tzset): New macros.
  
! Sun Sep 17 10:28:39 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* xfns.c (x_decode_color): Get error if color not defined.
  
! 	* xmenu.c (popup_get_selection): Pop menu down if button is pressed
! 	outside the menu.
  
! 	* minibuf.c (read_minibuf_unwind): Use safe_run_hooks.
  
! 	* keyboard.c (safe_run_hooks): No longer static.
  
! 	* keyboard.c (read_char_x_menu_prompt):
! 	When unreading events generated by a menu,
! 	turn symbols and integers into lists,
! 	for the sake of last_nonmenu_event and thus y-or-n-p.
  
! Fri Sep 15 12:45:31 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* lread.c (Fload): Rename arg STR to FILE.
  
! Thu Sep 14 03:11:15 1995  Richard Stallman  <rms@whiz-bang.gnu.ai.mit.edu>
  
! 	* ralloc.c (r_alloc_sbrk): Get the right heap data address
! 	in multi-heap case.
  
! Tue Sep 12 13:33:31 1995  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* s/isc2-2.h (BROKEN_SELECT_NON_X): Define this instead of turning
! 	off HAVE_SELECT.
! 	* s/isc3-0.h (BROKEN_SELECT_NON_X): Moved to s/isc2-2.h.
! 	(HAVE_SELECT): Deleted; s/isc2-2.h no longer undefs this.
  
! Tue Sep 12 01:39:15 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* insdel.c (signal_after_change): Call report_interval_modification.
  
! 	* textprop.c (call_mod_hooks): Moved from intevals.c
! 	(verify_interval_modification): Moved from intervals.c.
! 	(interval_insert_behind_hooks, interval_insert_in_front_hooks):
! 	New variables.
! 	(report_interval_modification): New function.
! 	* intervals.c (call_mod_hooks, verify_interval_modification):
! 	Functions moved to textprop.c.
  
! Sun Sep 10 20:12:36 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xmenu.c (xmenu_show): Ignore `quote' when looking up the result.
  
! Sun Sep 10 04:06:23 1995  Paul Eggert  <eggert@twinsun.com>
  
! 	* editfns.c (Fencode_time): Use mktime to do the real work;
! 	this fixes bugs involving out-of-range dates and leap seconds,
! 	and allows date arithmetic via out-of-range values for arguments.
! 	Allow the ZONE parameter to be a TZ-style string.
! 	Doc string fix: `1900' -> `this century'.
! 	(set_time_zone_rule): New function.
! 	(Fset_time_zone_rule): Use it.
! 	(environ, make_time): Add extern declarations.
! 	(days_per_month): Remove.
  
! Sat Sep  9 15:31:15 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* keyboard.c (command_loop_1): Set this_command to nil
! 	before reading a command.
  
! 	* editfns.c (Fdecode_time): Doc fix.
  
! Fri Sep  8 12:24:20 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* m/apollo.h (HAVE_UNISTD_H): Add #undef.
  
! Thu Sep  7 06:12:50 1995  Paul Eggert  <eggert@twinsun.com>
  
! 	* editfns.c (Fset_time_zone_rule): New function.
! 	(syms_of_editfns): defsubr it.
! 	* msdos.c (gettimeofday): Don't bother setting time zone,
! 	since nobody uses it, and our hacks to get it get in the way
! 	of the above fix.  Use simpler method for getting time stamp.
! 	(init_gettimeofday, daylight, gmtoffset): Remove.
! 	* msdos.h (init_gettimeofday): Remove declaration.
  
! Wed Sep  6 04:25:50 1995  Paul Eggert  <eggert@twinsun.com>
  
! 	* configure.in (LOCALTIME_CACHE): Define if tzset exists and
! 	if localtime caches TZ.  Check for tzset.
  
! 	* emacs.c (main): Call tzset only if LOCALTIME_CACHE is	defined;
! 	not all Suns have this bug.
! 	* m/pmax.h, s/386bsd.h, s/bsd386.h, s/freebsd.h, s/gnu.h,
! 	s/netbsd.h (LOCALTIME_CACHE): Remove; now configured automatically.
  
! Wed Sep  6 03:41:34 1995  Erik Naggum  <erik@naggum.no>
  
! 	* alloc.c (Fmake_marker): Initialize insertion_type to 0.
  
! Sun Sep  3 13:28:58 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* insdel.c (adjust_markers_for_insert): New function.
! 	(insert_from_buffer_1, insert_from_string_1, insert_1): Call it.
  
! Fri Sep  1 21:19:14 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* fileio.c (Fmake_symbolic_link, Fadd_name_to_file):
! 	Look for handler for the new name as well as for the target.
  
! 	* dired.c (Ffile_name_all_completions, Ffile_name_completion):
! 	Look for handler for FILE as well as for DIRNAME.
  
! Thu Aug 31 22:00:41 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* marker.c (Fcopy_marker): New arg TYPE.
! 	(Fmarker_insertion_type, Fset_marker_insertion_type): New functions.
! 	(syms_of_marker): defsubr them.
  
! 	* buffer.c (Fmake_indirect_buffer): Set the insertion_type of the
! 	zv_marker markers to 1.
  
! 	* window.c (save_window_save): Pass the new arg to Fcopy_marker.
  
! 	* editfns.c (save_excursion_save): Pass the new arg to Fcopy_marker.
  
! Thu Aug 31 20:58:21 1995  Erik Naggum  <erik@naggum.no>
  
! 	* keyboard.c (Fcommand_execute): Ignore `disabled' property on
! 	commands if `disable-command-hook' is nil.
  
! Wed Aug 30 11:56:09 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* keyboard.c (read_key_sequence): Validate the event position
! 	before calling get_local_map.
  
! Tue Aug 29 14:56:45 1995 Jack Repenning <jackr@sgi.com>
  
! 	* unexelfsgi.c: Compute new data offset based on memory
! 	address; also, copy .got from memory not temacs.
  
! Tue Aug 29 17:50:16 1995  Kim Storm  <kfs@olicom.dk>
  
! 	* dosfns.c (Fmsdos_mouse_enable, Fmsdos_mouse_disable)
! 	(Fmsdos_mouse_init): New functions.
! 	(syms_of_dosfns): defsubr them.
! 	(Fmode25, Fmode4350): Call mouse_off unconditionally.
! 	(Fset_mouse_position): Return nil.
  
! 	* msdos.h (sleep_or_kbd_init): Delete declaration.
  
! 	* frame.c [!MULTI_FRAME] (Factive_minibuffer_window): New function.
! 	[!MULTI_FRAME] (syms_of_frame): defsubr it.
  
! 	* sysdep.c (sys_subshell) [MSDOS]: Handle SUSPEND env var.
! 	Disable error report from subshell if system returns non-zero.
! 	Don't call vfork before calling system.
! 	Don't call wait_for_termination.
! 	(sys_select): Turn it off if MSDOS.
! 	(reset_sys_modes): Support EMACSCOLORS env var.
  
! 	* puresize.h (SITELOAD_PURESIZE_EXTRA): New macro.
! 	(BASE_PURESIZE): Use SITELOAD_PURESIZE_EXTRA.
  
! 	* msdos.c (putchar): Call internal_flush instead of _flsbuf.
! 	(DO_TERMSCRIPT): New macro to support open-termscript.
! 	(internal_flush): Corrected handling of flush in middle of
! 	escape sequences. Handle screen width > 127.
! 	(flush_escape): New function for use by internal_flush.
! 	(sys_select): New MS-DOS specific version with us timing.
! 	(EMACSCOLORS): New environment variable.
! 	(IT_clear_end_of_line): Set default face.
! 	(run_msdos_command): Restore mouse position after command.
! 	Close "backup fd"s.
! 	Corrected switch to cooked mode while running command.
! 	(mouse_on, mouse_off): Now checks have_mouse > 0.
! 	Note: "have_mouse < 0" means that a mouse is present, but
! 	it has been disabled via msdos-mouse-disable.
! 	(IT_write_glyphs): Allow esc-character itself to be printed.
! 	(event_timestamp): New function to make reliable times stamps.
! 	(sys_chdir): Skip drive letter before calling chdir.
! 	(sleep_or_kbd_hit): Handle 60 seconds time wrap.
! 	(mouse_get_pos): Return event_timestamp.
  
  
! Tue Aug 29 00:34:55 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* msdos.c (struct IT_menu_state): Refer to it as struct, not typedef.
  
! 	* editfns.c (Fdecode_time): Doc fix.
  
! 	* minibuf.c (Fdisplay_completion_list): Clear all text properties
! 	for the whitespace between completion items.
  
! 	* xterm.c (x_wm_set_icon_pixmap): If trying to turn off icon
! 	pixmap, do nothing.
  
! Mon Aug 28 16:38:40 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
  
! 	* s/gnu.h (GETPGRP_NO_ARG, WAIT_USE_INT, UNEXEC): New macros.
! 	(HAVE_SOCKETS, A_TEXT_SEEK, NO_REMAP): Macros removed.
  
! Sun Aug 27 19:52:53 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* doprnt.c (doprnt): Fix typo in error message.
  
! Sat Aug 26 13:09:28 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* emacs.c (decode_env_path): Use ".", not nil, for current dir.
  
! Tue Aug 22 17:00:39 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* keyboard.c (modifier_names): Add 4 bits to modifier bit positions.
  
! Mon Aug 21 20:27:37 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* xdisp.c (display_text_line): Write blanks under the entire
! 	scroll bar, not just the first column.
  
! Mon Aug 21 15:20:39 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* s/irix5-2.h (SA_RESTART): Add #undef.
  
! 	* keyboard.c:
! 	(Qpost_command_idle_hook, Vpost_command_idle_hook): New vars.
! 	(syms_of_keyboard): Set up new vars.
! 	(command_loop_1): Run Qpost_command_idle_hook.
  
! Sun Aug 20 11:45:10 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* s/aix3-1.h (SYSTEM_TYPE): Change to just "aix".
  
! 	* s/aix4.h: Include aix3-2-5.h, not aix3-2.h.
! 	* s/aix4-1.h (sigsetmask, _setjmp, _longjmp): Delete undefs.
! 	[__GNUC__] (_NO_PROTO): Add undef.
  
! 	* s/aix3-2-5.h (POSIX_SIGNALS, CLASH_DETECTION): Defined.
! 	(SIGNALS_VIA_CHARACTERS, MAIL_USE_LOCKF): Defined.
! 	(sigmask, sigsetmask, _setjmp, _longjmp): Add undefs.
  
! Sat Aug 19 01:38:16 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* dispnew.c: Include syssignal.h.
  
! 	* lisp.h (struct Lisp_Marker): Make insertion_type an unsigned int.
  
! Wed Aug 16 15:27:26 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* syntax.c (scan_sexps_forward): Fix previous change.
  
! Tue Aug 15 14:46:52 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* emacs.c (sort_args): Initialize best_priority smaller than any
! 	actual priority.
  
! Mon Aug 14 13:12:24 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* fileio.c (Fwrite_region): New arg lockname.
! 	(auto_save_1): Pass new arg.
  
! 	* callproc.c (Fcall_process_region): Pass new arg to Fwrite_region.
  
! 	* emacs.c (standard_args): Fix previous change.
  
! Mon Aug 14 12:01:33 1995  Erik Naggum  <erik@naggum.no>
  
! 	* emacs.c (standard_args): Add option --eval to evalute an
!  	expression on the command line and print the result.
  
! Mon Aug 14 04:09:24 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* cmds.c (Fself_insert_command): Optimize the case with arg > 2
! 	to avoid running change hooks lots of times.
  
! Sun Aug 13 00:56:51 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* s/isc4-1.h (NO_SOCKETS_IN_FILE_SYSTEM): Defined.
! 	(START_FILES): Defined.
! 	(LIB_STANDARD): New definition, details depending on __GNUC__.
  
! 	* syntax.c (scan_sexps_forward): Use the initial depth
! 	in the starting state for tracking when we reach TARGETDEPTH.
  
! Fri Aug 11 18:35:14 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* m/alpha.h: Test OSF1, not __osf1__.
! 	(ORDINARY_LINK): Define only if OSF1.
! 	(PTY_ITERATION, PTY_NAME_SPRINTF, PTY_TTY_NAME_SPRINTF, PTY_OPEN):
! 	Define only if OSF1.
! 	(TEXT_END, DATA_END): Fix the definitions.
  
! Thu Aug 10 00:48:40 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* s/linux.h (ULIMIT_BREAK_VALUE, SEGMENT_MASK): Moved to intel386.h
! 	(LIBS_SYSTEM): Define this instead of LIBS_MACHINE.
  
! 	* m/intel386.h [linux] (ULIMIT_BREAK_VALUE, SEGMENT_MASK):
! 	Moved from linux.h.
  
! 	* m/alpha.h [linux] (COFF, NO_TERMIO): Defined.
! 	[linux] (TEXT_END, DATA_END): New definitions.
  
! 	* unexalpha.c (fatal_unexec): Use vfprintf, not _doprnt.
  
! 	* m/alpha.h (LIBS_DEBUG, START_FILES, LIBS_MACHINE):
! 	Define only if __osf1__.
  
! 	* macros.c (Fcancel_kbd_macro_events): New function.
! 	(syms_of_macros): defsubr it.
  
! 	* frame.c (store_frame_param): Don't call set_menu_bar_lines if X.
  
! Mon Aug  7 18:51:11 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* keyboard.c (read_key_sequence): Undo previous change.
! 	Instead, put back the orig_uppercase event if key is not defined.
! 	When downcasing, back up one step in key-translation processing.
  
! 	* doprnt.c (doprnt): Error if %-width is too big.
  
! 	* editfns.c (Fformat): Limit minlen to avoid stack overflow.
  
! Mon Aug  7 13:48:47 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* insdel.c (signal_before_change, signal_after_change): Fix
! 	spelling of Vbefore_change_functions and Vafter_change_functions.
  
! Mon Aug  7 13:51:48 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* doprnt.c (doprnt): Don't let size_bound be gigantic.
! 	Fix error message.
  
! Sun Aug  6 01:02:06 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* buffer.c (get_truename_buffer): New function.
! 	* filelock.c (lock_file): Use get_truename_buffer.
  
! 	* emacs.c (main) [USG5]: Call setpgrp without testing INTERRUPT_INPUT.
  
! 	* xdisp.c (redisplay): Compute mini_frame the same way
!  	echo_area_display does.
  
! 	* keyboard.c (kbd_buffer_store_event):
! 	Don't insert two buffer_switch_event's in a row.
  
! 	* xfns.c (x_set_menu_bar_lines) [USE_X_TOOLKIT]: When turning
! 	menu bar on, make sure next redisplay creates it.
  
! 	* eval.c (run_hook_with_args): Move the GCPRO2; add UNGCPRO.
  
! 	* process.c (read_process_output, exec_sentinel): Call
!  	record_asynch_buffer_change after any eval.  Don't call
!  	prepare_menu_bars.
! 	(wait_reading_process_input): Don't call prepare_menu_bars.
  
! Sat Aug  5 01:04:16 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* search.c (Freplace_match): New arg SUBEXP.
  
! 	* eval.c (run_hook_with_args): Add gcpros.
! 	* print.c (print_string): Use insert_from_string for output to buffer.
! 	* minibuf.c (Fdisplay_completion_list): gcpro elt.
  
! 	* insdel.c (signal_before_change, signal_after_change): Major rewrite.
! 	(before_change_function_restore, after_change_function_restore)
! 	(before_change_functions_restore, after_change_functions_restore):
! 	Functions deleted.
! 	* eval.c (run_hook_list_with_args): New function.
! 	* buffer.c (Qbefore_change_functions, Qafter_change_functions):
! 	New variables.
! 	(syms_of_buffer): Initialize them.
! 	* buffer.h (Qbefore_change_functions, Qafter_change_functions):
! 	Declared.
  
! 	* frame.c (Fset_mouse_position, Fset_mouse_pixel_position): Doc fixes.
! 	[not MULTI_FRAME] (Fframe_visible_p): New function.
! 	[not MULTI_FRAME] (syms_of_frame): defsubr it.
  
! 	* xfns.c (Ffocus_frame, Funfocus_frame): Make them no-ops.
  
! Fri Aug  4 15:38:18 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xterm.c (x_delete_display) [AIX]: Don't call XRmDestroyDatabase.
  
! 	* msdos.c (IT_write_glyphs): Call ScreenSetCursor.
  
! 	* lread.c (saved_doc_string*): New variables.
! 	(load_force_doc_strings): New variable.
! 	(syms_of_lread): Set up Lisp var load-force-doc-strings.
! 	(read_list): Handle load_force_doc_strings.
! 	Use the saved_doc_string, if it's right; otherwise, reread from file.
! 	(read1): Save last doc string in saved_doc_string.
  
! Thu Aug  3 04:28:29 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* frame.c (set_menu_bar_lines, set_menu_bar_lines_1): New functions.
! 	(store_frame_parameter): Call set_menu_bar_lines.
! 	[!MULTI_FRAME] (Fmodify_frame_parameters): Call set_menu_bar_lines.
  
! 	* frame.c: Move various Q... vars to top of file, unconditional.
! 	(Vterminal_frame): Just one definition, at top of file, unconditional.
! 	(syms_of_frame_1): New function.
! 	(syms_of_frame. both definitions): Call syms_of_frame_1.
  
! Wed Aug  2 00:14:16 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* keyboard.c (read_key_sequence): Don't downshift an event
! 	if that fails to make it bound.
! 	(follow_key): Don't alter contents of NEXT until the end.
  
! 	* xmenu.c [USE_X_TOOLKIT] (xmenu_show): Compute root-based
!  	coordinates.  Make a dummy event to pass them to lw_popup_menu.
  
! 	* lread.c (Funintern): Fix deleting the last symbol in a chain.
  
! Tue Aug  1 03:19:17 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xdisp.c (redisplay): When displaying a terminal frame,
! 	if it isn't the same one as last time, clear it and redraw.
! 	Don't redisplay mini_frame as well, if it is a termcap frame.
  
! 	* frame.c (do_switch_frame): Do nothing special when switching
! 	between terminal frames.
  
! Mon Jul 31 14:17:30 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* s/usg5-4.h, s/sol2-5.h (GETTIMEOFDAY_ONE_ARGUMENT): Deleted;
! 	configure handles this now.
  
! Mon Jul 31 06:04:12 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
  
! 	* eval.c (run_hook_with_args): Renamed from Frun_hook_with_args.
! 	Take extra arg CONDITION, and return appropriately based on hook
! 	function value if CONDITION is until_success or until_failure.
! 	(Frun_hooks, Frun_hook_with_args,
! 	Frun_hook_with_args_until_success,
! 	Frun_hook_with_args_until_failure): New functions, use it.
! 	(syms_of_eval): defsubr them.
  
! 	* lisp.h (Frun_hook_with_args,
! 	Frun_hook_with_args_until_success,
! 	Frun_hook_with_args_until_failure): Declare them.
  
! Mon Jul 31 01:34:30 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xterm.c (XTread_socket): For UnmapNotify, use x_top_window_to_frame.
  
! 	* keyboard.c (kbd_buffer_get_event, swallow_events): Fix prev change.
  
! Sun Jul 30 02:23:55 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xmenu.c (single_submenu):
! 	Only ignore 1st char of pane name if that is an @.
  
! 	* frame.c (Fmake_terminal_frame): Copy face_alist from selected frame.
  
! 	* s/linux.h (HAVE_XRMSETDATABASE): Define if not defined.
  
! Fri Jul 28 20:07:35 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* s/isc3-0.h (HAVE_SELECT): Defined.
  
! 	* s/isc4-1.h (HAVE_SOCKETS, NEED_NET_ERRNO_H): Defined.
! 	(HAVE_TERMIOS): Defined.
! 	(HAVE_TERMIO): Add undef.
  
! 	* s/isc4-0.h (sigblock, SIG_BLOCK): Don't define them if POSIX_SIGNALS.
  
! 	* process.c: Maybe include net/errno.h.
  
! 	* alloc.c (cons_cells_consed, floats_consed, vector_cells_consed)
! 	(symbols_consed, string_chars_consed, misc_objects_consed)
! 	(intervals_consed): New vars.
! 	(make_float, Fcons, make_interval, allocate_vectorlike, Fmake_symbol)
! 	(allocate_misc, make_uninit_string): Increment them.
! 	(Fmemory_use_counts): New function.
! 	(syms_of_alloc): defsubr it.
  
! Fri Jul 28 14:49:20 1995  Gvran Uddeborg  <uddeborg@carmen.se>
  
! 	* s/isc4-1.h: ISC 4.1 has termios.
  
! Thu Jul 27 22:54:05 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* config.in (GETTIMEOFDAY_ONE_ARGUMENT): Add #undef.
  
! Thu Jul 27 17:22:19 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* eval.c (syms_of_eval): Add missing defsubr.
  
! 	* buffer.c: (struct sortstrlist): New type.
! 	(overlay_heads, overlay_tails): Change to struct sortstrlist.
! 	(overlay_heads_len, overlay_tails_len): Deleted; now part of struct.
! 	(record_overlay_string): New function.
! 	(overlay_strings): Simplify.  Use record_overlay_string.
! 	Check for window match in overlays_after loop, not just in
! 	overlays_before.
! 	Handle zero-sized overlays better.
  
! Thu Jul 27 03:17:48 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* keymap.c (describe_buffer_bindings): Print bindings from
! 	Vfunction_key_map and from Vkey_translation_map.
! 	(describe_translation): New function.
! 	(describe_command): Handle vector like string.
! 	(describe_map_tree): New arg TRANSL.  Callers changed.
  
! 	* keymap.c (Vkey_translation_map): Defined.
! 	(syms_of_keymap): Set up Lisp var.
! 	* keyboard.c (Vkey_translation_map): Just declare, don't define.
! 	(syms_of_keyboard): Don't set up Lisp var.
  
! Wed Jul 26 04:21:28 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* Makefile.in (prefix-args): Pass ALL_LDFLAGS.
  
! 	* xdisp.c (syms_of_xdisp): Doc fix.
  
! 	* keyboard.c (kbd_buffer_get_event): Update input_pending after
! 	discarding one event from the queue, if we process the event here.
! 	(swallow_events): Likewise.
  
! Tue Jul 25 16:18:18 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* m/iris4d.h (LIBS_MACHINE): Delete -lsun.
! 	* s/irix3-3.h (LIBS_SYSTEM): Defined.
  
! 	* frame.h (struct frame): Rename `display' member to `output_data'.
! 	Use new data type name for output_data.x.
! 	* xterm.h (struct x_output): Renamed from struct x_display.
! 	* xterm.c, xfns.c, xmenu.c, dispnew.c, frame.c, xfaces.c: Do renamings:
! 	frame->display => frame->output, struct x_display -> struct x_output.
  
! Tue Jul 25 15:25:56 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* lisp.h (Frun_hook_with_args): Declare this function.
! 	* eval.c (Frun_hook_with_args): New C function, formerly in subr.el.
! 	* insdel.c (signal_before_change): Use Frun_hook_with_args.
! 	(signal_after_change): Likewise.
  
! Mon Jul 24 22:28:24 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xterm.c (next_noop_dpyinfo): New variable.
! 	(XTread_socket): Use that to cycle through all displays for XNoOp.
  
! Mon Jul 24 22:06:44 1995  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
  
! 	* undo.c (Fprimitive_undo): Don't end inner loop
! 	just because a previous-modtime doesn't match any more.
  
! Mon Jul 24 21:41:23 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* process.c (Fstart_process):
! 	Don't expand the file name before trying openp.
  
! Sun Jul 23 03:09:39 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xterm.h (struct x_display): New fields saved_button_event, id.
! 	* termhooks.h (enum event_kind): Added menu_bar_activate_event.
! 	* xterm.c (XTread_socket) [USE_X_TOOLKIT]: For ButtonPress in menu bar,
! 	save the event--don't pass to Xt yet.  Make a menu_bar_activate_event.
! 	(temp_index, temp_buffer): Now static.
! 	* keyboard.c (kbd_buffer_get_event) [USE_X_TOOLKIT]:
! 	Handle menu_bar_activate_event by calling x_activate_menubar.
! 	* xmenu.c: Include buffer.h.
! 	(x_activate_menubar): New function.
! 	(set_frame_menubar): New arg deep_p.  Callers changed.
! 	Run various hooks here when deep_p is true.
! 	(frame_vector): Variable deleted.
! 	(syms_of_xmenu): Don't staticpro it.
! 	(frame_vector_add_frame): Function deleted.
! 	(menubar_id_to_frame): New function.
! 	(menubar_selection_callback): Use menubar_id_to_frame.
! 	(next_menubar_widget_id): New variable.
! 	(set_frame_menubar): Use next_menubar_widget_id.
! 	(free_frame_menubar): Get id from f->display.x->id.
  
! 	* xdisp.c (update_menu_bar): Pass new arg to set_frame_menubar.
! 	* xfns.c (x_menubar_window_to_frame): New function.
  
! 	* window.c (Fprevious_window, Fnext_window): When minibuf = nil,
! 	accept only the minibuffer window that is currently active.
  
! Fri Jul 21 01:11:06 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* lread.c (read_list): When a file loaded from site-init.el uses #$,
! 	turn it into a relative file name starting with ../lisp.
  
! 	* dispnew.c (update_frame): Check that the echo area is in the
! 	frame being displayed.
  
! 	* keyboard.c (command_loop_1): Clear echo area after 2 sec
! 	only if the minibuffer is in the same place as the echo area.
  
! 	* window.h (echo_area_window): Declared.
  
! 	* xdisp.c (echo_area_display): Use selected frame's minibuf window
! 	but don't set the minibuf_window (don't call choose_minibuffer_frame).
! 	(message2_nolog, message): Likewise.
! 	(echo_area_window): New variable.
! 	(echo_area_display): Set echo_area_window.
! 	(redisplay_window): Distinguish minibuf_window and echo_area_window.
  
! 	* fileio.c (do_auto_save_unwind): Set auto_saving to 0.
! 	(Fdo_auto_save): Don't clear auto_saving here.  Set it to 1
! 	only when we make the unwind-protect.
  
! 	* xdisp.c (redisplay): Skip shortcuts if buffer's clip_changed is set.
! 	(redisplay_window): If buffer's clip_changed is set, update mode line.
  
! 	* frame.c (do_switch_frame): Don't call choose_minibuffer_frame.
! 	(choose_minibuf_frame): Choose frame regardless of minibuffer level.
! 	* minibuf.c (read_minibuf): Call choose_minibuffer_frame.
! 	First save the previous minibuf_window.
! 	(read_minibuf_unwind): Restore old minibuf_window.
  
! Thu Jul 20 17:07:19 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* s/aix4.h (AIX4): New definition.
! 	* m/ibmrs6000.h (LD_SWITCH_MACHINE) [AIX4]: New alternate definition.
  
! 	* xmenu.c (set_frame_menubar): If the Lisp-level menu bar menus
! 	are unchanged, don't recompute the widgets.
  
! 	* xmenu.c (syms_of_xmenu): Set up Qdebug_on_next_call.
! 	(set_frame_menubar): Bind it to nil.
  
! 	* fileio.c (Ffile_modes) [DOS_NT]: Use check_executable.
! 	(check_executable): DOS_NT code moved here from Ffile_modes.
! 	(check_writable): New code for MSDOS.
  
! 	* editfns.c (Fformat): Doc fix.
  
! Thu Jul 20 16:23:21 1995  Karl Heuer  <kwzh@gnu.ai.mit.edu>
  
! 	* fns.c (Fsafe_length): Return a conservative upper bound.
  
! Thu Jul 20 13:43:28 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* editfns.c (Fsubst_char_in_region):
! 	Bind buffer-file-name to nil if NOUNDO is true.
  
! 	* insdel.c (prepare_to_modify_buffer): Don't lock the file
! 	if current_buffer->filename is nil.
  
! 	* msdos.c (init_environment): Move alloca call out of function arg.
  
! 	* puresize.h [!MULTI_FRAME] (BASE_PURESIZE): Increased to 325000.
  
! Wed Jul 19 11:51:23 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* textprop.c (Fget_char_property): If OBJECT is non-current buffer,
! 	use it properly for overlays_at.
  
! Tue Jul 18 00:35:09 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* alloc.c (init_alloc_once): Set gc_cons_threshold from Lisp obj size.
  
! 	* editfns.c (Fmessage): Doc fix.
! 	(Fformat): Increment total for size of control string.
  
! 	* window.c (Fwindow_start): Doc fix.
  
! 	* xfaces.c (unload_color): Don't free colors if immutable colormap.
  
! 	* eval.c (Ffuncall, Fapply): Doc fix.
  
! 	* callint.c (Fcall_interactively): Doc fix.
  
! 	* fileio.c (Fexpand_file_name): Initial ~ means name is absolute.
  
! 	* config.in: Renamed from config.h.in.
! 	* paths.in: Renamed from paths.h.in.
! 	* Makefile.in: Renamed from Makefile.in.in.
! 	(paths.h): Depend on paths.in.
! 	(config.h): Depend on config.in.
! 	(distclean): Delete Makefile.c, not Makefile.in.
! 	(SOURCES): Corresponding changes.
  
! 	* callproc.c (init_callproc): Set Vdoc_directory based on
! 	Vinstallation_directory when that's non-nil, regardless of whether
! 	we had to set Vexec_directory.
  
! 	* unexsunos4.c (unexec): If not SUNOS4_SHARED_LIBRARIES
! 	or if apparently not dynamically linked, just clear rel and erel.
  
! 	* s/sunos4shr.h (SUNOS4_SHARED_LIBRARIES): Defined.
  
! Tue Jul 18 00:35:09 1995  Mikael Djurfeldt  <mdj@kidjo.nada.kth.se>
  
! 	* xdisp.c (decode_mode_spec): New arg spec_width.
!   	Use pint2str for %l and %c.  New code to output ??.
!  	(display_mode_element): New var minendcol.
! 	Pass new arg to decode_mode_spec.
! 	(pint2str): New function.
  
! Mon Jul 17 20:29:54 1995  Karl Heuer  <kwzh@kropotkin.gnu.ai.mit.edu>
  
! 	* bytecode.c (Fbyte_code): Fix variable names in previous change.
  
! Mon Jul 17 20:12:34 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xfns.c [USE_MOTIF]: Don't include X11/Xaw/Paned.h, X11/Xaw/Label.h.
  
! Sun Jul 16 12:51:08 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* keyboard.c (kbd_buffer_get_event): Discard a selection_clear_event
! 	before processing it.
  
! 	* bytecode.c (Fbyte_code): For Beqlsign, if both args are ints,
! 	compare as ints.
  
! 	* xterm.c [HAVE_X11XTR6]: Include locale.h
! 	(x_term_init) [HAVE_X11XTR6]: Set LC_NUMERIC and LC_TIME back to C.
  
! 	* data.c (Fnumber_to_string): Make `buffer' long enough.
  
! Sat Jul 15 10:41:35 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* xselect.c (x_clear_frame_selections): Delete duplicate code.
  
! 	* alloc.c (Flist): Rewritten.
  
! Thu Jul 13 07:17:08 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* dispnew.c (Fsit_for): Don't call prepare_menu_bars here.
  
! 	* emacs.c (main): Add to usage message.
  
! 	* s/netbsd.h (AMPERSAND_FULL_NAME): Defined.
  
! Wed Jul 12 23:13:15 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* s/sco4.h (SCO_R4): Defined.
  
! Mon Jul 10 02:14:37 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* floatfns.c (Fexpt): Use EMACS_INT for integer calculation.
! 	(Ffloor): Likewise.
  
! Sun Jul  9 03:10:06 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* buffer.c (last_overlay_modification_hooks): New variable.
! 	(last_overlay_modification_hooks_used): Likewise.
! 	(syms_of_buffer): Init last_overlay_modification_hooks.
! 	(add_overlay_mod_hooklist): New function.
! 	(call_overlay_mod_hooks): Call add_overlay_mod_hooklist.
! 	(report_overlay_modification): When AFTER is non-nil,
! 	call the functions recorded in last_overlay_modification_hooks.
  
! 	* s/aix4-1.h (_setjmp, _longjmp): Add #undef's.
  
! 	* alloc.c (allocating_for_lisp): New variable.
! 	(init_intervals, make_interval, init_symbol, Fmake_symbol)
! 	(init_float, make_float, init_cons, Fcons)
! 	(allocate_vectorlike, init_marker, allocate_misc)
! 	(init_strings, make_uninit_string): Set allocate_misc temporarily.
  
! 	* Makefile.in.in (TAGS): Use etags from build dir, but make TAGS
! 	file in source dir.
! 	(${lispsource}TAGS): Renamed from ../lisp/TAGS.  Deps changed too.
! 	(tags): Corresponding changes.
! 	(lisptagsfiles): Delete the term/*.el files.
  
! 	* fileio.c (Fwrite_region): If fsync fails with EINTR, don't
! 	report a Lisp error.
  
! Sat Jul  8 11:59:50 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* process.c (keyboard_bit_set): Fix one-off in loop end.
  
! Fri Jul  7 01:00:29 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* keymap.c (current_minor_maps): Catch errors in Findirect_function.
! 	(current_minor_maps_error): New function.
  
! Thu Jul  6 06:40:37 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* frame.h (struct frame): New field `mouse_moved'.
! 	* keyboard.c (mouse_moved): Variable deleted.
! 	(kbd_buffer_get_event, readable_events):
! 	Check mouse_moved in all frames.
! 	Check do_mouse_tracking for non-nil ness.
! 	(Ftrack_mouse): Set do_mouse_tracking to t.
! 	* xterm.c (note_mouse_movement): Set mouse_moved in the x_display_info.
! 	(XTmouse_position, x_scroll_bar_note_movement): Likewise.
! 	(x_scroll_bar_report_motion): Likewise.
  
! 	* xterm.c (x_draw_box, x_display_box_cursor, x_display_bar_cursor):
! 	New args x, y.  Don't use curs_x or curs_y here.  Callers changed.
  
! 	* ntinevt.c (win32_mouse_position, mouse_moved_to):
! 	Access mouse_moved in selected_frame.
! 	* msdos.c (mouse_get_pos, mouse_check_moved, XMenuActivate):
! 	Access mouse_moved in selected_frame.
  
! 	* lread.c (Fread): Rename arg READCHARFUN to STREAM.
  
! 	* xfns.c (Fx_list_fonts): Don't free thisinfo if it is 0.
  
! 	* sysdep.c (sys_close): Handle Sunos 4.1 bug in close errno value.
  
! Wed Jul  5 07:17:02 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
  
! 	* Makefile.in.in (lispsource): Renamed from lispdir.
  
! 	* sysdep.c (init_system_name): Add cast in init for fqdn.
  
! Mon Jul  3 09:51:41 1995  Michael Shields  <shields@tembel.org>
  
! 	* m/intel386.h [linux]: Include values.h and #undef
! 	certain macros, to avoid conflict later.
  
! Thu Jul  6 14:29:14 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
  
! 	* s/irix6-0.h [!__GNUC__] (LD_SWITCH_SYSTEM): Define this.
  
! 	* s/usg5-4-2.h (LIB_MOTIF, VFORK_RETURN_TYPE): Define these.
  
! 	* xterm.c (x_initialize) [USE_X_TOOLKIT]: Set fallback resources.
  
! 	* window.c (Fset_window_hscroll): Set clip_changed in the buffer.
! 	(temp_output_buffer_show): Likewise.
  
! 	* lisp.h (get_keymap_1): Declared.
  
! 	* editfns.c (Fwiden): Set clip_changed in current buffer.
! 	(Fnarrow_to_region, save_restriction_restore): Likewise.
  
! 	* buffer.c (overlays_in): Don't count empty overlays at END.
! 	(Foverlays_in): Likewise.
  
! Sun Jul  2 02:02:44 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* keyboard.c (read_char): Temporarily clear Vquit_flag
! 	while checking Vspecial_event_map.
  
! 	* xdisp.c (redisplay_window): Fix typos in clip_changed change.
  
! 	* buffer.h (struct buffer): New field clip_changed.
  
! 	* xdisp.c (clip_changed): Variable deleted.
! 	(prepare_menu_bars): Don't look at clip_changed.
! 	(redisplay): Don't set clip_changed.  Do set b's clip_changed.
! 	(redisplay_window): Check clip_changed in current_buffer.
! 	(mark_window_display_accurate): Clear clip_changed
! 	in the window's buffer.
  
! Sat Jul  1 01:01:17 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* keyboard.c (Vspecial_event_map): New variable.
! 	(syms_of_keyboard): Define Lisp var; init the map.
! 	(read_char): Look up each event in Vspecial_event_map; if bound,
! 	execute the binding here and read another event.
! 	(keys_of_keyboard): Make bindings for iconify-frame,
! 	make-frame-visible and delete-frame.
  
! 	* fns.c (Fsafe_length): New function.
! 	(syms_of_fns): defsubr it.
! 	* lisp.h (Fsafe_length): Declared.
! 	* xfaces.c (compute_char_face): Use Fsafe_length.
  
! 	* s/aix4-1.h (sigsetmask): Add #undef.
  
! 	* s/riscos5.h: New file.
  
! 	* xfns.c (x_set_icon_type, x_set_icon_name): Don't ever remap the
!  	frame window; changing the icon doesn't make it disappear.
  
! 	* process.c (Fstart_process): Expand PROGRAM.
!   	Error if it is a directory.
  
! 	* s/sunos4shr.h (LIBXMU): New definitions (two alternative ones).
  
! 	* s/sunos4-1-3.h: Don't use sunos4shr.h; go back to 19.28 definition.
  
! Fri Jun 30 16:58:15 1995  Geoff Voelker  (voelker@cs.washington.edu)
  
! 	* nt.c (PASSWD_FIELD_SIZE): Defined.
! 	(the_passwd_name, the_passwd_passwd, the_passwd_gecos,
! 	the_passwd_dir, the_passwd_shell, getpwuid): Use PASSWD_FIELD_SIZE.
! 	(get_emacs_configuration): Check if processor macros are defined.
  
! 	* ntheap.c: Include config.h.
! 	(syspage_mask, real_data_region_end): Defined.
! 	(allocate_heap) [WINDOWS95]: Reverse conditional, end search
! 	at 0xD00000.
! 	(sbrk): Commit and uncommit memory in machine dependent
! 	page size chunks.
  
! 	* s/windows95.h (CANNOT_DUMP): Undefined.
! 	* makefile.nt (EMACS) [win95]: Removed.
  
! 	* makefile.nt (TLASTLIB): Defined.
! 	(TEMACS): Use TLASTLIB.
! 	* unexnt.c (get_section_info): Set the end of the data region
! 	to be just before the start of the shared library data.
! 	(read_in_bss): Read directly into memory.
! 	(map_in_heap): Read directly into memory if unable to map.
  
! Fri Jun 30 03:58:33 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* s/hpux9.h (LIBX11_SYSTEM): Add undef.
  
! 	* m/intel386.h [SOLARIS] (LIBS_MACHINE): Move this out of the
! 	SOLARIS2_4 conditional.
  
! 	* xdisp.c (redisplay_window): Update individual window's mode line
! 	if %c calls for an update.
! 	(redisplay): Set update_mode_line for selected window only,
! 	if it needs this because of %c.
  
! Thu Jun 29 11:54:39 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* s/aix3-2-5.h (C_OPTIMIZE_SWITCH, C_DEBUG_SWITCH): Use these
! 	names instead of C_SWITCH_OPTIMIZE, C_SWITCH_DEBUG.
  
! 	* s/aix4.h: Include aix3-2.h, not aix3-2-5.h.
  
! 	* callproc.c (child_setup): Don't get confused if in == err.
  
! 	* xterm.c (XTread_socket): Turn off meta, super, hyper and alt bits
! 	in the arg for XLookupKey.
  
! Wed Jun 28 18:50:19 1995  Morten Welinder  <terra+@cs.cmu.edu>
  
! 	* unexmips.c [MACH]: Include a.out.h.
! 	[MACH] (STYP_INIT, _RDATA, STYP_RDATA, _SDATA, STYP_SDATA): Defined.
! 	[MACH] (_SBSS, STYP_SBSS, HDRR, pHDRR): New definitions.
! 	(unexec): Add MACH conditionals.
  
! 	* m/pmax.h [MACH]: Use built-in alloca, set START_FILES.
  
! 	* s/mach-bsd4-3.h: New file.
  
! Wed Jun 28 02:07:24 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* term.c (term_init): Alternative error messages for TERMCAP/TERMINFO.
  
! 	* m/alpha.h (PTY_ITERATION, PTY_NAME_SPRINTF, PTY_OPEN)
! 	(PTY_TTY_NAME_SPRINTF): New definitions.
  
! 	* dispnew.c (update_frame): Pretend cursor is in echo area
! 	rather than put it in a minuffer hidden by the echo area.
  
! Tue Jun 27 04:28:21 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* s/hpux9.h (LIBXMU): New definition.
  
! 	* s/hpux9-x11r4.h, s/hpux9shxr4.h: New files.
  
! 	* xmenu.c (single_submenu): Handle commands appearing directly
! 	in the menu bar.
  
! Mon Jun 26 02:40:10 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xterm.c (x_display_bar_cursor, x_display_box_cursor):
! 	Don't alter curs_x or curs_y here.
! 	(x_display_cursor): Copy them from the frame cursor here.
! 	(x_update_cursor): New function.
! 	(frame_highlight, frame_unhighlight): Use x_update_cursor.
  
! 	* xdisp.c (echo_area_display): Don't set FRAME_CURSOR_... here.
! 	(redisplay): In the "point hasn't moved" shortcut,
! 	make sure that the cursor is in the right window already.
  
! 	* msdos.c (IT_cursor_to, IT_clear_end_of_line, IT_write_glyphs):
! 	(IT_set_face): Call internal_flush if short of room.
  
! Sun Jun 25 16:38:41 1995  Morten Welinder  <terra+@cs.cmu.edu>
  
! 	* emacs.c (init_cmdargs): Make Vinvocation_directory
! 	absolute if it isn't already.
  
! Sun Jun 25 01:15:31 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* frame.c (Fdelete_frame): It's ok to have no minibuffer left on
! 	a kboard if there are no frames on it either.
  
! 	* buffer.c (overlays_in): New function.
! 	(Foverlays_in): New function.
! 	(syms_of_buffer): defsubr it.
  
! 	* xfns.c (Fx_open_connection, x_display_info_for_name):
! 	Error if window-system is not x.
  
! 	* process.c (Fopen_network_stream): Sleep 1 sec before connect retry.
  
! 	* frame.c (next_frame, prev_frame): Consider only frames on same kbd.
! 	(Fdelete_frame): If next_frame finds nothing, try an alternative.
  
! 	* buffer.c (overlay_strings): Fix calls to xrealloc.
  
! Sat Jun 24 00:06:46 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* s/aix4-1.h (LIB_MOTIF): Defined.
  
! 	* emacs.c (main): Fix --help message.
  
! 	* window.c (Fsplit_window): Nicer error if split size is too small.
  
! 	* Makefile.in.in (LIBXMU): New macro.
! 	(LIBXT): Use LIBXMU.
  
! Fri Jun 23 19:29:53 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* fileio.c (directory_file_name): Don't get confused by // at end
! 	on Unix-like systems.
  
! Thu Jun 22 10:47:43 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* xmenu.c (menu_item_enabled_p_1): Special handling for quit.
! 	(set_frame_menubar): Inhibit quitting.
  
! Wed Jun 21 19:06:36 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
  
! 	* buffer.c (syms_of_buffer): Doc fix.
  
! 	* Makefile.in.in (SOME_MACHINE_OBJECTS): Add dosfns.o,
! 	intervals.o, textprop.o.
  
! See ChangeLog.5 for earlier changes.
diff -2rcpP --exclude=*.elc emacs-19.30/src/ChangeLog.5 emacs-19.31/src/ChangeLog.5
*** emacs-19.30/src/ChangeLog.5	Wed Dec 31 19:00:00 1969
--- emacs-19.31/src/ChangeLog.5	Fri Jan  5 02:57:00 1996
***************
*** 0 ****
--- 1,7144 ----
+ Wed Jun 21 14:08:45 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* Version 19.29 released.
+ 
+ 	* xfns.c (Fx_display_grayscale_p): Return t or nil.
+ 	Return t for color displays.
+ 
+ 	* s/msdos.h (SYSTEM_PURESIZE_EXTRA): Increased to 68000.
+ 
+ 	* xdisp.c (decode_mode_spec) [!MULTI_FRAME]: Handle %F properly.
+ 
+ Tue Jun 20 10:58:14 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* keyboard.c (read_key_sequence): Don't use Vprefix_help_command
+ 	for the first character in a key seq.
+ 
+ 	* ntinevt.c (map_virt_key): Mark some additional chars as valid ASCII.
+ 
+ 	* ntterm.c (ctrl_c_handler): Ignore CTRL_BREAK_EVENT signals.
+ 
+ Mon Jun 19 12:13:38 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* sysdep.c (rmdir): Fix up Aug 19 1993 change that wasn't done right.
+ 
+ 	* ntproc.c (win32_wait): Massage retval into what is expected in Unix.
+ 
+ 	* process.c (sigchld_handler): Change XSETFASTINT to XSETINT.
+ 
+ 	* keyboard.c (Freset_this_command_lengths): New function.
+ 	(before_command_key_count, before_command_echo_length)
+ 	(before_command_restore_flag): New variables.
+ 	(add_command_key): If requested, reset the lengths.
+ 	(command_loop_1): Record current lengths before reading cmd.
+ 	(read_char): Update the recorded length before echoing.
+ 
+ 	* xfns.c (Fx_create_frame): Fix last arg to x_get_arg for Qdisplay.
+ 
+ 	* s/linux.h (LIB_GCC): Fix previous change.
+ 	If we redefine it later, #undef it first.
+ 
+ Sun Jun 18 14:24:37 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* keyboard.c (quit_throw_to_read_char): Turn off the error check
+ 	testing poll_suppress_count.
+ 
+ 	* s/linux.h (LIB_GCC): Define here, overriding Makefile.in.in,
+ 	so as to use C_SWITCH_X_MACHINE.
+ 
+ Sat Jun 17 10:05:04 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* m/alpha.h (SYSTEM_MALLOC): Definition deleted.
+ 
+ 	* keymap.c (Vdefine_key_rebound_commands): New variable.
+ 	(syms_of_keymap): Set up Lisp var.
+ 	(Fdefine_key): Put new definition onto Vdefine_key_rebound_commands.
+ 
+ 	* xmenu.c (menu_item_equiv_key): Do reconsider a command that had
+  	no equivalent before, if it is in Vdefine_key_rebound_commands.
+ 
+ 	* data.c (Flocal_variable_if_set_p): New function.
+ 	(syms_of_data): Call defsubr.
+ 
+ 	* xdisp.c (display_text_line): Fill in charstart for end of buffer.
+ 
+ Fri Jun 16 18:26:08 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* puresize.h [MULTI_FRAME] (BASE_PURESIZE): Increase to 315000.
+ 
+ 	* frame.c (Fdelete_frame): Use do_switch_frame directly.
+ 	(do_switch_frame): No longer static.
+ 	* window.c (Fset_window_configuration): Use do_switch_frame directly.
+ 	* keyboard.c (quit_throw_to_read_char): Use do_switch_frame directly.
+ 	* lisp.h (do_switch_frame): Declared.
+ 
+ Fri Jun 16 18:17:59 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* frame.c [MULTI_FRAME] (Fignore_event): New function.
+ 	[MULTI_FRAME] (keys_of_frame): Bind iconify-frame and
+ 	make-frame-visible to it.
+ 
+ Fri Jun 16 00:30:17 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* .gdbinit: Use long, not EMACS_INT.
+ 	Do `set main' to make gdb_valbits etc. available.
+ 
+ 	* frame.h (struct frame): New field icon_name.
+ 	* xterm.h (struct x_display): icon_name deleted.
+ 	* xfns.c (x_report_frame_params, x_set_icon_type, x_set_icon_name)
+ 	(x_set_name, x_icon, Fx_create_frame): Use moved icon_name field.
+ 	* alloc.c (mark_object): Mark icon_name field.
+ 
+ Thu Jun 15 16:48:21 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* keyboard.h (struct kboard): Add Voverriding_terminal_local_map.
+ 	* keyboard.c (init_kboard): Initialize it.
+ 	(syms_of_keyboard): Defvar it.
+ 	(read_key_sequence, menu_bar_items):
+ 	Check Voverriding_terminal_local_map before Voverriding_local_map.
+ 	* doc.c (Fsubstitute_command_keys): Likewise.
+ 	* keymap.c (Fkey_binding, describe_buffer_bindings): Likewise.
+ 
+ 	* xdisp.c (Qoverriding_terminal_local_map): New variable.
+ 	(syms_of_xdisp): staticpro it.
+ 	(update_menu_bar): If we bind overriding-local-map, also bind
+ 	overriding-terminal-local-map.
+ 
+ 	* frame.c (Fhandle_switch_frame): Preserve prefix arg.
+ 	* keyboard.c (command_loop_1): In special handling for commands
+ 	that create a prefix arg, don't handle commands that merely
+ 	preserve one that was previously created.
+ 
+ 	* .gdbinit ($valmask): Use EMACS_INT, not int.
+ 
+ 	* lisp.h (enum pvec_type): Don't use trailing comma.
+ 
+ Thu Jun 15 09:58:49 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* m/alpha.h (malloc, realloc): If not _MALLOC_INTERNAL,
+ 	always use void *.
+ 
+ Thu Jun 15 22:12:04 1995  Geoff Voelker  <voelker@cs.washington.edu>
+ 
+ 	* callproc.c (call-process-region) [DOS_NT]: Use IS_DIRECTORY_SEP.
+ 	(call-process-region) [WINDOWSNT]: Use proper temp file template.
+ 
+ 	* ntproc.c (win32_spawnve): Accept program names without executable
+ 	suffixes.
+ 
+ 	* makefile.nt (TRES) [MSVCNT11]: Use emacs.res, and don't compile it.
+ 
+ Thu Jun 15 01:30:14 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* m/alpha.h (LD_SWITCH_MACHINE): Don't define it.
+ 	(malloc, realloc): If non-ANSI C, declare value as char *.
+ 
+ Wed Jun 14 19:10:35 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* sysdep.c (emacs_set_tty): Swap TCSETAF and TCSETAW.
+ 	Rename arg waitp to flushp.
+ 
+ Wed Jun 14 18:07:40 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* callint.c (Fprefix_numeric_value): Fix type check.
+ 
+ 	* keyboard.c (command_loop_1): Clear prefix arg (undo Feb 1 change).
+ 
+ Wed Jun 14 15:52:55 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* data.c (Flocal_variable_p): Fix backwards logical operator.
+ 
+ Wed Jun 14 14:47:53 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* m/intel386.h: If NOT_C_CODE, don't include alloca.h.
+ 	[!__GNUC__] (C_SWITCH_MACHINE): Disable this; it seems to confuse cpp.
+ 
+ Wed Jun 14 08:21:18 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* frame.c (Fdelete_frame): If the minibuf window was selected,
+ 	make that remain so.
+ 
+ 	* process.c (status_notify): Undo May 18 change.
+ 	Set update_tick at the beginning not at end.
+ 
+ 	* buffer.c (Fprevious_overlay_change): Check for overlays that
+ 	end at POS.
+ 
+ Tue Jun 13 20:40:48 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xfns.c (syms_of_xfns): Initialize Vx_no_window_manager.  Doc fix.
+ 
+ Tue Jun 13 17:43:12 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* m/ibmrs6000.h (LIBS_MACHINE): Use -lpthreads, not -lpthread.
+ 	* config.h.in (HAVE_LIBPTHREADS): Add #undef.
+ 
+ Mon Jun 12 13:21:15 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* mem-limits.h [_LIBC] (start_of_data): Define to &__data_start
+  	for GNU libc.
+ 
+ Sun Jun 11 16:46:37 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
+ 
+ 	* xmenu.c (frame_vector_add_frame): Don't forget to store
+ 	the longer vector.
+ 
+ 	* xterm.h (struct x_display): New field asked_for_visible.
+ 	* xterm.c (x_make_frame_visible): Test and set asked_for_visible.
+ 
+ 	* widget.c (EmacsFrameSetCharSize): Manually alter the height
+ 	and width of the outer widget (and the width of the column widget)
+ 	carefully using deltas.
+ 	Set update_hints_inhibit nonzero while updating.
+ 	Then call update_wm_hints explicitly.
+ 	(update_wm_hints): Use 0 for min_rows, min_cols.
+ 	Do nothing if update_hints_inhibit is nonzero.
+ 
+ 	* xterm.c: Include widget.h.
+ 	(x_wm_set_size_hint) [USE_X_TOOLKIT]:
+ 	Get the size from the outer widget.
+ 	Copy the base and minimum sizes from the old hint.
+ 
+ 	* xfns.c [USE_X_TOOLKIT] (x_window): If using Motif,
+ 	add some extra to sizes, for consistent behavior.
+ 
+ Sat Jun 10 00:57:13 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
+ 
+ 	* dispnew.c (Fframe_or_buffer_changed_p): Calculate vector size right.
+ 	Add hysteresis when making it larger.  Fill it up reliably
+ 	and check at the end for overflowing it.
+ 	(syms_of_display): Make frame_and_buffer_state initially with 20 elts.
+ 
+ 	* keyboard.c (read_char_minibuf_menu_prompt):
+ 	If the char to type doesn't match the prompt string,
+ 	show the char explicitly.
+ 
+ Sat Jun 10 17:44:38 1995  Geoff Voelker  <voelker@cs.washington.edu>
+ 
+ 	* ntterm.c,ntproc.c,nt.c: Include config.h before stdio.h.
+ 
+ Fri Jun  9 22:11:59 1995  Geoff Voelker  <voelker@cs.washington.edu>
+ 
+ 	* makefile.nt (TEMACS): Depend upon $(BLD).
+ 	(temacs): Remove $(BLD) dependency.
+ 
+ Fri Jun  9 17:05:27 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
+ 
+ 	* xterm.c (x_get_keysym_name): New function.
+ 	* keyboard.c (modify_event_symbol): Mask out high bits here,
+ 	and only for certain purposes.  table_size now unsigned.
+ 	(modify_event_symbol) [HAVE_X_WINDOWS]:	Use x_get_keysym_name.
+ 	(make_lispy_event): Don't mask high bits here.
+ 	Supply -1 as table_size for system-specific keys.
+ 
+ 	* xdisp.c (update_menu_bar): Use set_buffer_internal_1 to switch bufs.
+ 	Run the hooks in the proper buffer.
+ 	Normally bind overriding-local-map to nil.
+ 	(Qoverriding_local_map): New variable.
+ 	(syms_of_xdisp): staticpro it.
+ 
+ Fri Jun  9 11:44:06 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* keyboard.h (struct kboard): New member system_key_syms.
+ 	* alloc.c (mark_kboards): Mark it.
+ 	* keyboard.c (system_key_syms): Deleted; now part of struct kboard.
+ 	(make_lispy_event): Use the struct member.
+ 	(init_kboard): Initialize it.
+ 	(syms_of_keyboard): Delete initialization and staticpro.
+ 
+ 	* Makefile.in.in (SOURCES): Makefile isn't source; Makefile.in.in is.
+ 
+ Thu Jun  8 15:00:47 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
+ 
+ 	* keyboard.c (Fevent_convert_list): Renamed from
+ 	convert_event_type_list.
+ 	(syms_of_keyboard): defsubr it.
+ 	* keymap.c (Flookup_key, Fdefine_key): Use Fevent_convert_list.
+ 
+ 	* xmenu.c (xmenu_show): Do call lw_destroy_all_widgets.
+ 	(xdialog_show): Likewise.
+ 	(popup_get_selection): Don't call it here.
+ 
+ 	* search.c (Freplace_match): Fix check for valid reg in string replace.
+ 	Do the right thing with backslash.
+ 
+ 	* keyboard.c (Vhelp_event_list): New var.
+ 	(syms_of_keyboard): Set up Lisp var.
+ 	(help_char_p): New function.
+ 	(read_char, echo_char, read_key_sequence): Use help_char_p.
+ 
+ 	* keyboard.h (Vlucid_menu_bar_dirty_flag): Declare this variable.
+ 	(Qrecompute_lucid_menubar, Qactivate_menubar_hook): Likewise.
+ 
+ 	* keyboard.c (read_key_sequence): Don't run activate-menubar-hook
+ 	or call recompute-lucid-menubar.
+ 
+ 	* xdisp.c (update_menu_bar): Run activate-menubar-hook
+ 	and call recompute-lucid-menubar.
+ 
+ Thu Jun  8 15:13:39 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* commands.h (last_command): Declaration deleted.
+ 	* keyboard.h (struct kboard): New member Vlast_command.
+ 	* keyboard.c (last_command): Var deleted; now part of struct kboard.
+ 	(init_kboard): Initialize it.
+ 	(syms_of_keyboard): Defvar it.
+ 	(command_loop_1): Make last_command be kboard-local.
+ 	* cmds.c (internal_self_insert): Likewise.
+ 	* minibuf.c (Fminibuffer_complete): Likewise.
+ 
+ 	* m/ibmrs6000.h (LIBS_MACHINE): Use -lpthread if it exists.
+ 
+ 	* m/alpha.h (LIBS_MACHINE): Define to -ldnet or -ldnet_stub.
+ 
+ 	* s/msdos.h (SYSTEM_PURESIZE_EXTRA) [!HAVE_X_WINDOWS]:
+ 	Increase to 62000.
+ 
+ 	* process.c [!subprocesses]: Include sysselect.h.
+ 
+ 	* xmenu.c (xmenu_show): If !HAVE_X_WINDOWS, don't reference X display.
+ 
+ Wed Jun  7 14:37:31 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* keyboard.h (struct kboard): member Vprefix_arg restored, replacing
+ 	prefix_factor, prefix_value, prefix_sign, and prefix_partial.
+ 	* callint.c (current_prefix_partial): Deleted.
+ 	(Vprefix_arg): Deleted; not part of struct kboard again.
+ 	(Funiversal_argument, Fnegative_argument, Fdigit_argument)
+ 	(clear_prefix_arg, finalize_prefix_arg, describe_prefix_arg): Deleted.
+ 	(syms_of_callint): Use DEFVAR_KBOARD for Vprefix_arg.
+ 	Remove defsubrs for deleted functions.
+ 	* lisp.h: Remove declarations for deleted vars and functions.
+ 	* alloc.c (mark_kboards): Mark Vprefix_arg instead of
+ 	prefix_factor and prefix_value.
+ 	* macros.c (Fexecute_kbd_macro): Vprefix_arg is now part of kboard.
+ 	* keyboard.c (cmd_error, command_loop_1, Fcommand_execute)
+ 	(Fexecute_extended_command, init_kboard, syms_of_keyboard):
+ 	Undo Feb 28 change; prefix arg handling is now in Lisp code again.
+ 
+ 	* buffer.c: (syms_of_buffer): Doc fix.
+ 
+ 	* buffer.c: (Fbuffer_disable_undo): Make this function interactive.
+ 
+ Wed Jun  7 11:08:58 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
+ 
+ 	* data.c (Flocal_variable_p): New optional arg BUFFER.
+ 	Really check whether var is local in *that* buffer.
+ 
+ 	* xfns.c (x_real_positions): Uncatch and recatch X errors in the loop.
+ 
+ 	* filelock.c (unlock_file, lock_file): Call Fexpand_file_name.
+ 
+ Mon Jun  5 13:30:54 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* Makefile.in.in (TOOLKIT_DEFINES): Define.
+ 	(ALL_CFLAGS): Insert $(TOOLKIT_DEFINES) here.
+ 	* xfns.c (syms_of_xfns): Provide motif in Motif version.
+ 
+ 	* lisp.h: (Fwaiting_for_user_input_p): Function declared.
+ 	(Fupcase_initials, Fupcase_initials_region): Likewise.
+ 	(Fplist_get, get_local_map, Fx_popup_menu, Fx_popup_dialog): Likewise.
+ 	(Fframe_first_window): Likewise.
+ 	* keyboard.c (cmd_error): Use NULL, not 0, as arg to
+ 	cmd_error_internal.
+ 	(menu_bar_items): Likewise, for arg of current_minor_maps.
+ 	(record_char): Add cast.
+ 	* indent.c (Fvertical_motion): Add cast.
+ 	* undo.c (record_insert): Change args to be ints, not Lisp_Objects.
+ 	* casefiddle.c (casify_region): Use explicit local vars for start
+ 	and end, so that the type will be correct.
+ 	(operate_on_word): Likewise for iarg in this function.
+ 	(upcase_initials, upcase_initials_region): Deleted; these were
+ 	redundant copies of Fupcase_initials and Fupcase_initials_region.
+ 	* abbrev.c (Fexpand_abbrev): Call to upcase_initials_region
+ 	changed to Fupcase_initials_region for consistency.
+ 	* search.c (Freplace_match): Likewise.
+ 	* alloc.c: Declare sbrk.
+ 
+ 	* xdisp.c: Include keyboard.h.
+ 
+ 	* s/irix5-0.h (POSIX_SIGNALS): Defined.
+ 
+ Sat Jun  3 19:02:35 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
+ 
+ 	* xterm.c (x_wm_set_icon_pixmap): Set IconPixmapHint in both cases.
+ 
+ 	* buffer.c (Fkill_buffer): When killing indirect buffer,
+ 	unchain that buffer's markers (only) from the common chain.
+ 	Don't rekill this buffer's indirect buffers that are dead.
+ 	Do nothing if this buffer is already dead.
+ 
+ Sat Jun  3 12:57:01 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* editfns.c (Fencode_time): Doc fix.
+ 
+ 	* fns.c (NULL): Define if not defined.
+ 
+ Fri Jun  2 17:05:37 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
+ 
+ 	* xfns.c (Fx_create_frame): Make sure icon_name is a string or nil.
+ 
+ 	* xterm.h (struct x_display): Rename icon_label to icon_name
+ 	and make it a Lisp_Object.
+ 
+ 	* xfns.c (Qicon_name): New variable.
+ 	(Fx_create_frame): Look for icon-name parm and set icon_label field.
+ 	(x_set_icon_type): Compute arg to x_text_icon
+ 	based on frame name and icon_name fields.
+ 	(x_set_icon_name): New function.
+ 	(x_icon): Call x_text_icon.
+ 	(x_set_name): Look at icon_name field when setting the icon name,
+ 	(x_frame_parms): Add icon-name.
+ 	(syms_of_xfns): Set up Qicon_name.
+ 
+ 	* xterm.c (x_text_icon): Do call XSetIconName or XSetWMIconName.
+ 	Don't save ICON_NAME anywhere.
+ 
+ 	* sysdep.c (old_tty_valid): New variable.
+ 	(init_sys_modes): Set old_tty_valid if we set old_tty.
+ 	(reset_sys_modes): Restore tty settings only if old_tty_valid.
+ 
+ 	* term.c (cursor_to, clear_to_end_of_line_raw):
+ 	If chars_wasted is 0, do nothing.
+ 	(clear_end_of_line): Don't die if chars_wasted is 0.
+ 
+ 	* search.c (trivial_regexp_p): = is special after \.
+ 
+ 	* s/ptx.h (HAVE_SELECT, HAVE_TIMEVAL): Definitions deleted.
+ 
+ Thu Jun  1 18:47:56 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* xfns.c (x_destroy_bitmap): Block and unblock input.
+ 	(Fx_horizontal_line): Add one UNBLOCK_INPUT to fix a misbalance,
+ 	and move another one to include the call to XFreeGC, in case we
+ 	someday remove the "#if 0" conditions.
+ 	* widget.c (EmacsFrameDestroy): Block and unblock input.
+ 
+ Wed May 31 23:08:12 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
+ 
+ 	* xfns.c (x_display_info_for_name): Fix error message.
+ 	(Fx_open_connection): Fix error messages.
+ 
+ Tue May 30 17:49:03 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* s/sol2-4.h (LD_SWITCH_SYSTEM): Copied back from s/sol2-3.h;
+ 	added references to /usr/dt/lib.
+ 
+ 	* xfns.c (syms_of_xfns): Allow PATH_BITMAPS to be a
+ 	colon-separated list.
+ 
+ 	* editfns.c (syms_of_editfns): user-login-name renamed from user-name.
+ 	user-real-login-name renamed from user-real-name.
+ 	C names changed to Vuser_real_login_name, Vuser_login_name as well.
+ 	* nt.c: Change Vuser_real_name to Vuser_real_login_name.
+ 
+ Tue May 30 12:13:28 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
+ 
+ 	* xfns.c (x_top_window_to_frame): Don't match menu-bar widget.
+ 
+ 	* xdisp.c (update_menu_bar): Reverse test of save_match_data.
+ 
+ 	* xmenu.c (set_frame_menubar): Always call update_frame_menubar.
+ 
+ 	* xfns.c (x_window): Use applicationShellWidgetClass,
+ 	not topLevelShellWidgetClass.  Call lw_set_main_areas after
+ 	creating the menubar widget.
+ 
+ Mon May 29 16:53:49 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* xdisp.c (update_menu_bar): Do update if region display has changed.
+ 
+ 	* frame.c (make_frame_without_minibuffer): New arg DISPLAY.
+ 	If there's no minibuffer frame to use, create one.
+ 	* xfns.c (Fx_create_frame): Pass new arg to
+ 	make_frame_without_minibuffer.
+ 
+ 	* fns.c (Frandom): Use EMACS_INT, not int.
+ 	Use NULL, not 0, as arg of `time'.
+ 
+ 	* frame.c: Declare x_get_focus_frame.
+ 	(Fmouse_position): Use NULL, not 0, as arg of pixel_to_glyph_coords.
+ 	* keyboard.c (make_lispy_event, make_lispy_movement): Likewise.
+ 
+ Mon May 29 20:10:20 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
+ 
+ 	* xterm.c (XTread_socket) [USE_X_TOOLKIT]: Do pass MotionNotify events
+ 	to the toolkit.
+ 
+ 	* keyboard.c (Fset_input_mode): When read_socket_hook, ignore
+ 	what the user specified, and set interrupt_input in the preferred
+ 	way for this system.
+ 
+ 	* xterm.c (x_term_init): Call init_sigio only if interrupt_input.
+ 
+ Sun May 28 23:58:00 1995  Morten Welinder  <terra+@cs.cmu.edu>
+ 
+         * s/osf1.h (COFF): Define.
+         * m/alpha.h (LD_SWITCH_MACHINE) [!__GNUC__]: Don't define.
+         (r_alloc, r_re_alloc, r_alloc_free) [REL_ALLOC,
+         !_MALLOC_INTERNAL, !NOT_C_CODE]: Prototype.
+ 
+ Sun May 28 17:11:38 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
+ 
+ 	* xterm.c (x_set_offset): Distinguish CHANGE_GRAVITY < 0 case.
+ 	* xfns.c (x_set_frame_parameters): Pass -1 to x_set_offset.
+ 
+ 	* xfns.c (x_report_frame_params): Report top and left
+ 	in a way that represents negative offsets correctly.
+ 
+ 	* syntax.c (describe_syntax_1): Pass new arg to describe_vector.
+ 
+ 	* keymap.c (describe_vector): New arg entire_map.
+ 	Don't show bindings shadowed earlier on in the same map.
+ 	(Fdescribe_vector, describe_map): Pass new arg.
+ 
+ 	* xdisp.c (redisplay_window): Don't use try_window_id if
+ 	newline has a display table entry.
+ 
+ 	* xdisp.c (update_menu_bar):
+ 	Call set_frame_menubar with proper buffer current.
+ 
+ Fri May 26 20:17:46 1995  Geoff Voelker  <voelker@cs.washington.edu>
+ 
+ 	* lread.c (init_lread) [CANNOT_DUMP]: Set Vload_path to EMACSLOADPATH.
+ 
+ Fri May 26 18:46:15 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
+ 
+ 	* xfns.c (x_window): Call initialize_frame_menubar
+ 	near the end, after UNBLOCK_INPUT.
+ 
+ 	* xmenu.c (popup_get_selection): Force deactivation if key pressed.
+ 	New arg `id'.
+ 	(xdialog_show, xmenu_show): Pass new arg to popup_get_selection.
+ 	* xterm.c (XTread_socket): Don't call popup_get_selection here.
+ 
+ Fri May 26 17:53:58 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* sysdep.c (VFORK_RETURN_TYPE): Use int if not already defined.
+ 	(vfork): Declare the return type.
+ 	* s/sol2-3.h (HAVE_VFORK): Moved here from s/sol2-4.h.
+ 	(VFORK_RETURN_TYPE): Defined.
+ 	* s/sol2-4.h (HAVE_VFORK): Moved to s/sol2-3.h.
+ 	(pid_t): Deleted; s/sol2-3.h now defines a symbol for this.
+ 
+ 	* xdisp.c (x_consider_frame_title): Use FRAME_KBOARD.
+ 
+ Fri May 26 01:23:03 1995  Geoff Voelker  <voelker@cs.washington.edu>
+ 
+ 	* s/windows95.h: New file.
+ 
+ 	* ntheap.h (get_data_region_base): Undefined.
+ 	(get_reserved_heap_size): Use reserved_heap_size.
+ 	(reserved_heap_size): Declared.
+ 	* ntheap.c (reserved_heap_size,allocate_heap): Defined.
+ 	(sbrk): Use allocate_heap.
+ 
+ 	* ntterm.c (set_terminal_modes): Set cursor size appropriate for Win95.
+ 	(write_glyphs): Don't memset attrs, which is a word array.
+ 
+ 	* nt.c (configuration_buffer): Increase size.
+ 	(get_emacs_configuration) [WINDOWS95]: Use appropriate string.
+ 	(prepare_standard_handles) [WINDOWS95]: Disable subprocesses.
+ 	(reset_standard_handles): Check error number on failure.
+ 
+ 	* makefile.nt (LIBS): Use BASE_LIBS and ADVAPI32.
+ 	(config.h,paths.h): Use $(CP) instead of cp.
+ 	(config.h): Use $(CONFIG_H).
+ 	(EMACS) [WINDOWS95]: Don't dump temacs.exe.
+ 	(clean): Cleanup MSVC files and config.h.
+ 	(cleandump): Separate commands onto multiple lines.
+ 	Cleanup comments.
+ 
+ Fri May 26 00:16:42 1995  Michael Ernst  <mernst@research.microsoft.com>
+ 
+ 	* emacs.c (standard_args): -i, -itype, --icon-type take 0, not 1, args
+ 
+ Thu May 25 10:26:10 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* process.c (create_process, send_process): Add volatile qualifiers.
+ 	(wait_reading_process_input) [both versions]: Cast args of select.
+ 
+ 	* syntax.c (scan_lists): Make stringterm an unsigned char.
+ 
+ 	* dispnew.c (change_frame_size_1): Declare arg DELAY.
+ 
+ 	* insdel.c (adjust_point): Declare arg AMOUNT.
+ 
+ 	* lisp.h (do_symval_forwarding): Declare this function.
+ 	(frame_buffer_predicate, Foverlay_start, Foverlay_end): Ditto.
+ 	(Fprevious_single_property_change, Fend_of_line, Felt): Ditto.
+ 	(Fforward_line, Fforward_word, Fdelete_region, Fforward_char): Ditto.
+ 	(Fnarrow_to_region, Fwiden, Fmatch_beginning, Fmatch_end): Ditto.
+ 	(Fskip_chars_forward, Fskip_chars_backward): Ditto.
+ 	(Ffile_name_absolute_p, read_doc_string): Ditto.
+ 	(get_frame_param, store_frame_param, store_in_alist): Ditto.
+ 	(describe_map_tree): Declaration moved here from keymap.c.
+ 	* keymap.c (describe_map_tree): Move declaration to lisp.h.
+ 
+ 	* doc.c (Fsubstitute_command_keys): Cast arg of describe_map_tree.
+ 	* frame.c [MULTI_FRAME] (Fmouse_position): Cast arg of
+ 	pixel_to_glyph_coords.
+ 	* callint.c (Fcall_interactively): Cast arg of doprnt.
+ 	* editfns.c (format1): Likewise.
+ 	* xdisp.c (message): Likewise.
+ 	(scroll_bottom_vpos, fmodetrunc): Declarations deleted.
+ 
+ Thu May 25 10:16:58 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
+ 
+ 	* dispnew.c (Fframe_or_buffer_changed_p): Record frame names
+ 	as well as the frame objects.
+ 
+ 	* xterm.c (XTread_socket):
+ 	For MapNotify, call record_asynch_buffer_change.
+ 
+ 	* xdisp.c (prepare_menu_bars): Update frame titles before menu bars.
+ 
+ 	* xfns.c (Fx_get_resource): Major rewrite to make it clearer.
+ 	(validate_x_resource_name): Use build_string, not make_string.
+ 	(Fx_create_frame): Initially use Vinvocation_name as resource name.
+ 	Switch to frame name if frame name is explicit.
+ 	(x_display_info_for_name, Fx_open_connection): Add casts.
+ 	Initially use Vinvocation_name as resource name.
+ 	[USE_X_TOOLKIT] (x_window): Use Vx_resource_name for widget names.
+ 
+ 	* xmenu.c (xmenu_show, xdialog_show): Increment widget_id_tick
+ 	in the same way as in xfns.c.  Use LWLIB_ID type where appropriate.
+ 	(set_frame_menubar, free_frame_menubar): Add casts to LWLIB_ID.
+ 
+ 	* xterm.c (XTflash): Use pointers as args to select.
+ 	(XTread_socket, x_set_offset, x_set_window_size)
+ 	(x_make_frame_invisible): Cast 2nd arg to x_wm_set_size_hint.
+ 	(XTclear_end_of_line): Don't specify return type.
+ 	(note_mouse_highlight): Declare args x and y.
+ 	(x_icon_type): New declaration.
+ 	(flashback): Declaration deleted.
+ 
+ Wed May 24 18:45:51 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* lisp.h (menu_bar_items): Declare this function.
+ 
+ Wed May 24 16:33:26 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
+ 
+ 	* xmenu.c (Fx_popup_dialog): Treat (menu-bar) like t, for POSITION.
+ 
+ 	* frame.c (Fdelete_frame): When updating Vdefault_minibuffer_frame,
+ 	insist on a frame on the proper keyboard.
+ 
+ 	* xterm.c (x_connection_closed): Unblock input, first thing.
+ 	Set Vdefault_minibuffer_frame to t
+ 	before deleting a frame that might have its own minibuffer.
+ 
+ Tue May 23 23:48:54 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* xfns.c (hack_wm_protocols): Use cast instead of suffix.
+ 
+ Tue May 23 20:40:43 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
+ 
+ 	* xfns.c (x_set_frame_parameters): Pass 1 as change_gravity
+ 	when calling x_set_offset.
+ 	(x_real_positions): Don't add border_width into win_x, win_y.
+ 	* xterm.c (x_set_offset): Add border_width when calling XMoveWindow.
+ 
+ 	* xterm.h (struct x_display): New field menubar_height.
+ 	* xmenu.c (set_frame_menubar): Set menubar_height field.
+ 	* xfns.c (x_window) [both versions]: Set menubar_height.
+ 
+ 	* xfns.c [USE_X_TOOLKIT] (x_window): Don't call XMoveWindow
+ 	or x_calc_absolute_position.  Do use the border_width.
+ 
+ 	* xterm.c (x_calc_absolute_position): Use menubar_height field.
+ 	In toolkit case, use outermost Emacs widget and its parent.
+ 	[USE_X_TOOLKIT] (x_make_frame_visible): Do call x_set_offset.
+ 
+ 
+ 	* xfns.c [USE_X_TOOLKIT] (x_window): Pass position to toolkit
+ 	only if user-specified.  But always use XMoveWindow to move the
+ 	window to that position.
+ 
+ 	* alloc.c (Fgarbage_collect): Clear consing_since_gc first thing.
+ 
+ 	* xdisp.c (redisplay_window): Use set_buffer_internal_1.
+ 
+ 	* buffer.c (set_buffer_internal_1): New subroutine.
+ 	(Fmove_overlay): Don't set windows_or_buffers_changed.
+ 
+ Mon May 22 18:09:46 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* xselect.c (x_get_window_property): Cast args of XGetWindowProperty.
+ 	* xfaces.c (unload_color): Cast args of XFreeColors.
+ 	* xfns.c (hack_wm_protocols): Cast args of XGetWindowProperty.
+ 	(x_set_border_pixel): Cast args of XSetWindowBorder.
+ 	* widget.c (create_frame_gcs): Cast args of XCreateGC.
+ 	(setup_frame_gcs): Cast args of XCreatePixmapFromBitmapData.
+ 
+ 	* data.c (long_to_cons): Don't assume 32-bit longs.
+ 	* fileio.c (Fvisited_file_modtime): Cast arg of long_to_cons.
+ 
+ 	* editfns.c (Fformat): Split double into two pointers, not two ints.
+ 
+ 	* s/hpux9.h: Delete HAVE_FMOD; configure handles that correctly now.
+ 
+ Mon May 22 16:14:07 1995  Richard Stallman  <rms@waves>
+ 
+ 	* xdisp.c (display_text_line): Enter a char in charstarts
+ 	at the very end of the character loop.
+ 	Enter newline or ^M (if selective display) separately.
+ 
+ 	* lisp.h (gdb_lisp_params): New enum type.
+ 	* .gdbinit: Use gdb_lisp_params to get storage layout info.
+ 	Set and use $valmask and $nonvalbits.
+ 
+ 	* lread.c (oblookup): Delete argument hashp.
+ 
+ Fri May 19 23:35:57 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* floatfns.c (Flogb): frexp needs a pointer to int, not EMACS_INT.
+ 
+ Fri May 19 17:52:46 1995  Richard Stallman  <rms@waves>
+ 
+ 	* dispnew.c (buffer_posn_from_coords): Don't let startp be before BEGV.
+ 
+ Thu May 18 18:42:37 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* indent.c (compute_motion): Handle overlay strings.
+ 	New arg DID_MOTION.  All callers changed.
+ 	* dispnew.c, window.c: Add new argument to calls of compute_motion.
+ 	* xdisp.c: Add new argument to calls of compute_motion.
+ 	(zv_strings_seen): New variable.
+ 	(redisplay, try_window, try_window_id): Clear zv_strings_seen.
+ 	(display_text_line): Handle overlay strings.
+ 
+ Thu May 18 12:54:22 1995  Richard Stallman  <rms@waves>
+ 
+ 	* s/sol2-4.h: Undo previous change.
+ 
+ 	* emacs.c (Fkill_emacs): Delete the auto-save-list file
+ 	after shut_down_emacs.
+ 
+ 	* process.c (status_notify): If Vprocess_alist changes within
+ 	the loop, do the whole loop again.
+ 
+ Wed May 17 03:26:09 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* emacs.c (Fdump_emacs): Don't take address of array.
+ 
+ 	* buffer.c (Fmake_indirect_buffer): Fix interactive spec.
+ 
+ 	* Makefile.in.in (SOURCES): Fix reference to ymakefile.
+ 
+ 	* keyboard.c (syms_of_keyboard): Always define track-mouse.
+ 	(do_mouse_tracking): Always declare this var.
+ 
+ Mon May 15 21:28:52 1995  Marcus Daniels  <marcus@ee.pdx.edu>
+ 
+ 	* s/linux.h: Test _STDIO_USES_IOSTREAM as well as _IO_STDIO_H.
+ 	[__ELF__] (START_FILES, LIB_STANDARD, LIB_GCC, UNEXEC): Define these.
+ 	[__ELF__] (UNEXEC_USE_MAP_PRIVATE): Define this.
+ 
+ 	* unexelf.c (unexec) [UNEXEC_USE_MAP_PRIVATE]: New logic for
+ 	systems that don't support MAP_SHARED with PROT_WRITE.
+ 
+ Mon May 15 19:26:40 1995  Richard Stallman  <rms@churchy.gnu.ai.mit.edu>
+ 
+ 	* s/sol2-4.h (LD_SWITCH_SYSTEM): Define.
+ 
+ Mon May 15 17:46:47 1995  Simon Leinen  <simon@lia.di.epfl.ch>
+ 
+ 	* indent.c (vmotion): handle the case where `minibuf_prompt' is nil.
+ 
+ Fri May 12 18:23:15 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* indent.c (vmotion): Simplify.  Replace last three args with a single
+ 	struct window *.  All callers changed.
+ 	* xdisp.c (minmax): New macro.
+ 	(redisplay, redisplay_window, try_window_id): Clip cursor hpos at both
+ 	low and high extremes, in anticipation of a change to compute_motion.
+ 
+ 	* xterm.c (Qvendor_specific_keysyms): New var.
+ 	(syms_of_xterm): Initialize and staticpro it.
+ 	(x_term_init): Initialize Vsystem_key_alist according to vendor.
+ 
+ 	* emacs.c (main) [NeXT]: Add missing braces.
+ 
+ Thu May 11 18:16:36 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* sysdep.c (init_system_name): Clean up signedness mismatch.
+ 	* unexelf.c (unexec): Fix type mismatch.
+ 	* print.c (float_to_string): Fix type mismatch and simplify.
+ 
+ 	* dispnew.c [!MULTI_FRAME] (Fredraw_frame): Delete extra docstring.
+ 	* frame.c [!MULTI_FRAME] (Fframe_height, Frame_width): Likewise.
+ 
+ Tue May  9 00:45:23 1995  enami tsugutomo  <enami@sys.ptg.sony.co.jp>
+ 
+ 	* window.c [MULTI_FRAME] (init_window_once): Set Vterminal_frame
+ 	to selected_frame.
+ 	* frame.c [MULTI_FRAME] (make_terminal_frame): Don't set
+ 	Vterminal_frame.
+ 	(do_switch_frame): Set Vterminal_frame to selected_frame.
+ 
+ Mon May  8 14:30:19 1995  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+ 
+ 	* Makefile.in.in (VMS_SUPPORT): Add missing `.elc'.
+ 	(SOME_MACHINE_LISP): New variable.
+ 	(${etc}DOC): Use it.
+ 
+ 	* buffer.c (syms_of_buffer): Doc fix.
+ 
+ 	* frame.c (frame-height, frame-width, set-screen-height,
+ 	set-screen-width, termal-frame) [!MULTI_FRAME]: Delete doc strings.
+ 
+ Mon May  8 21:28:34 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* keyboard.c (init_kboard): Initialize Vdefault_minibuffer_frame.
+ 	* keyboard.h (struct kboard): New member Vdefault_minibuffer_frame.
+ 	* frame.c: Vdefault_minibuffer_frame is now part of KBOARD instead
+ 	of a variable.  All references changed.
+ 	(make_frame_without_minibuffer): New arg KB.
+ 	Require the new frame's minibuffer to be on the same display.
+ 	* xfns.c (Fx_create_frame): Pass kb to make_frame_without_minibuffer.
+ 
+ 	* xdisp.c (x_consider_frame_title): When setting multiple_frames,
+ 	ignore invisible frames and frames on other displays.
+ 
+ 	* keyboard.c [MULTI_KBOARD] (read_char): If the character was for
+ 	the wrong kboard, don't let it get processed twice.
+ 
+ Mon May  8 12:24:38 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* callproc.c (Fcall_process): Keep reading till buffer is nearly full.
+ 
+ 	* emacs.c (Fdump_emacs): Don't use & before my_edata.
+ 
+ Mon May  8 16:45:51 1995  Francesco Potorti`  (pot@cnuce.cnr.it)
+ 
+ 	* m/delta.h (C_SWITCH_MACHINE): Let configure decide if this is
+ 	a 68040 or 68030.  Don't condition on __STDC__.
+ 
+ Mon May  8 18:40:21 1995  enami tsugutomo  <enami@sys.ptg.sony.co.jp>
+ 
+ 	* frame.c (Fraise_frame, Flower_frame): Make arg FRAME optional.
+ 
+ 	* keyboard.c (Fread_key_sequence): Doc fix.
+ 
+ Mon May  8 00:52:42 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* window.c (Fdisplay_buffer): Initialize other, upper, lower.
+ 
+ Sun May  7 18:26:25 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* lisp.h (Fmatch_data, Fstore_match_data): Declared.
+ 
+ 	* xdisp.c (prepare_menu_bars): Save and restore the match data.
+ 	(update_menu_bar): New arg save_match_data.
+ 	Maybe save and restore match data here.
+ 
+ Sun May  7 17:03:55 1995  Geoff Voelker  <voelker@cs.washington.edu>
+ 
+ 	* makefile.nt (region-cache.obj,vm-limit.obj): Dependencies defined.
+ 	(OBJ1): Don't compile xfaces.c.
+ 	(buffer.obj,indent.obj,search.obj): Add region-cache.h dependency.
+ 
+ Sun May  7 06:34:20 1995  Paul Eggert  <eggert@twinsun.com>
+ 
+ 	* data.c (Fmod): Fix the final adjustment, when f2 < 0 and f1 == 0.
+ 
+ 	* lread.c (isfloat_string): Reject strings like "0.5+".
+ 
+ Sun May  7 02:22:11 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* process.c (wait_reading_process_input): Pass arg in new call to
+  	set_waiting_for_input.
+ 
+ 	* xfns.c (Funfocus_frame): Check for live X frame.
+ 
+ 	* lread.c (init_lread): Don't warn about missing installation dirs
+ 	when using dirs derived from the executable.
+ 
+ Sat May  6 22:37:07 1995  Geoff Voelker  <voelker@cs.washington.edu>
+ 
+ 	* makefile.nt (TRES): Defined.
+ 	(TLIB1,TLIB2): Created out of TLIB.
+ 	(TLIB): Split to reduce time to do library updates.
+ 	(DOC): Use DOC-X.
+ 	(strftime.obj): Compile with -Dstrftime=emacs_strftime.
+ 
+ Sat May  6 03:09:24 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* window.c (syms_of_window): Doc fix.
+ 	(temp_output_buffer_show): If we use Vtemp_buffer_show_function,
+ 	do nothing else.
+ 
+ 	* s/bsd386.h (GETPGRP_NO_ARG): New definition.
+ 	(BSD): Include sys/param.h instead of redefining BSD.
+ 	But do this only if emacs is defined.
+ 
+ 	* lisp.h (gc_cons_threshold): Change back to int.
+ 	* alloc.c (gc_cons_threshold): Change back to int.
+ 	(min): New macro.
+ 	(inhibit_garbage_collection): Don't exceed value an int can hold.
+ 
+ 	* xdisp.c (prepare_menu_bars): Clear size-change flag before running
+ 	size-change functions.
+ 	(scroll_step, debug_end_pos, line_number_display_limit): Now static.
+ 
+ Fri May  5 00:35:42 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* emacs.c (Fdump_emacs_data): Don't use & before my_edata.
+ 
+ 	* editfns.c (Fencode_time): Rename arg from min to minute.
+ 	(days_per_month): Move variable to top level.
+ 
+ 	* process.c (wait_reading_process_input): Don't call prepare_menu_bars.
+ 	Clear waiting_for_input around calling redisplay_preserve_echo_area.
+ 
+ 	* xfns.c [USE_X_TOOLKIT] (x_window): Always pass position in geometry.
+ 	Set XtNmappedWhenManaged to 0 for shell_widget.
+ 	(Fx_create_frame): Always call x_wm_set_size_hints.
+ 
+ 	* s/sol2-4.h (HAVE_VFORK): Add #undef.
+ 
+ 	* s/netbsd.h (GETPGRP_NO_ARG): Defined.
+ 
+ Thu May  4 21:45:27 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* s/freebsd.h: (GETPGRP_NO_ARG): Defined
+ 	(HAVE_GETPAGESIZE): Definition deleted.
+ 
+ 	* data.c (store_symval_forwarding): Error if value out of range
+ 	for an integer variable.
+ 	(Fstring_to_number): Avoid using make_number to return value.
+ 	Maybe use atol.
+ 
+ Thu May  4 20:26:46 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* buffer.c (Qbefore_string, Qafter_string): New vars.
+ 	(syms_of_buffer): Initialize and staticpro them.
+ 	(cmp_for_strings, overlay_strings): New functions.
+ 
+ Thu May  4 01:13:53 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* indent.c (string_display_width): Renamed from string_width.
+ 	(vmotion): Use new name.
+ 
+ 	* s/sco4.h [!__GNUC__] (LINKER): Defined.
+ 
+ 	* insdel.c (make_gap): Don't allow buffer size that won't fit in int.
+ 	Make this new error check also check exceeding VALBITS.
+ 	(insert_1): Delete old error test.
+ 	(min): New macro.
+ 
+ 	* Makefile.in.in (${etc}DOC): Put SOME_MACHINE_OBJECTS before obj.
+ 
+ 	* xfaces.c (region_face, next_face_id): Make static.
+ 
+ 	* xselect.c (Vselection_converter_alist, x_selection_timeout)
+ 	(Vx_sent_selection_hooks, Vx_lost_selection_hooks, Vselection_alist):
+ 	Make static.
+ 
+ 	* alloc.c (inhibit_garbage_collection):
+ 	Use XSETINT, and do arithmetic in type EMACS_INT.
+ 
+ 	* s/hpux9.h (HAVE_FMOD): Defined.
+ 
+ 	* sysdep.c (bcmp, bcopy): Fix backward BSTRING conditionals.
+ 
+ 	* emacs.c (Fkill_emacs): Delete the Vauto_save_list_file_name file.
+ 
+ Thu May  4 13:23:55 1995  Morten Welinder  <terra+@cs.cmu.edu>
+ 
+ 	* data.c (arith_driver): Make accum and next EMACS_INTs.
+ 	(Fmod): i1 and i2 are EMACS_INT.
+ 
+ 	* editfns.c (Fformat): Allow 30 characters in the printed version
+ 	of integers and floats.
+ 
+ 	* print.c (print): Handle long EMACS_INT in sprintf.
+ 	* keyboard.c (Fexecute_extended_command):
+ 	Handle long EMACS_INT in sprintf.
+ 	* lread.c (read1): Handle long EMACS_INT in atol.
+ 	* doprnt.c (doprnt): Handle long EMACS_INT in sprintf.
+ 	* data.c (Fnumber_to_string, Fstring_to_number):
+ 	Handle long EMACS_INT in sprintf and atol.
+ 
+ 	* process.c (list_processes_1): Cast XFASTINT for passing to sprintf.
+ 
+ 	* m/alpha.h (bcopy, bzero, bcmp): Don't let string.h prototype these.
+ 
+ Wed May  3 20:12:25 1995  Morten Welinder  <terra+@cs.cmu.edu>
+ 
+ 	* keyboard.c (parse_modifiers, apply_modifiers): Don't assume
+ 	32-bit EMACS_INT.
+ 	(parse_modifiers): modifiers is an int, not an EMACS_INT.
+ 	(read_key_sequence): Pass modifiers as int, not EMACS_INT.
+ 
+ 	* buffer.h (Fdelete_overlay): Was mistakenly called Fdelete_overlays.
+ 
+ 	* lisp.h (gc_cons_threshold): Make this an EMACS_INT.
+ 
+ 	* alloc.c (gc_cons_threshold): Make this an EMACS_INT.
+ 	(gc_sweep): Make already_free an EMACS_INT.
+ 
+ 	* search.c (search_buffer): Cast p_limit to EMACS_INT not int.
+ 
+ 	* s/osf1.h (GETPGRP_NO_ARG): Define.
+ 
+ Wed May  3 16:23:53 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* keyboard.c (reorder_modifiers): Use XINT.
+ 	Cast apply_modifiers arg to int.
+ 
+ 	* unexapollo.c: New file.
+ 
+ 	* m/apollo.h (CANNOT_DUMP, VIRT_ADDR_VARIES, LIBS_TERMCAP)
+ 	(NO_X_DESTROY_DATABASE): Macros deleted.
+ 	(BSTRING): #undef deleted.
+ 	(SYSTEM_TYPES): Redefinition deleted.
+ 	(UNEXEC): New definition.
+ 	(LD_SWITCH_SYSTEM): Define as empty.
+ 	(C_SWITCH_MACHINE, LD_SWITCH_MACHINE): New definitions.
+ 	(OLDXMENU_OPTIONS): New definition.
+ 
+ 	* fileio.c (directory_file_name): Add APOLLO conditional.
+ 	(Fcopy_file, Fset_file_modes): Delete APOLLO conditionals.
+ 
+ 	* emacs.c: Delete all APOLLO conditionals.
+ 
+ Tue May  2 19:03:13 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* intervals.c (get_local_map): Use Fget_char_property, so that
+ 	overlay properties will be considered as well as text properties.
+ 
+ Tue May  2 02:15:23 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* insdel.c (prepare_to_modify_buffer): Use file_truename for locking.
+ 
+ 	* fileio.c (Finsert_file_contents): Use file_truename for unlocking.
+ 
+ 	* buffer.c (Fset_buffer_modified_p): Use the truename for locking.
+ 
+ 	* lread.c (read1): New arg FIRST_IN_LIST; all callers changed.
+ 	Special handling for backquote and comma.
+ 	(Qbackquote, Qcomma, Qcomma_at, Qcomma_dot): New variables.
+ 	(syms_of_lread): Initialize and staticpro them.
+ 	(Fread, Fread_from_string): Initialize new_backquote_flag.
+ 
+ Mon May  1 19:11:28 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* xmenu.c (xmenu_show, menubar_selection_callback): Move declaration
+ 	of entry to an outer block, to guarantee its value is preserved.
+ 
+ 	* keyboard.c (kbd_buffer_get_event): New arg USED_MOUSE_MENU.
+ 	[USE_X_TOOLKIT]: Set *USED_MOUSE_MENU if returning menu-bar symbols.
+ 	(read_char): Pass used_mouse_menu to kbd_buffer_get_event.
+ 	This variable is now meaningful for toolkit menus as well as
+ 	non-toolkit menus.
+ 
+ 	* dispnew.c (update_frame): Don't put cursor in echo area unless
+ 	the echo area is on this frame.
+ 	* xdisp.c (redisplay): Don't move the cursor if it's supposed to
+ 	be in the echo area.
+ 	(display_text_line): Likewise.
+ 	(echo_area_display): Put cursor in echo area if appropriate.
+ 
+ Sun Apr 30 11:51:41 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* emacs.c (standard_args): Add #ifdef VMS for -map.
+ 	(main): Delete duplicate code for -version.
+ 	(standard_args): Add -help and -version.
+ 
+ 	* fileio.c (Fdo_auto_save): Record visited file name
+ 	as well as auto-save file name in the auto-save-list-file-name file.
+ 	Call Fexpand_file_name for auto-save-list-file-name.
+ 
+ Sat Apr 29 01:30:51 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* sysdep.c [HAVE_UNISTD_H]: Include unistd.h.
+ 
+ 	* emacs.c (standard_args): Add -L/--directory/-directory.
+ 
+ 	* s/sunos4shr.h (ORDINARY_LINK): Defined.
+ 	(LINKER): Definition deleted.
+ 
+ Sat Apr 28 23:59:49 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* xfns.c (x_non_menubar_window_to_frame): New function.
+ 	* xterm.h: Declare x_non_menubar_window_to_frame.
+ 	* xmenu.c (popup_get_selection): Use x_non_menubar_window_to_frame.
+ 	Either queue or dispatch the event, but not both.
+ 	(dialog_selection_callback): Clear popup_activated_flag.
+ 
+ 	* xmenu.c (Fx_popup_menu): If POSITION is just (menu-bar), use the
+ 	current mouse position.
+ 	(menubar_selection_callback): Use (menu-bar) instead of 'menu-bar.
+ 	* keyboard.c (read_char, read_char_x_menu_prompt): Exclude
+ 	menu-bar clicks when processing mouse clicks.
+ 
+ 	* xterm.c (x_term_init): Add stub to initialize Vsystem_key_alist.
+ 
+ Thu Apr 27 21:38:08 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* process.c (create_process): Don't reference pty_name if !HAVE_PTYS.
+ 
+ Wed Apr 26 05:08:25 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* fileio.c (Ffile_regular_p): Use Qfile_regular_p.
+ 	(syms_of_fileio): Set up Qfile_regular_p.
+ 
+ 	* emacs.c (standard_args): Move -iconic and --icon-type
+ 	to the end of the initial args.
+ 
+ Tue Apr 25 19:46:40 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* alloc.c (mark_kboards): Mark the kbd macro and Vsystem_key_alist.
+ 
+ Mon Apr 24 14:43:07 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* s/linux.h (REGEXP_IN_LIBC): Defined.
+ 
+ 	* callproc.c (Fcall_process): Use bigger buffer, and grow it
+ 	as we get more and more data.
+ 
+ Mon Apr 24 11:44:02 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* xterm.c (x_term_init): If the previous kboard was the dummy one,
+ 	switch to the new one immediately.
+ 
+ 	* keyboard.h (struct kboard): New member Vsystem_key_alist.
+ 	* keyboard.c (Vsystem_key_alist): Delete global variable.
+ 	(init_kboard): Initialize Vsystem_key_alist member.
+ 	(syms_of_keyboard): Change DEFVAR_LISP to DEFVAR_KBOARD.
+ 	(make_lispy_event): Use the kboard's alist instead of the global.
+ 
+ 	* fns.c (Fplist_put): Don't signal an error if plist isn't a cons.
+ 
+ 	* xterm.c (x_focus_frame, x_focus_event_frame, x_highlight_frame):
+ 	Delete these vars; now part of struct x_display_info.
+ 	(x_new_focus_frame): New arg DPYINFO.  Callers changed.
+ 	Use the struct members instead of the globals.
+ 	Call x_frame_rehighlight instead of XTframe_rehighlight, so we can
+ 	pass on the dpyinfo pointer.
+ 	(x_mouse_leave): New arg DPYINFO.  Callers changed.
+ 	(XTframe_rehighlight): New arg FRAME.  Callers changed.
+ 	Now does all the work in x_frame_rehighlight.
+ 	(x_frame_rehighlight): New function, code from XTframe_rehighlight.
+ 	(XTread_socket): Use the struct members instead of the globals.
+ 	(x_unfocus_frame, x_iconify_frame, x_destroy_window): Likewise.
+ 	(x_display_box_cursor, x_make_frame_invisible): Likewise.
+ 	(x_term_init): Initialize the struct members.
+ 	(x_initialize): Delete initialization of deleted globals.
+ 	* xfns.c (x_get_focus_frame): New arg FRAME.  Callers changed.
+ 	(Funfocus_frame): Unfocus on selected_frame's display.
+ 	* xterm.h (struct x_display_info): New members x_focus_frame,
+ 	x_focus_event_frame, x_highlight_frame, replacing global vars.
+ 	* frame.c (do_switch_frame): Don't try to refocus termcap frames.
+ 
+ 	* Makefile.in.in: Make dispnew.o and keyboard.o depend on xterm.h.
+ 	Make intervals.o and term.o depend on keyboard.h.
+ 
+ 	* xfns.c (x_window): Fix type mismatch.
+ 
+ 	* xdisp.c (message_dolog): The message log doesn't need an undo list.
+ 
+ 	* term.c (term_init): MagicWrap implies AutoWrap.
+ 
+ Mon Apr 24 01:44:16 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* keyboard.c (safe_run_hooks_1, safe_run_hooks_error): New subroutines.
+ 	(safe_run_hooks): Handle errors to clear the hook,
+ 	instead of always clearing it temporarily.
+ 
+ 	* callproc.c (child_setup): Reword "can't exec" message.
+ 	Add newline after message.
+ 
+ 	* process.c (create_process): Don't abort if can't reopen
+ 	pty_name in the child.  Exit the child instead.
+ 
+ Thu Apr 20 14:36:54 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* abbrev.c (Fexpand_abbrev): Add some error checking.
+ 
+ 	* xmenu.c (Fx_popup_dialog): Don't pass menubarp arg to xdialog_show.
+ 
+ Wed Apr 19 16:49:52 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* frame.h (struct frame): New member namebuf.
+ 	* frame.c (make_frame): Initialize it.
+ 	(Fdelete_frame): Free it.
+ 	* xfns.c (x_window): Use (or reuse) frame's namebuf instead of a
+ 	temp var.  This avoids a storage leak.
+ 
+ Wed Apr 19 02:08:43 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xmenu.c (xmenu_show, xdialog_show): Delete menubarp arg.
+ 	(Fx_popup_menu): Don't compute menubarp.
+ 
+ Tue Apr 18 14:37:21 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* callproc.c (Fcall_process): Call Fexpand_file_name for error_file.
+ 
+ 	* keyboard.c (map_event_to_object): Declaration deleted.
+ 
+ Tue Apr 18 12:43:44 1995  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+ 
+ 	* eval.c (Ffetch_bytecode): Check the type of the object being
+ 	read from the file.
+ 
+ Mon Apr 17 23:21:24 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* editfns.c (Fencode_time): Don't treat years < 100 as special.
+ 
+ Mon Apr 17 19:12:11 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* lisp.h: Declare some functions.
+ 	* buffer.c (adjust_overlays_for_insert): New function.
+ 	(adjust_overlays_for_delete): New function.
+ 	* insdel.c (insert_1): Adjust overlay center after inserting.
+ 	(insert_from_string_1, insert_from_buffer_1): Likewise.
+ 	(del_range_1): Adjust overlay center after deleting.
+ 
+ Mon Apr 17 02:09:36 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* editfns.c (Fencode_time): Rewrite by Naggum.
+ 
+ Sat Apr 15 14:32:31 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xfns.c (x_report_frame_params): Report value of `display' parm.
+ 
+ 	* Makefile.in.in (really-lwlib, really-oldXMenu): Mark as .PHONY.
+ 
+ Fri Apr 14 17:04:56 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* editfns.c (Fencode_time): Fix missing \n\'s.
+ 
+ Fri Apr 14 14:20:50 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* editfns.c (init_editfns): Add casts.
+ 
+ 	* doc.c (get_doc_string): Add cast.
+ 
+ 	* keyboard.c (kbd_buffer_get_event): Don't use prototype.
+ 
+ 	* xdisp.c (message_log_check_duplicate): Make p1 and p2
+ 	unsigned char *.
+ 
+ Thu Apr 13 23:56:21 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xterm.c (x_term_init): Call XtSetLanguageProc only if HAVE_X11XTR6.
+ 
+ Thu Apr 13 13:38:56 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* editfns.c (Fbuffer_string): Doc clarification.
+ 
+ 	* alloc.c: Delete the #if that compares MARKBIT.
+ 
+ 	* window.c (Fdisplay_buffer): Search the proper frame when the
+ 	current frame is minibuffer-only.
+ 
+ 	* fileio.c (Fexpand_file_name): Use IS_DIRECTORY_SEP instead of
+ 	special code for WINDOWSNT.
+ 
+ Thu Apr 13 12:18:03 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xfaces.c (compute_char_face): Don't use NULL.
+ 
+ 	* buffer.c (Foverlays_at, Fnext_overlay_change): Don't use NULL.
+ 	(Fprevious_overlay_change): Don't use NULL.
+ 
+ 	* xfns.c (Fx_color_defined_p): Doc fix.
+ 
+ 	* xfaces.c [! HAVE_X_WINDOWS] (build_face): Deleted.
+ 
+ Wed Apr 12 19:30:30 1995  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+ 
+ 	* callint.c (Fcall_interactively): Fix paren nesting.
+ 
+ 	* buffer.c (evaporate_overlays): Fix type error.
+ 
+ Thu Apr 13 01:09:02 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xterm.c (XTmouse_position): Handle X errors in XTranslateCoordinates.
+ 
+ 	* lisp.h (MARKBIT): Do the shifting as unsigned int.
+ 	Delete the #if that compares MARKBIT.
+ 
+ Wed Apr 12 01:52:55 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xterm.c (XTread_socket): For ConfigureNotify,
+ 	combine the USE_X_TOOLKIT and non-toolkit cases, which provides
+ 	some things that were missing in the former.
+ 
+ 	* alloc.c (gc_sweep): If a misc has type Lisp_Misc_Free,
+ 	keep it on the free list.  Sum pseudovector sizes properly.
+ 
+ 	* dispnew.c (Fframe_or_buffer_changed_p): Ignore buffers whose names
+ 	start with space.
+ 
+ 	* editfns.c (Fencode_time): Use XINT to examine `zone'.
+ 
+ Tue Apr 11 21:53:28 1995  Geoff Voelker  <voelker@cs.washington.edu>
+ 
+ 	* ntinevt.c (nt_kdb_patch_event): Created.
+ 
+         * callproc.c (child_setup) [WINDOWSNT]: Removed syntax errors.
+ 
+ 	* dired.c (Ffile_attributes) [WINDOWSNT]: Removed syntax errors.
+ 
+ 	* fileio.c (Fexpand_file_name) [DOS_NT]: Preserve drive letter case.
+ 	Fix syntax errors.
+         Check drive letter when expanding ~\.
+ 
+ 	* sysdep.c (sys_subshell) [WINDOWSNT]: Don't invoke restore_console.
+ 
+ 	* ntproc.c (win32_wait): Reap synchronous subprocesses, and place
+         return code in synch_process_retcode.
+ 
+ 	* s/windowsnt.h (ctime): Defined to be nt_ctime.
+ 	(NULL): Defined when missing from included system files.
+ 	(EMACS_CONFIG_OPTIONS): Defined.
+ 	(LISP_FLOAT_TYPE): Defined.
+ 	(HAVE_TZNAME): Defined.
+ 	(HAVE_TIMEVAL): Defined.
+ 	(struct timeval): Defined.
+ 	(struct timezone): Defined.
+ 
+ 	* nt.c (nt_ctime): Defined.
+ 	(gettimeofday): Defined.
+ 
+ 	* ntinevt.c (do_mouse_event): Use XSETFASTINT.
+ 	(SET_FRAME): Undefined.
+ 	(select): Renamed to sys_select to correspond to routine in sysdep.c
+ 	(sys_select): Support struct timeval.
+ 	(key_event): Support German keyboard.
+ 	Replace SET_FRAME with XSETFRAME.
+ 	(nt_kbd_mods_to_emacs): Renamed to win32_kbd_mods_to_emacs.
+ 	(win32_kbd_mods_to_emacs): Support AltGr on German keyboards.
+ 	(win32_number_shift_map): Defined.
+ 	(WIN32_KEY_SHIFTED): Defined.
+ 	(win32_patch_key): Defined.
+ 	(map_virt_key): Support VK_OEM_102 for German keyboards.
+ 	(win32_mouse_position): Add arg insist.
+ 	(do_mouse_event): Replace SET_FRAME with XSETFRAME.
+ 	Use win32_kbd_mods_to_emacs.
+ 
+ 	* fileio.c (directory_file_name) [WINDOWSNT]: Handle UNC format.
+ 
+ 	* nt.c (nt_stat): Defined.
+ 
+ 	* s/windowsnt.h (struct nt_stat): Defined.
+ 
+ 	* ntinevt.h: Fixed function prototypes.
+ 
+ 	* makefile.nt (TEMACS): Add dependence on $(BLD).
+ 
+ 	* ntterm.c (Fset_message_beep): Defined.
+ 	(ring_bell): Support audio cards.
+ 
+ 	* makefile.nt (DOC): Defined.
+ 
+ 	* s/windowsnt.h (HAVE_RANDOM): Defined.
+ 	(random): Macro undefined.
+ 	(srandom): Macro undefined.
+ 	(HAVE_UTIME): Defined.
+ 	(utime): Defined.
+ 	(EMACS_CONFIGURATION): Defined.
+ 
+ 	* nt.c (random): Defined.
+ 	(srandom): Defined.
+ 
+ 	* nt.c (readdir): Include "." and "..".
+ 	(get_inode_and_device_vals): Handle directories.
+ 
+ 	* fileio.c (Fexpand_file_name) [DOS_NT]: Don't strip slash from
+         default dirs like "C:\\"
+ 
+ 	* makefile.nt (all): Use COMPAT_LIB in library list.
+ 	Use DEL_TREE instead of delnode.
+ 
+ 	* ntheap.c (sbrk): Shrink heap by arbitrary amounts.
+ 
+ 	* m/intel386.h (NO_ARG_ARRAY) [WINDOWSNT]: Defined.
+ 
+ 	* s/windowsnt.h (_VARARGS_): Defined.
+ 	(_CALLBACK_): Defined.
+ 
+ Tue Apr 11 18:46:27 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* process.c (create_process): Set PROCESS's tty_name to Qnil when
+  	!PTY_FLAG, so Fprocess_tty_name returns nil for pipes as its
+  	docstring says.
+ 
+ Tue Apr 11 04:23:05 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* keyboard.c (read_char): Rearrange code so that getcjmp is set
+ 	only around sit_for and kbd_buffer_get_event, and
+ 	and polling is stopped only around the kbd_buffer_get_event call.
+ 	(Ftrack_mouse, tracking_off, read_char): Don't call prepare_menu_bars.
+ 
+ 	* dispnew.c (init_desired_glyphs): New function.
+ 	* xdisp.c (redisplay): Call init_desired_glyphs for each frame.
+ 	Call prepare_menu_bars.
+ 	(prepare_menu_bars): Delete code at beginning that duplicates
+ 	things done at the beginning of redisplay.
+ 
+ 	* alloc.c (inhibit_garbage_collection): New function.
+ 
+ 	* xterm.c (XTread_socket): Pass dpyinfo to popup_get_selection.
+ 
+ 	* xmenu.c (popup_get_selection): Queue up events that aren't
+ 	for the menu, and process them afterward.  New arg dpyinfo.
+ 	(set_frame_menubar): Use inhibit_garbage_collection.
+ 	[USE_X_TOOLKIT] (xmenu_show): Delete the queue code here.
+ 	Pass dpyinfo to popup_get_selection.
+ 	Don't call lw_destroy_all_widgets.
+ 	[USE_X_TOOLKIT] (xdialog_show): Simplify using popup_get_selection.
+ 
+ Mon Apr 10 19:00:14 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* callint.c (Fcall_interactively): Fix handling of @
+ 	when it tests whether the event has a window in it.
+ 
+ 	* s/sco4.h (NO_SOCKETS_IN_FILE_SYSTEM): Defined.
+ 
+ 	* eval.c (internal_condition_case): Abort if interrupt_input_blocked>0.
+ 
+ 	* xmenu.c (set_frame_menubar): Don't block input until after
+ 	the menubar maps have been decoded.
+ 
+ Mon Apr 10 18:35:22 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* keyboard.c (push_frame_kboard, pop_frame_kboard): Do nothing if
+ 	!MULTI_KBOARD.
+ 
+ 	* keyboard.c (init_keyboard): Don't malloc a new structure;
+ 	initial_kboard should already exist for that.
+ 	* frame.c (make_terminal_frame): Put initial_kboard on the list of
+ 	all kboard objects.
+ 
+ Mon Apr 10 00:38:16 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xmenu.c (popup_get_selection): For ButtonRelease event,
+ 	clear dpyinfo->grabbed.
+ 
+ 	* window.c (temp_output_buffer_show): Select the chosen window
+ 	temporarily for running temp-buffer-show-hook.
+ 	(syms_of_window): Fix typo.
+ 
+ 	* s/osf1.h: Don't include alloca.h, string.h here.
+ 	(malloc. realloc, xmalloc, xrealloc): Declarations moved to m/alpha.h.
+ 	* m/alpha.h: Include alloca.h, string.h here.
+ 	(malloc. realloc, xmalloc, xrealloc): Declarations moved from s/osf1.h.
+ 
+ 	* xdisp.c (display_mode_line): Use push_frame_kboard, pop_frame_kboard.
+ 
+ 	* xfns.c (x_window): Copy the frame name to non-Lisp string.
+ 
+ 	* keyboard.c (any_kboard_state): Renamed from unlock_kboard.
+ 	Define it unconditionally, but it's a no-op unless MULTI_KBOARD.
+ 	(single_kboard_state): New function.
+ 	(push_frame_kboard, pop_frame_kboard): New functions.
+ 	(single_kboard): Renamed from kboard_locked.
+ 
+ 	* keyboard.h (single_kboard): Renamed from kboard_locked.
+ 	All refs renamed.
+ 	(struct kboard): Move flag fields to the end, and make them chars.
+ 	Delete the `unused' field.
+ 
+ 	* callint.c (Fcall_interactively): Call single_kboard_state
+ 	to switch to the single-kboard state.
+ 	* minibuf.c (read_minibuf): Call single_kboard_state
+ 	to switch to the single-kboard state.
+ 
+ 	* alloc.c, data.c, macros.c, print.c: Include keyboard.h.
+ 
+ 	* Makefile.in.in (alloc.o, data.o, macros.o, print.o):
+ 	Depend on keyboard.h.
+ 
+ 	* xterm.h (x_display_info): Use `struct kboard', not KBOARD.
+ 	* frame.h (struct frame): Use `struct kboard', not KBOARD.
+ 
+ 	* keyboard.h (KBOARD, etc): Moved from lisp.h.
+ 	(struct kboard): Renamed from struct KBOARD.
+ 	* lisp.h (KBOARD, etc): Moved to keyboard.h.
+ 
+ Sun Apr  9 00:51:09 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* keyboard.c (unlock_kboard): Do nothing with Vunread_command_events.
+ 	(read_char): Clean up logic for reading from KBOARD queues.
+ 
+ 	* xfns.c (defined_color): Fix typo (duplicate +).
+ 
+ 	* keyboard.c (kbd_buffer_get_event): Set copy by assignment, not init.
+ 
+ 	* xterm.c (XTread_socket): Make deiconify event
+ 	only if frame was iconified.
+ 
+ 	* xrdb.c (xmalloc, xrealloc): Declare them here.
+ 
+ Sat Apr  8 20:42:00 1995  Erik Naggum  <erik@naggum.no>
+ 
+ 	* editfns.c (Fencode_time): New function, to match `decode-time'.
+ 
+ Sat Apr  8 00:19:38 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* intervals.c (set_point): When skipping intangible text,
+ 	stop where property value changes.
+ 
+ 	* indent.c (Fmove_to_column): Fix minor bug in prev change.
+ 
+ 	* lread.c (read_escape): Undo Nov 15 change.
+ 
+ 	* xdisp.c (display_mode_line): Test mode_line_inverse_video
+ 	before highlighting partial-width mode line.
+ 
+ 	* xmenu.c (popup_activate_callback): Increment popup_activated_flag.
+ 	(popup_deactivate_callback): Decrement it.
+ 
+ 	* s/linux.h (HAVE_SELECT, HAVE_TIMEVAL): Definitions deleted.
+ 	config.h should handle them.
+ 
+ 	* xdisp.c (redisplay): Don't call update_frame for non-selected
+ 	termcap frame.
+ 
+ Sat Apr  8 04:37:32 1995  Noah Friedman  <friedman@prep.ai.mit.edu>
+ 
+         * window.c (Fnext_window, Fprevious_window): If all_frames is a
+         frame and window is not on that frame, return the first window on
+         that frame.
+ 
+ Fri Apr  7 19:59:01 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* lread.c (init_lread): Add site-lisp under the installation dir
+ 	to Vload_path if that exists.
+ 
+ 	* s/osf1.h (xmalloc, xrealloc): Declare them.
+ 
+ 	* frame.c (make_terminal_frame): Use Emacs, Emacs-2, ... as name.
+ 
+ 	* xdisp.c (decode_mode_spec): Add %F code.
+ 	Order alternatives alphabetically.
+ 
+ 	* s/aix4.h: Use "..." in #include.
+ 
+ Fri Apr  7 10:16:44 1995  Morten Welinder  <terra+@cs.cmu.edu>
+ 
+ 	* s/osf1.h: Include alloca.h, string.h.  Test NOT_C_CODE.
+ 
+ 	* m/alpha.h (SPECIAL_EMACS_INT): Defined.
+ 
+ Fri Apr  7 19:09:53 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* keyboard.c (kbd_buffer_get_event): Check for frame buried in a cons.
+ 	Delete menu_bar_event handling code.
+ 	(make_lispy_event): Move it here, so it gets a switch-frame if needed.
+ 
+ 	* callint.c (Fcall_interactively): Fix previous change.
+ 
+ Fri Apr  7 00:02:45 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* doprnt.c (xmalloc, xrealloc): Declare them here.
+ 
+ 	* callint.c (Fcall_interactively): `+' is reserved for user changes.
+ 
+ 	* process.c (read_process_output_error_handler)
+ 	(exec_sentinel_error_handler): Fsleep_for wants two args.
+ 
+ 	* xfns.c (validate_x_resource_name): Change invalid chars to `_'.
+ 
+ 	* doprnt.c (doprnt): Cast pointer to int by way of EMACS_INT.
+ 
+ 	* xmenu.c (menubar_selection_callback, dialog_selection_callback)
+ 	(single_submenu): Cast pointer to int by way of EMACS_INT.
+ 
+ 	* floatfns.c (Flogb): Use EMACS_INT for `value'.
+ 
+ 	* editfns.c (Fformat): Cast int to pointer by way of EMACS_INT.
+ 
+ 	* search.c (search_buffer): Avoid casting trt to int.
+ 	Use EMACS_INT for comparing pointers.
+ 
+ 	* buffer.h (Fdelete_overlays): Add declaration.
+ 
+ 	* keyboard.c (parse_modifiers): Use type EMACS_INT for `modifiers'.
+ 
+ 	* xterm.c (dumpglyphs): Cast FACE_DEFAULT to (XFontStruct *)
+ 	for comparison with face->font.
+ 
+ 	* sysdep.c (bcopy): If NEED_BCOPY, do compile this.
+ 
+ 	* m/ncr386.h: New file.
+ 
+ 	* s/hpux9.h (LD_SWITCH_X_DEFAULT): New definition.
+ 	(C_SWITCH_X_DEFAULT): New definition.
+ 
+ 	* doc.c (get_doc_string): In (STRING . INTEGER), if INTEGER
+ 	is negative, negate it.
+ 
+ 	* eval.c (Fuser_variable_p): For (STRING . INTEGER), test sign.
+ 
+ 	* s/sol2.h (C_SWITCH_X_SYSTEM): Defined.
+ 
+ 	* s/usg5-4-2.h (LIBS_SYSTEM): New override definition.
+ 
+ 	* lisp.h (XMISCTYPE): New macro.
+ 	(union Lisp_Misc): Delete the `type' field.
+ 	Use XMISCTYPE instead of that.
+ 
+ 	* alloc.c (Fmake_marker, mark_object): Use XMISCTYPE.
+ 	(clear_marks, gc_sweep): Use u_marker union elt to extrat misc type.
+ 
+ 	* lread.c (defvar_int, defvar_bool, defvar_lisp_nopro, defvar_kboard)
+ 	(defvar_per_buffer): Use XMISCTYPE.
+ 	* print.c (print): Use XMISCTYPE.
+ 	* fns.c (internal_equal): Use XMISCTYPE.
+ 	* buffer.c (Fmake_overlay): Use XMISCTYPE.
+ 	* data.c (Ftype_of, do_symval_forwarding, store_symval_forwarding)
+ 	(find_symbol_value, Fmake_variable_buffer_local, Fmake_local_variable):
+ 	Use XMISCTYPE.
+ 
+ 	* xdisp.c (prepare_menu_bars): Do the frame titles last.
+ 
+ Thu Apr  6 17:54:20 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xfaces.c (intern_face): Cast FACE_DEFAULT to (XFontStruct *)
+ 	for comparison with face->font.
+ 
+ 	* puresize.h (CHECK_IMPURE): Remove & from before my_edata.
+ 
+ 	* editfns.c (Fformat_time_string): Use emacs_strftime.  Doc fix.
+ 
+ 	* Makefile.in.in (strftime.o): Define strftime as emacs_strftime.
+ 
+ 	* xmenu.c (frame_vector): New static variable.
+ 	(syms_of_xmenu): staticpro it.
+ 	(frame_vector_add_frame): New function.
+ 	(set_frame_menubar): Use frame_vector; use index as the widget id.
+ 	(free_frame_menubar): Likewise.  Remove the frame from frame_vector.
+ 	(menubar_selection_callback): Use frame_vector to turn id into frame.
+ 
+ 	* emacs.c (main): Cast arg to `brk'.
+ 
+ 	* sysdep.c (init_sys_modes): Use TCOON only if defined.
+ 
+ 	* s/netbsd.h (NO_MATHERR): Defined.
+ 	(LIBS_SYSTEM): Definition deleted.
+ 
+ 	* unexsunos4.c: Treat __NetBSD__ like __FreeBSD__.
+ 
+ Thu Apr  6 14:49:30 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* fns.c (Fplist_put): Fix missing \n\.
+ 
+ 	* xfns.c (x_window_to_frame): Skip non-X frames before testing dpyinfo.
+ 	[USE_X_TOOLKIT] (x_any_window_to_frame, x_top_window_to_frame): Ditto.
+ 
+ Thu Apr  6 08:00:06 1995  Simon Marshall  <simon@duality.gnu.ai.mit.edu>
+ 
+ 	* data.c (Fcar, Fcdr, Fsetcar, Fsetcdr): Arg name doc fixes.
+ 
+ Thu Apr  6 01:18:11 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* puresize.h (BASE_PURESIZE): Increment to 310000.
+ 
+ 	* indent.c (string_width): New function.
+ 	(vmotion): Compute the width of minibuf_prompt
+ 	if it isn't already known.
+ 
+ 	* buffer.c (Fkill_buffer): Call reset_buffer_local_variables
+ 	and swap_out_buffer_local_variables.
+ 	(swap_out_buffer_local_variables): New subroutine.
+ 	(Fkill_all_local_variables): Use that subroutine.
+ 
+ 	* search.c (Flooking_at, Fposix_looking_at): Change arg name.
+ 
+ Wed Apr  5 22:52:55 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* frame.c (Fraise_frame, Flower_frame): Now interactive.
+ 
+ Tue Apr  4 22:53:24 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* lisp.h: Declare Ffetch_bytecode.
+ 	* eval.c (Ffetch_bytecode): New function.
+ 	(funcall_lambda): Call it.
+ 	(syms_of_eval): defsubr it.
+ 
+ Mon Apr  3 17:48:22 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* xfns.c (x_window_to_frame): New arg DPYINFO.  All callers changed.
+ 	(x_any_window_to_frame, x_top_window_to_frame): Likewise.
+ 
+ 	* lisp.h (Vmessage_log_max): Declare this variable.
+ 	(message_nolog): Declare this function.
+ 	* emacs.c (main): Start with an empty message log.
+ 	* xdisp.c (message_nolog): New function.
+ 	* fns.c (Fy_or_n_p): Don't log prompt.
+ 	(Fyes_or_no_p): Fix typo in doc string.
+ 
+ Sat Apr  1 01:13:50 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* lread.c (oblookup): Save bucket num in oblookup_last_bucket_number.
+ 	(Funintern): New function.
+ 	(syms_of_lread): defsubr it.
+ 
+ Fri Mar 31 23:31:22 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* dired.c (Fdirectory_files): Fix bug in IS_ANY_SEP usage
+ 	introduced in Oct 30 change.
+ 
+ Fri Mar 31 14:25:43 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* keyboard.c (command_loop_1): If we ignore force_start, then also
+ 	ignore beg_unchanged and end_unchanged.
+ 
+ Fri Mar 31 09:55:41 1995  Michael Ernst  <mernst@research.microsoft.com>
+ 
+ 	* lread.c (isfloat_string): Permit trailing space.
+ 
+ Thu Mar 30 19:07:04 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* keyboard.c (event_to_kboard): Ignore dead frames.
+ 	(kbd_buffer_get_event): In batch mode, use current_kboard.
+ 
+ 	* xterm.c (x_delete_display): Extract kboard deletion, for modularity.
+ 	* keyboard.c (wipe_kboard): Make this function static.
+ 	(delete_kboard): New function, extracted from x_delete_display.
+ 
+ 	* lisp.h: Declare function delete_kboard.
+ 
+ 	* xterm.h (struct x_display_info): New member cut_buffers_initialized.
+ 	* xterm.c (x_term_init): Initialize it.
+ 	* xselect.c (Fx_store_cut_buffer_internal): Use the flag in the
+ 	frame's x_display_info, not a global flag.
+ 	(Fx_rotate_cut_buffers_internal): Likewise.
+ 
+ 	* emacs.c (sort_args): Skip strncmp if longname is a null pointer.
+ 
+ Thu Mar 30 04:22:00 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* data.c (Fmod): Fix the final adjustment, when i2 < 0 and i1 == 0.
+ 
+ Wed Mar 29 01:07:28 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* frame.c [MULTI_FRAME] (Factive_minibuffer_window): New function.
+ 	[MULTI_FRAME] (syms_of_frame): Defsubr it.
+ 
+ Tue Mar 28 18:32:08 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* process.c (Fsignal_process): SIGCODE is a symbol, not a string.
+ 
+ Tue Mar 28 02:38:16 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* fns.c (Fconcat): Undo previous change.
+ 
+ Mon Mar 27 16:10:46 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* fns.c (Fget, Fput): Fetch and store symbol's plist directly.
+ 
+ Mon Mar 27 10:26:49 1995  Boris Goldowsky  <boris@cs.rochester.edu>
+ 
+ 	* fns.c (Fplist_put, Fplist_get): New fns.
+ 	(Fget): Use Fplist_get to do the work.
+ 	(Fput): Use Fplist_put to do the work.
+ 
+ 	* textprop.c (Vdefault_text_properties): name changed from
+ 	Vdefault_properties.
+ 	* intervals.h: As above.
+ 	* intervals.c (textget): As above.
+ 
+ 	* intervals.c (textget_direct): Fn deleted.
+ 	(textget, verify_interval_modification): Use Fplist_get instead.
+ 	* intervals.h: Remove declaration.
+ 
+ Sun Mar 26 03:45:13 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xterm.c (XTmouse_position): New arg `insist'.
+ 	* ntinevt.c (win32_mouse_position): New arg `insist'.
+ 	* msdos.c (mouse_get_pos): New arg `insist'.
+ 
+ 	* xmenu.c (Fx_popup_menu): Pass 1 for `insist' arg.
+ 	(Fx_popup_dialog): Likewise.
+ 	* frame.c (Fmouse_position--both definitions): Pass 0 for `insist'.
+ 	(Fmouse_pixel_position): Pass 0 for `insist'.
+ 	Add HAVE_MOUSE conditional.
+ 	* keyboard.c (kbd_buffer_get_event): Pass 0 for `insist' arg.
+ 
+ 	* m/intel386.h (C_SWITCH_SYSTEM): Don't #undef or define it.
+  	[SOLARIS2, SOLARIS2_4, !__GNUC__] (C_SWITCH_MACHINE): Define instead.
+ 
+ Sun Mar 26 03:02:28 1995  Germano Caronni <caronni@tik.ethz.ch>
+ 
+ 	* ralloc.c (r_re_alloc): Correct realloc behavior--allow shrinking
+  	of blocks while reallocating, if shrinking by more than one page.
+ 	(relocate_blocs, resize_blocs): Added failsafe to protect future
+ 	calling of these routines when in frozen state.
+ 	(r_alloc_thaw): Added call to r_alloc_init.
+ 	(relocate_blocks, resize_bloc, r_alloc_sbrk, r_alloc_thaw): Extended
+ 	functionality to let ralloc package work in frozen state, allowing
+ 	for the existence of unused blocks.
+ 
+ Sat Mar 25 21:02:37 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* process.c (Fsignal_process): Allow signal names as well as numbers.
+ 
+ Fri Mar 24 23:47:47 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* editfns.c (init_editfns): Use NAME envvar to init user-full-name.
+ 
+ Fri Mar 24 17:38:35 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* textprop.c (Fnext_property_change): Fix previous change.
+ 
+ Thu Mar 23 19:40:04  Kevin Rodgers <kevinr@ihs.com>
+ 
+ 	* print.c (temp_output_buffer_setup): (Re)set the default
+ 	directory of the temp buffer to that of the current buffer.
+ 
+ Thu Mar 23 16:30:17 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* buffer.c (syms_of_buffer): Doc fix.
+ 
+ 	* xdisp.c (redisplay): Make sure pause is set before used.
+ 	Delete unused vars.
+ 	(redisplay_window): Make sure update_mode_line is set before used.
+ 	If startp might not have been set, use w->start directly.
+ 	(try_window_id): In the easy case, find cursor pos before returning.
+ 	(try_window_id): Stop scan at bottom of window, not one line later.
+ 	Don't fail on account of continuation line below window.
+ 	(redisplay_window): Stop scan at bottom of window.
+ 	Fix reversed condition.
+ 
+ 	* Makefile.in.in (FRAME_SUPPORT, MSDOS_SUPPORT): Don't list face
+ 	and mouse related files here.
+ 	(FACE_SUPPORT, MOUSE_SUPPORT): New lists.
+ 	(FACE_SUPPORT): Add facemenu.elc.
+ 	(WINNT_SUPPORT): New list.
+ 	(lisp): Add format.elc, FACE_SUPPORT, MOUSE_SUPPORT, WINNT_SUPPORT.
+ 
+ Thu Mar 23 12:01:22 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* m/sparc.h: Don't include alloca.h if NOT_C_CODE.
+ 
+ 	* m/mips-siemens.h (UNEXEC): Override the definition.
+   	(LIBS_DEBUG, ORDINARY_LINK): Add #undefs.
+ 
+ Wed Mar 22 12:43:34 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* dispnew.c (direct_output_forward_char): Don't use direct output
+ 	at an overlay boundary.
+ 	* buffer.c (overlay_touches_p): New function.
+ 	* lisp.h: Declare overlay_touches_p.
+ 
+ 	* fns.c (concat): Treat integers as characters, not strings.
+ 	This makes `concat' more like `insert'.
+ 
+ 	* window.c (syms_of_window): Fix missing \n\.
+ 	* keymap.c (Fwhere_is_internal): Fix missing \n\.
+ 	* fileio.c (syms_of_fileio): Fix missing \n\.
+ 
+ Tue Mar 21 01:15:00 1995  Marco Walther  <Marco.Walther@mch.sni.de.>
+ 
+ 	* unexelfsni.c: New file.
+ 
+ 	* m/mips-siemens.h: Total rewrite.
+ 
+ Mon Mar 20 18:32:13 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xdisp.c (redisplay_window): Skip the only-point-has-changed
+ 	optimization if updating the window's mode line.
+ 
+ Sun Mar 19 13:47:20 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xdisp.c (invisible_p, invisible_ellipsis_p): Handle list
+ 	as invisible property value.
+ 
+ Sat Mar 18 18:07:21 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xdisp.c (display_menu_bar): Just one space between menu items.
+ 
+ Sat Mar 18 06:15:50 1995  Ted Lemon  <mellon@toccata.fugue.com>
+ 
+ 	* emacs.c (dump-emacs-data, dump-emacs): Declare my_edata as
+ 	char array.
+ 	* lastfile.c (my_edata): Declare as char array, not int.
+ 	* puresize.h (CHECK_IMPURE): Declare my_edata as char array.
+ 
+ Fri Mar 17 20:30:51 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* lread.c (Vload_read_function): New variable.
+ 	(readevalloop): Use that variable.
+ 	(syms_of_lread): Set up Lisp variable.
+ 
+ Fri Mar 17 13:16:53 1995  Boris Goldowsky  <boris@spiff.gnu.ai.mit.edu>
+ 
+ 	* buffer.h (struct buffer): Add file_format member.
+ 
+ 	* buffer.c (reset_buffer): Reset file_format element too.
+ 	(init_buffer_once): Define file_format flag; reset file_format.
+ 	(syms_of_buffer): New vbl buffer-file-format.
+ 
+ 	* fileio.c (Finsert_file_contents): Call format-decode.
+ 	(build_annotations): Call format-annotate-function for each element of
+ 	buffer-file-format.
+ 	(Vauto_save_file_format): New vbl.
+ 	(build_annotations): Use it.
+ 
+ Fri Mar 17 02:40:46 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* alloc.c (init_alloc_once): Increase gc_cons_threshold to 300000.
+ 
+ Wed Mar 15 16:37:33 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xfns.c (x_decode_color): Don't use cdef if defined_color failed.
+ 
+ Wed Mar 15 15:10:47 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* config.h.in [HAVE_X_WINDOWS] (MULTI_KBOARD): Define this symbol.
+ 
+ Tue Mar 14 19:03:03 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* lisp.h (struct KBOARD, MULTI_KBOARD, current_kboard, all_kboards):
+ 	(Lisp_Misc_Kboard_Objfwd, Lisp_Kboard_Objfwd, XKBOARD_OBJFWD):
+ 	(KBOARD_OBJFWDP, GC_KBOARD_OBJFWDP, kboard_locked, the_only_kboard):
+ 	(DEFVAR_KBOARD): Renamed from PERDISPLAY, MULTI_PERDISPLAY,
+ 	current_perdisplay, all_perdisplays, Lisp_Misc_Display_Objfwd,
+ 	Lisp_Display_Objfwd, XDISPLAY_OBJFWD, DISPLAY_OBJFWDP,
+ 	GC_DISPLAY_OBJFWDP, display_locked, the_only_perdisplay,
+ 	DEFVAR_DISPLAY.  All uses changed.
+ 	(struct KBOARD): New member reference_count.
+ 	(initial_kboard): Declare this var.
+ 	* .gdbinit (xkbobjfwd): Renamed from xdispobjfwd.
+ 	* frame.h (struct frame): New member kboard.
+ 	(FRAME_KBOARD): Accessor macro for that member, replacing
+ 	get_perdisplay.
+ 	* xterm.h (struct x_display_info): member kboard (formerly
+ 	perdisplay) is now a pointer, not an actual struct.
+ 	(get_perdisplay, get_perdisplay_macro): Deleted.
+ 	* xfns.c (Fx_create_frame): set the frame's kboard member.
+ 	* xterm.c (get_perdisplay): Deleted.
+ 	(same_x_server): New function.
+ 	(x_term_init): If this display shares a keyboard with one we've
+ 	already opened, then share the structure.
+ 	(x_delete_display): Don't delete the kboard until the reference
+ 	count becomes zero.
+ 	* lread.c (defvar_kboard): Renamed from defvar_display.
+ 	* alloc.c (mark_kboards): Renamed from mark_perdisplays.
+ 	* frame.c (make_frame): Initialize kboard member.
+ 	(make_terminal_frame): Create initial_kboard if not already set.
+ 	* keyboard.c (unlock_kboard): Renamed from unlock_display.
+ 	(wrong_kboard_jmpbuf): Renamed from wrong_display_jmpbuf.
+ 	(event_to_kboard): Renamed from event_to_perdisplay.
+ 	(kbd_buffer_get_event): If no associated kboard, store
+ 	current_kboard rather than the first kboard in the global list.
+ 	(init_kboard): Renamed from init_perdisplay.  Initialize reference
+ 	count.
+ 	(wipe_kboard): Renamed from wipe_perdisplay.
+ 	* data.c (find_symbol_value): current_perdisplay now is never null.
+ 	(store_symval_forwarding, do_symval_forwarding): Likewise.
+ 
+ Tue Mar 14 00:45:13 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* data.c (Fash): Fix previous change.
+ 
+ 	* buffer.c (Fmake_indirect_buffer): Invert the arguments.
+ 
+ 	* marker.c (unchain_marker): Allow differing buffers
+ 	as long as they have the same text.
+ 
+ Mon Mar 13 16:47:12 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* keyboard.c (event_to_perdisplay): New function.
+ 	(kbd_buffer_get_event): Use event_to_perdisplay.
+ 	(kbd_buffer_store_event): If C-g arrives while we're in the run
+ 	state on behalf of another display, just clear the queue and
+ 	deposit the C-g to be read later.
+ 	(read_key_sequence): After a throw, unwind delayed_switch_frame as
+ 	well as keybuf.  Don't insert an extra switch-frame if empty.
+ 
+ 	* print.c (print): current_perdisplay now is never null.
+ 	* callint.c (clear_prefix_arg): Likewise.
+ 	* macros.c (Fexecute_kbd_macro): Likewise.
+ 
+ Mon Mar 13 02:19:09 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* minibuf.c (read_minibuf): Save Voverriding_local_map.
+ 	(read_minibuf_unwind): Restore Voverriding_local_map.
+ 
+ Mon Mar 13 01:33:40 1995  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+ 
+ 	* unexelf.c (unexec): Adjust the file offset of sections located
+ 	after the section header table.
+ 
+ Sun Mar 12 21:49:33 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* keyboard.c (unlock_display): current_perdisplay now is never null.
+ 	(cmd_error, command_loop_1, read_char): Likewise.
+ 	(kbd_buffer_get_event, read_key_sequence): Likewise.
+ 	(read_char): Handle synchronous quit_char on a different display.
+ 	(read_char): Rewrite queue-searching code.
+ 	(read_key_sequence): Save selected_frame.
+ 	(init_keyboard): Initialize current_perdisplay.
+ 
+ Sun Mar 12 00:01:03 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* keyboard.c (parse_modifiers_uncached): Delete the code for
+ 	multi-character modifiers and for recognizing a modifier alone.
+ 	(parse_solitary_modifier): New function.
+ 	(convert_event_type_list): Use parse_solitary_modifier.
+ 	Also convert symbol A to character A.
+ 	Handle shift modifier with lower-case letters.
+ 
+ 	* window.c (Fdisplay_buffer): Fix prev change--return sel window.
+ 
+ 	* indent.c (compute_motion, Fmove_to_column, current_column)
+ 	(character_width): Let display table handle \n, \r, \t.
+ 	(compute_motion): Fix logic in previous change wrt skipping invisible.
+ 
+ Sat Mar 11 01:01:42 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xdisp.c (display_text_line): When setting selective_rlen,
+ 	ignore whether selective display is on or off.
+ 
+ 	* textprop.c (Fnext_property_change): Handle LIMIT = t.
+ 
+ 	* indent.c (compute_motion): Call recenter_overlay_lists sooner.
+ 	Use Fnext_property_change to get a quick lower bound for
+ 	where `invisible' changes.
+ 
+ Fri Mar 10 19:50:03 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* data.c (Fash, Flsh): Change arg names.
+ 
+ Thu Mar  9 18:45:06 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* intervals.h (TEXT_PROP_MEANS_INVISIBLE): New macro.
+ 	(TEXT_PROP_MEANS_INVISIBLE_WITH_ELLIPSIS): New macro.
+ 
+ 	* xdisp.c (display_text_line, try_window): Check `invisible' prop
+ 	using TEXT_PROP_MEANS_INVISIBLE.
+ 	(display_text_line): Check TEXT_PROP_MEANS_INVISIBLE_WITH_ELLIPSIS;
+ 	if it says so, use ellipses after invisible text.
+ 	(invisible_p, invisible_ellipsis_p): New functions.
+ 
+ 	* indent.c (compute_motion, vmotion): Check `invisible' prop
+ 	using TEXT_PROP_MEANS_INVISIBLE.
+ 
+ 	* buffer.h (struct buffer): New field `invisibility_spec'.
+ 	* buffer.c (reset_buffer_local_variables): Init invisibility.
+ 	(init_buffer_once): Set up buffer_local_flags for it.
+ 	(syms_of_buffer): New variable `buffer-invisibility-spec'.
+ 
+ Wed Mar  8 21:57:52 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* syntax.c (Fforward_comment): Always clear immediate_quit for return.
+ 
+ Wed Mar  8 17:47:37 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* sysdep.c (read_input_waiting): Fix Lisp_Object vs. int problem.
+ 
+ Tue Mar  7 19:41:09 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* lisp.h (struct PERDISPLAY): New member kbd_queue_has_data.
+ 	* keyboard.c (unlock_display): If adding to kbd_queue, set
+ 	kbd_queue_has_data.
+ 	(read_char): Set and clear kbd_queue_has_data appropriately, but
+ 	leave it unset when we push back an incomplete sequence.
+ 	(read_char): Take the longjmp even if current_perdisplay was null.
+ 	(readable_events): Check kbd_queue_has_data instead of kbd_queue.
+ 	(init_perdisplay): Initialize kbd_queue_has_data.
+ 
+ 	* keyboard.c (command_loop_1): Removed inline code for prefix args.
+ 	* callint.c (current_prefix_partial): New var.
+ 	(Funiversal_argument): New function, formerly inlined in keyboard.c.
+ 	(Fnegative_argument, Fdigit_argument): Likewise.
+ 	(clear_prefix_arg): Moved here from keyboard.c.
+ 	Don't clear the internal state if we're still building a prefix arg.
+ 	(finalize_prefix_arg, describe_prefix_arg): Moved from keyboard.c.
+ 	(syms_of_callint): defsubr the new functions.
+ 	* lisp.h: Declare new var and functions.
+ 
+ 	* lisp.h (struct PERDISPLAY): New member Vlast_kbd_macro.
+ 	* alloc.c (mark_perdisplays): Mark it here.
+ 	* keyboard.c (init_perdisplay): Initialize it here.
+ 
+ 	* macros.c (Fstart_kbd_macro): Access Vlast_kbd_macro via perdisplay.
+ 	(Fend_kbd_macro, Fcall_last_kbd_macro): Likewise.
+ 	(init_macros): Delete initialization.
+ 	(syms_of_macros): Use DEFVAR_DISPLAY for Vlast_kbd_macro.
+ 	Doc fix for executing-macro, executing-kbd-macro, last-kbd-macro.
+ 
+ 	* keyboard.c (cmd_error): Bind Vprint_level and Vprint_length.
+ 
+ Mon Mar  6 23:55:38 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* keyboard.c (command_loop_1): Fix test for prefix arg.
+ 
+ Mon Mar  6 10:17:14 1995  Boris Goldowsky  <boris@cs.rochester.edu>
+ 
+ 	* textprop.c (Vdefault_properties): New variable.
+ 	* intervals.h: Declare it.
+ 	* intervals.c (textget): Check it.
+ 
+ Fri Mar  3 02:01:52 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* callint.c (Fcall_interactively): Fix Feb 22 change.
+ 
+ 	* keyboard.c (read_key_sequence): Update orig_local_map
+ 	for some additional gotos to replay_sequence.
+ 
+ 	* process.c (exec_sentinel, read_process_output): If running filter
+ 	or sentinel changes the local map, call record_asynch_buffer_change.
+ 
+ Thu Mar  2 20:45:08 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* xdisp.c (display_mode_line): Temporarily set current_perdisplay
+ 	to reference the frame we're updating.
+ 
+ 	* lisp.h (struct PERDISPLAY): New members defining_kbd_macro,
+ 	kbd_macro_buffer, kbd_macro_ptr, kbd_macro_end, kbd_macro_bufsize.
+ 	* macros.h (defining_kbd_macro): Delete declaration.
+ 	* macros.c (defining_kbd_macro): Delete; now part of perdisplay.
+ 	All uses changed.
+ 	(kbd_macro_buffer, kbd_macro_ptr, kbd_macro_end): Likewise.
+ 	(kbd_macro_bufsize): Likewise.
+ 	(Fstart_kbd_macro): Initialize kbd_macro_buffer if not already done.
+ 	(init_macros): Delete initialization of defining_kbd_macro.
+ 	(syms_of_macros): Delete initialization of kbd_macro_buffer.
+ 	* keyboard.c (read_char_minibuf_menu_prompt): orig_defn_macro is
+ 	now a Lisp_Object, not an int.
+ 	(init_perdisplay): Initialize some of the new members.
+ 	(wipe_perdisplay): Free kbd_macro_buffer.
+ 
+ 	* keyboard.c (cmd_error): Allow current_perdisplay to be null.
+ 
+ 	* keyboard.c (read_key_sequence): New arg can_return_switch_frame.
+ 	All callers changed.
+ 	(Fread_key_sequence): Likewise.
+ 	* callint.c (Fcall_interactively): Defer switch-frame events when
+ 	reading `k' or `K' specification.
+ 
+ Thu Mar  2 14:37:26 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* emacs.c (syms_of_emacs): Doc fix.
+ 
+ Thu Mar  2 02:28:04 1995  John Grabowski  <johng@media.mit.edu>
+ 
+ 	* xfns.c (defined_color): If colormap is full, find closest match.
+ 	* xfaces.c (load_color): Call defined_color to allocate the color.
+ 
+ Wed Mar  1 01:58:34 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xterm.c (x_connection_closed): Ignore non-X frames.
+ 	Fix the logic for deleting frames that use separate minibuffers
+ 	that are on the dead connection.
+ 
+ 	* buffer.c (Fpop_to_buffer): Call Fset_buffer_major_mode
+ 	if we create a buffer.
+ 
+ Tue Feb 28 18:33:11 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* keyboard.c (cmd_error): Use clear_prefix_arg.
+ 	(internal_last_event_frame, Vlast_event_frame): Normal vars again.
+ 	All uses changed.
+ 	(Quniversal_argument, Qdigit_argument, Qnegative_argument): Declare.
+ 	(clear_prefix_arg, finalize_prefix_arg, describe_prefix_arg): New fns.
+ 	(command_loop_1): Handle digits and minus specially, when they're
+ 	part of a prefix arg.
+ 	Handle universal-argument and digit-argument and negative-argument
+ 	bindings here, rather than doing I/O in the Lisp code.
+ 	(read_char): When reading switch-frame events from the side queue,
+ 	set internal_last_event_frame.
+ 	(readable_events): Return non-zero if a side queue has data.
+ 	(kbd_buffer_get_event): Don't abort if event has no associated frame.
+ 	(read_key_sequence): Improve behavior when there's no current display.
+ 	(init_perdisplay): Initialize the new members.
+ 	* callint.c (Fcall_interactively, syms_of_callint): Undo Jan 31 change.
+ 	(Vprefix_arg, Vcurrent_prefix_arg): Undo Jan 31 change.
+ 	* mocklisp.c (Fml_provide_prefix_argument, Fml_prefix_argument_loop):
+ 	Undo Jan 31 change.
+ 	* minibuf.c (read_minibuf, read_minibuf_unwind): Undo Jan 31 change.
+ 	* frame.c (do_switch_frame): Undo Feb 6 change.
+ 	* macros.c (Fexecute_kbd_macro): Use clear_prefix_arg.
+ 	* lisp.h (struct PERDISPLAY): Add prefix_factor, prefix_value,
+ 	prefix_sign, prefix_partial.  Delete Vcurrent_prefix_arg and
+ 	Vprefix_arg; those are now plain vars again.
+ 	* alloc.c (mark_perdisplays): Update to reflect current Lisp_Objects.
+ 	(NSTATICS): Increase to 768.
+ 
+ Tue Feb 28 12:56:36 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* frame.c (Fframep): Doc fix.
+ 
+ Tue Feb 28 00:20:50 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* callint.c (Fcall_interactively): Lock the display before
+ 	executing the command, no matter how we execute it.
+ 
+ Sun Feb 26 02:44:35 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* keyboard.c (convert_event_type_list): New function.
+ 	(lucid_event_type_list_p): New function.
+ 	(parse_modifiers_uncached): If MODIFIERS_END is -1,
+ 	look for just a modifier.  Guts rewritten.
+ 
+ 	* keymap.c (Fdefine_key): Handle Lucid-style (crtl backspace) etc.
+ 	(Flookup_key): Likewise.
+ 
+ 	* callproc.c (Fcall_process): Extend BUFFER arg so it can specify
+ 	a separate output file for stderr output.
+ 	(Fcall_process_region): Doc fix.
+ 
+ Sat Feb 25 03:31:33 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xmenu.c (Fx_popup_menu): Init f from selected_frame
+ 	before calling mouse_position_hook.
+ 
+ 	* window.c (Vsame_window_buffer_names, Vsame_window_regexps): New vars.
+ 	(syms_of_window): Set up Lisp vars.
+ 	(Fdisplay_buffer): Use those vars--if requested, use current window.
+ 
+ Fri Feb 24 23:03:10 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* keyboard.c (unlock_display): New function.
+ 	(cmd_error, command_loop_1): Call it when appropriate.
+ 	(read_char): If no current display, don't try to echo.
+ 
+ 	* term.c (term_init) [TERMINFO]: Make error message more accurate.
+ 
+ Thu Feb 23 22:35:58 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* keymap.c (Fglobal_set_key, Flocal_set_key, Fglobal_unset_key)
+ 	(Flocal_unset_key): Functions deleted (moved to simple.el).
+ 	(syms_of_keymap): Don't defsubr them.
+ 
+ Thu Feb 23 21:25:41 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* keyboard.c (display_locked): New var to indicate when we're in
+ 	the run state.  current_perdisplay is now meaningful in the wait
+ 	state as well.
+ 	(cmd_error): Clear display_locked in addition to current_perdisplay.
+ 	(command_loop_1): outer_perdisplay renamed from global_perdisplay.
+ 	Restore display_locked as well as current_perdisplay.
+ 	(read_char): read_char_perdisplay merged with current_perdisplay.
+ 	(read_key_sequence): Likewise.
+ 	* minibuf.c (read_minibuf): Make sure the display is locked.
+ 	* callint.c (Fcall_interactively): If the display hasn't already
+ 	been locked by reading from the minibuffer, lock it before
+ 	executing the command.
+ 	* lisp.h (display_locked): Declare this var.
+ 
+ Thu Feb 23 01:00:04 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* window.c (syms_of_window): Doc fixes.
+ 
+ 	* keymap.c (Fwhere_is_internal): If FIRSTONLY is not nil or non-ascii,
+ 	completely ignore menu bindings.
+ 	* xmenu.c (menu_item_equiv_key): Delete the code that rejected
+ 	menu bindings returned by Fwhere_is_internal.
+ 
+ 	* window.c (window_loop): Handle special display buffer frames
+ 	for DELETE_BUFFER_WINDOWS as for UNSHOW_BUFFER.
+ 
+ Wed Feb 22 23:54:22 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* callint.c (Fcall_interactively): Use markers temporarily in
+ 	args vector to stand for point and mark values; replace them
+ 	with integers just before calling the command.
+ 
+ Tue Feb 21 22:01:17 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* lisp.h (struct PERDISPLAY): New member kbd_queue.
+ 	Delete obsolete members kbd_buffer_frame_or_window, kbd_buffer,
+ 	kbd_fetch_ptr, kbd_store_ptr; these are regular vars again.
+ 	* alloc.c (mark_perdisplays): Mark kbd_queue.
+ 	Remove reference to obsolete kbd_buffer_frame_or_window.
+ 	* xmenu.c (menubar_selection_callback): frame_or_window field of a
+ 	menu-bar event now includes both the frame and the magic cookie.
+ 	* keyboard.c (kbd_buffer_frame_or_window): Restored old var.
+ 	(kbd_buffer, kbd_fetch_ptr, kbd_store_ptr): Likewise.
+ 	(read_char_perdisplay): New var.
+ 	(read_char): Search all appropriate perdisplay objects, and do the
+ 	right thing if the next event comes from a different source.
+ 	(read_key_sequence): If there's a change of display in mid-stream,
+ 	retreat and try reading the new display.
+ 	(find_active_event_queue): Function deleted.  All callers changed
+ 	to just test the main kbd_buffer instead.
+ 	(kbd_buffer_store_event): Write to the main kbd_buffer again.
+ 	(kbd_buffer_get_event): Read from the main kbd_buffer again.
+ 	Now returns a perdisplay pointer in addition to a lispy event.
+ 	(Fdiscard_input, swallow_events): Use the main kbd_buffer again.
+ 	(stuff_buffered_input): Likewise.
+ 	(init_perdisplay): Initialize member kbd_queue.
+ 	Remove references to obsolete members.
+ 	(wipe_perdisplay): Remove obsolete reference.
+ 	(init_keyboard, syms_of_keyboard): Restore initialization of vars.
+ 
+ Tue Feb 21 20:19:45 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xdisp.c (display_string, display_text_line):
+ 	Display table overrides ordinary display even for \t, \n, etc.
+ 
+ Sun Feb 19 14:06:47 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* frame.c (Fmake_terminal_frame): Doc fix.
+ 
+ Sat Feb 18 04:05:41 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* s/hpux9.h (LIB_X11_LIB, C_SWITCH_X_SYSTEM, LD_SWITCH_X_DEFAULT):
+ 	Add #undef's to cancel hpux8.h's definitions.
+ 
+ Fri Feb 17 03:44:55 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* config.h.in (MULTI_FRAME): Define unconditionally.
+ 
+ Thu Feb 16 01:36:39 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* dispnew.c (change_frame_size_1): New subroutine.
+ 	(change_frame_size): If f is termcap frame, change size of all of them.
+ 	(remake_frame_glyphs): No longer static.
+ 	Don't mark nonselected termcap frame as garbaged.
+ 
+ 	* term.c (calculate_costs): Update max_frame_height, max_frame_width.
+ 	They determine length of chars_wasted, copybuf and char_ins_del_vector.
+ 
+ 	* xdisp.c (redisplay): Don't display nonselected terminal frames.
+ 
+ 	* frame.c (Fmake_terminal_frame): New function.
+ 	(syms_of_frame): defsubr it.
+ 	(make_terminal_frame): Init Vframe_list only the first time.
+ 	Set visible and async_visible directly.
+ 	Give each terminal frame a unique name.
+ 
+ 	* ralloc.c (r_alloc_check): Return void.
+ 	(r_alloc_freeze): Initialize if it hasn't been done.
+ 	(r_re_alloc, r_alloc_free, r_alloc_sbrk): Likewise.
+ 	(r_alloc_init): Set __malloc_extra_blocks.
+ 
+ Wed Feb 15 07:10:41 1995  Paul Reilly  <pmr@geech.gnu.ai.mit.edu>
+ 
+ 	* s/dgux.h (LIB_MOTIF): Add -lgen to provide provide the symbols
+ 	`regcmp' and `regex'.
+ 
+ Wed Feb 15 03:05:34 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* xmenu.c (xmenu_show, both versions): New arg for_click.
+ 	(Fx_popup_menu): Compute it and pass it.
+ 
+ Tue Feb 14 19:02:33 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* callint.c: Doc fix.
+ 
+ Tue Feb 14 21:48:14 1995  Paul Reilly  <pmr@geech.gnu.ai.mit.edu>
+ 
+ 	* xterm.c (x_bitmap_icon): Fix test for unallocated icon bitmap.
+ 
+ Tue Feb 14 16:33:49 1995  Richard Stallman  <rms@geech.gnu.ai.mit.edu>
+ 
+ 	* filelock.c: (unlock_buffer, unlock_all_files, Flock_buffer)
+ 	(Funlock_buffer): Use buffer's file_truename, not filename.
+ 
+ 	* buffer.c (syms_of_buffer): Set up Lisp var buffer-file-truename.
+ 	(init_buffer_once): Set up flag and default value for file_truename.
+ 	(reset_buffer): Init file_truename slot.
+ 
+ 	* buffer.h (struct buffer): New field file_truename.
+ 
+ 	* ralloc.c (r_alloc_free): Call refill_memory_reserve only if emacs.
+ 
+ 	Include getpagesize.h unconditionally.
+ 	(free_bloc): Don't die if bloc->next or bloc->prev is null.
+ 	[!emacs] (bzero): New macro definition.
+ 
+ 	* keyboard.c (input_poll_signal): Add ignored argument.
+ 	(interrupt_signal): Likewise.
+ 
+ 	* dispnew.c (window_change_signal): Add ignored argument.
+ 
+ 	* process.c (Fstart_process): Make process marker point into proc buf.
+ 
+ 	* xterm.c (x_display_bar_cursor): Use frame's cursor_width.
+ 
+ 	(x_connection_signal): New function.
+ 	(x_initialize): Use it as signal handler.
+ 
+ 	* xfns.c (x_set_cursor_type): Set cursor_width field.
+ 	Handle args of form (bar . WIDTH).
+ 
+ 	* xterm.h (struct x_display): New element cursor_width.
+ 
+ Tue Feb 14 04:15:32 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* filelock.c (unlock_buffer, unlock_all_files, Flock_buffer)
+ 	(Funlock_buffer): Use buffer's file_truename, not filename.
+ 
+ 	* buffer.h (struct buffer): New field file_truename.
+ 	* buffer.c (syms_of_buffer): Set up Lisp var buffer-file-truename.
+ 	(init_buffer_once): Set up flag and default value for file_truename.
+ 	(reset_buffer): Init file_truename slot.
+ 
+ 	* xterm.h (struct x_display): New element cursor_width.
+ 	* xfns.c (x_set_cursor_type): Set cursor_width field.
+ 	Handle args of form (bar . WIDTH).
+ 	* xterm.c (x_display_bar_cursor): Use frame's cursor_width.
+ 
+ Mon Feb 13 01:32:38 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* m/iris4d.h (STACK_DIRECTION): Undef before defining.
+ 	[__GNUC__] (C_SWITCH_MACHINE): Remove -cckr.
+ 	Add -32, only if IRIX_FORCE_32_BITS.
+ 	* s/irix5-0.h [__GNUC__] (C_SWITCH_SYSTEM): Defined.
+ 	* s/irix4-0.h [__GNUC__] (C_SWITCH_SYSTEM): Define this.
+ 	(C_SWITCH_MACHINE): Instead of this.
+ 
+ 	* ralloc.c (r_alloc_free): Call refill_memory_reserve only if emacs.
+ 
+ 	* s/irix6-0.h: New file.
+ 
+ 	* fileio.c (Fexpand_file_name): Copy default-directory
+ 	before looking for a handler on the directory arg.
+ 
+ 	* cmds.c (Vself_insert_face, Vself_insert_face_command): New variables.
+ 	(syms_of_cmds): Set up Lisp variables.  Doc syntax fix.
+ 	(internal_self_insert): Handle Vself_insert_face.
+ 
+ 	* lisp.h (Qprocessp): Declared.
+ 
+ 	* xdisp.c (redisplay_window): If we update the mode line,
+ 	switch to the buffer for real, and switch back for real.
+ 
+ Sun Feb 12 00:22:18 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* xterm.c (x_connection_signal): New function.
+ 	(x_initialize): Use it as signal handler.
+ 
+ 	* keyboard.c (input_poll_signal): Add ignored argument.
+ 	(interrupt_signal): Likewise.
+ 
+ 	* dispnew.c (window_change_signal): Add ignored argument.
+ 
+ Sat Feb 11 16:56:31 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* fileio.c (Fexpand_file_name): Look for a handler for defalt.
+ 	(syms_of_fileio): Minor rearrangement.
+ 
+ 	* ralloc.c: Include getpagesize.h unconditionally.
+ 	(free_bloc): Don't die if bloc->next or bloc->prev is null.
+ 	[!emacs] (bzero): New macro definition.
+ 
+ 	* xmenu.c (menu_item_equiv_key): If command is an alias,
+ 	check only the underlying command for a keyboard equivalent.
+ 
+ 	* s/netbsd.h (WAIT_USE_INT): Defined.
+ 	* syswait.h: New alternative specified by WAIT_USE_INT.
+ 
+ 	* process.c (Fstart_process): Make process marker point into proc buf.
+ 
+ Fri Feb 10 01:37:34 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* data.c: Rename arg OBJ to OBJECT in all type predicates.
+ 	(Ftype_of): New function.
+ 
+ Thu Feb  9 04:30:09 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* xfaces.c (load_color): Ignore failure from XAllocColor.
+ 	* xfns.c (x_decode_color): Ignore failure from defined_color.
+ 
+ 	* m/intel386.h [SOLARIS2_4, !__GNUC__] (C_SWITCH_SYSTEM): Defined..
+ 	[SOLARIS2_4, !__GNUC__]: Include alloca.h.
+ 
+ Tue Feb  7 18:50:09 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* Makefile.in.in (maintainer-clean): Renamed from realclean.
+ 	Print warning message.
+ 
+ Tue Feb  7 18:18:54 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* keyboard.c (command_loop_1): Put back cancel_echoing call, if
+ 	there's a perdisplay for it to apply to.
+ 	(init_perdisplay): Initialize echo vars.
+ 
+ 	* xdisp.c (message_log_check_duplicate): New function.
+ 	(message_dolog): Delete previous line if the new one is a
+ 	duplicate.  Include a counter if appropriate.
+ 	Don't bother truncating the buffer until after adding newline.
+ 
+ Mon Feb  6 20:00:22 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* lisp.h (struct PERDISPLAY): Add Vlast_event_frame.
+ 	Define internal_last_event_frame only #if MULTI_FRAME.
+ 	Add some placeholders so we don't need to rebuild every time this
+ 	struct changes.
+ 	* keyboard.c (internal_last_event_frame, Vlast_event_frame):
+ 	Deleted; now part of perdisplay.  All uses changed.
+ 	(MOUSE_ACTIVITY_AVAILABLE) Deleted.
+ 	(find_active_event_queue): New arg check_mouse.  All callers changed.
+ 	(Vlast_event_frame): Change from DEFVAR_LISP to DEFVAR_DISPLAY.
+ 	* frame.c (do_switch_frame): internal_last_event_frame is now in
+ 	perdisplay.
+ 
+ Sun Feb  5 01:57:28 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* ralloc.c (r_alloc_size_in_use): New function.
+ 
+ 	* alloc.c (emacs_blocked_malloc): Set __malloc_extra_blocks here.
+ 	(malloc_hysteresis): New variable.
+ 	(init_alloc_once): Initialize malloc_hysteresis.
+ 	(buffer_memory_full): New function.
+ 	* emacs.c (main): Undo previous change.
+ 	* buffer.c (Fget_buffer_create): Call buffer_memory_full.
+ 
+ 	* alloc.c (refill_memory_reserve): New function.
+ 	* ralloc.c (r_alloc_free): Call refill_memory_reserve.
+ 
+ Sat Feb  4 00:24:07 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* alloc.c (SPARE_MEMORY): New macro.
+ 	(emacs_blocked_free): If no spare_memory now, and enough free
+ 	space is available, get a new spare.
+ 	(__malloc_size_t, _bytes_used): Declared.
+ 	(bytes_used_when_full): New variable.
+ 
+ 	* frame.h (struct frame): New field window_sizes_changed.
+ 	(FRAME_WINDOW_SIZES_CHANGED): New macro (two definitions).
+ 	* window.c (Fdelete_window, set_window_height, set_window_width)
+ 	(Fsplit_window, Fset_window_configuration): Set
+ 	FRAME_WINDOW_SIZES_CHANGED to 1 in the frame being changed.
+ 	* xdisp.c (Vwindow_size_change_functions): New variable.
+ 	(prepare_menu_bars): Call those functions.  Add gcproing.
+ 	(syms_of_xdisp): Set up Lisp variable.
+ 
+ 	* alloc.c (syms_of_alloc): Improve memory exhausted error message.
+ 	(init_alloc_once): Allocate spare_memory.
+ 	(memory_full): Free spare_memory.
+ 
+ Fri Feb  3 22:15:54 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* xselect.c (x_get_foreign_selection, x_reply_selection_request):
+ 	Use an unwind-protect to call x_stop_queuing_selection_requests.
+ 	(some_frame_on_display): New function.
+ 	(queue_selection_requests_unwind): New function.
+ 
+ Fri Feb  3 16:00:41 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* callint.c (syms_of_callint): Move DEFVAR_DISPLAY's ...
+ 	* keyboard.c (syms_of_keyboard): ... to here.
+ 	[MULTI_PERDISPLAY] (current_perdisplay, all_perdisplays): New vars.
+ 	(find_active_event_queue): Search all perdisplays.
+ 	(init_perdisplay, wipe_perdisplay): New functions.
+ 	(init_keyboard): Move perdisplay initialization to init_perdisplay.
+ 	(syms_of_keyboard): Likewise.
+ 	(cmd_error): Cancel echoing here.
+ 	(command_loop_1): Not here.
+ 
+ 	* lisp.h (all_perdisplays): New var.
+ 	(struct PERDISPLAY): New member next_perdisplay.
+ 	* alloc.c (mark_perdisplays): New function.
+ 	(Fgarbage_collect): Call it.
+ 	* lread.c (defvar_display): Don't staticpro; these objects are now
+ 	protected through mark_perdisplays.
+ 	* xterm.c [MULTI_PERDISPLAY] (x_term_init): Initialize perdisplay.
+ 	[MULTI_PERDISPLAY] (x_delete_display): Destroy perdisplay.
+ 	(x_delete_display): Use xfree, not free.
+ 
+ 	* lisp.h (defvar_display): Declare this function.
+ 	(DEFVAR_DISPLAY): Use current_perdisplay, not get_perdisplay.
+ 	* data.c (do_symval_forwarding): Likewise.
+ 	(store_symval_forwarding, find_symbol_value): Likewise.
+ 	* print.c (print): Likewise.
+ 	* keyboard.c (echo_prompt, echo_char, echo_dash, echo): Likewise.
+ 	(cancel_echoing, echo_length, read_char, Fdiscard_input): Likewise.
+ 	(stuff_buffered_input): Likewise.
+ 
+ Fri Feb  3 04:27:31 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* xdisp.c (display_text_line): Deduct minibuf prompt from taboffset.
+ 	(try_window): Deduct minibuf prompt from tab_offset, after 1st line.
+ 
+ Thu Feb  2 05:45:20 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* xselect.c (wait_for_property_change): Avoid unlikely timing error.
+ 
+ 	* keyboard.c (kbd_buffer_get_event, swallow_events):
+ 	Remove selection_request event from input queue before processing it.
+ 
+ Wed Feb  1 16:37:16 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* macros.c (Fexecute_kbd_macro): Clear prefix arg here.
+ 	* keyboard.c (cmd_error): And here.
+ 	(command_loop_1): Not here.
+ 	(command_loop_1): Save original perdisplay in case we're already
+ 	locked to a particular display.
+ 	Move display-specific cleanup to end of main loop.
+ 	Use perdisplay to access prefix arg.
+ 	(Fcommand_execute, Fexecute_extended_command): Use perdisplay.
+ 
+ Wed Feb  1 14:35:15 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* xterm.c (x_unqueue_events): Arg is now a Display *.
+ 	(x_start_queuing_selection_requests): Likewise.
+ 	(x_stop_queuing_selection_requests): Likewise.
+ 	* xselect.c (x_get_foreign_selection): Pass display to
+ 	x_start_queueing_selection_events and x_stop_queueing_selection_events.
+ 
+ 	* xselect.c (x_reply_selection_request): Call
+ 	x_start_queueing_selection_events and x_stop_queueing_selection_events.
+ 	Handle X protocol errors.
+ 
+ Tue Jan 31 17:30:45 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* callint.c (Fcall_interactively): Use perdisplay.
+ 	(Vprefix_arg, Vcurrent_prefix_arg): Delete vars; now in perdisplay.
+ 	(syms_of_callint): Use DEFVAR_DISPLAY for prefix-arg and
+ 	current-prefix-arg.
+ 	* minibuf.c (read_minibuf, read_minibuf_unwind): Use perdisplay.
+ 	* mocklisp.c (Fml_provide_prefix_argument): Use perdisplay.
+ 	(Fml_prefix_argument_loop): Likewise.
+ 	* lisp.h (current_perdisplay): New var.
+ 	(DEFVAR_DISPLAY): Add missing ampersand.
+ 	(Vprefix_arg, Vcurrent_prefix_arg): Delete; now in perdisplay.
+ 
+ 	* lread.c [!MULTI_PERDISPLAY] (defvar_display): Use staticpro.
+ 
+ Tue Jan 31 15:09:36 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* emacs.c (main) [REL_ALLOC]: Set __malloc_extra_blocks.
+ 
+ Mon Jan 30 23:54:38 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* buffer.c (syms_of_buffer): overwrite-mode doc fix.
+ 
+ Mon Jan 30 19:01:56 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* lisp.h [MULTI_PERDISPLAY]: Declare get_perdisplay as a function.
+ 	* xterm.c [MULTI_PERDISPLAY] (get_perdisplay): Define this as an
+ 	exported function.
+ 	* xterm.h [MULTI_PERDISPLAY] (get_perdisplay): Define this as a
+ 	macro, for sources that include this header.
+ 	[MULTI_PERDISPLAY] (get_perdisplay_macro): Internal macro version.
+ 
+ 	* lisp.h (DEFVAR_DISPLAY): New macro.
+ 	* lread.c (defvar_display): New function.
+ 
+ 	* lisp.h: Declare store_symval_forwarding here.
+ 	* eval.c (specbind): Not here.
+ 	(specbind): Handle display-local vars.
+ 	* data.c (do_symval_forwarding): Handle display-local vars.
+ 	(store_symval_forwarding, find_symbol_value): Likewise.
+ 	(Fmake_variable_buffer_local): Disallow display-local vars here.
+ 	(Fmake_local_variable): Likewise.
+ 
+ 	* keyboard.c (syms_of_keyboard): Fix missing backslashes.
+ 
+ Sun Jan 29 17:01:33 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* fns.c (Frassoc): New function.
+ 	(syms_of_fns): defsubr it.
+ 
+ Sat Jan 28 03:36:05 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* ecrt0.c: Renamed from crt0.c.
+ 	* Makefile.in.in (ecrt0.o): Target renamed from crt0.o.
+ 	(START_FILES): Use ecrt0.o.
+ 
+ Fri Jan 27 13:48:20 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* lisp.h (PERDISPLAY, the_only_perdisplay, get_perdisplay):
+ 	Renamed from PERD, etc.  All uses changed.
+ 	(ECHOBUFSIZE): New constant, replaces sizeof (echobuf).
+ 	(enum Lisp_Misc_Type): New enumeration Lisp_Misc_Display_Local.
+ 	(struct Lisp_Display_Objfwd): New structure.
+ 	(XDISPLAY_OBJFWD, DISPLAY_OBJFWDP): Access the new structure.
+ 	(union Lisp_Misc): Add new member.
+ 	* keyboard.c (kbd_buffer_frame_or_window): Delete; now in perdisplay.
+ 	(immediate_echo, echobuf, echoptr, echo_after_prompt): Likewise.
+ 	(echo_prompt, echo_char, echo_dash): use perdisplay and ECHOBUFSIZE.
+ 	(echo, cancel_echoing, echo_length, echo_truncate): Likewise.
+ 	(read_char, kbd_buffer_store_event, kbd_buffer_get_event): Likewise.
+ 	(Fdiscard_input, stuff_buffered_input): Likewise.
+ 	(init_keyboard, syms_of_keyboard): Likewise.
+ 	* alloc.c (mark_object): Ignore Lisp_Misc_Display_Objfwd objects.
+ 	* print.c (print): Handle internal display-local object.
+ 	* .gdbinit (xdispobjfwd): New macro.
+ 
+ 	* xdisp.c (message_log_need_newline): This var is now static.
+ 	(message_dolog): Set message_log_need_newline appropriately.
+ 	Don't change it at all if message logging is currently disabled.
+ 	(message_log_maybe_newline): New function.
+ 	(message2): Use message_log_maybe_newline.
+ 	* print.c (printchar, strout): Use message_log_maybe_newline.
+ 	Leave all of the newline bookkeeping to message_dolog.
+ 	* lisp.h (message_log_maybe_newline): Function declared.
+ 
+ 	* xdisp.c (message_dolog): Rename " *Messages*" buffer to "*Messages*"
+ 
+ Fri Jan 27 04:44:35 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* minibuf.c (Fread_string): Add third arg HISTORY.
+ 	* callint.c (Fcall_interactively): Pass new arg to Fread_string.
+ 
+ Fri Jan 27 02:20:24 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* insdel.c (modify_region): Clear point_before_scroll field.
+ 
+ Wed Jan 25 23:46:56 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* buffer.h (struct buffer): New field point_before_scroll.
+ 	* buffer.c (init_buffer_once, syms_of_buffer):
+ 	Set up buffer-local var point_before_scroll.
+ 	(reset_buffer): Init point_before_scroll.
+ 	* intervals.c (set_point): Set point_before_scroll to nil.
+ 
+ Tue Jan 24 21:01:58 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* lisp.h (PERD): New struct containing per-display data.
+ 	(the_only_perd): Declare an instance of it.
+ 	(get_perd): Macro to retrieve it.
+ 	* keyboard.c (the_only_perd): Define this var here.
+ 	(kbd_buffer, kbd_fetch_ptr, kbd_store_ptr): Delete; now part of perd.
+ 	(find_active_event_queue): New function.
+ 	(readable_events, kbd_buffer_get_event, swallow_events): Use it.
+ 	(kbd_buffer_store_event): Store in EVENT's frame's queue.
+ 	(Fdiscard_input, stuff_buffered_input): Use perd.
+ 	(init_keyboard): Initialize the new vars.
+ 	kbd_buffer is now a pointer, not an array.
+ 	* xterm.h (struct x_display_info): New member display_perd.
+ 
+ 	* process.c (process_tick, update_tick): Make non-static.
+ 
+ Tue Jan 24 02:55:05 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* keyboard.c (read_key_sequence): New arg dont_downcase_last
+ 	inhibits downcasing the last event, when it's uppercase and undefined.
+ 	(Fread_key_sequence): Likewise new arg.
+ 	* callint.c (Fcall_interactively): Define K mostly like k.
+ 	Pass new arg to Fread_key_sequence.
+ 	* keymap.c (Flocal_set_key, Fglobal_set_key): Use K, not k, to read key seq arg.
+ 
+ Mon Jan 23 17:16:38 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* indent.c (compute_motion): Don't get hung in selective-display loop.
+ 
+ 	* syssignal.h: Don't use function prototypes.
+ 
+ 	* keyboard.c (read_key_sequence): Don't wait for a possible key
+ 	translation sequence if we already have a binding.
+ 	Add missing break statement.
+ 
+ 	* sysselect.h: New file, mostly extracted from process.c and xterm.c.
+ 	* process.c: #include sysselect.h instead of defining things by hand.
+ 	* sysdep.c (sys_select): Renamed from select.  Use SELECT_TYPE
+ 	instead of int.  Defer to native select if that function is usable.
+ 	* config.h (HAVE_SYS_SELECT_H): Add #undef for configure.
+ 	* s/isc3-0.h (BROKEN_SELECT_NON_X): #define this.
+ 
+ 	* s/isc3-0.h [__GNUC__] (POSIX_SIGNALS): #define this.
+ 	[__GNUC__] (sigsetmask, HAVE_SYSV_SIGPAUSE): #undef these.
+ 	(LIBX11_SYSTEM): Don't use -lc; loading this before -lcposix gives
+ 	us the wrong signal functions.
+ 	(C_SWITCH_SYSTEM): Add _XOPEN_SOURCE.
+ 	(EXTRA_INITIALIZE): Make conditional on __GNUC__.
+ 
+ Sun Jan 22 02:14:04 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* minibuf.c (read_minibuf): Don't print the prompt in batch mode.
+ 
+ 	* emacs.c (sort_args): Ordinary args get priority 0.
+ 	So do -f, -l, -insert, etc.  --kill gets negative priority.
+ 	Everything else gets positive priority.
+ 
+ Sat Jan 21 20:44:42 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xterm.c (x_destroy_window): Don't let frame being destroyed
+ 	remain in x_focus_event_frame.
+ 
+ Sat Jan 21 17:23:02 1995  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* config.h.in [NO_REMAP]: #undef static.
+ 
+ Fri Jan 20 15:10:06 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* lisp.h (union Lisp_Misc): Make the `type' field just 16 bits,
+ 	to match the substructures.
+ 
+ Fri Jan 20 00:04:44 1995  Morten Welinder  <terra@diku.dk>
+ 
+ 	* fileio.c (file_name_as_directory, Ffile_name_directory)
+ 	(Ffile_name_nondirectory): Delete special MSDOG code now covered by macros.
+ 
+ 	* s/msdos.h (DEVICE_SEP, IS_DIRECTORY_SEP, IS_ANY_SEP): Defined.
+ 
+ 	* msdos.c (XMenuCreate, XMenuAddPane, XMenuAddSelection, XMenuLocate)
+ 	(XMenuActivate, XMenuDestroy): Add dummy `display *' argument.
+ 
+ 	* xmenu.c [MSDOS]: #include msdos.h.
+ 	* msdos.h (x_mouse_leave): Add neutralizing define.
+ 	(XMenuCreate, XMenuAddPane, XMenuAddSelection, XMenuLocate)
+ 	(XMenuActivate, XMenuDestroy): Add prototype.
+ 	* Makefile.in.in (xmenu.o): Add msdos.h as dependency.
+ 
+ 	* buffer.c (syms_of_buffer) [DOS_NT]: Add missing ';'.
+ 
+ Thu Jan 19 16:02:32 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* textprop.c (Ftext_property_any): Handle the trivial case specially.
+ 
+ 	* sysdep.c (seed_random): Renamed from srandom.
+ 	(get_random): Renamed from random.  Return VALBITS random bits.
+ 	* fns.c (Frandom): Call seed_random and get_random.
+ 
+ 	* print.c (print): Print internal types too, for debugging.
+ 	Print appropriate message for invalid pseudovector or misc type.
+ 
+ 	* .gdbinit (xboolfwd, xbuflocal, xbufobjfwd, xcompiled): New macros.
+ 	(xintfwd, xmiscfree, xobjfwd, xoverlay, xwinconfig): New macros.
+ 
+ Thu Jan 19 15:01:19 1995  Abramo Bagnara  <abramo@sssup2.sssup.it>
+ 
+ 	* term.c (term_get_fkeys_1): Bug fix for function key above f19.
+ 
+ Wed Jan 18 18:23:12 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* editfns.c (subst_char_in_region_unwind): New function.
+ 	(Fsubst_char_in_region): Use it to make undo_list t temporarily.
+ 
+ 	* buffer.c (Fbuffer_local_variables): Unconditionally call
+ 	find_symbol_value, but conditionally use its value.
+ 
+ 	* xrdb.c: Don't include sys/param.h.
+ 	(MAXPATHLEN): Definition deleted.
+ 
+ Wed Jan 18 15:56:39 1995  Boris Goldowsky  <boris@cs.rochester.edu>
+ 
+ 	* cmds.c (internal_self_insert): Don't test current_column
+ 	when deciding to call auto_fill_function.
+ 
+ Wed Jan 18 15:12:38 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* lisp.h (SWITCH_ENUM_CAST): New macro.
+ 	* alloc.c, data.c, keyboard.c, syntax.c, xdisp.c: Change all
+ 	occurences of SWITCH_ENUM_BUG to use SWITCH_ENUM_CAST instead.
+ 
+ Wed Jan 18 03:58:07 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* window.c (Qtemp_buffer_show_hook): New hook.
+ 	(syms_of_window): Init and staticpro it.
+ 	(temp_output_buffer_show): Run the hook.
+ 
+ Mon Jan 16 19:08:16 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* xdisp.c (message_dolog): Ignore narrowing.
+ 	Use low-level functions, to bypass modification and motion hooks.
+ 
+ 	* window.h (struct window): New member column_number_displayed.
+ 	* xdisp.c (redisplay): Use that field instead of a global flag.
+ 	(redisplay_window, display_mode_line, decode_mode_spec): Likewise.
+ 
+ 	* cm.c (cmcheckmagic): New function.
+ 	* cm.h: Declare it.
+ 	* term.c (write_glyphs, insert_glyphs): Call it.
+ 
+ Mon Jan 16 01:38:08 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* keyboard.c (kbd_buffer_store_event): Cast arg of bcopy.
+ 
+ Sun Jan 15 08:05:06 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* ralloc.c (r_alloc_init): Remove unused variable END.
+ 
+ Fri Jan 13 21:17:20 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* alloc.c (Fpurecopy): Mask size field when copying pseudovector.
+ 
+ Thu Jan 12 15:27:50 1994  Boris Goldowsky  <boris@cs.rochester.edu>
+ 
+ 	* lisp.h: Declare Qrear_nonsticky.
+ 
+ 	* cmds.c (Vuse_hard_newlines): New variable.
+ 	(Fnewline): If use_hard_newlines is on, mark inserted
+ 	newline(s) with `hard' property, marked rear-nonsticky.
+ 
+ Thu Jan 12 10:35:51 1994  Tom Tromey  <tromey@drip.colorado.edu>
+ 
+ 	* buffer.c (list_buffers_1, Flist_buffers): Functions deleted.
+ 
+ Thu Jan 12 18:12:22 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* xdisp.c (message_log_need_newline): New var.
+ 	(message_dolog): New function, extracted from message2.
+ 	* print.c (printchar, strout): Call message_dolog.
+ 	* lisp.h: Declare message_dolog.
+ 
+ 	* alloc.c (DONT_COPY_FLAG): Default this to 1.
+ 	Check to make sure it's not the same as MARKBIT.
+ 	(mark_object): Use the same XOR expression as elsewhere.
+ 	(gc_sweep): Don't touch DONT_COPY_FLAG here; this one is a real
+ 	size field, not a mangled pointer.
+ 
+ 	* fns.c (internal_equal): Delete redundant tests.
+ 	Mask size field when comparing pseudovectors.
+ 
+ 	* fns.c (Frandom): Use VALBITS instead of hardcoded constants.
+ 
+ Tue Jan 10 20:38:37 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* alloc.c (DONT_COPY_FLAG): Fix typo.
+ 
+ 	* lisp.h: Use large constants for Lisp_Misc_Type.
+ 
+ 	* lisp.h: Add some function declarations.
+ 	* insdel.c: Declare all non-returning functions `void'.
+ 	(insert_1): Make non-static.  New arg PREPARE.  All callers changed.
+ 	* xdisp.c (Vmessage_log_max): New var.
+ 	(syms_of_xdisp): defvar and initialize it.
+ 	(message2_nolog): Renamed from message2.
+ 	(message2): Log messages, then call message2_nolog.
+ 	(message1_nolog): New function.
+ 	* keyboard.c (echo): Don't log the key echoes.
+ 	* alloc.c (Fgarbage_collect): Don't log the GC message.
+ 
+ Tue Jan 10 18:20:12 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* emacs.c (main): Handle SIGABRT, SIGHWE, SIGPRE, SIGORE, SIGDLK,
+         SIGCPULIM, if they are defined.
+ 
+ 	* alloc.c (DONT_COPY_FLAG): New bit flag.
+ 	(mark_object, gc_sweep, compact_strings): Use it.
+ 
+ Tue Jan 10 15:36:34 1995  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* editfns.c (Finsert_char): Check inherit flag for long strings too.
+ 
+ 	* editfns.c (Fnarrow_to_region): Swap using temp Lisp_Object, not int.
+ 
+ Tue Jan 10 01:45:56 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* keyboard.c (syms_of_keyboard): Doc fix.
+ 
+ 	* unexsunos4.c (unexec): Cast value of sbrk.
+ 	(run_time_remap): Cast arg to brk.
+ 	(brk_value): Renamed from Brk.
+ 	(is_it): Cast 1st arg of mmap.
+ 
+ Mon Jan  9 20:33:14 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* keyboard.c (read_key_sequence): If first event is mouse click,
+ 	use the text property keymap from where the click was.
+ 	New local var orig_local_map.
+ 
+ Mon Jan  9 19:05:02 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* window.c (Fscroll_other_window): On small windows, scroll by 1 line.
+ 
+ Mon Jan  9 04:59:26 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* fns.c (internal_equal): Once again use a switch.
+ 
+ 	* lisp.h (struct Lisp_Free, struct Lisp_Marker, etc.):
+ 	Make the `type' field just 16 bits, and declare as int.
+ 	Add explicit spacer field after it.
+ 	(struct Lisp_Marker): New field insertion_type.
+ 
+ Sun Jan  8 14:21:13 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* keymap.c (store_in_keymap): Copy a cons only if car is a string.
+ 
+ 	* xterm.c: Don't include param.h.
+ 
+ 	* buffer.c (syms_of_buffer): Doc fix.
+ 
+ Fri Jan  6 18:52:20 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* m/alliant-2800.h (VALBITS, GCTYPEBITS): Deleted; default is better.
+ 	* m/apollo.h, m/aviion.h, m/delta.h, m/hp800.h, m/ibmrt.h: Likewise.
+ 	* m/intel386.h, m/nh4000.h, m/tower32v3.h: Likewise.
+ 	* m/att3b.h (VALBITS, XTYPE): Adjust for new bit layout.
+ 	* m/alpha.h, m/gec63.h, m/pfa50.h: Likewise.
+ 
+ Thu Jan  5 17:18:26 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* frame.c [!MULTI_FRAME] (window_frame): New function.
+ 	[!MULTI_FRAME] (syms_of_frame): defsubr it.
+ 
+ Thu Jan  5 02:05:24 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* doc.c (store_function_docstring, Fdocumentation): Use &
+ 	PSEUDOVECTOR_SIZE_MASK on `size' field of compiled byte-code object.
+ 	* callint.c (Fcall_interactively): Likewise.
+ 	* eval.c (Fcommandp): Likewise.
+ 
+ Wed Jan  4 13:10:21 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* alloc.c (mark_object, mark_buffer): Don't mark buffer twice.
+ 
+ 	* .gdbinit (xint, xcar, xcdr): Use correct shift and mask values.
+ 
+ 	* lisp.h [EXPLICIT_SIGN_EXTEND] (XINT): Use symbolic constants.
+ 
+ Wed Jan  4 02:19:35 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* doc.c (store_function_docstring): Arg is now EMACS_INT.
+ 
+ Mon Jan  2 20:19:13 1995  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* lisp.h (enum Lisp_Type): Don't use trailing comma.
+ 	(VALBITS, GCTYPEBITS): Define these regardless of NO_UNION_TYPE.
+ 	[!NO_UNION_TYPE] (union Lisp_Object): Use symbolic constants.
+ 
+ 	* alloc.c (mark_object): Make `else' visible outside MULTI_FRAME.
+ 
+ Mon Jan  2 00:07:44 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* keymap.c (store_in_keymap): While dumping, copy DEF if it's a cons.
+ 
+ 	* buffer.c (reset_buffer): Don't alter intervals here.
+ 	(Fget_buffer_create): Use BUF_MARKERS.  Init BUF_INTERVALS here.
+ 	(Fkill_buffer): Use BUF_MARKERS; but don't touch it in indir buf.
+ 	Likewise BUF_INTERVALS.  Don't free the text in indirect buffer.
+ 	When killing a base buffer, kill its indirect buffers first.
+ 	(init_buffer_once): Set up .text and BUF_INTERVALS
+ 	in buffer_local_symbols and buffer_defaults.
+ 
+ 	* alloc.c (mark_buffer, gc_sweep): Use BUF_INTERVALS.
+ 	* editfns.c (Ftranspose_regions): Use BUF_INTERVALS.
+ 	(transpose_markers): Use BUF_MARKERS.
+ 
+ 	* insdel.c (insert_1, prepare_to_modify_buffer, insert_from_buffer_1):
+ 	Use BUF_INTERVALS.
+ 	(adjust_markers): Use BUF_MARKERS.
+ 
+ 	* buffer.h (struct buffer): Fields markers and intervals moved out.
+ 	(struct buffer_text): Fields markers and intervals moved here.
+ 	(BUF_MARKERS, BUF_INTERVALS): New macros.
+ 	* textprop.c (validate_interval_range): Use BUF_INTERVALS.
+ 	* intervals.c: Use BUF_INTERVALS throughout.
+ 	* marker.c: Use BUF_MARKERS throughout.
+ 
+ 	* undo.c (Fprimitive_undo): Use base buffer's modtime field.
+ 
+ Sun Jan  1 17:04:27 1995  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* .gdbinit: Adapt to new Lisp_Object format.
+ 	(xvectype, xmisctype): New commands.
+ 	(xtype): Print the misc or vectorlike subtype too.
+ 
+ 	* xdisp.c (redisplay_window): Call set_buffer_temp.
+ 
+ 	* buffer.c (set_buffer_temp): New function.
+ 
+ 	* buffer.h (struct buffer): Make buffer_file_type field unconditional.
+ 	* buffer.c (reset_buffer_local_variables): Initialize
+ 	buffer_file_type field.
+ 
+ 	* lisp.h (PVEC_BUFFER, PVEC_PROCESS, PVEC_FRAME, PVEC_COMPILED)
+ 	(PVEC_WINDOW, PVEC_WINDOW_CONFIGURATION, PVEC_SUBR):
+ 	Now enumeration constants, not macros.
+ 	(PVEC_FLAG): Enumeration alias for PSEUDOVECTOR_FLAG.
+ 
+ 	* buffer.h (struct buffer): save_modiff field deleted.
+ 	(struct buffer_text): save_modiff field moved here.
+ 	(SAVE_MODIFF, BUF_SAVE_MODIFF): New macros.
+ 	Use them instead of direct access to save_modiff field.
+ 	* buffer.c, editfns.c, fileio.c, filelock.c, insdel.c, keyboard.c:
+ 	* undo.c, xdisp.c: Use SAVE_MODIFF and BUF_SAVE_MODIFF
+ 	instead of direct access to the save_modiff field.
+ 	* window.c (temp_output_buffer_show): Use BUF_SAVE_MODIFF.
+ 
+ 	* buffer.h (struct buffer): New field pt_marker.
+ 	New fields begv_marker, zv_marker.
+ 	* buffer.c (Fget_buffer_create): Initialize pt_marker, begv/zv_marker.
+ 	(set_buffer_internal): Use and update this markers.
+ 	Copy undo_list in and out of the base buffer.
+ 	(Fget_buffer_create): Init save_modiff field here.
+ 	(reset_buffer): Not here.
+ 	(Fbuffer_modified_p): Use BUF_SAVE_MODIFF.
+ 	(Fset_buffer_modified_p): Use SAVE_MODIFF.
+ 	(Fkill_buffer, list_buffers_1): Use BUF_SAVE_MODIFF.
+ 
+ 	* term.c (term_init): Fatal error if screen is too small.
+ 
+ Sat Dec 31 00:58:51 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xdisp.c (redisplay_window): For buffer_shared count,
+ 	treat an indirect buffer as equivalent to its base.
+ 
+ 	* print.c (print): Don't drop thru to error for markers and overlays.
+ 
+ Fri Dec 30 21:03:19 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* insdel.c (adjust_point): Use BUF_PT.
+ 
+ 	* intervals.c (temp_set_point, set_point): Use BUF_PT.
+ 	(get_local_map): Get keymap from specified buffer, not current one.
+ 
+ 	* fileio.c (Finsert_file_contents, Fwrite_region):
+ 	Error if buffer is indirect.
+ 	(Fdo_auto_save): Do nothing for an indirect buffer.
+ 
+ 	* alloc.c (mark_buffer): In indirect buffer, mark the base buffer.
+ 
+ 	* buffer.c (Fmake_indirect_buffer): New function.
+ 	(Fbuffer_base_buffer): New function.
+ 	(syms_of_buffer): defsubr them.
+ 	(Fget_buffer_create): Initialize the size field.
+ 
+ 	* print.c (print): Make buffer case a branch of
+ 	the Lisp_Vectorlike case.
+ 
+ 	* alloc.c (mark_object): Make buffer case a branch of
+ 	the Lisp_Vectorlike case.
+ 
+ 	* buffer.h (struct buffer): Make text field be a pointer.
+ 	The struct buffer_text field renamed to own_text.
+ 	Add fields indirect_to_buffer and size.
+ 	Move pt, begv and zv fields here.
+ 	(struct buffer_text): Moved from here.
+ 	(BEGV, PT, ZV, BEGV_ADDR, PT_ADDR, ZV_ADDR): Corresponding changes.
+ 	(BUF_BEGV, BUF_PT, BUF_ZV): Corresponding changes.
+ 	(SET_BUF_ZV, SET_BUF_PT, point):
+ 
+ 	* lisp.h (XSETBUFFER, BUFFERP, GC_BUFFERP): Rewrite: use pseudovectors.
+ 	(enum Lisp_Type): Delete Lisp_Buffer.
+ 	(enum Lisp_Misc_Type): Add Lisp_Misc_Float (not yet used).
+ 
+ Thu Dec 29 14:55:56 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* lisp.h (VALBITS): Default now 28.
+ 	(GCTYPEBITS): Default now 3.
+ 
+ 	* lisp.h (enum Lisp_Type): Lisp_Process, Lisp_Window, Lisp_Frame,
+ 	Lisp_Subr deleted.
+ 	(PSEUDOVECTORP, GC_PSEUDOVECTORP):  Add paren for proper nesting.
+ 	(PROCESSP, GC_PROCESSP, XSETPROCESS): Rewrite to use pseudovectors.
+ 	(WINDOWP, GC_WINDOWP, XSETWINDOW): Likewise.
+ 	(FRAMEP, GC_FRAMEP): Likewise.
+ 	(SUBRP, GC_SUBRP, XSETSUBR): Likewise.
+ 	(PVEC_SUBR): New macro.
+ 	(struct Lisp_Subr): Add a size field.
+ 	(DEFUN (both definitions)): Store that size field.
+ 
+ 	* frame.h (XSETFRAME): Use pseudovector.
+ 
+ 	* alloc.c (mark_object): Don't use Lisp_Process, Lisp_Window.
+ 	Handle frames, compileds and subrs as branch of Lisp_Vectorlike case.
+ 	(Fmake_byte_code): Use XSETCOMPILED.
+ 
+ 	* data.c (Faref): Handle compiled function as pseudovector.
+ 
+ 	* fns.c (Flength): Handle compiled function as pseudovector.
+ 
+ 	* xterm.c (x_scroll_bar_handle_click): Use GC_WINDOWP.
+ 	(XTframe_rehighlight, x_window_to_scroll_bar): Use GC_FRAMEP.
+ 
+ 	* print.c (print): Get size of compiled function as pseudovector.
+ 	Use a switch statement again.
+ 
+ 	* process.h: Make size field an EMACS_INT.
+ 
+ Wed Dec 28 13:00:24 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* unexsunos4.c [! sparc] (REL_INFO_TYPE): Use `struct relocation_info'.
+ 
+ Tue Dec 27 12:54:19 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* keyboard.c (make_lispy_event) [USE_X_TOOLKIT]: Turn off
+ 	special handling of menu bar mouse events.
+ 	(make_lispy_event): Tell pixel_to_glyph_coords not to clip.
+ 
+ 	* xterm.c (XTupdate_begin): Fix backward test in previous change.
+ 	(x_display_box_cursor): Don't redraw old cursor spot in mouse face
+ 	if cursor was on a newline.
+ 
+ 	* s/isc4-1.h: New file.
+ 
+ Mon Dec 26 10:57:15 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xterm.c (XTread_socket): Handle button events from outside
+ 	the frame, received due to grabbing the mouse with a button.
+ 
+ Sun Dec 25 12:28:28 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* callint.c (Vmouse_leave_buffer_hook, Qmouse_leave_buffer_hook):
+ 	New variables.
+ 	(syms_of_callint): Set them up.
+ 	(Fcall_interactively): Run the hook, for `@'.
+ 
+ 	* buffer.c (syms_of_buffer): Doc fix for buffer-file-type.
+ 
+ 	* search.c (set_search_regs): Really set search_regs.start and .end.
+ 	(save_search_regs): Set them to 0 here.
+ 
+ 	* minibuf.c (read_minibuf): GCPRO things.
+ 
+ 	* lisp.h (enum Lisp_Type): Add Lisp_Type_Limit.
+ 	* data.c (wrong_type_argument): Abort if VALUE is invalid Lisp object.
+ 	Use Lisp_Type_Limit.
+ 
+ Sat Dec 24 11:42:13 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* puresize.h (BASE_PURESIZE): Incremented by 20k.
+ 
+ Fri Dec 23 23:48:53 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xfns.c (x_figure_window_size): Treat missing user-position parm
+ 	as nil.
+ 
+ Fri Dec 23 12:13:57 1994  Steven Suhr  <ssuhr@riacs.edu>
+ 
+ 	* scroll.c (scrolling_1): When scroll_region_ok is set, use a
+ 	new scrolling method which scrolls groups of lines directly
+ 	to their final vertical positions.
+ 	(struct matrix_elt): New field writecount.
+ 	(calculate_direct_scrolling): New function.
+ 	(do_direct_scrolling): New function.
+ 
+ 	* term.c (scroll_region_cost): New variable.
+ 	(calculate_costs): Put scroll region overhead in scroll_region_cost.
+ 
+ 	* termchar.h (scroll_region_cost): Declared.
+ 
+ 	* dispnew.c (scrolling): Fewer restrictions if scroll_region_ok is
+ 	set.  New vector old_draw_cost for direct scrolling method.
+ 
+ Fri Dec 23 22:00:00 1994 Michal Jankowski (Michal.Jankowski@fuw.edu.pl)
+ 
+ 	* keyboard.c (read_char): Don't echo keys when echo_keystrokes is 0.
+ 
+ Thu Dec 22 18:07:34 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xfns.c (x_set_frame_parameters): Handle icon-left, icon-top parms.
+ 
+ Wed Dec 21 00:10:24 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* buffer.c (Fget_buffer_create): Copy the name, and clear text props.
+ 
+ Tue Dec 20 18:14:44 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* eval.c (Fdefvar): Fix minor error in previous change.
+ 	(funcall_lambda): Fetch bytecode and constants vector from file if nec.
+ 
+ 	* lread.c (Qload_file_name, Vload_file_name): New variables.
+ 	(syms_of_lread): Initialize and staticpro it.
+ 	(Fload): Bind it.
+ 	(read_list): Before dumping, ignore (#$ . WHATEVER)--return 0.
+ 
+ 	* lread.c (read1): Implement #@ and #$ constructs.
+ 
+ 	* frame.c (make_frame): Init buffer_predicate field.
+ 
+ 	* doc.c (get_doc_string): Now static.  Arg now Lisp_Object.
+ 	Allow (FILE . POS) as position argument.
+ 	(Fdocumentation, Fdocumentation_property): Fix calls to get_doc_string.
+ 	(Fdocumentation_property): Handle cons as value via get_doc_string.
+ 	(read_doc_string): New function.
+ 
+ 	* buffer.c (assoc_ignore_text_properties): New function.
+ 	(Fget_buffer): Use assoc_ignore_text_properties.
+ 
+ Mon Dec 19 18:22:24 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* s/dgux.h (C_DEBUG_SWITCH): Define this only if __GNUC__.
+ 
+ Sun Dec 18 14:38:25 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* buffer.c (Fother_buffer): Take account of frame's buffer predicate.
+ 
+ 	* frame.h (struct frame): New field buffer_predicate.
+ 	Move all the Lisp_Object fields to the top.
+ 
+ 	* frame.c (Fmodify_frame_parameters): For non-X frames,
+ 	call store_frame_param for each parameter set.
+ 	(store_frame_param): Handle buffer_predicate field.
+ 	(frame_buffer_predicate): New function.
+ 	(Qbuffer_predicate): New variable.
+ 	(syms_of_frame): Set it up.
+ 
+ 	* alloc.c (mark_object): In a frame, mark the buffer_predicate.
+ 	Don't mark the height and width fields.
+ 
+ Thu Dec 15 08:12:37 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* minibuf.c (Fall_completions): New arg hide_spaces.
+ 	(Fminibuffer_completion_help): Pass new arg.
+ 
+ Wed Dec 14 08:59:56 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* emacs.c (main): Fix conversion of --display to -d.
+ 
+ 	* xmenu.c (push_menu_item): New arg DEF.
+ 	(single_keymap_panes, list_of_items): Pass new arg.
+ 	(MENU_ITEMS_ITEM_DEFINITION): New macro.
+ 	(MENU_ITEMS_ITEM_LENGTH): Now 5.
+ 	[USE_X_TOOLKIT] (xmenu_show): Store 0 in call_data if item def is 0.
+ 	(single_submenu): Likewise.
+ 
+ 	* emacs.c (main): Implement --version.
+ 
+ 	* xterm.c (XTupdate_begin): Discard records of prior mouse highlight
+ 	when frame must be redrawn.
+ 
+ 	* textprop.c (add_properties): Add gcpro's.
+ 	(Fadd_text_properties, copy_text_properties): Likewise.
+ 
+ Tue Dec 13 16:23:55 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* s/sunos4-1-3.h: Just include sunos4shr--do nothing else.
+ 
+ 	* eval.c (Fdefconst, Fdefvar): Error if too many arguments.
+ 
+ Tue Dec 13 09:30:54 1994  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* emacs.c (sort_args): Make `options' a vector of ints.
+ 
+ Sun Dec 11 17:13:22 1994  Richard Stallman  <rms@kepa>
+ 
+ 	* buffer.c (report_overlay_modification): Renamed from
+ 	verify_overlay_modification.
+ 	* insdel.c: Calls changed.
+ 
+ 	* insdel.c (signal_before_change, signal_after_change):
+ 	Call verify_overlay_modification here.
+ 	(prepare_to_modify_buffer): Don't call verify_overlay_modification.
+ 
+ 	* buffer.c (call_overlay_mod_hooks): New args AFTER, ARG1, ARG2, ARG3.
+ 	Args START, END deleted.  Pass each function AFTER, ARG1 and ARG2,
+ 	and ARG3 if ARG3 is not nil.
+ 	(verify_overlay_modification): New args AFTER, ARG1, ARG2, ARG3.
+ 	Pass them to call_overlay_mod_hooks.
+ 
+ 	* search.c (compile_pattern): Call re_set_registers here.
+ 	And no need to BLOCK_INPUT for that.
+ 	(compile_pattern_1): Instead of here.
+ 
+ Sat Dec 10 16:45:12 1994  Richard Stallman  <rms@kepa>
+ 
+ 	* s/aix4-1.h: New file.
+ 
+ 	* unexaix.c (unrelocate_symbols): Add AIX4_1 conditionals and code.
+ 
+ 	* sysdep.c (sys_siglist) [AIX]: Add AIXHFT conditional.
+ 
+ 	* systty.h: Change AIX conditional around HFNKEYS to AIXHFT.
+ 
+ Fri Dec  9 23:14:19 1994  Richard Stallman  <rms@green-hill>
+ 
+ 	* bytecode.c (Fbyte_code): Call Ffollowing_char and Fprevious_char
+ 	as functions.  Don't mask char-syntax arg to just 8 bits.
+ 
+ Thu Dec  8 00:18:05 1994  Richard Stallman  <rms@green-hill>
+ 
+ 	* keyboard.c (read_char): After auto-saving, redisplay.
+ 
+ Tue Dec  6 17:11:20 1994  Richard Stallman  <rms@gnu.ai.mit.edu>
+ 
+ 	* xfns.c (Fx_color_values): Doc fix.
+ 
+ 	* buffer.c (list_buffers_1): Right-align the size values.
+ 
+ 	* frame.h (struct frame): New field cost_calculation_baud_rate.
+ 	(FRAME_COST_BAUD_RATE): New macro.
+ 	* term.c (calculate_costs): Set FRAME_COST_BAUD_RATE.
+ 	Don't test dont_calculate_costs.
+ 	(dont_calculate_costs): Variable deleted.
+ 	(term_init): Don't set dont_calculate_costs.
+ 	* dispnew.c (update_frame): Call calculate_costs if baud_rate changed.
+ 
+ Mon Dec  5 23:21:50 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* emacs.c (sort_args): Don't overwrite the terminating null pointer.
+ 
+ Mon Dec  5 20:00:05 1994  Richard Stallman  <rms@gnu.ai.mit.edu>
+ 
+ 	* keyboard.c (read_key_sequence): Downcase undefined shifted fn keys.
+ 
+ Sun Dec  4 17:01:31 1994  Richard Stallman  <rms@gnu.ai.mit.edu>
+ 
+ 	* emacs.c (argmatch): Take argc as arg; don't go past end of argv.
+ 	(main): Change calls to argmatch.
+ 
+ 	* intervals.h (INTERVAL_LAST_POS): Don't subtract 1 here.
+ 
+ 	* intervals.c (compare_string_intervals): New function.
+ 	* fns.c (internal_equal): Call compare_string_intervals.
+ 	(Fstring_equal): Doc fix.
+ 
+ 	* scroll.c (scroll_cost): FRAME_DELETE_COST and FRAME_DELETEN_COSTS
+ 	were confused.  Fixed.
+ 
+ 	* xterm.c (x_make_frame_visible, x_make_frame_invisible)
+ 	(x_iconify_frame): Give error if frame has explicit_parent.
+ 	(x_new_font): Don't set window height if frame has explicit_parent.
+ 
+ 	* xfns.c (Fx_create_frame): Check for parent-id parameter.
+ 	Set explicit_parent and parent fields.
+ 	Don't set visibility if explicit_parent.
+ 	[! USE_X_TOOLKIT] (x_window): Specify parent window.
+ 
+ 	* xterm.h (struct x_display): New field explicit_parent.
+ 
+ 	* s/ultrix4-3.h (SET_LINE_DISCIPLINE): Defined.
+ 
+ 	* sysdep.c (child_setup_tty): Use CDISABLE for setting VERASE, VKILL.
+ 	(init_sys_modes) [SET_LINE_DISCIPLINE]: Set specified line discipline.
+ 	(reset_sys_modes) [SET_LINE_DISCIPLINE]: Restore old line discipline.
+ 
+ Sat Dec  3 14:49:28 1994  Richard Stallman  <rms@gnu.ai.mit.edu>
+ 
+ 	* lread.c (readevalloop): Ignore ^M here.
+ 
+ 	* emacs.c (argmatch): Handle lstr == 0.
+ 
+ Mon Nov 28 17:13:27 1994  Richard Stallman  <rms@gnu.ai.mit.edu>
+ 
+ 	* regex.c (re_match_2_internal):
+ 	Rename label `succeed' to `succed_label'.
+ 
+ 	* xfns.c (Fx_synchronize): Fix doc string syntax.
+ 
+ 	* xmenu.c: Don't include ../oldXMenu/XMenu.h if USE_X_TOOLKIT.
+ 
+ 	* Makefile.in.in: Fix erroneous comment syntax.
+ 
+ 	* s/ultrix4-3.h: New file.
+ 
+ 	* systty.h: Have just one conditional to include unistd.h.
+ 	Test NEED_UNISTD_H, not AIX and IRIX4.
+ 	(UNISTD_H_INCLUDED): Don't define or test this.
+ 	* m/ibm370aix.h (NEED_UNISTD_H): Defined.
+ 	* s/aix3-1.h (NEED_UNISTD_H): Defined.
+ 	* s/irix4-0.h (NEED_UNISTD_H): Defined.
+ 
+ 	* fileio.c (internal_delete_file, internal_delete_file_1):
+ 	New functions.
+ 	* buffer.c (Fkill_buffer): Use internal_delete_file.
+ 	* callproc.c (delete_temp_file): Use internal_delete_file.
+ 
+ Fri Nov 25 19:15:07 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* search.c (search_regs_saved): Don't initialize; it dumps as pure.
+ 
+ Thu Nov 24 09:47:31 1994  Francesco Potorti`  <pot@cnuce.cnr.it>
+ 
+ 	* m/delta.h (C_SWITCH_MACHINE): -inline-functions removed,
+         because the compiler shipped with R3V7 is not stable.
+ 
+ Thu Nov 24 03:33:11 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* keyboard.c (command_loop_1): Use safe_run_hooks to run
+ 	deferred-action-function.
+ 	(Qdeferred_action_function): New variable.
+ 	(syms_of_keyboard): Initialize and staticpro Qdeferred_action_function.
+ 
+ Wed Nov 23 03:59:27 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* keyboard.c (syms_of_keyboard): Doc fix.
+ 
+ 	* fns.c (Fy_or_n_p): Handle exit-prefix in query-replace-map.
+ 
+ Tue Nov 22 14:22:37 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* search.c (save_search_regs): Add declaration.
+ 
+ 	* minibuf.c (Fminibuffer_complete_and_exit):
+ 	Catch errors in do_completion.
+ 	(complete_and_exit_1, complete_and_exit_2): New subroutines.
+ 
+ 	* s/aix4.h: New file.
+ 	* s/aix3-1.h (AIXHFT): Defined.
+ 	* m/ibmrs6000.h (OBJECTS_MACHINE): Define only if AIXHFT.
+ 
+ 	* sysdep.c (init_sys_modes): Tes AIXHFT, not AIX.
+ 	(reset_sys_modes): Test AIXHFT.
+ 	(hft_init, hft_reset): Test AIXHFT, not AIX.
+ 
+ Mon Nov 21 23:49:31 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* window.c (Fdisplay_buffer): Use `b' to read existing buffer name.
+ 
+ Mon Nov 21 22:25:15 1994  David J. MacKenzie  (djm@mole.gnu.ai.mit.edu)
+ 
+ 	* config.h.in: Add #undefs for --with-pop, --with-kerberos, and
+ 	--with-hesiod.
+ 
+ Sat Nov 19 15:02:31 1994  Francesco Potorti`  <pot@cnuce.cnr.it>
+ 
+ 	* lisp.h: (running_asynch_code): New global flag.
+ 	* emacs.c (running_asynch_code): New global flag.
+ 	(main): Initialise it.
+ 	* process.c (read_process_output, exec_sentinel): Set and
+ 	reset the running_asynch_code global flag and restore match data.
+ 
+ 	* search.c (Flooking_at, Fstring_match, search_buffer,
+ 	Fstore_match_data): Save the match data if a filter or a sentinel
+ 	is running.
+ 	(search_regs_saved, saved_search_regs): New variables.
+ 	(save_search_regs, restore_match_data): New functions.
+ 
+ Sat Nov 19 10:47:43 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* emacs.c (sort_args): New function.
+ 	(main): Call sort_args.
+ 	Check for -d/-display after -nw, -batch, -help.
+ 	Accept --display, with arg attached or separate.
+ 
+ Fri Nov 18 15:25:48 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* filelock.c (init_filelock): Add missing semicolon.
+ 
+ Fri Nov 18 02:02:45 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* indent.c (recompute_width_table): Do the right thing if no previous
+ 	table existed.
+ 	Fix Lisp_Object vs. integer problem.
+ 	(width_run_cache_on_off): Let recompute_width_table create the vector.
+ 
+ Thu Nov 17 21:01:28 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* lisp.h: (enum Lisp_Misc_Type): Rename Lisp_Vector to
+ 	Lisp_Vectorlike.  Mark Lisp_Window_Configuration as obsolete.
+ 	(PSEUDOVECTOR_FLAG, PSEUDOVECTOR_SIZE_MASK, PVEC_BUFFER,
+ 	PVEC_PROCESS, PVEC_FRAME, PVEC_COMPILED, PVEC_WINDOW,
+ 	PVEC_WINDOW_CONFIGURATION): New constants.
+ 	(XSETPSEUDOVECTOR, PSEUDOVECTORP, VECTORLIKEP): New macros.
+ 	(XSETVECTOR, XSETWINDOW_CONFIGURATION, VECTORP,
+ 	WINDOW_CONFIGURATIONP): Use the new convention.
+ 	(XSETCOMPILED): New macro.
+ 	* print.c (print): Use type test macros.
+ 	* keymap.c (Fsingle_key_description): Likewise.
+ 	* doc.c (Fdocumentation): Likewise.
+ 	* alloc.c (Fpurecopy): Likewise.
+ 	(mark_object): Use the new pseudovector convention.
+ 	* fns.c (Fvconcat, concat): Use Lisp_Vectorlike.
+ 	* ntinevt.c (SET_FRAME): Use accessor macros.
+ 	(key_event, do_mouse_event): Likewise.
+ 
+ Thu Nov 17 11:10:17 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* filelock.c (init_filelock): Always copy lock_path.
+ 	(lock_dir, superlock_file, MAKE_LOCK_NAME):
+ 	Renamed from lock_path, superlock_path, MAKE_LOCK_PATH.
+ 
+ Wed Nov 16 19:13:12 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* s/domain.h: New file.
+ 
+ Wed Nov 16 15:32:55 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* s/gnu.h [NOT_C_CODE]: Include fcntl.h.
+ 
+ Wed Nov 16 12:35:01 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xdisp.c (try_window, display_text_line): Undo previous change.
+ 
+ 	* dired.c (Fdirectory_files): Pass new arg to `compile_pattern'.
+ 
+ 	* search.c (struct regexp_cache): New field `posix'.
+ 	(compile_pattern_1): New arg `posix'.  Controls the syntax spec
+ 	for parsing; also record it in the cache.
+ 	(compile_pattern): New arg `posix'.
+ 	(looking_at_1, string_match_1, fast_string_match): Pass 0 for new arg.
+ 	(search_buffer): New arg `posix'.  Now static.
+ 	(search_command): New arg `posix'.  All callers changed.
+ 	(Fposix_search_forward, Fposix_search_backward): New functions.
+ 	(string_match_1, looking_at_1): New subroutines broken out.
+ 	(Fstring_match, Flooking_at): Use them.
+ 	(Fposix_string_match, Fposix_looking_at): New functions.
+ 	(syms_of_search): defsubr new functions.
+ 
+ Wed Nov 16 11:57:48 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* xdisp.c (try_window): Don't pass window to Fget_char_property;
+         pass its buffer.
+ 	(display_text_line): Likewise.
+ 
+ Wed Nov 16 15:26:06 1994  Francesco Potorti`  (pot@cnuce.cnr.it)
+ 
+ 	* Makefile.in.in (TAGS): The new etags allows tagging DEFVARs.
+ 
+ Tue Nov 15 19:26:52 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* lread.c (Fload): Call Fsubstitute_in_file_name after trying handler.
+ 
+ 	* fileio.c (Fread_file_name_internal): Protect orig_string.
+ 
+ Tue Nov 15 15:00:56 1994  enami tsugutomo  <enami@sys.ptg.sony.co.jp>
+ 
+ 	* keyboard.c (Fopen_dribble_file): Call fclose only when
+ 	dribble is non zero.
+ 
+ Tue Nov 15 16:32:31 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* keymap.c (access_keymap): Use type test macros.
+ 
+ 	* alloc.c (Fmake_vector): Call allocate_vectorlike.
+ 	(allocate_vectorlike): New function, extracted from Fmake_vector.
+ 	* lisp.h: Declare allocate_vectorlike.
+ 	(VECSIZE): New macro.
+ 	* process.c (make_process): Use allocate_vectorlike and VECSIZE.
+ 	* frame.c (make_frame): Likewise.
+ 	* window.c (make_dummy_parent, make_window): Likewise.
+ 	(Fcurrent_window_configuration): Likewise.
+ 	(SAVE_WINDOW_DATA_SIZE): Macro deleted.
+ 
+ 	* lisp.h: Delete declaration of Farray_length.
+ 	* data.c (Farray_length): Delete this obsolete function.
+ 	(Faref, Faset): If object is a string, use XSTRING, not XVECTOR.
+ 	* fns.c (Flength): Don't call Farray_length, just use size field.
+ 
+ 	* xterm.h (XSCROLL_BAR): Extract from Lisp_Vector, not generic pointer.
+ 
+ 	* xselect.c (wait_for_property_change): Encode location as a cons
+ 	of two integers instead of lying about the type.
+ 	(wait_for_property_change_unwind): Decode it likewise.
+ 
+ 	* eval.c (Finteractive_p): Use XSUBR instead of its expansion.
+ 
+ 	* lisp.h (GC_INTEGERP, etc): New type-test macros for use during GC.
+ 	* buffer.h (OVERLAY_POSITION): Use the new type-test macros.
+ 	* process.c (NETCONN_P, kill_buffer_processes): Likewise.
+ 	* buffer.c (overlays_at): Likewise.
+ 	* filelock.c (unlock_all_files): Likewise.
+ 	* xfns.c (x_window_to_frame): Likewise.
+ 	(x_any_window_to_frame, x_top_window_to_frame): Likewise.
+ 	* fileio.c (Fdo_auto_save): Likewise.
+ 
+ 	* xfaces.c (Fpixmap_spec_p): Avoid function calls and assignments
+ 	as arguments to a type-test macro.
+ 	* textprop.c (PLIST_ELT_P): Likewise.
+ 	* keymap.c (current_minor_maps): Likewise.
+ 
+ 	* lisp.h (NATNUMP): New macro.
+ 	(CHECK_NATNUM): Use that macro instead of its expansion.
+ 	* data.c (Fnatnump): Likewise.
+ 	* xfns.c (x_set_frame_parameters): Likewise.
+ 	* keymap.c (access_keymap, store_in_keymap): Likewise.
+ 	* doc.c (Fdocumentation): Likewise.
+ 	* alloc.c (Fmake_list): Use CHECK_NATNUM instead of its expansion.
+ 	Now signals using `wholenump' instead of `natnump'.
+ 	(Fmake_vector, Fmake_string): Likewise.
+ 
+ 	* data.c (syms_of_data): Set Qwholenump as function, not variable.
+ 
+ 	* alloc.c (free_float): Don't assume XFASTINT accesses the raw bits.
+ 	(make_float, free_cons, Fcons, Fmake_symbol, gc_sweep): Likewise.
+ 
+ Tue Nov 15 09:00:43 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xterm.c (x_mouse_leave): New function broken out of XTread_socket.
+ 	When x_focus_event_frame is nonzero, assume that frame gets focus.
+ 	(XTread_socket): Use x_mouse_leave for LeaveNotify.
+ 	* xmenu.c (xmenu_show): Call x_mouse_leave.
+ 
+ 	* fileio.c (Fsubstitute_in_file_name): Run a handler.
+ 	(Qsubstitute_in_file_name): New variable.
+ 	(syms_of_fileio): Set it up.
+ 
+ 	* lread.c (read_escape): For \S-a, return A.
+ 
+ 	* buffer.c (Frename_buffer): Rename arg NAME to NEWNAME.
+ 
+ Mon Nov 14 21:54:45 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* s/freebsd.h (LD_SWITCH_SYSTEM): Add -dc and -dp.
+ 	(HAVE_GETPAGESIZE): Defined.
+ 
+ 	* sysdep.c (init_sys_modes): Maybe call tcflow.
+ 
+ Mon Nov 14 20:39:03 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* lisp.h: (enum Lisp_Misc_Type): Add new enumeration Lisp_Misc_Overlay.
+ 	(enum Lisp_Type): Delete the corresponding enumeration from here.
+ 	(struct Lisp_Overlay): New structure.
+ 	(XOVERLAY, OVERLAYP): Access the new structure.
+ 	(union Lisp_Misc): Add new member.
+ 	* buffer.h (OVERLAY_START, OVERLAY_END): Use the new substructure.
+ 	* alloc.c (mark_object, gc_sweep): Likewise.
+ 	* print.c (print): Likewise.
+ 	* buffer.c (Fmake_overlay): Likewise.
+ 	(Foverlay_properties, Foverlay_get, Foverlay_put): Likewise.
+ 	* fns.c (internal_equal): Likewise.
+ 	Simplify by returning int.
+ 	(Fequal): Use new interface to internal_equal.
+ 
+ 	* buffer.c (list_buffers_1): Use PT, not point.
+ 
+ Mon Nov 14 19:30:28 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* fileio.c (Finsert_file_contents): Init not_regular at the beginning.
+ 
+ Mon Nov 14 19:03:39 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* buffer.c (Fkill_all_local_variables): Use XBUFFER_LOCAL_VALUE,
+ 	not XCONS.
+ 
+ Mon Nov 14 18:28:51 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* s/gnu.h (A_TEXT_OFFSET): Macro removed.
+ 	(A_TEXT_SEEK): Define to just sizeof (struct exec).
+ 
+ Mon Nov 14 17:15:08 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* lread.c (defvar_int): Use accessor macro.
+ 	(defvar_bool, defvar_lisp_nopro, defvar_per_buffer): Likewise.
+ 
+ Sun Nov 13 11:53:42 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xfaces.c (load_pixmap): Handle bitmap_id < 0.  F is a FRAME_PTR.
+ 
+ 	* frame.c (syms_of_frame): Fix typo.
+ 
+ 	* minibuf.c (Fdisplay_completion_list): Update COLUMN unconditionally.
+ 	If a name is long, put it on its own line.
+ 
+ Sun Nov 13 14:00:52 1994  Brendan Kehoe  (brendan@lisa.cygnus.com)
+ 
+ 	* s/hpux9.h (C_SWITCH_SYSTEM) [__GNUC__]: Set -D_BSD to get the
+ 	correct definitions from sys/wait.h.
+ 
+ Sat Nov 12 15:04:53 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* frame.c (syms_of_frame): Doc fix for default-frame-alist.
+ 
+ Fri Nov 11 09:52:11 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* fileio.c (Finsert_file_contents): If VISIT, set the buffer components
+ 	such as the filename even before signaling error for non-regular file.
+ 
+ 	* s/iris3-5.h, s/iris3-6.h (MAIL_USE_FLOCK): Defined.
+ 	* s/irix3-3.h, s/irix5-0.h (MAIL_USE_FLOCK): Defined.
+ 	* s/irix5-2.h: New file.
+ 
+ 	* m/paragon.h: New file.
+ 
+ Fri Nov 11 02:31:19 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* lisp.h: (enum Lisp_Misc_Type): Add new enumerations
+ 	Lisp_Misc_Buffer_Local_Value and Lisp_Misc_Some_Buffer_Local_Value.
+ 	(enum Lisp_Type): Delete the corresponding enumerations from here.
+ 	(struct Lisp_Buffer_Local_Value): New structure.
+ 	(XBUFFER_LOCAL_VALUE): Access the new structure.
+ 	(BUFFER_LOCAL_VALUEP, BUFFER_SOME_LOCAL_VALUEP): Likewise.
+ 	(union Lisp_Misc): Add new member.
+ 	* alloc.c (mark_object): New code to handle buffer-local substructure.
+ 	(gc_sweep): Generalize marker code to handle other substructures.
+ 	* bytecode.c (Fbyte_code): Special case for buffer-local objects is
+ 	now handled by the more general test.  Simplify.
+ 	* buffer.c (set_buffer_internal): Use XBUFFER_LOCAL_VALUE, not XCONS.
+ 	* data.c (store_symval_forwarding): Likewise.
+ 	(swap_in_symval_forwarding, Fset, default_value, Fset_default,
+ 	Fkill_local_variable): Likewise.
+ 	(Fmake_variable_buffer_local): Use the new substructure.
+ 	(Fmake_local_variable): Likewise.
+ 
+ Thu Nov 10 02:56:12 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* process.c (create_process) [OSF1]: Use setpgid, not setpgrp.
+ 
+ Wed Nov  9 15:44:17 1994  Boris Goldowsky  <boris@cs.rochester.edu>
+ 
+ 	* cmds.c (Fnewline): Always use insert_and_inherit.
+ 
+ Wed Nov  9 22:41:04 1994  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* lisp.h (FRAMEP): Use the second definition whenever HAVE_MOUSE.
+ 
+ 	* keyboard.c (tracking_off): Test old value with NILP.
+ 	Restore the old value whatever it may be.
+ 	(syms_of_keyboard): Use DEFVAR_LISP for track-mouse.
+ 
+ Wed Nov  9 00:54:09 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* data.c (Fboundp, find_symbol_value): Use type test macros
+ 	instead of checking XTYPE directly.
+ 
+ 	* keyboard.c (print_help): Set help-mode in *Help* buffer.
+ 	* keymap.c (describe_buffer_bindings): Likewise.
+ 	* syntax.c (describe_syntax_1): Likewise.
+ 
+ Tue Nov  8 22:43:40 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* keyboard.c (EVENT_QUEUES_EMPTY): Only test do_mouse_tracking and
+ 	mouse_moved #ifdef HAVE_MOUSE.
+ 	(Ftrack_mouse): Protect with #ifdef HAVE_MOUSE.
+ 	(syms_of_keyboard): Protect initialization of do_mouse_tracking,
+ 	defsubr of Strack_mouse, and DEFVAR of track-mouse with #ifdef
+ 	HAVE_MOUSE.
+ 
+ Mon Nov  7 21:43:01 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* frame.c (Fset_frame_height): Compare against height, not width.
+ 
+ Mon Nov  7 21:37:36 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* keyboard.c: Move decl of input_fd outside of #ifdef
+         HAVE_X_WINDOWS.
+ 
+ Thu Nov  3 22:48:14 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* xterm.c (XTread_socket): Generate iconify and deiconify events.
+ 
+ Thu Nov  3 15:45:02 1994  Geoff Voelker  <voelker@cs.washington.edu>
+ 
+ 	* m/intel386.h (VIRT_ADDR_VARIES) [WINDOWSNT]: Defined.
+ 	(DATA_END) [WINDOWSNT]: Defined.
+ 	(DATA_START) [WINDOWSNT]: Defined.
+ 	(HAVE_ALLOCA) [WINDOWSNT]: Defined.
+ 
+ 	* s/windowsnt.h: Include malloc.h.
+ 	(MODE_LINE_BINARY_TEXT): Defined.
+ 	(HAVE_MOUSE): Defined.
+ 
+ 	* ntheap.c (sbrk): Allow request sizes to be different than the
+         page size.
+ 
+ 	* makefile.nt: Changed references of m\m-windowsnt.h to
+ 	m\intel386.h and of s\s-windowsnt.h to s\windowsnt.h.
+ 
+ Tue Nov  1 23:19:30 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* xfns.c (Fx_list_fonts): Don't bother to retrieve font info when
+ 	there's no size_ref to compare it against.
+ 
+ 	* editfns.c: (Fdecode_time): Fix Lisp_Object vs. integer problems.
+ 	Don't use tm_gmtoff; it's not portable.
+ 
+ 	* lisp.h: Leave DEVICE_SEP undefined by default.
+ 
+ Tue Nov  1 05:31:17 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* buffer.c (init_buffer): Fix error message syntax.
+ 
+ 	* fileio.c (Fsubstitute_in_file_name): Add missing #endif.
+ 
+ 	* lread.c: Don't include ctype.h.
+ 	(isfloat_string, read1): Don't use isdigit.
+ 
+ 	* editfns.c (Fdecode_time): Change one XFASTINT to XINT.
+ 
+ 	* s/windowsnt.h (SYSTEM_PURESIZE_EXTRA): Defined.
+ 
+ Mon Oct 31 20:48:15 1994  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* xfns.c (x_window): Make ibw 0 by default.
+ 
+ Mon Oct 31 16:47:47 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* xterm.c (XTclear_end_of_line): Finish the line dance here too,
+ 	just as was done in XTwrite_glyphs.
+ 
+ 	* xdisp.c (column_number_displayed): New variable.
+ 	(redisplay, redisplay_window): If that var is set, do mode line.
+ 	(display_mode_line): Unset the var.
+ 	(decode_mode_spec): Set the var if %c was seen.
+ 
+ Sun Oct 30 13:47:05 1994  voelker  <voelker@cs.washington.edu>
+ 
+ 	* makefile.nt: New file.
+ 	* nt.c, nt.h: New files.
+ 	* ntheap.c, ntheap.h: New files.
+ 	* ntinevt.c, ntinevt.h: New files.
+ 	* ntproc.c, ntterm.c: New files.
+ 
+ 	* m/windowsnt.h, s/windowsnt.h: New files.
+ 
+ 	* nt.c: New file.
+ 
+ 	* makefile.nt:New file.
+ 
+ 	* lisp.h (DEVICE_SEP, DIRECTORY_SEP, IS_DEVICE_SEP)
+ 	(IS_DIRECTORY_SEP, IS_ANY_SEP): New macros, defined if not already def.
+ 
+ 	* s/msdos.h (DOS_NT): Defined.
+ 
+ 	* term.c (term_init) [WINDOWSNT]: Do some Windows-specific
+ 	initialization, then skip the rest of the code.
+ 	(FRAME_TERMCAP_P) [WINDOWSNT]: Always return 0.
+ 
+ 	* systty.h: Test DOS_NT, not MSDOS.
+ 
+ 	* syssignal.h [WINDOWSNT] (EMACS_KILLPG): Use win32_kill_process.
+ 
+ 	* sysdep.c [WINDOWSNT]: Add includes for NT.
+ 	Define _P_WAIT.  Declare _spawnlp, _getpid.
+ 	[WINDOWSNT] (select, strerror, vfork): Don't use these definitions.
+ 
+ 	* sysdep.c (init_sys_modes): Test DOS_NT, not MSDOS.
+ 	(emacs_get_tty, emacs_set_tty,(child_setup_tty, init_baud_rate): Ditto.
+ 
+ 	* sysdep.c (sys_subshell) [WINDOWSNT]: Use _spawnlp. not vfork.
+ 	(wait_for_termination) [WINDOWSNT]: Use wait.
+ 	(discard_tty_input) [WINDOWSNT]: Do nothing at all.
+ 
+ 	* process.c: Use macros IS_ANY_SEP, IS_DIRECTORY_SEP,
+ 	IS_DEVICE_SEP, DIRECTORY_SEP, and DEVICE_SEP.
+ 	[WINDOWSNT]: Add includes.  Don't define sys_siglist.
+ 
+ 	* process.c (sigchld_handler): Work around bug in MS C compiler.
+ 	(sigchld_handler) [WINDOWSNT]: Do not call signal.
+ 	(signal_process) [WINDOWSNT]: Use win32_kill_process instead of kill.
+ 	(read_process_output) [WINDOWSNT]: Use read_child_output instead of
+ 	read.
+ 
+ 	* process.c (create_process) [WINDOWSNT]: Use
+ 	pipe_with_inherited_out  and pipe_with_inherited_in.
+ 	Use the pid returned by child_setup.  Deal with not having vfork,
+ 	Call register_child.
+ 	(close_process_descs): Do nothing if WINDOWSNT.
+ 
+ 	* process.c (proc_buffer_char): No longer static.
+ 
+ 	* ndir.h (MAXNAMLEN) [WINDOWSNT]: Define as 255.
+ 
+ 	* mem-limits.h [WINDOWSNT]: Don't include vlimit.h.
+ 	(get_lim_data): Alternate definition for WINDOWSNT.
+ 
+ 	* lread.c: Change explicit uses of the Unix directory separator
+ 	'/' to uses of the macros IS_ANY_SEP, IS_DIRECTORY_SEP,
+ 	IS_DEVICE_SEP, DIRECTORY_SEP, and DEVICE_SEP.
+ 
+ 	* lread.c (init_lread) [WINDOWSNT]: Disable warnings about
+ 	directories in the load path not existing.
+ 
+ 	* lread.c (load): Test DOS_NT instead of MSDOS.
+ 
+ 	* keyboard.c (read_key_sequence): Use flags instead of gotos to
+ 	enable the Microsoft C compiler to compile the routine.
+ 
+ 	* keyboard.c (read_avail_input) [WINDOWSNT]: Just return 0.
+ 
+ 	* fileio.c: Change explicit uses of the Unix directory separator
+ 	'/' to uses of the macros IS_ANY_SEP, IS_DIRECTORY_SEP,
+ 	IS_DEVICE_SEP, DIRECTORY_SEP, and DEVICE_SEP.
+ 
+ 	* fileio.c [WINDOWSNT]: Don't define HAVE_FSYNC; add includes for NT.
+ 
+ 	* fileio.c (Ffile_name_absolute_p): Test DOS_NT instead of MSDOS.
+ 	(Fwrite_region, Fdo_auto_save, Ffile_modes): Likewise.
+ 
+ 	* fileio.c (Qfind_buffer_file_type): Test DOS_NT instead of MSDOS.
+ 	(syms_of_files): Likewise.
+ 	(Finsert_file_types): Test DOS_NT instead of MSDOS.
+ 	Rename local var try to trytry.
+ 
+ 	* fileio.c (Fadd_name_to_file): Wlways fail.
+ 	(Frename_file) [WINDOWSNT]: Use MoveFile, not link and unlink,
+ 	and check for both ERROR_FILE_EXISTS and ERROR_ALREADY_EXISTS.
+ 	(Fmake_directory_internal) [WINDOWSNT]: Invoke mkdir without the mask.
+ 
+ 	* fileio.c (Fexpand_file_name): Test DOS_NT, not MSDOS.
+ 	(Fexpand_file_name) [WINDOWSNT]: Accept // or \\ at start.
+ 	Call dostonunix_filename for HOME envvar, for ~USER.
+ 	Quote directory separators found in environment variables.
+ 	(Fsubstitute_in_file_name): Test DOS_NT instead of MSDOS.
+ 	(Fsubstitute_in_file_name) [WINDOWSNT]: Accept // or \\ at start.
+ 	Work around alloca bug in MS compiler.
+ 	(Ffile_name_directory): Test DOS_NT instead of MSDOS sometimes.
+ 	But don't insert a drive letter on windows.
+ 
+ 	* emacs.c (Fdump_emacs): Don't reset the data start address by
+ 	invoking memory_warnings just before unexec-ing.
+ 
+ 	* editfns.c (init_editfns): Get the username from the environment
+ 	variable USERNAME instead of USER.
+ 
+ 	* dired.c: Use macros IS_ANY_SEP, IS_DIRECTORY_SEP, and DIRECTORY_SEP.
+ 	(file-attributes) [WINDOWSNT]: Set st_gid and st_uid to Qnil; use
+ 	get_inode_and_device_vals to fake up inode number and device number.
+ 
+ 	* callproc.c (getenv_internal) [WINDOWSNT]: Use strnicmp, not bcmp.
+ 
+ 	* callproc.c (child_setup): Use IS_DIRECTORY_SEP.
+ 	[WINDOWSNT]: Call prepare_standard_handles.  Use spawnve.
+ 	Use reset_standard_handles.
+ 
+ 	* callproc.c (Fcall_process_region): Test DOS_NT, not MSDOS.
+ 	(Fcall_process) [WINDOWSNT]: Call pipe_with_inherited_out.
+ 	Use the return value of child_setup to get the child's pid;
+ 	don't call vfork etc. explicitly.
+ 
+ 	* callproc.c [WINDOWSNT]: Add includes.	 Defone NOMINMAX, _P_NOWAIT.
+ 	(Vbinary_process_input, Vbinary_process_output)
+ 	(Qbuffer_file_type): Test DOS_NT, not MSDOS.
+ 	(syms_of_callproc): Test DOS_NT, not MSDOS.
+ 
+ 	* callproc.c (init_callproc): Test DOS_NT, not MSDOS.
+ 
+ 	* buffer.h (struct buffer): Test DOS_NT, not MSDOS.
+ 
+ 	* buffer.c (init_buffer): Use DIRECTORY_SEP, IS_DIRECTORY_SEP macros,
+ 	not character constants.
+ 	(init_buffer_once, syms_of_buffer): Test DOS_NT, not MSDOS.
+ 
+ Sun Oct 30 04:21:48 1994  Erik Naggum  <erik@naggum.no>
+ 
+ 	* editfns.c (Fdecode_time): New function.
+ 	(syms_of_editfns): defsubr it.
+ 
+ Sun Oct 30 03:20:24 1994  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* keyboard.c (make_lispy_event): Record double and triple for drags.
+ 	Put in click_modifier for multi-clicks.
+ 	(read_key_sequence): Convert double-drag first to plan drag,
+ 	and only later try a click.
+ 
+ 	* unexsunos4.c (unexec): Don't print number of pure bytes used.
+ 
+ Sat Oct 29 19:28:05 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xfns.c (Fx_create_frame):
+ 	Don't set xlwmenu_default_font if not USE_X_TOOLKIT.
+ 
+ 	* puresize.h (BASE_PURESIZE): Increment MULTI_FRAME value.
+ 
+ Sat Oct 29 14:23:39 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* keyboard.c (read_avail_input): Fix Lisp_Object vs. int problem.
+ 
+ Sat Oct 29 05:40:20 1994  Richard Stallman  <rms@pogo.gnu.ai.mit.edu>
+ 
+ 	* xterm.c (fast_find_position): Special case if POS is end of buffer.
+ 
+ 	* xterm.c (x_delete_display): Call XrmDestroyDatabase.
+ 
+ Fri Oct 28 14:54:18 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* s/osf1.h (LD_SWITCH_SYSTEM): Definitions deleted.
+ 
+ 	* m/alpha.h (LD_SWITCH_MACHINE): New definition.
+ 
+ Fri Oct 28 10:06:02 1994  Rainer Schoepf  <Schoepf@Uni-Mainz.de>
+ 
+ 	* s/osf1.h (INTERRUPTIBLE_IO, INTERRUPTIBLE_OPEN, INTERRUPTIBLE_CLOSE)
+ 	(read, write, open, close): New definitions.
+ 
+ Thu Oct 27 13:43:54 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* buffer.c (Fset_buffer_major_mode): New function.  Set the
+ 	default major mode here.
+ 	(Fget_buffer_create): Not here.
+ 	(Fswitch_to_buffer): Call Fset_buffer_major_mode.
+ 	(syms_of_buffer): defsubr the new function.
+ 
+ 	* termhooks.h (iconify_event, deiconify_event): New enum event_kind's.
+ 	* keyboard.c (kbd_buffer_get_event): Translate them to lispy events.
+ 	(head_table): Initialize those new symbols appropriately.
+ 	* frame.c (keys_of_frame): Bind those events to 'ignore, since the
+ 	window manager has already done the work.
+ 
+ 	* xmenu.c (set_frame_menubar): Don't copy string during GC risk.
+ 
+ Wed Oct 26 04:07:28 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* config.h.in (HAVE_GETPAGESIZE): Add #undef.
+ 	* m/sequent-ptx.h (HAVE_GETPAGESIZE): Explicitly #undef.
+ 	* s/linux.h, s/msdos.h (HAVE_GETPAGESIZE): Definition deleted.
+ 	* m/symmetry.h (HAVE_GETPAGESIZE): Definition deleted.
+ 
+ 	* xterm.c (x_destroy_window): Rewrite to fetch dpyinfo just once.
+ 
+ 	* xfns.c (Fx_create_frame): Set xlwmenu_default_font.
+ 
+ 	* widget.c (set_frame_size): Set app_shell and wmshell the same.
+ 
+ 	* xterm.c [USE_X_TOOLKIT]: Make application context explicitly
+ 	and support multiple top-level shells.
+ 	(x_initialize): Call XtToolkitInitialize, XtCreateApplicationContext;
+ 	don't open display or make a shell.
+ 	(x_term_init): Call XtOpenDisplay.
+ 
+ 	* xfns.c [USE_X_TOOLKIT] (x_window): Use XtAppCreateShell.
+ 	(Xt_app_shell, Xt_app_con): Variables deleted.
+ 	(Fx_close_connection) [USE_X_TOOLKIT]: Call XtCloseDisplay.
+ 
+ 	* xterm.c (x_scroll_bar_create): Use XMapRaised directly.
+ 	(x_make_frame_visible, x_iconify_frame): Likewise.
+ 	(XMapWindow): Macro definition deleted.
+ 	(METABIT): Macro deleted.
+ 	(MAXDESC, FD_SETSIZE, FD_SET, FD_CLEAR, FD_ZERO, FD_ISSET): Likewise.
+ 	(x_id_name): Variable deleted.
+ 
+ 	* process.c (status_message): Add a cast.
+ 	(sigchld_handler): Add a cast.
+ 
+ 	* xfns.c (x_window): Pass new arg f to hack_wm_protocols.
+ 
+ 	* xdisp.c (display_text_line): Truncate the minibuf_prompt if nec.
+ 
+ Wed Oct 26 02:17:20 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* window.c (syms_of_window): Fix missing \n\'s.
+ 
+ Wed Oct 26 00:52:17 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xselect.c (x_own_selection, x_get_foreign_selection): Change calls
+ 	to x_catch_errors and friends.
+ 
+ 	* xfns.c (x_set_mouse_color, x_real_positions): Change calls
+ 	to x_catch_errors and friends.
+ 
+ 	* xterm.c (x_catch_errors, x_check_errors, x_had_errors_p)
+ 	(x_uncatch_errors): Make the argument a display, not a frame.
+ 
+ 	* xterm.c (XTread_socket_fake_io_error): New variable.
+ 	(XTread_socket): Obey XTread_socket_fake_io_error.
+ 
+ Tue Oct 25 20:20:20 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* process.c (list_processes_1): Print tty name.
+ 
+ Tue Oct 25 09:39:37 1994  Karl Fogel  (kfogel@phylo.life.uiuc.edu)
+ 
+         * window.c (Vtemp_buffer_show_function): Doc fix.
+ 
+ Tue Oct 25 03:55:52 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xterm.h: Delete X10 code.
+ 
+ 	* xfns.c (Fx_create_frame): Don't increment refernce_count
+ 	until the frame is put on the frame list.
+ 
+ 	* xterm.c (x_initialize): Init x_noop_count, x_focus_frame
+ 	and x_highlight_frame here.
+ 	(x_term_init): Not here.
+ 
+ 	* xterm.c (x_term_init): Open the connection first thing;
+ 	if that fails, don't allocate dpyinfo.
+ 
+ Mon Oct 24 20:43:57 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* xdisp.c (decode_mode_spec): New spec %c, for current column.
+ 
+ Mon Oct 24 02:03:34 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xselect.c (Fx_selection_exists_p): Fix backwards if.
+ 
+ 	* xterm.c (x_delete_display): New function.
+ 	(x_connection_closed): New args dpyinfo and error_message.
+ 	Delete all frames on the dead display
+ 	and all frames using them for minibuffers.
+ 	Call x_delete_display.
+ 	Maybe signal a Lisp error.
+ 	* xfns.c (Fx_close_connection): Call x_delete_display.
+ 
+ 	* xselect.c (Fx_selection_exists_p):
+ 	If selected_frame isn't an x frame, return nil.
+ 
+ 	* keyboard.c (record_char): New subroutine.
+ 	(read_char): Use record_char.
+ 	Split up menu-bar mouse click events here.
+ 	Call record_char for both halves; likewise echo_char
+ 	and add_command_key.
+ 
+ Sun Oct 23 01:39:05 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xfns.c (x_display_info_for_name, Fx_open_connection):
+ 	Signal error if x_term_init fails.
+ 	(Fx_open_connection): New arg must_succeed.
+ 
+ 	* xfns.c (x_real_positions): Catch errors and retry if error happens.
+ 	No need to block input here.
+ 
+ 	* xterm.c (x_term_init): Don't report error here--just return 0.
+ 
+ 	* xfns.c (Fx_create_frame): Don't store the frame name
+ 	till after FRAME_X_DISPLAY_INFO is set up.
+ 	(Fx_close_connection): Renamed from Fx_close_current_connection
+ 
+ 	* xfns.c: Many doc fixes and Lisp function arg renamings.
+ 
+ 	* xterm.c (x_scroll_bar_report_motion): Store proper value in
+ 	*bar_window (the Emacs window, not the X window number).
+ 
+ Sat Oct 22 00:54:08 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* keyboard.c (kbd_buffer_get_event):
+ 	Cope if mouse_position_hook does not store anything.
+ 
+ 	* xterm.c (x_scroll_bar_report_motion): Don't clear *fp.
+ 
+ 	* xterm.h (struct x_display_info):
+ 	New fields bitmaps, bitmaps_size, bitmaps_last.
+ 	(struct x_bitmap_record): Structure moved here.
+ 	* xfns.c (x_bitmaps, x_bitmap_size, x_bitmap_last):
+ 	Variables deleted.  Use fields in x_display_info instead.
+ 	(x_bitmaps_free): Variable deleted.
+ 	(x_destroy_bitmap, x_allocate_bitmap_record): Don't use or set it.
+ 	(x_allocate_bitmap_record): New arg f.  Callers changed.
+ 	(x_lookup_pixmap): Function deleted.
+ 	(x_destroy_all_bitmaps): New function.
+ 	(Fx_close_current_connection): Call x_destroy_all_bitmaps.
+ 	Free the fonts in the font table.  Free various other data
+ 	that dpyinfo points to.  Avoid using Fdelq.
+ 
+ 	* xterm.c (x_wm_set_icon_pixmap): Use x_bitmap_pixmap.
+ 
+ 	* xterm.c:
+ 	(show_mouse_face): New arg dpyinfo.  All callers changed.
+ 	(clear_mouse_face): New arg dpyinfo.  All callers changed.
+ 
+ 	* xterm.h (struct font_info): New type.
+ 	(struct x_display_info): New fields font_table, font_table_size
+ 	and n_fonts.
+ 
+ 	* xterm.h (struct x_display_info): New field scratch_cursor_gc.
+ 	* xterm.c (scratch_cursor_gc): Variable deleted.
+ 	(dumpglyphs): Use scratch_cursor_gc in x_display_info.
+ 
+ 	* xterm.h (mouse_face_*): New fields.
+ 	* xterm.c (mouse_face_*): Variables deleted.
+ 	Use fields in x_display_info instead.
+ 	* xterm.c (syms_of_xterm): Don't staticpro mouse_face_window.
+ 
+ 	* xterm.c (expose_all_windows, expose_all_icons): Variables deleted.
+ 	(BLOCK_INPUT_mask): Variable deleted.
+ 
+ 	* xterm.h (struct x_display_info): New field x_id_name.
+ 	* xfns.c (x_set_name, Fx_create_frame): Use x_id_name field.
+ 	* xterm.c (x_term_init): Set up x_id_name field.
+ 	(x_id_name): Variable deleted.
+ 
+ 	* xterm.c (x_font_table, x_font_table_size, x_n_fonts): Vars deleted.
+ 	(x_new_font): Use new fields.
+ 	(warp_mouse_on_deiconify): Unused variable deleted.
+ 
+ 	* xterm.c (x_term_init): Set up dpyinfo->xrdb.
+ 	Set up dpyinfo->vertical_scroll_bar_cursor.
+ 	(x_scroll_bar_create): Use vertical_scroll_bar_cursor slot.
+ 	(x_vertical_scroll_bar_cursor): Variable deleted.
+ 
+ 	* xterm.c (x_term_init): Really return dpyinfo.
+ 
+ 	* insdel.c (insert_from_buffer_1): Don't use min.
+ 
+ 	* xterm.c (x_term_init): Call add_keyboard_wait_descriptor,
+ 	not change_keyboard_wait_descriptor.
+ 
+ 	* xfns.c (Fx_close_current_connection):
+ 	Call delete_keyboard_wait_descriptor.
+ 
+ 	* process.c: Handle multiple keyboard input descriptors.
+ 	(non_keyboard_wait_mask): New variable.
+ 	(Fset_process_filter): Update non_keyboard_wait_mask
+ 	(create_process, Fopen_network_stream, deactivate_process):
+ 	(init_process, sigchld_handler): Likewise.
+ 	(wait_reading_process_input): Maybe use non_keyboard_wait_mask.
+ 	(add_keyboard_wait_descriptor):
+ 	Renamed from change_keyboard_wait_descriptor.
+ 	Clear the old descriptor's bit only the first call.
+ 	(delete_keyboard_wait_descriptor): New function.
+ 	(keyboard_bit_set): New function.
+ 	(wait_reading_process_input): Use keyboard_bit_set.
+ 	Start the loop over process descs from 0, and explicitly
+ 	ignore non-process input descs.
+ 	(init_process): Don't init keyboard_descriptor.
+ 	(keyboard_descriptor): Variable deleted.
+ 	(add_keyboard_wait_descriptor): Don't set keyboard_descriptor.
+ 	(delete_keyboard_wait_descriptor): New function.
+ 
+ 	* xterm.c (x_term_init): Pass new arg to init_sigio.
+ 	Don't set old_fcntl_owner.
+ 	Don't call change_input_fd.
+ 	(XTread_socket): Loop over displays and process input from each.
+ 
+ 	* sysdep.c: Never use input_fd if using X.
+ 	(stuff_char): Do nothing if read_socket_hook.
+ 	(setpgrp_of_tty): Function deleted.
+ 	(init_sigio): Take fd as argument.  Callers changed.
+ 	Don't call request_sigio; do the work here.
+ 	(request_sigio, unrequest_sigio): Do nothing if read_socket_hook.
+ 	(init_sys_modes): Don't call EMACS_GET_TTY unless we are going
+ 	to change the settings.
+ 
+ 	* xfns.c (Fx_close_current_connection): Call check_x_display_info.
+ 	Delete the display from x_display_list and x_display_name_list.
+ 	(Fx_display_list): New function.
+ 	(syms_of_xfns): defsubr it.
+ 
+ 	* xterm.c (x_display_name_list): New variable.
+ 	(syms_of_xterm): staticpro it.
+ 	Don't staticpro slots in the_x_screen.
+ 	(x_term_init): Update x_display_name_list along with x_display_list.
+ 	Actually malloc the x_display_info.
+ 	(the_x_screen): Variable deleted.
+ 
+ 	* xfns.c (Fx_list_fonts): Use `name_list_element' field.
+ 	(x_display_info_for_name): Scan x_display_name_list
+ 	along with x_display_list.
+ 
+ 	* xterm.h (struct x_display_info): Replace elements `name'
+ 	and `face_list_cache' with one cons cell `name_list_element'.
+ 	(x_display_name_list): Variable declared.
+ 
+ Sat Oct 22 00:44:29 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* insdel.c (insert_from_buffer, insert_from_buffer_1): New functions.
+ 	* editfns.c (Finsert_buffer_substring): Use insert_from_buffer
+ 	instead of insert.
+ 
+ Fri Oct 21 23:17:22 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xmenu.c (xmenu_show): Get the screen number for DisplayHeight
+ 	and DisplayWidth.  Use root_window slot in the x_display_info.
+ 
+ 	* xfns.c (x_sync): Take frame ptr as arg.
+ 	* frame.c (other_visible_frames): Pass a frame ptr to x_sync.
+ 	* xterm.c (x_make_frame_visible, x_make_frame_invisible):
+ 	Pass a frame ptr to x_sync.
+ 
+ Fri Oct 21 22:52:16 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* insdel.c (insert_before_markers): Don't inherit;
+ 	insert_before_markers_and_inherit does that.
+ 
+ Fri Oct 21 03:06:38 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* dispnew.c (Fframe_or_buffer_changed_p):
+ 	Detect deletion of a buffer at the end of the buffer list.
+ 
+ 	* xterm.c (x_term_init): Init all the components of dpyinfo.
+ 
+ 	* sysdep.c (input_fd): No longer static.
+ 	* keyboard.c (read_avail_input): Use input_fd.
+ 
+ Thu Oct 20 20:45:32 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xfns.c (check_x_display_info): New function.
+ 	(Fx_create_frame): Use it.
+ 	(Fx_display_*, Fx_server_*): Use fields in the x_display_info,
+ 	not static variables.  Call check_x_display_info.
+ 
+ Thu Oct 20 15:06:33 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* window.c (Fdisplay_buffer): Make old_selected_window a Lisp_Object.
+ 
+ Thu Oct 20 11:49:26 1994  Tom Tromey  <tromey@drip.colorado.edu>
+ 
+ 	* buffer.c (list_buffers_1): Always mark current_buffer read-only.
+ 
+ Thu Oct 20 10:56:01 1994  Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
+ 
+ 	* m/dpx2.h (LD_SWITCH_MACHINE): Defined.
+ 
+ Thu Oct 20 00:36:46 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* term.c (calculate_costs): Call x_screen_planes.
+ 	* xfns.c (x_screen_planes): New function.
+ 
+ 	* xterm.h (EMACS_CLASS): Macro moved here.
+ 	* xfns.c (EMACS_CLASS): Macro moved to xterm.h.
+ 
+ 	* xfns.c (Qdisplay): New variable.
+ 	(syms_of_xfns): Set it up.
+ 	(Fx_create_frame): Handle display parameter
+ 	which says where to get the FRAME_X_DISPLAY_INFO.
+ 	(x_display_info_for_name): New function.
+ 
+ 	* xterm.c (x_display_info_for_display): New function.
+ 
+ 	* xselect.c (Xatom_*): Variables deleted.
+ 	Use slots in x_display_info structure instead.
+ 	(symbol_to_x_atom, x_atom_to_symbol):
+ 	New arg dpyinfo.  All callers changed.
+ 	(xatoms_of_xselect): Function deleted.
+ 
+ 	* xfns.c (select_visual): New arg dpy.
+ 
+ 	* xterm.h (struct x_display_info): New fields *_mod_mask.
+ 	* xterm.c (x_*_mod_mask): Variables deleted.
+ 	(x_x_to_emacs_modifiers, x_emacs_to_x_modifiers):
+ 	New arg dpyinfo; all callers changed.
+ 	Store the masks in that structure.
+ 
+ 	* xterm.h (struct x_display_info): New field icon_bitmap_id.
+ 	* xterm.c (icon_bitmap): Variable deleted.
+ 	(x_bitmap_icon): Use icon_bitmap_id in x_display_info.
+ 
+ 	* xterm.c (icon_font_info): Variable deleted.
+ 
+ 	* xterm.h (struct x_display_info): New field `connection'.
+ 	* xterm.c (x_term_init): Set up `connection' field.
+ 
+ 	* xterm.h (x_display_list): New variable.
+ 	* xterm.c (x_find_modifier_meanings):
+ 	Arg is now struct x_display_info *.
+ 	(x_term_init): Return an x_display_info *.
+ 	Store all the data in it, including X atoms and xrdb.
+ 	Put the x_display_info structure on x_display_list.
+ 	Pass name as Lisp_Object.
+ 	(the_x_screen): Variable moved here.
+ 	(syms_of_xterm): Staticpro parts of the_x_screen.
+ 	* xfns.c (Fx_open_connection): Get dpyinfo from x_term_init.
+ 	Don't set up atoms, xrdb here.	Pass name as Lisp_Object.
+ 	(the_x_screen): Variable moved to xterm.c.
+ 	(syms_of_xfns): Don't staticpro it here.
+ 
+ 	* xterm.h (struct x_display_info): New field xrdb.
+ 	* xfns.c (xrdb): Variable deleted.
+ 	(Fx_get_resource): Use selected_frame's xrdb.
+ 	(x_get_resource_string): Likewise.
+ 
+ 	* xterm.h (XExposeRegionEvent): Unused macro deleted.
+ 	(XGetWindowInfo, XGetFont, XLoseFont): Unused macros deleted.
+ 	(MINWIDTH, MINHEIGHT, MAXWIDTH, MAXHEIGHT): Unused macros deleted.
+ 	(MAX_FACES_AND_GLYPHS, Bitmap): Unused macros deleted.
+ 	(struct event_queue): Structure deleted (was unused).
+ 	(EVENT_BUFFER_SIZE): Macro deleted.
+ 
+ 	* xterm.h (XClear): Macro deleted.  Callers use XClearWindow.
+ 	(XWarpMousePointer): Macro deleted.  Callers use XWarpPointer.
+ 	(XStuffPending): Macro deleted.  Callers use XPending.
+ 	(XHandleError, XHandleIOError): Macros deleted.
+ 	Callers use XSet...ErrorHandler.
+ 	(XChangeWindowSize): Macro deleted.  Callers use XResizeWindow.
+ 	(Color): Macro deleted; replaced with XColor.
+ 	(FONT_TYPE): Macro deleted; replaced with XFontStruct.
+ 	(PIX_TYPE): Macro deleted; replaced with unsigned long.
+ 
+ 	* xterm.h (FRAME_X_SCREEN): New macro.
+ 	(WHITE_PIX_DEFAULT, BLACK_PIX_DEFAULT): Take arg f.
+ 	* xfaces.c (unload_color): Pass arg f to WHITE_PIX_DEFAULT
+ 	and BLACK_PIX_DEFAULT.
+ 
+ 	* xterm.c (windowinfo): Variable deleted.
+ 
+ 	* xterm.h (ROOT_WINDOW): Macro deleted.
+ 	(struct x_display_info): New field root_window.
+ 	All uses changed.
+ 
+ 	* xterm.h (XDISPLAY): Macro deleted.
+ 	(XFlushQueue): Macro deleted.  All callers changed.
+ 	(DISPLAY_SCREEN_ARG): Maco deleted.
+ 	(DISPLAY_CELLS): Macro deleted.
+ 	(WINDOWINFO_TYPE): Macro deleted.
+ 
+ 	* xterm.h (struct x_display_info): New fields Xatom...
+ 	* xterm.c (Xatom_*): Variables deleted.
+ 	(x_iconify_frame, XTread_socket): Get atoms from the x_display_info,
+ 
+ 	* xfns.c (Fx_open_connection): Store the atoms in x_display_info.
+ 	(hack_wm_protocols): New arg f.  Get atoms from x_display_info.
+ 	(x_window): Get atoms from x_display_info.
+ 
+ 	* xfns.c (Vmouse_depressed, mouse_buffer_offset): Variables deleted.
+ 	(syms_of_xfns): Delete Lisp variables too.
+ 	(Fx_synchronize): Take frame as arg.
+ 	(Fx_close_current_connection): Take frame as arg.   Error is not fatal.
+ 	* xterm.c (XTread_socket): Don't update Vmouse_depressed.
+ 
+ 	* xterm.h (struct x_display_info): New field grabbed.
+ 	* xterm.c (x_mouse_grabbed): Variable deleted.
+ 	(note_mouse_highlight): Use grabbed field instead.
+ 	(XTmouse_position, XTread_socket): Likewise.
+ 	* xmenu.c (xdialog_show, xmenu_show):
+ 	Use grabbed field instead of x_mouse_grabbed.
+ 
+ 	* xfns.c (mouse_timestamp): Variable deleted.
+ 
+ 	* xterm.h (struct x_display_info): Struct renamed from x_screen.
+ 	(x_display): x_screen field renamed to display_info.
+ 	(FRAME_X_DISPLAY): Use new name.
+ 	(FRAME_X_DISPLAY_INFO): Likewise; also renamed from FRAME_X_SCREEN.
+ 
+ 	* xterm.h (struct x_display_info):
+ 	New fields height, width, screen, visual, n_planes.
+ 	* xfns.c (screen_visual, x_screen_planes): Variables deleted.
+ 	(x_screen, x_screen_height, x_screen_width): Variables deleted.
+ 	(Fx_open_connection): Don't set them here.
+ 	Put that info in the x_display_info structure.
+ 	(x_window): Get the visual from x_display_info structure.
+ 	(x_decode_color): Use n_planes from x_display_info structure.
+ 	* xterm.c (x_calc_absolute_position, x_wm_set_size_hint):
+ 	Get screen height, width from the x_display_info structure.
+ 	* xmenu.c (xmenu_show): Use the screen in FRAME_X_DISPLAY_INFO,
+ 	not the default screen.
+ 
+ 	* xterm.c: Use FRAME_X_DISPLAY instead of x_current_display
+ 	and XDISPLAY.
+ 
+ 	* xfns.c: Use FRAME_X_DISPLAY instead of x_current_display
+ 	and XDISPLAY.
+ 	(x_in_use): New variable,
+ 	(check_x, using_x_p): Test x_in_use.
+ 	(Fx_open_connection): Set x_in_use.
+ 	(check_x_frame): New function.
+ 	(defined_color): New arg f specifies frame.  Callers changed.
+ 	(x_decode_color): New arg f.  All callers changed.
+ 	(Fx_color_values, Fx_color_defined_p): New arg FRAME.
+ 	Use check_x_frame.
+ 	(Fx_list_fonts): Use check_x_frame.
+ 
+ 	* keyboard.c (do_mouse_tracking): Now a FRAME_PTR.
+ 	(EVENT_QUEUES_EMPTY, Ftrack_mouse, tracking_off): Changed accordingly.
+ 	(kbd_buffer_get_event): Let do_mouse_tracking specify the display
+ 	for mouse tracking.
+ 
+ 	* minibuf.c (read_minibuf): Undo previous change.
+ 
+ Wed Oct 19 04:53:18 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* window.c (Fdisplay_buffer): If the other window is smaller
+ 	than its peer, even out their heights.
+ 
+ 	* xterm.c (x_catch_errors, x_check_errors, d_errors_p)
+ 	(x_uncatch_errors): Take frame as arg.
+ 	(x_stop_queuing_selection_requests, x_unqueue_events, x_queue_event)
+ 	(x_start_queuing_selection_requests): Take frame as arg.
+ 	(x_find_modifier_meanings): New arg `display'.  All callers changed.
+ 	(x_scroll_bar_create, x_scroll_bar_set_handle)
+ 	(x_scroll_bar_move): New local var f.
+ 	(x_scroll_bar_report_motion): Rename arg f to fp.
+ 	New local var f.
+ 	(XTmouse_position): Lossage.
+ 	(frame_highlight, frame_unhighlight): Arg frame renamed to f.
+ 
+ 	* callproc.c (child_setup): Always use _exit.
+ 
+ 	* xselect.c (x_own_selection, x_get_foreign_selection): Pass frame
+ 	to x_catch_errors, x_check_errors, x_uncatch_errors.
+ 
+ 	* xfns.c (x_set_mouse_color): Pass frame to x_catch_errors,
+ 	x_check_errors, x_uncatch_errors.
+ 
+ 	* xselect.c (x_get_foreign_selection): Get display from
+ 	selected_frame.  Pass frame to x_stop_queuing_selection_requests and
+ 	x_start_queuing_selection_requests.
+ 	(x_own_selection, Fx_disown_selection_internal, Fx_selection_exists_p)
+ 	(Fx_store_cut_buffer_internal, Fx_get_cut_buffer_internal)
+ 	(Fx_rotate_cut_buffers_internal): Get display from selected_frame.
+ 
+ 	* xmenu.c: Use FRAME_X_DISPLAY, not XDISPLAY or x_current_display.
+ 	(menu_item_equiv_key): Reject equiv sequences
+ 	that start with mouse clicks.
+ 
+ Wed Oct 19 00:26:03 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* search.c: (searchbufs): New variable, replaces searchbuf and
+ 	last_regexp and search_fastmap.
+ 	(syms_of_search): Initialize it.
+ 	(searchbuf_head): New variable.
+ 	(compile_pattern_1): Renamed from compile_pattern and made static.
+ 	Copy the regexp string in case the caller modifies it in place later.
+ 	(compile_pattern): New code, uses a cached entry if one is available.
+ 	The pattern buffer is now a return value instead of an arg.
+ 	(set_search_regs): Set num_regs directly, since there's no active
+ 	pattern buffer to pass to re_set_registers.
+ 	(Fstore_match_data): Likewise.
+ 	(Flooking_at): Use the new calling convention for compile_pattern.
+ 	(Fstring_match, fast_string_match, search_buffer): Likewise.
+ 	* dired.c (Fdirectory_files): Likewise.
+ 
+ Tue Oct 18 16:34:10 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* keyboard.c (Voverriding_local_map_menu_flag): New variable.
+ 	(syms_of_keyboard): Set up Lisp var.
+ 	(menu_bar_items): Obey Voverriding_local_map_menu_flag.
+ 
+ 	* ralloc.c (struct heap): New fields first_bloc, last_bloc.
+ 	(struct bp): New field heap.
+ 	(get_bloc, free_bloc, obtain, r_alloc_sbrk): Update new fields.
+ 	(reorder_bloc): New function.
+ 	(update_heap_bloc_correspondence):
+ 	Renamed from update_heap_free_pointers.  Update new fields.
+ 	(relinquish): Add error check for new fields.
+ 
+ 	* Makefile.in.in (SOME_MACHINE_OBJECTS): Add msdos.o and x*.o files.
+ 
+ Mon Oct 17 21:28:13 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* minibuf.c (read_minibuf): Store the object, not the string, into
+ 	the history variable.
+ 
+ 	* xfns.c (x_set_unsplittable): New function.
+ 	(x_frame_parms): Add that function to the table.
+ 
+ 	* xterm.c (do_line_dance): Decrement index only once per loop.
+ 
+ 	* scroll.c (do_line_insertion_deletion_costs): Fix argument order.
+ 
+ Mon Oct 17 04:43:21 1994  Morten Welinder  <terra@mole.gnu.ai.mit.edu>
+ 
+ 	* fileio.c (Fexpand_file_name) [MSDOS]: Correct the for absolute
+ 	default directory.
+ 
+ 	* config.h.in [HAVE_X_WINDOWS]: #define HAVE_FACES and HAVE_MOUSE.
+ 
+ 	* dispextern.h: Guard entire file from being include more than once.
+ 	[MSDOS]: Include msdos.h.
+ 
+ 	* dispnew.c (direct_output_for_insert): Check HAVE_FACES, not
+ 	HAVE_X_WINDOWS.
+ 	(selected_frame, last_minibuffer_frame): Doc fix.
+ 
+ 	* dosfns.c (Fset_mouse_position, Fmsdos_mouse_p) [!HAVE_X_WINDOWS]:
+ 	New functions.
+ 	(syms_of_dosfns) [!HAVE_X_WINDOWS]: Defsubr them.  Also define
+ 	Qmsdos_color_translate.
+ 	(init_dosfns) [SYSTEM_MALLOC]: Don't call non-existing get_lim_data.
+ 
+ 	* dosfns.h (Qmsdos_color_translate) [!HAVE_X_WINDOWS]: New variable.
+ 
+ 	* editfns.c (init_editfns) [MSDOS]: Let the user name default to
+ 	"root".
+ 
+ 	* emacs.c (main) [MSDOS && !HAVE_X_WINDOWS]: Call syms_of_xfaces
+ 	and syms_of_xmenu.
+ 
+ 	* frame.c [MSDOS]: Include msdos.h.
+ 	(Fframep #1) [MSDOS]: Doc change for the following.
+ 	(Fframep #2) [MSDOS]: Return 'pc for when termcap is not used.
+ 	(Fmouse_position #2) [HAVE_MOUSE]: Return useful information.
+ 	(Fframe_parameters #2): Show "font" as "default".
+ 	(Fframe_parameters #2) [MSDOS]: Show fore- and background colours.
+ 	(Fmodify_frame_parameters #2) [MSDOS]: Call IT_set_frame_parameters.
+ 	(Fframe_list #2): New stub function.
+ 	(syms_of_frame #2): defsubr frame_list.
+ 	(syms_of_frame #2) [MSDOS]: Initialize the_only_frame.
+ 	(Fselected_frame #2): Doc fix.
+ 
+ 	* frame.h [!MULTI_FRAME]: We give up having selected_frame be
+ 	an always-zero integer variable.  From now on it will be a
+ 	pointer to a `struct frame' just like in the MULTI_FRAME case.
+ 	(selected_frame, last_nonminibuf_frame): use FRAME_PTR,	not EMACS_INT.
+ 	(XFRAME): Redefine to use the_only_frame.
+ 	(XSETFRAME): Define to set Lisp value.
+ 	(WINDOW_FRAME): Redefine to return Lisp value.
+ 	(FOR_EACH_FRAME): Set the frame variable to Lisp value.
+ 	(output_method): New method: output_msdos_raw.
+ 	(FRAME_TERMCAP_P, FRAME_X_P) [MSDOS]: Define non-stub versions.
+ 
+ 	* keyboard.c (read_char_x_menu_prompt): Include menu code also in
+ 	case MSDOS.
+ 	(gobble_input): Complete Sep 15 change.
+ 
+ 	* lisp.h: #define glyph-stuff when HAVE_FACES, not only when
+ 	HAVE_X_WINDOWS.
+ 	(FRAMEP): Define different versions for MULTI_FRAME and MSDOS.
+ 	Otherwise, don't define at all.
+ 
+ 	* makefile.in.in (MSDOS_SUPPORT): Add faces.elc.
+ 	(msdos.o, dosfns.o): Add dependencies.
+ 	(MSDOS_OBJ): New set of object files.
+ 	(obj): Include MSDOS_OBJ.
+ 
+ 	* msdos.c: #include dispextern.h, termopt.h, and window.h needed
+ 	for the following.
+ 	(highlight): New variable.
+ 	(rien_du_tout, IT_ring_bell, IT_set_face, IT_write_glyphs,
+ 	IT_clear_end_of_line, IT_cursor_to, IT_reassert_line_highlight,
+ 	IT_change_line_highlight, IT_update_begin, IT_set_menu_bar_lines,
+ 	IT_set_frame_parameters): New functions like their XT_* counterparts.
+ 	(internal_terminal_init): Initialize Vwindow_system,
+ 	Vwindow_system_version, the_only_x_display, and terminal hooks.
+ 	(mouse_get_xy): New function.
+ 	(mouse_get_pos, mouse_check_moved): Use mouse_get_xy.
+ 	(IT_menu_create, IT_menu_make_room, IT_menu_search_pane,
+ 	IT_menu_calc_size, IT_menu_display, XMenuCreate, XMenuAddPane,
+ 	XMenuAddSelection, XMenuLocate, XMenuActivate, XMenuDestroy,
+ 	x_pixel_width, x_pixel_height): New functions.
+ 	(init_environment) [HAVE_X_WINDOWS]: Let DISPLAY default to "unix:0.0".
+ 	(init_environment): Handle the case of a relative argv[0].
+ 	(dos_rawgetc): Use XSETFRAME.
+ 	(the_only_x_display, x_current_display) [!HAVE_X_WINDOWS]: New
+ 	variables.
+ 
+ 	* msdos.h: (XFontStruct, GC, Pixmap, Display, Window) [MSDOS_NO_X]:
+ 	Dummy types.
+ 	(struct face, FACE_HAS_GC, FACE_GC, FACE_FOREGROUND, FACE_BACKGROUND,
+ 	FACE_FONT, FACE_STIPPLE, FACE_UNDERLINE_P) [MSDOS_NO_X]: Define like
+ 	corresponding X-versions.
+ 	(struct x_display) [MSDOS_NO_X]: Define cut-down version.
+ 	(FRAME_PARAM_FACES, FRAME_N_PARAM_FACES, FRAME_DEFAULT_PARAM_FACE,
+ 	FRAME_MODE_LINE_PARAM_FACE, FRAME_COMPUTED_FACES,
+ 	FRAME_N_COMPUTED_FACES, FRAME_SIZE_COMPUTED_FACES, FRAME_DEFAULT_FACE,
+ 	FRAME_MODE_LINE_FACE, x_current_display, XFreeGC, same_size_fonts,
+ 	unload_font, unload_color, XGetGeometry, DisplayWidth,
+ 	DisplayHeight, XMenuSetAEQ, XMenuSetFreeze, XMenuRecompute,
+ 	FONT_WIDTH, check_x, ButtonReleased) [MSDOS_NO_X]: Define suitable
+ 	stubs.
+ 	(XM_FAILURE, XM_SUCCESS, XM_NO_SELECT, XM_IA_SELECT) [MSDOS_NO_X]:
+ 	Define like old-x-menu versions.
+ 	Guard the entire file from being included more than once.
+ 	(internal_flush): Correct guarding conditional.
+ 	Don't include <time.h>.
+ 
+ 	* puresize.h (SYSTEM_PURESIZE_EXTRA): Default to 0.
+ 	(BASE_PRESIZE): Increase by SYSTEM_PURESIZE_EXTRA.
+ 
+ 	* s/msdos.h: #define HAVE_FACES.
+ 	(LIBX11_SYSTEM, HAVE_X11R5) [HAVE_X_WINDOWS]: Define.
+ 	(PURESIZE): Don't define.
+ 	(SYSTEM_PURESIZE_EXTRA): Define.
+ 
+ 	* sysdep.c (init_sys_modes): Make sure that internal_terminal_init
+ 	is only called once.
+ 	(init_sys_modes, reset_sys_modes) [HAVE_X_WINDOWS]: Add conditional.
+ 	(reset_sys_modes) [MSDOS]: Change to MSDOG's default colours.
+ 	(kbd_input_ast): Use just XSETFRAME.
+ 
+ 	* window.c (init_window_once) [!MULTI_FRAME]: Set selected_frame and
+ 	last_nonminibuf_frame once and for all.
+ 
+ 	* xdisp.c (redisplay, copy_part_of_rope, fix_glyph,
+ 	display_text_line, display_mode_line): Check HAVE_FACES, not
+ 	HAVE_X_WINDOWS.
+ 
+ 	* xfaces.c: Guard the file by HAVE_FACES, not HAVE_X_WINDOWS.
+ 	[MSDOS]: Include dosfns.h needed for the following.
+ 	[!HAVE_X_WINDOWS]: Don't #include xterm.h or Xos.h.
+ 	[!HAVE_X_WINDOWS] (intern_face, clear_face_cache, load_font,
+ 	load_color, unload_color, Fpixmap_spec_p, load_pixmap,
+ 	same_size_fonts, frame_update_line_height): Don't define.
+ 	[!HAVE_X_WINDOWS] (intern_face, clear_face_cache, build_face): Define
+ 	stubs.
+ 	(load_color) [MSDOS && !HAVE_X_WINDOWS]: Special version.
+ 	(Fset_face_attribute_internal) [MSDOS && !HAVE_X_WINDOWS]: Stubify
+ 	font setting, mask away 0x08 (the blink bit) from background colour.
+ 	(syms_of_xfaces) [!HAVE_X_WINDOWS]: Don't defsubr Spixmap_spec_p.
+ 	(Fmake_face_internal): Use FOR_EACH_FRAME.
+ 	(init_frame_faces): Guard multi-frame stuff with MULTI_FRAME.
+ 
+ 	* xmenu.c [!HAVE_X_WINDOWS]: Don't #include xterm.h.
+ 	[!HAVE_X_MENU]: Don't #include XMenu.h.
+ 	(xmenu_show, xdialog_show) [!HAVE_X_WINDOWS]: We don't need the
+ 	button hack for msdos.
+ 	(xmenu_show) [!HAVE_X_WINDOWS]: Don't adjust coordinates with
+ 	respect to the (non-existing) outer window manager.
+ 
+ 	* xterm.c (x_term_init) [!subprocesses]: Don't set input descriptor.
+ 
+ 
+ Mon Oct 17 02:44:30 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xfaces.c (intern_face): Update mask properly to set stipple
+ 	and fill_style.  Set everything all at once in XCreateGC.
+ 
+ 	* window.c (Fdisplay_buffer): In desperation case of looking for
+ 	something to split, verify that a window's frame is splittable.
+ 
+ Sun Oct 16 21:16:38 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* Makefile.in.in (xfns.o): Depend on paths.h.
+ 
+ 	* xfns.c: Include paths.h.
+ 
+ Sun Oct 16 07:06:52 1994  Morten Welinder  <terra@mole.gnu.ai.mit.edu>
+ 
+ 	* editfns.c (Fuser_login_name): Optional argument uid decides
+ 	which user's login name to return.
+ 
+ Sun Oct 16 01:57:47 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xterm.c (dumpglyphs): Explicitly draw background stipple.
+ 
+ 	* xfaces.c (intern_face): Set the fill_style.
+ 
+ 	* paths.h.in (PATH_BITMAPS): New macro.
+ 
+ 	* xterm.c (x_bitmap_icon): Arg FILE is now a Lisp_Object.
+ 	(x_iconify_frame, x_make_frame_visible): Supply FILE arg to it.
+ 	* xfns.c (x_set_icon_type): Pass x_bitmap_icon 2nd arg as Lisp_Object.
+ 	(x_icon_type): Return a Lisp_Object.
+ 
+ 	* xfns.c (x_destroy_bitmap, x_reference_bitmap): Take frame as arg.
+ 	Callers changed.
+ 	(struct x_bitmap_record): New fields height, width, depth.
+ 	(x_create_bitmap_from_data): Fill in those fields.
+ 	(x_bitmap_height, x_bitmap_width, x_bitmap_pixmap): New functions.
+ 	(x_create_bitmap_from_file): Arg FILE is now a Lisp_Object.
+ 	Search Vbitmap_file_path for it.  Fill in new fields.
+ 	(syms_of_xfns): Set up Vbitmap_file_path.
+ 
+ 	* xterm.c (x_bitmap_icon): Properly discard the previous bitmap.
+ 	(x_text_icon): Discard bitmap only if we have one.
+ 
+ 	* xfaces.c (copy_face, merge_faces): Copy the pixmap_h and pixmap_w.
+ 	(intern_face): Store the stipple in the GC.
+ 	(unload_color): Really do free the color.
+ 	(free_frame_faces): Call unload_pixmap.
+ 	(Fset_face_attribute_internal): Handle background pixmap.
+ 	Destroy old pixmap when necessary.
+ 	(free_frame_faces): Destroy pixmaps.
+ 	(load_pixmap): New function.
+ 	(Fpixmap_spec_p): New function.
+ 	(syms_of_xfaces): Set up Lisp function pixmap-spec-p.
+ 	Set up Qpixmap_spec_p.
+ 
+ 	* dispextern.h (struct face): Delete cached_index field.
+ 	* xfaces.c (compute_base_face): Don't set cached_index field.
+ 
+ 	* ralloc.c (heap_base): Move static var to top level.
+ 	(struct heap): New slot `free'.
+ 	(obtain): Set `free' for new heap.
+ 	(get_bloc): Update `free'.
+ 	(find_heap): New function.
+ 	(update_heap_free_pointers): New function.
+ 	(resize_bloc, r_alloc_sbrk): Call update_heap_free_pointers.
+ 
+ Sat Oct 15 19:46:29 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* lread.c (load_unwind): Cast argument of fclose.
+ 
+ 	* xmenu.c: Delete HAVE_X11 conditionals.
+ 
+ 	* xfaces.c (compute_base_face): Use FRAME_FOREGROUND_PIXEL,
+         FRAME_BACKGROUND_PIXEL, FRAME_FONT.
+ 
+ 	* xterm.h (FRAME_FOREGROUND_PIXEL, FRAME_BACKGROUND_PIXEL)
+ 	(FRAME_FONT): New macros.
+ 
+ Sat Oct 15 20:44:50 1994  Tom Tromey  <tromey@drip.colorado.edu>
+ 
+ 	* xterm.c (x_bitmap_icon): Allow bitmap to come from file.
+ 	(x_wm_set_icon_pixmap): Second arg is now pixmap_id;
+ 	call x_lookup_pixmap.
+ 	(x_text_icon): Call x_destroy_bitmap.
+ 
+ 	* xfns.c (x_set_icon_type): If icon-type is a string, then use
+ 	bitmap from that file.
+ 	(Fx_create_frame): Set icon_bitmap field to -1.
+ 	(struct x_bitmap_record): New structure type.
+ 	(x_bitmaps, x_bitmaps_size, x_bitmaps_last, x_bitmaps_free):
+ 	New variables.
+ 	(x_allocate_bitmap_record): New function.
+ 	(x_reference_bitmap, x_create_bitmap, x_create_bitmap_from_file)
+ 	(x_destroy_bitmap, x_lookup_pixmap): New functions.
+ 
+ 	* xterm.h (x_display): Changed icon_bitmap_flag to icon_bitmap.
+ 	Changed all users.
+ 
+ Sat Oct 15 15:55:25 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* textprop.c (Fset_text_properties): Special case for getting
+ 	rid of all properties of a string.
+ 
+ Sat Oct 15 00:00:27 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* xterm.c (stuffline, scraplines): Functions deleted.
+ 	(line_dance, line_dance_len, line_dance_in_progress): New vars.
+ 	(XTins_del_lines): Don't do any X calls; just update the array.
+ 	(do_line_dance): New function.  Do the X calls here.
+ 	(XTupdate_end, XTwrite_glyphs): Call do_line_dance.
+ 
+ Fri Oct 14 00:44:48 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* s/isc4-0.h (LIBS_SYSTEM): Add -lcposix.
+ 	(sigblock, SIG_BLOCK): Define if not defined.
+ 
+ 	* sysdep.c (read_input_waiting): Set e.frame_or_window w/ XSETFRAME.
+ 
+ 	* xterm.c (x_new_font): Don't keep looping after the FONT property.
+ 
+ Thu Oct 13 22:41:07 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* term.c (term_get_fkeys_1): Workaround for IBM's dialect of terminfo.
+ 
+ Thu Oct 13 02:21:03 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xfns.c (Fx_create_frame): Init the FRAME_X_SCREEN
+ 	as soon as can be done.
+ 
+ 	* xdisp.c (redisplay): Call clear_face_cache instead
+ 	of clear_face_vector.  Do it at most once per 1000 redisplays.
+ 
+ 	* xfaces.c: Eliminate the "display faces"; store GCs in the
+ 	"computed faces".
+ 	(face_vector, nfaces, nfaces_allocated): Vars deleted.
+ 	(free_frame_faces): Free GCs in the computed faces.
+ 	Free the computed faces themselves.
+ 	(clear_face_cache): Renamed from clear_face_vector
+ 	and completely rewritten to free GCs in the computed faces.
+ 	(get_cached_face): Function deleted.
+ 	(build_face): Function deleted; code moved into intern_face.
+ 	(intern_face): Don't treat default and modeline faces specially.
+ 	(recompute_basic_faces): Call intern_face, not build_face.
+ 
+ 	* xfaces.c (intern_face, clear_face_vector, load_font, unload_font)
+ 	(load_color, free_frame_faces, recompute_basic_faces):
+ 	Use FRAME_X_DISPLAY.
+ 
+ 	* m/mips-siemens.h (C_ALLOCA): Defined.
+ 	(HAVE_ALLOCA): Definition deleted.
+ 
+ 	* editfns.c (Fuser_login_name, Fuser_real_login_name):
+ 	Call init_editfns now if it was not done before.
+ 
+ 	* puresize.h (BASE_PURESIZE): Incremented.
+ 
+ 	* lisp.h (Funhandled_file_name_directory): Declared.
+ 
+ Mon Oct 10 11:58:00 1994  Rainer Schoepf  (Schoepf@Uni-Mainz.de)
+ 
+ 	* unexalpha.c (Brk): Declare as unsigned long.
+ 	(unexec): Do CHECH_SCNHDR on _RCONST if that's defined.
+ 	Ignore rdata_section if there is none.
+ 	(update_dynamic_symbols): New arg new_name.  Call changed.
+ 	Fix some calls to WRITE.
+ 	(fatal_unexec): Declare all arguments.
+ 
+ Wed Oct 12 19:27:27 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* unexelf.c: Include config.h.
+ 
+ 	* s/freebsd.h (LD_SWITCH_SYSTEM): New definition.
+ 
+ Tue Oct 11 20:41:25 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* lisp.h (enum Lisp_Misc_Type): Add new enumerations
+ 	Lisp_Misc_Intfwd, Lisp_Misc_Boolfwd, Lisp_Misc_Objfwd,
+ 	Lisp_Misc_Buffer_Objfwd.
+ 	(enum Lisp_Type): Delete the corresponding enumerations from here.
+ 	(struct Lisp_Buffer_Objfwd): New structure.
+ 	(struct Lisp_Intfwd, struct Lisp_Boolfwd, struct Lisp_Objfwd): Ditto.
+ 	(XINTFWD, XBOOLFWD, XOBJFWD, XBUFFER_OBJFWD): Access the new structure.
+ 	(INTFWDP, BOOLFWDP, OBJFWDP, BUFFER_OBJFWDP): Ditto.
+ 	(XSETINTFWD, XSETBOOLFWD, XSETOBJFWD, XSETBUFFER_OBJFWD): Deleted.
+ 	(union Lisp_Misc): Add new members.
+ 	(allocate_misc): Declare this function.
+ 	(XINTPTR): Deleted.
+ 	* alloc.c (mark_object): Use the new substructure.
+ 	* buffer.c (buffer_slot_type_mismatch): Take just the offset as
+ 	argument.  Only check against types that are actually used.
+ 	* bytecode.c (Fbyte_code): Skip optimization for all Lisp_Misc types.
+ 	* data.c (do_symval_forwarding, store_symval_forwarding,
+ 	find_symbol_value, Fset, default_value, Fset_default,
+ 	Fkill_local_variable): Use the new substructure.
+ 	(store_symval_forwarding): Change args to buffer_slot_type_mismatch.
+ 	* lread.c (defvar_int, defvar_bool, defvar_lisp,
+ 	defvar_lisp_nopro, defvar_per_buffer): Use the new substructure.
+ 
+ 	* minibuf.c (test_completion): Fix reversed condition.
+ 
+ 	* ralloc.c: Install Hiroshi Nakano's rewrite to allow multiple
+ 	heaps, for implementations where the C library makes calls to
+ 	sbrk directly.
+ 
+ Tue Oct 11 15:38:19 1994  Jim Blandy  <jimb@geech.gnu.ai.mit.edu>
+ 
+ 	* search.c (scan_buffer): After temporarily turning immediate_quit
+ 	off, turn it back on by setting it to allow_quit, never 1.
+ 
+ 	* search.c (find_before_next_newline): Declare the arguments'
+ 	types explicitly; don't let them default to int.
+ 
+ 	* xdisp.c (display_scan_buffer): Pass the correct number of
+ 	arguments to scan_buffer.
+ 
+ Tue Oct 11 03:05:17 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* keyboard.c (read_key_sequence): The output of function-key-map
+ 	goes to key-translation-map, but not vice versa.
+ 	Don't exit if either of them is a possibility.
+ 
+ Tue Oct 11 02:10:44 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* lisp.h (Lisp_Misc): new type code, replacing Lisp_Marker (and
+ 	soon to replace other type codes as well).
+ 	(XMARKER, SETMARKER, MARKERP): Check/set the new type field.
+ 	(XMISC, SETMISC, MISCP): New accessor macros for the superset type.
+ 	(struct Lisp_Free): New structure.
+ 	(Lisp_Misc_Free): Type code for that structure.
+ 	* buffer.h (OVERLAY_POSITION): Marker assert now tests substructure.
+ 	* alloc.c: (MARKER_BLOCK_SIZE, marker_block, marker_free_list):
+ 	Now refers to the superset type, not just markers.
+ 	(allocate_misc): New function, extracted from Fmake_marker.
+ 	(Fpurecopy): Check the substructure.
+ 	(clear_marks, mark_object, gc_sweep): Likewise.
+ 	* buffer.c (buffer_slot_type_mismatch): Test against Lisp_Misc.
+ 	* fns.c (internal_equal): Check the substructure.
+ 	* print.c (print): Check the substructure.
+ 
+ Mon Oct 10 21:44:18 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* sysdep.c (sys_subshell): Use NILP macro directly, not its
+ 	expansion.  Previous code was leftover from when NULL was a bad
+ 	word.
+ 
+ Mon Oct 10 17:29:59 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* fileio.c (Finsert_file_contents): Use original unexpanded
+ 	FILENAME arg to set buffer-file-name.
+ 
+ 	* buffer.c (list_buffers_1): Fix indentation in header lines.
+ 
+ 	* xdisp.c (redisplay_window): Fix Oct 1 change:
+ 	don't call cancel_my_columns unless we will call try_window.
+ 
+ Mon Oct 10 12:02:15 1994  Jim Blandy  <jimb@geech.gnu.ai.mit.edu>
+ 
+ 	* buffer.c (syms_of_buffer): Doc fix for cache-long-line-scans.
+ 
+ Mon Oct 10 01:07:44 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* syntax.c (scan_sexps_forward): At startincomment,
+ 	do notice a 2-char comment ender that straddles FROM.
+ 
+ Sun Oct  9 17:47:37 1994  Jim Blandy  <jimb@geech.gnu.ai.mit.edu>
+ 
+         Cache the results of some scans, to improve performance in buffers
+         containing very long lines.
+         * region-cache.c, region-cache.h: New files.
+         * Makefile.in.in (obj) Add region-cache.o to the list of files.
+         (region-cache.o): New target.
+         (buffer.o, indent.o, search.o): Depend on region-cache.h.
+         * buffer.h (struct buffer): New members: newline_cache,
+         width_run_cache, width_table, and cache_long_line_scans.
+         * buffer.c: #include region-cache.h.
+         (Fget_buffer_create): Initialize new members of struct buffer.
+         (Fkill_buffer): Free memory occupied by caches.
+         (init_buffer_once): Set default value for cache_long_line_scans in
+         buffer_defaults, and give it a bit in buffer_local_flags.
+         (syms_of_buffer): Add DEFVAR_PER_BUFFER for cache_long_line_scans.
+         * insdel.c (prepare_to_modify_buffer): Invalidate width run and
+         newline caches, if they exist.
+         * search.c: #include "region-cache.h".
+         (max, min): Make these functions, not macros; we'd like to pass
+         them arguments that would be bad to evaluate more than once.
+         (newline_cache_on_off): New function.
+         (scan_buffer): New argument END.  Call newline_cache_on_off.  If
+         this buffer's newline cache is enabled, consult it to see if we
+         need to scan a region for newlines, and store information in the
+         cache after doing so.
+         (find_next_newline): Pass new arg to scan_buffer.
+         (find_before_next_newline): New function.
+         * cmds.c (Fforward_line): Call scan_buffer with new args.
+         (Fend_of_line): Replace call to Fforward_line and search loop with
+         call to find_before_next_newline.
+         * syntax.c (find_defun_start): Call scan_buffer with new args.
+         * indent.c: #include "region-cache.h".
+         (character_width, disptab_matches_widthtab, recompute_width_table,
+         width_run_cache_on_off): New functions.
+         (compute_motion): Call width_run_cache_on_off.  If this buffer's
+         width run cache is enabled, consult it to see if we need to
+         traverse a region character-by-character; store information in the
+         cache after doing so.  Call find_before_next_newline instead of
+         writing out an equivalent loop explicitly, to take advantage of
+         the newline cache.
+         Doc fixes.
+         * xdisp.c (redisplay_window): Invalidate width_run_cache, if the
+         buffer's display table doesn't match the width table the cache was
+         built for.
+         (display_text_line): Use compute_motion to skip forward to the
+         left edge of the window when the window is hscrolled; this is
+         faster than rendering all the characters into the bit bucket when
+         the hscroll is large.
+         Doc fixes.
+         (display_count_lines): Call scan_buffer with new args.
+         * disptab.h (window_display_table): Doc fix.
+         (buffer_display_table): New declaration.
+         * indent.h (disptab_matches_widthtab, recompute_width_table): New
+         declarations.
+ 
+ Sat Oct  8 00:28:16 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* keyboard.c (inhibit_local_menu_bar_menus): New variable.
+ 	(read_char_x_menu_prompt): Optionally don't use local maps.
+ 	(syms_of_keyboard): Set up Lisp variable.
+ 
+ Fri Oct  7 17:42:10 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* lisp.h (enum Lisp_Misc_Type): New type.
+ 	(struct Lisp_Marker): Add a member of that type.  Delete unused
+ 	member `modified'.
+ 
+ Fri Oct  7 09:51:47 1994  Morten Welinder  <terra@frigg.diku.dk>
+ 
+ 	* minibuf.c (test_completion): New function, extracted from
+ 	do_completion.
+ 	(do_completion): Use test_completion.
+ 	(Fminibuffer_complete_and_exit): If completion is already
+ 	exact, don't try to complete it.
+ 
+ 	* dired.c (file_name_completion): Ignore files "." and ".."
+ 	in first pass.
+ 	(Ffile_name_completion): Perform the completion even if the
+ 	name part is empty.
+ 
+ Fri Oct  7 04:35:31 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* insdel.c (make_gap): Keep input blocked till after we set BEG_ADDR.
+ 
+ 	* fileio.c (check_writable, check_executable): Test HAVE_EACCESS.
+ 
+ 	* config.h.in (HAVE_EACCESS): Add #undef.
+ 
+ Thu Oct  6 17:21:29 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* alloc.c (mark_object): Don't check for Lisp_Void; nothing ever
+ 	creates that type.
+ 	* bytecode.c (Fbyte_code): Likewise.
+ 	* data.c (Fboundp, Ffboundp, find_symbol_value, Fset,
+ 	Fdefault_boundp, Fdefault_value): Likewise.
+ 	* lisp.h (Lisp_Void, VOIDP): Deleted.
+ 
+ 	* floatfns.c (Fabs): Don't use XFASTINT when negative.
+ 	* data.c (Flsh, Fadd1, Fsub1, Flognot): Likewise.
+ 
+ 	* buffer.c (init_buffer_once): Don't use XSETFASTINT when negative.
+ 	(reset_buffer_local_variables, Fbuffer_local_variables): Access
+ 	buffer_local_flags as Lisp_Object, not int.
+ 	* data.c (Fset, default_value, Fset_default,
+ 	Fkill_local_variable): Likewise.
+ 	* lread.c (defvar_per_buffer): Likewise.
+ 	Give XSETBUFFER_OBJFWD an integer offset, not a pointer.
+ 
+ 	* lread.c (read1): New argument for returning out-of-band data,
+ 	obviating the need for Lisp_Internal datatype.
+ 	(read0, read1, read_list): Use that new calling sequence.
+ 	* lisp.h (Lisp_Internal, XSETINTERNAL, INTERNALP): Deleted.
+ 
+ 	* lread.c (Fload, load_unwind): Store stream pointer as a cons of
+ 	two integers, obviating the need for Lisp_Internal_Stream datatype.
+ 	* lisp.h (Lisp_Internal_Stream, XSETINTERNAL_STREAM,
+ 	INTERNAL_STREAMP): Deleted.
+ 	* alloc.c (mark_object): Delete case Lisp_Internal_Stream.
+ 
+ Wed Oct  5 01:49:26 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* unexec.c (make_hdr): Undo June 16 change.
+ 
+ 	* fileio.c (Ffile_regular_p): New function.
+ 	(syms_of_fileio): defsubr it.
+ 
+ 	* xterm.c (x_term_init): Call XtSetLanguageProc or XSetLocaleModifiers.
+ 
+ Tue Oct  4 18:55:23 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xfns.c (x_set_icon_type): Remove period from error message.
+ 
+ 	* xterm.c (x_make_frame_visible, x_iconify_frame):
+ 	Call x_bitmap_icon if frame wants a bitmap icon.
+ 
+ 	* xfns.c (x_icon_type): New function.
+ 
+ 	* callint.c (Finteractive): Doc fix.
+ 
+ Tue Oct  4 06:06:48 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* buffer.c (validate_region): Swap using temp Lisp_Object, not int.
+ 
+ 	* lisp.h (XSETINT): Set object type as well as value.
+ 	(XSETCONS, XSETBUFFER, XSETVECTOR, XSETSUBR, XSETSTRING,
+ 	XSETSYMBOL, XSETMARKER, XSETOBJFWD, XSETWINDOW, XSETPROCESS,
+ 	XSETFLOAT): Likewise.
+ 	(XSETBOOLFWD, XSETBUFFER_OBJFWD, XSETWINDOW_CONFIGURATION,
+ 	XSETINTERNAL_STREAM, XSETINTFWD, XSETINTERNAL): New macros.
+ 	(XSETUINT, XSETPNTR, XFUNCTION, XSETFUNCTION, XSETINTPTR): Deleted.
+ 
+ 	* frame.h (XSETFRAME): Set object type as well as value.
+ 	* m/alpha.h, m/gec63.h, m/hp800.h, m/iris4d.h, m/iris5d.h, m/mips.h:
+ 	Don't override the (new) definition of XSETINT from lisp.h.
+ 	Delete XSETUINT and XSETPNTR, which are no longer used.
+ 	* *.c: Use new accessor macros instead of calling XSET directly.
+ 	* xterm.h (SCROLL_BAR_UNPACK): Likewise.
+ 	* fns.c (Fstring_equal): No longer necessary to set type separately.
+ 	(Fstring_lessp): Likewise.
+ 	* callint.c (Fprefix_numeric_value): Likewise.
+ 	* fileio.c (Finsert_file_contents): Likewise.
+ 
+ 	* lisp.h (XSETFASTINT): New macro.
+ 	(XFASTINT): Changed to non-lvalue syntax, to ensure that callers
+ 	will use XSETFASTINT instead.
+ 	(CHECK_NUMBER_COERCE_MARKER): Don't use XFASTINT as an lvalue.
+ 	(CHECK_NUMBER_OR_FLOAT_COERCE_MARKER): Likewise.
+ 	* *.c: Likewise.
+ 	* frame.h (FOR_EACH_FRAME): Likewise.
+ 
+ Tue Oct  4 00:47:57 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* Makefile.in.in (MKTIME_OBJ): New variable.
+ 	(obj): Use MKTIME_OBJ.
+ 
+ 	* config.h.in (HAVE_MKTIME): Add #undef.
+ 
+ 	* xmenu.c (widget_id_tick): Move definition into conditional.
+ 	(syms_of_xmenu): Conditionalize initialization of widget_id_tick.
+ 
+ 	* xmenu.c (last_menu_bar_item_end): Var deleted.
+ 	(this_menu_bar_item_beg, this_menu_bar_item_end): Vars deleted.
+ 	(other_menu_bar_item_p, unread_menu_bar_button)
+ 	(check_mouse_other_menu_bar): Functions deleted.
+ 	(last_event_timestamp, Vdouble_click_time, Vmouse_depressed):
+ 	Decls deleted.
+ 	(xmenu_show): XMENU_FOO conditional and its contents deleted.
+ 
+ 	* xterm.c (input_signal_count): New variable.
+ 	(XTread_socket): Increment it.
+ 	(x_make_frame_visible): Exit final loop when XTread_sockets has run.
+ 
+ Sun Oct  2 17:28:26 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* window.c (Frecenter): Don't trigger point-motion hooks.
+ 
+ 	* fileio.c (Finsert_file_contents): set type of `end', not just
+ 	the value.
+ 
+ 	* xfns.c (x_figure_window_size): Use new formula for scroll bar width.
+ 
+ 	* config.h.in (HAVE_UTIME_H): Add #undef.
+ 	* systime.h: Don't include <utime.h> here.
+ 	* sysdep.c: Include it here instead.
+ 	(set_file_times): Move struct declaration to top of file.
+ 
+ Sun Oct  2 17:24:08 1994  Paul Reilly  <pmr@churchy.gnu.ai.mit.edu>
+ 
+ 	* xmenu.c (popup_get_selection): Remove BLOCK_INPUT, UNBLOCK_INPUT
+ 	since the calls to popup_get_selection provide the protection.
+ 
+ Sun Oct  2 08:27:06 1994  Paul Reilly  <pmr@geech.gnu.ai.mit.edu>
+ 
+ 	* xfns.c: (HACK_EDITRES): Declare if using X11R5.
+ 	(widget_id_tick): New variable.
+ 	(x_any_window_to_frame): Use lw_window_is_in_menubar for
+ 	widget set independence.
+ 	(x_window): Renamed screen_widget to frame_widget.  Use
+ 	lw_create_widget and lw_set_main_areas for widget set
+ 	independence.  Enable using editres for X11R5.
+ 
+ 	* widget.c (EmacsFrameSetCharSize): Use lw_refigure_widget for
+         widget set independence.
+ 
+ 	* widget.h: Declare resources showGrip, allowResize, and
+         resizeToPreferred.
+ 
+ 	* keyboard.c (make_lispy_event): Do not set item.  Now handled in
+         xmenu.c by popup_get_selection.
+ 
+ Sat Oct  1 00:42:02 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* frame.c (keys_of_frame): Make binding for delete-frame.
+ 
+ 	* xdisp.c (redisplay_window): If we set PT, and that alters a region
+ 	being highlighted, call try_window again.
+ 
+ 	* Makefile.in.in (LIBXTR6): If NEED_LIBW, add -lw.
+ 	* s/usg5-4-2.h (NEED_LIBW): Defined.
+ 
+ 	* Makefile.in.in (LDFLAGS): New variable.
+ 	(LIBX): Use LDFLAGS.
+ 
+ Fri Sep 30 16:31:45 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* data.c (Fmake_local_variable): Doc fix.
+ 
+ Thu Sep 29 18:59:13 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* fileio.c (check_writable, check_executable) [__HURD__]:
+ 	Use eaccess.
+ 
+ 	* xfaces.c (compute_char_face): Handle list as overlay face property.
+ 
+ Thu Sep 29 15:21:56 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* minibuf.c (scmp): Use unsigned chars, to avoid confusing DOWNCASE.
+ 
+ 	* unexaix.c (CHECK_SCNHDR, write_segment): Fix format/arg mismatch.
+ 	* xfns.c (x_report_frame_params): Likewise.
+ 
+ Thu Sep 29 09:57:38 1994  Boris Goldowsky  <boris@cs.rochester.edu>
+ 
+ 	* xfaces.c (compute_char_face): If face text-property is a list,
+ 	merge the attributes of the faces in the list.
+ 
+ Thu Sep 29 00:39:15 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* buffer.c (Foverlay_get): Handle `category' property on overlay.
+ 
+ 	* xfaces.c (Fset_face_attribute_internal): Mark frame garbaged whenever
+ 	any face's font or color is changed.
+ 
+ 	* keyboard.c (head_table): Set up Qdelete_frame.
+ 	(kbd_buffer_get_event): Handle delete_window_event by making
+ 	a delete-frame event.
+ 
+ Wed Sep 28 18:54:46 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* data.c (Flocal_variable_p): New function.
+ 	(syms_of_data): defsubr it.
+ 
+ Wed Sep 28 16:41:39 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* fileio.c (Fdelete_file): Undo Sep 16 change.
+ 	* dired.c (syms_of_dired): Likewise.
+ 
+ Tue Sep 27 00:01:45 1994  Karl Heuer  <kwzh@nutrimat.gnu.ai.mit.edu>
+ 
+ 	* frame.h (scroll_bar_pixel_width, scroll_bar_cols): Update comment.
+ 	* xfns.c (x_set_scroll_bar_width): Nil now means 2 columns' worth.
+ 	(Fx_create_frame): Default scroll bar width is now nil.
+ 	* xterm.c (x_new_font): New rule for computing column width.
+ 	Factored out common code.
+ 	(XTset_vertical_scroll_bar): Use new width formula.
+ 	[!USE_X_TOOLKIT] (x_set_window_size): Likewise.
+ 	* widget.c (set_frame_size, EmacsFrameSetCharSize): Likewise.
+ 
+ 	* lisp.h (BOOLFWDP, INTERNALP, INTFWDP, OBJFWDP, INTERNAL_STREAMP,
+ 	BUFFER_LOCAL_VALUEP, SOME_BUFFER_LOCAL_VALUEP, BUFFER_OBJFWDP,
+ 	VOIDP): New type test macros.
+ 	* *.h, *.c: Use type test macros instead of checking XTYPE directly.
+ 
+ Mon Sep 26 21:36:54 1994  Richard Stallman  <rms@churchy.gnu.ai.mit.edu>
+ 
+ 	* window.c (syms_of_window): Doc fix.
+ 
+ Mon Sep 26 18:56:01 1994  Fred Pierresteguy <F.Pierresteguy@frcl.bull.fr>
+ 
+ 	* m/dpx2.h (POSIX_SIGNALS): Define it.
+ 	(sigsetmask): Add #undef.
+ 
+ Mon Sep 26 14:12:21 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* m/*.h, s/*.h (WORDS_BIG_ENDIAN): Renamed from BIG_ENDIAN,
+ 	and restored where mistakenly deleted by earlier change.
+ 
+ 	* emacs.c (argmatch): New function.
+ 	(main): Recognize --longopt synonyms for all options handled here.
+ 	Add --help and --version.
+ 
+ Sun Sep 25 14:00:18 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* unexsunos4.c: Delete __FreeBSD__ conditional macro definitions.
+ 	(unexec): Major changes in UNDO_RELOCATION code.
+ 
+ 	* unexsunos4.c (is_it): Rename argument and local variable.
+ 
+ Sun Sep 25 02:40:01 1994  Richard Stallman  <rms@churchy.gnu.ai.mit.edu>
+ 
+ 	* Makefile.in.in (${etc}DOC): Run make-docfile twice--two batches.
+ 
+ Sat Sep 24 19:34:26 1994  Richard Stallman  <rms@churchy.gnu.ai.mit.edu>
+ 
+ 	* sysdep.c (set_file_times): Don't test HAVE_UTIME.
+ 	Assume utime exists if utimes does not.
+ 
+ 	* config.h.in (HAVE_UTIMES): Add #undef.
+ 
+ 	* editfns.c (Fformat_time_string): Mostly rewritten, to handle
+ 	unlimited size, and report errors properly.
+ 
+ 	* Makefile.in.in (strftime.o, mktime.o): New target.
+ 	(obj): Add strftime.o and mktime.o.
+ 
+ 	* strftime.c, mktime.c: New files (shared from libc).
+ 
+ Sat Sep 24 03:54:02 1994  Erik Naggum  (erik@naggum.no)
+ 
+ 	* editfns.c (Fformat_time_string): New function.
+ 	(syms_of_editfns): Defsubr it.
+ 
+ Sat Sep 24 01:09:16 1994  Richard Stallman  <rms@churchy.gnu.ai.mit.edu>
+ 
+ 	* sysdep.c [USE_DL_STUBS] (dlopen, dlsym, dlclose): New functions.
+ 	* s/sunos4-1.h (USE_DL_STUBS): Defined.
+ 	* s/sunos4shr.h (USE_DL_STUBS): Add #undef.
+ 
+ 	* fileio.c (Ffile_writable_p): Use stat to test for existence.
+ 	(check_executable, check_writable): New functions.
+ 	(Ffile_executable_p, Ffile_writable_p): Use the new functions.
+ 
+ 	* intervals.c (set_point):
+ 	If Vinhibit_point_motion_hooks, ignore intangible properties.
+ 	If move backwards into intangible text, move back over it.
+ 
+ 	* textprop.c (syms_of_textprop): Doc fix.
+ 
+ 	* config.h.in (STACK_DIRECTION): Don't redefine if defined already.
+ 	Move definition down past #include's.
+ 
+ Fri Sep 23 20:15:02 1994  Richard Stallman  <rms@churchy.gnu.ai.mit.edu>
+ 
+ 	* s/linux.h: Don't include signal.h, values.h.
+ 	(signal): Definition deleted.
+ 
+ 	* abbrev.c (Fexpand_abbrev): Instead of Fcapitalize_region,
+ 	just upcase the first initial.
+ 
+ 	* casefiddle.c (Fupcase_initials_region): New function.
+ 	(Fupcase_initials): New function.
+ 	(syms_of_casefiddle): defsubr them.
+ 
+ 	* minibuf.c (read_minibuf_unwind): Preserve Vdeactivate_mark.
+ 
+ 	* s/isc2-2.h (DONT_DEFINE_SIGNAL): Macro deleted.
+ 
+ 	* m/next.h (DK_HEADER_FILE): Macro deleted.
+ 
+ 	* m/tahoe.h (DKSTAT_HEADER_FILE): Macro deleted.
+ 
+ 	* m/hp800.h (CPTIME_SYMBOL, DKXFER_SYMBOL): Macros deleted.
+ 
+ 	* sysdep.c (start_of_text): Don't test CANNOT_UNEXEC.
+ 	* unexec.c: Don't test CANNOT_UNEXEC.
+ 	* unexaix.c: Don't test CANNOT_DUMP or CANNOT_UNEXEC.
+ 
+ 	* sysdep.c: Delete BROKEN_FASYNC conditional.
+ 
+ 	* data.c (Fset_default, Fset): Delete RTPC_REGISTER_BUG conditionals.
+ 
+ 	* process.c (Fprocess_send_eof): Delete DID_REMOTE conditional.
+ 
+         * buffer.c (get-file-buffer): Doc fix.
+ 
+ Fri Sep 23 00:54:08 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* frame.c (prev_frame): Fix typo.
+ 
+ 	* unexec.c (copy_text_and_data): Delete some printf's.
+ 
+ 	* m/acorn.h (PURESIZE): Definition deleted.
+ 
+ 	* xfns.c (x_figure_window_size): Decode (- N), (+ N) for position.
+ 	(x_set_frame_parameters): Handle (+ N) and (- N).
+ 	Preserve negative positions properly too.
+ 	[USE_X_TOOLKIT] (x_window): Let xneg, yneg specify whether to
+ 	negate left and top.
+ 	(Fx_parse_geometry): Handle [XY]Negative with positive number
+ 	or negative number without [XY]Negative.
+ 
+ 	* callint.c (Qplus): New variable.
+ 	(syms_of_callint): Set it up.
+ 	* lisp.h (Qplus): Declared.
+ 
+ 	* xfns.c (Fx_create_frame): Rename menuBarLines resource to menuBar.
+ 
+ 	* s/sunos4-1-3.h, s/sunos4shr.h (X_IO_BUG): Definition deleted.
+ 
+ 	* textprop.c (Fset_text_properties): Don't let validate_interval_range
+ 	increment START and END twice.
+ 
+ 	* xterm.h (FRAME_X_DISPLAY): New macro.
+ 
+ 	* s/freebsd.h (BSD): Have two definitions according to version number.
+ 
+ Thu Sep 22 16:50:11 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xterm.c (x_destroy_window): Decrement ref count of x_screen struct.
+ 
+ 	* xfns.c (the_x_screen): New variable.
+ 	(syms_of_xfns): Staticpro parts of it.
+ 	(Fx_open_connection): Initialize it.
+ 	(Fx_create_frame): Make frame point to it.
+ 	(Fx_list_fonts): Use a cache stored in FRAME_X_SCREEN.
+ 
+ 	* xterm.h (struct x_screen): New structure.
+ 	(struct x_display): New field x_screen.
+ 	(FRAME_X_SCREEN): New macro.
+ 
+ 	* process.c (exec_sentinel_error_handler): Call update_echo_area.
+ 	(read_process_output_error_handler): Likewise.
+ 
+ 	* xdisp.c (update_echo_area): New function.
+ 
+ Thu Sep 22 15:20:12 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* buffer.c (evaporate_overlays): Overlay is in car, not cdr.
+ 
+ Wed Sep 21 21:46:06 1994  Tom Tromey  <tromey@creche.colorado.edu>
+ 
+ 	* doc.c (get_doc_string): Look in ../etc while dumping.
+ 	(munge_doc_file_name): New subroutine.
+ 
+ Thu Sep 22 02:25:07 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* minibuf.c (Fcompleting_read): Doc fix.
+ 
+ 	* puresize.h (BASE_PURESIZE): Increment both values.
+ 
+ 	* window.c (Fdelete_other_windows): Nice error if WINDOW is minibuf.
+ 
+ 	* lisp.h (Vdebug_on_error): Declared.
+ 
+ 	* process.c (exec_sentinel_error_handler): New function.
+ 	(exec_sentinel): Catch all errors in the sentinel.
+ 
+ 	* keyboard.c (read_char): Don't return right away when
+ 	read_char_minibuf_menu_prompt returns non-nil.
+ 	Instead, set key_already_recorded, which inhibits most but not all
+ 	of the work at non_reread.
+ 
+ Wed Sep 21 17:22:44 1994  Simon Leinen  <simon@lia.di.epfl.ch>
+ 
+ 	* cm.h (cmputc): Return int rather than void.
+ 	* cm.c (evalcost, cmputc): They now return their arguments.
+ 
+ Wed Sep 21 10:09:42 1994  Per Abrahamsen  <abraham@iesd.auc.dk>
+ 
+ 	* window.c (display-buffer, special-display-buffer-names)
+ 	(special-display-regexps, special-display-function): Accept cons
+ 	cells in `special-display-buffer-names' and
+ 	`special-display-regexps'.  If the buffer name matches the car,
+ 	call `special-display-function' with the cdr as a second argument.
+ 
+ Wed Sep 21 14:52:44 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* s/bsd386.h (HAVE_TERMIOS, NO_TERMIO): Defined.
+ 
+ 	* editfns.c (Fmessage_or_box): Use Fmessage_box with new name.
+ 
+ 	* process.c (read_process_output_error_handler): New function.
+ 	(read_process_output_call): New function.
+ 	(read_process_output): Catch and report errors in filters.
+ 
+ 	* keyboard.c (cmd_error_internal):
+ 	New function, broken out of cmd_error.
+ 
+ 	* fileio.c (Fread_file_name): If DEFAULT is nil and INITIAL is not,
+ 	use INITIAL to set DEFAULT.
+ 
+ 	* editfns.c (Fmessage_box): Renamed from Fbox_message.
+ 
+ Fri Sep 17 08:40:48 1994  Michael Ben-Gershon (mybg@cs.huji.ac.il)
+ 
+ 	* unexec.c (copy_text_and_data): Add RISCiX changes.
+ 
+ 	* m/acorn.h, s/riscix1-1.h, s/riscix1-2.h: New files added.
+ 
+ Wed Sep 21 15:39:33 1994  Bill Burton  (billb@progress.com)
+ 
+ 	* s/ptx.h: New file for Sequent DYNIX/ptx 1.x/2.x
+ 
+ 	* m/sequent-ptx.h: New file for Sequent DYNIX/ptx 1.x/2.x
+ 
+ Wed Sep 21 11:10:40 1994  Frederic Pierresteguy  <F.Pierresteguy@frcl.bull.fr>
+ 
+ 	* editfns.c (Fbox_message): New function to print a message in
+ 	a dialog box.
+ 	(Fmessage_or_box): New function that choose whether to print a
+ 	message in a dialog or in the echo area.
+ 
+ Wed Sep 21 01:13:51 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* search.c (Freplace_match): New 4th arg OBJECT can specify string
+ 	to replace in.
+ 
+ 	* casefiddle.c (upcase_initials): New function.
+ 	(casify_object): Handle CASE_CAPITALIZE_UP.
+ 
+ 	* fns.c (concat3): New function.
+ 
+ 	* xfns.c (Fx_get_resource): Doc fix.
+ 
+ 	* buffer.c (overlays_at): New arg PREV_PTR.
+ 	Return previous overlay end.
+ 	(Foverlays_at): Pass NULL for last 2 args of overlays_at.
+ 	(Fnext_overlay_change): Pass new arg to overlays_at.
+ 	(Fprevious_overlay_change): New function.
+ 	* xterm.c (note_mouse_highlight): Pass new arg to overlays_at.
+ 	* xfaces.c (compute_char_face): Pass new arg to overlays_at.
+ 	* textprop.c (Fget_char_property): Pass new arg to overlays_at.
+ 	(NULL): Define if not defined.
+ 
+ 	* minibuf.c (get_minibuffer): Make BUF current to kill its local vars.
+ 
+ Tue Sep 20 01:49:37 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* ralloc.c (r_alloc_freeze_level): New variable.
+ 	(r_alloc_freeze, r_alloc_thaw): New functions.
+ 	(r_alloc_sbrk): Refuse to move blocs, if frozen.
+ 
+ 	* unexaix.c (report_error): Include reason in error message.
+ 
+ Tue Sep 20 01:05:50 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* eval.c (init_eval_once): Init Vrun_hooks here.
+ 	(syms_of_eval): Not here.
+ 
+ Tue Sep 20 00:06:50 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* search.c (trivial_regexp_p): New function.
+ 	(search_buffer): Don't depend on internal format of re_pattern_buffer.
+ 
+ 	* frame.h (FRAME_SCROLL_BAR_PIXEL_WIDTH): New macro, supersedes
+ 	VERTICAL_SCROLL_BAR_PIXEL_WIDTH; no longer device-dependent.
+ 	All callers changed.
+ 	(FRAME_SCROLL_BAR_COLS): New macro, supersedes
+ 	VERTICAL_SCROLL_BAR_WIDTH; no longer constant.  All callers changed.
+ 	(scroll_bar_pixel_width, scroll_bar_cols): New members of struct frame.
+ 	* xterm.h (VERTICAL_SCROLL_BAR_PIXEL_WIDTH): Deleted.
+ 	* xfns.c (x_set_scroll_bar_width): New function.
+ 	(x_frame_parms): Add that function to this table.
+ 	(Qscroll_bar_width): New symbol.
+ 	(syms_of_xfns): Initialize and staticpro it.
+ 	(Fx_create_frame): Set default scroll bar width.
+ 	* xterm.c (x_new_font): Compute number of scrollbar columns.
+ 
+ 	* keyboard.c (kbd_store_ptr): Declare storage class before qualifier.
+ 	(make_lispy_event): Fix Lisp_Object vs. int problems.
+ 	(read_avail_input, menu_bar_items_index, read_key_sequence): Likewise.
+ 	* window.c (Fset_window_buffer): Likewise.
+ 	* alloc.c (make_float, make_pure_float): Likewise.
+ 
+ 	* sysdep.c (set_file_times): Move this out of the USG conditional.
+ 
+ Mon Sep 19 22:29:09 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* s/sco4.h (POSIX_SIGNALS): Defined.
+ 
+ Mon Sep 19 13:46:04 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* buffer.c (syms_of_buffer): Doc fix.
+ 
+ 	* keymap.c (Fkey_description): Reverse condition.
+ 
+ Mon Sep 19 13:23:44 1994  Jim Blandy  <jimb@geech.gnu.ai.mit.edu>
+ 
+         Add a new element to display tables controlling side-by-side
+ 	window borders.
+ 	* buffer.c (syms_of_buffer): Update doc string for
+ 	`buffer-display-table'.
+ 	* disptab.h (DISP_TABLE_SIZE): Bump to 262.
+ 	(DISP_BORDER_GLYPH): New accessor macro.
+ 	* xdisp.c (display_text_line): Consult the display table when
+ 	building side-by-side window borders.
+ 
+ Mon Sep 19 01:05:21 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* s/netbsd.h (SYSTEM_TYPE): Delete definition.
+ 
+ 	* lisp.h (RETURN_UNGCPRO): Use if (1) .. else, not do ... while (0).
+ 
+ Sun Sep 18 19:56:33 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* lisp.h (Fmember): Declare this function.
+ 	* intervals.c: #include "keyboard.h"
+ 	* term.c: Declare Fmake_sparse_keymap.
+ 	* minibuf.c (read_minibuf): Fix Lisp_Object vs. int problems.
+ 	* frame.h [!MULTI_FRAME] (FOR_EACH_FRAME): Likewise.
+ 	* fns.c (Frandom): Likewise.
+ 	* eval.c (Fsignal): Likewise.
+ 	* frame.c (Fframe_parameters): Likewise.
+ 	* indent.c (vmotion, Fvertical_motion): Likewise.
+ 	* lread.c (openp): Likewise.
+ 	* dispnew.c (direct_output_for_insert, direct_output_forward_char):
+ 	Likewise.
+ 	* textprop.c (validate_interval_range, property_value,
+ 	Fget_char_property, Fnext_property_change,
+ 	Fnext_single_property_change, Fprevious_property_change,
+ 	Fprevious_single_property_change): Likewise.
+ 
+ Sun Sep 18 16:00:13 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* process.c (pty_name): Move it up; make it static.
+ 	(create_process): Set the tty_name field.
+ 	(Fprocess_tty_name): New function.
+ 	(syms_of_process): defsubr it.
+ 
+ 	* process.h (struct process): New field tty_name.
+ 
+ 	* s/sol2.h (HAVE_VFORK): Defined.
+ 	(C_SWITCH_SYSTEM): Deleted.
+ 	(const): Definition deleted.
+ 
+ 	* fileio.c (Ffile_writable_p): Don't use ro_fsys.
+ 	(ro_fsys): Deleted.
+ 
+ Sun Sep 18 14:57:23 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* config.h.in (_ALL_SOURCE): Don't redefine if already defined.
+ 
+ 	* xdisp.c [!HAVE_X_WINDOWS] (store_frame_title): Dummy macro.
+ 
+ 	* sysdep.c (set_file_times): New function, replaces EMACS_SET_UTIMES.
+ 	* fileio.c (Fcopy_file): Use it, and check for the error return.
+ 	* systime.h: Declare it.
+ 	[HAVE_UTIME_H]: #include <utime.h>.
+ 
+ 	* config.h.in (_ALL_SOURCE, HAVE_STRUCT_UTIMBUF, HAVE_SELECT,
+ 	HAVE_TIMEVAL): Add #undefs.
+ 
+ 	* s/*.h, m/*.h: Delete obsolete symbols USE_UTIME, MISSING_UTIMES,
+ 	IRIS_UTIME, USG_SYS_TIME, HAVE_SELECT, HAVE_TIMEVAL, BIG_ENDIAN.
+ 
+ Sun Sep 18 00:00:16 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* dispnew.c (preserve_other_columns): Fix arg to sizeof in bcopy call.
+ 
+ 	* minibuf.c (get_minibuffer): Call Fkill_all_local_variables.
+ 
+ 	* buffer.c (reset_buffer): Don't call reset_buffer_local_variables.
+ 	(Fget_buffer_create): Call it here.
+ 	(init_buffer_once): And here.
+ 
+ 	* window.c (struct saved_window_data): New slots min_width, min_height.
+ 	(Fcurrent_window_configuration): Set slots from window_min_...
+ 	(Fset_window_configuration): Restore them.
+ 	Set window_min_height and window_min_width to 1
+ 	while restoring windows.
+ 
+ 	* unexsunos4.c (SUNOS4 or __FreeBSD__): Define UNDO_RELOCATION.
+ 	(unexec): Test UNDO_RELOCATION.  Distinguish the relocation formats
+ 	of __FreeBSD__ and SUNOS4.
+ 
+ 	* s/sol2.h (REL_ALLOC): #undef deleted.
+ 
+ 	* keymap.c (Fkey_description): Give error if KEYS not an array.
+ 	(get_keyelt, access_keymap, get_keymap_1): Use type test macros.
+ 
+ Sat Sep 17 01:21:19 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* unexsunos4.c (unexec): Fix logic for rounding section boundaries.
+ 
+ 	* config.h.in (EMACS_CONFIG_OPTIONS): Add #undef.
+ 
+ 	* textprop.c (property_value): Declare args plist, prop.
+ 
+ 	* s/osf1.h (malloc, realloc): Declared.
+ 
+ 	* print.c (print): sprintf arg for frame depends on VALBITS.
+ 
+ 	* callproc.c (Fcall_process) [__osf__ && __alpha]:
+ 	Don't stop reading if read returns negative.
+ 
+ 	* puresize.h (PURESIZE_RATIO, BASE_PURESIZE): Defined.
+ 	(PURESIZE): Define it based on those.
+ 	* m/alpha.h (PURESIZE): Definitions deleted.
+ 
+ Fri Sep 16 23:09:34 1994  Karl Heuer  <kwzh@churchy.gnu.ai.mit.edu>
+ 
+ 	* buffer.h: Declare some functions.
+ 	* intervals.h: Declare some functions.
+ 	* lisp.h: Declare some functions.
+ 	* xterm.c, xfaces.c: Add #include "intervals.h"
+ 	* fileio.c (barf_or_query_if_file_exists): Fix declaration.
+ 	* xmenu.c (menu_item_enabled_p): Fix declaration.
+ 
+ Fri Sep 16 22:15:28 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xfns.c (hack_wm_protocols): Arrange to handle WM_SAVE_YOURSELF.
+ 
+ 	* s/hpux9.h (HAVE_TERMIO, HAVE_TERMIOS, NO_TERMIO): Undo Jul 28 change.
+ 
+ Fri Sep 16 21:49:50 1994  Karl Heuer  <kwzh@churchy.gnu.ai.mit.edu>
+ 
+ 	* emacs.c (Vsystem_configuration_options): New variable.
+ 	(syms_of_emacs): Initialize it.
+ 
+ 	* buffer.h: Declare evaporate_overlays.
+ 	* buffer.c: Declare new symbol Qevaporate.
+ 	(syms_of_buffer): Initialize it.
+ 	(Fmove_overlay): Check if overlay is empty.
+ 	(Foverlay_put): Check if setting evaporate property on empty overlay.
+ 	(evaporate_overlays): New function.
+ 	* insdel.c (del_range_1): Call evaporate_overlays after deleting text.
+ 
+ Fri Sep 16 20:13:01 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* m/intel386.h (HAVE_VFORK): Defined.
+ 	[__GNUC__] (C_SWITCH_SYSTEM): Add #undef.
+ 
+ 	* emacs.c (shut_down_emacs): Don't call Fx_close_current_connection.
+ 
+ 	* lisp.h (EMACS_INT, EMACS_UINT): Define, if not already defined.
+ 
+ 	* alpha.h (EMACS_INT, EMACS_UINT): Defined.
+ 
+ Fri Sep 16 19:56:09 1994  Rainer Schoepf  <schoepf@sc.ZIB-Berlin.DE>
+ 
+ 	* s/osf1.h [__alpha] (LD_SWITCH_SYSTEM): Alternate definition.
+ 
+ 	* unexalpha.c, m/alpha.h: New files.
+ 
+ 	* alloc.c (pure, pure_size): Use EMACS_INT.
+ 	(free_float, free_cons, PAD, STRING_FULLSIZE, struct string_block)
+ 	(make_pure_string, make_pure_vector, Fgarbage_collect, mark_object)
+ 	(gc_sweep, compact_strings, Fmemory_limit): Use EMACS_INT.
+ 
+ 	* buffer.c (reset_buffer_local_variables, Fbuffer_local_variables)
+ 	(init_buffer_once): Use EMACS_INT.
+ 
+ 	* callint.c (Fcall_interactively): Use EMACS_INT.
+ 
+ 	* data.c (sign_extend_lisp_int): Use EMACS_INT.
+ 
+ 	* dispextern.h (struct face): Use EMACS_UINT.
+ 
+ 	* doc.c (Fdocumentation): Use EMACS_INT.
+ 
+ 	* editfns.c (Fnarrow_to_region, format1): Use EMACS_INT.
+ 
+ 	* floatfns.c (FLOAT_TO_INT, FLOAT_TO_INT2): Use EMACS_INT.
+ 
+ 	* frame.h (struct frame, selected_frame, last_nonminibuf_frame):
+ 	Use EMACS_INT.
+ 
+ 	* lisp.h (Lisp_Object): Use EMACS_INT.
+ 	(MARKBIT): Don't define if already defined.
+ 	(VALMASK, GCTYPEMASK, XSETTYPE, XSET)
+ 	(XSETCONS, XSETBUFFER, XSETVECTOR, XSETSUBR, XSETSTRING)
+ 	(XSETSYMBOL, XSETFUNCTION, XSETMARKER, XSETOBJFWD)
+ 	(XSETINTPTR, XSETWINDOW, XSETPROCESS, XSETFLOAT)
+ 	(struct Lisp_String, struct Lisp_Vector): Use EMACS_INT.
+ 
+ 	* lread.c (Fload): Use EMACS_INT.
+ 
+ 	* marker.c (unchain_marker): Use EMACS_INT.
+ 
+ 	* mem-limits.h: Check for __alpha, in __osf__ conditional.
+ 	(EXCEEDS_LISP_PTR): Use EMACS_UINT.
+ 
+ 	* print.c (print): Use EMACS_UINT.
+ 
+ 	* puresize.h (CHECK_IMPURE, all versions): Use EMACS_INT.
+ 
+ 	* window.h (struct window): Use EMACS_INT.
+ 
+ 	* xdisp.c (message): Use EMACS_INT.
+ 
+ 	* xterm.h (struct scroll_bar, SCROLL_BAR_VEC_SIZE): Use EMACS_INT.
+ 
+ Fri Sep 16 19:39:30 1994  Morten Welinder  <terra@diku.dk>
+ 
+ 	* fileio.c (Finsert_file_contents) [MSDOS]: Don't re-gc-protect
+ 	filename; delete unused variables.
+ 
+ Fri Sep 16 19:35:04 1994  Karl Heuer  <kwzh@churchy.gnu.ai.mit.edu>
+ 
+ 	* term.c (clear_to_end): Fix reversed condition.
+ 
+ Fri Sep 16 18:16:48 1994  K. Berry <kb@cs.umb.edu>
+ 
+ 	* dired.c (Qcompletion_ignored_extensions): New symbol.
+ 	(syms_of_dired): Initialize it.
+ 	* fileio.c (Fdelete_file): Bind completion-ignored-extensions to nil.
+ 
+ Fri Sep 16 17:56:25 1994  Morten Welinder  (terra@diku.dk)
+ 
+ 	* s/msdos.h (MODE_LINE_BINARY_TEXT): Define this symbol.
+ 	* xdisp.c (decode_mode_spec): Use it when defined.
+ 
+ Fri Sep 16 17:29:48 1994  Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+ 	* minibuf.c (read_minibuf): Don't add to the history list if the
+ 	minibuffer string is empty, since it is not very useful.
+ 
+ Fri Sep 16 16:07:35 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* m/hp9000s300.h [not BSD4_3] [__GNUC__] (HAVE_ALLOCA): Defined.
+ 
+ Fri Sep 16 07:15:51 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* xdisp.c [!HAVE_X_WINDOWS] (frame_title_ptr): define as always null.
+ 
+ Fri Sep 16 03:42:39 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xterm.c: Delete X11 conditionals.
+ 	(XTupdate_end, XTupdate_begin, XTclear_end_of_line)
+ 	(XTclear_frame, XRINGBELL, stufflines, scraplines, dumprectangle)
+ 	(XTread_socket, x_draw_box, clear_cursor, refreshicon, x_iconify_frame)
+ 	(x_bitmap_icon, x_text_icon, x_new_font, x_term_init)
+ 	(x_calc_absolute_position, x_set_window_size)
+ 	(x_make_frame_visible, x_make_frame_invisible): Delete X10 code.
+ 	(dumpqueue, x_do_pending_expose, dumpborder, XEvent, x_read_exposes)
+ 	(enqueue_event, dequeue_event, queue_event_count)
+ 	(mouse_event_pending_p, x_set_resize_hint): Delete X10 versions.
+ 
+ 	* xfns.c: Delete X11 conditionals.
+ 	(defined_color, x_decode_color, x_set_foreground_color)
+ 	(x_set_background_color, x_set_mouse_color, x_set_cursor_color)
+ 	(x_set_border_color, x_set_border_pixel, Fx_create_frame)
+ 	(Fx_open_connection, Fx_close_current_connection, syms_of_xfns):
+ 	Delete X10 code.
+ 	(Fx_get_default, Fx_get_resource, Fx_rubber_band)
+ 	(Fx_store_cut_buffer, Fx_get_cut_buffer): Delete X10 definitions.
+ 
+ 	* xfns.c (Fx_display_grayscale_p): New function.
+ 	(syms_of_xfns): defsubr it.
+ 
+ 	* s/bsd386.h (__bsdi__): Define, unless already defined.
+ 	(DECLARE_GETPWUID_WITH_UID_T): Define.
+ 
+ 	* filelock.c (getpwuid): Test just DECLARE_GETPWUID_WITH_UID_T,
+ 	not __bsdi__.
+ 	* xrdb.c (getpwuid, getpwnam): Test just DECLARE_GETPWUID_WITH_UID_T,
+ 	not __bsdi__.
+ 
+ Thu Sep 15 20:40:47 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* editfns.c (syms_of_editfns): Make Vsystem_name and Vuser...name
+ 	lisp variables again.
+ 	* xdisp.c (multiple_frames, Vframe_title_format,
+ 	Vicon_title_format): New variables.
+ 	(store_frame_title): New function.
+ 	(x_consider_frame_title): Format title according to template.
+ 	(display_mode_element): Handle frame title as well as mode line.
+ 	(decode_mode_spec): Use w->buffer, not current_buffer.
+ 
+ Thu Sep 15 01:50:12 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* s/freebsd.h (DECLARE_GETPWUID_WITH_UID_T): Defined.
+ 	[NO_SHARED_LIBS and __FreeBSD__]:
+ 	(LD_SWITCH_SYSTEM, A_TEXT_OFFSET, A_TEXT_SEEK): Alternate definitions.
+ 
+ 	* textprop.c (syms_of_textprop):
+ 	Delete Lisp var interval-balance-threshold.
+ 
+ 	* intervals.c, intervals.h (interval_balance_threshold): Var deleted.
+ 
+ 	* xfns.c (Fx_create_frame): Make 1 the default for menu-bar-lines.
+ 
+ 	* keyboard.c (gobble_input): Use sigblockx only if it is defined.
+ 
+ 	* unexsunos4.c [SUNOS4]: Include link.h.
+ 	(unexec) [SUNOS4]: Cancel relocations that ld.so did.
+ 
+ 	* s/sunos4-0.h (SUNOS4): Defined.
+ 
+ Wed Sep 14 04:24:09 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* Makefile.in.in (xmenu.o): Depend on puresize.h.
+ 	(cmds.o): Depend on window.h.
+ 
+ 	* cmds.c: Include window.h.
+ 	(Fnewline): Inhibit the insert-at-end-of-line hack
+ 	when at the top of the window.
+ 
+ 	* minibuf.c (Fcompleting_read): Doc fix.
+ 
+ 	* xmenu.c: Include puresize.h.
+ 	(menu_item_equiv_key): Use CHECK_IMPURE.
+ 
+ 	* syntax.c (Fforward_comment): Do increment from, when reaching
+ 	single-char comment end going forward.
+ 
+ 	* callproc.c (delete_temp_file): Use Fdelete_file.
+ 
+ 	* fileio.c (Fset_default_file_modes): Doc fix.
+ 
+ 	* Makefile.in.in (OLDXMENU variable): Refer to the library in the
+ 	dir where it is compiled.
+ 	(OLDXMENU rule): Delete the commands; keep just a dep.
+ 
+ Sun Sep 11 14:56:01 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* Version 19.27 released.
+ 
+ Sat Sep 10 01:10:04 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* keymap.c (syms_of_keymap): Doc fix.
+ 
+ 	* keyboard.c (gobble_input): Block SIGALRM if we are using it.
+ 
+ 	* gmalloc.c: Bug fix affecting __ptrdiff_t in non-ANSI case.
+ 
+ Wed Sep  7 03:54:08 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* Version 19.26 released.
+ 
+ Thu Sep  8 15:13:32 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* keyboard.c (record_asynch_buffer_change): Don't test
+ 	Fwaiting_for_user_input_p if no subprocesses.
+ 
+ Mon Sep  5 21:33:48 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* s/sol2.h [USE_X_TOOLKIT && HAVE_X11XTR6] (REL_ALLOC): Undefine it.
+ 
+ Sun Sep  4 23:20:51 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* emacs.c (init_cmdargs): After chasing link, use only the
+ 	expanded name.
+ 
+ Sun Sep  4 20:12:07 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* fileio.c (Ffile_accessible_directory_p): Put back the gcpro.
+ 
+ 	* sysdep.c (srandom): Pass arg to srand48; no return value.
+ 
+ Sun Sep  4 00:35:24 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* emacs.c (init_cmdargs): When setting dir, expand the dir name.
+ 
+ 	* sysdep.c (random, srandom): Check HAVE_LRAND48, not HAVE_RAND48.
+ 	Call lrand48, nor rand48.
+ 
+ 	* config.h.in (HAVE_LRAND48): Replaces HAVE_RAND48.
+ 
+ Sat Sep  3 14:44:42 1994  Kaveh R. Ghazi  (ghazi@noc.rutgers.edu)
+ 
+ 	* m/delta88k.h [__GNUC__] (HAVE_ALLOCA): Defined.
+ 	[__GNUC__] (C_ALLOCA): Add #undef
+ 	(LIB_X11_LIB): Add #undef.
+ 	(HAVE_TERMIOS): Defined.
+ 	(HAVE_TERMIO): Add #undef.
+ 	(NO_TERMIO): Defined.
+ 	(sigsetmask): Add #undef.
+ 	(USE_GETOBAUD): Defined.
+ 
+ Sat Sep  3 00:33:58 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* sysdep.c (init_baud_rate): Test that getobaud is actually defined.
+ 
+ 	* sysdep.c (init_baud_rate) [USE_GETOBAUD]: Use getobaud.
+ 
+ Fri Sep  2 17:57:36 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* insdel.c (prepare_to_modify_buffer): Don't call
+ 	verify_overlay_modification if no overlays or
+ 	verify_interval_modification no intervals.
+ 
+ 	* textprop.c (Fset_text_properties):
+ 	Return early if buffer has no intervals and PROPS is nil.
+ 
+ Fri Sep  2 03:01:48 1994  Lennart Staflin  (lenst@rudolf)
+ 
+ 	* xdisp.c (display_text_line): Don't overrun the charstart area.
+ 
+ Fri Sep  2 01:31:58 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* insdel.c (insert_1): Don't call interval fns if buffer has none.
+ 
+ 	* textprop.c (Fset_text_properties): Don't create or split an interval
+ 	if we trivially do not need to change anything.
+ 
+ Wed Aug 31 16:39:57 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xfns.c (defined_color): New arg ALLOC--optionally don't allocate
+ 	the color.
+ 	(x_decode_color, Fx_color_defined_p): Pass new arg.
+ 	(Fx_color_values): New function.
+ 
+ Tue Aug 30 04:24:59 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* frame.c (Fdelete_frame): Fix previous change.
+ 
+ Tue Aug 30 11:11:59 1994  enami tsugutomo  <enami@sys.ptg.sony.co.jp>
+ 
+ 	* fileio.c (Fwrite_region): unbind_to should take two args.
+ 
+ Tue Aug 30 00:21:51 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* fileio.c (Ffile_accessible_directory_p): No need for gcpro.
+ 
+ 	* keyboard.c (input_polling_used): New function.
+ 	* xterm.c (x_make_frame_visible): Call input_polling_used.
+ 
+ Sun Aug 28 01:53:01 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* frame.c (Fdelete_frame): Free the frame's glyphs arrays.
+ 	Free the line insert/delete cost vectors.
+ 
+ 	* dispnew.c (free_frame_glyphs): No longer static.
+ 
+ 	* m/next.h (HAVE_MACH_MACH_H): Defined.
+ 
+ 	* editfns.c (Finsert_and_inherit_before_markers):
+ 	Use insert_before_markers_and_inherit for character args.
+ 	(Finsert_and_inherit): Use insert_and_inherit for character args.
+ 
+ 	* insdel.c (insert_before_markers_and_inherit): New function.
+ 
+ 	* cmds.c (internal_self_insert): Use insert_and_inherit.
+ 
+ Sat Aug 27 18:45:24 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* indent.c (Findent_to): Pass new arg to Finsert_char.
+ 
+ 	* editfns.c (Finsert_char): New arg INHERIT.
+ 	Use insert_and_inherit if requested.
+ 
+ 	* insdel.c (insert_1): New arg INHERIT.
+ 	(insert_and_inherit): New function.
+ 
+ Fri Aug 26 17:19:52 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* keyboard.c (polling_for_input): Define var unconditionally.
+ 	* keyboard.h (polling_for_input): Declared.
+ 	* xterm.c: Include keyboard.h.
+ 	(x_make_frame_visible): Fix previous change: test polling_for_input
+ 	instead of whether SIGIO is defined.
+ 	* Makefile.in.in (xterm.o): Depend on keyboard.h.
+ 
+ Fri Aug 26 16:35:06 1994  Kevin Rodgers <kevinr@ihs.com>
+ 
+ 	* xfns.c (Fx_color_defined_p): Return list of RGB values, not just t.
+ 
+ Fri Aug 26 01:17:17 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* xterm.c (x_make_frame_visible): Call signal handler directly.
+ 
+ Thu Aug 25 18:18:50 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* s/linux.h: Add LINUX_QMAGIC conditional.
+ 
+ 	* m/alliant-2800.h (USE_NONANSI_DEFUN): Defined.
+ 
+ 	* lisp.h (DEFUN): Check USE_NONANSI_DEFUN.
+ 
+ 	* Makefile.in.in (obj): Put cm.o before term.o.
+ 	(Avoids mysterious lossage on Irix.)
+ 
+ 	* xmenu.c (xmenu_show): Don't queue events that are in the menu bar.
+ 
+ Wed Aug 24 15:40:04 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xmenu.c (xmenu_show): Do nothing special for ButtonPress in the menu.
+ 	Call XtDispatchEvent for all ButtonRelease events.
+ 	xlwmenu.c now deals with posting the menu.
+ 	Check for events in subwidgets of the menu
+ 	when deciding whether to queue them for later handling.
+ 
+ 	* unexelfsgi.c (unexec): Copy previous change in unexelf.c.
+ 
+ 	* s/irix5-0.h [__GNUC__] (LD_SWITCH_SYSTEM): Defined.
+ 
+ Wed Aug 24 17:40:38 1994  Simon Leinen  <simon@lia.di.epfl.ch>
+ 
+ 	* term.c (term_init): Added missing argument to tgetstr.
+ 	(tgetstr): Move declarations to top level.
+ 
+ Wed Aug 24 02:26:54 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* xterm.c (x_make_frame_visible): Raise a signal to cause the
+ 	pending X I/O to be read.
+ 
+ Wed Aug 24 01:16:45 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xdisp.c (display_scan_buffer): New function.
+ 	(display_count_lines): Use that.
+ 
+ 	* intervals.c (textget): Ignore category prop if not a symbol.
+ 
+ Tue Aug 23 22:04:05 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* s/gnu.h: New file.
+ 
+ Tue Aug 23 18:56:19 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* indent.c (pos_tab_offset): Don't trigger point-motion hooks.
+ 
+ 	* buffer.c (Frename_buffer): Fix gcpro problems.
+ 	* fileio.c (Fmake_symbolic_link, Ffile_accessible_directory_p,
+ 	Finsert_file_contents, auto_save_error, Fwrite_region): Likewise.
+ 	(Fcopy_file, build_annotations, Fdo_auto_save): Delete unused
+ 	 variables.
+ 
+ Tue Aug 23 03:04:51 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* fileio.c (O_RDONLY): Defined.
+ 	(Finsert_file_contents, Fcopy_file): use it.
+ 	(barf_or_query_if_file_exists, Ffile_exists_p): Use stat, not access.
+ 	(Ffile_readable_p): Use open, not access.
+ 
+ 	* lread.c (O_RDONLY): Defined.
+ 	(openp): Use it.
+ 
+ 	* unexelf.c (unexec): Don't alter the info field
+ 	of SHT_SYMTAB and SHT_DYNSYM sections.
+ 
+ 	* xdisp.c (redisplay_window): Don't access text before BEGV.
+ 
+ 	* keyboard.c (read_char): After read_char_minibuf_menu_prompt,
+ 	don't just return; jump to non_reread.
+ 
+ 	* fileio.c (Fmake_directory_internal): Pass just 2 args to handler.
+ 
+ Tue Aug 23 00:46:27 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* frame.c (Fmake_frame_invisible, Ficonify_frame): Don't switch frames.
+ 
+ Mon Aug 22 19:17:08 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* search.c (Fstring_match): Fix sign error.
+ 
+ 	* m/ibmrs6000.h (LD_SWITCH_MACHINE): Use full path to ibmrs6000.inp.
+ 
+ Sun Aug 21 14:03:32 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* m/ibmrs6000.h (LD_SWITCH_MACHINE): Supply m/ibmrs6000.inp as input.
+ 
+ 	* m/ibmrs6000.inp: New file.
+ 
+ Fri Aug 19 20:47:38 1994  Hiroshi NAKANO  <nakano@whale.math.ryukoku.ac.jp>
+ 
+ 	* unexelf.c: Eliminate local var bss_end.
+ 	Update the symbol values of _edata and _end.
+ 
+ Fri Aug 19 01:37:54 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* process.c (wait_reading_process_input):
+ 	Clear waiting_for_user_input_p before returning.
+ 
+ 	* xterm.c (x_make_frame_visible): Quit if requested, in loop at end.
+ 
+ Wed Aug 17 22:07:20 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* keyboard.c (read_char): Don't show buffer-events to the user.
+ 	Handle chars over 255 in dribble files.
+ 
+ Wed Aug 17 17:43:22 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* callproc.c (Fcall_process_region): gcpro filename_string.
+ 
+ Wed Aug 17 16:05:56 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* doc.c (store_function_docstring): Do nothing for bytecode object
+ 	which has no slot for doc string.
+ 
+ Tue Aug 16 19:51:36 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* buffer.c (list_buffers_1): Update header line layout.
+ 
+ Sat Aug 13 19:11:21 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* s/sol2-4.h (pid_t): New definition.
+ 	(vfork): Definition deleted.
+ 
+ 	* xmenu.c (xmenu_show): Unconditionally update x_mouse_grabbed
+ 	and Vmouse_depressed.
+ 
+ 	* window.c (window_loop, case UNSHOW_BUFFER):
+ 	When we delete a frame, skip all the windows on that frame.
+ 
+ Fri Aug 12 19:11:43 1994  Karl Heuer  <kwzh@hal.gnu.ai.mit.edu>
+ 
+ 	* s/isc4-0.h (NEED_SIOCTL): moved to isc-3.0.h.
+ 	* s/isc3-0.h (NEED_SIOCTL): moved from isc-4.0.h, and disabled
+ 	BROKEN_TIOCGWINSZ since it works fine when you use <sioctl.h>.
+ 	(C_SWITCH_SYSTEM): Add -D_SYSV3 to ensure availability of
+ 	traditional non-standard functions.
+ 	(memmove): Delete this macro; it screws up <string.h> if you
+ 	use the native cc.  (Emacs already does the right thing anyway.)
+ 
+ Fri Aug 12 01:22:45 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* indent.c (compute_motion): Use WIN's frame, not selected one.
+ 
+ 	* xterm.c (x_new_font): Don't set filename = full_name if that's null.
+ 
+ Thu Aug 11 15:45:00 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* Makefile.in.in (FRAME_SUPPORT): Add faces.elc.
+ 
+ 	* search.c (Freplace_match): Treat caseless initial like a
+         lowercase initial.
+ 
+ 	* keymap.c (Fdefine_key): Fix error message.
+ 	(Fsingle_key_description): Likewise.
+ 
+ Wed Aug 10 16:28:47 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* s/sol2-3.h (POSIX_SIGNALS): Define it.
+ 	(PTY_TTY_NAME_SPRINTF): New overriding definition.
+ 	(sigsetmask): Add #undefs.
+ 
+ 	* s/sol2-4.h (POSIX_SIGNALS, PTY_TTY_NAME_SPRINTF, sigsetmask):
+ 	Delete those things (moved to sol2-3.h).
+ 
+ 	* s/sol2-4.h (HAVE_VFORK): Deleted.
+ 	(vfork): Define as emacs_vfork.
+ 
+ 	* window.c (Fwindow_end): Undo previous change.
+ 
+ Tue Aug  9 13:39:31 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* keyboard.c (record_asynch_buffer_change): Do nothing
+ 	except when waiting_for_user_input_p.
+ 
+ 	* m/i860.h [USG5_4] (SVR4): Defined.
+ 
+ 	* xdisp.c (display_text_line):
+ 	Make previous change #ifdef HAVE_X_WINDOWS.
+ 
+ Mon Aug  8 05:03:18 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* puresize.h [MULTI_FRAME] (PURESIZE): Increased.
+ 
+ 	* window.c (Fwindow_end): If window_end_valid is nil, return nil.
+ 
+ 	* window.c (Fpos_visible_in_window_p): Do something reasonable
+ 	if w->start is outside the buffer bounds.
+ 
+ Sun Aug  7 02:40:34 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* s/sol2-4.h (PTY_TTY_NAME_SPRINTF): New definition.
+ 	(sigsetmask): Add #undef.
+ 
+ 	* keymap.c (Faccessible_keymaps): Fix previous change.
+ 
+ Sat Aug  6 20:58:03 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xdisp.c (display_text_line): Use the face properties
+ 	of the overlay arrow, if any.
+ 
+ 	* xfaces.c (compute_glyph_face_1): New function.
+ 
+ 	* m/intel386.h (LIBS_MACHINE): If SOLARIS2_4, don't define this.
+ 	* s/sol2-4.h (SOLARIS2_4): Defined.
+ 
+ Fri Aug  5 23:06:16 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* keymap.c (Fuse_global_map, Fuse_local_map):
+ 	Call record_asynch_buffer_change.
+ 
+ 	* xterm.c (XTread_socket):
+ 	Don't test X_IO_BUG; make that code unconditional.
+ 	(x_noop_count, x_term_init): Likewise.
+ 
+ Thu Aug  4 17:00:11 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* data.c (Fdefine_function, Fdefalias): Handle advice as in Ffset.
+ 	(Qad_advice_info): Lisp and C names renamed from Qadvice_info.
+ 	(Qad_activate): C name renamed from Qactivate_advice.
+ 
+ 	* fileio.c (Fread_file_name_internal): Call double_dollars
+ 	when `changed' is set.
+ 
+ Wed Aug  3 21:53:58 PDT 1994  Caveh Jalali  (caveh@eng.sun.com)
+ 
+ 	* m/intel386.h [SOLARIS2] (VALBITS, GCTYPEBITS): New definitions.
+ 
+ 	* s/sol2-4.h: New file.
+ 
+ Wed Aug  3 00:38:43 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* buffer.c (list_buffers_1): Add one column to size column.
+ 
+ 	* xterm.c (x_make_frame_visible): Start one_in_four at 1.
+ 
+ 	* window.c (Fwindow_end): Doc fix.
+ 
+ 	* xterm.c (construct_mouse_click, construct_menu_click):
+ 	Don't update x_mouse_grabbed, Vmouse_depressed, last_mouse_frame here.
+ 	(XTread_socket): Update them here, so we do it without fail.
+ 	(XTmouse_position, XTread_socket case MotionNotify):
+ 	Check last_mouse_frame is nonzero before using it.
+ 
+ 	* Makefile.in.in (alloca.o): Use -f in all rm's.
+ 
+ Tue Aug  2 18:08:18 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* keymap.c (Faccessible_keymaps): Use PREFIX to set loop starting
+ 	point; don't even consider maps except those reached via prefix.
+ 
+ 	* keyboard.c (make_lispy_event): If the position is not in a window,
+ 	at least pass along the frame it is in.
+ 
+ Mon Aug  1 18:28:32 1994  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+ 
+ 	* data.c (Ffset): Don't call Fget unless SYM's plist is consp.
+ 
+ Mon Aug  1 14:58:58 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* eval.c (Fprog2): Doc fix.
+ 
+ 	* window.c (Fmove_to_window_line): Doc fix.
+ 
+ Mon Aug  1 11:10:40 1994  Frederic Pierresteguy  (F.Pierresteguy@frcl.bull.fr)
+ 
+ 	* xmenu.c (xmenu_show): Ignore any geometry resource from the user.
+ 
+ Sun Jul 31 02:37:25 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xfns.c (Fx_get_resource): Doc fix.
+ 
+ 	* data.c (syms_of_data): Set up Qadvice_info, Qactivate_advice.
+ 	(Ffset): Activate advice if symbol has advice-info property.
+ 
+ 	* xdisp.c (redisplay_window): Avoid using SET_PT to change point
+ 	temporarily.
+ 
+ 	* dispnew.c (sit_for): Undo previous change.
+ 
+ Sat Jul 30 14:26:59 1994  enami tsugutomo  <enami@sys.ptg.sony.co.jp>
+ 
+ 	* dispnew.c (direct_output_for_insert): Pass missing 8th
+ 	argument to compute_char_face.
+ 
+ Sat Jul 30 16:36:38 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* keyboard.c (follow_key): Don't downcase letters here.
+ 	Delete arg `case_converted'.
+ 	(read_key_sequence): Do it here; but not if in middle of fcn key.
+ 
+ 	* fns.c (Frandom): Handle LIMIT >= 40000000.
+ 
+ 	* xdisp.c (decode_mode_spec): Handle %&.
+ 
+ Fri Jul 29 21:21:09 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* process.c (create_process): Set default handling for SIGINT, etc.
+ 
+ Thu Jul 28 08:46:00 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* process.c (wait_reading_process_input): Fix previous change.
+ 
+ 	* s/hpux9.h (HAVE_TERMIOS, NO_TERMIO): Defined.
+ 	(HAVE_TERMIO): Add #undef.
+ 
+ 	* sysdep.c (random): Use rand differently, and distinguish BSD/USG.
+ 
+ 	* fns.c (Frandom): Fix previous change.
+ 
+ Wed Jul 27 13:29:53 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* syssignal.h [POSIX_SIGNALS] (signal): New definition.
+ 
+ 	* config.h.in (HAVE_RAND48): Add #undef.
+ 
+ Tue Jul 26 11:25:58 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xterm.c (x_queue_event, x_unqueue_events): New functions.
+ 	(x_start_queuing_selection_requests): New function.
+ 	(x_stop_queuing_selection_requests): New function.
+ 	(XTread_socket): Queue up SelectionRequest events sometimes.
+ 	* xselect.c (x_get_foreign_selection): Use the new feature
+ 	to queue up SelectionRequest events.
+ 
+ 	* process.c (wait_reading_process_input): If wait_for_cell,
+ 	do check for keyboard input and handle it.
+ 
+ 	* fns.c (Frandom): Use just the low 30 bits of random's value.
+ 
+ 	* sysdep.c (random, srandom): Obey HAVE_RAND48 flag.
+ 	Test that random is not a macro.  Don't test USG or BSD4_1.
+ 
+ 	* m/tek4300.h (tek4300): Don't define if already defined.
+ 
+ Mon Jul 25 14:39:34 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* m/tek4300.h (BSD_PGRPS): Defined.
+ 
+ 	* puresize.h (PURESIZE): Increase non-MULTI_FRAME value.
+ 
+ 	* editfns.c (get_system_name): Add a cast.
+ 
+ 	* config.h.in: Add #undef HAVE_H_ERRNO.
+ 	* process.c, sysdep.c [!HAVE_H_ERRNO]: Declare h_errno.
+ 	* sysdep.c (init_system_name): Set h_errno to 0 initially.
+ 	* process.c (Fopen_network_stream): Set h_errno to 0 initially.
+ 
+ 	* window.c (Fdisplay_buffer): Add MULTI_FRAME cond in last change.
+ 
+ 	* Makefile.in.in: Add #undef alloca.
+ 
+ Sat Jul 23 21:20:05 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* minibuf.c (Fdisplay_completion_list): gcpro `completions'.
+ 
+ 	* print.c (internal_with_output_to_temp_buffer): gcpro things.
+ 
+ 	* puresize.h (PURESIZE): Incremented to 252000.
+ 
+ Sat Jul 23 12:26:36 1994  Jim Blandy  (jimb@totoro.bio.indiana.edu)
+ 
+         * .gdbinit: Set the breakpoint in x_error_quitter instead of
+         _XPrintDefaultError.
+ 
+ Wed Jul 20 00:56:24 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* window.c (Fnext_window, Fprevious_window): Don't get stuck in a loop
+ 	in the minibuffer frame.
+ 
+ 	* dispnew.c (direct_output_for_insert): Dpn't call compute_char_face
+ 	for a non-X frame.
+ 
+ 	* s/usg5-4.h: Move #undef static before the includes.
+ 
+ 	* xrdb.c [USG5] (SYSV): Don't define if already defined.
+ 
+ 	* fileio.c (Fwrite_region): Do unwind the new unwind protect.
+ 
+ Tue Jul 19 12:05:00 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* xterm.c (struct font_info): New field full_name.
+ 	(x_new_font): Record, and return, the full name of the font.
+ 
+ 	* widget.c (EmacsFrameSetCharSize): Delete the code to make rows at
+ 	least 3.
+ 
+ 	* fileio.c (Vwrite_region_annotations_so_far): New variable.
+ 	(syms_of_fileio): Set up Lisp var.
+ 	(build_annotations): Handle annotate functions that switch buffers.
+ 	Set Vwrite_region_annotations_so_far.
+ 	(Fwrite_region): Handle change of buffer in build_annotations.
+ 	Add an unwind protect to restore original buffer and kill the temp.
+ 
+ 	* sysdep.c (init_system_name): Retry gethostbyname after TRY_AGAIN
+         failure.
+ 
+ 	* process.c (Fopen_network_stream):
+ 	Retry gethostbyname after TRY_AGAIN failure.
+ 
+ 	* s/isc4-0.h [__GNUC__] (LIBX11_SYSTEM): Add -lcposix.
+ 
+ 	* s/usg5-4.h (PTY_TTY_NAME_SPRINTF): Fail smoothly if cannot get pty.
+ 
+ 	* sysdep.c (sys_subshell): Expand ~ in dir.
+ 	Do the processing of dir before calling fork.
+ 	Use vfork.
+ 
+ Mon Jul 18 02:09:30 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* xterm.c (note_mouse_movement): Use proper data type for window
+ 	args to XQueryPointer.
+ 	(x_scroll_bar_note_movement): Likewise.
+ 
+ 	* keyboard.c (Vdeferred_action_list, Vdeferred_action_function):
+ 	New variables.
+ 	(command_loop_1): Handle them.
+ 	(syms_of_keyboard): Set up Lisp variables.
+ 
+ 	* s/linux.h [emacs]: Include stdio.h.
+ 
+ 	* commands.h (unread_command_char): Declared.
+ 	* dispnew.c (sit_for): Return immediately if unread events exist.
+ 
+ Sun Jul 17 19:52:42 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* textprop.c (Fget_text_property): Simplify using Ftext_properties_at.
+ 
+ Sun Jul 17 02:41:19 1994  Richard Stallman  <rms@mole.gnu.ai.mit.edu>
+ 
+ 	* xfns.c (Fx_create_frame): Use 140 as default font size.
+ 
+ 	* xmenu.c [USE_X_TOOLKIT] (xmenu_show): Handle UnmapNotify events.
+ 
+ Sat Jul 16 14:31:34 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* window.c (Fdisplay_buffer): Cope with unsplittable frames
+ 	and dedicated windows.
+ 
+ 	* frame.c [!MULTI_FRAME] (Fframe_first_window): Defined.
+ 	(syms_of_frame): Defvar it.
+ 
+ Thu Jul 14 19:56:33 1994  Morten Welinder  (terra@diku.dk)
+ 
+ 	* s/msdos.h (HAVE_VOLATILE): Define.
+ 
+ Thu Jul 14 00:59:50 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* keyboard.c (safe_run_hooks): Use local var to restore hook's value.
+ 
+ Wed Jul 13 20:55:47 1994  Morten Welinder  (terra@diku.dk)
+ 
+ 	* keyboard.c (kbd_buffer_get_event) [HAVE_MOUSE]: Include code
+ 	to check for mouse dragging.
+ 	(make_lispy_movement) [HAVE_MOUSE]: Define also in this case,
+ 	but only include the non-multiframe stuff.
+ 
+ 	* msdos.c (mouse_init1): Use alternate mouse detection for old
+ 	mouse drivers.
+ 	(mouse_get_pos): Downscale coordinates by 8.
+ 
+ Wed Jul 13 00:11:17 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* window.c (Fselect_window): Fix bug checking new_point is in range.
+ 
+ 	* fileio.c (syms_of_fileio): Finish previous change.
+ 
+ 	* keyboard.c (command_loop_1): Do direct output for cursor motion
+ 	over text chars when disp tab exists but says nothing for them.
+ 
+ 	* frame.h (FRAME_EXTERNAL_MENU_BAR) [!USE_X_TOOLKIT]: Give zero.
+ 
+ 	* xdisp.c [!HAVE_X_WINDOWS] (compute_char_face, compute_glyph_face):
+ 	Add simple alternate definitions for non-X case.
+ 
+ Tue Jul 12 15:09:25 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* process.c (Qlast_nonmenu_event): New variable.
+ 	(syms_of_process): Set it up.
+ 	(read_process_output, exec_sentinel): Bind it to t around filter.
+ 
+ 	* fileio.c (Fmake_directory_internal): Use Qmake_directory_internal.
+ 	(syms_of_fileio): Set up Qmake_directory_internal, not Qmake_directory.
+ 
+ 	* frame.c [MULTI_FRAME] (Fframe_parameters): For non-X frames,
+ 	fill in menu-bar-lines value.
+ 
+ Mon Jul 11 20:46:53 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* xmenu.c (xmenu_show): Don't call XtUngrabPointer here.
+ 
+ 	* Makefile.in.in (ctagsfiles): Rewrite to avoid compiler bug.
+ 
+ Sun Jul 10 20:37:09 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* window.c (Fdisplay_buffer): Add MULTI_FRAME conditional
+ 	in previous change.
+ 
+ Sun Jul 10 19:11:24 1994  Morten Welinder  (terra@diku.dk)
+ 
+ 	* m/intel386.h [MSDOS] (NO_REMAP): Defined.
+ 	* s/msdos.h (HAVE_MOUSE, PURESIZE): Definitions moved here.
+ 	* m/dos386.h: File obsolete and deleted.
+ 
+ 	* msdos.c (dos_rawgetc): Use bios, not kbhit.
+ 
+ Sat Jul  9 14:20:11 1994  Morten Welinder  (terra@diku.dk)
+ 
+ 	* fileio.c (Ffile_name_directory, Ffile_name_nondirectory,
+ 	file_name_as_directory, directory_file_name, Fexpand_file_name,
+ 	Ffile_name_absolute_p, Fsubstitute_in_file_name) [MSDOS]:
+ 	Allow backslashed file names.
+ 
+ Sat Jul  9 00:43:51 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* puresize.h (PURESIZE) [MULTI_FRAME]: Increased to 250000.
+ 
+ 	* lread.c (readevalloop): Correctly unbind the unwind protect.
+ 
+ Fri Jul  8 16:24:59 1994  Morten Welinder  (terra@diku.dk)
+ 
+ 	* msdos.c (do_visible_bell): Clean-up using GNU assembly extension.
+ 
+ Thu Jul  7 00:52:10 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* m/sparc.h (BIG_ENDIAN): Don't redefine if defined.
+ 
+ 	* Makefile.in.in (alloca.o): Delete allocatem.c first thing.
+ 
+ 	* xmenu.c (xmenu_show) {USE_X_TOOLKIT}: ButtonPress no longer pops
+ 	down; instead it forces the next ButtonRelease to exit.  Don't
+ 	dispatch on ButtonPress events.
+ 
+ 	* xfns.c (syms_of_xfns): Provide x-toolkit in toolkit version.
+ 	Undo previous change.
+ 	(x_toolkit): Variable deleted.
+ 
+ 	* xfns.c (x_toolkit): New variable.
+ 	(syms_of_xfns): Set up Lisp var x-toolkit.
+ 
+ 	* window.c (Fnext_window, Fprevious_window): ALL_FRAMES = 0 means
+ 	try both visible frames and iconified frames.
+ 	(window_loop): Likewise, for FRAMES = 0.
+ 	(Fget_buffer_window): Likewise, for FRAME = 0.
+ 	(Fdisplay_buffer): Pass 0 to Fget_buffer_window;
+ 	if the frame is iconified, make it visible.
+ 
+ 	* frame.c (next_frame, prev_frame):
+ 	MINIBUF = 0 means try visible frames and iconified frames.
+ 
+ Wed Jul  6 15:30:48 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* xmenu.c (xmenu_show) [USE_X_TOOLKIT]: Keyboard input exits the menu.
+ 	ButtonRelease does so if within Vdouble_click_time.
+ 	Ignore mouse motion if button was already released.
+ 	(menu_item_selection): Declare volatile, if __STDC__.
+ 
+ 	* keyboard.c (make_lispy_event): Ignore menu bar up events.
+ 
+ Tue Jul  5 02:18:22 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* doprnt.c (doprnt): Handle padding on %c.
+ 
+ 	* frame.c (next_frame, prev_frame): Change which frames to use
+ 	when MINIBUF is a window.
+ 	(Fnext_frame, Fprevious_frame): Doc fixes.
+ 
+ 	* window.c: Doc fixes.
+ 
+ Mon Jul  4 23:54:05 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* xterm.c (XTread_socket, construct_menu_click) [USE_X_TOOLKIT]:
+ 	Update x_mouse_grabbed and Vmouse_depressed.
+ 
+ Sat Jul  2 00:23:23 1994  Richard Stallman  (rms@gnu.ai.mit.edu)
+ 
+ 	* xdisp.c (decode_mode_spec): %+ makes % for unmodified RO buffer.
+ 
+ 	* buffer.c (syms_of_buffer): Doc fix.
+ 
+ 	* xfaces.c (get_cached_face): Set the cached_index field.
+ 
+ Fri Jul  1 11:34:08 1994  Richard Stallman  (rms@gnu.ai.mit.edu)
+ 
+ 	* sysdep.c (init_sys_modes): Turn off VSTART and VSTOP chars.
+ 	On DGUX, turn off INPCK.
+ 
+ Fri Jul  1 03:13:06 1994  Paul Reilly  (pmr@churchy.gnu.ai.mit.edu)
+ 
+ 	* xfns.c (Fx_create_frame): Add GC protection for frame being made.
+ 
+ Thu Jun 30 00:27:11 1994  Richard Stallman  (rms@gnu.ai.mit.edu)
+ 
+ 	* xterm.c (x_make_frame_visible): In x_sync loop at the end,
+ 	every fourth time, sleep for 1/4 second.
+ 
+ 	* xselect.c (x_own_selection, x_get_foreign_selection):
+ 	Get rid of spurious X_TOOLKIT conditional.
+ 
+ 	* frame.c (Fdelete_frame): Call x_clear_frame_selections.
+ 
+ 	* xselect.c (x_own_selection): Put the frame in Vselection_alist.
+ 	(x_clear_frame_selections): New function.
+ 
+ 	* xterm.c (x_draw_box): Use curs_x and curs_y, not f->cursor_[xy].
+ 
+ 	* xfns.c (XLIB_ILLEGAL_ACCESS): Defined.
+ 
+ Wed Jun 29 14:57:27 1994  Richard Stallman  (rms@gnu.ai.mit.edu)
+ 
+ 	* s/hpux.h (random, srandom): Defined.
+ 
+ 	* cmds.c (internal_self_insert): Now can return 2.
+ 	* keyboard.c (command_loop_1): Don't clear nonundocount
+ 	when internal_self_insert returns 1.
+ 
+ Tue Jun 28 18:21:08 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* xfns.c (x_set_frame_parameters): Call x_set_offset directly.
+ 	Handle `-' for position parameters.
+ 
+ Tue Jun 28 17:50:22 1994  Karl Heuer  (kwzh@hal.gnu.ai.mit.edu)
+ 
+ 	* lread.c (readchar): Restart interrupted I/O.
+ 
+ Tue Jun 28 15:00:45 1994  Roland McGrath  (roland@churchy.gnu.ai.mit.edu)
+ 
+ 	* fileio.c (a_write): Loop while *ANNOT is listp, not consp.
+ 	Previous code omitted all data from output files when *ANNOT was
+ 	nil.
+ 
+ Tue Jun 28 05:25:06 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* xfns.c (x_set_name): If no change needed, avoid consing.
+ 
+ 	* xdisp.c (prepare_menu_bars): Call x_consider_frame_title
+ 	only if windows_or_buffers_changed.
+ 
+ 	* keyboard.c (safe_run_hooks): Take symbol as arg.
+ 	Use Fsymbol_value and Fset.
+ 	(command_loop_1): Pass symbol to safe_run_hooks.
+ 	Look in the value cell to check for trivial case (no hooks).
+ 
+ 	* xdisp.c (redisplay_region): For special treatment, BUF most be
+ 	both current and displayed in selected window.
+ 
+ 	* buffer.c (Foverlay_put): Pass redisplay_region a struct buffer *.
+ 
+ Mon Jun 27 16:43:46 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* fileio.c (a_write): Verify that *annot is a cons.
+ 
+ Sun Jun 26 12:28:23 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* keyboard.c (echo_dash): Fix backwards conditional.
+ 	(read_key_sequence): Don't echo if echo_keystrokes is 0.
+ 
+ 	* m/news-risc.h (C_DEBUG_SWITCH) [not NEWSOS5]:
+ 	Don't define if __GNUC__.
+ 	(KERNEL_FILE) [not NEWSOS5]: New override definition.
+ 
+ Sat Jun 25 12:28:24 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* process.c (send_process): Major rewrite.
+ 	Don't put in a C-d unless a single line is too long.
+ 	Read process input whenever output gets stuck.
+ 	Relocate BUF if we read input.  New arg OBJECT.
+ 	(Fprocess_send_region, Fprocess_send_string, process_send_signal)
+ 	(Fprocess_send_eof): Pass new arg OBJECT.
+ 
+ 	* buffer.h (BUF_PTR_CHAR_POS): New macro.
+ 
+ 	* window.c (Fsave_window_excursion): Doc fix.
+ 
+ 	* s/hpux9.h (C_SWITCH_SYSTEM): Add -D_BSD.
+ 
+ 	* frame.c (Fframe_parameters): Don't handle menu-bar-lines explicitly.
+ 
+ 	* window.c (Fother_window_for_scrolling): New function.
+ 	(Fscroll_other_window): Use that.
+ 	(syms_of_window): defsubr it.
+ 
+ Fri Jun 24 20:13:01 1994  Karl Heuer  (kwzh@nutrimat.gnu.ai.mit.edu)
+ 
+ 	* fileio.c (Finsert_file_contents): Fix check for non-regular files.
+ 
+ Fri Jun 24 10:09:46 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* syntax.c (scan_lists, Fforward_comment): When moving backward over
+ 	a comment, ignore a comment-starter that overlaps the comment-ender.
+ 
+ 	* minibuf.c (Fcompleting_read): Doc fix.
+ 
+ Thu Jun 23 20:33:17 1994  Karl Heuer  (kwzh@hal.gnu.ai.mit.edu)
+ 
+ 	* keyboard.c (syms_of_keyboard): Don't staticpro the same var twice.
+ 
+ Thu Jun 23 15:15:09 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* s/convexos.h: File deleted.
+ 
+ 	* xterm.c: Don't include string.h or strings.h.
+ 
+ 	* term.c (term_get_fkeys): Don't redeclare term_get_fkeys_1 here.
+ 
+ 	* m/convex.h (LIBS_MACHINE, GETPGRP_NO_ARG): Defined.
+ 	(NLIST_NAME_UNION, DECLARE_GETPWUID_WITH_UID_T): Defined.
+ 	(CRT0_DUMMIES): Conditionalize according to __GNUC__.
+ 	(convex): Define if necessary.
+ 	(C_SWITCH_MACHINE): Definition deleted.
+ 
+ Wed Jun 22 00:15:49 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* buffer.c (Fmove_overlay): Fix typo in previous change.
+ 
+ 	* s/sunos4shr.h (X_IO_BUG): Defined.
+ 
+ Tue Jun 21 13:51:44 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* minibuf.c (read_minibuf_unwind): Run Qminibuffer_exit_hook here.
+ 	(read_minibuf): Not here.
+ 
+ 	* buffer.c (Fkill_buffer): Don't delete auto save file
+ 	if it didn't come from this Emacs session.
+ 	(Fmove_overlay): Add missing XINT calls in previous change.
+ 
+ Mon Jun 20 20:40:37 1994  Karl Heuer  (kwzh@hal.gnu.ai.mit.edu)
+ 
+ 	* xfns.c (x_window): Delete duplicate computation.
+ 	Change type of reference argument from int to Dimension.
+ 
+ Mon Jun 20 10:50:29 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* config.h.in: Move #undef HAVE_STRERROR before the #includes.
+ 
+ 	* m/mips4.h (HAVE_STRERROR, HAVE_XRMSETDATABASE)
+ 	(HAVE_XSCREENRESOURCESTRING, HAVE_SETSID): Add #undefs.
+ 
+ 	* buffer.c (Fmove_overlay): Call redisplay_region even when
+ 	changing to a different buffer.
+ 
+ 	* syntax.c (Fmatching_paren): Fix typo.
+ 
+ 	* xterm.c (show_mouse_face): Set endcolumn ok in side-by-side windows.
+ 
+ Sun Jun 19 01:01:42 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* s/linux.h (SEGMENT_MASK): Defined.
+ 
+ 	* xfns.c (x_window): Take account of pane widget internal border width.
+ 
+ 	* s/linux.h (C_OPTIMIZE_SWITCH): Definition deleted.
+ 
+ 	* lisp.h (RETURN_UNGCPRO): Swallow semicolon.
+ 	(GCPRO5): New macro.
+ 
+ 	* xmenu.c (single_keymap_panes): Put menu_item_equiv_key in the gcpro.
+ 	(menu_item_equiv_key): GCPRO things.
+ 
+ 	* keymap.c (Flookup_key): Add gcpro.
+ 	(Fkey_binding, Fminor_mode_key_binding): Likewise.
+ 	(Fwhere_is_internal): Likewise.
+ 
+ 	* keyboard.c (apply_modifiers): Use assq_no_quit.
+ 
+ Sun Jun 19 03:54:02 1994  Erik Naggum  (erik@naggum.no)
+ 
+ 	* syntax.h (SYNTAX_MATCH): Fix typo (syntax -> matcher).
+ 
+ 	* syntax.c (Fmatching_paren): New function.
+ 	(Fchar_syntax): Pass arg directly to SYNTAX, no masking.
+ 
+ Sat Jun 18 15:20:10 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* .gdbinit: Doc fixes.
+ 	(xsymbol): Cast $ to int.
+ 	(xvector, xstring): Don't use a string constant.
+ 	Reduce size limit for printing contents.
+ 
+ 	* s/sol2.h (GETTIMEOFDAY_ONE_ARGUMENT): Undo previous change.
+ 
+ Sat Jun 18 19:52:15 1994  Francesco Potorti`  (pot@fly.cnuce.cnr.it)
+ 
+ 	* m/delta.h (memmove): switch the first two args.
+ 
+ Sat Jun 18 09:00:50 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* xterm.c (x_make_frame_visible): At end, wait till Emacs sees
+ 	frame is visible.
+ 
+ 	* keyboard.c (echo_after_prompt): New variable.
+ 	(echo_prompt, cancel_echoing): Set it.
+ 	(echo_dash): Test it.
+ 
+ 	* s/linux.h (C_DEBUG_SWITCH): Define, if THIS_IS_CONFIGURE.
+ 	(HAVE_GETTIMEOFDAY, HAVE_MKDIR, HAVE_RMDIR):
+ 	(HAVE_XSCREENNUMBEROFSCREEN, HAVE_XRMSETDATABASE):
+ 	Comment out these definitions.
+ 
+ 	* Makefile.in.in (doprnt.o): Depend on config_h.
+ 
+ Fri Jun 17 19:30:46 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* systime.h (EMACS_GET_TIME): Test GETTIMEOFDAY_ONE_ARGUMENT,
+ 	not USG5_4.
+ 	* s/usg5-4.h (GETTIMEOFDAY_ONE_ARGUMENT): Define it.
+ 	* s/sol2.h (GETTIMEOFDAY_ONE_ARGUMENT): Undef it.
+ 
+ 	* xfns.c (x_real_positions): Make sure we know the parent window.
+ 
+ Fri Jun 17 16:01:55 1994  Karl Heuer  (kwzh@hal.gnu.ai.mit.edu)
+ 
+ 	* window.h (minibuf_prompt): Now a Lisp_Object.  All uses changed.
+ 
+ 	* minibuf.c (minibuf_save_list): New variable, replaces
+ 	minibuf_save_vector.
+ 	(read_minibuf): Cons it up.
+ 	(read_minibuf_unwind): Pop back the saved values.
+ 	(syms_of_minibuf): staticpro it.
+ 
+ 	* indent.c (compute_motion): Recenter overlays, for speed.
+ 
+ Fri Jun 17 09:33:21 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* xterm.c (scratch_cursor_gc): New variable.
+ 	(dumpglyphs): Rework handling of GCs for cursor display
+ 	to use scratch_cursor_gc, and reuse the GC more.
+ 
+ Thu Jun 16 14:50:43 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* unexec.c (make_hdr): Handle case of no "additional header".
+ 
+ 	* xdisp.c (redisplay_region): Treat selected window's buffer
+ 	specially, not current buffer.
+ 
+ 	* syssignal.h [USG5_4] (sigblock): Use |, not &.
+ 
+ Thu Jun 16 11:36:35 1994  Karl Heuer  (kwzh@hal.gnu.ai.mit.edu)
+ 
+ 	* xdisp.c (redisplay_window): Don't use shortcut if window_end_vpos
+ 	is out of date.
+ 
+ Thu Jun 16 11:01:33 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* process.c (Fprocess_status): Return nil for process name
+ 	that has no process.
+ 
+ 	* dispnew.c (syms_of_display): Make baud-rate a user var.
+ 
+ 	* syntax.c (scan_lists): Get error if eob within comment with depth!=0.
+ 
+ Thu Jun 16 02:55:51 1994  Roland McGrath  (roland@geech.gnu.ai.mit.edu)
+ 
+ 	* unexec.c: Include <sys/file.h> and [USG5] <fcntl.h> to define
+         O_* macros.
+ 	(O_RDONLY, O_RDWR): Define if undefined.
+ 	[emacs] (report_error): Use report_file_error so the user can tell
+ 	what the errno code was.
+ 	(unexec): Use O_RDONLY instead of explicit 0.
+ 	(make_hdr): Don't undo A_TEXT_OFFSET adjustment #ifndef NO_REMAP,
+ 	since it was never adjusted earlier #ifndef NO_REMAP.
+ 	(adjust_lnnoptrs): Use O_RDWR instead of explicit 2.
+ 
+ Wed Jun 15 16:11:16 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* xterm.c (x_noop_count): New variable.
+ 	(x_term_init) [X_IO_BUG]: Init it.
+ 	(XTread_socket) [X_IO_BUG]: Don't do XNoOp every time, just 1 in 100.
+ 
+ Wed Jun 15 00:03:36 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* syssignal.h (sigblock) [USG5_4]: Define if not defined.
+ 
+ Tue Jun 14 23:40:29 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* lread.c: Put config.h first.
+ 
+ 	* hftctl.c: Put sys/signal.h and errno.h first, then config.h.
+ 
+ 	* dired.c: Put stdio.h, sys/types.h and sys/stat.h after config.h.
+ 
+ 	* callproc.c, dispnew.c, frame.c, term.h: Put stdio.h after config.h.
+ 	* widget.c, xmenu.c, xterm.c: Put stdio.h after config.h.
+ 
+ Tue Jun 14 20:17:16 1994  Karl Heuer  (kwzh@hal.gnu.ai.mit.edu)
+ 
+ 	* sysdep.c (init_system_name): New function, replaces get_system_name.
+ 	* lisp.h: declare it.
+ 	* editfns.c (init_editfns): Call it.
+ 	(get_system_name): New function, now just uses Vsystem_name.
+ 	* xterm.c (x_term_init): Use Vsystem_name instead of calling
+ 	get_system_name.
+ 
+ 	* keymap.c (Fsingle_key_description): Allow strings as keys.
+ 
+ 	* process.c (create_process): Set input_wait_mask before forking.
+ 
+ Tue Jun 14 15:45:44 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* indent.c (vmotion): Use find_next_newline_no_quit.
+ 	(indented_beyond_p): Likewise.
+ 
+ 	* search.c (find_next_newline_no_quit): New function.
+ 
+ 	* sysdep.c (init_sys_modes): Don't set up sigio here if window system.
+ 
+ 	* keyboard.c (read_key_sequence): Verify event has a POSN_BUFFER_POSN
+ 	before trying to extract it.
+ 
+ 	* eval.c (init_eval_once): Call xmalloc, not malloc.
+ 
+ 	* process.c (Fprocess_send_eof): Doc fix.
+ 
+ Mon Jun 13 17:07:59 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* keyboard.c (interrupt_signal, init_keyboard):
+ 	Don't handle SIGINT and SIGQUIT if using window system directly.
+ 
+ 	* sysdep.c (init_sys_modes): Don't call set_terminal_modes
+ 	if using a window system.
+ 
+ 	* xterm.c (XTread_socket): Use x_top_window_to_frame in prev change.
+ 
+ 	* s/sol2.h (SOLARIS2): Defined.
+ 
+ 	* m/intel386.h: Add conditional for SOLARIS2.
+ 
+ Mon Jun 13 16:55:30 1994  Karl Heuer  (kwzh@hal.gnu.ai.mit.edu)
+ 
+ 	* xmenu.c (single_keymap_panes): gcpro some things.
+ 
+ Mon Jun 13 15:44:51 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* xterm.c (XTread_socket): Handle Xatom_wm_save_yourself
+ 	by calling XSetCommand.
+ 
+ 	* emacs.c (init_cmdargs): Set up initial_argv, initial_argc.
+ 
+ 	* keyboard.c (syms_of_keyboard): Properly init Vsystem_key_alist.
+ 
+ 	* unexaix.c (adjust_lnnoptrs): Handle multiple aux symbols.
+ 
+ Sun Jun 12 15:57:02 1994  Karl Heuer  (kwzh@hal.gnu.ai.mit.edu)
+ 
+ 	* editfns.c (transpose_markers): Allow for gap at start of region.
+ 	(Ftranspose_regions): Don't precompute pointers into buffer text.
+ 
+ Sun Jun 12 08:42:36 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* xfns.c (x_window): Request "save yourself" commands.
+ 
+ 	* callint.c (Fcall_interactively): Ignore `-' in string.
+ 	(Fcall_interactively): Don't call minibuffer-window-active-p;
+ 	determine directly whether a minibuf window is active.
+ 
+ 	* keyboard.c (read_char): When we loop and call redisplay,
+ 	do prepare_menu_bars first.
+ 
+ Sat Jun 11 08:12:46 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* search.c (Freplace_match): Be sure not to treat non-digit like digit.
+ 
+ 	* xmenu.c (xmenu_show): Don't call XMenuDestroy twice
+ 	in XM_FAILURE case.
+ 
+ 	* Makefile.in.in (xterm.o): Depend on dispextern.h.
+ 
+ 	* s/sunos4-1-3.h (X_IO_BUG): Defined.
+ 
+ Fri Jun 10 16:31:19 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* s/linux.h (CLASH_DETECTION): Defined.
+ 
+ 	* minibuf.c (Fdisplay_completion_list):
+ 	Require at least two spaces between items.
+ 
+ Tue Jun  7 13:33:23 1994  Richard Stallman  (rms@geech.gnu.ai.mit.edu)
+ 
+ 	* keyboard.c (command_loop_1):
+ 	Treat nil in display tab like no display tab.
+ 
+ Tue Jun  7 11:50:49 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* mips-siemens.h:  Include pyramid.h, not mips.h.
+ 	(LOAD_AVE_TYPE, LOAD_AVE_CVT): Definitions deleted.
+ 	(NO_ARG_ARRAY, HAVE_ALLOCA): Defined.
+ 	(BROKEN_FIONREAD): Add #undef.
+ 
+ Tue Jun  7 19:19:04 1994  Morten Welinder  (terra@diku.dk)
+ 
+ 	* msdos.c (init_environment): Clean up code and make the default
+ 	EMACSPATH equal to the directory from which Emacs was started.
+ 	(emacsroot): New variable.
+ 	(rootrelativepath): New function.
+ 	* msdos.h: Add template for rootrelativepath.
+ 	* lread.c [MSDOS]: #include "msdos.h".
+ 	* callproc.c (init_callproc) [MSDOS]: Exclude less code, so ../etc
+ 	is still tested for doc file.
+ 
+ Mon Jun  6 21:11:13 1994  Karl Heuer  (kwzh@hal.gnu.ai.mit.edu)
+ 
+ 	* fns.c (Fy_or_n_p, Fyes_or_no_p) [HAVE_X_MENU]: Redisplay before
+ 	popping up a menu.
+ 
+ 	* dispnew.c (Fframe_or_buffer_changed_p): Reuse the state vector.
+ 
+ Mon Jun  6 08:37:39 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* frame.c (Ficonify_frame, Fmake_frame_invisible, Fmake_frame_visible):
+ 	Increment windows_or_buffers_changed.
+ 
+ 	* xdisp.c (redisplay): Don't call x_consider_frame_title.
+ 	(display_mode_line): Likewise.
+ 	(prepare_menu_bars): Call it here.
+ 
+ Mon Jun  6 01:02:32 1994  Karl Heuer  (kwzh@hal.gnu.ai.mit.edu)
+ 
+ 	* dispnew.c (Fframe_or_buffer_changed_p): New function.
+ 
+ Sun Jun  5 07:13:01 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* xterm.c (x_wm_set_icon_position, x_wm_set_icon_pixmap):
+ 	[USE_X_TOOLKIT]: Use top-level widget's window.
+ 
+ 	* s/bsd386.h (BSD): Redefine.
+ 	(WAITTYPE, WRETCODE, WCOREDUMP): New definitions.
+ 	Include wait.h.
+ 
+ 	* m/sun386.h (LIBS_MACHINE) [USG]: New #define.
+ 
+ 	* xterm.c (x_term_init): New args xrm_option and resource_string.
+ 	Pass an -xrm option to XtAppInitialize if appropriate.
+ 
+ 	* xfns.c (Fx_open_connection): Set up Vx_resource_name and xrm_option
+ 	before calling x_term_init.  Pass new args.
+ 
+ 	* keyboard.c (modify_event_symbol): Return nil if out of range.
+ 
+ 	* keymap.c (Fkey_description): Avoid using Fmapconcat--do it directly.
+ 
+ 	* keyboard.c, dispnew.c: Include systime.h after xterm.h.
+ 
+ 	* xfns.c (x_window): Take account of internal border of paned widget.
+ 
+ 	* m/dos386.h (PURESIZE): Increased to 240000.
+ 
+ 	* xfns.c (using_x_p): New function.
+ 	* fns.c (Fy_or_n_p): Don't use dialog box if not an X frame.
+ 	(Fyes_or_no_p): Likewise.
+ 
+ Sat Jun  4 14:35:09 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* s/hpux9shr.h (C_DEBUG_SWITCH): Define as empty.
+ 
+ Fri Jun  3 20:14:30 1994  Morten Welinder  (terra@diku.dk)
+ 
+ 	* callproc.c [MSDOS]: #include "msdos.h" for rootrelativepath
+ 	template.
+ 
+ 	* msdos.c (run_msdos_command): Make local copy of argv[2] on stack,
+ 	not on heap.
+ 	(run_msdos_command): When changing argv[2] from using slashes to
+ 	using backslashes, only do so on the first white-space delimited
+ 	part.
+ 
+ Thu Jun  2 19:41:08 1994  Karl Heuer  (kwzh@hal.gnu.ai.mit.edu)
+ 
+ 	* textprop.c (Fprevious_single_property_change): Check for null
+ 	interval after correcting for edge effects.
+ 
+ 	* xdisp.c (display_text_line): Make sure pointer is in range.
+ 
+ 	* xmenu.c (xdialog_show): Fix problem with message in dialog box.
+ 
+ Thu Jun  2 15:11:57 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* emacs.c (main): Do the setpgrp after checking for -batch.
+ 
+ 	* keyboard.c (command_loop_1): Properly handle nil in display table.
+ 
+ 	* s/hpux9.h (C_SWITCH_SYSTEM): Put inside __GNUC__ conditional.
+ 
+ Wed Jun  1 14:55:45 1994  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* process.c (kill_buffer_processes): For net conn, use Fdelete_process.
+ 
+ See ChangeLog.4 for earlier changes.
diff -2rcpP --exclude=*.elc emacs-19.30/src/Makefile.in emacs-19.31/src/Makefile.in
*** emacs-19.30/src/Makefile.in	Fri Nov 10 11:25:29 1995
--- emacs-19.31/src/Makefile.in	Sat May 18 16:12:39 1996
***************
*** 16,20 ****
  # 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.  */
  
  # Here are the things that we expect ../configure to edit.
--- 16,21 ----
  # 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, Inc., 59 Temple Place - Suite 330,
! # Boston, MA 02111-1307, USA.
  
  # Here are the things that we expect ../configure to edit.
*************** LN_S=@LN_S@
*** 31,34 ****
--- 32,36 ----
  # On Xenix and the IBM RS6000, double-dot gets screwed up.
  dot = .
+ dotdot = ${dot}${dot}
  lispsource = ${srcdir}/$(dot)$(dot)/lisp/
  libsrc = $(dot)$(dot)/lib-src/
*************** S_FILE = ${srcdir}/@opsysfile@
*** 44,48 ****
  config_h = config.h $(M_FILE) $(S_FILE)
  
! # ========================== start of cpp stuff ======================= */
  /* From here on, comments must be done in C syntax.  */
  
--- 46,50 ----
  config_h = config.h $(M_FILE) $(S_FILE)
  
! # ========================== start of cpp stuff =======================
  /* From here on, comments must be done in C syntax.  */
  
*************** C_SWITCH_SYSTEM=
*** 54,57 ****
--- 56,60 ----
  SHELL=/bin/sh
  
+ #define THIS_IS_MAKEFILE
  #define NO_SHORTNAMES
  #define NOT_C_CODE
*************** CC = C_COMPILER
*** 110,119 ****
  #endif
  
! /* Some s/*.h files define this to request special libraries.  */
  #ifndef LIBS_SYSTEM
  #define LIBS_SYSTEM
  #endif
  
! /* Some m/*.h files define this to request special libraries.  */
  #ifndef LIBS_MACHINE
  #define LIBS_MACHINE
--- 113,122 ----
  #endif
  
! /* Some s/SYSTEM.h files define this to request special libraries.  */
  #ifndef LIBS_SYSTEM
  #define LIBS_SYSTEM
  #endif
  
! /* Some m/MACHINE.h files define this to request special libraries.  */
  #ifndef LIBS_MACHINE
  #define LIBS_MACHINE
*************** CC = C_COMPILER
*** 128,132 ****
  #endif /* LIB_MATH */
  
! /* Some s/*.h files define this to request special switches in ld.  */
  #ifndef LD_SWITCH_SYSTEM
  #if !defined (__GNUC__) && (defined(COFF_ENCAPSULATE) || (defined (BSD) && !defined (COFF)))
--- 131,135 ----
  #endif /* LIB_MATH */
  
! /* Some s/SYSTEM.h files define this to request special switches in ld.  */
  #ifndef LD_SWITCH_SYSTEM
  #if !defined (__GNUC__) && (defined(COFF_ENCAPSULATE) || (defined (BSD) && !defined (COFF)))
*************** CC = C_COMPILER
*** 137,151 ****
  #endif /* LD_SWITCH_SYSTEM */
  
! /* Some m/*.h files define this to request special switches in ld.  */
  #ifndef LD_SWITCH_MACHINE
  #define LD_SWITCH_MACHINE
  #endif
  
! /* Some m/*.h files define this to request special switches in cc.  */
  #ifndef C_SWITCH_MACHINE
  #define C_SWITCH_MACHINE
  #endif
  
! /* Some s/*.h files define this to request special switches in cc.  */
  #ifndef C_SWITCH_SYSTEM
  #define C_SWITCH_SYSTEM
--- 140,154 ----
  #endif /* LD_SWITCH_SYSTEM */
  
! /* Some m/MACHINE.h files define this to request special switches in ld.  */
  #ifndef LD_SWITCH_MACHINE
  #define LD_SWITCH_MACHINE
  #endif
  
! /* Some m/MACHINE.h files define this to request special switches in cc.  */
  #ifndef C_SWITCH_MACHINE
  #define C_SWITCH_MACHINE
  #endif
  
! /* Some s/SYSTEM.h files define this to request special switches in cc.  */
  #ifndef C_SWITCH_SYSTEM
  #define C_SWITCH_SYSTEM
*************** CC = C_COMPILER
*** 186,190 ****
  
  #ifndef CRT0_COMPILE
! #define CRT0_COMPILE $(CC) -c $(ALL_CFLAGS) C_SWITCH_ASM 
  #endif
  
--- 189,193 ----
  
  #ifndef CRT0_COMPILE
! #define CRT0_COMPILE $(CC) -c $(ALL_CFLAGS) C_SWITCH_ASM
  #endif
  
*************** STARTFILES = START_FILES
*** 231,235 ****
  MYCPPFLAG= -Blocal
  /* LOCALCPP is the local one or nothing.
!    CPP is the local one or the standardone.  */
  LOCALCPP= localcpp
  #endif /* ! defined (LONGNAMEBBBARFOOX) */
--- 234,238 ----
  MYCPPFLAG= -Blocal
  /* LOCALCPP is the local one or nothing.
!    CPP is the local one or the standard one.  */
  LOCALCPP= localcpp
  #endif /* ! defined (LONGNAMEBBBARFOOX) */
*************** ALL_CFLAGS=-Demacs -DHAVE_CONFIG_H $(TOO
*** 284,291 ****
  
  #ifdef HAVE_X_WINDOWS
! #ifdef HAVE_X_MENU
  
  /* Include xmenu.o in the list of X object files.  */
! XOBJ= xterm.o xfns.o xfaces.o xmenu.o xselect.o xrdb.o
  
  /* The X Menu stuff is present in the X10 distribution, but missing
--- 287,294 ----
  
  #ifdef HAVE_X_WINDOWS
! #ifdef HAVE_MENUS
  
  /* Include xmenu.o in the list of X object files.  */
! XOBJ= xterm.o xfns.o xfaces.o xselect.o xrdb.o
  
  /* The X Menu stuff is present in the X10 distribution, but missing
*************** LIBXMENU= -lXMenu
*** 304,308 ****
  #endif /* not HAVE_X11 */
  
! #else /* not HAVE_X_MENU */
  
  /* Otherwise, omit xmenu.o from the list of X object files, and
--- 307,311 ----
  #endif /* not HAVE_X11 */
  
! #else /* not HAVE_MENUS */
  
  /* Otherwise, omit xmenu.o from the list of X object files, and
*************** LIBXMENU= -lXMenu
*** 310,314 ****
  XOBJ= xterm.o xfns.o xfaces.o xselect.o xrdb.o
  LIBXMENU=
! #endif /* not HAVE_X_MENU */
  
  #ifdef USE_X_TOOLKIT
--- 313,317 ----
  XOBJ= xterm.o xfns.o xfaces.o xselect.o xrdb.o
  LIBXMENU=
! #endif /* not HAVE_MENUS */
  
  #ifdef USE_X_TOOLKIT
*************** LIBXTR6 = -lSM -lICE
*** 340,347 ****
  #endif
  
  LIBXT= $(LIBW) LIBXMU -lXt $(LIBXTR6) -lXext
! #else
  LIBXT=
! #endif
  
  #ifdef HAVE_X11
--- 343,358 ----
  #endif
  
+ #ifdef LIBXT_STATIC
+ /* We assume the config files have defined STATIC_OPTION
+    since that might depend on the operating system.
+    (Don't forget you need different definitions with and without __GNUC__.)  */
+ LIBXT= STATIC_OPTION $(LIBW) LIBXMU -lXt $(LIBXTR6) -lXext DYNAMIC_OPTION
+ #else /* not LIBXT_STATIC */
  LIBXT= $(LIBW) LIBXMU -lXt $(LIBXTR6) -lXext
! #endif /* not LIBXT_STATIC */
! 
! #else /* not USE_X_TOOLKIT */
  LIBXT=
! #endif /* not USE_X_TOOLKIT */
  
  #ifdef HAVE_X11
*************** GNULIB_VAR = `if [ -f LIB_GCC ] ; then e
*** 404,408 ****
  #endif /* __GNUC__ < 2 */
  #else /* not __GNUC__ */
! GNULIB_VAR = 
  
  #endif /* not __GNUC__ */
--- 415,419 ----
  #endif /* __GNUC__ < 2 */
  #else /* not __GNUC__ */
! GNULIB_VAR =
  
  #endif /* not __GNUC__ */
*************** ALL_LDFLAGS = LD_SWITCH_SYSTEM LD_SWITCH
*** 472,476 ****
  #define MSDOS_OBJ dosfns.o msdos.o
  #else
! #define MSDOS_OBJ dosfns.o msdos.o xfaces.o xmenu.o
  #endif
  #else
--- 483,487 ----
  #define MSDOS_OBJ dosfns.o msdos.o
  #else
! #define MSDOS_OBJ dosfns.o msdos.o xfaces.o
  #endif
  #else
*************** ALL_LDFLAGS = LD_SWITCH_SYSTEM LD_SWITCH
*** 480,485 ****
  
  /* lastfile must follow all files
!    whose initialized data areas should be dumped as pure by dump-emacs. */
! obj=    dispnew.o frame.o scroll.o xdisp.o window.o \
  	cm.o term.o $(XOBJ) \
  	emacs.o keyboard.o macros.o keymap.o sysdep.o \
--- 491,496 ----
  
  /* lastfile must follow all files
!    whose initialized data areas should be dumped as pure by dump-emacs.  */
! obj=    dispnew.o frame.o scroll.o xdisp.o xmenu.o window.o \
  	cm.o term.o $(XOBJ) \
  	emacs.o keyboard.o macros.o keymap.o sysdep.o \
*************** SOME_MACHINE_OBJECTS = sunfns.o dosfns.o
*** 503,507 ****
  #ifdef TERMINFO
  /* Used to be -ltermcap here.  If your machine needs that,
!    define LIBS_TERMCAP in the m/*.h file.  */
  #ifndef LIBS_TERMCAP
  #define LIBS_TERMCAP -lcurses
--- 514,518 ----
  #ifdef TERMINFO
  /* Used to be -ltermcap here.  If your machine needs that,
!    define LIBS_TERMCAP in the m/MACHINE.h file.  */
  #ifndef LIBS_TERMCAP
  #define LIBS_TERMCAP -lcurses
*************** otherobj= $(termcapobj) lastfile.o $(mal
*** 588,592 ****
  
  #ifdef MSDOS
! #define MSDOS_SUPPORT ${lispsource}ls-lisp.elc ${lispsource}disp-tab.elc ${lispsource}dos-fns.elc
  #else
  #define MSDOS_SUPPORT
--- 599,603 ----
  
  #ifdef MSDOS
! #define MSDOS_SUPPORT ${lispsource}ls-lisp.elc ${lispsource}disp-table.elc ${lispsource}dos-fns.elc
  #else
  #define MSDOS_SUPPORT
*************** otherobj= $(termcapobj) lastfile.o $(mal
*** 605,614 ****
     Note that this list should not include lisp files which might not
     be present, like site-load.el and site-init.el; this makefile
!    expects them all to be either present or buildable.  */
  lisp= \
  	${lispsource}abbrev.elc \
  	${lispsource}buff-menu.elc \
  	${lispsource}byte-run.elc \
- 	${lispsource}c-mode.elc \
  	${lispsource}files.elc \
  	${lispsource}fill.elc \
--- 616,627 ----
     Note that this list should not include lisp files which might not
     be present, like site-load.el and site-init.el; this makefile
!    expects them all to be either present or buildable.
! 
!    Always update shortlisp as well as this variable.  */
! 
  lisp= \
  	${lispsource}abbrev.elc \
  	${lispsource}buff-menu.elc \
  	${lispsource}byte-run.elc \
  	${lispsource}files.elc \
  	${lispsource}fill.elc \
*************** lisp= \
*** 644,656 ****
  	${lispsource}version.el
  
  /* Lisp files that may or may not be used.
!    We must unconditionally put them in the DOC file.  */
! SOME_MACHINE_LISP =  ${lispsource}faces.elc ${lispsource}facemenu.elc \
!   ${lispsource}float-sup.elc ${lispsource}frame.elc \
!   ${lispsource}menu-bar.elc ${lispsource}mouse.elc \
!   ${lispsource}select.elc ${lispsource}scroll-bar.elc \
!   ${lispsource}vmsproc.elc ${lispsource}vms-patch.elc \
!   ${lispsource}ls-lisp.elc ${lispsource}dos-fns.elc \
!   ${lispsource}winnt.elc
  
  /* Construct full set of libraries to be linked.
--- 657,705 ----
  	${lispsource}version.el
  
+ /* These are relative file names for the Lisp files
+    that are loaded unconditionally.  This is used in make-docfile.
+    It need not contain the files that are loaded conditionally
+    because SOME_MACHINE_LISP has those.  */
+ shortlisp= \
+ 	../lisp/abbrev.elc \
+ 	../lisp/buff-menu.elc \
+ 	../lisp/byte-run.elc \
+ 	../lisp/files.elc \
+ 	../lisp/fill.elc \
+ 	../lisp/format.elc \
+ 	../lisp/help.elc \
+ 	../lisp/indent.elc \
+ 	../lisp/isearch.elc \
+ 	../lisp/lisp-mode.elc \
+ 	../lisp/lisp.elc \
+ 	../lisp/loadup.el \
+ 	../lisp/loaddefs.el \
+ 	../lisp/map-ynp.elc \
+ 	../lisp/page.elc \
+ 	../lisp/paragraphs.elc \
+ 	../lisp/paths.el \
+ 	../lisp/register.elc \
+ 	../lisp/replace.elc \
+ 	../lisp/simple.elc \
+ 	../lisp/startup.elc \
+ 	../lisp/subr.elc \
+ 	../lisp/text-mode.elc \
+ 	../lisp/vc-hooks.elc \
+ 	../lisp/ediff-hook.elc \
+ 	../lisp/window.elc \
+ 	../lisp/version.el
+ 
  /* Lisp files that may or may not be used.
!    We must unconditionally put them in the DOC file.
!    We use ../lisp/ to start the file names
!    to reduce the size of the argument list for make-docfile
!    for the sake of systems which can't handle large ones.  */
! SOME_MACHINE_LISP =  ${dotdot}/lisp/faces.elc ${dotdot}/lisp/facemenu.elc \
!   ${dotdot}/lisp/float-sup.elc ${dotdot}/lisp/frame.elc \
!   ${dotdot}/lisp/menu-bar.elc ${dotdot}/lisp/mouse.elc \
!   ${dotdot}/lisp/select.elc ${dotdot}/lisp/scroll-bar.elc \
!   ${dotdot}/lisp/vmsproc.elc ${dotdot}/lisp/vms-patch.elc \
!   ${dotdot}/lisp/ls-lisp.elc ${dotdot}/lisp/dos-fns.elc \
!   ${dotdot}/lisp/winnt.elc
  
  /* Construct full set of libraries to be linked.
*************** ${etc}DOC: ${libsrc}make-docfile ${obj} 
*** 701,705 ****
  	-rm -f ${etc}DOC
  	${libsrc}make-docfile -d ${srcdir} ${SOME_MACHINE_OBJECTS} ${obj} > ${etc}DOC
! 	${libsrc}make-docfile -a ${etc}DOC -d ${srcdir} ${SOME_MACHINE_LISP} ${lisp}
  
  ${libsrc}make-docfile:
--- 750,754 ----
  	-rm -f ${etc}DOC
  	${libsrc}make-docfile -d ${srcdir} ${SOME_MACHINE_OBJECTS} ${obj} > ${etc}DOC
! 	${libsrc}make-docfile -a ${etc}DOC -d ${srcdir} ${SOME_MACHINE_LISP} ${shortlisp}
  
  ${libsrc}make-docfile:
*************** shortnames:
*** 756,761 ****
  #endif
  
! #ifdef HAVE_X_WINDOWS
! #ifdef HAVE_X11
  #ifdef USE_X_TOOLKIT
  $(OLDXMENU): really-lwlib
--- 805,810 ----
  #endif
  
! #if defined (HAVE_X_WINDOWS) && defined (HAVE_X11) && defined (HAVE_MENUS)
! 
  #ifdef USE_X_TOOLKIT
  $(OLDXMENU): really-lwlib
*************** really-lwlib:
*** 781,785 ****
  .PHONY: really-lwlib
  #else /* not USE_X_TOOLKIT */
- #ifdef HAVE_X_MENU
  $(OLDXMENU): really-oldXMenu
  
--- 830,833 ----
*************** really-oldXMenu:
*** 803,810 ****
  	@true  /* make -t should not create really-oldXMenu.  */
  .PHONY: really-oldXMenu
- #endif /* HAVE_X_MENU */
  #endif /* not USE_X_TOOLKIT */
! #endif /* HAVE_X11 */
! #endif /* HAVE_X_WINDOWS */
  
  paths.h: paths.in
--- 851,856 ----
  	@true  /* make -t should not create really-oldXMenu.  */
  .PHONY: really-oldXMenu
  #endif /* not USE_X_TOOLKIT */
! #endif /* HAVE_X_WINDOWS && HAVE_X11 && HAVE_MENUS */
  
  paths.h: paths.in
*************** alloca.o : alloca.s $(config_h)
*** 859,873 ****
     and so rarely changed in ways that do require any.  */
  
! abbrev.o: abbrev.c buffer.h commands.h $(config_h) 
  buffer.o: buffer.c buffer.h region-cache.h commands.h window.h \
!    INTERVAL_SRC blockinput.h $(config_h) 
  callint.o: callint.c window.h commands.h buffer.h mocklisp.h \
     keyboard.h $(config_h)
  callproc.o: callproc.c paths.h buffer.h commands.h $(config_h) \
  	process.h systty.h syssignal.h
! casefiddle.o: casefiddle.c syntax.h commands.h buffer.h $(config_h) 
  casetab.o: casetab.c buffer.h $(config_h)
  cm.o: cm.c cm.h termhooks.h $(config_h)
! cmds.o: cmds.c syntax.h buffer.h commands.h window.h $(config_h) 
  pre-crt0.o: pre-crt0.c
  ecrt0.o: ecrt0.c $(config_h)
--- 905,919 ----
     and so rarely changed in ways that do require any.  */
  
! abbrev.o: abbrev.c buffer.h commands.h $(config_h)
  buffer.o: buffer.c buffer.h region-cache.h commands.h window.h \
!    INTERVAL_SRC blockinput.h $(config_h)
  callint.o: callint.c window.h commands.h buffer.h mocklisp.h \
     keyboard.h $(config_h)
  callproc.o: callproc.c paths.h buffer.h commands.h $(config_h) \
  	process.h systty.h syssignal.h
! casefiddle.o: casefiddle.c syntax.h commands.h buffer.h $(config_h)
  casetab.o: casetab.c buffer.h $(config_h)
  cm.o: cm.c cm.h termhooks.h $(config_h)
! cmds.o: cmds.c syntax.h buffer.h commands.h window.h $(config_h)
  pre-crt0.o: pre-crt0.c
  ecrt0.o: ecrt0.c $(config_h)
*************** dired.o: dired.c commands.h buffer.h $(c
*** 876,886 ****
  dispnew.o: dispnew.c commands.h frame.h window.h buffer.h dispextern.h \
     termchar.h termopts.h termhooks.h cm.h disptab.h systty.h systime.h \
!    xterm.h $(config_h)
  doc.o: doc.c $(config_h) paths.h buffer.h keyboard.h
  doprnt.o: doprnt.c $(config_h)
  dosfns.o: buffer.h termchar.h termhooks.h frame.h msdos.h dosfns.h $(config_h)
! editfns.o: editfns.c window.h buffer.h systime.h INTERVAL_SRC $(config_h) 
! emacs.o: emacs.c commands.h systty.h syssignal.h process.h INTERVAL_SRC $(config_h) 
! fileio.o: fileio.c window.h buffer.h systime.h INTERVAL_SRC $(config_h) 
  filelock.o: filelock.c buffer.h paths.h $(config_h)
  filemode.o: filemode.c  $(config_h)
--- 922,933 ----
  dispnew.o: dispnew.c commands.h frame.h window.h buffer.h dispextern.h \
     termchar.h termopts.h termhooks.h cm.h disptab.h systty.h systime.h \
!    xterm.h blockinput.h $(config_h)
  doc.o: doc.c $(config_h) paths.h buffer.h keyboard.h
  doprnt.o: doprnt.c $(config_h)
  dosfns.o: buffer.h termchar.h termhooks.h frame.h msdos.h dosfns.h $(config_h)
! editfns.o: editfns.c window.h buffer.h systime.h INTERVAL_SRC $(config_h)
! emacs.o: emacs.c commands.h systty.h syssignal.h blockinput.h process.h \
!    INTERVAL_SRC $(config_h)
! fileio.o: fileio.c window.h buffer.h systime.h INTERVAL_SRC $(config_h)
  filelock.o: filelock.c buffer.h paths.h $(config_h)
  filemode.o: filemode.c  $(config_h)
*************** keyboard.o: keyboard.c termchar.h termho
*** 893,897 ****
     systty.h systime.h dispextern.h intervals.h blockinput.h xterm.h $(config_h)
  keymap.o: keymap.c buffer.h commands.h keyboard.h termhooks.h blockinput.h \
!    $(config_h) 
  lastfile.o: lastfile.c  $(config_h)
  macros.o: macros.c window.h buffer.h commands.h macros.h keyboard.h $(config_h)
--- 940,944 ----
     systty.h systime.h dispextern.h intervals.h blockinput.h xterm.h $(config_h)
  keymap.o: keymap.c buffer.h commands.h keyboard.h termhooks.h blockinput.h \
!    puresize.h $(config_h)
  lastfile.o: lastfile.c  $(config_h)
  macros.o: macros.c window.h buffer.h commands.h macros.h keyboard.h $(config_h)
*************** mktime.o: mktime.c $(config_h)
*** 902,913 ****
  gmalloc.o: gmalloc.c $(config_h)
  ralloc.o: ralloc.c $(config_h)
! vm-limit.o: vm-limit.c mem-limits.h $(config_h) 
! marker.o: marker.c buffer.h $(config_h) 
  minibuf.o: minibuf.c syntax.h dispextern.h frame.h window.h \
!    buffer.h commands.h $(config_h) 
  mocklisp.o: mocklisp.c buffer.h $(config_h)
  process.o: process.c process.h buffer.h window.h termhooks.h termopts.h \
!    commands.h syssignal.h systime.h systty.h syswait.h frame.h $(config_h) 
! regex.o: regex.c syntax.h buffer.h $(config_h) regex.h 
  region-cache.o: region-cache.c buffer.h region-cache.h
  frame.o: frame.c xterm.h window.h frame.h termhooks.h commands.h keyboard.h \
--- 949,960 ----
  gmalloc.o: gmalloc.c $(config_h)
  ralloc.o: ralloc.c $(config_h)
! vm-limit.o: vm-limit.c mem-limits.h $(config_h)
! marker.o: marker.c buffer.h $(config_h)
  minibuf.o: minibuf.c syntax.h dispextern.h frame.h window.h \
!    buffer.h commands.h $(config_h)
  mocklisp.o: mocklisp.c buffer.h $(config_h)
  process.o: process.c process.h buffer.h window.h termhooks.h termopts.h \
!    commands.h syssignal.h systime.h systty.h syswait.h frame.h $(config_h)
! regex.o: regex.c syntax.h buffer.h $(config_h) regex.h
  region-cache.o: region-cache.c buffer.h region-cache.h
  frame.o: frame.c xterm.h window.h frame.h termhooks.h commands.h keyboard.h \
*************** frame.o: frame.c xterm.h window.h frame.
*** 915,922 ****
  scroll.o: scroll.c termchar.h dispextern.h frame.h $(config_h)
  search.o: search.c regex.h commands.h buffer.h region-cache.h syntax.h \
!    blockinput.h $(config_h) 
  strftime.o: strftime.c $(config_h)
  	$(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -Dstrftime=emacs_strftime $<
! syntax.o: syntax.c syntax.h buffer.h commands.h $(config_h) 
  sysdep.o: sysdep.c $(config_h) dispextern.h termhooks.h termchar.h termopts.h \
     frame.h syssignal.h systty.h systime.h syswait.h blockinput.h window.h
--- 962,969 ----
  scroll.o: scroll.c termchar.h dispextern.h frame.h $(config_h)
  search.o: search.c regex.h commands.h buffer.h region-cache.h syntax.h \
!    blockinput.h $(config_h)
  strftime.o: strftime.c $(config_h)
  	$(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) -Dstrftime=emacs_strftime $<
! syntax.o: syntax.c syntax.h buffer.h commands.h $(config_h)
  sysdep.o: sysdep.c $(config_h) dispextern.h termhooks.h termchar.h termopts.h \
     frame.h syssignal.h systty.h systime.h syswait.h blockinput.h window.h
*************** termcap.o: termcap.c $(config_h)
*** 926,949 ****
  terminfo.o: terminfo.c $(config_h)
  tparam.o: tparam.c $(config_h)
! undo.o: undo.c buffer.h commands.h $(config_h) 
  /* This hack is to discard any space that cpp might put at the beginning
     of UNEXEC when substituting it in.  */
  UNEXEC_ALIAS=UNEXEC
  $(UNEXEC_ALIAS): UNEXEC_SRC $(config_h)
! widget.o: widget.c xterm.h frame.h dispextern.h widgetprv.h $(config_h)
  window.o: window.c indent.h commands.h frame.h window.h buffer.h termchar.h \
     termhooks.h disptab.h keyboard.h $(config_h)
  xdisp.o: xdisp.c macros.h commands.h indent.h buffer.h dispextern.h \
!    termchar.h frame.h window.h disptab.h termhooks.h $(config_h) 
  xfaces.o: xfaces.c dispextern.h frame.h xterm.h buffer.h blockinput.h \
!    window.h $(config_h) 
  xfns.o: xfns.c buffer.h frame.h window.h keyboard.h xterm.h \
!    blockinput.h paths.h $(config_h)
! xmenu.o: xmenu.c xterm.h window.h dispextern.h frame.h keyboard.h \
!    blockinput.h puresize.h msdos.h $(config_h)
  xterm.o: xterm.c xterm.h termhooks.h termopts.h termchar.h window.h \
    dispextern.h frame.h disptab.h blockinput.h systime.h syssignal.h \
    keyboard.h gnu.h sink.h sinkmask.h $(config_h)
! xselect.o: xselect.c dispextern.h frame.h xterm.h blockinput.h $(config_h) 
  xrdb.o: xrdb.c $(config_h)
  hftctl.o: hftctl.c $(config_h)
--- 973,997 ----
  terminfo.o: terminfo.c $(config_h)
  tparam.o: tparam.c $(config_h)
! undo.o: undo.c buffer.h commands.h $(config_h)
  /* This hack is to discard any space that cpp might put at the beginning
     of UNEXEC when substituting it in.  */
  UNEXEC_ALIAS=UNEXEC
  $(UNEXEC_ALIAS): UNEXEC_SRC $(config_h)
! widget.o: widget.c xterm.h frame.h dispextern.h widgetprv.h \
!    ../lwlib/lwlib.h $(config_h)
  window.o: window.c indent.h commands.h frame.h window.h buffer.h termchar.h \
     termhooks.h disptab.h keyboard.h $(config_h)
  xdisp.o: xdisp.c macros.h commands.h indent.h buffer.h dispextern.h \
!    termchar.h frame.h window.h disptab.h termhooks.h $(config_h)
  xfaces.o: xfaces.c dispextern.h frame.h xterm.h buffer.h blockinput.h \
!    window.h $(config_h)
  xfns.o: xfns.c buffer.h frame.h window.h keyboard.h xterm.h \
!    ../lwlib/lwlib.h blockinput.h paths.h $(config_h)
! xmenu.o: xmenu.c xterm.h termhooks.h window.h dispextern.h frame.h keyboard.h \
!    ../lwlib/lwlib.h blockinput.h puresize.h msdos.h $(config_h)
  xterm.o: xterm.c xterm.h termhooks.h termopts.h termchar.h window.h \
    dispextern.h frame.h disptab.h blockinput.h systime.h syssignal.h \
    keyboard.h gnu.h sink.h sinkmask.h $(config_h)
! xselect.o: xselect.c dispextern.h frame.h xterm.h blockinput.h $(config_h)
  xrdb.o: xrdb.c $(config_h)
  hftctl.o: hftctl.c $(config_h)
diff -2rcpP --exclude=*.elc emacs-19.30/src/abbrev.c emacs-19.31/src/abbrev.c
*** emacs-19.30/src/abbrev.c	Mon Jun  5 20:24:42 1995
--- emacs-19.31/src/abbrev.c	Tue Apr  9 18:11:30 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** DEFUN ("define-global-abbrev", Fdefine_g
*** 143,152 ****
    "sDefine global abbrev: \nsExpansion for %s: ",
    "Define ABBREV as a global abbreviation for EXPANSION.")
!   (name, expansion)
!      Lisp_Object name, expansion;
  {
!   Fdefine_abbrev (Vglobal_abbrev_table, Fdowncase (name),
  		  expansion, Qnil, make_number (0));
!   return name;
  }
  
--- 144,153 ----
    "sDefine global abbrev: \nsExpansion for %s: ",
    "Define ABBREV as a global abbreviation for EXPANSION.")
!   (abbrev, expansion)
!      Lisp_Object abbrev, expansion;
  {
!   Fdefine_abbrev (Vglobal_abbrev_table, Fdowncase (abbrev),
  		  expansion, Qnil, make_number (0));
!   return abbrev;
  }
  
*************** DEFUN ("define-mode-abbrev", Fdefine_mod
*** 154,166 ****
    "sDefine mode abbrev: \nsExpansion for %s: ",
    "Define ABBREV as a mode-specific abbreviation for EXPANSION.")
!   (name, expansion)
!      Lisp_Object name, expansion;
  {
    if (NILP (current_buffer->abbrev_table))
      error ("Major mode has no abbrev table");
  
!   Fdefine_abbrev (current_buffer->abbrev_table, Fdowncase (name),
  		  expansion, Qnil, make_number (0));
!   return name;
  }
  
--- 155,167 ----
    "sDefine mode abbrev: \nsExpansion for %s: ",
    "Define ABBREV as a mode-specific abbreviation for EXPANSION.")
!   (abbrev, expansion)
!      Lisp_Object abbrev, expansion;
  {
    if (NILP (current_buffer->abbrev_table))
      error ("Major mode has no abbrev table");
  
!   Fdefine_abbrev (current_buffer->abbrev_table, Fdowncase (abbrev),
  		  expansion, Qnil, make_number (0));
!   return abbrev;
  }
  
*************** DEFUN ("insert-abbrev-table-description"
*** 422,427 ****
    "Insert before point a full description of abbrev table named NAME.\n\
  NAME is a symbol whose value is an abbrev table.\n\
! If optional 2nd arg HUMAN is non-nil, a human-readable description is inserted.\n\
! Otherwise the description is an expression,\n\
  a call to `define-abbrev-table', which would\n\
  define the abbrev table NAME exactly as it is currently defined.")
--- 423,428 ----
    "Insert before point a full description of abbrev table named NAME.\n\
  NAME is a symbol whose value is an abbrev table.\n\
! If optional 2nd arg READABLE is non-nil, a human-readable description\n\
! is inserted.  Otherwise the description is an expression,\n\
  a call to `define-abbrev-table', which would\n\
  define the abbrev table NAME exactly as it is currently defined.")
*************** define the abbrev table NAME exactly as 
*** 460,486 ****
  DEFUN ("define-abbrev-table", Fdefine_abbrev_table, Sdefine_abbrev_table,
         2, 2, 0,
!   "Define TABNAME (a symbol) as an abbrev table name.\n\
  Define abbrevs in it according to DEFINITIONS, which is a list of elements\n\
  of the form (ABBREVNAME EXPANSION HOOK USECOUNT).")
!   (tabname, defns)
!      Lisp_Object tabname, defns;
  {
    Lisp_Object name, exp, hook, count;
    Lisp_Object table, elt;
  
!   CHECK_SYMBOL (tabname, 0);
!   table = Fboundp (tabname);
!   if (NILP (table) || (table = Fsymbol_value (tabname), NILP (table)))
      {
        table = Fmake_abbrev_table ();
!       Fset (tabname, table);
!       Vabbrev_table_name_list =
! 	Fcons (tabname, Vabbrev_table_name_list);
      }
    CHECK_VECTOR (table, 0);
  
!   for (;!NILP (defns); defns = Fcdr (defns))
      {
!       elt = Fcar (defns);
        name  = Fcar (elt);	elt = Fcdr (elt);
        exp   = Fcar (elt);	elt = Fcdr (elt);
--- 461,486 ----
  DEFUN ("define-abbrev-table", Fdefine_abbrev_table, Sdefine_abbrev_table,
         2, 2, 0,
!   "Define TABLENAME (a symbol) as an abbrev table name.\n\
  Define abbrevs in it according to DEFINITIONS, which is a list of elements\n\
  of the form (ABBREVNAME EXPANSION HOOK USECOUNT).")
!   (tablename, definitions)
!      Lisp_Object tablename, definitions;
  {
    Lisp_Object name, exp, hook, count;
    Lisp_Object table, elt;
  
!   CHECK_SYMBOL (tablename, 0);
!   table = Fboundp (tablename);
!   if (NILP (table) || (table = Fsymbol_value (tablename), NILP (table)))
      {
        table = Fmake_abbrev_table ();
!       Fset (tablename, table);
!       Vabbrev_table_name_list = Fcons (tablename, Vabbrev_table_name_list);
      }
    CHECK_VECTOR (table, 0);
  
!   for (; !NILP (definitions); definitions = Fcdr (definitions))
      {
!       elt = Fcar (definitions);
        name  = Fcar (elt);	elt = Fcdr (elt);
        exp   = Fcar (elt);	elt = Fcdr (elt);
diff -2rcpP --exclude=*.elc emacs-19.30/src/alloc.c emacs-19.31/src/alloc.c
*** emacs-19.30/src/alloc.c	Mon Nov 20 18:21:29 1995
--- emacs-19.31/src/alloc.c	Tue Apr  9 18:07:54 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  /* Note that this declares bzero on OSF/1.  How dumb.  */
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* Note that this declares bzero on OSF/1.  How dumb.  */
*************** int gc_cons_threshold;
*** 88,91 ****
--- 89,95 ----
  int gc_in_progress;
  
+ /* Nonzero means display messages at beginning and end of GC.  */
+ int garbage_collection_messages;
+ 
  #ifndef VIRT_ADDR_VARIES
  extern
*************** Lisp_Object memory_signal_data;
*** 152,156 ****
     pointer to a Lisp_Object, when that pointer is viewed as an integer.
     (On most machines, pointers are even, so we can use the low bit.
!    Word-addressible architectures may need to override this in the m-file.)
     When linking references to small strings through the size field, we
     use this slot to hold the bit that would otherwise be interpreted as
--- 156,160 ----
     pointer to a Lisp_Object, when that pointer is viewed as an integer.
     (On most machines, pointers are even, so we can use the low bit.
!    Word-addressable architectures may need to override this in the m-file.)
     When linking references to small strings through the size field, we
     use this slot to hold the bit that would otherwise be interpreted as
*************** DEFUN ("make-symbol", Fmake_symbol, Smak
*** 871,881 ****
    "Return a newly allocated uninterned symbol whose name is NAME.\n\
  Its value and function definition are void, and its property list is nil.")
!   (str)
!      Lisp_Object str;
  {
    register Lisp_Object val;
    register struct Lisp_Symbol *p;
  
!   CHECK_STRING (str, 0);
  
    if (symbol_free_list)
--- 875,885 ----
    "Return a newly allocated uninterned symbol whose name is NAME.\n\
  Its value and function definition are void, and its property list is nil.")
!   (name)
!      Lisp_Object name;
  {
    register Lisp_Object val;
    register struct Lisp_Symbol *p;
  
!   CHECK_STRING (name, 0);
  
    if (symbol_free_list)
*************** Its value and function definition are vo
*** 900,904 ****
      }
    p = XSYMBOL (val);
!   p->name = XSTRING (str);
    p->plist = Qnil;
    p->value = Qunbound;
--- 904,908 ----
      }
    p = XSYMBOL (val);
!   p->name = XSTRING (name);
    p->plist = Qnil;
    p->value = Qunbound;
*************** struct string_block_head
*** 1014,1018 ****
    {
      struct string_block *next, *prev;
!     int pos;
    };
  
--- 1018,1022 ----
    {
      struct string_block *next, *prev;
!     EMACS_INT pos;
    };
  
*************** Garbage collection happens automatically
*** 1490,1494 ****
  #endif /* MAX_SAVE_STACK > 0 */
  
!   if (!noninteractive)
      message1_nolog ("Garbage collecting...");
  
--- 1494,1498 ----
  #endif /* MAX_SAVE_STACK > 0 */
  
!   if (garbage_collection_messages)
      message1_nolog ("Garbage collecting...");
  
*************** Garbage collection happens automatically
*** 1606,1613 ****
      gc_cons_threshold = 10000;
  
!   if (omessage || minibuf_level > 0)
!     message2_nolog (omessage, omessage_length);
!   else if (!noninteractive)
!     message1_nolog ("Garbage collecting...done");
  
    return Fcons (Fcons (make_number (total_conses),
--- 1610,1620 ----
      gc_cons_threshold = 10000;
  
!   if (garbage_collection_messages)
!     {
!       if (omessage || minibuf_level > 0)
! 	message2_nolog (omessage, omessage_length);
!       else
! 	message1_nolog ("Garbage collecting...done");
!     }
  
    return Fcons (Fcons (make_number (total_conses),
*************** mark_object (argptr)
*** 1802,1805 ****
--- 1809,1813 ----
  	  mark_object (&ptr->name);
  	  mark_object (&ptr->icon_name);
+ 	  mark_object (&ptr->title);
  	  mark_object (&ptr->focus_frame);
  	  mark_object (&ptr->selected_window);
*************** gc_sweep ()
*** 2158,2162 ****
  #ifndef standalone
    /* Put all unmarked markers on free list.
!      Dechain each one first from the buffer it points into,
       but only if it's a real marker.  */
    {
--- 2166,2170 ----
  #ifndef standalone
    /* Put all unmarked markers on free list.
!      Unchain each one first from the buffer it points into,
       but only if it's a real marker.  */
    {
*************** The size is counted as the number of byt
*** 2609,2612 ****
--- 2617,2624 ----
  which includes both saved text and other data.");
    undo_strong_limit = 30000;
+ 
+   DEFVAR_BOOL ("garbage-collection-messages", &garbage_collection_messages,
+     "Non-nil means display messages at start and end of garbage collection.");
+   garbage_collection_messages = 0;
  
    /* We build this in advance because if we wait until we need it, we might
diff -2rcpP --exclude=*.elc emacs-19.30/src/alloca.c emacs-19.31/src/alloca.c
*** emacs-19.30/src/alloca.c	Mon Sep 26 17:52:28 1994
--- emacs-19.31/src/alloca.c	Tue Mar 19 20:08:07 1996
***************
*** 26,29 ****
--- 26,36 ----
  #endif
  
+ #ifdef HAVE_STRING_H
+ #include <string.h>
+ #endif
+ #ifdef HAVE_STDLIB_H
+ #include <stdlib.h>
+ #endif
+ 
  #ifdef emacs
  #include "blockinput.h"
*************** typedef char *pointer;
*** 67,71 ****
--- 74,80 ----
  #endif
  
+ #ifndef NULL
  #define	NULL	0
+ #endif
  
  /* Different portions of Emacs need to call different versions of
*************** alloca (size)
*** 209,212 ****
--- 218,224 ----
      register pointer new = malloc (sizeof (header) + size);
      /* Address of header.  */
+ 
+     if (new == 0)
+       abort();
  
      ((header *) new)->h.next = last_alloca_header;
diff -2rcpP --exclude=*.elc emacs-19.30/src/alloca.s emacs-19.31/src/alloca.s
*** emacs-19.30/src/alloca.s	Mon May  9 22:08:53 1994
--- emacs-19.31/src/alloca.s	Mon Jan 29 17:19:51 1996
***************
*** 13,19 ****
     GNU General Public License for more details.
  
!    You should have received a copy of the GNU General Public License
!    along with this program; if not, write to the Free Software
!    Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  
  /* Both 68000 systems I have run this on have had broken versions of alloca.
--- 13,19 ----
     GNU General Public License for more details.
  
!    You should have received a copy of the GNU General Public License along
!    with this program; if not, write to the Free Software Foundation, Inc.,
!    59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
  
  /* Both 68000 systems I have run this on have had broken versions of alloca.
*************** _alloca:
*** 182,186 ****
  	sub.l	d0,d1		; adjust to reflect required size...
  	sub.l	#MAXREG*4,d1	; ...and space needed for registers
! 	and.l	#-4,d1		; backup to longword boundry
  	move.l	sp,a0		; save old SP value for register copy
  	move.l	d1,sp		; set the new SP value
--- 182,186 ----
  	sub.l	d0,d1		; adjust to reflect required size...
  	sub.l	#MAXREG*4,d1	; ...and space needed for registers
! 	and.l	#-4,d1		; backup to longword boundary
  	move.l	sp,a0		; save old SP value for register copy
  	move.l	d1,sp		; set the new SP value
diff -2rcpP --exclude=*.elc emacs-19.30/src/blockinput.h emacs-19.31/src/blockinput.h
*** emacs-19.30/src/blockinput.h	Sat Sep 11 21:20:29 1993
--- emacs-19.31/src/blockinput.h	Mon Jan 15 04:06:29 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/buffer.c emacs-19.31/src/buffer.c
*** emacs-19.30/src/buffer.c	Fri Nov 10 01:31:21 1995
--- emacs-19.31/src/buffer.c	Wed May  1 17:02:05 1996
*************** GNU General Public License for more deta
*** 17,21 ****
  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.  */
  
  
--- 17,22 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** nsberror (spec)
*** 163,166 ****
--- 164,177 ----
  }
  
+ DEFUN ("buffer-live-p", Fbuffer_live_p, Sbuffer_live_p, 1, 1, 0,
+   "Return non-nil if OBJECT is a buffer which has not been killed.\n\
+ Value is nil if OBJECT is not a buffer or if it has been killed.")
+   (object)
+      Lisp_Object object;
+ {
+   return ((BUFFERP (object) && ! NILP (XBUFFER (object)->name))
+ 	  ? Qt : Qnil);
+ }
+ 
  DEFUN ("buffer-list", Fbuffer_list, Sbuffer_list, 0, 0, 0,
    "Return a list of all existing live buffers.")
*************** The value is never nil.")  
*** 337,345 ****
  }
  
! DEFUN ("make-indirect-buffer",
!        Fmake_indirect_buffer, Smake_indirect_buffer, 2, 2,
         "bMake indirect buffer (to buffer): \nBName of indirect buffer: ",
!   "Create and return an indirect buffer for buffer BASE, named NAME.\n\
! BASE should be an existing buffer (or buffer name).\n\
  NAME should be a string which is not the name of an existing buffer.")
    (base_buffer, name)
--- 348,355 ----
  }
  
! DEFUN ("make-indirect-buffer", Fmake_indirect_buffer, Smake_indirect_buffer, 2, 2,
         "bMake indirect buffer (to buffer): \nBName of indirect buffer: ",
!   "Create and return an indirect buffer for buffer BASE-BUFFER, named NAME.\n\
! BASE-BUFFER should be an existing buffer (or buffer name).\n\
  NAME should be a string which is not the name of an existing buffer.")
    (base_buffer, name)
*************** reset_buffer (b)
*** 457,461 ****
    b->point_before_scroll = Qnil;
    b->file_format = Qnil;
-   b->redisplay_end_trigger = Qnil;
    b->extra1 = Qnil;
    b->extra2 = Qnil;
--- 467,470 ----
*************** If BUFFER is omitted or nil, some intere
*** 811,814 ****
--- 820,824 ----
       register Lisp_Object buffer, visible_ok;
  {
+   Lisp_Object Fset_buffer_major_mode ();
    register Lisp_Object tail, buf, notsogood, tem;
    notsogood = Qnil;
*************** If BUFFER is omitted or nil, some intere
*** 844,848 ****
    if (!NILP (notsogood))
      return notsogood;
!   return Fget_buffer_create (build_string ("*scratch*"));
  }
  
--- 854,860 ----
    if (!NILP (notsogood))
      return notsogood;
!   buf = Fget_buffer_create (build_string ("*scratch*"));
!   Fset_buffer_major_mode (buf);
!   return buf;
  }
  
*************** when the hook functions are called.\n\n\
*** 911,916 ****
  Any processes that have this buffer as the `process-buffer' are killed\n\
  with `delete-process'.")
!   (bufname)
!      Lisp_Object bufname;
  {
    Lisp_Object buf;
--- 923,928 ----
  Any processes that have this buffer as the `process-buffer' are killed\n\
  with `delete-process'.")
!   (buffer)
!      Lisp_Object buffer;
  {
    Lisp_Object buf;
*************** with `delete-process'.")
*** 920,929 ****
    struct gcpro gcpro1, gcpro2;
  
!   if (NILP (bufname))
      buf = Fcurrent_buffer ();
    else
!     buf = Fget_buffer (bufname);
    if (NILP (buf))
!     nsberror (bufname);
  
    b = XBUFFER (buf);
--- 932,941 ----
    struct gcpro gcpro1, gcpro2;
  
!   if (NILP (buffer))
      buf = Fcurrent_buffer ();
    else
!     buf = Fget_buffer (buffer);
    if (NILP (buf))
!     nsberror (buffer);
  
    b = XBUFFER (buf);
*************** with `delete-process'.")
*** 937,941 ****
        && BUF_MODIFF (b) > BUF_SAVE_MODIFF (b))
      {
!       GCPRO2 (buf, bufname);
        tem = do_yes_or_no_p (format1 ("Buffer %s modified; kill anyway? ",
  				     XSTRING (b->name)->data));
--- 949,953 ----
        && BUF_MODIFF (b) > BUF_SAVE_MODIFF (b))
      {
!       GCPRO1 (buf);
        tem = do_yes_or_no_p (format1 ("Buffer %s modified; kill anyway? ",
  				     XSTRING (b->name)->data));
*************** with `delete-process'.")
*** 1024,1029 ****
    tem = Vinhibit_quit;
    Vinhibit_quit = Qt;
    Vbuffer_alist = Fdelq (Frassq (buf, Vbuffer_alist), Vbuffer_alist);
-   Freplace_buffer_in_windows (buf);
    Vinhibit_quit = tem;
  
--- 1036,1041 ----
    tem = Vinhibit_quit;
    Vinhibit_quit = Qt;
+   replace_buffer_in_all_windows (buf);
    Vbuffer_alist = Fdelq (Frassq (buf, Vbuffer_alist), Vbuffer_alist);
    Vinhibit_quit = tem;
  
*************** DEFUN ("set-buffer-major-mode", Fset_buf
*** 1138,1143 ****
  Use this function before selecting the buffer, since it may need to inspect\n\
  the current buffer's major mode.")
!   (buf)
!      Lisp_Object buf;
  {
    int count;
--- 1150,1155 ----
  Use this function before selecting the buffer, since it may need to inspect\n\
  the current buffer's major mode.")
!   (buffer)
!      Lisp_Object buffer;
  {
    int count;
*************** the current buffer's major mode.")
*** 1158,1162 ****
    record_unwind_protect (save_excursion_restore, save_excursion_save ());
  
!   Fset_buffer (buf);
    call0 (function);
  
--- 1170,1174 ----
    record_unwind_protect (save_excursion_restore, save_excursion_save ());
  
!   Fset_buffer (buffer);
    call0 (function);
  
*************** WARNING: This is NOT the way to work on 
*** 1173,1178 ****
  within a Lisp program!  Use `set-buffer' instead.  That avoids messing with\n\
  the window-buffer correspondences.")
!   (bufname, norecord)
!      Lisp_Object bufname, norecord;
  {
    register Lisp_Object buf;
--- 1185,1190 ----
  within a Lisp program!  Use `set-buffer' instead.  That avoids messing with\n\
  the window-buffer correspondences.")
!   (buffer, norecord)
!      Lisp_Object buffer, norecord;
  {
    register Lisp_Object buf;
*************** the window-buffer correspondences.")
*** 1185,1196 ****
      error ("Cannot switch buffers in a dedicated window");
  
!   if (NILP (bufname))
      buf = Fother_buffer (Fcurrent_buffer (), Qnil);
    else
      {
!       buf = Fget_buffer (bufname);
        if (NILP (buf))
  	{
! 	  buf = Fget_buffer_create (bufname);
  	  Fset_buffer_major_mode (buf);
  	}
--- 1197,1208 ----
      error ("Cannot switch buffers in a dedicated window");
  
!   if (NILP (buffer))
      buf = Fother_buffer (Fcurrent_buffer (), Qnil);
    else
      {
!       buf = Fget_buffer (buffer);
        if (NILP (buf))
  	{
! 	  buf = Fget_buffer_create (buffer);
  	  Fset_buffer_major_mode (buf);
  	}
*************** If `pop-up-windows' is non-nil, windows 
*** 1214,1229 ****
  If optional second arg OTHER-WINDOW is non-nil, insist on finding another\n\
  window even if BUFFER is already visible in the selected window.")
!   (bufname, other)
!      Lisp_Object bufname, other;
  {
    register Lisp_Object buf;
!   if (NILP (bufname))
      buf = Fother_buffer (Fcurrent_buffer (), Qnil);
    else
      {
!       buf = Fget_buffer (bufname);
        if (NILP (buf))
  	{
! 	  buf = Fget_buffer_create (bufname);
  	  Fset_buffer_major_mode (buf);
  	}
--- 1226,1241 ----
  If optional second arg OTHER-WINDOW is non-nil, insist on finding another\n\
  window even if BUFFER is already visible in the selected window.")
!   (buffer, other_window)
!      Lisp_Object buffer, other_window;
  {
    register Lisp_Object buf;
!   if (NILP (buffer))
      buf = Fother_buffer (Fcurrent_buffer (), Qnil);
    else
      {
!       buf = Fget_buffer (buffer);
        if (NILP (buf))
  	{
! 	  buf = Fget_buffer_create (buffer);
  	  Fset_buffer_major_mode (buf);
  	}
*************** window even if BUFFER is already visible
*** 1231,1235 ****
    Fset_buffer (buf);
    record_buffer (buf);
!   Fselect_window (Fdisplay_buffer (buf, other));
    return buf;
  }
--- 1243,1247 ----
    Fset_buffer (buf);
    record_buffer (buf);
!   Fselect_window (Fdisplay_buffer (buf, other_window));
    return buf;
  }
*************** This function does not display the buffe
*** 1409,1423 ****
  when the current command terminates.\n\
  Use `switch-to-buffer' or `pop-to-buffer' to switch buffers permanently.")
!   (bufname)
!      register Lisp_Object bufname;
  {
!   register Lisp_Object buffer;
!   buffer = Fget_buffer (bufname);
!   if (NILP (buffer))
!     nsberror (bufname);
!   if (NILP (XBUFFER (buffer)->name))
      error ("Selecting deleted buffer");
!   set_buffer_internal (XBUFFER (buffer));
!   return buffer;
  }
  
--- 1421,1435 ----
  when the current command terminates.\n\
  Use `switch-to-buffer' or `pop-to-buffer' to switch buffers permanently.")
!   (buffer)
!      register Lisp_Object buffer;
  {
!   register Lisp_Object buf;
!   buf = Fget_buffer (buffer);
!   if (NILP (buf))
!     nsberror (buffer);
!   if (NILP (XBUFFER (buf)->name))
      error ("Selecting deleted buffer");
!   set_buffer_internal (XBUFFER (buf));
!   return buf;
  }
  
*************** If BUFFER is nil or omitted, bury the cu
*** 1440,1453 ****
  Also, if BUFFER is nil or omitted, remove the current buffer from the\n\
  selected window if it is displayed there.")
!   (buf)
!      register Lisp_Object buf;
  {
    /* Figure out what buffer we're going to bury.  */
!   if (NILP (buf))
      {
!       XSETBUFFER (buf, current_buffer);
  
        /* If we're burying the current buffer, unshow it.  */
!       Fswitch_to_buffer (Fother_buffer (buf, Qnil), Qnil);
      }
    else
--- 1452,1465 ----
  Also, if BUFFER is nil or omitted, remove the current buffer from the\n\
  selected window if it is displayed there.")
!   (buffer)
!      register Lisp_Object buffer;
  {
    /* Figure out what buffer we're going to bury.  */
!   if (NILP (buffer))
      {
!       XSETBUFFER (buffer, current_buffer);
  
        /* If we're burying the current buffer, unshow it.  */
!       Fswitch_to_buffer (Fother_buffer (buffer, Qnil), Qnil);
      }
    else
*************** selected window if it is displayed there
*** 1455,1469 ****
        Lisp_Object buf1;
        
!       buf1 = Fget_buffer (buf);
        if (NILP (buf1))
! 	nsberror (buf);
!       buf = buf1;
      }
  
!   /* Move buf to the end of the buffer list.  */
    {
      register Lisp_Object aelt, link;
  
!     aelt = Frassq (buf, Vbuffer_alist);
      link = Fmemq (aelt, Vbuffer_alist);
      Vbuffer_alist = Fdelq (aelt, Vbuffer_alist);
--- 1467,1481 ----
        Lisp_Object buf1;
        
!       buf1 = Fget_buffer (buffer);
        if (NILP (buf1))
! 	nsberror (buffer);
!       buffer = buf1;
      }
  
!   /* Move buffer to the end of the buffer list.  */
    {
      register Lisp_Object aelt, link;
  
!     aelt = Frassq (buffer, Vbuffer_alist);
      link = Fmemq (aelt, Vbuffer_alist);
      Vbuffer_alist = Fdelq (aelt, Vbuffer_alist);
*************** DEFUN ("overlay-recenter", Foverlay_rece
*** 2934,2938 ****
  
  DEFUN ("overlay-get", Foverlay_get, Soverlay_get, 2, 2, 0,
!   "Get the property of overlay OVERLAY with property name NAME.")
    (overlay, prop)
       Lisp_Object overlay, prop;
--- 2946,2950 ----
  
  DEFUN ("overlay-get", Foverlay_get, Soverlay_get, 2, 2, 0,
!   "Get the property of overlay OVERLAY with property name PROP.")
    (overlay, prop)
       Lisp_Object overlay, prop;
*************** add_overlay_mod_hooklist (functionlist, 
*** 3033,3038 ****
        last_overlay_modification_hooks
  	= Fmake_vector (make_number (oldsize * 2), Qnil);
!       bcopy (XVECTOR (last_overlay_modification_hooks)->contents,
! 	     XVECTOR (old)->contents,
  	     sizeof (Lisp_Object) * oldsize);
      }
--- 3045,3050 ----
        last_overlay_modification_hooks
  	= Fmake_vector (make_number (oldsize * 2), Qnil);
!       bcopy (XVECTOR (old)->contents,
! 	     XVECTOR (last_overlay_modification_hooks)->contents,
  	     sizeof (Lisp_Object) * oldsize);
      }
*************** init_buffer_once ()
*** 3376,3380 ****
    XSETINT (buffer_local_flags.invisibility_spec, -1);
    XSETINT (buffer_local_flags.file_format, -1);
-   XSETINT (buffer_local_flags.redisplay_end_trigger, -1);
  
    XSETFASTINT (buffer_local_flags.mode_line_format, 1);
--- 3388,3391 ----
*************** init_buffer_once ()
*** 3418,3421 ****
--- 3429,3433 ----
  
    Vprin1_to_string_buffer = Fget_buffer_create (build_string (" prin1"));
+ 
    /* super-magic invisible buffer */
    Vbuffer_alist = Qnil;
*************** A string is printed verbatim in the mode
*** 3592,3595 ****
--- 3604,3608 ----
  	For a modified read-only buffer, %* gives % and %+ gives *.\n\
    %s -- print process status.   %l -- print the current line number.\n\
+   %c -- print the current column number (this makes editing slower).\n\
    %p -- print percent of buffer above top of window, or Top, Bot or All.\n\
    %P -- print percent of buffer above bottom of window, perhaps plus Top,\n\
*************** was modified between BEG and END.  PROPE
*** 3862,3865 ****
--- 3875,3881 ----
  and VALUE is the old value.\n\
  \n\
+ An entry (MARKER . DISTANCE) indicates that the marker MARKER\n\
+ was adjusted in position by the offset DISTANCE (an integer).\n\
+ \n\
  An entry of the form POSITION indicates that point was at the buffer\n\
  location given by the integer.  Undoing an entry of this form places\n\
*************** is a member of the list.");
*** 3942,3945 ****
--- 3958,3962 ----
    Vkill_buffer_query_functions = Qnil;
  
+   defsubr (&Sbuffer_live_p);
    defsubr (&Sbuffer_list);
    defsubr (&Sget_buffer);
diff -2rcpP --exclude=*.elc emacs-19.30/src/buffer.h emacs-19.31/src/buffer.h
*** emacs-19.30/src/buffer.h	Fri Oct 20 19:20:38 1995
--- emacs-19.31/src/buffer.h	Mon Jan 15 04:06:29 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** struct buffer
*** 403,410 ****
                   if it is memq in that list.  */
      Lisp_Object invisibility_spec;
- 
-     /* If redisplay goes beyond this point in the buffer,
-        run redisplay-end-trigger-hook.  */
-     Lisp_Object redisplay_end_trigger;
  
      /* These are so we don't have to recompile everything
--- 404,407 ----
diff -2rcpP --exclude=*.elc emacs-19.30/src/bytecode.c emacs-19.31/src/bytecode.c
*** emacs-19.30/src/bytecode.c	Mon Jul 17 20:34:05 1995
--- emacs-19.31/src/bytecode.c	Tue Apr  9 18:12:31 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.
  
  hacked on by jwz@lucid.com 17-jun-91
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.
  
  hacked on by jwz@lucid.com 17-jun-91
*************** Lisp_Object Qbytecode;
*** 252,257 ****
  DEFUN ("byte-code", Fbyte_code, Sbyte_code, 3, 3, 0,
    "Function used internally in byte-compiled code.\n\
! The first argument is a string of byte code; the second, a vector of constants;\n\
! the third, the maximum stack depth used in this function.\n\
  If the third argument is incorrect, Emacs may crash.")
    (bytestr, vector, maxdepth)
--- 253,259 ----
  DEFUN ("byte-code", Fbyte_code, Sbyte_code, 3, 3, 0,
    "Function used internally in byte-compiled code.\n\
! The first argument, BYTESTR, is a string of byte code;\n\
! the second, VECTOR, a vector of constants;\n\
! the third, MAXDEPTH, the maximum stack depth used in this function.\n\
  If the third argument is incorrect, Emacs may crash.")
    (bytestr, vector, maxdepth)
diff -2rcpP --exclude=*.elc emacs-19.30/src/callint.c emacs-19.31/src/callint.c
*** emacs-19.30/src/callint.c	Fri Nov 10 01:33:22 1995
--- emacs-19.31/src/callint.c	Tue Apr  9 18:09:26 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** Optional second arg RECORD-FLAG non-nil\
*** 176,181 ****
  means unconditionally put this command in the command-history.\n\
  Otherwise, this is done only if an arg is read using the minibuffer.")
!   (function, record, keys)
!      Lisp_Object function, record, keys;
  {
    Lisp_Object *args, *visargs;
--- 177,182 ----
  means unconditionally put this command in the command-history.\n\
  Otherwise, this is done only if an arg is read using the minibuffer.")
!   (function, record_flag, keys)
!      Lisp_Object function, record_flag, keys;
  {
    Lisp_Object *args, *visargs;
*************** Otherwise, this is done only if an arg i
*** 292,296 ****
        /* Compute the arg values using the user's expression.  */
        specs = Feval (specs);
!       if (i != num_input_chars || !NILP (record))
  	{
  	  /* We should record this command on the command history.  */
--- 293,297 ----
        /* Compute the arg values using the user's expression.  */
        specs = Feval (specs);
!       if (i != num_input_chars || !NILP (record_flag))
  	{
  	  /* We should record this command on the command history.  */
*************** Otherwise, this is done only if an arg i
*** 480,485 ****
  
          case 'c':		/* Character */
! 	  message1 (callint_message);
  	  args[i] = Fread_char ();
  	  /* Passing args[i] directly stimulates compiler bug */
  	  teml = args[i];
--- 481,490 ----
  
          case 'c':		/* Character */
! 	  /* Use message_nolog rather than message1_nolog here,
! 	     so that nothing bad happens if callint_message is changed
! 	     within Fread_char (by a timer, for example).  */
! 	  message_nolog ("%s", callint_message);
  	  args[i] = Fread_char ();
+ 	  message1_nolog ((char *) 0);
  	  /* Passing args[i] directly stimulates compiler bug */
  	  teml = args[i];
*************** Otherwise, this is done only if an arg i
*** 566,570 ****
  
  	case 'P':		/* Prefix arg in raw form.  Does no I/O.  */
- 	have_prefix_arg:
  	  args[i] = prefix_arg;
  	  /* visargs[i] = Qnil; */
--- 571,574 ----
*************** Otherwise, this is done only if an arg i
*** 573,576 ****
--- 577,581 ----
  
  	case 'p':		/* Prefix arg converted to number.  No I/O. */
+ 	have_prefix_arg:
  	  args[i] = Fprefix_numeric_value (prefix_arg);
  	  /* visargs[i] = Qnil; */
*************** Otherwise, this is done only if an arg i
*** 642,646 ****
    args[0] = function;
  
!   if (arg_from_tty || !NILP (record))
      {
        visargs[0] = function;
--- 647,651 ----
    args[0] = function;
  
!   if (arg_from_tty || !NILP (record_flag))
      {
        visargs[0] = function;
*************** Otherwise, this is done only if an arg i
*** 676,680 ****
  DEFUN ("prefix-numeric-value", Fprefix_numeric_value, Sprefix_numeric_value,
    1, 1, 0,
!   "Return numeric meaning of raw prefix argument ARG.\n\
  A raw prefix argument is what you get from `(interactive \"P\")'.\n\
  Its numeric meaning is what you would get from `(interactive \"p\")'.")
--- 681,685 ----
  DEFUN ("prefix-numeric-value", Fprefix_numeric_value, Sprefix_numeric_value,
    1, 1, 0,
!   "Return numeric meaning of raw prefix argument RAW.\n\
  A raw prefix argument is what you get from `(interactive \"P\")'.\n\
  Its numeric meaning is what you would get from `(interactive \"p\")'.")
diff -2rcpP --exclude=*.elc emacs-19.30/src/callproc.c emacs-19.31/src/callproc.c
*** emacs-19.30/src/callproc.c	Fri Oct  6 15:20:04 1995
--- emacs-19.31/src/callproc.c	Wed May 15 10:31:48 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** If you quit, the process is killed with 
*** 325,334 ****
  
  #ifdef MSDOS /* MW, July 1993 */
-   /* These vars record information from process termination.
-      Clear them now before process can possibly terminate,
-      to avoid timing error if process terminates soon.  */
-   synch_process_death = 0;
-   synch_process_retcode = 0;
- 
    if ((outf = egetenv ("TMP")) || (outf = egetenv ("TEMP")))
      strcpy (tempfile = alloca (strlen (outf) + 20), outf);
--- 326,329 ----
*************** If you quit, the process is killed with 
*** 350,353 ****
--- 345,349 ----
        report_file_error ("Opening process output file", Fcons (tempfile, Qnil));
      }
+   fd[1] = outfilefd;
  #endif
  
*************** If you quit, the process is killed with 
*** 357,365 ****
      {
  #ifndef MSDOS
- #ifdef WINDOWSNT
-       pipe_with_inherited_out (fd);
- #else  /* not WINDOWSNT */
        pipe (fd);
- #endif /* not WINDOWSNT */
  #endif
  #if 0
--- 353,357 ----
*************** If you quit, the process is killed with 
*** 389,407 ****
      synch_process_retcode = 0;
  
- #ifdef MSDOS /* MW, July 1993 */
-     /* ??? Someone who knows MSDOG needs to check whether this properly
-        closes all descriptors that it opens.  */
-     pid = run_msdos_command (new_argv, current_dir, filefd, outfilefd);
-     close (outfilefd);
-     fd1 = -1; /* No harm in closing that one!  */
-     fd[0] = open (tempfile, NILP (Vbinary_process_output) ? O_TEXT : O_BINARY);
-     if (fd[0] < 0)
-       {
- 	unlink (tempfile);
- 	close (filefd);
- 	report_file_error ("Cannot re-open temporary file", Qnil);
-       }
- #else /* not MSDOS */
- 
      if (NILP (error_file))
        fd_error = open (NULL_DEVICE, O_WRONLY);
--- 381,384 ----
*************** If you quit, the process is killed with 
*** 425,429 ****
--- 402,434 ----
  	report_file_error ("Cannot open", error_file);
        }
+ #ifdef MSDOS /* MW, July 1993 */
+     /* ??? Someone who knows MSDOG needs to check whether this properly
+        closes all descriptors that it opens.
+ 
+        Note that run_msdos_command() actually returns the child process
+        exit status, not its PID, so we assign it to `synch_process_retcode'
+        below.  */
+     pid = run_msdos_command (new_argv, current_dir,
+ 			     filefd, outfilefd, fd_error);
+ 
+     /* Record that the synchronous process exited and note its
+        termination status.  */
+     synch_process_alive = 0;
+     synch_process_retcode = pid;
+     if (synch_process_retcode < 0)  /* means it couldn't be exec'ed */
+       synch_process_death = strerror(errno);
  
+     close (outfilefd);
+     if (fd_error != outfilefd)
+       close (fd_error);
+     fd1 = -1; /* No harm in closing that one!  */
+     fd[0] = open (tempfile, NILP (Vbinary_process_output) ? O_TEXT : O_BINARY);
+     if (fd[0] < 0)
+       {
+ 	unlink (tempfile);
+ 	close (filefd);
+ 	report_file_error ("Cannot re-open temporary file", Qnil);
+       }
+ #else /* not MSDOS */
  #ifdef WINDOWSNT
      pid = child_setup (filefd, fd1, fd_error, new_argv, 0, current_dir);
*************** If you quit, the process is killed with 
*** 435,439 ****
  	if (fd[0] >= 0)
  	  close (fd[0]);
! #ifdef USG
          setpgrp ();
  #else
--- 440,444 ----
  	if (fd[0] >= 0)
  	  close (fd[0]);
! #if defined(USG) && !defined(BSD_PGRPS)
          setpgrp ();
  #else
*************** If you quit, the process is killed with 
*** 442,448 ****
  	child_setup (filefd, fd1, fd_error, new_argv, 0, current_dir);
        }
- #endif /* not MSDOS */
  #endif /* not WINDOWSNT */
  
      environ = save_environ;
  
--- 447,457 ----
  	child_setup (filefd, fd1, fd_error, new_argv, 0, current_dir);
        }
  #endif /* not WINDOWSNT */
  
+     /* The MSDOS case did this already.  */
+     if (fd_error >= 0)
+       close (fd_error);
+ #endif /* not MSDOS */
+ 
      environ = save_environ;
  
*************** If you quit, the process is killed with 
*** 450,454 ****
         since we will use that to read input from.  */
      close (filefd);
!     if (fd1 >= 0)
        close (fd1);
    }
--- 459,463 ----
         since we will use that to read input from.  */
      close (filefd);
!     if (fd1 >= 0 && fd1 != fd_error)
        close (fd1);
    }
*************** If you quit, the process is killed with 
*** 502,506 ****
  	/* Repeatedly read until we've filled as much as possible
  	   of the buffer size we have.  But don't read
! 	   less than 1024--save that for the next bufferfull.  */
  
  	nread = 0;
--- 511,515 ----
  	/* Repeatedly read until we've filled as much as possible
  	   of the buffer size we have.  But don't read
! 	   less than 1024--save that for the next bufferful.  */
  
  	nread = 0;
*************** If you quit, the process is killed with 
*** 623,627 ****
        *tempfile = '\0';
      }
-   dostounix_filename (tempfile);
    if (!IS_DIRECTORY_SEP (tempfile[strlen (tempfile) - 1]))
      strcat (tempfile, "/");
--- 632,635 ----
*************** If you quit, the process is killed with 
*** 631,634 ****
--- 639,646 ----
    strcat (tempfile, "detmp.XXX");
  #endif
+   if ('/' == DIRECTORY_SEP)
+     dostounix_filename (tempfile);
+   else
+     unixtodos_filename (tempfile);
  #else /* not DOS_NT */
  
*************** child_setup (in, out, err, new_argv, set
*** 700,704 ****
  #ifdef WINDOWSNT
    int cpid;
!   HANDLE handles[4];
  #endif /* WINDOWSNT */
  
--- 712,716 ----
  #ifdef WINDOWSNT
    int cpid;
!   HANDLE handles[3];
  #endif /* WINDOWSNT */
  
*************** child_setup (in, out, err, new_argv, set
*** 840,844 ****
  #endif /* not WINDOWSNT */
  
! #ifdef USG
  #ifndef SETPGRP_RELEASES_CTTY
    setpgrp ();			/* No arguments but equivalent in this case */
--- 852,856 ----
  #endif /* not WINDOWSNT */
  
! #if defined(USG) && !defined(BSD_PGRPS)
  #ifndef SETPGRP_RELEASES_CTTY
    setpgrp ();			/* No arguments but equivalent in this case */
*************** child_setup (in, out, err, new_argv, set
*** 869,873 ****
    execvp (new_argv[0], new_argv);
  
!   write (1, "Can't exec program: ", 26);
    write (1, new_argv[0], strlen (new_argv[0]));
    write (1, "\n", 1);
--- 881,885 ----
    execvp (new_argv[0], new_argv);
  
!   write (1, "Can't exec program: ", 20);
    write (1, new_argv[0], strlen (new_argv[0]));
    write (1, "\n", 1);
diff -2rcpP --exclude=*.elc emacs-19.30/src/casefiddle.c emacs-19.31/src/casefiddle.c
*** emacs-19.30/src/casefiddle.c	Thu Jun 15 16:38:46 1995
--- emacs-19.31/src/casefiddle.c	Mon May  6 00:14:34 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** casify_object (flag, obj)
*** 35,38 ****
--- 36,43 ----
    register int inword = flag == CASE_DOWN;
  
+   /* If the case table is flagged as modified, rescan it.  */
+   if (NILP (XCHAR_TABLE (current_buffer->downcase_table)->extras[1]))
+     Fset_case_table (current_buffer->downcase_table);
+ 
    while (1)
      {
*************** casify_region (flag, b, e)
*** 133,136 ****
--- 138,145 ----
      return;
  
+   /* If the case table is flagged as modified, rescan it.  */
+   if (NILP (XCHAR_TABLE (current_buffer->downcase_table)->extras[1]))
+     Fset_case_table (current_buffer->downcase_table);
+ 
    validate_region (&b, &e);
    start = XFASTINT (b);
*************** the region to operate on.  When used as 
*** 161,168 ****
  point and the mark is operated on.\n\
  See also `capitalize-region'.")
!   (b, e)
!      Lisp_Object b, e;
  {
!   casify_region (CASE_UP, b, e);
    return Qnil;
  }
--- 170,177 ----
  point and the mark is operated on.\n\
  See also `capitalize-region'.")
!   (beg, end)
!      Lisp_Object beg, end;
  {
!   casify_region (CASE_UP, beg, end);
    return Qnil;
  }
*************** These arguments specify the starting and
*** 173,180 ****
  the region to operate on.  When used as a command, the text between\n\
  point and the mark is operated on.")
!   (b, e)
!      Lisp_Object b, e;
  {
!   casify_region (CASE_DOWN, b, e);
    return Qnil;
  }
--- 182,189 ----
  the region to operate on.  When used as a command, the text between\n\
  point and the mark is operated on.")
!   (beg, end)
!      Lisp_Object beg, end;
  {
!   casify_region (CASE_DOWN, beg, end);
    return Qnil;
  }
*************** and the rest of it is lower case.\n\
*** 186,193 ****
  In programs, give two arguments, the starting and ending\n\
  character positions to operate on.")
!   (b, e)
!      Lisp_Object b, e;
  {
!   casify_region (CASE_CAPITALIZE, b, e);
    return Qnil;
  }
--- 195,202 ----
  In programs, give two arguments, the starting and ending\n\
  character positions to operate on.")
!   (beg, end)
!      Lisp_Object beg, end;
  {
!   casify_region (CASE_CAPITALIZE, beg, end);
    return Qnil;
  }
*************** Subsequent letters of each word are not 
*** 201,208 ****
  In programs, give two arguments, the starting and ending\n\
  character positions to operate on.")
!   (b, e)
!      Lisp_Object b, e;
  {
!   casify_region (CASE_CAPITALIZE_UP, b, e);
    return Qnil;
  }
--- 210,217 ----
  In programs, give two arguments, the starting and ending\n\
  character positions to operate on.")
!   (beg, end)
!      Lisp_Object beg, end;
  {
!   casify_region (CASE_CAPITALIZE_UP, beg, end);
    return Qnil;
  }
diff -2rcpP --exclude=*.elc emacs-19.30/src/casetab.c emacs-19.31/src/casetab.c
*** emacs-19.30/src/casetab.c	Sun Oct 29 14:09:00 1995
--- emacs-19.31/src/casetab.c	Mon May  6 00:24:34 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  /* Written by Howard Gayle.  See chartab.c for details. */
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* Written by Howard Gayle.  See chartab.c for details. */
*************** static void compute_trt_inverse ();
*** 31,49 ****
  
  DEFUN ("case-table-p", Fcase_table_p, Scase_table_p, 1, 1, 0,
!   "Return t iff ARG is a case table.\n\
  See `set-case-table' for more information on these data structures.")
!   (table)
!      Lisp_Object table;
  {
    Lisp_Object up, canon, eqv;
  
!   if (! CHAR_TABLE_P (table))
      return Qnil;
!   if (! EQ (XCHAR_TABLE (table)->purpose, Qcase_table))
      return Qnil;
  
!   up = XCHAR_TABLE (table)->extras[0];
!   canon = XCHAR_TABLE (table)->extras[1];
!   eqv = XCHAR_TABLE (table)->extras[2];
  
    return ((NILP (up) || CHAR_TABLE_P (up))
--- 32,50 ----
  
  DEFUN ("case-table-p", Fcase_table_p, Scase_table_p, 1, 1, 0,
!   "Return t iff OBJECT is a case table.\n\
  See `set-case-table' for more information on these data structures.")
!   (object)
!      Lisp_Object object;
  {
    Lisp_Object up, canon, eqv;
  
!   if (! CHAR_TABLE_P (object))
      return Qnil;
!   if (! EQ (XCHAR_TABLE (object)->purpose, Qcase_table))
      return Qnil;
  
!   up = XCHAR_TABLE (object)->extras[0];
!   canon = XCHAR_TABLE (object)->extras[1];
!   eqv = XCHAR_TABLE (object)->extras[2];
  
    return ((NILP (up) || CHAR_TABLE_P (up))
*************** set_case_table (table, standard)
*** 159,163 ****
      Vascii_downcase_table = table;
    else
!     current_buffer->downcase_table = table;
  
    return table;
--- 160,169 ----
      Vascii_downcase_table = table;
    else
!     {
!       current_buffer->downcase_table = table;
!       current_buffer->upcase_table = up;
!       current_buffer->case_canon_table = canon;
!       current_buffer->case_eqv_table = eqv;
!     }
  
    return table;
diff -2rcpP --exclude=*.elc emacs-19.30/src/cm.c emacs-19.31/src/cm.c
*** emacs-19.30/src/cm.c	Thu Apr  6 21:46:49 1995
--- emacs-19.31/src/cm.c	Tue Apr  9 18:00:24 1996
*************** GNU General Public License for more deta
*** 17,21 ****
  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.  */
  
  
--- 17,22 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/cm.h emacs-19.31/src/cm.h
*** emacs-19.30/src/cm.h	Thu Jun 15 16:39:01 1995
--- emacs-19.31/src/cm.h	Mon Jan 15 04:06:29 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  /* Holds the minimum and maximum costs for the parametrized capabilities.  */
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* Holds the minimum and maximum costs for the parametrized capabilities.  */
diff -2rcpP --exclude=*.elc emacs-19.30/src/cmds.c emacs-19.31/src/cmds.c
*** emacs-19.30/src/cmds.c	Mon Aug 14 04:09:04 1995
--- emacs-19.31/src/cmds.c	Tue May 21 10:27:04 1996
***************
*** 1,4 ****
  /* Simple built-in editing commands.
!    Copyright (C) 1985, 1993, 1994, 1995 Free Software Foundation, Inc.
  
  This file is part of GNU Emacs.
--- 1,4 ----
  /* Simple built-in editing commands.
!    Copyright (C) 1985, 93, 94, 95, 1996 Free Software Foundation, Inc.
  
  This file is part of GNU Emacs.
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** extern Lisp_Object Qface;
*** 41,45 ****
  
  DEFUN ("forward-char", Fforward_char, Sforward_char, 0, 1, "p",
!   "Move point right ARG characters (left if ARG negative).\n\
  On reaching end of buffer, stop and signal error.")
    (n)
--- 42,46 ----
  
  DEFUN ("forward-char", Fforward_char, Sforward_char, 0, 1, "p",
!   "Move point right N characters (left if N is negative).\n\
  On reaching end of buffer, stop and signal error.")
    (n)
*************** On reaching end of buffer, stop and sign
*** 77,81 ****
  
  DEFUN ("backward-char", Fbackward_char, Sbackward_char, 0, 1, "p",
!   "Move point left ARG characters (right if ARG negative).\n\
  On attempt to pass beginning or end of buffer, stop and signal error.")
    (n)
--- 78,82 ----
  
  DEFUN ("backward-char", Fbackward_char, Sbackward_char, 0, 1, "p",
!   "Move point left N characters (right if N is negative).\n\
  On attempt to pass beginning or end of buffer, stop and signal error.")
    (n)
*************** On attempt to pass beginning or end of b
*** 92,101 ****
  
  DEFUN ("forward-line", Fforward_line, Sforward_line, 0, 1, "p",
!   "Move ARG lines forward (backward if ARG is negative).\n\
! Precisely, if point is on line I, move to the start of line I + ARG.\n\
  If there isn't room, go as far as possible (no error).\n\
  Returns the count of lines left to move.  If moving forward,\n\
! that is ARG - number of lines moved; if backward, ARG + number moved.\n\
! With positive ARG, a non-empty line at the end counts as one line\n\
    successfully moved (for the return value).")
    (n)
--- 93,102 ----
  
  DEFUN ("forward-line", Fforward_line, Sforward_line, 0, 1, "p",
!   "Move N lines forward (backward if N is negative).\n\
! Precisely, if point is on line I, move to the start of line I + N.\n\
  If there isn't room, go as far as possible (no error).\n\
  Returns the count of lines left to move.  If moving forward,\n\
! that is N - number of lines moved; if backward, N + number moved.\n\
! With positive N, a non-empty line at the end counts as one line\n\
    successfully moved (for the return value).")
    (n)
*************** DEFUN ("beginning-of-line", Fbeginning_o
*** 129,133 ****
    0, 1, "p",
    "Move point to beginning of current line.\n\
! With argument ARG not nil or 1, move forward ARG - 1 lines first.\n\
  If scan reaches end of buffer, stop there without error.")
    (n)
--- 130,134 ----
    0, 1, "p",
    "Move point to beginning of current line.\n\
! With argument N not nil or 1, move forward N - 1 lines first.\n\
  If scan reaches end of buffer, stop there without error.")
    (n)
*************** DEFUN ("end-of-line", Fend_of_line, Send
*** 146,150 ****
    0, 1, "p",
    "Move point to end of current line.\n\
! With argument ARG not nil or 1, move forward ARG - 1 lines first.\n\
  If scan reaches end of buffer, stop there without error.")
    (n)
--- 147,151 ----
    0, 1, "p",
    "Move point to end of current line.\n\
! With argument N not nil or 1, move forward N - 1 lines first.\n\
  If scan reaches end of buffer, stop there without error.")
    (n)
*************** If scan reaches end of buffer, stop ther
*** 165,172 ****
  
  DEFUN ("delete-char", Fdelete_char, Sdelete_char, 1, 2, "p\nP",
!   "Delete the following ARG characters (previous, with negative arg).\n\
  Optional second arg KILLFLAG non-nil means kill instead (save in kill ring).\n\
! Interactively, ARG is the prefix arg, and KILLFLAG is set if\n\
! ARG was explicitly specified.")
    (n, killflag)
       Lisp_Object n, killflag;
--- 166,173 ----
  
  DEFUN ("delete-char", Fdelete_char, Sdelete_char, 1, 2, "p\nP",
!   "Delete the following N characters (previous if N is negative).\n\
  Optional second arg KILLFLAG non-nil means kill instead (save in kill ring).\n\
! Interactively, N is the prefix arg, and KILLFLAG is set if\n\
! N was explicitly specified.")
    (n, killflag)
       Lisp_Object n, killflag;
*************** ARG was explicitly specified.")
*** 200,212 ****
  DEFUN ("delete-backward-char", Fdelete_backward_char, Sdelete_backward_char,
    1, 2, "p\nP",
!   "Delete the previous ARG characters (following, with negative ARG).\n\
  Optional second arg KILLFLAG non-nil means kill instead (save in kill ring).\n\
! Interactively, ARG is the prefix arg, and KILLFLAG is set if\n\
! ARG was explicitly specified.")
    (n, killflag)
       Lisp_Object n, killflag;
  {
    CHECK_NUMBER (n, 0);
!   return Fdelete_char (make_number (-XINT (n)), killflag);
  }
  
--- 201,243 ----
  DEFUN ("delete-backward-char", Fdelete_backward_char, Sdelete_backward_char,
    1, 2, "p\nP",
!   "Delete the previous N characters (following if N is negative).\n\
  Optional second arg KILLFLAG non-nil means kill instead (save in kill ring).\n\
! Interactively, N is the prefix arg, and KILLFLAG is set if\n\
! N was explicitly specified.")
    (n, killflag)
       Lisp_Object n, killflag;
  {
+   Lisp_Object value;
+   int deleted_tab = 0;
+   int i;
+ 
    CHECK_NUMBER (n, 0);
! 
!   /* See if we are about to delete a tab backwards.  */
!   for (i = 0; i < XINT (n); i++)
!     {
!       if (point - i < BEGV)
! 	break;
!       if (FETCH_CHAR (point - i) == '\t')
! 	{
! 	  deleted_tab = 1;
! 	  break;
! 	}
!     }
! 
!   value = Fdelete_char (make_number (-XINT (n)), killflag);
! 
!   /* In overwrite mode, back over columns while clearing them out,
!      unless at end of line.  */
!   if (XINT (n) > 0
!       && ! NILP (current_buffer->overwrite_mode)
!       && ! deleted_tab
!       && ! (point == ZV || FETCH_CHAR (point) == '\n'))
!     {
!       Finsert_char (make_number (' '), XINT (n));
!       SET_PT (point - XINT (n));
!     }
! 
!   return value;
  }
  
*************** DEFUN ("self-insert-command", Fself_inse
*** 214,228 ****
    "Insert the character you type.\n\
  Whichever character you type to run this command is inserted.")
!   (arg)
!      Lisp_Object arg;
  {
!   CHECK_NUMBER (arg, 0);
  
    /* Barf if the key that invoked this was not a character.  */
    if (!INTEGERP (last_command_char))
      bitch_at_user ();
!   else if (XINT (arg) >= 2 && NILP (current_buffer->overwrite_mode))
      {
!       XSETFASTINT (arg, XFASTINT (arg) - 2);
        /* The first one might want to expand an abbrev.  */
        internal_self_insert (XINT (last_command_char), 1);
--- 245,259 ----
    "Insert the character you type.\n\
  Whichever character you type to run this command is inserted.")
!   (n)
!      Lisp_Object n;
  {
!   CHECK_NUMBER (n, 0);
  
    /* Barf if the key that invoked this was not a character.  */
    if (!INTEGERP (last_command_char))
      bitch_at_user ();
!   else if (XINT (n) >= 2 && NILP (current_buffer->overwrite_mode))
      {
!       XSETFASTINT (n, XFASTINT (n) - 2);
        /* The first one might want to expand an abbrev.  */
        internal_self_insert (XINT (last_command_char), 1);
*************** Whichever character you type to run this
*** 230,243 ****
  	 We don't have to handle a user-specified face specially
  	 because it will get inherited from the first char inserted.  */
!       Finsert_char (last_command_char, arg, Qt);
        /* The last one might want to auto-fill.  */
        internal_self_insert (XINT (last_command_char), 0);
      }
    else
!     while (XINT (arg) > 0)
        {
  	/* Ok since old and new vals both nonneg */
! 	XSETFASTINT (arg, XFASTINT (arg) - 1);
! 	internal_self_insert (XINT (last_command_char), XFASTINT (arg) != 0);
        }
  
--- 261,274 ----
  	 We don't have to handle a user-specified face specially
  	 because it will get inherited from the first char inserted.  */
!       Finsert_char (last_command_char, n, Qt);
        /* The last one might want to auto-fill.  */
        internal_self_insert (XINT (last_command_char), 0);
      }
    else
!     while (XINT (n) > 0)
        {
  	/* Ok since old and new vals both nonneg */
! 	XSETFASTINT (n, XFASTINT (n) - 1);
! 	internal_self_insert (XINT (last_command_char), XFASTINT (n) != 0);
        }
  
*************** Whichever character you type to run this
*** 253,257 ****
  
  internal_self_insert (c1, noautofill)
!      char c1;
       int noautofill;
  {
--- 284,291 ----
  
  internal_self_insert (c1, noautofill)
!      /* This has to be unsigned char; when it is char,
! 	some compilers sign-extend it in SYNTAX_ENTRY, despite
! 	the casts to unsigned char there.  */
!      unsigned char c1;
       int noautofill;
  {
*************** internal_self_insert (c1, noautofill)
*** 298,301 ****
--- 332,337 ----
        && !NILP (current_buffer->auto_fill_function))
      {
+       Lisp_Object tem;
+ 
        insert_and_inherit (&c1, 1);
        if (c1 == '\n')
*************** internal_self_insert (c1, noautofill)
*** 304,311 ****
  	/* justification, if any, know where the end is going to be. */
  	SET_PT (point - 1);
!       call0 (current_buffer->auto_fill_function);
        if (c1 == '\n')
  	SET_PT (point + 1);
!       hairy = 2;
      }
    else
--- 340,348 ----
  	/* justification, if any, know where the end is going to be. */
  	SET_PT (point - 1);
!       tem = call0 (current_buffer->auto_fill_function);
        if (c1 == '\n')
  	SET_PT (point + 1);
!       if (!NILP (tem))
! 	hairy = 2;
      }
    else
diff -2rcpP --exclude=*.elc emacs-19.30/src/commands.h emacs-19.31/src/commands.h
*** emacs-19.30/src/commands.h	Thu Jun 15 16:39:01 1995
--- emacs-19.31/src/commands.h	Mon Jan 15 04:06:29 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/config.in emacs-19.31/src/config.in
*** emacs-19.30/src/config.in	Tue Nov  7 02:01:18 1995
--- emacs-19.31/src/config.in	Mon Apr  8 09:44:55 1996
***************
*** 4,21 ****
  This file is part of GNU Emacs.
  
  GNU Emacs is distributed in the hope that it will be useful,
! but WITHOUT ANY WARRANTY.  No author or distributor
! accepts responsibility to anyone for the consequences of using it
! or for whether it serves any particular purpose or works at all,
! unless he says so in writing.  Refer to the GNU Emacs General Public
! License for full details.
! 
! Everyone is granted permission to copy, modify and redistribute
! GNU Emacs, but only under the conditions described in the
! GNU Emacs General Public License.   A copy of this license is
! supposed to have been given to you along with GNU Emacs so you
! can know your rights and responsibilities.  It should be in a
! file named COPYING.  Among other things, the copyright notice
! and this notice must be preserved on all copies.  */
  
  
--- 4,20 ----
  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.  */
  
  
*************** and this notice must be preserved on all
*** 54,65 ****
  #undef HAVE_XFREE386
  
! /* Define HAVE_X_MENU if you want to use the X window menu system.
!    This appears to work on some machines that support X
!    and not on others.  */
! #undef HAVE_X_MENU
  
  /* Define if we have the X11R6 or newer version of Xt.  */
  #undef HAVE_X11XTR6
  
  /* Define if netdb.h declares h_errno.  */
  #undef HAVE_H_ERRNO
--- 53,67 ----
  #undef HAVE_XFREE386
  
! /* Define HAVE_MENUS if you have mouse menus.
!    (This is automatic if you use X, but the option to specify it remains.)
!    It is also defined with other window systems that support xmenu.c.  */
! #undef HAVE_MENUS
  
  /* Define if we have the X11R6 or newer version of Xt.  */
  #undef HAVE_X11XTR6
  
+ /* Define if we have the X11R6 or newer version of Xlib.  */
+ #undef HAVE_X11R6
+ 
  /* Define if netdb.h declares h_errno.  */
  #undef HAVE_H_ERRNO
*************** and this notice must be preserved on all
*** 116,119 ****
--- 118,122 ----
  #undef HAVE_UNISTD_H
  #undef HAVE_UTIME_H
+ #undef HAVE_LINUX_VERSION_H
  #undef STDC_HEADERS
  #undef TIME_WITH_SYS_TIME
*************** and this notice must be preserved on all
*** 122,125 ****
--- 125,130 ----
  #undef HAVE_LIBPTHREADS
  #undef HAVE_LIBRESOLV
+ #undef HAVE_LIBXMU
+ #undef HAVE_LIBNCURSES
  
  #undef HAVE_ALLOCA_H
*************** and this notice must be preserved on all
*** 167,170 ****
--- 172,178 ----
  #undef HAVE_EACCESS
  #undef HAVE_GETPAGESIZE
+ #undef HAVE_TZSET
+ #undef HAVE_SETLOCALE
+ #undef LOCALTIME_CACHE
  #undef HAVE_INET_SOCKETS
  
*************** and this notice must be preserved on all
*** 219,231 ****
  #include config_machfile
  
- /* These typedefs shouldn't appear when alloca.s or Makefile.in
-    includes config.h.  */
- #ifndef NOT_C_CODE
- #ifndef SPECIAL_EMACS_INT
- typedef long EMACS_INT;
- typedef unsigned long EMACS_UINT;
- #endif
- #endif
- 
  /* Load in the conversion definitions if this system
     needs them and the source file being compiled has not
--- 227,230 ----
*************** extern char *getenv ();
*** 328,332 ****
  
  /* These default definitions are good for almost all machines.
!    The exceptions override them in m/*.h.  */
  
  #ifndef BITS_PER_CHAR
--- 327,331 ----
  
  /* These default definitions are good for almost all machines.
!    The exceptions override them in m/MACHINE.h.  */
  
  #ifndef BITS_PER_CHAR
diff -2rcpP --exclude=*.elc emacs-19.30/src/data.c emacs-19.31/src/data.c
*** emacs-19.30/src/data.c	Sat Nov 18 22:39:10 1995
--- emacs-19.31/src/data.c	Tue Apr  9 18:08:19 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** static Lisp_Object Qinteger, Qsymbol, Qs
*** 84,87 ****
--- 85,89 ----
  static Lisp_Object Qfloat, Qwindow_configuration, Qprocess, Qwindow;
  static Lisp_Object Qcompiled_function, Qbuffer, Qframe, Qvector;
+ static Lisp_Object Qchar_table, Qbool_vector;
  
  static Lisp_Object swap_in_symval_forwarding ();
*************** args_out_of_range_3 (a1, a2, a3)
*** 136,148 ****
  }
  
- Lisp_Object
- make_number (num)
-      int num;
- {
-   register Lisp_Object val;
-   XSETINT (val, num);
-   return val;
- }
- 
  /* On some machines, XINT needs a temporary location.
     Here it is, in case it is needed.  */
--- 138,141 ----
*************** for example, (type-of 1) returns `intege
*** 229,232 ****
--- 222,229 ----
        if (GC_BUFFERP (object))
  	return Qbuffer;
+       if (GC_CHAR_TABLE_P (object))
+ 	return Qchar_table;
+       if (GC_BOOL_VECTOR_P (object))
+ 	return Qbool_vector;
  
  #ifdef MULTI_FRAME
*************** DEFUN ("setcdr", Fsetcdr, Ssetcdr, 2, 2,
*** 556,570 ****
  
  DEFUN ("boundp", Fboundp, Sboundp, 1, 1, 0, "T if SYMBOL's value is not void.")
!   (sym)
!      register Lisp_Object sym;
  {
    Lisp_Object valcontents;
!   CHECK_SYMBOL (sym, 0);
  
!   valcontents = XSYMBOL (sym)->value;
  
    if (BUFFER_LOCAL_VALUEP (valcontents)
        || SOME_BUFFER_LOCAL_VALUEP (valcontents))
!     valcontents = swap_in_symval_forwarding (sym, valcontents);
  
    return (EQ (valcontents, Qunbound) ? Qnil : Qt);
--- 553,567 ----
  
  DEFUN ("boundp", Fboundp, Sboundp, 1, 1, 0, "T if SYMBOL's value is not void.")
!   (symbol)
!      register Lisp_Object symbol;
  {
    Lisp_Object valcontents;
!   CHECK_SYMBOL (symbol, 0);
  
!   valcontents = XSYMBOL (symbol)->value;
  
    if (BUFFER_LOCAL_VALUEP (valcontents)
        || SOME_BUFFER_LOCAL_VALUEP (valcontents))
!     valcontents = swap_in_symval_forwarding (symbol, valcontents);
  
    return (EQ (valcontents, Qunbound) ? Qnil : Qt);
*************** DEFUN ("boundp", Fboundp, Sboundp, 1, 1,
*** 572,602 ****
  
  DEFUN ("fboundp", Ffboundp, Sfboundp, 1, 1, 0, "T if SYMBOL's function definition is not void.")
!   (sym)
!      register Lisp_Object sym;
  {
!   CHECK_SYMBOL (sym, 0);
!   return (EQ (XSYMBOL (sym)->function, Qunbound) ? Qnil : Qt);
  }
  
  DEFUN ("makunbound", Fmakunbound, Smakunbound, 1, 1, 0, "Make SYMBOL's value be void.")
!   (sym)
!      register Lisp_Object sym;
  {
!   CHECK_SYMBOL (sym, 0);
!   if (NILP (sym) || EQ (sym, Qt))
!     return Fsignal (Qsetting_constant, Fcons (sym, Qnil));
!   Fset (sym, Qunbound);
!   return sym;
  }
  
  DEFUN ("fmakunbound", Ffmakunbound, Sfmakunbound, 1, 1, 0, "Make SYMBOL's function definition be void.")
!   (sym)
!      register Lisp_Object sym;
  {
!   CHECK_SYMBOL (sym, 0);
!   if (NILP (sym) || EQ (sym, Qt))
!     return Fsignal (Qsetting_constant, Fcons (sym, Qnil));
!   XSYMBOL (sym)->function = Qunbound;
!   return sym;
  }
  
--- 569,599 ----
  
  DEFUN ("fboundp", Ffboundp, Sfboundp, 1, 1, 0, "T if SYMBOL's function definition is not void.")
!   (symbol)
!      register Lisp_Object symbol;
  {
!   CHECK_SYMBOL (symbol, 0);
!   return (EQ (XSYMBOL (symbol)->function, Qunbound) ? Qnil : Qt);
  }
  
  DEFUN ("makunbound", Fmakunbound, Smakunbound, 1, 1, 0, "Make SYMBOL's value be void.")
!   (symbol)
!      register Lisp_Object symbol;
  {
!   CHECK_SYMBOL (symbol, 0);
!   if (NILP (symbol) || EQ (symbol, Qt))
!     return Fsignal (Qsetting_constant, Fcons (symbol, Qnil));
!   Fset (symbol, Qunbound);
!   return symbol;
  }
  
  DEFUN ("fmakunbound", Ffmakunbound, Sfmakunbound, 1, 1, 0, "Make SYMBOL's function definition be void.")
!   (symbol)
!      register Lisp_Object symbol;
  {
!   CHECK_SYMBOL (symbol, 0);
!   if (NILP (symbol) || EQ (symbol, Qt))
!     return Fsignal (Qsetting_constant, Fcons (symbol, Qnil));
!   XSYMBOL (symbol)->function = Qunbound;
!   return symbol;
  }
  
*************** DEFUN ("symbol-function", Fsymbol_functi
*** 613,631 ****
  
  DEFUN ("symbol-plist", Fsymbol_plist, Ssymbol_plist, 1, 1, 0, "Return SYMBOL's property list.")
!   (sym)
!      register Lisp_Object sym;
  {
!   CHECK_SYMBOL (sym, 0);
!   return XSYMBOL (sym)->plist;
  }
  
  DEFUN ("symbol-name", Fsymbol_name, Ssymbol_name, 1, 1, 0, "Return SYMBOL's name, a string.")
!   (sym)
!      register Lisp_Object sym;
  {
    register Lisp_Object name;
  
!   CHECK_SYMBOL (sym, 0);
!   XSETSTRING (name, XSYMBOL (sym)->name);
    return name;
  }
--- 610,628 ----
  
  DEFUN ("symbol-plist", Fsymbol_plist, Ssymbol_plist, 1, 1, 0, "Return SYMBOL's property list.")
!   (symbol)
!      register Lisp_Object symbol;
  {
!   CHECK_SYMBOL (symbol, 0);
!   return XSYMBOL (symbol)->plist;
  }
  
  DEFUN ("symbol-name", Fsymbol_name, Ssymbol_name, 1, 1, 0, "Return SYMBOL's name, a string.")
!   (symbol)
!      register Lisp_Object symbol;
  {
    register Lisp_Object name;
  
!   CHECK_SYMBOL (symbol, 0);
!   XSETSTRING (name, XSYMBOL (symbol)->name);
    return name;
  }
*************** DEFUN ("symbol-name", Fsymbol_name, Ssym
*** 633,651 ****
  DEFUN ("fset", Ffset, Sfset, 2, 2, 0,
    "Set SYMBOL's function definition to NEWVAL, and return NEWVAL.")
!   (sym, newdef)
!      register Lisp_Object sym, newdef;
  {
!   CHECK_SYMBOL (sym, 0);
!   if (NILP (sym) || EQ (sym, Qt))
!     return Fsignal (Qsetting_constant, Fcons (sym, Qnil));
!   if (!NILP (Vautoload_queue) && !EQ (XSYMBOL (sym)->function, Qunbound))
!     Vautoload_queue = Fcons (Fcons (sym, XSYMBOL (sym)->function),
  			     Vautoload_queue);
!   XSYMBOL (sym)->function = newdef;
    /* Handle automatic advice activation */
!   if (CONSP (XSYMBOL (sym)->plist) && !NILP (Fget (sym, Qad_advice_info)))
      {
!       call2 (Qad_activate, sym, Qnil);
!       newdef = XSYMBOL (sym)->function;
      }
    return newdef;
--- 630,648 ----
  DEFUN ("fset", Ffset, Sfset, 2, 2, 0,
    "Set SYMBOL's function definition to NEWVAL, and return NEWVAL.")
!   (symbol, newdef)
!      register Lisp_Object symbol, newdef;
  {
!   CHECK_SYMBOL (symbol, 0);
!   if (NILP (symbol) || EQ (symbol, Qt))
!     return Fsignal (Qsetting_constant, Fcons (symbol, Qnil));
!   if (!NILP (Vautoload_queue) && !EQ (XSYMBOL (symbol)->function, Qunbound))
!     Vautoload_queue = Fcons (Fcons (symbol, XSYMBOL (symbol)->function),
  			     Vautoload_queue);
!   XSYMBOL (symbol)->function = newdef;
    /* Handle automatic advice activation */
!   if (CONSP (XSYMBOL (symbol)->plist) && !NILP (Fget (symbol, Qad_advice_info)))
      {
!       call2 (Qad_activate, symbol, Qnil);
!       newdef = XSYMBOL (symbol)->function;
      }
    return newdef;
*************** DEFUN ("defalias", Fdefalias, Sdefalias,
*** 657,675 ****
    "Set SYMBOL's function definition to NEWVAL, and return NEWVAL.\n\
  Associates the function with the current load file, if any.")
!   (sym, newdef)
!      register Lisp_Object sym, newdef;
  {
!   CHECK_SYMBOL (sym, 0);
!   if (!NILP (Vautoload_queue) && !EQ (XSYMBOL (sym)->function, Qunbound))
!     Vautoload_queue = Fcons (Fcons (sym, XSYMBOL (sym)->function),
  			     Vautoload_queue);
!   XSYMBOL (sym)->function = newdef;
    /* Handle automatic advice activation */
!   if (CONSP (XSYMBOL (sym)->plist) && !NILP (Fget (sym, Qad_advice_info)))
      {
!       call2 (Qad_activate, sym, Qnil);
!       newdef = XSYMBOL (sym)->function;
      }
!   LOADHIST_ATTACH (sym);
    return newdef;
  }
--- 654,672 ----
    "Set SYMBOL's function definition to NEWVAL, and return NEWVAL.\n\
  Associates the function with the current load file, if any.")
!   (symbol, newdef)
!      register Lisp_Object symbol, newdef;
  {
!   CHECK_SYMBOL (symbol, 0);
!   if (!NILP (Vautoload_queue) && !EQ (XSYMBOL (symbol)->function, Qunbound))
!     Vautoload_queue = Fcons (Fcons (symbol, XSYMBOL (symbol)->function),
  			     Vautoload_queue);
!   XSYMBOL (symbol)->function = newdef;
    /* Handle automatic advice activation */
!   if (CONSP (XSYMBOL (symbol)->plist) && !NILP (Fget (symbol, Qad_advice_info)))
      {
!       call2 (Qad_activate, symbol, Qnil);
!       newdef = XSYMBOL (symbol)->function;
      }
!   LOADHIST_ATTACH (symbol);
    return newdef;
  }
*************** DEFUN ("define-function", Fdefine_functi
*** 678,696 ****
    "Set SYMBOL's function definition to NEWVAL, and return NEWVAL.\n\
  Associates the function with the current load file, if any.")
!   (sym, newdef)
!      register Lisp_Object sym, newdef;
  {
!   CHECK_SYMBOL (sym, 0);
!   if (!NILP (Vautoload_queue) && !EQ (XSYMBOL (sym)->function, Qunbound))
!     Vautoload_queue = Fcons (Fcons (sym, XSYMBOL (sym)->function),
  			     Vautoload_queue);
!   XSYMBOL (sym)->function = newdef;
    /* Handle automatic advice activation */
!   if (CONSP (XSYMBOL (sym)->plist) && !NILP (Fget (sym, Qad_advice_info)))
      {
!       call2 (Qad_activate, sym, Qnil);
!       newdef = XSYMBOL (sym)->function;
      }
!   LOADHIST_ATTACH (sym);
    return newdef;
  }
--- 675,693 ----
    "Set SYMBOL's function definition to NEWVAL, and return NEWVAL.\n\
  Associates the function with the current load file, if any.")
!   (symbol, newdef)
!      register Lisp_Object symbol, newdef;
  {
!   CHECK_SYMBOL (symbol, 0);
!   if (!NILP (Vautoload_queue) && !EQ (XSYMBOL (symbol)->function, Qunbound))
!     Vautoload_queue = Fcons (Fcons (symbol, XSYMBOL (symbol)->function),
  			     Vautoload_queue);
!   XSYMBOL (symbol)->function = newdef;
    /* Handle automatic advice activation */
!   if (CONSP (XSYMBOL (symbol)->plist) && !NILP (Fget (symbol, Qad_advice_info)))
      {
!       call2 (Qad_activate, symbol, Qnil);
!       newdef = XSYMBOL (symbol)->function;
      }
!   LOADHIST_ATTACH (symbol);
    return newdef;
  }
*************** Associates the function with the current
*** 698,706 ****
  DEFUN ("setplist", Fsetplist, Ssetplist, 2, 2, 0,
    "Set SYMBOL's property list to NEWVAL, and return NEWVAL.")
!   (sym, newplist)
!      register Lisp_Object sym, newplist;
  {
!   CHECK_SYMBOL (sym, 0);
!   XSYMBOL (sym)->plist = newplist;
    return newplist;
  }
--- 695,703 ----
  DEFUN ("setplist", Fsetplist, Ssetplist, 2, 2, 0,
    "Set SYMBOL's property list to NEWVAL, and return NEWVAL.")
!   (symbol, newplist)
!      register Lisp_Object symbol, newplist;
  {
!   CHECK_SYMBOL (symbol, 0);
!   XSYMBOL (symbol)->plist = newplist;
    return newplist;
  }
*************** do_symval_forwarding (valcontents)
*** 744,755 ****
  }
  
! /* Store NEWVAL into SYM, where VALCONTENTS is found in the value cell
!    of SYM.  If SYM is buffer-local, VALCONTENTS should be the
     buffer-independent contents of the value cell: forwarded just one
     step past the buffer-localness.  */
  
  void
! store_symval_forwarding (sym, valcontents, newval)
!      Lisp_Object sym;
       register Lisp_Object valcontents, newval;
  {
--- 741,752 ----
  }
  
! /* Store NEWVAL into SYMBOL, where VALCONTENTS is found in the value cell
!    of SYMBOL.  If SYMBOL is buffer-local, VALCONTENTS should be the
     buffer-independent contents of the value cell: forwarded just one
     step past the buffer-localness.  */
  
  void
! store_symval_forwarding (symbol, valcontents, newval)
!      Lisp_Object symbol;
       register Lisp_Object valcontents, newval;
  {
*************** store_symval_forwarding (sym, valcontent
*** 764,768 ****
  	  if (*XINTFWD (valcontents)->intvar != XINT (newval))
  	    error ("Value out of range for variable `%s'",
! 		   XSYMBOL (sym)->name->data);
  	  break;
  
--- 761,765 ----
  	  if (*XINTFWD (valcontents)->intvar != XINT (newval))
  	    error ("Value out of range for variable `%s'",
! 		   XSYMBOL (symbol)->name->data);
  	  break;
  
*************** store_symval_forwarding (sym, valcontent
*** 802,821 ****
      default:
      def:
!       valcontents = XSYMBOL (sym)->value;
        if (BUFFER_LOCAL_VALUEP (valcontents)
  	  || SOME_BUFFER_LOCAL_VALUEP (valcontents))
  	XBUFFER_LOCAL_VALUE (valcontents)->car = newval;
        else
! 	XSYMBOL (sym)->value = newval;
      }
  }
  
! /* Set up the buffer-local symbol SYM for validity in the current
     buffer.  VALCONTENTS is the contents of its value cell.
     Return the value forwarded one step past the buffer-local indicator.  */
  
  static Lisp_Object
! swap_in_symval_forwarding (sym, valcontents)
!      Lisp_Object sym, valcontents;
  {
    /* valcontents is a pointer to a struct resembling the cons
--- 799,818 ----
      default:
      def:
!       valcontents = XSYMBOL (symbol)->value;
        if (BUFFER_LOCAL_VALUEP (valcontents)
  	  || SOME_BUFFER_LOCAL_VALUEP (valcontents))
  	XBUFFER_LOCAL_VALUE (valcontents)->car = newval;
        else
! 	XSYMBOL (symbol)->value = newval;
      }
  }
  
! /* Set up the buffer-local symbol SYMBOL for validity in the current
     buffer.  VALCONTENTS is the contents of its value cell.
     Return the value forwarded one step past the buffer-local indicator.  */
  
  static Lisp_Object
! swap_in_symval_forwarding (symbol, valcontents)
!      Lisp_Object symbol, valcontents;
  {
    /* valcontents is a pointer to a struct resembling the cons
*************** swap_in_symval_forwarding (sym, valconte
*** 844,848 ****
        Fsetcdr (tem1,
  	       do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents)->car));
!       tem1 = assq_no_quit (sym, current_buffer->local_var_alist);
        if (NILP (tem1))
  	tem1 = XCONS (XBUFFER_LOCAL_VALUE (valcontents)->cdr)->cdr;
--- 841,845 ----
        Fsetcdr (tem1,
  	       do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents)->car));
!       tem1 = assq_no_quit (symbol, current_buffer->local_var_alist);
        if (NILP (tem1))
  	tem1 = XCONS (XBUFFER_LOCAL_VALUE (valcontents)->cdr)->cdr;
*************** swap_in_symval_forwarding (sym, valconte
*** 850,854 ****
        XSETBUFFER (XCONS (XBUFFER_LOCAL_VALUE (valcontents)->cdr)->car,
  		  current_buffer);
!       store_symval_forwarding (sym, XBUFFER_LOCAL_VALUE (valcontents)->car,
  			       Fcdr (tem1));
      }
--- 847,851 ----
        XSETBUFFER (XCONS (XBUFFER_LOCAL_VALUE (valcontents)->cdr)->car,
  		  current_buffer);
!       store_symval_forwarding (symbol, XBUFFER_LOCAL_VALUE (valcontents)->car,
  			       Fcdr (tem1));
      }
*************** swap_in_symval_forwarding (sym, valconte
*** 858,877 ****
  /* Find the value of a symbol, returning Qunbound if it's not bound.
     This is helpful for code which just wants to get a variable's value
!    if it has one, without signalling an error.
     Note that it must not be possible to quit
     within this function.  Great care is required for this.  */
  
  Lisp_Object
! find_symbol_value (sym)
!      Lisp_Object sym;
  {
    register Lisp_Object valcontents, tem1;
    register Lisp_Object val;
!   CHECK_SYMBOL (sym, 0);
!   valcontents = XSYMBOL (sym)->value;
  
    if (BUFFER_LOCAL_VALUEP (valcontents)
        || SOME_BUFFER_LOCAL_VALUEP (valcontents))
!     valcontents = swap_in_symval_forwarding (sym, valcontents);
  
    if (MISCP (valcontents))
--- 855,874 ----
  /* Find the value of a symbol, returning Qunbound if it's not bound.
     This is helpful for code which just wants to get a variable's value
!    if it has one, without signaling an error.
     Note that it must not be possible to quit
     within this function.  Great care is required for this.  */
  
  Lisp_Object
! find_symbol_value (symbol)
!      Lisp_Object symbol;
  {
    register Lisp_Object valcontents, tem1;
    register Lisp_Object val;
!   CHECK_SYMBOL (symbol, 0);
!   valcontents = XSYMBOL (symbol)->value;
  
    if (BUFFER_LOCAL_VALUEP (valcontents)
        || SOME_BUFFER_LOCAL_VALUEP (valcontents))
!     valcontents = swap_in_symval_forwarding (symbol, valcontents);
  
    if (MISCP (valcontents))
*************** find_symbol_value (sym)
*** 904,915 ****
  DEFUN ("symbol-value", Fsymbol_value, Ssymbol_value, 1, 1, 0,
    "Return SYMBOL's value.  Error if that is void.")
!   (sym)
!      Lisp_Object sym;
  {
    Lisp_Object val;
  
!   val = find_symbol_value (sym);
    if (EQ (val, Qunbound))
!     return Fsignal (Qvoid_variable, Fcons (sym, Qnil));
    else
      return val;
--- 901,912 ----
  DEFUN ("symbol-value", Fsymbol_value, Ssymbol_value, 1, 1, 0,
    "Return SYMBOL's value.  Error if that is void.")
!   (symbol)
!      Lisp_Object symbol;
  {
    Lisp_Object val;
  
!   val = find_symbol_value (symbol);
    if (EQ (val, Qunbound))
!     return Fsignal (Qvoid_variable, Fcons (symbol, Qnil));
    else
      return val;
*************** DEFUN ("symbol-value", Fsymbol_value, Ss
*** 918,923 ****
  DEFUN ("set", Fset, Sset, 2, 2, 0,
    "Set SYMBOL's value to NEWVAL, and return NEWVAL.")
!   (sym, newval)
!      register Lisp_Object sym, newval;
  {
    int voide = EQ (newval, Qunbound);
--- 915,920 ----
  DEFUN ("set", Fset, Sset, 2, 2, 0,
    "Set SYMBOL's value to NEWVAL, and return NEWVAL.")
!   (symbol, newval)
!      register Lisp_Object symbol, newval;
  {
    int voide = EQ (newval, Qunbound);
*************** DEFUN ("set", Fset, Sset, 2, 2, 0,
*** 925,932 ****
    register Lisp_Object valcontents, tem1, current_alist_element;
  
!   CHECK_SYMBOL (sym, 0);
!   if (NILP (sym) || EQ (sym, Qt))
!     return Fsignal (Qsetting_constant, Fcons (sym, Qnil));
!   valcontents = XSYMBOL (sym)->value;
  
    if (BUFFER_OBJFWDP (valcontents))
--- 922,929 ----
    register Lisp_Object valcontents, tem1, current_alist_element;
  
!   CHECK_SYMBOL (symbol, 0);
!   if (NILP (symbol) || EQ (symbol, Qt))
!     return Fsignal (Qsetting_constant, Fcons (symbol, Qnil));
!   valcontents = XSYMBOL (symbol)->value;
  
    if (BUFFER_OBJFWDP (valcontents))
*************** DEFUN ("set", Fset, Sset, 2, 2, 0,
*** 991,995 ****
  
  	  /* Find the new value for CURRENT-ALIST-ELEMENT.  */
! 	  tem1 = Fassq (sym, current_buffer->local_var_alist);
  	  if (NILP (tem1))
  	    {
--- 988,992 ----
  
  	  /* Find the new value for CURRENT-ALIST-ELEMENT.  */
! 	  tem1 = Fassq (symbol, current_buffer->local_var_alist);
  	  if (NILP (tem1))
  	    {
*************** DEFUN ("set", Fset, Sset, 2, 2, 0,
*** 1007,1011 ****
  	      else
  		{
! 		  tem1 = Fcons (sym, Fcdr (current_alist_element));
  		  current_buffer->local_var_alist =
  		    Fcons (tem1, current_buffer->local_var_alist);
--- 1004,1008 ----
  	      else
  		{
! 		  tem1 = Fcons (symbol, Fcdr (current_alist_element));
  		  current_buffer->local_var_alist =
  		    Fcons (tem1, current_buffer->local_var_alist);
*************** DEFUN ("set", Fset, Sset, 2, 2, 0,
*** 1026,1032 ****
       buffer-local indicator, not through Lisp_Objfwd, etc.  */
    if (voide)
!     store_symval_forwarding (sym, Qnil, newval);
    else
!     store_symval_forwarding (sym, valcontents, newval);
  
    return newval;
--- 1023,1029 ----
       buffer-local indicator, not through Lisp_Objfwd, etc.  */
    if (voide)
!     store_symval_forwarding (symbol, Qnil, newval);
    else
!     store_symval_forwarding (symbol, valcontents, newval);
  
    return newval;
*************** DEFUN ("set", Fset, Sset, 2, 2, 0,
*** 1035,1049 ****
  /* Access or set a buffer-local symbol's default value.  */
  
! /* Return the default value of SYM, but don't check for voidness.
     Return Qunbound if it is void.  */
  
  Lisp_Object
! default_value (sym)
!      Lisp_Object sym;
  {
    register Lisp_Object valcontents;
  
!   CHECK_SYMBOL (sym, 0);
!   valcontents = XSYMBOL (sym)->value;
  
    /* For a built-in buffer-local variable, get the default value
--- 1032,1046 ----
  /* Access or set a buffer-local symbol's default value.  */
  
! /* Return the default value of SYMBOL, but don't check for voidness.
     Return Qunbound if it is void.  */
  
  Lisp_Object
! default_value (symbol)
!      Lisp_Object symbol;
  {
    register Lisp_Object valcontents;
  
!   CHECK_SYMBOL (symbol, 0);
!   valcontents = XSYMBOL (symbol)->value;
  
    /* For a built-in buffer-local variable, get the default value
*************** DEFUN ("default-boundp", Fdefault_boundp
*** 1082,1091 ****
  This is the value that is seen in buffers that do not have their own values\n\
  for this variable.")
!   (sym)
!      Lisp_Object sym;
  {
    register Lisp_Object value;
  
!   value = default_value (sym);
    return (EQ (value, Qunbound) ? Qnil : Qt);
  }
--- 1079,1088 ----
  This is the value that is seen in buffers that do not have their own values\n\
  for this variable.")
!   (symbol)
!      Lisp_Object symbol;
  {
    register Lisp_Object value;
  
!   value = default_value (symbol);
    return (EQ (value, Qunbound) ? Qnil : Qt);
  }
*************** This is the value that is seen in buffer
*** 1096,1107 ****
  for this variable.  The default value is meaningful for variables with\n\
  local bindings in certain buffers.")
!   (sym)
!      Lisp_Object sym;
  {
    register Lisp_Object value;
  
!   value = default_value (sym);
    if (EQ (value, Qunbound))
!     return Fsignal (Qvoid_variable, Fcons (sym, Qnil));
    return value;
  }
--- 1093,1104 ----
  for this variable.  The default value is meaningful for variables with\n\
  local bindings in certain buffers.")
!   (symbol)
!      Lisp_Object symbol;
  {
    register Lisp_Object value;
  
!   value = default_value (symbol);
    if (EQ (value, Qunbound))
!     return Fsignal (Qvoid_variable, Fcons (symbol, Qnil));
    return value;
  }
*************** DEFUN ("set-default", Fset_default, Sset
*** 1111,1121 ****
  The default value is seen in buffers that do not have their own values\n\
  for this variable.")
!   (sym, value)
!      Lisp_Object sym, value;
  {
    register Lisp_Object valcontents, current_alist_element, alist_element_buffer;
  
!   CHECK_SYMBOL (sym, 0);
!   valcontents = XSYMBOL (sym)->value;
  
    /* Handle variables like case-fold-search that have special slots
--- 1108,1118 ----
  The default value is seen in buffers that do not have their own values\n\
  for this variable.")
!   (symbol, value)
!      Lisp_Object symbol, value;
  {
    register Lisp_Object valcontents, current_alist_element, alist_element_buffer;
  
!   CHECK_SYMBOL (symbol, 0);
!   valcontents = XSYMBOL (symbol)->value;
  
    /* Handle variables like case-fold-search that have special slots
*************** for this variable.")
*** 1141,1145 ****
    if (!BUFFER_LOCAL_VALUEP (valcontents)
        && !SOME_BUFFER_LOCAL_VALUEP (valcontents))
!     return Fset (sym, value);
  
    /* Store new value into the DEFAULT-VALUE slot */
--- 1138,1142 ----
    if (!BUFFER_LOCAL_VALUEP (valcontents)
        && !SOME_BUFFER_LOCAL_VALUEP (valcontents))
!     return Fset (symbol, value);
  
    /* Store new value into the DEFAULT-VALUE slot */
*************** for this variable.")
*** 1151,1155 ****
    alist_element_buffer = Fcar (current_alist_element);
    if (EQ (alist_element_buffer, current_alist_element))
!     store_symval_forwarding (sym, XBUFFER_LOCAL_VALUE (valcontents)->car,
  			     value);
  
--- 1148,1152 ----
    alist_element_buffer = Fcar (current_alist_element);
    if (EQ (alist_element_buffer, current_alist_element))
!     store_symval_forwarding (symbol, XBUFFER_LOCAL_VALUE (valcontents)->car,
  			     value);
  
*************** that do not have their own values for th
*** 1165,1171 ****
  \n\
  More generally, you can use multiple variables and values, as in\n\
!   (setq-default SYM VALUE SYM VALUE...)\n\
! This sets each SYM's default value to the corresponding VALUE.\n\
! The VALUE for the Nth SYM can refer to the new default values\n\
  of previous SYMs.")
    (args)
--- 1162,1168 ----
  \n\
  More generally, you can use multiple variables and values, as in\n\
!   (setq-default SYMBOL VALUE SYMBOL VALUE...)\n\
! This sets each SYMBOL's default value to the corresponding VALUE.\n\
! The VALUE for the Nth SYMBOL can refer to the new default values\n\
  of previous SYMs.")
    (args)
*************** of previous SYMs.")
*** 1173,1177 ****
  {
    register Lisp_Object args_left;
!   register Lisp_Object val, sym;
    struct gcpro gcpro1;
  
--- 1170,1174 ----
  {
    register Lisp_Object args_left;
!   register Lisp_Object val, symbol;
    struct gcpro gcpro1;
  
*************** of previous SYMs.")
*** 1185,1190 ****
      {
        val = Feval (Fcar (Fcdr (args_left)));
!       sym = Fcar (args_left);
!       Fset_default (sym, val);
        args_left = Fcdr (Fcdr (args_left));
      }
--- 1182,1187 ----
      {
        val = Feval (Fcar (Fcdr (args_left)));
!       symbol = Fcar (args_left);
!       Fset_default (symbol, val);
        args_left = Fcdr (Fcdr (args_left));
      }
*************** Using `set' or `setq' to set the variabl
*** 1206,1237 ****
  for the current buffer if it was previously using the default value.\n\
  The function `default-value' gets the default value and `set-default' sets it.")
!   (sym)
!      register Lisp_Object sym;
  {
    register Lisp_Object tem, valcontents, newval;
  
!   CHECK_SYMBOL (sym, 0);
  
!   valcontents = XSYMBOL (sym)->value;
!   if (EQ (sym, Qnil) || EQ (sym, Qt) || KBOARD_OBJFWDP (valcontents))
!     error ("Symbol %s may not be buffer-local", XSYMBOL (sym)->name->data);
  
    if (BUFFER_LOCAL_VALUEP (valcontents) || BUFFER_OBJFWDP (valcontents))
!     return sym;
    if (SOME_BUFFER_LOCAL_VALUEP (valcontents))
      {
!       XMISCTYPE (XSYMBOL (sym)->value) = Lisp_Misc_Buffer_Local_Value;
!       return sym;
      }
    if (EQ (valcontents, Qunbound))
!     XSYMBOL (sym)->value = Qnil;
!   tem = Fcons (Qnil, Fsymbol_value (sym));
    XCONS (tem)->car = tem;
    newval = allocate_misc ();
    XMISCTYPE (newval) = Lisp_Misc_Buffer_Local_Value;
!   XBUFFER_LOCAL_VALUE (newval)->car = XSYMBOL (sym)->value;
    XBUFFER_LOCAL_VALUE (newval)->cdr = Fcons (Fcurrent_buffer (), tem);
!   XSYMBOL (sym)->value = newval;
!   return sym;
  }
  
--- 1203,1234 ----
  for the current buffer if it was previously using the default value.\n\
  The function `default-value' gets the default value and `set-default' sets it.")
!   (variable)
!      register Lisp_Object variable;
  {
    register Lisp_Object tem, valcontents, newval;
  
!   CHECK_SYMBOL (variable, 0);
  
!   valcontents = XSYMBOL (variable)->value;
!   if (EQ (variable, Qnil) || EQ (variable, Qt) || KBOARD_OBJFWDP (valcontents))
!     error ("Symbol %s may not be buffer-local", XSYMBOL (variable)->name->data);
  
    if (BUFFER_LOCAL_VALUEP (valcontents) || BUFFER_OBJFWDP (valcontents))
!     return variable;
    if (SOME_BUFFER_LOCAL_VALUEP (valcontents))
      {
!       XMISCTYPE (XSYMBOL (variable)->value) = Lisp_Misc_Buffer_Local_Value;
!       return variable;
      }
    if (EQ (valcontents, Qunbound))
!     XSYMBOL (variable)->value = Qnil;
!   tem = Fcons (Qnil, Fsymbol_value (variable));
    XCONS (tem)->car = tem;
    newval = allocate_misc ();
    XMISCTYPE (newval) = Lisp_Misc_Buffer_Local_Value;
!   XBUFFER_LOCAL_VALUE (newval)->car = XSYMBOL (variable)->value;
    XBUFFER_LOCAL_VALUE (newval)->cdr = Fcons (Fcurrent_buffer (), tem);
!   XSYMBOL (variable)->value = newval;
!   return variable;
  }
  
*************** just as setting the variable would do.\n
*** 1249,1273 ****
  Do not use `make-local-variable' to make a hook variable buffer-local.\n\
  Use `make-local-hook' instead.")
!   (sym)
!      register Lisp_Object sym;
  {
    register Lisp_Object tem, valcontents;
  
!   CHECK_SYMBOL (sym, 0);
  
!   valcontents = XSYMBOL (sym)->value;
!   if (EQ (sym, Qnil) || EQ (sym, Qt) || KBOARD_OBJFWDP (valcontents))
!     error ("Symbol %s may not be buffer-local", XSYMBOL (sym)->name->data);
  
    if (BUFFER_LOCAL_VALUEP (valcontents) || BUFFER_OBJFWDP (valcontents))
      {
!       tem = Fboundp (sym);
  
        /* Make sure the symbol has a local value in this particular buffer,
  	 by setting it to the same value it already has.  */
!       Fset (sym, (EQ (tem, Qt) ? Fsymbol_value (sym) : Qunbound));
!       return sym;
      }
!   /* Make sure sym is set up to hold per-buffer values */
    if (!SOME_BUFFER_LOCAL_VALUEP (valcontents))
      {
--- 1246,1270 ----
  Do not use `make-local-variable' to make a hook variable buffer-local.\n\
  Use `make-local-hook' instead.")
!   (variable)
!      register Lisp_Object variable;
  {
    register Lisp_Object tem, valcontents;
  
!   CHECK_SYMBOL (variable, 0);
  
!   valcontents = XSYMBOL (variable)->value;
!   if (EQ (variable, Qnil) || EQ (variable, Qt) || KBOARD_OBJFWDP (valcontents))
!     error ("Symbol %s may not be buffer-local", XSYMBOL (variable)->name->data);
  
    if (BUFFER_LOCAL_VALUEP (valcontents) || BUFFER_OBJFWDP (valcontents))
      {
!       tem = Fboundp (variable);
  
        /* Make sure the symbol has a local value in this particular buffer,
  	 by setting it to the same value it already has.  */
!       Fset (variable, (EQ (tem, Qt) ? Fsymbol_value (variable) : Qunbound));
!       return variable;
      }
!   /* Make sure symbol is set up to hold per-buffer values */
    if (!SOME_BUFFER_LOCAL_VALUEP (valcontents))
      {
*************** Use `make-local-hook' instead.")
*** 1277,1286 ****
        newval = allocate_misc ();
        XMISCTYPE (newval) = Lisp_Misc_Some_Buffer_Local_Value;
!       XBUFFER_LOCAL_VALUE (newval)->car = XSYMBOL (sym)->value;
        XBUFFER_LOCAL_VALUE (newval)->cdr = Fcons (Qnil, tem);
!       XSYMBOL (sym)->value = newval;
      }
!   /* Make sure this buffer has its own value of sym */
!   tem = Fassq (sym, current_buffer->local_var_alist);
    if (NILP (tem))
      {
--- 1274,1283 ----
        newval = allocate_misc ();
        XMISCTYPE (newval) = Lisp_Misc_Some_Buffer_Local_Value;
!       XBUFFER_LOCAL_VALUE (newval)->car = XSYMBOL (variable)->value;
        XBUFFER_LOCAL_VALUE (newval)->cdr = Fcons (Qnil, tem);
!       XSYMBOL (variable)->value = newval;
      }
!   /* Make sure this buffer has its own value of symbol */
!   tem = Fassq (variable, current_buffer->local_var_alist);
    if (NILP (tem))
      {
*************** Use `make-local-hook' instead.")
*** 1288,1295 ****
  	 sure the current value is permanently recorded, if it's the
  	 default value.  */
!       find_symbol_value (sym);
  
        current_buffer->local_var_alist
!         = Fcons (Fcons (sym, XCONS (XCONS (XBUFFER_LOCAL_VALUE (XSYMBOL (sym)->value)->cdr)->cdr)->cdr),
  		 current_buffer->local_var_alist);
  
--- 1285,1292 ----
  	 sure the current value is permanently recorded, if it's the
  	 default value.  */
!       find_symbol_value (variable);
  
        current_buffer->local_var_alist
!         = Fcons (Fcons (variable, XCONS (XCONS (XBUFFER_LOCAL_VALUE (XSYMBOL (variable)->value)->cdr)->cdr)->cdr),
  		 current_buffer->local_var_alist);
  
*************** Use `make-local-hook' instead.")
*** 1299,1303 ****
  	Lisp_Object *pvalbuf;
  
! 	valcontents = XSYMBOL (sym)->value;
  
  	pvalbuf = &XCONS (XBUFFER_LOCAL_VALUE (valcontents)->cdr)->car;
--- 1296,1300 ----
  	Lisp_Object *pvalbuf;
  
! 	valcontents = XSYMBOL (variable)->value;
  
  	pvalbuf = &XCONS (XBUFFER_LOCAL_VALUE (valcontents)->cdr)->car;
*************** Use `make-local-hook' instead.")
*** 1311,1319 ****
       variable before we swap in, then that new value will clobber the
       default value the next time we swap.  */
!   valcontents = XBUFFER_LOCAL_VALUE (XSYMBOL (sym)->value)->car;
    if (INTFWDP (valcontents) || BOOLFWDP (valcontents) || OBJFWDP (valcontents))
!     swap_in_symval_forwarding (sym, XSYMBOL (sym)->value);
  
!   return sym;
  }
  
--- 1308,1316 ----
       variable before we swap in, then that new value will clobber the
       default value the next time we swap.  */
!   valcontents = XBUFFER_LOCAL_VALUE (XSYMBOL (variable)->value)->car;
    if (INTFWDP (valcontents) || BOOLFWDP (valcontents) || OBJFWDP (valcontents))
!     swap_in_symval_forwarding (variable, XSYMBOL (variable)->value);
  
!   return variable;
  }
  
*************** DEFUN ("kill-local-variable", Fkill_loca
*** 1322,1333 ****
    "Make VARIABLE no longer have a separate value in the current buffer.\n\
  From now on the default value will apply in this buffer.")
!   (sym)
!      register Lisp_Object sym;
  {
    register Lisp_Object tem, valcontents;
  
!   CHECK_SYMBOL (sym, 0);
  
!   valcontents = XSYMBOL (sym)->value;
  
    if (BUFFER_OBJFWDP (valcontents))
--- 1319,1330 ----
    "Make VARIABLE no longer have a separate value in the current buffer.\n\
  From now on the default value will apply in this buffer.")
!   (variable)
!      register Lisp_Object variable;
  {
    register Lisp_Object tem, valcontents;
  
!   CHECK_SYMBOL (variable, 0);
  
!   valcontents = XSYMBOL (variable)->value;
  
    if (BUFFER_OBJFWDP (valcontents))
*************** From now on the default value will apply
*** 1343,1371 ****
  	  current_buffer->local_var_flags &= ~mask;
  	}
!       return sym;
      }
  
    if (!BUFFER_LOCAL_VALUEP (valcontents)
        && !SOME_BUFFER_LOCAL_VALUEP (valcontents))
!     return sym;
  
    /* Get rid of this buffer's alist element, if any */
  
!   tem = Fassq (sym, current_buffer->local_var_alist);
    if (!NILP (tem))
      current_buffer->local_var_alist
        = Fdelq (tem, current_buffer->local_var_alist);
  
!   /* Make sure symbol does not think it is set up for this buffer;
!      force it to look once again for this buffer's value */
    {
      Lisp_Object *pvalbuf;
!     valcontents = XSYMBOL (sym)->value;
      pvalbuf = &XCONS (XBUFFER_LOCAL_VALUE (valcontents)->cdr)->car;
      if (current_buffer == XBUFFER (*pvalbuf))
!       *pvalbuf = Qnil;
    }
  
!   return sym;
  }
  
--- 1340,1372 ----
  	  current_buffer->local_var_flags &= ~mask;
  	}
!       return variable;
      }
  
    if (!BUFFER_LOCAL_VALUEP (valcontents)
        && !SOME_BUFFER_LOCAL_VALUEP (valcontents))
!     return variable;
  
    /* Get rid of this buffer's alist element, if any */
  
!   tem = Fassq (variable, current_buffer->local_var_alist);
    if (!NILP (tem))
      current_buffer->local_var_alist
        = Fdelq (tem, current_buffer->local_var_alist);
  
!   /* If the symbol is set up for the current buffer, recompute its
!      value.  We have to do it now, or else forwarded objects won't
!      work right. */
    {
      Lisp_Object *pvalbuf;
!     valcontents = XSYMBOL (variable)->value;
      pvalbuf = &XCONS (XBUFFER_LOCAL_VALUE (valcontents)->cdr)->car;
      if (current_buffer == XBUFFER (*pvalbuf))
!       {
! 	*pvalbuf = Qnil;
! 	find_symbol_value (variable);
!       }
    }
  
!   return variable;
  }
  
*************** DEFUN ("local-variable-p", Flocal_variab
*** 1374,1379 ****
    "Non-nil if VARIABLE has a local binding in buffer BUFFER.\n\
  BUFFER defaults to the current buffer.")
!   (sym, buffer)
!      register Lisp_Object sym, buffer;
  {
    Lisp_Object valcontents;
--- 1375,1380 ----
    "Non-nil if VARIABLE has a local binding in buffer BUFFER.\n\
  BUFFER defaults to the current buffer.")
!   (variable, buffer)
!      register Lisp_Object variable, buffer;
  {
    Lisp_Object valcontents;
*************** BUFFER defaults to the current buffer.")
*** 1388,1394 ****
      }
  
!   CHECK_SYMBOL (sym, 0);
  
!   valcontents = XSYMBOL (sym)->value;
    if (BUFFER_LOCAL_VALUEP (valcontents)
        || SOME_BUFFER_LOCAL_VALUEP (valcontents))
--- 1389,1395 ----
      }
  
!   CHECK_SYMBOL (variable, 0);
  
!   valcontents = XSYMBOL (variable)->value;
    if (BUFFER_LOCAL_VALUEP (valcontents)
        || SOME_BUFFER_LOCAL_VALUEP (valcontents))
*************** BUFFER defaults to the current buffer.")
*** 1398,1402 ****
  	{
  	  elt = XCONS (tail)->car;
! 	  if (EQ (sym, XCONS (elt)->car))
  	    return Qt;
  	}
--- 1399,1403 ----
  	{
  	  elt = XCONS (tail)->car;
! 	  if (EQ (variable, XCONS (elt)->car))
  	    return Qt;
  	}
*************** DEFUN ("local-variable-if-set-p", Flocal
*** 1416,1421 ****
    "Non-nil if VARIABLE will be local in buffer BUFFER if it is set there.\n\
  BUFFER defaults to the current buffer.")
!   (sym, buffer)
!      register Lisp_Object sym, buffer;
  {
    Lisp_Object valcontents;
--- 1417,1422 ----
    "Non-nil if VARIABLE will be local in buffer BUFFER if it is set there.\n\
  BUFFER defaults to the current buffer.")
!   (variable, buffer)
!      register Lisp_Object variable, buffer;
  {
    Lisp_Object valcontents;
*************** BUFFER defaults to the current buffer.")
*** 1430,1436 ****
      }
  
!   CHECK_SYMBOL (sym, 0);
  
!   valcontents = XSYMBOL (sym)->value;
  
    /* This means that make-variable-buffer-local was done.  */
--- 1431,1437 ----
      }
  
!   CHECK_SYMBOL (variable, 0);
  
!   valcontents = XSYMBOL (variable)->value;
  
    /* This means that make-variable-buffer-local was done.  */
*************** BUFFER defaults to the current buffer.")
*** 1446,1450 ****
  	{
  	  elt = XCONS (tail)->car;
! 	  if (EQ (sym, XCONS (elt)->car))
  	    return Qt;
  	}
--- 1447,1451 ----
  	{
  	  elt = XCONS (tail)->car;
! 	  if (EQ (variable, XCONS (elt)->car))
  	    return Qt;
  	}
*************** function chain of symbols.")
*** 1511,1517 ****
  
  DEFUN ("aref", Faref, Saref, 2, 2, 0,
!   "Return the element of ARRAY at index INDEX.\n\
  ARRAY may be a vector, a string, a char-table, a bool-vector,\n\
! or a byte-code object.  INDEX starts at 0.")
    (array, idx)
       register Lisp_Object array;
--- 1512,1518 ----
  
  DEFUN ("aref", Faref, Saref, 2, 2, 0,
!   "Return the element of ARRAY at index IDX.\n\
  ARRAY may be a vector, a string, a char-table, a bool-vector,\n\
! or a byte-code object.  IDX starts at 0.")
    (array, idx)
       register Lisp_Object array;
*************** DEFUN ("/=", Fneq, Sneq, 2, 2, 0,
*** 1819,1839 ****
  
  DEFUN ("zerop", Fzerop, Szerop, 1, 1, 0, "T if NUMBER is zero.")
!   (num)
!      register Lisp_Object num;
  {
  #ifdef LISP_FLOAT_TYPE
!   CHECK_NUMBER_OR_FLOAT (num, 0);
  
!   if (FLOATP (num))
      {
!       if (XFLOAT(num)->data == 0.0)
  	return Qt;
        return Qnil;
      }
  #else
!   CHECK_NUMBER (num, 0);
  #endif /* LISP_FLOAT_TYPE */
  
!   if (!XINT (num))
      return Qt;
    return Qnil;
--- 1820,1840 ----
  
  DEFUN ("zerop", Fzerop, Szerop, 1, 1, 0, "T if NUMBER is zero.")
!   (number)
!      register Lisp_Object number;
  {
  #ifdef LISP_FLOAT_TYPE
!   CHECK_NUMBER_OR_FLOAT (number, 0);
  
!   if (FLOATP (number))
      {
!       if (XFLOAT(number)->data == 0.0)
  	return Qt;
        return Qnil;
      }
  #else
!   CHECK_NUMBER (number, 0);
  #endif /* LISP_FLOAT_TYPE */
  
!   if (!XINT (number))
      return Qt;
    return Qnil;
*************** cons_to_long (c)
*** 1870,1891 ****
  
  DEFUN ("number-to-string", Fnumber_to_string, Snumber_to_string, 1, 1, 0,
!   "Convert NUM to a string by printing it in decimal.\n\
  Uses a minus sign if negative.\n\
! NUM may be an integer or a floating point number.")
!   (num)
!      Lisp_Object num;
  {
    char buffer[VALBITS];
  
  #ifndef LISP_FLOAT_TYPE
!   CHECK_NUMBER (num, 0);
  #else
!   CHECK_NUMBER_OR_FLOAT (num, 0);
  
!   if (FLOATP (num))
      {
        char pigbuf[350];	/* see comments in float_to_string */
  
!       float_to_string (pigbuf, XFLOAT(num)->data);
        return build_string (pigbuf);
      }
--- 1871,1892 ----
  
  DEFUN ("number-to-string", Fnumber_to_string, Snumber_to_string, 1, 1, 0,
!   "Convert NUMBER to a string by printing it in decimal.\n\
  Uses a minus sign if negative.\n\
! NUMBER may be an integer or a floating point number.")
!   (number)
!      Lisp_Object number;
  {
    char buffer[VALBITS];
  
  #ifndef LISP_FLOAT_TYPE
!   CHECK_NUMBER (number, 0);
  #else
!   CHECK_NUMBER_OR_FLOAT (number, 0);
  
!   if (FLOATP (number))
      {
        char pigbuf[350];	/* see comments in float_to_string */
  
!       float_to_string (pigbuf, XFLOAT(number)->data);
        return build_string (pigbuf);
      }
*************** NUM may be an integer or a floating poin
*** 1893,1899 ****
  
    if (sizeof (int) == sizeof (EMACS_INT))
!     sprintf (buffer, "%d", XINT (num));
    else if (sizeof (long) == sizeof (EMACS_INT))
!     sprintf (buffer, "%ld", XINT (num));
    else
      abort ();
--- 1894,1900 ----
  
    if (sizeof (int) == sizeof (EMACS_INT))
!     sprintf (buffer, "%d", XINT (number));
    else if (sizeof (long) == sizeof (EMACS_INT))
!     sprintf (buffer, "%ld", XINT (number));
    else
      abort ();
*************** DEFUN ("string-to-number", Fstring_to_nu
*** 1905,1917 ****
  This parses both integers and floating point numbers.\n\
  It ignores leading spaces and tabs.")
!   (str)
!      register Lisp_Object str;
  {
    Lisp_Object value;
    unsigned char *p;
  
!   CHECK_STRING (str, 0);
  
!   p = XSTRING (str)->data;
  
    /* Skip any whitespace at the front of the number.  Some versions of
--- 1906,1918 ----
  This parses both integers and floating point numbers.\n\
  It ignores leading spaces and tabs.")
!   (string)
!      register Lisp_Object string;
  {
    Lisp_Object value;
    unsigned char *p;
  
!   CHECK_STRING (string, 0);
  
!   p = XSTRING (string)->data;
  
    /* Skip any whitespace at the front of the number.  Some versions of
*************** The arguments must be numbers or markers
*** 2119,2136 ****
  
  DEFUN ("%", Frem, Srem, 2, 2, 0,
!   "Returns remainder of first arg divided by second.\n\
  Both must be integers or markers.")
!   (num1, num2)
!      register Lisp_Object num1, num2;
  {
    Lisp_Object val;
  
!   CHECK_NUMBER_COERCE_MARKER (num1, 0);
!   CHECK_NUMBER_COERCE_MARKER (num2, 1);
  
!   if (XFASTINT (num2) == 0)
      Fsignal (Qarith_error, Qnil);
  
!   XSETINT (val, XINT (num1) % XINT (num2));
    return val;
  }
--- 2120,2137 ----
  
  DEFUN ("%", Frem, Srem, 2, 2, 0,
!   "Returns remainder of X divided by Y.\n\
  Both must be integers or markers.")
!   (x, y)
!      register Lisp_Object x, y;
  {
    Lisp_Object val;
  
!   CHECK_NUMBER_COERCE_MARKER (x, 0);
!   CHECK_NUMBER_COERCE_MARKER (y, 1);
  
!   if (XFASTINT (y) == 0)
      Fsignal (Qarith_error, Qnil);
  
!   XSETINT (val, XINT (x) % XINT (y));
    return val;
  }
*************** DEFUN ("mod", Fmod, Smod, 2, 2, 0,
*** 2151,2156 ****
  The result falls between zero (inclusive) and Y (exclusive).\n\
  Both X and Y must be numbers or markers.")
!   (num1, num2)
!      register Lisp_Object num1, num2;
  {
    Lisp_Object val;
--- 2152,2157 ----
  The result falls between zero (inclusive) and Y (exclusive).\n\
  Both X and Y must be numbers or markers.")
!   (x, y)
!      register Lisp_Object x, y;
  {
    Lisp_Object val;
*************** Both X and Y must be numbers or markers.
*** 2158,2170 ****
  
  #ifdef LISP_FLOAT_TYPE
!   CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num1, 0);
!   CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num2, 1);
  
!   if (FLOATP (num1) || FLOATP (num2))
      {
        double f1, f2;
  
!       f1 = FLOATP (num1) ? XFLOAT (num1)->data : XINT (num1);
!       f2 = FLOATP (num2) ? XFLOAT (num2)->data : XINT (num2);
        if (f2 == 0)
  	Fsignal (Qarith_error, Qnil);
--- 2159,2171 ----
  
  #ifdef LISP_FLOAT_TYPE
!   CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (x, 0);
!   CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (y, 1);
  
!   if (FLOATP (x) || FLOATP (y))
      {
        double f1, f2;
  
!       f1 = FLOATP (x) ? XFLOAT (x)->data : XINT (x);
!       f2 = FLOATP (y) ? XFLOAT (y)->data : XINT (y);
        if (f2 == 0)
  	Fsignal (Qarith_error, Qnil);
*************** Both X and Y must be numbers or markers.
*** 2177,2186 ****
      }
  #else /* not LISP_FLOAT_TYPE */
!   CHECK_NUMBER_COERCE_MARKER (num1, 0);
!   CHECK_NUMBER_COERCE_MARKER (num2, 1);
  #endif /* not LISP_FLOAT_TYPE */
  
!   i1 = XINT (num1);
!   i2 = XINT (num2);
  
    if (i2 == 0)
--- 2178,2187 ----
      }
  #else /* not LISP_FLOAT_TYPE */
!   CHECK_NUMBER_COERCE_MARKER (x, 0);
!   CHECK_NUMBER_COERCE_MARKER (y, 1);
  #endif /* not LISP_FLOAT_TYPE */
  
!   i1 = XINT (x);
!   i2 = XINT (y);
  
    if (i2 == 0)
*************** DEFUN ("1+", Fadd1, Sadd1, 1, 1, 0,
*** 2288,2305 ****
    "Return NUMBER plus one.  NUMBER may be a number or a marker.\n\
  Markers are converted to integers.")
!   (num)
!      register Lisp_Object num;
  {
  #ifdef LISP_FLOAT_TYPE
!   CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num, 0);
  
!   if (FLOATP (num))
!     return (make_float (1.0 + XFLOAT (num)->data));
  #else
!   CHECK_NUMBER_COERCE_MARKER (num, 0);
  #endif /* LISP_FLOAT_TYPE */
  
!   XSETINT (num, XINT (num) + 1);
!   return num;
  }
  
--- 2289,2306 ----
    "Return NUMBER plus one.  NUMBER may be a number or a marker.\n\
  Markers are converted to integers.")
!   (number)
!      register Lisp_Object number;
  {
  #ifdef LISP_FLOAT_TYPE
!   CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (number, 0);
  
!   if (FLOATP (number))
!     return (make_float (1.0 + XFLOAT (number)->data));
  #else
!   CHECK_NUMBER_COERCE_MARKER (number, 0);
  #endif /* LISP_FLOAT_TYPE */
  
!   XSETINT (number, XINT (number) + 1);
!   return number;
  }
  
*************** DEFUN ("1-", Fsub1, Ssub1, 1, 1, 0,
*** 2307,2334 ****
    "Return NUMBER minus one.  NUMBER may be a number or a marker.\n\
  Markers are converted to integers.")
!   (num)
!      register Lisp_Object num;
  {
  #ifdef LISP_FLOAT_TYPE
!   CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (num, 0);
  
!   if (FLOATP (num))
!     return (make_float (-1.0 + XFLOAT (num)->data));
  #else
!   CHECK_NUMBER_COERCE_MARKER (num, 0);
  #endif /* LISP_FLOAT_TYPE */
  
!   XSETINT (num, XINT (num) - 1);
!   return num;
  }
  
  DEFUN ("lognot", Flognot, Slognot, 1, 1, 0,
!   "Return the bitwise complement of ARG.  ARG must be an integer.")
!   (num)
!      register Lisp_Object num;
! {
!   CHECK_NUMBER (num, 0);
!   XSETINT (num, ~XINT (num));
!   return num;
  }
  
--- 2308,2335 ----
    "Return NUMBER minus one.  NUMBER may be a number or a marker.\n\
  Markers are converted to integers.")
!   (number)
!      register Lisp_Object number;
  {
  #ifdef LISP_FLOAT_TYPE
!   CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (number, 0);
  
!   if (FLOATP (number))
!     return (make_float (-1.0 + XFLOAT (number)->data));
  #else
!   CHECK_NUMBER_COERCE_MARKER (number, 0);
  #endif /* LISP_FLOAT_TYPE */
  
!   XSETINT (number, XINT (number) - 1);
!   return number;
  }
  
  DEFUN ("lognot", Flognot, Slognot, 1, 1, 0,
!   "Return the bitwise complement of NUMBER.  NUMBER must be an integer.")
!   (number)
!      register Lisp_Object number;
! {
!   CHECK_NUMBER (number, 0);
!   XSETINT (number, ~XINT (number));
!   return number;
  }
  
*************** syms_of_data ()
*** 2601,2604 ****
--- 2602,2607 ----
    Qframe = intern ("frame");
    Qvector = intern ("vector");
+   Qchar_table = intern ("char-table");
+   Qbool_vector = intern ("bool-vector");
  
    staticpro (&Qinteger);
*************** syms_of_data ()
*** 2617,2620 ****
--- 2620,2625 ----
    staticpro (&Qframe);
    staticpro (&Qvector);
+   staticpro (&Qchar_table);
+   staticpro (&Qbool_vector);
  
    defsubr (&Seq);
diff -2rcpP --exclude=*.elc emacs-19.30/src/dired.c emacs-19.31/src/dired.c
*** emacs-19.30/src/dired.c	Fri Sep  1 21:19:12 1995
--- emacs-19.31/src/dired.c	Thu May  9 19:21:45 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** DEFUN ("directory-files", Fdirectory_fil
*** 106,115 ****
    "Return a list of names of files in DIRECTORY.\n\
  There are three optional arguments:\n\
! If FULL is non-nil, absolute pathnames of the files are returned.\n\
! If MATCH is non-nil, only pathnames containing that regexp are returned.\n\
  If NOSORT is non-nil, the list is not sorted--its order is unpredictable.\n\
   NOSORT is useful if you plan to sort the result yourself.")
!   (dirname, full, match, nosort)
!      Lisp_Object dirname, full, match, nosort;
  {
    DIR *d;
--- 107,117 ----
    "Return a list of names of files in DIRECTORY.\n\
  There are three optional arguments:\n\
! If FULL is non-nil, return absolute file names.  Otherwise return names\n\
!  that are relative to the specified directory.\n\
! If MATCH is non-nil, mention only file names that match the regexp MATCH.\n\
  If NOSORT is non-nil, the list is not sorted--its order is unpredictable.\n\
   NOSORT is useful if you plan to sort the result yourself.")
!   (directory, full, match, nosort)
!      Lisp_Object directory, full, match, nosort;
  {
    DIR *d;
*************** If NOSORT is non-nil, the list is not so
*** 121,125 ****
    /* If the file name has special constructs in it,
       call the corresponding file handler.  */
!   handler = Ffind_file_name_handler (dirname, Qdirectory_files);
    if (!NILP (handler))
      {
--- 123,127 ----
    /* If the file name has special constructs in it,
       call the corresponding file handler.  */
!   handler = Ffind_file_name_handler (directory, Qdirectory_files);
    if (!NILP (handler))
      {
*************** If NOSORT is non-nil, the list is not so
*** 128,132 ****
        args[0] = handler;
        args[1] = Qdirectory_files;
!       args[2] = dirname;
        args[3] = full;
        args[4] = match;
--- 130,134 ----
        args[0] = handler;
        args[1] = Qdirectory_files;
!       args[2] = directory;
        args[3] = full;
        args[4] = match;
*************** If NOSORT is non-nil, the list is not so
*** 141,148 ****
       Ffuncall, and cause a GC.  */
      GCPRO1 (match);
!     dirname = Fexpand_file_name (dirname, Qnil);
      UNGCPRO;
!     GCPRO2 (match, dirname);
!     dirfilename = Fdirectory_file_name (dirname);
      UNGCPRO;
    }
--- 143,150 ----
       Ffuncall, and cause a GC.  */
      GCPRO1 (match);
!     directory = Fexpand_file_name (directory, Qnil);
      UNGCPRO;
!     GCPRO2 (match, directory);
!     dirfilename = Fdirectory_file_name (directory);
      UNGCPRO;
    }
*************** If NOSORT is non-nil, the list is not so
*** 153,157 ****
  
        /* MATCH might be a flawed regular expression.  Rather than
! 	 catching and signalling our own errors, we just call
  	 compile_pattern to do the work for us.  */
  #ifdef VMS
--- 155,159 ----
  
        /* MATCH might be a flawed regular expression.  Rather than
! 	 catching and signaling our own errors, we just call
  	 compile_pattern to do the work for us.  */
  #ifdef VMS
*************** If NOSORT is non-nil, the list is not so
*** 167,179 ****
  
    /* Do this opendir after anything which might signal an error; if
!      an error is signalled while the directory stream is open, we
       have to make sure it gets closed, and setting up an
       unwind_protect to do so would be a pain.  */
    d = opendir (XSTRING (dirfilename)->data);
    if (! d)
!     report_file_error ("Opening directory", Fcons (dirname, Qnil));
  
    list = Qnil;
!   dirnamelen = XSTRING (dirname)->size;
  
    /* Loop reading blocks */
--- 169,181 ----
  
    /* Do this opendir after anything which might signal an error; if
!      an error is signaled while the directory stream is open, we
       have to make sure it gets closed, and setting up an
       unwind_protect to do so would be a pain.  */
    d = opendir (XSTRING (dirfilename)->data);
    if (! d)
!     report_file_error ("Opening directory", Fcons (directory, Qnil));
  
    list = Qnil;
!   dirnamelen = XSTRING (directory)->size;
  
    /* Loop reading blocks */
*************** If NOSORT is non-nil, the list is not so
*** 199,208 ****
  #ifndef VMS
  		  if (dirnamelen == 0
! 		      || !IS_ANY_SEP (XSTRING (dirname)->data[dirnamelen - 1]))
  		    needsep = 1;
  #endif /* VMS */
  
  		  name = make_uninit_string (total + needsep);
! 		  bcopy (XSTRING (dirname)->data, XSTRING (name)->data,
  			 dirnamelen);
  		  if (needsep)
--- 201,210 ----
  #ifndef VMS
  		  if (dirnamelen == 0
! 		      || !IS_ANY_SEP (XSTRING (directory)->data[dirnamelen - 1]))
  		    needsep = 1;
  #endif /* VMS */
  
  		  name = make_uninit_string (total + needsep);
! 		  bcopy (XSTRING (directory)->data, XSTRING (name)->data,
  			 dirnamelen);
  		  if (needsep)
*************** Lisp_Object file_name_completion ();
*** 227,237 ****
  DEFUN ("file-name-completion", Ffile_name_completion, Sfile_name_completion,
    2, 2, 0,
!   "Complete file name FILE in directory DIR.\n\
  Returns the longest string\n\
! common to all filenames in DIR that start with FILE.\n\
  If there is only one and FILE matches it exactly, returns t.\n\
  Returns nil if DIR contains no name starting with FILE.")
!   (file, dirname)
!      Lisp_Object file, dirname;
  {
    Lisp_Object handler;
--- 229,239 ----
  DEFUN ("file-name-completion", Ffile_name_completion, Sfile_name_completion,
    2, 2, 0,
!   "Complete file name FILE in directory DIRECTORY.\n\
  Returns the longest string\n\
! common to all file names in DIRECTORY that start with FILE.\n\
  If there is only one and FILE matches it exactly, returns t.\n\
  Returns nil if DIR contains no name starting with FILE.")
!   (file, directory)
!      Lisp_Object file, directory;
  {
    Lisp_Object handler;
*************** Returns nil if DIR contains no name star
*** 239,245 ****
    /* If the directory name has special constructs in it,
       call the corresponding file handler.  */
!   handler = Ffind_file_name_handler (dirname, Qfile_name_completion);
    if (!NILP (handler))
!     return call3 (handler, Qfile_name_completion, file, dirname);
  
    /* If the file name has special constructs in it,
--- 241,247 ----
    /* If the directory name has special constructs in it,
       call the corresponding file handler.  */
!   handler = Ffind_file_name_handler (directory, Qfile_name_completion);
    if (!NILP (handler))
!     return call3 (handler, Qfile_name_completion, file, directory);
  
    /* If the file name has special constructs in it,
*************** Returns nil if DIR contains no name star
*** 247,261 ****
    handler = Ffind_file_name_handler (file, Qfile_name_completion);
    if (!NILP (handler))
!     return call3 (handler, Qfile_name_completion, file, dirname);
  
!   return file_name_completion (file, dirname, 0, 0);
  }
  
  DEFUN ("file-name-all-completions", Ffile_name_all_completions,
    Sfile_name_all_completions, 2, 2, 0,
!   "Return a list of all completions of file name FILE in directory DIR.\n\
! These are all file names in directory DIR which begin with FILE.")
!   (file, dirname)
!      Lisp_Object file, dirname;
  {
    Lisp_Object handler;
--- 249,263 ----
    handler = Ffind_file_name_handler (file, Qfile_name_completion);
    if (!NILP (handler))
!     return call3 (handler, Qfile_name_completion, file, directory);
  
!   return file_name_completion (file, directory, 0, 0);
  }
  
  DEFUN ("file-name-all-completions", Ffile_name_all_completions,
    Sfile_name_all_completions, 2, 2, 0,
!   "Return a list of all completions of file name FILE in directory DIRECTORY.\n\
! These are all file names in directory DIRECTORY which begin with FILE.")
!   (file, directory)
!      Lisp_Object file, directory;
  {
    Lisp_Object handler;
*************** These are all file names in directory DI
*** 263,269 ****
    /* If the directory name has special constructs in it,
       call the corresponding file handler.  */
!   handler = Ffind_file_name_handler (dirname, Qfile_name_all_completions);
    if (!NILP (handler))
!     return call3 (handler, Qfile_name_all_completions, file, dirname);
  
    /* If the file name has special constructs in it,
--- 265,271 ----
    /* If the directory name has special constructs in it,
       call the corresponding file handler.  */
!   handler = Ffind_file_name_handler (directory, Qfile_name_all_completions);
    if (!NILP (handler))
!     return call3 (handler, Qfile_name_all_completions, file, directory);
  
    /* If the file name has special constructs in it,
*************** These are all file names in directory DI
*** 271,277 ****
    handler = Ffind_file_name_handler (file, Qfile_name_all_completions);
    if (!NILP (handler))
!     return call3 (handler, Qfile_name_all_completions, file, dirname);
  
!   return file_name_completion (file, dirname, 1, 0);
  }
  
--- 273,279 ----
    handler = Ffind_file_name_handler (file, Qfile_name_all_completions);
    if (!NILP (handler))
!     return call3 (handler, Qfile_name_all_completions, file, directory);
  
!   return file_name_completion (file, directory, 1, 0);
  }
  
*************** file_name_completion (file, dirname, all
*** 452,455 ****
--- 454,459 ----
  		     an exact match.  This way, we get the case pattern
  		     of the actual match.  */
+ 		  /* This tests that the current file is an exact match
+ 		     but BESTMATCH is not (it is too long).  */
  		  if ((matchsize == len
  		       && matchsize + !!directoryp 
*************** file_name_completion (file, dirname, all
*** 459,469 ****
  			 prefer a match that does not change the case
  			 of the input.  */
  		      (((matchsize == len)
  			==
  			(matchsize + !!directoryp 
  			 == XSTRING (bestmatch)->size))
- 		       /* If there is more than one exact match aside from
- 			  case, and one of them is exact including case,
- 			  prefer that one.  */
  		       && !bcmp (p2, XSTRING (file)->data, XSTRING (file)->size)
  		       && bcmp (p1, XSTRING (file)->data, XSTRING (file)->size)))
--- 463,475 ----
  			 prefer a match that does not change the case
  			 of the input.  */
+ 		      /* If there is more than one exact match aside from
+ 			 case, and one of them is exact including case,
+ 			 prefer that one.  */
+ 		      /* This == checks that, of current file and BESTMATCH,
+ 			 either both or neither are exact.  */
  		      (((matchsize == len)
  			==
  			(matchsize + !!directoryp 
  			 == XSTRING (bestmatch)->size))
  		       && !bcmp (p2, XSTRING (file)->data, XSTRING (file)->size)
  		       && bcmp (p1, XSTRING (file)->data, XSTRING (file)->size)))
*************** file_name_completion_stat (dirname, dp, 
*** 537,545 ****
  DEFUN ("file-name-all-versions", Ffile_name_all_versions,
    Sfile_name_all_versions, 2, 2, 0,
!   "Return a list of all versions of file name FILE in directory DIR.")
!   (file, dirname)
!      Lisp_Object file, dirname;
  {
!   return file_name_completion (file, dirname, 1, 1);
  }
  
--- 543,551 ----
  DEFUN ("file-name-all-versions", Ffile_name_all_versions,
    Sfile_name_all_versions, 2, 2, 0,
!   "Return a list of all versions of file name FILE in directory DIRECTORY.")
!   (file, directory)
!      Lisp_Object file, directory;
  {
!   return file_name_completion (file, directory, 1, 1);
  }
  
*************** If file does not exist, returns nil.")
*** 622,641 ****
      return Qnil;
  
- #ifdef MSDOS
-   {
-     char *tmpnam = XSTRING (Ffile_name_nondirectory (filename))->data;
-     int l = strlen (tmpnam);
- 
-     if (l >= 5 
- 	&& S_ISREG (s.st_mode)
- 	&& (stricmp (&tmpnam[l - 4], ".com") == 0
- 	    || stricmp (&tmpnam[l - 4], ".exe") == 0
- 	    || stricmp (&tmpnam[l - 4], ".bat") == 0))
-       {
- 	s.st_mode |= S_IEXEC;
-       }
-   }
- #endif /* MSDOS */
- 
    switch (s.st_mode & S_IFMT)
      {
--- 628,631 ----
*************** If file does not exist, returns nil.")
*** 671,692 ****
      values[9] = Qt;
  #else					/* file gid will be egid */
- #ifdef WINDOWSNT
-   values[9] = Qnil;	/* sorry, no group IDs on NT */
- #else  /* not WINDOWSNT */
    values[9] = (s.st_gid != getegid ()) ? Qt : Qnil;
- #endif /* not WINDOWSNT */
  #endif	/* BSD4_2 (or BSD4_3) */
  #ifdef BSD4_3
  #undef BSD4_2 /* ok, you can look again without throwing up */
  #endif
- #ifdef WINDOWSNT
-   /* Fill in the inode and device values specially...see nt.c.  */
-   if (!get_inode_and_device_vals (filename, &values[10], &values[11])) {
-       return Qnil;
-   }
- #else  /* not WINDOWSNT */
    values[10] = make_number (s.st_ino);
    values[11] = make_number (s.st_dev);
- #endif /* not WINDOWSNT */
    return Flist (sizeof(values) / sizeof(values[0]), values);
  }
--- 661,671 ----
diff -2rcpP --exclude=*.elc emacs-19.30/src/dispextern.h emacs-19.31/src/dispextern.h
*** emacs-19.30/src/dispextern.h	Tue Nov  7 02:01:22 1995
--- emacs-19.31/src/dispextern.h	Mon Jan 15 04:06:29 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  #ifndef _DISPEXTERN_H_
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  #ifndef _DISPEXTERN_H_
diff -2rcpP --exclude=*.elc emacs-19.30/src/dispnew.c emacs-19.31/src/dispnew.c
*** emacs-19.30/src/dispnew.c	Sun Nov 12 00:20:04 1995
--- emacs-19.31/src/dispnew.c	Wed May 22 21:33:05 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** the Free Software Foundation, 675 Mass A
*** 40,43 ****
--- 41,45 ----
  #include "indent.h"
  #include "intervals.h"
+ #include "blockinput.h"
  
  #include "systty.h"
*************** make_frame_glyphs (frame, empty)
*** 299,303 ****
  
        new->total_charstarts = (int *) xmalloc (total_charstarts);
!       bzero (new->total_charstarts, total_glyphs);
      }
    else
--- 301,305 ----
  
        new->total_charstarts = (int *) xmalloc (total_charstarts);
!       bzero (new->total_charstarts, total_charstarts);
      }
    else
*************** update_frame (f, force, inhibit_hairy_id
*** 1343,1347 ****
  	     the active minibuffer window.  */
  	  && FRAME_HAS_MINIBUF_P (f)
! 	  && EQ (FRAME_MINIBUF_WINDOW (f), minibuf_window))
  	{
  	  int top = XINT (XWINDOW (FRAME_MINIBUF_WINDOW (f))->top);
--- 1345,1349 ----
  	     the active minibuffer window.  */
  	  && FRAME_HAS_MINIBUF_P (f)
! 	  && EQ (FRAME_MINIBUF_WINDOW (f), echo_area_window))
  	{
  	  int top = XINT (XWINDOW (FRAME_MINIBUF_WINDOW (f))->top);
*************** change_frame_size_1 (frame, newheight, n
*** 2145,2148 ****
--- 2147,2159 ----
      return;
  
+   BLOCK_INPUT;
+ 
+ #ifdef MSDOS
+   /* We only can set screen dimensions to certain values supported
+      by our video hardware.  Try to find the smallest size greater
+      or equal to the requested dimensions.  */
+   dos_set_window_size (&newheight, &newwidth);
+ #endif
+ 
    if (newheight != FRAME_HEIGHT (frame))
      {
*************** change_frame_size_1 (frame, newheight, n
*** 2203,2206 ****
--- 2214,2219 ----
    remake_frame_glyphs (frame);
    calculate_costs (frame);
+ 
+   UNBLOCK_INPUT;
  }
  
*************** DEFUN ("send-string-to-terminal", Fsend_
*** 2209,2221 ****
    "Send STRING to the terminal without alteration.\n\
  Control characters in STRING will have terminal-dependent effects.")
!   (str)
!      Lisp_Object str;
  {
!   CHECK_STRING (str, 0);
!   fwrite (XSTRING (str)->data, 1, XSTRING (str)->size, stdout);
    fflush (stdout);
    if (termscript)
      {
!       fwrite (XSTRING (str)->data, 1, XSTRING (str)->size, termscript);
        fflush (termscript);
      }
--- 2222,2234 ----
    "Send STRING to the terminal without alteration.\n\
  Control characters in STRING will have terminal-dependent effects.")
!   (string)
!      Lisp_Object string;
  {
!   CHECK_STRING (string, 0);
!   fwrite (XSTRING (string)->data, 1, XSTRING (string)->size, stdout);
    fflush (stdout);
    if (termscript)
      {
!       fwrite (XSTRING (string)->data, 1, XSTRING (string)->size, termscript);
        fflush (termscript);
      }
*************** Emacs was built without floating point s
*** 2301,2305 ****
      sec += usec / 1000000, usec %= 1000000;
  
!   if (sec <= 0)
      return Qnil;
  
--- 2314,2318 ----
      sec += usec / 1000000, usec %= 1000000;
  
!   if (sec < 0 || (sec == 0 && usec == 0))
      return Qnil;
  
*************** sit_for (sec, usec, reading, display)
*** 2360,2364 ****
    Lisp_Object read_kbd;
  
!   if (detect_input_pending ())
      return Qnil;
  
--- 2373,2379 ----
    Lisp_Object read_kbd;
  
!   swallow_events (display);
! 
!   if (detect_input_pending_run_timers (display))
      return Qnil;
  
*************** additional wait period, in milliseconds;
*** 2412,2416 ****
  Emacs was built without floating point support.\n\
  \(Not all operating systems support waiting for a fraction of a second.)\n\
! Optional third arg non-nil means don't redisplay, just wait for input.\n\
  Redisplay is preempted as always if input arrives, and does not happen\n\
  if input is available before it starts.\n\
--- 2427,2431 ----
  Emacs was built without floating point support.\n\
  \(Not all operating systems support waiting for a fraction of a second.)\n\
! Optional third arg NODISP non-nil means don't redisplay, just wait for input.\n\
  Redisplay is preempted as always if input arrives, and does not happen\n\
  if input is available before it starts.\n\
*************** init_display ()
*** 2473,2487 ****
       using the window system.
  
!      If the DISPLAY environment variable is set, try to use X, and die
!      with an error message if that doesn't work.  */
  
  #ifdef HAVE_X_WINDOWS
    if (! display_arg)
      {
  #ifdef VMS
!       display_arg = (getenv ("DECW$DISPLAY") != 0);
  #else
!       display_arg = (getenv ("DISPLAY") != 0);
  #endif
      }
  
--- 2488,2505 ----
       using the window system.
  
!      If the DISPLAY environment variable is set and nonempty,
!      try to use X, and die with an error message if that doesn't work.  */
  
  #ifdef HAVE_X_WINDOWS
    if (! display_arg)
      {
+       char *display;
  #ifdef VMS
!       display = getenv ("DECW$DISPLAY");
  #else
!       display = getenv ("DISPLAY");
  #endif
+ 
+       display_arg = (display != 0 && *display != 0);
      }
  
*************** init_display ()
*** 2493,2496 ****
--- 2511,2520 ----
  #else
        Vwindow_system_version = make_number (10);
+ #endif
+ #if defined (LINUX) && defined (HAVE_LIBNCURSES)
+       /* In some versions of ncurses,
+ 	 tputs crashes if we have not called tgetent.
+ 	 So call tgetent.  */
+       { char b[2044]; tgetent (b, "xterm");}
  #endif
        return;
diff -2rcpP --exclude=*.elc emacs-19.30/src/disptab.h emacs-19.31/src/disptab.h
*** emacs-19.30/src/disptab.h	Tue Oct 10 12:55:33 1995
--- emacs-19.31/src/disptab.h	Mon Jan 15 04:06:29 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  /* Access the slots of a display-table, according to their purpose.  */
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* Access the slots of a display-table, according to their purpose.  */
diff -2rcpP --exclude=*.elc emacs-19.30/src/doc.c emacs-19.31/src/doc.c
*** emacs-19.30/src/doc.c	Sat Nov 11 11:06:50 1995
--- emacs-19.31/src/doc.c	Tue Apr  9 18:08:50 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** munge_doc_file_name (name)
*** 70,73 ****
--- 71,78 ----
  }
  
+ /* Buffer used for reading from documentation file.  */
+ static char *get_doc_string_buffer;
+ static int get_doc_string_buffer_size;
+ 
  /* Extract a doc string from a file.  FILEPOS says where to get it.
     If it is an integer, use that position in the standard DOC-... file.
*************** get_doc_string (filepos)
*** 82,89 ****
       Lisp_Object filepos;
  {
-   char buf[512 * 32 + 1];
-   char *buffer;
-   int buffer_size;
-   int free_it;
    char *from, *to;
    register int fd;
--- 87,90 ----
*************** get_doc_string (filepos)
*** 91,95 ****
    register char *p, *p1;
    int minsize;
!   int position;
    Lisp_Object file, tem;
  
--- 92,96 ----
    register char *p, *p1;
    int minsize;
!   int offset, position;
    Lisp_Object file, tem;
  
*************** get_doc_string (filepos)
*** 150,159 ****
  	}
  #endif
- 
        if (fd < 0)
  	error ("Cannot open doc string file \"%s\"", name);
      }
  
!   if (0 > lseek (fd, position, 0))
      {
        close (fd);
--- 151,161 ----
  	}
  #endif
        if (fd < 0)
  	error ("Cannot open doc string file \"%s\"", name);
      }
  
!   /* Seek only to beginning of disk block.  */
!   offset = position % (8 * 1024);
!   if (0 > lseek (fd, position - offset, 0))
      {
        close (fd);
*************** get_doc_string (filepos)
*** 162,200 ****
      }
  
!   /* Read the doc string into a buffer.
!      Use the fixed buffer BUF if it is big enough;
!      otherwise allocate one and set FREE_IT.
!      We store the buffer in use in BUFFER and its size in BUFFER_SIZE.  */
! 
!   buffer = buf;
!   buffer_size = sizeof buf;
!   free_it = 0;
!   p = buf;
    while (1)
      {
!       int space_left = buffer_size - (p - buffer);
        int nread;
  
!       /* Switch to a bigger buffer if we need one.  */
        if (space_left == 0)
  	{
! 	  if (free_it)
! 	    {
! 	      int offset = p - buffer;
! 	      buffer = (char *) xrealloc (buffer,
! 					  buffer_size *= 2);
! 	      p = buffer + offset;
! 	    }
! 	  else
! 	    {
! 	      buffer = (char *) xmalloc (buffer_size *= 2);
! 	      bcopy (buf, buffer, p - buf);
! 	      p = buffer + (p - buf);
! 	    }
! 	  free_it = 1;
! 	  space_left = buffer_size - (p - buffer);
  	}
  
!       /* Don't read too too much at one go.  */
        if (space_left > 1024 * 8)
  	space_left = 1024 * 8;
--- 164,192 ----
      }
  
!   /* Read the doc string into get_doc_string_buffer.
!      P points beyond the data just read.  */
! 
!   p = get_doc_string_buffer;
    while (1)
      {
!       int space_left = (get_doc_string_buffer_size
! 			- (p - get_doc_string_buffer));
        int nread;
  
!       /* Allocate or grow the buffer if we need to.  */
        if (space_left == 0)
  	{
! 	  int in_buffer = p - get_doc_string_buffer;
! 	  get_doc_string_buffer_size += 16 * 1024;
! 	  get_doc_string_buffer
! 	    = (char *) xrealloc (get_doc_string_buffer,
! 				 get_doc_string_buffer_size + 1);
! 	  p = get_doc_string_buffer + in_buffer;
! 	  space_left = (get_doc_string_buffer_size
! 			- (p - get_doc_string_buffer));
  	}
  
!       /* Read a disk block at a time.
!          If we read the same block last time, maybe skip this?  */
        if (space_left > 1024 * 8)
  	space_left = 1024 * 8;
*************** get_doc_string (filepos)
*** 208,212 ****
        if (!nread)
  	break;
!       p1 = index (p, '\037');
        if (p1)
  	{
--- 200,207 ----
        if (!nread)
  	break;
!       if (p == get_doc_string_buffer)
! 	p1 = index (p + offset, '\037');
!       else
! 	p1 = index (p, '\037');
        if (p1)
  	{
*************** get_doc_string (filepos)
*** 221,226 ****
    /* Scan the text and perform quoting with ^A (char code 1).
       ^A^A becomes ^A, ^A0 becomes a null char, and ^A_ becomes a ^_.  */
!   from = buffer;
!   to = buffer;
    while (from != p)
      {
--- 216,221 ----
    /* Scan the text and perform quoting with ^A (char code 1).
       ^A^A becomes ^A, ^A0 becomes a null char, and ^A_ becomes a ^_.  */
!   from = get_doc_string_buffer + offset;
!   to = get_doc_string_buffer + offset;
    while (from != p)
      {
*************** get_doc_string (filepos)
*** 244,252 ****
      }
  
!   tem = make_string (buffer, to - buffer);
!   if (free_it)
!     free (buffer);
! 
!   return tem;
  }
  
--- 239,244 ----
      }
  
!   return make_string (get_doc_string_buffer + offset,
! 		      to - (get_doc_string_buffer + offset));
  }
  
*************** read_doc_string (filepos)
*** 264,268 ****
  DEFUN ("documentation", Fdocumentation, Sdocumentation, 1, 2, 0,
    "Return the documentation string of FUNCTION.\n\
! Unless a non-nil second argument is given, the\n\
  string is passed through `substitute-command-keys'.")
    (function, raw)
--- 256,260 ----
  DEFUN ("documentation", Fdocumentation, Sdocumentation, 1, 2, 0,
    "Return the documentation string of FUNCTION.\n\
! Unless a non-nil second argument RAW is given, the\n\
  string is passed through `substitute-command-keys'.")
    (function, raw)
*************** DEFUN ("documentation-property", Fdocume
*** 351,362 ****
  This is like `get', but it can refer to strings stored in the\n\
  `etc/DOC' file; and if the value is a string, it is passed through\n\
! `substitute-command-keys'.  A non-nil third argument avoids this\n\
  translation.")
!   (sym, prop, raw)
!      Lisp_Object sym, prop, raw;
  {
    register Lisp_Object tem;
  
!   tem = Fget (sym, prop);
    if (INTEGERP (tem))
      tem = get_doc_string (XINT (tem) > 0 ? tem : make_number (- XINT (tem)));
--- 343,354 ----
  This is like `get', but it can refer to strings stored in the\n\
  `etc/DOC' file; and if the value is a string, it is passed through\n\
! `substitute-command-keys'.  A non-nil third argument RAW avoids this\n\
  translation.")
!   (symbol, prop, raw)
!      Lisp_Object symbol, prop, raw;
  {
    register Lisp_Object tem;
  
!   tem = Fget (symbol, prop);
    if (INTEGERP (tem))
      tem = get_doc_string (XINT (tem) > 0 ? tem : make_number (- XINT (tem)));
*************** as the keymap for future \\=\\[COMMAND] 
*** 529,534 ****
  \\=\\= quotes the following character and is discarded;\n\
  thus, \\=\\=\\=\\= puts \\=\\= into the output, and \\=\\=\\=\\[ puts \\=\\[ into the output.")
!   (str)
!      Lisp_Object str;
  {
    unsigned char *buf;
--- 521,526 ----
  \\=\\= quotes the following character and is discarded;\n\
  thus, \\=\\=\\=\\= puts \\=\\= into the output, and \\=\\=\\=\\[ puts \\=\\[ into the output.")
!   (string)
!      Lisp_Object string;
  {
    unsigned char *buf;
*************** thus, \\=\\=\\=\\= puts \\=\\= into the 
*** 546,571 ****
    struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
  
!   if (NILP (str))
      return Qnil;
  
!   CHECK_STRING (str, 0);
    tem = Qnil;
    keymap = Qnil;
    name = Qnil;
!   GCPRO4 (str, tem, keymap, name);
  
    /* KEYMAP is either nil (which means search all the active keymaps)
       or a specified local map (which means search just that and the
       global map).  If non-nil, it might come from Voverriding_local_map,
!      or from a \\<mapname> construct in STR itself..  */
    keymap = current_kboard->Voverriding_terminal_local_map;
    if (NILP (keymap))
      keymap = Voverriding_local_map;
  
!   bsize = XSTRING (str)->size;
    bufp = buf = (unsigned char *) xmalloc (bsize);
  
!   strp = (unsigned char *) XSTRING (str)->data;
!   while (strp < (unsigned char *) XSTRING (str)->data + XSTRING (str)->size)
      {
        if (strp[0] == '\\' && strp[1] == '=')
--- 538,563 ----
    struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
  
!   if (NILP (string))
      return Qnil;
  
!   CHECK_STRING (string, 0);
    tem = Qnil;
    keymap = Qnil;
    name = Qnil;
!   GCPRO4 (string, tem, keymap, name);
  
    /* KEYMAP is either nil (which means search all the active keymaps)
       or a specified local map (which means search just that and the
       global map).  If non-nil, it might come from Voverriding_local_map,
!      or from a \\<mapname> construct in STRING itself..  */
    keymap = current_kboard->Voverriding_terminal_local_map;
    if (NILP (keymap))
      keymap = Voverriding_local_map;
  
!   bsize = XSTRING (string)->size;
    bufp = buf = (unsigned char *) xmalloc (bsize);
  
!   strp = (unsigned char *) XSTRING (string)->data;
!   while (strp < (unsigned char *) XSTRING (string)->data + XSTRING (string)->size)
      {
        if (strp[0] == '\\' && strp[1] == '=')
*************** thus, \\=\\=\\=\\= puts \\=\\= into the 
*** 585,590 ****
  	  start = strp;
  
! 	  while ((strp - (unsigned char *) XSTRING (str)->data
! 		  < XSTRING (str)->size)
  		 && *strp != ']')
  	    strp++;
--- 577,582 ----
  	  start = strp;
  
! 	  while ((strp - (unsigned char *) XSTRING (string)->data
! 		  < XSTRING (string)->size)
  		 && *strp != ']')
  	    strp++;
*************** thus, \\=\\=\\=\\= puts \\=\\= into the 
*** 593,597 ****
  
  	  /* Save STRP in IDX.  */
! 	  idx = strp - (unsigned char *) XSTRING (str)->data;
  	  tem = Fintern (make_string (start, length), Qnil);
  	  tem = Fwhere_is_internal (tem, keymap, Qt, Qnil);
--- 585,589 ----
  
  	  /* Save STRP in IDX.  */
! 	  idx = strp - (unsigned char *) XSTRING (string)->data;
  	  tem = Fintern (make_string (start, length), Qnil);
  	  tem = Fwhere_is_internal (tem, keymap, Qt, Qnil);
*************** thus, \\=\\=\\=\\= puts \\=\\= into the 
*** 632,637 ****
  	  start = strp;
  
! 	  while ((strp - (unsigned char *) XSTRING (str)->data
! 		  < XSTRING (str)->size)
  		 && *strp != '}' && *strp != '>')
  	    strp++;
--- 624,629 ----
  	  start = strp;
  
! 	  while ((strp - (unsigned char *) XSTRING (string)->data
! 		  < XSTRING (string)->size)
  		 && *strp != '}' && *strp != '>')
  	    strp++;
*************** thus, \\=\\=\\=\\= puts \\=\\= into the 
*** 640,644 ****
  
  	  /* Save STRP in IDX.  */
! 	  idx = strp - (unsigned char *) XSTRING (str)->data;
  
  	  /* Get the value of the keymap in TEM, or nil if undefined.
--- 632,636 ----
  
  	  /* Save STRP in IDX.  */
! 	  idx = strp - (unsigned char *) XSTRING (string)->data;
  
  	  /* Get the value of the keymap in TEM, or nil if undefined.
*************** thus, \\=\\=\\=\\= puts \\=\\= into the 
*** 683,688 ****
  	  bcopy (start, bufp, length);
  	  bufp += length;
! 	  /* Check STR again in case gc relocated it.  */
! 	  strp = (unsigned char *) XSTRING (str)->data + idx;
  	}
        else			/* just copy other chars */
--- 675,680 ----
  	  bcopy (start, bufp, length);
  	  bufp += length;
! 	  /* Check STRING again in case gc relocated it.  */
! 	  strp = (unsigned char *) XSTRING (string)->data + idx;
  	}
        else			/* just copy other chars */
*************** thus, \\=\\=\\=\\= puts \\=\\= into the 
*** 693,697 ****
      tem = make_string (buf, bufp - buf);
    else
!     tem = str;
    xfree (buf);
    RETURN_UNGCPRO (tem);
--- 685,689 ----
      tem = make_string (buf, bufp - buf);
    else
!     tem = string;
    xfree (buf);
    RETURN_UNGCPRO (tem);
diff -2rcpP --exclude=*.elc emacs-19.30/src/doprnt.c emacs-19.31/src/doprnt.c
*** emacs-19.30/src/doprnt.c	Wed Nov 15 12:43:49 1995
--- emacs-19.31/src/doprnt.c	Tue Apr  9 18:13:50 1996
*************** GNU General Public License for more deta
*** 18,22 ****
  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.  */
  
  
--- 18,23 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** doprnt1 (lispstrings, buffer, bufsize, f
*** 137,141 ****
  	  size_bound += 50;
  
! 	  if (size_bound > (unsigned) (1 << (BITS_PER_INT - 1)))
  	    error ("Format padding too large");
  
--- 138,142 ----
  	  size_bound += 50;
  
! 	  if (size_bound > (((unsigned) 1) << (BITS_PER_INT - 1)))
  	    error ("Format padding too large");
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/dosfns.c emacs-19.31/src/dosfns.c
*** emacs-19.30/src/dosfns.c	Tue Nov 21 01:48:35 1995
--- emacs-19.31/src/dosfns.c	Sun May 12 21:24:55 1996
*************** GNU General Public License for more deta
*** 17,21 ****
  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.  */
  
  
--- 17,22 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** the Free Software Foundation, 675 Mass A
*** 35,95 ****
  #include "msdos.h"
  #include <go32.h>
! 
! DEFUN ("mode25", Fmode25, Smode25, 0, 0, "", "\
! Changes the number of rows to 25.")
!   ()
! {
!   union REGS regs;
! 
! #ifdef HAVE_X_WINDOWS
!   if (!inhibit_window_system)
!     return Qnil;
! #endif
!   mouse_off ();
!   regs.x.ax = 3;
!   int86 (0x10, &regs, &regs);
!   regs.x.ax = 0x1101;
!   regs.h.bl = 0;
!   int86 (0x10, &regs, &regs);
!   regs.x.ax = 0x1200;
!   regs.h.bl = 32;
!   int86 (0x10, &regs, &regs);
!   regs.x.ax = 3;
!   int86 (0x10, &regs, &regs);
!   Fset_frame_size (Fselected_frame (), ScreenCols (), ScreenRows ());
!   Frecenter (Qnil);
!   Fredraw_display ();
!   if (have_mouse) mouse_init ();
!   return Qnil;
! }
! 
! DEFUN ("mode4350", Fmode4350, Smode4350, 0, 0, "", "\
! Changes the number of rows to 43 (EGA) or 50 (VGA).")
!   ()
! {
!   union REGS regs;
! 
! #ifdef HAVE_X_WINDOWS
!   if (!inhibit_window_system)
!     return Qnil;
! #endif
!   mouse_off ();
!   regs.x.ax = 3;
!   int86 (0x10, &regs, &regs);
!   regs.x.ax = 0x1112;
!   regs.h.bl = 0;
!   int86 (0x10, &regs, &regs);
!   regs.x.ax = 0x1200;
!   regs.h.bl = 32;
!   int86 (0x10, &regs, &regs);
!   regs.x.ax = 0x0100;
!   regs.x.cx = 7;
!   int86 (0x10, &regs, &regs);
!   Fset_frame_size (Fselected_frame (), ScreenCols (), ScreenRows ());
!   Frecenter (Qnil);
!   Fredraw_display ();
!   if (have_mouse) mouse_init ();
!   return Qnil;
! }
  
  DEFUN ("int86", Fint86, Sint86, 2, 2, 0,
--- 36,40 ----
  #include "msdos.h"
  #include <go32.h>
! #include <dirent.h>
  
  DEFUN ("int86", Fint86, Sint86, 2, 2, 0,
*************** INTERRUPT should be an integer in the ra
*** 100,105 ****
  REGISTERS should be a vector produced by `make-register' and\n\
  `set-register-value'.")
!   (intno, regs)
!   Lisp_Object intno, regs;
  {
    register int i;
--- 45,50 ----
  REGISTERS should be a vector produced by `make-register' and\n\
  `set-register-value'.")
!   (interrupt, registers)
!   Lisp_Object interrupt, registers;
  {
    register int i;
*************** REGISTERS should be a vector produced by
*** 108,140 ****
    Lisp_Object val;
  
!   CHECK_NUMBER (intno, 0);
!   no = (unsigned long) XINT (intno);
!   CHECK_VECTOR (regs, 1);
!   if (no < 0 || no > 0xff || XVECTOR (regs)-> size != 8) 
      return Qnil;
    for (i = 0; i < 8; i++)
!     CHECK_NUMBER (XVECTOR (regs)->contents[i], 1);
  
!   inregs.x.ax    = (unsigned long) XFASTINT (XVECTOR (regs)->contents[0]);
!   inregs.x.bx    = (unsigned long) XFASTINT (XVECTOR (regs)->contents[1]);
!   inregs.x.cx    = (unsigned long) XFASTINT (XVECTOR (regs)->contents[2]);
!   inregs.x.dx    = (unsigned long) XFASTINT (XVECTOR (regs)->contents[3]);
!   inregs.x.si    = (unsigned long) XFASTINT (XVECTOR (regs)->contents[4]);
!   inregs.x.di    = (unsigned long) XFASTINT (XVECTOR (regs)->contents[5]);
!   inregs.x.cflag = (unsigned long) XFASTINT (XVECTOR (regs)->contents[6]);
!   inregs.x.flags = (unsigned long) XFASTINT (XVECTOR (regs)->contents[7]);
  
    int86 (no, &inregs, &outregs);
  
!   XVECTOR (regs)->contents[0] = make_number (outregs.x.ax);
!   XVECTOR (regs)->contents[1] = make_number (outregs.x.bx);
!   XVECTOR (regs)->contents[2] = make_number (outregs.x.cx);
!   XVECTOR (regs)->contents[3] = make_number (outregs.x.dx);
!   XVECTOR (regs)->contents[4] = make_number (outregs.x.si);
!   XVECTOR (regs)->contents[5] = make_number (outregs.x.di);
!   XVECTOR (regs)->contents[6] = make_number (outregs.x.cflag);
!   XVECTOR (regs)->contents[7] = make_number (outregs.x.flags);
  
!   return regs;
  }
  
--- 53,85 ----
    Lisp_Object val;
  
!   CHECK_NUMBER (interrupt, 0);
!   no = (unsigned long) XINT (interrupt);
!   CHECK_VECTOR (registers, 1);
!   if (no < 0 || no > 0xff || XVECTOR (registers)-> size != 8) 
      return Qnil;
    for (i = 0; i < 8; i++)
!     CHECK_NUMBER (XVECTOR (registers)->contents[i], 1);
  
!   inregs.x.ax    = (unsigned long) XFASTINT (XVECTOR (registers)->contents[0]);
!   inregs.x.bx    = (unsigned long) XFASTINT (XVECTOR (registers)->contents[1]);
!   inregs.x.cx    = (unsigned long) XFASTINT (XVECTOR (registers)->contents[2]);
!   inregs.x.dx    = (unsigned long) XFASTINT (XVECTOR (registers)->contents[3]);
!   inregs.x.si    = (unsigned long) XFASTINT (XVECTOR (registers)->contents[4]);
!   inregs.x.di    = (unsigned long) XFASTINT (XVECTOR (registers)->contents[5]);
!   inregs.x.cflag = (unsigned long) XFASTINT (XVECTOR (registers)->contents[6]);
!   inregs.x.flags = (unsigned long) XFASTINT (XVECTOR (registers)->contents[7]);
  
    int86 (no, &inregs, &outregs);
  
!   XVECTOR (registers)->contents[0] = make_number (outregs.x.ax);
!   XVECTOR (registers)->contents[1] = make_number (outregs.x.bx);
!   XVECTOR (registers)->contents[2] = make_number (outregs.x.cx);
!   XVECTOR (registers)->contents[3] = make_number (outregs.x.dx);
!   XVECTOR (registers)->contents[4] = make_number (outregs.x.si);
!   XVECTOR (registers)->contents[5] = make_number (outregs.x.di);
!   XVECTOR (registers)->contents[6] = make_number (outregs.x.cflag);
!   XVECTOR (registers)->contents[7] = make_number (outregs.x.flags);
  
!   return registers;
  }
  
*************** DEFUN ("msdos-memget", Fdos_memget, Sdos
*** 142,147 ****
    "Read DOS memory at offset ADDRESS into VECTOR.\n\
  Return the updated VECTOR.")
!   (addr, v)
!   Lisp_Object addr, v;
  {
    register int i;
--- 87,92 ----
    "Read DOS memory at offset ADDRESS into VECTOR.\n\
  Return the updated VECTOR.")
!   (address, vector)
!   Lisp_Object address, vector;
  {
    register int i;
*************** Return the updated VECTOR.")
*** 150,158 ****
    Lisp_Object val;
  
!   CHECK_NUMBER (addr, 0);
!   offs = (unsigned long) XINT (addr);
!   CHECK_VECTOR (v, 1);
!   len = XVECTOR (v)-> size;
!   if (len < 1 || len > 2048 || addr < 0 || addr > 0xfffff - len) 
      return Qnil;
    buf = alloca (len);
--- 95,103 ----
    Lisp_Object val;
  
!   CHECK_NUMBER (address, 0);
!   offs = (unsigned long) XINT (address);
!   CHECK_VECTOR (vector, 1);
!   len = XVECTOR (vector)-> size;
!   if (len < 1 || len > 2048 || address < 0 || address > 0xfffff - len) 
      return Qnil;
    buf = alloca (len);
*************** Return the updated VECTOR.")
*** 160,172 ****
    
    for (i = 0; i < len; i++)
!     XVECTOR (v)->contents[i] = make_number (buf[i]);
  
!   return v;
  }
  
  DEFUN ("msdos-memput", Fdos_memput, Sdos_memput, 2, 2, 0,
    "Write DOS memory at offset ADDRESS from VECTOR.")
!   (addr, v)
!   Lisp_Object addr, v;
  {
    register int i;
--- 105,117 ----
    
    for (i = 0; i < len; i++)
!     XVECTOR (vector)->contents[i] = make_number (buf[i]);
  
!   return vector;
  }
  
  DEFUN ("msdos-memput", Fdos_memput, Sdos_memput, 2, 2, 0,
    "Write DOS memory at offset ADDRESS from VECTOR.")
!   (address, vector)
!   Lisp_Object address, vector;
  {
    register int i;
*************** DEFUN ("msdos-memput", Fdos_memput, Sdos
*** 175,183 ****
    Lisp_Object val;
  
!   CHECK_NUMBER (addr, 0);
!   offs = (unsigned long) XINT (addr);
!   CHECK_VECTOR (v, 1);
!   len = XVECTOR (v)-> size;
!   if (len < 1 || len > 2048 || addr < 0 || addr > 0xfffff - len) 
      return Qnil;
    buf = alloca (len);
--- 120,128 ----
    Lisp_Object val;
  
!   CHECK_NUMBER (address, 0);
!   offs = (unsigned long) XINT (address);
!   CHECK_VECTOR (vector, 1);
!   len = XVECTOR (vector)-> size;
!   if (len < 1 || len > 2048 || address < 0 || address > 0xfffff - len) 
      return Qnil;
    buf = alloca (len);
*************** DEFUN ("msdos-memput", Fdos_memput, Sdos
*** 185,190 ****
    for (i = 0; i < len; i++)
      {
!       CHECK_NUMBER (XVECTOR (v)->contents[i], 1);
!       buf[i] = (unsigned char) XFASTINT (XVECTOR (v)->contents[i]) & 0xFF;
      }
  
--- 130,135 ----
    for (i = 0; i < len; i++)
      {
!       CHECK_NUMBER (XVECTOR (vector)->contents[i], 1);
!       buf[i] = (unsigned char) XFASTINT (XVECTOR (vector)->contents[i]) & 0xFF;
      }
  
*************** DEFUN ("msdos-memput", Fdos_memput, Sdos
*** 194,198 ****
  
  DEFUN ("msdos-set-keyboard", Fmsdos_set_keyboard, Smsdos_set_keyboard, 1, 2, 0,
!   "Set keyboard layout according to COUNTRY.\n\
  If the optional argument ALLKEYS is non-nil, the keyboard is mapped for\n\
  all keys; otherwise it is only used when the ALT key is pressed.\n\
--- 139,143 ----
  
  DEFUN ("msdos-set-keyboard", Fmsdos_set_keyboard, Smsdos_set_keyboard, 1, 2, 0,
!   "Set keyboard layout according to COUNTRY-CODE.\n\
  If the optional argument ALLKEYS is non-nil, the keyboard is mapped for\n\
  all keys; otherwise it is only used when the ALT key is pressed.\n\
*************** Return nil if startup screen is not avai
*** 297,301 ****
    return Qt;
  }
- 
  
  /* country info */
--- 242,245 ----
*************** int dos_keypad_mode;
*** 313,318 ****
  Lisp_Object Vdos_version;
  Lisp_Object Vdos_display_scancodes;
- Lisp_Object Vdos_menubar_clock;
- Lisp_Object Vdos_timer_hooks;
    
  void
--- 257,260 ----
*************** init_dosfns ()
*** 364,367 ****
--- 306,320 ----
    else
      dos_codepage = regs.x.bx & 0xffff;
+ 
+ #if __DJGPP__ >= 2
+ 
+   /* Without this, we never see hidden files.  */
+   __opendir_flags |= __OPENDIR_FIND_HIDDEN;
+ 
+   /* Under LFN, preserve the case of files as recorded in the directory.  */
+   if (!NILP (Fmsdos_long_file_names ()))
+     __opendir_flags |= __OPENDIR_PRESERVE_CASE;
+ 
+ #endif
  }
  
*************** init_dosfns ()
*** 371,376 ****
  syms_of_dosfns ()
  {
-   defsubr (&Smode25);
-   defsubr (&Smode4350);
    defsubr (&Sint86);
    defsubr (&Sdos_memget);
--- 324,327 ----
*************** corner of the display (typically at the 
*** 417,429 ****
  The output format is: scan code:char code*modifiers.");
    Vdos_display_scancodes = Qnil;
-   
-   DEFVAR_LISP ("dos-menubar-clock", &Vdos_menubar_clock,
-     "*When non-nil, the current time is displayed in the upper right\n\
- corner of the screen (typically at the end of the menu bar).");
-   Vdos_menubar_clock = Qt;
-   
-   DEFVAR_LISP ("dos-timer-hooks", &Vdos_timer_hooks,
-     "List of hooks which are run every second.");
-   Vdos_timer_hooks = Qnil;
    
    DEFVAR_INT ("dos-hyper-key", &dos_hyper_key,
--- 368,371 ----
diff -2rcpP --exclude=*.elc emacs-19.30/src/dosfns.h emacs-19.31/src/dosfns.h
*** emacs-19.30/src/dosfns.h	Wed Oct 11 06:35:33 1995
--- emacs-19.31/src/dosfns.h	Mon Jan 15 04:06:29 1996
*************** GNU General Public License for more deta
*** 17,21 ****
  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.  */
  
  extern int dos_hyper_key;
--- 17,22 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  extern int dos_hyper_key;
*************** extern Lisp_Object Vdos_version;
*** 35,40 ****
  #ifndef HAVE_X_WINDOWS
  extern Lisp_Object Vdos_display_scancodes;
- extern Lisp_Object Vdos_menubar_clock;
- extern Lisp_Object Vdos_timer_hooks;
  extern Lisp_Object Qmsdos_color_translate;
  #endif
--- 36,39 ----
diff -2rcpP --exclude=*.elc emacs-19.30/src/ecrt0.c emacs-19.31/src/ecrt0.c
*** emacs-19.30/src/ecrt0.c	Thu Jun 15 16:46:32 1995
--- emacs-19.31/src/ecrt0.c	Mon Jan 29 17:22:09 1996
*************** GNU General Public License for more deta
*** 16,24 ****
  You should have received a copy of the GNU General Public License
  along with GNU Emacs; see the file COPYING.  If not, write to
! the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  
  
  /* The standard Vax 4.2 Unix crt0.c cannot be used for Emacs
!    because it makes `envron' an initialized variable.
     It is easiest to have a special crt0.c on all machines
     though I don't know whether other machines actually need it.  */
--- 16,25 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
  /* The standard Vax 4.2 Unix crt0.c cannot be used for Emacs
!    because it makes `environ' an initialized variable.
     It is easiest to have a special crt0.c on all machines
     though I don't know whether other machines actually need it.  */
diff -2rcpP --exclude=*.elc emacs-19.30/src/editfns.c emacs-19.31/src/editfns.c
*** emacs-19.30/src/editfns.c	Tue Nov 21 15:10:56 1995
--- emacs-19.31/src/editfns.c	Wed May 15 17:54:59 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** extern Lisp_Object make_time ();
*** 43,47 ****
  extern void insert_from_buffer ();
  static long difftm ();
! static void set_time_zone_rule ();
  
  /* Some static data, and a function to initialize it for each run */
--- 44,53 ----
  extern void insert_from_buffer ();
  static long difftm ();
! static void update_buffer_properties ();
! void set_time_zone_rule ();
! 
! Lisp_Object Vbuffer_access_fontify_functions;
! Lisp_Object Qbuffer_access_fontify_functions;
! Lisp_Object Vbuffer_access_fontified_property;
  
  /* Some static data, and a function to initialize it for each run */
*************** init_editfns ()
*** 129,140 ****
  
  DEFUN ("char-to-string", Fchar_to_string, Schar_to_string, 1, 1, 0,
!   "Convert arg CHAR to a one-character string containing that character.")
!   (n)
!      Lisp_Object n;
  {
    char c;
!   CHECK_NUMBER (n, 0);
  
!   c = XINT (n);
    return make_string (&c, 1);
  }
--- 135,146 ----
  
  DEFUN ("char-to-string", Fchar_to_string, Schar_to_string, 1, 1, 0,
!   "Convert arg CHARACTER to a one-character string containing that character.")
!   (character)
!      Lisp_Object character;
  {
    char c;
!   CHECK_NUMBER (character, 0);
  
!   c = XINT (character);
    return make_string (&c, 1);
  }
*************** DEFUN ("char-to-string", Fchar_to_string
*** 142,153 ****
  DEFUN ("string-to-char", Fstring_to_char, Sstring_to_char, 1, 1, 0,
    "Convert arg STRING to a character, the first character of that string.")
!   (str)
!      register Lisp_Object str;
  {
    register Lisp_Object val;
    register struct Lisp_String *p;
!   CHECK_STRING (str, 0);
  
!   p = XSTRING (str);
    if (p->size)
      XSETFASTINT (val, ((unsigned char *) p->data)[0]);
--- 148,159 ----
  DEFUN ("string-to-char", Fstring_to_char, Sstring_to_char, 1, 1, 0,
    "Convert arg STRING to a character, the first character of that string.")
!   (string)
!      register Lisp_Object string;
  {
    register Lisp_Object val;
    register struct Lisp_String *p;
!   CHECK_STRING (string, 0);
  
!   p = XSTRING (string);
    if (p->size)
      XSETFASTINT (val, ((unsigned char *) p->data)[0]);
*************** DEFUN ("goto-char", Fgoto_char, Sgoto_ch
*** 199,209 ****
    "Set point to POSITION, a number or marker.\n\
  Beginning of buffer is position (point-min), end is (point-max).")
!   (n)
!      register Lisp_Object n;
  {
!   CHECK_NUMBER_COERCE_MARKER (n, 0);
  
!   SET_PT (clip_to_bounds (BEGV, XINT (n), ZV));
!   return n;
  }
  
--- 205,215 ----
    "Set point to POSITION, a number or marker.\n\
  Beginning of buffer is position (point-min), end is (point-max).")
!   (position)
!      register Lisp_Object position;
  {
!   CHECK_NUMBER_COERCE_MARKER (position, 0);
  
!   SET_PT (clip_to_bounds (BEGV, XINT (position), ZV));
!   return position;
  }
  
*************** save_excursion_save ()
*** 262,268 ****
  Lisp_Object
  save_excursion_restore (info)
!      register Lisp_Object info;
  {
!   register Lisp_Object tem, tem1, omark, nmark;
  
    tem = Fmarker_buffer (Fcar (info));
--- 268,275 ----
  Lisp_Object
  save_excursion_restore (info)
!      Lisp_Object info;
  {
!   Lisp_Object tem, tem1, omark, nmark;
!   struct gcpro gcpro1, gcpro2, gcpro3;
  
    tem = Fmarker_buffer (Fcar (info));
*************** save_excursion_restore (info)
*** 273,276 ****
--- 280,287 ----
    if (NILP (tem))
      return Qnil;
+ 
+   omark = nmark = Qnil;
+   GCPRO3 (info, omark, nmark);
+ 
    Fset_buffer (tem);
    tem = Fcar (info);
*************** save_excursion_restore (info)
*** 308,311 ****
--- 319,323 ----
  	call1 (Vrun_hooks, intern ("deactivate-mark-hook"));
      }
+   UNGCPRO;
    return Qnil;
  }
*************** lisp_time_argument (specified_time, resu
*** 587,591 ****
  }
  
! DEFUN ("format-time-string", Fformat_time_string, Sformat_time_string, 2, 2, 0,
    "Use FORMAT-STRING to format the time TIME.\n\
  TIME is specified as (HIGH LOW . IGNORED) or (HIGH . LOW), as from\n\
--- 599,603 ----
  }
  
! DEFUN ("format-time-string", Fformat_time_string, Sformat_time_string, 1, 2, 0,
    "Use FORMAT-STRING to format the time TIME.\n\
  TIME is specified as (HIGH LOW . IGNORED) or (HIGH . LOW), as from\n\
*************** FORMAT-STRING may contain %-sequences to
*** 596,601 ****
  %b is replaced by the abbreviated name of the month.\n\
  %B is replaced by the full name of the month.\n\
! %c is a synonym for \"%x %X\".\n\
! %C is a locale-specific synonym, which defaults to \"%A, %B %e, %Y\" in the C locale.\n\
  %d is replaced by the day of month, zero-padded.\n\
  %D is a synonym for \"%m/%d/%y\".\n\
--- 608,612 ----
  %b is replaced by the abbreviated name of the month.\n\
  %B is replaced by the full name of the month.\n\
! %c stands for the preferred date/time format of the C locale.\n\
  %d is replaced by the day of month, zero-padded.\n\
  %D is a synonym for \"%m/%d/%y\".\n\
*************** FORMAT-STRING may contain %-sequences to
*** 608,622 ****
  %l is replaced by the hour (1-12), blank padded.\n\
  %m is replaced by the month (01-12).\n\
! %M is replaced by the minut (00-59).\n\
  %n is a synonym for \"\\n\".\n\
  %p is replaced by AM or PM, as appropriate.\n\
  %r is a synonym for \"%I:%M:%S %p\".\n\
  %R is a synonym for \"%H:%M\".\n\
! %S is replaced by the seconds (00-60).\n\
  %t is a synonym for \"\\t\".\n\
  %T is a synonym for \"%H:%M:%S\".\n\
! %U is replaced by the week of the year (01-52), first day of week is Sunday.\n\
  %w is replaced by the day of week (0-6), Sunday is day 0.\n\
! %W is replaced by the week of the year (01-52), first day of week is Monday.\n\
  %x is a locale-specific synonym, which defaults to \"%D\" in the C locale.\n\
  %X is a locale-specific synonym, which defaults to \"%T\" in the C locale.\n\
--- 619,633 ----
  %l is replaced by the hour (1-12), blank padded.\n\
  %m is replaced by the month (01-12).\n\
! %M is replaced by the minute (00-59).\n\
  %n is a synonym for \"\\n\".\n\
  %p is replaced by AM or PM, as appropriate.\n\
  %r is a synonym for \"%I:%M:%S %p\".\n\
  %R is a synonym for \"%H:%M\".\n\
! %S is replaced by the second (00-60).\n\
  %t is a synonym for \"\\t\".\n\
  %T is a synonym for \"%H:%M:%S\".\n\
! %U is replaced by the week of the year (00-53), first day of week is Sunday.\n\
  %w is replaced by the day of week (0-6), Sunday is day 0.\n\
! %W is replaced by the week of the year (00-53), first day of week is Monday.\n\
  %x is a locale-specific synonym, which defaults to \"%D\" in the C locale.\n\
  %X is a locale-specific synonym, which defaults to \"%T\" in the C locale.\n\
*************** The number of options reflects the `strf
*** 643,648 ****
      {
        char *buf = (char *) alloca (size);
        if (emacs_strftime (buf, size, XSTRING (format_string)->data,
! 			  localtime (&value)))
  	return build_string (buf);
        /* If buffer was too small, make it bigger.  */
--- 654,661 ----
      {
        char *buf = (char *) alloca (size);
+       *buf = 1;
        if (emacs_strftime (buf, size, XSTRING (format_string)->data,
! 			  localtime (&value))
! 	  || !*buf)
  	return build_string (buf);
        /* If buffer was too small, make it bigger.  */
*************** ZONE is an integer indicating the number
*** 695,728 ****
  }
  
! DEFUN ("encode-time", Fencode_time, Sencode_time, 6, 7, 0,
!   "Convert SEC, MINUTE, HOUR, DAY, MONTH, YEAR and ZONE to internal time.\n\
! This is the reverse operation of `decode-time', which see.  ZONE defaults\n\
! to the current time zone rule if not specified; if specified, it can\n\
  be a string (as from `set-time-zone-rule'), or it can be a list\n\
  (as from `current-time-zone') or an integer (as from `decode-time')\n\
  applied without consideration for daylight savings time.\n\
  Out-of-range values for SEC, MINUTE, HOUR, DAY, or MONTH are allowed;\n\
  for example, a DAY of 0 means the day preceding the given month.\n\
  Year numbers less than 100 are treated just like other year numbers.\n\
  If you want them to stand for years in this century, you must do that yourself.")
!   (sec, minute, hour, day, month, year, zone)
!      Lisp_Object sec, minute, hour, day, month, year, zone;
  {
    time_t time;
    struct tm tm;
  
!   CHECK_NUMBER (sec, 0);
!   CHECK_NUMBER (minute, 1);
!   CHECK_NUMBER (hour, 2);
!   CHECK_NUMBER (day, 3);
!   CHECK_NUMBER (month, 4);
!   CHECK_NUMBER (year, 5);
! 
!   tm.tm_sec = XINT (sec);
!   tm.tm_min = XINT (minute);
!   tm.tm_hour = XINT (hour);
!   tm.tm_mday = XINT (day);
!   tm.tm_mon = XINT (month) - 1;
!   tm.tm_year = XINT (year) - 1900;
    tm.tm_isdst = -1;
  
--- 708,749 ----
  }
  
! DEFUN ("encode-time", Fencode_time, Sencode_time, 6, MANY, 0,
!   "Convert SECOND, MINUTE, HOUR, DAY, MONTH, YEAR and ZONE to internal time.\n\
! This is the reverse operation of `decode-time', which see.\n\
! ZONE defaults to the current time zone rule.  This can\n\
  be a string (as from `set-time-zone-rule'), or it can be a list\n\
  (as from `current-time-zone') or an integer (as from `decode-time')\n\
  applied without consideration for daylight savings time.\n\
+ \n\
+ You can pass more than 7 arguments; then the first six arguments\n\
+ are used as SECOND through YEAR, and the *last* argument is used as ZONE.\n\
+ The intervening arguments are ignored.\n\
+ This feature lets (apply 'encode-time (decode-time ...)) work.\n\
+ \n\
  Out-of-range values for SEC, MINUTE, HOUR, DAY, or MONTH are allowed;\n\
  for example, a DAY of 0 means the day preceding the given month.\n\
  Year numbers less than 100 are treated just like other year numbers.\n\
  If you want them to stand for years in this century, you must do that yourself.")
!   (nargs, args)
!      int nargs;
!      register Lisp_Object *args;
  {
    time_t time;
    struct tm tm;
+   Lisp_Object zone = (nargs > 6)? args[nargs - 1] : Qnil;
  
!   CHECK_NUMBER (args[0], 0);	/* second */
!   CHECK_NUMBER (args[1], 1);	/* minute */
!   CHECK_NUMBER (args[2], 2);	/* hour */
!   CHECK_NUMBER (args[3], 3);	/* day */
!   CHECK_NUMBER (args[4], 4);	/* month */
!   CHECK_NUMBER (args[5], 5);	/* year */
! 
!   tm.tm_sec = XINT (args[0]);
!   tm.tm_min = XINT (args[1]);
!   tm.tm_hour = XINT (args[2]);
!   tm.tm_mday = XINT (args[3]);
!   tm.tm_mon = XINT (args[4]) - 1;
!   tm.tm_year = XINT (args[5]) - 1900;
    tm.tm_isdst = -1;
  
*************** the data it can't find.")
*** 880,883 ****
--- 901,909 ----
  }
  
+ /* This holds the value of `environ' produced by the previous
+    call to Fset_time_zone_rule, or 0 if Fset_time_zone_rule
+    has never been called.  */
+ static char **environbuf;
+ 
  DEFUN ("set-time-zone-rule", Fset_time_zone_rule, Sset_time_zone_rule, 1, 1, 0,
    "Set the local time zone using TZ, a string specifying a time zone rule.\n\
*************** If TZ is nil, use implementation-defined
*** 886,890 ****
       Lisp_Object tz;
  {
-   static char **environbuf;
    char *tzstring;
  
--- 912,915 ----
*************** If TZ is nil, use implementation-defined
*** 908,912 ****
     This allocates memory into `environ', which it is the caller's
     responsibility to free.  */
! static void
  set_time_zone_rule (tzstring)
       char *tzstring;
--- 933,937 ----
     This allocates memory into `environ', which it is the caller's
     responsibility to free.  */
! void
  set_time_zone_rule (tzstring)
       char *tzstring;
*************** Any other markers at the point of insert
*** 1097,1107 ****
  
  DEFUN ("insert-char", Finsert_char, Sinsert_char, 2, 3, 0,
!   "Insert COUNT (second arg) copies of CHAR (first arg).\n\
  Point and all markers are affected as in the function `insert'.\n\
  Both arguments are required.\n\
  The optional third arg INHERIT, if non-nil, says to inherit text properties\n\
  from adjoining text, if those properties are sticky.")
!   (chr, count, inherit)
!        Lisp_Object chr, count, inherit;
  {
    register unsigned char *string;
--- 1122,1132 ----
  
  DEFUN ("insert-char", Finsert_char, Sinsert_char, 2, 3, 0,
!   "Insert COUNT (second arg) copies of CHARACTER (first arg).\n\
  Point and all markers are affected as in the function `insert'.\n\
  Both arguments are required.\n\
  The optional third arg INHERIT, if non-nil, says to inherit text properties\n\
  from adjoining text, if those properties are sticky.")
!   (character, count, inherit)
!        Lisp_Object character, count, inherit;
  {
    register unsigned char *string;
*************** from adjoining text, if those properties
*** 1109,1113 ****
    register int i, n;
  
!   CHECK_NUMBER (chr, 0);
    CHECK_NUMBER (count, 1);
  
--- 1134,1138 ----
    register int i, n;
  
!   CHECK_NUMBER (character, 0);
    CHECK_NUMBER (count, 1);
  
*************** from adjoining text, if those properties
*** 1118,1122 ****
    string = (unsigned char *) alloca (strlen);
    for (i = 0; i < strlen; i++)
!     string[i] = XFASTINT (chr);
    while (n >= strlen)
      {
--- 1143,1147 ----
    string = (unsigned char *) alloca (strlen);
    for (i = 0; i < strlen; i++)
!     string[i] = XFASTINT (character);
    while (n >= strlen)
      {
*************** from adjoining text, if those properties
*** 1143,1147 ****
     START to END.  If text properties are in use and the current buffer
     has properties in the range specified, the resulting string will also
!    have them.
  
     We don't want to use plain old make_string here, because it calls
--- 1168,1172 ----
     START to END.  If text properties are in use and the current buffer
     has properties in the range specified, the resulting string will also
!    have them, if PROPS is nonzero.
  
     We don't want to use plain old make_string here, because it calls
*************** from adjoining text, if those properties
*** 1154,1159 ****
  
  Lisp_Object
! make_buffer_string (start, end)
       int start, end;
  {
    Lisp_Object result, tem, tem1;
--- 1179,1185 ----
  
  Lisp_Object
! make_buffer_string (start, end, props)
       int start, end;
+      int props;
  {
    Lisp_Object result, tem, tem1;
*************** make_buffer_string (start, end)
*** 1165,1174 ****
    bcopy (&FETCH_CHAR (start), XSTRING (result)->data, end - start);
  
!   tem = Fnext_property_change (make_number (start), Qnil, make_number (end));
!   tem1 = Ftext_properties_at (make_number (start), Qnil);
! 
  #ifdef USE_TEXT_PROPERTIES
!   if (XINT (tem) != end || !NILP (tem1))
!     copy_intervals_to_string (result, current_buffer, start, end - start);
  #endif
  
--- 1191,1206 ----
    bcopy (&FETCH_CHAR (start), XSTRING (result)->data, end - start);
  
!   /* If desired, update and copy the text properties.  */
  #ifdef USE_TEXT_PROPERTIES
!   if (props)
!     {
!       update_buffer_properties (start, end);
! 
!       tem = Fnext_property_change (make_number (start), Qnil, make_number (end));
!       tem1 = Ftext_properties_at (make_number (start), Qnil);
! 
!       if (XINT (tem) != end || !NILP (tem1))
! 	copy_intervals_to_string (result, current_buffer, start, end - start);
!     }
  #endif
  
*************** make_buffer_string (start, end)
*** 1176,1193 ****
  }
  
  DEFUN ("buffer-substring", Fbuffer_substring, Sbuffer_substring, 2, 2, 0,
    "Return the contents of part of the current buffer as a string.\n\
  The two arguments START and END are character positions;\n\
  they can be in either order.")
!   (b, e)
!      Lisp_Object b, e;
  {
!   register int beg, end;
  
!   validate_region (&b, &e);
!   beg = XINT (b);
!   end = XINT (e);
  
!   return make_buffer_string (beg, end);
  }
  
--- 1208,1277 ----
  }
  
+ /* Call Vbuffer_access_fontify_functions for the range START ... END
+    in the current buffer, if necessary.  */
+ 
+ static void
+ update_buffer_properties (start, end)
+      int start, end;
+ {
+ #ifdef USE_TEXT_PROPERTIES
+   /* If this buffer has some access functions,
+      call them, specifying the range of the buffer being accessed.  */
+   if (!NILP (Vbuffer_access_fontify_functions))
+     {
+       Lisp_Object args[3];
+       Lisp_Object tem;
+ 
+       args[0] = Qbuffer_access_fontify_functions;
+       XSETINT (args[1], start);
+       XSETINT (args[2], end);
+ 
+       /* But don't call them if we can tell that the work
+ 	 has already been done.  */
+       if (!NILP (Vbuffer_access_fontified_property))
+ 	{
+ 	  tem = Ftext_property_any (args[1], args[2],
+ 				    Vbuffer_access_fontified_property,
+ 				    Qnil, Qnil);
+ 	  if (! NILP (tem))
+ 	    Frun_hook_with_args (3, args);
+ 	}
+       else
+ 	Frun_hook_with_args (3, args);
+     }
+ #endif
+ }
+ 
  DEFUN ("buffer-substring", Fbuffer_substring, Sbuffer_substring, 2, 2, 0,
    "Return the contents of part of the current buffer as a string.\n\
  The two arguments START and END are character positions;\n\
  they can be in either order.")
!   (start, end)
!      Lisp_Object start, end;
  {
!   register int b, e;
  
!   validate_region (&start, &end);
!   b = XINT (start);
!   e = XINT (end);
  
!   return make_buffer_string (b, e, 1);
! }
! 
! DEFUN ("buffer-substring-no-properties", Fbuffer_substring_no_properties,
!        Sbuffer_substring_no_properties, 2, 2, 0,
!   "Return the characters of part of the buffer, without the text properties.\n\
! The two arguments START and END are character positions;\n\
! they can be in either order.")
!   (start, end)
!      Lisp_Object start, end;
! {
!   register int b, e;
! 
!   validate_region (&start, &end);
!   b = XINT (start);
!   e = XINT (end);
! 
!   return make_buffer_string (b, e, 0);
  }
  
*************** of the buffer.")
*** 1198,1202 ****
    ()
  {
!   return make_buffer_string (BEGV, ZV);
  }
  
--- 1282,1286 ----
    ()
  {
!   return make_buffer_string (BEGV, ZV, 1);
  }
  
*************** BUFFER may be a buffer or a buffer name.
*** 1207,1215 ****
  Arguments START and END are character numbers specifying the substring.\n\
  They default to the beginning and the end of BUFFER.")
!   (buf, b, e)
!      Lisp_Object buf, b, e;
  {
!   register int beg, end, temp;
!   register struct buffer *bp;
    Lisp_Object buffer;
  
--- 1291,1299 ----
  Arguments START and END are character numbers specifying the substring.\n\
  They default to the beginning and the end of BUFFER.")
!   (buf, start, end)
!      Lisp_Object buf, start, end;
  {
!   register int b, e, temp;
!   register struct buffer *bp, *obuf;
    Lisp_Object buffer;
  
*************** They default to the beginning and the en
*** 1219,1244 ****
    bp = XBUFFER (buffer);
  
!   if (NILP (b))
!     beg = BUF_BEGV (bp);
    else
      {
!       CHECK_NUMBER_COERCE_MARKER (b, 0);
!       beg = XINT (b);
      }
!   if (NILP (e))
!     end = BUF_ZV (bp);
    else
      {
!       CHECK_NUMBER_COERCE_MARKER (e, 1);
!       end = XINT (e);
      }
  
!   if (beg > end)
!     temp = beg, beg = end, end = temp;
  
!   if (!(BUF_BEGV (bp) <= beg && end <= BUF_ZV (bp)))
!     args_out_of_range (b, e);
  
!   insert_from_buffer (bp, beg, end - beg, 0);
    return Qnil;
  }
--- 1303,1333 ----
    bp = XBUFFER (buffer);
  
!   if (NILP (start))
!     b = BUF_BEGV (bp);
    else
      {
!       CHECK_NUMBER_COERCE_MARKER (start, 0);
!       b = XINT (start);
      }
!   if (NILP (end))
!     e = BUF_ZV (bp);
    else
      {
!       CHECK_NUMBER_COERCE_MARKER (end, 1);
!       e = XINT (end);
      }
  
!   if (b > e)
!     temp = b, b = e, e = temp;
! 
!   if (!(BUF_BEGV (bp) <= b && e <= BUF_ZV (bp)))
!     args_out_of_range (start, end);
  
!   obuf = current_buffer;
!   set_buffer_internal_1 (bp);
!   update_buffer_properties (b, e);
!   set_buffer_internal_1 (obuf);
  
!   insert_from_buffer (bp, b, e - b, 0);
    return Qnil;
  }
*************** determines whether case is significant o
*** 1258,1264 ****
    register int begp1, endp1, begp2, endp2, temp, len1, len2, length, i;
    register struct buffer *bp1, *bp2;
!   register unsigned char *trt
      = (!NILP (current_buffer->case_fold_search)
!        ? XSTRING (current_buffer->case_canon_table)->data : 0);
  
    /* Find the first buffer and its substring.  */
--- 1347,1353 ----
    register int begp1, endp1, begp2, endp2, temp, len1, len2, length, i;
    register struct buffer *bp1, *bp2;
!   register Lisp_Object *trt
      = (!NILP (current_buffer->case_fold_search)
!        ? XCHAR_TABLE (current_buffer->case_canon_table)->contents : 0);
  
    /* Find the first buffer and its substring.  */
*************** determines whether case is significant o
*** 1308,1312 ****
        if (NILP (buf2))
  	nsberror (buffer2);
!       bp2 = XBUFFER (buffer2);
      }
  
--- 1397,1401 ----
        if (NILP (buf2))
  	nsberror (buffer2);
!       bp2 = XBUFFER (buf2);
      }
  
*************** DEFUN ("delete-region", Fdelete_region, 
*** 1501,1509 ****
  When called from a program, expects two arguments,\n\
  positions (integers or markers) specifying the stretch to be deleted.")
!   (b, e)
!      Lisp_Object b, e;
  {
!   validate_region (&b, &e);
!   del_range (XINT (b), XINT (e));
    return Qnil;
  }
--- 1590,1598 ----
  When called from a program, expects two arguments,\n\
  positions (integers or markers) specifying the stretch to be deleted.")
!   (start, end)
!      Lisp_Object start, end;
  {
!   validate_region (&start, &end);
!   del_range (XINT (start), XINT (end));
    return Qnil;
  }
*************** See also `save-restriction'.\n\
*** 1531,1555 ****
  When calling from a program, pass two arguments; positions (integers\n\
  or markers) bounding the text that should remain visible.")
!   (b, e)
!      register Lisp_Object b, e;
  {
!   CHECK_NUMBER_COERCE_MARKER (b, 0);
!   CHECK_NUMBER_COERCE_MARKER (e, 1);
  
!   if (XINT (b) > XINT (e))
      {
        Lisp_Object tem;
!       tem = b;  b = e;  e = tem;
      }
  
!   if (!(BEG <= XINT (b) && XINT (b) <= XINT (e) && XINT (e) <= Z))
!     args_out_of_range (b, e);
  
!   BEGV = XFASTINT (b);
!   SET_BUF_ZV (current_buffer, XFASTINT (e));
!   if (point < XFASTINT (b))
!     SET_PT (XFASTINT (b));
!   if (point > XFASTINT (e))
!     SET_PT (XFASTINT (e));
    current_buffer->clip_changed = 1;
    /* Changing the buffer bounds invalidates any recorded current column.  */
--- 1620,1644 ----
  When calling from a program, pass two arguments; positions (integers\n\
  or markers) bounding the text that should remain visible.")
!   (start, end)
!      register Lisp_Object start, end;
  {
!   CHECK_NUMBER_COERCE_MARKER (start, 0);
!   CHECK_NUMBER_COERCE_MARKER (end, 1);
  
!   if (XINT (start) > XINT (end))
      {
        Lisp_Object tem;
!       tem = start; start = end; end = tem;
      }
  
!   if (!(BEG <= XINT (start) && XINT (start) <= XINT (end) && XINT (end) <= Z))
!     args_out_of_range (start, end);
  
!   BEGV = XFASTINT (start);
!   SET_BUF_ZV (current_buffer, XFASTINT (end));
!   if (point < XFASTINT (start))
!     SET_PT (XFASTINT (start));
!   if (point > XFASTINT (end))
!     SET_PT (XFASTINT (end));
    current_buffer->clip_changed = 1;
    /* Changing the buffer bounds invalidates any recorded current column.  */
*************** DEFUN ("message-box", Fmessage_box, Smes
*** 1678,1687 ****
    "Display a message, in a dialog box if possible.\n\
  If a dialog box is not available, use the echo area.\n\
! The first argument is a control string.\n\
! It may contain %s or %d or %c to print successive following arguments.\n\
! %s means print an argument as a string, %d means print as number in decimal,\n\
! %c means print a number as a single character.\n\
! The argument used by %s must be a string or a symbol;\n\
! the argument used by %d or %c must be a number.\n\
  If the first argument is nil, clear any existing message; let the\n\
  minibuffer contents show.")
--- 1767,1773 ----
    "Display a message, in a dialog box if possible.\n\
  If a dialog box is not available, use the echo area.\n\
! The first argument is a format control string, and the rest are data\n\
! to be formatted under control of the string.  See `format' for details.\n\
! \n\
  If the first argument is nil, clear any existing message; let the\n\
  minibuffer contents show.")
*************** minibuffer contents show.")
*** 1699,1703 ****
        register Lisp_Object val;
        val = Fformat (nargs, args);
! #ifdef HAVE_X_MENU
        {
  	Lisp_Object pane, menu, obj;
--- 1785,1789 ----
        register Lisp_Object val;
        val = Fformat (nargs, args);
! #ifdef HAVE_MENUS
        {
  	Lisp_Object pane, menu, obj;
*************** minibuffer contents show.")
*** 1710,1714 ****
  	return val;
        }
! #else
        /* Copy the data so that it won't move when we GC.  */
        if (! message_text)
--- 1796,1800 ----
  	return val;
        }
! #else /* not HAVE_MENUS */
        /* Copy the data so that it won't move when we GC.  */
        if (! message_text)
*************** minibuffer contents show.")
*** 1725,1745 ****
        message2 (message_text, XSTRING (val)->size);
        return val;
! #endif
      }
  }
! #ifdef HAVE_X_MENU
  extern Lisp_Object last_nonmenu_event;
  #endif
  DEFUN ("message-or-box", Fmessage_or_box, Smessage_or_box, 1, MANY, 0,
    "Display a message in a dialog box or in the echo area.\n\
  If this command was invoked with the mouse, use a dialog box.\n\
  Otherwise, use the echo area.\n\
  \n\
- The first argument is a control string.\n\
- It may contain %s or %d or %c to print successive following arguments.\n\
- %s means print an argument as a string, %d means print as number in decimal,\n\
- %c means print a number as a single character.\n\
- The argument used by %s must be a string or a symbol;\n\
- the argument used by %d or %c must be a number.\n\
  If the first argument is nil, clear any existing message; let the\n\
  minibuffer contents show.")
--- 1811,1828 ----
        message2 (message_text, XSTRING (val)->size);
        return val;
! #endif /* not HAVE_MENUS */
      }
  }
! #ifdef HAVE_MENUS
  extern Lisp_Object last_nonmenu_event;
  #endif
+ 
  DEFUN ("message-or-box", Fmessage_or_box, Smessage_or_box, 1, MANY, 0,
    "Display a message in a dialog box or in the echo area.\n\
  If this command was invoked with the mouse, use a dialog box.\n\
  Otherwise, use the echo area.\n\
+ The first argument is a format control string, and the rest are data\n\
+ to be formatted under control of the string.  See `format' for details.\n\
  \n\
  If the first argument is nil, clear any existing message; let the\n\
  minibuffer contents show.")
*************** minibuffer contents show.")
*** 1748,1752 ****
       Lisp_Object *args;
  {
! #ifdef HAVE_X_MENU
    if (NILP (last_nonmenu_event) || CONSP (last_nonmenu_event))
      return Fmessage_box (nargs, args);
--- 1831,1835 ----
       Lisp_Object *args;
  {
! #ifdef HAVE_MENUS
    if (NILP (last_nonmenu_event) || CONSP (last_nonmenu_event))
      return Fmessage_box (nargs, args);
*************** void
*** 2306,2309 ****
--- 2389,2424 ----
  syms_of_editfns ()
  {
+   environbuf = 0;
+ 
+   Qbuffer_access_fontify_functions
+     = intern ("buffer-access-fontify-functions");
+   staticpro (&Qbuffer_access_fontify_functions);
+ 
+   DEFVAR_LISP ("buffer-access-fontify-functions",
+ 	       &Vbuffer_access_fontify_functions,
+ 	       "List of functions called by `buffer-substring' to fontify if necessary.\n\
+ Each function is called with two arguments which specify the range\n\
+ of the buffer being accessed.");
+   Vbuffer_access_fontify_functions = Qnil;
+ 
+   {
+     Lisp_Object obuf;
+     extern Lisp_Object Vprin1_to_string_buffer;
+     obuf = Fcurrent_buffer ();
+     /* Do this here, because init_buffer_once is too early--it won't work.  */
+     Fset_buffer (Vprin1_to_string_buffer);
+     /* Make sure buffer-access-fontify-functions is nil in this buffer.  */
+     Fset (Fmake_local_variable (intern ("buffer-access-fontify-functions")),
+ 	  Qnil);
+     Fset_buffer (obuf);
+   }
+ 
+   DEFVAR_LISP ("buffer-access-fontified-property",
+ 	       &Vbuffer_access_fontified_property,
+        "Property which (if non-nil) indicates text has been fontified.\n\
+ `buffer-substring' need not call the `buffer-access-fontify-functions'\n\
+ functions if all the text being accessed has this property.");
+   Vbuffer_access_fontified_property = Qnil;
+ 
    DEFVAR_LISP ("system-name", &Vsystem_name,
  	       "The name of the machine Emacs is running on.");
*************** syms_of_editfns ()
*** 2323,2326 ****
--- 2438,2442 ----
    defsubr (&Schar_to_string);
    defsubr (&Sbuffer_substring);
+   defsubr (&Sbuffer_substring_no_properties);
    defsubr (&Sbuffer_string);
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/emacs.c emacs-19.31/src/emacs.c
*** emacs-19.30/src/emacs.c	Tue Nov 21 11:52:32 1995
--- emacs-19.31/src/emacs.c	Fri May 10 16:30:15 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** the Free Software Foundation, 675 Mass A
*** 41,44 ****
--- 42,46 ----
  
  #include "systty.h"
+ #include "blockinput.h"
  #include "syssignal.h"
  #include "process.h"
*************** the Free Software Foundation, 675 Mass A
*** 49,52 ****
--- 51,55 ----
  
  extern void malloc_warning ();
+ extern void set_time_zone_rule ();
  extern char *index ();
  extern char *strerror ();
*************** fatal_error_signal (sig)
*** 154,157 ****
--- 157,162 ----
    signal (sig, SIG_DFL);
  
+   TOTALLY_UNBLOCK_INPUT;
+ 
    /* If fatal error occurs in code below, avoid infinite recursion.  */
    if (! fatal_error_in_progress)
*************** DEFUN ("invocation-directory", Finvocati
*** 310,319 ****
  #ifdef VMS
  #ifdef LINK_CRTL_SHARE
! #ifdef SHAREABLE_LIB_BUG
  extern noshare char **environ;
! #endif /* SHAREABLE_LIB_BUG */
  #endif /* LINK_CRTL_SHARE */
  #endif /* VMS */
  
  #ifndef ORDINARY_LINK
  /* We don't include crtbegin.o and crtend.o in the link,
--- 315,330 ----
  #ifdef VMS
  #ifdef LINK_CRTL_SHARE
! #ifdef SHARABLE_LIB_BUG
  extern noshare char **environ;
! #endif /* SHARABLE_LIB_BUG */
  #endif /* LINK_CRTL_SHARE */
  #endif /* VMS */
  
+ #ifdef HAVE_TZSET
+ /* A valid but unlikely value for the TZ environment value.
+    It is OK (though a bit slower) if the user actually chooses this value.  */
+ static char dump_tz[] = "UtC0";
+ #endif
+ 
  #ifndef ORDINARY_LINK
  /* We don't include crtbegin.o and crtend.o in the link,
*************** main (argc, argv, envp)
*** 477,481 ****
  
  #ifdef LINK_CRTL_SHARE
! #ifdef SHAREABLE_LIB_BUG
    /* Bletcherous shared libraries! */
    if (!stdin)
--- 488,492 ----
  
  #ifdef LINK_CRTL_SHARE
! #ifdef SHARABLE_LIB_BUG
    /* Bletcherous shared libraries! */
    if (!stdin)
*************** main (argc, argv, envp)
*** 487,491 ****
    if (!environ)
      environ = envp;
! #endif /* SHAREABLE_LIB_BUG */
  #endif /* LINK_CRTL_SHARE */
  #endif /* VMS */
--- 498,502 ----
    if (!environ)
      environ = envp;
! #endif /* SHARABLE_LIB_BUG */
  #endif /* LINK_CRTL_SHARE */
  #endif /* VMS */
*************** main (argc, argv, envp)
*** 522,528 ****
--- 533,550 ----
       newlines, we do that manually.  */
    _fmode = O_BINARY;
+ 
+ #if __DJGPP__ >= 2
+   if (!isatty (fileno (stdin)))
+     setmode (fileno (stdin), O_BINARY);
+   if (!isatty (fileno (stdout)))
+     {
+       fflush (stdout);
+       setmode (fileno (stdout), O_BINARY);
+     }
+ #else  /* not __DJGPP__ >= 2 */
    (stdin)->_flag &= ~_IOTEXT;
    (stdout)->_flag &= ~_IOTEXT;
    (stderr)->_flag &= ~_IOTEXT;
+ #endif /* not __DJGPP__ >= 2 */
  #endif /* MSDOS */
  
*************** Usage: %s [-t term] [--terminal term]  [
*** 592,596 ****
       to run until we've recognized this argument.  */
    {
!     char *displayname;
      int i;
      int count_before = skip_args;
--- 614,618 ----
       to run until we've recognized this argument.  */
    {
!     char *displayname = 0;
      int i;
      int count_before = skip_args;
*************** Usage: %s [-t term] [--terminal term]  [
*** 621,625 ****
      else if (displayname != 0 && skip_args > count_before
  	     && argv[count_before + 1][1] == '-')
!       argv[count_before] = "-d";
  
      /* Don't actually discard this arg.  */
--- 643,647 ----
      else if (displayname != 0 && skip_args > count_before
  	     && argv[count_before + 1][1] == '-')
!       argv[count_before + 1] = "-d";
  
      /* Don't actually discard this arg.  */
*************** Usage: %s [-t term] [--terminal term]  [
*** 647,650 ****
--- 669,688 ----
  #endif
  
+   /* Don't catch SIGHUP if dumping.  */
+   if (1
+ #ifndef CANNOT_DUMP
+       && initialized
+ #endif
+       )
+     {
+       sigblockx (SIGHUP);
+       /* In --batch mode, don't catch SIGHUP if already ignored.
+ 	 That makes nohup work.  */
+       if (! noninteractive
+ 	  || signal (SIGHUP, SIG_IGN) != SIG_IGN)
+ 	signal (SIGHUP, fatal_error_signal);
+       sigunblockx (SIGHUP);
+     }
+ 
    if (
  #ifndef CANNOT_DUMP
*************** Usage: %s [-t term] [--terminal term]  [
*** 655,662 ****
        )
      {
!       /* Don't catch these signals in batch mode if not initialized.
  	 On some machines, this sets static data that would make
  	 signal fail to work right when the dumped Emacs is run.  */
-       signal (SIGHUP, fatal_error_signal);
        signal (SIGQUIT, fatal_error_signal);
        signal (SIGILL, fatal_error_signal);
--- 693,699 ----
        )
      {
!       /* Don't catch these signals in batch mode if dumping.
  	 On some machines, this sets static data that would make
  	 signal fail to work right when the dumped Emacs is run.  */
        signal (SIGQUIT, fatal_error_signal);
        signal (SIGILL, fatal_error_signal);
*************** Usage: %s [-t term] [--terminal term]  [
*** 751,761 ****
    init_dosfns ();
    /* Set defaults for several environment variables.  */
!   if (initialized) init_environment (argc, argv, skip_args);
!   else init_gettimeofday ();
! #endif
  
  #ifdef WINDOWSNT
    /* Initialize environment from registry settings.  */
    init_environment ();
  #endif
  
--- 788,801 ----
    init_dosfns ();
    /* Set defaults for several environment variables.  */
!   if (initialized)
!     init_environment (argc, argv, skip_args);
!   else
!     tzset ();
! #endif /* MSDOS */
  
  #ifdef WINDOWSNT
    /* Initialize environment from registry settings.  */
    init_environment ();
+   init_ntproc ();	/* must precede init_editfns */
  #endif
  
*************** Usage: %s [-t term] [--terminal term]  [
*** 857,860 ****
--- 897,903 ----
        syms_of_vmsproc ();
  #endif /* VMS */
+ #ifdef WINDOWSNT
+       syms_of_ntproc ();
+ #endif /* WINDOWSNT */
        syms_of_window ();
        syms_of_xdisp ();
*************** Usage: %s [-t term] [--terminal term]  [
*** 866,876 ****
        syms_of_xselect ();
  #endif
- #ifdef HAVE_X_MENU
-       syms_of_xmenu ();
- #endif /* HAVE_X_MENU */
  #endif /* HAVE_X_WINDOWS */
  
  #if defined (MSDOS) && !defined (HAVE_X_WINDOWS)
        syms_of_xfaces ();
        syms_of_xmenu ();
  #endif
--- 909,919 ----
        syms_of_xselect ();
  #endif
  #endif /* HAVE_X_WINDOWS */
  
  #if defined (MSDOS) && !defined (HAVE_X_WINDOWS)
        syms_of_xfaces ();
+ #endif
+ 
+ #ifndef HAVE_NTGUI
        syms_of_xmenu ();
  #endif
*************** Usage: %s [-t term] [--terminal term]  [
*** 926,929 ****
--- 969,989 ----
        message_dolog ("", 0, 1);
        Vmessage_log_max = old_log_max;
+ 
+ #ifdef HAVE_TZSET
+       {
+ 	/* If the execution TZ happens to be the same as the dump TZ,
+ 	   change it to some other value and then change it back,
+ 	   to force the underlying implementation to reload the TZ info.
+ 	   This is needed on implementations that load TZ info from files,
+ 	   since the TZ file contents may differ between dump and execution.  */
+ 	char *tz = getenv ("TZ");
+ 	if (tz && !strcmp (tz, dump_tz))
+ 	  {
+ 	    ++*tz;
+ 	    tzset ();
+ 	    --*tz;
+ 	  }
+       }
+ #endif
      }
  
*************** struct standard_args standard_args[] =
*** 993,1001 ****
--- 1053,1064 ----
    { "-geometry", 0, 10, 1 },
    { "-T", "--title", 10, 1 },
+   { "-title", 0, 10, 1 },
    { "-name", "--name", 10, 1 },
+   { "-rn", 0, 10, 1 },
    { "-xrm", "--xrm", 10, 1 },
    { "-r", "--reverse-video", 5, 0 },
    { "-rv", 0, 5, 0 },
    { "-reverse", 0, 5, 0 },
+   { "-hb", "--horizontal-scroll-bars", 5, 0 },
    { "-vb", "--vertical-scroll-bars", 5, 0 },
    /* These have the same priority as ordinary file name args,
*************** sort_args (argc, argv)
*** 1052,1055 ****
--- 1115,1120 ----
  		options[from] = standard_args[i].nargs;
  		priority[from] = standard_args[i].priority;
+ 		if (from + standard_args[i].nargs >= argc)
+ 		  fatal ("Option `%s' requires an argument\n", argv[from]);
  		from += standard_args[i].nargs;
  		goto done;
*************** sort_args (argc, argv)
*** 1088,1091 ****
--- 1153,1158 ----
  		  if (equals != 0)
  		    options[from] = 0;
+ 		  if (from + options[from] >= argc)
+ 		    fatal ("Option `%s' requires an argument\n", argv[from]);
  		  from += options[from];
  		}
*************** shut_down_emacs (sig, no_x, stuff)
*** 1251,1254 ****
--- 1318,1325 ----
    signal (SIGIO, SIG_IGN);
  #endif
+ 
+ #ifdef WINDOWSNT
+   term_ntproc ();
+ #endif
  }
  
*************** DEFUN ("dump-emacs-data", Fdump_emacs_da
*** 1262,1273 ****
    "Dump current state of Emacs into data file FILENAME.\n\
  This function exists on systems that use HAVE_SHM.")
!   (intoname)
!      Lisp_Object intoname;
  {
    extern char my_edata[];
    Lisp_Object tem;
  
!   CHECK_STRING (intoname, 0);
!   intoname = Fexpand_file_name (intoname, Qnil);
  
    tem = Vpurify_flag;
--- 1333,1344 ----
    "Dump current state of Emacs into data file FILENAME.\n\
  This function exists on systems that use HAVE_SHM.")
!   (filename)
!      Lisp_Object filename;
  {
    extern char my_edata[];
    Lisp_Object tem;
  
!   CHECK_STRING (filename, 0);
!   filename = Fexpand_file_name (filename, Qnil);
  
    tem = Vpurify_flag;
*************** This function exists on systems that use
*** 1280,1284 ****
    memory_warnings (my_edata, malloc_warning);
  #endif
!   map_out_data (XSTRING (intoname)->data);
  
    Vpurify_flag = tem;
--- 1351,1355 ----
    memory_warnings (my_edata, malloc_warning);
  #endif
!   map_out_data (XSTRING (filename)->data);
  
    Vpurify_flag = tem;
*************** Bind `command-line-processed' to nil bef
*** 1297,1313 ****
  if you want the dumped Emacs to process its command line\n\
  and announce itself normally when it is run.")
!   (intoname, symname)
!      Lisp_Object intoname, symname;
  {
    extern char my_edata[];
    Lisp_Object tem;
  
!   CHECK_STRING (intoname, 0);
!   intoname = Fexpand_file_name (intoname, Qnil);
!   if (!NILP (symname))
!     {
!       CHECK_STRING (symname, 0);
!       if (XSTRING (symname)->size)
! 	symname = Fexpand_file_name (symname, Qnil);
      }
  
--- 1368,1384 ----
  if you want the dumped Emacs to process its command line\n\
  and announce itself normally when it is run.")
!   (filename, symfile)
!      Lisp_Object filename, symfile;
  {
    extern char my_edata[];
    Lisp_Object tem;
  
!   CHECK_STRING (filename, 0);
!   filename = Fexpand_file_name (filename, Qnil);
!   if (!NILP (symfile))
!     {
!       CHECK_STRING (symfile, 0);
!       if (XSTRING (symfile)->size)
! 	symfile = Fexpand_file_name (symfile, Qnil);
      }
  
*************** and announce itself normally when it is 
*** 1315,1321 ****
    Vpurify_flag = Qnil;
  
    fflush (stdout);
  #ifdef VMS
!   mapout_data (XSTRING (intoname)->data);
  #else
    /* Tell malloc where start of impure now is */
--- 1386,1400 ----
    Vpurify_flag = Qnil;
  
+ #ifdef HAVE_TZSET
+   set_time_zone_rule (dump_tz);
+ #ifndef LOCALTIME_CACHE
+   /* Force a tz reload, since set_time_zone_rule doesn't.  */
+   tzset ();
+ #endif
+ #endif
+ 
    fflush (stdout);
  #ifdef VMS
!   mapout_data (XSTRING (filename)->data);
  #else
    /* Tell malloc where start of impure now is */
*************** and announce itself normally when it is 
*** 1328,1333 ****
  #endif /* not WINDOWSNT */
  #endif
!   unexec (XSTRING (intoname)->data,
! 	  !NILP (symname) ? XSTRING (symname)->data : 0, my_edata, 0, 0);
  #endif /* not VMS */
  
--- 1407,1412 ----
  #endif /* not WINDOWSNT */
  #endif
!   unexec (XSTRING (filename)->data,
! 	  !NILP (symfile) ? XSTRING (symfile)->data : 0, my_edata, 0, 0);
  #endif /* not VMS */
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/eval.c emacs-19.31/src/eval.c
*** emacs-19.30/src/eval.c	Fri Nov 10 13:38:30 1995
--- emacs-19.31/src/eval.c	Tue May 21 14:06:44 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** Lisp_Object Vstack_trace_on_error;
*** 128,131 ****
--- 129,136 ----
  Lisp_Object Vdebug_on_error;
  
+ /* List of conditions and regexps specifying error messages which
+    do not enter the debugger even if Vdebug_on_errors says they should.  */
+ Lisp_Object Vdebug_ignored_errors;
+ 
  /* Nonzero means enter debugger if a quit signal
     is handled by the command loop's error handler. */
*************** init_eval_once ()
*** 153,156 ****
--- 158,162 ----
    specpdl_size = 50;
    specpdl = (struct specbinding *) xmalloc (specpdl_size * sizeof (struct specbinding));
+   specpdl_ptr = specpdl;
    max_specpdl_size = 600;
    max_lisp_eval_depth = 200;
*************** in place of FORM.  When a non-macro-call
*** 786,792 ****
  The second optional arg ENVIRONMENT species an environment of macro\n\
  definitions to shadow the loaded ones for use in file byte-compilation.")
!   (form, env)
       register Lisp_Object form;
!      Lisp_Object env;
  {
    /* With cleanups from Hallvard Furuseth.  */
--- 792,798 ----
  The second optional arg ENVIRONMENT species an environment of macro\n\
  definitions to shadow the loaded ones for use in file byte-compilation.")
!   (form, environment)
       register Lisp_Object form;
!      Lisp_Object environment;
  {
    /* With cleanups from Hallvard Furuseth.  */
*************** definitions to shadow the loaded ones fo
*** 808,812 ****
  	  QUIT;
  	  sym = def;
! 	  tem = Fassq (sym, env);
  	  if (NILP (tem))
  	    {
--- 814,818 ----
  	  QUIT;
  	  sym = def;
! 	  tem = Fassq (sym, environment);
  	  if (NILP (tem))
  	    {
*************** definitions to shadow the loaded ones fo
*** 817,825 ****
  	  break;
  	}
!       /* Right now TEM is the result from SYM in ENV,
  	 and if TEM is nil then DEF is SYM's function definition.  */
        if (NILP (tem))
  	{
! 	  /* SYM is not mentioned in ENV.
  	     Look at its function definition.  */
  	  if (EQ (def, Qunbound) || !CONSP (def))
--- 823,831 ----
  	  break;
  	}
!       /* Right now TEM is the result from SYM in ENVIRONMENT,
  	 and if TEM is nil then DEF is SYM's function definition.  */
        if (NILP (tem))
  	{
! 	  /* SYM is not mentioned in ENVIRONMENT.
  	     Look at its function definition.  */
  	  if (EQ (def, Qunbound) || !CONSP (def))
*************** DEFUN ("throw", Fthrow, Sthrow, 2, 2, 0,
*** 957,962 ****
    "(throw TAG VALUE): throw to the catch for TAG and return VALUE from it.\n\
  Both TAG and VALUE are evalled.")
!   (tag, val)
!      register Lisp_Object tag, val;
  {
    register struct catchtag *c;
--- 963,968 ----
    "(throw TAG VALUE): throw to the catch for TAG and return VALUE from it.\n\
  Both TAG and VALUE are evalled.")
!   (tag, value)
!      register Lisp_Object tag, value;
  {
    register struct catchtag *c;
*************** Both TAG and VALUE are evalled.")
*** 968,974 ****
  	  {
  	    if (EQ (c->tag, tag))
! 	      unwind_to_catch (c, val);
  	  }
!       tag = Fsignal (Qno_catch, Fcons (tag, Fcons (val, Qnil)));
      }
  }
--- 974,980 ----
  	  {
  	    if (EQ (c->tag, tag))
! 	      unwind_to_catch (c, value);
  	  }
!       tag = Fsignal (Qno_catch, Fcons (tag, Fcons (value, Qnil)));
      }
  }
*************** See also the function `signal' for more 
*** 1079,1082 ****
--- 1085,1098 ----
  }
  
+ /* Call the function BFUN with no arguments, catching errors within it
+    according to HANDLERS.  If there is an error, call HFUN with
+    one argument which is the data that describes the error:
+    (SIGNALNAME . DATA)
+ 
+    HANDLERS can be a list of conditions to catch.
+    If HANDLERS is Qt, catch all errors.
+    If HANDLERS is Qerror, catch all errors
+    but allow the debugger to run if that is enabled.  */
+ 
  Lisp_Object
  internal_condition_case (bfun, handlers, hfun)
*************** internal_condition_case (bfun, handlers,
*** 1120,1123 ****
--- 1136,1141 ----
  }
  
+ /* Like internal_condition_case but call HFUN with ARG as its argument.  */
+ 
  Lisp_Object
  internal_condition_case_1 (bfun, arg, handlers, hfun)
*************** See also the function `condition-case'."
*** 1184,1188 ****
      abort ();
  
! #ifdef HAVE_X_WINDOWS
    TOTALLY_UNBLOCK_INPUT;
  #endif
--- 1202,1206 ----
      abort ();
  
! #ifdef HAVE_WINDOW_SYSTEM
    TOTALLY_UNBLOCK_INPUT;
  #endif
*************** See also the function `condition-case'."
*** 1205,1210 ****
        if (EQ (clause, Qlambda))
  	{
! 	  /* We can't return values to code which signalled an error, but we
! 	     can continue code which has signalled a quit.  */
  	  if (EQ (error_symbol, Qquit))
  	    return Qnil;
--- 1223,1228 ----
        if (EQ (clause, Qlambda))
  	{
! 	  /* We can't return values to code which signaled an error, but we
! 	     can continue code which has signaled a quit.  */
  	  if (EQ (error_symbol, Qquit))
  	    return Qnil;
*************** wants_debugger (list, conditions)
*** 1260,1263 ****
--- 1278,1320 ----
  }
  
+ /* Return 1 if an error with condition-symbols CONDITIONS,
+    and described by SIGNAL-DATA, should skip the debugger
+    according to debugger-ignore-errors.  */
+ 
+ static int
+ skip_debugger (conditions, data)
+      Lisp_Object conditions, data;
+ {
+   Lisp_Object tail;
+   int first_string = 1;
+   Lisp_Object error_message;
+ 
+   for (tail = Vdebug_ignored_errors; CONSP (tail);
+        tail = XCONS (tail)->cdr)
+     {
+       if (STRINGP (XCONS (tail)->car))
+ 	{
+ 	  if (first_string)
+ 	    {
+ 	      error_message = Ferror_message_string (data);
+ 	      first_string = 0;
+ 	    }
+ 	  if (fast_string_match (XCONS (tail)->car, error_message) >= 0)
+ 	    return 1;
+ 	}
+       else
+ 	{
+ 	  Lisp_Object contail;
+ 
+ 	  for (contail = conditions; CONSP (contail);
+ 	       contail = XCONS (contail)->cdr)
+ 	    if (EQ (XCONS (tail)->car, XCONS (contail)->car))
+ 	      return 1;
+ 	}
+     }
+ 
+   return 0;
+ }
+ 
  /* Value of Qlambda means we have called debugger and user has continued.
     Store value returned from debugger into *DEBUGGER_VALUE_PTR.  */
*************** find_handler_clause (handlers, condition
*** 1280,1291 ****
  	   ? debug_on_quit
  	   : wants_debugger (Vdebug_on_error, conditions))
  	  && when_entered_debugger < num_nonmacro_input_chars)
  	{
  	  int count = specpdl_ptr - specpdl;
  	  specbind (Qdebug_on_error, Qnil);
! 	  *debugger_value_ptr =
! 	    call_debugger (Fcons (Qerror,
! 				  Fcons (Fcons (sig, data),
! 					 Qnil)));
  	  return unbind_to (count, Qlambda);
  	}
--- 1337,1349 ----
  	   ? debug_on_quit
  	   : wants_debugger (Vdebug_on_error, conditions))
+ 	  && ! skip_debugger (conditions, Fcons (sig, data))
  	  && when_entered_debugger < num_nonmacro_input_chars)
  	{
  	  int count = specpdl_ptr - specpdl;
  	  specbind (Qdebug_on_error, Qnil);
! 	  *debugger_value_ptr
! 	    = call_debugger (Fcons (Qerror,
! 				    Fcons (Fcons (sig, data),
! 					   Qnil)));
  	  return unbind_to (count, Qlambda);
  	}
*************** run_hook_with_args (nargs, args, cond)
*** 1926,1929 ****
--- 1984,1992 ----
    struct gcpro gcpro1, gcpro2;
  
+   /* If we are dying or still initializing,
+      don't do anything--it would probably crash if we tried.  */
+   if (NILP (Vrun_hooks))
+     return;
+ 
    sym = args[0];
    val = find_symbol_value (sym);
*************** Output stream used is value of `standard
*** 2713,2717 ****
  
  DEFUN ("backtrace-frame", Fbacktrace_frame, Sbacktrace_frame, 1, 1, "",
!   "Return the function and arguments N frames up from current execution point.\n\
  If that frame has not evaluated the arguments yet (or is a special form),\n\
  the value is (nil FUNCTION ARG-FORMS...).\n\
--- 2776,2780 ----
  
  DEFUN ("backtrace-frame", Fbacktrace_frame, Sbacktrace_frame, 1, 1, "",
!   "Return the function and arguments NFRAMES up from current execution point.\n\
  If that frame has not evaluated the arguments yet (or is a special form),\n\
  the value is (nil FUNCTION ARG-FORMS...).\n\
*************** A &rest arg is represented as the tail o
*** 2721,2725 ****
  FUNCTION is whatever was supplied as car of evaluated list,\n\
  or a lambda expression for macro calls.\n\
! If N is more than the number of frames, the value is nil.")
    (nframes)
       Lisp_Object nframes;
--- 2784,2788 ----
  FUNCTION is whatever was supplied as car of evaluated list,\n\
  or a lambda expression for macro calls.\n\
! If NFRAMES is more than the number of frames, the value is nil.")
    (nframes)
       Lisp_Object nframes;
*************** Typing C-g sets `quit-flag' non-nil, reg
*** 2770,2774 ****
      "Non-nil inhibits C-g quitting from happening immediately.\n\
  Note that `quit-flag' will still be set by typing C-g,\n\
! so a quit will be signalled as soon as `inhibit-quit' is nil.\n\
  To prevent this happening, set `quit-flag' to nil\n\
  before making `inhibit-quit' nil.");
--- 2833,2837 ----
      "Non-nil inhibits C-g quitting from happening immediately.\n\
  Note that `quit-flag' will still be set by typing C-g,\n\
! so a quit will be signaled as soon as `inhibit-quit' is nil.\n\
  To prevent this happening, set `quit-flag' to nil\n\
  before making `inhibit-quit' nil.");
*************** if one of its condition symbols appears 
*** 2821,2824 ****
--- 2884,2896 ----
  See also variable `debug-on-quit'.");
    Vdebug_on_error = Qnil;
+ 
+   DEFVAR_LISP ("debug-ignored-errors", &Vdebug_ignored_errors,
+     "*List of errors for which the debugger should not be called.\n\
+ Each element may be a condition-name or a regexp that matches error messages.\n\
+ If any element applies to a given error, that error skips the debugger\n\
+ and just returns to top level.\n\
+ This overrides the variable `debug-on-error'.\n\
+ It does not apply to errors handled by `condition-case'.");
+   Vdebug_ignored_errors = Qnil;
  
    DEFVAR_BOOL ("debug-on-quit", &debug_on_quit,
diff -2rcpP --exclude=*.elc emacs-19.30/src/fileio.c emacs-19.31/src/fileio.c
*** emacs-19.30/src/fileio.c	Tue Nov 14 12:30:12 1995
--- emacs-19.31/src/fileio.c	Wed May  1 19:23:17 1996
***************
*** 1,4 ****
  /* File IO for GNU Emacs.
!    Copyright (C) 1985, 86, 87, 88, 93, 94, 95 Free Software Foundation, Inc.
  
  This file is part of GNU Emacs.
--- 1,4 ----
  /* File IO for GNU Emacs.
!    Copyright (C) 1985,86,87,88,93,94,95,96 Free Software Foundation, Inc.
  
  This file is part of GNU Emacs.
*************** GNU General Public License for more deta
*** 16,20 ****
  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 <config.h>
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  #include <config.h>
*************** the Free Software Foundation, 675 Mass A
*** 44,47 ****
--- 45,52 ----
  #include "msdos.h"
  #include <sys/param.h>
+ #if __DJGPP__ >= 2
+ #include <fcntl.h>
+ #include <string.h>
+ #endif
  #endif
  
*************** extern char *strerror ();
*** 89,92 ****
--- 94,112 ----
  #endif /* not WINDOWSNT */
  
+ #ifdef DOS_NT
+ #define CORRECT_DIR_SEPS(s) \
+   do { if ('/' == DIRECTORY_SEP) dostounix_filename (s); \
+        else unixtodos_filename (s); \
+   } while (0)
+ /* On Windows, drive letters must be alphabetic - on DOS, the Netware
+    redirector allows the six letters between 'Z' and 'a' as well. */
+ #ifdef MSDOS
+ #define IS_DRIVE(x) ((x) >= 'A' && (x) <= 'z')
+ #endif
+ #ifdef WINDOWSNT
+ #define IS_DRIVE(x) isalpha (x)
+ #endif
+ #endif
+ 
  #ifdef VMS
  #include <file.h>
*************** int auto_saving;
*** 125,129 ****
  int auto_save_mode_bits;
  
! /* Alist of elements (REGEXP . HANDLER) for file names 
     whose I/O is done with a special handler.  */
  Lisp_Object Vfile_name_handler_alist;
--- 145,149 ----
  int auto_save_mode_bits;
  
! /* Alist of elements (REGEXP . HANDLER) for file names
     whose I/O is done with a special handler.  */
  Lisp_Object Vfile_name_handler_alist;
*************** int insert_default_directory;
*** 156,159 ****
--- 176,183 ----
  int vms_stmlf_recfm;
  
+ /* On NT, specifies the directory separator character, used (eg.) when
+    expanding file names.  This can be bound to / or \. */
+ Lisp_Object Vdirectory_sep_char;
+ 
  /* These variables describe handlers that have "already" had a chance
     to handle the current operation.
*************** close_file_unwind (fd)
*** 199,203 ****
  
  restore_point_unwind (location)
!      Lisp_Object location; 
  {
    SET_PT (marker_position (location));
--- 223,227 ----
  
  restore_point_unwind (location)
!      Lisp_Object location;
  {
    SET_PT (marker_position (location));
*************** use the standard functions without calli
*** 284,294 ****
  DEFUN ("file-name-directory", Ffile_name_directory, Sfile_name_directory,
    1, 1, 0,
!   "Return the directory component in file name NAME.\n\
! Return nil if NAME does not include a directory.\n\
  Otherwise return a directory spec.\n\
  Given a Unix syntax file name, returns a string ending in slash;\n\
  on VMS, perhaps instead a string ending in `:', `]' or `>'.")
!   (file)
!      Lisp_Object file;
  {
    register unsigned char *beg;
--- 308,318 ----
  DEFUN ("file-name-directory", Ffile_name_directory, Sfile_name_directory,
    1, 1, 0,
!   "Return the directory component in file name FILENAME.\n\
! Return nil if FILENAME does not include a directory.\n\
  Otherwise return a directory spec.\n\
  Given a Unix syntax file name, returns a string ending in slash;\n\
  on VMS, perhaps instead a string ending in `:', `]' or `>'.")
!   (filename)
!      Lisp_Object filename;
  {
    register unsigned char *beg;
*************** on VMS, perhaps instead a string ending 
*** 296,317 ****
    Lisp_Object handler;
  
!   CHECK_STRING (file, 0);
  
    /* If the file name has special constructs in it,
       call the corresponding file handler.  */
!   handler = Ffind_file_name_handler (file, Qfile_name_directory);
    if (!NILP (handler))
!     return call2 (handler, Qfile_name_directory, file);
  
  #ifdef FILE_SYSTEM_CASE
!   file = FILE_SYSTEM_CASE (file);
  #endif
!   beg = XSTRING (file)->data;
!   p = beg + XSTRING (file)->size;
  
!   while (p != beg && !IS_ANY_SEP (p[-1])
  #ifdef VMS
  	 && p[-1] != ':' && p[-1] != ']' && p[-1] != '>'
  #endif /* VMS */
  	 ) p--;
  
--- 320,348 ----
    Lisp_Object handler;
  
!   CHECK_STRING (filename, 0);
  
    /* If the file name has special constructs in it,
       call the corresponding file handler.  */
!   handler = Ffind_file_name_handler (filename, Qfile_name_directory);
    if (!NILP (handler))
!     return call2 (handler, Qfile_name_directory, filename);
  
  #ifdef FILE_SYSTEM_CASE
!   filename = FILE_SYSTEM_CASE (filename);
! #endif
!   beg = XSTRING (filename)->data;
! #ifdef DOS_NT
!   beg = strcpy (alloca (strlen (beg) + 1), beg);
  #endif
!   p = beg + XSTRING (filename)->size;
  
!   while (p != beg && !IS_DIRECTORY_SEP (p[-1])
  #ifdef VMS
  	 && p[-1] != ':' && p[-1] != ']' && p[-1] != '>'
  #endif /* VMS */
+ #ifdef DOS_NT
+ 	 /* only recognise drive specifier at beginning */
+ 	 && !(p[-1] == ':' && p == beg + 2)
+ #endif
  	 ) p--;
  
*************** on VMS, perhaps instead a string ending 
*** 320,344 ****
  #ifdef DOS_NT
    /* Expansion of "c:" to drive and default directory.  */
-   /* (NT does the right thing.)  */
    if (p == beg + 2 && beg[1] == ':')
      {
-       int drive = (*beg) - 'a';
        /* MAXPATHLEN+1 is guaranteed to be enough space for getdefdir.  */
!       unsigned char *res = alloca (MAXPATHLEN + 5);
!       unsigned char *res1;
! #ifdef WINDOWSNT
!       res1 = res;
!       /* The NT version places the drive letter at the beginning already.  */
! #else /* not WINDOWSNT */
!       /* On MSDOG we must put the drive letter in by hand.  */
!       res1 = res + 2;
! #endif /* not WINDOWSNT */
!       if (getdefdir (drive + 1, res)) 
  	{
! #ifdef MSDOS
! 	  res[0] = drive + 'a';
! 	  res[1] = ':';
! #endif /* MSDOS */
! 	  if (IS_DIRECTORY_SEP (res[strlen (res) - 1]))
  	    strcat (res, "/");
  	  beg = res;
--- 351,361 ----
  #ifdef DOS_NT
    /* Expansion of "c:" to drive and default directory.  */
    if (p == beg + 2 && beg[1] == ':')
      {
        /* MAXPATHLEN+1 is guaranteed to be enough space for getdefdir.  */
!       unsigned char *res = alloca (MAXPATHLEN + 1);
!       if (getdefdir (toupper (*beg) - 'A' + 1, res))
  	{
! 	  if (!IS_DIRECTORY_SEP (res[strlen (res) - 1]))
  	    strcat (res, "/");
  	  beg = res;
*************** on VMS, perhaps instead a string ending 
*** 346,349 ****
--- 363,367 ----
  	}
      }
+   CORRECT_DIR_SEPS (beg);
  #endif /* DOS_NT */
    return make_string (beg, p - beg);
*************** on VMS, perhaps instead a string ending 
*** 352,380 ****
  DEFUN ("file-name-nondirectory", Ffile_name_nondirectory, Sfile_name_nondirectory,
    1, 1, 0,
!   "Return file name NAME sans its directory.\n\
  For example, in a Unix-syntax file name,\n\
  this is everything after the last slash,\n\
  or the entire name if it contains no slash.")
!   (file)
!      Lisp_Object file;
  {
    register unsigned char *beg, *p, *end;
    Lisp_Object handler;
  
!   CHECK_STRING (file, 0);
  
    /* If the file name has special constructs in it,
       call the corresponding file handler.  */
!   handler = Ffind_file_name_handler (file, Qfile_name_nondirectory);
    if (!NILP (handler))
!     return call2 (handler, Qfile_name_nondirectory, file);
  
!   beg = XSTRING (file)->data;
!   end = p = beg + XSTRING (file)->size;
  
!   while (p != beg && !IS_ANY_SEP (p[-1])
  #ifdef VMS
  	 && p[-1] != ':' && p[-1] != ']' && p[-1] != '>'
  #endif /* VMS */
  	 ) p--;
  
--- 370,402 ----
  DEFUN ("file-name-nondirectory", Ffile_name_nondirectory, Sfile_name_nondirectory,
    1, 1, 0,
!   "Return file name FILENAME sans its directory.\n\
  For example, in a Unix-syntax file name,\n\
  this is everything after the last slash,\n\
  or the entire name if it contains no slash.")
!   (filename)
!      Lisp_Object filename;
  {
    register unsigned char *beg, *p, *end;
    Lisp_Object handler;
  
!   CHECK_STRING (filename, 0);
  
    /* If the file name has special constructs in it,
       call the corresponding file handler.  */
!   handler = Ffind_file_name_handler (filename, Qfile_name_nondirectory);
    if (!NILP (handler))
!     return call2 (handler, Qfile_name_nondirectory, filename);
  
!   beg = XSTRING (filename)->data;
!   end = p = beg + XSTRING (filename)->size;
  
!   while (p != beg && !IS_DIRECTORY_SEP (p[-1])
  #ifdef VMS
  	 && p[-1] != ':' && p[-1] != ']' && p[-1] != '>'
  #endif /* VMS */
+ #ifdef DOS_NT
+ 	 /* only recognise drive specifier at beginning */
+ 	 && !(p[-1] == ':' && p == beg + 2)
+ #endif
  	 ) p--;
  
*************** file_name_as_directory (out, in)
*** 472,480 ****
  #else /* not VMS */
    /* For Unix syntax, Append a slash if necessary */
!   if (!IS_ANY_SEP (out[size]))
      {
        out[size + 1] = DIRECTORY_SEP;
        out[size + 2] = '\0';
      }
  #endif /* not VMS */
    return out;
--- 494,505 ----
  #else /* not VMS */
    /* For Unix syntax, Append a slash if necessary */
!   if (!IS_DIRECTORY_SEP (out[size]))
      {
        out[size + 1] = DIRECTORY_SEP;
        out[size + 2] = '\0';
      }
+ #ifdef DOS_NT
+   CORRECT_DIR_SEPS (out);
+ #endif
  #endif /* not VMS */
    return out;
*************** On VMS, converts \"[X]FOO.DIR\" to \"[X.
*** 515,519 ****
   *       xyzzy:[mukesh.emacs] => xyzzy:[mukesh]emacs.dir.1
   *       xyzzy:[mukesh] => xyzzy:[000000]mukesh.dir.1
!  * On UNIX, it's simple: just make sure there is a terminating /
  
   * Value is nonzero if the string output is different from the input.
--- 540,544 ----
   *       xyzzy:[mukesh.emacs] => xyzzy:[mukesh]emacs.dir.1
   *       xyzzy:[mukesh] => xyzzy:[000000]mukesh.dir.1
!  * On UNIX, it's simple: just make sure there isn't a terminating /
  
   * Value is nonzero if the string output is different from the input.
*************** directory_file_name (src, dst)
*** 551,555 ****
  
        /* We call SYS$PARSE to handle such things as [--] for us. */
!       if (SYS$PARSE(&fab, 0, 0) == RMS$_NORMAL)
  	{
  	  slen = nam.nam$b_esl;
--- 576,580 ----
  
        /* We call SYS$PARSE to handle such things as [--] for us. */
!       if (SYS$PARSE (&fab, 0, 0) == RMS$_NORMAL)
  	{
  	  slen = nam.nam$b_esl;
*************** directory_file_name (src, dst)
*** 620,624 ****
  	  if (dst[slen - 1] == ':'
  	      && dst[slen - 2] != ':'   /* skip decnet nodes */
! 	      && strcmp(src + slen, "[000000]") == 0)
  	    {
  	      dst[slen - 1] = '\0';
--- 645,649 ----
  	  if (dst[slen - 1] == ':'
  	      && dst[slen - 2] != ':'   /* skip decnet nodes */
! 	      && strcmp (src + slen, "[000000]") == 0)
  	    {
  	      dst[slen - 1] = '\0';
*************** directory_file_name (src, dst)
*** 657,661 ****
      dst[slen - 1] = 0;
  #else
!   if (slen > 1 
        && IS_DIRECTORY_SEP (dst[slen - 1])
  #ifdef DOS_NT
--- 682,686 ----
      dst[slen - 1] = 0;
  #else
!   if (slen > 1
        && IS_DIRECTORY_SEP (dst[slen - 1])
  #ifdef DOS_NT
*************** directory_file_name (src, dst)
*** 665,668 ****
--- 690,696 ----
      dst[slen - 1] = 0;
  #endif
+ #ifdef DOS_NT
+   CORRECT_DIR_SEPS (dst);
+ #endif
    return 1;
  }
*************** directory_file_name (src, dst)
*** 670,675 ****
  DEFUN ("directory-file-name", Fdirectory_file_name, Sdirectory_file_name,
    1, 1, 0,
!   "Returns the file name of the directory named DIR.\n\
! This is the name of the file that holds the data for the directory DIR.\n\
  This operation exists because a directory is also a file, but its name as\n\
  a directory is different from its name as a file.\n\
--- 698,703 ----
  DEFUN ("directory-file-name", Fdirectory_file_name, Sdirectory_file_name,
    1, 1, 0,
!   "Returns the file name of the directory named DIRECTORY.\n\
! This is the name of the file that holds the data for the directory DIRECTORY.\n\
  This operation exists because a directory is also a file, but its name as\n\
  a directory is different from its name as a file.\n\
*************** so there is no danger of generating a na
*** 714,739 ****
  {
    Lisp_Object val;
    val = concat2 (prefix, build_string ("XXXXXX"));
    mktemp (XSTRING (val)->data);
    return val;
  }
  
  DEFUN ("expand-file-name", Fexpand_file_name, Sexpand_file_name, 1, 2, 0,
!   "Convert FILENAME to absolute, and canonicalize it.\n\
! Second arg DEFAULT is directory to start with if FILENAME is relative\n\
!  (does not start with slash); if DEFAULT is nil or missing,\n\
  the current buffer's value of default-directory is used.\n\
! Path components that are `.' are removed, and \n\
! path components followed by `..' are removed, along with the `..' itself;\n\
  note that these simplifications are done without checking the resulting\n\
! paths in the file system.\n\
  An initial `~/' expands to your home directory.\n\
  An initial `~USER/' expands to USER's home directory.\n\
  See also the function `substitute-in-file-name'.")
!      (name, defalt)
!      Lisp_Object name, defalt;
  {
    unsigned char *nm;
!   
    register unsigned char *newdir, *p, *o;
    int tlen;
--- 742,776 ----
  {
    Lisp_Object val;
+ #ifdef MSDOS
+   /* Don't use too many characters of the restricted 8+3 DOS
+      filename space.  */
+   val = concat2 (prefix, build_string ("a.XXX"));
+ #else
    val = concat2 (prefix, build_string ("XXXXXX"));
+ #endif
    mktemp (XSTRING (val)->data);
+ #ifdef DOS_NT
+   CORRECT_DIR_SEPS (XSTRING (val)->data);
+ #endif
    return val;
  }
  
  DEFUN ("expand-file-name", Fexpand_file_name, Sexpand_file_name, 1, 2, 0,
!   "Convert filename NAME to absolute, and canonicalize it.\n\
! Second arg DEFAULT-DIRECTORY is directory to start with if NAME is relative\n\
!  (does not start with slash); if DEFAULT-DIRECTORY is nil or missing,\n\
  the current buffer's value of default-directory is used.\n\
! File name components that are `.' are removed, and \n\
! so are file name components followed by `..', along with the `..' itself;\n\
  note that these simplifications are done without checking the resulting\n\
! file names in the file system.\n\
  An initial `~/' expands to your home directory.\n\
  An initial `~USER/' expands to USER's home directory.\n\
  See also the function `substitute-in-file-name'.")
!      (name, default_directory)
!      Lisp_Object name, default_directory;
  {
    unsigned char *nm;
! 
    register unsigned char *newdir, *p, *o;
    int tlen;
*************** See also the function `substitute-in-fil
*** 749,759 ****
  #endif /* VMS */
  #ifdef DOS_NT
!   /* Demacs 1.1.2 91/10/20 Manabu Higashida */
!   int drive = -1;
!   int relpath = 0;
!   unsigned char *tmp, *defdir;
  #endif /* DOS_NT */
    Lisp_Object handler;
!   
    CHECK_STRING (name, 0);
  
--- 786,795 ----
  #endif /* VMS */
  #ifdef DOS_NT
!   int drive = 0;
!   int collapse_newdir = 1;
  #endif /* DOS_NT */
+   int length;
    Lisp_Object handler;
! 
    CHECK_STRING (name, 0);
  
*************** See also the function `substitute-in-fil
*** 762,784 ****
    handler = Ffind_file_name_handler (name, Qexpand_file_name);
    if (!NILP (handler))
!     return call3 (handler, Qexpand_file_name, name, defalt);
  
!   /* Use the buffer's default-directory if DEFALT is omitted.  */
!   if (NILP (defalt))
!     defalt = current_buffer->directory;
!   CHECK_STRING (defalt, 1);
  
!   if (!NILP (defalt))
      {
!       handler = Ffind_file_name_handler (defalt, Qexpand_file_name);
        if (!NILP (handler))
! 	return call3 (handler, Qexpand_file_name, name, defalt);
      }
  
!   o = XSTRING (defalt)->data;
  
!   /* Make sure DEFALT is properly expanded.
       It would be better to do this down below where we actually use
!      defalt.  Unfortunately, calling Fexpand_file_name recursively
       could invoke GC, and the strings might be relocated.  This would
       be annoying because we have pointers into strings lying around
--- 798,820 ----
    handler = Ffind_file_name_handler (name, Qexpand_file_name);
    if (!NILP (handler))
!     return call3 (handler, Qexpand_file_name, name, default_directory);
  
!   /* Use the buffer's default-directory if DEFAULT_DIRECTORY is omitted.  */
!   if (NILP (default_directory))
!     default_directory = current_buffer->directory;
!   CHECK_STRING (default_directory, 1);
  
!   if (!NILP (default_directory))
      {
!       handler = Ffind_file_name_handler (default_directory, Qexpand_file_name);
        if (!NILP (handler))
! 	return call3 (handler, Qexpand_file_name, name, default_directory);
      }
  
!   o = XSTRING (default_directory)->data;
  
!   /* Make sure DEFAULT_DIRECTORY is properly expanded.
       It would be better to do this down below where we actually use
!      default_directory.  Unfortunately, calling Fexpand_file_name recursively
       could invoke GC, and the strings might be relocated.  This would
       be annoying because we have pointers into strings lying around
*************** See also the function `substitute-in-fil
*** 788,801 ****
  
       The EQ test avoids infinite recursion.  */
!   if (! NILP (defalt) && !EQ (defalt, name)
!       /* This saves time in a common case.  */
!       && ! (XSTRING (defalt)->size >= 3
! 	    && IS_DIRECTORY_SEP (XSTRING (defalt)->data[0])
! 	    && IS_DEVICE_SEP (XSTRING (defalt)->data[1])))
      {
        struct gcpro gcpro1;
  
        GCPRO1 (name);
!       defalt = Fexpand_file_name (defalt, Qnil);
        UNGCPRO;
      }
--- 824,849 ----
  
       The EQ test avoids infinite recursion.  */
!   if (! NILP (default_directory) && !EQ (default_directory, name)
!       /* Save time in some common cases - as long as default_directory
! 	 is not relative, it can be canonicalized with name below (if it
! 	 is needed at all) without requiring it to be expanded now.  */
! #ifdef DOS_NT
!       /* Detect MSDOS file names with drive specifiers.  */
!       && ! (IS_DRIVE (o[0]) && (IS_DEVICE_SEP (o[1]) && IS_DIRECTORY_SEP (o[2])))
! #ifdef WINDOWSNT
!       /* Detect Windows file names in UNC format.  */
!       && ! (IS_DIRECTORY_SEP (o[0]) && IS_DIRECTORY_SEP (o[1]))
! #endif
! #else /* not DOS_NT */
!       /* Detect Unix absolute file names (/... alone is not absolute on
! 	 DOS or Windows).  */
!       && ! (IS_DIRECTORY_SEP (o[0]))
! #endif /* not DOS_NT */
!       )
      {
        struct gcpro gcpro1;
  
        GCPRO1 (name);
!       default_directory = Fexpand_file_name (default_directory, Qnil);
        UNGCPRO;
      }
*************** See also the function `substitute-in-fil
*** 810,836 ****
  
    nm = XSTRING (name)->data;
-   
- #ifdef MSDOS
-   /* First map all backslashes to slashes.  */
-   dostounix_filename (nm = strcpy (alloca (strlen (nm) + 1), nm));
- #endif
  
  #ifdef DOS_NT
!   /* Now strip drive name. */
    {
      unsigned char *colon = rindex (nm, ':');
      if (colon)
        if (nm == colon)
  	nm++;
!       else
  	{
  	  drive = colon[-1];
  	  nm = colon + 1;
! 	  if (!IS_DIRECTORY_SEP (*nm))
! 	    {
! 	      defdir = alloca (MAXPATHLEN + 1);
! 	      relpath = getdefdir (tolower (drive) - 'a' + 1, defdir);
! 	    }
! 	}       
    }
  #endif /* DOS_NT */
--- 858,893 ----
  
    nm = XSTRING (name)->data;
  
  #ifdef DOS_NT
!   /* We will force directory separators to be either all \ or /, so make
!      a local copy to modify, even if there ends up being no change. */
!   nm = strcpy (alloca (strlen (nm) + 1), nm);
! 
!   /* Find and remove drive specifier if present; this makes nm absolute
!      even if the rest of the name appears to be relative. */
    {
      unsigned char *colon = rindex (nm, ':');
+ 
      if (colon)
+       /* Only recognize colon as part of drive specifier if there is a
+ 	 single alphabetic character preceeding the colon (and if the
+ 	 character before the drive letter, if present, is a directory
+ 	 separator); this is to support the remote system syntax used by
+ 	 ange-ftp, and the "po:username" syntax for POP mailboxes. */
+     look_again:
        if (nm == colon)
  	nm++;
!       else if (IS_DRIVE (colon[-1])
! 	       && (colon == nm + 1 || IS_DIRECTORY_SEP (colon[-2])))
  	{
  	  drive = colon[-1];
  	  nm = colon + 1;
! 	}
!       else
! 	{
! 	  while (--colon >= nm)
! 	    if (colon[0] == ':')
! 	      goto look_again;
! 	}
    }
  #endif /* DOS_NT */
*************** See also the function `substitute-in-fil
*** 841,852 ****
    while (*p)
      {
!       /* Since we know the path is absolute, we can assume that each
! 	 element starts with a "/".  */
  
-       /* "//" anywhere isn't necessarily hairy; we just start afresh
- 	 with the second slash.  */
        if (IS_DIRECTORY_SEP (p[0]) && IS_DIRECTORY_SEP (p[1])
  #if defined (APOLLO) || defined (WINDOWSNT)
! 	  /* // at start of filename is meaningful on Apollo 
  	     and WindowsNT systems */
  	  && nm != p
--- 898,907 ----
    while (*p)
      {
!       /* Since we are expecting the name to be absolute, we can assume
! 	 that each element starts with a "/".  */
  
        if (IS_DIRECTORY_SEP (p[0]) && IS_DIRECTORY_SEP (p[1])
  #if defined (APOLLO) || defined (WINDOWSNT)
! 	  /* // at start of filename is meaningful on Apollo
  	     and WindowsNT systems */
  	  && nm != p
*************** See also the function `substitute-in-fil
*** 855,859 ****
  	nm = p + 1;
  
-       /* "~" is hairy as the start of any path element.  */
        if (IS_DIRECTORY_SEP (p[0]) && p[1] == '~')
  	nm = p + 1;
--- 910,913 ----
*************** See also the function `substitute-in-fil
*** 862,869 ****
      }
  
!   /* If nm is absolute, flush ...// and detect /./ and /../.
!      If no /./ or /../ we can return right away. */
    if (
        IS_DIRECTORY_SEP (nm[0])
  #ifdef VMS
        || index (nm, ':')
--- 916,938 ----
      }
  
! #ifdef WINDOWSNT
!   /* Discard any previous drive specifier if nm is now in UNC format. */
!   if (IS_DIRECTORY_SEP (nm[0]) && IS_DIRECTORY_SEP (nm[1]))
!     {
!       drive = 0;
!     }
! #endif
! 
!   /* If nm is absolute, look for /./ or /../ sequences; if none are
!      found, we can probably return right away.  We will avoid allocating
!      a new string if name is already fully expanded.  */
    if (
        IS_DIRECTORY_SEP (nm[0])
+ #ifdef MSDOS
+       && drive
+ #endif
+ #ifdef WINDOWSNT
+       && (drive || IS_DIRECTORY_SEP (nm[1]))
+ #endif
  #ifdef VMS
        || index (nm, ':')
*************** See also the function `substitute-in-fil
*** 882,886 ****
        while (*p)
  	{
! 	  /* Since we know the path is absolute, we can assume that each
  	     element starts with a "/".  */
  
--- 951,955 ----
        while (*p)
  	{
! 	  /* Since we know the name is absolute, we can assume that each
  	     element starts with a "/".  */
  
*************** See also the function `substitute-in-fil
*** 942,946 ****
  		brack = 0;
  	      }
! 	    /* if /pathname/dev:, move nm to dev: */
  	    else if (slash)
  	      nm = slash + 1;
--- 1011,1015 ----
  		brack = 0;
  	      }
! 	    /* if /name/dev:, move nm to dev: */
  	    else if (slash)
  	      nm = slash + 1;
*************** See also the function `substitute-in-fil
*** 974,978 ****
  	    return build_string (sys_translate_unix (nm));
  #endif /* VMS */
! #ifndef DOS_NT
  	  if (nm == XSTRING (name)->data)
  	    return name;
--- 1043,1068 ----
  	    return build_string (sys_translate_unix (nm));
  #endif /* VMS */
! #ifdef DOS_NT
! 	  /* Make sure directories are all separated with / or \ as
! 	     desired, but avoid allocation of a new string when not
! 	     required. */
! 	  CORRECT_DIR_SEPS (nm);
! #ifdef WINDOWSNT
! 	  if (IS_DIRECTORY_SEP (nm[1]))
! 	    {
! 	      if (strcmp (nm, XSTRING (name)->data) != 0)
! 		name = build_string (nm);
! 	    }
! 	  else
! #endif
! 	  /* drive must be set, so this is okay */
! 	  if (strcmp (nm - 2, XSTRING (name)->data) != 0)
! 	    {
! 	      name = make_string (nm - 2, p - nm + 2);
! 	      XSTRING (name)->data[0] = drive;
! 	      XSTRING (name)->data[1] = ':';
! 	    }
! 	  return name;
! #else /* not DOS_NT */
  	  if (nm == XSTRING (name)->data)
  	    return name;
*************** See also the function `substitute-in-fil
*** 982,986 ****
      }
  
!   /* Now determine directory to start with and put it in newdir */
  
    newdir = 0;
--- 1072,1090 ----
      }
  
!   /* At this point, nm might or might not be an absolute file name.  We
!      need to expand ~ or ~user if present, otherwise prefix nm with
!      default_directory if nm is not absolute, and finally collapse /./
!      and /foo/../ sequences.
! 
!      We set newdir to be the appropriate prefix if one is needed:
!        - the relevant user directory if nm starts with ~ or ~user
!        - the specified drive's working dir (DOS/NT only) if nm does not
!          start with /
!        - the value of default_directory.
! 
!      Note that these prefixes are not guaranteed to be absolute (except
!      for the working dir of a drive).  Therefore, to ensure we always
!      return an absolute name, if the final prefix is not absolute we
!      append it to the current working directory.  */
  
    newdir = 0;
*************** See also the function `substitute-in-fil
*** 996,1007 ****
  	  if (!(newdir = (unsigned char *) egetenv ("HOME")))
  	    newdir = (unsigned char *) "";
  #ifdef DOS_NT
!  	  /* Problem when expanding "~\" if HOME is not on current drive.
!  	     Ulrich Leodolter, Wed Jan 11 10:20:35 1995 */
!  	  if (newdir[1] == ':')
!  	    drive = newdir[0];
! 	  dostounix_filename (newdir);
  #endif
- 	  nm++;
  #ifdef VMS
  	  nm++;			/* Don't leave the slash in nm.  */
--- 1100,1107 ----
  	  if (!(newdir = (unsigned char *) egetenv ("HOME")))
  	    newdir = (unsigned char *) "";
+ 	  nm++;
  #ifdef DOS_NT
! 	  collapse_newdir = 0;
  #endif
  #ifdef VMS
  	  nm++;			/* Don't leave the slash in nm.  */
*************** See also the function `substitute-in-fil
*** 1019,1026 ****
  	  o [p - nm] = 0;
  
- #ifdef  WINDOWSNT
- 	  newdir = (unsigned char *) egetenv ("HOME");
- 	  dostounix_filename (newdir);
- #else  /* not WINDOWSNT */
  	  pw = (struct passwd *) getpwnam (o + 1);
  	  if (pw)
--- 1119,1122 ----
*************** See also the function `substitute-in-fil
*** 1031,1037 ****
  #else
  	      nm = p;
  #endif /* VMS */
  	    }
- #endif /* not WINDOWSNT */
  
  	  /* If we don't find a user of that name, leave the name
--- 1127,1135 ----
  #else
  	      nm = p;
+ #ifdef DOS_NT
+ 	      collapse_newdir = 0;
+ #endif
  #endif /* VMS */
  	    }
  
  	  /* If we don't find a user of that name, leave the name
*************** See also the function `substitute-in-fil
*** 1040,1069 ****
      }
  
-   if (!IS_ANY_SEP (nm[0])
- #ifdef VMS
-       && !index (nm, ':')
- #endif /* not VMS */
  #ifdef DOS_NT
!       && drive == -1
  #endif /* DOS_NT */
        && !newdir)
      {
!       newdir = XSTRING (defalt)->data;
      }
  
  #ifdef DOS_NT
!   if (newdir == 0 && relpath)
!     newdir = defdir; 
  #endif /* DOS_NT */
!   if (newdir != 0)
      {
        /* Get rid of any slash at the end of newdir.  */
!       int length = strlen (newdir);
!       /* Adding `length > 1 &&' makes ~ expand into / when homedir
! 	 is the root dir.  People disagree about whether that is right.
! 	 Anyway, we can't take the risk of this change now.  */
! #ifdef DOS_NT
!       if (newdir[1] != ':' && length > 1)
! #endif
        if (IS_DIRECTORY_SEP (newdir[length - 1]))
  	{
--- 1138,1258 ----
      }
  
  #ifdef DOS_NT
!   /* On DOS and Windows, nm is absolute if a drive name was specified;
!      use the drive's current directory as the prefix if needed.  */
!   if (!newdir && drive)
!     {
!       /* Get default directory if needed to make nm absolute. */
!       if (!IS_DIRECTORY_SEP (nm[0]))
! 	{
! 	  newdir = alloca (MAXPATHLEN + 1);
! 	  if (!getdefdir (toupper (drive) - 'A' + 1, newdir))
! 	    newdir = NULL;
! 	}
!       if (!newdir)
! 	{
! 	  /* Either nm starts with /, or drive isn't mounted. */
! 	  newdir = alloca (4);
! 	  newdir[0] = drive;
! 	  newdir[1] = ':';
! 	  newdir[2] = '/';
! 	  newdir[3] = 0;
! 	}
!     }
  #endif /* DOS_NT */
+ 
+   /* Finally, if no prefix has been specified and nm is not absolute,
+      then it must be expanded relative to default_directory. */
+ 
+   if (1
+ #ifndef DOS_NT
+       /* /... alone is not absolute on DOS and Windows. */
+       && !IS_DIRECTORY_SEP (nm[0])
+ #endif
+ #ifdef WINDOWSNT
+       && !(IS_DIRECTORY_SEP (nm[0]) && IS_DIRECTORY_SEP (nm[1]))
+ #endif
+ #ifdef VMS
+       && !index (nm, ':')
+ #endif
        && !newdir)
      {
!       newdir = XSTRING (default_directory)->data;
      }
  
  #ifdef DOS_NT
!   if (newdir)
!     {
!       /* First ensure newdir is an absolute name. */
!       if (
! 	  /* Detect MSDOS file names with drive specifiers.  */
! 	  ! (IS_DRIVE (newdir[0])
! 	     && IS_DEVICE_SEP (newdir[1]) && IS_DIRECTORY_SEP (newdir[2]))
! #ifdef WINDOWSNT
! 	  /* Detect Windows file names in UNC format.  */
! 	  && ! (IS_DIRECTORY_SEP (newdir[0]) && IS_DIRECTORY_SEP (newdir[1]))
! #endif
! 	  )
! 	{
! 	  /* Effectively, let newdir be (expand-file-name newdir cwd).
! 	     Because of the admonition against calling expand-file-name
! 	     when we have pointers into lisp strings, we accomplish this
! 	     indirectly by prepending newdir to nm if necessary, and using
! 	     cwd (or the wd of newdir's drive) as the new newdir. */
! 
! 	  if (IS_DRIVE (newdir[0]) && newdir[1] == ':')
! 	    {
! 	      drive = newdir[0];
! 	      newdir += 2;
! 	    }
! 	  if (!IS_DIRECTORY_SEP (nm[0]))
! 	    {
! 	      char * tmp = alloca (strlen (newdir) + strlen (nm) + 2);
! 	      file_name_as_directory (tmp, newdir);
! 	      strcat (tmp, nm);
! 	      nm = tmp;
! 	    }
! 	  newdir = alloca (MAXPATHLEN + 1);
! 	  if (drive)
! 	    {
! 	      if (!getdefdir (toupper (drive) - 'A' + 1, newdir))
! 		newdir = "/";
! 	    }
! 	  else
! 	    getwd (newdir);
! 	}
! 
!       /* Strip off drive name from prefix, if present. */
!       if (IS_DRIVE (newdir[0]) && newdir[1] == ':')
! 	{
! 	  drive = newdir[0];
! 	  newdir += 2;
! 	}
! 
!       /* Keep only a prefix from newdir if nm starts with slash
!          (//server/share for UNC, nothing otherwise). */
!       if (IS_DIRECTORY_SEP (nm[0]) && collapse_newdir)
! 	{
! #ifdef WINDOWSNT
! 	  if (IS_DIRECTORY_SEP (newdir[0]) && IS_DIRECTORY_SEP (newdir[1]))
! 	    {
! 	      newdir = strcpy (alloca (strlen (newdir) + 1), newdir);
! 	      p = newdir + 2;
! 	      while (*p && !IS_DIRECTORY_SEP (*p)) p++;
! 	      p++;
! 	      while (*p && !IS_DIRECTORY_SEP (*p)) p++;
! 	      *p = 0;
! 	    }
! 	  else
! #endif
! 	    newdir = "";
! 	}
!     }
  #endif /* DOS_NT */
! 
!   if (newdir)
      {
        /* Get rid of any slash at the end of newdir.  */
!       length = strlen (newdir);
        if (IS_DIRECTORY_SEP (newdir[length - 1]))
  	{
*************** See also the function `substitute-in-fil
*** 1081,1085 ****
    tlen += strlen (nm) + 1;
  #ifdef DOS_NT
!   /* Add reserved space for drive name.  (The Microsoft x86 compiler 
       produces incorrect code if the following two lines are combined.)  */
    target = (unsigned char *) alloca (tlen + 2);
--- 1270,1274 ----
    tlen += strlen (nm) + 1;
  #ifdef DOS_NT
!   /* Add reserved space for drive name.  (The Microsoft x86 compiler
       produces incorrect code if the following two lines are combined.)  */
    target = (unsigned char *) alloca (tlen + 2);
*************** See also the function `substitute-in-fil
*** 1106,1109 ****
--- 1295,1300 ----
  #endif /* VMS */
  
+   /* ASSERT (IS_DIRECTORY_SEP (target[0])) if not VMS */
+ 
    /* Now canonicalize by removing /. and /foo/.. if they appear.  */
  
*************** See also the function `substitute-in-fil
*** 1161,1168 ****
        else if (IS_DIRECTORY_SEP (p[0]) && IS_DIRECTORY_SEP (p[1])
  #if defined (APOLLO) || defined (WINDOWSNT)
! 	       /* // at start of filename is meaningful in Apollo 
  		  and WindowsNT systems */
  	       && o != target
! #endif /* APOLLO */
  	       )
  	{
--- 1352,1359 ----
        else if (IS_DIRECTORY_SEP (p[0]) && IS_DIRECTORY_SEP (p[1])
  #if defined (APOLLO) || defined (WINDOWSNT)
! 	       /* // at start of filename is meaningful in Apollo
  		  and WindowsNT systems */
  	       && o != target
! #endif /* APOLLO || WINDOWSNT */
  	       )
  	{
*************** See also the function `substitute-in-fil
*** 1188,1199 ****
  	  while (o != target && (--o) && !IS_DIRECTORY_SEP (*o))
  	    ;
- #if defined (APOLLO) || defined (WINDOWSNT)
- 	  if (o == target + 1 
- 	      && IS_DIRECTORY_SEP (o[-1]) && IS_DIRECTORY_SEP (o[0]))
- 	    ++o;
- 	  else
- #endif /* APOLLO || WINDOWSNT */
- 	  if (o == target && IS_ANY_SEP (*o))
- 	    ++o;
  	  p += 3;
  	}
--- 1379,1382 ----
*************** See also the function `substitute-in-fil
*** 1206,1221 ****
  
  #ifdef DOS_NT
!   /* at last, set drive name. */
!   if (target[1] != ':'
  #ifdef WINDOWSNT
!       /* Allow network paths that look like "\\foo" */
!       && !(IS_DIRECTORY_SEP (target[0]) && IS_DIRECTORY_SEP (target[1]))
  #endif /* WINDOWSNT */
-       )
      {
        target -= 2;
!       target[0] = (drive < 0 ? getdisk () + 'A' : drive);
        target[1] = ':';
      }
  #endif /* DOS_NT */
  
--- 1389,1404 ----
  
  #ifdef DOS_NT
!   /* At last, set drive name. */
  #ifdef WINDOWSNT
!   /* Except for network file name.  */
!   if (!(IS_DIRECTORY_SEP (target[0]) && IS_DIRECTORY_SEP (target[1])))
  #endif /* WINDOWSNT */
      {
+       if (!drive) abort ();
        target -= 2;
!       target[0] = drive;
        target[1] = ':';
      }
+   CORRECT_DIR_SEPS (target);
  #endif /* DOS_NT */
  
*************** See also the function `substitute-in-fil
*** 1237,1241 ****
  {
    unsigned char *nm;
!   
    register unsigned char *newdir, *p, *o;
    int tlen;
--- 1420,1424 ----
  {
    unsigned char *nm;
! 
    register unsigned char *newdir, *p, *o;
    int tlen;
*************** See also the function `substitute-in-fil
*** 1251,1255 ****
    int dots = 0;
  #endif /* VMS */
!   
    CHECK_STRING (name, 0);
  
--- 1434,1438 ----
    int dots = 0;
  #endif /* VMS */
! 
    CHECK_STRING (name, 0);
  
*************** See also the function `substitute-in-fil
*** 1260,1264 ****
  
    nm = XSTRING (name)->data;
!   
    /* If nm is absolute, flush ...// and detect /./ and /../.
       If no /./ or /../ we can return right away. */
--- 1443,1447 ----
  
    nm = XSTRING (name)->data;
! 
    /* If nm is absolute, flush ...// and detect /./ and /../.
       If no /./ or /../ we can return right away. */
*************** See also the function `substitute-in-fil
*** 1336,1346 ****
  		brack = 0;
  	      }
! 	    /* if /pathname/dev:, move nm to dev: */
  	    else if (slash)
  	      nm = slash + 1;
! 	    /* if node::dev:, move colon following dev */
  	    else if (colon && colon[-1] == ':')
  	      colon = p;
! 	    /* if dev1:dev2:, move nm to dev2: */
  	    else if (colon && colon[-1] != ':')
  	      {
--- 1519,1529 ----
  		brack = 0;
  	      }
! 	    /* If /name/dev:, move nm to dev: */
  	    else if (slash)
  	      nm = slash + 1;
! 	    /* If node::dev:, move colon following dev */
  	    else if (colon && colon[-1] == ':')
  	      colon = p;
! 	    /* If dev1:dev2:, move nm to dev2: */
  	    else if (colon && colon[-1] != ':')
  	      {
*************** If `/~' appears, all of FILENAME through
*** 1557,1562 ****
  On VMS, `$' substitution is not done; this function does little and only\n\
  duplicates what `expand-file-name' does.")
!   (string)
!      Lisp_Object string;
  {
    unsigned char *nm;
--- 1740,1745 ----
  On VMS, `$' substitution is not done; this function does little and only\n\
  duplicates what `expand-file-name' does.")
!   (filename)
!      Lisp_Object filename;
  {
    unsigned char *nm;
*************** duplicates what `expand-file-name' does.
*** 1569,1586 ****
    Lisp_Object handler;
  
!   CHECK_STRING (string, 0);
  
    /* If the file name has special constructs in it,
       call the corresponding file handler.  */
!   handler = Ffind_file_name_handler (string, Qsubstitute_in_file_name);
    if (!NILP (handler))
!     return call2 (handler, Qsubstitute_in_file_name, string);
  
!   nm = XSTRING (string)->data;
! #ifdef MSDOS
!   dostounix_filename (nm = strcpy (alloca (strlen (nm) + 1), nm));
!   substituted = !strcmp (nm, XSTRING (string)->data);
  #endif
!   endp = nm + XSTRING (string)->size;
  
    /* If /~ or // appears, discard everything through first slash. */
--- 1752,1770 ----
    Lisp_Object handler;
  
!   CHECK_STRING (filename, 0);
  
    /* If the file name has special constructs in it,
       call the corresponding file handler.  */
!   handler = Ffind_file_name_handler (filename, Qsubstitute_in_file_name);
    if (!NILP (handler))
!     return call2 (handler, Qsubstitute_in_file_name, filename);
  
!   nm = XSTRING (filename)->data;
! #ifdef DOS_NT
!   nm = strcpy (alloca (strlen (nm) + 1), nm);
!   CORRECT_DIR_SEPS (nm);
!   substituted = (strcmp (nm, XSTRING (filename)->data) != 0);
  #endif
!   endp = nm + XSTRING (filename)->size;
  
    /* If /~ or // appears, discard everything through first slash. */
*************** duplicates what `expand-file-name' does.
*** 1588,1602 ****
    for (p = nm; p != endp; p++)
      {
!       if ((p[0] == '~' ||
! #ifdef APOLLO
! 	   /* // at start of file name is meaningful in Apollo system */
! 	   (p[0] == '/' && p - 1 != nm)
! #else /* not APOLLO */
! #ifdef WINDOWSNT
! 	   (IS_DIRECTORY_SEP (p[0]) && p - 1 != nm)
! #else /* not WINDOWSNT */
! 	   p[0] == '/'
! #endif /* not WINDOWSNT */
! #endif /* not APOLLO */
  	   )
  	  && p != nm
--- 1772,1783 ----
    for (p = nm; p != endp; p++)
      {
!       if ((p[0] == '~'
! #if defined (APOLLO) || defined (WINDOWSNT)
! 	   /* // at start of file name is meaningful in Apollo and
! 	      WindowsNT systems */
! 	   || (IS_DIRECTORY_SEP (p[0]) && p - 1 != nm)
! #else /* not (APOLLO || WINDOWSNT) */
! 	   || IS_DIRECTORY_SEP (p[0])
! #endif /* not (APOLLO || WINDOWSNT) */
  	   )
  	  && p != nm
*************** duplicates what `expand-file-name' does.
*** 1611,1615 ****
  	}
  #ifdef DOS_NT
!       if (p[0] && p[1] == ':')
  	{
  	  nm = p;
--- 1792,1798 ----
  	}
  #ifdef DOS_NT
!       /* see comment in expand-file-name about drive specifiers */
!       else if (IS_DRIVE (p[0]) && p[1] == ':'
! 	       && p > nm && IS_DIRECTORY_SEP (p[-1]))
  	{
  	  nm = p;
*************** duplicates what `expand-file-name' does.
*** 1672,1680 ****
  
    if (!substituted)
!     return string;
  
    /* If substitution required, recopy the string and do it */
    /* Make space in stack frame for the new copy */
!   xnm = (unsigned char *) alloca (XSTRING (string)->size + total + 1);
    x = xnm;
  
--- 1855,1863 ----
  
    if (!substituted)
!     return filename;
  
    /* If substitution required, recopy the string and do it */
    /* Make space in stack frame for the new copy */
!   xnm = (unsigned char *) alloca (XSTRING (filename)->size + total + 1);
    x = xnm;
  
*************** duplicates what `expand-file-name' does.
*** 1730,1749 ****
    for (p = xnm; p != x; p++)
      if ((p[0] == '~'
! #ifdef APOLLO
! 	 /* // at start of file name is meaningful in Apollo system */
! 	 || (p[0] == '/' && p - 1 != xnm)
! #else /* not APOLLO */
! #ifdef WINDOWSNT
  	 || (IS_DIRECTORY_SEP (p[0]) && p - 1 != xnm)
! #else /* not WINDOWSNT */
! 	 || p[0] == '/'
! #endif /* not WINDOWSNT */
! #endif /* not APOLLO */
  	 )
  	&& p != nm && IS_DIRECTORY_SEP (p[-1]))
        xnm = p;
  #ifdef DOS_NT
!     else if (p[0] && p[1] == ':')
! 	xnm = p;
  #endif
  
--- 1913,1928 ----
    for (p = xnm; p != x; p++)
      if ((p[0] == '~'
! #if defined (APOLLO) || defined (WINDOWSNT)
  	 || (IS_DIRECTORY_SEP (p[0]) && p - 1 != xnm)
! #else /* not (APOLLO || WINDOWSNT) */
! 	 || IS_DIRECTORY_SEP (p[0])
! #endif /* not (APOLLO || WINDOWSNT) */
  	 )
  	&& p != nm && IS_DIRECTORY_SEP (p[-1]))
        xnm = p;
  #ifdef DOS_NT
!     else if (IS_DRIVE (p[0]) && p[1] == ':'
! 	     && p > nm && IS_DIRECTORY_SEP (p[-1]))
!       xnm = p;
  #endif
  
*************** expand_and_dir_to_file (filename, defdir
*** 1768,1790 ****
       Lisp_Object filename, defdir;
  {
!   register Lisp_Object abspath;
  
!   abspath = Fexpand_file_name (filename, defdir);
  #ifdef VMS
    {
!     register int c = XSTRING (abspath)->data[XSTRING (abspath)->size - 1];
      if (c == ':' || c == ']' || c == '>')
!       abspath = Fdirectory_file_name (abspath);
    }
  #else
!   /* Remove final slash, if any (unless path is root).
       stat behaves differently depending!  */
!   if (XSTRING (abspath)->size > 1
!       && IS_DIRECTORY_SEP (XSTRING (abspath)->data[XSTRING (abspath)->size - 1])
!       && !IS_DEVICE_SEP (XSTRING (abspath)->data[XSTRING (abspath)->size-2]))
      /* We cannot take shortcuts; they might be wrong for magic file names.  */
!     abspath = Fdirectory_file_name (abspath);
  #endif
!   return abspath;
  }
  
--- 1947,1969 ----
       Lisp_Object filename, defdir;
  {
!   register Lisp_Object absname;
  
!   absname = Fexpand_file_name (filename, defdir);
  #ifdef VMS
    {
!     register int c = XSTRING (absname)->data[XSTRING (absname)->size - 1];
      if (c == ':' || c == ']' || c == '>')
!       absname = Fdirectory_file_name (absname);
    }
  #else
!   /* Remove final slash, if any (unless this is the root dir).
       stat behaves differently depending!  */
!   if (XSTRING (absname)->size > 1
!       && IS_DIRECTORY_SEP (XSTRING (absname)->data[XSTRING (absname)->size - 1])
!       && !IS_DEVICE_SEP (XSTRING (absname)->data[XSTRING (absname)->size-2]))
      /* We cannot take shortcuts; they might be wrong for magic file names.  */
!     absname = Fdirectory_file_name (absname);
  #endif
!   return absname;
  }
  
*************** Fourth arg KEEP-TIME non-nil means give 
*** 1845,1850 ****
  last-modified time as the old one.  (This works on only some systems.)\n\
  A prefix arg makes KEEP-TIME non-nil.")
!   (filename, newname, ok_if_already_exists, keep_date)
!      Lisp_Object filename, newname, ok_if_already_exists, keep_date;
  {
    int ifd, ofd, n;
--- 2024,2029 ----
  last-modified time as the old one.  (This works on only some systems.)\n\
  A prefix arg makes KEEP-TIME non-nil.")
!   (file, newname, ok_if_already_exists, keep_date)
!      Lisp_Object file, newname, ok_if_already_exists, keep_date;
  {
    int ifd, ofd, n;
*************** A prefix arg makes KEEP-TIME non-nil.")
*** 1856,1873 ****
    int input_file_statable_p;
  
!   GCPRO2 (filename, newname);
!   CHECK_STRING (filename, 0);
    CHECK_STRING (newname, 1);
!   filename = Fexpand_file_name (filename, Qnil);
    newname = Fexpand_file_name (newname, Qnil);
  
    /* If the input file name has special constructs in it,
       call the corresponding file handler.  */
!   handler = Ffind_file_name_handler (filename, Qcopy_file);
    /* Likewise for output file name.  */
    if (NILP (handler))
      handler = Ffind_file_name_handler (newname, Qcopy_file);
    if (!NILP (handler))
!     RETURN_UNGCPRO (call5 (handler, Qcopy_file, filename, newname,
  			   ok_if_already_exists, keep_date));
  
--- 2035,2052 ----
    int input_file_statable_p;
  
!   GCPRO2 (file, newname);
!   CHECK_STRING (file, 0);
    CHECK_STRING (newname, 1);
!   file = Fexpand_file_name (file, Qnil);
    newname = Fexpand_file_name (newname, Qnil);
  
    /* If the input file name has special constructs in it,
       call the corresponding file handler.  */
!   handler = Ffind_file_name_handler (file, Qcopy_file);
    /* Likewise for output file name.  */
    if (NILP (handler))
      handler = Ffind_file_name_handler (newname, Qcopy_file);
    if (!NILP (handler))
!     RETURN_UNGCPRO (call5 (handler, Qcopy_file, file, newname,
  			   ok_if_already_exists, keep_date));
  
*************** A prefix arg makes KEEP-TIME non-nil.")
*** 1879,1885 ****
      out_st.st_mode = 0;
  
!   ifd = open (XSTRING (filename)->data, O_RDONLY);
    if (ifd < 0)
!     report_file_error ("Opening input file", Fcons (filename, Qnil));
  
    record_unwind_protect (close_file_unwind, make_number (ifd));
--- 2058,2064 ----
      out_st.st_mode = 0;
  
!   ifd = open (XSTRING (file)->data, O_RDONLY);
    if (ifd < 0)
!     report_file_error ("Opening input file", Fcons (file, Qnil));
  
    record_unwind_protect (close_file_unwind, make_number (ifd));
*************** A prefix arg makes KEEP-TIME non-nil.")
*** 1889,1893 ****
    input_file_statable_p = (fstat (ifd, &st) >= 0);
  
! #ifndef DOS_NT
    if (out_st.st_mode != 0
        && st.st_dev == out_st.st_dev && st.st_ino == out_st.st_ino)
--- 2068,2072 ----
    input_file_statable_p = (fstat (ifd, &st) >= 0);
  
! #ifndef MSDOS
    if (out_st.st_mode != 0
        && st.st_dev == out_st.st_dev && st.st_ino == out_st.st_ino)
*************** A prefix arg makes KEEP-TIME non-nil.")
*** 1895,1899 ****
        errno = 0;
        report_file_error ("Input and output files are the same",
! 			 Fcons (filename, Fcons (newname, Qnil)));
      }
  #endif
--- 2074,2078 ----
        errno = 0;
        report_file_error ("Input and output files are the same",
! 			 Fcons (file, Fcons (newname, Qnil)));
      }
  #endif
*************** A prefix arg makes KEEP-TIME non-nil.")
*** 1908,1912 ****
  	  errno = EISDIR;
  #endif /* EISDIR */
! 	  report_file_error ("Non-regular file", Fcons (filename, Qnil));
  	}
      }
--- 2087,2091 ----
  	  errno = EISDIR;
  #endif /* EISDIR */
! 	  report_file_error ("Non-regular file", Fcons (file, Qnil));
  	}
      }
*************** A prefix arg makes KEEP-TIME non-nil.")
*** 1975,1993 ****
  DEFUN ("make-directory-internal", Fmake_directory_internal,
         Smake_directory_internal, 1, 1, 0,
!   "Create a directory.  One argument, a file name string.")
!   (dirname)
!      Lisp_Object dirname;
  {
    unsigned char *dir;
    Lisp_Object handler;
  
!   CHECK_STRING (dirname, 0);
!   dirname = Fexpand_file_name (dirname, Qnil);
  
!   handler = Ffind_file_name_handler (dirname, Qmake_directory_internal);
    if (!NILP (handler))
!     return call2 (handler, Qmake_directory_internal, dirname);
  
!   dir = XSTRING (dirname)->data;
  
  #ifdef WINDOWSNT
--- 2154,2172 ----
  DEFUN ("make-directory-internal", Fmake_directory_internal,
         Smake_directory_internal, 1, 1, 0,
!   "Create a new directory named DIRECTORY.")
!   (directory)
!      Lisp_Object directory;
  {
    unsigned char *dir;
    Lisp_Object handler;
  
!   CHECK_STRING (directory, 0);
!   directory = Fexpand_file_name (directory, Qnil);
  
!   handler = Ffind_file_name_handler (directory, Qmake_directory_internal);
    if (!NILP (handler))
!     return call2 (handler, Qmake_directory_internal, directory);
  
!   dir = XSTRING (directory)->data;
  
  #ifdef WINDOWSNT
*************** DEFUN ("make-directory-internal", Fmake_
*** 1996,2000 ****
    if (mkdir (dir, 0777) != 0)
  #endif
!     report_file_error ("Creating directory", Flist (1, &dirname));
  
    return Qnil;
--- 2175,2179 ----
    if (mkdir (dir, 0777) != 0)
  #endif
!     report_file_error ("Creating directory", Flist (1, &directory));
  
    return Qnil;
*************** DEFUN ("make-directory-internal", Fmake_
*** 2002,2022 ****
  
  DEFUN ("delete-directory", Fdelete_directory, Sdelete_directory, 1, 1, "FDelete directory: ",
!   "Delete a directory.  One argument, a file name or directory name string.")
!   (dirname)
!      Lisp_Object dirname;
  {
    unsigned char *dir;
    Lisp_Object handler;
  
!   CHECK_STRING (dirname, 0);
!   dirname = Fdirectory_file_name (Fexpand_file_name (dirname, Qnil));
!   dir = XSTRING (dirname)->data;
  
!   handler = Ffind_file_name_handler (dirname, Qdelete_directory);
    if (!NILP (handler))
!     return call2 (handler, Qdelete_directory, dirname);
  
    if (rmdir (dir) != 0)
!     report_file_error ("Removing directory", Flist (1, &dirname));
  
    return Qnil;
--- 2181,2201 ----
  
  DEFUN ("delete-directory", Fdelete_directory, Sdelete_directory, 1, 1, "FDelete directory: ",
!   "Delete the directory named DIRECTORY.")
!   (directory)
!      Lisp_Object directory;
  {
    unsigned char *dir;
    Lisp_Object handler;
  
!   CHECK_STRING (directory, 0);
!   directory = Fdirectory_file_name (Fexpand_file_name (directory, Qnil));
!   dir = XSTRING (directory)->data;
  
!   handler = Ffind_file_name_handler (directory, Qdelete_directory);
    if (!NILP (handler))
!     return call2 (handler, Qdelete_directory, directory);
  
    if (rmdir (dir) != 0)
!     report_file_error ("Removing directory", Flist (1, &directory));
  
    return Qnil;
*************** DEFUN ("delete-directory", Fdelete_direc
*** 2024,2028 ****
  
  DEFUN ("delete-file", Fdelete_file, Sdelete_file, 1, 1, "fDelete file: ",
!   "Delete specified file.  One argument, a file name string.\n\
  If file has multiple names, it continues to exist with the other names.")
    (filename)
--- 2203,2207 ----
  
  DEFUN ("delete-file", Fdelete_file, Sdelete_file, 1, 1, "fDelete file: ",
!   "Delete file named FILENAME.\n\
  If file has multiple names, it continues to exist with the other names.")
    (filename)
*************** unless optional third argument OK-IF-ALR
*** 2067,2072 ****
  A number as third arg means request confirmation if NEWNAME already exists.\n\
  This is what happens in interactive use with M-x.")
!   (filename, newname, ok_if_already_exists)
!      Lisp_Object filename, newname, ok_if_already_exists;
  {
  #ifdef NO_ARG_ARRAY
--- 2246,2251 ----
  A number as third arg means request confirmation if NEWNAME already exists.\n\
  This is what happens in interactive use with M-x.")
!   (file, newname, ok_if_already_exists)
!      Lisp_Object file, newname, ok_if_already_exists;
  {
  #ifdef NO_ARG_ARRAY
*************** This is what happens in interactive use 
*** 2076,2093 ****
    struct gcpro gcpro1, gcpro2;
  
!   GCPRO2 (filename, newname);
!   CHECK_STRING (filename, 0);
    CHECK_STRING (newname, 1);
!   filename = Fexpand_file_name (filename, Qnil);
    newname = Fexpand_file_name (newname, Qnil);
  
    /* If the file name has special constructs in it,
       call the corresponding file handler.  */
!   handler = Ffind_file_name_handler (filename, Qrename_file);
    if (NILP (handler))
      handler = Ffind_file_name_handler (newname, Qrename_file);
    if (!NILP (handler))
      RETURN_UNGCPRO (call4 (handler, Qrename_file,
! 			   filename, newname, ok_if_already_exists));
  
    if (NILP (ok_if_already_exists)
--- 2255,2272 ----
    struct gcpro gcpro1, gcpro2;
  
!   GCPRO2 (file, newname);
!   CHECK_STRING (file, 0);
    CHECK_STRING (newname, 1);
!   file = Fexpand_file_name (file, Qnil);
    newname = Fexpand_file_name (newname, Qnil);
  
    /* If the file name has special constructs in it,
       call the corresponding file handler.  */
!   handler = Ffind_file_name_handler (file, Qrename_file);
    if (NILP (handler))
      handler = Ffind_file_name_handler (newname, Qrename_file);
    if (!NILP (handler))
      RETURN_UNGCPRO (call4 (handler, Qrename_file,
! 			   file, newname, ok_if_already_exists));
  
    if (NILP (ok_if_already_exists)
*************** This is what happens in interactive use 
*** 2096,2132 ****
  				  INTEGERP (ok_if_already_exists), 0);
  #ifndef BSD4_1
!   if (0 > rename (XSTRING (filename)->data, XSTRING (newname)->data))
  #else
! #ifdef WINDOWSNT
!   if (!MoveFile (XSTRING (filename)->data, XSTRING (newname)->data))
! #else  /* not WINDOWSNT */
!   if (0 > link (XSTRING (filename)->data, XSTRING (newname)->data)
!       || 0 > unlink (XSTRING (filename)->data))
! #endif /* not WINDOWSNT */
  #endif
      {
- #ifdef  WINDOWSNT
-       /* Why two?  And why doesn't MS document what MoveFile will return?  */
-       if (GetLastError () == ERROR_FILE_EXISTS
- 	  || GetLastError () == ERROR_ALREADY_EXISTS)
- #else  /* not WINDOWSNT */
        if (errno == EXDEV)
- #endif /* not WINDOWSNT */
  	{
! 	  Fcopy_file (filename, newname,
  		      /* We have already prompted if it was an integer,
  			 so don't have copy-file prompt again.  */
  		      NILP (ok_if_already_exists) ? Qnil : Qt, Qt);
! 	  Fdelete_file (filename);
  	}
        else
  #ifdef NO_ARG_ARRAY
  	{
! 	  args[0] = filename;
  	  args[1] = newname;
  	  report_file_error ("Renaming", Flist (2, args));
  	}
  #else
! 	report_file_error ("Renaming", Flist (2, &filename));
  #endif
      }
--- 2275,2301 ----
  				  INTEGERP (ok_if_already_exists), 0);
  #ifndef BSD4_1
!   if (0 > rename (XSTRING (file)->data, XSTRING (newname)->data))
  #else
!   if (0 > link (XSTRING (file)->data, XSTRING (newname)->data)
!       || 0 > unlink (XSTRING (file)->data))
  #endif
      {
        if (errno == EXDEV)
  	{
! 	  Fcopy_file (file, newname,
  		      /* We have already prompted if it was an integer,
  			 so don't have copy-file prompt again.  */
  		      NILP (ok_if_already_exists) ? Qnil : Qt, Qt);
! 	  Fdelete_file (file);
  	}
        else
  #ifdef NO_ARG_ARRAY
  	{
! 	  args[0] = file;
  	  args[1] = newname;
  	  report_file_error ("Renaming", Flist (2, args));
  	}
  #else
! 	report_file_error ("Renaming", Flist (2, &file));
  #endif
      }
*************** unless optional third argument OK-IF-ALR
*** 2142,2147 ****
  A number as third arg means request confirmation if NEWNAME already exists.\n\
  This is what happens in interactive use with M-x.")
!   (filename, newname, ok_if_already_exists)
!      Lisp_Object filename, newname, ok_if_already_exists;
  {
  #ifdef NO_ARG_ARRAY
--- 2311,2316 ----
  A number as third arg means request confirmation if NEWNAME already exists.\n\
  This is what happens in interactive use with M-x.")
!   (file, newname, ok_if_already_exists)
!      Lisp_Object file, newname, ok_if_already_exists;
  {
  #ifdef NO_ARG_ARRAY
*************** This is what happens in interactive use 
*** 2151,2165 ****
    struct gcpro gcpro1, gcpro2;
  
!   GCPRO2 (filename, newname);
!   CHECK_STRING (filename, 0);
    CHECK_STRING (newname, 1);
!   filename = Fexpand_file_name (filename, Qnil);
    newname = Fexpand_file_name (newname, Qnil);
  
    /* If the file name has special constructs in it,
       call the corresponding file handler.  */
!   handler = Ffind_file_name_handler (filename, Qadd_name_to_file);
    if (!NILP (handler))
!     RETURN_UNGCPRO (call4 (handler, Qadd_name_to_file, filename,
  			   newname, ok_if_already_exists));
  
--- 2320,2334 ----
    struct gcpro gcpro1, gcpro2;
  
!   GCPRO2 (file, newname);
!   CHECK_STRING (file, 0);
    CHECK_STRING (newname, 1);
!   file = Fexpand_file_name (file, Qnil);
    newname = Fexpand_file_name (newname, Qnil);
  
    /* If the file name has special constructs in it,
       call the corresponding file handler.  */
!   handler = Ffind_file_name_handler (file, Qadd_name_to_file);
    if (!NILP (handler))
!     RETURN_UNGCPRO (call4 (handler, Qadd_name_to_file, file,
  			   newname, ok_if_already_exists));
  
*************** This is what happens in interactive use 
*** 2168,2172 ****
    handler = Ffind_file_name_handler (newname, Qadd_name_to_file);
    if (!NILP (handler))
!     RETURN_UNGCPRO (call4 (handler, Qadd_name_to_file, filename,
  			   newname, ok_if_already_exists));
  
--- 2337,2341 ----
    handler = Ffind_file_name_handler (newname, Qadd_name_to_file);
    if (!NILP (handler))
!     RETURN_UNGCPRO (call4 (handler, Qadd_name_to_file, file,
  			   newname, ok_if_already_exists));
  
*************** This is what happens in interactive use 
*** 2177,2192 ****
  #ifdef WINDOWSNT
    /* Windows does not support this operation.  */
!   report_file_error ("Adding new name", Flist (2, &filename));
  #else /* not WINDOWSNT */
  
    unlink (XSTRING (newname)->data);
!   if (0 > link (XSTRING (filename)->data, XSTRING (newname)->data))
      {
  #ifdef NO_ARG_ARRAY
!       args[0] = filename;
        args[1] = newname;
        report_file_error ("Adding new name", Flist (2, args));
  #else
!       report_file_error ("Adding new name", Flist (2, &filename));
  #endif
      }
--- 2346,2361 ----
  #ifdef WINDOWSNT
    /* Windows does not support this operation.  */
!   report_file_error ("Adding new name", Flist (2, &file));
  #else /* not WINDOWSNT */
  
    unlink (XSTRING (newname)->data);
!   if (0 > link (XSTRING (file)->data, XSTRING (newname)->data))
      {
  #ifdef NO_ARG_ARRAY
!       args[0] = file;
        args[1] = newname;
        report_file_error ("Adding new name", Flist (2, args));
  #else
!       report_file_error ("Adding new name", Flist (2, &file));
  #endif
      }
*************** DEFUN ("define-logical-name", Fdefine_lo
*** 2274,2284 ****
    "Define the job-wide logical name NAME to have the value STRING.\n\
  If STRING is nil or a null string, the logical name NAME is deleted.")
!   (varname, string)
!      Lisp_Object varname;
       Lisp_Object string;
  {
!   CHECK_STRING (varname, 0);
    if (NILP (string))
!     delete_logical_name (XSTRING (varname)->data);
    else
      {
--- 2443,2453 ----
    "Define the job-wide logical name NAME to have the value STRING.\n\
  If STRING is nil or a null string, the logical name NAME is deleted.")
!   (name, string)
!      Lisp_Object name;
       Lisp_Object string;
  {
!   CHECK_STRING (name, 0);
    if (NILP (string))
!     delete_logical_name (XSTRING (name)->data);
    else
      {
*************** If STRING is nil or a null string, the l
*** 2286,2292 ****
  
        if (XSTRING (string)->size == 0)
! 	delete_logical_name (XSTRING (varname)->data);
        else
! 	define_logical_name (XSTRING (varname)->data, XSTRING (string)->data);
      }
  
--- 2455,2461 ----
  
        if (XSTRING (string)->size == 0)
! 	delete_logical_name (XSTRING (name)->data);
        else
! 	define_logical_name (XSTRING (name)->data, XSTRING (string)->data);
      }
  
*************** DEFUN ("sysnetunam", Fsysnetunam, Ssysne
*** 2303,2310 ****
  {
    int netresult;
!   
    CHECK_STRING (path, 0);
!   CHECK_STRING (login, 0);  
!   
    netresult = netunam (XSTRING (path)->data, XSTRING (login)->data);
  
--- 2472,2479 ----
  {
    int netresult;
! 
    CHECK_STRING (path, 0);
!   CHECK_STRING (login, 0);
! 
    netresult = netunam (XSTRING (path)->data, XSTRING (login)->data);
  
*************** DEFUN ("sysnetunam", Fsysnetunam, Ssysne
*** 2318,2322 ****
  DEFUN ("file-name-absolute-p", Ffile_name_absolute_p, Sfile_name_absolute_p,
         1, 1, 0,
!        "Return t if file FILENAME specifies an absolute path name.\n\
  On Unix, this is a name starting with a `/' or a `~'.")
       (filename)
--- 2487,2491 ----
  DEFUN ("file-name-absolute-p", Ffile_name_absolute_p, Sfile_name_absolute_p,
         1, 1, 0,
!        "Return t if file FILENAME specifies an absolute file name.\n\
  On Unix, this is a name starting with a `/' or a `~'.")
       (filename)
*************** On Unix, this is a name starting with a 
*** 2335,2339 ****
  #endif /* VMS */
  #ifdef DOS_NT
!       || (*ptr != 0 && ptr[1] == ':' && (ptr[2] == '/' || ptr[2] == '\\'))
  #endif
        )
--- 2504,2508 ----
  #endif /* VMS */
  #ifdef DOS_NT
!       || (IS_DRIVE (*ptr) && ptr[1] == ':' && IS_DIRECTORY_SEP (ptr[2]))
  #endif
        )
*************** check_executable (filename)
*** 2355,2358 ****
--- 2524,2530 ----
    if (stat (filename, &st) < 0)
      return 0;
+ #ifdef WINDOWSNT
+   return ((st.st_mode & S_IEXEC) != 0);
+ #else
    return (S_ISREG (st.st_mode)
  	  && len >= 5
*************** check_executable (filename)
*** 2361,2364 ****
--- 2533,2537 ----
  	      || stricmp (suffix, ".bat") == 0)
  	  || (st.st_mode & S_IFMT) == S_IFDIR);
+ #endif /* not WINDOWSNT */
  #else /* not DOS_NT */
  #ifdef HAVE_EACCESS
*************** See also `file-readable-p' and `file-att
*** 2404,2421 ****
       Lisp_Object filename;
  {
!   Lisp_Object abspath;
    Lisp_Object handler;
    struct stat statbuf;
  
    CHECK_STRING (filename, 0);
!   abspath = Fexpand_file_name (filename, Qnil);
  
    /* If the file name has special constructs in it,
       call the corresponding file handler.  */
!   handler = Ffind_file_name_handler (abspath, Qfile_exists_p);
    if (!NILP (handler))
!     return call2 (handler, Qfile_exists_p, abspath);
  
!   return (stat (XSTRING (abspath)->data, &statbuf) >= 0) ? Qt : Qnil;
  }
  
--- 2577,2594 ----
       Lisp_Object filename;
  {
!   Lisp_Object absname;
    Lisp_Object handler;
    struct stat statbuf;
  
    CHECK_STRING (filename, 0);
!   absname = Fexpand_file_name (filename, Qnil);
  
    /* If the file name has special constructs in it,
       call the corresponding file handler.  */
!   handler = Ffind_file_name_handler (absname, Qfile_exists_p);
    if (!NILP (handler))
!     return call2 (handler, Qfile_exists_p, absname);
  
!   return (stat (XSTRING (absname)->data, &statbuf) >= 0) ? Qt : Qnil;
  }
  
*************** For a directory, this means you can acce
*** 2427,2443 ****
  
  {
!   Lisp_Object abspath;
    Lisp_Object handler;
  
    CHECK_STRING (filename, 0);
!   abspath = Fexpand_file_name (filename, Qnil);
  
    /* If the file name has special constructs in it,
       call the corresponding file handler.  */
!   handler = Ffind_file_name_handler (abspath, Qfile_executable_p);
    if (!NILP (handler))
!     return call2 (handler, Qfile_executable_p, abspath);
  
!   return (check_executable (XSTRING (abspath)->data) ? Qt : Qnil);
  }
  
--- 2600,2616 ----
  
  {
!   Lisp_Object absname;
    Lisp_Object handler;
  
    CHECK_STRING (filename, 0);
!   absname = Fexpand_file_name (filename, Qnil);
  
    /* If the file name has special constructs in it,
       call the corresponding file handler.  */
!   handler = Ffind_file_name_handler (absname, Qfile_executable_p);
    if (!NILP (handler))
!     return call2 (handler, Qfile_executable_p, absname);
  
!   return (check_executable (XSTRING (absname)->data) ? Qt : Qnil);
  }
  
*************** See also `file-exists-p' and `file-attri
*** 2448,2469 ****
       Lisp_Object filename;
  {
!   Lisp_Object abspath;
    Lisp_Object handler;
    int desc;
  
    CHECK_STRING (filename, 0);
!   abspath = Fexpand_file_name (filename, Qnil);
  
    /* If the file name has special constructs in it,
       call the corresponding file handler.  */
!   handler = Ffind_file_name_handler (abspath, Qfile_readable_p);
    if (!NILP (handler))
!     return call2 (handler, Qfile_readable_p, abspath);
  
!   desc = open (XSTRING (abspath)->data, O_RDONLY);
    if (desc < 0)
      return Qnil;
    close (desc);
    return Qt;
  }
  
--- 2621,2649 ----
       Lisp_Object filename;
  {
!   Lisp_Object absname;
    Lisp_Object handler;
    int desc;
  
    CHECK_STRING (filename, 0);
!   absname = Fexpand_file_name (filename, Qnil);
  
    /* If the file name has special constructs in it,
       call the corresponding file handler.  */
!   handler = Ffind_file_name_handler (absname, Qfile_readable_p);
    if (!NILP (handler))
!     return call2 (handler, Qfile_readable_p, absname);
  
! #ifdef DOS_NT
!   /* Under MS-DOS and Windows, open does not work for directories.  */
!   if (access (XSTRING (absname)->data, 0) == 0)
!     return Qt;
!   return Qnil;
! #else /* not DOS_NT */
!   desc = open (XSTRING (absname)->data, O_RDONLY);
    if (desc < 0)
      return Qnil;
    close (desc);
    return Qt;
+ #endif /* not DOS_NT */
  }
  
*************** DEFUN ("file-writable-p", Ffile_writable
*** 2475,2495 ****
       Lisp_Object filename;
  {
!   Lisp_Object abspath, dir;
    Lisp_Object handler;
    struct stat statbuf;
  
    CHECK_STRING (filename, 0);
!   abspath = Fexpand_file_name (filename, Qnil);
  
    /* If the file name has special constructs in it,
       call the corresponding file handler.  */
!   handler = Ffind_file_name_handler (abspath, Qfile_writable_p);
    if (!NILP (handler))
!     return call2 (handler, Qfile_writable_p, abspath);
  
!   if (stat (XSTRING (abspath)->data, &statbuf) >= 0)
!     return (check_writable (XSTRING (abspath)->data)
  	    ? Qt : Qnil);
!   dir = Ffile_name_directory (abspath);
  #ifdef VMS
    if (!NILP (dir))
--- 2655,2675 ----
       Lisp_Object filename;
  {
!   Lisp_Object absname, dir;
    Lisp_Object handler;
    struct stat statbuf;
  
    CHECK_STRING (filename, 0);
!   absname = Fexpand_file_name (filename, Qnil);
  
    /* If the file name has special constructs in it,
       call the corresponding file handler.  */
!   handler = Ffind_file_name_handler (absname, Qfile_writable_p);
    if (!NILP (handler))
!     return call2 (handler, Qfile_writable_p, absname);
  
!   if (stat (XSTRING (absname)->data, &statbuf) >= 0)
!     return (check_writable (XSTRING (absname)->data)
  	    ? Qt : Qnil);
!   dir = Ffile_name_directory (absname);
  #ifdef VMS
    if (!NILP (dir))
*************** if the directory so specified exists and
*** 2558,2574 ****
       Lisp_Object filename;
  {
!   register Lisp_Object abspath;
    struct stat st;
    Lisp_Object handler;
  
!   abspath = expand_and_dir_to_file (filename, current_buffer->directory);
  
    /* If the file name has special constructs in it,
       call the corresponding file handler.  */
!   handler = Ffind_file_name_handler (abspath, Qfile_directory_p);
    if (!NILP (handler))
!     return call2 (handler, Qfile_directory_p, abspath);
  
!   if (stat (XSTRING (abspath)->data, &st) < 0)
      return Qnil;
    return (st.st_mode & S_IFMT) == S_IFDIR ? Qt : Qnil;
--- 2738,2754 ----
       Lisp_Object filename;
  {
!   register Lisp_Object absname;
    struct stat st;
    Lisp_Object handler;
  
!   absname = expand_and_dir_to_file (filename, current_buffer->directory);
  
    /* If the file name has special constructs in it,
       call the corresponding file handler.  */
!   handler = Ffind_file_name_handler (absname, Qfile_directory_p);
    if (!NILP (handler))
!     return call2 (handler, Qfile_directory_p, absname);
  
!   if (stat (XSTRING (absname)->data, &st) < 0)
      return Qnil;
    return (st.st_mode & S_IFMT) == S_IFDIR ? Qt : Qnil;
*************** This is the sort of file that holds an o
*** 2614,2630 ****
       Lisp_Object filename;
  {
!   register Lisp_Object abspath;
    struct stat st;
    Lisp_Object handler;
  
!   abspath = expand_and_dir_to_file (filename, current_buffer->directory);
  
    /* If the file name has special constructs in it,
       call the corresponding file handler.  */
!   handler = Ffind_file_name_handler (abspath, Qfile_regular_p);
    if (!NILP (handler))
!     return call2 (handler, Qfile_regular_p, abspath);
  
!   if (stat (XSTRING (abspath)->data, &st) < 0)
      return Qnil;
    return (st.st_mode & S_IFMT) == S_IFREG ? Qt : Qnil;
--- 2794,2810 ----
       Lisp_Object filename;
  {
!   register Lisp_Object absname;
    struct stat st;
    Lisp_Object handler;
  
!   absname = expand_and_dir_to_file (filename, current_buffer->directory);
  
    /* If the file name has special constructs in it,
       call the corresponding file handler.  */
!   handler = Ffind_file_name_handler (absname, Qfile_regular_p);
    if (!NILP (handler))
!     return call2 (handler, Qfile_regular_p, absname);
  
!   if (stat (XSTRING (absname)->data, &st) < 0)
      return Qnil;
    return (st.st_mode & S_IFMT) == S_IFREG ? Qt : Qnil;
*************** This is the sort of file that holds an o
*** 2632,2657 ****
  
  DEFUN ("file-modes", Ffile_modes, Sfile_modes, 1, 1, 0,
!   "Return mode bits of FILE, as an integer.")
    (filename)
       Lisp_Object filename;
  {
!   Lisp_Object abspath;
    struct stat st;
    Lisp_Object handler;
  
!   abspath = expand_and_dir_to_file (filename, current_buffer->directory);
  
    /* If the file name has special constructs in it,
       call the corresponding file handler.  */
!   handler = Ffind_file_name_handler (abspath, Qfile_modes);
    if (!NILP (handler))
!     return call2 (handler, Qfile_modes, abspath);
  
!   if (stat (XSTRING (abspath)->data, &st) < 0)
      return Qnil;
! #ifdef DOS_NT
!   if (check_executable (XSTRING (abspath)->data))
      st.st_mode |= S_IEXEC;
! #endif /* DOS_NT */
  
    return make_number (st.st_mode & 07777);
--- 2812,2837 ----
  
  DEFUN ("file-modes", Ffile_modes, Sfile_modes, 1, 1, 0,
!   "Return mode bits of file named FILENAME, as an integer.")
    (filename)
       Lisp_Object filename;
  {
!   Lisp_Object absname;
    struct stat st;
    Lisp_Object handler;
  
!   absname = expand_and_dir_to_file (filename, current_buffer->directory);
  
    /* If the file name has special constructs in it,
       call the corresponding file handler.  */
!   handler = Ffind_file_name_handler (absname, Qfile_modes);
    if (!NILP (handler))
!     return call2 (handler, Qfile_modes, absname);
  
!   if (stat (XSTRING (absname)->data, &st) < 0)
      return Qnil;
! #ifdef MSDOS
!   if (check_executable (XSTRING (absname)->data))
      st.st_mode |= S_IEXEC;
! #endif /* MSDOS */
  
    return make_number (st.st_mode & 07777);
*************** DEFUN ("file-modes", Ffile_modes, Sfile_
*** 2659,2681 ****
  
  DEFUN ("set-file-modes", Fset_file_modes, Sset_file_modes, 2, 2, 0,
!   "Set mode bits of FILE to MODE (an integer).\n\
  Only the 12 low bits of MODE are used.")
    (filename, mode)
       Lisp_Object filename, mode;
  {
!   Lisp_Object abspath;
    Lisp_Object handler;
  
!   abspath = Fexpand_file_name (filename, current_buffer->directory);
    CHECK_NUMBER (mode, 1);
  
    /* If the file name has special constructs in it,
       call the corresponding file handler.  */
!   handler = Ffind_file_name_handler (abspath, Qset_file_modes);
    if (!NILP (handler))
!     return call3 (handler, Qset_file_modes, abspath, mode);
  
!   if (chmod (XSTRING (abspath)->data, XINT (mode)) < 0)
!     report_file_error ("Doing chmod", Fcons (abspath, Qnil));
  
    return Qnil;
--- 2839,2861 ----
  
  DEFUN ("set-file-modes", Fset_file_modes, Sset_file_modes, 2, 2, 0,
!   "Set mode bits of file named FILENAME to MODE (an integer).\n\
  Only the 12 low bits of MODE are used.")
    (filename, mode)
       Lisp_Object filename, mode;
  {
!   Lisp_Object absname;
    Lisp_Object handler;
  
!   absname = Fexpand_file_name (filename, current_buffer->directory);
    CHECK_NUMBER (mode, 1);
  
    /* If the file name has special constructs in it,
       call the corresponding file handler.  */
!   handler = Ffind_file_name_handler (absname, Qset_file_modes);
    if (!NILP (handler))
!     return call3 (handler, Qset_file_modes, absname, mode);
  
!   if (chmod (XSTRING (absname)->data, XINT (mode)) < 0)
!     report_file_error ("Doing chmod", Fcons (absname, Qnil));
  
    return Qnil;
*************** This setting is inherited by subprocesse
*** 2690,2694 ****
  {
    CHECK_NUMBER (mode, 0);
!   
    umask ((~ XINT (mode)) & 0777);
  
--- 2870,2874 ----
  {
    CHECK_NUMBER (mode, 0);
! 
    umask ((~ XINT (mode)) & 0777);
  
*************** otherwise, if FILE2 does not exist, the 
*** 2730,2734 ****
       Lisp_Object file1, file2;
  {
!   Lisp_Object abspath1, abspath2;
    struct stat st;
    int mtime1;
--- 2910,2914 ----
       Lisp_Object file1, file2;
  {
!   Lisp_Object absname1, absname2;
    struct stat st;
    int mtime1;
*************** otherwise, if FILE2 does not exist, the 
*** 2739,2762 ****
    CHECK_STRING (file2, 0);
  
!   abspath1 = Qnil;
!   GCPRO2 (abspath1, file2);
!   abspath1 = expand_and_dir_to_file (file1, current_buffer->directory);
!   abspath2 = expand_and_dir_to_file (file2, current_buffer->directory);
    UNGCPRO;
  
    /* If the file name has special constructs in it,
       call the corresponding file handler.  */
!   handler = Ffind_file_name_handler (abspath1, Qfile_newer_than_file_p);
    if (NILP (handler))
!     handler = Ffind_file_name_handler (abspath2, Qfile_newer_than_file_p);
    if (!NILP (handler))
!     return call3 (handler, Qfile_newer_than_file_p, abspath1, abspath2);
  
!   if (stat (XSTRING (abspath1)->data, &st) < 0)
      return Qnil;
  
    mtime1 = st.st_mtime;
  
!   if (stat (XSTRING (abspath2)->data, &st) < 0)
      return Qt;
  
--- 2919,2942 ----
    CHECK_STRING (file2, 0);
  
!   absname1 = Qnil;
!   GCPRO2 (absname1, file2);
!   absname1 = expand_and_dir_to_file (file1, current_buffer->directory);
!   absname2 = expand_and_dir_to_file (file2, current_buffer->directory);
    UNGCPRO;
  
    /* If the file name has special constructs in it,
       call the corresponding file handler.  */
!   handler = Ffind_file_name_handler (absname1, Qfile_newer_than_file_p);
    if (NILP (handler))
!     handler = Ffind_file_name_handler (absname2, Qfile_newer_than_file_p);
    if (!NILP (handler))
!     return call3 (handler, Qfile_newer_than_file_p, absname1, absname2);
  
!   if (stat (XSTRING (absname1)->data, &st) < 0)
      return Qnil;
  
    mtime1 = st.st_mtime;
  
!   if (stat (XSTRING (absname2)->data, &st) < 0)
      return Qt;
  
*************** and (2) it puts less data in the undo li
*** 2929,2933 ****
  	    same_at_start++, bufpos++;
  	  /* If we found a discrepancy, stop the scan.
! 	     Otherwise loop around and scan the next bufferfull.  */
  	  if (bufpos != nread)
  	    break;
--- 3109,3113 ----
  	    same_at_start++, bufpos++;
  	  /* If we found a discrepancy, stop the scan.
! 	     Otherwise loop around and scan the next bufferful.  */
  	  if (bufpos != nread)
  	    break;
*************** and (2) it puts less data in the undo li
*** 2972,2976 ****
  	      total_read += nread;
  	    }
! 	  /* Scan this bufferfull from the end, comparing with
  	     the Emacs buffer.  */
  	  bufpos = total_read;
--- 3152,3156 ----
  	      total_read += nread;
  	    }
! 	  /* Scan this bufferful from the end, comparing with
  	     the Emacs buffer.  */
  	  bufpos = total_read;
*************** and (2) it puts less data in the undo li
*** 2981,2985 ****
  	    same_at_end--, bufpos--;
  	  /* If we found a discrepancy, stop the scan.
! 	     Otherwise loop around and scan the preceding bufferfull.  */
  	  if (bufpos != 0)
  	    break;
--- 3161,3165 ----
  	    same_at_end--, bufpos--;
  	  /* If we found a discrepancy, stop the scan.
! 	     Otherwise loop around and scan the preceding bufferful.  */
  	  if (bufpos != 0)
  	    break;
*************** and (2) it puts less data in the undo li
*** 3135,3139 ****
    if (inserted > 0)
      {
!       insval = call3 (Qformat_decode, 
  		      Qnil, make_number (inserted), visit);
        CHECK_NUMBER (insval, 0);
--- 3315,3319 ----
    if (inserted > 0)
      {
!       insval = call3 (Qformat_decode,
  		      Qnil, make_number (inserted), visit);
        CHECK_NUMBER (insval, 0);
*************** and (2) it puts less data in the undo li
*** 3143,3147 ****
    if (inserted > 0 && NILP (visit) && total > 0)
      signal_after_change (point, 0, inserted);
!   
    if (inserted > 0)
      {
--- 3323,3327 ----
    if (inserted > 0 && NILP (visit) && total > 0)
      signal_after_change (point, 0, inserted);
! 
    if (inserted > 0)
      {
*************** static Lisp_Object build_annotations ();
*** 3173,3177 ****
     Kill the temporary buffer that was selected in the meantime.  */
  
! static Lisp_Object 
  build_annotations_unwind (buf)
       Lisp_Object buf;
--- 3353,3357 ----
     Kill the temporary buffer that was selected in the meantime.  */
  
! static Lisp_Object
  build_annotations_unwind (buf)
       Lisp_Object buf;
*************** to the file, instead of any buffer conte
*** 3260,3264 ****
    /* If FILENAME has no handler, see if VISIT has one.  */
    if (NILP (handler) && STRINGP (visit))
!     handler = Ffind_file_name_handler (visit, Qwrite_region);    
  
    if (!NILP (handler))
--- 3440,3444 ----
    /* If FILENAME has no handler, see if VISIT has one.  */
    if (NILP (handler) && STRINGP (visit))
!     handler = Ffind_file_name_handler (visit, Qwrite_region);
  
    if (!NILP (handler))
*************** to the file, instead of any buffer conte
*** 3358,3363 ****
  #else /* not VMS */
  #ifdef DOS_NT
!   desc = open (fn, 
! 	       O_WRONLY | O_TRUNC | O_CREAT | buffer_file_type, 
  	       S_IREAD | S_IWRITE);
  #else  /* not DOS_NT */
--- 3538,3543 ----
  #else /* not VMS */
  #ifdef DOS_NT
!   desc = open (fn,
! 	       O_WRONLY | O_TRUNC | O_CREAT | buffer_file_type,
  	       S_IREAD | S_IWRITE);
  #else  /* not DOS_NT */
*************** to the file, instead of any buffer conte
*** 3463,3467 ****
  #endif
  
!   /* Spurious "file has changed on disk" warnings have been 
       observed on Suns as well.
       It seems that `close' can change the modtime, under nfs.
--- 3643,3647 ----
  #endif
  
!   /* Spurious "file has changed on disk" warnings have been
       observed on Suns as well.
       It seems that `close' can change the modtime, under nfs.
*************** do_auto_save_unwind (desc)  /* used as u
*** 3820,3824 ****
  {
    auto_saving = 0;
!   close (XINT (desc));
    return Qnil;
  }
--- 4000,4005 ----
  {
    auto_saving = 0;
!   if (XINT (desc) >= 0)
!     close (XINT (desc));
    return Qnil;
  }
*************** so that your editing is not lost if the 
*** 3832,3837 ****
  This file is not the file you visited; that changes only when you save.\n\
  Normally we run the normal hook `auto-save-hook' before saving.\n\n\
! Non-nil first argument means do not print any message if successful.\n\
! Non-nil second argument means save only current buffer.")
    (no_message, current_only)
       Lisp_Object no_message, current_only;
--- 4013,4018 ----
  This file is not the file you visited; that changes only when you save.\n\
  Normally we run the normal hook `auto-save-hook' before saving.\n\n\
! A non-nil NO-MESSAGE argument means do not print any message if successful.\n\
! A non-nil CURRENT-ONLY argument means save only current buffer.")
    (no_message, current_only)
       Lisp_Object no_message, current_only;
*************** Non-nil second argument means save only 
*** 3868,3872 ****
        listfile = Fexpand_file_name (Vauto_save_list_file_name, Qnil);
  #ifdef DOS_NT
!       listdesc = open (XSTRING (listfile)->data, 
  		       O_WRONLY | O_TRUNC | O_CREAT | O_TEXT,
  		       S_IREAD | S_IWRITE);
--- 4049,4053 ----
        listfile = Fexpand_file_name (Vauto_save_list_file_name, Qnil);
  #ifdef DOS_NT
!       listdesc = open (XSTRING (listfile)->data,
  		       O_WRONLY | O_TRUNC | O_CREAT | O_TEXT,
  		       S_IREAD | S_IWRITE);
*************** Non-nil second argument means save only 
*** 3877,3885 ****
    else
      listdesc = -1;
!   
    /* Arrange to close that file whether or not we get an error.
       Also reset auto_saving to 0.  */
!   if (listdesc >= 0)
!     record_unwind_protect (do_auto_save_unwind, make_number (listdesc));
  
    auto_saving = 1;
--- 4058,4065 ----
    else
      listdesc = -1;
! 
    /* Arrange to close that file whether or not we get an error.
       Also reset auto_saving to 0.  */
!   record_unwind_protect (do_auto_save_unwind, make_number (listdesc));
  
    auto_saving = 1;
*************** Non-nil second argument means save only 
*** 3895,3899 ****
  	buf = XCONS (XCONS (tail)->car)->cdr;
  	b = XBUFFER (buf);
!       
  	/* Record all the buffers that have auto save mode
  	   in the special file that lists them.  For each of these buffers,
--- 4075,4079 ----
  	buf = XCONS (XCONS (tail)->car)->cdr;
  	b = XBUFFER (buf);
! 
  	/* Record all the buffers that have auto save mode
  	   in the special file that lists them.  For each of these buffers,
*************** Non-nil second argument means save only 
*** 3985,3989 ****
      {
        if (omessage)
! 	message2 (omessage, omessage_length);
        else
  	message1 ("Auto-saving...done");
--- 4165,4172 ----
      {
        if (omessage)
! 	{
! 	  sit_for (1, 0, 0, 0);
! 	  message2 (omessage, omessage_length);
! 	}
        else
  	message1 ("Auto-saving...done");
*************** DEFUN ("read-file-name", Fread_file_name
*** 4136,4141 ****
    "Read file name, prompting with PROMPT and completing in directory DIR.\n\
  Value is not expanded---you must call `expand-file-name' yourself.\n\
! Default name to DEFAULT if user enters a null string.\n\
!  (If DEFAULT is omitted, the visited file name is used,\n\
    except that if INITIAL is specified, that combined with DIR is used.)\n\
  Fourth arg MUSTMATCH non-nil means require existing file's name.\n\
--- 4319,4324 ----
    "Read file name, prompting with PROMPT and completing in directory DIR.\n\
  Value is not expanded---you must call `expand-file-name' yourself.\n\
! Default name to DEFAULT-FILENAME if user enters a null string.\n\
!  (If DEFAULT-FILENAME is omitted, the visited file name is used,\n\
    except that if INITIAL is specified, that combined with DIR is used.)\n\
  Fourth arg MUSTMATCH non-nil means require existing file's name.\n\
*************** Fourth arg MUSTMATCH non-nil means requi
*** 4143,4148 ****
  Fifth arg INITIAL specifies text to start with.\n\
  DIR defaults to current buffer's directory default.")
!   (prompt, dir, defalt, mustmatch, initial)
!      Lisp_Object prompt, dir, defalt, mustmatch, initial;
  {
    Lisp_Object val, insdef, insdef1, tem;
--- 4326,4331 ----
  Fifth arg INITIAL specifies text to start with.\n\
  DIR defaults to current buffer's directory default.")
!   (prompt, dir, default_filename, mustmatch, initial)
!      Lisp_Object prompt, dir, default_filename, mustmatch, initial;
  {
    Lisp_Object val, insdef, insdef1, tem;
*************** DIR defaults to current buffer's directo
*** 4153,4166 ****
    if (NILP (dir))
      dir = current_buffer->directory;
!   if (NILP (defalt))
      {
        if (! NILP (initial))
! 	defalt = Fexpand_file_name (initial, dir);
        else
! 	defalt = current_buffer->filename;
      }
  
    /* If dir starts with user's homedir, change that to ~. */
    homedir = (char *) egetenv ("HOME");
    if (homedir != 0
        && STRINGP (dir)
--- 4336,4353 ----
    if (NILP (dir))
      dir = current_buffer->directory;
!   if (NILP (default_filename))
      {
        if (! NILP (initial))
! 	default_filename = Fexpand_file_name (initial, dir);
        else
! 	default_filename = current_buffer->filename;
      }
  
    /* If dir starts with user's homedir, change that to ~. */
    homedir = (char *) egetenv ("HOME");
+ #ifdef DOS_NT
+   homedir = strcpy (alloca (strlen (homedir) + 1), homedir);
+   CORRECT_DIR_SEPS (homedir);
+ #endif
    if (homedir != 0
        && STRINGP (dir)
*************** DIR defaults to current buffer's directo
*** 4202,4206 ****
  #endif
  
!   GCPRO2 (insdef, defalt);
    val = Fcompleting_read (prompt, intern ("read-file-name-internal"),
  			  dir, mustmatch, insdef1,
--- 4389,4393 ----
  #endif
  
!   GCPRO2 (insdef, default_filename);
    val = Fcompleting_read (prompt, intern ("read-file-name-internal"),
  			  dir, mustmatch, insdef1,
*************** DIR defaults to current buffer's directo
*** 4215,4224 ****
      error ("No file name specified");
    tem = Fstring_equal (val, insdef);
!   if (!NILP (tem) && !NILP (defalt))
!     return defalt;
    if (XSTRING (val)->size == 0 && NILP (insdef))
      {
!       if (!NILP (defalt))
! 	return defalt;
        else
  	error ("No default file name");
--- 4402,4411 ----
      error ("No file name specified");
    tem = Fstring_equal (val, insdef);
!   if (!NILP (tem) && !NILP (default_filename))
!     return default_filename;
    if (XSTRING (val)->size == 0 && NILP (insdef))
      {
!       if (!NILP (default_filename))
! 	return default_filename;
        else
  	error ("No default file name");
*************** syms_of_fileio ()
*** 4356,4360 ****
    Qfile_error = intern ("file-error");
    staticpro (&Qfile_error);
!   Qfile_already_exists = intern("file-already-exists");
    staticpro (&Qfile_already_exists);
  
--- 4543,4547 ----
    Qfile_error = intern ("file-error");
    staticpro (&Qfile_error);
!   Qfile_already_exists = intern ("file-already-exists");
    staticpro (&Qfile_already_exists);
  
*************** nil means use format `var'.  This variab
*** 4399,4402 ****
--- 4586,4597 ----
    vms_stmlf_recfm = 0;
  
+   DEFVAR_LISP ("directory-sep-char", &Vdirectory_sep_char,
+     "Directory separator character for built-in functions that return file names.\n\
+ The value should be either ?/ or ?\\ (any other value is treated as ?\\).\n\
+ This variable affects the built-in functions only on Windows,\n\
+ on other platforms, it is initialized so that Lisp code can find out\n\
+ what the normal separator is.");
+   Vdirectory_sep_char = '/';
+ 
    DEFVAR_LISP ("file-name-handler-alist", &Vfile_name_handler_alist,
      "*Alist of elements (REGEXP . HANDLER) for file names handled specially.\n\
*************** responsible for calling the after-insert
*** 4424,4429 ****
    DEFVAR_LISP ("write-region-annotate-functions", &Vwrite_region_annotate_functions,
      "A list of functions to be called at the start of `write-region'.\n\
! Each is passed two arguments, START and END as for `write-region'.  It should\n\
! return a list of pairs (POSITION . STRING) of strings to be effectively\n\
  inserted at the specified positions of the file being written (1 means to\n\
  insert before the first byte written).  The POSITIONs must be sorted into\n\
--- 4619,4626 ----
    DEFVAR_LISP ("write-region-annotate-functions", &Vwrite_region_annotate_functions,
      "A list of functions to be called at the start of `write-region'.\n\
! Each is passed two arguments, START and END as for `write-region'.\n\
! These are usually two numbers but not always; see the documentation\n\
! for `write-region'.  The function should return a list of pairs\n\
! of the form (POSITION . STRING), consisting of strings to be effectively\n\
  inserted at the specified positions of the file being written (1 means to\n\
  insert before the first byte written).  The POSITIONs must be sorted into\n\
*************** This applies only to the operation `inhi
*** 4449,4453 ****
  
    DEFVAR_LISP ("auto-save-list-file-name", &Vauto_save_list_file_name,
!     "File name in which we write a list of all auto save file names.");
    Vauto_save_list_file_name = Qnil;
  
--- 4646,4653 ----
  
    DEFVAR_LISP ("auto-save-list-file-name", &Vauto_save_list_file_name,
!     "File name in which we write a list of all auto save file names.\n\
! This variable is initialized automatically from `auto-save-list-file-prefix'\n\
! shortly after Emacs reads your `.emacs' file, if you have not yet given it\n\
! a non-nil value.");
    Vauto_save_list_file_name = Qnil;
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/filelock.c emacs-19.31/src/filelock.c
*** emacs-19.30/src/filelock.c	Sun Aug  6 21:11:49 1995
--- emacs-19.31/src/filelock.c	Tue Apr  9 18:03:32 1996
*************** GNU General Public License for more deta
*** 15,19 ****
  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.  */
  
  
--- 15,20 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** DEFUN ("lock-buffer", Flock_buffer, Sloc
*** 398,411 ****
  FILE defaults to current buffer's visited file,\n\
  or else nothing is done if current buffer isn't visiting a file.")
!   (fn)
!      Lisp_Object fn;
  {
!   if (NILP (fn))
!     fn = current_buffer->file_truename;
    else
!     CHECK_STRING (fn, 0);
    if (SAVE_MODIFF < MODIFF
!       && !NILP (fn))
!     lock_file (fn);
    return Qnil;    
  }
--- 399,412 ----
  FILE defaults to current buffer's visited file,\n\
  or else nothing is done if current buffer isn't visiting a file.")
!   (file)
!      Lisp_Object file;
  {
!   if (NILP (file))
!     file = current_buffer->file_truename;
    else
!     CHECK_STRING (file, 0);
    if (SAVE_MODIFF < MODIFF
!       && !NILP (file))
!     lock_file (file);
    return Qnil;    
  }
*************** DEFUN ("file-locked-p", Ffile_locked_p, 
*** 437,449 ****
    "Return nil if the FILENAME is not locked,\n\
  t if it is locked by you, else a string of the name of the locker.")
!   (fn)
!   Lisp_Object fn;
  {
    register char *lfname;
    int owner;
  
!   fn = Fexpand_file_name (fn, Qnil);
  
!   MAKE_LOCK_NAME (lfname, fn);
  
    owner = current_lock_owner (lfname);
--- 438,450 ----
    "Return nil if the FILENAME is not locked,\n\
  t if it is locked by you, else a string of the name of the locker.")
!   (filename)
!   Lisp_Object filename;
  {
    register char *lfname;
    int owner;
  
!   filename = Fexpand_file_name (filename, Qnil);
  
!   MAKE_LOCK_NAME (lfname, filename);
  
    owner = current_lock_owner (lfname);
diff -2rcpP --exclude=*.elc emacs-19.30/src/filemode.c emacs-19.31/src/filemode.c
*** emacs-19.30/src/filemode.c	Fri Nov  4 11:48:14 1994
--- emacs-19.31/src/filemode.c	Tue Apr  9 18:05:54 1996
***************
*** 14,18 ****
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
!    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
  
  #ifdef HAVE_CONFIG_H
--- 14,19 ----
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
!    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
!    USA.  */
  
  #ifdef HAVE_CONFIG_H
diff -2rcpP --exclude=*.elc emacs-19.30/src/floatfns.c emacs-19.31/src/floatfns.c
*** emacs-19.30/src/floatfns.c	Thu Nov  9 23:28:25 1995
--- emacs-19.31/src/floatfns.c	Tue Apr  9 18:10:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** the Free Software Foundation, 675 Mass A
*** 38,42 ****
  
     Define FLOAT_CHECK_DOMAIN if the float library doesn't handle errors by
!    either setting errno, or signalling SIGFPE/SIGILL.  Otherwise, domain and
     range checking will happen before calling the float routines.  This has
     no effect if HAVE_MATHERR is defined (since matherr will be called when
--- 39,43 ----
  
     Define FLOAT_CHECK_DOMAIN if the float library doesn't handle errors by
!    either setting errno, or signaling SIGFPE/SIGILL.  Otherwise, domain and
     range checking will happen before calling the float routines.  This has
     no effect if HAVE_MATHERR is defined (since matherr will be called when
*************** DEFUN ("bessel-jn", Fbessel_jn, Sbessel_
*** 316,326 ****
    "Return the order N bessel function output jn of ARG.\n\
  The first arg (the order) is truncated to an integer.")
!   (arg1, arg2)
!      register Lisp_Object arg1, arg2;
  {
!   int i1 = extract_float (arg1);
!   double f2 = extract_float (arg2);
  
!   IN_FLOAT (f2 = jn (i1, f2), "bessel-jn", arg1);
    return make_float (f2);
  }
--- 317,327 ----
    "Return the order N bessel function output jn of ARG.\n\
  The first arg (the order) is truncated to an integer.")
!   (n, arg)
!      register Lisp_Object n, arg;
  {
!   int i1 = extract_float (n);
!   double f2 = extract_float (arg);
  
!   IN_FLOAT (f2 = jn (i1, f2), "bessel-jn", n);
    return make_float (f2);
  }
*************** DEFUN ("bessel-yn", Fbessel_yn, Sbessel_
*** 349,359 ****
    "Return the order N bessel function output yn of ARG.\n\
  The first arg (the order) is truncated to an integer.")
!   (arg1, arg2)
!      register Lisp_Object arg1, arg2;
  {
!   int i1 = extract_float (arg1);
!   double f2 = extract_float (arg2);
  
!   IN_FLOAT (f2 = yn (i1, f2), "bessel-yn", arg1);
    return make_float (f2);
  }
--- 350,360 ----
    "Return the order N bessel function output yn of ARG.\n\
  The first arg (the order) is truncated to an integer.")
!   (n, arg)
!      register Lisp_Object n, arg;
  {
!   int i1 = extract_float (n);
!   double f2 = extract_float (arg);
  
!   IN_FLOAT (f2 = yn (i1, f2), "bessel-yn", n);
    return make_float (f2);
  }
diff -2rcpP --exclude=*.elc emacs-19.30/src/fns.c emacs-19.31/src/fns.c
*** emacs-19.30/src/fns.c	Tue Nov  7 02:01:45 1995
--- emacs-19.31/src/fns.c	Tue Apr  9 18:10:23 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** extern Lisp_Object Flookup_key ();
*** 41,44 ****
--- 42,46 ----
  Lisp_Object Qstring_lessp, Qprovide, Qrequire;
  Lisp_Object Qyes_or_no_p_history;
+ Lisp_Object Qcursor_in_echo_area;
  
  static int internal_equal ();
*************** All integers representable in Lisp are e
*** 62,67 ****
  With positive integer argument N, return random number in interval [0,N).\n\
  With argument t, set the random number seed from the current time and pid.")
!   (limit)
!      Lisp_Object limit;
  {
    EMACS_INT val;
--- 64,69 ----
  With positive integer argument N, return random number in interval [0,N).\n\
  With argument t, set the random number seed from the current time and pid.")
!   (n)
!      Lisp_Object n;
  {
    EMACS_INT val;
*************** With argument t, set the random number s
*** 69,75 ****
    unsigned long denominator;
  
!   if (EQ (limit, Qt))
      seed_random (getpid () + time (NULL));
!   if (NATNUMP (limit) && XFASTINT (limit) != 0)
      {
        /* Try to take our random number from the higher bits of VAL,
--- 71,77 ----
    unsigned long denominator;
  
!   if (EQ (n, Qt))
      seed_random (getpid () + time (NULL));
!   if (NATNUMP (n) && XFASTINT (n) != 0)
      {
        /* Try to take our random number from the higher bits of VAL,
*************** With argument t, set the random number s
*** 77,87 ****
  	 are less random than the higher ones.  We do this by using the
  	 quotient rather than the remainder.  At the high end of the RNG
! 	 it's possible to get a quotient larger than limit; discarding
  	 these values eliminates the bias that would otherwise appear
! 	 when using a large limit.  */
!       denominator = ((unsigned long)1 << VALBITS) / XFASTINT (limit);
        do
  	val = get_random () / denominator;
!       while (val >= XFASTINT (limit));
      }
    else
--- 79,89 ----
  	 are less random than the higher ones.  We do this by using the
  	 quotient rather than the remainder.  At the high end of the RNG
! 	 it's possible to get a quotient larger than n; discarding
  	 these values eliminates the bias that would otherwise appear
! 	 when using a large n.  */
!       denominator = ((unsigned long)1 << VALBITS) / XFASTINT (n);
        do
  	val = get_random () / denominator;
!       while (val >= XFASTINT (n));
      }
    else
*************** DEFUN ("length", Flength, Slength, 1, 1,
*** 96,101 ****
    "Return the length of vector, list or string SEQUENCE.\n\
  A byte-code function object is also allowed.")
!   (obj)
!      register Lisp_Object obj;
  {
    register Lisp_Object tail, val;
--- 98,103 ----
    "Return the length of vector, list or string SEQUENCE.\n\
  A byte-code function object is also allowed.")
!   (sequence)
!      register Lisp_Object sequence;
  {
    register Lisp_Object tail, val;
*************** A byte-code function object is also allo
*** 103,119 ****
  
   retry:
!   if (STRINGP (obj))
!     XSETFASTINT (val, XSTRING (obj)->size);
!   else if (VECTORP (obj))
!     XSETFASTINT (val, XVECTOR (obj)->size);
!   else if (CHAR_TABLE_P (obj))
      XSETFASTINT (val, CHAR_TABLE_ORDINARY_SLOTS);
!   else if (BOOL_VECTOR_P (obj))
!     XSETFASTINT (val, XBOOL_VECTOR (obj)->size);
!   else if (COMPILEDP (obj))
!     XSETFASTINT (val, XVECTOR (obj)->size & PSEUDOVECTOR_SIZE_MASK);
!   else if (CONSP (obj))
      {
!       for (i = 0, tail = obj; !NILP (tail); i++)
  	{
  	  QUIT;
--- 105,121 ----
  
   retry:
!   if (STRINGP (sequence))
!     XSETFASTINT (val, XSTRING (sequence)->size);
!   else if (VECTORP (sequence))
!     XSETFASTINT (val, XVECTOR (sequence)->size);
!   else if (CHAR_TABLE_P (sequence))
      XSETFASTINT (val, CHAR_TABLE_ORDINARY_SLOTS);
!   else if (BOOL_VECTOR_P (sequence))
!     XSETFASTINT (val, XBOOL_VECTOR (sequence)->size);
!   else if (COMPILEDP (sequence))
!     XSETFASTINT (val, XVECTOR (sequence)->size & PSEUDOVECTOR_SIZE_MASK);
!   else if (CONSP (sequence))
      {
!       for (i = 0, tail = sequence; !NILP (tail); i++)
  	{
  	  QUIT;
*************** A byte-code function object is also allo
*** 123,131 ****
        XSETFASTINT (val, i);
      }
!   else if (NILP (obj))
      XSETFASTINT (val, 0);
    else
      {
!       obj = wrong_type_argument (Qsequencep, obj);
        goto retry;
      }
--- 125,133 ----
        XSETFASTINT (val, i);
      }
!   else if (NILP (sequence))
      XSETFASTINT (val, 0);
    else
      {
!       sequence = wrong_type_argument (Qsequencep, sequence);
        goto retry;
      }
*************** N counts from zero.  If LIST is not that
*** 564,580 ****
  DEFUN ("elt", Felt, Selt, 2, 2, 0,
    "Return element of SEQUENCE at index N.")
!   (seq, n)
!      register Lisp_Object seq, n;
  {
    CHECK_NUMBER (n, 0);
    while (1)
      {
!       if (CONSP (seq) || NILP (seq))
! 	return Fcar (Fnthcdr (n, seq));
!       else if (STRINGP (seq) || VECTORP (seq) || BOOL_VECTOR_P (seq)
! 	       || CHAR_TABLE_P (seq))
! 	return Faref (seq, n);
        else
! 	seq = wrong_type_argument (Qsequencep, seq);
      }
  }
--- 566,582 ----
  DEFUN ("elt", Felt, Selt, 2, 2, 0,
    "Return element of SEQUENCE at index N.")
!   (sequence, n)
!      register Lisp_Object sequence, n;
  {
    CHECK_NUMBER (n, 0);
    while (1)
      {
!       if (CONSP (sequence) || NILP (sequence))
! 	return Fcar (Fnthcdr (n, sequence));
!       else if (STRINGP (sequence) || VECTORP (sequence)
! 	       || BOOL_VECTOR_P (sequence) || CHAR_TABLE_P (sequence))
! 	return Faref (sequence, n);
        else
! 	sequence = wrong_type_argument (Qsequencep, sequence);
      }
  }
*************** Returns the sorted list.  LIST is modifi
*** 833,838 ****
  PREDICATE is called with two elements of LIST, and should return T\n\
  if the first element is \"less\" than the second.")
!   (list, pred)
!      Lisp_Object list, pred;
  {
    Lisp_Object front, back;
--- 835,840 ----
  PREDICATE is called with two elements of LIST, and should return T\n\
  if the first element is \"less\" than the second.")
!   (list, predicate)
!      Lisp_Object list, predicate;
  {
    Lisp_Object front, back;
*************** if the first element is \"less\" than th
*** 853,860 ****
  
    GCPRO2 (front, back);
!   front = Fsort (front, pred);
!   back = Fsort (back, pred);
    UNGCPRO;
!   return merge (front, back, pred);
  }
  
--- 855,862 ----
  
    GCPRO2 (front, back);
!   front = Fsort (front, predicate);
!   back = Fsort (back, predicate);
    UNGCPRO;
!   return merge (front, back, predicate);
  }
  
*************** merge (org_l1, org_l2, pred)
*** 921,935 ****
  
  DEFUN ("plist-get", Fplist_get, Splist_get, 2, 2, 0,
!        "Extract a value from a property list.\n\
  PLIST is a property list, which is a list of the form\n\
  \(PROP1 VALUE1 PROP2 VALUE2...).  This function returns the value\n\
  corresponding to the given PROP, or nil if PROP is not\n\
  one of the properties on the list.")
!   (val, prop)
!      Lisp_Object val;
       register Lisp_Object prop;
  {
    register Lisp_Object tail;
!   for (tail = val; !NILP (tail); tail = Fcdr (Fcdr (tail)))
      {
        register Lisp_Object tem;
--- 923,937 ----
  
  DEFUN ("plist-get", Fplist_get, Splist_get, 2, 2, 0,
!   "Extract a value from a property list.\n\
  PLIST is a property list, which is a list of the form\n\
  \(PROP1 VALUE1 PROP2 VALUE2...).  This function returns the value\n\
  corresponding to the given PROP, or nil if PROP is not\n\
  one of the properties on the list.")
!   (plist, prop)
!      Lisp_Object plist;
       register Lisp_Object prop;
  {
    register Lisp_Object tail;
!   for (tail = plist; !NILP (tail); tail = Fcdr (Fcdr (tail)))
      {
        register Lisp_Object tem;
*************** DEFUN ("char-table-subtype", Fchar_table
*** 1176,1185 ****
         1, 1, 0,
    "Return the subtype of char-table CHAR-TABLE.   The value is a symbol.")
!   (chartable)
!      Lisp_Object chartable;
  {
!   CHECK_CHAR_TABLE (chartable, 0);  
  
!   return XCHAR_TABLE (chartable)->purpose;
  }
  
--- 1178,1187 ----
         1, 1, 0,
    "Return the subtype of char-table CHAR-TABLE.   The value is a symbol.")
!   (char_table)
!      Lisp_Object char_table;
  {
!   CHECK_CHAR_TABLE (char_table, 0);  
  
!   return XCHAR_TABLE (char_table)->purpose;
  }
  
*************** If CHAR-TABLE holds nil for a given char
*** 1191,1200 ****
  then the actual applicable value is inherited from the parent char-table\n\
  \(or from its parents, if necessary).")
!   (chartable)
!      Lisp_Object chartable;
  {
!   CHECK_CHAR_TABLE (chartable, 0);  
  
!   return XCHAR_TABLE (chartable)->parent;
  }
  
--- 1193,1202 ----
  then the actual applicable value is inherited from the parent char-table\n\
  \(or from its parents, if necessary).")
!   (char_table)
!      Lisp_Object char_table;
  {
!   CHECK_CHAR_TABLE (char_table, 0);  
  
!   return XCHAR_TABLE (char_table)->parent;
  }
  
*************** DEFUN ("set-char-table-parent", Fset_cha
*** 1203,1212 ****
    "Set the parent char-table of CHAR-TABLE to PARENT.\n\
  PARENT must be either nil or another char-table.")
!   (chartable, parent)
!      Lisp_Object chartable, parent;
  {
    Lisp_Object temp;
  
!   CHECK_CHAR_TABLE (chartable, 0);  
  
    if (!NILP (parent))
--- 1205,1214 ----
    "Set the parent char-table of CHAR-TABLE to PARENT.\n\
  PARENT must be either nil or another char-table.")
!   (char_table, parent)
!      Lisp_Object char_table, parent;
  {
    Lisp_Object temp;
  
!   CHECK_CHAR_TABLE (char_table, 0);  
  
    if (!NILP (parent))
*************** PARENT must be either nil or another cha
*** 1215,1223 ****
  
        for (temp = parent; !NILP (temp); temp = XCHAR_TABLE (temp)->parent)
! 	if (EQ (temp, chartable))
  	  error ("Attempt to make a chartable be its own parent");
      }
  
!   XCHAR_TABLE (chartable)->parent = parent;
  
    return parent;
--- 1217,1225 ----
  
        for (temp = parent; !NILP (temp); temp = XCHAR_TABLE (temp)->parent)
! 	if (EQ (temp, char_table))
  	  error ("Attempt to make a chartable be its own parent");
      }
  
!   XCHAR_TABLE (char_table)->parent = parent;
  
    return parent;
*************** DEFUN ("char-table-extra-slot", Fchar_ta
*** 1227,1240 ****
         2, 2, 0,
    "Return the value in extra-slot number N of char-table CHAR-TABLE.")
!   (chartable, n)
!      Lisp_Object chartable, n;
  {
!   CHECK_CHAR_TABLE (chartable, 1);
    CHECK_NUMBER (n, 2);
    if (XINT (n) < 0
!       || XINT (n) >= CHAR_TABLE_EXTRA_SLOTS (XCHAR_TABLE (chartable)))
!     args_out_of_range (chartable, n);
  
!   return XCHAR_TABLE (chartable)->extras[XINT (n)];
  }
  
--- 1229,1242 ----
         2, 2, 0,
    "Return the value in extra-slot number N of char-table CHAR-TABLE.")
!   (char_table, n)
!      Lisp_Object char_table, n;
  {
!   CHECK_CHAR_TABLE (char_table, 1);
    CHECK_NUMBER (n, 2);
    if (XINT (n) < 0
!       || XINT (n) >= CHAR_TABLE_EXTRA_SLOTS (XCHAR_TABLE (char_table)))
!     args_out_of_range (char_table, n);
  
!   return XCHAR_TABLE (char_table)->extras[XINT (n)];
  }
  
*************** DEFUN ("set-char-table-extra-slot", Fset
*** 1243,1284 ****
         3, 3, 0,
    "Set extra-slot number N of CHAR-TABLE to VALUE.")
!   (chartable, n, value)
!      Lisp_Object chartable, n, value;
  {
!   CHECK_CHAR_TABLE (chartable, 1);
    CHECK_NUMBER (n, 2);
    if (XINT (n) < 0
!       || XINT (n) >= CHAR_TABLE_EXTRA_SLOTS (XCHAR_TABLE (chartable)))
!     args_out_of_range (chartable, n);
  
!   return XCHAR_TABLE (chartable)->extras[XINT (n)] = value;
  }
  
  DEFUN ("char-table-range", Fchar_table_range, Schar_table_range,
         2, 2, 0,
!   "Return the value in CHARTABLE for a range of characters RANGE.\n\
  RANGE should be t (for all characters), nil (for the default value)\n\
  a vector which identifies a character set or a row of a character set,\n\
  or a character code.")
!   (chartable, range)
!      Lisp_Object chartable, range;
  {
    int i;
  
!   CHECK_CHAR_TABLE (chartable, 0);
    
    if (EQ (range, Qnil))
!     return XCHAR_TABLE (chartable)->defalt;
    else if (INTEGERP (range))
!     return Faref (chartable, range);
    else if (VECTORP (range))
      {
        for (i = 0; i < XVECTOR (range)->size - 1; i++)
! 	chartable = Faref (chartable, XVECTOR (range)->contents[i]);
  
        if (EQ (XVECTOR (range)->contents[i], Qnil))
! 	return XCHAR_TABLE (chartable)->defalt;
        else
! 	return Faref (chartable, XVECTOR (range)->contents[i]);
      }
    else
--- 1245,1286 ----
         3, 3, 0,
    "Set extra-slot number N of CHAR-TABLE to VALUE.")
!   (char_table, n, value)
!      Lisp_Object char_table, n, value;
  {
!   CHECK_CHAR_TABLE (char_table, 1);
    CHECK_NUMBER (n, 2);
    if (XINT (n) < 0
!       || XINT (n) >= CHAR_TABLE_EXTRA_SLOTS (XCHAR_TABLE (char_table)))
!     args_out_of_range (char_table, n);
  
!   return XCHAR_TABLE (char_table)->extras[XINT (n)] = value;
  }
  
  DEFUN ("char-table-range", Fchar_table_range, Schar_table_range,
         2, 2, 0,
!   "Return the value in CHAR-TABLE for a range of characters RANGE.\n\
  RANGE should be t (for all characters), nil (for the default value)\n\
  a vector which identifies a character set or a row of a character set,\n\
  or a character code.")
!   (char_table, range)
!      Lisp_Object char_table, range;
  {
    int i;
  
!   CHECK_CHAR_TABLE (char_table, 0);
    
    if (EQ (range, Qnil))
!     return XCHAR_TABLE (char_table)->defalt;
    else if (INTEGERP (range))
!     return Faref (char_table, range);
    else if (VECTORP (range))
      {
        for (i = 0; i < XVECTOR (range)->size - 1; i++)
! 	char_table = Faref (char_table, XVECTOR (range)->contents[i]);
  
        if (EQ (XVECTOR (range)->contents[i], Qnil))
! 	return XCHAR_TABLE (char_table)->defalt;
        else
! 	return Faref (char_table, XVECTOR (range)->contents[i]);
      }
    else
*************** or a character code.")
*** 1288,1318 ****
  DEFUN ("set-char-table-range", Fset_char_table_range, Sset_char_table_range,
         3, 3, 0,
!   "Set the value in CHARTABLE for a range of characters RANGE to VALUE.\n\
  RANGE should be t (for all characters), nil (for the default value)\n\
  a vector which identifies a character set or a row of a character set,\n\
  or a character code.")
!   (chartable, range, value)
!      Lisp_Object chartable, range, value;
  {
    int i;
  
!   CHECK_CHAR_TABLE (chartable, 0);
    
    if (EQ (range, Qt))
      for (i = 0; i < CHAR_TABLE_ORDINARY_SLOTS; i++)
!       XCHAR_TABLE (chartable)->contents[i] = value;
    else if (EQ (range, Qnil))
!     XCHAR_TABLE (chartable)->defalt = value;
    else if (INTEGERP (range))
!     Faset (chartable, range, value);
    else if (VECTORP (range))
      {
        for (i = 0; i < XVECTOR (range)->size - 1; i++)
! 	chartable = Faref (chartable, XVECTOR (range)->contents[i]);
  
        if (EQ (XVECTOR (range)->contents[i], Qnil))
! 	XCHAR_TABLE (chartable)->defalt = value;
        else
! 	Faset (chartable, XVECTOR (range)->contents[i], value);
      }
    else
--- 1290,1320 ----
  DEFUN ("set-char-table-range", Fset_char_table_range, Sset_char_table_range,
         3, 3, 0,
!   "Set the value in CHAR-TABLE for a range of characters RANGE to VALUE.\n\
  RANGE should be t (for all characters), nil (for the default value)\n\
  a vector which identifies a character set or a row of a character set,\n\
  or a character code.")
!   (char_table, range, value)
!      Lisp_Object char_table, range, value;
  {
    int i;
  
!   CHECK_CHAR_TABLE (char_table, 0);
    
    if (EQ (range, Qt))
      for (i = 0; i < CHAR_TABLE_ORDINARY_SLOTS; i++)
!       XCHAR_TABLE (char_table)->contents[i] = value;
    else if (EQ (range, Qnil))
!     XCHAR_TABLE (char_table)->defalt = value;
    else if (INTEGERP (range))
!     Faset (char_table, range, value);
    else if (VECTORP (range))
      {
        for (i = 0; i < XVECTOR (range)->size - 1; i++)
! 	char_table = Faref (char_table, XVECTOR (range)->contents[i]);
  
        if (EQ (XVECTOR (range)->contents[i], Qnil))
! 	XCHAR_TABLE (char_table)->defalt = value;
        else
! 	Faset (char_table, XVECTOR (range)->contents[i], value);
      }
    else
*************** map_char_table (c_function, function, ch
*** 1350,1354 ****
        elt = XCHAR_TABLE (chartable)->contents[i];
        if (CHAR_TABLE_P (elt))
! 	map_char_table (chartable, c_function, function, depth + 1, indices);
        else if (c_function)
  	(*c_function) (depth + 1, indices, elt);
--- 1352,1356 ----
        elt = XCHAR_TABLE (chartable)->contents[i];
        if (CHAR_TABLE_P (elt))
! 	map_char_table (c_function, function, chartable, depth + 1, indices);
        else if (c_function)
  	(*c_function) (depth + 1, indices, elt);
*************** map_char_table (c_function, function, ch
*** 1365,1378 ****
  DEFUN ("map-char-table", Fmap_char_table, Smap_char_table,
    2, 2, 0,
!   "Call FUNCTION for each range of like characters in CHARTABLE.\n\
  FUNCTION is called with two arguments--a key and a value.\n\
  The key is always a possible RANGE argument to `set-char-table-range'.")
!   (function, chartable)
!      Lisp_Object function, chartable;
  {
    Lisp_Object keyvec;
    Lisp_Object *indices = (Lisp_Object *) alloca (10 * sizeof (Lisp_Object));
  
!   map_char_table (NULL, function, chartable, 0, indices);
    return Qnil;
  }
--- 1367,1380 ----
  DEFUN ("map-char-table", Fmap_char_table, Smap_char_table,
    2, 2, 0,
!   "Call FUNCTION for each range of like characters in CHAR-TABLE.\n\
  FUNCTION is called with two arguments--a key and a value.\n\
  The key is always a possible RANGE argument to `set-char-table-range'.")
!   (function, char_table)
!      Lisp_Object function, char_table;
  {
    Lisp_Object keyvec;
    Lisp_Object *indices = (Lisp_Object *) alloca (10 * sizeof (Lisp_Object));
  
!   map_char_table (NULL, function, char_table, 0, indices);
    return Qnil;
  }
*************** mapcar1 (leni, vals, fn, seq)
*** 1490,1498 ****
  
  DEFUN ("mapconcat", Fmapconcat, Smapconcat, 3, 3, 0,
!   "Apply FN to each element of SEQ, and concat the results as strings.\n\
! In between each pair of results, stick in SEP.\n\
! Thus, \" \" as SEP results in spaces between the values returned by FN.")
!   (fn, seq, sep)
!      Lisp_Object fn, seq, sep;
  {
    Lisp_Object len;
--- 1492,1500 ----
  
  DEFUN ("mapconcat", Fmapconcat, Smapconcat, 3, 3, 0,
!   "Apply FUNCTION to each element of SEQUENCE, and concat the results as strings.\n\
! In between each pair of results, stick in SEPARATOR.  Thus, \" \" as\n\
! SEPARATOR results in spaces between the values returned by FUNCTION.")
!   (function, sequence, separator)
!      Lisp_Object function, sequence, separator;
  {
    Lisp_Object len;
*************** Thus, \" \" as SEP results in spaces bet
*** 1503,1507 ****
    struct gcpro gcpro1;
  
!   len = Flength (seq);
    leni = XINT (len);
    nargs = leni + leni - 1;
--- 1505,1509 ----
    struct gcpro gcpro1;
  
!   len = Flength (sequence);
    leni = XINT (len);
    nargs = leni + leni - 1;
*************** Thus, \" \" as SEP results in spaces bet
*** 1510,1515 ****
    args = (Lisp_Object *) alloca (nargs * sizeof (Lisp_Object));
  
!   GCPRO1 (sep);
!   mapcar1 (leni, args, fn, seq);
    UNGCPRO;
  
--- 1512,1517 ----
    args = (Lisp_Object *) alloca (nargs * sizeof (Lisp_Object));
  
!   GCPRO1 (separator);
!   mapcar1 (leni, args, function, sequence);
    UNGCPRO;
  
*************** Thus, \" \" as SEP results in spaces bet
*** 1518,1522 ****
        
    for (i = 1; i < nargs; i += 2)
!     args[i] = sep;
  
    return Fconcat (nargs, args);
--- 1520,1524 ----
        
    for (i = 1; i < nargs; i += 2)
!     args[i] = separator;
  
    return Fconcat (nargs, args);
*************** DEFUN ("mapcar", Fmapcar, Smapcar, 2, 2,
*** 1527,1532 ****
  The result is a list just as long as SEQUENCE.\n\
  SEQUENCE may be a list, a vector or a string.")
!   (fn, seq)
!      Lisp_Object fn, seq;
  {
    register Lisp_Object len;
--- 1529,1534 ----
  The result is a list just as long as SEQUENCE.\n\
  SEQUENCE may be a list, a vector or a string.")
!   (function, sequence)
!      Lisp_Object function, sequence;
  {
    register Lisp_Object len;
*************** SEQUENCE may be a list, a vector or a st
*** 1534,1542 ****
    register Lisp_Object *args;
  
!   len = Flength (seq);
    leni = XFASTINT (len);
    args = (Lisp_Object *) alloca (leni * sizeof (Lisp_Object));
  
!   mapcar1 (leni, args, fn, seq);
  
    return Flist (leni, args);
--- 1536,1544 ----
    register Lisp_Object *args;
  
!   len = Flength (sequence);
    leni = XFASTINT (len);
    args = (Lisp_Object *) alloca (leni * sizeof (Lisp_Object));
  
!   mapcar1 (leni, args, function, sequence);
  
    return Flist (leni, args);
*************** Also accepts Space to mean yes, or Delet
*** 1558,1563 ****
    Lisp_Object xprompt;
    Lisp_Object args[2];
-   int ocech = cursor_in_echo_area;
    struct gcpro gcpro1, gcpro2;
  
    map = Fsymbol_value (intern ("query-replace-map"));
--- 1560,1567 ----
    Lisp_Object xprompt;
    Lisp_Object args[2];
    struct gcpro gcpro1, gcpro2;
+   int count = specpdl_ptr - specpdl;
+ 
+   specbind (Qcursor_in_echo_area, Qt);
  
    map = Fsymbol_value (intern ("query-replace-map"));
*************** Also accepts Space to mean yes, or Delet
*** 1569,1575 ****
    while (1)
      {
! #if defined (HAVE_X_MENU) || defined (HAVE_NTGUI)
        if ((NILP (last_nonmenu_event) || CONSP (last_nonmenu_event))
! 	  && using_x_p ())
  	{
  	  Lisp_Object pane, menu;
--- 1573,1581 ----
    while (1)
      {
!       
! 
! #ifdef HAVE_MENUS
        if ((NILP (last_nonmenu_event) || CONSP (last_nonmenu_event))
! 	  && have_menus_p ())
  	{
  	  Lisp_Object pane, menu;
*************** Also accepts Space to mean yes, or Delet
*** 1583,1588 ****
  	  break;
  	}
! #endif
        cursor_in_echo_area = 1;
        message_nolog ("%s(y or n) ", XSTRING (xprompt)->data);
  
--- 1589,1595 ----
  	  break;
  	}
! #endif /* HAVE_MENUS */
        cursor_in_echo_area = 1;
+       choose_minibuf_frame ();
        message_nolog ("%s(y or n) ", XSTRING (xprompt)->data);
  
*************** Also accepts Space to mean yes, or Delet
*** 1641,1647 ****
        message_nolog ("%s(y or n) %c",
  		     XSTRING (xprompt)->data, answer ? 'y' : 'n');
-       cursor_in_echo_area = ocech;
      }
  
    return answer ? Qt : Qnil;
  }
--- 1648,1654 ----
        message_nolog ("%s(y or n) %c",
  		     XSTRING (xprompt)->data, answer ? 'y' : 'n');
      }
  
+   unbind_to (count, Qnil);
    return answer ? Qt : Qnil;
  }
*************** and can edit it until it has been confir
*** 1677,1683 ****
    CHECK_STRING (prompt, 0);
  
! #if defined (HAVE_X_MENU) || defined (HAVE_NTGUI)
    if ((NILP (last_nonmenu_event) || CONSP (last_nonmenu_event)) 
!       && using_x_p ())
      {
        Lisp_Object pane, menu, obj;
--- 1684,1690 ----
    CHECK_STRING (prompt, 0);
  
! #ifdef HAVE_MENUS
    if ((NILP (last_nonmenu_event) || CONSP (last_nonmenu_event)) 
!       && have_menus_p ())
      {
        Lisp_Object pane, menu, obj;
*************** and can edit it until it has been confir
*** 1692,1696 ****
        return obj;
      }
! #endif
  
    args[0] = prompt;
--- 1699,1703 ----
        return obj;
      }
! #endif /* HAVE_MENUS */
  
    args[0] = prompt;
*************** syms_of_fns ()
*** 1822,1825 ****
--- 1829,1836 ----
    Qyes_or_no_p_history = intern ("yes-or-no-p-history");
    staticpro (&Qyes_or_no_p_history);
+   Qcursor_in_echo_area = intern ("cursor-in-echo-area");
+   staticpro (&Qcursor_in_echo_area);
+ 
+   Fset (Qyes_or_no_p_history, Qnil);
  
    DEFVAR_LISP ("features", &Vfeatures,
diff -2rcpP --exclude=*.elc emacs-19.30/src/frame.c emacs-19.31/src/frame.c
*** emacs-19.30/src/frame.c	Sat Nov 11 11:15:04 1995
--- emacs-19.31/src/frame.c	Sun Apr 21 03:42:40 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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 <config.h>
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  #include <config.h>
*************** Lisp_Object Qwin32;
*** 80,83 ****
--- 81,85 ----
  Lisp_Object Qvisible;
  Lisp_Object Qbuffer_predicate;
+ Lisp_Object Qtitle;
  
  Lisp_Object Vterminal_frame;
*************** syms_of_frame_1 ()
*** 120,123 ****
--- 122,127 ----
    Qbuffer_predicate = intern ("buffer-predicate");
    staticpro (&Qbuffer_predicate);
+   Qtitle = intern ("title");
+   staticpro (&Qtitle);
  
    Qmouse_leave_buffer_hook = intern ("mouse-leave-buffer-hook");
*************** make_frame (mini_p)
*** 296,299 ****
--- 300,304 ----
  #endif
    f->namebuf = 0;
+   f->title = Qnil;
  
    root_window = make_window ();
*************** make_frame_without_minibuffer (mini_wind
*** 400,409 ****
        mini_window = XFRAME (kb->Vdefault_minibuffer_frame)->minibuffer_window;
      }
!   /* Install the chosen minibuffer window, with proper buffer.  */
    f->minibuffer_window = mini_window;
!   Fset_window_buffer (mini_window,
! 		      (NILP (Vminibuffer_list)
! 		       ? get_minibuffer (0)
! 		       : Fcar (Vminibuffer_list)));
    return f;
  }
--- 405,418 ----
        mini_window = XFRAME (kb->Vdefault_minibuffer_frame)->minibuffer_window;
      }
! 
    f->minibuffer_window = mini_window;
! 
!   /* Make the chosen minibuffer window display the proper minibuffer,
!      unless it is already showing a minibuffer.  */
!   if (NILP (Fmemq (XWINDOW (mini_window)->buffer, Vminibuffer_list)))
!     Fset_window_buffer (mini_window,
! 			(NILP (Vminibuffer_list)
! 			 ? get_minibuffer (0)
! 			 : Fcar (Vminibuffer_list)));
    return f;
  }
*************** This function selects the selected windo
*** 627,637 ****
  If EVENT is frame object, handle it as if it were a switch-frame event\n\
  to that frame.")
!   (frame, no_enter)
!      Lisp_Object frame, no_enter;
  {
    /* Preserve prefix arg that the command loop just cleared.  */
    current_kboard->Vprefix_arg = Vcurrent_prefix_arg;
    call1 (Vrun_hooks, Qmouse_leave_buffer_hook);
!   return do_switch_frame (frame, no_enter, 0);
  }
  
--- 636,646 ----
  If EVENT is frame object, handle it as if it were a switch-frame event\n\
  to that frame.")
!   (event, no_enter)
!      Lisp_Object event, no_enter;
  {
    /* Preserve prefix arg that the command loop just cleared.  */
    current_kboard->Vprefix_arg = Vcurrent_prefix_arg;
    call1 (Vrun_hooks, Qmouse_leave_buffer_hook);
!   return do_switch_frame (event, no_enter, 0);
  }
  
*************** If FRAME is omitted, return information 
*** 1691,1694 ****
--- 1700,1704 ----
    Lisp_Object alist;
    FRAME_PTR f;
+   int height, width;
  
    if (EQ (frame, Qnil))
*************** If FRAME is omitted, return information 
*** 1705,1710 ****
    alist = Fcopy_alist (f->param_alist);
    store_in_alist (&alist, Qname, f->name);
!   store_in_alist (&alist, Qheight, make_number (FRAME_HEIGHT (f)));
!   store_in_alist (&alist, Qwidth, make_number (FRAME_WIDTH (f)));
    store_in_alist (&alist, Qmodeline, (FRAME_WANTS_MODELINE_P (f) ? Qt : Qnil));
    store_in_alist (&alist, Qminibuffer,
--- 1715,1722 ----
    alist = Fcopy_alist (f->param_alist);
    store_in_alist (&alist, Qname, f->name);
!   height = (FRAME_NEW_HEIGHT (f) ? FRAME_NEW_HEIGHT (f) : FRAME_HEIGHT (f));
!   store_in_alist (&alist, Qheight, make_number (height));
!   width = (FRAME_NEW_WIDTH (f) ? FRAME_NEW_WIDTH (f) : FRAME_WIDTH (f));
!   store_in_alist (&alist, Qwidth, make_number (width));
    store_in_alist (&alist, Qmodeline, (FRAME_WANTS_MODELINE_P (f) ? Qt : Qnil));
    store_in_alist (&alist, Qminibuffer,
*************** DEFUN ("set-frame-height", Fset_frame_he
*** 1877,1886 ****
  Optional third arg non-nil means that redisplay should use LINES lines\n\
  but that the idea of the actual height of the frame should not be changed.")
!   (frame, rows, pretend)
!      Lisp_Object frame, rows, pretend;
  {
    register struct frame *f;
  
!   CHECK_NUMBER (rows, 0);
    if (NILP (frame))
      f = selected_frame;
--- 1889,1898 ----
  Optional third arg non-nil means that redisplay should use LINES lines\n\
  but that the idea of the actual height of the frame should not be changed.")
!   (frame, lines, pretend)
!      Lisp_Object frame, lines, pretend;
  {
    register struct frame *f;
  
!   CHECK_NUMBER (lines, 0);
    if (NILP (frame))
      f = selected_frame;
*************** but that the idea of the actual height o
*** 1895,1904 ****
    if (FRAME_WINDOW_P (f))
      {
!       if (XINT (rows) != f->height)
! 	x_set_window_size (f, 1, f->width, XINT (rows));
      }
    else
  #endif
!     change_frame_size (f, XINT (rows), 0, !NILP (pretend), 0);
    return Qnil;
  }
--- 1907,1916 ----
    if (FRAME_WINDOW_P (f))
      {
!       if (XINT (lines) != f->height)
! 	x_set_window_size (f, 1, f->width, XINT (lines));
      }
    else
  #endif
!     change_frame_size (f, XINT (lines), 0, !NILP (pretend), 0);
    return Qnil;
  }
*************** DEFUN ("set-frame-size", Fset_frame_size
*** 1951,1955 ****
    if (FRAME_WINDOW_P (f))
      {
!       if (XINT (rows) != f->height || XINT (cols) != f->width)
  	x_set_window_size (f, 1, XINT (cols), XINT (rows));
      }
--- 1963,1968 ----
    if (FRAME_WINDOW_P (f))
      {
!       if (XINT (rows) != f->height || XINT (cols) != f->width
! 	  || FRAME_NEW_HEIGHT (f) || FRAME_NEW_WIDTH (f))
  	x_set_window_size (f, 1, XINT (cols), XINT (rows));
      }
*************** DEFUN ("frame-parameters", Fframe_parame
*** 2330,2333 ****
--- 2343,2347 ----
    Lisp_Object alist;
    FRAME_PTR f;
+   int height, width;
  
    if (EQ (frame, Qnil))
*************** DEFUN ("frame-parameters", Fframe_parame
*** 2360,2365 ****
    store_in_alist (&alist, intern ("font"), build_string ("default"));
    store_in_alist (&alist, Qname, build_string ("emacs"));
!   store_in_alist (&alist, Qheight, make_number (FRAME_HEIGHT (f)));
!   store_in_alist (&alist, Qwidth, make_number (FRAME_WIDTH (f)));
    store_in_alist (&alist, Qmodeline, (FRAME_WANTS_MODELINE_P (f) ? Qt : Qnil));
    store_in_alist (&alist, Qminibuffer, FRAME_MINIBUF_WINDOW (f));
--- 2374,2381 ----
    store_in_alist (&alist, intern ("font"), build_string ("default"));
    store_in_alist (&alist, Qname, build_string ("emacs"));
!   height = (FRAME_NEW_HEIGHT (f) ? FRAME_NEW_HEIGHT (f) : FRAME_HEIGHT (f));
!   store_in_alist (&alist, Qheight, make_number (height));
!   width = (FRAME_NEW_WIDTH (f) ? FRAME_NEW_WIDTH (f) : FRAME_WIDTH (f));
!   store_in_alist (&alist, Qwidth, make_number (width));
    store_in_alist (&alist, Qmodeline, (FRAME_WANTS_MODELINE_P (f) ? Qt : Qnil));
    store_in_alist (&alist, Qminibuffer, FRAME_MINIBUF_WINDOW (f));
*************** syms_of_frame ()
*** 2464,2467 ****
--- 2480,2484 ----
    Ffset (intern ("screen-width"), intern ("frame-width"));
    defsubr (&Smouse_position);
+   Ffset (intern ("mouse-pixel-position"), intern ("mouse-position"));
    defsubr (&Sframe_parameters);
    defsubr (&Smodify_frame_parameters);
diff -2rcpP --exclude=*.elc emacs-19.30/src/frame.h emacs-19.31/src/frame.h
*** emacs-19.30/src/frame.h	Mon Nov 13 21:43:09 1995
--- emacs-19.31/src/frame.h	Fri Apr 26 22:09:25 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** struct frame
*** 49,54 ****
       That ensures they are all aligned normally.  */
  
!   /* Name of this frame: a Lisp string.  See also `explicit_name'
!      and `namebuf'.  */
    Lisp_Object name;
  
--- 50,55 ----
       That ensures they are all aligned normally.  */
  
!   /* Name of this frame: a Lisp string.  It is used for looking up resources,
!      as well as for the title in some cases.  */
    Lisp_Object name;
  
*************** struct frame
*** 57,60 ****
--- 58,65 ----
    Lisp_Object icon_name;
  
+   /* This is the frame title specified explicitly, if any.
+      Usually it is nil.  */
+   Lisp_Object title;
+ 
    /* The frame which should receive keystrokes that occur in this
       frame, or nil if they should go to the frame itself.  This is
*************** struct frame
*** 102,108 ****
    Lisp_Object condemned_scroll_bars;
  
!   /* List of elements to display in the menu bar.
!      The elements have the form (KEY STRING . nil) to start;
!      when they are displayed, the hpos of the left edge goes in the cddr.  */
    Lisp_Object menu_bar_items;
  
--- 107,115 ----
    Lisp_Object condemned_scroll_bars;
  
!   /* Vector describing the items to display in the menu bar.
!      Each item has four elements in this vector.
!      They are KEY, STRING, SUBMAP, and HPOS.
!      (HPOS is not used in when the X toolkit is in use.)
!      There are four additional elements of nil at the end, to terminate.  */
    Lisp_Object menu_bar_items;
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/getloadavg.c emacs-19.31/src/getloadavg.c
*** emacs-19.30/src/getloadavg.c	Mon Aug  7 16:46:44 1995
--- emacs-19.31/src/getloadavg.c	Wed May 22 17:47:27 1996
***************
*** 15,19 ****
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
!    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
  
  /* Compile-time symbols that this file uses:
--- 15,20 ----
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
!    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
!    USA.  */
  
  /* Compile-time symbols that this file uses:
***************
*** 43,46 ****
--- 44,48 ----
     eunice			UNIX emulator under VMS.
     hpux
+    MSDOS			No-op for MSDOS.
     NeXT
     sgi
***************
*** 51,54 ****
--- 53,57 ----
     UMAX4_3
     VMS
+    WIN32			No-op for Windows95/NT.
     __linux__			Linux: assumes /proc filesystem mounted.
     				Support from Michael K. Johnson.
*************** getloadavg (loadavg, nelem)
*** 733,736 ****
--- 736,749 ----
  #endif	/* OSF_MIPS */
  
+ #if !defined (LDAV_DONE) && (defined (MSDOS) || defined (WIN32))
+ #define LDAV_DONE
+ 
+   /* A faithful emulation is going to have to be saved for a rainy day.  */
+   for ( ; elem < nelem; elem++)
+     {
+       loadavg[elem] = 0.0;
+     }
+ #endif  /* MSDOS */
+ 
  #if !defined (LDAV_DONE) && defined (OSF_ALPHA)
  #define LDAV_DONE
*************** getloadavg (loadavg, nelem)
*** 856,860 ****
  	 to use the currently running kernel.  */
        kd = kvm_open (0, 0, 0, O_RDONLY, 0);
!       if (kd != 0) 
  	{
  	  /* nlist the currently running kernel.  */
--- 869,873 ----
  	 to use the currently running kernel.  */
        kd = kvm_open (0, 0, 0, O_RDONLY, 0);
!       if (kd != 0)
  	{
  	  /* nlist the currently running kernel.  */
diff -2rcpP --exclude=*.elc emacs-19.30/src/gmalloc.c emacs-19.31/src/gmalloc.c
*** emacs-19.30/src/gmalloc.c	Sat Nov 25 01:03:11 1995
--- emacs-19.31/src/gmalloc.c	Sat May 25 20:19:49 1996
***************
*** 6,10 ****
  
  /* Declarations for `malloc' and friends.
!    Copyright 1990, 1991, 1992, 1993, 1995 Free Software Foundation, Inc.
  		  Written May 1989 by Mike Haertel.
  
--- 6,10 ----
  
  /* Declarations for `malloc' and friends.
!    Copyright 1990, 91, 92, 93, 95, 96 Free Software Foundation, Inc.
  		  Written May 1989 by Mike Haertel.
  
*************** extern void free __P ((__ptr_t __ptr));
*** 107,115 ****
  
  /* Allocate SIZE bytes allocated to ALIGNMENT bytes.  */
  extern __ptr_t memalign __P ((__malloc_size_t __alignment,
  			      __malloc_size_t __size));
  
  /* Allocate SIZE bytes on a page boundary.  */
! #if ! (defined (_MALLOC_INTERNAL) && defined (emacs)) /* Avoid conflict.  */
  extern __ptr_t valloc __P ((__malloc_size_t __size));
  #endif
--- 107,117 ----
  
  /* Allocate SIZE bytes allocated to ALIGNMENT bytes.  */
+ #if ! (defined (_MALLOC_INTERNAL) && __DJGPP__ - 0 == 1) /* Avoid conflict.  */
  extern __ptr_t memalign __P ((__malloc_size_t __alignment,
  			      __malloc_size_t __size));
+ #endif
  
  /* Allocate SIZE bytes on a page boundary.  */
! #if ! (defined (_MALLOC_INTERNAL) && defined (GMALLOC_INHIBIT_VALLOC))
  extern __ptr_t valloc __P ((__malloc_size_t __size));
  #endif
*************** extern __malloc_size_t __malloc_extra_bl
*** 239,242 ****
--- 241,246 ----
  /* Nonzero if `malloc' has been called and done its initialization.  */
  extern int __malloc_initialized;
+ /* Function called to initialize malloc data structures.  */
+ extern int __malloc_initialize __P ((void));
  
  /* Hooks for debugging versions.  */
*************** register_heapinfo ()
*** 464,471 ****
  
  /* Set everything up and remember that we have.  */
! static int initialize __P ((void));
! static int
! initialize ()
  {
    if (__malloc_initialize_hook)
      (*__malloc_initialize_hook) ();
--- 468,477 ----
  
  /* Set everything up and remember that we have.  */
! int
! __malloc_initialize ()
  {
+   if (__malloc_initialized)
+     return 0;
+ 
    if (__malloc_initialize_hook)
      (*__malloc_initialize_hook) ();
*************** morecore (size)
*** 521,549 ****
        while ((__malloc_size_t) BLOCK ((char *) result + size) > newsize);
  
!       /* First try to allocate the new info table in core we already have,
! 	 in the usual way using realloc.  If realloc cannot extend it in
! 	 place or relocate it to existing sufficient core, we will get
! 	 called again, and the code above will notice the
! 	 `morecore_recursing' flag and return null.  */
!       {
! 	int save = errno;	/* Don't want to clobber errno with ENOMEM.  */
! 	morecore_recursing = 1;
! 	newinfo = (malloc_info *) _realloc_internal
! 	  (_heapinfo, newsize * sizeof (malloc_info));
! 	morecore_recursing = 0;
! 	if (newinfo == NULL)
! 	  errno = save;
! 	else
! 	  {
! 	    /* We found some space in core, and realloc has put the old
! 	       table's blocks on the free list.  Now zero the new part
! 	       of the table and install the new table location.  */
! 	    memset (&newinfo[heapsize], 0,
! 		    (newsize - heapsize) * sizeof (malloc_info));
! 	    _heapinfo = newinfo;
! 	    heapsize = newsize;
! 	    goto got_heap;
! 	  }
!       }
  
        /* Allocate new space for the malloc info table.  */
--- 527,561 ----
        while ((__malloc_size_t) BLOCK ((char *) result + size) > newsize);
  
!       /* We must not reuse existing core for the new info table when called
! 	 from realloc in the case of growing a large block, because the
! 	 block being grown is momentarily marked as free.  In this case
! 	 _heaplimit is zero so we know not to reuse space for internal
! 	 allocation.  */
!       if (_heaplimit != 0)
! 	{
! 	  /* First try to allocate the new info table in core we already
! 	     have, in the usual way using realloc.  If realloc cannot
! 	     extend it in place or relocate it to existing sufficient core,
! 	     we will get called again, and the code above will notice the
! 	     `morecore_recursing' flag and return null.  */
! 	  int save = errno;	/* Don't want to clobber errno with ENOMEM.  */
! 	  morecore_recursing = 1;
! 	  newinfo = (malloc_info *) _realloc_internal
! 	    (_heapinfo, newsize * sizeof (malloc_info));
! 	  morecore_recursing = 0;
! 	  if (newinfo == NULL)
! 	    errno = save;
! 	  else
! 	    {
! 	      /* We found some space in core, and realloc has put the old
! 		 table's blocks on the free list.  Now zero the new part
! 		 of the table and install the new table location.  */
! 	      memset (&newinfo[heapsize], 0,
! 		      (newsize - heapsize) * sizeof (malloc_info));
! 	      _heapinfo = newinfo;
! 	      heapsize = newsize;
! 	      goto got_heap;
! 	    }
! 	}
  
        /* Allocate new space for the malloc info table.  */
*************** _malloc_internal (size)
*** 619,626 ****
  #endif
  
-   if (!__malloc_initialized)
-     if (!initialize ())
-       return NULL;
- 
    if (size < sizeof (struct list))
      size = sizeof (struct list);
--- 631,634 ----
*************** malloc (size)
*** 797,800 ****
--- 805,811 ----
       __malloc_size_t size;
  {
+   if (!__malloc_initialized && !__malloc_initialize ())
+     return NULL;
+ 
    return (__malloc_hook != NULL ? *__malloc_hook : _malloc_internal) (size);
  }
*************** __malloc_safe_bcopy (afrom, ato, size)
*** 1234,1238 ****
  	}
      }
! }     
  #endif /* emacs */
  
--- 1245,1249 ----
  	}
      }
! }
  #endif /* emacs */
  
*************** _realloc_internal (ptr, size)
*** 1322,1327 ****
  	  _heaplimit = 0;
  	  _free_internal (ptr);
- 	  _heaplimit = oldlimit;
  	  result = _malloc_internal (size);
  	  if (result == NULL)
  	    {
--- 1333,1339 ----
  	  _heaplimit = 0;
  	  _free_internal (ptr);
  	  result = _malloc_internal (size);
+ 	  if (_heaplimit == 0)
+ 	    _heaplimit = oldlimit;
  	  if (result == NULL)
  	    {
*************** realloc (ptr, size)
*** 1373,1376 ****
--- 1385,1391 ----
       __malloc_size_t size;
  {
+   if (!__malloc_initialized && !__malloc_initialize ())
+     return NULL;
+ 
    return (__realloc_hook != NULL ? *__realloc_hook : _realloc_internal)
      (ptr, size);
*************** __default_morecore (increment)
*** 1465,1469 ****
    return result;
  }
! /* Copyright (C) 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
  
  This library is free software; you can redistribute it and/or
--- 1480,1484 ----
    return result;
  }
! /* Copyright (C) 1991, 92, 93, 94, 95, 96 Free Software Foundation, Inc.
  
  This library is free software; you can redistribute it and/or
*************** Cambridge, MA 02139, USA.  */
*** 1487,1490 ****
--- 1502,1512 ----
  #endif
  
+ #if __DJGPP__ - 0 == 1
+ 
+ /* There is some problem with memalign in DJGPP v1 and we are supposed
+    to omit it.  Noone told me why, they just told me to do it.  */
+ 
+ #else
+ 
  __ptr_t (*__memalign_hook) __P ((size_t __size, size_t __alignment));
  
*************** memalign (alignment, size)
*** 1554,1555 ****
--- 1576,1638 ----
    return result;
  }
+ 
+ #endif /* Not DJGPP v1 */
+ /* Allocate memory on a page boundary.
+    Copyright (C) 1991, 92, 93, 94, 96 Free Software Foundation, Inc.
+ 
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+ 
+ This library 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
+ Library General Public License for more details.
+ 
+ You should have received a copy of the GNU Library General Public
+ License along with this library; see the file COPYING.LIB.  If
+ not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+ Cambridge, MA 02139, USA.
+ 
+    The author may be reached (Email) at the address mike@ai.mit.edu,
+    or (US mail) as Mike Haertel c/o Free Software Foundation.  */
+ 
+ #if defined (_MALLOC_INTERNAL) && defined (GMALLOC_INHIBIT_VALLOC)
+ 
+ /* Emacs defines GMALLOC_INHIBIT_VALLOC to avoid this definition
+    on MSDOS, where it conflicts with a system header file.  */
+ 
+ #define ELIDE_VALLOC
+ 
+ #endif
+ 
+ #ifndef	ELIDE_VALLOC
+ 
+ #if defined (__GNU_LIBRARY__) || defined (_LIBC)
+ #include <stddef.h>
+ #include <sys/cdefs.h>
+ extern size_t __getpagesize __P ((void));
+ #else
+ #include "getpagesize.h"
+ #define	 __getpagesize()	getpagesize()
+ #endif
+ 
+ #ifndef	_MALLOC_INTERNAL
+ #define	_MALLOC_INTERNAL
+ #include <malloc.h>
+ #endif
+ 
+ static __malloc_size_t pagesize;
+ 
+ __ptr_t
+ valloc (size)
+      __malloc_size_t size;
+ {
+   if (pagesize == 0)
+     pagesize = __getpagesize ();
+ 
+   return memalign (pagesize, size);
+ }
+ 
+ #endif	/* Not ELIDE_VALLOC.  */
diff -2rcpP --exclude=*.elc emacs-19.30/src/indent.c emacs-19.31/src/indent.c
*** emacs-19.30/src/indent.c	Tue Nov 14 15:51:05 1995
--- emacs-19.31/src/indent.c	Tue May 21 20:32:39 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** string_display_width (string, beg, end)
*** 354,361 ****
  DEFUN ("indent-to", Findent_to, Sindent_to, 1, 2, "NIndent to column: ",
    "Indent from point with tabs and spaces until COLUMN is reached.\n\
! Optional second argument MIN says always do at least MIN spaces\n\
! even if that goes past COLUMN; by default, MIN is zero.")
!   (col, minimum)
!      Lisp_Object col, minimum;
  {
    int mincol;
--- 355,362 ----
  DEFUN ("indent-to", Findent_to, Sindent_to, 1, 2, "NIndent to column: ",
    "Indent from point with tabs and spaces until COLUMN is reached.\n\
! Optional second argument MININUM says always do at least MININUM spaces\n\
! even if that goes past COLUMN; by default, MININUM is zero.")
!   (column, minimum)
!      Lisp_Object column, minimum;
  {
    int mincol;
*************** even if that goes past COLUMN; by defaul
*** 363,367 ****
    register int tab_width = XINT (current_buffer->tab_width);
  
!   CHECK_NUMBER (col, 0);
    if (NILP (minimum))
      XSETFASTINT (minimum, 0);
--- 364,368 ----
    register int tab_width = XINT (current_buffer->tab_width);
  
!   CHECK_NUMBER (column, 0);
    if (NILP (minimum))
      XSETFASTINT (minimum, 0);
*************** even if that goes past COLUMN; by defaul
*** 370,374 ****
    fromcol = current_column ();
    mincol = fromcol + XINT (minimum);
!   if (mincol < XINT (col)) mincol = XINT (col);
  
    if (fromcol == mincol)
--- 371,375 ----
    fromcol = current_column ();
    mincol = fromcol + XINT (minimum);
!   if (mincol < XINT (column)) mincol = XINT (column);
  
    if (fromcol == mincol)
*************** even if that goes past COLUMN; by defaul
*** 389,394 ****
      }
  
!   XSETFASTINT (col, mincol - fromcol);
!   Finsert_char (make_number (' '), col, Qt);
  
    last_known_column = mincol;
--- 390,395 ----
      }
  
!   XSETFASTINT (column, mincol - fromcol);
!   Finsert_char (make_number (' '), column, Qt);
  
    last_known_column = mincol;
*************** even if that goes past COLUMN; by defaul
*** 396,401 ****
    last_known_column_modified = MODIFF;
  
!   XSETINT (col, mincol);
!   return col;
  }
  
--- 397,402 ----
    last_known_column_modified = MODIFF;
  
!   XSETINT (column, mincol);
!   return column;
  }
  
*************** compute_motion (from, fromvpos, fromhpos
*** 676,681 ****
--- 677,684 ----
    /* The next buffer pos where we should consult the width run cache. */
    int next_width_run = from;
+   Lisp_Object window;
  
    XSETBUFFER (buffer, current_buffer);
+   XSETWINDOW (window, win);
  
    width_run_cache_on_off ();
*************** compute_motion (from, fromvpos, fromhpos
*** 747,752 ****
  	    /* if the `invisible' property is set, we can skip to
  	       the next property change */
! 	    prop = Fget_char_property (position, Qinvisible,
! 				       Fcurrent_buffer ());
  	    if (TEXT_PROP_MEANS_INVISIBLE (prop))
  	      pos = next_boundary;
--- 750,757 ----
  	    /* if the `invisible' property is set, we can skip to
  	       the next property change */
! 	    if (EQ (win->buffer, buffer))
! 	      prop = Fget_char_property (position, Qinvisible, window);
! 	    else
! 	      prop = Fget_char_property (position, Qinvisible, buffer);
  	    if (TEXT_PROP_MEANS_INVISIBLE (prop))
  	      pos = next_boundary;
*************** being displayed, perhaps because the lin
*** 984,990 ****
  If OFFSETS is nil, HSCROLL and TAB-OFFSET are assumed to be zero.\n\
  \n\
! WINDOW is the window to operate on.  Currently this is used only to\n\
! find the display table.  It does not matter what buffer WINDOW displays;\n\
! `compute-motion' always operates on the current buffer.\n\
  \n\
  The value is a list of five elements:\n\
--- 989,996 ----
  If OFFSETS is nil, HSCROLL and TAB-OFFSET are assumed to be zero.\n\
  \n\
! WINDOW is the window to operate on.  It is used to choose the display table;\n\
! if it is showing the current buffer, it is used also for\n\
! deciding which overlay properties apply.\n\
! Note that `compute-motion' always operates on the current buffer.\n\
  \n\
  The value is a list of five elements:\n\
diff -2rcpP --exclude=*.elc emacs-19.30/src/indent.h emacs-19.31/src/indent.h
*** emacs-19.30/src/indent.h	Thu Jun 15 16:39:02 1995
--- emacs-19.31/src/indent.h	Mon Jan 15 04:06:29 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/insdel.c emacs-19.31/src/insdel.c
*** emacs-19.30/src/insdel.c	Mon Oct 30 21:25:06 1995
--- emacs-19.31/src/insdel.c	Wed May  1 17:25:35 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** gap_right (pos)
*** 210,218 ****
  }
  
! /* Add `amount' to the position of every marker in the current buffer
!    whose current position is between `from' (exclusive) and `to' (inclusive).
     Also, any markers past the outside of that interval, in the direction
     of adjustment, are first moved back to the near end of the interval
!    and then adjusted by `amount'.  */
  
  static void
--- 211,224 ----
  }
  
! /* Add AMOUNT to the position of every marker in the current buffer
!    whose current position is between FROM (exclusive) and TO (inclusive).
! 
     Also, any markers past the outside of that interval, in the direction
     of adjustment, are first moved back to the near end of the interval
!    and then adjusted by AMOUNT.
! 
!    When the latter adjustment is done, if AMOUNT is negative,
!    we record the adjustment for undo.  (This case happens only for
!    deletion.)  */
  
  static void
*************** adjust_markers (from, to, amount)
*** 237,242 ****
        else
  	{
  	  if (mpos > from + amount && mpos <= from)
! 	    mpos = from + amount;
  	}
        if (mpos > from && mpos <= to)
--- 243,254 ----
        else
  	{
+ 	  /* Here's the case where a marker is inside text being deleted.
+ 	     AMOUNT can be negative for gap motion, too,
+ 	     but then this range contains no markers.  */
  	  if (mpos > from + amount && mpos <= from)
! 	    {
! 	      record_marker_adjustment (marker, from + amount - mpos);
! 	      mpos = from + amount;
! 	    }
  	}
        if (mpos > from && mpos <= to)
*************** adjust_markers_for_insert (pos, amount)
*** 272,276 ****
     not crossing any interval boundaries, so there's no need to use the
     usual SET_PT macro.  In fact it would be incorrect to do so, because
!    either the old or the new value of point is out of synch with the
     current set of intervals.  */
  static void
--- 284,288 ----
     not crossing any interval boundaries, so there's no need to use the
     usual SET_PT macro.  In fact it would be incorrect to do so, because
!    either the old or the new value of point is out of sync with the
     current set of intervals.  */
  static void
*************** del_range_1 (from, to, prepare)
*** 655,658 ****
--- 667,676 ----
      prepare_to_modify_buffer (from, to);
  
+   /* Relocate all markers pointing into the new, larger gap
+      to point at the end of the text before the gap.
+      This has to be done before recording the deletion,
+      so undo handles this after reinserting the text.  */
+   adjust_markers (to + GAP_SIZE, to + GAP_SIZE, - numdel - GAP_SIZE);
+ 
    record_delete (from, numdel);
    MODIFF++;
*************** del_range_1 (from, to, prepare)
*** 665,672 ****
    offset_intervals (current_buffer, from, - numdel);
  
-   /* Relocate all markers pointing into the new, larger gap
-      to point at the end of the text before the gap.  */
-   adjust_markers (to + GAP_SIZE, to + GAP_SIZE, - numdel - GAP_SIZE);
- 
    /* Adjust the overlay center as needed.  This must be done after
       adjusting the markers that bound the overlays.  */
--- 683,686 ----
*************** signal_before_change (start, end)
*** 823,829 ****
     LENDEL is the number of characters of the text before the change.
     (Not the whole buffer; just the part that was changed.)
!    LENINS is the number of characters in the changed text.
! 
!    (Hence POS + LENINS - LENDEL is the position after the changed text.)  */
  
  void
--- 837,842 ----
     LENDEL is the number of characters of the text before the change.
     (Not the whole buffer; just the part that was changed.)
!    LENINS is the number of characters in that part of the text
!    after the change.  */
  
  void
*************** signal_after_change (pos, lendel, lenins
*** 872,876 ****
        || !NILP (current_buffer->overlays_after))
      report_overlay_modification (make_number (pos),
! 				 make_number (pos + lenins - lendel),
  				 1,
  				 make_number (pos), make_number (pos + lenins),
--- 885,889 ----
        || !NILP (current_buffer->overlays_after))
      report_overlay_modification (make_number (pos),
! 				 make_number (pos + lenins),
  				 1,
  				 make_number (pos), make_number (pos + lenins),
diff -2rcpP --exclude=*.elc emacs-19.30/src/intervals.c emacs-19.31/src/intervals.c
*** emacs-19.30/src/intervals.c	Tue Sep 12 01:39:36 1995
--- emacs-19.31/src/intervals.c	Thu Apr 25 23:00:45 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** previous_interval (interval)
*** 681,685 ****
     finding the interval at position (don't add length going down),
     if it's the beginning of the interval, get the previous interval
!    and check the hugry bits of both.  Then add the length going back up
     to the root.  */
  
--- 682,686 ----
     finding the interval at position (don't add length going down),
     if it's the beginning of the interval, get the previous interval
!    and check the hungry bits of both.  Then add the length going back up
     to the root.  */
  
*************** adjust_intervals_for_insertion (tree, po
*** 794,798 ****
        /* Even if we are positioned between intervals, we default
  	 to the left one if it exists.  We extend it now and split
! 	 off a part later, if stickyness demands it.  */
        for (temp = prev ? prev : i;! NULL_INTERVAL_P (temp); temp = temp->parent)
  	{
--- 795,799 ----
        /* Even if we are positioned between intervals, we default
  	 to the left one if it exists.  We extend it now and split
! 	 off a part later, if stickiness demands it.  */
        for (temp = prev ? prev : i;! NULL_INTERVAL_P (temp); temp = temp->parent)
  	{
*************** adjust_intervals_for_insertion (tree, po
*** 802,806 ****
        
        /* If at least one interval has sticky properties,
! 	 we check the stickyness property by property.  */
        if (END_NONSTICKY_P (prev) || FRONT_STICKY_P (i))
  	{
--- 803,807 ----
        
        /* If at least one interval has sticky properties,
! 	 we check the stickiness property by property.  */
        if (END_NONSTICKY_P (prev) || FRONT_STICKY_P (i))
  	{
*************** graft_intervals_into_buffer (source, pos
*** 1517,1521 ****
       which means it gets those properties.
       The properties of under are the result of
!      adjust_intervals_for_insertion, so stickyness has
       already been taken care of.  */
       
--- 1518,1522 ----
       which means it gets those properties.
       The properties of under are the result of
!      adjust_intervals_for_insertion, so stickiness has
       already been taken care of.  */
       
diff -2rcpP --exclude=*.elc emacs-19.30/src/intervals.h emacs-19.31/src/intervals.h
*** emacs-19.30/src/intervals.h	Thu Jun 15 16:39:03 1995
--- emacs-19.31/src/intervals.h	Mon Jan 15 04:06:29 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  #ifdef USE_TEXT_PROPERTIES
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  #ifdef USE_TEXT_PROPERTIES
diff -2rcpP --exclude=*.elc emacs-19.30/src/keyboard.c emacs-19.31/src/keyboard.c
*** emacs-19.30/src/keyboard.c	Fri Nov 24 17:25:27 1995
--- emacs-19.31/src/keyboard.c	Thu May 23 15:20:25 1996
***************
*** 1,4 ****
  /* Keyboard and mouse input; editor command loop.
!    Copyright (C) 1985,86,87,88,89,93,94,95 Free Software Foundation, Inc.
  
  This file is part of GNU Emacs.
--- 1,4 ----
  /* Keyboard and mouse input; editor command loop.
!    Copyright (C) 1985,86,87,88,89,93,94,95,96 Free Software Foundation, Inc.
  
  This file is part of GNU Emacs.
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  /* Allow config.h to undefine symbols found here.  */
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* Allow config.h to undefine symbols found here.  */
*************** Lisp_Object this_command_keys;
*** 125,128 ****
--- 126,133 ----
  int this_command_key_count;
  
+ /* Number of elements of this_command_keys
+    that precede this key sequence.  */
+ int this_single_command_key_start;
+ 
  /* Record values of this_command_key_count and echo_length ()
     before this command was read.  */
*************** Lisp_Object Qmake_frame_visible;
*** 435,438 ****
--- 440,444 ----
  Lisp_Object Qfunction_key;
  Lisp_Object Qmouse_click;
+ Lisp_Object Qtimer_event;
  /* Lisp_Object Qmouse_movement; - also an event header */
  
*************** Lisp_Object recursive_edit_unwind (), co
*** 467,470 ****
--- 473,477 ----
  Lisp_Object Fthis_command_keys ();
  Lisp_Object Qextended_command_history;
+ EMACS_TIME timer_check ();
  
  extern char *x_get_keysym_name ();
*************** extern char *x_get_keysym_name ();
*** 472,475 ****
--- 479,491 ----
  Lisp_Object Qpolling_period;
  
+ /* List of absolute timers.  Appears in order of next scheduled event.  */
+ Lisp_Object Vtimer_list;
+ 
+ /* List of idle time timers.  Appears in order of next scheduled event.  */
+ Lisp_Object Vtimer_idle_list;
+ 
+ /* Incremented whenever a timer is run.  */
+ int timers_run;
+ 
  extern Lisp_Object Vprint_level, Vprint_length;
  
*************** int interrupt_input;
*** 485,489 ****
  int interrupts_deferred;
  
! /* nonzero means use ^S/^Q for flow control.  */
  int flow_control;
  
--- 501,505 ----
  int interrupts_deferred;
  
! /* Nonzero means use ^S/^Q for flow control.  */
  int flow_control;
  
*************** echo_prompt (str)
*** 555,559 ****
    current_kboard->echo_after_prompt = len;
  
!   echo ();
  }
  
--- 571,575 ----
    current_kboard->echo_after_prompt = len;
  
!   echo_now ();
  }
  
*************** echo_char (c)
*** 603,607 ****
        current_kboard->echoptr = ptr;
  
!       echo ();
      }
  }
--- 619,623 ----
        current_kboard->echoptr = ptr;
  
!       echo_now ();
      }
  }
*************** echo_dash ()
*** 628,632 ****
    current_kboard->echoptr[1] = 0;
  
!   echo ();
  }
  
--- 644,648 ----
    current_kboard->echoptr[1] = 0;
  
!   echo_now ();
  }
  
*************** echo_dash ()
*** 634,638 ****
     doing so.  */
  
! echo ()
  {
    if (!current_kboard->immediate_echo)
--- 650,654 ----
     doing so.  */
  
! echo_now ()
  {
    if (!current_kboard->immediate_echo)
*************** add_command_key (key)
*** 704,707 ****
--- 720,725 ----
      {
        this_command_key_count = before_command_key_count_1;
+       if (this_command_key_count < this_single_command_key_start)
+ 	this_single_command_key_start = this_command_key_count;
        echo_truncate (before_command_echo_length_1);
        before_command_restore_flag = 0;
*************** cmd_error_internal (data, context)
*** 901,908 ****
       char *context;
  {
-   Lisp_Object errmsg, tail, errname, file_error;
    Lisp_Object stream;
-   struct gcpro gcpro1;
-   int i;
  
    Vquit_flag = Qnil;
--- 919,923 ----
*************** cmd_error_internal (data, context)
*** 926,972 ****
      write_string_1 (context, -1, stream);
  
!   errname = Fcar (data);
! 
!   if (EQ (errname, Qerror))
!     {
!       data = Fcdr (data);
!       if (!CONSP (data)) data = Qnil;
!       errmsg = Fcar (data);
!       file_error = Qnil;
!     }
!   else
!     {
!       errmsg = Fget (errname, Qerror_message);
!       file_error = Fmemq (Qfile_error,
! 			  Fget (errname, Qerror_conditions));
!     }
! 
!   /* Print an error message including the data items.
!      This is done by printing it into a scratch buffer
!      and then making a copy of the text in the buffer. */
! 
!   if (!CONSP (data)) data = Qnil;
!   tail = Fcdr (data);
!   GCPRO1 (tail);
! 
!   /* For file-error, make error message by concatenating
!      all the data items.  They are all strings.  */
!   if (!NILP (file_error) && !NILP (tail))
!     errmsg = XCONS (tail)->car, tail = XCONS (tail)->cdr;
! 
!   if (STRINGP (errmsg))
!     Fprinc (errmsg, stream);
!   else
!     write_string_1 ("peculiar error", -1, stream);
! 
!   for (i = 0; CONSP (tail); tail = Fcdr (tail), i++)
!     {
!       write_string_1 (i ? ", " : ": ", 2, stream);
!       if (!NILP (file_error))
! 	Fprinc (Fcar (tail), stream);
!       else
! 	Fprin1 (Fcar (tail), stream);
!     }
!   UNGCPRO;
  
    /* If the window system or terminal frame hasn't been initialized
--- 941,945 ----
      write_string_1 (context, -1, stream);
  
!   print_error_message (data, stream);
  
    /* If the window system or terminal frame hasn't been initialized
*************** command_loop_1 ()
*** 1102,1105 ****
--- 1075,1079 ----
    no_redisplay = 0;
    this_command_key_count = 0;
+   this_single_command_key_start = 0;
  
    /* Make sure this hook runs after commands that get errors and
*************** command_loop_1 ()
*** 1150,1158 ****
  	  int count = specpdl_ptr - specpdl;
  	  specbind (Qinhibit_quit, Qt);
  	  Fsit_for (make_number (2), Qnil, Qnil);
  	  unbind_to (count, Qnil);
  
! 	  echo_area_glyphs = 0;
! 	  no_direct = 1;
  	  if (!NILP (Vquit_flag))
  	    {
--- 1124,1135 ----
  	  int count = specpdl_ptr - specpdl;
  	  specbind (Qinhibit_quit, Qt);
+ 
  	  Fsit_for (make_number (2), Qnil, Qnil);
+ 	  /* Clear the echo area.  */
+ 	  message2 (0);
+ 
  	  unbind_to (count, Qnil);
  
! 	  /* If a C-g came in before, treat it as input now.  */
  	  if (!NILP (Vquit_flag))
  	    {
*************** command_loop_1 ()
*** 1206,1209 ****
--- 1183,1187 ----
  	  cancel_echoing ();
  	  this_command_key_count = 0;
+ 	  this_single_command_key_start = 0;
  	  goto finalize;
  	}
*************** command_loop_1 ()
*** 1391,1395 ****
  	  if (NILP (current_kboard->Vprefix_arg))
  	    Fundo_boundary ();
! 	  Fcommand_execute (this_command, Qnil, Qnil);
  
  	}
--- 1369,1373 ----
  	  if (NILP (current_kboard->Vprefix_arg))
  	    Fundo_boundary ();
! 	  Fcommand_execute (this_command, Qnil, Qnil, Qnil);
  
  	}
*************** command_loop_1 ()
*** 1430,1433 ****
--- 1408,1412 ----
  	  cancel_echoing ();
  	  this_command_key_count = 0;
+ 	  this_single_command_key_start = 0;
  	}
  
*************** safe_run_hooks (hook)
*** 1487,1491 ****
    specbind (Qinhibit_quit, hook);
  
!   internal_condition_case (safe_run_hooks_1, Qerror, safe_run_hooks_error);
  
    unbind_to (count, Qnil);
--- 1466,1470 ----
    specbind (Qinhibit_quit, hook);
  
!   internal_condition_case (safe_run_hooks_1, Qt, safe_run_hooks_error);
  
    unbind_to (count, Qnil);
*************** input_poll_signal (signalnum)	/* If we d
*** 1510,1518 ****
       int signalnum;		/* some compilers complain in signal calls. */
  {
    if (interrupt_input_blocked == 0
        && !waiting_for_input)
      read_avail_input (0);
!   signal (SIGALRM, input_poll_signal);
!   alarm (polling_period);
  }
  
--- 1489,1501 ----
       int signalnum;		/* some compilers complain in signal calls. */
  {
+   /* This causes the call to start_polling at the end
+      to do its job.  It also arranges for a quit or error
+      from within read_avail_input to resume polling.  */
+   poll_suppress_count++;
    if (interrupt_input_blocked == 0
        && !waiting_for_input)
      read_avail_input (0);
!   /* Turn on the SIGALRM handler and request another alarm.  */
!   start_polling ();
  }
  
*************** read_char (commandflag, nmaps, maps, pre
*** 1775,1779 ****
      }
  
!   if (commandflag >= 0 && !input_pending && !detect_input_pending ())
      redisplay ();
  
--- 1758,1763 ----
      }
  
!   if (commandflag >= 0 && !input_pending
!       && !detect_input_pending_run_timers (0))
      redisplay ();
  
*************** read_char (commandflag, nmaps, maps, pre
*** 1798,1802 ****
        && NILP (Vunread_command_events)
        && unread_command_char < 0
!       && !detect_input_pending ())
      {
        c = read_char_minibuf_menu_prompt (commandflag, nmaps, maps);
--- 1782,1786 ----
        && NILP (Vunread_command_events)
        && unread_command_char < 0
!       && !detect_input_pending_run_timers (0))
      {
        c = read_char_minibuf_menu_prompt (commandflag, nmaps, maps);
*************** read_char (commandflag, nmaps, maps, pre
*** 1849,1852 ****
--- 1833,1838 ----
      }
  
+   timer_start_idle ();
+ 
    /* If in middle of key sequence and minibuffer not active,
       start echoing if enough time elapses.  */
*************** read_char (commandflag, nmaps, maps, pre
*** 1865,1869 ****
  	 and we don't want to delay before doing so.  */
        if (EVENT_HAS_PARAMETERS (prev_event))
! 	echo ();
        else
  	{
--- 1851,1855 ----
  	 and we don't want to delay before doing so.  */
        if (EVENT_HAS_PARAMETERS (prev_event))
! 	echo_now ();
        else
  	{
*************** read_char (commandflag, nmaps, maps, pre
*** 1873,1877 ****
  	  restore_getcjmp (save_jump);
  	  if (EQ (tem0, Qt))
! 	    echo ();
  	}
      }
--- 1859,1863 ----
  	  restore_getcjmp (save_jump);
  	  if (EQ (tem0, Qt))
! 	    echo_now ();
  	}
      }
*************** read_char (commandflag, nmaps, maps, pre
*** 1882,1886 ****
        && auto_save_interval > 0
        && num_nonmacro_input_chars - last_auto_save > max (auto_save_interval, 20)
!       && !detect_input_pending ())
      {
        Fdo_auto_save (Qnil, Qnil);
--- 1868,1872 ----
        && auto_save_interval > 0
        && num_nonmacro_input_chars - last_auto_save > max (auto_save_interval, 20)
!       && !detect_input_pending_run_timers (0))
      {
        Fdo_auto_save (Qnil, Qnil);
*************** read_char (commandflag, nmaps, maps, pre
*** 1928,1936 ****
  	{
  	  Lisp_Object tem0;
- 	  int delay = delay_level * XFASTINT (Vauto_save_timeout) / 4;
  
  	  save_getcjmp (save_jump);
  	  restore_getcjmp (local_getcjmp);
! 	  tem0 = sit_for (delay, 0, 1, 1);
  	  restore_getcjmp (save_jump);
  
--- 1914,1922 ----
  	{
  	  Lisp_Object tem0;
  
  	  save_getcjmp (save_jump);
  	  restore_getcjmp (local_getcjmp);
! 	  tem0 = sit_for (delay_level * XFASTINT (Vauto_save_timeout) / 4,
! 			  0, 1, 1);
  	  restore_getcjmp (save_jump);
  
*************** read_char (commandflag, nmaps, maps, pre
*** 1942,1946 ****
  		 available, garbage collect if there has been enough
  		 consing going on to make it worthwhile.  */
! 	      if (!detect_input_pending ()
  		  && consing_since_gc > gc_cons_threshold / 2)
  		Fgarbage_collect ();
--- 1928,1932 ----
  		 available, garbage collect if there has been enough
  		 consing going on to make it worthwhile.  */
! 	      if (!detect_input_pending_run_timers (0)
  		  && consing_since_gc > gc_cons_threshold / 2)
  		Fgarbage_collect ();
*************** read_char (commandflag, nmaps, maps, pre
*** 1964,1968 ****
  	  if (NILP (current_kboard->kbd_queue))
  	    current_kboard->kbd_queue_has_data = 0;
! 	  input_pending = readable_events ();
  #ifdef MULTI_FRAME
  	  if (EVENT_HAS_PARAMETERS (c)
--- 1950,1954 ----
  	  if (NILP (current_kboard->kbd_queue))
  	    current_kboard->kbd_queue_has_data = 0;
! 	  input_pending = readable_events (0);
  #ifdef MULTI_FRAME
  	  if (EVENT_HAS_PARAMETERS (c)
*************** read_char (commandflag, nmaps, maps, pre
*** 2052,2055 ****
--- 2038,2046 ----
   non_reread:
  
+   /* Now that we have read an event, Emacs is not idle--
+      unless the event was a timer event (not used now).  */
+   if (! (CONSP (c) && EQ (XCONS (c)->car, Qtimer_event)))
+     timer_stop_idle ();
+ 
    start_polling ();
  
*************** read_char (commandflag, nmaps, maps, pre
*** 2057,2061 ****
      {
        if (commandflag >= 0
! 	  && !input_pending && !detect_input_pending ())
  	redisplay ();
  
--- 2048,2052 ----
      {
        if (commandflag >= 0
! 	  && !input_pending && !detect_input_pending_run_timers (0))
  	redisplay ();
  
*************** read_char (commandflag, nmaps, maps, pre
*** 2083,2088 ****
    if (!NILP (tem))
      {
        last_input_char = c;
!       Fcommand_execute (tem, Qnil, Fvector (1, &last_input_char));
        goto retry;
      }
--- 2074,2086 ----
    if (!NILP (tem))
      {
+       int was_locked = single_kboard;
+ 
        last_input_char = c;
!       Fcommand_execute (tem, Qnil, Fvector (1, &last_input_char), Qt);
! 
!       /* Resume allowing input from any kboard, if that was true before.  */
!       if (!was_locked)
! 	any_kboard_state ();
! 
        goto retry;
      }
*************** tracking_off (old_value)
*** 2312,2319 ****
  	 the sort that we have just disabled, then we need to call
  	 redisplay.  */
!       if (!readable_events ())
  	{
  	  redisplay_preserve_echo_area ();
! 	  get_input_pending (&input_pending);
  	}
      }
--- 2310,2317 ----
  	 the sort that we have just disabled, then we need to call
  	 redisplay.  */
!       if (!readable_events (1))
  	{
  	  redisplay_preserve_echo_area ();
! 	  get_input_pending (&input_pending, 1);
  	}
      }
*************** some_mouse_moved ()
*** 2365,2370 ****
     would return.  If this returns false, a read-char would block.  */
  static int
! readable_events ()
  {
    if (kbd_fetch_ptr != kbd_store_ptr)
      return 1;
--- 2363,2372 ----
     would return.  If this returns false, a read-char would block.  */
  static int
! readable_events (do_timers_now)
!      int do_timers_now;
  {
+   if (do_timers_now)
+     timer_check (do_timers_now);
+ 
    if (kbd_fetch_ptr != kbd_store_ptr)
      return 1;
*************** kbd_buffer_get_event (kbp, used_mouse_me
*** 2546,2549 ****
--- 2548,2552 ----
    register int c;
    Lisp_Object obj;
+   EMACS_TIME next_timer_delay;
  
    if (noninteractive)
*************** kbd_buffer_get_event (kbp, used_mouse_me
*** 2635,2639 ****
  	  copy = *event;
  	  kbd_fetch_ptr = event + 1;
! 	  input_pending = readable_events ();
  	  x_handle_selection_request (&copy);
  #else
--- 2638,2642 ----
  	  copy = *event;
  	  kbd_fetch_ptr = event + 1;
! 	  input_pending = readable_events (0);
  	  x_handle_selection_request (&copy);
  #else
*************** kbd_buffer_get_event (kbp, used_mouse_me
*** 2652,2656 ****
  	  copy = *event;
  	  kbd_fetch_ptr = event + 1;
! 	  input_pending = readable_events ();
  	  x_handle_selection_clear (&copy);
  #else
--- 2655,2659 ----
  	  copy = *event;
  	  kbd_fetch_ptr = event + 1;
! 	  input_pending = readable_events (0);
  	  x_handle_selection_clear (&copy);
  #else
*************** kbd_buffer_get_event (kbp, used_mouse_me
*** 2693,2697 ****
  	{
  	  kbd_fetch_ptr = event + 1;
! 	  input_pending = readable_events ();
  	  x_activate_menubar (XFRAME (event->frame_or_window));
  	}
--- 2696,2700 ----
  	{
  	  kbd_fetch_ptr = event + 1;
! 	  input_pending = readable_events (0);
  	  x_activate_menubar (XFRAME (event->frame_or_window));
  	}
*************** kbd_buffer_get_event (kbp, used_mouse_me
*** 2805,2809 ****
      abort ();
  
!   input_pending = readable_events ();
  
  #ifdef MULTI_FRAME
--- 2808,2812 ----
      abort ();
  
!   input_pending = readable_events (0);
  
  #ifdef MULTI_FRAME
*************** kbd_buffer_get_event (kbp, used_mouse_me
*** 2818,2823 ****
  
  void
! swallow_events ()
  {
    while (kbd_fetch_ptr != kbd_store_ptr)
      {
--- 2821,2829 ----
  
  void
! swallow_events (do_display)
!      int do_display;
  {
+   int old_timers_run;
+ 
    while (kbd_fetch_ptr != kbd_store_ptr)
      {
*************** swallow_events ()
*** 2842,2846 ****
  	  copy = *event;
  	  kbd_fetch_ptr = event + 1;
! 	  input_pending = readable_events ();
  	  x_handle_selection_request (&copy);
  #else
--- 2848,2852 ----
  	  copy = *event;
  	  kbd_fetch_ptr = event + 1;
! 	  input_pending = readable_events (0);
  	  x_handle_selection_request (&copy);
  #else
*************** swallow_events ()
*** 2860,2864 ****
  
  	  kbd_fetch_ptr = event + 1;
! 	  input_pending = readable_events ();
  	  x_handle_selection_clear (&copy);
  #else
--- 2866,2870 ----
  
  	  kbd_fetch_ptr = event + 1;
! 	  input_pending = readable_events (0);
  	  x_handle_selection_clear (&copy);
  #else
*************** swallow_events ()
*** 2868,2876 ****
  #endif
  	}
        else
  	break;
      }
  
!   get_input_pending (&input_pending);
  }
  
--- 2874,3185 ----
  #endif
  	}
+       /* Note that timer_event is currently never used.  */
+       else if (event->kind == timer_event)
+ 	{
+ 	  Lisp_Object tem, lisp_event;
+ 	  int was_locked = single_kboard;
+ 
+ 	  tem = get_keymap_1 (Vspecial_event_map, 0, 0);
+ 	  tem = get_keyelt (access_keymap (tem, Qtimer_event, 0, 0),
+ 			    1);
+ 	  lisp_event = Fcons (Qtimer_event,
+ 			      Fcons (Fcdr (event->frame_or_window), Qnil));
+ 	  kbd_fetch_ptr = event + 1;
+ 	  if (kbd_fetch_ptr == kbd_store_ptr)
+ 	    input_pending = 0;
+ 	  Fcommand_execute (tem, Qnil, Fvector (1, &lisp_event), Qt);
+ 	  timers_run++;
+ 	  if (do_display)
+ 	    redisplay_preserve_echo_area ();
+ 
+ 	  /* Resume allowing input from any kboard, if that was true before.  */
+ 	  if (!was_locked)
+ 	    any_kboard_state ();
+ 	}
        else
  	break;
      }
  
!   old_timers_run = timers_run;
!   get_input_pending (&input_pending, 1);
! 
!   if (timers_run != old_timers_run && do_display)
!     redisplay_preserve_echo_area ();
! }
! 
! static EMACS_TIME timer_idleness_start_time;
! 
! /* Record the start of when Emacs is idle,
!    for the sake of running idle-time timers.  */
! 
! timer_start_idle ()
! {
!   Lisp_Object timers;
! 
!   /* If we are already in the idle state, do nothing.  */
!   if (! EMACS_TIME_NEG_P (timer_idleness_start_time))
!     return;
! 
!   EMACS_GET_TIME (timer_idleness_start_time);
! 
!   /* Mark all idle-time timers as once again candidates for running.  */
!   for (timers = Vtimer_idle_list; CONSP (timers); timers = XCONS (timers)->cdr)
!     {
!       Lisp_Object timer;
! 
!       timer = XCONS (timers)->car;
! 
!       if (!VECTORP (timer) || XVECTOR (timer)->size != 8)
! 	continue;
!       XVECTOR (timer)->contents[0] = Qnil;
!     }
! }
! 
! /* Record that Emacs is no longer idle, so stop running idle-time timers.  */
! 
! timer_stop_idle ()
! {
!   EMACS_SET_SECS_USECS (timer_idleness_start_time, -1, -1);
! }
! 
! /* This is only for debugging.  */
! struct input_event last_timer_event;
! 
! /* Check whether a timer has fired.  To prevent larger problems we simply
!    disregard elements that are not proper timers.  Do not make a circular
!    timer list for the time being.
! 
!    Returns the number of seconds to wait until the next timer fires.  If a
!    timer is triggering now, return zero seconds.
!    If no timer is active, return -1 seconds.
! 
!    If a timer is ripe, we run it, with quitting turned off.
! 
!    DO_IT_NOW is now ignored.  It used to mean that we should
!    run the timer directly instead of queueing a timer-event.
!    Now we always run timers directly.  */
! 
! EMACS_TIME
! timer_check (do_it_now)
!      int do_it_now;
! {
!   EMACS_TIME nexttime;
!   EMACS_TIME now, idleness_now;
!   Lisp_Object timers, idle_timers, chosen_timer;
!   /* Nonzero if we generate some events.  */
!   int events_generated = 0;
!   struct gcpro gcpro1, gcpro2, gcpro3;
! 
!   EMACS_SET_SECS (nexttime, -1);
!   EMACS_SET_USECS (nexttime, -1);
! 
!   /* Always consider the ordinary timers.  */
!   timers = Vtimer_list;
!   /* Consider the idle timers only if Emacs is idle.  */
!   if (! EMACS_TIME_NEG_P (timer_idleness_start_time))
!     idle_timers = Vtimer_idle_list;
!   else
!     idle_timers = Qnil;
!   chosen_timer = Qnil;
!   GCPRO3 (timers, idle_timers, chosen_timer);
! 
!   if (CONSP (timers) || CONSP (idle_timers))
!     {
!       EMACS_GET_TIME (now);
!       if (! EMACS_TIME_NEG_P (timer_idleness_start_time))
! 	EMACS_SUB_TIME (idleness_now, now, timer_idleness_start_time);
!     }
! 
!   while (CONSP (timers) || CONSP (idle_timers))
!     {
!       int triggertime = EMACS_SECS (now);
!       Lisp_Object *vector;
!       Lisp_Object timer, idle_timer;
!       EMACS_TIME timer_time, idle_timer_time;
!       EMACS_TIME difference, timer_difference, idle_timer_difference;
! 
!       /* Skip past invalid timers and timers already handled.  */
!       if (!NILP (timers))
! 	{
! 	  timer = XCONS (timers)->car;
! 	  if (!VECTORP (timer) || XVECTOR (timer)->size != 8)
! 	    {
! 	      timers = XCONS (timers)->cdr;
! 	      continue;
! 	    }
! 	  vector = XVECTOR (timer)->contents;
! 
! 	  if (!INTEGERP (vector[1]) || !INTEGERP (vector[2])
! 	      || !INTEGERP (vector[3])
! 	      || ! NILP (vector[0]))
! 	    {
! 	      timers = XCONS (timers)->cdr;
! 	      continue;
! 	    }
! 	}
!       if (!NILP (idle_timers))
! 	{
! 	  timer = XCONS (idle_timers)->car;
! 	  if (!VECTORP (timer) || XVECTOR (timer)->size != 8)
! 	    {
! 	      idle_timers = XCONS (idle_timers)->cdr;
! 	      continue;
! 	    }
! 	  vector = XVECTOR (timer)->contents;
! 
! 	  if (!INTEGERP (vector[1]) || !INTEGERP (vector[2])
! 	      || !INTEGERP (vector[3])
! 	      || ! NILP (vector[0]))
! 	    {
! 	      idle_timers = XCONS (idle_timers)->cdr;
! 	      continue;
! 	    }
! 	}
! 
!       /* Set TIMER, TIMER_TIME and TIMER_DIFFERENCE
! 	 based on the next ordinary timer.
! 	 TIMER_DIFFERENCE is the distance in time from NOW to when
! 	 this timer becomes ripe (negative if it's already ripe).  */
!       if (!NILP (timers))
! 	{
! 	  timer = XCONS (timers)->car;
! 	  vector = XVECTOR (timer)->contents;
! 	  EMACS_SET_SECS (timer_time,
! 			  (XINT (vector[1]) << 16) | (XINT (vector[2])));
! 	  EMACS_SET_USECS (timer_time, XINT (vector[3]));
! 	  EMACS_SUB_TIME (timer_difference, timer_time, now);
! 	}
! 
!       /* Set IDLE_TIMER, IDLE_TIMER_TIME and IDLE_TIMER_DIFFERENCE
! 	 based on the next idle timer.  */
!       if (!NILP (idle_timers))
! 	{
! 	  idle_timer = XCONS (idle_timers)->car;
! 	  vector = XVECTOR (idle_timer)->contents;
! 	  EMACS_SET_SECS (idle_timer_time,
! 			  (XINT (vector[1]) << 16) | (XINT (vector[2])));
! 	  EMACS_SET_USECS (idle_timer_time, XINT (vector[3]));
! 	  EMACS_SUB_TIME (idle_timer_difference, idle_timer_time, idleness_now);
! 	}
! 
!       /* Decide which timer is the next timer,
! 	 and set CHOSEN_TIMER, VECTOR and DIFFERENCE accordingly.
! 	 Also step down the list where we found that timer.  */
! 
!       if (! NILP (timers) && ! NILP (idle_timers))
! 	{
! 	  EMACS_TIME temp;
! 	  EMACS_SUB_TIME (temp, timer_difference, idle_timer_difference);
! 	  if (EMACS_TIME_NEG_P (temp))
! 	    {
! 	      chosen_timer = timer;
! 	      timers = XCONS (timers)->cdr;
! 	      difference = timer_difference;
! 	    }
! 	  else
! 	    {
! 	      chosen_timer = idle_timer;
! 	      idle_timers = XCONS (idle_timers)->cdr;
! 	      difference = idle_timer_difference;
! 	    }
! 	}
!       else if (! NILP (timers))
! 	{
! 	  chosen_timer = timer;
! 	  timers = XCONS (timers)->cdr;
! 	  difference = timer_difference;
! 	}
!       else
! 	{
! 	  chosen_timer = idle_timer;
! 	  idle_timers = XCONS (idle_timers)->cdr;
! 	  difference = idle_timer_difference;
! 	}
!       vector = XVECTOR (chosen_timer)->contents;
! 	
!       /* If timer is rupe, run it if it hasn't been run.  */
!       if (EMACS_TIME_NEG_P (difference)
! 	  || (EMACS_SECS (difference) == 0
! 	      && EMACS_USECS (difference) == 0))
! 	{
! 	  if (NILP (vector[0]))
! 	    {
! 	      /* Mark the timer as triggered to prevent problems if the lisp
! 		 code fails to reschedule it right.  */
! 	      vector[0] = Qt;
! 
! 	      /* Run the timer or queue a timer event.  */
! 	      if (1)
! 		{
! 		  Lisp_Object tem, event;
! 		  int was_locked = single_kboard;
! 		  int count = specpdl_ptr - specpdl;
! 
! 		  specbind (Qinhibit_quit, Qt);
! 
! 		  tem = get_keymap_1 (Vspecial_event_map, 0, 0);
! 		  tem = get_keyelt (access_keymap (tem, Qtimer_event, 0, 0),
! 				    1);
! 		  event = Fcons (Qtimer_event, Fcons (chosen_timer, Qnil));
! 		  Fcommand_execute (tem, Qnil, Fvector (1, &event), Qt);
! 		  timers_run++;
! 
! 		  unbind_to (count, Qnil);
! 
! 		  /* Resume allowing input from any kboard, if that was true before.  */
! 		  if (!was_locked)
! 		    any_kboard_state ();
! 
! 		  /* Since we have handled the event,
! 		     we don't need to tell the caller to wake up and do it.  */
! 		}
! #if 0
! 	      else
! 		{
! 		  /* Generate a timer event so the caller will handle it.  */
! 		  struct input_event event;
! 
! 		  event.kind = timer_event;
! 		  event.modifiers = 0;
! 		  event.x = event.y = Qnil;
! 		  event.timestamp = triggertime;
! 		  /* Store the timer in the frame slot.  */
! 		  event.frame_or_window
! 		    = Fcons (Fselected_frame (), chosen_timer);
! 		  kbd_buffer_store_event (&event);
! 
! 		  last_timer_event = event;
! 
! 		  /* Tell caller to handle this event right away.  */
! 		  events_generated = 1;
! 		  EMACS_SET_SECS (nexttime, 0);
! 		  EMACS_SET_USECS (nexttime, 0);
! 
! 		  /* Don't queue more than one event at once.
! 		     When Emacs is ready for another, it will
! 		     queue the next one.  */
! 		  UNGCPRO;
! 		  return nexttime;
! 		}
! #endif /* 0 */
! 	    }
! 	}
!       else
! 	/* When we encounter a timer that is still waiting,
! 	   return the amount of time to wait before it is ripe.  */
! 	{
! 	  UNGCPRO;
! 	  /* But if we generated an event,
! 	     tell the caller to handle it now.  */
! 	  if (events_generated)
! 	    return nexttime;
! 	  return difference;
! 	}
!     }
! 
!   /* No timers are pending in the future.  */
!   /* Return 0 if we generated an event, and -1 if not.  */
!   UNGCPRO;
!   return nexttime;
  }
  
*************** char *lispy_function_keys[] =
*** 3037,3043 ****
      0, 0, 0, 0, 0, 0, 0, 0,
      
!     0,               /* VK_LWIN           0x5B */
!     0,               /* VK_RWIN           0x5C */
!     0,               /* VK_APPS           0x5D */
      
      0, 0,            /*    0x5E .. 0x5F        */
--- 3346,3352 ----
      0, 0, 0, 0, 0, 0, 0, 0,
      
!     "lwindow",       /* VK_LWIN           0x5B */
!     "rwindow",       /* VK_RWIN           0x5C */
!     "apps",          /* VK_APPS           0x5D */
      
      0, 0,            /*    0x5E .. 0x5F        */
*************** char *lispy_function_keys[] =
*** 3090,3097 ****
      "scroll",        /* VK_SCROLL         0x91 */
      
!     0, 0, 0, 0, 0,   /*    0x92 .. 0x96        */
!     0, 0, 0, 0, 0,   /*    0x97 .. 0x9B        */
!     0, 0, 0, 0,      /*    0x9C .. 0x9F        */
!     
      /*
       * VK_L* & VK_R* - left and right Alt, Ctrl and Shift virtual keys.
--- 3399,3417 ----
      "scroll",        /* VK_SCROLL         0x91 */
      
!     "kp-space",	     /* VK_NUMPAD_CLEAR   0x92 */
!     "kp-enter",	     /* VK_NUMPAD_ENTER   0x93 */
!     "kp-prior",	     /* VK_NUMPAD_PRIOR   0x94 */
!     "kp-next",	     /* VK_NUMPAD_NEXT    0x95 */
!     "kp-end",	     /* VK_NUMPAD_END     0x96 */
!     "kp-home",	     /* VK_NUMPAD_HOME    0x97 */
!     "kp-left",	     /* VK_NUMPAD_LEFT    0x98 */
!     "kp-up",	     /* VK_NUMPAD_UP      0x99 */
!     "kp-right",	     /* VK_NUMPAD_RIGHT   0x9A */
!     "kp-down",	     /* VK_NUMPAD_DOWN    0x9B */
!     "kp-insert",     /* VK_NUMPAD_INSERT  0x9C */
!     "kp-delete",     /* VK_NUMPAD_DELETE  0x9D */
! 
!     0, 0,	     /*    0x9E .. 0x9F        */
! 
      /*
       * VK_L* & VK_R* - left and right Alt, Ctrl and Shift virtual keys.
*************** static char *lispy_mouse_names[] =
*** 3231,3238 ****
  /* Scroll bar parts.  */
  Lisp_Object Qabove_handle, Qhandle, Qbelow_handle;
  
  /* An array of scroll bar parts, indexed by an enum scroll_bar_part value.  */
  Lisp_Object *scroll_bar_parts[] = {
!   &Qabove_handle, &Qhandle, &Qbelow_handle
  };
  
--- 3551,3560 ----
  /* Scroll bar parts.  */
  Lisp_Object Qabove_handle, Qhandle, Qbelow_handle;
+ Lisp_Object Qup, Qdown;
  
  /* An array of scroll bar parts, indexed by an enum scroll_bar_part value.  */
  Lisp_Object *scroll_bar_parts[] = {
!   &Qabove_handle, &Qhandle, &Qbelow_handle,
!   &Qup, &Qdown,
  };
  
*************** make_lispy_event (event)
*** 3342,3345 ****
--- 3664,3671 ----
        break;
  
+       /* Note that timer_event is currently never used.  */
+     case timer_event:
+       return Fcons (Qtimer_event, Fcons (Fcdr (event->frame_or_window), Qnil));
+ 
  #ifdef HAVE_MOUSE
        /* A mouse click.  Figure out where it is, decide whether it's
*************** make_lispy_event (event)
*** 3399,3407 ****
  		item = Qnil;
  		items = FRAME_MENU_BAR_ITEMS (f);
! 		for (i = 0; i < XVECTOR (items)->size; i += 3)
  		  {
  		    Lisp_Object pos, string;
  		    string = XVECTOR (items)->contents[i + 1];
! 		    pos = XVECTOR (items)->contents[i + 2];
  		    if (NILP (string))
  		      break;
--- 3725,3733 ----
  		item = Qnil;
  		items = FRAME_MENU_BAR_ITEMS (f);
! 		for (i = 0; i < XVECTOR (items)->size; i += 4)
  		  {
  		    Lisp_Object pos, string;
  		    string = XVECTOR (items)->contents[i + 1];
! 		    pos = XVECTOR (items)->contents[i + 3];
  		    if (NILP (string))
  		      break;
*************** make_lispy_event (event)
*** 3468,3477 ****
  	    part = *scroll_bar_parts[(int) event->part];
  
! 	    position =
! 	      Fcons (window,
! 		     Fcons (Qvertical_scroll_bar,
! 			    Fcons (portion_whole,
! 				   Fcons (make_number (event->timestamp),
! 					  Fcons (part, Qnil)))));
  	  }
  
--- 3794,3803 ----
  	    part = *scroll_bar_parts[(int) event->part];
  
! 	    position
! 	      = Fcons (window,
! 		       Fcons (Qvertical_scroll_bar,
! 			      Fcons (portion_whole,
! 				     Fcons (make_number (event->timestamp),
! 					    Fcons (part, Qnil)))));
  	  }
  
*************** make_lispy_event (event)
*** 3585,3588 ****
--- 3911,3964 ----
  	}
        }
+ 
+ #ifdef WINDOWSNT
+     case win32_scroll_bar_click:
+       {
+ 	int button = event->code;
+ 	int is_double;
+ 	Lisp_Object position;
+ 	Lisp_Object *start_pos_ptr;
+ 	Lisp_Object start_pos;
+ 
+ 	if (button < 0 || button >= NUM_MOUSE_BUTTONS)
+ 	  abort ();
+ 
+ 	{
+ 	  Lisp_Object window;
+ 	  Lisp_Object portion_whole;
+ 	  Lisp_Object part;
+ 
+ 	  window = event->frame_or_window;
+ 	  portion_whole = Fcons (event->x, event->y);
+ 	  part = *scroll_bar_parts[(int) event->part];
+ 
+ 	  position =
+ 	    Fcons (window,
+ 		   Fcons (Qvertical_scroll_bar,
+ 			  Fcons (portion_whole,
+ 				 Fcons (make_number (event->timestamp),
+ 					Fcons (part, Qnil)))));
+ 	}
+ 
+ 	/* Always treat Win32 scroll bar events as clicks. */
+ 	event->modifiers |= click_modifier;
+ 
+ 	{
+ 	  /* Get the symbol we should use for the mouse click.  */
+ 	  Lisp_Object head;
+ 
+ 	  head = modify_event_symbol (button,
+ 				      event->modifiers,
+ 				      Qmouse_click, Qnil,
+ 				      lispy_mouse_names, &mouse_syms,
+ 				      (sizeof (lispy_mouse_names)
+ 				       / sizeof (lispy_mouse_names[0])));
+ 	  return Fcons (head,
+ 			Fcons (position,
+ 			       Qnil));
+ 	}
+       }
+ #endif
+ 
  #endif /* HAVE_MOUSE */
  
*************** modify_event_symbol (symbol_num, modifie
*** 4128,4139 ****
  
  DEFUN ("event-convert-list", Fevent_convert_list, Sevent_convert_list, 1, 1, 0,
!   "Convert the event description LIST to an event type.\n\
! LIST should contain one base event type (a character or symbol)\n\
  and zero or more modifier names (control, meta, hyper, super, shift, alt,\n\
! drag, down, double or triple).\n\
  The return value is an event type (a character or symbol) which\n\
  has the same base event type and all the specified modifiers.")
!   (event)
!      Lisp_Object event;
  {
    Lisp_Object base;
--- 4504,4515 ----
  
  DEFUN ("event-convert-list", Fevent_convert_list, Sevent_convert_list, 1, 1, 0,
!   "Convert the event description list EVENT-DESC to an event type.\n\
! EVENT-DESC should contain one base event type (a character or symbol)\n\
  and zero or more modifier names (control, meta, hyper, super, shift, alt,\n\
! drag, down, double or triple).  The base must be last.\n\
  The return value is an event type (a character or symbol) which\n\
  has the same base event type and all the specified modifiers.")
!   (event_desc)
!      Lisp_Object event_desc;
  {
    Lisp_Object base;
*************** has the same base event type and all the
*** 4142,4146 ****
  
    base = Qnil;
!   rest = event;
    while (CONSP (rest))
      {
--- 4518,4522 ----
  
    base = Qnil;
!   rest = event_desc;
    while (CONSP (rest))
      {
*************** has the same base event type and all the
*** 4149,4155 ****
  
        elt = XCONS (rest)->car;
  
        /* Given a symbol, see if it is a modifier name.  */
!       if (SYMBOLP (elt))
  	this = parse_solitary_modifier (elt);
  
--- 4525,4532 ----
  
        elt = XCONS (rest)->car;
+       rest = XCONS (rest)->cdr;
  
        /* Given a symbol, see if it is a modifier name.  */
!       if (SYMBOLP (elt) && CONSP (rest))
  	this = parse_solitary_modifier (elt);
  
*************** has the same base event type and all the
*** 4161,4165 ****
  	base = elt;
  
-       rest = XCONS (rest)->cdr;
      }
  
--- 4538,4541 ----
*************** lucid_event_type_list_p (object)
*** 4298,4309 ****
     Serves the purpose of ioctl (0, FIONREAD, addr)
     but works even if FIONREAD does not exist.
!    (In fact, this may actually read some input.)  */
  
  static void
! get_input_pending (addr)
       int *addr;
  {
    /* First of all, have we already counted some input?  */
!   *addr = !NILP (Vquit_flag) || readable_events ();
  
    /* If input is being read as it arrives, and we have none, there is none.  */
--- 4674,4688 ----
     Serves the purpose of ioctl (0, FIONREAD, addr)
     but works even if FIONREAD does not exist.
!    (In fact, this may actually read some input.)
! 
!    If DO_TIMERS_NOW is nonzero, actually run timer events that are ripe.  */
  
  static void
! get_input_pending (addr, do_timers_now)
       int *addr;
+      int do_timers_now;
  {
    /* First of all, have we already counted some input?  */
!   *addr = !NILP (Vquit_flag) || readable_events (do_timers_now);
  
    /* If input is being read as it arrives, and we have none, there is none.  */
*************** get_input_pending (addr)
*** 4313,4317 ****
    /* Try to read some input and see how much we get.  */
    gobble_input (0);
!   *addr = !NILP (Vquit_flag) || readable_events ();
  }
  
--- 4692,4696 ----
    /* Try to read some input and see how much we get.  */
    gobble_input (0);
!   *addr = !NILP (Vquit_flag) || readable_events (do_timers_now);
  }
  
*************** reinvoke_input_signal ()
*** 4592,4596 ****
  {
  #ifdef SIGIO
!   kill (0, SIGIO);
  #endif
  }
--- 4971,4975 ----
  {
  #ifdef SIGIO
!   kill (getpid (), SIGIO);
  #endif
  }
*************** menu_bar_items (old)
*** 4729,4736 ****
        int end = menu_bar_items_index;
  
!       for (i = 0; i < end; i += 3)
  	if (EQ (XCONS (tail)->car, XVECTOR (menu_bar_items_vector)->contents[i]))
  	  {
! 	    Lisp_Object tem0, tem1, tem2;
  	    /* Move the item at index I to the end,
  	       shifting all the others forward.  */
--- 5108,5115 ----
        int end = menu_bar_items_index;
  
!       for (i = 0; i < end; i += 4)
  	if (EQ (XCONS (tail)->car, XVECTOR (menu_bar_items_vector)->contents[i]))
  	  {
! 	    Lisp_Object tem0, tem1, tem2, tem3;
  	    /* Move the item at index I to the end,
  	       shifting all the others forward.  */
*************** menu_bar_items (old)
*** 4738,4755 ****
  	    tem1 = XVECTOR (menu_bar_items_vector)->contents[i + 1];
  	    tem2 = XVECTOR (menu_bar_items_vector)->contents[i + 2];
! 	    if (end > i + 3)
! 	      bcopy (&XVECTOR (menu_bar_items_vector)->contents[i + 3],
  		     &XVECTOR (menu_bar_items_vector)->contents[i],
! 		     (end - i - 3) * sizeof (Lisp_Object));
! 	    XVECTOR (menu_bar_items_vector)->contents[end - 3] = tem0;
! 	    XVECTOR (menu_bar_items_vector)->contents[end - 2] = tem1;
! 	    XVECTOR (menu_bar_items_vector)->contents[end - 1] = tem2;
  	    break;
  	  }
      }
  
!   /* Add nil, nil, nil at the end.  */
    i = menu_bar_items_index;
!   if (i + 3 > XVECTOR (menu_bar_items_vector)->size)
      {
        Lisp_Object tem;
--- 5117,5136 ----
  	    tem1 = XVECTOR (menu_bar_items_vector)->contents[i + 1];
  	    tem2 = XVECTOR (menu_bar_items_vector)->contents[i + 2];
! 	    tem3 = XVECTOR (menu_bar_items_vector)->contents[i + 3];
! 	    if (end > i + 4)
! 	      bcopy (&XVECTOR (menu_bar_items_vector)->contents[i + 4],
  		     &XVECTOR (menu_bar_items_vector)->contents[i],
! 		     (end - i - 4) * sizeof (Lisp_Object));
! 	    XVECTOR (menu_bar_items_vector)->contents[end - 4] = tem0;
! 	    XVECTOR (menu_bar_items_vector)->contents[end - 3] = tem1;
! 	    XVECTOR (menu_bar_items_vector)->contents[end - 2] = tem2;
! 	    XVECTOR (menu_bar_items_vector)->contents[end - 1] = tem3;
  	    break;
  	  }
      }
  
!   /* Add nil, nil, nil, nil at the end.  */
    i = menu_bar_items_index;
!   if (i + 4 > XVECTOR (menu_bar_items_vector)->size)
      {
        Lisp_Object tem;
*************** menu_bar_items (old)
*** 4764,4767 ****
--- 5145,5149 ----
    XVECTOR (menu_bar_items_vector)->contents[i++] = Qnil;
    XVECTOR (menu_bar_items_vector)->contents[i++] = Qnil;
+   XVECTOR (menu_bar_items_vector)->contents[i++] = Qnil;
    menu_bar_items_index = i;
  
*************** menu_bar_item (key, item_string, def)
*** 4845,4856 ****
  	 discard any previously made menu bar item.  */
  
!       for (i = 0; i < menu_bar_items_index; i += 3)
  	if (EQ (key, XVECTOR (menu_bar_items_vector)->contents[i]))
  	  {
! 	    if (menu_bar_items_index > i + 3)
! 	      bcopy (&XVECTOR (menu_bar_items_vector)->contents[i + 3],
  		     &XVECTOR (menu_bar_items_vector)->contents[i],
! 		     (menu_bar_items_index - i - 3) * sizeof (Lisp_Object));
! 	    menu_bar_items_index -= 3;
  	    return;
  	  }
--- 5227,5238 ----
  	 discard any previously made menu bar item.  */
  
!       for (i = 0; i < menu_bar_items_index; i += 4)
  	if (EQ (key, XVECTOR (menu_bar_items_vector)->contents[i]))
  	  {
! 	    if (menu_bar_items_index > i + 4)
! 	      bcopy (&XVECTOR (menu_bar_items_vector)->contents[i + 4],
  		     &XVECTOR (menu_bar_items_vector)->contents[i],
! 		     (menu_bar_items_index - i - 4) * sizeof (Lisp_Object));
! 	    menu_bar_items_index -= 4;
  	    return;
  	  }
*************** menu_bar_item (key, item_string, def)
*** 4881,4885 ****
  
    /* Find any existing item for this KEY.  */
!   for (i = 0; i < menu_bar_items_index; i += 3)
      if (EQ (key, XVECTOR (menu_bar_items_vector)->contents[i]))
        break;
--- 5263,5267 ----
  
    /* Find any existing item for this KEY.  */
!   for (i = 0; i < menu_bar_items_index; i += 4)
      if (EQ (key, XVECTOR (menu_bar_items_vector)->contents[i]))
        break;
*************** menu_bar_item (key, item_string, def)
*** 4889,4893 ****
      {
        /* If vector is too small, get a bigger one.  */
!       if (i + 3 > XVECTOR (menu_bar_items_vector)->size)
  	{
  	  Lisp_Object tem;
--- 5271,5275 ----
      {
        /* If vector is too small, get a bigger one.  */
!       if (i + 4 > XVECTOR (menu_bar_items_vector)->size)
  	{
  	  Lisp_Object tem;
*************** menu_bar_item (key, item_string, def)
*** 4902,4905 ****
--- 5284,5288 ----
        XVECTOR (menu_bar_items_vector)->contents[i++] = item_string;
        XVECTOR (menu_bar_items_vector)->contents[i++] = Fcons (def, Qnil);
+       XVECTOR (menu_bar_items_vector)->contents[i++] = make_number (0);
        menu_bar_items_index = i;
      }
*************** read_char_x_menu_prompt (nmaps, maps, pr
*** 4971,4975 ****
      return Qnil;
  
! #if (defined (HAVE_X_WINDOWS) && defined (HAVE_X_MENU)) || defined (MSDOS) || defined (HAVE_NTGUI)
    /* If we got to this point via a mouse click,
       use a real menu for mouse selection.  */
--- 5354,5358 ----
      return Qnil;
  
! #ifdef HAVE_MENUS
    /* If we got to this point via a mouse click,
       use a real menu for mouse selection.  */
*************** read_char_x_menu_prompt (nmaps, maps, pr
*** 5021,5028 ****
        return value;
      }
! #endif /* (HAVE_X_WINDOWS && HAVE_X_MENU) || MSDOS || HAVE_NTGUI */
    return Qnil ;
  }
  
  static Lisp_Object
  read_char_minibuf_menu_prompt (commandflag, nmaps, maps)
--- 5404,5417 ----
        return value;
      }
! #endif /* HAVE_MENUS */
    return Qnil ;
  }
  
+ /* Buffer in use so far for the minibuf prompts for menu keymaps.
+    We make this bigger when necessary, and never free it.  */
+ static char *read_char_minibuf_menu_text;
+ /* Size of that buffer.  */
+ static int read_char_minibuf_menu_width;
+ 
  static Lisp_Object
  read_char_minibuf_menu_prompt (commandflag, nmaps, maps)
*************** read_char_minibuf_menu_prompt (commandfl
*** 5035,5046 ****
    int nlength;
    int width = FRAME_WIDTH (selected_frame) - 4;
-   char *menu = (char *) alloca (width + 4);
    int idx = -1;
    int nobindings = 1;
    Lisp_Object rest, vector;
  
    if (! menu_prompting)
      return Qnil;
  
    /* Get the menu name from the first map that has one (a prompt string).  */
    for (mapno = 0; mapno < nmaps; mapno++)
--- 5424,5449 ----
    int nlength;
    int width = FRAME_WIDTH (selected_frame) - 4;
    int idx = -1;
    int nobindings = 1;
    Lisp_Object rest, vector;
+   char *menu;
  
    if (! menu_prompting)
      return Qnil;
  
+   /* Make sure we have a big enough buffer for the menu text.  */
+   if (read_char_minibuf_menu_text == 0)
+     {
+       read_char_minibuf_menu_width = width + 4;
+       read_char_minibuf_menu_text = (char *) xmalloc (width + 4);
+     }
+   else if (width + 4 > read_char_minibuf_menu_width)
+     {
+       read_char_minibuf_menu_width = width + 4;
+       read_char_minibuf_menu_text
+ 	= (char *) xrealloc (read_char_minibuf_menu_text, width + 4);
+     }
+   menu = read_char_minibuf_menu_text;
+ 
    /* Get the menu name from the first map that has one (a prompt string).  */
    for (mapno = 0; mapno < nmaps; mapno++)
*************** read_key_sequence (keybuf, bufsize, prom
*** 5479,5482 ****
--- 5882,5886 ----
      echo_start = echo_length ();
    keys_start = this_command_key_count;
+   this_single_command_key_start = keys_start;
  
  #if defined (GOBBLE_FIRST_EVENT)
*************** read_key_sequence (keybuf, bufsize, prom
*** 5996,5999 ****
--- 6400,6406 ----
  	last_nonmenu_event = key;
  
+       /* Record what part of this_command_keys is the current key sequence.  */
+       this_single_command_key_start = this_command_key_count - t;
+ 
        prev_fkey_map = fkey_map;
        prev_fkey_start = fkey_start;
*************** read_key_sequence (keybuf, bufsize, prom
*** 6064,6068 ****
  		     other variables.)  */
  		  if (! (VECTORP (fkey_next) || STRINGP (fkey_next)))
! 		    error ("Function in function-key-map returns invalid key sequence");
  		}
  
--- 6471,6475 ----
  		     other variables.)  */
  		  if (! (VECTORP (fkey_next) || STRINGP (fkey_next)))
! 		    error ("Function in key-translation-map returns invalid key sequence");
  		}
  
*************** read_key_sequence (keybuf, bufsize, prom
*** 6237,6241 ****
  	  original_uppercase_position = t - 1;
  
! 	  if (XINT (new_key) & shift_modifier)
  	    XSETINT (new_key, XINT (key) & ~shift_modifier);
  	  else
--- 6644,6648 ----
  	  original_uppercase_position = t - 1;
  
! 	  if (XINT (key) & shift_modifier)
  	    XSETINT (new_key, XINT (key) & ~shift_modifier);
  	  else
*************** DEFUN ("read-key-sequence", Fread_key_se
*** 6398,6402 ****
  
    if (NILP (continue_echo))
!     this_command_key_count = 0;
  
    i = read_key_sequence (keybuf, (sizeof keybuf/sizeof (keybuf[0])),
--- 6805,6812 ----
  
    if (NILP (continue_echo))
!     {
!       this_command_key_count = 0;
!       this_single_command_key_start = 0;
!     }
  
    i = read_key_sequence (keybuf, (sizeof keybuf/sizeof (keybuf[0])),
*************** DEFUN ("read-key-sequence", Fread_key_se
*** 6413,6417 ****
  }
  
! DEFUN ("command-execute", Fcommand_execute, Scommand_execute, 1, 3, 0,
   "Execute CMD as an editor command.\n\
  CMD must be a symbol that satisfies the `commandp' predicate.\n\
--- 6823,6827 ----
  }
  
! DEFUN ("command-execute", Fcommand_execute, Scommand_execute, 1, 4, 0,
   "Execute CMD as an editor command.\n\
  CMD must be a symbol that satisfies the `commandp' predicate.\n\
*************** means unconditionally put this command i
*** 6420,6426 ****
  Otherwise, that is done only if an arg is read using the minibuffer.\n\
  The argument KEYS specifies the value to use instead of (this-command-keys)\n\
! when reading the arguments; if it is nil, (this_command_key_count) is used.")
!      (cmd, record, keys)
!      Lisp_Object cmd, record, keys;
  {
    register Lisp_Object final;
--- 6830,6838 ----
  Otherwise, that is done only if an arg is read using the minibuffer.\n\
  The argument KEYS specifies the value to use instead of (this-command-keys)\n\
! when reading the arguments; if it is nil, (this-command-keys) is used.\n\
! The argument SPECIAL, if non-nil, means that this command is executing\n\
! a special event, so ignore the prefix argument and don't clear it.")
!      (cmd, record_flag, keys, special)
!      Lisp_Object cmd, record_flag, keys, special;
  {
    register Lisp_Object final;
*************** when reading the arguments; if it is nil
*** 6430,6438 ****
    extern int debug_on_next_call;
  
-   prefixarg = current_kboard->Vprefix_arg;
-   current_kboard->Vprefix_arg = Qnil;
-   Vcurrent_prefix_arg = prefixarg;
    debug_on_next_call = 0;
  
    if (SYMBOLP (cmd))
      {
--- 6842,6856 ----
    extern int debug_on_next_call;
  
    debug_on_next_call = 0;
  
+   if (NILP (special))
+     {
+       prefixarg = current_kboard->Vprefix_arg;
+       Vcurrent_prefix_arg = prefixarg;
+       current_kboard->Vprefix_arg = Qnil;
+     }
+   else
+     prefixarg = Qnil;
+ 
    if (SYMBOLP (cmd))
      {
*************** when reading the arguments; if it is nil
*** 6461,6465 ****
  	 other sorts of commands, call-interactively takes care of
  	 this.  */
!       if (!NILP (record))
  	Vcommand_history
  	  = Fcons (Fcons (Qexecute_kbd_macro,
--- 6879,6883 ----
  	 other sorts of commands, call-interactively takes care of
  	 this.  */
!       if (!NILP (record_flag))
  	Vcommand_history
  	  = Fcons (Fcons (Qexecute_kbd_macro,
*************** when reading the arguments; if it is nil
*** 6478,6482 ****
        backtrace.evalargs = 0;
  
!       tem = Fcall_interactively (cmd, record, keys);
  
        backtrace_list = backtrace.next;
--- 6896,6900 ----
        backtrace.evalargs = 0;
  
!       tem = Fcall_interactively (cmd, record_flag, keys);
  
        backtrace_list = backtrace.next;
*************** DEFUN ("execute-extended-command", Fexec
*** 6538,6541 ****
--- 6956,6962 ----
  			       Qt, Qnil, Qextended_command_history);
  
+   if (STRINGP (function) && XSTRING (function)->size == 0)
+     error ("No command name given");
+ 
    /* Set this_command_keys to the concatenation of saved_keys and
       function, followed by a RET.  */
*************** DEFUN ("execute-extended-command", Fexec
*** 6547,6550 ****
--- 6968,6972 ----
  
      this_command_key_count = 0;
+     this_single_command_key_start = 0;
  
      keys = XVECTOR (saved_keys)->contents;
*************** DEFUN ("execute-extended-command", Fexec
*** 6571,6574 ****
--- 6993,6997 ----
    /* If enabled, show which key runs this command.  */
    if (!NILP (Vsuggest_key_bindings)
+       && NILP (Vexecuting_macro)
        && SYMBOLP (function))
      {
*************** DEFUN ("execute-extended-command", Fexec
*** 6589,6593 ****
      }
  
!   return Fcommand_execute (function, Qt, Qnil);
  }
  
--- 7012,7016 ----
      }
  
!   return Fcommand_execute (function, Qt, Qnil, Qnil);
  }
  
*************** current_active_maps (maps_p)
*** 6633,6641 ****
  }
  
  
  detect_input_pending ()
  {
    if (!input_pending)
!     get_input_pending (&input_pending);
  
    return input_pending;
--- 7056,7082 ----
  }
  
+ /* Return nonzero if input events are pending.  */
  
  detect_input_pending ()
  {
    if (!input_pending)
!     get_input_pending (&input_pending, 0);
! 
!   return input_pending;
! }
! 
! /* Return nonzero if input events are pending.
!    Execute timers immediately; don't make events for them.  */
! 
! detect_input_pending_run_timers (do_display)
!      int do_display;
! {
!   int old_timers_run = timers_run;
! 
!   if (!input_pending)
!     get_input_pending (&input_pending, 1);
! 
!   if (old_timers_run != timers_run && do_display)
!     redisplay_preserve_echo_area ();
  
    return input_pending;
*************** Actually, the value is nil only if we ca
*** 6658,6662 ****
      return (Qt);
  
!   return detect_input_pending () ? Qt : Qnil;
  }
  
--- 7099,7104 ----
      return (Qt);
  
!   get_input_pending (&input_pending, 1);
!   return input_pending > 0 ? Qt : Qnil;
  }
  
*************** The value is a string or a vector.")
*** 6692,6695 ****
--- 7134,7151 ----
  }
  
+ DEFUN ("this-single-command-keys", Fthis_single_command_keys,
+        Sthis_single_command_keys, 0, 0, 0,
+   "Return the key sequence that invoked this command.\n\
+ Unlike `this-command-keys', this function's value\n\
+ does not include prefix arguments.\n\
+ The value is a string or a vector.")
+   ()
+ {
+   return make_event_array (this_command_key_count
+ 			   - this_single_command_key_start,
+ 			   (XVECTOR (this_command_keys)->contents
+ 			    + this_single_command_key_start));
+ }
+ 
  DEFUN ("reset-this-command-lengths", Freset_this_command_lengths,
    Sreset_this_command_lengths, 0, 0, 0,
*************** If FILE is nil, close any open dribble f
*** 6728,6743 ****
       Lisp_Object file;
  {
!   if (NILP (file))
      {
!       if (dribble)
! 	{
! 	  fclose (dribble);
! 	  dribble = 0;
! 	}
      }
!   else
      {
        file = Fexpand_file_name (file, Qnil);
        dribble = fopen (XSTRING (file)->data, "w");
      }
    return Qnil;
--- 7184,7198 ----
       Lisp_Object file;
  {
!   if (dribble)
      {
!       fclose (dribble);
!       dribble = 0;
      }
!   if (!NILP (file))
      {
        file = Fexpand_file_name (file, Qnil);
        dribble = fopen (XSTRING (file)->data, "w");
+       if (dribble == 0)
+ 	report_file_error ("Opening dribble", Fcons (file, Qnil));
      }
    return Qnil;
*************** init_kboard (kb)
*** 7181,7185 ****
  /*
   * Destroy the contents of a kboard object, but not the object itself.
!  * We use this just before deleteing it, or if we're going to initialize
   * it a second time.
   */
--- 7636,7640 ----
  /*
   * Destroy the contents of a kboard object, but not the object itself.
!  * We use this just before deleting it, or if we're going to initialize
   * it a second time.
   */
*************** init_keyboard ()
*** 7215,7218 ****
--- 7670,7674 ----
    Vunread_command_events = Qnil;
    unread_command_char = -1;
+   EMACS_SET_SECS_USECS (timer_idleness_start_time, -1, -1);
    total_keys = 0;
    recent_keys_index = 0;
*************** syms_of_keyboard ()
*** 7341,7344 ****
--- 7797,7802 ----
    Qmouse_click = intern ("mouse-click");
    staticpro (&Qmouse_click);
+   Qtimer_event = intern ("timer-event");
+   staticpro (&Qtimer_event);
  
    Qmenu_enable = intern ("menu-enable");
*************** syms_of_keyboard ()
*** 7360,7363 ****
--- 7818,7825 ----
    Qbelow_handle = intern ("below-handle");
    staticpro (&Qbelow_handle);
+   Qup = intern ("up");
+   staticpro (&Qup);
+   Qdown = intern ("down");
+   staticpro (&Qdown);
  
    Qevent_kind = intern ("event-kind");
*************** syms_of_keyboard ()
*** 7442,7445 ****
--- 7904,7908 ----
    defsubr (&Srecent_keys);
    defsubr (&Sthis_command_keys);
+   defsubr (&Sthis_single_command_keys);
    defsubr (&Sreset_this_command_lengths);
    defsubr (&Ssuspend_emacs);
*************** Errors running the hook are caught and i
*** 7638,7646 ****
    DEFVAR_LISP ("post-command-idle-hook", &Vpost_command_idle_hook,
      "Normal hook run after each command is executed, if idle.\n\
! Errors running the hook are caught and ignored.");
    Vpost_command_idle_hook = Qnil;
  
    DEFVAR_INT ("post-command-idle-delay", &post_command_idle_delay,
!     "Delay time before running `post-command-idle-delay'.\n\
  This is measured in microseconds.");
    post_command_idle_delay = 100000;
--- 8101,8110 ----
    DEFVAR_LISP ("post-command-idle-hook", &Vpost_command_idle_hook,
      "Normal hook run after each command is executed, if idle.\n\
! Errors running the hook are caught and ignored.\n\
! This feature is obsolete; use idle timers instead.  See `etc/NEWS'.");
    Vpost_command_idle_hook = Qnil;
  
    DEFVAR_INT ("post-command-idle-delay", &post_command_idle_delay,
!     "Delay time before running `post-command-idle-hook'.\n\
  This is measured in microseconds.");
    post_command_idle_delay = 100000;
*************** If the value is non-nil and not a number
*** 7706,7709 ****
--- 8170,8181 ----
      "Non-nil enables display of the current column number in the mode line.");
    Vcolumn_number_mode = Qnil;
+ 
+   DEFVAR_LISP ("timer-list", &Vtimer_list,
+     "List of active absolute time timers in order of increasing time");
+   Vtimer_list = Qnil;
+ 
+   DEFVAR_LISP ("timer-idle-list", &Vtimer_idle_list,
+     "List of active idle-time timers in order of increasing time");
+   Vtimer_idle_list = Qnil;
  }
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/keyboard.h emacs-19.31/src/keyboard.h
*** emacs-19.30/src/keyboard.h	Fri Jun 16 00:52:14 1995
--- emacs-19.31/src/keyboard.h	Mon Jan 15 04:06:29 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  /* Length of echobuf field in each KBOARD.  */
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* Length of echobuf field in each KBOARD.  */
diff -2rcpP --exclude=*.elc emacs-19.30/src/keymap.c emacs-19.31/src/keymap.c
*** emacs-19.30/src/keymap.c	Mon Oct 30 14:31:44 1995
--- emacs-19.31/src/keymap.c	Tue Apr  9 18:02:05 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** the Free Software Foundation, 675 Mass A
*** 28,31 ****
--- 29,33 ----
  #include "termhooks.h"
  #include "blockinput.h"
+ #include "puresize.h"
  
  #define min(a, b) ((a) < (b) ? (a) : (b))
*************** synkey (frommap, fromchar, tomap, tochar
*** 179,183 ****
  
  DEFUN ("keymapp", Fkeymapp, Skeymapp, 1, 1, 0,
!   "Return t if ARG is a keymap.\n\
  \n\
  A keymap is a list (keymap . ALIST),\n\
--- 181,185 ----
  
  DEFUN ("keymapp", Fkeymapp, Skeymapp, 1, 1, 0,
!   "Return t if OBJECT is a keymap.\n\
  \n\
  A keymap is a list (keymap . ALIST),\n\
*************** store_in_keymap (keymap, idx, def)
*** 406,411 ****
    /* If we are preparing to dump, and DEF is a menu element
       with a menu item string, copy it to ensure it is not pure.  */
!   if (!NILP (Vpurify_flag) && CONSP (def)
!       && STRINGP (XCONS (def)->car))
      def = Fcons (XCONS (def)->car, XCONS (def)->cdr);
  
--- 408,412 ----
    /* If we are preparing to dump, and DEF is a menu element
       with a menu item string, copy it to ensure it is not pure.  */
!   if (CONSP (def) && PURE_P (def) && STRINGP (XCONS (def)->car))
      def = Fcons (XCONS (def)->car, XCONS (def)->cdr);
  
*************** it takes to reach a non-prefix command.\
*** 674,678 ****
  Normally, `lookup-key' ignores bindings for t, which act as default\n\
  bindings, used when nothing else in the keymap applies; this makes it\n\
! useable as a general function for probing keymaps.  However, if the\n\
  third optional argument ACCEPT-DEFAULT is non-nil, `lookup-key' will\n\
  recognize the default bindings, just as `read-key-sequence' does.")
--- 675,679 ----
  Normally, `lookup-key' ignores bindings for t, which act as default\n\
  bindings, used when nothing else in the keymap applies; this makes it\n\
! usable as a general function for probing keymaps.  However, if the\n\
  third optional argument ACCEPT-DEFAULT is non-nil, `lookup-key' will\n\
  recognize the default bindings, just as `read-key-sequence' does.")
*************** recognize the default bindings, just as 
*** 932,935 ****
--- 933,938 ----
    else
      { 
+       Lisp_Object local;
+ 
        nmaps = current_minor_maps (0, &maps);
        /* Note that all these maps are GCPRO'd
*************** recognize the default bindings, just as 
*** 944,950 ****
  	  }
  
!       if (! NILP (current_buffer->keymap))
  	{
! 	  value = Flookup_key (current_buffer->keymap, key, accept_default);
  	  if (! NILP (value) && !INTEGERP (value))
  	    RETURN_UNGCPRO (value);
--- 947,955 ----
  	  }
  
!       local = get_local_map (PT, current_buffer);
! 
!       if (! NILP (local))
  	{
! 	  value = Flookup_key (local, key, accept_default);
  	  if (! NILP (value) && !INTEGERP (value))
  	    RETURN_UNGCPRO (value);
*************** If a second optional argument MAPVAR is 
*** 1047,1061 ****
  its value instead of as COMMAND's value; but COMMAND is still defined\n\
  as a function.")
!   (name, mapvar)
!      Lisp_Object name, mapvar;
  {
    Lisp_Object map;
    map = Fmake_sparse_keymap (Qnil);
!   Ffset (name, map);
    if (!NILP (mapvar))
      Fset (mapvar, map);
    else
!     Fset (name, map);
!   return name;
  }
  
--- 1052,1066 ----
  its value instead of as COMMAND's value; but COMMAND is still defined\n\
  as a function.")
!   (command, mapvar)
!      Lisp_Object command, mapvar;
  {
    Lisp_Object map;
    map = Fmake_sparse_keymap (Qnil);
!   Ffset (command, map);
    if (!NILP (mapvar))
      Fset (mapvar, map);
    else
!     Fset (command, map);
!   return command;
  }
  
*************** DEFUN ("use-global-map", Fuse_global_map
*** 1067,1071 ****
    keymap = get_keymap (keymap);
    current_global_map = keymap;
-   record_asynch_buffer_change ();
  
    return Qnil;
--- 1072,1075 ----
*************** If KEYMAP is nil, that means no local ke
*** 1082,1086 ****
  
    current_buffer->keymap = keymap;
-   record_asynch_buffer_change ();
  
    return Qnil;
--- 1086,1089 ----
*************** DEFUN ("accessible-keymaps", Faccessible
*** 1120,1128 ****
  Returns a list of elements of the form (KEYS . MAP), where the sequence\n\
  KEYS starting from KEYMAP gets you to MAP.  These elements are ordered\n\
! so that the KEYS increase in length.  The first element is (\"\" . KEYMAP).\n\
  An optional argument PREFIX, if non-nil, should be a key sequence;\n\
  then the value includes only maps for prefixes that start with PREFIX.")
!   (startmap, prefix)
!      Lisp_Object startmap, prefix;
  {
    Lisp_Object maps, good_maps, tail;
--- 1123,1131 ----
  Returns a list of elements of the form (KEYS . MAP), where the sequence\n\
  KEYS starting from KEYMAP gets you to MAP.  These elements are ordered\n\
! so that the KEYS increase in length.  The first element is ([] . KEYMAP).\n\
  An optional argument PREFIX, if non-nil, should be a key sequence;\n\
  then the value includes only maps for prefixes that start with PREFIX.")
!   (keymap, prefix)
!      Lisp_Object keymap, prefix;
  {
    Lisp_Object maps, good_maps, tail;
*************** then the value includes only maps for pr
*** 1139,1143 ****
  	 that prefix, so we don't waste time considering other prefixes.  */
        Lisp_Object tem;
!       tem = Flookup_key (startmap, prefix, Qt);
        /* Flookup_key may give us nil, or a number,
  	 if the prefix is not defined in this particular map.
--- 1142,1146 ----
  	 that prefix, so we don't waste time considering other prefixes.  */
        Lisp_Object tem;
!       tem = Flookup_key (keymap, prefix, Qt);
        /* Flookup_key may give us nil, or a number,
  	 if the prefix is not defined in this particular map.
*************** then the value includes only maps for pr
*** 1151,1155 ****
    else
      maps = Fcons (Fcons (Fmake_vector (make_number (0), Qnil),
! 			 get_keymap (startmap)),
  		  Qnil);
  
--- 1154,1158 ----
    else
      maps = Fcons (Fcons (Fmake_vector (make_number (0), Qnil),
! 			 get_keymap (keymap)),
  		  Qnil);
  
*************** push_text_char_description (c, p)
*** 1516,1529 ****
  
  DEFUN ("text-char-description", Ftext_char_description, Stext_char_description, 1, 1, 0,
!   "Return a pretty description of file-character CHAR.\n\
  Control characters turn into \"^char\", etc.")
!   (chr)
!      Lisp_Object chr;
  {
    char tem[6];
  
!   CHECK_NUMBER (chr, 0);
  
!   *push_text_char_description (XINT (chr) & 0377, tem) = 0;
  
    return build_string (tem);
--- 1519,1532 ----
  
  DEFUN ("text-char-description", Ftext_char_description, Stext_char_description, 1, 1, 0,
!   "Return a pretty description of file-character CHARACTER.\n\
  Control characters turn into \"^char\", etc.")
!   (character)
!      Lisp_Object character;
  {
    char tem[6];
  
!   CHECK_NUMBER (character, 0);
  
!   *push_text_char_description (XINT (character) & 0377, tem) = 0;
  
    return build_string (tem);
*************** nominal         alternate\n\
*** 1948,1952 ****
  }
  
! /* Insert a desription of the key bindings in STARTMAP,
      followed by those of all maps reachable through STARTMAP.
     If PARTIAL is nonzero, omit certain "uninteresting" commands
--- 1951,1955 ----
  }
  
! /* Insert a description of the key bindings in STARTMAP,
      followed by those of all maps reachable through STARTMAP.
     If PARTIAL is nonzero, omit certain "uninteresting" commands
*************** key             binding\n\
*** 2066,2070 ****
        describe_map (Fcdr (elt), Fcar (elt),
  		    transl ? describe_translation : describe_command,
! 		    partial, sub_shadows, &seen);
  
      skip: ;
--- 2069,2073 ----
        describe_map (Fcdr (elt), Fcar (elt),
  		    transl ? describe_translation : describe_command,
! 		    partial, sub_shadows, &seen, nomenu);
  
      skip: ;
*************** key             binding\n\
*** 2077,2080 ****
--- 2080,2085 ----
  }
  
+ static int previous_description_column;
+ 
  static void
  describe_command (definition)
*************** describe_command (definition)
*** 2082,2087 ****
  {
    register Lisp_Object tem1;
  
!   Findent_to (make_number (16), make_number (1));
  
    if (SYMBOLP (definition))
--- 2087,2107 ----
  {
    register Lisp_Object tem1;
+   int column = current_column ();
+   int description_column;
  
!   /* If column 16 is no good, go to col 32;
!      but don't push beyond that--go to next line instead.  */
!   if (column > 30)
!     {
!       insert_char ('\n');
!       description_column = 32;
!     }
!   else if (column > 14 || (column > 10 && previous_description_column == 32))
!     description_column = 32;
!   else
!     description_column = 16;
! 
!   Findent_to (make_number (description_column), make_number (1));
!   previous_description_column = description_column;
  
    if (SYMBOLP (definition))
*************** shadow_lookup (shadow, key, flag)
*** 2152,2159 ****
  /* Describe the contents of map MAP, assuming that this map itself is
     reached by the sequence of prefix keys KEYS (a string or vector).
!    PARTIAL, SHADOW are as in `describe_map_tree' above.  */
  
  static void
! describe_map (map, keys, elt_describer, partial, shadow, seen)
       register Lisp_Object map;
       Lisp_Object keys;
--- 2172,2179 ----
  /* Describe the contents of map MAP, assuming that this map itself is
     reached by the sequence of prefix keys KEYS (a string or vector).
!    PARTIAL, SHADOW, NOMENU are as in `describe_map_tree' above.  */
  
  static void
! describe_map (map, keys, elt_describer, partial, shadow, seen, nomenu)
       register Lisp_Object map;
       Lisp_Object keys;
*************** describe_map (map, keys, elt_describer, 
*** 2162,2165 ****
--- 2182,2186 ----
       Lisp_Object shadow;
       Lisp_Object *seen;
+      int nomenu;
  {
    Lisp_Object elt_prefix;
*************** describe_map (map, keys, elt_describer, 
*** 2207,2210 ****
--- 2228,2234 ----
  	    continue;
  
+ 	  if (nomenu && EQ (event, Qmenu_bar))
+ 	    continue;
+ 
  	  definition = get_keyelt (XCONS (XCONS (tail)->car)->cdr, 0);
  
*************** describe_map (map, keys, elt_describer, 
*** 2233,2236 ****
--- 2257,2261 ----
  	  if (first)
  	    {
+ 	      previous_description_column = 0;
  	      insert ("\n", 1);
  	      first = 0;
*************** apropos_accum (symbol, string)
*** 2512,2527 ****
  DEFUN ("apropos-internal", Fapropos_internal, Sapropos_internal, 1, 2, 0, 
    "Show all symbols whose names contain match for REGEXP.\n\
! If optional 2nd arg PRED is non-nil, (funcall PRED SYM) is done\n\
  for each symbol and a symbol is mentioned only if that returns non-nil.\n\
  Return list of symbols found.")
!   (string, pred)
!      Lisp_Object string, pred;
  {
    struct gcpro gcpro1, gcpro2;
!   CHECK_STRING (string, 0);
!   apropos_predicate = pred;
    GCPRO2 (apropos_predicate, apropos_accumulate);
    apropos_accumulate = Qnil;
!   map_obarray (Vobarray, apropos_accum, string);
    apropos_accumulate = Fsort (apropos_accumulate, Qstring_lessp);
    UNGCPRO;
--- 2537,2552 ----
  DEFUN ("apropos-internal", Fapropos_internal, Sapropos_internal, 1, 2, 0, 
    "Show all symbols whose names contain match for REGEXP.\n\
! If optional 2nd arg PREDICATE is non-nil, (funcall PREDICATE SYMBOL) is done\n\
  for each symbol and a symbol is mentioned only if that returns non-nil.\n\
  Return list of symbols found.")
!   (regexp, predicate)
!      Lisp_Object regexp, predicate;
  {
    struct gcpro gcpro1, gcpro2;
!   CHECK_STRING (regexp, 0);
!   apropos_predicate = predicate;
    GCPRO2 (apropos_predicate, apropos_accumulate);
    apropos_accumulate = Qnil;
!   map_obarray (Vobarray, apropos_accum, regexp);
    apropos_accumulate = Fsort (apropos_accumulate, Qstring_lessp);
    UNGCPRO;
diff -2rcpP --exclude=*.elc emacs-19.30/src/lastfile.c emacs-19.31/src/lastfile.c
*** emacs-19.30/src/lastfile.c	Thu Jun 15 16:38:53 1995
--- emacs-19.31/src/lastfile.c	Tue Apr  9 18:14:24 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/lisp.h emacs-19.31/src/lisp.h
*** emacs-19.30/src/lisp.h	Mon Oct 30 21:24:58 1995
--- emacs-19.31/src/lisp.h	Fri Apr 26 15:51:38 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** extern int pure_size;
*** 307,310 ****
--- 308,316 ----
  #endif
  
+ /* Convert a C integer into a Lisp_Object integer.  */
+ 
+ #define make_number(N)		\
+   ((((EMACS_INT) (N)) & VALMASK) | ((EMACS_INT) Lisp_Int) << VALBITS)
+ 
  /* During garbage collection, XGCTYPE must be used for extracting types
   so that the mark bit is ignored.  XMARKBIT accesses the markbit.
*************** struct Lisp_Cons
*** 510,513 ****
--- 516,534 ----
    };
  
+ /* Take the car or cdr of something known to be a cons cell.  */
+ #define XCAR(c) (XCONS ((c))->car)
+ #define XCDR(c) (XCONS ((c))->cdr)
+ 
+ /* Take the car or cdr of something whose type is not known.  */
+ #define CAR(c)					\
+  (CONSP ((c)) ? XCAR ((c))			\
+   : NILP ((c)) ? Qnil				\
+   : wrong_type_argument (Qlistp, (c)))
+ 
+ #define CDR(c)					\
+  (CONSP ((c)) ? XCDR ((c))			\
+   : NILP ((c)) ? Qnil				\
+   : wrong_type_argument (Qlistp, (c)))
+ 
  /* Like a cons, but records info on where the text lives that it was read from */
  /* This is not really in use now */
*************** struct Lisp_String
*** 530,536 ****
  
  /* If a struct is made to look like a vector, this macro returns the length
!    of that vector.  */
! #define VECSIZE(type) ((sizeof (type) - (sizeof (struct Lisp_Vector)	\
! 					 - sizeof (Lisp_Object)))	\
  		       / sizeof (Lisp_Object))
  
--- 551,558 ----
  
  /* If a struct is made to look like a vector, this macro returns the length
!    of the shortest vector that would hold that struct.  */
! #define VECSIZE(type) ((sizeof (type) - (sizeof (struct Lisp_Vector)  \
!                                          - sizeof (Lisp_Object))      \
!                         + sizeof(Lisp_Object) - 1) /* round up */     \
  		       / sizeof (Lisp_Object))
  
*************** extern Lisp_Object Flsh (), Fash ();
*** 1400,1404 ****
  extern Lisp_Object Fadd1 (), Fsub1 ();
  
- extern Lisp_Object make_number ();
  extern Lisp_Object   long_to_cons ();
  extern unsigned long cons_to_long ();
--- 1422,1425 ----
*************** extern Lisp_Object Fexecute_kbd_macro ()
*** 1744,1747 ****
--- 1765,1769 ----
  
  /* defined in undo.c */
+ extern Lisp_Object Qinhibit_read_only;
  extern Lisp_Object Fundo_boundary ();
  extern Lisp_Object truncate_undo_list ();
*************** extern void init_system_name ();
*** 1781,1784 ****
--- 1803,1810 ----
     in addition to a device separator.  Default the path separator
     to '/', and don't test for a device separator in IS_ANY_SEP.  */
+ 
+ #ifdef WINDOWSNT
+ extern Lisp_Object Vdirectory_sep_char;
+ #endif
  
  #ifndef DIRECTORY_SEP
diff -2rcpP --exclude=*.elc emacs-19.30/src/lread.c emacs-19.31/src/lread.c
*** emacs-19.30/src/lread.c	Sun Nov 19 15:47:31 1995
--- emacs-19.31/src/lread.c	Thu May 23 12:15:03 1996
*************** GNU General Public License for more deta
*** 17,21 ****
  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.  */
  
  
--- 17,22 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** the Free Software Foundation, 675 Mass A
*** 40,43 ****
--- 41,51 ----
  #endif /* lint */
  
+ #ifdef MSDOS
+ #if __DJGPP__ < 2
+ #include <unistd.h>	/* to get X_OK */
+ #endif
+ #include "msdos.h"
+ #endif
+ 
  #ifndef X_OK
  #define X_OK 01
*************** the Free Software Foundation, 675 Mass A
*** 49,59 ****
  #endif
  
- #ifdef MSDOS
- #include "msdos.h"
- #endif
- 
  #include <math.h>
  #endif /* LISP_FLOAT_TYPE */
  
  #ifndef O_RDONLY
  #define O_RDONLY 0
--- 57,67 ----
  #endif
  
  #include <math.h>
  #endif /* LISP_FLOAT_TYPE */
  
+ #ifdef HAVE_SETLOCALE
+ #include <locale.h>
+ #endif /* HAVE_SETLOCALE */
+ 
  #ifndef O_RDONLY
  #define O_RDONLY 0
*************** extern Lisp_Object read_char ();
*** 246,249 ****
--- 254,258 ----
     ASCII_REQUIRED is non-zero, we just re-read until we get an ASCII
     character.  */
+ 
  Lisp_Object
  read_filtered_event (no_switch_frame, ascii_required, error_nonascii)
*************** read_filtered_event (no_switch_frame, as
*** 265,269 ****
  
    /* switch-frame events are put off until after the next ASCII
!      character.  This is better than signalling an error just because
       the last characters were typed to a separate minibuffer frame,
       for example.  Eventually, some code which can deal with
--- 274,278 ----
  
    /* switch-frame events are put off until after the next ASCII
!      character.  This is better than signaling an error just because
       the last characters were typed to a separate minibuffer frame,
       for example.  Eventually, some code which can deal with
*************** DEFUN ("read-event", Fread_event, Sread_
*** 337,341 ****
  DEFUN ("read-char-exclusive", Fread_char_exclusive, Sread_char_exclusive, 0, 0, 0,
    "Read a character from the command input (keyboard or macro).\n\
! It is returned as a number.  Non character events are ignored.")
    ()
  {
--- 346,350 ----
  DEFUN ("read-char-exclusive", Fread_char_exclusive, Sread_char_exclusive, 0, 0, 0,
    "Read a character from the command input (keyboard or macro).\n\
! It is returned as a number.  Non-character events are ignored.")
    ()
  {
*************** void
*** 508,514 ****
--- 517,525 ----
  close_load_descs ()
  {
+ #ifndef WINDOWSNT
    Lisp_Object tail;
    for (tail = load_descriptor_list; !NILP (tail); tail = XCONS (tail)->cdr)
      close (XFASTINT (XCONS (tail)->car));
+ #endif
  }
  
*************** nil means discard it; anything else is s
*** 804,817 ****
  If there is no error, point does not move.  If there is an error,\n\
  point remains at the end of the last character read from the buffer.")
!   (bufname, printflag)
!      Lisp_Object bufname, printflag;
  {
    int count = specpdl_ptr - specpdl;
    Lisp_Object tem, buf;
  
!   if (NILP (bufname))
      buf = Fcurrent_buffer ();
    else
!     buf = Fget_buffer (bufname);
    if (NILP (buf))
      error ("No such buffer.");
--- 815,828 ----
  If there is no error, point does not move.  If there is an error,\n\
  point remains at the end of the last character read from the buffer.")
!   (buffer, printflag)
!      Lisp_Object buffer, printflag;
  {
    int count = specpdl_ptr - specpdl;
    Lisp_Object tem, buf;
  
!   if (NILP (buffer))
      buf = Fcurrent_buffer ();
    else
!     buf = Fget_buffer (buffer);
    if (NILP (buf))
      error ("No such buffer.");
*************** nil means discard it; anything else is s
*** 868,873 ****
  If there is no error, point does not move.  If there is an error,\n\
  point remains at the end of the last character read from the buffer.")
!   (b, e, printflag)
!      Lisp_Object b, e, printflag;
  {
    int count = specpdl_ptr - specpdl;
--- 879,884 ----
  If there is no error, point does not move.  If there is an error,\n\
  point remains at the end of the last character read from the buffer.")
!   (start, end, printflag)
!      Lisp_Object start, end, printflag;
  {
    int count = specpdl_ptr - specpdl;
*************** point remains at the end of the last cha
*** 886,892 ****
    record_unwind_protect (save_restriction_restore, save_restriction_save ());
  
!   /* This both uses b and checks its type.  */
!   Fgoto_char (b);
!   Fnarrow_to_region (make_number (BEGV), e);
    readevalloop (cbuf, 0, XBUFFER (cbuf)->filename, Feval, !NILP (printflag));
  
--- 897,903 ----
    record_unwind_protect (save_restriction_restore, save_restriction_save ());
  
!   /* This both uses start and checks its type.  */
!   Fgoto_char (start);
!   Fnarrow_to_region (make_number (BEGV), end);
    readevalloop (cbuf, 0, XBUFFER (cbuf)->filename, Feval, !NILP (printflag));
  
*************** read_escape (readcharfun)
*** 995,998 ****
--- 1006,1012 ----
    switch (c)
      {
+     case -1:
+       error ("End of file");
+ 
      case 'a':
        return '\007';
*************** read1 (readcharfun, pch, first_in_list)
*** 1288,1298 ****
  		{
  		  saved_doc_string_size = nskip + 100;
! 		  saved_doc_string = (char *) malloc (saved_doc_string_size);
  		}
  	      if (nskip > saved_doc_string_size)
  		{
  		  saved_doc_string_size = nskip + 100;
! 		  saved_doc_string = (char *) realloc (saved_doc_string,
! 						       saved_doc_string_size);
  		}
  
--- 1302,1312 ----
  		{
  		  saved_doc_string_size = nskip + 100;
! 		  saved_doc_string = (char *) xmalloc (saved_doc_string_size);
  		}
  	      if (nskip > saved_doc_string_size)
  		{
  		  saved_doc_string_size = nskip + 100;
! 		  saved_doc_string = (char *) xrealloc (saved_doc_string,
! 							saved_doc_string_size);
  		}
  
*************** If there is none, one is created by this
*** 1836,1841 ****
  A second optional argument specifies the obarray to use;\n\
  it defaults to the value of `obarray'.")
!   (str, obarray)
!      Lisp_Object str, obarray;
  {
    register Lisp_Object tem, sym, *ptr;
--- 1850,1855 ----
  A second optional argument specifies the obarray to use;\n\
  it defaults to the value of `obarray'.")
!   (string, obarray)
!      Lisp_Object string, obarray;
  {
    register Lisp_Object tem, sym, *ptr;
*************** it defaults to the value of `obarray'.")
*** 1844,1856 ****
    obarray = check_obarray (obarray);
  
!   CHECK_STRING (str, 0);
  
!   tem = oblookup (obarray, XSTRING (str)->data, XSTRING (str)->size);
    if (!INTEGERP (tem))
      return tem;
  
    if (!NILP (Vpurify_flag))
!     str = Fpurecopy (str);
!   sym = Fmake_symbol (str);
  
    ptr = &XVECTOR (obarray)->contents[XINT (tem)];
--- 1858,1870 ----
    obarray = check_obarray (obarray);
  
!   CHECK_STRING (string, 0);
  
!   tem = oblookup (obarray, XSTRING (string)->data, XSTRING (string)->size);
    if (!INTEGERP (tem))
      return tem;
  
    if (!NILP (Vpurify_flag))
!     string = Fpurecopy (string);
!   sym = Fmake_symbol (string);
  
    ptr = &XVECTOR (obarray)->contents[XINT (tem)];
*************** DEFUN ("intern-soft", Fintern_soft, Sint
*** 1867,1872 ****
  A second optional argument specifies the obarray to use;\n\
  it defaults to the value of `obarray'.")
!   (str, obarray)
!      Lisp_Object str, obarray;
  {
    register Lisp_Object tem;
--- 1881,1886 ----
  A second optional argument specifies the obarray to use;\n\
  it defaults to the value of `obarray'.")
!   (string, obarray)
!      Lisp_Object string, obarray;
  {
    register Lisp_Object tem;
*************** it defaults to the value of `obarray'.")
*** 1875,1881 ****
    obarray = check_obarray (obarray);
  
!   CHECK_STRING (str, 0);
  
!   tem = oblookup (obarray, XSTRING (str)->data, XSTRING (str)->size);
    if (!INTEGERP (tem))
      return tem;
--- 1889,1895 ----
    obarray = check_obarray (obarray);
  
!   CHECK_STRING (string, 0);
  
!   tem = oblookup (obarray, XSTRING (string)->data, XSTRING (string)->size);
    if (!INTEGERP (tem))
      return tem;
*************** defvar_kboard (namestring, offset)
*** 2223,2226 ****
--- 2237,2244 ----
  }
  
+ /* Record the value of load-path used at the start of dumping
+    so we can see if the site changed it later during dumping.  */
+ static Lisp_Object dump_path;
+ 
  init_lread ()
  {
*************** init_lread ()
*** 2228,2231 ****
--- 2246,2254 ----
    int turn_off_warning = 0;
  
+ #ifdef HAVE_SETLOCALE
+   /* Make sure numbers are parsed as we expect.  */
+   setlocale (LC_NUMERIC, "C");
+ #endif /* HAVE_SETLOCALE */
+ 
    /* Compute the default load-path.  */
  #ifdef CANNOT_DUMP
*************** init_lread ()
*** 2245,2255 ****
    if (initialized)
      {
-       Lisp_Object dump_path;
- 
-       dump_path = decode_env_path (0, PATH_DUMPLOADSEARCH);
- 
-       Vsource_directory = Fexpand_file_name (build_string ("../"),
- 					     Fcar (dump_path));
- 
        if (! NILP (Fequal (dump_path, Vload_path)))
  	{
--- 2268,2271 ----
*************** init_lread ()
*** 2289,2293 ****
      }
    else
!     Vload_path = decode_env_path (0, normal);
  #endif
  
--- 2305,2315 ----
      }
    else
!     {
!       /* ../lisp refers to the build directory.
! 	 NORMAL refers to the lisp dir in the source directory.  */
!       Vload_path = Fcons (build_string ("../lisp"),
! 			  decode_env_path (0, normal));
!       dump_path = Vload_path;
!     }
  #endif
  
*************** init_lread ()
*** 2295,2299 ****
    /* When Emacs is invoked over network shares on NT, PATH_LOADSEARCH is 
       almost never correct, thereby causing a warning to be printed out that 
!      confuses users.  Since PATH_LOADSEARCH is always overriden by the
       EMACSLOADPATH environment variable below, disable the warning on NT.  */
  
--- 2317,2321 ----
    /* When Emacs is invoked over network shares on NT, PATH_LOADSEARCH is 
       almost never correct, thereby causing a warning to be printed out that 
!      confuses users.  Since PATH_LOADSEARCH is always overridden by the
       EMACSLOADPATH environment variable below, disable the warning on NT.  */
  
*************** init_lread ()
*** 2332,2335 ****
--- 2354,2358 ----
  
    load_in_progress = 0;
+   Vload_file_name = Qnil;
  
    load_descriptor_list = Qnil;
*************** This is useful when the file being loade
*** 2418,2422 ****
       "Directory in which Emacs sources were found when Emacs was built.\n\
  You cannot count on them to still be there!");
!   Vsource_directory = Qnil;
    load_descriptor_list = Qnil;
    staticpro (&load_descriptor_list);
--- 2441,2450 ----
       "Directory in which Emacs sources were found when Emacs was built.\n\
  You cannot count on them to still be there!");
!   Vsource_directory
!     = Fexpand_file_name (build_string ("../"),
! 			 Fcar (decode_env_path (0, PATH_DUMPLOADSEARCH)));
! 
!   /* Vsource_directory was initialized in init_lread.  */
! 
    load_descriptor_list = Qnil;
    staticpro (&load_descriptor_list);
*************** You cannot count on them to still be the
*** 2454,2456 ****
--- 2482,2486 ----
    Qload_file_name = intern ("load-file-name");
    staticpro (&Qload_file_name);
+ 
+   staticpro (&dump_path);
  }
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/7300.h emacs-19.31/src/m/7300.h
*** emacs-19.30/src/m/7300.h	Tue Oct 31 12:06:41 1995
--- emacs-19.31/src/m/7300.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 17,21 ****
  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.  */
  
  
--- 17,22 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/acorn.h emacs-19.31/src/m/acorn.h
*** emacs-19.30/src/m/acorn.h	Tue Oct 31 12:06:48 1995
--- emacs-19.31/src/m/acorn.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/alliant-2800.h emacs-19.31/src/m/alliant-2800.h
*** emacs-19.30/src/m/alliant-2800.h	Tue Oct 31 12:06:52 1995
--- emacs-19.31/src/m/alliant-2800.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/alliant.h emacs-19.31/src/m/alliant.h
*** emacs-19.30/src/m/alliant.h	Tue Oct 31 12:06:54 1995
--- emacs-19.31/src/m/alliant.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 19,23 ****
  You should have received a copy of the GNU General Public License
  along with GNU Emacs; see the file COPYING.  If not, write to
! the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  
  /* The following line tells the configuration script what sort of 
--- 19,24 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* The following line tells the configuration script what sort of 
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/alpha.h emacs-19.31/src/m/alpha.h
*** emacs-19.30/src/m/alpha.h	Tue Nov 21 11:55:03 1995
--- emacs-19.31/src/m/alpha.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** extern void r_alloc_free ();
*** 267,272 ****
--- 268,276 ----
      {							\
        int dummy;					\
+       SIGMASKTYPE mask;					\
+       mask = sigblockx (SIGCHLD);			\
        if (-1 == openpty (&fd, &dummy, pty_name, 0, 0))	\
  	fd = -1;					\
+       sigsetmask (mask);				\
        close (dummy);					\
      }							\
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/altos.h emacs-19.31/src/m/altos.h
*** emacs-19.30/src/m/altos.h	Tue Oct 31 12:06:56 1995
--- emacs-19.31/src/m/altos.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/amdahl.h emacs-19.31/src/m/amdahl.h
*** emacs-19.30/src/m/amdahl.h	Tue Oct 31 12:06:58 1995
--- emacs-19.31/src/m/amdahl.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  /*
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /*
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/apollo.h emacs-19.31/src/m/apollo.h
*** emacs-19.30/src/m/apollo.h	Tue Oct 31 12:07:01 1995
--- emacs-19.31/src/m/apollo.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/att3b.h emacs-19.31/src/m/att3b.h
*** emacs-19.30/src/m/att3b.h	Tue Oct 31 12:07:15 1995
--- emacs-19.31/src/m/att3b.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 18,22 ****
  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.  */
  
  
--- 18,23 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/aviion.h emacs-19.31/src/m/aviion.h
*** emacs-19.30/src/m/aviion.h	Tue Oct 31 12:07:20 1995
--- emacs-19.31/src/m/aviion.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/celerity.h emacs-19.31/src/m/celerity.h
*** emacs-19.30/src/m/celerity.h	Tue Oct 31 12:07:22 1995
--- emacs-19.31/src/m/celerity.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/clipper.h emacs-19.31/src/m/clipper.h
*** emacs-19.30/src/m/clipper.h	Tue Oct 31 12:07:24 1995
--- emacs-19.31/src/m/clipper.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/cnvrgnt.h emacs-19.31/src/m/cnvrgnt.h
*** emacs-19.30/src/m/cnvrgnt.h	Tue Oct 31 12:07:26 1995
--- emacs-19.31/src/m/cnvrgnt.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/convex.h emacs-19.31/src/m/convex.h
*** emacs-19.30/src/m/convex.h	Tue Oct 31 00:09:28 1995
--- emacs-19.31/src/m/convex.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/cydra5.h emacs-19.31/src/m/cydra5.h
*** emacs-19.30/src/m/cydra5.h	Tue Oct 31 12:07:28 1995
--- emacs-19.31/src/m/cydra5.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/delta.h emacs-19.31/src/m/delta.h
*** emacs-19.30/src/m/delta.h	Tue Oct 31 12:07:30 1995
--- emacs-19.31/src/m/delta.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 18,22 ****
  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.  */
  
  
--- 18,23 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/delta88k.h emacs-19.31/src/m/delta88k.h
*** emacs-19.30/src/m/delta88k.h	Tue Oct 31 12:07:43 1995
--- emacs-19.31/src/m/delta88k.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/dpx2.h emacs-19.31/src/m/dpx2.h
*** emacs-19.30/src/m/dpx2.h	Tue Oct 31 12:07:45 1995
--- emacs-19.31/src/m/dpx2.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  You should have received a copy of the GNU General Public License
  along with GNU Emacs; see the file COPYING.  If not, write to
! the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  
  /* The following line tells the configuration script what sort of 
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* The following line tells the configuration script what sort of 
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/dual.h emacs-19.31/src/m/dual.h
*** emacs-19.30/src/m/dual.h	Tue Oct 31 12:07:48 1995
--- emacs-19.31/src/m/dual.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  You should have received a copy of the GNU General Public License
  along with GNU Emacs; see the file COPYING.  If not, write to
! the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  
  /* The following line tells the configuration script what sort of 
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* The following line tells the configuration script what sort of 
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/elxsi.h emacs-19.31/src/m/elxsi.h
*** emacs-19.30/src/m/elxsi.h	Tue Oct 31 12:07:54 1995
--- emacs-19.31/src/m/elxsi.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 17,21 ****
  You should have received a copy of the GNU General Public License
  along with GNU Emacs; see the file COPYING.  If not, write to
! the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  
  /* The following line tells the configuration script what sort of 
--- 17,22 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* The following line tells the configuration script what sort of 
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/gec63.h emacs-19.31/src/m/gec63.h
*** emacs-19.30/src/m/gec63.h	Tue Oct 31 12:07:56 1995
--- emacs-19.31/src/m/gec63.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/gould.h emacs-19.31/src/m/gould.h
*** emacs-19.30/src/m/gould.h	Tue Oct 31 12:07:59 1995
--- emacs-19.31/src/m/gould.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 22,26 ****
  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.  */
  
  
--- 22,27 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/hp800.h emacs-19.31/src/m/hp800.h
*** emacs-19.30/src/m/hp800.h	Tue Oct 31 00:10:37 1995
--- emacs-19.31/src/m/hp800.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** the Free Software Foundation, 675 Mass A
*** 59,62 ****
--- 60,98 ----
  #define EXPLICIT_SIGN_EXTEND
  
+ /* The standard definitions of these macros would work ok,
+    but these are faster because the constants are short. */
+    
+ 
+ #define XUINT(a) (((unsigned)(a) << BITS_PER_INT-VALBITS) >> BITS_PER_INT-VALBITS)
+ 
+ #define XSET(var, type, ptr) \
+    ((var) = ((int)(type) << VALBITS) + (((unsigned) (ptr) << BITS_PER_INT-VALBITS) >> BITS_PER_INT-VALBITS))
+ 
+ #define XMARKBIT(a) ((a) < 0)
+ #define XSETMARKBIT(a,b) ((a) = ((b) ? (a)|MARKBIT : (a) & ~MARKBIT))
+ 
+ #if 0  /* Loses when sign bit of type field is set.  */
+ #define XUNMARK(a) ((a) = (((a) << BITS_PER_INT-GCTYPEBITS-VALBITS) >> BITS_PER_INT-GCTYPEBITS-VALBITS))
+ #endif
+ 
+ /* Define the BSTRING functions in terms of the sysV functions. */
+ /* On HPUX 8.05, including types.h can include strings.h
+    which declares these as functions.  Hence the #ifndef.  */
+ 
+ #ifndef HAVE_BCOPY
+ #define bcopy(a,b,s)	memcpy (b,a,s)
+ #define bzero(a,s)	memset (a,0,s)
+ #define bcmp		memcmp
+ #endif
+ 
+ #ifdef __hpux
+ /* Now define a symbol for the cpu type, if your compiler
+    does not define it automatically:
+    Ones defined so far include vax, m68000, ns16000, pyramid,
+    orion, tahoe, APOLLO and many others */
+ #ifndef hp9000s800
+ #     define hp9000s800
+ #endif
+ 
  /* Data type of load average, as read out of kmem.  */
  
*************** the Free Software Foundation, 675 Mass A
*** 117,140 ****
  #define LIBS_DEBUG
  
! /* Define NEED_BSDTTY if you have such. */
! 
  #define NEED_BSDTTY
  
- /* The standard definitions of these macros would work ok,
-    but these are faster because the constants are short. */
-    
- 
- #define XUINT(a) (((unsigned)(a) << BITS_PER_INT-VALBITS) >> BITS_PER_INT-VALBITS)
- 
- #define XSET(var, type, ptr) \
-    ((var) = ((int)(type) << VALBITS) + (((unsigned) (ptr) << BITS_PER_INT-VALBITS) >> BITS_PER_INT-VALBITS))
- 
- #define XMARKBIT(a) ((a) < 0)
- #define XSETMARKBIT(a,b) ((a) = ((b) ? (a)|MARKBIT : (a) & ~MARKBIT))
- 
- #if 0  /* Loses when sign bit of type field is set.  */
- #define XUNMARK(a) ((a) = (((a) << BITS_PER_INT-GCTYPEBITS-VALBITS) >> BITS_PER_INT-GCTYPEBITS-VALBITS))
- #endif
- 
  /* The symbol in the kernel where the load average is found
     is named _avenrun.  At this time there are two major flavors
--- 153,159 ----
  #define LIBS_DEBUG
  
! /* Include the file bsdtty.h, since this machine has job control.  */
  #define NEED_BSDTTY
  
  /* The symbol in the kernel where the load average is found
     is named _avenrun.  At this time there are two major flavors
*************** the Free Software Foundation, 675 Mass A
*** 157,170 ****
  #endif
  
- /* Define the BSTRING functions in terms of the sysV functions. */
- /* On HPUX 8.05, including types.h can include strings.h
-    which declares these as functions.  Hence the #ifndef.  */
- 
- #ifndef HAVE_BCOPY
- #define bcopy(a,b,s)	memcpy (b,a,s)
- #define bzero(a,s)	memset (a,0,s)
- #define bcmp		memcmp
- #endif
- 
  /* On USG systems these have different names. */
  
--- 176,179 ----
*************** the Free Software Foundation, 675 Mass A
*** 172,175 ****
  #define rindex strrchr
  
! /* Include the file bsdtty.h, since this machine has job control.  */
! #define NEED_BSDTTY
--- 181,183 ----
  #define rindex strrchr
  
! #endif /* __hpux */
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/hp9000s300.h emacs-19.31/src/m/hp9000s300.h
*** emacs-19.30/src/m/hp9000s300.h	Tue Oct 31 12:08:02 1995
--- emacs-19.31/src/m/hp9000s300.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/i860.h emacs-19.31/src/m/i860.h
*** emacs-19.30/src/m/i860.h	Tue Oct 31 12:08:04 1995
--- emacs-19.31/src/m/i860.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/ibmps2-aix.h emacs-19.31/src/m/ibmps2-aix.h
*** emacs-19.30/src/m/ibmps2-aix.h	Tue Oct 31 12:08:08 1995
--- emacs-19.31/src/m/ibmps2-aix.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/ibmrs6000.h emacs-19.31/src/m/ibmrs6000.h
*** emacs-19.30/src/m/ibmrs6000.h	Tue Oct 31 12:08:11 1995
--- emacs-19.31/src/m/ibmrs6000.h	Fri Mar  8 13:25:55 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** the Free Software Foundation, 675 Mass A
*** 174,177 ****
--- 175,183 ----
  #endif
  #endif /* not AIX4 */
+ 
+ /* Avoid gcc 2.7.x collect2 bug by using /bin/ld instead.  */
+ #if __GNUC__ == 2 && __GNUC_MINOR__ == 7
+ #define LD_SWITCH_SITE -B/bin/
+ #endif
  
  /* AIX supposedly doesn't use this interface, but on the RS/6000
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/ibmrt-aix.h emacs-19.31/src/m/ibmrt-aix.h
*** emacs-19.30/src/m/ibmrt-aix.h	Tue Oct 31 12:08:14 1995
--- emacs-19.31/src/m/ibmrt-aix.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/ibmrt.h emacs-19.31/src/m/ibmrt.h
*** emacs-19.30/src/m/ibmrt.h	Tue Oct 31 12:08:16 1995
--- emacs-19.31/src/m/ibmrt.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/intel386.h emacs-19.31/src/m/intel386.h
*** emacs-19.30/src/m/intel386.h	Tue Oct 31 00:11:22 1995
--- emacs-19.31/src/m/intel386.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/iris4d.h emacs-19.31/src/m/iris4d.h
*** emacs-19.30/src/m/iris4d.h	Tue Oct 31 00:11:50 1995
--- emacs-19.31/src/m/iris4d.h	Tue Jan 23 11:59:08 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** the Free Software Foundation, 675 Mass A
*** 113,117 ****
  #ifdef USG5_4
  #undef UNEXEC
! #define UNEXEC unexelfsgi.o
  #else
  #define UNEXEC unexmips.o
--- 114,118 ----
  #ifdef USG5_4
  #undef UNEXEC
! #define UNEXEC unexsgi.o
  #else
  #define UNEXEC unexmips.o
*************** the Free Software Foundation, 675 Mass A
*** 182,186 ****
--- 183,189 ----
     that we can't fix without breaking other machines.  */
  #ifdef IRIX_FORCE_32_BITS
+ #ifdef THIS_IS_MAKEFILE
  #define C_SWITCH_MACHINE -32
+ #endif
  #endif
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/iris5d.h emacs-19.31/src/m/iris5d.h
*** emacs-19.30/src/m/iris5d.h	Tue Oct 31 00:12:13 1995
--- emacs-19.31/src/m/iris5d.h	Tue Jan 23 12:01:41 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** the Free Software Foundation, 675 Mass A
*** 115,119 ****
  #undef UNEXEC
  #endif
! #define UNEXEC unexelfsgi.o
  
  #define TEXT_START 0x400000
--- 116,120 ----
  #undef UNEXEC
  #endif
! #define UNEXEC unexsgi.o
  
  #define TEXT_START 0x400000
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/irist.h emacs-19.31/src/m/irist.h
*** emacs-19.30/src/m/irist.h	Tue Oct 31 12:08:17 1995
--- emacs-19.31/src/m/irist.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 17,21 ****
  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.  */
  
  
--- 17,22 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/isi-ov.h emacs-19.31/src/m/isi-ov.h
*** emacs-19.30/src/m/isi-ov.h	Tue Oct 31 12:08:20 1995
--- emacs-19.31/src/m/isi-ov.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/m68k.h emacs-19.31/src/m/m68k.h
*** emacs-19.30/src/m/m68k.h	Tue Oct 31 03:44:17 1995
--- emacs-19.31/src/m/m68k.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/masscomp.h emacs-19.31/src/m/masscomp.h
*** emacs-19.30/src/m/masscomp.h	Tue Oct 31 12:08:23 1995
--- emacs-19.31/src/m/masscomp.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/mega68.h emacs-19.31/src/m/mega68.h
*** emacs-19.30/src/m/mega68.h	Tue Oct 31 12:08:25 1995
--- emacs-19.31/src/m/mega68.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/mg1.h emacs-19.31/src/m/mg1.h
*** emacs-19.30/src/m/mg1.h	Tue Oct 31 12:08:27 1995
--- emacs-19.31/src/m/mg1.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 17,21 ****
  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.  */
  
  
--- 17,22 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/mips-siemens.h emacs-19.31/src/m/mips-siemens.h
*** emacs-19.30/src/m/mips-siemens.h	Tue Oct 31 00:12:50 1995
--- emacs-19.31/src/m/mips-siemens.h	Tue Jan 23 12:03:34 1996
*************** GNU General Public License for more deta
*** 21,25 ****
  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.  */
  
  
--- 21,26 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** NOTE-END  */
*** 135,139 ****
  #undef UNEXEC
  #endif
! #define UNEXEC unexelfsni.o
  
  #undef ORDINARY_LINK
--- 136,140 ----
  #undef UNEXEC
  #endif
! #define UNEXEC unexsni.o
  
  #undef ORDINARY_LINK
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/mips.h emacs-19.31/src/m/mips.h
*** emacs-19.30/src/m/mips.h	Tue Oct 31 00:13:16 1995
--- emacs-19.31/src/m/mips.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/news.h emacs-19.31/src/m/news.h
*** emacs-19.30/src/m/news.h	Tue Oct 31 12:08:30 1995
--- emacs-19.31/src/m/news.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/next.h emacs-19.31/src/m/next.h
*** emacs-19.30/src/m/next.h	Tue Oct 31 12:08:44 1995
--- emacs-19.31/src/m/next.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/nh3000.h emacs-19.31/src/m/nh3000.h
*** emacs-19.30/src/m/nh3000.h	Tue Oct 31 12:08:46 1995
--- emacs-19.31/src/m/nh3000.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 18,22 ****
  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.  */
  
  /* This file manually constructed for Harris Night Hawk 4000 (and 5000)
--- 18,23 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* This file manually constructed for Harris Night Hawk 4000 (and 5000)
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/nh4000.h emacs-19.31/src/m/nh4000.h
*** emacs-19.30/src/m/nh4000.h	Tue Oct 31 12:08:49 1995
--- emacs-19.31/src/m/nh4000.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 17,21 ****
  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.  */
  
  /* This file manually constructed for Harris Night Hawk 4000 (and 5000)
--- 17,22 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* This file manually constructed for Harris Night Hawk 4000 (and 5000)
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/ns16000.h emacs-19.31/src/m/ns16000.h
*** emacs-19.30/src/m/ns16000.h	Tue Oct 31 12:08:51 1995
--- emacs-19.31/src/m/ns16000.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/ns32000.h emacs-19.31/src/m/ns32000.h
*** emacs-19.30/src/m/ns32000.h	Tue Oct 31 12:08:53 1995
--- emacs-19.31/src/m/ns32000.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/nu.h emacs-19.31/src/m/nu.h
*** emacs-19.30/src/m/nu.h	Tue Oct 31 12:08:55 1995
--- emacs-19.31/src/m/nu.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/orion.h emacs-19.31/src/m/orion.h
*** emacs-19.30/src/m/orion.h	Tue Oct 31 12:08:57 1995
--- emacs-19.31/src/m/orion.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/orion105.h emacs-19.31/src/m/orion105.h
*** emacs-19.30/src/m/orion105.h	Tue Oct 31 12:08:59 1995
--- emacs-19.31/src/m/orion105.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 17,21 ****
  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.  */
  
  
--- 17,22 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/paragon.h emacs-19.31/src/m/paragon.h
*** emacs-19.30/src/m/paragon.h	Fri Nov 11 09:52:02 1994
--- emacs-19.31/src/m/paragon.h	Wed Feb  7 17:56:10 1996
***************
*** 5,12 ****
  #define SYSTEM_MALLOC
  #define TEXT_START 0x10000
! #define LD_DATA_START 0x140000
! #undef  LD_SWITCH_SYSTEM
! #define LD_SWITCH_SYSTEM -d LD_DATA_START
! #define LIB_STANDARD -lc -lic
  #define KEEP_OLD_TEXT_SCNPTR
  #define KEEP_OLD_PADDR
--- 5,9 ----
  #define SYSTEM_MALLOC
  #define TEXT_START 0x10000
! #define LIB_STANDARD -lc -lic -lmach
  #define KEEP_OLD_TEXT_SCNPTR
  #define KEEP_OLD_PADDR
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/pfa50.h emacs-19.31/src/m/pfa50.h
*** emacs-19.30/src/m/pfa50.h	Tue Oct 31 12:09:00 1995
--- emacs-19.31/src/m/pfa50.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/plexus.h emacs-19.31/src/m/plexus.h
*** emacs-19.30/src/m/plexus.h	Tue Oct 31 12:09:03 1995
--- emacs-19.31/src/m/plexus.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/pmax.h emacs-19.31/src/m/pmax.h
*** emacs-19.30/src/m/pmax.h	Sat Sep  9 22:12:38 1995
--- emacs-19.31/src/m/pmax.h	Fri Jan  5 04:53:42 1996
*************** NOTE-END  */
*** 87,91 ****
  /* Addendum: the MIT X11 distribution neglects to define certain symbols
     when NeedFunctionPrototypes is 0, but still tries to use them when
!    NeedVarargsProrotypes is 1 (which is its default value).  So if we're
     going to disable non-variadic prototypes, we also need to disable
     variadic prototypes.  --kwzh@gnu.ai.mit.edu */
--- 87,91 ----
  /* Addendum: the MIT X11 distribution neglects to define certain symbols
     when NeedFunctionPrototypes is 0, but still tries to use them when
!    NeedVarargsPrototypes is 1 (which is its default value).  So if we're
     going to disable non-variadic prototypes, we also need to disable
     variadic prototypes.  --kwzh@gnu.ai.mit.edu */
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/pyramid.h emacs-19.31/src/m/pyramid.h
*** emacs-19.30/src/m/pyramid.h	Tue Oct 31 12:09:04 1995
--- emacs-19.31/src/m/pyramid.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/sequent-ptx.h emacs-19.31/src/m/sequent-ptx.h
*** emacs-19.30/src/m/sequent-ptx.h	Wed Oct 26 19:25:40 1994
--- emacs-19.31/src/m/sequent-ptx.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/sequent.h emacs-19.31/src/m/sequent.h
*** emacs-19.30/src/m/sequent.h	Tue Oct 31 12:09:06 1995
--- emacs-19.31/src/m/sequent.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/sparc.h emacs-19.31/src/m/sparc.h
*** emacs-19.30/src/m/sparc.h	Tue Oct 31 12:09:08 1995
--- emacs-19.31/src/m/sparc.h	Sat May 25 10:22:54 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  You should have received a copy of the GNU General Public License
  along with GNU Emacs; see the file COPYING.  If not, write to
! the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  
  /* The following line tells the configuration script what sort of 
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* The following line tells the configuration script what sort of 
*************** NOTE-END  */
*** 104,107 ****
--- 105,109 ----
  
  #ifndef __NetBSD__
+ #ifndef __linux__
  /* This really belongs in s/sun.h.  */
  
*************** NOTE-END  */
*** 116,118 ****
--- 118,121 ----
  #define A_TEXT_SEEK(HDR) (N_TXTOFF (hdr) + sizeof (hdr))
  
+ #endif /* __linux__ */
  #endif /* __NetBSD__ */
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/sps7.h emacs-19.31/src/m/sps7.h
*** emacs-19.30/src/m/sps7.h	Tue Oct 31 12:09:10 1995
--- emacs-19.31/src/m/sps7.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/stride.h emacs-19.31/src/m/stride.h
*** emacs-19.30/src/m/stride.h	Tue Oct 31 12:09:11 1995
--- emacs-19.31/src/m/stride.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/sun1.h emacs-19.31/src/m/sun1.h
*** emacs-19.30/src/m/sun1.h	Tue Oct 31 12:09:13 1995
--- emacs-19.31/src/m/sun1.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/sun2.h emacs-19.31/src/m/sun2.h
*** emacs-19.30/src/m/sun2.h	Tue Oct 31 12:09:16 1995
--- emacs-19.31/src/m/sun2.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 18,22 ****
  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.  */
  
  
--- 18,23 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/sun386.h emacs-19.31/src/m/sun386.h
*** emacs-19.30/src/m/sun386.h	Sun Jun  5 13:50:47 1994
--- emacs-19.31/src/m/sun386.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 19,23 ****
  You should have received a copy of the GNU General Public License
  along with GNU Emacs; see the file COPYING.  If not, write to
! the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  
  /* The following line tells the configuration script what sort of 
--- 19,24 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* The following line tells the configuration script what sort of 
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/symmetry.h emacs-19.31/src/m/symmetry.h
*** emacs-19.30/src/m/symmetry.h	Wed Oct 26 19:24:52 1994
--- emacs-19.31/src/m/symmetry.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  /* CHANGE: [Eric H. Herrin II; eric@ms.uky.edu - 15 Sept 1988] 
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* CHANGE: [Eric H. Herrin II; eric@ms.uky.edu - 15 Sept 1988] 
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/tad68k.h emacs-19.31/src/m/tad68k.h
*** emacs-19.30/src/m/tad68k.h	Tue Oct 31 12:09:26 1995
--- emacs-19.31/src/m/tad68k.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/tahoe.h emacs-19.31/src/m/tahoe.h
*** emacs-19.30/src/m/tahoe.h	Tue Oct 31 12:09:27 1995
--- emacs-19.31/src/m/tahoe.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/targon31.h emacs-19.31/src/m/targon31.h
*** emacs-19.30/src/m/targon31.h	Tue Oct 31 12:09:30 1995
--- emacs-19.31/src/m/targon31.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/tek4300.h emacs-19.31/src/m/tek4300.h
*** emacs-19.30/src/m/tek4300.h	Tue Oct 31 12:09:32 1995
--- emacs-19.31/src/m/tek4300.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/tekxd88.h emacs-19.31/src/m/tekxd88.h
*** emacs-19.30/src/m/tekxd88.h	Tue Oct 31 12:09:42 1995
--- emacs-19.31/src/m/tekxd88.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 18,22 ****
  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.  */
  
  
--- 18,23 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/template.h emacs-19.31/src/m/template.h
*** emacs-19.30/src/m/template.h	Tue Oct 31 12:09:44 1995
--- emacs-19.31/src/m/template.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/tower32.h emacs-19.31/src/m/tower32.h
*** emacs-19.30/src/m/tower32.h	Tue Oct 31 12:09:46 1995
--- emacs-19.31/src/m/tower32.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** the Free Software Foundation, 675 Mass A
*** 114,118 ****
  
  /* emacs's magic number isn't temacs's;
!    temacs is writeable text (the default!).  */
  
  #include <asld.h>
--- 115,119 ----
  
  /* emacs's magic number isn't temacs's;
!    temacs is writable text (the default!).  */
  
  #include <asld.h>
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/tower32v3.h emacs-19.31/src/m/tower32v3.h
*** emacs-19.30/src/m/tower32v3.h	Tue Oct 31 12:09:48 1995
--- emacs-19.31/src/m/tower32v3.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/ustation.h emacs-19.31/src/m/ustation.h
*** emacs-19.30/src/m/ustation.h	Tue Oct 31 12:09:51 1995
--- emacs-19.31/src/m/ustation.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/vax.h emacs-19.31/src/m/vax.h
*** emacs-19.30/src/m/vax.h	Tue Oct 31 12:09:53 1995
--- emacs-19.31/src/m/vax.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/wicat.h emacs-19.31/src/m/wicat.h
*** emacs-19.30/src/m/wicat.h	Tue Oct 31 12:09:55 1995
--- emacs-19.31/src/m/wicat.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/windowsnt.h emacs-19.31/src/m/windowsnt.h
*** emacs-19.30/src/m/windowsnt.h	Tue Oct 31 12:09:58 1995
--- emacs-19.31/src/m/windowsnt.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 17,21 ****
  You should have received a copy of the GNU General Public License
  along with GNU Emacs; see the file COPYING.  If not, write to
! the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  
  /* The following line tells the configuration script what sort of 
--- 17,22 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* The following line tells the configuration script what sort of 
*************** the Free Software Foundation, 675 Mass A
*** 84,88 ****
     numerically.  */
  
! /* Text does preceed data space, but this is never a safe assumption.  */
  #define VIRT_ADDR_VARIES
  
--- 85,89 ----
     numerically.  */
  
! /* Text does precede data space, but this is never a safe assumption.  */
  #define VIRT_ADDR_VARIES
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/m/xps100.h emacs-19.31/src/m/xps100.h
*** emacs-19.30/src/m/xps100.h	Tue Oct 31 12:10:00 1995
--- emacs-19.31/src/m/xps100.h	Mon Jan 15 04:15:02 1996
*************** GNU General Public License for more deta
*** 18,22 ****
  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.  */
  
  
--- 18,23 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/macros.c emacs-19.31/src/macros.c
*** emacs-19.30/src/macros.c	Thu Aug 10 18:29:41 1995
--- emacs-19.31/src/macros.c	Sun May 12 15:55:55 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** Non-nil arg (prefix arg) means append to
*** 51,66 ****
        current_kboard->kbd_macro_bufsize = 30;
        current_kboard->kbd_macro_buffer
! 	= (Lisp_Object *)malloc (30 * sizeof (Lisp_Object));
      }
    update_mode_lines++;
    if (NILP (append))
      {
        current_kboard->kbd_macro_ptr = current_kboard->kbd_macro_buffer;
        current_kboard->kbd_macro_end = current_kboard->kbd_macro_buffer;
!       message("Defining kbd macro...");
      }
    else
      {
!       message("Appending to kbd macro...");
        current_kboard->kbd_macro_ptr = current_kboard->kbd_macro_end;
        Fexecute_kbd_macro (current_kboard->Vlast_kbd_macro,
--- 52,74 ----
        current_kboard->kbd_macro_bufsize = 30;
        current_kboard->kbd_macro_buffer
! 	= (Lisp_Object *)xmalloc (30 * sizeof (Lisp_Object));
      }
    update_mode_lines++;
    if (NILP (append))
      {
+       if (current_kboard->kbd_macro_bufsize > 200)
+ 	{
+ 	  current_kboard->kbd_macro_bufsize = 30;
+ 	  current_kboard->kbd_macro_buffer
+ 	    = (Lisp_Object *)xrealloc (current_kboard->kbd_macro_buffer,
+ 				       30 * sizeof (Lisp_Object));
+ 	}
        current_kboard->kbd_macro_ptr = current_kboard->kbd_macro_buffer;
        current_kboard->kbd_macro_end = current_kboard->kbd_macro_buffer;
!       message ("Defining kbd macro...");
      }
    else
      {
!       message ("Appending to kbd macro...");
        current_kboard->kbd_macro_ptr = current_kboard->kbd_macro_end;
        Fexecute_kbd_macro (current_kboard->Vlast_kbd_macro,
*************** With numeric arg, repeat macro now that 
*** 82,95 ****
  counting the definition just completed as the first repetition.\n\
  An argument of zero means repeat until error.")
!   (arg)
!      Lisp_Object arg;
  {
    if (NILP (current_kboard->defining_kbd_macro))
      error ("Not defining kbd macro.");
  
!   if (NILP (arg))
!     XSETFASTINT (arg, 1);
    else
!     CHECK_NUMBER (arg, 0);
  
    if (!NILP (current_kboard->defining_kbd_macro))
--- 90,103 ----
  counting the definition just completed as the first repetition.\n\
  An argument of zero means repeat until error.")
!   (repeat)
!      Lisp_Object repeat;
  {
    if (NILP (current_kboard->defining_kbd_macro))
      error ("Not defining kbd macro.");
  
!   if (NILP (repeat))
!     XSETFASTINT (repeat, 1);
    else
!     CHECK_NUMBER (repeat, 0);
  
    if (!NILP (current_kboard->defining_kbd_macro))
*************** An argument of zero means repeat until e
*** 101,114 ****
  			     - current_kboard->kbd_macro_buffer),
  			    current_kboard->kbd_macro_buffer);
!       message("Keyboard macro defined");
      }
  
!   if (XFASTINT (arg) == 0)
!     Fexecute_kbd_macro (current_kboard->Vlast_kbd_macro, arg);
    else
      {
!       XSETINT (arg, XINT (arg)-1);
!       if (XINT (arg) > 0)
! 	Fexecute_kbd_macro (current_kboard->Vlast_kbd_macro, arg);
      }
    return Qnil;
--- 109,122 ----
  			     - current_kboard->kbd_macro_buffer),
  			    current_kboard->kbd_macro_buffer);
!       message ("Keyboard macro defined");
      }
  
!   if (XFASTINT (repeat) == 0)
!     Fexecute_kbd_macro (current_kboard->Vlast_kbd_macro, repeat);
    else
      {
!       XSETINT (repeat, XINT (repeat)-1);
!       if (XINT (repeat) > 0)
! 	Fexecute_kbd_macro (current_kboard->Vlast_kbd_macro, repeat);
      }
    return Qnil;
*************** DEFUN ("cancel-kbd-macro-events", Fcance
*** 156,159 ****
--- 164,177 ----
    current_kboard->kbd_macro_ptr = current_kboard->kbd_macro_end;
  }
+ 
+ DEFUN ("store-kbd-macro-event", Fstore_kbd_macro_event,
+        Sstore_kbd_macro_event, 1, 1, 0,
+   "Store EVENT into the keyboard macro being defined.")
+   (event)
+      Lisp_Object event;
+ {
+   store_kbd_macro_char (event);
+   return Qnil;
+ }
  
  DEFUN ("call-last-kbd-macro", Fcall_last_kbd_macro, Scall_last_kbd_macro,
*************** DEFUN ("execute-kbd-macro", Fexecute_kbd
*** 194,209 ****
  If MACRO is a symbol, its function definition is used.\n\
  COUNT is a repeat count, or nil for once, or 0 for infinite loop.")
!   (macro, prefixarg)
!      Lisp_Object macro, prefixarg;
  {
    Lisp_Object final;
    Lisp_Object tem;
!   int count = specpdl_ptr - specpdl;
    int repeat = 1;
    struct gcpro gcpro1;
  
!   if (!NILP (prefixarg))
!     prefixarg = Fprefix_numeric_value (prefixarg),
!     repeat = XINT (prefixarg);
  
    final = indirect_function (macro);
--- 212,229 ----
  If MACRO is a symbol, its function definition is used.\n\
  COUNT is a repeat count, or nil for once, or 0 for infinite loop.")
!   (macro, count)
!      Lisp_Object macro, count;
  {
    Lisp_Object final;
    Lisp_Object tem;
!   int pdlcount = specpdl_ptr - specpdl;
    int repeat = 1;
    struct gcpro gcpro1;
  
!   if (!NILP (count))
!     {
!       count = Fprefix_numeric_value (count);
!       repeat = XINT (count);
!     }
  
    final = indirect_function (macro);
*************** COUNT is a repeat count, or nil for once
*** 230,234 ****
  
    UNGCPRO;
!   return unbind_to (count, Qnil);
  }
  
--- 250,254 ----
  
    UNGCPRO;
!   return unbind_to (pdlcount, Qnil);
  }
  
*************** syms_of_macros ()
*** 248,251 ****
--- 268,272 ----
    defsubr (&Sexecute_kbd_macro);
    defsubr (&Scancel_kbd_macro_events);
+   defsubr (&Sstore_kbd_macro_event);
  
    DEFVAR_KBOARD ("defining-kbd-macro", defining_kbd_macro,
diff -2rcpP --exclude=*.elc emacs-19.30/src/macros.h emacs-19.31/src/macros.h
*** emacs-19.30/src/macros.h	Thu Jun 15 16:39:03 1995
--- emacs-19.31/src/macros.h	Mon Jan 15 04:06:29 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/makefile.nt emacs-19.31/src/makefile.nt
*** emacs-19.30/src/makefile.nt	Wed Nov 22 13:52:35 1995
--- emacs-19.31/src/makefile.nt	Wed May 15 10:41:24 1996
***************
*** 26,34 ****
  !include ..\nt\makefile.def
  
- !IFDEF NTGUI
- SUBSYSTEM=windows
- !ELSE
  SUBSYSTEM=console
- !ENDIF
  
  #
--- 26,30 ----
*************** TRES		= $(BLD)\emacs.rbj
*** 55,59 ****
  TLASTLIB	= $(BLD)\lastfile.lib
  
! LINK_FLAGS      = $(ARCH_LDFLAGS) -stack:0x1000000 -base:0xD00000 -debug:full -debugtype:cv -machine:$(ARCH) -subsystem:$(SUBSYSTEM) -entry:_start -map:$(BLD)\temacs.map
  
  #
--- 51,57 ----
  TLASTLIB	= $(BLD)\lastfile.lib
  
! # see comments in allocate_heap in ntheap.c before changing any of the
! # -stack, -heap, or -base settings.
! LINK_FLAGS      = $(ARCH_LDFLAGS) -stack:0x00800000 -heap:0x00100000 -base:0x01000000 -debug:full -debugtype:cv -machine:$(ARCH) -subsystem:$(SUBSYSTEM) -entry:_start -map:$(BLD)\temacs.map
  
  #
*************** LIBS =  $(TLIB1)	\
*** 140,146 ****
  	comdlg32.lib    \
  !ENDIF
  	$(BASE_LIBS)	\
  	$(ADVAPI32)	\
! 	user32.lib
  
  #
--- 138,146 ----
  	comdlg32.lib    \
  !ENDIF
+ #	libcmt.lib      \
  	$(BASE_LIBS)	\
  	$(ADVAPI32)	\
! 	user32.lib	\
! 	mpr.lib
  
  #
*************** paths.h:	..\nt\paths.h
*** 163,167 ****
  DOC		= obj\etc\DOC-X
  $(DOC):;	cd ..\lib-src 
! 		- del DOC-X
  		$(MAKE) -f makefile.nt all
  		cd ..\src
--- 163,167 ----
  DOC		= obj\etc\DOC-X
  $(DOC):;	cd ..\lib-src 
! 		- $(DEL) DOC-X
  		$(MAKE) -f makefile.nt all
  		cd ..\src
*************** install:        all
*** 230,234 ****
  # Maintenance
  # 
! clean:;         - del *~ *.pdb config.h paths.h
  		- $(DEL_TREE) deleted
  		- $(DEL_TREE) obj
--- 230,234 ----
  # Maintenance
  # 
! clean:;         - $(DEL) *~ *.pdb config.h paths.h
  		- $(DEL_TREE) deleted
  		- $(DEL_TREE) obj
*************** clean:;         - del *~ *.pdb config.h 
*** 239,243 ****
  #
  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
  		cd ..\..
  
--- 239,243 ----
  #
  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
  		cd ..\..
  
*************** $(BLD)\dispnew.obj : \
*** 410,413 ****
--- 410,414 ----
  	$(EMACS_ROOT)\nt\inc\sys\file.h \
  	$(SRC)\systty.h \
+ 	$(SRC)\w32term.h \
  	$(SRC)\xterm.h \
  	$(SRC)\vmstime.h \
*************** $(BLD)\keyboard.obj : \
*** 653,656 ****
--- 654,658 ----
  	$(EMACS_ROOT)\nt\inc\sys\file.h \
  	$(SRC)\systty.h \
+ 	$(SRC)\w32term.h \
  	$(SRC)\xterm.h \
  	$(SRC)\vmstime.h \
*************** $(BLD)\mocklisp.obj : \
*** 728,731 ****
--- 730,734 ----
  $(BLD)\nt.obj : \
  	$(SRC)\nt.c \
+ 	$(SRC)\nt.h \
  	$(SRC)\s\windowsnt.h \
  	$(SRC)\m\intel386.h \
*************** $(BLD)\w32faces.obj: \
*** 1037,1047 ****
  	$(EMACS_ROOT)\src\config.h \
  	$(SRC)\w32faces.c \
! 	$(SRC)\dispextern.h \
! 	$(SRC)\frame.h \
  	$(SRC)\w32term.h \
  	$(SRC)\win32.h \
  	$(SRC)\buffer.h \
  	$(SRC)\blockinput.h \
!   	$(SRC)\window.h
  
  $(BLD)\w32fns.obj: \
--- 1040,1052 ----
  	$(EMACS_ROOT)\src\config.h \
  	$(SRC)\w32faces.c \
! 	$(SRC)\lisp.h \
  	$(SRC)\w32term.h \
  	$(SRC)\win32.h \
  	$(SRC)\buffer.h \
+ 	$(SRC)\dispextern.h \
+ 	$(SRC)\frame.h \
  	$(SRC)\blockinput.h \
!   	$(SRC)\window.h \
! 	$(SRC)\intervals.h
  
  $(BLD)\w32fns.obj: \
*************** $(BLD)\w32fns.obj: \
*** 1050,1060 ****
  	$(EMACS_ROOT)\src\config.h \
  	$(SRC)\w32fns.c \
! 	$(SRC)\dispextern.h \
! 	$(SRC)\frame.h \
  	$(SRC)\w32term.h \
  	$(SRC)\win32.h \
  	$(SRC)\buffer.h \
  	$(SRC)\blockinput.h \
!   	$(SRC)\window.h
  
  $(BLD)\w32menu.obj: \
--- 1055,1070 ----
  	$(EMACS_ROOT)\src\config.h \
  	$(SRC)\w32fns.c \
! 	$(SRC)\lisp.h \
  	$(SRC)\w32term.h \
  	$(SRC)\win32.h \
+ 	$(SRC)\frame.h \
+   	$(SRC)\window.h \
  	$(SRC)\buffer.h \
+ 	$(SRC)\dispextern.h \
+ 	$(SRC)\keyboard.h \
  	$(SRC)\blockinput.h \
! 	$(SRC)\paths.h \
! 	$(SRC)\ntheap.h \
! 	$(SRC)\termhooks.h
  
  $(BLD)\w32menu.obj: \
*************** $(BLD)\w32menu.obj: \
*** 1063,1073 ****
  	$(EMACS_ROOT)\src\config.h \
  	$(SRC)\w32menu.c \
! 	$(SRC)\dispextern.h \
  	$(SRC)\frame.h \
! 	$(SRC)\w32term.h \
! 	$(SRC)\win32.h \
! 	$(SRC)\buffer.h \
  	$(SRC)\blockinput.h \
!   	$(SRC)\window.h
  
  $(BLD)\w32term.obj: \
--- 1073,1083 ----
  	$(EMACS_ROOT)\src\config.h \
  	$(SRC)\w32menu.c \
! 	$(SRC)\lisp.h \
! 	$(SRC)\termhooks.h \
  	$(SRC)\frame.h \
!   	$(SRC)\window.h \
! 	$(SRC)\keyboard.h \
  	$(SRC)\blockinput.h \
! 	$(SRC)\buffer.h
  
  $(BLD)\w32term.obj: \
*************** $(BLD)\w32term.obj: \
*** 1076,1086 ****
  	$(EMACS_ROOT)\src\config.h \
  	$(SRC)\w32term.c \
! 	$(SRC)\dispextern.h \
! 	$(SRC)\frame.h \
  	$(SRC)\w32term.h \
  	$(SRC)\win32.h \
  	$(SRC)\buffer.h \
! 	$(SRC)\blockinput.h \
!   	$(SRC)\window.h
  
  $(BLD)\w32select.obj: \
--- 1086,1106 ----
  	$(EMACS_ROOT)\src\config.h \
  	$(SRC)\w32term.c \
! 	$(SRC)\lisp.h \
! 	$(SRC)\blockinput.h \
  	$(SRC)\w32term.h \
  	$(SRC)\win32.h \
+ 	$(SRC)\systty.h \
+ 	$(SRC)\systime.h \
+ 	$(SRC)\frame.h \
+ 	$(SRC)\dispextern.h \
+ 	$(SRC)\termhooks.h \
+ 	$(SRC)\termopts.h \
+ 	$(SRC)\termchar.h \
+ 	$(SRC)\gnu.h \
+ 	$(SRC)\disptab.h \
  	$(SRC)\buffer.h \
!   	$(SRC)\window.h \
! 	$(SRC)\keyboard.h \
! 	$(SRC)\intervals.h
  
  $(BLD)\w32select.obj: \
*************** $(BLD)\w32select.obj: \
*** 1089,1096 ****
  	$(EMACS_ROOT)\src\config.h \
  	$(SRC)\w32select.c \
! 	$(SRC)\dispextern.h \
! 	$(SRC)\frame.h \
  	$(SRC)\w32term.h \
  	$(SRC)\win32.h \
  	$(SRC)\blockinput.h
  
--- 1109,1117 ----
  	$(EMACS_ROOT)\src\config.h \
  	$(SRC)\w32select.c \
! 	$(SRC)\lisp.h \
  	$(SRC)\w32term.h \
  	$(SRC)\win32.h \
+ 	$(SRC)\dispextern.h \
+ 	$(SRC)\frame.h \
  	$(SRC)\blockinput.h
  
*************** $(BLD)\w32reg.obj: \
*** 1100,1105 ****
  	$(EMACS_ROOT)\src\config.h \
  	$(SRC)\w32reg.c \
! 	$(SRC)\dispextern.h \
! 	$(SRC)\frame.h \
  	$(SRC)\w32term.h \
  	$(SRC)\win32.h \
--- 1121,1125 ----
  	$(EMACS_ROOT)\src\config.h \
  	$(SRC)\w32reg.c \
! 	$(SRC)\lisp.h \
  	$(SRC)\w32term.h \
  	$(SRC)\win32.h \
diff -2rcpP --exclude=*.elc emacs-19.30/src/marker.c emacs-19.31/src/marker.c
*** emacs-19.30/src/marker.c	Sun Oct 29 16:38:16 1995
--- emacs-19.31/src/marker.c	Tue Apr  9 18:03:52 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** DEFUN ("marker-position", Fmarker_positi
*** 73,83 ****
  
  DEFUN ("set-marker", Fset_marker, Sset_marker, 2, 3, 0,
!   "Position MARKER before character number NUMBER in BUFFER.\n\
  BUFFER defaults to the current buffer.\n\
! If NUMBER is nil, makes marker point nowhere.\n\
  Then it no longer slows down editing in any buffer.\n\
  Returns MARKER.")
!   (marker, pos, buffer)
!      Lisp_Object marker, pos, buffer;
  {
    register int charno;
--- 74,84 ----
  
  DEFUN ("set-marker", Fset_marker, Sset_marker, 2, 3, 0,
!   "Position MARKER before character number POSITION in BUFFER.\n\
  BUFFER defaults to the current buffer.\n\
! If POSITION is nil, makes marker point nowhere.\n\
  Then it no longer slows down editing in any buffer.\n\
  Returns MARKER.")
!   (marker, position, buffer)
!      Lisp_Object marker, position, buffer;
  {
    register int charno;
*************** Returns MARKER.")
*** 88,93 ****
    /* If position is nil or a marker that points nowhere,
       make this marker point nowhere.  */
!   if (NILP (pos)
!       || (MARKERP (pos) && !XMARKER (pos)->buffer))
      {
        unchain_marker (marker);
--- 89,94 ----
    /* If position is nil or a marker that points nowhere,
       make this marker point nowhere.  */
!   if (NILP (position)
!       || (MARKERP (position) && !XMARKER (position)->buffer))
      {
        unchain_marker (marker);
*************** Returns MARKER.")
*** 95,99 ****
      }
  
!   CHECK_NUMBER_COERCE_MARKER (pos, 1);
    if (NILP (buffer))
      b = current_buffer;
--- 96,100 ----
      }
  
!   CHECK_NUMBER_COERCE_MARKER (position, 1);
    if (NILP (buffer))
      b = current_buffer;
*************** Returns MARKER.")
*** 110,114 ****
      }
  
!   charno = XINT (pos);
    m = XMARKER (marker);
  
--- 111,115 ----
      }
  
!   charno = XINT (position);
    m = XMARKER (marker);
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/mem-limits.h emacs-19.31/src/mem-limits.h
*** emacs-19.30/src/mem-limits.h	Wed Nov 15 20:48:07 1995
--- emacs-19.31/src/mem-limits.h	Mon Jan 15 04:06:29 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  #ifdef MSDOS
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  #ifdef MSDOS
diff -2rcpP --exclude=*.elc emacs-19.30/src/minibuf.c emacs-19.31/src/minibuf.c
*** emacs-19.30/src/minibuf.c	Mon Nov 20 13:37:23 1995
--- emacs-19.31/src/minibuf.c	Tue Apr  9 21:51:04 1996
***************
*** 1,4 ****
  /* Minibuffer input and completion.
!    Copyright (C) 1985, 1986, 1993, 1994, 1995 Free Software Foundation, Inc.
  
  This file is part of GNU Emacs.
--- 1,4 ----
  /* Minibuffer input and completion.
!    Copyright (C) 1985, 1986, 93, 94, 95, 1996 Free Software Foundation, Inc.
  
  This file is part of GNU Emacs.
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** choose_minibuf_frame ()
*** 113,117 ****
        && !EQ (minibuf_window, selected_frame->minibuffer_window))
      {
! #ifdef MSDOS
        selected_frame->minibuffer_window = minibuf_window;
  #else
--- 114,118 ----
        && !EQ (minibuf_window, selected_frame->minibuffer_window))
      {
! #if defined(MSDOS) && !defined(HAVE_X_WINDOWS)
        selected_frame->minibuffer_window = minibuf_window;
  #else
*************** choose_minibuf_frame ()
*** 127,130 ****
--- 128,149 ----
      }
  }
+ 
+ DEFUN ("set-minibuffer-window", Fset_minibuffer_window,
+        Sset_minibuffer_window, 1, 1, 0,
+   "Specify which minibuffer window to use for the minibuffer.\n\
+ This effects where the minibuffer is displayed if you put text in it\n\
+ without invoking the usual minibuffer commands.")
+   (window)
+      Lisp_Object window;
+ {
+   CHECK_WINDOW (window, 1);
+   if (! MINI_WINDOW_P (XWINDOW (window)))
+     error ("Window is not a minibuffer window");
+ 
+   minibuf_window = window;
+ 
+   return window;
+ }
+ 
  
  /* Actual minibuffer invocation. */
*************** read_minibuf (map, initial, prompt, back
*** 157,170 ****
    Lisp_Object val;
    int count = specpdl_ptr - specpdl;
!   Lisp_Object mini_frame;
!   struct gcpro gcpro1, gcpro2, gcpro3;
  
    single_kboard_state ();
  
    val = Qnil;
    /* Don't need to protect PROMPT, HISTVAR, and HISTPOS because we
       store them away before we can GC.  Don't need to protect
       BACKUP_N because we use the value only if it is an integer.  */
!   GCPRO3 (map, initial, val);
  
    if (!STRINGP (prompt))
--- 176,191 ----
    Lisp_Object val;
    int count = specpdl_ptr - specpdl;
!   Lisp_Object mini_frame, ambient_dir;
!   struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
  
    single_kboard_state ();
  
    val = Qnil;
+   ambient_dir = current_buffer->directory;
+ 
    /* Don't need to protect PROMPT, HISTVAR, and HISTPOS because we
       store them away before we can GC.  Don't need to protect
       BACKUP_N because we use the value only if it is an integer.  */
!   GCPRO4 (map, initial, val, ambient_dir);
  
    if (!STRINGP (prompt))
*************** read_minibuf (map, initial, prompt, back
*** 176,196 ****
      error ("Command attempted to use minibuffer while in minibuffer");
  
!   /* Could we simply bind these variables instead?  */
!   minibuf_save_list
!     = Fcons (Voverriding_local_map,
! 	     Fcons (minibuf_window, minibuf_save_list));
!   minibuf_save_list
!     = Fcons (minibuf_prompt,
! 	     Fcons (make_number (minibuf_prompt_width),
! 		    Fcons (Vhelp_form,
! 			   Fcons (Vcurrent_prefix_arg,
! 				  Fcons (Vminibuffer_history_position,
! 					 Fcons (Vminibuffer_history_variable,
! 						minibuf_save_list))))));
! 
!   minibuf_prompt_width = 0;	/* xdisp.c puts in the right value.  */
!   minibuf_prompt = Fcopy_sequence (prompt);
!   Vminibuffer_history_position = histpos;
!   Vminibuffer_history_variable = histvar;
  
    choose_minibuf_frame ();
--- 197,201 ----
      error ("Command attempted to use minibuffer while in minibuffer");
  
!   /* Choose the minibuffer window and frame, and take action on them.  */
  
    choose_minibuf_frame ();
*************** read_minibuf (map, initial, prompt, back
*** 215,219 ****
  #endif
  
!   val = current_buffer->directory;
    Fset_buffer (get_minibuffer (minibuf_level));
  
--- 220,254 ----
  #endif
  
!   /* We have to do this after saving the window configuration
!      since that is what restores the current buffer.  */
! 
!   /* Arrange to restore a number of minibuffer-related variables.
!      We could bind each variable separately, but that would use lots of
!      specpdl slots.  */
!   minibuf_save_list
!     = Fcons (Voverriding_local_map,
! 	     Fcons (minibuf_window, minibuf_save_list));
!   minibuf_save_list
!     = Fcons (minibuf_prompt,
! 	     Fcons (make_number (minibuf_prompt_width),
! 		    Fcons (Vhelp_form,
! 			   Fcons (Vcurrent_prefix_arg,
! 				  Fcons (Vminibuffer_history_position,
! 					 Fcons (Vminibuffer_history_variable,
! 						minibuf_save_list))))));
! 
!   record_unwind_protect (read_minibuf_unwind, Qnil);
!   minibuf_level++;
! 
!   /* Now that we can restore all those variables, start changing them.  */
! 
!   minibuf_prompt_width = 0;	/* xdisp.c puts in the right value.  */
!   minibuf_prompt = Fcopy_sequence (prompt);
!   Vminibuffer_history_position = histpos;
!   Vminibuffer_history_variable = histvar;
!   Vhelp_form = Vminibuffer_help_form;
! 
!   /* Switch to the minibuffer.  */
! 
    Fset_buffer (get_minibuffer (minibuf_level));
  
*************** read_minibuf (map, initial, prompt, back
*** 226,231 ****
       you think of something better to do?  Find another buffer with a
       better directory, and use that one instead.  */
!   if (STRINGP (val))
!     current_buffer->directory = val;
    else
      {
--- 261,266 ----
       you think of something better to do?  Find another buffer with a
       better directory, and use that one instead.  */
!   if (STRINGP (ambient_dir))
!     current_buffer->directory = ambient_dir;
    else
      {
*************** read_minibuf (map, initial, prompt, back
*** 251,258 ****
      Fredirect_frame_focus (Fselected_frame (), mini_frame);
  #endif
-   Fmake_local_variable (Qprint_escape_newlines);
-   print_escape_newlines = 1;
- 
-   record_unwind_protect (read_minibuf_unwind, Qnil);
  
    Vminibuf_scroll_window = selected_window;
--- 286,289 ----
*************** read_minibuf (map, initial, prompt, back
*** 261,267 ****
    XSETFASTINT (XWINDOW (minibuf_window)->hscroll, 0);
  
!   Ferase_buffer ();
!   minibuf_level++;
  
    if (!NILP (initial))
      {
--- 292,307 ----
    XSETFASTINT (XWINDOW (minibuf_window)->hscroll, 0);
  
!   Fmake_local_variable (Qprint_escape_newlines);
!   print_escape_newlines = 1;
  
+   /* Erase the buffer.  */
+   {
+     int count1 = specpdl_ptr - specpdl;
+     specbind (Qinhibit_read_only, Qt);
+     Ferase_buffer ();
+     unbind_to (count1, Qnil);
+   }
+ 
+   /* Put in the initial input.  */
    if (!NILP (initial))
      {
*************** read_minibuf (map, initial, prompt, back
*** 275,284 ****
    previous_echo_glyphs = 0;
  
-   Vhelp_form = Vminibuffer_help_form;
    current_buffer->keymap = map;
  
    /* Run our hook, but not if it is empty.
       (run-hooks would do nothing if it is empty,
!      but it's important to save time here in the usual case.  */
    if (!NILP (Vminibuffer_setup_hook) && !EQ (Vminibuffer_setup_hook, Qunbound)
        && !NILP (Vrun_hooks))
--- 315,323 ----
    previous_echo_glyphs = 0;
  
    current_buffer->keymap = map;
  
    /* Run our hook, but not if it is empty.
       (run-hooks would do nothing if it is empty,
!      but it's important to save time here in the usual case).  */
    if (!NILP (Vminibuffer_setup_hook) && !EQ (Vminibuffer_setup_hook, Qunbound)
        && !NILP (Vrun_hooks))
*************** read_minibuf (map, initial, prompt, back
*** 299,304 ****
  
    /* Make minibuffer contents into a string */
!   val = make_buffer_string (1, Z);
    bcopy (GAP_END_ADDR, XSTRING (val)->data + GPT - BEG, Z - GPT);
  
    /* VAL is the string of minibuffer text.  */
--- 338,345 ----
  
    /* Make minibuffer contents into a string */
!   val = make_buffer_string (1, Z, 1);
! #if 0  /* make_buffer_string should handle the gap.  */
    bcopy (GAP_END_ADDR, XSTRING (val)->data + GPT - BEG, Z - GPT);
+ #endif
  
    /* VAL is the string of minibuffer text.  */
*************** read_minibuf_unwind (data)
*** 396,399 ****
--- 437,441 ----
  {
    Lisp_Object old_deactivate_mark;
+   Lisp_Object window;
  
    /* We are exiting the minibuffer one way or the other,
*************** read_minibuf_unwind (data)
*** 403,424 ****
      safe_run_hooks (Qminibuffer_exit_hook);
  
-   /* Erase the minibuffer we were using at this level.  */
-   Fset_buffer (XWINDOW (minibuf_window)->buffer);
- 
-   /* Prevent error in erase-buffer.  */
-   current_buffer->read_only = Qnil;
- 
-   old_deactivate_mark = Vdeactivate_mark;
-   Ferase_buffer ();
-   Vdeactivate_mark = old_deactivate_mark;
- 
    /* If this was a recursive minibuffer,
!      tie the minibuffer window back to the outer level minibuffer buffer */
    minibuf_level--;
-   /* Make sure minibuffer window is erased, not ignored */
-   windows_or_buffers_changed++;
-   XSETFASTINT (XWINDOW (minibuf_window)->last_modified, 0);
  
!   /* Restore prompt, etc from outer minibuffer */
    minibuf_prompt = Fcar (minibuf_save_list);
    minibuf_save_list = Fcdr (minibuf_save_list);
--- 445,458 ----
      safe_run_hooks (Qminibuffer_exit_hook);
  
    /* If this was a recursive minibuffer,
!      tie the minibuffer window back to the outer level minibuffer buffer.  */
    minibuf_level--;
  
!   window = minibuf_window;
!   /* To keep things predictable, in case it matters, let's be in the minibuffer
!      when we reset the relevant variables.  */
!   Fset_buffer (XWINDOW (window)->buffer);
! 
!   /* Restore prompt, etc, from outer minibuffer level.  */
    minibuf_prompt = Fcar (minibuf_save_list);
    minibuf_save_list = Fcdr (minibuf_save_list);
*************** read_minibuf_unwind (data)
*** 437,440 ****
--- 471,489 ----
    minibuf_window = Fcar (minibuf_save_list);
    minibuf_save_list = Fcdr (minibuf_save_list);
+ 
+   /* Erase the minibuffer we were using at this level.  */
+   {
+     int count = specpdl_ptr - specpdl;
+     /* Prevent error in erase-buffer.  */
+     specbind (Qinhibit_read_only, Qt);
+     old_deactivate_mark = Vdeactivate_mark;
+     Ferase_buffer ();
+     Vdeactivate_mark = old_deactivate_mark;
+     unbind_to (count, Qnil);
+   }
+ 
+   /* Make sure minibuffer window is erased, not ignored.  */
+   windows_or_buffers_changed++;
+   XSETFASTINT (XWINDOW (window)->last_modified, 0);
  }
  
*************** The match is a candidate only if PREDICA
*** 650,655 ****
  The argument given to PREDICATE is the alist element\n\
  or the symbol from the obarray.")
!   (string, alist, pred)
!      Lisp_Object string, alist, pred;
  {
    Lisp_Object bestmatch, tail, elt, eltstring;
--- 699,704 ----
  The argument given to PREDICATE is the alist element\n\
  or the symbol from the obarray.")
!   (string, alist, predicate)
!      Lisp_Object string, alist, predicate;
  {
    Lisp_Object bestmatch, tail, elt, eltstring;
*************** or the symbol from the obarray.")
*** 664,668 ****
    CHECK_STRING (string, 0);
    if (!list && !VECTORP (alist))
!     return call3 (alist, string, pred, Qnil);
  
    bestmatch = Qnil;
--- 713,717 ----
    CHECK_STRING (string, 0);
    if (!list && !VECTORP (alist))
!     return call3 (alist, string, predicate, Qnil);
  
    bestmatch = Qnil;
*************** or the symbol from the obarray.")
*** 738,749 ****
  	     and the predicate doesn't like it. */
  
! 	  if (!NILP (pred))
  	    {
! 	      if (EQ (pred, Qcommandp))
  		tem = Fcommandp (elt);
  	      else
  		{
  		  GCPRO4 (tail, string, eltstring, bestmatch);
! 		  tem = call1 (pred, elt);
  		  UNGCPRO;
  		}
--- 787,798 ----
  	     and the predicate doesn't like it. */
  
! 	  if (!NILP (predicate))
  	    {
! 	      if (EQ (predicate, Qcommandp))
  		tem = Fcommandp (elt);
  	      else
  		{
  		  GCPRO4 (tail, string, eltstring, bestmatch);
! 		  tem = call1 (predicate, elt);
  		  UNGCPRO;
  		}
*************** If the optional fourth argument HIDE-SPA
*** 863,868 ****
  strings in ALIST that start with a space\n\
  are ignored unless STRING itself starts with a space.")
!   (string, alist, pred, hide_spaces)
!      Lisp_Object string, alist, pred, hide_spaces;
  {
    Lisp_Object tail, elt, eltstring;
--- 912,917 ----
  strings in ALIST that start with a space\n\
  are ignored unless STRING itself starts with a space.")
!   (string, alist, predicate, hide_spaces)
!      Lisp_Object string, alist, predicate, hide_spaces;
  {
    Lisp_Object tail, elt, eltstring;
*************** are ignored unless STRING itself starts 
*** 876,880 ****
    if (!list && !VECTORP (alist))
      {
!       return call3 (alist, string, pred, Qt);
      }
    allmatches = Qnil;
--- 925,929 ----
    if (!list && !VECTORP (alist))
      {
!       return call3 (alist, string, predicate, Qt);
      }
    allmatches = Qnil;
*************** are ignored unless STRING itself starts 
*** 955,966 ****
  	     and the predicate doesn't like it. */
  
! 	  if (!NILP (pred))
  	    {
! 	      if (EQ (pred, Qcommandp))
  		tem = Fcommandp (elt);
  	      else
  		{
  		  GCPRO4 (tail, eltstring, allmatches, string);
! 		  tem = call1 (pred, elt);
  		  UNGCPRO;
  		}
--- 1004,1015 ----
  	     and the predicate doesn't like it. */
  
! 	  if (!NILP (predicate))
  	    {
! 	      if (EQ (predicate, Qcommandp))
  		tem = Fcommandp (elt);
  	      else
  		{
  		  GCPRO4 (tail, eltstring, allmatches, string);
! 		  tem = call1 (predicate, elt);
  		  UNGCPRO;
  		}
*************** Lisp_Object Vminibuffer_completion_confi
*** 985,989 ****
  DEFUN ("completing-read", Fcompleting_read, Scompleting_read, 2, 6, 0,
    "Read a string in the minibuffer, with completion.\n\
- Args: PROMPT, TABLE, PREDICATE, REQUIRE-MATCH, INITIAL-INPUT, HIST.\n\
  PROMPT is a string to prompt with; normally it ends in a colon and a space.\n\
  TABLE is an alist whose elements' cars are strings, or an obarray.\n\
--- 1034,1037 ----
*************** Completion ignores case if the ambient v
*** 1014,1019 ****
  DEFUN ("completing-read", Fcompleting_read, Scompleting_read, 2, 6, 0,
    0 /* See immediately above */)
!   (prompt, table, pred, require_match, init, hist)
!      Lisp_Object prompt, table, pred, require_match, init, hist;
  {
    Lisp_Object val, histvar, histpos, position;
--- 1062,1067 ----
  DEFUN ("completing-read", Fcompleting_read, Scompleting_read, 2, 6, 0,
    0 /* See immediately above */)
!   (prompt, table, predicate, require_match, init, hist)
!      Lisp_Object prompt, table, predicate, require_match, init, hist;
  {
    Lisp_Object val, histvar, histpos, position;
*************** DEFUN ("completing-read", Fcompleting_re
*** 1021,1025 ****
    int count = specpdl_ptr - specpdl;
    specbind (Qminibuffer_completion_table, table);
!   specbind (Qminibuffer_completion_predicate, pred);
    specbind (Qminibuffer_completion_confirm,
  	    EQ (require_match, Qt) ? Qnil : Qt);
--- 1069,1073 ----
    int count = specpdl_ptr - specpdl;
    specbind (Qminibuffer_completion_table, table);
!   specbind (Qminibuffer_completion_predicate, predicate);
    specbind (Qminibuffer_completion_confirm,
  	    EQ (require_match, Qt) ? Qnil : Qt);
*************** is added with\n\
*** 1816,1819 ****
--- 1864,1868 ----
    Vcompletion_regexp_list = Qnil;
  
+   defsubr (&Sset_minibuffer_window);
    defsubr (&Sread_from_minibuffer);
    defsubr (&Seval_minibuffer);
diff -2rcpP --exclude=*.elc emacs-19.30/src/mktime.c emacs-19.31/src/mktime.c
*** emacs-19.30/src/mktime.c	Wed Sep 27 02:58:29 1995
--- emacs-19.31/src/mktime.c	Mon Feb 19 18:53:24 1996
***************
*** 1,6 ****
! /* Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc.
!    Contributed by Noel Cragg (noel@cs.oberlin.edu), with fixes by
!    Michael E. Calwas (calwas@ttd.teradyne.com) and
!    Wade Hampton (tasi029@tmn.com).
  
  
--- 1,4 ----
! /* Copyright (C) 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
!    Contributed by Paul Eggert (eggert@twinsun.com).
  
  
*************** GNU General Public License for more deta
*** 20,28 ****
  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
! Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  
  /* Define this to have a standalone program to test this implementation of
     mktime.  */
! /* #define DEBUG */
  
  #ifdef HAVE_CONFIG_H
--- 18,27 ----
  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
! Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
! USA.  */
  
  /* Define this to have a standalone program to test this implementation of
     mktime.  */
! /* #define DEBUG 1 */
  
  #ifdef HAVE_CONFIG_H
*************** Foundation, 675 Mass Ave, Cambridge, MA 
*** 30,43 ****
  #endif
  
  #include <sys/types.h>		/* Some systems define `time_t' here.  */
  #include <time.h>
  
  
! #ifndef __isleap
! /* Nonzero if YEAR is a leap year (every 4 years,
!    except every 100th isn't, and every 400th is).  */
! #define	__isleap(year)	\
!   ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0))
  #endif
  
  #ifndef __P
--- 29,54 ----
  #endif
  
+ /* Assume that leap seconds are possible, unless told otherwise.
+    If the host has a `zic' command with a `-L leapsecondfilename' option,
+    then it supports leap seconds; otherwise it probably doesn't.  */
+ #ifndef LEAP_SECONDS_POSSIBLE
+ #define LEAP_SECONDS_POSSIBLE 1
+ #endif
+ 
  #include <sys/types.h>		/* Some systems define `time_t' here.  */
  #include <time.h>
  
+ #if __STDC__ || __GNU_LIBRARY__ || STDC_HEADERS
+ #include <limits.h>
+ #endif
  
! #if DEBUG
! #include <stdio.h>
! #if __STDC__ || __GNU_LIBRARY__ || STDC_HEADERS
! #include <stdlib.h>
  #endif
+ /* Make it work even if the system's libc has its own mktime routine.  */
+ #define mktime my_mktime
+ #endif /* DEBUG */
  
  #ifndef __P
*************** Foundation, 675 Mass Ave, Cambridge, MA 
*** 49,404 ****
  #endif  /* Not __P.  */
  
! /* How many days are in each month.  */
! const unsigned short int __mon_lengths[2][12] =
!   {
!     /* Normal years.  */
!     { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
!     /* Leap years.  */
!     { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
!   };
! 
! 
! static int times_through_search; /* This library routine should never
! 				    hang -- make sure we always return
! 				    when we're searching for a value */
! 
! 
! #ifdef DEBUG
! 
! #include <stdio.h>
! #include <ctype.h>
! 
! int debugging_enabled = 0;
! 
! /* Print the values in a `struct tm'. */
! static void
! printtm (it)
!      struct tm *it;
! {
!   printf ("%02d/%02d/%04d %02d:%02d:%02d (%s) yday:%03d dst:%d gmtoffset:%ld",
! 	  it->tm_mon + 1,
! 	  it->tm_mday,
! 	  it->tm_year + 1900,
! 	  it->tm_hour,
! 	  it->tm_min,
! 	  it->tm_sec,
! 	  it->tm_zone,
! 	  it->tm_yday,
! 	  it->tm_isdst,
! 	  it->tm_gmtoff);
! }
  #endif
  
! 
! static time_t
! dist_tm (t1, t2)
!      struct tm *t1;
!      struct tm *t2;
! {
!   time_t distance = 0;
!   unsigned long int v1, v2;
!   int diff_flag = 0;
! 
!   v1 = v2 = 0;
! 
! #define doit(x, secs)                                                         \
!   v1 += t1->x * secs;                                                         \
!   v2 += t2->x * secs;                                                         \
!   if (!diff_flag)                                                             \
!     {                                                                         \
!       if (t1->x < t2->x)                                                      \
! 	diff_flag = -1;                                                       \
!       else if (t1->x > t2->x)                                                 \
! 	diff_flag = 1;                                                        \
!     }
!   
!   doit (tm_year, 31536000);	/* Okay, not all years have 365 days. */
!   doit (tm_mon, 2592000);	/* Okay, not all months have 30 days. */
!   doit (tm_mday, 86400);
!   doit (tm_hour, 3600);
!   doit (tm_min, 60);
!   doit (tm_sec, 1);
!   
! #undef doit
!   
!   /* We should also make sure that the sign of DISTANCE is correct -- if
!      DIFF_FLAG is positive, the distance should be positive and vice versa. */
!   
!   distance = (v1 > v2) ? (v1 - v2) : (v2 - v1);
!   if (diff_flag < 0)
!     distance = -distance;
! 
!   if (times_through_search > 20) /* Arbitrary # of calls, but makes sure we
! 				    never hang if there's a problem with
! 				    this algorithm.  */
!     {
!       distance = diff_flag;
!     }
! 
!   /* We need this DIFF_FLAG business because it is forseeable that the
!      distance may be zero when, in actuality, the two structures are
!      different.  This is usually the case when the dates are 366 days apart
!      and one of the years is a leap year.  */
! 
!   if (distance == 0 && diff_flag)
!     distance = 86400 * diff_flag;
! 
!   return distance;
! }
!       
! 
! /* MKTIME converts the values in a struct tm to a time_t.  The values
!    in tm_wday and tm_yday are ignored; other values can be put outside
!    of legal ranges since they will be normalized.  This routine takes
!    care of that normalization. */
! 
! void
! do_normalization (tmptr)
!      struct tm *tmptr;
! {
! 
! #define normalize(foo,x,y,bar); \
!   while (tmptr->foo < x) \
!     { \
!       tmptr->bar--; \
!       tmptr->foo = (y - (x - tmptr->foo) + 1); \
!     } \
!   while (tmptr->foo > y) \
!     { \
!       tmptr->foo = (x + (tmptr->foo - y) - 1); \
!       tmptr->bar++; \
!     }
!   
!   normalize (tm_sec, 0, 59, tm_min);
!   normalize (tm_min, 0, 59, tm_hour);
!   normalize (tm_hour, 0, 23, tm_mday);
!   
!   /* Do the month first, so day range can be found. */
!   normalize (tm_mon, 0, 11, tm_year);
! 
!   /* Since the day range modifies the month, we should be careful how
!      we reference the array of month lengths -- it is possible that
!      the month will go negative, hence the modulo...
! 
!      Also, tm_year is the year - 1900, so we have to 1900 to have it
!      work correctly. */
! 
!   normalize (tm_mday, 1,
! 	     __mon_lengths[__isleap (tmptr->tm_year + 1900)]
!                           [((tmptr->tm_mon < 0)
! 			    ? (12 + (tmptr->tm_mon % 12))
! 			    : (tmptr->tm_mon % 12)) ],
! 	     tm_mon);
! 
!   /* Do the month again, because the day may have pushed it out of range. */
!   normalize (tm_mon, 0, 11, tm_year);
! 
!   /* Do the day again, because the month may have changed the range. */
!   normalize (tm_mday, 1,
! 	     __mon_lengths[__isleap (tmptr->tm_year + 1900)]
! 	                  [((tmptr->tm_mon < 0)
! 			    ? (12 + (tmptr->tm_mon % 12))
! 			    : (tmptr->tm_mon % 12)) ],
! 	     tm_mon);
!   
! #ifdef DEBUG
!   if (debugging_enabled)
!     {
!       printf ("   After normalizing:\n     ");
!       printtm (tmptr);
!       putchar ('\n');
!     }
! #endif
! 
! }
! 
! 
! /* Here's where the work gets done. */
! 
! #define BAD_STRUCT_TM ((time_t) -1)
! 
! time_t
! __mktime_internal (timeptr, producer)
!      struct tm *timeptr;
!      struct tm *(*producer) __P ((const time_t *, struct tm *));
! {
!   struct tm our_tm;		/* our working space */
!   struct tm *me = &our_tm;	/* a pointer to the above */
!   time_t result;		/* the value we return */
! 
!   *me = *timeptr;		/* copy the struct tm that was passed
! 				   in by the caller */
! 
! 
!   /***************************/
!   /* Normalize the structure */
!   /***************************/
! 
!   /* This routine assumes that the value of TM_ISDST is -1, 0, or 1.
!      If the user didn't pass it in that way, fix it. */
! 
!   if (me->tm_isdst > 0)
!     me->tm_isdst = 1;
!   else if (me->tm_isdst < 0)
!     me->tm_isdst = -1;
! 
!   do_normalization (me);
! 
!   /* Get out of here if it's not possible to represent this struct.
!      If any of the values in the normalized struct tm are negative,
!      our algorithms won't work.  Luckily, we only need to check the
!      year at this point; normalization guarantees that all values will
!      be in correct ranges EXCEPT the year. */
! 
!   if (me->tm_year < 0)
!     return BAD_STRUCT_TM;
! 
!   /*************************************************/
!   /* Find the appropriate time_t for the structure */
!   /*************************************************/
! 
!   /* Modified b-search -- make intelligent guesses as to where the
!      time might lie along the timeline, assuming that our target time
!      lies a linear distance (w/o considering time jumps of a
!      particular region).
! 
!      Assume that time does not fluctuate at all along the timeline --
!      e.g., assume that a day will always take 86400 seconds, etc. --
!      and come up with a hypothetical value for the time_t
!      representation of the struct tm TARGET, in relation to the guess
!      variable -- it should be pretty close!
! 
!      After testing this, the maximum number of iterations that I had
!      on any number that I tried was 3!  Not bad.
! 
!      The reason this is not a subroutine is that we will modify some
!      fields in the struct tm (yday and mday).  I've never felt good
!      about side-effects when writing structured code... */
! 
!   {
!     struct tm *guess_tm;
!     struct tm guess_struct;
!     time_t guess = 0;
!     time_t distance = 0;
!     time_t last_distance = 0;
! 
!     times_through_search = 0;
! 
!     do
!       {
! 	guess += distance;
! 
! 	times_through_search++;     
!       
! 	guess_tm = (*producer) (&guess, &guess_struct);
!       
! #ifdef DEBUG
! 	if (debugging_enabled)
! 	  {
! 	    printf ("   Guessing time_t == %d\n     ", (int) guess);
! 	    printtm (guess_tm);
! 	    putchar ('\n');
! 	  }
  #endif
!       
! 	/* How far is our guess from the desired struct tm? */
! 	distance = dist_tm (me, guess_tm);
!       
! 	/* Handle periods of time where a period of time is skipped.
! 	   For example, 2:15 3 April 1994 does not exist, because DST
! 	   is in effect.  The distance function will alternately
! 	   return values of 3600 and -3600, because it doesn't know
! 	   that the requested time doesn't exist.  In these situations
! 	   (even if the skip is not exactly an hour) the distances
! 	   returned will be the same, but alternating in sign.  We
! 	   want the later time, so check to see that the distance is
! 	   oscillating and we've chosen the correct of the two
! 	   possibilities.
! 
! 	   Useful: 3 Apr 94 765356300, 30 Oct 94 783496000 */
! 
! 	if ((distance == -last_distance) && (distance < last_distance))
! 	  {
! 	    /* If the caller specified that the DST flag was off, it's
!                not possible to represent this time. */
! 	    if (me->tm_isdst == 0)
! 	      {
! #ifdef DEBUG
! 	    printf ("   Distance is oscillating -- dst flag nixes struct!\n");
  #endif
- 		return BAD_STRUCT_TM;
- 	      }
  
! #ifdef DEBUG
! 	    printf ("   Distance is oscillating -- chose the later time.\n");
  #endif
! 	    distance = 0;
! 	  }
! 
! 	if ((distance == 0) && (me->tm_isdst != -1)
! 	    && (me->tm_isdst != guess_tm->tm_isdst))
! 	  {
! 	    /* If we're in this code, we've got the right time but the
!                wrong daylight savings flag.  We need to move away from
!                the time that we have and approach the other time from
!                the other direction.  That is, if I've requested the
!                non-DST version of a time and I get the DST version
!                instead, I want to put us forward in time and search
!                backwards to get the other time.  I checked all of the
!                configuration files for the tz package -- no entry
!                saves more than two hours, so I think we'll be safe by
!                moving 24 hours in one direction.  IF THE AMOUNT OF
!                TIME SAVED IN THE CONFIGURATION FILES CHANGES, THIS
!                VALUE MAY NEED TO BE ADJUSTED.  Luckily, we can never
!                have more than one level of overlaps, or this would
!                never work. */
! 
! #define SKIP_VALUE 86400
! 
! 	    if (guess_tm->tm_isdst == 0)
! 	      /* we got the later one, but want the earlier one */
! 	      distance = -SKIP_VALUE;
! 	    else
! 	      distance = SKIP_VALUE;
! 	    
! #ifdef DEBUG
! 	    printf ("   Got the right time, wrong DST value -- adjusting\n");
  #endif
- 	  }
  
! 	last_distance = distance;
  
!       } while (distance != 0);
! 
!     /* Check to see that the dst flag matches */
! 
!     if (me->tm_isdst != -1)
!       {
! 	if (me->tm_isdst != guess_tm->tm_isdst)
! 	  {
! #ifdef DEBUG
! 	    printf ("   DST flag doesn't match!  FIXME?\n");
  #endif
- 	    return BAD_STRUCT_TM;
- 	  }
-       }
- 
-     result = guess;		/* Success! */
- 
-     /* On successful completion, the values of tm_wday and tm_yday
-        have to be set appropriately. */
-     
-     /* me->tm_yday = guess_tm->tm_yday; 
-        me->tm_mday = guess_tm->tm_mday; */
  
!     *me = *guess_tm;
!   }
! 
!   /* Update the caller's version of the structure */
  
!   *timeptr = *me;
  
-   return result;
- }
  
  #if ! HAVE_LOCALTIME_R && ! defined (localtime_r)
--- 60,106 ----
  #endif  /* Not __P.  */
  
! #ifndef CHAR_BIT
! #define CHAR_BIT 8
  #endif
  
! #ifndef INT_MIN
! #define INT_MIN (~0 << (sizeof (int) * CHAR_BIT - 1))
  #endif
! #ifndef INT_MAX
! #define INT_MAX (~0 - INT_MIN)
  #endif
  
! #ifndef TIME_T_MIN
! #define TIME_T_MIN (0 < (time_t) -1 ? (time_t) 0 \
! 		    : ~ (time_t) 0 << (sizeof (time_t) * CHAR_BIT - 1))
  #endif
! #ifndef TIME_T_MAX
! #define TIME_T_MAX (~ (time_t) 0 - TIME_T_MIN)
  #endif
  
! #define TM_YEAR_BASE 1900
! #define EPOCH_YEAR 1970
  
! #ifndef __isleap
! /* Nonzero if YEAR is a leap year (every 4 years,
!    except every 100th isn't, and every 400th is).  */
! #define	__isleap(year)	\
!   ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0))
  #endif
  
! /* How many days come before each month (0-12).  */
! const unsigned short int __mon_yday[2][13] =
!   {
!     /* Normal years.  */
!     { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 },
!     /* Leap years.  */
!     { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 }
!   };
  
! static time_t ydhms_tm_diff __P ((int, int, int, int, int, const struct tm *));
! time_t __mktime_internal __P ((struct tm *,
! 			       struct tm *(*) (const time_t *, struct tm *),
! 			       time_t *));
  
  
  #if ! HAVE_LOCALTIME_R && ! defined (localtime_r)
*************** __mktime_internal (timeptr, producer)
*** 407,416 ****
  #else
  /* Approximate localtime_r as best we can in its absence.  */
! #define localtime_r my_localtime_r /* Avoid clash with system localtime_r.  */
  static struct tm *
  localtime_r (t, tp)
       const time_t *t;
       struct tm *tp;
! { 
    struct tm *l = localtime (t);
    if (! l)
--- 109,119 ----
  #else
  /* Approximate localtime_r as best we can in its absence.  */
! #define localtime_r my_localtime_r
! static struct tm *localtime_r __P ((const time_t *, struct tm *));
  static struct tm *
  localtime_r (t, tp)
       const time_t *t;
       struct tm *tp;
! {
    struct tm *l = localtime (t);
    if (! l)
*************** localtime_r (t, tp)
*** 422,435 ****
  #endif /* ! HAVE_LOCALTIME_R && ! defined (localtime_r) */
  
  time_t
! #ifdef DEBUG			/* make it work even if the system's
! 				   libc has it's own mktime routine */
! my_mktime (timeptr)
! #else
! mktime (timeptr)
! #endif
!      struct tm *timeptr;
  {
!   return __mktime_internal (timeptr, localtime_r);
  }
  
--- 125,289 ----
  #endif /* ! HAVE_LOCALTIME_R && ! defined (localtime_r) */
  
+ 
+ /* Yield the difference between (YEAR-YDAY HOUR:MIN:SEC) and (*TP),
+    measured in seconds, ignoring leap seconds.
+    YEAR uses the same numbering as TM->tm_year.
+    All values are in range, except possibly YEAR.
+    If overflow occurs, yield the low order bits of the correct answer.  */
+ static time_t
+ ydhms_tm_diff (year, yday, hour, min, sec, tp)
+      int year, yday, hour, min, sec;
+      const struct tm *tp;
+ {
+   time_t ay = year + (time_t) (TM_YEAR_BASE - 1);
+   time_t by = tp->tm_year + (time_t) (TM_YEAR_BASE - 1);
+   time_t intervening_leap_days =
+     (ay/4 - by/4) - (ay/100 - by/100) + (ay/400 - by/400);
+   time_t years = ay - by;
+   time_t days = (365 * years + intervening_leap_days
+ 		 + (yday - tp->tm_yday));
+   return (60 * (60 * (24 * days + (hour - tp->tm_hour))
+ 		+ (min - tp->tm_min))
+ 	  + (sec - tp->tm_sec));
+ }
+ 
+ 
+ static time_t localtime_offset;
+ 
+ /* Convert *TP to a time_t value.  */
  time_t
! mktime (tp)
!      struct tm *tp;
  {
!   return __mktime_internal (tp, localtime_r, &localtime_offset);
! }
! 
! /* Convert *TP to a time_t value, inverting
!    the monotonic and mostly-unit-linear conversion function CONVERT.
!    Use *OFFSET to keep track of a guess at the offset of the result,
!    compared to what the result would be for UTC without leap seconds.
!    If *OFFSET's guess is correct, only one CONVERT call is needed.  */
! time_t
! __mktime_internal (tp, convert, offset)
!      struct tm *tp;
!      struct tm *(*convert) __P ((const time_t *, struct tm *));
!      time_t *offset;
! {
!   time_t t, dt, t0;
!   struct tm tm;
! 
!   /* The maximum number of probes (calls to CONVERT) should be enough
!      to handle any combinations of time zone rule changes, solar time,
!      and leap seconds.  Posix.1 prohibits leap seconds, but some hosts
!      have them anyway.  */
!   int remaining_probes = 4;
! 
!   /* Time requested.  Copy it in case CONVERT modifies *TP; this can
!      occur if TP is localtime's returned value and CONVERT is localtime.  */
!   int sec = tp->tm_sec;
!   int min = tp->tm_min;
!   int hour = tp->tm_hour;
!   int mday = tp->tm_mday;
!   int mon = tp->tm_mon;
!   int year_requested = tp->tm_year;
!   int isdst = tp->tm_isdst;
! 
!   /* Ensure that mon is in range, and set year accordingly.  */
!   int mon_remainder = mon % 12;
!   int negative_mon_remainder = mon_remainder < 0;
!   int mon_years = mon / 12 - negative_mon_remainder;
!   int year = year_requested + mon_years;
! 
!   /* The other values need not be in range:
!      the remaining code handles minor overflows correctly,
!      assuming int and time_t arithmetic wraps around.
!      Major overflows are caught at the end.  */
! 
!   /* Calculate day of year from year, month, and day of month.
!      The result need not be in range.  */
!   int yday = ((__mon_yday[__isleap (year + TM_YEAR_BASE)]
! 	       [mon_remainder + 12 * negative_mon_remainder])
! 	      + mday - 1);
! 
! #if LEAP_SECONDS_POSSIBLE
!   /* Handle out-of-range seconds specially,
!      since ydhms_tm_diff assumes every minute has 60 seconds.  */
!   int sec_requested = sec;
!   if (sec < 0)
!     sec = 0;
!   if (59 < sec)
!     sec = 59;
! #endif
! 
!   /* Invert CONVERT by probing.  First assume the same offset as last time.
!      Then repeatedly use the error to improve the guess.  */
! 
!   tm.tm_year = EPOCH_YEAR - TM_YEAR_BASE;
!   tm.tm_yday = tm.tm_hour = tm.tm_min = tm.tm_sec = 0;
!   t0 = ydhms_tm_diff (year, yday, hour, min, sec, &tm);
! 
!   for (t = t0 + *offset;
!        (dt = ydhms_tm_diff (year, yday, hour, min, sec, (*convert) (&t, &tm)));
!        t += dt)
!     if (--remaining_probes == 0)
!       return -1;
! 
!   /* Check whether tm.tm_isdst has the requested value, if any.  */
!   if (0 <= isdst && 0 <= tm.tm_isdst)
!     {
!       int dst_diff = (isdst != 0) - (tm.tm_isdst != 0);
!       if (dst_diff)
! 	{
! 	  /* Move two hours in the direction indicated by the disagreement,
! 	     probe some more, and switch to a new time if found.
! 	     The largest known fallback due to daylight savings is two hours:
! 	     once, in Newfoundland, 1988-10-30 02:00 -> 00:00.  */
! 	  time_t ot = t - 2 * 60 * 60 * dst_diff;
! 	  while (--remaining_probes != 0)
! 	    {
! 	      struct tm otm;
! 	      if (! (dt = ydhms_tm_diff (year, yday, hour, min, sec,
! 					 (*convert) (&ot, &otm))))
! 		{
! 		  t = ot;
! 		  tm = otm;
! 		  break;
! 		}
! 	      if ((ot += dt) == t)
! 		break;  /* Avoid a redundant probe.  */
! 	    }
! 	}
!     }
! 
!   *offset = t - t0;
! 
! #if LEAP_SECONDS_POSSIBLE
!   if (sec_requested != tm.tm_sec)
!     {
!       /* Adjust time to reflect the tm_sec requested, not the normalized value.
! 	 Also, repair any damage from a false match due to a leap second.  */
!       t += sec_requested - sec + (sec == 0 && tm.tm_sec == 60);
!       (*convert) (&t, &tm);
!     }
! #endif
! 
!   if (TIME_T_MAX / INT_MAX / 366 / 24 / 60 / 60 < 3)
!     {
!       /* time_t isn't large enough to rule out overflows in ydhms_tm_diff,
! 	 so check for major overflows.  A gross check suffices,
! 	 since if t has overflowed, it is off by a multiple of
! 	 TIME_T_MAX - TIME_T_MIN + 1.  So ignore any component of
! 	 the difference that is bounded by a small value.  */
! 
!       double dyear = (double) year_requested + mon_years - tm.tm_year;
!       double dday = 366 * dyear + mday;
!       double dsec = 60 * (60 * (24 * dday + hour) + min) + sec_requested;
! 
!       if (TIME_T_MAX / 3 - TIME_T_MIN / 3 < (dsec < 0 ? - dsec : dsec))
! 	return -1;
!     }
! 
!   *tp = tm;
!   return t;
  }
  
*************** weak_alias (mktime, timelocal)
*** 438,528 ****
  #endif
  
! #ifdef DEBUG
! void
! main (argc, argv)
!      int argc;
!      char *argv[];
  {
!   int time;
!   int result_time;
!   struct tm *tmptr;
!   
!   if (argc == 1)
!     {
!       long q;
!       
!       printf ("starting long test...\n");
  
!       for (q = 10000000; q < 1000000000; q += 599)
! 	{
! 	  struct tm *tm = localtime ((time_t *) &q);
! 	  if ((q % 10000) == 0) { printf ("%ld\n", q); fflush (stdout); }
! 	  if (q != my_mktime (tm))
! 	    { printf ("failed for %ld\n", q); fflush (stdout); }
! 	}
!       
!       printf ("test finished\n");
  
!       exit (0);
      }
!   
!   if (argc != 2)
      {
!       printf ("wrong # of args\n");
!       exit (0);
      }
!   
!   debugging_enabled = 1;	/* We want to see the info */
  
!   ++argv;
!   time = atoi (*argv);
!   
!   tmptr = localtime ((time_t *) &time);
!   printf ("Localtime tells us that a time_t of %d represents\n     ", time);
!   printtm (tmptr);
!   putchar ('\n');
! 
!   printf ("   Given localtime's return val, mktime returns %d which is\n     ",
! 	  (int) my_mktime (tmptr));
!   printtm (tmptr);
!   putchar ('\n');
! 
! #if 0
!   tmptr->tm_sec -= 20;
!   tmptr->tm_min -= 20;
!   tmptr->tm_hour -= 20;
!   tmptr->tm_mday -= 20;
!   tmptr->tm_mon -= 20;
!   tmptr->tm_year -= 20;
!   tmptr->tm_gmtoff -= 20000;	/* This has no effect! */
!   tmptr->tm_zone = NULL;	/* Nor does this! */
!   tmptr->tm_isdst = -1;
! #endif
!   
!   tmptr->tm_hour += 1;
!   tmptr->tm_isdst = -1;
! 
!   printf ("\n\nchanged ranges: ");
!   printtm (tmptr);
!   putchar ('\n');
! 
!   result_time = my_mktime (tmptr);
!   printf ("\nmktime: %d\n", result_time);
! 
!   tmptr->tm_isdst = 0;
! 
!   printf ("\n\nchanged ranges: ");
!   printtm (tmptr);
!   putchar ('\n');
  
!   result_time = my_mktime (tmptr);
!   printf ("\nmktime: %d\n", result_time);
  }
- #endif /* DEBUG */
  
  
  /*
  Local Variables:
! compile-command: "gcc -g mktime.c -o mktime -DDEBUG"
  End:
  */
--- 292,411 ----
  #endif
  
! #if DEBUG
! 
! static int
! not_equal_tm (a, b)
!      struct tm *a;
!      struct tm *b;
  {
!   return ((a->tm_sec ^ b->tm_sec)
! 	  | (a->tm_min ^ b->tm_min)
! 	  | (a->tm_hour ^ b->tm_hour)
! 	  | (a->tm_mday ^ b->tm_mday)
! 	  | (a->tm_mon ^ b->tm_mon)
! 	  | (a->tm_year ^ b->tm_year)
! 	  | (a->tm_mday ^ b->tm_mday)
! 	  | (a->tm_yday ^ b->tm_yday)
! 	  | (a->tm_isdst ^ b->tm_isdst));
! }
  
! static void
! print_tm (tp)
!      struct tm *tp;
! {
!   printf ("%04d-%02d-%02d %02d:%02d:%02d yday %03d wday %d isdst %d",
! 	  tp->tm_year + TM_YEAR_BASE, tp->tm_mon + 1, tp->tm_mday,
! 	  tp->tm_hour, tp->tm_min, tp->tm_sec,
! 	  tp->tm_yday, tp->tm_wday, tp->tm_isdst);
! }
  
! static int
! check_result (tk, tmk, tl, tml)
!      time_t tk;
!      struct tm tmk;
!      time_t tl;
!      struct tm tml;
! {
!   if (tk != tl || not_equal_tm (&tmk, &tml))
!     {
!       printf ("mktime (");
!       print_tm (&tmk);
!       printf (")\nyields (");
!       print_tm (&tml);
!       printf (") == %ld, should be %ld\n", (long) tl, (long) tk);
!       return 1;
      }
! 
!   return 0;
! }
! 
! int
! main (argc, argv)
!      int argc;
!      char **argv;
! {
!   int status = 0;
!   struct tm tm, tmk, tml;
!   time_t tk, tl;
!   char trailer;
! 
!   if ((argc == 3 || argc == 4)
!       && (sscanf (argv[1], "%d-%d-%d%c",
! 		  &tm.tm_year, &tm.tm_mon, &tm.tm_mday, &trailer)
! 	  == 3)
!       && (sscanf (argv[2], "%d:%d:%d%c",
! 		  &tm.tm_hour, &tm.tm_min, &tm.tm_sec, &trailer)
! 	  == 3))
      {
!       tm.tm_year -= TM_YEAR_BASE;
!       tm.tm_mon--;
!       tm.tm_isdst = argc == 3 ? -1 : atoi (argv[3]);
!       tmk = tm;
!       tl = mktime (&tmk);
!       tml = *localtime (&tl);
!       printf ("mktime returns %ld == ", (long) tl);
!       print_tm (&tmk);
!       printf ("\n");
!       status = check_result (tl, tmk, tl, tml);
      }
!   else if (argc == 4 || (argc == 5 && strcmp (argv[4], "-") == 0))
!     {
!       time_t from = atol (argv[1]);
!       time_t by = atol (argv[2]);
!       time_t to = atol (argv[3]);
  
!       if (argc == 4)
! 	for (tl = from; tl <= to; tl += by)
! 	  {
! 	    tml = *localtime (&tl);
! 	    tmk = tml;
! 	    tk = mktime (&tmk);
! 	    status |= check_result (tk, tmk, tl, tml);
! 	  }
!       else
! 	for (tl = from; tl <= to; tl += by)
! 	  {
! 	    /* Null benchmark.  */
! 	    tml = *localtime (&tl);
! 	    tmk = tml;
! 	    tk = tl;
! 	    status |= check_result (tk, tmk, tl, tml);
! 	  }
!     }
!   else
!     printf ("Usage:\
! \t%s YYYY-MM-DD HH:MM:SS [ISDST] # Test given time.\n\
! \t%s FROM BY TO # Test values FROM, FROM+BY, ..., TO.\n\
! \t%s FROM BY TO - # Do not test those values (for benchmark).\n",
! 	    argv[0], argv[0], argv[0]);
  
!   return status;
  }
  
+ #endif /* DEBUG */
  
  /*
  Local Variables:
! compile-command: "gcc -DDEBUG=1 -Wall -O -g mktime.c -o mktime"
  End:
  */
diff -2rcpP --exclude=*.elc emacs-19.30/src/mocklisp.c emacs-19.31/src/mocklisp.c
*** emacs-19.30/src/mocklisp.c	Thu Jun 15 16:38:54 1995
--- emacs-19.31/src/mocklisp.c	Tue Apr  9 18:12:26 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/mocklisp.h emacs-19.31/src/mocklisp.h
*** emacs-19.30/src/mocklisp.h	Thu Jun 15 16:39:03 1995
--- emacs-19.31/src/mocklisp.h	Mon Jan 15 04:06:29 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  /* This is the main entry point to mocklisp execution.
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* This is the main entry point to mocklisp execution.
diff -2rcpP --exclude=*.elc emacs-19.30/src/msdos.c emacs-19.31/src/msdos.c
*** emacs-19.30/src/msdos.c	Fri Nov 24 22:01:19 1995
--- emacs-19.31/src/msdos.c	Sun May 12 13:45:14 1996
***************
*** 1,4 ****
  /* MS-DOS specific C utilities.
!    Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc.
  
  This file is part of GNU Emacs.
--- 1,4 ----
  /* MS-DOS specific C utilities.
!    Copyright (C) 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
  
  This file is part of GNU Emacs.
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  /* Contributed by Morten Welinder */
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* Contributed by Morten Welinder */
*************** the Free Software Foundation, 675 Mass A
*** 32,35 ****
--- 33,43 ----
  #include <sys/time.h>
  #include <dos.h>
+ #include <errno.h>
+ #include <sys/stat.h>    /* for _fixpath */
+ #if __DJGPP__ >= 2
+ #include <fcntl.h>
+ #include <libc/dosio.h>  /* for _USE_LFN */
+ #endif
+ 
  #include "dosfns.h"
  #include "msdos.h"
*************** the Free Software Foundation, 675 Mass A
*** 47,50 ****
--- 55,85 ----
  #define P_WAIT 1
  
+ #ifndef _USE_LFN
+ #define _USE_LFN 0
+ #endif
+ 
+ #if __DJGPP__ > 1
+ 
+ #include <signal.h>
+ 
+ #ifndef SYSTEM_MALLOC
+ 
+ #ifdef GNU_MALLOC
+ 
+ /* If other `malloc' than ours is used, force our `sbrk' behave like
+    Unix programs expect (resize memory blocks to keep them contiguous).
+    If `sbrk' from `ralloc.c' is NOT used, also zero-out sbrk'ed memory,
+    because that's what `gmalloc' expects to get.  */
+ #include <crt0.h>
+ 
+ #ifdef REL_ALLOC
+ int _crt0_startup_flags = _CRT0_FLAG_UNIX_SBRK;
+ #else  /* not REL_ALLOC */
+ int _crt0_startup_flags = (_CRT0_FLAG_UNIX_SBRK | _CRT0_FLAG_FILL_SBRK_MEMORY);
+ #endif /* not REL_ALLOC */
+ #endif /* GNU_MALLOC */
+ 
+ #endif /* not SYSTEM_MALLOC */
+ #endif /* __DJGPP__ > 1 */
  
  static unsigned long
*************** mouse_init ()
*** 224,228 ****
    mouse_visible = 0;
  }
! 
  /* ------------------------- Screen control ----------------------
   *
--- 259,263 ----
    mouse_visible = 0;
  }
! 
  /* ------------------------- Screen control ----------------------
   *
*************** static int startup_screen_size_Y;
*** 250,253 ****
--- 285,289 ----
  static int startup_pos_X;
  static int startup_pos_Y;
+ static unsigned char startup_screen_attrib;
  
  static int term_setup_done;
*************** ScreenVisualBell (void)
*** 330,337 ****
  #ifndef HAVE_X_WINDOWS
  
! /*
!  * If we write a character in the position where the mouse is,
!  * the mouse cursor may need to be refreshed.
!  */
  
  static void
--- 366,502 ----
  #ifndef HAVE_X_WINDOWS
  
! /* Set the screen dimensions so that it can show no less than
!    ROWS x COLS frame.  */
! 
! void
! dos_set_window_size (rows, cols)
!      int *rows, *cols;
! {
!   char video_name[30];
!   Lisp_Object video_mode;
!   int video_mode_value;
!   int have_vga = 0;
!   union REGS regs;
!   int current_rows = ScreenRows (), current_cols = ScreenCols ();
! 
!   if (*rows == current_rows && *cols == current_cols)
!     return;
! 
!   /* Do we have a VGA?  */
!   regs.x.ax = 0x1a00;
!   int86 (0x10, &regs, &regs);
!   if (regs.h.al == 0x1a && regs.h.bl > 5 && regs.h.bl < 13)
!     have_vga = 1;
! 
!   mouse_off ();
! 
!   /* If the user specified a special video mode for these dimensions,
!      use that mode.  */
!   sprintf (video_name, "screen-dimensions-%dx%d", *rows, *cols);
!   video_mode = XSYMBOL (Fintern_soft (build_string (video_name),
! 				      Qnil))-> value;
! 
!   if (INTEGERP (video_mode)
!       && (video_mode_value = XINT (video_mode)) > 0)
!     {
!       regs.x.ax = video_mode_value;
!       int86 (0x10, &regs, &regs);
!       regs.h.bl = 0;
!       regs.x.ax = 0x1003;
!       int86 (0x10, &regs, &regs);
! 
!       if (have_mouse)
! 	{
! 	  /* Must hardware-reset the mouse, or else it won't update
! 	     its notion of screen dimensions for some non-standard
! 	     video modes.  This is *painfully* slow...  */
! 	  regs.x.ax = 0;
! 	  int86 (0x33, &regs, &regs);
! 	}
!     }
! 
!   /* Find one of the dimensions supported by standard EGA/VGA
!      which gives us at least the required dimensions.  */
! 
! #if __DJGPP__ > 1
! 
!   else
!     {
!       static struct {
! 	int rows;
! 	int need_vga;
!       }	std_dimension[] = {
! 	  {25, 0},
! 	  {28, 1},
! 	  {35, 0},
! 	  {40, 1},
! 	  {43, 0},
! 	  {50, 1}
!       };
!       int i = 0;
! 
!       while (i < sizeof (std_dimension) / sizeof (std_dimension[0]))
! 	{
! 	 if (std_dimension[i].need_vga <= have_vga
! 	     && std_dimension[i].rows >= *rows)
! 	   {
! 	     if (std_dimension[i].rows != current_rows
! 		 || *cols != current_cols)
! 	       _set_screen_lines (std_dimension[i].rows);
! 	     break;
! 	   }
! 	 i++;
! 	}
!     }
! 
! #else /* not __DJGPP__ > 1 */
! 
!   else if (*rows <= 25)
!     {
!       if (current_rows != 25 || current_cols != 80)
! 	{
! 	  regs.x.ax = 3;
! 	  int86 (0x10, &regs, &regs);
! 	  regs.x.ax = 0x1101;
! 	  regs.h.bl = 0;
! 	  int86 (0x10, &regs, &regs);
! 	  regs.x.ax = 0x1200;
! 	  regs.h.bl = 32;
! 	  int86 (0x10, &regs, &regs);
! 	  regs.x.ax = 3;
! 	  int86 (0x10, &regs, &regs);
! 	}
!     }
!   else if (*rows <= 50)
!     if (have_vga && (current_rows != 50 || current_cols != 80)
! 	|| *rows <= 43 && (current_rows != 43 || current_cols != 80))
!       {
! 	regs.x.ax = 3;
! 	int86 (0x10, &regs, &regs);
! 	regs.x.ax = 0x1112;
! 	regs.h.bl = 0;
! 	int86 (0x10, &regs, &regs);
! 	regs.x.ax = 0x1200;
! 	regs.h.bl = 32;
! 	int86 (0x10, &regs, &regs);
! 	regs.x.ax = 0x0100;
! 	regs.x.cx = 7;
! 	int86 (0x10, &regs, &regs);
!       }
! #endif /* not __DJGPP__ > 1 */
! 
!   if (have_mouse)
!     {
!       mouse_init ();
!       mouse_on ();
!     }
! 
!   /* Tell the caller what dimensions have been REALLY set.  */
!   *rows = ScreenRows ();
!   *cols = ScreenCols ();
! }
! 
! /* If we write a character in the position where the mouse is,
!    the mouse cursor may need to be refreshed.  */
  
  static void
*************** IT_update_end ()
*** 503,510 ****
  
  /* This was more or less copied from xterm.c */
  static void
  IT_set_menu_bar_lines (window, n)
!   Lisp_Object window;
!   int n;
  {
    struct window *w = XWINDOW (window);
--- 668,676 ----
  
  /* This was more or less copied from xterm.c */
+ 
  static void
  IT_set_menu_bar_lines (window, n)
!      Lisp_Object window;
!      int n;
  {
    struct window *w = XWINDOW (window);
*************** IT_set_menu_bar_lines (window, n)
*** 526,533 ****
  }
  
! /*
!  * IT_set_terminal_modes is called when emacs is started,
!  * resumed, and whenever the screen is redrawn!
!  */
  
  static
--- 692,697 ----
  }
  
! /* IT_set_terminal_modes is called when emacs is started,
!    resumed, and whenever the screen is redrawn!  */
  
  static
*************** IT_set_terminal_modes (void)
*** 555,558 ****
--- 719,723 ----
    startup_screen_size_X = screen_size_X;
    startup_screen_size_Y = screen_size_Y;
+   startup_screen_attrib = ScreenAttrib;
  
    ScreenGetCursor (&startup_pos_Y, &startup_pos_X);
*************** IT_set_terminal_modes (void)
*** 560,574 ****
  
    if (termscript)
!     fprintf (termscript, "<SCREEN SAVED>\n");
  }
  
! /*
!  * IT_reset_terminal_modes is called when emacs is
!  * suspended or killed.
!  */
  
  static
  IT_reset_terminal_modes (void)
  {
    if (termscript)
      fprintf (termscript, "\n<RESET_TERM>");
--- 725,747 ----
  
    if (termscript)
!     fprintf (termscript, "<SCREEN SAVED (dimensions=%dx%d)>\n",
!              screen_size_X, screen_size_Y);
  }
  
! /* IT_reset_terminal_modes is called when emacs is
!    suspended or killed.  */
  
  static
  IT_reset_terminal_modes (void)
  {
+   int display_row_start = (int) ScreenPrimary;
+   int saved_row_len     = startup_screen_size_X * 2;
+   int update_row_len    = ScreenCols () * 2;
+   int current_rows      = ScreenRows ();
+   int to_next_row       = update_row_len;
+   unsigned char *saved_row = startup_screen_buffer;
+   int cursor_pos_X = ScreenCols () - 1;
+   int cursor_pos_Y = ScreenRows () - 1;
+ 
    if (termscript)
      fprintf (termscript, "\n<RESET_TERM>");
*************** IT_reset_terminal_modes (void)
*** 579,588 ****
      return;
    
!   ScreenUpdate (startup_screen_buffer);
!   ScreenSetCursor (startup_pos_Y, startup_pos_X);
!   xfree (startup_screen_buffer);
  
    if (termscript)
!     fprintf (termscript, "<SCREEN RESTORED>\n");
  
    term_setup_done = 0;
--- 752,794 ----
      return;
    
!   mouse_off ();
!  
!   /* We have a situation here.
!      We cannot just do ScreenUpdate(startup_screen_buffer) because
!      the luser could have changed screen dimensions inside Emacs
!      and failed (or didn't want) to restore them before killing
!      Emacs.  ScreenUpdate() uses the *current* screen dimensions and
!      thus will happily use memory outside what was allocated for
!      `startup_screen_buffer'.
!      Thus we only restore as much as the current screen dimensions
!      can hold, and clear the rest (if the saved screen is smaller than
!      the current) with the color attribute saved at startup.  The cursor
!      is also restored within the visible dimensions.  */
! 
!   ScreenAttrib = startup_screen_attrib;
!   ScreenClear ();
! 
!   if (update_row_len > saved_row_len)
!     update_row_len = saved_row_len;
!   if (current_rows > startup_screen_size_Y)
!     current_rows = startup_screen_size_Y;
  
    if (termscript)
!     fprintf (termscript, "<SCREEN RESTORED (dimensions=%dx%d)>\n",
!              update_row_len / 2, current_rows);
! 
!   while (current_rows--)
!     {
!       dosmemput (saved_row, update_row_len, display_row_start);
!       saved_row         += saved_row_len;
!       display_row_start += to_next_row;
!     }
!   if (startup_pos_X < cursor_pos_X)
!     cursor_pos_X = startup_pos_X;
!   if (startup_pos_Y < cursor_pos_Y)
!     cursor_pos_Y = startup_pos_Y;
! 
!   ScreenSetCursor (cursor_pos_Y, cursor_pos_X);
!   xfree (startup_screen_buffer);
  
    term_setup_done = 0;
*************** IT_set_frame_parameters (frame, alist)
*** 656,660 ****
  
  
! /* Do we need the internal terminal? */
  void
  internal_terminal_init ()
--- 862,867 ----
  
  
! /* Do we need the internal terminal?  */
! 
  void
  internal_terminal_init ()
*************** internal_terminal_init ()
*** 690,695 ****
    if (colors && strlen (colors) >= 2)
      {
!       the_only_x_display.foreground_pixel = colors[0] & 0x07;
!       the_only_x_display.background_pixel = colors[1] & 0x07;
      }
    the_only_x_display.line_height = 1;
--- 897,907 ----
    if (colors && strlen (colors) >= 2)
      {
!       /* Foreground colrs use 4 bits, background only 3.  */
!       if (isxdigit (colors[0]) && !isdigit (colors[0]))
!         colors[0] += 10 - (isupper (colors[0]) ? 'A' : 'a');
!       if (colors[0] >= 0 && colors[0] < 16)
!         the_only_x_display.foreground_pixel = colors[0];
!       if (colors[1] >= 0 && colors[1] < 8)
!         the_only_x_display.background_pixel = colors[1];
      }
    the_only_x_display.line_height = 1;
*************** dos_get_saved_screen (screen, rows, cols
*** 732,737 ****
  #endif  
  }
- 
- 
  
  /* ----------------------- Keyboard control ----------------------
--- 944,947 ----
*************** dos_get_modifiers (keymask)
*** 1114,1118 ****
  	}
        
!       if (regs.h.ah & 1)		/* Left CTRL pressed
  	mask |= CTRL_P;
  
--- 1324,1328 ----
  	}
        
!       if (regs.h.ah & 1)		/* Left CTRL pressed ? */
  	mask |= CTRL_P;
  
*************** and then the scan code.")
*** 1176,1179 ****
--- 1386,1390 ----
  
  /* Get a char from keyboard.  Function keys are put into the event queue.  */
+ 
  static int
  dos_rawgetc ()
*************** dos_rawgetc ()
*** 1218,1222 ****
        if (!NILP (Vdos_display_scancodes))
  	{
! 	  char buf[10];
  	  sprintf (buf, "%02x:%02x*%04x",
  		   (unsigned) (sc&0xff), (unsigned) c, mask);
--- 1429,1433 ----
        if (!NILP (Vdos_display_scancodes))
  	{
! 	  char buf[11];
  	  sprintf (buf, "%02x:%02x*%04x",
  		   (unsigned) (sc&0xff), (unsigned) c, mask);
*************** dos_rawgetc ()
*** 1380,1383 ****
--- 1591,1596 ----
  	for (press = 0; press < 2; press++)
  	  {
+ 	    int button_num = but;
+ 
  	    if (press)
  	      ok = mouse_pressed (but, &x, &y);
*************** dos_rawgetc ()
*** 1386,1391 ****
  	    if (ok)
  	      {
  		event.kind = mouse_click;
! 		event.code = but;
  		event.modifiers = dos_get_modifiers (0)
  		  | (press ? down_modifier : up_modifier);
--- 1599,1625 ----
  	    if (ok)
  	      {
+ 		/* Allow a simultaneous press/release of Mouse-1 and
+ 		   Mouse-2 to simulate Mouse-3 on two-button mice.  */
+ 		if (mouse_button_count == 2 && but < 2)
+ 		  {
+ 		    int x2, y2;	/* don't clobber original coordinates */
+ 
+ 		    /* If only one button is pressed, wait 100 msec and
+ 		       check again.  This way, Speedy Gonzales isn't
+ 		       punished, while the slow get their chance.  */
+ 		    if (press && mouse_pressed (1-but, &x2, &y2)
+ 			|| !press && mouse_released (1-but, &x2, &y2))
+ 		      button_num = 2;
+ 		    else
+ 		      {
+ 			delay (100);
+ 			if (press && mouse_pressed (1-but, &x2, &y2)
+ 			    || !press && mouse_released (1-but, &x2, &y2))
+ 			  button_num = 2;
+ 		      }
+ 		  }
+ 
  		event.kind = mouse_click;
! 		event.code = button_num;
  		event.modifiers = dos_get_modifiers (0)
  		  | (press ? down_modifier : up_modifier);
*************** static int prev_get_char = -1;
*** 1405,1408 ****
--- 1639,1643 ----
  
  /* Return 1 if a key is ready to be read without suspending execution.  */
+ 
  dos_keysns ()
  {
*************** dos_keysns ()
*** 1414,1417 ****
--- 1649,1653 ----
  
  /* Read a key.  Return -1 if no key is ready.  */
+ 
  dos_keyread ()
  {
*************** IT_menu_calc_size (XMenu *menu, int *wid
*** 1538,1542 ****
  }
  
! /* Display MENU at (X,Y) using FACES. */
  
  static void
--- 1774,1778 ----
  }
  
! /* Display MENU at (X,Y) using FACES.  */
  
  static void
*************** IT_menu_display (XMenu *menu, int y, int
*** 1575,1581 ****
    xfree (text);
  }
! 
  /* --------------------------- X Menu emulation ---------------------- */
  
  /* Create a brand new menu structure.  */
  
--- 1811,1825 ----
    xfree (text);
  }
! 
  /* --------------------------- X Menu emulation ---------------------- */
  
+ /* Report availability of menus.  */
+ 
+ int
+ have_menus_p ()
+ {
+   return 1;
+ }
+ 
  /* Create a brand new menu structure.  */
  
*************** XMenuLocate (Display *foo0, XMenu *menu,
*** 1635,1643 ****
  	     int *ulx, int *uly, int *width, int *height)
  {
!   if (menu->count == 1 && menu->submenu[0])
!       /* Special case: the menu consists of only one pane.  */
!     IT_menu_calc_size (menu->submenu[0], width, height);
!   else
!     IT_menu_calc_size (menu, width, height);
    *ulx = x + 1;
    *uly = y;
--- 1879,1883 ----
  	     int *ulx, int *uly, int *width, int *height)
  {
!   IT_menu_calc_size (menu, width, height);
    *ulx = x + 1;
    *uly = y;
*************** XMenuActivate (Display *foo, XMenu *menu
*** 1666,1669 ****
--- 1906,1910 ----
    int faces[4], selectface;
    int leave, result, onepane;
+   int title_faces[4];		/* face to display the menu title */
  
    /* Just in case we got here without a mouse present...  */
*************** XMenuActivate (Display *foo, XMenu *menu
*** 1690,1697 ****
--- 1931,1945 ----
    faces[3] = compute_glyph_face (&the_only_frame, selectface, faces[1]);
  
+   /* Make sure the menu title is always displayed with
+      `msdos-menu-active-face', no matter where the mouse pointer is.  */
+   for (i = 0; i < 4; i++)
+     title_faces[i] = faces[3];
+ 
    statecount = 1;
    state[0].menu = menu;
    mouse_off ();
    ScreenRetrieve (state[0].screen_behind = xmalloc (screensize));
+ 
+   IT_menu_display (menu, y0 - 1, x0 - 1, title_faces); /* display menu title */
    if ((onepane = menu->count == 1 && menu->submenu[0]))
      {
*************** XMenuActivate (Display *foo, XMenu *menu
*** 1731,1735 ****
  		    *pane = state[i].pane - 1;
  		    *selidx = dy;
! 		    /* We hit some part of a menu, so drop extra menues that
  		       have been opened.  That does not include an open and
  		       active submenu.  */
--- 1979,1983 ----
  		    *pane = state[i].pane - 1;
  		    *selidx = dy;
! 		    /* We hit some part of a menu, so drop extra menus that
  		       have been opened.  That does not include an open and
  		       active submenu.  */
*************** x_pixel_height (struct frame *f)
*** 1811,1816 ****
  }
  #endif /* !HAVE_X_WINDOWS */
! 
! 
  /* ----------------------- DOS / UNIX conversion --------------------- */
  
--- 2059,2063 ----
  }
  #endif /* !HAVE_X_WINDOWS */
! 
  /* ----------------------- DOS / UNIX conversion --------------------- */
  
*************** unixtodos_filename (p)
*** 1844,1847 ****
--- 2091,2095 ----
  
  /* Get the default directory for a given drive.  0=def, 1=A, 2=B, ...  */
+ void msdos_downcase_filename (unsigned char *);
  
  int
*************** getdefdir (drive, dst)
*** 1850,1861 ****
       char *dst;
  {
!   union REGS regs;
  
!   *dst++ = '/';
!   regs.h.dl = drive;
!   regs.x.si = (int) dst;
!   regs.h.ah = 0x47;
!   intdos (&regs, &regs);
!   return !regs.x.cflag;
  }
  
--- 2098,2122 ----
       char *dst;
  {
!   char in_path[4], *p = in_path;
!   int e = errno;
! 
!   /* Generate "X:." (when drive is X) or "." (when drive is 0).  */
!   if (drive != 0)
!     {
!       *p++ = drive + 'A' - 1;
!       *p++ = ':';
!     }
  
!   *p++ = '.';
!   *p = '\0';
!   errno = 0;
!   _fixpath (in_path, dst);
!   if (errno)
!     return 0;
! 
!   msdos_downcase_filename (dst);
! 
!   errno = e;
!   return 1;
  }
  
*************** crlf_to_lf (n, buf)
*** 1888,1891 ****
--- 2149,2266 ----
    return np - startp;
  }
+ 
+ #if defined(__DJGPP__) && __DJGPP__ == 2 && __DJGPP_MINOR__ == 0
+ 
+ /* In DJGPP v2.0, library `write' can call `malloc', which might
+    cause relocation of the buffer whose address we get in ADDR.
+    Here is a version of `write' that avoids calling `malloc',
+    to serve us until such time as the library is fixed.
+    Actually, what we define here is called `__write', because
+    `write' is a stub that just jmp's to `__write' (to be
+    POSIXLY-correct with respect to the global name-space).  */
+ 
+ #include <io.h>		      /* for _write */
+ #include <libc/dosio.h>       /* for __file_handle_modes[] */
+ 
+ static char xbuf[64 * 1024];  /* DOS cannot write more in one chunk */
+ 
+ #define XBUF_END (xbuf + sizeof (xbuf) - 1)
+ 
+ int
+ __write (int handle, const void *buffer, size_t count)
+ {
+   if (count == 0)
+     return 0;
+ 
+   if(__file_handle_modes[handle] & O_BINARY)
+     return _write (handle, buffer, count);
+   else
+     {
+       char *xbp = xbuf;
+       const char *bp = buffer;
+       int total_written = 0;
+       int nmoved = 0, ncr = 0;
+ 
+       while (count)
+ 	{
+ 	  /* The next test makes sure there's space for at least 2 more
+ 	     characters in xbuf[], so both CR and LF can be put there.  */
+ 	  if (xbp < XBUF_END)
+ 	    {
+ 	      if (*bp == '\n')
+ 		{
+ 		  ncr++;
+ 		  *xbp++ = '\r';
+ 		}
+ 	      *xbp++ = *bp++;
+ 	      nmoved++;
+ 	      count--;
+ 	    }
+ 	  if (xbp >= XBUF_END || !count)
+ 	    {
+ 	      size_t to_write = nmoved + ncr;
+ 	      int written = _write (handle, xbuf, to_write);
+ 
+ 	      if (written == -1)
+ 		return -1;
+ 	      else
+ 		total_written += nmoved;  /* CRs aren't counted in ret value */
+ 
+ 	      /* If some, but not all were written (disk full?), return
+ 		 an estimate of the total written bytes not counting CRs.  */
+ 	      if (written < to_write)
+ 		return total_written - (to_write - written) * nmoved/to_write;
+ 
+ 	      nmoved = 0;
+ 	      ncr = 0;
+ 	      xbp = xbuf;
+ 	    }
+ 	}
+       return total_written;
+     }
+ }
+ 
+ #endif /* __DJGPP__ == 2 && __DJGPP_MINOR__ == 0 */
+ 
+ DEFUN ("msdos-long-file-names", Fmsdos_long_file_names, Smsdos_long_file_names,
+   0, 0, 0,
+   "Return non-nil if long file names are supported on MSDOS.")
+   ()
+ {
+   return (_USE_LFN ? Qt : Qnil);
+ }
+ 
+ /* Convert alphabetic characters in a filename to lower-case.  */
+ 
+ void
+ msdos_downcase_filename (p)
+      register unsigned char *p;
+ {
+   /* Under LFN we expect to get pathnames in their true case.  */
+   if (NILP (Fmsdos_long_file_names ()))
+     for ( ; *p; p++)
+       if (*p >= 'A' && *p <= 'Z')
+ 	*p += 'a' - 'A';
+ }
+ 
+ DEFUN ("msdos-downcase-filename", Fmsdos_downcase_filename, Smsdos_downcase_filename,
+        1, 1, 0,
+   "Convert alphabetic characters in FILENAME to lower case and return that.\n\
+ When long filenames are supported, doesn't change FILENAME.\n\
+ If FILENAME is not a string, returns nil.\n\
+ The argument object is never altered--the value is a copy.")
+   (filename)
+      Lisp_Object filename;
+ {
+   char *fname;
+   Lisp_Object tem;
+ 
+   if (! STRINGP (filename))
+     return Qnil;
+ 
+   tem = Fcopy_sequence (filename);
+   msdos_downcase_filename (XSTRING (tem)->data);
+   return tem;
+ }
  
  /* The Emacs root directory as determined by init_environment.  */
*************** init_environment (argc, argv, skip_args)
*** 2019,2023 ****
  	break;
        }
!   init_gettimeofday ();
  }
  
--- 2394,2398 ----
  	break;
        }
!   tzset ();
  }
  
*************** static int break_stat;	 /* BREAK check m
*** 2027,2030 ****
--- 2402,2407 ----
  static int stdin_stat;	 /* stdin IOCTL status.		*/
  
+ #if __DJGPP__ < 2
+ 
  /* These must be global.  */
  static _go32_dpmi_seginfo ctrl_break_vector;
*************** install_ctrl_break_check ()
*** 2056,2064 ****
  }
  
! /*
!  * Turn off Dos' Ctrl-C checking and inhibit interpretation of
!  * control chars by Dos.
!  * Determine the keyboard type.
!  */
  
  int
--- 2433,2440 ----
  }
  
! #endif /* __DJGPP__ < 2 */
! 
! /* Turn off Dos' Ctrl-C checking and inhibit interpretation of
!    control chars by DOS.   Determine the keyboard type.  */
  
  int
*************** dos_ttraw ()
*** 2070,2074 ****
--- 2446,2452 ----
    break_stat = getcbrk ();
    setcbrk (0);
+ #if __DJGPP__ < 2
    install_ctrl_break_check ();
+ #endif
  
    if (first_time)
*************** dos_ttraw ()
*** 2121,2128 ****
  	    }
  	}
!       
        first_time = 0;
      }
  
    inregs.x.ax = 0x4400;		/* Get IOCTL status. */
    inregs.x.bx = 0x00;		/* 0 = stdin. */
--- 2499,2521 ----
  	    }
  	}
! 
        first_time = 0;
+ 
+ #if __DJGPP__ >= 2
+ 
+       stdin_stat = setmode (fileno (stdin), O_BINARY);
+       return (stdin_stat != -1);
+     }
+   else
+     return (setmode (fileno (stdin), O_BINARY) != -1);
+ 
+ #else /* __DJGPP__ < 2 */
+ 
      }
  
+   /* I think it is wrong to overwrite `stdin_stat' every time
+      but the first one this function is called, but I don't
+      want to change the way it used to work in v1.x.--EZ  */
+ 
    inregs.x.ax = 0x4400;		/* Get IOCTL status. */
    inregs.x.bx = 0x00;		/* 0 = stdin. */
*************** dos_ttraw ()
*** 2134,2140 ****
--- 2527,2536 ----
    intdos (&inregs, &outregs);
    return !outregs.x.cflag;
+ 
+ #endif /* __DJGPP__ < 2 */
  }
  
  /*  Restore status of standard input and Ctrl-C checking.  */
+ 
  int
  dos_ttcooked ()
*************** dos_ttcooked ()
*** 2145,2148 ****
--- 2541,2550 ----
    mouse_off ();
  
+ #if __DJGPP__ >= 2
+ 
+   return (setmode (fileno (stdin), stdin_stat) != -1);
+ 
+ #else  /* not __DJGPP__ >= 2 */
+ 
    inregs.x.ax = 0x4401;	/* Set IOCTL status.	*/
    inregs.x.bx = 0x00;	/* 0 = stdin.		*/
*************** dos_ttcooked ()
*** 2150,2163 ****
    intdos (&inregs, &outregs);
    return !outregs.x.cflag;
  }
  
  
  /* Run command as specified by ARGV in directory DIR.
!    The command is run with input from TEMPIN and output to file TEMPOUT.  */
  int
! run_msdos_command (argv, dir, tempin, tempout)
       unsigned char **argv;
       Lisp_Object dir;
!      int tempin, tempout;
  {
    char *saveargv1, *saveargv2, **envv;
--- 2552,2569 ----
    intdos (&inregs, &outregs);
    return !outregs.x.cflag;
+ 
+ #endif /* not __DJGPP__ >= 2 */
  }
  
  
  /* Run command as specified by ARGV in directory DIR.
!    The command is run with input from TEMPIN, output to
!    file TEMPOUT and stderr to TEMPERR.  */
! 
  int
! run_msdos_command (argv, dir, tempin, tempout, temperr)
       unsigned char **argv;
       Lisp_Object dir;
!      int tempin, tempout, temperr;
  {
    char *saveargv1, *saveargv2, **envv;
*************** run_msdos_command (argv, dir, tempin, te
*** 2230,2234 ****
    dup2 (tempin, 0);
    dup2 (tempout, 1);
!   dup2 (tempout, 2);
  
    result = spawnve (P_WAIT, argv[0], argv, envv);
--- 2636,2659 ----
    dup2 (tempin, 0);
    dup2 (tempout, 1);
!   dup2 (temperr, 2);
! 
! #if __DJGPP__ > 1
! 
!   if (msshell && !argv[3])
!     {
!       /* MS-DOS native shells are too restrictive.  For starters, they
! 	 cannot grok commands longer than 126 characters.  In DJGPP v2
! 	 and later, `system' is much smarter, so we'll call it instead.  */
! 
!       extern char **environ;
!       environ = envv;
! 
!       /* A shell gets a single argument--its full command
! 	 line--whose original was saved in `saveargv2'.  */
!       result = system (saveargv2);
!     }
!   else
! 
! #endif /* __DJGPP__ > 1 */
  
    result = spawnve (P_WAIT, argv[0], argv, envv);
*************** croak (badfunc)
*** 2265,2269 ****
    exit (1);
  }
! 
  
  /* ------------------------- Compatibility functions -------------------
--- 2690,2695 ----
    exit (1);
  }
! 
! #if __DJGPP__ < 2
  
  /* ------------------------- Compatibility functions -------------------
*************** croak (badfunc)
*** 2272,2279 ****
   */
  
! /*
!  * Hostnames for a pc are not really funny,
!  * but they are used in change log so we emulate the best we can.
!  */
  
  gethostname (p, size)
--- 2698,2703 ----
   */
  
! /* Hostnames for a pc are not really funny,
!    but they are used in change log so we emulate the best we can.  */
  
  gethostname (p, size)
*************** gettimeofday (struct timeval *tp, struct
*** 2328,2331 ****
--- 2752,2756 ----
  }
  
+ #endif /* __DJGPP__ < 2 */
  
  /*
*************** gettimeofday (struct timeval *tp, struct
*** 2333,2336 ****
--- 2758,2762 ----
   */
  
+ #if __DJGPP__ < 2
  unsigned alarm (s) unsigned s; {}
  fork () { return 0; }
*************** int kill (x, y) int x, y; { return -1; }
*** 2338,2410 ****
  nice (p) int p; {}
  void volatile pause () {}
  request_sigio () {}
  setpgrp () {return 0; }
  setpriority (x,y,z) int x,y,z; { return 0; }
! sigsetmask (x) int x; { return 0; }
  unrequest_sigio () {}
  
- int run_dos_timer_hooks = 0;
- 
  #ifndef HAVE_SELECT
  #include "sysselect.h"
  
! static int last_ti_sec = -1;
! static int dos_menubar_clock_displayed = 0;
! 
! static void
! check_timer (t)
!   struct time *t;
! {
!   gettime (t);
!   
!   if (t->ti_sec == last_ti_sec)
!     return;
!   last_ti_sec = t->ti_sec;
! 
!   if (!NILP (Vdos_menubar_clock))
!     {
!       char clock_str[16];
!       int len;
!       int min = t->ti_min;
!       int hour = t->ti_hour;
! 
!       if (dos_timezone_offset)
! 	{
! 	  int tz = dos_timezone_offset;
! 	  min -= tz % 60;
! 	  if (min < 0)
! 	    min += 60, hour--;
! 	  else
! 	    if (min >= 60)
! 	      min -= 60, hour++;
! 	  
! 	  if ((hour -= (tz / 60)) < 0)
! 	    hour += 24;
! 	  else
! 	    hour %= 24;
! 	}
!       
!       if ((dos_country_info[0x11] & 0x01) == 0) /* 12 hour clock */
! 	{
! 	  hour %= 12;
! 	  if (hour == 0) hour = 12;
! 	}
  
-       len = sprintf (clock_str, "%2d.%02d.%02d", hour, min, t->ti_sec);
-       dos_direct_output (0, screen_size_X - len - 1, clock_str, len);
-       dos_menubar_clock_displayed = 1;
-     }
-   else if (dos_menubar_clock_displayed)
-     {
-       /* Erase last displayed time.  */
-       dos_direct_output (0, screen_size_X - 9, "        ", 8);
-       dos_menubar_clock_displayed = 0;
-     }
-   
-   if (!NILP (Vdos_timer_hooks))
-     run_dos_timer_hooks++;
- }
  
  /* Only event queue is checked.  */
  int
  sys_select (nfds, rfds, wfds, efds, timeout)
--- 2764,2790 ----
  nice (p) int p; {}
  void volatile pause () {}
+ sigsetmask (x) int x; { return 0; }
+ #endif
+ 
  request_sigio () {}
  setpgrp () {return 0; }
  setpriority (x,y,z) int x,y,z; { return 0; }
! sigblock (mask) int mask; { return 0; } 
  unrequest_sigio () {}
  
  #ifndef HAVE_SELECT
  #include "sysselect.h"
  
! #ifndef EMACS_TIME_ZERO_OR_NEG_P
! #define EMACS_TIME_ZERO_OR_NEG_P(time)	\
!   ((long)(time).tv_sec < 0		\
!    || ((time).tv_sec == 0		\
!        && (long)(time).tv_usec <= 0))
! #endif
  
  
  /* Only event queue is checked.  */
+ /* We don't have to call timer_check here
+    because wait_reading_process_input takes care of that.  */
  int
  sys_select (nfds, rfds, wfds, efds, timeout)
*************** sys_select (nfds, rfds, wfds, efds, time
*** 2414,2418 ****
  {
    int check_input;
-   long timeoutval, clnow, cllast;
    struct time t;
  
--- 2794,2797 ----
*************** sys_select (nfds, rfds, wfds, efds, time
*** 2435,2458 ****
    if (!timeout)
      {
!       while (! detect_input_pending ())
! 	check_timer (&t);
      }
    else
      {
!       timeoutval = EMACS_SECS (*timeout) * 100 + EMACS_USECS (*timeout) / 10000;
!       check_timer (&t);
!       cllast = t.ti_sec * 100 + t.ti_hund;
  
        while (!check_input || !detect_input_pending ())
  	{
! 	  check_timer (&t);
! 	  clnow = t.ti_sec * 100 + t.ti_hund;
! 	  if (clnow < cllast) /* time wrap */
! 	    timeoutval -= clnow + 6000 - cllast;
! 	  else
! 	    timeoutval -= clnow - cllast;
! 	  if (timeoutval <= 0)  /* Stop on timer being cleared */
  	    return 0;
  	  cllast = clnow;
  	}
      }
--- 2814,2850 ----
    if (!timeout)
      {
!       while (!detect_input_pending ())
! 	{
! #if __DJGPP__ >= 2
! 	  __dpmi_yield ();
! #endif	  
! 	}
      }
    else
      {
!       EMACS_TIME clnow, cllast, cldiff;
! 
!       gettime (&t);
!       EMACS_SET_SECS_USECS (cllast, t.ti_sec, t.ti_hund * 10000L);
  
        while (!check_input || !detect_input_pending ())
  	{
! 	  gettime (&t);
! 	  EMACS_SET_SECS_USECS (clnow, t.ti_sec, t.ti_hund * 10000L);
! 	  EMACS_SUB_TIME (cldiff, clnow, cllast);
! 
! 	  /* When seconds wrap around, we assume that no more than
! 	     1 minute passed since last `gettime'.  */
! 	  if (EMACS_TIME_NEG_P (cldiff))
! 	    EMACS_SET_SECS (cldiff, EMACS_SECS (cldiff) + 60);
! 	  EMACS_SUB_TIME (*timeout, *timeout, cldiff);
! 
! 	  /* Stop when timeout value crosses zero.  */
! 	  if (EMACS_TIME_ZERO_OR_NEG_P (*timeout))
  	    return 0;
  	  cllast = clnow;
+ #if __DJGPP__ >= 2
+ 	  __dpmi_yield ();
+ #endif	  
  	}
      }
*************** sys_select (nfds, rfds, wfds, efds, time
*** 2464,2468 ****
  
  /*
!  * Define overlayed functions:
   *
   *	chdir -> sys_chdir
--- 2856,2860 ----
  
  /*
!  * Define overlaid functions:
   *
   *	chdir -> sys_chdir
*************** dos_abort (file, line)
*** 2540,2543 ****
--- 2932,2949 ----
    abort ();
  }
+ #else
+ void
+ abort ()
+ {
+   dos_ttcooked ();
+   ScreenSetCursor (10, 0);
+   cputs ("\r\n\nEmacs aborted!\r\n");
+ #if __DJGPP__ > 1
+   /* Generate traceback, so we could tell whodunit.  */
+   signal (SIGINT, SIG_DFL);
+   __asm__ __volatile__ ("movb $0x1b,%al;call ___djgpp_hw_exception");
+ #endif
+   exit (2);
+ }
  #endif
  
*************** syms_of_msdos ()
*** 2548,2551 ****
--- 2954,2959 ----
  
    defsubr (&Srecent_doskeys);
+   defsubr (&Smsdos_long_file_names);
+   defsubr (&Smsdos_downcase_filename);
  }
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/msdos.h emacs-19.31/src/msdos.h
*** emacs-19.30/src/msdos.h	Fri Nov  3 18:27:21 1995
--- emacs-19.31/src/msdos.h	Tue Apr  9 23:38:18 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  #ifndef _MSDOS_H_
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  #ifndef _MSDOS_H_
*************** int dos_ttcooked ();
*** 27,30 ****
--- 28,32 ----
  int dos_get_saved_screen (char **, int *, int *);
  int dos_set_keyboard (int, int);
+ void dos_set_window_size (int *, int *);
  
  int getdefdir (int, char*);
diff -2rcpP --exclude=*.elc emacs-19.30/src/nt.c emacs-19.31/src/nt.c
*** emacs-19.30/src/nt.c	Tue Nov  7 02:09:40 1995
--- emacs-19.31/src/nt.c	Tue May 21 13:37:37 1996
***************
*** 2,67 ****
     Copyright (C) 1994, 1995 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
  */
  
- /* Define stat before including config.h.  */
- #include <string.h>
- #include <sys/stat.h>
- int
- nt_stat (char *filename, struct stat *statbuf)
- {
-   int r, l = strlen (filename);
-   char *str = NULL;
-   extern long *xmalloc ();
-   extern void xfree ();
- 
-   /* stat has a bug when passed a name of a directory with a trailing
-      backslash (but a trailing forward slash works fine).  */
-   if (filename[l - 1] == '\\') 
-     {
-       str = (char *) xmalloc (l + 1);
-       strcpy (str, filename);
-       str[l - 1] = '/';
-       r = stat (str, statbuf);
-       xfree (str);
-       return r;
-     }
-   else
-     return stat (filename, statbuf);
- }
- 
- /* Place a wrapper around the NT version of ctime.  It returns NULL
-    on network directories, so we handle that case here.  
-    Define it before including config.h.  (Ulrich Leodolter, 1/11/95).  */
- char *
- nt_ctime (const time_t *t)
- {
-   char *str = (char *) ctime (t);
-   return (str ? str : "Sun Jan 01 00:00:00 1970");
- }
  
- #include <config.h>
- #include <windows.h>
  #include <stdlib.h>
  #include <stdio.h>
  #include <io.h>
  #include <fcntl.h>
  #include <ctype.h>
  
  #define getwd _getwd
--- 2,57 ----
     Copyright (C) 1994, 1995 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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.
  
     Geoff Voelker (voelker@cs.washington.edu)                         7-29-94
  */
  
  
  #include <stdlib.h>
  #include <stdio.h>
  #include <io.h>
+ #include <errno.h>
  #include <fcntl.h>
  #include <ctype.h>
+ #include <signal.h>
+ #include <sys/time.h>
+ 
+ /* must include CRT headers *before* config.h */
+ #include "config.h"
+ #undef access
+ #undef chdir
+ #undef chmod
+ #undef creat
+ #undef ctime
+ #undef fopen
+ #undef link
+ #undef mkdir
+ #undef mktemp
+ #undef open
+ #undef rename
+ #undef rmdir
+ #undef unlink
+ 
+ #undef close
+ #undef dup
+ #undef dup2
+ #undef pipe
+ #undef read
+ #undef write
  
  #define getwd _getwd
*************** nt_ctime (const time_t *t)
*** 71,86 ****
  #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
--- 61,93 ----
  #include <pwd.h>
  
+ #include <windows.h>
+ 
+ #ifdef HAVE_SOCKETS	/* TCP connection support, if kernel can do it */
+ #include <sys/socket.h>
+ #undef socket
+ #undef bind
+ #undef connect
+ #undef htons
+ #undef ntohs
+ #undef inet_addr
+ #undef gethostname
+ #undef gethostbyname
+ #undef getservbyname
+ #endif
+ 
+ #include "nt.h"
  #include "ndir.h"
  #include "ntheap.h"
  
  /* Get the current working directory.  */
! char *
  getwd (char *dir)
  {
!   if (GetCurrentDirectory (MAXPATHLEN, dir) > 0)
!     return dir;
!   return NULL;
  }
  
+ #ifndef HAVE_SOCKETS
  /* Emulate gethostname.  */
  int
*************** gethostname (char *buffer, int size)
*** 91,94 ****
--- 98,102 ----
    return !GetComputerName (buffer, &size);
  }
+ #endif /* HAVE_SOCKETS */
  
  /* Emulate getloadavg.  */
*************** getloadavg (double loadavg[], int nelem)
*** 106,118 ****
  }
  
- /* 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,
--- 114,117 ----
*************** nt_sleep (int seconds)
*** 120,125 ****
  
  struct direct dir_static;       /* simulated directory contents */
! static int    dir_finding;
! static HANDLE dir_find_handle;
  
  DIR *
--- 119,125 ----
  
  struct direct dir_static;       /* simulated directory contents */
! static HANDLE dir_find_handle = INVALID_HANDLE_VALUE;
! static int    dir_is_fat;
! static char   dir_pathname[MAXPATHLEN+1];
  
  DIR *
*************** opendir (char *filename)
*** 129,140 ****
  
    /* 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;
--- 129,138 ----
  
    /* Opening is done by FindFirstFile.  However, a read is inherent to
!      this operation, so we defer the open until read time.  */
  
!   if (!(dirp = (DIR *) malloc (sizeof (DIR))))
!     return NULL;
!   if (dir_find_handle != INVALID_HANDLE_VALUE)
!     return NULL;
  
    dirp->dd_fd = 0;
*************** opendir (char *filename)
*** 142,148 ****
    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;
  }
--- 140,147 ----
    dirp->dd_size = 0;
  
!   strncpy (dir_pathname, filename, MAXPATHLEN);
!   dir_pathname[MAXPATHLEN] = '\0';
!   dir_is_fat = is_fat_volume (filename, NULL);
! 
    return dirp;
  }
*************** closedir (DIR *dirp)
*** 152,159 ****
  {
    /* If we have a find-handle open, close it.  */
!   if (dir_finding) 
      {
        FindClose (dir_find_handle);
!       dir_finding = 0;
      }
    xfree ((char *) dirp);
--- 151,158 ----
  {
    /* If we have a find-handle open, close it.  */
!   if (dir_find_handle != INVALID_HANDLE_VALUE)
      {
        FindClose (dir_find_handle);
!       dir_find_handle = INVALID_HANDLE_VALUE;
      }
    xfree ((char *) dirp);
*************** readdir (DIR *dirp)
*** 166,188 ****
    
    /* 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))
--- 165,185 ----
    
    /* If we aren't dir_finding, do a find-first, otherwise do a find-next. */
!   if (dir_find_handle == INVALID_HANDLE_VALUE)
      {
        char filename[MAXNAMLEN + 3];
        int ln;
  
!       strcpy (filename, dir_pathname);
!       ln = strlen (filename) - 1;
!       if (!IS_DIRECTORY_SEP (filename[ln]))
  	strcat (filename, "\\");
!       strcat (filename, "*");
  
        dir_find_handle = FindFirstFile (filename, &find_data);
  
!       if (dir_find_handle == INVALID_HANDLE_VALUE)
  	return NULL;
!     }
!   else
      {
        if (!FindNextFile (dir_find_handle, &find_data))
*************** readdir (DIR *dirp)
*** 190,195 ****
      }
    
!   /* 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;
    
--- 187,192 ----
      }
    
!   /* Emacs never uses this value, so don't bother making it match
!      value returned by stat().  */
    dir_static.d_ino = 1;
    
*************** readdir (DIR *dirp)
*** 198,209 ****
    
    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 */
  
  #define PASSWD_FIELD_SIZE 256
--- 195,206 ----
    
    dir_static.d_namlen = strlen (find_data.cFileName);
!   strcpy (dir_static.d_name, find_data.cFileName);
!   if (dir_is_fat)
!     _strlwr (dir_static.d_name);
    
    return &dir_static;
  }
  
! /* Emulate getpwuid, getpwnam and others.  */
  
  #define PASSWD_FIELD_SIZE 256
*************** static struct passwd the_passwd = 
*** 227,246 ****
  };
  
  struct passwd *
  getpwuid (int uid)
  {
!   int size = PASSWD_FIELD_SIZE;
!   
!   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;
  }
  
--- 224,260 ----
  };
  
+ int 
+ getuid () 
+ { 
+   return the_passwd.pw_uid;
+ }
+ 
+ int 
+ geteuid () 
+ { 
+   /* I could imagine arguing for checking to see whether the user is
+      in the Administrators group and returning a UID of 0 for that
+      case, but I don't know how wise that would be in the long run.  */
+   return getuid (); 
+ }
+ 
+ int 
+ getgid () 
+ { 
+   return the_passwd.pw_gid;
+ }
+ 
+ int 
+ getegid () 
+ { 
+   return getgid ();
+ }
+ 
  struct passwd *
  getpwuid (int uid)
  {
!   if (uid == the_passwd.pw_uid)
!     return &the_passwd;
!   return NULL;
  }
  
*************** getpwnam (char *name)
*** 254,258 ****
      return pw;
  
!   if (strcmp (name, pw->pw_name))
      return NULL;
  
--- 268,272 ----
      return pw;
  
!   if (stricmp (name, pw->pw_name))
      return NULL;
  
*************** getpwnam (char *name)
*** 260,556 ****
  }
  
- 
- /* 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[32];
- 
- char *
- get_emacs_configuration (void)
- {
-   char *arch, *oem, *os;
- 
-   /* Determine the processor type.  */
-   switch (get_processor_type ()) 
-     {
- 
- #ifdef PROCESSOR_INTEL_386
-     case PROCESSOR_INTEL_386:
-     case PROCESSOR_INTEL_486:
-     case PROCESSOR_INTEL_PENTIUM:
-       arch = "i386";
-       break;
- #endif
- 
- #ifdef PROCESSOR_INTEL_860
-     case PROCESSOR_INTEL_860:
-       arch = "i860";
-       break;
- #endif
- 
- #ifdef PROCESSOR_MIPS_R2000
-     case PROCESSOR_MIPS_R2000:
-     case PROCESSOR_MIPS_R3000:
-     case PROCESSOR_MIPS_R4000:
-       arch = "mips";
-       break;
- #endif
- 
- #ifdef PROCESSOR_ALPHA_21064
-     case PROCESSOR_ALPHA_21064:
-       arch = "alpha";
-       break;
- #endif
- 
-     default:
-       arch = "unknown";
-       break;
-     }
- 
-   /* Let oem be "*" until we figure out how to decode the OEM field.  */
-   oem = "*";
- 
- #ifdef WINDOWS95
-   os = "win";
- #else
-   os = "nt";
- #endif
- 
-   sprintf (configuration_buffer, "%s-%s-%s%d.%d", arch, oem, os,
- 	   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;
-   DWORD attrs;
-   BY_HANDLE_FILE_INFORMATION info;
- 
-   /* We have to stat files and directories differently, so check
-      to see what filename references.  */
-   attrs = GetFileAttributes (XSTRING (filename)->data);
-   if (attrs == 0xFFFFFFFF) {
-     return 0;
-   }
-   if (attrs & FILE_ATTRIBUTE_DIRECTORY) {
-     /* Conjure up bogus, but unique, values.  */
-     attrs = GetTickCount ();
-     *p_inode = make_number (attrs);
-     *p_device = make_number (attrs);
-     return 1;
-   }
- 
-   /* 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;
  
! #ifdef WINDOWS95
!   /* The Win95 beta doesn't set the standard handles correctly.
!      Handicap subprocesses until we get a version that works correctly.  
!      Undefining the subprocesses macro reveals other incompatibilities,
!      so, since we're expecting subprocs to work in the near future, 
!      disable them here.  */
!   report_file_error ("Subprocesses currently disabled on Win95", Qnil);
! #endif
! 
!   parent = GetCurrentProcess ();
!   stdin_save = GetStdHandle (STD_INPUT_HANDLE);
!   stdout_save = GetStdHandle (STD_OUTPUT_HANDLE);
!   stderr_save = GetStdHandle (STD_ERROR_HANDLE);
! 
! #ifndef HAVE_NTGUI
!   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);
! #endif /* !HAVE_NTGUI */
!   
!   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];
!   int i;
  
! #ifndef HAVE_NTGUI
!   if (!SetStdHandle (STD_INPUT_HANDLE, stdin_save))
!     report_file_error ("Resetting input handle", Qnil);
!   
!   if (!SetStdHandle (STD_OUTPUT_HANDLE, stdout_save))
      {
!       i = GetLastError ();
!       report_file_error ("Resetting output handle", Qnil);
      }
!   
!   if (!SetStdHandle (STD_ERROR_HANDLE, stderr_save))
!     report_file_error ("Resetting error handle", Qnil);
! #endif /* !HAVE_NTGUI */
!   
!   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);
      }
  }
  
--- 274,367 ----
  }
  
  void
! init_user_info ()
  {
!   /* Find the user's real name by opening the process token and
!      looking up the name associated with the user-sid in that token.
  
!      Use the relative portion of the identifier authority value from
!      the user-sid as the user id value (same for group id using the
!      primary group sid from the process token). */
! 
!   char            user_sid[256], name[256], domain[256];
!   DWORD           length = sizeof (name), dlength = sizeof (domain), trash;
!   HANDLE          token = NULL;
!   SID_NAME_USE    user_type;
! 
!   if (OpenProcessToken (GetCurrentProcess (), TOKEN_QUERY, &token)
!       && GetTokenInformation (token, TokenUser,
! 			      (PVOID) user_sid, sizeof (user_sid), &trash)
!       && LookupAccountSid (NULL, *((PSID *) user_sid), name, &length,
! 			   domain, &dlength, &user_type))
      {
!       strcpy (the_passwd.pw_name, name);
!       /* Determine a reasonable uid value. */
!       if (stricmp ("administrator", name) == 0)
! 	{
! 	  the_passwd.pw_uid = 0;
! 	  the_passwd.pw_gid = 0;
! 	}
!       else
! 	{
! 	  SID_IDENTIFIER_AUTHORITY * pSIA;
  
! 	  pSIA = GetSidIdentifierAuthority (*((PSID *) user_sid));
! 	  /* I believe the relative portion is the last 4 bytes (of 6)
! 	     with msb first. */
! 	  the_passwd.pw_uid = ((pSIA->Value[2] << 24) +
! 			       (pSIA->Value[3] << 16) +
! 			       (pSIA->Value[4] << 8)  +
! 			       (pSIA->Value[5] << 0));
! 	  /* restrict to conventional uid range for normal users */
! 	  the_passwd.pw_uid = the_passwd.pw_uid % 60001;
! 
! 	  /* Get group id */
! 	  if (GetTokenInformation (token, TokenPrimaryGroup,
! 				   (PVOID) user_sid, sizeof (user_sid), &trash))
! 	    {
! 	      SID_IDENTIFIER_AUTHORITY * pSIA;
  
! 	      pSIA = GetSidIdentifierAuthority (*((PSID *) user_sid));
! 	      the_passwd.pw_gid = ((pSIA->Value[2] << 24) +
! 				   (pSIA->Value[3] << 16) +
! 				   (pSIA->Value[4] << 8)  +
! 				   (pSIA->Value[5] << 0));
! 	      /* I don't know if this is necessary, but for safety... */
! 	      the_passwd.pw_gid = the_passwd.pw_gid % 60001;
! 	    }
! 	  else
! 	    the_passwd.pw_gid = the_passwd.pw_uid;
! 	}
!     }
!   /* If security calls are not supported (presumably because we
!        are running under Windows 95), fallback to this. */
!   else if (GetUserName (name, &length))
      {
!       strcpy (the_passwd.pw_name, name);
!       if (stricmp ("administrator", name) == 0)
! 	the_passwd.pw_uid = 0;
!       else
! 	the_passwd.pw_uid = 123;
!       the_passwd.pw_gid = the_passwd.pw_uid;
      }
!   else
      {
!       strcpy (the_passwd.pw_name, "unknown");
!       the_passwd.pw_uid = 123;
!       the_passwd.pw_gid = 123;
      }
+ 
+   /* Ensure HOME and SHELL are defined. */
+   if (getenv ("HOME") == NULL)
+     putenv ("HOME=c:/");
+   if (getenv ("SHELL") == NULL)
+     putenv ((GetVersion () & 0x80000000) ? "SHELL=command" : "SHELL=cmd");
+ 
+   /* Set dir and shell from environment variables. */
+   strcpy (the_passwd.pw_dir, getenv ("HOME"));
+   strcpy (the_passwd.pw_shell, getenv ("SHELL"));
+ 
+   if (token)
+     CloseHandle (token);
  }
  
*************** dostounix_filename (p)
*** 581,586 ****
  }
  
! /* Routines that are no-ops on NT but are defined to get Emacs to compile.  */
  
  
  int 
--- 392,438 ----
  }
  
! /* Destructively turn slashes into backslashes.  */
! void
! unixtodos_filename (p)
!      register char *p;
! {
!   while (*p)
!     {
!       if (*p == '/')
! 	*p = '\\';
!       p++;
!     }
! }
! 
! /* 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;
! }
  
+ /* Routines that are no-ops on NT but are defined to get Emacs to compile.  */
  
  int 
*************** sigblock (int sig) 
*** 597,606 ****
  
  int 
- kill (int pid, int signal) 
- { 
-   return 0;
- }
- 
- int 
  setpgrp (int pid, int gid) 
  { 
--- 449,452 ----
*************** request_sigio (void) 
*** 626,686 ****
  }
  
! 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;
! }
! 
! #define REG_ROOT "SOFTWARE\\GNU\\Emacs\\"
! 
! LPBYTE 
! nt_get_resource (key, lpdwtype)
!     char *key;
!     LPDWORD lpdwtype;
! {
!   LPBYTE lpvalue;
!   HKEY hrootkey = NULL;
!   DWORD cbData;
!   BOOL ok = FALSE;
!   
!   /* Check both the current user and the local machine to see if 
!      we have any resources.  */
!   
!   if (RegOpenKeyEx (HKEY_CURRENT_USER, REG_ROOT, 0, KEY_READ, &hrootkey) == ERROR_SUCCESS)
      {
        lpvalue = NULL;
--- 472,491 ----
  }
  
! #define REG_ROOT "SOFTWARE\\GNU\\Emacs"
  
! LPBYTE 
! nt_get_resource (key, lpdwtype)
!     char *key;
!     LPDWORD lpdwtype;
  {
!   LPBYTE lpvalue;
!   HKEY hrootkey = NULL;
!   DWORD cbData;
!   BOOL ok = FALSE;
!   
!   /* Check both the current user and the local machine to see if 
!      we have any resources.  */
!   
!   if (RegOpenKeyEx (HKEY_CURRENT_USER, REG_ROOT, 0, KEY_READ, &hrootkey) == ERROR_SUCCESS)
      {
        lpvalue = NULL;
*************** void
*** 720,774 ****
  init_environment ()
  {
-   /* Open a console window to display messages during dumping. */
-   if (!initialized)
-     AllocConsole ();
- 
    /* Check for environment variables and use registry if they don't exist */
    {
!       int i;
!       LPBYTE lpval;
!       DWORD dwType;
  
!       static char * env_vars[] = 
        {
! 	  "emacs_path",
! 	  "EMACSLOADPATH",
! 	  "SHELL",
! 	  "EMACSDATA",
! 	  "EMACSPATH",
! 	  "EMACSLOCKDIR",
! 	  "INFOPATH",
! 	  "EMACSDOC",
! 	  "TERM",
!       };
  
!       for (i = 0; i < (sizeof (env_vars) / sizeof (env_vars[0])); i++) 
! 	{
! 	  if (!getenv (env_vars[i]) &&
! 	      (lpval = nt_get_resource (env_vars[i], &dwType)) != NULL)
! 	    {
! 	      if (dwType == REG_EXPAND_SZ)
! 		{
! 		  char buf1[500], buf2[500];
  
! 		  ExpandEnvironmentStrings ((LPSTR) lpval, buf1, 500);
! 		  _snprintf (buf2, 499, "%s=%s", env_vars[i], buf1);
! 		  putenv (strdup (buf2));
! 		}
! 	      else if (dwType == REG_SZ)
! 		{
! 		  char buf[500];
! 		  
! 		  _snprintf (buf, 499, "%s=%s", env_vars[i], lpval);
! 		  putenv (strdup (buf));
! 		}
  
! 	      xfree (lpval);
! 	    }
! 	}
      }
  }
  
- #ifdef HAVE_TIMEVAL
  #include <sys/timeb.h>
  
--- 525,636 ----
  init_environment ()
  {
    /* Check for environment variables and use registry if they don't exist */
    {
!     int i;
!     LPBYTE lpval;
!     DWORD dwType;
! 
!     static char * env_vars[] = 
!     {
!       "HOME",
!       "emacs_dir",
!       "EMACSLOADPATH",
!       "SHELL",
!       "EMACSDATA",
!       "EMACSPATH",
!       "EMACSLOCKDIR",
!       "INFOPATH",
!       "EMACSDOC",
!       "TERM",
!     };
  
!     for (i = 0; i < (sizeof (env_vars) / sizeof (env_vars[0])); i++) 
        {
! 	if (!getenv (env_vars[i]) &&
! 	    (lpval = nt_get_resource (env_vars[i], &dwType)) != NULL)
! 	  {
! 	    if (dwType == REG_EXPAND_SZ)
! 	      {
! 		char buf1[500], buf2[500];
! 
! 		ExpandEnvironmentStrings ((LPSTR) lpval, buf1, 500);
! 		_snprintf (buf2, 499, "%s=%s", env_vars[i], buf1);
! 		putenv (strdup (buf2));
! 	      }
! 	    else if (dwType == REG_SZ)
! 	      {
! 		char buf[500];
! 		  
! 		_snprintf (buf, 499, "%s=%s", env_vars[i], lpval);
! 		putenv (strdup (buf));
! 	      }
! 
! 	    xfree (lpval);
! 	  }
!       }
!   }
  
!   init_user_info ();
! }
  
! /* 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[32];
! 
! char *
! get_emacs_configuration (void)
! {
!   char *arch, *oem, *os;
! 
!   /* Determine the processor type.  */
!   switch (get_processor_type ()) 
!     {
! 
! #ifdef PROCESSOR_INTEL_386
!     case PROCESSOR_INTEL_386:
!     case PROCESSOR_INTEL_486:
!     case PROCESSOR_INTEL_PENTIUM:
!       arch = "i386";
!       break;
! #endif
! 
! #ifdef PROCESSOR_INTEL_860
!     case PROCESSOR_INTEL_860:
!       arch = "i860";
!       break;
! #endif
! 
! #ifdef PROCESSOR_MIPS_R2000
!     case PROCESSOR_MIPS_R2000:
!     case PROCESSOR_MIPS_R3000:
!     case PROCESSOR_MIPS_R4000:
!       arch = "mips";
!       break;
! #endif
! 
! #ifdef PROCESSOR_ALPHA_21064
!     case PROCESSOR_ALPHA_21064:
!       arch = "alpha";
!       break;
! #endif
! 
!     default:
!       arch = "unknown";
!       break;
      }
+ 
+   /* Let oem be "*" until we figure out how to decode the OEM field.  */
+   oem = "*";
+ 
+   os = (GetVersion () & 0x80000000) ? "win95" : "nt";
+ 
+   sprintf (configuration_buffer, "%s-%s-%s%d.%d", arch, oem, os,
+ 	   get_nt_major_version (), get_nt_minor_version ());
+   return configuration_buffer;
  }
  
  #include <sys/timeb.h>
  
*************** gettimeofday (struct timeval *tv, struct
*** 788,830 ****
      }
  }
- #endif /* HAVE_TIMEVAL */
  
  
! #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_login_name = build_string ("foo");
!   else if (!OpenProcessToken (GetCurrentProcess (), TOKEN_QUERY, &Token))
      {
!       Vuser_real_login_name = build_string ("unknown");
      }
!   else if (!GetTokenInformation (Token, TokenUser, (PVOID)b, 256,
! 				 &trash))
      {
!       CloseHandle (Token);
!       Vuser_real_login_name = build_string ("unknown");
      }
!   else if (!LookupAccountSid ((void *)0, (PSID)b, Name, &length, RefD,
! 			      &rlength, &User))
      {
!       CloseHandle (Token);
!       Vuser_real_login_name = build_string ("unknown");
      }
    else
!     Vuser_real_login_name = build_string (Name);
  }
! #else   /* not WINDOWSNT */
! #endif  /* not WINDOWSNT */
! #endif  /* PIGSFLY */
--- 650,2060 ----
      }
  }
  
+ /* ------------------------------------------------------------------------- */
+ /* IO support and wrapper functions for Win32 API. */
+ /* ------------------------------------------------------------------------- */
+ 
+ /* Place a wrapper around the MSVC version of ctime.  It returns NULL
+    on network directories, so we handle that case here.  
+    (Ulrich Leodolter, 1/11/95).  */
+ char *
+ sys_ctime (const time_t *t)
+ {
+   char *str = (char *) ctime (t);
+   return (str ? str : "Sun Jan 01 00:00:00 1970");
+ }
+ 
+ /* 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
+ sys_sleep (int seconds)
+ {
+   Sleep (seconds * 1000);
+ }
+ 
+ /* Internal MSVC data and functions for low-level descriptor munging */
+ #if (_MSC_VER == 900)
+ extern char _osfile[];
+ #endif
+ extern int __cdecl _set_osfhnd (int fd, long h);
+ extern int __cdecl _free_osfhnd (int fd);
+ 
+ /* parallel array of private info on file handles */
+ filedesc fd_info [ MAXDESC ];
  
! static struct {
!   DWORD     serialnum;
!   DWORD     maxcomp;
!   DWORD     flags;
!   char      name[32];
!   char      type[32];
! } volume_info;
! 
! /* Get information on the volume where name is held; set path pointer to
!    start of pathname in name (past UNC header\volume header if present).  */
! int
! get_volume_info (const char * name, const char ** pPath)
  {
!   char temp[MAX_PATH];
!   char *rootname = NULL;  /* default to current volume */
! 
!   if (name == NULL)
!     return FALSE;
! 
!   /* find the root name of the volume if given */
!   if (isalpha (name[0]) && name[1] == ':')
!     {
!       rootname = temp;
!       temp[0] = *name++;
!       temp[1] = *name++;
!       temp[2] = '\\';
!       temp[3] = 0;
!     }
!   else if (IS_DIRECTORY_SEP (name[0]) && IS_DIRECTORY_SEP (name[1]))
!     {
!       char *str = temp;
!       int slashes = 4;
!       rootname = temp;
!       do
!         {
! 	  if (IS_DIRECTORY_SEP (*name) && --slashes == 0)
! 	    break;
! 	  *str++ = *name++;
! 	}
!       while ( *name );
  
!       *str++ = '\\';
!       *str = 0;
!     }
  
!   if (pPath)
!     *pPath = name;
!     
!   if (GetVolumeInformation (rootname,
! 			    volume_info.name, 32,
! 			    &volume_info.serialnum,
! 			    &volume_info.maxcomp,
! 			    &volume_info.flags,
! 			    volume_info.type, 32))
      {
!       return TRUE;
      }
!   return FALSE;
! }
! 
! /* Determine if volume is FAT format (ie. only supports short 8.3
!    names); also set path pointer to start of pathname in name.  */
! int
! is_fat_volume (const char * name, const char ** pPath)
! {
!   if (get_volume_info (name, pPath))
!     return (volume_info.maxcomp == 12);
!   return FALSE;
! }
! 
! /* Map filename to a legal 8.3 name if necessary. */
! const char *
! map_win32_filename (const char * name, const char ** pPath)
! {
!   static char shortname[MAX_PATH];
!   char * str = shortname;
!   char c;
!   char * path;
! 
!   if (is_fat_volume (name, &path)) /* truncate to 8.3 */
      {
!       register int left = 8;	/* maximum number of chars in part */
!       register int extn = 0;	/* extension added? */
!       register int dots = 2;	/* maximum number of dots allowed */
! 
!       while (name < path)
! 	*str++ = *name++;	/* skip past UNC header */
! 
!       while ((c = *name++))
!         {
! 	  switch ( c )
! 	    {
! 	    case '\\':
! 	    case '/':
! 	      *str++ = '\\';
! 	      extn = 0;		/* reset extension flags */
! 	      dots = 2;		/* max 2 dots */
! 	      left = 8;		/* max length 8 for main part */
! 	      break;
! 	    case ':':
! 	      *str++ = ':';
! 	      extn = 0;		/* reset extension flags */
! 	      dots = 2;		/* max 2 dots */
! 	      left = 8;		/* max length 8 for main part */
! 	      break;
! 	    case '.':
! 	      if ( dots )
! 	        {
! 		  /* Convert path components of the form .xxx to _xxx,
! 		     but leave . and .. as they are.  This allows .emacs
! 		     to be read as _emacs, for example.  */
! 
! 		  if (! *name ||
! 		      *name == '.' ||
! 		      IS_DIRECTORY_SEP (*name))
! 		    {
! 		      *str++ = '.';
! 		      dots--;
! 		    }
! 		  else
! 		    {
! 		      *str++ = '_';
! 		      left--;
! 		      dots = 0;
! 		    }
! 		}
! 	      else if ( !extn )
! 	        {
! 		  *str++ = '.';
! 		  extn = 1;		/* we've got an extension */
! 		  left = 3;		/* 3 chars in extension */
! 		}
! 	      else
! 	        {
! 		  /* any embedded dots after the first are converted to _ */
! 		  *str++ = '_';
! 		}
! 	      break;
! 	    case '~':
! 	    case '#':			/* don't lose these, they're important */
! 	      if ( ! left )
! 		str[-1] = c;		/* replace last character of part */
! 	      /* FALLTHRU */
! 	    default:
! 	      if ( left )
! 	        {
! 		  *str++ = tolower (c);	/* map to lower case (looks nicer) */
! 		  left--;
! 		  dots = 0;		/* started a path component */
! 		}
! 	      break;
! 	    }
! 	}
!       *str = '\0';
      }
!   else
      {
!       strcpy (shortname, name);
!       unixtodos_filename (shortname);
      }
+ 
+   if (pPath)
+     *pPath = shortname + (path - name);
+ 
+   return shortname;
+ }
+ 
+ 
+ /* Shadow some MSVC runtime functions to map requests for long filenames
+    to reasonable short names if necessary.  This was originally added to
+    permit running Emacs on NT 3.1 on a FAT partition, which doesn't support 
+    long file names.  */
+ 
+ int
+ sys_access (const char * path, int mode)
+ {
+   return _access (map_win32_filename (path, NULL), mode);
+ }
+ 
+ int
+ sys_chdir (const char * path)
+ {
+   return _chdir (map_win32_filename (path, NULL));
+ }
+ 
+ int
+ sys_chmod (const char * path, int mode)
+ {
+   return _chmod (map_win32_filename (path, NULL), mode);
+ }
+ 
+ int
+ sys_creat (const char * path, int mode)
+ {
+   return _creat (map_win32_filename (path, NULL), mode);
+ }
+ 
+ FILE *
+ sys_fopen(const char * path, const char * mode)
+ {
+   int fd;
+   int oflag;
+   const char * mode_save = mode;
+ 
+   /* Force all file handles to be non-inheritable.  This is necessary to
+      ensure child processes don't unwittingly inherit handles that might
+      prevent future file access. */
+ 
+   if (mode[0] == 'r')
+     oflag = O_RDONLY;
+   else if (mode[0] == 'w' || mode[0] == 'a')
+     oflag = O_WRONLY | O_CREAT | O_TRUNC;
    else
!     return NULL;
! 
!   /* Only do simplistic option parsing. */
!   while (*++mode)
!     if (mode[0] == '+')
!       {
! 	oflag &= ~(O_RDONLY | O_WRONLY);
! 	oflag |= O_RDWR;
!       }
!     else if (mode[0] == 'b')
!       {
! 	oflag &= ~O_TEXT;
! 	oflag |= O_BINARY;
!       }
!     else if (mode[0] == 't')
!       {
! 	oflag &= ~O_BINARY;
! 	oflag |= O_TEXT;
!       }
!     else break;
! 
!   fd = _open (map_win32_filename (path, NULL), oflag | _O_NOINHERIT, 0644);
!   if (fd < 0)
!     return NULL;
! 
!   return fdopen (fd, mode_save);
! }
! 
! int
! sys_link (const char * path1, const char * path2)
! {
!   errno = EINVAL;
!   return -1;
! }
! 
! int
! sys_mkdir (const char * path)
! {
!   return _mkdir (map_win32_filename (path, NULL));
! }
! 
! char *
! sys_mktemp (char * template)
! {
!   return (char *) map_win32_filename ((const char *) _mktemp (template), NULL);
! }
! 
! int
! sys_open (const char * path, int oflag, int mode)
! {
!   /* Force all file handles to be non-inheritable. */
!   return _open (map_win32_filename (path, NULL), oflag | _O_NOINHERIT, mode);
! }
! 
! int
! sys_rename (const char * oldname, const char * newname)
! {
!   char temp[MAX_PATH];
! 
!   /* MoveFile on Win95 doesn't correctly change the short file name
!      alias when oldname has a three char extension and newname has the
!      same first three chars in its extension.  To avoid problems, on
!      Win95 we rename to a temporary name first.  */
! 
!   strcpy (temp, map_win32_filename (oldname, NULL));
! 
!   if (GetVersion () & 0x80000000)
!     {
!       char * p;
! 
!       unixtodos_filename (temp);
!       if (p = strrchr (temp, '\\'))
! 	p++;
!       else
! 	p = temp;
!       strcpy (p, "__XXXXXX");
!       _mktemp (temp);
!       if (rename (map_win32_filename (oldname, NULL), temp) < 0)
! 	return -1;
!     }
! 
!   /* Emulate Unix behaviour - newname is deleted if it already exists
!      (at least if it is a file; don't do this for directories). */
!   newname = map_win32_filename (newname, NULL);
!   if (GetFileAttributes (newname) != -1)
!     {
!       _chmod (newname, 0666);
!       _unlink (newname);
!     }
! 
!   return rename (temp, newname);
! }
! 
! int
! sys_rmdir (const char * path)
! {
!   return _rmdir (map_win32_filename (path, NULL));
! }
! 
! int
! sys_unlink (const char * path)
! {
!   return _unlink (map_win32_filename (path, NULL));
! }
! 
! static FILETIME utc_base_ft;
! static long double utc_base;
! static int init = 0;
! 
! static time_t
! convert_time (FILETIME ft)
! {
!   long double ret;
! 
!   if (!init)
!     {
!       /* Determine the delta between 1-Jan-1601 and 1-Jan-1970. */
!       SYSTEMTIME st;
! 
!       st.wYear = 1970;
!       st.wMonth = 1;
!       st.wDay = 1;
!       st.wHour = 0;
!       st.wMinute = 0;
!       st.wSecond = 0;
!       st.wMilliseconds = 0;
! 
!       SystemTimeToFileTime (&st, &utc_base_ft);
!       utc_base = (long double) utc_base_ft.dwHighDateTime
! 	* 4096 * 1024 * 1024 + utc_base_ft.dwLowDateTime;
!       init = 1;
!     }
! 
!   if (CompareFileTime (&ft, &utc_base_ft) < 0)
!     return 0;
! 
!   ret = (long double) ft.dwHighDateTime * 4096 * 1024 * 1024 + ft.dwLowDateTime;
!   ret -= utc_base;
!   return (time_t) (ret * 1e-7);
  }
! 
! #if 0
! /* in case we ever have need of this */
! void
! convert_from_time_t (time_t time, FILETIME * pft)
! {
!   long double tmp;
! 
!   if (!init)
!     {
!       /* Determine the delta between 1-Jan-1601 and 1-Jan-1970. */
!       SYSTEMTIME st;
! 
!       st.wYear = 1970;
!       st.wMonth = 1;
!       st.wDay = 1;
!       st.wHour = 0;
!       st.wMinute = 0;
!       st.wSecond = 0;
!       st.wMilliseconds = 0;
! 
!       SystemTimeToFileTime (&st, &utc_base_ft);
!       utc_base = (long double) utc_base_ft.dwHighDateTime
! 	* 4096 * 1024 * 1024 + utc_base_ft.dwLowDateTime;
!       init = 1;
!     }
! 
!   /* time in 100ns units since 1-Jan-1601 */
!   tmp = (long double) time * 1e7 + utc_base;
!   pft->dwHighDateTime = (DWORD) (tmp / (4096.0 * 1024 * 1024));
!   pft->dwLowDateTime = (DWORD) (tmp - pft->dwHighDateTime);
! }
! #endif
! 
! /*  "PJW" algorithm (see the "Dragon" compiler book). */
! static unsigned
! hashval (const char * str)
! {
!   unsigned h = 0;
!   unsigned g;
!   while (*str)
!     {
!       h = (h << 4) + *str++;
!       if ((g = h & 0xf0000000) != 0)
! 	h = (h ^ (g >> 24)) & 0x0fffffff;
!     }
!   return h;
! }
! 
! /* Return the hash value of the canonical pathname, excluding the
!    drive/UNC header, to get a hopefully unique inode number. */
! static _ino_t
! generate_inode_val (const char * name)
! {
!   char fullname[ MAX_PATH ];
!   char * p;
!   unsigned hash;
! 
!   GetFullPathName (name, sizeof (fullname), fullname, &p);
!   get_volume_info (fullname, &p);
!   /* Normal Win32 filesystems are still case insensitive. */
!   _strlwr (p);
!   hash = hashval (p);
!   return (_ino_t) (hash ^ (hash >> 16));
! }
! 
! /* MSVC stat function can't cope with UNC names and has other bugs, so
!    replace it with our own.  This also allows us to calculate consistent
!    inode values without hacks in the main Emacs code. */
! int
! stat (const char * path, struct stat * buf)
! {
!   char * name;
!   WIN32_FIND_DATA wfd;
!   HANDLE fh;
!   int permission;
!   int len;
!   int rootdir = FALSE;
! 
!   if (path == NULL || buf == NULL)
!     {
!       errno = EFAULT;
!       return -1;
!     }
! 
!   name = (char *) map_win32_filename (path, &path);
!   /* must be valid filename, no wild cards */
!   if (strchr (name, '*') || strchr (name, '?'))
!     {
!       errno = ENOENT;
!       return -1;
!     }
! 
!   /* Remove trailing directory separator, unless name is the root
!      directory of a drive or UNC volume in which case ensure there
!      is a trailing separator. */
!   len = strlen (name);
!   rootdir = (path >= name + len - 1
! 	     && (IS_DIRECTORY_SEP (*path) || *path == 0));
!   name = strcpy (alloca (len + 2), name);
! 
!   if (rootdir)
!     {
!       if (!IS_DIRECTORY_SEP (name[len-1]))
! 	strcat (name, "\\");
!       if (GetDriveType (name) < 2)
! 	{
! 	  errno = ENOENT;
! 	  return -1;
! 	}
!       memset (&wfd, 0, sizeof (wfd));
!       wfd.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY;
!       wfd.ftCreationTime = utc_base_ft;
!       wfd.ftLastAccessTime = utc_base_ft;
!       wfd.ftLastWriteTime = utc_base_ft;
!       strcpy (wfd.cFileName, name);
!     }
!   else
!     {
!       if (IS_DIRECTORY_SEP (name[len-1]))
! 	name[len - 1] = 0;
!       fh = FindFirstFile (name, &wfd);
!       if (fh == INVALID_HANDLE_VALUE)
! 	{
! 	  errno = ENOENT;
! 	  return -1;
! 	}
!       FindClose (fh);
!     }
! 
!   if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
!     {
!       buf->st_mode = _S_IFDIR;
!       buf->st_nlink = 2;	/* doesn't really matter */
!     }
!   else
!     {
! #if 0
!       /* This is more accurate in terms of gettting the correct number
! 	 of links, but is quite slow (it is noticable when Emacs is
! 	 making a list of file name completions). */
!       BY_HANDLE_FILE_INFORMATION info;
! 
!       fh = CreateFile (name, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
! 		       NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
! 
!       if (GetFileInformationByHandle (fh, &info))
! 	{
! 	  switch (GetFileType (fh))
! 	    {
! 	    case FILE_TYPE_DISK:
! 	      buf->st_mode = _S_IFREG;
! 	      break;
! 	    case FILE_TYPE_PIPE:
! 	      buf->st_mode = _S_IFIFO;
! 	      break;
! 	    case FILE_TYPE_CHAR:
! 	    case FILE_TYPE_UNKNOWN:
! 	    default:
! 	      buf->st_mode = _S_IFCHR;
! 	    }
! 	  buf->st_nlink = info.nNumberOfLinks;
! 	  /* Could use file index, but this is not guaranteed to be
! 	     unique unless we keep a handle open all the time. */
! 	  /* buf->st_ino = info.nFileIndexLow ^ info.nFileIndexHigh; */
! 	  CloseHandle (fh);
! 	}
!       else
! 	{
! 	  errno = EACCES;
! 	  return -1;
! 	}
! #else
!       buf->st_mode = _S_IFREG;
!       buf->st_nlink = 1;
! #endif
!     }
! 
!   /* consider files to belong to current user */
!   buf->st_uid = the_passwd.pw_uid;
!   buf->st_gid = the_passwd.pw_gid;
! 
!   /* volume_info is set indirectly by map_win32_filename */
!   buf->st_dev = volume_info.serialnum;
!   buf->st_rdev = volume_info.serialnum;
! 
!   buf->st_ino = generate_inode_val (name);
! 
!   buf->st_size = wfd.nFileSizeLow;
! 
!   /* Convert timestamps to Unix format. */
!   buf->st_mtime = convert_time (wfd.ftLastWriteTime);
!   buf->st_atime = convert_time (wfd.ftLastAccessTime);
!   if (buf->st_atime == 0) buf->st_atime = buf->st_mtime;
!   buf->st_ctime = convert_time (wfd.ftCreationTime);
!   if (buf->st_ctime == 0) buf->st_ctime = buf->st_mtime;
! 
!   /* determine rwx permissions */
!   if (wfd.dwFileAttributes & FILE_ATTRIBUTE_READONLY)
!     permission = _S_IREAD;
!   else
!     permission = _S_IREAD | _S_IWRITE;
!   
!   if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
!     permission |= _S_IEXEC;
!   else
!     {
!       char * p = strrchr (name, '.');
!       if (p != NULL &&
! 	  (stricmp (p, ".exe") == 0 ||
! 	   stricmp (p, ".com") == 0 ||
! 	   stricmp (p, ".bat") == 0 ||
! 	   stricmp (p, ".cmd") == 0))
! 	permission |= _S_IEXEC;
!     }
! 
!   buf->st_mode |= permission | (permission >> 3) | (permission >> 6);
! 
!   return 0;
! }
! 
! #ifdef HAVE_SOCKETS
! 
! /* Wrappers for  winsock functions to map between our file descriptors
!    and winsock's handles; also set h_errno for convenience.
! 
!    To allow Emacs to run on systems which don't have winsock support
!    installed, we dynamically link to winsock on startup if present, and
!    otherwise provide the minimum necessary functionality
!    (eg. gethostname). */
! 
! /* function pointers for relevant socket functions */
! int (PASCAL *pfn_WSAStartup) (WORD wVersionRequired, LPWSADATA lpWSAData);
! void (PASCAL *pfn_WSASetLastError) (int iError);
! int (PASCAL *pfn_WSAGetLastError) (void);
! int (PASCAL *pfn_socket) (int af, int type, int protocol);
! int (PASCAL *pfn_bind) (SOCKET s, const struct sockaddr *addr, int namelen);
! int (PASCAL *pfn_connect) (SOCKET s, const struct sockaddr *addr, int namelen);
! int (PASCAL *pfn_ioctlsocket) (SOCKET s, long cmd, u_long *argp);
! int (PASCAL *pfn_recv) (SOCKET s, char * buf, int len, int flags);
! int (PASCAL *pfn_send) (SOCKET s, const char * buf, int len, int flags);
! int (PASCAL *pfn_closesocket) (SOCKET s);
! int (PASCAL *pfn_shutdown) (SOCKET s, int how);
! int (PASCAL *pfn_WSACleanup) (void);
! 
! u_short (PASCAL *pfn_htons) (u_short hostshort);
! u_short (PASCAL *pfn_ntohs) (u_short netshort);
! unsigned long (PASCAL *pfn_inet_addr) (const char * cp);
! int (PASCAL *pfn_gethostname) (char * name, int namelen);
! struct hostent * (PASCAL *pfn_gethostbyname) (const char * name);
! struct servent * (PASCAL *pfn_getservbyname) (const char * name, const char * proto);
! 
! static int have_winsock;
! static HANDLE winsock_lib;
! 
! static void
! term_winsock (void)
! {
!   if (have_winsock)
!     {
!       pfn_WSACleanup ();
!       FreeLibrary (winsock_lib);
!     }
! }
! 
! static void
! init_winsock ()
! {
!   WSADATA  winsockData;
! 
!   winsock_lib = LoadLibrary ("wsock32.dll");
! 
!   if (winsock_lib != NULL)
!     {
!       /* dynamically link to socket functions */
! 
! #define LOAD_PROC(fn) \
!       if ((pfn_##fn = (void *) GetProcAddress (winsock_lib, #fn)) == NULL) \
!         goto fail;
! 
!       LOAD_PROC( WSAStartup );
!       LOAD_PROC( WSASetLastError );
!       LOAD_PROC( WSAGetLastError );
!       LOAD_PROC( socket );
!       LOAD_PROC( bind );
!       LOAD_PROC( connect );
!       LOAD_PROC( ioctlsocket );
!       LOAD_PROC( recv );
!       LOAD_PROC( send );
!       LOAD_PROC( closesocket );
!       LOAD_PROC( shutdown );
!       LOAD_PROC( htons );
!       LOAD_PROC( ntohs );
!       LOAD_PROC( inet_addr );
!       LOAD_PROC( gethostname );
!       LOAD_PROC( gethostbyname );
!       LOAD_PROC( getservbyname );
!       LOAD_PROC( WSACleanup );
! 
!       /* specify version 1.1 of winsock */
!       if (pfn_WSAStartup (0x101, &winsockData) == 0)
!         {
! 	  have_winsock = TRUE;
! 	  return;
! 	}
! 
!     fail:
!       FreeLibrary (winsock_lib);
!     }
!   have_winsock = FALSE;
! }
! 
! 
! int h_errno = 0;
! 
! /* function to set h_errno for compatability; map winsock error codes to
!    normal system codes where they overlap (non-overlapping definitions
!    are already in <sys/socket.h> */
! static void set_errno ()
! {
!   if (!have_winsock)
!     h_errno = EINVAL;
!   else
!     h_errno = pfn_WSAGetLastError ();
! 
!   switch (h_errno)
!     {
!     case WSAEACCES:		h_errno = EACCES; break;
!     case WSAEBADF: 		h_errno = EBADF; break;
!     case WSAEFAULT:		h_errno = EFAULT; break;
!     case WSAEINTR: 		h_errno = EINTR; break;
!     case WSAEINVAL:		h_errno = EINVAL; break;
!     case WSAEMFILE:		h_errno = EMFILE; break;
!     case WSAENAMETOOLONG: 	h_errno = ENAMETOOLONG; break;
!     case WSAENOTEMPTY:		h_errno = ENOTEMPTY; break;
!     }
!   errno = h_errno;
! }
! 
! static void check_errno ()
! {
!   if (h_errno == 0 && have_winsock)
!     pfn_WSASetLastError (0);
! }
! 
! /* [andrewi 3-May-96] I've had conflicting results using both methods,
!    but I believe the method of keeping the socket handle separate (and
!    insuring it is not inheritable) is the correct one. */
! 
! //#define SOCK_REPLACE_HANDLE
! 
! #ifdef SOCK_REPLACE_HANDLE
! #define SOCK_HANDLE(fd) ((SOCKET) _get_osfhandle (fd))
! #else
! #define SOCK_HANDLE(fd) ((SOCKET) fd_info[fd].hnd)
! #endif
! 
! int
! sys_socket(int af, int type, int protocol)
! {
!   int fd;
!   long s;
!   child_process * cp;
! 
!   if (!have_winsock)
!     {
!       h_errno = ENETDOWN;
!       return INVALID_SOCKET;
!     }
! 
!   check_errno ();
! 
!   /* call the real socket function */
!   s = (long) pfn_socket (af, type, protocol);
!   
!   if (s != INVALID_SOCKET)
!     {
!       /* Although under NT 3.5 _open_osfhandle will accept a socket
! 	 handle, if opened with SO_OPENTYPE == SO_SYNCHRONOUS_NONALERT,
! 	 that does not work under NT 3.1.  However, we can get the same
! 	 effect by using a backdoor function to replace an existing
! 	 descriptor handle with the one we want. */
! 
!       /* allocate a file descriptor (with appropriate flags) */
!       fd = _open ("NUL:", _O_RDWR);
!       if (fd >= 0)
!         {
! #ifdef SOCK_REPLACE_HANDLE
! 	  /* now replace handle to NUL with our socket handle */
! 	  CloseHandle ((HANDLE) _get_osfhandle (fd));
! 	  _free_osfhnd (fd);
! 	  _set_osfhnd (fd, s);
! 	  /* setmode (fd, _O_BINARY); */
! #else
! 	  /* Make a non-inheritable copy of the socket handle. */
! 	  {
! 	    HANDLE parent;
! 	    HANDLE new_s = INVALID_HANDLE_VALUE;
! 
! 	    parent = GetCurrentProcess ();
! 
! 	    DuplicateHandle (parent,
! 			     (HANDLE) s,
! 			     parent,
! 			     &new_s,
! 			     0,
! 			     FALSE,
! 			     DUPLICATE_SAME_ACCESS);
! 	    pfn_closesocket (s);
! 	    fd_info[fd].hnd = new_s;
! 	    s = (SOCKET) new_s;
! 	  }
! #endif
! 
! 	  /* set our own internal flags */
! 	  fd_info[fd].flags = FILE_SOCKET | FILE_BINARY | FILE_READ | FILE_WRITE;
! 
! 	  cp = new_child ();
! 	  if (cp)
! 	    {
! 	      cp->fd = fd;
! 	      cp->status = STATUS_READ_ACKNOWLEDGED;
! 
! 	      /* attach child_process to fd_info */
! 	      if (fd_info[ fd ].cp != NULL)
! 		{
! 		  DebPrint (("sys_socket: fd_info[%d] apparently in use!\n", fd));
! 		  abort ();
! 		}
! 
! 	      fd_info[ fd ].cp = cp;
! 
! 	      /* success! */
! 	      return fd;
! 	    }
! 
! 	  /* clean up */
! 	  _close (fd);
! 	}
!       pfn_closesocket (s);
!       h_errno = EMFILE;
!     }
!   set_errno ();
! 
!   return -1;
! }
! 
! 
! int
! sys_bind (int s, const struct sockaddr * addr, int namelen)
! {
!   if (!have_winsock)
!     {
!       h_errno = ENOTSOCK;
!       return SOCKET_ERROR;
!     }
! 
!   check_errno ();
!   if (fd_info[s].flags & FILE_SOCKET)
!     {
!       int rc = pfn_bind (SOCK_HANDLE (s), addr, namelen);
!       if (rc == SOCKET_ERROR)
! 	set_errno ();
!       return rc;
!     }
!   h_errno = ENOTSOCK;
!   return SOCKET_ERROR;
! }
! 
! 
! int
! sys_connect (int s, const struct sockaddr * name, int namelen)
! {
!   if (!have_winsock)
!     {
!       h_errno = ENOTSOCK;
!       return SOCKET_ERROR;
!     }
! 
!   check_errno ();
!   if (fd_info[s].flags & FILE_SOCKET)
!     {
!       int rc = pfn_connect (SOCK_HANDLE (s), name, namelen);
!       if (rc == SOCKET_ERROR)
! 	set_errno ();
!       return rc;
!     }
!   h_errno = ENOTSOCK;
!   return SOCKET_ERROR;
! }
! 
! u_short
! sys_htons (u_short hostshort)
! {
!   return (have_winsock) ?
!     pfn_htons (hostshort) : hostshort;
! }
! 
! u_short
! sys_ntohs (u_short netshort)
! {
!   return (have_winsock) ?
!     pfn_ntohs (netshort) : netshort;
! }
! 
! unsigned long
! sys_inet_addr (const char * cp)
! {
!   return (have_winsock) ?
!     pfn_inet_addr (cp) : INADDR_NONE;
! }
! 
! int
! sys_gethostname (char * name, int namelen)
! {
!   if (have_winsock)
!     return pfn_gethostname (name, namelen);
! 
!   if (namelen > MAX_COMPUTERNAME_LENGTH)
!     return !GetComputerName (name, &namelen);
! 
!   h_errno = EFAULT;
!   return SOCKET_ERROR;
! }
! 
! struct hostent *
! sys_gethostbyname(const char * name)
! {
!   struct hostent * host;
! 
!   if (!have_winsock)
!     {
!       h_errno = ENETDOWN;
!       return NULL;
!     }
! 
!   check_errno ();
!   host = pfn_gethostbyname (name);
!   if (!host)
!     set_errno ();
!   return host;
! }
! 
! struct servent *
! sys_getservbyname(const char * name, const char * proto)
! {
!   struct servent * serv;
! 
!   if (!have_winsock)
!     {
!       h_errno = ENETDOWN;
!       return NULL;
!     }
! 
!   check_errno ();
!   serv = pfn_getservbyname (name, proto);
!   if (!serv)
!     set_errno ();
!   return serv;
! }
! 
! #endif /* HAVE_SOCKETS */
! 
! 
! /* Shadow main io functions: we need to handle pipes and sockets more
!    intelligently, and implement non-blocking mode as well. */
! 
! int
! sys_close (int fd)
! {
!   int rc;
! 
!   if (fd < 0 || fd >= MAXDESC)
!     {
!       errno = EBADF;
!       return -1;
!     }
! 
!   if (fd_info[fd].cp)
!     {
!       child_process * cp = fd_info[fd].cp;
! 
!       fd_info[fd].cp = NULL;
! 
!       if (CHILD_ACTIVE (cp))
!         {
! 	  /* if last descriptor to active child_process then cleanup */
! 	  int i;
! 	  for (i = 0; i < MAXDESC; i++)
! 	    {
! 	      if (i == fd)
! 		continue;
! 	      if (fd_info[i].cp == cp)
! 		break;
! 	    }
! 	  if (i == MAXDESC)
! 	    {
! #if defined (HAVE_SOCKETS) && !defined (SOCK_REPLACE_HANDLE)
! 	      if (fd_info[fd].flags & FILE_SOCKET)
! 		{
! 		  if (!have_winsock) abort ();
! 
! 		  pfn_shutdown (SOCK_HANDLE (fd), 2);
! 		  rc = pfn_closesocket (SOCK_HANDLE (fd));
! 		}
! #endif
! 	      delete_child (cp);
! 	    }
! 	}
!     }
! 
!   /* Note that sockets do not need special treatment here (at least on
!      NT and Win95 using the standard tcp/ip stacks) - it appears that
!      closesocket is equivalent to CloseHandle, which is to be expected
!      because socket handles are fully fledged kernel handles. */
!   rc = _close (fd);
! 
!   if (rc == 0)
!     fd_info[fd].flags = 0;
! 
!   return rc;
! }
! 
! int
! sys_dup (int fd)
! {
!   int new_fd;
! 
!   new_fd = _dup (fd);
!   if (new_fd >= 0)
!     {
!       /* duplicate our internal info as well */
!       fd_info[new_fd] = fd_info[fd];
!     }
!   return new_fd;
! }
! 
! 
! int
! sys_dup2 (int src, int dst)
! {
!   int rc;
! 
!   if (dst < 0 || dst >= MAXDESC)
!     {
!       errno = EBADF;
!       return -1;
!     }
! 
!   /* make sure we close the destination first if it's a pipe or socket */
!   if (src != dst && fd_info[dst].flags != 0)
!     sys_close (dst);
!   
!   rc = _dup2 (src, dst);
!   if (rc == 0)
!     {
!       /* duplicate our internal info as well */
!       fd_info[dst] = fd_info[src];
!     }
!   return rc;
! }
! 
! /* From callproc.c  */
! extern Lisp_Object Vbinary_process_input;
! extern Lisp_Object Vbinary_process_output;
! 
! /* Unix pipe() has only one arg */
! int
! sys_pipe (int * phandles)
! {
!   int rc;
!   unsigned flags;
!   child_process * cp;
! 
!   /* make pipe handles non-inheritable; when we spawn a child,
!      we replace the relevant handle with an inheritable one. */
!   rc = _pipe (phandles, 0, _O_NOINHERIT);
! 
!   if (rc == 0)
!     {
!       /* set internal flags, and put read and write handles into binary
! 	 mode as necessary; if not in binary mode, set the MSVC internal
! 	 FDEV (0x40) flag to prevent _read from treating ^Z as eof (this
! 	 could otherwise allow Emacs to hang because it then waits
! 	 indefinitely for the child process to exit, when it might not be
! 	 finished). */
!       flags = FILE_PIPE | FILE_READ;
!       if (!NILP (Vbinary_process_output))
! 	{
! 	  flags |= FILE_BINARY;
! 	  setmode (phandles[0], _O_BINARY);
! 	}
! #if (_MSC_VER == 900)
!       else
! 	_osfile[phandles[0]] |= 0x40;
! #endif
! 
!       fd_info[phandles[0]].flags = flags;
! 
!       flags = FILE_PIPE | FILE_WRITE;
!       if (!NILP (Vbinary_process_input))
! 	{
! 	  flags |= FILE_BINARY;
! 	  setmode (phandles[1], _O_BINARY);
! 	}
! #if (_MSC_VER == 900)
!       else
! 	_osfile[phandles[1]] |= 0x40;
! #endif
! 
!       fd_info[phandles[1]].flags = flags;
!     }
! 
!   return rc;
! }
! 
! /* From ntproc.c */
! extern Lisp_Object Vwin32_pipe_read_delay;
! 
! /* Function to do blocking read of one byte, needed to implement
!    select.  It is only allowed on sockets and pipes. */
! int
! _sys_read_ahead (int fd)
! {
!   child_process * cp;
!   int rc;
! 
!   if (fd < 0 || fd >= MAXDESC)
!     return STATUS_READ_ERROR;
! 
!   cp = fd_info[fd].cp;
! 
!   if (cp == NULL || cp->fd != fd || cp->status != STATUS_READ_READY)
!     return STATUS_READ_ERROR;
! 
!   if ((fd_info[fd].flags & (FILE_PIPE | FILE_SOCKET)) == 0
!       || (fd_info[fd].flags & FILE_READ) == 0)
!     {
!       DebPrint (("_sys_read_ahead: internal error: fd %d is not a pipe or socket!\n", fd));
!       abort ();
!     }
!   
!   cp->status = STATUS_READ_IN_PROGRESS;
!   
!   if (fd_info[fd].flags & FILE_PIPE)
!     {
!       /* Use read to get CRLF translation */
!       rc = _read (fd, &cp->chr, sizeof (char));
! 
!       /* Give subprocess time to buffer some more output for us before
! 	 reporting that input is available; we need this because Win95
! 	 connects DOS programs to pipes by making the pipe appear to be
! 	 the normal console stdout - as a result most DOS programs will
! 	 write to stdout without buffering, ie.  one character at a
! 	 time.  Even some Win32 programs do this - "dir" in a command
! 	 shell on NT is very slow if we don't do this. */
!       if (rc > 0)
! 	{
! 	  int wait = XINT (Vwin32_pipe_read_delay);
! 
! 	  if (wait > 0)
! 	    Sleep (wait);
! 	  else if (wait < 0)
! 	    while (++wait <= 0)
! 	      /* Yield remainder of our time slice, effectively giving a
! 		 temporary priority boost to the child process. */
! 	      Sleep (0);
! 	}
!     }
! #ifdef HAVE_SOCKETS
!   else if (fd_info[fd].flags & FILE_SOCKET)
!     rc = pfn_recv (SOCK_HANDLE (fd), &cp->chr, sizeof (char), 0);
! #endif
!   
!   if (rc == sizeof (char))
!     cp->status = STATUS_READ_SUCCEEDED;
!   else
!     cp->status = STATUS_READ_FAILED;
! 
!   return cp->status;
! }
! 
! int
! sys_read (int fd, char * buffer, unsigned int count)
! {
!   int nchars;
!   int extra = 0;
!   int to_read;
!   DWORD waiting;
! 
!   if (fd < 0 || fd >= MAXDESC)
!     {
!       errno = EBADF;
!       return -1;
!     }
! 
!   if (fd_info[fd].flags & (FILE_PIPE | FILE_SOCKET))
!     {
!       child_process *cp = fd_info[fd].cp;
! 
!       if ((fd_info[fd].flags & FILE_READ) == 0)
!         {
! 	  errno = EBADF;
! 	  return -1;
! 	}
! 
!       /* presence of a child_process structure means we are operating in
! 	 non-blocking mode - otherwise we just call _read directly.
! 	 Note that the child_process structure might be missing because
! 	 reap_subprocess has been called; in this case the pipe is
! 	 already broken, so calling _read on it is okay. */
!       if (cp)
!         {
! 	  int current_status = cp->status;
! 
! 	  switch (current_status)
! 	    {
! 	    case STATUS_READ_FAILED:
! 	    case STATUS_READ_ERROR:
! 	      /* report normal EOF */
! 	      return 0;
! 
! 	    case STATUS_READ_READY:
! 	    case STATUS_READ_IN_PROGRESS:
! 	      DebPrint (("sys_read called when read is in progress\n"));
! 	      errno = EWOULDBLOCK;
! 	      return -1;
! 
! 	    case STATUS_READ_SUCCEEDED:
! 	      /* consume read-ahead char */
! 	      *buffer++ = cp->chr;
! 	      count--;
! 	      extra = 1;
! 	      cp->status = STATUS_READ_ACKNOWLEDGED;
! 	      ResetEvent (cp->char_avail);
! 
! 	    case STATUS_READ_ACKNOWLEDGED:
! 	      break;
! 
! 	    default:
! 	      DebPrint (("sys_read: bad status %d\n", current_status));
! 	      errno = EBADF;
! 	      return -1;
! 	    }
! 
! 	  if (fd_info[fd].flags & FILE_PIPE)
! 	    {
! 	      PeekNamedPipe ((HANDLE) _get_osfhandle (fd), NULL, 0, NULL, &waiting, NULL);
! 	      to_read = min (waiting, (DWORD) count);
!       
! 	      /* Use read to get CRLF translation */
! 	      nchars = _read (fd, buffer, to_read);
! 	    }
! #ifdef HAVE_SOCKETS
! 	  else /* FILE_SOCKET */
! 	    {
! 	      if (!have_winsock) abort ();
! 
! 	      /* do the equivalent of a non-blocking read */
! 	      pfn_ioctlsocket (SOCK_HANDLE (fd), FIONREAD, &waiting);
! 	      if (waiting == 0 && extra == 0)
! 	        {
! 		  h_errno = errno = EWOULDBLOCK;
! 		  return -1;
! 		}
! 
! 	      nchars = 0;
! 	      if (waiting)
! 	        {
! 		  /* always use binary mode for sockets */
! 		  nchars = pfn_recv (SOCK_HANDLE (fd), buffer, count, 0);
! 		  if (nchars == SOCKET_ERROR)
! 		    {
! 		      DebPrint(("sys_read.recv failed with error %d on socket %ld\n",
! 				pfn_WSAGetLastError (), SOCK_HANDLE (fd)));
! 		      if (extra == 0)
! 		        {
! 			  set_errno ();
! 			  return -1;
! 			}
! 		      nchars = 0;
! 		    }
! 		}
! 	    }
! #endif
! 	}
!       else
! 	nchars = _read (fd, buffer, count);
!     }
!   else
!     nchars = _read (fd, buffer, count);
! 
!   return nchars + extra;
! }
! 
! /* For now, don't bother with a non-blocking mode */
! int
! sys_write (int fd, const void * buffer, unsigned int count)
! {
!   int nchars;
! 
!   if (fd < 0 || fd >= MAXDESC)
!     {
!       errno = EBADF;
!       return -1;
!     }
! 
!   if (fd_info[fd].flags & (FILE_PIPE | FILE_SOCKET))
!     if ((fd_info[fd].flags & FILE_WRITE) == 0)
!       {
! 	errno = EBADF;
! 	return -1;
!       }
! #ifdef HAVE_SOCKETS
!   if (fd_info[fd].flags & FILE_SOCKET)
!     {
!       if (!have_winsock) abort ();
!       nchars =  pfn_send (SOCK_HANDLE (fd), buffer, count, 0);
!       if (nchars == SOCKET_ERROR)
!         {
! 	  DebPrint(("sys_read.send failed with error %d on socket %ld\n",
! 		    pfn_WSAGetLastError (), SOCK_HANDLE (fd)));
! 	  set_errno ();
! 	}
!     }
!   else
! #endif
!     nchars = _write (fd, buffer, count);
! 
!   return nchars;
! }
! 
! 
! void
! term_ntproc ()
! {
! #ifdef HAVE_SOCKETS
!   /* shutdown the socket interface if necessary */
!   term_winsock ();
! #endif
! }
! 
! extern BOOL can_run_dos_process;
! extern BOOL dos_process_running;
! 
! void
! init_ntproc ()
! {
! #ifdef HAVE_SOCKETS
!   /* initialise the socket interface if available */
!   init_winsock ();
! #endif
! 
!   /* Initial preparation for subprocess support: replace our standard
!      handles with non-inheritable versions. */
!   {
!     HANDLE parent;
!     HANDLE stdin_save =  INVALID_HANDLE_VALUE;
!     HANDLE stdout_save = INVALID_HANDLE_VALUE;
!     HANDLE stderr_save = INVALID_HANDLE_VALUE;
! 
!     parent = GetCurrentProcess ();
! 
!     /* ignore errors when duplicating and closing; typically the
!        handles will be invalid when running as a gui program. */
!     DuplicateHandle (parent, 
! 		     GetStdHandle (STD_INPUT_HANDLE), 
! 		     parent,
! 		     &stdin_save, 
! 		     0, 
! 		     FALSE, 
! 		     DUPLICATE_SAME_ACCESS);
!     
!     DuplicateHandle (parent,
! 		     GetStdHandle (STD_OUTPUT_HANDLE),
! 		     parent,
! 		     &stdout_save,
! 		     0,
! 		     FALSE,
! 		     DUPLICATE_SAME_ACCESS);
!     
!     DuplicateHandle (parent,
! 		     GetStdHandle (STD_ERROR_HANDLE),
! 		     parent,
! 		     &stderr_save,
! 		     0,
! 		     FALSE,
! 		     DUPLICATE_SAME_ACCESS);
!     
!     fclose (stdin);
!     fclose (stdout);
!     fclose (stderr);
! 
!     if (stdin_save != INVALID_HANDLE_VALUE)
!       _open_osfhandle ((long) stdin_save, O_TEXT);
!     else
!       open ("nul", O_TEXT | O_NOINHERIT | O_RDONLY);
!     fdopen (0, "r");
! 
!     if (stdout_save != INVALID_HANDLE_VALUE)
!       _open_osfhandle ((long) stdout_save, O_TEXT);
!     else
!       open ("nul", O_TEXT | O_NOINHERIT | O_WRONLY);
!     fdopen (1, "w");
! 
!     if (stderr_save != INVALID_HANDLE_VALUE)
!       _open_osfhandle ((long) stderr_save, O_TEXT);
!     else
!       open ("nul", O_TEXT | O_NOINHERIT | O_WRONLY);
!     fdopen (2, "w");
!   }
! 
!   /* Only allow Emacs to run DOS programs on Win95. */
!   can_run_dos_process = (GetVersion () & 0x80000000);
!   dos_process_running = FALSE;
! 
!   /* unfortunately, atexit depends on implementation of malloc */
!   /* atexit (term_ntproc); */
!   signal (SIGABRT, term_ntproc);
! }
! 
! /* end of nt.c */
diff -2rcpP --exclude=*.elc emacs-19.30/src/nt.h emacs-19.31/src/nt.h
*** emacs-19.30/src/nt.h	Tue Nov  7 02:09:44 1995
--- emacs-19.31/src/nt.h	Fri May 17 17:29:43 1996
***************
*** 1,2 ****
--- 1,5 ----
+ #ifndef _NT_H_
+ #define _NT_H_
+ 
  /* Support routines for the NT version of Emacs.
     Copyright (C) 1994 Free Software Foundation, Inc.
*************** GNU General Public License for more deta
*** 16,43 ****
  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.  */
--- 19,113 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
! /* #define FULL_DEBUG */
! #define EMACSDEBUG
  
! #ifdef EMACSDEBUG
! #define DebPrint(stuff) _DebPrint stuff
  #else
! #define DebPrint(stuff)
  #endif
+ 
+ /* File descriptor set emulation.  */
+ 
+ /* MSVC runtime library has limit of 64 descriptors by default */
+ #define FD_SETSIZE  64
+ typedef struct {
+   unsigned int bits[FD_SETSIZE / 32];
+ } fd_set;
+ 
+ /* standard access macros */
+ #define FD_SET(n, p) \
+   do { \
+     if ((n) < FD_SETSIZE) { \
+       (p)->bits[(n)/32] |= (1 << (n)%32); \
+     } \
+   } while (0)
+ #define FD_CLR(n, p) \
+   do { \
+     if ((n) < FD_SETSIZE) { \
+       (p)->bits[(n)/32] &= ~(1 << (n)%32); \
+     } \
+   } while (0)
+ #define FD_ISSET(n, p) ((n) < FD_SETSIZE ? ((p)->bits[(n)/32] & (1 << (n)%32)) : 0)
+ #define FD_ZERO(p) memset((p), 0, sizeof(fd_set))
+ 
  #define SELECT_TYPE fd_set
! 
! /* ------------------------------------------------------------------------- */
! 
! /* child_process.status values */
! enum {
!   STATUS_READ_ERROR = -1,
!   STATUS_READ_READY,
!   STATUS_READ_IN_PROGRESS,
!   STATUS_READ_FAILED,
!   STATUS_READ_SUCCEEDED,
!   STATUS_READ_ACKNOWLEDGED
! };
! 
! /* This structure is used for both pipes and sockets; for
!    a socket, the process handle in pi is NULL. */
! typedef struct _child_process
! {
!   int                   fd;
!   int                   pid;
!   int                   is_dos_process;
!   HANDLE                char_avail;
!   HANDLE                char_consumed;
!   HANDLE                thrd;
!   PROCESS_INFORMATION   procinfo;
!   volatile int          status;
!   char                  chr;
! } child_process;
! 
! #define MAXDESC FD_SETSIZE
! #define MAX_CHILDREN  MAXDESC/2
! #define CHILD_ACTIVE(cp) ((cp)->char_avail != NULL)
! 
! /* parallel array of private info on file handles */
! typedef struct
! {
!   unsigned         flags;
!   HANDLE           hnd;
!   child_process *  cp;
! } filedesc;
! 
! extern filedesc fd_info [ MAXDESC ];
! 
! /* fd_info flag definitions */
! #define FILE_READ    0x0001
! #define FILE_WRITE   0x0002
! #define FILE_BINARY  0x0010
! #define FILE_PIPE    0x0100
! #define FILE_SOCKET  0x0200
! 
! extern child_process * new_child (void);
! extern void delete_child (child_process *cp);
! 
! /* ------------------------------------------------------------------------- */
! 
  
  /* Prepare our standard handles for proper inheritance by child processes.  */
*************** extern void reset_standard_handles (int 
*** 50,53 ****
  
  /* Return the string resource associated with KEY of type TYPE.  */
! extern LPBYTE nt_get_resource (char *key, LPDWORD type);
  
--- 120,127 ----
  
  /* Return the string resource associated with KEY of type TYPE.  */
! extern LPBYTE nt_get_resource (char * key, LPDWORD type);
! 
! extern void init_ntproc ();
! extern void term_ntproc ();
  
+ #endif /* _NT_H_ */
diff -2rcpP --exclude=*.elc emacs-19.30/src/ntheap.c emacs-19.31/src/ntheap.c
*** emacs-19.30/src/ntheap.c	Fri Jun 30 16:58:10 1995
--- emacs-19.31/src/ntheap.c	Mon May 13 11:06:42 1996
***************
*** 2,20 ****
     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
--- 2,21 ----
     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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.
  
     Geoff Voelker (voelker@cs.washington.edu)			     7-29-94
***************
*** 27,30 ****
--- 28,32 ----
  
  #include "ntheap.h"
+ #include "lisp.h"  /* for VALMASK */
  
  /* This gives us the page size and the size of the allocation unit on NT.  */
*************** get_data_end (void)
*** 98,148 ****
  }
  
- #ifndef WINDOWS95
  static char *
  allocate_heap (void)
  {
!   unsigned long base = 0x00030000;
!   unsigned long end  = 0x00D00000;
! 
!   reserved_heap_size = end - base;
! 
!   return VirtualAlloc ((void *) base,
! 		       get_reserved_heap_size (),
! 		       MEM_RESERVE,
! 		       PAGE_NOACCESS);
! }
! #else  
! static char *
! allocate_heap (void)
! {
!   unsigned long start     = 0x400000;
!   unsigned long stop      = 0xD00000;
!   unsigned long increment = 0x100000;
!   char *ptr, *begin = NULL, *end = NULL;
!   int i;
! 
!   for (i = start; i < stop; i += increment) 
      {
!       ptr = VirtualAlloc ((void *) i, increment, MEM_RESERVE, PAGE_NOACCESS);
!       if (ptr) 
! 	begin = begin ? begin : ptr;
!       else if (begin)
! 	{
! 	  end = ptr;
! 	  break;
! 	}
      }
  
!   if (begin && !end)
!     end = (char *) i;
!   
!   if (!begin)
!     /* We couldn't allocate any memory for the heap.  Exit.  */
!     exit (-2);
! 
!   reserved_heap_size = end - begin;
!   return begin;
  }
- #endif
  
  
--- 100,167 ----
  }
  
  static char *
  allocate_heap (void)
  {
!   /* The base address for our GNU malloc heap is chosen in conjuction
!      with the link settings for temacs.exe which control the stack size,
!      the initial default process heap size and the executable image base
!      address.  The link settings and the malloc heap base below must all
!      correspond; the relationship between these values depends on how NT
!      and Win95 arrange the virtual address space for a process (and on
!      the size of the code and data segments in temacs.exe).
! 
!      The most important thing is to make base address for the executable
!      image high enough to leave enough room between it and the 4MB floor
!      of the process address space on Win95 for the primary thread stack,
!      the process default heap, and other assorted odds and ends
!      (eg. environment strings, private system dll memory etc) that are
!      allocated before temacs has a chance to grab its malloc arena.  The
!      malloc heap base can then be set several MB higher than the
!      executable image base, leaving enough room for the code and data
!      segments.
! 
!      Because some parts of Emacs can use rather a lot of stack space
!      (for instance, the regular expression routines can potentially
!      allocate several MB of stack space) we allow 8MB for the stack.
! 
!      Allowing 1MB for the default process heap, and 1MB for odds and
!      ends, we can base the executable at 16MB and still have a generous
!      safety margin.  At the moment, the executable has about 810KB of
!      code (for x86) and about 550KB of data - on RISC platforms the code
!      size could be roughly double, so if we allow 4MB for the executable
!      we will have plenty of room for expansion.
! 
!      Thus we would like to set the malloc heap base to 20MB.  However,
!      Win95 refuses to allocate the heap starting at this address, so we
!      set the base to 27MB to make it happy.  Since Emacs now leaves
!      28 bits available for pointers, this lets us use the remainder of
!      the region below the 256MB line for our malloc arena - 229MB is
!      still a pretty decent arena to play in!  */
! 
!   unsigned long base = 0x01B00000;   /*  27MB */
!   unsigned long end  = 1 << VALBITS; /* 256MB */
!   void *ptr = NULL;
! 
! #if NTHEAP_PROBE_BASE /* This is never normally defined */
!   /* Try various addresses looking for one the kernel will let us have.  */
!   while (!ptr && (base < end))
      {
!       reserved_heap_size = end - base;
!       ptr = VirtualAlloc ((void *) base,
! 			  get_reserved_heap_size (),
! 			  MEM_RESERVE,
! 			  PAGE_NOACCESS);
!       base += 0x00100000;  /* 1MB increment */
      }
+ #else
+   reserved_heap_size = end - base;
+   ptr = VirtualAlloc ((void *) base,
+ 		      get_reserved_heap_size (),
+ 		      MEM_RESERVE,
+ 		      PAGE_NOACCESS);
+ #endif
  
!   return ptr;
  }
  
  
*************** sbrk (unsigned long increment)
*** 161,167 ****
  	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");
--- 180,186 ----
  	return NULL;
  
!       /* Ensure that the addresses don't use the upper tag bits since
! 	 the Lisp type goes there.  */
!       if (((unsigned long) data_region_base & ~VALMASK) != 0) 
  	{
  	  printf ("Error: The heap was allocated in upper memory.\n");
diff -2rcpP --exclude=*.elc emacs-19.30/src/ntheap.h emacs-19.31/src/ntheap.h
*** emacs-19.30/src/ntheap.h	Fri May 26 01:22:03 1995
--- emacs-19.31/src/ntheap.h	Mon Jan 15 04:06:29 1996
***************
*** 2,20 ****
     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
--- 2,21 ----
     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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.
  
     Geoff Voelker (voelker@cs.washington.edu)			     7-29-94
diff -2rcpP --exclude=*.elc emacs-19.30/src/ntinevt.c emacs-19.31/src/ntinevt.c
*** emacs-19.30/src/ntinevt.c	Mon Jul 17 16:59:16 1995
--- emacs-19.31/src/ntinevt.c	Fri May  3 14:30:40 1996
***************
*** 2,20 ****
     Copyright (C) 1992, 1993, 1995 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.
  
     Drew Bliss                   01-Oct-93
--- 2,21 ----
     Copyright (C) 1992, 1993, 1995 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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.
  
     Drew Bliss                   01-Oct-93
*************** get_frame (void)
*** 92,96 ****
  /* Translate console modifiers to emacs modifiers.  
     German keyboard support (Kai Morgan Zeise 2/18/95).  */
! static int 
  win32_kbd_mods_to_emacs (DWORD mods)
  {
--- 93,97 ----
  /* Translate console modifiers to emacs modifiers.  
     German keyboard support (Kai Morgan Zeise 2/18/95).  */
! int
  win32_kbd_mods_to_emacs (DWORD mods)
  {
*************** win32_kbd_mods_to_emacs (DWORD mods)
*** 120,177 ****
  }
  
! /* Patch up NT keyboard events when info is missing that should be there,
!    assuming that map_virt_key says that the key is a valid ASCII char. */
! static char win32_number_shift_map[] = {
!   ')', '!', '@', '#', '$', '%', '^', '&', '*', '('
! };
! 
! #define WIN32_KEY_SHIFTED(mods, no, yes) \
!   ((mods & (SHIFT_PRESSED | CAPSLOCK_ON)) ? yes : no)
! 
! static void
  win32_kbd_patch_key (KEY_EVENT_RECORD *event)
  {
    unsigned int key_code = event->wVirtualKeyCode;
    unsigned int mods = event->dwControlKeyState;
!   int mapped_punct = 0;
! 
!   /* map_virt_key says its a valid key, but the uChar.AsciiChar field
!      is empty.  patch up the uChar.AsciiChar field using wVirtualKeyCode.  */
!   if (event->uChar.AsciiChar == 0
!       && ((key_code >= '0' && key_code <= '9')
! 	  || (key_code >= 'A' && key_code <= 'Z')
! 	  || (key_code >= 0xBA && key_code <= 0xC0)
! 	  || (key_code >= 0xDB && key_code <= 0xDE)
! 	  )) {
!     if (key_code >= '0' && key_code <= '9') {
!       event->uChar.AsciiChar = 
! 	WIN32_KEY_SHIFTED (mods, key_code,
! 			win32_number_shift_map[key_code - '0']);
!       return;
!     }
!     switch (key_code) {
!     case 0xBA: mapped_punct = WIN32_KEY_SHIFTED (mods, ';', ':'); break;
!     case 0xBB: mapped_punct = WIN32_KEY_SHIFTED (mods, '=', '+'); break;
!     case 0xBC: mapped_punct = WIN32_KEY_SHIFTED (mods, ',', '<'); break;
!     case 0xBD: mapped_punct = WIN32_KEY_SHIFTED (mods, '-', '_'); break;
!     case 0xBE: mapped_punct = WIN32_KEY_SHIFTED (mods, '.', '>'); break;
!     case 0xBF: mapped_punct = WIN32_KEY_SHIFTED (mods, '/', '?'); break;
!     case 0xC0: mapped_punct = WIN32_KEY_SHIFTED (mods, '`', '~'); break;
!     case 0xDB: mapped_punct = WIN32_KEY_SHIFTED (mods, '[', '{'); break;
!     case 0xDC: mapped_punct = WIN32_KEY_SHIFTED (mods, '\\', '|'); break;
!     case 0xDD: mapped_punct = WIN32_KEY_SHIFTED (mods, ']', '}'); break;
!     case 0xDE: mapped_punct = WIN32_KEY_SHIFTED (mods, '\'', '"'); break;
!     default:
!       mapped_punct = 0;
!       break;
!     }
!     if (mapped_punct) {
!       event->uChar.AsciiChar = mapped_punct;
!       return;
!     }
!     /* otherwise, it's a letter.  */
!     event->uChar.AsciiChar = WIN32_KEY_SHIFTED (mods, key_code - 'A' + 'a',
! 						key_code);
!   }
  }
  
--- 121,162 ----
  }
  
! /* The return code indicates key code size. */
! int
  win32_kbd_patch_key (KEY_EVENT_RECORD *event)
  {
    unsigned int key_code = event->wVirtualKeyCode;
    unsigned int mods = event->dwControlKeyState;
!   BYTE keystate[256];
!   static BYTE ansi_code[4];
!   static int isdead = 0;
! 
!   if (isdead == 2)
!     {
!       event->uChar.AsciiChar = ansi_code[2];
!       isdead = 0;
!       return 1;
!     }
!   if (event->uChar.AsciiChar != 0) 
!     return 1;
! 
!   memset (keystate, 0, sizeof (keystate));
!   if (mods & SHIFT_PRESSED) 
!     keystate[VK_SHIFT] = 0x80;
!   if (mods & CAPSLOCK_ON) 
!     keystate[VK_CAPITAL] = 1;
!   if ((mods & LEFT_CTRL_PRESSED) && (mods & RIGHT_ALT_PRESSED))
!     {
!       keystate[VK_CONTROL] = 0x80;
!       keystate[VK_LCONTROL] = 0x80;
!       keystate[VK_MENU] = 0x80;
!       keystate[VK_RMENU] = 0x80;
!     }
! 
!   isdead = ToAscii (event->wVirtualKeyCode, event->wVirtualScanCode,
! 		    keystate, (LPWORD) ansi_code, 0);
!   if (isdead == 0) 
!     return 0;
!   event->uChar.AsciiChar = ansi_code[0];
!   return isdead;
  }
  
*************** win32_kbd_patch_key (KEY_EVENT_RECORD *e
*** 187,191 ****
--- 172,180 ----
  static int map_virt_key[256] =
  {
+ #ifdef MULE
+   -3,
+ #else
    -1,
+ #endif
    -1,                 /* VK_LBUTTON */
    -1,                 /* VK_RBUTTON */
*************** static int map_virt_key[256] =
*** 294,305 ****
  };
  
! static int 
  key_event (KEY_EVENT_RECORD *event, struct input_event *emacs_ev)
  {
    int map;
    static BOOL map_virt_key_init_done;
    
    /* Skip key-up events.  */
!   if (event->bKeyDown == FALSE)
      return 0;
    
--- 283,297 ----
  };
  
! /* return code -1 means that event_queue_ptr won't be incremented. 
!    In other word, this event makes two key codes.   (by himi)       */
! int 
  key_event (KEY_EVENT_RECORD *event, struct input_event *emacs_ev)
  {
    int map;
+   int key_flag = 0;
    static BOOL map_virt_key_init_done;
    
    /* Skip key-up events.  */
!   if (!event->bKeyDown)
      return 0;
    
*************** key_event (KEY_EVENT_RECORD *event, stru
*** 327,331 ****
       to honor them later since that leads to significant slop in
       cursor motion when the system is under heavy load.  */
!   
    map = map_virt_key[event->wVirtualKeyCode];
    if (map == -1)
--- 319,323 ----
       to honor them later since that leads to significant slop in
       cursor motion when the system is under heavy load.  */
! 
    map = map_virt_key[event->wVirtualKeyCode];
    if (map == -1)
*************** key_event (KEY_EVENT_RECORD *event, stru
*** 337,347 ****
        /* ASCII */
        emacs_ev->kind = ascii_keystroke;
!       win32_kbd_patch_key (event);
        XSETINT (emacs_ev->code, event->uChar.AsciiChar);
      }
    else
      {
        /* non-ASCII */
        emacs_ev->kind = non_ascii_keystroke;
        /*
         * make_lispy_event () now requires non-ascii codes to have
--- 329,362 ----
        /* ASCII */
        emacs_ev->kind = ascii_keystroke;
!       key_flag = win32_kbd_patch_key (event); /* 95.7.25 by himi */
!       if (key_flag == 0) 
! 	return 0;
        XSETINT (emacs_ev->code, event->uChar.AsciiChar);
      }
+ #ifdef MULE
+   /* for IME */
+   else if (map == -3)
+     {
+       if ((event->dwControlKeyState & NLS_IME_CONVERSION)
+ 	  && !(event->dwControlKeyState & RIGHT_ALT_PRESSED)
+ 	  && !(event->dwControlKeyState & LEFT_ALT_PRESSED)
+ 	  && !(event->dwControlKeyState & RIGHT_CTRL_PRESSED)
+ 	  && !(event->dwControlKeyState & LEFT_CTRL_PRESSED))
+ 	{
+ 	  emacs_ev->kind = ascii_keystroke;
+ 	  XSETINT (emacs_ev->code, event->uChar.AsciiChar);
+ 	}
+       else
+ 	return 0;
+     }
+ #endif
    else
      {
        /* non-ASCII */
        emacs_ev->kind = non_ascii_keystroke;
+ #ifdef HAVE_NTGUI
+       /* use Windows keysym map */
+       XSETINT (emacs_ev->code, event->wVirtualKeyCode);
+ #else
        /*
         * make_lispy_event () now requires non-ascii codes to have
*************** key_event (KEY_EVENT_RECORD *event, stru
*** 350,357 ****
--- 365,379 ----
        map |= 0xff00;
        XSETINT (emacs_ev->code, map);
+ #endif /* HAVE_NTGUI */
      }
+ /* for Mule 2.2 (Based on Emacs 19.28) */
+ #ifdef MULE
+   XSET (emacs_ev->frame_or_window, Lisp_Frame, get_frame ());
+ #else
    XSETFRAME (emacs_ev->frame_or_window, get_frame ());
+ #endif
    emacs_ev->modifiers = win32_kbd_mods_to_emacs (event->dwControlKeyState);
    emacs_ev->timestamp = GetTickCount ();
+   if (key_flag == 2) return -1; /* 95.7.25 by himi */
    return 1;
  }
*************** key_event (KEY_EVENT_RECORD *event, stru
*** 360,364 ****
--- 382,388 ----
  void 
  win32_mouse_position (FRAME_PTR *f,
+ #ifndef MULE
  		      int insist,
+ #endif
  		      Lisp_Object *bar_window,
  		      enum scroll_bar_part *part,
*************** win32_mouse_position (FRAME_PTR *f,
*** 368,373 ****
  {
    BLOCK_INPUT;
!   
    insist = insist;
  
    *f = get_frame ();
--- 392,399 ----
  {
    BLOCK_INPUT;
! 
! #ifndef MULE  
    insist = insist;
+ #endif
  
    *f = get_frame ();
*************** do_mouse_event (MOUSE_EVENT_RECORD *even
*** 459,463 ****
--- 485,494 ----
    XSETFASTINT (emacs_ev->x, event->dwMousePosition.X);
    XSETFASTINT (emacs_ev->y, event->dwMousePosition.Y);
+ /* for Mule 2.2 (Based on Emacs 19.28 */
+ #ifdef MULE
+   XSET (emacs_ev->frame_or_window, Lisp_Frame, get_frame ());
+ #else
    XSETFRAME (emacs_ev->frame_or_window, get_frame ());
+ #endif
    
    return 1;
*************** win32_read_socket (int sd, struct input_
*** 507,510 ****
--- 538,546 ----
              case KEY_EVENT:
  	      add = key_event (&queue_ptr->Event.KeyEvent, bufp);
+ 	      if (add == -1) /* 95.7.25 by himi */
+ 		{ 
+ 		  queue_ptr--;
+ 		  add = 1;
+ 		}
  	      bufp += add;
  	      ret += add;
diff -2rcpP --exclude=*.elc emacs-19.30/src/ntinevt.h emacs-19.31/src/ntinevt.h
*** emacs-19.30/src/ntinevt.h	Tue Apr 11 22:24:07 1995
--- emacs-19.31/src/ntinevt.h	Mon Jan 15 04:06:29 1996
***************
*** 2,20 ****
     Copyright (C) 1995 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.  */
  
  #ifndef __NTINEVT_H__
--- 2,21 ----
     Copyright (C) 1995 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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  #ifndef __NTINEVT_H__
diff -2rcpP --exclude=*.elc emacs-19.30/src/ntproc.c emacs-19.31/src/ntproc.c
*** emacs-19.30/src/ntproc.c	Tue Nov  7 02:09:49 1995
--- emacs-19.31/src/ntproc.c	Fri May 17 17:39:24 1996
***************
*** 2,20 ****
     Copyright (C) 1992, 1995 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.
  
     Drew Bliss                   Oct 14, 1993
--- 2,21 ----
     Copyright (C) 1992, 1995 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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.
  
     Drew Bliss                   Oct 14, 1993
***************
*** 22,33 ****
  */
  
- #include <config.h>
- 
  #include <stdio.h>
  #include <stdlib.h>
  #include <errno.h>
  #include <io.h>
  #include <signal.h>
  
  #include <windows.h>
  
--- 23,41 ----
  */
  
  #include <stdio.h>
  #include <stdlib.h>
  #include <errno.h>
  #include <io.h>
+ #include <fcntl.h>
  #include <signal.h>
  
+ /* must include CRT headers *before* config.h */
+ #include "config.h"
+ #undef signal
+ #undef wait
+ #undef spawnve
+ #undef select
+ #undef kill
+ 
  #include <windows.h>
  
***************
*** 35,65 ****
  #include "nt.h"
  #include "systime.h"
  
! /* #define FULL_DEBUG */
! 
! typedef void (_CALLBACK_ *signal_handler)(int);
! 
! /* Defined in process.h which conflicts with the local copy */
! #define	_P_NOWAIT 1
  
! typedef struct _child_process
! {
!   int fd;
!   HANDLE char_avail;
!   HANDLE char_consumed;
!   char chr;
!   BOOL status;
!   HANDLE process;
!   DWORD pid;
!   HANDLE thrd;
! } child_process;
! 
! #define MAX_CHILDREN MAXDESC
  
  #ifdef EMACSDEBUG
! void _CRTAPI1
! _DebPrint (char *fmt, ...)
  {
!   char buf[256];
    va_list args;
  
--- 43,74 ----
  #include "nt.h"
  #include "systime.h"
+ #include "syswait.h"
+ #include "process.h"
  
! /* Control whether spawnve quotes arguments as necessary to ensure
!    correct parsing by child process.  Because not all uses of spawnve
!    are careful about constructing argv arrays, we make this behaviour
!    conditional (off by default). */
! Lisp_Object Vwin32_quote_process_args;
! 
! /* Time to sleep before reading from a subprocess output pipe - this
!    avoids the inefficiency of frequently reading small amounts of data.
!    This is primarily necessary for handling DOS processes on Windows 95,
!    but is useful for Win32 processes on both Win95 and NT as well.  */
! Lisp_Object Vwin32_pipe_read_delay;
! 
! /* Keep track of whether we have already started a DOS program, and
!    whether we can run them in the first place. */
! BOOL can_run_dos_process;
! BOOL dos_process_running;
  
! #ifndef SYS_SIGLIST_DECLARED
! extern char *sys_siglist[];
! #endif
  
  #ifdef EMACSDEBUG
! void _DebPrint (const char *fmt, ...)
  {
!   char buf[1024];
    va_list args;
  
*************** _DebPrint (char *fmt, ...)
*** 71,81 ****
  #endif
  
! /* Child process management list.  */
! static int child_proc_count = 0;
! static child_process child_procs[MAX_CHILDREN];
! static child_process *dead_child = NULL;
! 
! #define CHILD_ACTIVE(cp) ((cp)->process != NULL)
! #define DEACTIVATE_CHILD(cp) ((cp)->process = NULL)
  
  /* Signal handlers...SIG_DFL == 0 so this is initialized correctly.  */
--- 80,84 ----
  #endif
  
! typedef void (_CALLBACK_ *signal_handler)(int);
  
  /* Signal handlers...SIG_DFL == 0 so this is initialized correctly.  */
*************** static signal_handler sig_handlers[NSIG]
*** 84,88 ****
  /* Fake signal implementation to record the SIGCHLD handler.  */
  signal_handler 
! win32_signal (int sig, signal_handler handler)
  {
    signal_handler old;
--- 87,91 ----
  /* Fake signal implementation to record the SIGCHLD handler.  */
  signal_handler 
! sys_signal (int sig, signal_handler handler)
  {
    signal_handler old;
*************** win32_signal (int sig, signal_handler ha
*** 98,114 ****
  }
  
  /* Find an unused process slot.  */
! static child_process *
  new_child (void)
  {
    child_process *cp;
!   
!   if (child_proc_count == MAX_CHILDREN)
!     return NULL;
    
    for (cp = child_procs+(child_proc_count-1); cp >= child_procs; cp--)
      if (!CHILD_ACTIVE (cp))
!       return cp;
!   return &child_procs[child_proc_count++];
  }
  
--- 101,207 ----
  }
  
+ /* Defined in <process.h> which conflicts with the local copy */
+ #define _P_NOWAIT 1
+ 
+ /* Child process management list.  */
+ int child_proc_count = 0;
+ child_process child_procs[ MAX_CHILDREN ];
+ child_process *dead_child = NULL;
+ 
+ DWORD WINAPI reader_thread (void *arg);
+ 
  /* Find an unused process slot.  */
! child_process *
  new_child (void)
  {
    child_process *cp;
!   DWORD id;
    
    for (cp = child_procs+(child_proc_count-1); cp >= child_procs; cp--)
      if (!CHILD_ACTIVE (cp))
!       goto Initialise;
!   if (child_proc_count == MAX_CHILDREN)
!     return NULL;
!   cp = &child_procs[child_proc_count++];
! 
!  Initialise:
!   memset (cp, 0, sizeof(*cp));
!   cp->fd = -1;
!   cp->pid = -1;
!   cp->procinfo.hProcess = NULL;
!   cp->status = STATUS_READ_ERROR;
! 
!   /* use manual reset event so that select() will function properly */
!   cp->char_avail = CreateEvent (NULL, TRUE, FALSE, NULL);
!   if (cp->char_avail)
!     {
!       cp->char_consumed = CreateEvent (NULL, FALSE, FALSE, NULL);
!       if (cp->char_consumed)
!         {
! 	  cp->thrd = CreateThread (NULL, 1024, reader_thread, cp, 0, &id);
! 	  if (cp->thrd)
! 	    return cp;
! 	}
!     }
!   delete_child (cp);
!   return NULL;
! }
! 
! void 
! delete_child (child_process *cp)
! {
!   int i;
! 
!   /* Should not be deleting a child that is still needed. */
!   for (i = 0; i < MAXDESC; i++)
!     if (fd_info[i].cp == cp)
!       abort ();
! 
!   if (!CHILD_ACTIVE (cp))
!     return;
! 
!   /* reap thread if necessary */
!   if (cp->thrd)
!     {
!       DWORD rc;
! 
!       if (GetExitCodeThread (cp->thrd, &rc) && rc == STILL_ACTIVE)
!         {
! 	  /* let the thread exit cleanly if possible */
! 	  cp->status = STATUS_READ_ERROR;
! 	  SetEvent (cp->char_consumed);
! 	  if (WaitForSingleObject (cp->thrd, 1000) != WAIT_OBJECT_0)
! 	    {
! 	      DebPrint (("delete_child.WaitForSingleObject (thread) failed "
! 			 "with %lu for fd %ld\n", GetLastError (), cp->fd));
! 	      TerminateThread (cp->thrd, 0);
! 	    }
! 	}
!       CloseHandle (cp->thrd);
!       cp->thrd = NULL;
!     }
!   if (cp->char_avail)
!     {
!       CloseHandle (cp->char_avail);
!       cp->char_avail = NULL;
!     }
!   if (cp->char_consumed)
!     {
!       CloseHandle (cp->char_consumed);
!       cp->char_consumed = NULL;
!     }
! 
!   /* update child_proc_count (highest numbered slot in use plus one) */
!   if (cp == child_procs + child_proc_count - 1)
!     {
!       for (i = child_proc_count-1; i >= 0; i--)
! 	if (CHILD_ACTIVE (&child_procs[i]))
! 	  {
! 	    child_proc_count = i + 1;
! 	    break;
! 	  }
!     }
!   if (i < 0)
!     child_proc_count = 0;
  }
  
*************** find_child_pid (DWORD pid)
*** 118,122 ****
  {
    child_process *cp;
!   
    for (cp = child_procs+(child_proc_count-1); cp >= child_procs; cp--)
      if (CHILD_ACTIVE (cp) && pid == cp->pid)
--- 211,215 ----
  {
    child_process *cp;
! 
    for (cp = child_procs+(child_proc_count-1); cp >= child_procs; cp--)
      if (CHILD_ACTIVE (cp) && pid == cp->pid)
*************** find_child_pid (DWORD pid)
*** 125,146 ****
  }
  
- /* Find a child by fd.  */
- static child_process *
- find_child_fd (int fd)
- {
-   child_process *cp;
-   
-   for (cp = child_procs+(child_proc_count-1); cp >= child_procs; cp--)
-     if (CHILD_ACTIVE (cp) && fd == cp->fd)
-       return cp;
-   return NULL;
- }
  
! /* Thread proc for child process reader threads
!    The threads just sit in a loop waiting for input
!    When they detect input, they signal the char_avail input to
!    wake up the select emulator
!    When the select emulator processes their input, it pulses
!    char_consumed so that the reader thread goes back to reading.  */
  DWORD WINAPI 
  reader_thread (void *arg)
--- 218,226 ----
  }
  
  
! /* Thread proc for child process and socket reader threads. Each thread
!    is normally blocked until woken by select() to check for input by
!    reading one char.  When the read completes, char_avail is signalled
!    to wake up the select emulator and the thread blocks itself again. */
  DWORD WINAPI 
  reader_thread (void *arg)
*************** reader_thread (void *arg)
*** 152,186 ****
    
    /* We have to wait for the go-ahead before we can start */
!   if (WaitForSingleObject (cp->char_consumed, INFINITE) != WAIT_OBJECT_0)
!     return 0;
!   /* If something went wrong, quit */
!   if (!cp->status)
!     return 0;
!   
    for (;;)
      {
!       /* Use read to get CRLF translation */
!       if (read (cp->fd, &cp->chr, sizeof (char)) == sizeof (char))
!         {
! 	  cp->status = TRUE;
!         }
!       else
!         {
! #ifdef FULL_DEBUG
! 	  DebPrint (("reader_thread.read failed with %lu for fd %ld\n",
! 		     GetLastError (), cp->fd));
! #endif
! 	  cp->status = FALSE;
!         }
!         
        if (!SetEvent (cp->char_avail))
          {
  	  DebPrint (("reader_thread.SetEvent failed with %lu for fd %ld\n",
  		     GetLastError (), cp->fd));
! 	  break;
!         }
          
        /* If the read died, the child has died so let the thread die */
!       if (!cp->status)
  	break;
          
--- 232,259 ----
    
    /* We have to wait for the go-ahead before we can start */
!   if (cp == NULL ||
!       WaitForSingleObject (cp->char_consumed, INFINITE) != WAIT_OBJECT_0)
!     return 1;
! 
    for (;;)
      {
!       int rc;
! 
!       rc = _sys_read_ahead (cp->fd);
! 
!       /* The name char_avail is a misnomer - it really just means the
! 	 read-ahead has completed, whether successfully or not. */
        if (!SetEvent (cp->char_avail))
          {
  	  DebPrint (("reader_thread.SetEvent failed with %lu for fd %ld\n",
  		     GetLastError (), cp->fd));
! 	  return 1;
! 	}
! 
!       if (rc == STATUS_READ_ERROR)
! 	return 1;
          
        /* If the read died, the child has died so let the thread die */
!       if (rc == STATUS_READ_FAILED)
  	break;
          
*************** reader_thread (void *arg)
*** 198,226 ****
  static BOOL 
  create_child (char *exe, char *cmdline, char *env,
! 	     PROCESS_INFORMATION *info)
  {
-   child_process *cp;
-   DWORD id;
    STARTUPINFO start;
    SECURITY_ATTRIBUTES sec_attrs;
    SECURITY_DESCRIPTOR sec_desc;
    
!   cp = new_child ();
!   if (cp == NULL)
!     goto EH_Fail;
!   
!   cp->fd = -1;
!   
!   cp->char_avail = CreateEvent (NULL, FALSE, FALSE, NULL);
!   if (cp->char_avail == NULL)
!     goto EH_Fail;
!   
!   cp->char_consumed = CreateEvent (NULL, FALSE, FALSE, NULL);
!   if (cp->char_consumed == NULL)
!     goto EH_char_avail;
!   
!   cp->thrd = CreateThread (NULL, 1024, reader_thread, cp, 0, &id);
!   if (cp->thrd == NULL)
!     goto EH_char_consumed;
    
    memset (&start, 0, sizeof (start));
--- 271,281 ----
  static BOOL 
  create_child (char *exe, char *cmdline, char *env,
! 	      int * pPid, child_process *cp)
  {
    STARTUPINFO start;
    SECURITY_ATTRIBUTES sec_attrs;
    SECURITY_DESCRIPTOR sec_desc;
    
!   if (cp == NULL) abort ();
    
    memset (&start, 0, sizeof (start));
*************** create_child (char *exe, char *cmdline, 
*** 238,244 ****
    /* Explicitly specify no security */
    if (!InitializeSecurityDescriptor (&sec_desc, SECURITY_DESCRIPTOR_REVISION))
!     goto EH_thrd;
    if (!SetSecurityDescriptorDacl (&sec_desc, TRUE, NULL, FALSE))
!     goto EH_thrd;
    sec_attrs.nLength = sizeof (sec_attrs);
    sec_attrs.lpSecurityDescriptor = &sec_desc;
--- 293,299 ----
    /* Explicitly specify no security */
    if (!InitializeSecurityDescriptor (&sec_desc, SECURITY_DESCRIPTOR_REVISION))
!     goto EH_Fail;
    if (!SetSecurityDescriptorDacl (&sec_desc, TRUE, NULL, FALSE))
!     goto EH_Fail;
    sec_attrs.nLength = sizeof (sec_attrs);
    sec_attrs.lpSecurityDescriptor = &sec_desc;
*************** create_child (char *exe, char *cmdline, 
*** 246,267 ****
    
    if (!CreateProcess (exe, cmdline, &sec_attrs, NULL, TRUE,
! 		      CREATE_NEW_PROCESS_GROUP, env, NULL,
! 		      &start, info))
!     goto EH_thrd;
!   cp->process = info->hProcess;
!   cp->pid = info->dwProcessId;
    
    return TRUE;
    
-  EH_thrd:
-   id = GetLastError ();
-   
-   cp->status = FALSE;
-   SetEvent (cp->char_consumed);
-  EH_char_consumed:
-   CloseHandle (cp->char_consumed);
-  EH_char_avail:
-   CloseHandle (cp->char_avail);
   EH_Fail:
    return FALSE;
  }
--- 301,325 ----
    
    if (!CreateProcess (exe, cmdline, &sec_attrs, NULL, TRUE,
! 		      CREATE_NEW_PROCESS_GROUP,
! 		      env, NULL,
! 		      &start, &cp->procinfo))
!     goto EH_Fail;
! 
!   cp->pid = (int) cp->procinfo.dwProcessId;
! 
!   /* Hack for Windows 95, which assigns large (ie negative) pids */
!   if (cp->pid < 0)
!     cp->pid = -cp->pid;
! 
!   /* pid must fit in a Lisp_Int */
!   cp->pid = (cp->pid & VALMASK);
! 
! 
!   *pPid = cp->pid;
    
    return TRUE;
    
   EH_Fail:
+   DebPrint (("create_child.CreateProcess failed: %ld\n", GetLastError()););
    return FALSE;
  }
*************** register_child (int pid, int fd)
*** 289,300 ****
    
    cp->fd = fd;
-   cp->status = TRUE;
  
!   /* Tell the reader thread to start */
!   if (!SetEvent (cp->char_consumed))
      {
!       DebPrint (("register_child.SetEvent failed with %lu for fd %ld\n",
! 		 GetLastError (), cp->fd));
      }
  }
  
--- 347,363 ----
    
    cp->fd = fd;
  
!   /* thread is initially blocked until select is called; set status so
!      that select will release thread */
!   cp->status = STATUS_READ_ACKNOWLEDGED;
! 
!   /* attach child_process to fd_info */
!   if (fd_info[fd].cp != NULL)
      {
!       DebPrint (("register_child: fd_info[%d] apparently in use!\n", fd));
!       abort ();
      }
+ 
+   fd_info[fd].cp = cp;
  }
  
*************** register_child (int pid, int fd)
*** 304,328 ****
     Since the thread signaled failure we can assume it is exiting.  */
  static void 
! remove_child (child_process *cp)
  {
!   /* Reap the thread */
!   if (WaitForSingleObject (cp->thrd, INFINITE) != WAIT_OBJECT_0)
      {
!       DebPrint (("remove_child.WaitForSingleObject (thread) failed "
! 		 "with %lu for fd %ld\n", GetLastError (), cp->fd));
!     }
!   CloseHandle (cp->thrd);
!   CloseHandle (cp->char_consumed);
!   CloseHandle (cp->char_avail);
!   
!   /* Reap the process */
!   if (WaitForSingleObject (cp->process, INFINITE) != WAIT_OBJECT_0)
!     {
!       DebPrint (("remove_child.WaitForSingleObject (process) failed "
! 		 "with %lu for fd %ld\n", GetLastError (), cp->fd));
!     }
!   CloseHandle (cp->process);
!   
!   DEACTIVATE_CHILD (cp);
  }
  
--- 367,395 ----
     Since the thread signaled failure we can assume it is exiting.  */
  static void 
! reap_subprocess (child_process *cp)
  {
!   if (cp->procinfo.hProcess)
      {
!       /* Reap the process */
!       if (WaitForSingleObject (cp->procinfo.hProcess, INFINITE) != WAIT_OBJECT_0)
! 	DebPrint (("reap_subprocess.WaitForSingleObject (process) failed "
! 		   "with %lu for fd %ld\n", GetLastError (), cp->fd));
!       CloseHandle (cp->procinfo.hProcess);
!       cp->procinfo.hProcess = NULL;
!       CloseHandle (cp->procinfo.hThread);
!       cp->procinfo.hThread = NULL;
! 
!       /* If this was a DOS process, indicate that it is now safe to
! 	 start a new one. */
!       if (cp->is_dos_process)
! 	dos_process_running = FALSE;
!     }
! 
!   /* For asynchronous children, the child_proc resources will be freed
!      when the last pipe read descriptor is closed; for synchronous
!      children, we must explicitly free the resources now because
!      register_child has not been called. */
!   if (cp->fd == -1)
!     delete_child (cp);
  }
  
*************** remove_child (child_process *cp)
*** 331,343 ****
     Return the pid and fill in the status if non-NULL.  */
  
- /* From callproc.c */
- extern int synch_process_alive;
- extern int synch_process_retcode;
- 
  int 
! win32_wait (int *status)
  {
    DWORD active, retval;
    int nh;
    child_process *cp, *cps[MAX_CHILDREN];
    HANDLE wait_hnd[MAX_CHILDREN];
--- 398,407 ----
     Return the pid and fill in the status if non-NULL.  */
  
  int 
! sys_wait (int *status)
  {
    DWORD active, retval;
    int nh;
+   int pid;
    child_process *cp, *cps[MAX_CHILDREN];
    HANDLE wait_hnd[MAX_CHILDREN];
*************** win32_wait (int *status)
*** 347,352 ****
      {
        /* We want to wait for a specific child */
!       wait_hnd[nh] = dead_child->process;
        cps[nh] = dead_child;
        nh++;
      }
--- 411,417 ----
      {
        /* We want to wait for a specific child */
!       wait_hnd[nh] = dead_child->procinfo.hProcess;
        cps[nh] = dead_child;
+       if (!wait_hnd[nh]) abort ();
        nh++;
      }
*************** win32_wait (int *status)
*** 354,361 ****
      {
        for (cp = child_procs+(child_proc_count-1); cp >= child_procs; cp--)
! 	if (CHILD_ACTIVE (cp))
  	  {
! 	    wait_hnd[nh] = cp->process;
  	    cps[nh] = cp;
  	    nh++;
  	  }
--- 419,428 ----
      {
        for (cp = child_procs+(child_proc_count-1); cp >= child_procs; cp--)
! 	/* some child_procs might be sockets; ignore them */
! 	if (CHILD_ACTIVE (cp) && cp->procinfo.hProcess)
  	  {
! 	    wait_hnd[nh] = cp->procinfo.hProcess;
  	    cps[nh] = cp;
+ 	    if (!wait_hnd[nh]) abort ();
  	    nh++;
  	  }
*************** win32_wait (int *status)
*** 407,411 ****
  
    /* Massage the exit code from the process to match the format expected
!      by the WIFSTOPPED et al macros in syswait.h.  Only WIFSIGNALLED and
       WIFEXITED are supported; WIFSTOPPED doesn't make sense under NT.  */
  
--- 474,478 ----
  
    /* Massage the exit code from the process to match the format expected
!      by the WIFSTOPPED et al macros in syswait.h.  Only WIFSIGNALED and
       WIFEXITED are supported; WIFSTOPPED doesn't make sense under NT.  */
  
*************** win32_wait (int *status)
*** 414,419 ****
    else
      retval <<= 8;
! 
    cp = cps[active];
  
    if (status)
--- 481,490 ----
    else
      retval <<= 8;
!   
    cp = cps[active];
+   pid = cp->pid;
+ #ifdef FULL_DEBUG
+   DebPrint (("Wait signaled with process pid %d\n", cp->pid));
+ #endif
  
    if (status)
*************** win32_wait (int *status)
*** 424,438 ****
      {
        synch_process_alive = 0;
-       synch_process_retcode = retval;
  
!       TerminateThread (cp->thrd, 0);
!       CloseHandle (cp->thrd);
!       CloseHandle (cp->char_consumed);
!       CloseHandle (cp->char_avail);
!       CloseHandle (cp->process);
!       DEACTIVATE_CHILD (cp);
      }
    
!   return cp->pid;
  }
  
--- 495,570 ----
      {
        synch_process_alive = 0;
  
!       /* Report the status of the synchronous process.  */
!       if (WIFEXITED (retval))
! 	synch_process_retcode = WRETCODE (retval);
!       else if (WIFSIGNALED (retval))
! 	{
! 	  int code = WTERMSIG (retval);
! 	  char *signame = 0;
! 	  
! 	  if (code < NSIG)
! 	    {
! 	      /* Suppress warning if the table has const char *.  */
! 	      signame = (char *) sys_siglist[code];
! 	    }
! 	  if (signame == 0)
! 	    signame = "unknown";
! 
! 	  synch_process_death = signame;
! 	}
! 
!       reap_subprocess (cp);
      }
    
!   return pid;
! }
! 
! int
! win32_is_dos_binary (char * filename)
! {
!   IMAGE_DOS_HEADER dos_header;
!   DWORD signature;
!   int fd;
!   int is_dos_binary = FALSE;
! 
!   fd = open (filename, O_RDONLY | O_BINARY, 0);
!   if (fd >= 0)
!     {
!       char * p = strrchr (filename, '.');
! 
!       /* We can only identify DOS .com programs from the extension. */
!       if (p && stricmp (p, ".com") == 0)
! 	is_dos_binary = TRUE;
!       else if (p && stricmp (p, ".bat") == 0)
! 	{
! 	  /* A DOS shell script - it appears that CreateProcess is happy
! 	     to accept this (somewhat surprisingly); presumably it looks
! 	     at COMSPEC to determine what executable to actually invoke.
! 	     Therefore, we have to do the same here as well. */
! 	  p = getenv ("COMSPEC");
! 	  if (p)
! 	    is_dos_binary = win32_is_dos_binary (p);
! 	}
!       else
! 	{
! 	  /* Look for DOS .exe signature - if found, we must also check
! 	     that it isn't really a 16- or 32-bit Windows exe, since
! 	     both formats start with a DOS program stub.  Note that
! 	     16-bit Windows executables use the OS/2 1.x format. */
! 	  if (read (fd, &dos_header, sizeof (dos_header)) == sizeof (dos_header)
! 	      && dos_header.e_magic == IMAGE_DOS_SIGNATURE
! 	      && lseek (fd, dos_header.e_lfanew, SEEK_SET) != -1)
! 	    {
! 	      if (read (fd, &signature, sizeof (signature)) != sizeof (signature)
! 		  || (signature != IMAGE_NT_SIGNATURE &&
! 		      LOWORD (signature) != IMAGE_OS2_SIGNATURE))
! 		is_dos_binary = TRUE;
! 	    }
! 	}
!       close (fd);
!     }
! 
!   return is_dos_binary;
  }
  
*************** char ppid_env_var_buffer[64];
*** 444,453 ****
     so intercept spawn requests.  */
  int 
! win32_spawnve (int mode, char *cmdname, char **argv, char **envp)
  {
    Lisp_Object program, full;
    char *cmdline, *env, *parg, **targ;
    int arglen;
!   PROCESS_INFORMATION pi;
  
    /* Handle executable names without an executable suffix.  */
--- 576,594 ----
     so intercept spawn requests.  */
  int 
! sys_spawnve (int mode, char *cmdname, char **argv, char **envp)
  {
    Lisp_Object program, full;
    char *cmdline, *env, *parg, **targ;
    int arglen;
!   int pid;
!   child_process *cp;
!   int is_dos_binary;
!   
!   /* We don't care about the other modes */
!   if (mode != _P_NOWAIT)
!     {
!       errno = EINVAL;
!       return -1;
!     }
  
    /* Handle executable names without an executable suffix.  */
*************** win32_spawnve (int mode, char *cmdname, 
*** 470,483 ****
      }
  
!   if (child_proc_count == MAX_CHILDREN)
      {
!       errno = EAGAIN;
!       return -1;
!     }
!   
!   /* We don't care about the other modes */
!   if (mode != _P_NOWAIT)
!     {
!       errno = EINVAL;
        return -1;
      }
--- 611,625 ----
      }
  
!   /* make sure cmdname is in DOS format */
!   strcpy (cmdname = alloca (strlen (cmdname) + 1), argv[0]);
!   unixtodos_filename (cmdname);
!   argv[0] = cmdname;
! 
!   /* Check if program is a DOS executable, and if so whether we are
!      allowed to start it. */
!   is_dos_binary = win32_is_dos_binary (cmdname);
!   if (is_dos_binary && (!can_run_dos_process || dos_process_running))
      {
!       errno = (can_run_dos_process) ? EAGAIN : EINVAL;
        return -1;
      }
*************** win32_spawnve (int mode, char *cmdname, 
*** 487,490 ****
--- 629,641 ----
       terminated list of parameters, and envp is a null
       separated/double-null terminated list of parameters.
+ 
+      Additionally, zero-length args and args containing whitespace need
+      to be wrapped in double quotes.  Args containing embedded double
+      quotes (as opposed to enclosing quotes, which we leave alone) are
+      usually illegal (most Win32 programs do not implement escaping of
+      double quotes - sad but true, at least for programs compiled with
+      MSVC), but we will escape quotes anyway for those programs that can
+      handle it.  The Win32 gcc library from Cygnus doubles quotes to
+      escape them, so we will use that convention.
     
       Since I have no idea how large argv and envp are likely to be
*************** win32_spawnve (int mode, char *cmdname, 
*** 496,514 ****
    while (*targ)
      {
        arglen += strlen (*targ++) + 1;
      }
!   cmdline = malloc (arglen);
!   if (cmdline == NULL)
!     {
!       errno = ENOMEM;
!       goto EH_Fail;
!     }
    targ = argv;
    parg = cmdline;
    while (*targ)
      {
!       strcpy (parg, *targ);
!       parg += strlen (*targ++);
        *parg++ = ' ';
      }
    *--parg = '\0';
--- 647,715 ----
    while (*targ)
      {
+       char * p = *targ;
+       int add_quotes = 0;
+ 
+       if (*p == 0)
+ 	add_quotes = 1;
+       while (*p)
+ 	if (*p++ == '"')
+ 	  {
+ 	    /* allow for embedded quotes to be doubled - we won't
+ 	       actually double quotes that aren't embedded though */
+ 	    arglen++;
+ 	    add_quotes = 1;
+ 	  }
+       else if (*p == ' ' || *p == '\t')
+ 	add_quotes = 1;
+       if (add_quotes)
+ 	arglen += 2;
        arglen += strlen (*targ++) + 1;
      }
!   cmdline = alloca (arglen);
    targ = argv;
    parg = cmdline;
    while (*targ)
      {
!       char * p = *targ;
!       int add_quotes = 0;
! 
!       if (*p == 0)
! 	add_quotes = 1;
! 
!       if (!NILP (Vwin32_quote_process_args))
! 	{
! 	  /* This is conditional because it sometimes causes more
! 	     problems than it solves, since argv arrays are not always
! 	     carefully constructed.  M-x grep, for instance, passes the
! 	     whole command line as one argument, so it becomes
! 	     impossible to pass a regexp which contains spaces. */
! 	  for ( ; *p; p++)
! 	    if (*p == ' ' || *p == '\t' || *p == '"')
! 	      add_quotes = 1;
! 	}
!       if (add_quotes)
! 	{
! 	  char * first;
! 	  char * last;
! 
! 	  p = *targ;
! 	  first = p;
! 	  last = p + strlen (p) - 1;
! 	  *parg++ = '"';
! 	  while (*p)
! 	    {
! 	      if (*p == '"' && p > first && p < last)
! 		*parg++ = '"';	/* double up embedded quotes only */
! 	      *parg++ = *p++;
! 	    }
! 	  *parg++ = '"';
! 	}
!       else
! 	{
! 	  strcpy (parg, *targ);
! 	  parg += strlen (*targ);
! 	}
        *parg++ = ' ';
+       targ++;
      }
    *--parg = '\0';
*************** win32_spawnve (int mode, char *cmdname, 
*** 525,534 ****
    arglen += strlen (ppid_env_var_buffer) + 1;
  
!   env = malloc (arglen);
!   if (env == NULL)
!     {
!       errno = ENOMEM;
!       goto EH_cmdline;
!     }
    targ = envp;
    parg = env;
--- 726,730 ----
    arglen += strlen (ppid_env_var_buffer) + 1;
  
!   env = alloca (arglen);
    targ = envp;
    parg = env;
*************** win32_spawnve (int mode, char *cmdname, 
*** 543,562 ****
    *parg++ = '\0';
    *parg = '\0';
    
    /* Now create the process.  */
!   if (!create_child (cmdname, cmdline, env, &pi))
      {
        errno = ENOEXEC;
!       goto EH_env;
      }
    
!   return pi.dwProcessId;
!   
!  EH_env:
!   free (env);
!  EH_cmdline:
!   free (cmdline);
!  EH_Fail:
!   return -1;
  }
  
--- 739,765 ----
    *parg++ = '\0';
    *parg = '\0';
+ 
+   cp = new_child ();
+   if (cp == NULL)
+     {
+       errno = EAGAIN;
+       return -1;
+     }
    
    /* Now create the process.  */
!   if (!create_child (cmdname, cmdline, env, &pid, cp))
      {
+       delete_child (cp);
        errno = ENOEXEC;
!       return -1;
!     }
! 
!   if (is_dos_binary)
!     {
!       cp->is_dos_process = TRUE;
!       dos_process_running = TRUE;
      }
    
!   return pid;
  }
  
*************** sys_select (int nfds, SELECT_TYPE *rfds,
*** 579,596 ****
    int i, nh, nr;
    DWORD active;
!   child_process *cp, *cps[MAX_CHILDREN + 1];
!   HANDLE wait_hnd[MAX_CHILDREN + 1];
! #ifdef HAVE_NTGUI1
!   BOOL keyboardwait = FALSE ;
! #endif /* HAVE_NTGUI */
    
    /* If the descriptor sets are NULL but timeout isn't, then just Sleep.  */
    if (rfds == NULL && wfds == NULL && efds == NULL && timeout != NULL) 
      {
- #ifdef HAVE_TIMEVAL
        Sleep (timeout->tv_sec * 1000 + timeout->tv_usec / 1000);
- #else
-       Sleep ((*timeout) * 1000);
- #endif
        return 0;
      }
--- 782,793 ----
    int i, nh, nr;
    DWORD active;
!   child_process *cp;
!   HANDLE wait_hnd[MAXDESC];
!   int fdindex[MAXDESC];   /* mapping from wait handles back to descriptors */
    
    /* If the descriptor sets are NULL but timeout isn't, then just Sleep.  */
    if (rfds == NULL && wfds == NULL && efds == NULL && timeout != NULL) 
      {
        Sleep (timeout->tv_sec * 1000 + timeout->tv_usec / 1000);
        return 0;
      }
*************** sys_select (int nfds, SELECT_TYPE *rfds,
*** 614,625 ****
  	if (i == 0)
  	  {
! #ifdef HAVE_NTGUI1
! 	    keyboardwait = TRUE ;
! #else
! 	    /* Handle stdin specially */
! 	    wait_hnd[nh] = keyboard_handle;
! 	    cps[nh] = NULL;
! 	    nh++;
! #endif /* HAVE_NTGUI */
  
  	    /* Check for any emacs-generated input in the queue since
--- 811,821 ----
  	if (i == 0)
  	  {
! 	    if (keyboard_handle)
! 	      {
! 		/* Handle stdin specially */
! 		wait_hnd[nh] = keyboard_handle;
! 		fdindex[nh] = i;
! 		nh++;
! 	      }
  
  	    /* Check for any emacs-generated input in the queue since
*************** sys_select (int nfds, SELECT_TYPE *rfds,
*** 628,678 ****
  	      {
  		FD_SET (i, rfds);
! 		nr++;
  	      }
  	  }
  	else
  	  {
! 	    /* Child process input */
! 	    cp = find_child_fd (i);
  	    if (cp)
  	      {
  #ifdef FULL_DEBUG
  		DebPrint (("select waiting on child %d fd %d\n",
  			   cp-child_procs, i));
  #endif
- 		wait_hnd[nh] = cp->char_avail;
- 		cps[nh] = cp;
- 		nh++;
  	      }
  	    else
  	      {
! 		/* Unable to find something to wait on for this fd, fail */
! 		DebPrint (("select unable to find child process "
! 			   "for fd %ld\n", i));
! 		nh = 0;
! 		break;
  	      }
  	  }
        }
    
-   /* Never do this in win32 since we will not get paint messages */
- 
- #ifndef HAVE_NTGUI1
    /* Nothing to look for, so we didn't find anything */
    if (nh == 0) 
      {
        if (timeout)
- #ifdef HAVE_TIMEVAL
  	Sleep (timeout->tv_sec * 1000 + timeout->tv_usec / 1000);
- #else
- 	Sleep ((*timeout) * 1000);
- #endif
        return 0;
      }
- #endif /* !HAVE_NTGUI */
-   
-   /* Check for immediate return without waiting */
-   if (nr > 0)
-     return nr;
    
    /*
--- 824,904 ----
  	      {
  		FD_SET (i, rfds);
! 		return 1;
  	      }
  	  }
  	else
  	  {
! 	    /* Child process and socket input */
! 	    cp = fd_info[i].cp;
  	    if (cp)
  	      {
+ 		int current_status = cp->status;
+ 
+ 		if (current_status == STATUS_READ_ACKNOWLEDGED)
+ 		  {
+ 		    /* Tell reader thread which file handle to use. */
+ 		    cp->fd = i;
+ 		    /* Wake up the reader thread for this process */
+ 		    cp->status = STATUS_READ_READY;
+ 		    if (!SetEvent (cp->char_consumed))
+ 		      DebPrint (("nt_select.SetEvent failed with "
+ 				 "%lu for fd %ld\n", GetLastError (), i));
+ 		  }
+ 
+ #ifdef CHECK_INTERLOCK
+ 		/* slightly crude cross-checking of interlock between threads */
+ 
+ 		current_status = cp->status;
+ 		if (WaitForSingleObject (cp->char_avail, 0) == WAIT_OBJECT_0)
+ 		  {
+ 		    /* char_avail has been signalled, so status (which may
+ 		       have changed) should indicate read has completed
+ 		       but has not been acknowledged. */
+ 		    current_status = cp->status;
+ 		    if (current_status != STATUS_READ_SUCCEEDED &&
+ 			current_status != STATUS_READ_FAILED)
+ 		      DebPrint (("char_avail set, but read not completed: status %d\n",
+ 				 current_status));
+ 		  }
+ 		else
+ 		  {
+ 		    /* char_avail has not been signalled, so status should
+ 		       indicate that read is in progress; small possibility
+ 		       that read has completed but event wasn't yet signalled
+ 		       when we tested it (because a context switch occurred
+ 		       or if running on separate CPUs). */
+ 		    if (current_status != STATUS_READ_READY &&
+ 			current_status != STATUS_READ_IN_PROGRESS &&
+ 			current_status != STATUS_READ_SUCCEEDED &&
+ 			current_status != STATUS_READ_FAILED)
+ 		      DebPrint (("char_avail reset, but read status is bad: %d\n",
+ 				 current_status));
+ 		  }
+ #endif
+ 		wait_hnd[nh] = cp->char_avail;
+ 		fdindex[nh] = i;
+ 		if (!wait_hnd[nh]) abort ();
+ 		nh++;
  #ifdef FULL_DEBUG
  		DebPrint (("select waiting on child %d fd %d\n",
  			   cp-child_procs, i));
  #endif
  	      }
  	    else
  	      {
! 		/* Unable to find something to wait on for this fd, skip */
! 		DebPrint (("sys_select: fd %ld is invalid! ignoring\n", i));
! 		abort ();
  	      }
  	  }
        }
    
    /* Nothing to look for, so we didn't find anything */
    if (nh == 0) 
      {
        if (timeout)
  	Sleep (timeout->tv_sec * 1000 + timeout->tv_usec / 1000);
        return 0;
      }
    
    /*
*************** sys_select (int nfds, SELECT_TYPE *rfds,
*** 682,701 ****
       will wake up
       */
- #ifdef HAVE_TIMEVAL
    timeout_ms = timeout ? (timeout->tv_sec * 1000 + timeout->tv_usec / 1000) : INFINITE;
! #else
!   timeout_ms = timeout ? *timeout*1000 : INFINITE;
! #endif
! #ifdef HAVE_NTGUI1
!   active = MsgWaitForMultipleObjects (nh, wait_hnd, FALSE, timeout_ms,QS_ALLINPUT);
! #else
    active = WaitForMultipleObjects (nh, wait_hnd, FALSE, timeout_ms);
! #endif /* HAVE_NTGUI */
    if (active == WAIT_FAILED)
      {
        DebPrint (("select.WaitForMultipleObjects (%d, %lu) failed with %lu\n",
  		 nh, timeout_ms, GetLastError ()));
!       /* Is there a better error? */
!       errno = EBADF;
        return -1;
      }
--- 908,924 ----
       will wake up
       */
    timeout_ms = timeout ? (timeout->tv_sec * 1000 + timeout->tv_usec / 1000) : INFINITE;
! 
    active = WaitForMultipleObjects (nh, wait_hnd, FALSE, timeout_ms);
! 
    if (active == WAIT_FAILED)
      {
        DebPrint (("select.WaitForMultipleObjects (%d, %lu) failed with %lu\n",
  		 nh, timeout_ms, GetLastError ()));
!       /* don't return EBADF - this causes wait_reading_process_input to
! 	 abort; WAIT_FAILED is returned when single-stepping under
! 	 Windows 95 after switching thread focus in debugger, and
! 	 possibly at other times. */
!       errno = EINTR;
        return -1;
      }
*************** sys_select (int nfds, SELECT_TYPE *rfds,
*** 704,720 ****
        return 0;
      }
- #ifdef HAVE_NTGUI1
-   else if (active == WAIT_OBJECT_0 + nh)
-     {
-       /* Keyboard input available */
-       FD_SET (0, rfds);
- 
-       /* This shouldn't be necessary, but apparently just setting the input
- 	 fd is not good enough for emacs */
- //      read_input_waiting ();
- 
-       return (1) ;
-     }
- #endif /* HAVE_NTGUI */
    else if (active >= WAIT_OBJECT_0 &&
  	   active < WAIT_OBJECT_0+MAXIMUM_WAIT_OBJECTS)
--- 927,930 ----
*************** sys_select (int nfds, SELECT_TYPE *rfds,
*** 727,787 ****
        active -= WAIT_ABANDONED_0;
      }
-   
-   if (cps[active] == NULL)
-     {
-       /* Keyboard input available */
-       FD_SET (0, rfds);
-       nr++;
- 
-       /* This shouldn't be necessary, but apparently just setting the input
- 	 fd is not good enough for emacs */
-       read_input_waiting ();
-     }
-   else
-     {
-       /* Child process */
-       cp = cps[active];
  
!       /* If status is FALSE the read failed so don't report input */
!       if (cp->status)
!         {
! 	  FD_SET (cp->fd, rfds);
! 	  proc_buffered_char[cp->fd] = cp->chr;
  	  nr++;
!         }
        else
!         {
! 	  /* The SIGCHLD handler will do a Wait so we know it won't
! 	     return until the process is dead
! 	     We force Wait to only wait for this process to avoid it
! 	     picking up other children that happen to be dead but that
! 	     we haven't noticed yet
! 	     SIG_DFL for SIGCHLD is ignore? */
! 	  if (sig_handlers[SIGCHLD] != SIG_DFL &&
! 	      sig_handlers[SIGCHLD] != SIG_IGN)
!             {
  #ifdef FULL_DEBUG
! 	      DebPrint (("select calling SIGCHLD handler for pid %d\n",
! 			 cp->pid));
  #endif
! 	      dead_child = cp;
! 	      sig_handlers[SIGCHLD](SIGCHLD);
! 	      dead_child = NULL;
!             }
!             
! 	  /* Clean up the child process entry in the table */
! 	  remove_child (cp);
!         }
!     }
    return nr;
  }
  
! /*
!    Substitute for certain kill () operations
!    */
  int 
! win32_kill_process (int pid, int sig)
  {
    child_process *cp;
    
    /* Only handle signals that will result in the process dying */
--- 937,1016 ----
        active -= WAIT_ABANDONED_0;
      }
  
!   /* Loop over all handles after active (now officially documented as
!      being the first signalled handle in the array).  We do this to
!      ensure fairness, so that all channels with data available will be
!      processed - otherwise higher numbered channels could be starved. */
!   do
!     {
!       if (fdindex[active] == 0)
! 	{
! 	  /* Keyboard input available */
! 	  FD_SET (0, rfds);
  	  nr++;
! 	}
        else
! 	{
! 	  /* must be a socket or pipe */
! 	  int current_status;
! 
! 	  cp = fd_info[ fdindex[active] ].cp;
! 
! 	  /* Read ahead should have completed, either succeeding or failing. */
! 	  FD_SET (fdindex[active], rfds);
! 	  nr++;
! 	  current_status = cp->status;
! 	  if (current_status != STATUS_READ_SUCCEEDED)
! 	    {
! 	      if (current_status != STATUS_READ_FAILED)
! 		DebPrint (("internal error: subprocess pipe signalled "
! 			   "at the wrong time (status %d)\n!", current_status));
! 
! 	      /* The child_process entry for a socket or pipe will be
! 		 freed when the last descriptor using it is closed; for
! 		 pipes, we call the SIGCHLD handler. */
! 	      if (fd_info[ fdindex[active] ].flags & FILE_PIPE)
! 		{
! 		  /* The SIGCHLD handler will do a Wait so we know it won't
! 		     return until the process is dead
! 		     We force Wait to only wait for this process to avoid it
! 		     picking up other children that happen to be dead but that
! 		     we haven't noticed yet
! 		     SIG_DFL for SIGCHLD is ignore? */
! 		  if (sig_handlers[SIGCHLD] != SIG_DFL &&
! 		      sig_handlers[SIGCHLD] != SIG_IGN)
! 		    {
  #ifdef FULL_DEBUG
! 		      DebPrint (("select calling SIGCHLD handler for pid %d\n",
! 				 cp->pid));
  #endif
! 		      dead_child = cp;
! 		      sig_handlers[SIGCHLD] (SIGCHLD);
! 		      dead_child = NULL;
! 		    }
! 
! 		  /* Clean up the child process entry in the table */
! 		  reap_subprocess (cp);
! 		}
! 	    }
! 	}
! 
!       /* Test for input on remaining channels. */
!       while (++active < nh)
! 	if (WaitForSingleObject (wait_hnd[active], 0) == WAIT_OBJECT_0)
! 	  break;
!     } while (active < nh);
! 
    return nr;
  }
  
! /* Substitute for certain kill () operations */
  int 
! sys_kill (int pid, int sig)
  {
    child_process *cp;
+   HANDLE proc_hand;
+   int need_to_free = 0;
+   int rc = 0;
    
    /* Only handle signals that will result in the process dying */
*************** win32_kill_process (int pid, int sig)
*** 791,812 ****
        return -1;
      }
!   
    cp = find_child_pid (pid);
    if (cp == NULL)
      {
!       DebPrint (("win32_kill_process didn't find a child with pid %lu\n", pid));
!       errno = ECHILD;
!       return -1;
      }
    
    if (sig == SIGINT)
      {
!       /* Fake Ctrl-Break.  */
        if (!GenerateConsoleCtrlEvent (CTRL_BREAK_EVENT, pid))
          {
! 	  DebPrint (("win32_kill_process.GenerateConsoleCtrlEvent return %d "
  		     "for pid %lu\n", GetLastError (), pid));
  	  errno = EINVAL;
! 	  return -1;
          }
      }
--- 1020,1050 ----
        return -1;
      }
! 
    cp = find_child_pid (pid);
    if (cp == NULL)
      {
!       proc_hand = OpenProcess (PROCESS_TERMINATE, 0, pid);
!       if (proc_hand == NULL)
!         {
! 	  errno = EPERM;
! 	  return -1;
! 	}
!       need_to_free = 1;
!     }
!   else
!     {
!       proc_hand = cp->procinfo.hProcess;
!       pid = cp->procinfo.dwProcessId;
      }
    
    if (sig == SIGINT)
      {
!       /* Ctrl-Break is NT equivalent of SIGINT.  */
        if (!GenerateConsoleCtrlEvent (CTRL_BREAK_EVENT, pid))
          {
! 	  DebPrint (("sys_kill.GenerateConsoleCtrlEvent return %d "
  		     "for pid %lu\n", GetLastError (), pid));
  	  errno = EINVAL;
! 	  rc = -1;
          }
      }
*************** win32_kill_process (int pid, int sig)
*** 816,870 ****
  	 so it doesn't work very well for shells which is why it's
  	 not used in every case.  */
!       if (!TerminateProcess (cp->process, 0xff))
          {
! 	  DebPrint (("win32_kill_process.TerminateProcess returned %d "
  		     "for pid %lu\n", GetLastError (), pid));
  	  errno = EINVAL;
! 	  return -1;
          }
      }
!   return 0;
  }
  
! /* If the channel is a pipe this read might block since we don't
!    know how many characters are available, so check and read only
!    what's there
!    We also need to wake up the reader thread once we've read our data.  */
! int 
! read_child_output (int fd, char *buf, int max)
  {
!   HANDLE h;
!   int to_read, nchars;
!   DWORD waiting;
!   child_process *cp;
!   
!   h = (HANDLE)_get_osfhandle (fd);
!   if (GetFileType (h) == FILE_TYPE_PIPE)
!     {
!       PeekNamedPipe (h, NULL, 0, NULL, &waiting, NULL);
!       to_read = min (waiting, (DWORD)max);
!     }
!   else
!     to_read = max;
!   
!   /* Use read to get CRLF translation */
!   nchars = read (fd, buf, to_read);
!   
!   if (GetFileType (h) == FILE_TYPE_PIPE)
!     {
!       /* Wake up the reader thread
! 	 for this process */
!       cp = find_child_fd (fd);
!       if (cp)
!         {
! 	  if (!SetEvent (cp->char_consumed))
! 	    DebPrint (("read_child_output.SetEvent failed with "
! 		       "%lu for fd %ld\n", GetLastError (), fd));
!         }
!       else
! 	DebPrint (("read_child_output couldn't find a child with fd %d\n",
! 		   fd));
!     }
    
!   return nchars;
  }
--- 1054,1181 ----
  	 so it doesn't work very well for shells which is why it's
  	 not used in every case.  */
!       if (!TerminateProcess (proc_hand, 0xff))
          {
! 	  DebPrint (("sys_kill.TerminateProcess returned %d "
  		     "for pid %lu\n", GetLastError (), pid));
  	  errno = EINVAL;
! 	  rc = -1;
          }
      }
! 
!   if (need_to_free)
!     CloseHandle (proc_hand);
! 
!   return rc;
  }
  
! extern int report_file_error (char *, Lisp_Object);
! 
! /* The following two routines are used to manipulate stdin, stdout, and
!    stderr of our child processes.
! 
!    Assuming that in, out, and err are *not* inheritable, we make them
!    stdin, stdout, and stderr of the child as follows:
! 
!    - Save the parent's current standard handles.
!    - Set the std handles to inheritable duplicates of the ones being passed in.
!      (Note that _get_osfhandle() is an io.h procedure that retrieves the
!      NT file handle for a crt file descriptor.)
!    - Spawn the child, which inherits in, out, and err as stdin,
!      stdout, and stderr. (see Spawnve)
!    - Close the std handles passed to the child.
!    - 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[3])
  {
!   HANDLE parent;
!   HANDLE newstdin, newstdout, newstderr;
! 
!   parent = GetCurrentProcess ();
! 
!   handles[0] = GetStdHandle (STD_INPUT_HANDLE);
!   handles[1] = GetStdHandle (STD_OUTPUT_HANDLE);
!   handles[2] = GetStdHandle (STD_ERROR_HANDLE);
! 
!   /* make inheritable copies of the new handles */
!   if (!DuplicateHandle (parent, 
! 		       (HANDLE) _get_osfhandle (in),
! 		       parent,
! 		       &newstdin, 
! 		       0, 
! 		       TRUE, 
! 		       DUPLICATE_SAME_ACCESS))
!     report_file_error ("Duplicating input handle for child", Qnil);
!   
!   if (!DuplicateHandle (parent,
! 		       (HANDLE) _get_osfhandle (out),
! 		       parent,
! 		       &newstdout,
! 		       0,
! 		       TRUE,
! 		       DUPLICATE_SAME_ACCESS))
!     report_file_error ("Duplicating output handle for child", Qnil);
!   
!   if (!DuplicateHandle (parent,
! 		       (HANDLE) _get_osfhandle (err),
! 		       parent,
! 		       &newstderr,
! 		       0,
! 		       TRUE,
! 		       DUPLICATE_SAME_ACCESS))
!     report_file_error ("Duplicating error handle for child", Qnil);
! 
!   /* and store them as our std handles */
!   if (!SetStdHandle (STD_INPUT_HANDLE, newstdin))
!     report_file_error ("Changing stdin handle", Qnil);
    
!   if (!SetStdHandle (STD_OUTPUT_HANDLE, newstdout))
!     report_file_error ("Changing stdout handle", Qnil);
! 
!   if (!SetStdHandle (STD_ERROR_HANDLE, newstderr))
!     report_file_error ("Changing stderr handle", Qnil);
! }
! 
! void
! reset_standard_handles (int in, int out, int err, HANDLE handles[3])
! {
!   /* close the duplicated handles passed to the child */
!   CloseHandle (GetStdHandle (STD_INPUT_HANDLE));
!   CloseHandle (GetStdHandle (STD_OUTPUT_HANDLE));
!   CloseHandle (GetStdHandle (STD_ERROR_HANDLE));
! 
!   /* now restore parent's saved std handles */
!   SetStdHandle (STD_INPUT_HANDLE, handles[0]);
!   SetStdHandle (STD_OUTPUT_HANDLE, handles[1]);
!   SetStdHandle (STD_ERROR_HANDLE, handles[2]);
! }
! 
! 
! syms_of_ntproc ()
! {
!   DEFVAR_LISP ("win32-quote-process-args", &Vwin32_quote_process_args,
!     "Non-nil enables quoting of process arguments to ensure correct parsing.\n\
! Because Windows does not directly pass argv arrays to child processes,\n\
! programs have to reconstruct the argv array by parsing the command\n\
! line string.  For an argument to contain a space, it must be enclosed\n\
! in double quotes or it will be parsed as multiple arguments.\n\
! \n\
! However, the argument list to call-process is not always correctly\n\
! constructed (or arguments have already been quoted), so enabling this\n\
! option may cause unexpected behavior.");
!   Vwin32_quote_process_args = Qnil;
! 
!   DEFVAR_INT ("win32-pipe-read-delay", &Vwin32_pipe_read_delay,
!     "Forced delay before reading subprocess output.\n\
! This is done to improve the buffering of subprocess output, by\n\
! avoiding the inefficiency of frequently reading small amounts of data.\n\
! \n\
! If positive, the value is the number of milliseconds to sleep before\n\
! reading the subprocess output.  If negative, the magnitude is the number\n\
! of time slices to wait (effectively boosting the priority of the child\n\
! process temporarily).  A value of zero disables waiting entirely.");
!   Vwin32_pipe_read_delay = 50;
  }
+ /* end of ntproc.c */
diff -2rcpP --exclude=*.elc emacs-19.30/src/ntterm.c emacs-19.31/src/ntterm.c
*** emacs-19.30/src/ntterm.c	Tue Nov  7 02:09:53 1995
--- emacs-19.31/src/ntterm.c	Fri May 10 16:31:57 1996
***************
*** 2,20 ****
     Copyright (C) 1992 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.
  
     Tim Fleehart (apollo@online.com)		1-17-92
--- 2,21 ----
     Copyright (C) 1992 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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.
  
     Tim Fleehart (apollo@online.com)		1-17-92
*************** HANDLE	prev_screen, cur_screen;
*** 80,83 ****
--- 81,85 ----
  UCHAR	char_attr, char_attr_normal, char_attr_reverse;
  HANDLE  keyboard_handle;
+ DWORD   prev_console_mode;
  
  
*************** void
*** 123,145 ****
  clear_frame (void)
  {
-   SMALL_RECT scroll;
-   COORD	     dest;
-   CHAR_INFO  fill;
    FRAME_PTR  f = PICK_FRAME ();
!   
    hl_mode (0);
    
!   scroll.Top = 0;
!   scroll.Bottom = FRAME_HEIGHT (f) - 1;
!   scroll.Left = 0;
!   scroll.Right = FRAME_WIDTH (f) - 1;
!   
!   dest.Y = FRAME_HEIGHT (f);
!   dest.X = 0;
!   
!   fill.Char.AsciiChar = 0x20;
!   fill.Attributes = char_attr;
!   
!   ScrollConsoleScreenBuffer (cur_screen, &scroll, NULL, dest, &fill);
    move_cursor (0, 0);
  }
--- 125,140 ----
  clear_frame (void)
  {
    FRAME_PTR  f = PICK_FRAME ();
!   COORD	     dest;
!   int        n, r;
! 
    hl_mode (0);
    
!   n = FRAME_HEIGHT (f) * FRAME_WIDTH (f);
!   dest.X = dest.Y = 0;
! 
!   FillConsoleOutputAttribute (cur_screen, char_attr, n, dest, &r);
!   FillConsoleOutputCharacter (cur_screen, ' ', n, dest, &r);
! 
    move_cursor (0, 0);
  }
*************** write_glyphs (register GLYPH *string, re
*** 347,350 ****
--- 342,348 ----
    int i;
    
+   if (len <= 0)
+     return;
+ 
    attrs = alloca (len * sizeof (*attrs));
    chars = alloca (len * sizeof (*chars));
*************** void
*** 525,530 ****
  unset_kbd (void)
  {
!   SetConsoleMode (keyboard_handle, ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT |
! 		  ENABLE_ECHO_INPUT | ENABLE_MOUSE_INPUT);
  }
  
--- 523,527 ----
  unset_kbd (void)
  {
!   SetConsoleMode (keyboard_handle, prev_console_mode);
  }
  
*************** reset_kbd (void)
*** 533,537 ****
--- 530,538 ----
  {
    keyboard_handle = GetStdHandle (STD_INPUT_HANDLE);
+   GetConsoleMode (keyboard_handle, &prev_console_mode);
    SetConsoleMode (keyboard_handle, ENABLE_MOUSE_INPUT | ENABLE_WINDOW_INPUT);
+ 
+   /* Try to use interrupt input; if we can't, then start polling.  */
+   Fset_input_mode (Qt, Qnil, Qt, Qnil);
  }
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/print.c emacs-19.31/src/print.c
*** emacs-19.30/src/print.c	Fri Nov 10 10:57:56 1995
--- emacs-19.31/src/print.c	Tue May 21 13:23:37 1996
*************** GNU General Public License for more deta
*** 16,25 ****
  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 <config.h>
  #include <stdio.h>
- #undef NULL
  #include "lisp.h"
  
--- 16,25 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
  #include <config.h>
  #include <stdio.h>
  #include "lisp.h"
  
*************** print_string (string, printcharfun)
*** 327,334 ****
  
  DEFUN ("write-char", Fwrite_char, Swrite_char, 1, 2, 0,
!   "Output character CHAR to stream PRINTCHARFUN.\n\
  PRINTCHARFUN defaults to the value of `standard-output' (which see).")
!   (ch, printcharfun)
!      Lisp_Object ch, printcharfun;
  {
    struct buffer *old = current_buffer;
--- 327,334 ----
  
  DEFUN ("write-char", Fwrite_char, Swrite_char, 1, 2, 0,
!   "Output character CHARACTER to stream PRINTCHARFUN.\n\
  PRINTCHARFUN defaults to the value of `standard-output' (which see).")
!   (character, printcharfun)
!      Lisp_Object character, printcharfun;
  {
    struct buffer *old = current_buffer;
*************** PRINTCHARFUN defaults to the value of `s
*** 339,347 ****
    if (NILP (printcharfun))
      printcharfun = Vstandard_output;
!   CHECK_NUMBER (ch, 0);
    PRINTPREPARE;
!   PRINTCHAR (XINT (ch));
    PRINTFINISH;
!   return ch;
  }
  
--- 339,347 ----
    if (NILP (printcharfun))
      printcharfun = Vstandard_output;
!   CHECK_NUMBER (character, 0);
    PRINTPREPARE;
!   PRINTCHAR (XINT (character));
    PRINTFINISH;
!   return character;
  }
  
*************** Quoting characters are printed when need
*** 493,498 ****
  can handle, whenever this is possible.\n\
  Output stream is PRINTCHARFUN, or value of `standard-output' (which see).")
!   (obj, printcharfun)
!      Lisp_Object obj, printcharfun;
  {
    struct buffer *old = current_buffer;
--- 493,498 ----
  can handle, whenever this is possible.\n\
  Output stream is PRINTCHARFUN, or value of `standard-output' (which see).")
!   (object, printcharfun)
!      Lisp_Object object, printcharfun;
  {
    struct buffer *old = current_buffer;
*************** Output stream is PRINTCHARFUN, or value 
*** 508,514 ****
    PRINTPREPARE;
    print_depth = 0;
!   print (obj, printcharfun, 1);
    PRINTFINISH;
!   return obj;
  }
  
--- 508,514 ----
    PRINTPREPARE;
    print_depth = 0;
!   print (object, printcharfun, 1);
    PRINTFINISH;
!   return object;
  }
  
*************** any Lisp object.  Quoting characters are
*** 521,526 ****
  that `read' can handle, whenever this is possible, unless the optional\n\
  second argument NOESCAPE is non-nil.")
!   (obj, noescape)
!      Lisp_Object obj, noescape;
  {
    struct buffer *old = current_buffer;
--- 521,526 ----
  that `read' can handle, whenever this is possible, unless the optional\n\
  second argument NOESCAPE is non-nil.")
!   (object, noescape)
!      Lisp_Object object, noescape;
  {
    struct buffer *old = current_buffer;
*************** second argument NOESCAPE is non-nil.")
*** 528,548 ****
    int start_point;
    Lisp_Object original, printcharfun;
!   struct gcpro gcpro1;
  
    printcharfun = Vprin1_to_string_buffer;
    PRINTPREPARE;
    print_depth = 0;
!   print (obj, printcharfun, NILP (noescape));
    /* Make Vprin1_to_string_buffer be the default buffer after PRINTFINSH */
    PRINTFINISH;
    set_buffer_internal (XBUFFER (Vprin1_to_string_buffer));
!   obj = Fbuffer_string ();
  
-   GCPRO1 (obj);
    Ferase_buffer ();
    set_buffer_internal (old);
    UNGCPRO;
  
!   return obj;
  }
  
--- 528,556 ----
    int start_point;
    Lisp_Object original, printcharfun;
!   struct gcpro gcpro1, gcpro2;
!   Lisp_Object tem;
! 
!   /* Save and restore this--we are altering a buffer
!      but we don't want to deactivate the mark just for that.
!      No need for specbind, since errors deactivate the mark.  */
!   tem = Vdeactivate_mark;
!   GCPRO2 (object, tem);
  
    printcharfun = Vprin1_to_string_buffer;
    PRINTPREPARE;
    print_depth = 0;
!   print (object, printcharfun, NILP (noescape));
    /* Make Vprin1_to_string_buffer be the default buffer after PRINTFINSH */
    PRINTFINISH;
    set_buffer_internal (XBUFFER (Vprin1_to_string_buffer));
!   object = Fbuffer_string ();
  
    Ferase_buffer ();
    set_buffer_internal (old);
+ 
+   Vdeactivate_mark = tem;
    UNGCPRO;
  
!   return object;
  }
  
*************** No quoting characters are used; no delim
*** 552,557 ****
  the contents of strings.\n\
  Output stream is PRINTCHARFUN, or value of standard-output (which see).")
!   (obj, printcharfun)
!      Lisp_Object obj, printcharfun;
  {
    struct buffer *old = current_buffer;
--- 560,565 ----
  the contents of strings.\n\
  Output stream is PRINTCHARFUN, or value of standard-output (which see).")
!   (object, printcharfun)
!      Lisp_Object object, printcharfun;
  {
    struct buffer *old = current_buffer;
*************** Output stream is PRINTCHARFUN, or value 
*** 564,570 ****
    PRINTPREPARE;
    print_depth = 0;
!   print (obj, printcharfun, 0);
    PRINTFINISH;
!   return obj;
  }
  
--- 572,578 ----
    PRINTPREPARE;
    print_depth = 0;
!   print (object, printcharfun, 0);
    PRINTFINISH;
!   return object;
  }
  
*************** Quoting characters are printed when need
*** 574,579 ****
  can handle, whenever this is possible.\n\
  Output stream is PRINTCHARFUN, or value of `standard-output' (which see).")
!   (obj, printcharfun)
!      Lisp_Object obj, printcharfun;
  {
    struct buffer *old = current_buffer;
--- 582,587 ----
  can handle, whenever this is possible.\n\
  Output stream is PRINTCHARFUN, or value of `standard-output' (which see).")
!   (object, printcharfun)
!      Lisp_Object object, printcharfun;
  {
    struct buffer *old = current_buffer;
*************** Output stream is PRINTCHARFUN, or value 
*** 589,597 ****
    if (NILP (printcharfun))
      printcharfun = Vstandard_output;
!   GCPRO1 (obj);
    PRINTPREPARE;
    print_depth = 0;
    PRINTCHAR ('\n');
!   print (obj, printcharfun, 1);
    PRINTCHAR ('\n');
    PRINTFINISH;
--- 597,605 ----
    if (NILP (printcharfun))
      printcharfun = Vstandard_output;
!   GCPRO1 (object);
    PRINTPREPARE;
    print_depth = 0;
    PRINTCHAR ('\n');
!   print (object, printcharfun, 1);
    PRINTCHAR ('\n');
    PRINTFINISH;
*************** Output stream is PRINTCHARFUN, or value 
*** 601,605 ****
  #endif /* MAX_PRINT_CHARS */
    UNGCPRO;
!   return obj;
  }
  
--- 609,613 ----
  #endif /* MAX_PRINT_CHARS */
    UNGCPRO;
!   return object;
  }
  
*************** debug_print (arg)
*** 631,639 ****
  }
  
  #ifdef LISP_FLOAT_TYPE
  
  /*
   * The buffer should be at least as large as the max string size of the
!  * largest float, printed in the biggest notation.  This is undoubtably
   * 20d float_output_format, with the negative of the C-constant "HUGE"
   * from <math.h>.
--- 639,722 ----
  }
  
+ DEFUN ("error-message-string", Ferror_message_string, Serror_message_string,
+        1, 1, 0,
+   "Convert an error value (ERROR-SYMBOL . DATA) to an error message.")
+   (obj)
+      Lisp_Object obj;
+ {
+   struct buffer *old = current_buffer;
+   Lisp_Object original, printcharfun, value;
+   struct gcpro gcpro1;
+ 
+   print_error_message (obj, Vprin1_to_string_buffer, NULL);
+ 
+   set_buffer_internal (XBUFFER (Vprin1_to_string_buffer));
+   value = Fbuffer_string ();
+ 
+   GCPRO1 (value);
+   Ferase_buffer ();
+   set_buffer_internal (old);
+   UNGCPRO;
+ 
+   return value;
+ }
+ 
+ /* Print an error message for the error DATA
+    onto Lisp output stream STREAM (suitable for the print functions).  */
+ 
+ print_error_message (data, stream)
+      Lisp_Object data, stream;
+ {
+   Lisp_Object errname, errmsg, file_error, tail;
+   struct gcpro gcpro1;
+   int i;
+ 
+   errname = Fcar (data);
+ 
+   if (EQ (errname, Qerror))
+     {
+       data = Fcdr (data);
+       if (!CONSP (data)) data = Qnil;
+       errmsg = Fcar (data);
+       file_error = Qnil;
+     }
+   else
+     {
+       errmsg = Fget (errname, Qerror_message);
+       file_error = Fmemq (Qfile_error,
+ 			  Fget (errname, Qerror_conditions));
+     }
+ 
+   /* Print an error message including the data items.  */
+ 
+   tail = Fcdr_safe (data);
+   GCPRO1 (tail);
+ 
+   /* For file-error, make error message by concatenating
+      all the data items.  They are all strings.  */
+   if (!NILP (file_error) && !NILP (tail))
+     errmsg = XCONS (tail)->car, tail = XCONS (tail)->cdr;
+ 
+   if (STRINGP (errmsg))
+     Fprinc (errmsg, stream);
+   else
+     write_string_1 ("peculiar error", -1, stream);
+ 
+   for (i = 0; CONSP (tail); tail = Fcdr (tail), i++)
+     {
+       write_string_1 (i ? ", " : ": ", 2, stream);
+       if (!NILP (file_error))
+ 	Fprinc (Fcar (tail), stream);
+       else
+ 	Fprin1 (Fcar (tail), stream);
+     }
+   UNGCPRO;
+ }
+ 
  #ifdef LISP_FLOAT_TYPE
  
  /*
   * The buffer should be at least as large as the max string size of the
!  * largest float, printed in the biggest notation.  This is undoubtedly
   * 20d float_output_format, with the negative of the C-constant "HUGE"
   * from <math.h>.
*************** This may be any function of one argument
*** 1205,1209 ****
  It may also be a buffer (output is inserted before point)\n\
  or a marker (output is inserted and the marker is advanced)\n\
! or the symbol t (output appears in the minibuffer line).");
    Vstandard_output = Qt;
    Qstandard_output = intern ("standard-output");
--- 1288,1292 ----
  It may also be a buffer (output is inserted before point)\n\
  or a marker (output is inserted and the marker is advanced)\n\
! or the symbol t (output appears in the echo area).");
    Vstandard_output = Qt;
    Qstandard_output = intern ("standard-output");
*************** Also print formfeeds as backslash-f.");
*** 1250,1253 ****
--- 1333,1337 ----
    defsubr (&Sprin1);
    defsubr (&Sprin1_to_string);
+   defsubr (&Serror_message_string);
    defsubr (&Sprinc);
    defsubr (&Sprint);
diff -2rcpP --exclude=*.elc emacs-19.30/src/process.c emacs-19.31/src/process.c
*** emacs-19.30/src/process.c	Tue Nov  7 02:10:04 1995
--- emacs-19.31/src/process.c	Fri Apr 26 15:52:00 1996
***************
*** 1,4 ****
  /* Asynchronous subprocess control for GNU Emacs.
!    Copyright (C) 1985, 86, 87, 88, 93, 94, 95 Free Software Foundation, Inc.
  
  This file is part of GNU Emacs.
--- 1,5 ----
  /* Asynchronous subprocess control for GNU Emacs.
!    Copyright (C) 1985, 86, 87, 88, 93, 94, 95, 1996
!       Free Software Foundation, Inc.
  
  This file is part of GNU Emacs.
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 17,22 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** int proc_buffered_char[MAXDESC];
*** 249,252 ****
--- 251,257 ----
  static Lisp_Object get_process ();
  
+ extern EMACS_TIME timer_check ();
+ extern int timers_run;
+ 
  /* Maximum number of bytes to send to a pty without an eof.  */
  static int pty_max_bytes;
*************** remove_process (proc)
*** 503,507 ****
    pair = Frassq (proc, Vprocess_alist);
    Vprocess_alist = Fdelq (pair, Vprocess_alist);
-   Fset_marker (XPROCESS (proc)->mark, Qnil, Qnil);
  
    deactivate_process (proc);
--- 508,511 ----
*************** remove_process (proc)
*** 510,517 ****
  DEFUN ("processp", Fprocessp, Sprocessp, 1, 1, 0,
    "Return t if OBJECT is a process.")
!   (obj)
!      Lisp_Object obj;
  {
!   return PROCESSP (obj) ? Qt : Qnil;
  }
  
--- 514,521 ----
  DEFUN ("processp", Fprocessp, Sprocessp, 1, 1, 0,
    "Return t if OBJECT is a process.")
!   (object)
!      Lisp_Object object;
  {
!   return PROCESSP (object) ? Qt : Qnil;
  }
  
*************** DEFUN ("get-buffer-process", Fget_buffer
*** 530,540 ****
    "Return the (or, a) process associated with BUFFER.\n\
  BUFFER may be a buffer or the name of one.")
!   (name)
!      register Lisp_Object name;
  {
    register Lisp_Object buf, tail, proc;
  
!   if (NILP (name)) return Qnil;
!   buf = Fget_buffer (name);
    if (NILP (buf)) return Qnil;
  
--- 534,544 ----
    "Return the (or, a) process associated with BUFFER.\n\
  BUFFER may be a buffer or the name of one.")
!   (buffer)
!      register Lisp_Object buffer;
  {
    register Lisp_Object buf, tail, proc;
  
!   if (NILP (buffer)) return Qnil;
!   buf = Fget_buffer (buffer);
    if (NILP (buf)) return Qnil;
  
*************** DEFUN ("delete-process", Fdelete_process
*** 591,615 ****
  PROCESS may be a process, a buffer, the name of a process or buffer, or\n\
  nil, indicating the current buffer's process.")
!   (proc)
!      register Lisp_Object proc;
  {
!   proc = get_process (proc);
!   XPROCESS (proc)->raw_status_low = Qnil;
!   XPROCESS (proc)->raw_status_high = Qnil;
!   if (NETCONN_P (proc))
      {
!       XPROCESS (proc)->status = Fcons (Qexit, Fcons (make_number (0), Qnil));
!       XSETINT (XPROCESS (proc)->tick, ++process_tick);
      }
!   else if (XINT (XPROCESS (proc)->infd) >= 0)
      {
!       Fkill_process (proc, Qnil);
        /* Do this now, since remove_process will make sigchld_handler do nothing.  */
!       XPROCESS (proc)->status 
  	= Fcons (Qsignal, Fcons (make_number (SIGKILL), Qnil));
!       XSETINT (XPROCESS (proc)->tick, ++process_tick);
        status_notify ();
      }
!   remove_process (proc);
    return Qnil;
  }
--- 595,619 ----
  PROCESS may be a process, a buffer, the name of a process or buffer, or\n\
  nil, indicating the current buffer's process.")
!   (process)
!      register Lisp_Object process;
  {
!   process = get_process (process);
!   XPROCESS (process)->raw_status_low = Qnil;
!   XPROCESS (process)->raw_status_high = Qnil;
!   if (NETCONN_P (process))
      {
!       XPROCESS (process)->status = Fcons (Qexit, Fcons (make_number (0), Qnil));
!       XSETINT (XPROCESS (process)->tick, ++process_tick);
      }
!   else if (XINT (XPROCESS (process)->infd) >= 0)
      {
!       Fkill_process (process, Qnil);
        /* Do this now, since remove_process will make sigchld_handler do nothing.  */
!       XPROCESS (process)->status 
  	= Fcons (Qsignal, Fcons (make_number (SIGKILL), Qnil));
!       XSETINT (XPROCESS (process)->tick, ++process_tick);
        status_notify ();
      }
!   remove_process (process);
    return Qnil;
  }
*************** nil -- if arg is a process name and no s
*** 626,644 ****
  PROCESS may be a process, a buffer, the name of a process or buffer, or\n\
  nil, indicating the current buffer's process.")
!   (proc)
!      register Lisp_Object proc;
  {
    register struct Lisp_Process *p;
    register Lisp_Object status;
  
!   if (STRINGP (proc))
!     proc = Fget_process (proc);
    else
!     proc = get_process (proc);
  
!   if (NILP (proc))
!     return proc;
  
!   p = XPROCESS (proc);
    if (!NILP (p->raw_status_low))
      update_status (p);
--- 630,648 ----
  PROCESS may be a process, a buffer, the name of a process or buffer, or\n\
  nil, indicating the current buffer's process.")
!   (process)
!      register Lisp_Object process;
  {
    register struct Lisp_Process *p;
    register Lisp_Object status;
  
!   if (STRINGP (process))
!     process = Fget_process (process);
    else
!     process = get_process (process);
  
!   if (NILP (process))
!     return process;
  
!   p = XPROCESS (process);
    if (!NILP (p->raw_status_low))
      update_status (p);
*************** nil, indicating the current buffer's pro
*** 646,650 ****
    if (CONSP (status))
      status = XCONS (status)->car;
!   if (NETCONN_P (proc))
      {
        if (EQ (status, Qrun))
--- 650,654 ----
    if (CONSP (status))
      status = XCONS (status)->car;
!   if (NETCONN_P (process))
      {
        if (EQ (status, Qrun))
*************** DEFUN ("process-exit-status", Fprocess_e
*** 660,671 ****
    "Return the exit status of PROCESS or the signal number that killed it.\n\
  If PROCESS has not yet exited or died, return 0.")
!   (proc)
!      register Lisp_Object proc;
  {
!   CHECK_PROCESS (proc, 0);
!   if (!NILP (XPROCESS (proc)->raw_status_low))
!     update_status (XPROCESS (proc));
!   if (CONSP (XPROCESS (proc)->status))
!     return XCONS (XCONS (XPROCESS (proc)->status)->cdr)->car;
    return make_number (0);
  }
--- 664,675 ----
    "Return the exit status of PROCESS or the signal number that killed it.\n\
  If PROCESS has not yet exited or died, return 0.")
!   (process)
!      register Lisp_Object process;
  {
!   CHECK_PROCESS (process, 0);
!   if (!NILP (XPROCESS (process)->raw_status_low))
!     update_status (XPROCESS (process));
!   if (CONSP (XPROCESS (process)->status))
!     return XCONS (XCONS (XPROCESS (process)->status)->cdr)->car;
    return make_number (0);
  }
*************** DEFUN ("process-id", Fprocess_id, Sproce
*** 675,683 ****
  This is the pid of the Unix process which PROCESS uses or talks to.\n\
  For a network connection, this value is nil.")
!   (proc)
!      register Lisp_Object proc;
  {
!   CHECK_PROCESS (proc, 0);
!   return XPROCESS (proc)->pid;
  }
  
--- 679,687 ----
  This is the pid of the Unix process which PROCESS uses or talks to.\n\
  For a network connection, this value is nil.")
!   (process)
!      register Lisp_Object process;
  {
!   CHECK_PROCESS (process, 0);
!   return XPROCESS (process)->pid;
  }
  
*************** DEFUN ("process-name", Fprocess_name, Sp
*** 686,694 ****
  This is the name of the program invoked in PROCESS,\n\
  possibly modified to make it unique among process names.")
!   (proc)
!      register Lisp_Object proc;
  {
!   CHECK_PROCESS (proc, 0);
!   return XPROCESS (proc)->name;
  }
  
--- 690,698 ----
  This is the name of the program invoked in PROCESS,\n\
  possibly modified to make it unique among process names.")
!   (process)
!      register Lisp_Object process;
  {
!   CHECK_PROCESS (process, 0);
!   return XPROCESS (process)->name;
  }
  
*************** This is a list of strings, the first str
*** 698,706 ****
  and the rest of the strings being the arguments given to it.\n\
  For a non-child channel, this is nil.")
!   (proc)
!      register Lisp_Object proc;
  {
!   CHECK_PROCESS (proc, 0);
!   return XPROCESS (proc)->command;
  }
  
--- 702,710 ----
  and the rest of the strings being the arguments given to it.\n\
  For a non-child channel, this is nil.")
!   (process)
!      register Lisp_Object process;
  {
!   CHECK_PROCESS (process, 0);
!   return XPROCESS (process)->command;
  }
  
*************** DEFUN ("process-tty-name", Fprocess_tty_
*** 709,717 ****
  This is the terminal that the process itself reads and writes on,\n\
  not the name of the pty that Emacs uses to talk with that terminal.")
!   (proc)
!      register Lisp_Object proc;
  {
!   CHECK_PROCESS (proc, 0);
!   return XPROCESS (proc)->tty_name;
  }
  
--- 713,721 ----
  This is the terminal that the process itself reads and writes on,\n\
  not the name of the pty that Emacs uses to talk with that terminal.")
!   (process)
!      register Lisp_Object process;
  {
!   CHECK_PROCESS (process, 0);
!   return XPROCESS (process)->tty_name;
  }
  
*************** DEFUN ("set-process-buffer", Fset_proces
*** 719,729 ****
    2, 2, 0,
    "Set buffer associated with PROCESS to BUFFER (a buffer, or nil).")
!   (proc, buffer)
!      register Lisp_Object proc, buffer;
  {
!   CHECK_PROCESS (proc, 0);
    if (!NILP (buffer))
      CHECK_BUFFER (buffer, 1);
!   XPROCESS (proc)->buffer = buffer;
    return buffer;
  }
--- 723,733 ----
    2, 2, 0,
    "Set buffer associated with PROCESS to BUFFER (a buffer, or nil).")
!   (process, buffer)
!      register Lisp_Object process, buffer;
  {
!   CHECK_PROCESS (process, 0);
    if (!NILP (buffer))
      CHECK_BUFFER (buffer, 1);
!   XPROCESS (process)->buffer = buffer;
    return buffer;
  }
*************** DEFUN ("process-buffer", Fprocess_buffer
*** 734,742 ****
  Output from PROCESS is inserted in this buffer\n\
  unless PROCESS has a filter.")
!   (proc)
!      register Lisp_Object proc;
  {
!   CHECK_PROCESS (proc, 0);
!   return XPROCESS (proc)->buffer;
  }
  
--- 738,746 ----
  Output from PROCESS is inserted in this buffer\n\
  unless PROCESS has a filter.")
!   (process)
!      register Lisp_Object process;
  {
!   CHECK_PROCESS (process, 0);
!   return XPROCESS (process)->buffer;
  }
  
*************** DEFUN ("process-mark", Fprocess_mark, Sp
*** 744,752 ****
    1, 1, 0,
    "Return the marker for the end of the last output from PROCESS.")
!   (proc)
!      register Lisp_Object proc;
  {
!   CHECK_PROCESS (proc, 0);
!   return XPROCESS (proc)->mark;
  }
  
--- 748,756 ----
    1, 1, 0,
    "Return the marker for the end of the last output from PROCESS.")
!   (process)
!      register Lisp_Object process;
  {
!   CHECK_PROCESS (process, 0);
!   return XPROCESS (process)->mark;
  }
  
*************** the entire string of output is passed to
*** 759,777 ****
  The filter gets two arguments: the process and the string of output.\n\
  If the process has a filter, its buffer is not used for output.")
!   (proc, filter)
!      register Lisp_Object proc, filter;
  {
!   CHECK_PROCESS (proc, 0);
    if (EQ (filter, Qt))
      {
!       FD_CLR (XINT (XPROCESS (proc)->infd), &input_wait_mask);
!       FD_CLR (XINT (XPROCESS (proc)->infd), &non_keyboard_wait_mask);
      }
!   else if (EQ (XPROCESS (proc)->filter, Qt))
      {
!       FD_SET (XINT (XPROCESS (proc)->infd), &input_wait_mask);
!       FD_SET (XINT (XPROCESS (proc)->infd), &non_keyboard_wait_mask);
      }
!   XPROCESS (proc)->filter = filter;
    return filter;
  }
--- 763,781 ----
  The filter gets two arguments: the process and the string of output.\n\
  If the process has a filter, its buffer is not used for output.")
!   (process, filter)
!      register Lisp_Object process, filter;
  {
!   CHECK_PROCESS (process, 0);
    if (EQ (filter, Qt))
      {
!       FD_CLR (XINT (XPROCESS (process)->infd), &input_wait_mask);
!       FD_CLR (XINT (XPROCESS (process)->infd), &non_keyboard_wait_mask);
      }
!   else if (EQ (XPROCESS (process)->filter, Qt))
      {
!       FD_SET (XINT (XPROCESS (process)->infd), &input_wait_mask);
!       FD_SET (XINT (XPROCESS (process)->infd), &non_keyboard_wait_mask);
      }
!   XPROCESS (process)->filter = filter;
    return filter;
  }
*************** DEFUN ("process-filter", Fprocess_filter
*** 781,789 ****
    "Returns the filter function of PROCESS; nil if none.\n\
  See `set-process-filter' for more info on filter functions.")
!   (proc)
!      register Lisp_Object proc;
  {
!   CHECK_PROCESS (proc, 0);
!   return XPROCESS (proc)->filter;
  }
  
--- 785,793 ----
    "Returns the filter function of PROCESS; nil if none.\n\
  See `set-process-filter' for more info on filter functions.")
!   (process)
!      register Lisp_Object process;
  {
!   CHECK_PROCESS (process, 0);
!   return XPROCESS (process)->filter;
  }
  
*************** DEFUN ("set-process-sentinel", Fset_proc
*** 793,801 ****
  The sentinel is called as a function when the process changes state.\n\
  It gets two arguments: the process, and a string describing the change.")
!   (proc, sentinel)
!      register Lisp_Object proc, sentinel;
  {
!   CHECK_PROCESS (proc, 0);
!   XPROCESS (proc)->sentinel = sentinel;
    return sentinel;
  }
--- 797,805 ----
  The sentinel is called as a function when the process changes state.\n\
  It gets two arguments: the process, and a string describing the change.")
!   (process, sentinel)
!      register Lisp_Object process, sentinel;
  {
!   CHECK_PROCESS (process, 0);
!   XPROCESS (process)->sentinel = sentinel;
    return sentinel;
  }
*************** DEFUN ("process-sentinel", Fprocess_sent
*** 805,813 ****
    "Return the sentinel of PROCESS; nil if none.\n\
  See `set-process-sentinel' for more info on sentinels.")
!   (proc)
!      register Lisp_Object proc;
  {
!   CHECK_PROCESS (proc, 0);
!   return XPROCESS (proc)->sentinel;
  }
  
--- 809,817 ----
    "Return the sentinel of PROCESS; nil if none.\n\
  See `set-process-sentinel' for more info on sentinels.")
!   (process)
!      register Lisp_Object process;
  {
!   CHECK_PROCESS (process, 0);
!   return XPROCESS (process)->sentinel;
  }
  
*************** DEFUN ("set-process-window-size", Fset_p
*** 815,825 ****
    Sset_process_window_size, 3, 3, 0,
    "Tell PROCESS that it has logical window size HEIGHT and WIDTH.")
!   (proc, height, width)
!      register Lisp_Object proc, height, width;
  {
!   CHECK_PROCESS (proc, 0);
    CHECK_NATNUM (height, 0);
    CHECK_NATNUM (width, 0);
!   if (set_window_size (XINT (XPROCESS (proc)->infd),
  		       XINT (height), XINT(width)) <= 0)
      return Qnil;
--- 819,829 ----
    Sset_process_window_size, 3, 3, 0,
    "Tell PROCESS that it has logical window size HEIGHT and WIDTH.")
!   (process, height, width)
!      register Lisp_Object process, height, width;
  {
!   CHECK_PROCESS (process, 0);
    CHECK_NATNUM (height, 0);
    CHECK_NATNUM (width, 0);
!   if (set_window_size (XINT (XPROCESS (process)->infd),
  		       XINT (height), XINT(width)) <= 0)
      return Qnil;
*************** DEFUN ("process-kill-without-query", Fpr
*** 833,844 ****
  Optional second argument if non-nil says to require a query.\n\
  Value is t if a query was formerly required.")
!   (proc, value)
!      register Lisp_Object proc, value;
  {
    Lisp_Object tem;
  
!   CHECK_PROCESS (proc, 0);
!   tem = XPROCESS (proc)->kill_without_query;
!   XPROCESS (proc)->kill_without_query = Fnull (value);
  
    return Fnull (tem);
--- 837,848 ----
  Optional second argument if non-nil says to require a query.\n\
  Value is t if a query was formerly required.")
!   (process, value)
!      register Lisp_Object process, value;
  {
    Lisp_Object tem;
  
!   CHECK_PROCESS (process, 0);
!   tem = XPROCESS (process)->kill_without_query;
!   XPROCESS (process)->kill_without_query = Fnull (value);
  
    return Fnull (tem);
*************** Remaining arguments are strings to give 
*** 1142,1146 ****
  
  /* This function is the unwind_protect form for Fstart_process.  If
!    PROC doesn't have its pid set, then we know someone has signalled
     an error and the process wasn't started successfully, so we should
     remove it from the process list.  */
--- 1146,1150 ----
  
  /* This function is the unwind_protect form for Fstart_process.  If
!    PROC doesn't have its pid set, then we know someone has signaled
     an error and the process wasn't started successfully, so we should
     remove it from the process list.  */
*************** create_process (process, new_argv, curre
*** 1198,1204 ****
--- 1202,1218 ----
    int pid, inchannel, outchannel;
    int sv[2];
+ #ifdef POSIX_SIGNALS
+   sigset_t procmask;
+   sigset_t blocked;
+   struct sigaction sigint_action;
+   struct sigaction sigquit_action;
+ #ifdef AIX
+   struct sigaction sighup_action;
+ #endif
+ #else /* !POSIX_SIGNALS */
  #ifdef SIGCHLD
    SIGTYPE (*sigchld)();
  #endif
+ #endif /* !POSIX_SIGNALS */
    /* Use volatile to protect variables from being clobbered by longjmp.  */
    volatile int forkin, forkout;
*************** create_process (process, new_argv, curre
*** 1242,1254 ****
  #else /* not SKTPAIR */
      {
- #ifdef WINDOWSNT
-       pipe_with_inherited_out (sv);
-       inchannel = sv[0];
-       forkout = sv[1];
- 
-       pipe_with_inherited_in (sv);
-       forkin = sv[0];
-       outchannel = sv[1];
- #else /* not WINDOWSNT */
        pipe (sv);
        inchannel = sv[0];
--- 1256,1259 ----
*************** create_process (process, new_argv, curre
*** 1257,1261 ****
        outchannel = sv[1];
        forkin = sv[0];
- #endif /* not WINDOWSNT */
      }
  #endif /* not SKTPAIR */
--- 1262,1265 ----
*************** create_process (process, new_argv, curre
*** 1278,1284 ****
--- 1282,1290 ----
  #ifdef O_NONBLOCK
    fcntl (inchannel, F_SETFL, O_NONBLOCK);
+   fcntl (outchannel, F_SETFL, O_NONBLOCK);
  #else
  #ifdef O_NDELAY
    fcntl (inchannel, F_SETFL, O_NDELAY);
+   fcntl (outchannel, F_SETFL, O_NDELAY);
  #endif
  #endif
*************** create_process (process, new_argv, curre
*** 1299,1302 ****
--- 1305,1326 ----
    /* Delay interrupts until we have a chance to store
       the new fork's pid in its process structure */
+ #ifdef POSIX_SIGNALS
+   sigemptyset (&blocked);
+ #ifdef SIGCHLD
+   sigaddset (&blocked, SIGCHLD);
+ #endif
+ #ifdef HAVE_VFORK
+   /* On many hosts (e.g. Solaris 2.4), if a vforked child calls `signal',
+      this sets the parent's signal handlers as well as the child's.
+      So delay all interrupts whose handlers the child might munge,
+      and record the current handlers so they can be restored later.  */
+   sigaddset (&blocked, SIGINT );  sigaction (SIGINT , 0, &sigint_action );
+   sigaddset (&blocked, SIGQUIT);  sigaction (SIGQUIT, 0, &sigquit_action);
+ #ifdef AIX
+   sigaddset (&blocked, SIGHUP );  sigaction (SIGHUP , 0, &sighup_action );
+ #endif
+ #endif /* HAVE_VFORK */
+   sigprocmask (SIG_BLOCK, &blocked, &procmask);
+ #else /* !POSIX_SIGNALS */
  #ifdef SIGCHLD
  #ifdef BSD4_1
*************** create_process (process, new_argv, curre
*** 1313,1316 ****
--- 1337,1341 ----
  #endif /* not BSD4_1 */
  #endif /* SIGCHLD */
+ #endif /* !POSIX_SIGNALS */
  
    FD_SET (inchannel, &input_wait_mask);
*************** create_process (process, new_argv, curre
*** 1456,1459 ****
--- 1481,1491 ----
  #endif /* HAVE_PTYS */
  
+ 	signal (SIGINT, SIG_DFL);
+ 	signal (SIGQUIT, SIG_DFL);
+ 
+ 	/* Stop blocking signals in the child.  */
+ #ifdef POSIX_SIGNALS
+ 	sigprocmask (SIG_SETMASK, &procmask, 0);
+ #else /* !POSIX_SIGNALS */
  #ifdef SIGCHLD
  #ifdef BSD4_1
*************** create_process (process, new_argv, curre
*** 1469,1475 ****
  #endif /* not BSD4_1 */
  #endif /* SIGCHLD */
! 
! 	signal (SIGINT, SIG_DFL);
! 	signal (SIGQUIT, SIG_DFL);
  
  	if (pty_flag)
--- 1501,1505 ----
  #endif /* not BSD4_1 */
  #endif /* SIGCHLD */
! #endif /* !POSIX_SIGNALS */
  
  	if (pty_flag)
*************** create_process (process, new_argv, curre
*** 1486,1489 ****
--- 1516,1520 ----
    }
  
+   /* This runs in the Emacs process.  */
    if (pid < 0)
      {
*************** create_process (process, new_argv, curre
*** 1492,1525 ****
        if (forkin != forkout && forkout >= 0)
  	close (forkout);
-       report_file_error ("Doing vfork", Qnil);
      }
!   
!   XSETFASTINT (XPROCESS (process)->pid, pid);
  
  #ifdef WINDOWSNT
!   register_child (pid, inchannel);
  #endif /* WINDOWSNT */
  
!   /* If the subfork execv fails, and it exits,
!      this close hangs.  I don't know why.
!      So have an interrupt jar it loose.  */
!   stop_polling ();
!   signal (SIGALRM, create_process_1);
!   alarm (1);
!   XPROCESS (process)->subtty = Qnil;
!   if (forkin >= 0)
!     close (forkin);
!   alarm (0);
!   start_polling ();
!   if (forkin != forkout && forkout >= 0)
!     close (forkout);
  
  #ifdef HAVE_PTYS
!   if (pty_flag)
!     XPROCESS (process)->tty_name = build_string (pty_name);
!   else
  #endif
!     XPROCESS (process)->tty_name = Qnil;
  
  #ifdef SIGCHLD
  #ifdef BSD4_1
--- 1523,1572 ----
        if (forkin != forkout && forkout >= 0)
  	close (forkout);
      }
!   else
!     {
!       /* vfork succeeded.  */
!       XSETFASTINT (XPROCESS (process)->pid, pid);
  
  #ifdef WINDOWSNT
!       register_child (pid, inchannel);
  #endif /* WINDOWSNT */
  
!       /* If the subfork execv fails, and it exits,
! 	 this close hangs.  I don't know why.
! 	 So have an interrupt jar it loose.  */
!       stop_polling ();
!       signal (SIGALRM, create_process_1);
!       alarm (1);
!       XPROCESS (process)->subtty = Qnil;
!       if (forkin >= 0)
! 	close (forkin);
!       alarm (0);
!       start_polling ();
!       if (forkin != forkout && forkout >= 0)
! 	close (forkout);
  
  #ifdef HAVE_PTYS
!       if (pty_flag)
! 	XPROCESS (process)->tty_name = build_string (pty_name);
!       else
  #endif
! 	XPROCESS (process)->tty_name = Qnil;
!     }
  
+   /* Restore the signal state whether vfork succeeded or not.
+      (We will signal an error, below, if it failed.)  */
+ #ifdef POSIX_SIGNALS
+ #ifdef HAVE_VFORK
+   /* Restore the parent's signal handlers.  */
+   sigaction (SIGINT, &sigint_action, 0);
+   sigaction (SIGQUIT, &sigquit_action, 0);
+ #ifdef AIX
+   sigaction (SIGHUP, &sighup_action, 0);
+ #endif
+ #endif /* HAVE_VFORK */
+   /* Stop blocking signals in the parent.  */
+   sigprocmask (SIG_SETMASK, &procmask, 0);
+ #else /* !POSIX_SIGNALS */
  #ifdef SIGCHLD
  #ifdef BSD4_1
*************** create_process (process, new_argv, curre
*** 1539,1542 ****
--- 1586,1594 ----
  #endif /* not BSD4_1 */
  #endif /* SIGCHLD */
+ #endif /* !POSIX_SIGNALS */
+ 
+   /* Now generate the error if vfork failed.  */
+   if (pid < 0)
+     report_file_error ("Doing vfork", Qnil);
  }
  #endif /* not VMS */
*************** Fourth arg SERVICE is name of the servic
*** 1597,1600 ****
--- 1649,1659 ----
      }
  
+   /* Slow down polling to every ten seconds.
+      Some kernels have a bug which causes retrying connect to fail
+      after a connect.  Polling can interfere with gethostbyname too.  */
+ #ifdef POLL_FOR_INPUT
+   bind_polling_period (10);
+ #endif
+ 
  #ifndef TERM
    while (1)
*************** Fourth arg SERVICE is name of the servic
*** 1603,1607 ****
--- 1662,1669 ----
        h_errno = 0;
  #endif
+       immediate_quit = 1;
+       QUIT;
        host_info_ptr = gethostbyname (XSTRING (host)->data);
+       immediate_quit = 0;
  #ifdef TRY_AGAIN
        if (! (host_info_ptr == 0 && h_errno == TRY_AGAIN))
*************** Fourth arg SERVICE is name of the servic
*** 1629,1633 ****
        host_info.h_addr = (char*)(&numeric_addr);
        addr_list[1] = 0;
!       host_info.h_length = strlen (addr_list[0]);
      }
  
--- 1691,1696 ----
        host_info.h_addr = (char*)(&numeric_addr);
        addr_list[1] = 0;
!       /* numeric_addr isn't null-terminated; it has fixed length.  */
!       host_info.h_length = sizeof (numeric_addr);
      }
  
*************** Fourth arg SERVICE is name of the servic
*** 1651,1662 ****
      unrequest_sigio ();
  
-   /* Slow down polling to every ten seconds.
-      Some kernels have a bug which causes retrying connect to fail
-      after a connect.  */
- #ifdef POLL_FOR_INPUT
-   bind_polling_period (10);
- #endif
- 
   loop:
    if (connect (s, (struct sockaddr *) &address, sizeof address) == -1
        && errno != EISCONN)
--- 1714,1722 ----
      unrequest_sigio ();
  
   loop:
+ 
+   immediate_quit = 1;
+   QUIT;
+ 
    if (connect (s, (struct sockaddr *) &address, sizeof address) == -1
        && errno != EISCONN)
*************** Fourth arg SERVICE is name of the servic
*** 1664,1667 ****
--- 1724,1729 ----
        int xerrno = errno;
  
+       immediate_quit = 0;
+ 
        if (errno == EINTR)
  	goto loop;
*************** Fourth arg SERVICE is name of the servic
*** 1686,1689 ****
--- 1748,1753 ----
      }
  
+   immediate_quit = 0;
+ 
  #ifdef POLL_FOR_INPUT
    unbind_to (count, Qnil);
*************** Fourth arg SERVICE is name of the servic
*** 1727,1731 ****
    XPROCESS (proc)->command = Qnil;
    XPROCESS (proc)->pid = Qnil;
!   XSETINT (XPROCESS (proc)->infd, s);
    XSETINT (XPROCESS (proc)->outfd, outch);
    XPROCESS (proc)->status = Qrun;
--- 1791,1795 ----
    XPROCESS (proc)->command = Qnil;
    XPROCESS (proc)->pid = Qnil;
!   XSETINT (XPROCESS (proc)->infd, inch);
    XSETINT (XPROCESS (proc)->outfd, outch);
    XPROCESS (proc)->status = Qrun;
*************** seconds and microseconds to wait; return
*** 1820,1825 ****
  or not there is input.\n\
  Return non-nil iff we received any output before the timeout expired.")
!   (proc, timeout, timeout_msecs)
!      register Lisp_Object proc, timeout, timeout_msecs;
  {
    int seconds;
--- 1884,1889 ----
  or not there is input.\n\
  Return non-nil iff we received any output before the timeout expired.")
!   (process, timeout, timeout_msecs)
!      register Lisp_Object process, timeout, timeout_msecs;
  {
    int seconds;
*************** Return non-nil iff we received any outpu
*** 1856,1865 ****
        CHECK_NUMBER (timeout, 1);
        seconds = XINT (timeout);
!       if (seconds <= 0)
  	seconds = -1;
      }
    else
      {
!       if (NILP (proc))
  	seconds = -1;
        else
--- 1920,1929 ----
        CHECK_NUMBER (timeout, 1);
        seconds = XINT (timeout);
!       if (seconds < 0 || (seconds == 0 && useconds == 0))
  	seconds = -1;
      }
    else
      {
!       if (NILP (process))
  	seconds = -1;
        else
*************** Return non-nil iff we received any outpu
*** 1867,1875 ****
      }
  
!   if (NILP (proc))
!     XSETFASTINT (proc, 0);
  
    return
!     (wait_reading_process_input (seconds, useconds, proc, 0)
       ? Qt : Qnil);
  }
--- 1931,1939 ----
      }
  
!   if (NILP (process))
!     XSETFASTINT (process, 0);
  
    return
!     (wait_reading_process_input (seconds, useconds, process, 0)
       ? Qt : Qnil);
  }
*************** Return non-nil iff we received any outpu
*** 1886,1889 ****
--- 1950,1959 ----
  static int waiting_for_user_input_p;
  
+ /* This is here so breakpoints can be put on it.  */
+ static
+ wait_reading_process_input_1 ()
+ {
+ }
+ 
  /* Read and dispose of subprocess output while waiting for timeout to
     elapse and/or keyboard input to be available.
*************** wait_reading_process_input (time_limit, 
*** 1965,1968 ****
--- 2035,2040 ----
    while (1)
      {
+       int timeout_reduced_for_timers = 0;
+ 
        /* If calling from keyboard input, do not quit
  	 since we want to return C-g as an input character.
*************** wait_reading_process_input (time_limit, 
*** 1997,2000 ****
--- 2069,2110 ----
  	}
  
+       /* Normally we run timers here.
+ 	 But not if wait_for_cell; in those cases,
+ 	 the wait is supposed to be short,
+ 	 and those callers cannot handle running arbitrary Lisp code here.  */
+       if (! wait_for_cell)
+ 	{
+ 	  EMACS_TIME timer_delay;
+ 	  int old_timers_run;
+ 
+ 	retry:
+ 	  old_timers_run = timers_run;
+ 	  timer_delay = timer_check (1);
+ 	  if (timers_run != old_timers_run && do_display)
+ 	    {
+ 	      redisplay_preserve_echo_area ();
+ 	      /* We must retry, since a timer may have requeued itself
+ 		 and that could alter the time_delay.  */
+ 	      goto retry;
+ 	    }
+ 
+ 	  if (! EMACS_TIME_NEG_P (timer_delay) && time_limit != -1)
+ 	    {
+ 	      EMACS_TIME difference;
+ 	      EMACS_SUB_TIME (difference, timer_delay, timeout);
+ 	      if (EMACS_TIME_NEG_P (difference))
+ 		{
+ 		  timeout = timer_delay;
+ 		  timeout_reduced_for_timers = 1;
+ 		}
+ 	    }
+ 	  /* If time_limit is -1, we are not going to wait at all.  */
+ 	  else if (time_limit != -1)
+ 	    {
+ 	      /* This is so a breakpoint can be put here.  */
+ 	      wait_reading_process_input_1 ();
+ 	    }
+ 	}
+ 
        /* Cause C-g and alarm signals to take immediate action,
  	 and cause input available signals to zero out timeout.
*************** wait_reading_process_input (time_limit, 
*** 2072,2076 ****
        do_pending_window_change ();
  
!       if (time_limit && nfds == 0) /* timeout elapsed */
  	break;
        if (nfds < 0)
--- 2182,2187 ----
        do_pending_window_change ();
  
!       if (time_limit && nfds == 0 && ! timeout_reduced_for_timers)
! 	/* We wanted the full specified time, so return now.  */
  	break;
        if (nfds < 0)
*************** wait_reading_process_input (time_limit, 
*** 2109,2113 ****
  	    }
  	  else
! 	    error("select error: %s", strerror (xerrno));
  	}
  #if defined(sun) && !defined(USG5_4)
--- 2220,2224 ----
  	    }
  	  else
! 	    error ("select error: %s", strerror (xerrno));
  	}
  #if defined(sun) && !defined(USG5_4)
*************** wait_reading_process_input (time_limit, 
*** 2128,2137 ****
  	 to give it higher priority than subprocesses */
  
!       /* We used to do this if wait_for_cell,
! 	 but that caused infinite recursion in selection request events.  */
!       if ((XINT (read_kbd) || wait_for_cell)
  	  && detect_input_pending ())
  	{
! 	  swallow_events ();
  	  if (detect_input_pending ())
  	    break;
--- 2239,2260 ----
  	 to give it higher priority than subprocesses */
  
!       if ((XINT (read_kbd) != 0)
! 	  && detect_input_pending_run_timers (do_display))
! 	{
! 	  swallow_events (do_display);
! 	  if (detect_input_pending_run_timers (do_display))
! 	    break;
! 	}
! 
!       /* If wait_for_cell. check for keyboard input
! 	 but don't run any timers.
! 	 ??? (It seems wrong to me to check for keyboard
! 	 input at all when wait_for_cell, but the code
! 	 has been this way since July 1994.
! 	 Try changing this after version 19.31.)  */
!       if (wait_for_cell
  	  && detect_input_pending ())
  	{
! 	  swallow_events (do_display);
  	  if (detect_input_pending ())
  	    break;
*************** wait_reading_process_input (time_limit, 
*** 2150,2154 ****
        if (XINT (read_kbd) && interrupt_input
  	  && (keyboard_bit_set (&Available)))
! 	kill (0, SIGIO);
  #endif
  
--- 2273,2277 ----
        if (XINT (read_kbd) && interrupt_input
  	  && (keyboard_bit_set (&Available)))
! 	kill (getpid (), SIGIO);
  #endif
  
*************** read_process_output (proc, channel)
*** 2331,2348 ****
  
    if (proc_buffered_char[channel] < 0)
! #ifdef WINDOWSNT
!     nchars = read_child_output (channel, chars, sizeof (chars));
! #else
!     nchars = read (channel, chars, sizeof chars);
! #endif
    else
      {
        chars[0] = proc_buffered_char[channel];
        proc_buffered_char[channel] = -1;
! #ifdef WINDOWSNT
!       nchars = read_child_output (channel, chars + 1, sizeof (chars) - 1);
! #else
!       nchars = read (channel, chars + 1, sizeof chars - 1);
! #endif
        if (nchars < 0)
  	nchars = 1;
--- 2454,2463 ----
  
    if (proc_buffered_char[channel] < 0)
!     nchars = read (channel, chars, sizeof (chars));
    else
      {
        chars[0] = proc_buffered_char[channel];
        proc_buffered_char[channel] = -1;
!       nchars = read (channel, chars + 1, sizeof (chars) - 1);
        if (nchars < 0)
  	nchars = 1;
*************** SIGCODE may be an integer, or a symbol w
*** 3096,3105 ****
  #undef handle_signal
  
- #ifdef WINDOWSNT
-   /* Only works for kill-type signals */
-   return make_number (win32_kill_process (XINT (pid), XINT (sigcode)));
- #else
    return make_number (kill (XINT (pid), XINT (sigcode)));
- #endif
  }
  
--- 3211,3215 ----
*************** sigchld_handler (signo)
*** 3237,3241 ****
  
        p = 0;
!       for (tail = Vprocess_alist; XSYMBOL (tail) != XSYMBOL (Qnil); tail = XCONS (tail)->cdr)
  	{
  	  proc = XCONS (XCONS (tail)->car)->cdr;
--- 3347,3351 ----
  
        p = 0;
!       for (tail = Vprocess_alist; CONSP (tail); tail = XCONS (tail)->cdr)
  	{
  	  proc = XCONS (XCONS (tail)->car)->cdr;
*************** sigchld_handler (signo)
*** 3249,3253 ****
  	 in yet.  */
        if (p == 0)
! 	for (tail = Vprocess_alist; XSYMBOL (tail) != XSYMBOL (Qnil); tail = XCONS (tail)->cdr)
  	  {
  	    proc = XCONS (XCONS (tail)->car)->cdr;
--- 3359,3363 ----
  	 in yet.  */
        if (p == 0)
! 	for (tail = Vprocess_alist; CONSP (tail); tail = XCONS (tail)->cdr)
  	  {
  	    proc = XCONS (XCONS (tail)->car)->cdr;
*************** The value takes effect when `start-proce
*** 3690,3693 ****
--- 3800,3805 ----
  extern int frame_garbaged;
  
+ extern EMACS_TIME timer_check ();
+ extern int timers_run;
  
  /* As described above, except assuming that there are no subprocesses:
*************** extern int frame_garbaged;
*** 3705,3708 ****
--- 3817,3822 ----
       -1 means caller will actually read the input, so don't throw to
         the quit handler.
+      a cons cell, meaning wait until its car is non-nil
+        (and gobble terminal input into the buffer if any arrives), or
       We know that read_kbd will never be a Lisp_Process, since
       `subprocesses' isn't defined.
*************** wait_reading_process_input (time_limit, 
*** 3719,3731 ****
       int do_display;
  {
!   EMACS_TIME end_time, timeout, *timeout_p;
!   int waitchannels;
  
    /* What does time_limit really mean?  */
    if (time_limit || microsecs)
      {
-       /* It's not infinite.  */
-       timeout_p = &timeout;
- 
        if (time_limit == -1)
  	/* In fact, it's zero.  */
--- 3833,3851 ----
       int do_display;
  {
!   EMACS_TIME end_time, timeout;
!   SELECT_TYPE waitchannels;
!   int xerrno;
!   Lisp_Object *wait_for_cell = 0;
! 
!   /* If waiting for non-nil in a cell, record where.  */
!   if (CONSP (read_kbd))
!     {
!       wait_for_cell = &XCONS (read_kbd)->car;
!       XSETFASTINT (read_kbd, 0);
!     }
  
    /* What does time_limit really mean?  */
    if (time_limit || microsecs)
      {
        if (time_limit == -1)
  	/* In fact, it's zero.  */
*************** wait_reading_process_input (time_limit, 
*** 3740,3744 ****
    else
      /* It's infinite.  */
!     timeout_p = 0;
  
    /* Turn off periodic alarms (in case they are in use)
--- 3860,3864 ----
    else
      /* It's infinite.  */
!     EMACS_SET_SECS_USECS (timeout, 100000, 0);
  
    /* Turn off periodic alarms (in case they are in use)
*************** wait_reading_process_input (time_limit, 
*** 3749,3754 ****
      {
        int nfds;
! 
!       waitchannels = XINT (read_kbd) ? 1 : 0;
  
        /* If calling from keyboard input, do not quit
--- 3869,3873 ----
      {
        int nfds;
!       int timeout_reduced_for_timers = 0;
  
        /* If calling from keyboard input, do not quit
*************** wait_reading_process_input (time_limit, 
*** 3758,3769 ****
  	QUIT;
  
!       if (timeout_p)
  	{
! 	  EMACS_GET_TIME (*timeout_p);
! 	  EMACS_SUB_TIME (*timeout_p, end_time, *timeout_p);
! 	  if (EMACS_TIME_NEG_P (*timeout_p))
  	    break;
  	}
  
        /* Cause C-g and alarm signals to take immediate action,
  	 and cause input available signals to zero out timeout.  */
--- 3877,3926 ----
  	QUIT;
  
!       /* Exit now if the cell we're waiting for became non-nil.  */
!       if (wait_for_cell && ! NILP (*wait_for_cell))
! 	break;
! 
!       /* Compute time from now till when time limit is up */
!       /* Exit if already run out */
!       if (time_limit > 0 || microsecs)
  	{
! 	  EMACS_GET_TIME (timeout);
! 	  EMACS_SUB_TIME (timeout, end_time, timeout);
! 	  if (EMACS_TIME_NEG_P (timeout))
  	    break;
  	}
  
+       /* If our caller will not immediately handle keyboard events,
+ 	 run timer events directly.
+ 	 (Callers that will immediately read keyboard events
+ 	 call timer_delay on their own.)  */
+       if (! wait_for_cell)
+ 	{
+ 	  EMACS_TIME timer_delay;
+ 	  int old_timers_run;
+ 
+ 	retry:
+ 	  old_timers_run = timers_run;
+ 	  timer_delay = timer_check (1);
+ 	  if (timers_run != old_timers_run && do_display)
+ 	    {
+ 	      redisplay_preserve_echo_area ();
+ 	      /* We must retry, since a timer may have requeued itself
+ 		 and that could alter the time delay.  */
+ 	      goto retry;
+ 	    }
+ 
+ 	  if (! EMACS_TIME_NEG_P (timer_delay) && time_limit != -1)
+ 	    {
+ 	      EMACS_TIME difference;
+ 	      EMACS_SUB_TIME (difference, timer_delay, timeout);
+ 	      if (EMACS_TIME_NEG_P (difference))
+ 		{
+ 		  timeout = timer_delay;
+ 		  timeout_reduced_for_timers = 1;
+ 		}
+ 	    }
+ 	}
+ 
        /* Cause C-g and alarm signals to take immediate action,
  	 and cause input available signals to zero out timeout.  */
*************** wait_reading_process_input (time_limit, 
*** 3771,3784 ****
  	set_waiting_for_input (&timeout);
  
        /* If a frame has been newly mapped and needs updating,
  	 reprocess its display stuff.  */
        if (frame_garbaged && do_display)
! 	redisplay_preserve_echo_area ();
  
        if (XINT (read_kbd) && detect_input_pending ())
! 	nfds = 0;
        else
  	nfds = select (1, &waitchannels, (SELECT_TYPE *)0, (SELECT_TYPE *)0,
! 		       timeout_p);
  
        /* Make C-g and alarm signals set flags again */
--- 3928,3958 ----
  	set_waiting_for_input (&timeout);
  
+       /* Wait till there is something to do.  */
+ 
+       if (! XINT (read_kbd) && wait_for_cell == 0)
+ 	FD_ZERO (&waitchannels);
+       else
+ 	FD_SET (0, &waitchannels);
+ 
        /* If a frame has been newly mapped and needs updating,
  	 reprocess its display stuff.  */
        if (frame_garbaged && do_display)
! 	{
! 	  clear_waiting_for_input ();
! 	  redisplay_preserve_echo_area ();
! 	  if (XINT (read_kbd) < 0)
! 	    set_waiting_for_input (&timeout);
! 	}
  
        if (XINT (read_kbd) && detect_input_pending ())
! 	{
! 	  nfds = 0;
! 	  FD_ZERO (&waitchannels);
! 	}
        else
  	nfds = select (1, &waitchannels, (SELECT_TYPE *)0, (SELECT_TYPE *)0,
! 		       &timeout);
! 
!       xerrno = errno;
  
        /* Make C-g and alarm signals set flags again */
*************** wait_reading_process_input (time_limit, 
*** 3788,3797 ****
        do_pending_window_change ();
  
        if (nfds == -1)
  	{
  	  /* If the system call was interrupted, then go around the
  	     loop again.  */
! 	  if (errno == EINTR)
! 	    waitchannels = 0;
  	}
  #ifdef sun
--- 3962,3977 ----
        do_pending_window_change ();
  
+       if (time_limit && nfds == 0 && ! timeout_reduced_for_timers)
+ 	/* We waited the full specified time, so return now.  */
+ 	break;
+ 
        if (nfds == -1)
  	{
  	  /* If the system call was interrupted, then go around the
  	     loop again.  */
! 	  if (xerrno == EINTR)
! 	    FD_ZERO (&waitchannels);
! 	  else
! 	    error ("select error: %s", strerror (xerrno));
  	}
  #ifdef sun
*************** wait_reading_process_input (time_limit, 
*** 3802,3811 ****
  #ifdef SIGIO
        if (XINT (read_kbd) && interrupt_input && (waitchannels & 1))
! 	kill (0, SIGIO);
  #endif
  
!       /* If we have timed out (nfds == 0) or found some input (nfds > 0),
! 	 we should exit.  */
!       if (nfds >= 0)
  	break;
      }
--- 3982,4014 ----
  #ifdef SIGIO
        if (XINT (read_kbd) && interrupt_input && (waitchannels & 1))
! 	kill (getpid (), SIGIO);
  #endif
  
!       /* Check for keyboard input */
! 
!       if ((XINT (read_kbd) != 0)
! 	  && detect_input_pending_run_timers (do_display))
! 	{
! 	  swallow_events (do_display);
! 	  if (detect_input_pending_run_timers (do_display))
! 	    break;
! 	}
! 
!       /* If wait_for_cell. check for keyboard input
! 	 but don't run any timers.
! 	 ??? (It seems wrong to me to check for keyboard
! 	 input at all when wait_for_cell, but the code
! 	 has been this way since July 1994.
! 	 Try changing this after version 19.31.)  */
!       if (wait_for_cell
! 	  && detect_input_pending ())
! 	{
! 	  swallow_events (do_display);
! 	  if (detect_input_pending ())
! 	    break;
! 	}
! 
!       /* Exit now if the cell we're waiting for became non-nil.  */
!       if (wait_for_cell && ! NILP (*wait_for_cell))
  	break;
      }
diff -2rcpP --exclude=*.elc emacs-19.30/src/process.h emacs-19.31/src/process.h
*** emacs-19.30/src/process.h	Thu Jun 15 16:39:04 1995
--- emacs-19.31/src/process.h	Wed Jan 31 17:34:27 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** extern Lisp_Object Vprocess_alist;
*** 88,95 ****
  extern int synch_process_alive;
  
! /* Communicate exit status of synch process to from sigchld_handler
     to Fcall_process.  */
- extern int synch_process_retcode;
- extern char *synch_process_death;
  
  /* Nonzero => this is a string explaining death of synchronous subprocess.  */
--- 89,94 ----
  extern int synch_process_alive;
  
! /* Communicate exit status of sync process to from sigchld_handler
     to Fcall_process.  */
  
  /* Nonzero => this is a string explaining death of synchronous subprocess.  */
diff -2rcpP --exclude=*.elc emacs-19.30/src/puresize.h emacs-19.31/src/puresize.h
*** emacs-19.30/src/puresize.h	Tue Aug 29 16:44:19 1995
--- emacs-19.31/src/puresize.h	Mon Jan 15 04:06:29 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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 PURESIZE, the number of bytes of pure Lisp code to leave space for.
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* Define PURESIZE, the number of bytes of pure Lisp code to leave space for.
*************** the Free Software Foundation, 675 Mass A
*** 63,91 ****
  #endif
  
! #ifdef VIRT_ADDR_VARIES
  
  /* For machines like APOLLO where text and data can go anywhere
     in virtual memory.  */
! #define CHECK_IMPURE(obj) \
!   { extern EMACS_INT pure[]; \
!     if ((PNTR_COMPARISON_TYPE) XPNTR (obj) < (PNTR_COMPARISON_TYPE) ((char *) pure + PURESIZE) \
! 	&& (PNTR_COMPARISON_TYPE) XPNTR (obj) >= (PNTR_COMPARISON_TYPE) pure) \
!       pure_write_error (); }
  
  #else /* not VIRT_ADDR_VARIES */
  #ifdef PNTR_COMPARISON_TYPE
  
! /* when PNTR_COMPARISON_TYPE is not the default (unsigned int) */
! #define CHECK_IMPURE(obj) \
!   { extern char my_edata[]; \
!     if ((PNTR_COMPARISON_TYPE) XPNTR (obj) < (PNTR_COMPARISON_TYPE) my_edata) \
!       pure_write_error (); }
  
  #else /* not VIRT_ADDRESS_VARIES, not PNTR_COMPARISON_TYPE */
  
! #define CHECK_IMPURE(obj) \
!   { extern char my_edata[]; \
!     if (XPNTR (obj) < (unsigned int) my_edata) \
!       pure_write_error (); }
  
  #endif /* PNTR_COMPARISON_TYPE */
--- 64,99 ----
  #endif
  
! /* Signal an error if OBJ is pure.  */
! #define CHECK_IMPURE(obj) \
!   { if (PURE_P (obj))	  \
!       pure_write_error (); }
! 
! /* Define PURE_P.  */
  
+ #ifdef VIRT_ADDR_VARIES
  /* For machines like APOLLO where text and data can go anywhere
     in virtual memory.  */
! 
! extern EMACS_INT pure[];
! 
! #define PURE_P(obj) \
!  ((PNTR_COMPARISON_TYPE) XPNTR (obj) < (PNTR_COMPARISON_TYPE) ((char *) pure + PURESIZE) \
!   && (PNTR_COMPARISON_TYPE) XPNTR (obj) >= (PNTR_COMPARISON_TYPE) pure)
  
  #else /* not VIRT_ADDR_VARIES */
  #ifdef PNTR_COMPARISON_TYPE
+ /* When PNTR_COMPARISON_TYPE is not the default (unsigned int).  */
  
! extern char my_edata[];
! 
! #define PURE_P(obj) \
!   ((PNTR_COMPARISON_TYPE) XPNTR (obj) < (PNTR_COMPARISON_TYPE) my_edata)
  
  #else /* not VIRT_ADDRESS_VARIES, not PNTR_COMPARISON_TYPE */
  
! extern char my_edata[];
!     
! #define PURE_P(obj) \
!   (XPNTR (obj) < (unsigned int) my_edata)
  
  #endif /* PNTR_COMPARISON_TYPE */
diff -2rcpP --exclude=*.elc emacs-19.30/src/ralloc.c emacs-19.31/src/ralloc.c
*** emacs-19.30/src/ralloc.c	Sat Mar 25 21:33:39 1995
--- emacs-19.31/src/ralloc.c	Tue Apr  9 18:14:39 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  /* NOTES:
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* NOTES:
*************** static int extra_bytes;
*** 132,136 ****
  
     We try to make just one heap and make it larger as necessary.
!    But sometimes we can't do that, because we can't get continguous
     space to add onto the heap.  When that happens, we start a new heap.  */
     
--- 133,137 ----
  
     We try to make just one heap and make it larger as necessary.
!    But sometimes we can't do that, because we can't get contiguous
     space to add onto the heap.  When that happens, we start a new heap.  */
     
*************** static heap_ptr first_heap, last_heap;
*** 172,176 ****
     been collected.  They may only appear while r_alloc_freeze > 0, and will be
     freed when the arena is thawed.  Currently, these blocs are not reusable,
!    while the arena is frozen.  Very inefficent.  */
  
  typedef struct bp
--- 173,177 ----
     been collected.  They may only appear while r_alloc_freeze > 0, and will be
     freed when the arena is thawed.  Currently, these blocs are not reusable,
!    while the arena is frozen.  Very inefficient.  */
  
  typedef struct bp
*************** typedef struct bp
*** 181,185 ****
    POINTER data;
    SIZE size;
!   POINTER new_data;		/* tmporarily used for relocation */
    struct heap *heap; 		/* Heap this bloc is in.  */
  } *bloc_ptr;
--- 182,186 ----
    POINTER data;
    SIZE size;
!   POINTER new_data;		/* temporarily used for relocation */
    struct heap *heap; 		/* Heap this bloc is in.  */
  } *bloc_ptr;
*************** find_heap (address)
*** 221,226 ****
  
     If enough space is not presently available in our reserve, this means
!    getting more page-aligned space from the system. If the retuned space
!    is not contiguos to the last heap, allocate a new heap, and append it
  
     obtain does not try to keep track of whether space is in use
--- 222,227 ----
  
     If enough space is not presently available in our reserve, this means
!    getting more page-aligned space from the system.  If the returned space
!    is not contiguous to the last heap, allocate a new heap, and append it
  
     obtain does not try to keep track of whether space is in use
*************** r_alloc_sbrk (size)
*** 796,800 ****
        /* Allocate a page-aligned space.  GNU malloc would reclaim an
  	 extra space if we passed an unaligned one.  But we could
! 	 not always find a space which is contiguos to the previous.  */
        POINTER new_bloc_start;
        heap_ptr h = first_heap;
--- 797,801 ----
        /* Allocate a page-aligned space.  GNU malloc would reclaim an
  	 extra space if we passed an unaligned one.  But we could
! 	 not always find a space which is contiguous to the previous.  */
        POINTER new_bloc_start;
        heap_ptr h = first_heap;
*************** r_alloc_free (ptr)
*** 979,983 ****
  
     In case r_alloc_freeze is set, a new bloc is allocated, and the
!    memory copied to it.  Not very efficent.  We could traverse the
     bloc_list for a best fit of free blocs first.
  
--- 980,984 ----
  
     In case r_alloc_freeze is set, a new bloc is allocated, and the
!    memory copied to it.  Not very efficient.  We could traverse the
     bloc_list for a best fit of free blocs first.
  
*************** r_alloc_thaw ()
*** 1078,1082 ****
      abort ();
  
!   /* This frees all unused blocs.  It is not too inefficent, as the resize 
       and bcopy is done only once.  Afterwards, all unreferenced blocs are 
       already shrunk to zero size.  */
--- 1079,1083 ----
      abort ();
  
!   /* This frees all unused blocs.  It is not too inefficient, as the resize 
       and bcopy is done only once.  Afterwards, all unreferenced blocs are 
       already shrunk to zero size.  */
*************** r_alloc_check ()
*** 1164,1168 ****
--- 1165,1173 ----
        assert (h->prev == ph);
        assert ((POINTER) ROUNDUP (h->end) == h->end);
+ #if 0 /* ??? The code in ralloc.c does not really try to ensure
+ 	 the heap start has any sort of alignment.
+ 	 Perhaps it should.  */
        assert ((POINTER) MEM_ROUNDUP (h->start) == h->start);
+ #endif
        assert ((POINTER) MEM_ROUNDUP (h->bloc_start) == h->bloc_start);
        assert (h->start <= h->bloc_start && h->bloc_start <= h->end);
diff -2rcpP --exclude=*.elc emacs-19.30/src/regex.c emacs-19.31/src/regex.c
*** emacs-19.30/src/regex.c	Wed Nov 15 21:51:18 1995
--- emacs-19.31/src/regex.c	Fri May 24 14:33:51 1996
***************
*** 4,8 ****
     internationalization features.)
  
!    Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc.
  
     This program is free software; you can redistribute it and/or modify
--- 4,8 ----
     internationalization features.)
  
!    Copyright (C) 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
  
     This program is free software; you can redistribute it and/or modify
***************
*** 18,22 ****
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
!    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
  
  /* AIX requires this to be the first thing in the file. */
--- 18,23 ----
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
!    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
!    USA.  */
  
  /* AIX requires this to be the first thing in the file. */
*************** static const char *re_error_msgid[] =
*** 1004,1008 ****
  
  /* Roughly the maximum number of failure points on the stack.  Would be
!    exactly that if always used MAX_FAILURE_SPACE each time we failed.
     This is a variable only so users of regex can assign to it; we never
     change it ourselves.  */
--- 1005,1009 ----
  
  /* Roughly the maximum number of failure points on the stack.  Would be
!    exactly that if always used MAX_FAILURE_ITEMS items each time we failed.
     This is a variable only so users of regex can assign to it; we never
     change it ourselves.  */
*************** typedef struct
*** 1221,1225 ****
  
  /* We push at most this many items on the stack.  */
! #define MAX_FAILURE_ITEMS ((num_regs - 1) * NUM_REG_ITEMS + NUM_NONREG_ITEMS)
  
  /* We actually push this many items.  */
--- 1222,1229 ----
  
  /* We push at most this many items on the stack.  */
! /* We used to use (num_regs - 1), which is the number of registers
!    this regexp will save; but that was changed to 5
!    to avoid stack overflow for a regexp with lots of parens.  */
! #define MAX_FAILURE_ITEMS (5 * NUM_REG_ITEMS + NUM_NONREG_ITEMS)
  
  /* We actually push this many items.  */
*************** static boolean alt_match_null_string_p (
*** 3445,3448 ****
--- 3449,3454 ----
     == Sword)
  
+ /* Disabled due to a compiler bug -- see comment at case wordbound */
+ #if 0
  /* Test if the character before D and the one at D differ with respect
     to being word-constituent.  */
*************** static boolean alt_match_null_string_p (
*** 3450,3454 ****
    (AT_STRINGS_BEG (d) || AT_STRINGS_END (d)				\
     || WORDCHAR_P (d - 1) != WORDCHAR_P (d))
! 
  
  /* Free everything we malloc.  */
--- 3456,3460 ----
    (AT_STRINGS_BEG (d) || AT_STRINGS_END (d)				\
     || WORDCHAR_P (d - 1) != WORDCHAR_P (d))
! #endif
  
  /* Free everything we malloc.  */
*************** re_match_2_internal (bufp, string1, size
*** 4500,4506 ****
  
                  if ((re_opcode_t) p1[3] == exactn
! 		    && ! ((int) p2[1] * BYTEWIDTH > (int) p1[4]
! 			  && (p2[1 + p1[4] / BYTEWIDTH]
! 			      & (1 << (p1[4] % BYTEWIDTH)))))
                    {
    		    p[-3] = (unsigned char) pop_failure_jump;
--- 4506,4512 ----
  
                  if ((re_opcode_t) p1[3] == exactn
! 		    && ! ((int) p2[1] * BYTEWIDTH > (int) p1[5]
! 			  && (p2[2 + p1[5] / BYTEWIDTH]
! 			      & (1 << (p1[5] % BYTEWIDTH)))))
                    {
    		    p[-3] = (unsigned char) pop_failure_jump;
*************** re_match_2_internal (bufp, string1, size
*** 4674,4688 ****
            }
  
!         case wordbound:
!           DEBUG_PRINT1 ("EXECUTING wordbound.\n");
!           if (AT_WORD_BOUNDARY (d))
  	    break;
!           goto fail;
  
  	case notwordbound:
!           DEBUG_PRINT1 ("EXECUTING notwordbound.\n");
  	  if (AT_WORD_BOUNDARY (d))
  	    goto fail;
!           break;
  
  	case wordbeg:
--- 4680,4731 ----
            }
  
! #if 0
! 	/* The DEC Alpha C compiler 3.x generates incorrect code for the
! 	   test  WORDCHAR_P (d - 1) != WORDCHAR_P (d)  in the expansion of
! 	   AT_WORD_BOUNDARY, so this code is disabled.  Expanding the
! 	   macro and introducing temporary variables works around the bug.  */
! 
! 	case wordbound:
! 	  DEBUG_PRINT1 ("EXECUTING wordbound.\n");
! 	  if (AT_WORD_BOUNDARY (d))
  	    break;
! 	  goto fail;
  
  	case notwordbound:
! 	  DEBUG_PRINT1 ("EXECUTING notwordbound.\n");
  	  if (AT_WORD_BOUNDARY (d))
  	    goto fail;
! 	  break;
! #else
! 	case wordbound:
! 	{
! 	  boolean prevchar, thischar;
! 
! 	  DEBUG_PRINT1 ("EXECUTING wordbound.\n");
! 	  if (AT_STRINGS_BEG (d) || AT_STRINGS_END (d))
! 	    break;
! 
! 	  prevchar = WORDCHAR_P (d - 1);
! 	  thischar = WORDCHAR_P (d);
! 	  if (prevchar != thischar)
! 	    break;
! 	  goto fail;
! 	}
! 
!       case notwordbound:
! 	{
! 	  boolean prevchar, thischar;
! 
! 	  DEBUG_PRINT1 ("EXECUTING notwordbound.\n");
! 	  if (AT_STRINGS_BEG (d) || AT_STRINGS_END (d))
! 	    goto fail;
! 
! 	  prevchar = WORDCHAR_P (d - 1);
! 	  thischar = WORDCHAR_P (d);
! 	  if (prevchar != thischar)
! 	    goto fail;
! 	  break;
! 	}
! #endif
  
  	case wordbeg:
*************** re_compile_pattern (pattern, length, buf
*** 5138,5142 ****
     them unless specifically requested.  */
  
! #ifdef _REGEX_RE_COMP
  
  /* BSD has one and only one pattern buffer.  */
--- 5181,5185 ----
     them unless specifically requested.  */
  
! #if defined (_REGEX_RE_COMP) || defined (_LIBC)
  
  /* BSD has one and only one pattern buffer.  */
*************** re_exec (s)
*** 5192,5195 ****
--- 5235,5247 ----
      0 <= re_search (&re_comp_buf, s, len, 0, len, (struct re_registers *) 0);
  }
+ 
+ #ifdef _LIBC
+ /* Make these definitions weak in libc, so POSIX programs can redefine
+    these names if they don't use our functions, and still use
+    regcomp/regexec below without link errors.  */
+ weak_symbol (re_comp)
+ weak_symbol (re_exec)
+ #endif
+ 
  #endif /* _REGEX_RE_COMP */
  
*************** regfree (preg)
*** 5436,5445 ****
  
  #endif /* not emacs  */
- 
- /*
- Local variables:
- make-backup-files: t
- version-control: t
- trim-versions-without-asking: nil
- End:
- */
--- 5488,5489 ----
diff -2rcpP --exclude=*.elc emacs-19.30/src/regex.h emacs-19.31/src/regex.h
*** emacs-19.30/src/regex.h	Wed Oct 18 16:20:34 1995
--- emacs-19.31/src/regex.h	Mon Jan 29 17:27:25 1996
***************
*** 16,20 ****
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
!    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
  
  #ifndef __REGEXP_LIBRARY_H__
--- 16,21 ----
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
!    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
!    USA.  */
  
  #ifndef __REGEXP_LIBRARY_H__
diff -2rcpP --exclude=*.elc emacs-19.30/src/region-cache.c emacs-19.31/src/region-cache.c
*** emacs-19.30/src/region-cache.c	Thu Apr  6 22:15:53 1995
--- emacs-19.31/src/region-cache.c	Tue Apr  9 18:13:39 1996
*************** GNU General Public License for more deta
*** 17,21 ****
  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.  */
  
  
--- 17,22 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/region-cache.h emacs-19.31/src/region-cache.h
*** emacs-19.30/src/region-cache.h	Thu Apr  6 22:02:30 1995
--- emacs-19.31/src/region-cache.h	Mon Jan 15 04:06:29 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/aix3-1.h emacs-19.31/src/s/aix3-1.h
*** emacs-19.30/src/s/aix3-1.h	Sun Aug 20 12:02:41 1995
--- emacs-19.31/src/s/aix3-1.h	Mon Jan 15 04:16:40 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/aix3-2-5.h emacs-19.31/src/s/aix3-2-5.h
*** emacs-19.30/src/s/aix3-2-5.h	Sun Aug 20 11:52:51 1995
--- emacs-19.31/src/s/aix3-2-5.h	Sun Mar 17 13:03:45 1996
***************
*** 24,25 ****
--- 24,29 ----
  #undef _setjmp
  #undef _longjmp
+ 
+ /* Bill Woodward <wpwood@austin.ibm.com> says:
+    libIM *must* precede libXm, to avoid getting aixLoadIM error messages.  */
+ #define LIB_MOTIF -lIM -lXm
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/aix3-2.h emacs-19.31/src/s/aix3-2.h
*** emacs-19.30/src/s/aix3-2.h	Thu Mar  3 10:57:44 1994
--- emacs-19.31/src/s/aix3-2.h	Sun Mar 17 13:03:48 1996
***************
*** 15,19 ****
--- 15,27 ----
  #define C_SWITCH_SYSTEM -ma -qmaxmem=4000
  #endif
+ 
  #define HAVE_ALLOCA
+ /* Adrian Colley <Adrian.Colley@three.serpentine.com> says this is needed.  */
+ #ifndef NOT_C_CODE
+ #ifndef AIX4
+  #pragma alloca
+ #endif
+ #endif
+ 
  #undef rindex
  #undef index
***************
*** 33,34 ****
--- 41,49 ----
  #define C_SWITCH_OPTIMIZE
  #endif
+ 
+ /* The character-composition stuff is broken in X11R5.
+    Even with XIMStatusNothing aliased to XIMStatusNone,
+    tranle@intellicorp.com (Minh Tran-Le) reports that enabling
+    the internationalization code causes the modifier keys C, M and Shift
+    to beep after a mouse click.  */
+ #define X11R5_INHIBIT_I18N
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/aix4-1.h emacs-19.31/src/s/aix4-1.h
*** emacs-19.30/src/s/aix4-1.h	Sun Aug 20 11:49:28 1995
--- emacs-19.31/src/s/aix4-1.h	Mon Mar 18 01:44:55 1996
***************
*** 3,12 ****
  #include "aix4.h"
  
- #if 0 /* Tomotake FURUHATA <furuhata@trl.ibm.co.jp> says this is needed
- 	 in Mule, but we don't know why.  Anyway, it's not needed now.  */
- #define SYSTEM_MALLOC
- #endif
- 
  /* olson@mcs.anl.gov says -li18n is needed by -lXm.  */
  #define LIB_MOTIF -lXm -li18n
  
--- 3,8 ----
  #include "aix4.h"
  
  /* olson@mcs.anl.gov says -li18n is needed by -lXm.  */
+ #undef LIB_MOTIF
  #define LIB_MOTIF -lXm -li18n
  
***************
*** 14,15 ****
--- 10,31 ----
  #undef _NO_PROTO
  #endif
+ 
+ /* For AIX, it turns out compiling emacs under AIX 3.2.4 REQUIRES "cc -g"
+    because "cc -O" crashes.  Under AIX 3.2.5, "cc -O" is required because
+    "cc -g" crashes. Go figure.  --floppy@merlin.mit.edu.
+    4.1 seems to need -g again. -- larry@vaquita.mitra.com.  */
+ /* David Edelsohn <dje@watson.ibm.com> says that this actually depends
+    on the version of XLC, which can't be predicted from the system version.
+    What a mess!  */
+ #ifndef __GNUC__
+ #undef C_DEBUG_SWITCH
+ #undef C_OPTIMIZE_SWITCH
+ #define C_DEBUG_SWITCH -g
+ #endif
+ 
+ /* The X internationalization stuff is still broken in AIX 4.1, so
+    don't #undef X11R5_INHIBIT_I18N
+    It still causes shift, ctrl, and alt to resend the last character,
+    if it was a control character like tab, enter, backspace, or ESC.
+    Bill_Mann @ PraxisInt.com   */
+ /* #undef X11R5_INHIBIT_I18N */
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/bsd4-1.h emacs-19.31/src/s/bsd4-1.h
*** emacs-19.30/src/s/bsd4-1.h	Sun Sep 18 16:37:30 1994
--- emacs-19.31/src/s/bsd4-1.h	Mon Jan 15 04:16:40 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/bsd4-2.h emacs-19.31/src/s/bsd4-2.h
*** emacs-19.30/src/s/bsd4-2.h	Sun Sep 18 16:37:30 1994
--- emacs-19.31/src/s/bsd4-2.h	Mon Jan 15 04:16:40 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/bsd4-3.h emacs-19.31/src/s/bsd4-3.h
*** emacs-19.30/src/s/bsd4-3.h	Sun Sep 18 16:37:29 1994
--- emacs-19.31/src/s/bsd4-3.h	Mon Jan 15 04:16:40 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/cxux.h emacs-19.31/src/s/cxux.h
*** emacs-19.30/src/s/cxux.h	Sun Sep 18 16:37:29 1994
--- emacs-19.31/src/s/cxux.h	Mon Jan 15 04:16:40 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** the Free Software Foundation, 675 Mass A
*** 88,92 ****
  
     SIGIO can be used only on systems that implement it (4.2 and 4.3).
!    CBREAK mode has two disadvatages
       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.
--- 89,93 ----
  
     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.
*************** the Free Software Foundation, 675 Mass A
*** 115,119 ****
   *	for terminal control.
   *
!  *	Do not define both.  HAVE_TERMIOS is prefered, if it is
   *	supported on your system.
   */
--- 116,120 ----
   *	for terminal control.
   *
!  *	Do not define both.  HAVE_TERMIOS is preferred, if it is
   *	supported on your system.
   */
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/dgux.h emacs-19.31/src/s/dgux.h
*** emacs-19.30/src/s/dgux.h	Fri Nov 10 11:32:23 1995
--- emacs-19.31/src/s/dgux.h	Mon Jan 15 04:16:40 1996
*************** GNU General Public License for more deta
*** 17,21 ****
  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.  */
  
  /*
--- 17,22 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /*
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/dgux5-4r2.h emacs-19.31/src/s/dgux5-4r2.h
*** emacs-19.30/src/s/dgux5-4r2.h	Fri May  6 23:05:01 1994
--- emacs-19.31/src/s/dgux5-4r2.h	Mon Jan 15 04:16:40 1996
*************** GNU General Public License for more deta
*** 17,21 ****
  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 "dgux.h"
--- 17,22 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  #include "dgux.h"
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/dgux5-4r3.h emacs-19.31/src/s/dgux5-4r3.h
*** emacs-19.30/src/s/dgux5-4r3.h	Fri May  6 23:03:13 1994
--- emacs-19.31/src/s/dgux5-4r3.h	Mon Jan 15 04:16:40 1996
*************** GNU General Public License for more deta
*** 17,21 ****
  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.  */
  
  /* NOTE: DGUX5.4R3.00 will not build with the delivered gcc-2.4.5
--- 17,22 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* NOTE: DGUX5.4R3.00 will not build with the delivered gcc-2.4.5
*************** the Free Software Foundation, 675 Mass A
*** 28,32 ****
  
  /* DGUX 5.4R3.00 brought the definition of `struct inet_addr' into
!    compliance wiht the majority of Unix systems.  The workaround
     introduced in 5.4R2 is no longer necessary. */
  
--- 29,33 ----
  
  /* DGUX 5.4R3.00 brought the definition of `struct inet_addr' into
!    compliance with the majority of Unix systems.  The workaround
     introduced in 5.4R2 is no longer necessary. */
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/freebsd.h emacs-19.31/src/s/freebsd.h
*** emacs-19.30/src/s/freebsd.h	Sat Sep  9 22:13:09 1995
--- emacs-19.31/src/s/freebsd.h	Sun Feb  4 16:33:48 1996
***************
*** 89,90 ****
--- 89,94 ----
  #endif
  #define WRETCODE(w) (_W_INT(w) >> 8)
+ 
+ /* Needed to avoid hanging when child process writes an error message
+    and exits -- enami tsugutomo <enami@ba2.so-net.or.jp>.  */
+ #define vfork fork
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/gnu.h emacs-19.31/src/s/gnu.h
*** emacs-19.30/src/s/gnu.h	Sat Sep  9 22:13:12 1995
--- emacs-19.31/src/s/gnu.h	Mon Apr  8 19:01:12 1996
***************
*** 1,4 ****
  /* Definitions file for GNU Emacs running on the GNU Hurd.
!    Copyright (C) 1994, 1995 Free Software Foundation, Inc.
  
  This file is part of GNU Emacs.
--- 1,4 ----
  /* Definitions file for GNU Emacs running on the GNU Hurd.
!    Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc.
  
  This file is part of GNU Emacs.
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** the Free Software Foundation, 675 Mass A
*** 59,65 ****
  /* GNU now always uses the ELF format.  */
  #define UNEXEC unexelf.o
- 
- /* ptys are not done yet.  */
- #undef HAVE_PTYS
  
  /* Some losing code fails to include this and then assumes
--- 60,63 ----
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/hpux.h emacs-19.31/src/s/hpux.h
*** emacs-19.30/src/s/hpux.h	Sun Sep 18 16:37:19 1994
--- emacs-19.31/src/s/hpux.h	Mon Jan 15 04:16:40 1996
*************** GNU General Public License for more deta
*** 17,21 ****
  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.  */
  
  
--- 17,22 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/hpux9.h emacs-19.31/src/s/hpux9.h
*** emacs-19.30/src/s/hpux9.h	Sat Nov 11 02:10:46 1995
--- emacs-19.31/src/s/hpux9.h	Fri Jan  5 04:54:07 1996
***************
*** 31,35 ****
  
  /* According to ngorelic@speclab.cr.usgs.gov,
!    references to the X11R4 directoriess in these variables
     (inherited from hpux8.h)
     cause the wrong libraries to be found,
--- 31,35 ----
  
  /* According to ngorelic@speclab.cr.usgs.gov,
!    references to the X11R4 directories in these variables
     (inherited from hpux8.h)
     cause the wrong libraries to be found,
***************
*** 42,48 ****
     So search that place.  These definitions assume that X11R5 is being
     used -- if X11R4 is used, "s/hpux9-x11r4.h" gets loaded instead.  */
! #define C_SWITCH_X_SYSTEM -I/usr/include/Motif1.2
! #define LD_SWITCH_X_DEFAULT -L/usr/lib/Motif1.2
  
  /* HP-UX doesn't supply Xmu.  */
  #define LIBXMU
--- 42,49 ----
     So search that place.  These definitions assume that X11R5 is being
     used -- if X11R4 is used, "s/hpux9-x11r4.h" gets loaded instead.  */
! #define C_SWITCH_X_SYSTEM -I/usr/include/X11R5 -I/usr/include/Motif1.2
! #define LD_SWITCH_X_DEFAULT -L/usr/lib/X11R5 -L/usr/lib/Motif1.2
  
+ #ifndef HAVE_LIBXMU
  /* HP-UX doesn't supply Xmu.  */
  #define LIBXMU
***************
*** 50,53 ****
--- 51,55 ----
  /* Unfortunately without libXmu we cannot support EditRes.  */
  #define NO_EDITRES
+ #endif
  
  /* zoo@armadillo.com says we don't need -lXext in HPUX 9.  */
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/hpux9shr.h emacs-19.31/src/s/hpux9shr.h
*** emacs-19.30/src/s/hpux9shr.h	Sun Dec 25 09:22:41 1994
--- emacs-19.31/src/s/hpux9shr.h	Thu Dec 21 01:04:17 1995
***************
*** 5,11 ****
--- 5,13 ----
  #include "hpux9.h"
  
+ #if 0 /* No longer needed, since in current GCC -g no longer does that.  */
  /* We must turn off -g since it forces -static.  */
  #ifdef __GNUC__
  #undef C_DEBUG_SWITCH
  #define C_DEBUG_SWITCH
+ #endif
  #endif
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/iris3-5.h emacs-19.31/src/s/iris3-5.h
*** emacs-19.30/src/s/iris3-5.h	Fri Nov 11 14:33:09 1994
--- emacs-19.31/src/s/iris3-5.h	Mon Jan 15 04:16:40 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/iris3-6.h emacs-19.31/src/s/iris3-6.h
*** emacs-19.30/src/s/iris3-6.h	Fri Nov 11 14:33:12 1994
--- emacs-19.31/src/s/iris3-6.h	Mon Jan 15 04:16:40 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/irix3-3.h emacs-19.31/src/s/irix3-3.h
*** emacs-19.30/src/s/irix3-3.h	Tue Jul 25 19:19:11 1995
--- emacs-19.31/src/s/irix3-3.h	Mon Jan 15 04:16:40 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/irix5-0.h emacs-19.31/src/s/irix5-0.h
*** emacs-19.30/src/s/irix5-0.h	Mon Jun  5 13:28:49 1995
--- emacs-19.31/src/s/irix5-0.h	Tue Jan 23 12:02:51 1996
*************** char *_getpty();
*** 96,100 ****
  #define PREFER_VSUSP
  
! /* Because unexelfsgi.c cannot handle a ".sbss" section yet, we must
     tell the linker to avoid making one.  SGI's cc does this by
     default, but GCC (at least 2.5.8 and 2.6.0) doesn't. */
--- 96,100 ----
  #define PREFER_VSUSP
  
! /* Because unexsgi.c cannot handle a ".sbss" section yet, we must
     tell the linker to avoid making one.  SGI's cc does this by
     default, but GCC (at least 2.5.8 and 2.6.0) doesn't. */
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/irix5-2.h emacs-19.31/src/s/irix5-2.h
*** emacs-19.30/src/s/irix5-2.h	Mon Aug 21 16:51:47 1995
--- emacs-19.31/src/s/irix5-2.h	Sun Mar 17 13:05:13 1996
***************
*** 8,9 ****
--- 8,13 ----
     system calls.  So don't use them.  */
  #undef SA_RESTART
+ 
+ /* schoepf@goofy.zdv.Uni-Mainz.de reports he needed -lw with X11R6
+    on Irix 5.3.  I don't know which Irix version that need starts with.  */
+ #define NEED_LIBW
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/irix6-0.h emacs-19.31/src/s/irix6-0.h
*** emacs-19.30/src/s/irix6-0.h	Thu Jun 29 19:27:18 1995
--- emacs-19.31/src/s/irix6-0.h	Thu Dec 21 01:04:19 1995
***************
*** 8,9 ****
--- 8,16 ----
  #define LD_SWITCH_SYSTEM -32
  #endif
+ 
+ /* This macro definition, which we inherited from irix5-0.h,
+    is needed in configure on Irix 5, but gets in the way there
+    on Irix 6.  So get rid of it except in Makefile.in where we need it.  */
+ #ifndef THIS_IS_MAKEFILE
+ #undef C_SWITCH_SYSTEM
+ #endif
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/isc2-2.h emacs-19.31/src/s/isc2-2.h
*** emacs-19.30/src/s/isc2-2.h	Sun Nov 12 01:34:15 1995
--- emacs-19.31/src/s/isc2-2.h	Tue Jan 30 15:34:05 1996
***************
*** 10,18 ****
  #define BROKEN_SELECT_NON_X
  
! /* Although ISC has sockets, again in -linet, again it's not what Emacs
!    needs.  With this defined, interrupt-shell-subjob and the like do
!    nothing.  --karl@cs.umb.edu
! #define HAVE_SOCKETS */
  
  
  /* This keeps the .cdbx section that gcc puts out when generating
--- 10,21 ----
  #define BROKEN_SELECT_NON_X
  
! /* karl@cs.umb.edu says that ISC's socket support (in -linet) isn't
!    what Emacs needs; it makes interrupt-shell-subjob and the like do
!    nothing.  But that appears to have been another manifestation of
!    the broken select, so it should now be safe to define this again.  */
! #define HAVE_SOCKETS
  
+ #define NO_SOCKETS_IN_FILE_SYSTEM
+ #define NEED_NET_ERRNO_H
  
  /* This keeps the .cdbx section that gcc puts out when generating
***************
*** 52,62 ****
  
  /* -linet may be needed to avoid undefined symbols such as gethostname,
!    inet_addr, gethostbyname, socket, connect, ...  But if we are not
!    compiling with X support, it's not needed.  */
! #ifdef HAVE_X_WINDOWS
  #define LIBS_SYSTEM -linet LIB_STANDARD_1
- #else
- #define LIBS_SYSTEM LIB_STANDARD_1
- #endif
  
  /* This system has job control.  */
--- 55,60 ----
  
  /* -linet may be needed to avoid undefined symbols such as gethostname,
!    inet_addr, gethostbyname, socket, connect, ...  */
  #define LIBS_SYSTEM -linet LIB_STANDARD_1
  
  /* This system has job control.  */
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/isc4-0.h emacs-19.31/src/s/isc4-0.h
*** emacs-19.30/src/s/isc4-0.h	Sat Jul 29 18:26:14 1995
--- emacs-19.31/src/s/isc4-0.h	Tue Jan 30 15:57:31 1996
***************
*** 2,10 ****
  
  #undef LIBS_SYSTEM
- #ifdef HAVE_X_WINDOWS
  #define LIBS_SYSTEM -linet -lcposix
- #else
- #define LIBS_SYSTEM -lcposix
- #endif
  
  #define ISC4_0
--- 2,6 ----
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/isc4-1.h emacs-19.31/src/s/isc4-1.h
*** emacs-19.30/src/s/isc4-1.h	Sun Aug 13 01:07:15 1995
--- emacs-19.31/src/s/isc4-1.h	Tue Jan 30 15:34:03 1996
***************
*** 28,33 ****
  /* defined at the same time. */
  #undef HAVE_TERMIO
- 
- #define HAVE_SOCKETS
- #define NO_SOCKETS_IN_FILE_SYSTEM
- #define NEED_NET_ERRNO_H
--- 28,29 ----
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/lignux.h emacs-19.31/src/s/lignux.h
*** emacs-19.30/src/s/lignux.h	Tue Nov 21 18:35:07 1995
--- emacs-19.31/src/s/lignux.h	Thu Apr 11 13:35:48 1996
***************
*** 1,4 ****
! /* This file is the configuration file for GNU/Linux operating systems.
!    Copyright (C) 1985, 1986, 1992, 1994 Free Software Foundation, Inc.
  
  This file is part of GNU Emacs.
--- 1,5 ----
! /* This file is the configuration file for Lignux systems
!    (that is,  Linux-based GNU operating systems.)
!    Copyright (C) 1985, 1986, 1992, 1994, 1996 Free Software Foundation, Inc.
  
  This file is part of GNU Emacs.
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  /* This file was put together by Michael K. Johnson and Rik Faith.  */
--- 17,22 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* This file was put together by Michael K. Johnson and Rik Faith.  */
*************** the Free Software Foundation, 675 Mass A
*** 35,63 ****
   It sets the Lisp variable system-type.  */
  
! #define SYSTEM_TYPE "linux"		/* All the best software is free. */
  
! /* 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)
! 
!    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.
! */
! 
! /* There have been suggestions made to add SIGIO to Linux.  If this
!    is done, you may, at your discretion, uncomment the line below.
! */
  
! /* #define INTERRUPT_INPUT */
  
  /* Letter to use in finding device name of first pty,
--- 37,55 ----
   It sets the Lisp variable system-type.  */
  
! #define SYSTEM_TYPE "lignux"		/* All the best software is free. */
  
! /* Check the version number of Linux--if it is at least 1.2.0,
!    it is safe to use SIGIO.  */
! #ifndef NOT_C_CODE
! #ifdef emacs
! #ifdef HAVE_LINUX_VERSION_H
! #include <linux/version.h>
  
! #if LINUX_VERSION_CODE > 0x10200
! #define LINUX_SIGIO_DOES_WORK
! #endif /* LINUX_VERSION_CODE > 0x10200 */
! #endif /* HAVE_LINUX_VERSION_H */
! #endif /* emacs */
! #endif /* NOT_C_CODE */
  
  /* Letter to use in finding device name of first pty,
*************** the Free Software Foundation, 675 Mass A
*** 141,145 ****
  /* #define LINUX_LDAV_FILE "/proc/loadavg" */
  
! /* This is needed for disknew.c:update_frame */
  
  #ifdef emacs
--- 133,137 ----
  /* #define LINUX_LDAV_FILE "/proc/loadavg" */
  
! /* This is needed for dispnew.c:update_frame */
  
  #ifdef emacs
*************** the Free Software Foundation, 675 Mass A
*** 169,172 ****
--- 161,167 ----
  /* Here we assume that signal.h is already included.  */
  #ifdef emacs
+ #ifdef LINUX_SIGIO_DOES_WORK
+ #define INTERRUPT_INPUT
+ #else
  #undef SIGIO
  /* Some versions of Linux define SIGURG and SIGPOLL as aliases for SIGIO.
*************** the Free Software Foundation, 675 Mass A
*** 175,178 ****
--- 170,174 ----
  #undef SIGPOLL
  #endif
+ #endif
  
  /* This is needed for sysdep.c */
*************** the Free Software Foundation, 675 Mass A
*** 183,186 ****
--- 179,183 ----
  #define HAVE_SYS_SIGLIST
  #define HAVE_GETWD            /* cure conflict with getcwd? */
+ #define HAVE_WAIT_HEADER
  
  #define SYSV_SYSTEM_DIR       /* use dirent.h */
*************** the Free Software Foundation, 675 Mass A
*** 191,195 ****
  /* Best not to include -lg, unless it is last on the command line */
  #define LIBS_DEBUG
- #define LIBS_TERMCAP -ltermcap -lcurses /* save some space with shared libs*/
  #ifndef __ELF__
  #define LIB_STANDARD -lc /* avoid -lPW */
--- 188,191 ----
*************** the Free Software Foundation, 675 Mass A
*** 228,231 ****
--- 224,232 ----
  #define LIB_MOTIF -lXm -lXpm
  
+ #ifdef HAVE_LIBNCURSES
+ #define TERMINFO
+ #define LIBS_TERMCAP -lncurses
+ #endif
+ 
  #define HAVE_SYSVIPC
  
*************** the Free Software Foundation, 675 Mass A
*** 281,282 ****
--- 282,288 ----
  /* #define REGEXP_IN_LIBC */
  
+ /* Use BSD process groups, but use setpgid() instead of setpgrp() to
+    actually set a process group. */
+ 
+ #define BSD_PGRPS
+ #define setpgrp(pid,pgid) setpgid((pid),(pgid))
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/msdos.h emacs-19.31/src/s/msdos.h
*** emacs-19.30/src/s/msdos.h	Tue Nov 21 02:46:55 1995
--- emacs-19.31/src/s/msdos.h	Sat May 11 17:03:16 1996
***************
*** 1,5 ****
  /* System description file for MS-DOS
  
!    Copyright (C) 1993 Free Software Foundation, Inc.
  
  This file is part of GNU Emacs.
--- 1,5 ----
  /* System description file for MS-DOS
  
!    Copyright (C) 1993, 1996 Free Software Foundation, Inc.
  
  This file is part of GNU Emacs.
*************** GNU General Public License for more deta
*** 17,21 ****
  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.  */
  
  /* Note: lots of stuff here was taken from s-msdos.h in demacs. */
--- 17,22 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* Note: lots of stuff here was taken from s-msdos.h in demacs. */
*************** the Free Software Foundation, 675 Mass A
*** 44,49 ****
  #ifndef __DJGPP__
  #define __DJGPP__ 1	/* V2 defines __DJGPP__ == 2 */
- #else
- You lose; /* Emacs for DOS must be compiled with DJGPP V1 */
  #endif
  #else
--- 45,48 ----
*************** You lose; /* Emacs for DOS must be compi
*** 74,78 ****
  
     SIGIO can be used only on systems that implement it (4.2 and 4.3).
!    CBREAK mode has two disadvatages
       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.
--- 73,77 ----
  
     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.
*************** You lose; /* Emacs for DOS must be compi
*** 149,154 ****
     (Which you should place, by convention, in sysdep.c).  */
  
! /* we use djgcc's malloc */
! /* #define SYSTEM_MALLOC */
  /* setjmp and longjmp can safely replace _setjmp and _longjmp,
     but they will run slower.  */
--- 148,155 ----
     (Which you should place, by convention, in sysdep.c).  */
  
! /* Avoid incompatibilities between gmalloc.c and system header files
!    in how to declare valloc.  */
! #define GMALLOC_INHIBIT_VALLOC
! 
  /* setjmp and longjmp can safely replace _setjmp and _longjmp,
     but they will run slower.  */
*************** You lose; /* Emacs for DOS must be compi
*** 157,163 ****
  #define _longjmp longjmp
  
  #define NO_MODE_T
  
! /* New chdir () routine. */
  #ifdef chdir
  #undef chdir
--- 158,168 ----
  #define _longjmp longjmp
  
+ #if __DJGPP__ < 2
+ 
  #define NO_MODE_T
  
! /* New chdir () routine.
!    DJGPP v2.0 and later doesn't need it because its chdir() does
!    set the drive itself. */
  #ifdef chdir
  #undef chdir
*************** You lose; /* Emacs for DOS must be compi
*** 165,173 ****
  #define chdir sys_chdir
  
! #define LIBS_SYSTEM -lpc
  
  /* This somehow needs to be defined even though we use COFF.  */
  #define TEXT_START -1
  
  #define ORDINARY_LINK
  
--- 170,192 ----
  #define chdir sys_chdir
  
! #define LIBS_SYSTEM -lpc  /* isn't required in DJGPP v2.0, either */
! 
! #endif /* __DJGPP__ < 2 */
! 
! #if __DJGPP__ > 1
! 
! #define DATA_START  (&etext + 1)
! #define TEXT_START  &start
! #define TEXT_END    &etext
! 
! #define _NAIVE_DOS_REGS
! 
! #else /* not __DJGPP__ > 1 */
  
  /* This somehow needs to be defined even though we use COFF.  */
  #define TEXT_START -1
  
+ #endif /* not __DJGPP__ > 1 */
+ 
  #define ORDINARY_LINK
  
*************** You lose; /* Emacs for DOS must be compi
*** 180,183 ****
--- 199,203 ----
  #define EXEC_SUFFIXES ".exe:.com:.bat:"
  
+ #if __DJGPP__ < 2
  #define O_RDONLY        0x0001
  #define O_WRONLY        0x0002
*************** You lose; /* Emacs for DOS must be compi
*** 189,196 ****
  #define O_TEXT          0x4000
  #define O_BINARY        0x8000
  
  #define HAVE_INVERSE_HYPERBOLIC
  #define FLOAT_CHECK_DOMAIN
- #define NO_MATHERR
  
  /* When $TERM is "internal" then this is substituted:  */
--- 209,217 ----
  #define O_TEXT          0x4000
  #define O_BINARY        0x8000
+ #define NO_MATHERR
+ #endif
  
  #define HAVE_INVERSE_HYPERBOLIC
  #define FLOAT_CHECK_DOMAIN
  
  /* When $TERM is "internal" then this is substituted:  */
*************** You lose; /* Emacs for DOS must be compi
*** 200,204 ****
  /* Define this to a function (Fdowncase, Fupcase) if your file system
     likes that */
! #define FILE_SYSTEM_CASE Fdowncase
  
  /* Define this to be the separator between devices and paths */
--- 221,225 ----
  /* Define this to a function (Fdowncase, Fupcase) if your file system
     likes that */
! #define FILE_SYSTEM_CASE Fmsdos_downcase_filename
  
  /* Define this to be the separator between devices and paths */
*************** You lose; /* Emacs for DOS must be compi
*** 210,215 ****
--- 231,238 ----
  
  /* Call init_gettimeofday when TZ changes.  */
+ #if __DJGPP__ < 2
  #define LOCALTIME_CACHE
  #define tzset init_gettimeofday
+ #endif
  
  /* bcopy under djgpp is quite safe */
*************** You lose; /* Emacs for DOS must be compi
*** 221,226 ****
--- 244,257 ----
  #define MODE_LINE_BINARY_TEXT(buf) (NILP(buf->buffer_file_type) ? "T" : "B")
  
+ /* Do we have POSIX signals?  */
+ #if __DJGPP__ > 1
+ #define POSIX_SIGNALS
+ #endif
+ 
  /* We have (the code to control) a mouse.  */
  #define HAVE_MOUSE
+ 
+ /* We canuse mouse menus.  */
+ #define HAVE_MENUS
  
  /* We have support for faces.  */
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/newsos5.h emacs-19.31/src/s/newsos5.h
*** emacs-19.30/src/s/newsos5.h	Wed Feb 23 14:30:20 1994
--- emacs-19.31/src/s/newsos5.h	Mon Jan 15 04:16:40 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  /* Use the SysVr4 file for at least base configuration. */
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* Use the SysVr4 file for at least base configuration. */
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/nextstep.h emacs-19.31/src/s/nextstep.h
*** emacs-19.30/src/s/nextstep.h	Sat Aug  5 01:51:53 1995
--- emacs-19.31/src/s/nextstep.h	Mon Jan 15 03:16:45 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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 "bsd4-3.h"
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  #include "bsd4-3.h"
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/ptx.h emacs-19.31/src/s/ptx.h
*** emacs-19.30/src/s/ptx.h	Sat Jun  3 13:31:29 1995
--- emacs-19.31/src/s/ptx.h	Mon Jan 15 04:16:40 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  /* This file was written by Bill Burton <billb@progress.com>.  Parts were
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* This file was written by Bill Burton <billb@progress.com>.  Parts were
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/riscix1-1.h emacs-19.31/src/s/riscix1-1.h
*** emacs-19.30/src/s/riscix1-1.h	Wed Sep 21 17:54:34 1994
--- emacs-19.31/src/s/riscix1-1.h	Mon Jan 15 03:16:48 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/riscix1-2.h emacs-19.31/src/s/riscix1-2.h
*** emacs-19.30/src/s/riscix1-2.h	Wed Sep 21 17:54:46 1994
--- emacs-19.31/src/s/riscix1-2.h	Mon Jan 15 03:16:48 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/rtu.h emacs-19.31/src/s/rtu.h
*** emacs-19.30/src/s/rtu.h	Sun Sep 18 16:37:27 1994
--- emacs-19.31/src/s/rtu.h	Mon Jan 15 04:16:40 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/sco4.h emacs-19.31/src/s/sco4.h
*** emacs-19.30/src/s/sco4.h	Mon Jul 17 16:59:36 1995
--- emacs-19.31/src/s/sco4.h	Mon Jan 15 04:16:40 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  /* Contributed by Ian Lance Taylor, ian@cygnus.com.  */
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* Contributed by Ian Lance Taylor, ian@cygnus.com.  */
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/sol2-3.h emacs-19.31/src/s/sol2-3.h
*** emacs-19.30/src/s/sol2-3.h	Fri May 26 21:05:28 1995
--- emacs-19.31/src/s/sol2-3.h	Mon Jan  8 17:32:57 1996
***************
*** 36,59 ****
  #define PTY_TTY_NAME_SPRINTF			\
    {						\
!     char *ptsname(), *ptyname;			\
  						\
!     sigblock(sigmask(SIGCLD));			\
!     if (grantpt(fd) == -1)			\
!       fatal("could not grant slave pty");	\
!     sigunblock(sigmask(SIGCLD));		\
!     if (unlockpt(fd) == -1)			\
!       fatal("could not unlock slave pty");	\
!     if (!(ptyname = ptsname(fd)))		\
!       fatal ("could not enable slave pty");	\
!     strncpy(pty_name, ptyname, sizeof(pty_name)); \
!     pty_name[sizeof(pty_name) - 1] = 0;		\
    }
- 
- /* David Miller <davem@caip.rutgers.edu> says vfork fails on 2.4.
-    Brendan Kehoe <brendan@zen.org> says it also fails on 2.3.
-    So we'll use the alternate definition in sysdep.c.
-    But a header file has a declaration
-    that would conflict with the definition of vfork in sysdep.c.
-    So we'll choose the return type to match the system header.  */
- #undef HAVE_VFORK
- #define VFORK_RETURN_TYPE pid_t
--- 36,50 ----
  #define PTY_TTY_NAME_SPRINTF			\
    {						\
!     char *ptsname (), *ptyname;			\
  						\
!     sigblock (sigmask (SIGCLD));		\
!     if (grantpt (fd) == -1)			\
!       { close (fd); return -1; }		\
!     sigunblock (sigmask (SIGCLD));		\
!     if (unlockpt (fd) == -1)			\
!       { close (fd); return -1; }		\
!     if (!(ptyname = ptsname (fd)))		\
!       { close (fd); return -1; }		\
!     strncpy (pty_name, ptyname, sizeof (pty_name)); \
!     pty_name[sizeof (pty_name) - 1] = 0;	\
    }
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/sol2-4.h emacs-19.31/src/s/sol2-4.h
*** emacs-19.30/src/s/sol2-4.h	Tue May 30 19:30:02 1995
--- emacs-19.31/src/s/sol2-4.h	Wed May  1 15:12:28 1996
***************
*** 22,23 ****
--- 22,28 ----
   `./prefix-args -Xlinker LD_SWITCH_X_SITE_AUX` -R /usr/dt/lib -L /usr/dt/lib
  #endif /* GCC */
+ 
+ /* Gregory Neil Shapiro <gshapiro@hhmi.org> reports the Motif header files
+    are in this directory on Solaris 2.4.  */
+ #define C_SWITCH_X_SYSTEM -I/usr/dt/include
+ 
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/sol2-5.h emacs-19.31/src/s/sol2-5.h
*** emacs-19.30/src/s/sol2-5.h	Mon Jul 31 14:17:21 1995
--- emacs-19.31/src/s/sol2-5.h	Wed Apr 24 15:44:34 1996
***************
*** 2,3 ****
--- 2,20 ----
  
  #include "sol2-4.h"
+ 
+ #if 0 /* A recent patch in unexelf.c should eliminate the need for this.  */
+ /* Don't use the shared libraries for -lXt and -lXaw,
+    to work around a linker bug in Solaris 2.5.
+    (This also affects the other libraries used specifically for
+    the X toolkit, which may not be necessary.)  */
+ #define LIBXT_STATIC
+ 
+ #ifdef __GNUC__
+ #define STATIC_OPTION -Xlinker -Bstatic
+ #define DYNAMIC_OPTION -Xlinker -Bdynamic
+ #else
+ #define STATIC_OPTION -Bstatic
+ #define DYNAMIC_OPTION -Bdynamic
+ #endif
+ 
+ #endif /* 0 */
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/sol2.h emacs-19.31/src/s/sol2.h
*** emacs-19.30/src/s/sol2.h	Fri Apr  7 02:54:18 1995
--- emacs-19.31/src/s/sol2.h	Wed May  1 15:12:44 1996
***************
*** 25,31 ****
  
  #define HAVE_VFORK
- 
- /* Gregory Neil Shapiro <gshapiro@hhmi.org> reports the Motif header files
-    are in this directory on Solaris 2.4.  Let's guess that's true
-    for some earlier versions too.  */
- #define C_SWITCH_X_SYSTEM -I/usr/dt/include
--- 25,26 ----
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/sunos4shr.h emacs-19.31/src/s/sunos4shr.h
*** emacs-19.30/src/s/sunos4shr.h	Tue Jul 18 00:34:57 1995
--- emacs-19.31/src/s/sunos4shr.h	Mon Dec 25 23:35:21 1995
***************
*** 46,49 ****
--- 46,53 ----
  #undef USE_DL_STUBS
  
+ #ifndef HAVE_X11R6
+ /* With X11R5 it was reported that linking -lXmu dynamically
+    did not work.  With X11R6, it does work; and since normally
+    only the dynamic libraries are available, we should use them.  */
  #ifdef __GNUC__
  #define LIBXMU -Xlinker -Bstatic -lXmu -Xlinker -Bdynamic
***************
*** 51,52 ****
--- 55,58 ----
  #define LIBXMU -Bstatic -lXmu -Bdynamic
  #endif
+ 
+ #endif  /* not HAVE_X11R6 */
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/template.h emacs-19.31/src/s/template.h
*** emacs-19.30/src/s/template.h	Sun Sep 18 16:37:22 1994
--- emacs-19.31/src/s/template.h	Mon Jan 15 04:16:40 1996
*************** GNU General Public License for more deta
*** 18,22 ****
  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.  */
  
  
--- 18,23 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/umax.h emacs-19.31/src/s/umax.h
*** emacs-19.30/src/s/umax.h	Sun Sep 18 16:37:22 1994
--- emacs-19.31/src/s/umax.h	Mon Jan 15 04:16:40 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/unipl5-0.h emacs-19.31/src/s/unipl5-0.h
*** emacs-19.30/src/s/unipl5-0.h	Sun Sep 18 16:37:21 1994
--- emacs-19.31/src/s/unipl5-0.h	Mon Jan 15 04:16:40 1996
*************** GNU General Public License for more deta
*** 17,21 ****
  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.  */
  
  
--- 17,22 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/unipl5-2.h emacs-19.31/src/s/unipl5-2.h
*** emacs-19.30/src/s/unipl5-2.h	Sun Sep 18 16:37:21 1994
--- emacs-19.31/src/s/unipl5-2.h	Mon Jan 15 04:16:40 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/usg5-0.h emacs-19.31/src/s/usg5-0.h
*** emacs-19.30/src/s/usg5-0.h	Sun Sep 18 16:37:21 1994
--- emacs-19.31/src/s/usg5-0.h	Mon Jan 15 04:16:40 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/usg5-2-2.h emacs-19.31/src/s/usg5-2-2.h
*** emacs-19.30/src/s/usg5-2-2.h	Sun Sep 18 16:37:20 1994
--- emacs-19.31/src/s/usg5-2-2.h	Mon Jan 15 04:16:40 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/usg5-2.h emacs-19.31/src/s/usg5-2.h
*** emacs-19.30/src/s/usg5-2.h	Sun Sep 18 16:37:20 1994
--- emacs-19.31/src/s/usg5-2.h	Mon Jan 15 04:16:40 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/usg5-3.h emacs-19.31/src/s/usg5-3.h
*** emacs-19.30/src/s/usg5-3.h	Sun Sep 18 16:37:20 1994
--- emacs-19.31/src/s/usg5-3.h	Mon Jan 15 04:16:40 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/usg5-4.h emacs-19.31/src/s/usg5-4.h
*** emacs-19.30/src/s/usg5-4.h	Sun Nov 12 01:36:22 1995
--- emacs-19.31/src/s/usg5-4.h	Mon Jan 15 04:16:40 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  /* This file written by James Van Artsdalen of Dell Computer Corporation.
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* This file written by James Van Artsdalen of Dell Computer Corporation.
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/vms.h emacs-19.31/src/s/vms.h
*** emacs-19.30/src/s/vms.h	Sun Sep 18 16:37:19 1994
--- emacs-19.31/src/s/vms.h	Mon Jan 15 04:16:40 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  /*
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /*
*************** the Free Software Foundation, 675 Mass A
*** 109,126 ****
     (Which you should place, by convention, in sysdep.c).  */
  
! /* Do you have the shareable library bug?  If you link with a shareable
     library that contains psects with the NOSHR attribute and also refer to
     those psects in your program, the linker give you a private version of
!    the psect which is not related to the version used by the shareable
     library.  The end result is that your references to variables in that
     psect have absolutely nothing to do with library references to what is
     supposed to be the same variable.  If you intend to link with the standard
!    C library (NOT the shareable one) you don't need to define this.  (This
     is NOT fixed in V4.4...) */
  
! #define SHAREABLE_LIB_BUG
  
  /* Partially due to the above mentioned bug and also so that we don't need
!    to require that people have a shareable C library, the default for Emacs
     is to link with the non-shared library.  If you want to link with the
     shared library, define this and remake xmakefile and fileio.c. This allows
--- 110,127 ----
     (Which you should place, by convention, in sysdep.c).  */
  
! /* Do you have the sharable library bug?  If you link with a sharable
     library that contains psects with the NOSHR attribute and also refer to
     those psects in your program, the linker give you a private version of
!    the psect which is not related to the version used by the sharable
     library.  The end result is that your references to variables in that
     psect have absolutely nothing to do with library references to what is
     supposed to be the same variable.  If you intend to link with the standard
!    C library (NOT the sharable one) you don't need to define this.  (This
     is NOT fixed in V4.4...) */
  
! #define SHARABLE_LIB_BUG
  
  /* Partially due to the above mentioned bug and also so that we don't need
!    to require that people have a sharable C library, the default for Emacs
     is to link with the non-shared library.  If you want to link with the
     shared library, define this and remake xmakefile and fileio.c. This allows
*************** extern double mth$dmod(double, double);
*** 146,150 ****
  #endif
  
! /* Some time rountines are missing in the VAX C RTL, or needs some
     extra bit of code */
  #define tzset sys_tzset
--- 147,151 ----
  #endif
  
! /* Some time routines are missing in the VAX C RTL, or needs some
     extra bit of code */
  #define tzset sys_tzset
*************** extern double mth$dmod(double, double);
*** 210,214 ****
  #define SYMS_SYSTEM syms_of_vmsfns ()
  
! /* VAXCRTL access doesn't deal with SYSPRV very well (among other oddites...)
     Here, we use $CHKPRO to really determine access. */
  #define access sys_access
--- 211,215 ----
  #define SYMS_SYSTEM syms_of_vmsfns ()
  
! /* VAXCRTL access doesn't deal with SYSPRV very well (among other oddities...)
     Here, we use $CHKPRO to really determine access. */
  #define access sys_access
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/vms5-5.h emacs-19.31/src/s/vms5-5.h
*** emacs-19.30/src/s/vms5-5.h	Fri Oct 16 04:25:40 1992
--- emacs-19.31/src/s/vms5-5.h	Thu Jan  4 16:02:15 1996
***************
*** 3,8 ****
  #define VMS4_4
  
! /* The bug that SHAREABLE_LIB_BUG fixes is gone in version 5.5 of VMS.
     And defining it causes lossage because sys_errlist has a different
     number of elements.  */
! #undef SHAREABLE_LIB_BUG
--- 3,8 ----
  #define VMS4_4
  
! /* The bug that SHARABLE_LIB_BUG fixes is gone in version 5.5 of VMS.
     And defining it causes lossage because sys_errlist has a different
     number of elements.  */
! #undef SHARABLE_LIB_BUG
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/windowsnt.h emacs-19.31/src/s/windowsnt.h
*** emacs-19.30/src/s/windowsnt.h	Tue Nov  7 02:01:13 1995
--- emacs-19.31/src/s/windowsnt.h	Tue May 14 13:44:35 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  /*
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /*
*************** the Free Software Foundation, 675 Mass A
*** 56,61 ****
  
  #define NO_MATHERR
- #define HAVE_FREXP
- #define HAVE_FMOD
  
  /* NOMULTIPLEJOBS should be defined if your system's shell
--- 57,60 ----
*************** the Free Software Foundation, 675 Mass A
*** 114,130 ****
  
  #define HAVE_TIMEVAL
- struct timeval 
-   {
-     long tv_sec;	/* seconds */
-     long tv_usec;	/* microseconds */
-   };
- struct timezone 
-   {
-     int	tz_minuteswest;	/* minutes west of Greenwich */
-     int	tz_dsttime;	/* type of dst correction */
-   };
- 
- void gettimeofday (struct timeval *, struct timezone *);
- 
  
  /*
--- 113,116 ----
*************** void gettimeofday (struct timeval *, str
*** 147,150 ****
--- 133,140 ----
  /* #define NONSYSTEM_DIR_LIBRARY */
  
+ /* NT supports Winsock which is close enough (with some hacks) */
+ 
+ #define HAVE_SOCKETS
+ 
  /* Define this symbol if your system has the functions bcopy, etc. */
  
*************** void gettimeofday (struct timeval *, str
*** 173,176 ****
--- 163,168 ----
  
  /* #define MAIL_USE_FLOCK */
+ #define MAIL_USE_POP
+ #define MAIL_USE_SYSTEM_LOCK
  
  /* Define CLASH_DETECTION if you want lock files to be written
*************** void gettimeofday (struct timeval *, str
*** 203,207 ****
  
  /* Define this to be the separator between path elements */
! #define DIRECTORY_SEP '\\'
  
  /* Define this to be the separator between devices and paths */
--- 195,199 ----
  
  /* Define this to be the separator between path elements */
! #define DIRECTORY_SEP XINT (Vdirectory_sep_char)
  
  /* Define this to be the separator between devices and paths */
*************** void gettimeofday (struct timeval *, str
*** 214,218 ****
  /* The null device on Windows NT. */
  #define NULL_DEVICE     "NUL:"
! #define EXEC_SUFFIXES   ".exe:.com:.bat:"
  
  #ifndef MAXPATHLEN
--- 206,210 ----
  /* The null device on Windows NT. */
  #define NULL_DEVICE     "NUL:"
! #define EXEC_SUFFIXES   ".exe:.com:.bat:.cmd:"
  
  #ifndef MAXPATHLEN
*************** void gettimeofday (struct timeval *, str
*** 222,234 ****
  #define LISP_FLOAT_TYPE
  
! #define HAVE_DUP2       	1
! #define HAVE_RENAME     	1
! #define HAVE_RMDIR      	1
! #define HAVE_MKDIR      	1
! #define HAVE_GETHOSTNAME	1
! #define HAVE_RANDOM		1
! #define USE_UTIME		1
! #define HAVE_MOUSE		1
! #define HAVE_TZNAME		1
  
  #ifdef HAVE_NTGUI
--- 214,246 ----
  #define LISP_FLOAT_TYPE
  
! #define HAVE_SYS_TIMEB_H
! #define HAVE_SYS_TIME_H
! #define HAVE_UNISTD_H
! #define STDC_HEADERS
! #define TIME_WITH_SYS_TIME
! 
! #define HAVE_GETTIMEOFDAY
! #define HAVE_GETHOSTNAME
! #define HAVE_DUP2
! #define HAVE_RENAME
! #define HAVE_CLOSEDIR
! 
! #define HAVE_TZNAME
! 
! #define HAVE_LONG_FILE_NAMES
! 
! #define HAVE_MKDIR
! #define HAVE_RMDIR
! #define HAVE_RANDOM
! #define HAVE_BCOPY
! #define HAVE_BCMP
! #define HAVE_LOGB
! #define HAVE_FREXP
! #define HAVE_FMOD
! #define HAVE_FTIME
! #define HAVE_MKTIME
! 
! #define HAVE_MOUSE
! #define HAVE_H_ERRNO
  
  #ifdef HAVE_NTGUI
*************** void gettimeofday (struct timeval *, str
*** 239,276 ****
  #define MODE_LINE_BINARY_TEXT(_b_) (NILP ((_b_)->buffer_file_type) ? "T" : "B")
  
! /* 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 read    _read
! #define rmdir   _rmdir
! #define sleep   nt_sleep
! #define unlink  _unlink
! #define umask	_umask
! #define utime	_utime
! #define write   _write
! #define _longjmp        longjmp
! #define spawnve win32_spawnve
! #define wait    win32_wait
! #define signal  win32_signal
! #define rindex  strrchr
! #define ctime	nt_ctime	/* Place a wrapper around ctime (see nt.c).  */
  
  #ifdef HAVE_NTGUI
--- 251,321 ----
  #define MODE_LINE_BINARY_TEXT(_b_) (NILP ((_b_)->buffer_file_type) ? "T" : "B")
  
! /* get some redefinitions in place */
! 
! /* 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 mkdir   sys_mkdir
! #define mktemp  sys_mktemp
! #define open    sys_open
! #define pipe    sys_pipe
! #define read    sys_read
! #define rename  sys_rename
! #define rmdir   sys_rmdir
! #define select  sys_select
! #define sleep   sys_sleep
! #define unlink  sys_unlink
! #define write   sys_write
! 
! /* 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
  
! /* subprocess calls that are emulated */
! #define spawnve sys_spawnve
! #define wait    sys_wait
! #define kill    sys_kill
! #define signal  sys_signal
! 
! /* map to MSVC names */
! #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 popen     _popen
! #define pclose    _pclose
! #define putw	  _putw
! #define umask	  _umask
! #define utime	  _utime
! #define index     strchr
! #define rindex    strrchr
  
  #ifdef HAVE_NTGUI
*************** void gettimeofday (struct timeval *, str
*** 294,300 ****
  #define EMACS_CONFIG_OPTIONS	"NT"	/* Not very meaningful yet.  */
  
! /* 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
  
--- 339,345 ----
  #define EMACS_CONFIG_OPTIONS	"NT"	/* Not very meaningful yet.  */
  
! /* Define this so that winsock.h definitions don't get included with
!    windows.h.  For this to have proper effect, config.h must always be
!    included before windows.h.  */
  #define _WINSOCKAPI_    1
  
*************** void gettimeofday (struct timeval *, str
*** 302,330 ****
  #include <malloc.h>
  
- /* We have to handle stat specially.  However, #defining stat to
-    something else not only redefines uses of the function, but also
-    redefines uses of the type struct stat.  What unfortunate parallel
-    naming.  */
  #include <sys/stat.h>
- struct nt_stat 
-   {
-     struct _stat statbuf;
-   };
- 
- #ifdef stat
- #undef stat
- #endif
- #define stat nt_stat
- #define st_dev statbuf.st_dev
- #define st_ino statbuf.st_ino
- #define st_mode statbuf.st_mode
- #define st_nlink statbuf.st_nlink
- #define st_uid statbuf.st_uid
- #define st_gid statbuf.st_gid
- #define st_rdev statbuf.st_rdev
- #define st_size statbuf.st_size
- #define st_atime statbuf.st_atime
- #define st_mtime statbuf.st_mtime
- #define st_ctime statbuf.st_ctime
  
  /* Define for those source files that do not include enough NT 
--- 347,351 ----
*************** struct nt_stat 
*** 340,343 ****
--- 361,365 ----
  /* For proper declaration of environ.  */
  #include <stdlib.h>
+ #include <string.h>
  
  /* Emacs takes care of ensuring that these are defined.  */
*************** struct nt_stat 
*** 346,349 ****
--- 368,374 ----
  #undef min
  #endif
+ 
+ /* We need a little extra space, see ../../lisp/loadup.el */
+ #define SYSTEM_PURESIZE_EXTRA 15000
  
  /* ============================================================ */
diff -2rcpP --exclude=*.elc emacs-19.30/src/s/xenix.h emacs-19.31/src/s/xenix.h
*** emacs-19.30/src/s/xenix.h	Sun Sep 18 16:37:19 1994
--- emacs-19.31/src/s/xenix.h	Mon Jan 15 04:16:40 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  /*
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /*
diff -2rcpP --exclude=*.elc emacs-19.30/src/scroll.c emacs-19.31/src/scroll.c
*** emacs-19.30/src/scroll.c	Tue Nov  7 02:10:10 1995
--- emacs-19.31/src/scroll.c	Tue Apr  9 17:58:48 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/search.c emacs-19.31/src/search.c
*** emacs-19.30/src/search.c	Sun Oct 22 14:02:05 1995
--- emacs-19.31/src/search.c	Tue Apr  9 18:06:37 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** static struct re_registers search_regs;
*** 74,78 ****
  static Lisp_Object last_thing_searched;
  
! /* error condition signalled when regexp compile_pattern fails */
  
  Lisp_Object Qinvalid_regexp;
--- 75,79 ----
  static Lisp_Object last_thing_searched;
  
! /* error condition signaled when regexp compile_pattern fails */
  
  Lisp_Object Qinvalid_regexp;
*************** match_limit (num, beginningp)
*** 1803,1824 ****
  DEFUN ("match-beginning", Fmatch_beginning, Smatch_beginning, 1, 1, 0,
    "Return position of start of text matched by last search.\n\
! NUM specifies which parenthesized expression in the last regexp.\n\
!  Value is nil if NUMth pair didn't match, or there were less than NUM pairs.\n\
  Zero means the entire text matched by the whole regexp or whole string.")
!   (num)
!      Lisp_Object num;
  {
!   return match_limit (num, 1);
  }
  
  DEFUN ("match-end", Fmatch_end, Smatch_end, 1, 1, 0,
    "Return position of end of text matched by last search.\n\
! ARG, a number, specifies which parenthesized expression in the last regexp.\n\
!  Value is nil if ARGth pair didn't match, or there were less than ARG pairs.\n\
  Zero means the entire text matched by the whole regexp or whole string.")
!   (num)
!      Lisp_Object num;
  {
!   return match_limit (num, 0);
  } 
  
--- 1804,1829 ----
  DEFUN ("match-beginning", Fmatch_beginning, Smatch_beginning, 1, 1, 0,
    "Return position of start of text matched by last search.\n\
! SUBEXP, a number, specifies which parenthesized expression in the last\n\
!   regexp.\n\
! Value is nil if SUBEXPth pair didn't match, or there were less than\n\
!   SUBEXP pairs.\n\
  Zero means the entire text matched by the whole regexp or whole string.")
!   (subexp)
!      Lisp_Object subexp;
  {
!   return match_limit (subexp, 1);
  }
  
  DEFUN ("match-end", Fmatch_end, Smatch_end, 1, 1, 0,
    "Return position of end of text matched by last search.\n\
! SUBEXP, a number, specifies which parenthesized expression in the last\n\
!   regexp.\n\
! Value is nil if SUBEXPth pair didn't match, or there were less than\n\
!   SUBEXP pairs.\n\
  Zero means the entire text matched by the whole regexp or whole string.")
!   (subexp)
!      Lisp_Object subexp;
  {
!   return match_limit (subexp, 0);
  } 
  
*************** restore_match_data ()
*** 2002,2019 ****
  DEFUN ("regexp-quote", Fregexp_quote, Sregexp_quote, 1, 1, 0,
    "Return a regexp string which matches exactly STRING and nothing else.")
!   (str)
!      Lisp_Object str;
  {
    register unsigned char *in, *out, *end;
    register unsigned char *temp;
  
!   CHECK_STRING (str, 0);
  
!   temp = (unsigned char *) alloca (XSTRING (str)->size * 2);
  
    /* Now copy the data into the new string, inserting escapes. */
  
!   in = XSTRING (str)->data;
!   end = in + XSTRING (str)->size;
    out = temp; 
  
--- 2007,2024 ----
  DEFUN ("regexp-quote", Fregexp_quote, Sregexp_quote, 1, 1, 0,
    "Return a regexp string which matches exactly STRING and nothing else.")
!   (string)
!      Lisp_Object string;
  {
    register unsigned char *in, *out, *end;
    register unsigned char *temp;
  
!   CHECK_STRING (string, 0);
  
!   temp = (unsigned char *) alloca (XSTRING (string)->size * 2);
  
    /* Now copy the data into the new string, inserting escapes. */
  
!   in = XSTRING (string)->data;
!   end = in + XSTRING (string)->size;
    out = temp; 
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/strftime.c emacs-19.31/src/strftime.c
*** emacs-19.30/src/strftime.c	Mon Sep 26 17:31:48 1994
--- emacs-19.31/src/strftime.c	Tue Apr  9 18:13:57 1996
***************
*** 14,18 ****
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
!    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
  
  /* Note: this version of strftime lacks locale support,
--- 14,19 ----
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
!    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
!    USA.  */
  
  /* Note: this version of strftime lacks locale support,
diff -2rcpP --exclude=*.elc emacs-19.30/src/sunfns.c emacs-19.31/src/sunfns.c
*** emacs-19.30/src/sunfns.c	Thu Jun 15 16:38:56 1995
--- emacs-19.31/src/sunfns.c	Mon Jan 15 04:06:29 1996
*************** GNU General Public License for more deta
*** 26,30 ****
  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.  */
  
  /* Author: Jeff Peck, Sun Microsystems, Inc. <peck@sun.com>
--- 26,31 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* Author: Jeff Peck, Sun Microsystems, Inc. <peck@sun.com>
diff -2rcpP --exclude=*.elc emacs-19.30/src/syntax.c emacs-19.31/src/syntax.c
*** emacs-19.30/src/syntax.c	Sat Nov 11 15:28:28 1995
--- emacs-19.31/src/syntax.c	Tue Apr  9 18:11:41 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** find_defun_start (pos)
*** 112,122 ****
  
  DEFUN ("syntax-table-p", Fsyntax_table_p, Ssyntax_table_p, 1, 1, 0,
!   "Return t if ARG is a syntax table.\n\
  Currently, any char-table counts as a syntax table.")
!   (obj)
!      Lisp_Object obj;
  {
!   if (CHAR_TABLE_P (obj)
!       && XCHAR_TABLE (obj)->purpose == Qsyntax_table)
      return Qt;
    return Qnil;
--- 113,123 ----
  
  DEFUN ("syntax-table-p", Fsyntax_table_p, Ssyntax_table_p, 1, 1, 0,
!   "Return t if OBJECT is a syntax table.\n\
  Currently, any char-table counts as a syntax table.")
!   (object)
!      Lisp_Object object;
  {
!   if (CHAR_TABLE_P (object)
!       && XCHAR_TABLE (object)->purpose == Qsyntax_table)
      return Qt;
    return Qnil;
*************** It is a copy of the TABLE, which default
*** 163,167 ****
  
    copy = Fcopy_sequence (table);
!   Fset_char_table_parent (copy, Vstandard_syntax_table);
    return copy;
  }
--- 164,177 ----
  
    copy = Fcopy_sequence (table);
! 
!   /* Only the standard syntax table should have a default element.
!      Other syntax tables should inherit from parents instead.  */
!   XCHAR_TABLE (copy)->defalt = Qnil;
! 
!   /* Copied syntax tables should all have parents.
!      If we copied one with no parent, such as the standard syntax table,
!      use the standard syntax table as the copy's parent.  */
!   if (NILP (XCHAR_TABLE (copy)->parent))
!     Fset_char_table_parent (copy, Vstandard_syntax_table);
    return copy;
  }
*************** syntax_parent_lookup (table, character)
*** 238,262 ****
  
  DEFUN ("char-syntax", Fchar_syntax, Schar_syntax, 1, 1, 0,
!   "Return the syntax code of CHAR, described by a character.\n\
! For example, if CHAR is a word constituent, the character `?w' is returned.\n\
  The characters that correspond to various syntax codes\n\
  are listed in the documentation of `modify-syntax-entry'.")
!   (ch)
!      Lisp_Object ch;
  {
    int char_int;
!   CHECK_NUMBER (ch, 0);
!   char_int = XINT (ch);
    return make_number (syntax_code_spec[(int) SYNTAX (char_int)]);
  }
  
  DEFUN ("matching-paren", Fmatching_paren, Smatching_paren, 1, 1, 0,
!   "Return the matching parenthesis of CHAR, or nil if none.")
!   (ch)
!      Lisp_Object ch;
  {
    int char_int, code;
!   CHECK_NUMBER (ch, 0);
!   char_int = XINT (ch);
    code = SYNTAX (char_int);
    if (code == Sopen || code == Sclose)
--- 248,273 ----
  
  DEFUN ("char-syntax", Fchar_syntax, Schar_syntax, 1, 1, 0,
!   "Return the syntax code of CHARACTER, described by a character.\n\
! For example, if CHARACTER is a word constituent,\n\
! the character `w' is returned.\n\
  The characters that correspond to various syntax codes\n\
  are listed in the documentation of `modify-syntax-entry'.")
!   (character)
!      Lisp_Object character;
  {
    int char_int;
!   CHECK_NUMBER (character, 0);
!   char_int = XINT (character);
    return make_number (syntax_code_spec[(int) SYNTAX (char_int)]);
  }
  
  DEFUN ("matching-paren", Fmatching_paren, Smatching_paren, 1, 1, 0,
!   "Return the matching parenthesis of CHARACTER, or nil if none.")
!   (character)
!      Lisp_Object character;
  {
    int char_int, code;
!   CHECK_NUMBER (character, 0);
!   char_int = XINT (character);
    code = SYNTAX (char_int);
    if (code == Sopen || code == Sclose)
*************** The second character of S is the matchin
*** 288,295 ****
  Any additional characters are flags.\n\
  Defined flags are the characters 1, 2, 3, 4, b, and p.\n\
!  1 means C is the start of a two-char comment start sequence.\n\
!  2 means C is the second character of such a sequence.\n\
!  3 means C is the start of a two-char comment end sequence.\n\
!  4 means C is the second character of such a sequence.\n\
  \n\
  There can be up to two orthogonal comment sequences. This is to support\n\
--- 299,306 ----
  Any additional characters are flags.\n\
  Defined flags are the characters 1, 2, 3, 4, b, and p.\n\
!  1 means CHAR is the start of a two-char comment start sequence.\n\
!  2 means CHAR is the second character of such a sequence.\n\
!  3 means CHAR is the start of a two-char comment end sequence.\n\
!  4 means CHAR is the second character of such a sequence.\n\
  \n\
  There can be up to two orthogonal comment sequences. This is to support\n\
*************** a, but you can set the comment sequence 
*** 298,304 ****
  of a comment-start, or the first character of a comment-end sequence) using\n\
  this flag:\n\
!  b means C is part of comment sequence b.\n\
  \n\
!  p means C is a prefix character for `backward-prefix-chars';\n\
     such characters are treated as whitespace when they occur\n\
     between expressions.")
--- 309,315 ----
  of a comment-start, or the first character of a comment-end sequence) using\n\
  this flag:\n\
!  b means CHAR is part of comment sequence b.\n\
  \n\
!  p means CHAR is a prefix character for `backward-prefix-chars';\n\
     such characters are treated as whitespace when they occur\n\
     between expressions.")
diff -2rcpP --exclude=*.elc emacs-19.30/src/syntax.h emacs-19.31/src/syntax.h
*** emacs-19.30/src/syntax.h	Fri Oct 27 18:00:56 1995
--- emacs-19.31/src/syntax.h	Mon Jan 15 04:06:29 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** extern Lisp_Object syntax_parent_lookup 
*** 119,123 ****
     (NILP (syntax_temp)							\
      ? (syntax_temp							\
!        = syntax_parent_lookup (current_buffer->syntax_table, (c)))	\
      : syntax_temp))
  
--- 120,125 ----
     (NILP (syntax_temp)							\
      ? (syntax_temp							\
!        = syntax_parent_lookup (current_buffer->syntax_table,		\
! 			       (unsigned char) (c)))			\
      : syntax_temp))
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/sysdep.c emacs-19.31/src/sysdep.c
*** emacs-19.30/src/sysdep.c	Tue Nov  7 02:10:22 1995
--- emacs-19.31/src/sysdep.c	Thu Apr 11 14:12:38 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** extern int h_errno;
*** 86,89 ****
--- 87,95 ----
  #include "msdos.h"
  #include <sys/param.h>
+ 
+ #if __DJGPP__ > 1
+ extern int etext;
+ extern unsigned start __asm__ ("start");
+ #endif
  #endif
  
*************** wait_for_termination (pid)
*** 454,457 ****
--- 460,466 ----
  #endif /* not VMS */
  #else /* not subprocesses */
+ #if __DJGPP__ > 1
+       break;
+ #else /* not __DJGPP__ > 1 */
  #ifndef BSD4_1
        if (kill (pid, 0) < 0)
*************** wait_for_termination (pid)
*** 464,467 ****
--- 473,477 ----
  	break;
  #endif /* BSD4_1 */
+ #endif /* not __DJGPP__ > 1*/
  #endif /* not subprocesses */
      }
*************** child_setup_tty (out)
*** 522,528 ****
--- 532,542 ----
    s.main.c_iflag &= ~IUCLC;	/* Disable downcasing on input.  */
  #endif
+ #ifdef ISTRIP
+   s.main.c_iflag &= ~ISTRIP;	/* don't strip 8th bit on input */
+ #endif
  #ifdef OLCUC
    s.main.c_oflag &= ~OLCUC;	/* Disable upcasing on output.  */
  #endif
+   s.main.c_oflag &= ~TAB3;	/* Disable tab expansion */
    s.main.c_cflag = (s.main.c_cflag & ~CSIZE) | CS8; /* Don't strip 8th bit */
  #if 0
*************** sys_subshell ()
*** 721,726 ****
--- 735,745 ----
    pid = -1;
  #else /* not WINDOWSNT */
+ 
  #ifdef MSDOS
    pid = 0;
+ #if __DJGPP__ > 1
+   save_signal_handlers (saved_handlers);
+   synch_process_alive = 1;
+ #endif /* __DJGPP__ > 1 */
  #else  
    pid = vfork ();
*************** sys_subshell ()
*** 784,793 ****
--- 803,817 ----
      }
  
+   /* Do this now if we did not do it before.  */
+ #if !defined (MSDOS) || __DJGPP__ == 1
    save_signal_handlers (saved_handlers);
    synch_process_alive = 1;
+ #endif
+ 
  #ifndef MSDOS
    wait_for_termination (pid);
  #endif
    restore_signal_handlers (saved_handlers);
+   synch_process_alive = 0;
  #endif /* !VMS */
  }
*************** init_sys_modes ()
*** 1246,1249 ****
--- 1270,1277 ----
        tty.main.c_iflag |= (IGNBRK);	/* Ignore break condition */
        tty.main.c_iflag &= ~ICRNL;	/* Disable map of CR to NL on input */
+ #ifdef INLCR  /* I'm just being cautious,
+ 		 since I can't check how widespread INLCR is--rms.  */
+       tty.main.c_iflag &= ~INLCR;	/* Disable map of NL to CR on input */
+ #endif
  #ifdef ISTRIP
        tty.main.c_iflag &= ~ISTRIP;	/* don't strip 8th bit on input */
*************** init_sys_modes ()
*** 1315,1319 ****
  #endif /* mips or HAVE_TCATTR */
  #ifdef SET_LINE_DISCIPLINE
!       /* Need to explicitely request TERMIODISC line discipline or
           Ultrix's termios does not work correctly.  */
        tty.main.c_line = SET_LINE_DISCIPLINE;
--- 1343,1347 ----
  #endif /* mips or HAVE_TCATTR */
  #ifdef SET_LINE_DISCIPLINE
!       /* Need to explicitly request TERMIODISC line discipline or
           Ultrix's termios does not work correctly.  */
        tty.main.c_line = SET_LINE_DISCIPLINE;
*************** start_of_text ()
*** 2030,2034 ****
   *	that text and data are contiguous.  Then once loadup is complete,
   *	unexec will produce a shared executable where the data can be
!  *	at the normal shared text boundry and the startofdata variable
   *	will be patched by unexec to the correct value.
   *
--- 2058,2062 ----
   *	that text and data are contiguous.  Then once loadup is complete,
   *	unexec will produce a shared executable where the data can be
!  *	at the normal shared text boundary and the startofdata variable
   *	will be patched by unexec to the correct value.
   *
*************** sys_abort ()
*** 2796,2800 ****
  #ifdef VMS
  #ifdef LINK_CRTL_SHARE
! #ifdef SHAREABLE_LIB_BUG
  /* Variables declared noshare and initialized in sharable libraries
     cannot be shared.  The VMS linker incorrectly forces you to use a private
--- 2824,2828 ----
  #ifdef VMS
  #ifdef LINK_CRTL_SHARE
! #ifdef SHARABLE_LIB_BUG
  /* Variables declared noshare and initialized in sharable libraries
     cannot be shared.  The VMS linker incorrectly forces you to use a private
*************** char *sys_errlist[] =
*** 2842,2846 ****
      "vax/vms specific error code nontranslatable error"
    };
! #endif /* SHAREABLE_LIB_BUG */
  #endif /* LINK_CRTL_SHARE */
  #endif /* VMS */
--- 2870,2874 ----
      "vax/vms specific error code nontranslatable error"
    };
! #endif /* SHARABLE_LIB_BUG */
  #endif /* LINK_CRTL_SHARE */
  #endif /* VMS */
*************** char *sys_siglist[NSIG + 1] =
*** 3041,3045 ****
    "window size change",			    /* 20 SIGWINCH */
    "urgent socket condition",		    /* 21 SIGURG */
!   "pollable event occured",		    /* 22 SIGPOLL */
    "stop (cannot be caught or ignored)", /*  23 SIGSTOP */
    "user stop requested from tty",	    /* 24 SIGTSTP */
--- 3069,3073 ----
    "window size change",			    /* 20 SIGWINCH */
    "urgent socket condition",		    /* 21 SIGURG */
!   "pollable event occurred",		    /* 22 SIGPOLL */
    "stop (cannot be caught or ignored)", /*  23 SIGSTOP */
    "user stop requested from tty",	    /* 24 SIGTSTP */
*************** sys_access (filename, type)
*** 3761,3765 ****
      
  #define CHECKPRIV(bit)    (prvmask.bit)
! #define WRITEABLE(field)  (! ((xab.xab$w_pro >> field) & XAB$M_NOWRITE))
  
    /* Find privilege bits */
--- 3789,3793 ----
      
  #define CHECKPRIV(bit)    (prvmask.bit)
! #define WRITABLE(field)  (! ((xab.xab$w_pro >> field) & XAB$M_NOWRITE))
  
    /* Find privilege bits */
*************** sys_access (filename, type)
*** 3782,3786 ****
    SYS$CLOSE (&fab, 0, 0);
    /* Check system access */
!   if (CHECKPRIV (PRV$V_SYSPRV) && WRITEABLE (XAB$V_SYS))
      return 0;
    /* Check ACL entries, if any */
--- 3810,3814 ----
    SYS$CLOSE (&fab, 0, 0);
    /* Check system access */
!   if (CHECKPRIV (PRV$V_SYSPRV) && WRITABLE (XAB$V_SYS))
      return 0;
    /* Check ACL entries, if any */
*************** sys_access (filename, type)
*** 3808,3821 ****
      }
    /* No ACL entries specified, check normal protection */
!   if (WRITEABLE (XAB$V_WLD))	/* World writeable */
      return 0;
!   if (WRITEABLE (XAB$V_GRP) &&
        (unsigned short) (xab.xab$l_uic >> 16) == grpid)
!     return 0;			/* Group writeable */
!   if (WRITEABLE (XAB$V_OWN) &&
        (xab.xab$l_uic & 0xFFFF) == memid)
!     return 0;			/* Owner writeable */
  
!   return -1;	/* Not writeable */
  }
  #endif /* not VMS4_4 */
--- 3836,3849 ----
      }
    /* No ACL entries specified, check normal protection */
!   if (WRITABLE (XAB$V_WLD))	/* World writable */
      return 0;
!   if (WRITABLE (XAB$V_GRP) &&
        (unsigned short) (xab.xab$l_uic >> 16) == grpid)
!     return 0;			/* Group writable */
!   if (WRITABLE (XAB$V_OWN) &&
        (xab.xab$l_uic & 0xFFFF) == memid)
!     return 0;			/* Owner writable */
  
!   return -1;	/* Not writable */
  }
  #endif /* not VMS4_4 */
*************** cnv_uaf_pw (up)
*** 4500,4504 ****
    retpw.pw_gid = up->uaf$w_grp;
  
!   /* I suppose this is not the best sytle, to possibly overwrite one
       byte beyond the end of the field, but what the heck... */
    ptr = &up->uaf$t_username[UAF$S_USERNAME];
--- 4528,4532 ----
    retpw.pw_gid = up->uaf$w_grp;
  
!   /* I suppose this is not the best style, to possibly overwrite one
       byte beyond the end of the field, but what the heck... */
    ptr = &up->uaf$t_username[UAF$S_USERNAME];
diff -2rcpP --exclude=*.elc emacs-19.30/src/sysselect.h emacs-19.31/src/sysselect.h
*** emacs-19.30/src/sysselect.h	Mon Jan 23 18:01:58 1995
--- emacs-19.31/src/sysselect.h	Mon Jan 15 04:06:29 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  #ifdef HAVE_SYS_SELECT
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  #ifdef HAVE_SYS_SELECT
diff -2rcpP --exclude=*.elc emacs-19.30/src/syssignal.h emacs-19.31/src/syssignal.h
*** emacs-19.30/src/syssignal.h	Sun Oct 29 21:37:03 1995
--- emacs-19.31/src/syssignal.h	Fri Apr 26 15:52:02 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  #ifdef POSIX_SIGNALS
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  #ifdef POSIX_SIGNALS
*************** extern sigset_t sys_sigmask ();
*** 52,56 ****
--- 53,59 ----
  #define sigblock(SIG)    sys_sigblock (SIG)
  #define sigunblock(SIG)  sys_sigunblock (SIG)
+ #ifndef sigsetmask
  #define sigsetmask(SIG)  sys_sigsetmask (SIG)
+ #endif
  #define sighold(SIG)     ONLY_USED_IN_BSD_4_1
  #define sigrelse(SIG)    ONLY_USED_IN_BSD_4_1
*************** sigset_t sys_sigsetmask (/*sigset_t new_
*** 138,142 ****
  #else
  #ifdef WINDOWSNT
! #define EMACS_KILLPG(gid, signo) (win32_kill_process (gid, signo))
  #else
  #define EMACS_KILLPG(gid, signo) (kill   (-(gid), (signo)))
--- 141,145 ----
  #else
  #ifdef WINDOWSNT
! #define EMACS_KILLPG(gid, signo) (kill (gid, signo))
  #else
  #define EMACS_KILLPG(gid, signo) (kill   (-(gid), (signo)))
diff -2rcpP --exclude=*.elc emacs-19.30/src/systime.h emacs-19.31/src/systime.h
*** emacs-19.30/src/systime.h	Thu Jun 15 16:39:05 1995
--- emacs-19.31/src/systime.h	Mon Jan 15 04:06:29 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  #ifdef TIME_WITH_SYS_TIME
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  #ifdef TIME_WITH_SYS_TIME
diff -2rcpP --exclude=*.elc emacs-19.30/src/systty.h emacs-19.31/src/systty.h
*** emacs-19.30/src/systty.h	Wed Jun 14 19:18:41 1995
--- emacs-19.31/src/systty.h	Tue May 21 10:43:11 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  #ifdef HAVE_TERMIOS
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  #ifdef HAVE_TERMIOS
*************** static struct sensemode {
*** 116,119 ****
--- 117,121 ----
  
  #ifdef __GNU_LIBRARY__
+ #include <sys/ioctl.h>
  #include <termios.h>
  #endif
diff -2rcpP --exclude=*.elc emacs-19.30/src/syswait.h emacs-19.31/src/syswait.h
*** emacs-19.30/src/syswait.h	Thu Apr  6 22:03:10 1995
--- emacs-19.31/src/syswait.h	Thu Apr 11 13:41:39 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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 the structure that the wait system call stores.
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* Define the structure that the wait system call stores.
*************** the Free Software Foundation, 675 Mass A
*** 34,38 ****
  #else /* not WAIT_USE_INT */
  
! #if (!defined (BSD) && !defined (UNIPLUS) && !defined (STRIDE) && !(defined (HPUX) && !defined (NOMULTIPLEJOBS)) && !defined (HAVE_WAIT_HEADER)) || defined (LINUX)
  #define WAITTYPE int
  #define WIFSTOPPED(w) ((w&0377) == 0177)
--- 35,39 ----
  #else /* not WAIT_USE_INT */
  
! #if (!defined (BSD) && !defined (UNIPLUS) && !defined (STRIDE) && !(defined (HPUX) && !defined (NOMULTIPLEJOBS)) && !defined (HAVE_WAIT_HEADER))
  #define WAITTYPE int
  #define WIFSTOPPED(w) ((w&0377) == 0177)
diff -2rcpP --exclude=*.elc emacs-19.30/src/term.c emacs-19.31/src/term.c
*** emacs-19.30/src/term.c	Tue Nov  7 02:10:29 1995
--- emacs-19.31/src/term.c	Fri Apr 26 15:52:10 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** void (*set_vertical_scroll_bar_hook)
*** 157,161 ****
     Instead, we just assert at the beginning of redisplay that *all*
     scroll bars are to be removed, and then save scroll bars from the
!    firey pit when we actually redisplay their window.  */
  
  /* Arrange for all scroll bars on FRAME to be removed at the next call
--- 158,162 ----
     Instead, we just assert at the beginning of redisplay that *all*
     scroll bars are to be removed, and then save scroll bars from the
!    fiery pit when we actually redisplay their window.  */
  
  /* Arrange for all scroll bars on FRAME to be removed at the next call
*************** extern char *tgetstr ();
*** 298,302 ****
  
  #ifdef WINDOWSNT
- #ifndef HAVE_NTGUI
  /* We aren't X windows, but we aren't termcap either.  This makes me
     uncertain as to what value to use for frame.output_method.  For
--- 299,302 ----
*************** extern char *tgetstr ();
*** 307,311 ****
  #undef FRAME_TERMCAP_P
  #define FRAME_TERMCAP_P(_f_) 0
- #endif /* not HAVE_NTGUI */
  #endif /* WINDOWSNT */
  
--- 307,310 ----
*************** calculate_ins_del_char_costs (frame)
*** 1092,1096 ****
    /* Delete costs are at negative offsets */
    p = &char_ins_del_cost (frame)[0];
!   for (i = FRAME_WIDTH (selected_frame); --i >= 0;)
      *--p = (del_startup_cost += del_cost_per_char);
  
--- 1091,1095 ----
    /* Delete costs are at negative offsets */
    p = &char_ins_del_cost (frame)[0];
!   for (i = FRAME_WIDTH (frame); --i >= 0;)
      *--p = (del_startup_cost += del_cost_per_char);
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/termcap.c emacs-19.31/src/termcap.c
*** emacs-19.30/src/termcap.c	Sat Sep  2 19:52:16 1995
--- emacs-19.31/src/termcap.c	Tue Apr  9 18:14:14 1996
*************** GNU General Public License for more deta
*** 14,18 ****
  You should have received a copy of the GNU General Public License
  along with this program; see the file COPYING.  If not, write to
! the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  
  /* Emacs config.h may rename various library functions such as malloc.  */
--- 14,19 ----
  You should have received a copy of the GNU General Public License
  along with this program; see the file COPYING.  If not, write to
! the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* Emacs config.h may rename various library functions such as malloc.  */
*************** tputs (str, nlines, outfun)
*** 301,306 ****
    if (ospeed == 0)
      speed = tputs_baud_rate;
!   else
      speed = speeds[ospeed];
  #endif
  
--- 302,309 ----
    if (ospeed == 0)
      speed = tputs_baud_rate;
!   else if (ospeed > 0 && ospeed < (sizeof speeds / sizeof speeds[0]))
      speed = speeds[ospeed];
+   else
+     speed = 0;
  #endif
  
*************** tgetent (bp, name)
*** 422,426 ****
    struct buffer buf;
    register char *bp1;
!   char *bp2;
    char *term;
    int malloc_size = 0;
--- 425,429 ----
    struct buffer buf;
    register char *bp1;
!   char *tc_search_point;
    char *term;
    int malloc_size = 0;
*************** tgetent (bp, name)
*** 510,514 ****
        bp = (char *) xmalloc (malloc_size);
      }
!   bp1 = bp;
  
    if (indirect)
--- 513,517 ----
        bp = (char *) xmalloc (malloc_size);
      }
!   tc_search_point = bp1 = bp;
  
    if (indirect)
*************** tgetent (bp, name)
*** 541,549 ****
  	  termcap_name = (char *) xrealloc (bp, malloc_size);
  	  bp1 += termcap_name - bp;
  	  bp = termcap_name;
  	}
  
-       bp2 = bp1;
- 
        /* Copy the line of the entry from buf into bp.  */
        termcap_name = buf.ptr;
--- 544,551 ----
  	  termcap_name = (char *) xrealloc (bp, malloc_size);
  	  bp1 += termcap_name - bp;
+ 	  tc_search_point += termcap_name - bp;
  	  bp = termcap_name;
  	}
  
        /* Copy the line of the entry from buf into bp.  */
        termcap_name = buf.ptr;
*************** tgetent (bp, name)
*** 559,563 ****
        /* Does this entry refer to another terminal type's entry?
  	 If something is found, copy it into heap and null-terminate it.  */
!       term = tgetst1 (find_capability (bp2, "tc"), (char **) 0);
      }
  
--- 561,566 ----
        /* Does this entry refer to another terminal type's entry?
  	 If something is found, copy it into heap and null-terminate it.  */
!       tc_search_point = find_capability (tc_search_point, "tc");
!       term = tgetst1 (tc_search_point, (char **) 0);
      }
  
*************** tprint (cap)
*** 780,782 ****
  
  #endif /* TEST */
- 
--- 783,784 ----
diff -2rcpP --exclude=*.elc emacs-19.30/src/termchar.h emacs-19.31/src/termchar.h
*** emacs-19.30/src/termchar.h	Thu Jun 15 16:39:06 1995
--- emacs-19.31/src/termchar.h	Mon Jan 15 04:06:29 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/termhooks.h emacs-19.31/src/termhooks.h
*** emacs-19.30/src/termhooks.h	Sun Jul 23 03:39:07 1995
--- emacs-19.31/src/termhooks.h	Tue May  7 20:03:29 1996
*************** GNU General Public License for more deta
*** 17,21 ****
  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.  */
  
  
--- 17,22 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** enum scroll_bar_part {
*** 59,63 ****
    scroll_bar_above_handle,
    scroll_bar_handle,
!   scroll_bar_below_handle
  };
  
--- 60,66 ----
    scroll_bar_above_handle,
    scroll_bar_handle,
!   scroll_bar_below_handle,
!   scroll_bar_up_arrow,
!   scroll_bar_down_arrow
  };
  
*************** extern void (*set_vertical_scroll_bar_ho
*** 148,152 ****
     Instead, we just assert at the beginning of redisplay that *all*
     scroll bars are to be removed, and then save scroll bars from the
!    firey pit when we actually redisplay their window.  */
  
  /* Arrange for all scroll bars on FRAME to be removed at the next call
--- 151,155 ----
     Instead, we just assert at the beginning of redisplay that *all*
     scroll bars are to be removed, and then save scroll bars from the
!    fiery pit when we actually redisplay their window.  */
  
  /* Arrange for all scroll bars on FRAME to be removed at the next call
*************** enum event_kind
*** 220,223 ****
--- 223,227 ----
  				   .timestamp gives a timestamp (in
  				   milliseconds) for the keystroke.  */
+   timer_event,                  /* A timer fired.  */
    mouse_click,			/* The button number is in .code; it must
  				   be >= 0 and < NUM_MOUSE_BUTTONS, defined
*************** enum event_kind
*** 244,247 ****
--- 248,255 ----
  				   .timestamp gives a timestamp (in
  				   milliseconds) for the click.  */
+ #ifdef WINDOWSNT
+   win32_scroll_bar_click,	/* as for scroll_bar_click, but only generated
+ 				   by MS-Windows scroll bar controls. */
+ #endif
    selection_request_event,	/* Another X client wants a selection from us.
  				   See `struct selection_event'.  */
*************** enum event_kind
*** 268,275 ****
     they are removed from the event queue.  */
  
! struct input_event {
  
    /* What kind of event was this?  */
!   enum event_kind kind;
    
    /* For an ascii_keystroke, this is the character.
--- 276,284 ----
     they are removed from the event queue.  */
  
! struct input_event
! {
  
    /* What kind of event was this?  */
!   int kind;
    
    /* For an ascii_keystroke, this is the character.
*************** struct input_event {
*** 279,292 ****
    enum scroll_bar_part part;
  
    /* This field is copied into a vector while the event is in the queue,
       so that garbage collections won't kill it.  */
    /* In a menu_bar_event, this is a cons cell whose car is the frame
       and whose cdr is the Lisp object that is the event's value.  */
    Lisp_Object frame_or_window;
- 
-   int modifiers;		/* See enum below for interpretation.  */
- 
-   Lisp_Object x, y;
-   unsigned long timestamp;
  };
  
--- 288,307 ----
    enum scroll_bar_part part;
  
+   int modifiers;		/* See enum below for interpretation.  */
+ 
+   Lisp_Object x, y;
+   unsigned long timestamp;
+ 
+   /* This is padding just to put the frame_or_window field
+      past the size of struct selection_event.  */
+   int *padding[2];
+ 
    /* This field is copied into a vector while the event is in the queue,
       so that garbage collections won't kill it.  */
    /* In a menu_bar_event, this is a cons cell whose car is the frame
       and whose cdr is the Lisp object that is the event's value.  */
+   /* This field is last so that struct selection_input_event
+      does not overlap with it.  */
    Lisp_Object frame_or_window;
  };
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/terminfo.c emacs-19.31/src/terminfo.c
*** emacs-19.30/src/terminfo.c	Sat Sep 11 21:21:25 1993
--- emacs-19.31/src/terminfo.c	Mon Jan 15 04:06:29 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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 these variables that serve as global parameters to termcap,
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* Define these variables that serve as global parameters to termcap,
diff -2rcpP --exclude=*.elc emacs-19.30/src/termopts.h emacs-19.31/src/termopts.h
*** emacs-19.30/src/termopts.h	Thu Jun 15 16:39:06 1995
--- emacs-19.31/src/termopts.h	Mon Jan 15 04:06:29 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/textprop.c emacs-19.31/src/textprop.c
*** emacs-19.30/src/textprop.c	Wed Nov 15 15:14:59 1995
--- emacs-19.31/src/textprop.c	Tue Apr  9 18:04:23 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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 <config.h>
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  #include <config.h>
*************** set_properties (properties, interval, ob
*** 305,308 ****
--- 306,311 ----
  				    XCONS (sym)->car, XCONS (value)->car,
  				    object);
+ 	    signal_after_change (interval->position, LENGTH (interval),
+ 				 LENGTH (interval));
  	  }
  
*************** set_properties (properties, interval, ob
*** 320,323 ****
--- 323,328 ----
  				    XCONS (sym)->car, Qnil,
  				    object);
+ 	    signal_after_change (interval->position, LENGTH (interval),
+ 				 LENGTH (interval));
  	  }
      }
*************** add_properties (plist, i, object)
*** 387,390 ****
--- 392,396 ----
  		record_property_change (i->position, LENGTH (i),
  					sym1, Fcar (this_cdr), object);
+ 		signal_after_change (i->position, LENGTH (i), LENGTH (i));
  	      }
  
*************** add_properties (plist, i, object)
*** 405,408 ****
--- 411,415 ----
  	      record_property_change (i->position, LENGTH (i),
  				      sym1, Qnil, object);
+ 	      signal_after_change (i->position, LENGTH (i), LENGTH (i));
  	    }
  	  i->plist = Fcons (sym1, Fcons (val1, i->plist));
*************** remove_properties (plist, i, object)
*** 446,449 ****
--- 453,457 ----
  				      sym, Fcar (Fcdr (current_plist)),
  				      object);
+ 	      signal_after_change (i->position, LENGTH (i), LENGTH (i));
  	    }
  
*************** remove_properties (plist, i, object)
*** 467,470 ****
--- 475,479 ----
  		  record_property_change (i->position, LENGTH (i),
  					  sym, Fcar (Fcdr (this)), object);
+ 		  signal_after_change (i->position, LENGTH (i), LENGTH (i));
  		}
  
*************** in optional argument OBJECT, a string or
*** 503,508 ****
  defaults to the current buffer.\n\
  If POSITION is at the end of OBJECT, the value is nil.")
!   (pos, object)
!      Lisp_Object pos, object;
  {
    register INTERVAL i;
--- 512,517 ----
  defaults to the current buffer.\n\
  If POSITION is at the end of OBJECT, the value is nil.")
!   (position, object)
!      Lisp_Object position, object;
  {
    register INTERVAL i;
*************** If POSITION is at the end of OBJECT, the
*** 511,522 ****
      XSETBUFFER (object, current_buffer);
  
!   i = validate_interval_range (object, &pos, &pos, soft);
    if (NULL_INTERVAL_P (i))
      return Qnil;
!   /* If POS is at the end of the interval,
       it means it's the end of OBJECT.
       There are no properties at the very end,
       since no character follows.  */
!   if (XINT (pos) == LENGTH (i) + i->position)
      return Qnil;
  
--- 520,531 ----
      XSETBUFFER (object, current_buffer);
  
!   i = validate_interval_range (object, &position, &position, soft);
    if (NULL_INTERVAL_P (i))
      return Qnil;
!   /* If POSITION is at the end of the interval,
       it means it's the end of OBJECT.
       There are no properties at the very end,
       since no character follows.  */
!   if (XINT (position) == LENGTH (i) + i->position)
      return Qnil;
  
*************** If POSITION is at the end of OBJECT, the
*** 525,553 ****
  
  DEFUN ("get-text-property", Fget_text_property, Sget_text_property, 2, 3, 0,
!   "Return the value of position POS's property PROP, in OBJECT.\n\
  OBJECT is optional and defaults to the current buffer.\n\
  If POSITION is at the end of OBJECT, the value is nil.")
!   (pos, prop, object)
!      Lisp_Object pos, object;
       Lisp_Object prop;
  {
!   return textget (Ftext_properties_at (pos, object), prop);
  }
  
  DEFUN ("get-char-property", Fget_char_property, Sget_char_property, 2, 3, 0,
!   "Return the value of position POS's property PROP, in OBJECT.\n\
  OBJECT is optional and defaults to the current buffer.\n\
! If POS is at the end of OBJECT, the value is nil.\n\
  If OBJECT is a buffer, then overlay properties are considered as well as\n\
  text properties.\n\
  If OBJECT is a window, then that window's buffer is used, but window-specific\n\
  overlays are considered only if they are associated with OBJECT.")
!   (pos, prop, object)
!      Lisp_Object pos, object;
       register Lisp_Object prop;
  {
    struct window *w = 0;
  
!   CHECK_NUMBER_COERCE_MARKER (pos, 0);
  
    if (NILP (object))
--- 534,562 ----
  
  DEFUN ("get-text-property", Fget_text_property, Sget_text_property, 2, 3, 0,
!   "Return the value of POSITION's property PROP, in OBJECT.\n\
  OBJECT is optional and defaults to the current buffer.\n\
  If POSITION is at the end of OBJECT, the value is nil.")
!   (position, prop, object)
!      Lisp_Object position, object;
       Lisp_Object prop;
  {
!   return textget (Ftext_properties_at (position, object), prop);
  }
  
  DEFUN ("get-char-property", Fget_char_property, Sget_char_property, 2, 3, 0,
!   "Return the value of POSITION's property PROP, in OBJECT.\n\
  OBJECT is optional and defaults to the current buffer.\n\
! If POSITION is at the end of OBJECT, the value is nil.\n\
  If OBJECT is a buffer, then overlay properties are considered as well as\n\
  text properties.\n\
  If OBJECT is a window, then that window's buffer is used, but window-specific\n\
  overlays are considered only if they are associated with OBJECT.")
!   (position, prop, object)
!      Lisp_Object position, object;
       register Lisp_Object prop;
  {
    struct window *w = 0;
  
!   CHECK_NUMBER_COERCE_MARKER (position, 0);
  
    if (NILP (object))
*************** overlays are considered only if they are
*** 561,565 ****
    if (BUFFERP (object))
      {
!       int posn = XINT (pos);
        int noverlays;
        Lisp_Object *overlay_vec, tem;
--- 570,574 ----
    if (BUFFERP (object))
      {
!       int posn = XINT (position);
        int noverlays;
        Lisp_Object *overlay_vec, tem;
*************** overlays are considered only if they are
*** 600,604 ****
    /* Not a buffer, or no appropriate overlay, so fall through to the
       simpler case.  */
!   return (Fget_text_property (pos, prop, object));
  }
  
--- 609,613 ----
    /* Not a buffer, or no appropriate overlay, so fall through to the
       simpler case.  */
!   return (Fget_text_property (position, prop, object));
  }
  
*************** DEFUN ("next-property-change", Fnext_pro
*** 606,618 ****
         Snext_property_change, 1, 3, 0,
    "Return the position of next property change.\n\
! Scans characters forward from POS in OBJECT till it finds\n\
  a change in some text property, then returns the position of the change.\n\
  The optional second argument OBJECT is the string or buffer to scan.\n\
  Return nil if the property is constant all the way to the end of OBJECT.\n\
! If the value is non-nil, it is a position greater than POS, never equal.\n\n\
  If the optional third argument LIMIT is non-nil, don't search\n\
  past position LIMIT; return LIMIT if nothing is found before LIMIT.")
!   (pos, object, limit)
!      Lisp_Object pos, object, limit;
  {
    register INTERVAL i, next;
--- 615,627 ----
         Snext_property_change, 1, 3, 0,
    "Return the position of next property change.\n\
! Scans characters forward from POSITION in OBJECT till it finds\n\
  a change in some text property, then returns the position of the change.\n\
  The optional second argument OBJECT is the string or buffer to scan.\n\
  Return nil if the property is constant all the way to the end of OBJECT.\n\
! If the value is non-nil, it is a position greater than POSITION, never equal.\n\n\
  If the optional third argument LIMIT is non-nil, don't search\n\
  past position LIMIT; return LIMIT if nothing is found before LIMIT.")
!   (position, object, limit)
!      Lisp_Object position, object, limit;
  {
    register INTERVAL i, next;
*************** past position LIMIT; return LIMIT if not
*** 624,628 ****
      CHECK_NUMBER_COERCE_MARKER (limit, 0);
  
!   i = validate_interval_range (object, &pos, &pos, soft);
  
    /* If LIMIT is t, return start of next interval--don't
--- 633,637 ----
      CHECK_NUMBER_COERCE_MARKER (limit, 0);
  
!   i = validate_interval_range (object, &position, &position, soft);
  
    /* If LIMIT is t, return start of next interval--don't
*************** past position LIMIT; return LIMIT if not
*** 636,645 ****
  	
        if (NULL_INTERVAL_P (next))
! 	XSETFASTINT (pos, (STRINGP (object)
! 			   ? XSTRING (object)->size
! 			   : BUF_ZV (XBUFFER (object))));
        else
! 	XSETFASTINT (pos, next->position - (STRINGP (object)));
!       return pos;
      }
  
--- 645,654 ----
  	
        if (NULL_INTERVAL_P (next))
! 	XSETFASTINT (position, (STRINGP (object)
! 				? XSTRING (object)->size
! 				: BUF_ZV (XBUFFER (object))));
        else
! 	XSETFASTINT (position, next->position - (STRINGP (object)));
!       return position;
      }
  
*************** past position LIMIT; return LIMIT if not
*** 658,663 ****
      return limit;
  
!   XSETFASTINT (pos, next->position - (STRINGP (object)));
!   return pos;
  }
  
--- 667,672 ----
      return limit;
  
!   XSETFASTINT (position, next->position - (STRINGP (object)));
!   return position;
  }
  
*************** DEFUN ("next-single-property-change", Fn
*** 697,710 ****
         Snext_single_property_change, 2, 4, 0,
    "Return the position of next property change for a specific property.\n\
! Scans characters forward from POS till it finds\n\
  a change in the PROP property, then returns the position of the change.\n\
  The optional third argument OBJECT is the string or buffer to scan.\n\
  The property values are compared with `eq'.\n\
  Return nil if the property is constant all the way to the end of OBJECT.\n\
! If the value is non-nil, it is a position greater than POS, never equal.\n\n\
  If the optional fourth argument LIMIT is non-nil, don't search\n\
  past position LIMIT; return LIMIT if nothing is found before LIMIT.")
!   (pos, prop, object, limit)
!      Lisp_Object pos, prop, object, limit;
  {
    register INTERVAL i, next;
--- 706,719 ----
         Snext_single_property_change, 2, 4, 0,
    "Return the position of next property change for a specific property.\n\
! Scans characters forward from POSITION till it finds\n\
  a change in the PROP property, then returns the position of the change.\n\
  The optional third argument OBJECT is the string or buffer to scan.\n\
  The property values are compared with `eq'.\n\
  Return nil if the property is constant all the way to the end of OBJECT.\n\
! If the value is non-nil, it is a position greater than POSITION, never equal.\n\n\
  If the optional fourth argument LIMIT is non-nil, don't search\n\
  past position LIMIT; return LIMIT if nothing is found before LIMIT.")
!   (position, prop, object, limit)
!      Lisp_Object position, prop, object, limit;
  {
    register INTERVAL i, next;
*************** past position LIMIT; return LIMIT if not
*** 717,721 ****
      CHECK_NUMBER_COERCE_MARKER (limit, 0);
  
!   i = validate_interval_range (object, &pos, &pos, soft);
    if (NULL_INTERVAL_P (i))
      return limit;
--- 726,730 ----
      CHECK_NUMBER_COERCE_MARKER (limit, 0);
  
!   i = validate_interval_range (object, &position, &position, soft);
    if (NULL_INTERVAL_P (i))
      return limit;
*************** past position LIMIT; return LIMIT if not
*** 733,738 ****
      return limit;
  
!   XSETFASTINT (pos, next->position - (STRINGP (object)));
!   return pos;
  }
  
--- 742,747 ----
      return limit;
  
!   XSETFASTINT (position, next->position - (STRINGP (object)));
!   return position;
  }
  
*************** DEFUN ("previous-property-change", Fprev
*** 740,752 ****
         Sprevious_property_change, 1, 3, 0,
    "Return the position of previous property change.\n\
! Scans characters backwards from POS in OBJECT till it finds\n\
  a change in some text property, then returns the position of the change.\n\
  The optional second argument OBJECT is the string or buffer to scan.\n\
  Return nil if the property is constant all the way to the start of OBJECT.\n\
! If the value is non-nil, it is a position less than POS, never equal.\n\n\
  If the optional third argument LIMIT is non-nil, don't search\n\
  back past position LIMIT; return LIMIT if nothing is found until LIMIT.")
!   (pos, object, limit)
!      Lisp_Object pos, object, limit;
  {
    register INTERVAL i, previous;
--- 749,761 ----
         Sprevious_property_change, 1, 3, 0,
    "Return the position of previous property change.\n\
! Scans characters backwards from POSITION in OBJECT till it finds\n\
  a change in some text property, then returns the position of the change.\n\
  The optional second argument OBJECT is the string or buffer to scan.\n\
  Return nil if the property is constant all the way to the start of OBJECT.\n\
! If the value is non-nil, it is a position less than POSITION, never equal.\n\n\
  If the optional third argument LIMIT is non-nil, don't search\n\
  back past position LIMIT; return LIMIT if nothing is found until LIMIT.")
!   (position, object, limit)
!      Lisp_Object position, object, limit;
  {
    register INTERVAL i, previous;
*************** back past position LIMIT; return LIMIT i
*** 758,767 ****
      CHECK_NUMBER_COERCE_MARKER (limit, 0);
  
!   i = validate_interval_range (object, &pos, &pos, soft);
    if (NULL_INTERVAL_P (i))
      return limit;
  
    /* Start with the interval containing the char before point.  */
!   if (i->position == XFASTINT (pos))
      i = previous_interval (i);
  
--- 767,776 ----
      CHECK_NUMBER_COERCE_MARKER (limit, 0);
  
!   i = validate_interval_range (object, &position, &position, soft);
    if (NULL_INTERVAL_P (i))
      return limit;
  
    /* Start with the interval containing the char before point.  */
!   if (i->position == XFASTINT (position))
      i = previous_interval (i);
  
*************** back past position LIMIT; return LIMIT i
*** 777,783 ****
      return limit;
  
!   XSETFASTINT (pos, (previous->position + LENGTH (previous)
  		     - (STRINGP (object))));
!   return pos;
  }
  
--- 786,792 ----
      return limit;
  
!   XSETFASTINT (position, (previous->position + LENGTH (previous)
  		     - (STRINGP (object))));
!   return position;
  }
  
*************** DEFUN ("previous-single-property-change"
*** 785,798 ****
         Sprevious_single_property_change, 2, 4, 0,
    "Return the position of previous property change for a specific property.\n\
! Scans characters backward from POS till it finds\n\
  a change in the PROP property, then returns the position of the change.\n\
  The optional third argument OBJECT is the string or buffer to scan.\n\
  The property values are compared with `eq'.\n\
  Return nil if the property is constant all the way to the start of OBJECT.\n\
! If the value is non-nil, it is a position less than POS, never equal.\n\n\
  If the optional fourth argument LIMIT is non-nil, don't search\n\
  back past position LIMIT; return LIMIT if nothing is found until LIMIT.")
!      (pos, prop, object, limit)
!      Lisp_Object pos, prop, object, limit;
  {
    register INTERVAL i, previous;
--- 794,807 ----
         Sprevious_single_property_change, 2, 4, 0,
    "Return the position of previous property change for a specific property.\n\
! Scans characters backward from POSITION till it finds\n\
  a change in the PROP property, then returns the position of the change.\n\
  The optional third argument OBJECT is the string or buffer to scan.\n\
  The property values are compared with `eq'.\n\
  Return nil if the property is constant all the way to the start of OBJECT.\n\
! If the value is non-nil, it is a position less than POSITION, never equal.\n\n\
  If the optional fourth argument LIMIT is non-nil, don't search\n\
  back past position LIMIT; return LIMIT if nothing is found until LIMIT.")
!      (position, prop, object, limit)
!      Lisp_Object position, prop, object, limit;
  {
    register INTERVAL i, previous;
*************** back past position LIMIT; return LIMIT i
*** 805,812 ****
      CHECK_NUMBER_COERCE_MARKER (limit, 0);
  
!   i = validate_interval_range (object, &pos, &pos, soft);
  
    /* Start with the interval containing the char before point.  */
!   if (! NULL_INTERVAL_P (i) && i->position == XFASTINT (pos))
      i = previous_interval (i);
  
--- 814,821 ----
      CHECK_NUMBER_COERCE_MARKER (limit, 0);
  
!   i = validate_interval_range (object, &position, &position, soft);
  
    /* Start with the interval containing the char before point.  */
!   if (! NULL_INTERVAL_P (i) && i->position == XFASTINT (position))
      i = previous_interval (i);
  
*************** back past position LIMIT; return LIMIT i
*** 827,833 ****
      return limit;
  
!   XSETFASTINT (pos, (previous->position + LENGTH (previous)
  		     - (STRINGP (object))));
!   return pos;
  }
  
--- 836,842 ----
      return limit;
  
!   XSETFASTINT (position, (previous->position + LENGTH (previous)
  		     - (STRINGP (object))));
!   return position;
  }
  
*************** DEFUN ("add-text-properties", Fadd_text_
*** 837,841 ****
         Sadd_text_properties, 3, 4, 0,
    "Add properties to the text from START to END.\n\
! The third argument PROPS is a property list\n\
  specifying the property values to add.\n\
  The optional fourth argument, OBJECT,\n\
--- 846,850 ----
         Sadd_text_properties, 3, 4, 0,
    "Add properties to the text from START to END.\n\
! The third argument PROPERTIES is a property list\n\
  specifying the property values to add.\n\
  The optional fourth argument, OBJECT,\n\
*************** Return t if any property value actually 
*** 877,881 ****
  	  int got = (LENGTH (i) - (s - i->position));
  	  if (got >= len)
! 	    return Qnil;
  	  len -= got;
  	  i = next_interval (i);
--- 886,890 ----
  	  int got = (LENGTH (i) - (s - i->position));
  	  if (got >= len)
! 	    RETURN_UNGCPRO (Qnil);
  	  len -= got;
  	  i = next_interval (i);
*************** DEFUN ("put-text-property", Fput_text_pr
*** 930,942 ****
         Sput_text_property, 4, 5, 0,
    "Set one property of the text from START to END.\n\
! The third and fourth arguments PROP and VALUE\n\
  specify the property to add.\n\
  The optional fifth argument, OBJECT,\n\
  is the string or buffer containing the text.")
!   (start, end, prop, value, object)
!      Lisp_Object start, end, prop, value, object;
  {
    Fadd_text_properties (start, end,
! 			Fcons (prop, Fcons (value, Qnil)),
  			object);
    return Qnil;
--- 939,951 ----
         Sput_text_property, 4, 5, 0,
    "Set one property of the text from START to END.\n\
! The third and fourth arguments PROPERTY and VALUE\n\
  specify the property to add.\n\
  The optional fifth argument, OBJECT,\n\
  is the string or buffer containing the text.")
!   (start, end, property, value, object)
!      Lisp_Object start, end, property, value, object;
  {
    Fadd_text_properties (start, end,
! 			Fcons (property, Fcons (value, Qnil)),
  			object);
    return Qnil;
*************** DEFUN ("set-text-properties", Fset_text_
*** 946,954 ****
         Sset_text_properties, 3, 4, 0,
    "Completely replace properties of text from START to END.\n\
! The third argument PROPS is the new property list.\n\
  The optional fourth argument, OBJECT,\n\
  is the string or buffer containing the text.")
!   (start, end, props, object)
!      Lisp_Object start, end, props, object;
  {
    register INTERVAL i, unchanged;
--- 955,963 ----
         Sset_text_properties, 3, 4, 0,
    "Completely replace properties of text from START to END.\n\
! The third argument PROPERTIES is the new property list.\n\
  The optional fourth argument, OBJECT,\n\
  is the string or buffer containing the text.")
!   (start, end, properties, object)
!      Lisp_Object start, end, properties, object;
  {
    register INTERVAL i, unchanged;
*************** is the string or buffer containing the t
*** 960,964 ****
    oend = end;
  
!   props = validate_plist (props);
  
    if (NILP (object))
--- 969,973 ----
    oend = end;
  
!   properties = validate_plist (properties);
  
    if (NILP (object))
*************** is the string or buffer containing the t
*** 967,971 ****
    /* If we want no properties for a whole string,
       get rid of its intervals.  */
!   if (NILP (props) && STRINGP (object)
        && XFASTINT (start) == 0
        && XFASTINT (end) == XSTRING (object)->size)
--- 976,980 ----
    /* If we want no properties for a whole string,
       get rid of its intervals.  */
!   if (NILP (properties) && STRINGP (object)
        && XFASTINT (start) == 0
        && XFASTINT (end) == XSTRING (object)->size)
*************** is the string or buffer containing the t
*** 979,984 ****
    if (NULL_INTERVAL_P (i))
      {
!       /* If buffer has no props, and we want none, return now.  */
!       if (NILP (props))
  	return Qnil;
  
--- 988,993 ----
    if (NULL_INTERVAL_P (i))
      {
!       /* If buffer has no properties, and we want none, return now.  */
!       if (NILP (properties))
  	return Qnil;
  
*************** is the string or buffer containing the t
*** 1006,1014 ****
  	  copy_properties (unchanged, i);
  	  i = split_interval_left (i, len);
! 	  set_properties (props, i, object);
  	  return Qt;
  	}
  
!       set_properties (props, i, object);
  
        if (LENGTH (i) == len)
--- 1015,1023 ----
  	  copy_properties (unchanged, i);
  	  i = split_interval_left (i, len);
! 	  set_properties (properties, i, object);
  	  return Qt;
  	}
  
!       set_properties (properties, i, object);
  
        if (LENGTH (i) == len)
*************** is the string or buffer containing the t
*** 1034,1038 ****
  	     merge the intervals, so as to make the undo records
  	     and cause redisplay to happen.  */
! 	  set_properties (props, i, object);
  	  if (!NULL_INTERVAL_P (prev_changed))
  	    merge_interval_left (i);
--- 1043,1047 ----
  	     merge the intervals, so as to make the undo records
  	     and cause redisplay to happen.  */
! 	  set_properties (properties, i, object);
  	  if (!NULL_INTERVAL_P (prev_changed))
  	    merge_interval_left (i);
*************** is the string or buffer containing the t
*** 1045,1049 ****
  	 merge the intervals, so as to make the undo records
  	 and cause redisplay to happen.  */
!       set_properties (props, i, object);
        if (NULL_INTERVAL_P (prev_changed))
  	prev_changed = i;
--- 1054,1058 ----
  	 merge the intervals, so as to make the undo records
  	 and cause redisplay to happen.  */
!       set_properties (properties, i, object);
        if (NULL_INTERVAL_P (prev_changed))
  	prev_changed = i;
*************** DEFUN ("remove-text-properties", Fremove
*** 1060,1071 ****
         Sremove_text_properties, 3, 4, 0,
    "Remove some properties from text from START to END.\n\
! The third argument PROPS is a property list\n\
  whose property names specify the properties to remove.\n\
! \(The values stored in PROPS are ignored.)\n\
  The optional fourth argument, OBJECT,\n\
  is the string or buffer containing the text.\n\
  Return t if any property was actually removed, nil otherwise.")
!   (start, end, props, object)
!      Lisp_Object start, end, props, object;
  {
    register INTERVAL i, unchanged;
--- 1069,1080 ----
         Sremove_text_properties, 3, 4, 0,
    "Remove some properties from text from START to END.\n\
! The third argument PROPERTIES is a property list\n\
  whose property names specify the properties to remove.\n\
! \(The values stored in PROPERTIES are ignored.)\n\
  The optional fourth argument, OBJECT,\n\
  is the string or buffer containing the text.\n\
  Return t if any property was actually removed, nil otherwise.")
!   (start, end, properties, object)
!      Lisp_Object start, end, properties, object;
  {
    register INTERVAL i, unchanged;
*************** Return t if any property was actually re
*** 1086,1090 ****
        /* No properties on this first interval -- return if
           it covers the entire region. */
!       if (! interval_has_some_properties (props, i))
  	{
  	  int got = (LENGTH (i) - (s - i->position));
--- 1095,1099 ----
        /* No properties on this first interval -- return if
           it covers the entire region. */
!       if (! interval_has_some_properties (properties, i))
  	{
  	  int got = (LENGTH (i) - (s - i->position));
*************** Return t if any property was actually re
*** 1112,1121 ****
        if (LENGTH (i) >= len)
  	{
! 	  if (! interval_has_some_properties (props, i))
  	    return modified ? Qt : Qnil;
  
  	  if (LENGTH (i) == len)
  	    {
! 	      remove_properties (props, i, object);
  	      return Qt;
  	    }
--- 1121,1130 ----
        if (LENGTH (i) >= len)
  	{
! 	  if (! interval_has_some_properties (properties, i))
  	    return modified ? Qt : Qnil;
  
  	  if (LENGTH (i) == len)
  	    {
! 	      remove_properties (properties, i, object);
  	      return Qt;
  	    }
*************** Return t if any property was actually re
*** 1125,1134 ****
  	  i = split_interval_left (i, len);
  	  copy_properties (unchanged, i);
! 	  remove_properties (props, i, object);
  	  return Qt;
  	}
  
        len -= LENGTH (i);
!       modified += remove_properties (props, i, object);
        i = next_interval (i);
      }
--- 1134,1143 ----
  	  i = split_interval_left (i, len);
  	  copy_properties (unchanged, i);
! 	  remove_properties (properties, i, object);
  	  return Qt;
  	}
  
        len -= LENGTH (i);
!       modified += remove_properties (properties, i, object);
        i = next_interval (i);
      }
*************** Return t if any property was actually re
*** 1137,1147 ****
  DEFUN ("text-property-any", Ftext_property_any,
         Stext_property_any, 4, 5, 0,
!   "Check text from START to END to see if PROP is ever `eq' to VALUE.\n\
! If so, return the position of the first character whose PROP is `eq'\n\
! to VALUE.  Otherwise return nil.\n\
  The optional fifth argument, OBJECT, is the string or buffer\n\
  containing the text.")
!   (start, end, prop, value, object)
!        Lisp_Object start, end, prop, value, object;
  {
    register INTERVAL i;
--- 1146,1156 ----
  DEFUN ("text-property-any", Ftext_property_any,
         Stext_property_any, 4, 5, 0,
!   "Check text from START to END for property PROPERTY equalling VALUE.\n\
! If so, return the position of the first character whose property PROPERTY\n\
! is `eq' to VALUE.  Otherwise return nil.\n\
  The optional fifth argument, OBJECT, is the string or buffer\n\
  containing the text.")
!   (start, end, property, value, object)
!        Lisp_Object start, end, property, value, object;
  {
    register INTERVAL i;
*************** containing the text.")
*** 1159,1163 ****
        if (i->position >= e)
  	break;
!       if (EQ (textget (i->plist, prop), value))
  	{
  	  pos = i->position;
--- 1168,1172 ----
        if (i->position >= e)
  	break;
!       if (EQ (textget (i->plist, property), value))
  	{
  	  pos = i->position;
*************** containing the text.")
*** 1173,1183 ****
  DEFUN ("text-property-not-all", Ftext_property_not_all,
         Stext_property_not_all, 4, 5, 0,
!   "Check text from START to END to see if PROP is ever not `eq' to VALUE.\n\
! If so, return the position of the first character whose PROP is not\n\
! `eq' to VALUE.  Otherwise, return nil.\n\
  The optional fifth argument, OBJECT, is the string or buffer\n\
  containing the text.")
!   (start, end, prop, value, object)
!        Lisp_Object start, end, prop, value, object;
  {
    register INTERVAL i;
--- 1182,1192 ----
  DEFUN ("text-property-not-all", Ftext_property_not_all,
         Stext_property_not_all, 4, 5, 0,
!   "Check text from START to END for property PROPERTY not equalling VALUE.\n\
! If so, return the position of the first character whose property PROPERTY\n\
! is not `eq' to VALUE.  Otherwise, return nil.\n\
  The optional fifth argument, OBJECT, is the string or buffer\n\
  containing the text.")
!   (start, end, property, value, object)
!        Lisp_Object start, end, property, value, object;
  {
    register INTERVAL i;
*************** containing the text.")
*** 1196,1200 ****
        if (i->position >= e)
  	break;
!       if (! EQ (textget (i->plist, prop), value))
  	{
  	  if (i->position > s)
--- 1205,1209 ----
        if (i->position >= e)
  	break;
!       if (! EQ (textget (i->plist, property), value))
  	{
  	  if (i->position > s)
*************** verify_interval_modification (buf, start
*** 1493,1497 ****
  	{
  	  /* If I and PREV differ we need to check for the read-only
! 	     property together with its stickyness. If either I or
  	     PREV are 0, this check is all we need.
  	     We have to take special care, since read-only may be
--- 1502,1506 ----
  	{
  	  /* If I and PREV differ we need to check for the read-only
! 	     property together with its stickiness. If either I or
  	     PREV are 0, this check is all we need.
  	     We have to take special care, since read-only may be
diff -2rcpP --exclude=*.elc emacs-19.30/src/tparam.c emacs-19.31/src/tparam.c
*** emacs-19.30/src/tparam.c	Sat Sep  2 19:51:39 1995
--- emacs-19.31/src/tparam.c	Tue Apr  9 18:14:20 1996
*************** GNU General Public License for more deta
*** 14,18 ****
  You should have received a copy of the GNU General Public License
  along with this program; see the file COPYING.  If not, write to
! the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  
  /* Emacs config.h may rename various library functions such as malloc.  */
--- 14,19 ----
  You should have received a copy of the GNU General Public License
  along with this program; see the file COPYING.  If not, write to
! the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* Emacs config.h may rename various library functions such as malloc.  */
diff -2rcpP --exclude=*.elc emacs-19.30/src/uaf.h emacs-19.31/src/uaf.h
*** emacs-19.30/src/uaf.h	Thu Jun 15 16:39:07 1995
--- emacs-19.31/src/uaf.h	Mon Jan 15 04:06:29 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  /*
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /*
diff -2rcpP --exclude=*.elc emacs-19.30/src/undo.c emacs-19.31/src/undo.c
*** emacs-19.30/src/undo.c	Mon Jul 24 22:17:16 1995
--- emacs-19.31/src/undo.c	Tue Apr  9 18:07:46 1996
***************
*** 4,21 ****
  This file is part of GNU Emacs.
  
  GNU Emacs is distributed in the hope that it will be useful,
! but WITHOUT ANY WARRANTY.  No author or distributor
! accepts responsibility to anyone for the consequences of using it
! or for whether it serves any particular purpose or works at all,
! unless he says so in writing.  Refer to the GNU Emacs General Public
! License for full details.
! 
! Everyone is granted permission to copy, modify and redistribute
! GNU Emacs, but only under the conditions described in the
! GNU Emacs General Public License.   A copy of this license is
! supposed to have been given to you along with GNU Emacs so you
! can know your rights and responsibilities.  It should be in a
! file named COPYING.  Among other things, the copyright notice
! and this notice must be preserved on all copies.  */
  
  
--- 4,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** record_delete (beg, length)
*** 129,132 ****
--- 129,157 ----
  }
  
+ /* Record the fact that MARKER is about to be adjusted by ADJUSTMENT.
+    This is done only when a marker points within text being deleted,
+    because that's the only case where an automatic marker adjustment
+    won't be inverted automatically by undoing the buffer modification.  */
+ 
+ record_marker_adjustment (marker, adjustment)
+      Lisp_Object marker;
+      int adjustment;
+ {
+   if (EQ (current_buffer->undo_list, Qt))
+     return;
+ 
+   /* Allocate a cons cell to be the undo boundary after this command.  */
+   if (NILP (pending_boundary))
+     pending_boundary = Fcons (Qnil, Qnil);
+ 
+   if (current_buffer != XBUFFER (last_undo_buffer))
+     Fundo_boundary ();
+   XSETBUFFER (last_undo_buffer, current_buffer);
+ 
+   current_buffer->undo_list
+     = Fcons (Fcons (marker, make_number (adjustment)),
+ 	     current_buffer->undo_list);
+ }
+ 
  /* Record that a replacement is about to take place,
     for LENGTH characters at location BEG.
*************** Return what remains of the list.")
*** 463,466 ****
--- 488,500 ----
  		      SET_PT (pos);
  		    }
+ 		}
+ 	      else if (MARKERP (car) && INTEGERP (cdr))
+ 		{
+ 		  /* (MARKER . INTEGER) means a marker MARKER
+ 		     was adjusted by INTEGER.  */
+ 		  if (XMARKER (car)->buffer)
+ 		    Fset_marker (car,
+ 				 make_number (marker_position (car) - XINT (cdr)),
+ 				 Fmarker_buffer (car));
  		}
  	    }
diff -2rcpP --exclude=*.elc emacs-19.30/src/unexaix.c emacs-19.31/src/unexaix.c
*** emacs-19.30/src/unexaix.c	Thu Jun 15 16:38:56 1995
--- emacs-19.31/src/unexaix.c	Thu Mar  7 23:58:34 1996
***************
*** 3,19 ****
  /* Copyright (C) 1985, 1986, 1987, 1988 Free Software Foundation, Inc.
  
!     This program 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.
! 
!     This program 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 this program; if not, write to the Free Software
!     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  
  In other words, you are welcome to use, share and improve this program.
--- 3,22 ----
  /* Copyright (C) 1985, 1986, 1987, 1988 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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.
  
  In other words, you are welcome to use, share and improve this program.
*************** what you give them.   Help stamp out sof
*** 31,34 ****
--- 34,45 ----
   * Modified heavily since then.
   *
+  * Updated for AIX 4.1.3 by Bill_Mann @ PraxisInt.com, Feb 1996
+  *   As of AIX 4.1, text, data, and bss are pre-relocated by the binder in
+  *   such a way that the file can be mapped with code in one segment and
+  *   data/bss in another segment, without reading or copying the file, by
+  *   the AIX exec loader.  Padding sections are omitted, nevertheless
+  *   small amounts of 'padding' still occurs between sections in the file.
+  *   As modified, this code handles both 3.2 and 4.1 conventions.
+  *
   * Synopsis:
   *	unexec (new_name, a_name, data_start, bss_start, entry_address)
*************** extern int _end;
*** 201,219 ****
  #endif /* Not STRIDE */
  #endif /* not USG */
- static long block_copy_start;		/* Old executable start point */
  static struct filehdr f_hdr;		/* File header */
  static struct aouthdr f_ohdr;		/* Optional file header (a.out) */
  long bias;			/* Bias to add for growth */
  long lnnoptr;			/* Pointer to line-number info within file */
- #define SYMS_START block_copy_start
  
  static long text_scnptr;
  static long data_scnptr;
  #ifdef XCOFF
  static long load_scnptr;
  static long orig_load_scnptr;
  static long orig_data_scnptr;
  #endif
! static long data_st;
  
  #ifndef MAX_SECTIONS
--- 212,229 ----
  #endif /* Not STRIDE */
  #endif /* not USG */
  static struct filehdr f_hdr;		/* File header */
  static struct aouthdr f_ohdr;		/* Optional file header (a.out) */
  long bias;			/* Bias to add for growth */
  long lnnoptr;			/* Pointer to line-number info within file */
  
  static long text_scnptr;
  static long data_scnptr;
  #ifdef XCOFF
+ #define ALIGN(val, pwr) (((val) + ((1L<<(pwr))-1)) & ~((1L<<(pwr))-1))
  static long load_scnptr;
  static long orig_load_scnptr;
  static long orig_data_scnptr;
  #endif
! static ulong data_st;                   /* start of data area written out */
  
  #ifndef MAX_SECTIONS
*************** make_hdr (new, a_out, data_start, bss_st
*** 379,383 ****
  #ifdef COFF
    /* Salvage as much info from the existing file as possible */
-   block_copy_start = 0;
    f_thdr = NULL; f_dhdr = NULL; f_bhdr = NULL;
    f_lhdr = NULL; f_tchdr = NULL; f_dbhdr = NULL; f_xhdr = NULL;
--- 389,392 ----
*************** make_hdr (new, a_out, data_start, bss_st
*** 388,392 ****
  	  PERROR (a_name);
  	}
-       block_copy_start += sizeof (f_hdr);
        if (f_hdr.f_opthdr > 0)
  	{
--- 397,400 ----
*************** make_hdr (new, a_out, data_start, bss_st
*** 395,399 ****
  	      PERROR (a_name);
  	    }
- 	  block_copy_start += sizeof (f_ohdr);
  	}
        if (f_hdr.f_nscns > MAX_SECTIONS)
--- 403,406 ----
*************** make_hdr (new, a_out, data_start, bss_st
*** 408,416 ****
  	    PERROR (a_name);
  	  }
- 	if (s->s_scnptr > 0L)
- 	  {
-             if (block_copy_start < s->s_scnptr + s->s_size)
- 	      block_copy_start = s->s_scnptr + s->s_size;
- 	  }
  
  #define CHECK_SCNHDR(ptr, name, flags) \
--- 415,418 ----
*************** make_hdr (new, a_out, data_start, bss_st
*** 457,461 ****
    /* Now we alter the contents of all the f_*hdr variables
       to correspond to what we want to dump.  */
!   f_hdr.f_flags |= (F_RELFLG | F_EXEC);		/* Why? */
  #ifdef EXEC_MAGIC
    f_ohdr.magic = EXEC_MAGIC;
--- 459,467 ----
    /* Now we alter the contents of all the f_*hdr variables
       to correspond to what we want to dump.  */
! 
!   /* Indicate that the reloc information is no longer valid for ld (bind);
!      we only update it enough to fake out the exec-time loader.  */
!   f_hdr.f_flags |= (F_RELFLG | F_EXEC);
! 
  #ifdef EXEC_MAGIC
    f_ohdr.magic = EXEC_MAGIC;
*************** make_hdr (new, a_out, data_start, bss_st
*** 465,524 ****
    f_ohdr.text_start = (long) start_of_text ();
  #endif
!   f_ohdr.dsize = bss_start - ((unsigned) &_data);
    f_ohdr.bsize = bss_end - bss_start;
  
    f_dhdr->s_size = f_ohdr.dsize;
    f_bhdr->s_size = f_ohdr.bsize;
!   f_bhdr->s_paddr = f_ohdr.dsize;
!   f_bhdr->s_vaddr = f_ohdr.dsize;
  
    /* fix scnptr's */
    {
!     long ptr;
  
!     for (scns = 0; scns < f_hdr.f_nscns; scns++) {
!       struct scnhdr *s = &section[scns];
!       if (scns == 0)
! 	ptr = s->s_scnptr;
  
!       if (s->s_scnptr != 0)
! 	{
  	  s->s_scnptr = ptr;
! 	}
! 
!       if ((s->s_flags & 0xffff) == STYP_PAD)
! 	{
! 	  /*
! 	   * the text_start should probably be o_algntext but that doesn't
! 	   * seem to change
! 	   */
! 	  if (f_ohdr.text_start != 0) /* && scns != 0 */
! 	    {
! 	      s->s_size = 512 - (s->s_scnptr % 512);
! 	      if (s->s_size == 512)
! 		s->s_size = 0;
! 	    }
! 	}
! 
!       ptr = ptr + s->s_size;
!     }
  
!     bias = ptr - block_copy_start;
    }
  
    /* fix other pointers */
!   for (scns = 0; scns < f_hdr.f_nscns; scns++) {
!     struct scnhdr *s = &section[scns];
  
!     if (s->s_relptr != 0)
!       {
! 	s->s_relptr += bias;
!       }
!     if (s->s_lnnoptr != 0)
!       {
! 	if (lnnoptr == 0) lnnoptr = s->s_lnnoptr;
! 	s->s_lnnoptr += bias;
!       }
!   }
  
    if (f_hdr.f_symptr > 0L)
--- 471,536 ----
    f_ohdr.text_start = (long) start_of_text ();
  #endif
!   data_st = f_ohdr.data_start ? f_ohdr.data_start : (ulong) &_data;
!   f_ohdr.dsize = bss_start - data_st;
    f_ohdr.bsize = bss_end - bss_start;
  
    f_dhdr->s_size = f_ohdr.dsize;
    f_bhdr->s_size = f_ohdr.bsize;
!   f_bhdr->s_paddr = f_ohdr.data_start + f_ohdr.dsize;
!   f_bhdr->s_vaddr = f_ohdr.data_start + f_ohdr.dsize;
  
    /* fix scnptr's */
    {
!     ulong ptr = section[0].s_scnptr;
  
!     bias = -1;
!     for (scns = 0; scns < f_hdr.f_nscns; scns++)
!       {
! 	struct scnhdr *s = &section[scns];
  
! 	if (s->s_flags & STYP_PAD)        /* .pad sections omitted in AIX 4.1 */
! 	  {
! 	    /*
! 	     * the text_start should probably be o_algntext but that doesn't
! 	     * seem to change
! 	     */
! 	    if (f_ohdr.text_start != 0) /* && scns != 0 */
! 	      {
! 		s->s_size = 512 - (ptr % 512);
! 		if (s->s_size == 512)
! 		  s->s_size = 0;
! 	      }
! 	    s->s_scnptr = ptr;
! 	  }
! 	else if (s->s_flags & STYP_DATA)
  	  s->s_scnptr = ptr;
! 	else if (!(s->s_flags & (STYP_TEXT | STYP_BSS)))
! 	  {
! 	    if (bias == -1)                /* if first section after bss */
! 	      bias = ptr - s->s_scnptr;
  
! 	    s->s_scnptr += bias;
! 	    ptr = s->s_scnptr;
! 	  }
!   
! 	ptr = ptr + s->s_size;
!       }
    }
  
    /* fix other pointers */
!   for (scns = 0; scns < f_hdr.f_nscns; scns++)
!     {
!       struct scnhdr *s = &section[scns];
  
!       if (s->s_relptr != 0)
! 	{
! 	  s->s_relptr += bias;
! 	}
!       if (s->s_lnnoptr != 0)
! 	{
! 	  if (lnnoptr == 0) lnnoptr = s->s_lnnoptr;
! 	  s->s_lnnoptr += bias;
! 	}
!     }
  
    if (f_hdr.f_symptr > 0L)
*************** make_hdr (new, a_out, data_start, bss_st
*** 527,535 ****
      }
  
-   data_st = data_start;
    text_scnptr = f_thdr->s_scnptr;
    data_scnptr = f_dhdr->s_scnptr;
    load_scnptr = f_lhdr ? f_lhdr->s_scnptr : 0;
-   block_copy_start = orig_load_scnptr;
  
  #ifdef ADJUST_EXEC_HEADER
--- 539,545 ----
*************** copy_text_and_data (new)
*** 581,585 ****
  
    lseek (new, (long) data_scnptr, 0);
!   ptr = (char *) &_data;
    end = ptr + f_ohdr.dsize;
    write_segment (new, ptr, end);
--- 591,595 ----
  
    lseek (new, (long) data_scnptr, 0);
!   ptr = (char *) data_st;
    end = ptr + f_ohdr.dsize;
    write_segment (new, ptr, end);
*************** copy_text_and_data (new)
*** 588,591 ****
--- 598,602 ----
  }
  
+ #define UnexBlockSz (1<<12)			/* read/write block size */
  write_segment (new, ptr, end)
       int new;
*************** write_segment (new, ptr, end)
*** 595,606 ****
    char buf[80];
    extern int errno;
!   char zeros[128];
! 
!   bzero (zeros, sizeof zeros);
  
    for (i = 0; ptr < end;)
      {
!       /* distance to next multiple of 128.  */
!       nwrite = (((int) ptr + 128) & -128) - (int) ptr;
        /* But not beyond specified end.  */
        if (nwrite > end - ptr) nwrite = end - ptr;
--- 606,615 ----
    char buf[80];
    extern int errno;
!   char zeros[UnexBlockSz];
  
    for (i = 0; ptr < end;)
      {
!       /* distance to next block.  */
!       nwrite = (((int) ptr + UnexBlockSz) & -UnexBlockSz) - (int) ptr;
        /* But not beyond specified end.  */
        if (nwrite > end - ptr) nwrite = end - ptr;
*************** write_segment (new, ptr, end)
*** 612,616 ****
        if (ret == -1 && errno == EFAULT)
  	{
! 	write (new, zeros, nwrite);
  	}
        else if (nwrite != ret)
--- 621,626 ----
        if (ret == -1 && errno == EFAULT)
  	{
! 	  bzero (zeros, nwrite);
! 	  write (new, zeros, nwrite);
  	}
        else if (nwrite != ret)
*************** copy_sym (new, a_out, a_name, new_name)
*** 636,640 ****
       char *a_name, *new_name;
  {
!   char page[1024];
    int n;
  
--- 646,650 ----
       char *a_name, *new_name;
  {
!   char page[UnexBlockSz];
    int n;
  
*************** copy_sym (new, a_out, a_name, new_name)
*** 642,652 ****
      return 0;
  
!   if (SYMS_START == 0L)
      return 0;
  
!   if (lnnoptr && lnnoptr < SYMS_START)	/* if there is line number info */
!     lseek (a_out, lnnoptr, 0);		/* start copying from there */
    else
!     lseek (a_out, SYMS_START, 0);	/* Position a.out to symtab. */
  
    while ((n = read (a_out, page, sizeof page)) > 0)
--- 652,662 ----
      return 0;
  
!   if (orig_load_scnptr == 0L)
      return 0;
  
!   if (lnnoptr && lnnoptr < orig_load_scnptr) /* if there is line number info  */
!     lseek (a_out, lnnoptr, 0);  /* start copying from there */
    else
!     lseek (a_out, orig_load_scnptr, 0); /* Position a.out to symtab. */
  
    while ((n = read (a_out, page, sizeof page)) > 0)
*************** mark_x (name)
*** 701,704 ****
--- 711,716 ----
   *	be fixed.  As it is now, all such entries are wrong and sdb
   *	will complain.   Fred Fish, UniSoft Systems Inc.
+  *
+  *      I believe this is now fixed correctly.  Bill Mann
   */
  
*************** adjust_lnnoptrs (writedesc, readdesc, ne
*** 741,753 ****
      {
        read (new, &symentry, SYMESZ);
!       for (naux = 0; naux < symentry.n_numaux; naux++)
  	{
  	  read (new, &auxentry, AUXESZ);
  	  nsyms++;
! 	  if (ISFCN (symentry.n_type)) {
! 	    auxentry.x_sym.x_fcnary.x_fcn.x_lnnoptr += bias;
! 	    lseek (new, -AUXESZ, 1);
! 	    write (new, &auxentry, AUXESZ);
! 	  }
  	}
      }
--- 753,774 ----
      {
        read (new, &symentry, SYMESZ);
!       if (symentry.n_sclass == C_BINCL || symentry.n_sclass == C_EINCL)
! 	{
! 	  symentry.n_value += bias;
! 	  lseek (new, -SYMESZ, 1);
! 	  write (new, &symentry, SYMESZ);
! 	}
! 
!       for (naux = symentry.n_numaux; naux-- != 0; )
  	{
  	  read (new, &auxentry, AUXESZ);
  	  nsyms++;
! 	  if (naux != 0              /* skip csect auxentry (last entry) */
!               && (symentry.n_sclass == C_EXT || symentry.n_sclass == C_HIDEXT))
!             {
!               auxentry.x_sym.x_fcnary.x_fcn.x_lnnoptr += bias;
!               lseek (new, -AUXESZ, 1);
!               write (new, &auxentry, AUXESZ);
!             }
  	}
      }
*************** unrelocate_symbols (new, a_out, a_name, 
*** 772,779 ****
    LDHDR ldhdr;
    LDREL ldrel_buf [20];
!   ulong t_start = (ulong) &_text;
!   ulong d_start = (ulong) &_data;
    int * p;
-   int dirty;
  
    if (load_scnptr == 0)
--- 793,799 ----
    LDHDR ldhdr;
    LDREL ldrel_buf [20];
!   ulong t_reloc = (ulong) &_text - f_ohdr.text_start;
!   ulong d_reloc = (ulong) &_data - ALIGN(f_ohdr.data_start, 2);
    int * p;
  
    if (load_scnptr == 0)
*************** unrelocate_symbols (new, a_out, a_name, 
*** 807,824 ****
  	ldrel = ldrel_buf;
        }
-       dirty = 0;
- 
-       /* this code may not be necessary */
-       /* I originally had == in the "assignment" and it still unrelocated */
  
        /* move the BSS loader symbols to the DATA segment */
-       if (ldrel->l_rsecnm == f_ohdr.o_snbss)
- 	ldrel->l_rsecnm = f_ohdr.o_sndata, dirty++;
- 
        if (ldrel->l_symndx == SYMNDX_BSS)
- 	ldrel->l_symndx = SYMNDX_DATA, dirty++;
- 
-       if (dirty)
  	{
  	  lseek (new,
  		 load_scnptr + LDHDRSZ + LDSYMSZ*ldhdr.l_nsyms + LDRELSZ*i,
--- 827,836 ----
  	ldrel = ldrel_buf;
        }
  
        /* move the BSS loader symbols to the DATA segment */
        if (ldrel->l_symndx == SYMNDX_BSS)
  	{
+ 	  ldrel->l_symndx = SYMNDX_DATA;
+ 
  	  lseek (new,
  		 load_scnptr + LDHDRSZ + LDSYMSZ*ldhdr.l_nsyms + LDRELSZ*i,
*************** unrelocate_symbols (new, a_out, a_name, 
*** 835,843 ****
  	  int orig_int;
  
! #ifdef AIX4_1
! 	  lseek (a_out, orig_data_scnptr + (ldrel->l_vaddr - d_start), 0);
! #else
! 	  lseek (a_out, orig_data_scnptr + ldrel->l_vaddr, 0);
! #endif
  
  	  if (read (a_out, (void *) &orig_int, sizeof (orig_int)) != sizeof (orig_int))
--- 847,852 ----
  	  int orig_int;
  
! 	  lseek (a_out,
!                  orig_data_scnptr + (ldrel->l_vaddr - f_ohdr.data_start), 0);
  
  	  if (read (a_out, (void *) &orig_int, sizeof (orig_int)) != sizeof (orig_int))
*************** unrelocate_symbols (new, a_out, a_name, 
*** 846,881 ****
  	    }
  
  	  switch (ldrel->l_symndx) {
  	  case SYMNDX_TEXT:
! #ifdef AIX4_1
! 	    p = (int *) (ldrel->l_vaddr);
! 	    orig_int = * p;
! #else
! 	    p = (int *) (d_start + ldrel->l_vaddr);
! 	    orig_int = * p - (t_start - f_ohdr.text_start);
! #endif
  	    break;
  
  	  case SYMNDX_DATA:
  	  case SYMNDX_BSS:
! #ifdef AIX4_1
! 	    p = (int *) (ldrel->l_vaddr);
! 	    orig_int = * p;
! #else
! 	    p = (int *) (d_start + ldrel->l_vaddr);
! 	    orig_int = * p - (d_start - f_ohdr.data_start);
! #endif
  	    break;
  	  }
  
! #ifdef AIX4_1
! 	  lseek (new, data_scnptr + (ldrel->l_vaddr - d_start), 0);
! #else
! 	  lseek (new, data_scnptr + ldrel->l_vaddr, 0);
! #endif
! 	  if (write (new, (void *) &orig_int, sizeof (orig_int)) != sizeof (orig_int))
! 	    {
! 	      PERROR (new_name);
! 	    }
  	}
      }
--- 855,881 ----
  	    }
  
+           p = (int *) (ldrel->l_vaddr + d_reloc);
+ 
  	  switch (ldrel->l_symndx) {
  	  case SYMNDX_TEXT:
! 	    orig_int = * p - t_reloc;
  	    break;
  
  	  case SYMNDX_DATA:
  	  case SYMNDX_BSS:
! 	    orig_int = * p - d_reloc;
  	    break;
  	  }
  
!           if (orig_int != * p)
!             {
!               lseek (new,
!                      data_scnptr + (ldrel->l_vaddr - f_ohdr.data_start), 0);
!               if (write (new, (void *) &orig_int, sizeof (orig_int))
!                   != sizeof (orig_int))
!                 {
!                   PERROR (new_name);
!                 }
!             }
  	}
      }
diff -2rcpP --exclude=*.elc emacs-19.30/src/unexalpha.c emacs-19.31/src/unexalpha.c
*** emacs-19.30/src/unexalpha.c	Sat Nov 11 15:27:38 1995
--- emacs-19.31/src/unexalpha.c	Mon Jan 15 04:06:29 1996
*************** GNU General Public License for more deta
*** 17,21 ****
  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.  */
  
  
--- 17,22 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/unexapollo.c emacs-19.31/src/unexapollo.c
*** emacs-19.30/src/unexapollo.c	Wed May  3 16:29:28 1995
--- emacs-19.31/src/unexapollo.c	Mon Jan 15 03:26:13 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  /* Written by Leonard N. Zubkoff.  */
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* Written by Leonard N. Zubkoff.  */
diff -2rcpP --exclude=*.elc emacs-19.30/src/unexconvex.c emacs-19.31/src/unexconvex.c
*** emacs-19.30/src/unexconvex.c	Thu Jun 15 16:38:57 1995
--- emacs-19.31/src/unexconvex.c	Mon Jan 15 04:06:29 1996
*************** GNU General Public License for more deta
*** 24,28 ****
  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.  */
  
  
--- 24,29 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/unexec.c emacs-19.31/src/unexec.c
*** emacs-19.30/src/unexec.c	Tue Oct  3 23:58:17 1995
--- emacs-19.31/src/unexec.c	Wed Apr 10 00:15:07 1996
*************** GNU General Public License for more deta
*** 15,19 ****
  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.  */
  
  
--- 15,20 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** int need_coff_header = 1;
*** 176,179 ****
--- 177,183 ----
  #else
  #ifdef MSDOS
+ #if __DJGPP__ > 1
+ #include <fcntl.h>  /* for O_RDONLY, O_RDWR */
+ #endif
  #include <coff.h>
  #define filehdr external_filehdr
*************** copy_text_and_data (new, a_out)
*** 876,879 ****
--- 880,891 ----
  #else /* COFF, but not USG_SHARED_LIBRARIES */
  
+ #ifdef MSDOS
+ #if __DJGPP__ >= 2
+   /* Dump the original table of exception handlers, not the one
+      where our exception hooks are registered.  */
+   __djgpp_exception_toggle ();
+ #endif
+ #endif
+ 
    lseek (new, (long) text_scnptr, 0);
    ptr = (char *) f_ohdr.text_start;
*************** copy_text_and_data (new, a_out)
*** 890,893 ****
--- 902,912 ----
    write_segment (new, ptr, end);
  
+ #ifdef MSDOS
+ #if __DJGPP__ >= 2
+   /* Restore our exception hooks.  */
+   __djgpp_exception_toggle ();
+ #endif
+ #endif
+ 
  #endif /* USG_SHARED_LIBRARIES */
  
*************** copy_text_and_data (new, a_out)
*** 916,921 ****
     * execution.  This data is in text space, so it cannot be modified here
     * before saving the executable, so the data is written manually.  In
!    * addition, the table does not have a label, and the nearest accessable
!    * label (mcount) is not prefixed with a '_', thus making it inaccessable
     * from within C programs.  To overcome this, emacs's executable is passed
     * through the command 'nm %s | fgrep mcount' into a pipe, and the
--- 935,940 ----
     * execution.  This data is in text space, so it cannot be modified here
     * before saving the executable, so the data is written manually.  In
!    * addition, the table does not have a label, and the nearest accessible
!    * label (mcount) is not prefixed with a '_', thus making it inaccessible
     * from within C programs.  To overcome this, emacs's executable is passed
     * through the command 'nm %s | fgrep mcount' into a pipe, and the
diff -2rcpP --exclude=*.elc emacs-19.30/src/unexelf.c emacs-19.31/src/unexelf.c
*** emacs-19.30/src/unexelf.c	Mon May 15 21:44:22 1995
--- emacs-19.31/src/unexelf.c	Thu Apr 25 14:00:17 1996
***************
*** 2,18 ****
     Free Software Foundation, Inc.
  
!     This program 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.
! 
!     This program 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 this program; if not, write to the Free Software
!     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  
  In other words, you are welcome to use, share and improve this program.
--- 2,21 ----
     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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.
  
  In other words, you are welcome to use, share and improve this program.
*************** temacs:
*** 99,160 ****
  
  [1]     1       2       0x80480d4    0xd4         0x13          .interp
!         0       0       0x1          0            
  
  [2]     5       2       0x80480e8    0xe8         0x388         .hash
!         3       0       0x4          0x4          
  
  [3]     11      2       0x8048470    0x470        0x7f0         .dynsym
!         4       1       0x4          0x10         
  
  [4]     3       2       0x8048c60    0xc60        0x3ad         .dynstr
!         0       0       0x1          0            
  
  [5]     9       2       0x8049010    0x1010       0x338         .rel.plt
!         3       7       0x4          0x8          
  
  [6]     1       6       0x8049348    0x1348       0x3           .init
!         0       0       0x4          0            
  
  [7]     1       6       0x804934c    0x134c       0x680         .plt
!         0       0       0x4          0x4          
  
  [8]     1       6       0x80499cc    0x19cc       0x3c56f       .text
!         0       0       0x4          0            
  
  [9]     1       6       0x8085f3c    0x3df3c      0x3           .fini
!         0       0       0x4          0            
  
  [10]    1       2       0x8085f40    0x3df40      0x69c         .rodata
!         0       0       0x4          0            
  
  [11]    1       2       0x80865dc    0x3e5dc      0xd51         .rodata1
!         0       0       0x4          0            
  
  [12]    1       3       0x8088330    0x3f330      0x20afc       .data
!         0       0       0x4          0            
  
  [13]    1       3       0x80a8e2c    0x5fe2c      0x89d         .data1
!         0       0       0x4          0            
  
  [14]    1       3       0x80a96cc    0x606cc      0x1a8         .got
!         0       0       0x4          0x4          
  
  [15]    6       3       0x80a9874    0x60874      0x80          .dynamic
!         4       0       0x4          0x8          
  
  [16]    8       3       0x80a98f4    0x608f4      0x449c        .bss
!         0       0       0x4          0            
  
  [17]    2       0       0            0x608f4      0x9b90        .symtab
!         18      371     0x4          0x10         
  
  [18]    3       0       0            0x6a484      0x8526        .strtab
!         0       0       0x1          0            
  
  [19]    3       0       0            0x729aa      0x93          .shstrtab
!         0       0       0x1          0            
  
  [20]    1       0       0            0x72a3d      0x68b7        .comment
!         0       0       0x1          0            
  
  raid:/nfs/raid/src/dist-18.56/src> dump -h xemacs
--- 102,163 ----
  
  [1]     1       2       0x80480d4    0xd4         0x13          .interp
!         0       0       0x1          0
  
  [2]     5       2       0x80480e8    0xe8         0x388         .hash
!         3       0       0x4          0x4
  
  [3]     11      2       0x8048470    0x470        0x7f0         .dynsym
!         4       1       0x4          0x10
  
  [4]     3       2       0x8048c60    0xc60        0x3ad         .dynstr
!         0       0       0x1          0
  
  [5]     9       2       0x8049010    0x1010       0x338         .rel.plt
!         3       7       0x4          0x8
  
  [6]     1       6       0x8049348    0x1348       0x3           .init
!         0       0       0x4          0
  
  [7]     1       6       0x804934c    0x134c       0x680         .plt
!         0       0       0x4          0x4
  
  [8]     1       6       0x80499cc    0x19cc       0x3c56f       .text
!         0       0       0x4          0
  
  [9]     1       6       0x8085f3c    0x3df3c      0x3           .fini
!         0       0       0x4          0
  
  [10]    1       2       0x8085f40    0x3df40      0x69c         .rodata
!         0       0       0x4          0
  
  [11]    1       2       0x80865dc    0x3e5dc      0xd51         .rodata1
!         0       0       0x4          0
  
  [12]    1       3       0x8088330    0x3f330      0x20afc       .data
!         0       0       0x4          0
  
  [13]    1       3       0x80a8e2c    0x5fe2c      0x89d         .data1
!         0       0       0x4          0
  
  [14]    1       3       0x80a96cc    0x606cc      0x1a8         .got
!         0       0       0x4          0x4
  
  [15]    6       3       0x80a9874    0x60874      0x80          .dynamic
!         4       0       0x4          0x8
  
  [16]    8       3       0x80a98f4    0x608f4      0x449c        .bss
!         0       0       0x4          0
  
  [17]    2       0       0            0x608f4      0x9b90        .symtab
!         18      371     0x4          0x10
  
  [18]    3       0       0            0x6a484      0x8526        .strtab
!         0       0       0x1          0
  
  [19]    3       0       0            0x729aa      0x93          .shstrtab
!         0       0       0x1          0
  
  [20]    1       0       0            0x72a3d      0x68b7        .comment
!         0       0       0x1          0
  
  raid:/nfs/raid/src/dist-18.56/src> dump -h xemacs
*************** xemacs:
*** 167,231 ****
  
  [1]     1       2       0x80480d4    0xd4         0x13          .interp
!         0       0       0x1          0            
  
  [2]     5       2       0x80480e8    0xe8         0x388         .hash
!         3       0       0x4          0x4          
  
  [3]     11      2       0x8048470    0x470        0x7f0         .dynsym
!         4       1       0x4          0x10         
  
  [4]     3       2       0x8048c60    0xc60        0x3ad         .dynstr
!         0       0       0x1          0            
  
  [5]     9       2       0x8049010    0x1010       0x338         .rel.plt
!         3       7       0x4          0x8          
  
  [6]     1       6       0x8049348    0x1348       0x3           .init
!         0       0       0x4          0            
  
  [7]     1       6       0x804934c    0x134c       0x680         .plt
!         0       0       0x4          0x4          
  
  [8]     1       6       0x80499cc    0x19cc       0x3c56f       .text
!         0       0       0x4          0            
  
  [9]     1       6       0x8085f3c    0x3df3c      0x3           .fini
!         0       0       0x4          0            
  
  [10]    1       2       0x8085f40    0x3df40      0x69c         .rodata
!         0       0       0x4          0            
  
  [11]    1       2       0x80865dc    0x3e5dc      0xd51         .rodata1
!         0       0       0x4          0            
  
  [12]    1       3       0x8088330    0x3f330      0x20afc       .data
!         0       0       0x4          0            
  
  [13]    1       3       0x80a8e2c    0x5fe2c      0x89d         .data1
!         0       0       0x4          0            
  
  [14]    1       3       0x80a96cc    0x606cc      0x1a8         .got
!         0       0       0x4          0x4          
  
  [15]    6       3       0x80a9874    0x60874      0x80          .dynamic
!         4       0       0x4          0x8          
  
  [16]    8       3       0x80c6800    0x7d800      0             .bss
!         0       0       0x4          0            
  
  [17]    2       0       0            0x7d800      0x9b90        .symtab
!         18      371     0x4          0x10         
  
  [18]    3       0       0            0x87390      0x8526        .strtab
!         0       0       0x1          0            
  
  [19]    3       0       0            0x8f8b6      0x93          .shstrtab
!         0       0       0x1          0            
  
  [20]    1       0       0            0x8f949      0x68b7        .comment
!         0       0       0x1          0            
  
  [21]    1       3       0x80a98f4    0x608f4      0x1cf0c       .data
!         0       0       0x4          0            
  
   * This is an example of how the file header is changed.  "Shoff" is
--- 170,234 ----
  
  [1]     1       2       0x80480d4    0xd4         0x13          .interp
!         0       0       0x1          0
  
  [2]     5       2       0x80480e8    0xe8         0x388         .hash
!         3       0       0x4          0x4
  
  [3]     11      2       0x8048470    0x470        0x7f0         .dynsym
!         4       1       0x4          0x10
  
  [4]     3       2       0x8048c60    0xc60        0x3ad         .dynstr
!         0       0       0x1          0
  
  [5]     9       2       0x8049010    0x1010       0x338         .rel.plt
!         3       7       0x4          0x8
  
  [6]     1       6       0x8049348    0x1348       0x3           .init
!         0       0       0x4          0
  
  [7]     1       6       0x804934c    0x134c       0x680         .plt
!         0       0       0x4          0x4
  
  [8]     1       6       0x80499cc    0x19cc       0x3c56f       .text
!         0       0       0x4          0
  
  [9]     1       6       0x8085f3c    0x3df3c      0x3           .fini
!         0       0       0x4          0
  
  [10]    1       2       0x8085f40    0x3df40      0x69c         .rodata
!         0       0       0x4          0
  
  [11]    1       2       0x80865dc    0x3e5dc      0xd51         .rodata1
!         0       0       0x4          0
  
  [12]    1       3       0x8088330    0x3f330      0x20afc       .data
!         0       0       0x4          0
  
  [13]    1       3       0x80a8e2c    0x5fe2c      0x89d         .data1
!         0       0       0x4          0
  
  [14]    1       3       0x80a96cc    0x606cc      0x1a8         .got
!         0       0       0x4          0x4
  
  [15]    6       3       0x80a9874    0x60874      0x80          .dynamic
!         4       0       0x4          0x8
  
  [16]    8       3       0x80c6800    0x7d800      0             .bss
!         0       0       0x4          0
  
  [17]    2       0       0            0x7d800      0x9b90        .symtab
!         18      371     0x4          0x10
  
  [18]    3       0       0            0x87390      0x8526        .strtab
!         0       0       0x1          0
  
  [19]    3       0       0            0x8f8b6      0x93          .shstrtab
!         0       0       0x1          0
  
  [20]    1       0       0            0x8f949      0x68b7        .comment
!         0       0       0x1          0
  
  [21]    1       3       0x80a98f4    0x608f4      0x1cf0c       .data
!         0       0       0x4          0
  
   * This is an example of how the file header is changed.  "Shoff" is
*************** Type        Offset      Vaddr       Padd
*** 277,294 ****
  Filesz      Memsz       Flags       Align
  
! 6           0x34        0x8048034   0           
! 0xa0        0xa0        5           0           
  
! 3           0xd4        0           0           
! 0x13        0           4           0           
  
! 1           0x34        0x8048034   0           
! 0x3f2f9     0x3f2f9     5           0x1000      
  
! 1           0x3f330     0x8088330   0           
! 0x215c4     0x25a60     7           0x1000      
  
! 2           0x60874     0x80a9874   0           
! 0x80        0           7           0           
  
  raid:/nfs/raid/src/dist-18.56/src> dump -o xemacs
--- 280,297 ----
  Filesz      Memsz       Flags       Align
  
! 6           0x34        0x8048034   0
! 0xa0        0xa0        5           0
  
! 3           0xd4        0           0
! 0x13        0           4           0
  
! 1           0x34        0x8048034   0
! 0x3f2f9     0x3f2f9     5           0x1000
  
! 1           0x3f330     0x8088330   0
! 0x215c4     0x25a60     7           0x1000
  
! 2           0x60874     0x80a9874   0
! 0x80        0           7           0
  
  raid:/nfs/raid/src/dist-18.56/src> dump -o xemacs
*************** Type        Offset      Vaddr       Padd
*** 299,338 ****
  Filesz      Memsz       Flags       Align
  
! 6           0x34        0x8048034   0           
! 0xa0        0xa0        5           0           
  
! 3           0xd4        0           0           
! 0x13        0           4           0           
  
! 1           0x34        0x8048034   0           
! 0x3f2f9     0x3f2f9     5           0x1000      
  
! 1           0x3f330     0x8088330   0           
! 0x3e4d0     0x3e4d0     7           0x1000      
  
! 2           0x60874     0x80a9874   0           
! 0x80        0           7           0           
  
  
   */
  
! /* Modified by wtien@urbana.mcd.mot.com of Motorola Inc. 
!  * 
   * The above mechanism does not work if the unexeced ELF file is being
!  * re-layout by other applications (such as `strip'). All the applications 
   * that re-layout the internal of ELF will layout all sections in ascending
!  * order of their file offsets. After the re-layout, the data2 section will 
!  * still be the LAST section in the section header vector, but its file offset 
   * is now being pushed far away down, and causes part of it not to be mapped
!  * in (ie. not covered by the load segment entry in PHDR vector), therefore 
   * causes the new binary to fail.
   *
   * The solution is to modify the unexec algorithm to insert the new data2
   * section header right before the new bss section header, so their file
!  * offsets will be in the ascending order. Since some of the section's (all 
!  * sections AFTER the bss section) indexes are now changed, we also need to 
!  * modify some fields to make them point to the right sections. This is done 
   * by macro PATCH_INDEX. All the fields that need to be patched are:
!  * 
   * 1. ELF header e_shstrndx field.
   * 2. section header sh_link and sh_info field.
--- 302,341 ----
  Filesz      Memsz       Flags       Align
  
! 6           0x34        0x8048034   0
! 0xa0        0xa0        5           0
  
! 3           0xd4        0           0
! 0x13        0           4           0
  
! 1           0x34        0x8048034   0
! 0x3f2f9     0x3f2f9     5           0x1000
  
! 1           0x3f330     0x8088330   0
! 0x3e4d0     0x3e4d0     7           0x1000
  
! 2           0x60874     0x80a9874   0
! 0x80        0           7           0
  
  
   */
  
! /* Modified by wtien@urbana.mcd.mot.com of Motorola Inc.
!  *
   * The above mechanism does not work if the unexeced ELF file is being
!  * re-layout by other applications (such as `strip'). All the applications
   * that re-layout the internal of ELF will layout all sections in ascending
!  * order of their file offsets. After the re-layout, the data2 section will
!  * still be the LAST section in the section header vector, but its file offset
   * is now being pushed far away down, and causes part of it not to be mapped
!  * in (ie. not covered by the load segment entry in PHDR vector), therefore
   * causes the new binary to fail.
   *
   * The solution is to modify the unexec algorithm to insert the new data2
   * section header right before the new bss section header, so their file
!  * offsets will be in the ascending order. Since some of the section's (all
!  * sections AFTER the bss section) indexes are now changed, we also need to
!  * modify some fields to make them point to the right sections. This is done
   * by macro PATCH_INDEX. All the fields that need to be patched are:
!  *
   * 1. ELF header e_shstrndx field.
   * 2. section header sh_link and sh_info field.
*************** Filesz      Memsz       Flags       Alig
*** 346,410 ****
  
  [1]     1       2       0x80480d4    0xd4         0x13          .interp
!         0       0       0x1          0            
  
  [2]     5       2       0x80480e8    0xe8         0x388         .hash
!         3       0       0x4          0x4          
  
  [3]     11      2       0x8048470    0x470        0x7f0         .dynsym
!         4       1       0x4          0x10         
  
  [4]     3       2       0x8048c60    0xc60        0x3ad         .dynstr
!         0       0       0x1          0            
  
  [5]     9       2       0x8049010    0x1010       0x338         .rel.plt
!         3       7       0x4          0x8          
  
  [6]     1       6       0x8049348    0x1348       0x3           .init
!         0       0       0x4          0            
  
  [7]     1       6       0x804934c    0x134c       0x680         .plt
!         0       0       0x4          0x4          
  
  [8]     1       6       0x80499cc    0x19cc       0x3c56f       .text
!         0       0       0x4          0            
  
  [9]     1       6       0x8085f3c    0x3df3c      0x3           .fini
!         0       0       0x4          0            
  
  [10]    1       2       0x8085f40    0x3df40      0x69c         .rodata
!         0       0       0x4          0            
  
  [11]    1       2       0x80865dc    0x3e5dc      0xd51         .rodata1
!         0       0       0x4          0            
  
  [12]    1       3       0x8088330    0x3f330      0x20afc       .data
!         0       0       0x4          0            
  
  [13]    1       3       0x80a8e2c    0x5fe2c      0x89d         .data1
!         0       0       0x4          0            
  
  [14]    1       3       0x80a96cc    0x606cc      0x1a8         .got
!         0       0       0x4          0x4          
  
  [15]    6       3       0x80a9874    0x60874      0x80          .dynamic
!         4       0       0x4          0x8          
  
  [16]    1       3       0x80a98f4    0x608f4      0x1cf0c       .data
!         0       0       0x4          0            
  
  [17]    8       3       0x80c6800    0x7d800      0             .bss
!         0       0       0x4          0            
  
  [18]    2       0       0            0x7d800      0x9b90        .symtab
!         19      371     0x4          0x10         
  
  [19]    3       0       0            0x87390      0x8526        .strtab
!         0       0       0x1          0            
  
  [20]    3       0       0            0x8f8b6      0x93          .shstrtab
!         0       0       0x1          0            
  
  [21]    1       0       0            0x8f949      0x68b7        .comment
!         0       0       0x1          0            
  
   */
--- 349,413 ----
  
  [1]     1       2       0x80480d4    0xd4         0x13          .interp
!         0       0       0x1          0
  
  [2]     5       2       0x80480e8    0xe8         0x388         .hash
!         3       0       0x4          0x4
  
  [3]     11      2       0x8048470    0x470        0x7f0         .dynsym
!         4       1       0x4          0x10
  
  [4]     3       2       0x8048c60    0xc60        0x3ad         .dynstr
!         0       0       0x1          0
  
  [5]     9       2       0x8049010    0x1010       0x338         .rel.plt
!         3       7       0x4          0x8
  
  [6]     1       6       0x8049348    0x1348       0x3           .init
!         0       0       0x4          0
  
  [7]     1       6       0x804934c    0x134c       0x680         .plt
!         0       0       0x4          0x4
  
  [8]     1       6       0x80499cc    0x19cc       0x3c56f       .text
!         0       0       0x4          0
  
  [9]     1       6       0x8085f3c    0x3df3c      0x3           .fini
!         0       0       0x4          0
  
  [10]    1       2       0x8085f40    0x3df40      0x69c         .rodata
!         0       0       0x4          0
  
  [11]    1       2       0x80865dc    0x3e5dc      0xd51         .rodata1
!         0       0       0x4          0
  
  [12]    1       3       0x8088330    0x3f330      0x20afc       .data
!         0       0       0x4          0
  
  [13]    1       3       0x80a8e2c    0x5fe2c      0x89d         .data1
!         0       0       0x4          0
  
  [14]    1       3       0x80a96cc    0x606cc      0x1a8         .got
!         0       0       0x4          0x4
  
  [15]    6       3       0x80a9874    0x60874      0x80          .dynamic
!         4       0       0x4          0x8
  
  [16]    1       3       0x80a98f4    0x608f4      0x1cf0c       .data
!         0       0       0x4          0
  
  [17]    8       3       0x80c6800    0x7d800      0             .bss
!         0       0       0x4          0
  
  [18]    2       0       0            0x7d800      0x9b90        .symtab
!         19      371     0x4          0x10
  
  [19]    3       0       0            0x87390      0x8526        .strtab
!         0       0       0x1          0
  
  [20]    3       0       0            0x8f8b6      0x93          .shstrtab
!         0       0       0x1          0
  
  [21]    1       0       0            0x8f949      0x68b7        .comment
!         0       0       0x1          0
  
   */
*************** Filesz      Memsz       Flags       Alig
*** 424,428 ****
  #define fatal(a, b, c) fprintf (stderr, a, b, c), exit (1)
  #else
! #include "config.h"
  extern void fatal (char *, ...);
  #endif
--- 427,431 ----
  #define fatal(a, b, c) fprintf (stderr, a, b, c), exit (1)
  #else
! #include <config.h>
  extern void fatal (char *, ...);
  #endif
*************** extern void fatal (char *, ...);
*** 435,438 ****
--- 438,464 ----
   * accounting for the size of the entries.
   */
+ /* 
+    On PPC Reference Platform running Solaris 2.5.1
+    the plt section is also of type NOBI like the bss section.
+    (not really stored) and therefore sections after the bss
+    section start at the plt offset. The plt section is always
+    the one just before the bss section.
+    Thus, we modify the test from
+       if (NEW_SECTION_H (nn).sh_offset >= new_data2_offset)
+    to
+       if (NEW_SECTION_H (nn).sh_offset >= 
+                OLD_SECTION_H (old_bss_index-1).sh_offset)
+    This is just a hack. We should put the new data section
+    before the .plt section.
+    And we should not have this routine at all but use
+    the libelf library to read the old file and create the new
+    file.
+    The changed code is minimal and depends on prep set in m/prep.h
+    Erik Deumens
+    Quantum Theory Project
+    University of Florida
+    deumens@qtp.ufl.edu
+    Apr 23, 1996
+    */
  
  #define OLD_SECTION_H(n) \
*************** unexec (new_name, old_name, data_start, 
*** 682,686 ****
      fatal ("Can't find .data in %s.\n", old_name, 0);
  
!   /* Walk through all section headers, insert the new data2 section right 
       before the new bss section. */
    for (n = 1, nn = 1; n < (int) old_file_h->e_shnum; n++, nn++)
--- 708,712 ----
      fatal ("Can't find .data in %s.\n", old_name, 0);
  
!   /* Walk through all section headers, insert the new data2 section right
       before the new bss section. */
    for (n = 1, nn = 1; n < (int) old_file_h->e_shnum; n++, nn++)
*************** unexec (new_name, old_name, data_start, 
*** 693,697 ****
  	  memcpy (&NEW_SECTION_H (nn), &OLD_SECTION_H (old_data_index),
  		  new_file_h->e_shentsize);
! 	  
  	  NEW_SECTION_H (nn).sh_addr = new_data2_addr;
  	  NEW_SECTION_H (nn).sh_offset = new_data2_offset;
--- 719,723 ----
  	  memcpy (&NEW_SECTION_H (nn), &OLD_SECTION_H (old_data_index),
  		  new_file_h->e_shentsize);
! 
  	  NEW_SECTION_H (nn).sh_addr = new_data2_addr;
  	  NEW_SECTION_H (nn).sh_offset = new_data2_offset;
*************** unexec (new_name, old_name, data_start, 
*** 703,715 ****
  
  	  /* Now copy over what we have in the memory now. */
! 	  memcpy (NEW_SECTION_H (nn).sh_offset + new_base, 
! 		  (caddr_t) OLD_SECTION_H (n).sh_addr, 
  		  new_data2_size);
  	  nn++;
  	}
!       
!       memcpy (&NEW_SECTION_H (nn), &OLD_SECTION_H (n), 
  	      old_file_h->e_shentsize);
!       
        /* The new bss section's size is zero, and its file offset and virtual
  	 address should be off by NEW_DATA2_SIZE. */
--- 729,741 ----
  
  	  /* Now copy over what we have in the memory now. */
! 	  memcpy (NEW_SECTION_H (nn).sh_offset + new_base,
! 		  (caddr_t) OLD_SECTION_H (n).sh_addr,
  		  new_data2_size);
  	  nn++;
  	}
! 
!       memcpy (&NEW_SECTION_H (nn), &OLD_SECTION_H (n),
  	      old_file_h->e_shentsize);
! 
        /* The new bss section's size is zero, and its file offset and virtual
  	 address should be off by NEW_DATA2_SIZE. */
*************** unexec (new_name, old_name, data_start, 
*** 720,724 ****
  	  NEW_SECTION_H (nn).sh_addr += new_data2_size;
  	  /* Let the new bss section address alignment be the same as the
! 	     section address alignment followed the old bss section, so 
  	     this section will be placed in exactly the same place. */
  	  NEW_SECTION_H (nn).sh_addralign = OLD_SECTION_H (nn).sh_addralign;
--- 746,750 ----
  	  NEW_SECTION_H (nn).sh_addr += new_data2_size;
  	  /* Let the new bss section address alignment be the same as the
! 	     section address alignment followed the old bss section, so
  	     this section will be placed in exactly the same place. */
  	  NEW_SECTION_H (nn).sh_addralign = OLD_SECTION_H (nn).sh_addralign;
*************** unexec (new_name, old_name, data_start, 
*** 729,734 ****
--- 755,774 ----
  	  /* Any section that was original placed AFTER the bss
  	     section should now be off by NEW_DATA2_SIZE. */
+ #ifdef SOLARIS_POWERPC
+ 	  /* On PPC Reference Platform running Solaris 2.5.1
+ 	     the plt section is also of type NOBI like the bss section.
+ 	     (not really stored) and therefore sections after the bss
+ 	     section start at the plt offset. The plt section is always
+ 	     the one just before the bss section.
+ 	     It would be better to put the new data section before
+ 	     the .plt section, or use libelf instead.
+ 	     Erik Deumens, deumens@qtp.ufl.edu.  */
+ 	  if (NEW_SECTION_H (nn).sh_offset
+ 	      >= OLD_SECTION_H (old_bss_index-1).sh_offset)
+ 	    NEW_SECTION_H (nn).sh_offset += new_data2_size;
+ #else
  	  if (NEW_SECTION_H (nn).sh_offset >= new_data2_offset)
  	    NEW_SECTION_H (nn).sh_offset += new_data2_size;
+ #endif
  	  /* Any section that was originally placed after the section
  	     header table should now be off by the size of one section
*************** unexec (new_name, old_name, data_start, 
*** 739,745 ****
  
        /* If any section hdr refers to the section after the new .data
! 	 section, make it refer to next one because we have inserted 
  	 a new section in between.  */
!       
        PATCH_INDEX (NEW_SECTION_H (nn).sh_link);
        /* For symbol tables, info is a symbol table index,
--- 779,785 ----
  
        /* If any section hdr refers to the section after the new .data
! 	 section, make it refer to next one because we have inserted
  	 a new section in between.  */
! 
        PATCH_INDEX (NEW_SECTION_H (nn).sh_link);
        /* For symbol tables, info is a symbol table index,
*************** unexec (new_name, old_name, data_start, 
*** 753,757 ****
  	  || NEW_SECTION_H (nn).sh_type == SHT_NOBITS)
  	continue;
!       
        /* Write out the sections. .data and .data1 (and data2, called
  	 ".data" in the strings table) get copied from the current process
--- 793,797 ----
  	  || NEW_SECTION_H (nn).sh_type == SHT_NOBITS)
  	continue;
! 
        /* Write out the sections. .data and .data1 (and data2, called
  	 ".data" in the strings table) get copied from the current process
*************** unexec (new_name, old_name, data_start, 
*** 763,767 ****
        else
  	src = old_base + OLD_SECTION_H (n).sh_offset;
!       
        memcpy (NEW_SECTION_H (nn).sh_offset + new_base, src,
  	      NEW_SECTION_H (nn).sh_size);
--- 803,807 ----
        else
  	src = old_base + OLD_SECTION_H (n).sh_offset;
! 
        memcpy (NEW_SECTION_H (nn).sh_offset + new_base, src,
  	      NEW_SECTION_H (nn).sh_size);
*************** unexec (new_name, old_name, data_start, 
*** 773,777 ****
  	  Elf32_Shdr *spt = &NEW_SECTION_H (nn);
  	  unsigned int num = spt->sh_size / spt->sh_entsize;
! 	  Elf32_Sym * sym = (Elf32_Sym *) (NEW_SECTION_H (nn).sh_offset + 
  					   new_base);
  	  for (; num--; sym++)
--- 813,817 ----
  	  Elf32_Shdr *spt = &NEW_SECTION_H (nn);
  	  unsigned int num = spt->sh_size / spt->sh_entsize;
! 	  Elf32_Sym * sym = (Elf32_Sym *) (NEW_SECTION_H (nn).sh_offset +
  					   new_base);
  	  for (; num--; sym++)
*************** unexec (new_name, old_name, data_start, 
*** 781,785 ****
  		  || (sym->st_shndx == SHN_COMMON))
  		continue;
! 	
  	      PATCH_INDEX (sym->st_shndx);
  	    }
--- 821,825 ----
  		  || (sym->st_shndx == SHN_COMMON))
  		continue;
! 
  	      PATCH_INDEX (sym->st_shndx);
  	    }
*************** unexec (new_name, old_name, data_start, 
*** 806,809 ****
--- 846,881 ----
  	    || strcmp ((char *) (symnames + symp->st_name), "_edata") == 0)
  	  memcpy (&symp->st_value, &new_bss_addr, sizeof (new_bss_addr));
+     }
+ 
+   /* This loop seeks out relocation sections for the data section, so
+      that it can undo relocations performed by the runtime linker.  */
+   for (n = new_file_h->e_shnum - 1; n; n--)
+     {
+       Elf32_Shdr section = NEW_SECTION_H (n);
+       switch (section.sh_type) {
+       default:
+ 	break;
+       case SHT_REL:
+       case SHT_RELA:
+ 	/* This code handles two different size structs, but there should
+ 	   be no harm in that provided that r_offset is always the first
+ 	   member.  */
+ 	nn = section.sh_info;
+ 	if (!strcmp (old_section_names + NEW_SECTION_H (nn).sh_name, ".data")
+ 	    || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name),
+ 			".data1"))
+ 	  {
+ 	    Elf32_Addr offset = NEW_SECTION_H (nn).sh_addr -
+ 	      NEW_SECTION_H (nn).sh_offset;
+ 	    caddr_t reloc = old_base + section.sh_offset, end;
+ 	    for (end = reloc + section.sh_size; reloc < end;
+ 		 reloc += section.sh_entsize)
+ 	      {
+ 		Elf32_Addr addr = ((Elf32_Rel *) reloc)->r_offset - offset;
+ 		memcpy (new_base + addr, old_base + addr, 4);
+ 	      }
+ 	  }
+ 	break;
+       }
      }
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/unexenix.c emacs-19.31/src/unexenix.c
*** emacs-19.30/src/unexenix.c	Sat Jan  8 16:40:25 1994
--- emacs-19.31/src/unexenix.c	Mon Jan 15 04:06:29 1996
*************** GNU General Public License for more deta
*** 23,27 ****
  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.  */
  
  
--- 23,28 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/unexmips.c emacs-19.31/src/unexmips.c
*** emacs-19.30/src/unexmips.c	Tue Jun 27 05:28:35 1995
--- emacs-19.31/src/unexmips.c	Mon Jan 15 04:06:29 1996
*************** GNU General Public License for more deta
*** 23,27 ****
  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.  */
  
  
--- 23,28 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/unexnext.c emacs-19.31/src/unexnext.c
*** emacs-19.30/src/unexnext.c	Sat Sep 11 21:21:34 1993
--- emacs-19.31/src/unexnext.c	Mon Jan 15 04:06:29 1996
*************** GNU General Public License for more deta
*** 17,21 ****
  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.  */
  
  
--- 17,22 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/unexnt.c emacs-19.31/src/unexnt.c
*** emacs-19.30/src/unexnt.c	Tue Nov  7 02:10:33 1995
--- emacs-19.31/src/unexnt.c	Fri May  3 14:30:52 1996
***************
*** 1,22 ****
! /*
!    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)                         8-12-94
--- 1,21 ----
! /* 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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.
  
     Geoff Voelker (voelker@cs.washington.edu)                         8-12-94
*************** HINSTANCE hprevinst = NULL;
*** 69,89 ****
  LPSTR lpCmdLine = "";
  int nCmdShow = 0;
-     
- int __stdcall 
- WinMain (_hinst, _hPrevInst, _lpCmdLine, _nCmdShow)
-      HINSTANCE _hinst;
-      HINSTANCE _hPrevInst;
-      LPSTR _lpCmdLine;
-      int _nCmdShow;
- {
-   /* Need to parse command line */
-     
-   hinst = _hinst;
-   hprevinst = _hPrevInst;
-   lpCmdLine = _lpCmdLine;
-   nCmdShow = _nCmdShow;
- 
-   return (main (__argc,__argv,_environ));
- }
  #endif /* HAVE_NTGUI */
  
--- 68,71 ----
*************** void
*** 95,103 ****
  _start (void)
  {
- #ifdef HAVE_NTGUI
-   extern void WinMainCRTStartup (void);
- #else
    extern void mainCRTStartup (void);
- #endif /* HAVE_NTGUI */
  
    /* Cache system info, e.g., the NT page size.  */
--- 77,81 ----
*************** _start (void)
*** 133,143 ****
       is finished.  */
  #ifdef HAVE_NTGUI
!   WinMainCRTStartup ();
! #else
    mainCRTStartup ();
- #endif /* HAVE_NTGUI */
  }
  
! /* Dump out .data and .bss sections into a new exectubale.  */
  void
  unexec (char *new_name, char *old_name, void *start_data, void *start_bss,
--- 111,123 ----
       is finished.  */
  #ifdef HAVE_NTGUI
!   /* determine WinMain args like crt0.c does */
!   hinst = GetModuleHandle(NULL);
!   lpCmdLine = GetCommandLine();
!   nCmdShow = SW_SHOWDEFAULT;
! #endif
    mainCRTStartup ();
  }
  
! /* Dump out .data and .bss sections into a new executable.  */
  void
  unexec (char *new_name, char *old_name, void *start_data, void *start_bss,
*************** close_file_data (file_data *p_file)
*** 292,295 ****
--- 272,313 ----
  /* Routines to manipulate NT executable file sections.  */
  
+ static void
+ get_bss_info_from_map_file (file_data *p_infile, PUCHAR *p_bss_start, 
+ 			    DWORD *p_bss_size)
+ {
+   int n, start, len;
+   char map_filename[MAX_PATH];
+   char buffer[256];
+   FILE *map;
+ 
+   /* Overwrite the .exe extension on the executable file name with
+      the .map extension.  */
+   strcpy (map_filename, p_infile->name);
+   n = strlen (map_filename) - 3;
+   strcpy (&map_filename[n], "map");
+ 
+   map = fopen (map_filename, "r");
+   if (!map)
+     {
+       printf ("Failed to open map file %s, error %d...bailing out.\n",
+ 	      map_filename, GetLastError ());
+       exit (-1);
+     }
+ 
+   while (fgets (buffer, sizeof (buffer), map))
+     {
+       if (!(strstr (buffer, ".bss") && strstr (buffer, "DATA")))
+ 	continue;
+       n = sscanf (buffer, " %*d:%x %x", &start, &len);
+       if (n != 2)
+ 	{
+ 	  printf ("Failed to scan the .bss section line:\n%s", buffer);
+ 	  exit (-1);
+ 	}
+       break;
+     }
+   *p_bss_start = (PUCHAR) start;
+   *p_bss_size = (DWORD) len;
+ }
  
  static unsigned long
*************** get_section_info (file_data *p_infile)
*** 312,316 ****
    PIMAGE_DOS_HEADER dos_header;
    PIMAGE_NT_HEADERS nt_header;
!   PIMAGE_SECTION_HEADER section;
    unsigned char *ptr;
    int i;
--- 330,334 ----
    PIMAGE_DOS_HEADER dos_header;
    PIMAGE_NT_HEADERS nt_header;
!   PIMAGE_SECTION_HEADER section, data_section;
    unsigned char *ptr;
    int i;
*************** get_section_info (file_data *p_infile)
*** 356,360 ****
  
  	  /* The .data section.  */
! 	  ptr  = (char *) nt_header->OptionalHeader.ImageBase +
  	    section->VirtualAddress;
  	  data_start_va = ptr;
--- 374,379 ----
  
  	  /* The .data section.  */
! 	  data_section = section;
! 	  ptr = (char *) nt_header->OptionalHeader.ImageBase +
  	    section->VirtualAddress;
  	  data_start_va = ptr;
*************** get_section_info (file_data *p_infile)
*** 368,371 ****
--- 387,405 ----
  	}
        section++;
+     }
+ 
+   if (!bss_start && !bss_size)
+     {
+       /* Starting with MSVC 4.0, the .bss section has been eliminated
+ 	 and appended virtually to the end of the .data section.  Our
+ 	 only hint about where the .bss section starts in the address
+ 	 comes from the SizeOfRawData field in the .data section
+ 	 header.  Unfortunately, this field is only approximate, as it
+ 	 is a rounded number and is typically rounded just beyond the
+ 	 start of the .bss section.  To find the start and size of the
+ 	 .bss section exactly, we have to peek into the map file.  */
+       get_bss_info_from_map_file (p_infile, &ptr, &bss_size);
+       bss_start = ptr + nt_header->OptionalHeader.ImageBase
+ 	+ data_section->VirtualAddress;
      }
  }
diff -2rcpP --exclude=*.elc emacs-19.30/src/unexsgi.c emacs-19.31/src/unexsgi.c
*** emacs-19.30/src/unexsgi.c	Sun Oct 29 21:32:13 1995
--- emacs-19.31/src/unexsgi.c	Mon Jan 15 04:06:29 1996
***************
*** 2,18 ****
     Free Software Foundation, Inc.
  
!     This program 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.
  
!     This program 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 this program; if not, write to the Free Software
!     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  
  In other words, you are welcome to use, share and improve this program.
--- 2,21 ----
     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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.
  
  In other words, you are welcome to use, share and improve this program.
diff -2rcpP --exclude=*.elc emacs-19.30/src/unexsni.c emacs-19.31/src/unexsni.c
*** emacs-19.30/src/unexsni.c	Thu Apr  6 22:17:28 1995
--- emacs-19.31/src/unexsni.c	Mon Jan 15 04:06:29 1996
***************
*** 3,19 ****
     Free Software Foundation, Inc.
  
!     This program 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.
! 
!     This program 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 this program; if not, write to the Free Software
!     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  
  In other words, you are welcome to use, share and improve this program.
--- 3,22 ----
     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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.
  
  In other words, you are welcome to use, share and improve this program.
*************** unexec (new_name, old_name, data_start, 
*** 459,463 ****
  
    if (old_sbss_index != (old_bss_index - 1))
!     fatal (".sbss should come immediatly before .bss in %s.\n", old_name, 0);
  
    /* Figure out parameters of the new data3 and data2 sections.
--- 462,466 ----
  
    if (old_sbss_index != (old_bss_index - 1))
!     fatal (".sbss should come immediately before .bss in %s.\n", old_name, 0);
  
    /* Figure out parameters of the new data3 and data2 sections.
diff -2rcpP --exclude=*.elc emacs-19.30/src/unexsunos4.c emacs-19.31/src/unexsunos4.c
*** emacs-19.30/src/unexsunos4.c	Tue Jul 18 00:35:55 1995
--- emacs-19.31/src/unexsunos4.c	Mon Jan 15 04:06:29 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  /* Contributed by Viktor Dukhovni.  */
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* Contributed by Viktor Dukhovni.  */
diff -2rcpP --exclude=*.elc emacs-19.30/src/vm-limit.c emacs-19.31/src/vm-limit.c
*** emacs-19.30/src/vm-limit.c	Sat Sep 11 21:21:36 1993
--- emacs-19.31/src/vm-limit.c	Tue Apr  9 18:14:48 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  #ifdef emacs
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  #ifdef emacs
diff -2rcpP --exclude=*.elc emacs-19.30/src/vms-pp.c emacs-19.31/src/vms-pp.c
*** emacs-19.30/src/vms-pp.c	Thu Jun 15 16:38:58 1995
--- emacs-19.31/src/vms-pp.c	Mon Jan 15 04:06:29 1996
*************** GNU General Public License for more deta
*** 17,21 ****
  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.
  
   *
--- 17,22 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.
  
   *
*************** the Free Software Foundation, 675 Mass A
*** 43,47 ****
   *		#if defined(foo)
   *
!  *	This last contruction only works on single line #if's and takes
   *	advantage of a questionable C pre-processor trick. If there are
   *	comments within the #if, that contain "defined", then this will
--- 44,48 ----
   *		#if defined(foo)
   *
!  *	This last construction only works on single line #if's and takes
   *	advantage of a questionable C pre-processor trick. If there are
   *	comments within the #if, that contain "defined", then this will
diff -2rcpP --exclude=*.elc emacs-19.30/src/vms-pwd.h emacs-19.31/src/vms-pwd.h
*** emacs-19.30/src/vms-pwd.h	Thu Jun 15 16:39:07 1995
--- emacs-19.31/src/vms-pwd.h	Mon Jan 15 04:06:29 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  #ifdef VMS
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  #ifdef VMS
diff -2rcpP --exclude=*.elc emacs-19.30/src/vmsdir.h emacs-19.31/src/vmsdir.h
*** emacs-19.30/src/vmsdir.h	Thu Jun 15 16:39:08 1995
--- emacs-19.31/src/vmsdir.h	Mon Jan 15 04:06:29 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  /*
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /*
diff -2rcpP --exclude=*.elc emacs-19.30/src/vmsfns.c emacs-19.31/src/vmsfns.c
*** emacs-19.30/src/vmsfns.c	Thu Jun 15 16:38:58 1995
--- emacs-19.31/src/vmsfns.c	Mon Jan 15 04:06:29 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  /* Written by Mukesh Prasad.  */
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* Written by Mukesh Prasad.  */
diff -2rcpP --exclude=*.elc emacs-19.30/src/vmsgmalloc.c emacs-19.31/src/vmsgmalloc.c
*** emacs-19.30/src/vmsgmalloc.c	Sat Sep 11 21:21:38 1993
--- emacs-19.31/src/vmsgmalloc.c	Mon Jan 15 04:06:29 1996
***************
*** 9,26 ****
  		  Written May 1989 by Mike Haertel.
  
! This library is free software; you can redistribute it and/or
! modify it under the terms of the GNU Library General Public License as
! published by the Free Software Foundation; either version 2 of the
! License, or (at your option) any later version.
  
! This library 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
! Library General Public License for more details.
  
! You should have received a copy of the GNU Library General Public
! License along with this library; see the file COPYING.LIB.  If
! not, write to the Free Software Foundation, Inc., 675 Mass Ave,
! Cambridge, MA 02139, USA.
  
     The author may be reached (Email) at the address mike@ai.mit.edu,
--- 9,28 ----
  		  Written May 1989 by Mike Haertel.
  
! 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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.
  
     The author may be reached (Email) at the address mike@ai.mit.edu,
*************** VMS_present_buffer()
*** 1180,1184 ****
  
  #ifdef VMS
! /* Unfortunatelly, the VAX C sbrk() is buggy. For example, it returns
     memory in 512 byte chunks (not a bug, but there's more), AND it
     adds an extra 512 byte chunk if you ask for a multiple of 512
--- 1182,1186 ----
  
  #ifdef VMS
! /* Unfortunately, the VAX C sbrk() is buggy. For example, it returns
     memory in 512 byte chunks (not a bug, but there's more), AND it
     adds an extra 512 byte chunk if you ask for a multiple of 512
diff -2rcpP --exclude=*.elc emacs-19.30/src/vmsmap.c emacs-19.31/src/vmsmap.c
*** emacs-19.30/src/vmsmap.c	Thu Jun 15 16:38:59 1995
--- emacs-19.31/src/vmsmap.c	Mon Jan 15 04:06:29 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  /* Written by Mukesh Prasad.  */
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* Written by Mukesh Prasad.  */
diff -2rcpP --exclude=*.elc emacs-19.30/src/vmsproc.c emacs-19.31/src/vmsproc.c
*** emacs-19.30/src/vmsproc.c	Thu Jun 15 16:39:00 1995
--- emacs-19.31/src/vmsproc.c	Mon Jan 15 04:06:29 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** create_process (process, new_argv)
*** 720,724 ****
      Event flags returned start at 1 for the keyboard.
      Since Unix expects descriptor 0 for the keyboard,
!     we substract one from the event flag.
      */
    inchannel = vs->eventFlag-1;
--- 721,725 ----
      Event flags returned start at 1 for the keyboard.
      Since Unix expects descriptor 0 for the keyboard,
!     we subtract one from the event flag.
      */
    inchannel = vs->eventFlag-1;
diff -2rcpP --exclude=*.elc emacs-19.30/src/vmstime.c emacs-19.31/src/vmstime.c
*** emacs-19.30/src/vmstime.c	Sat Sep 11 21:21:42 1993
--- emacs-19.31/src/vmstime.c	Mon Jan 15 04:06:29 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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 <config.h>
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  #include <config.h>
diff -2rcpP --exclude=*.elc emacs-19.30/src/vmstime.h emacs-19.31/src/vmstime.h
*** emacs-19.30/src/vmstime.h	Sat Sep 11 21:21:42 1993
--- emacs-19.31/src/vmstime.h	Mon Jan 15 04:06:29 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  #ifndef vmstime_h
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  #ifndef vmstime_h
diff -2rcpP --exclude=*.elc emacs-19.30/src/w32faces.c emacs-19.31/src/w32faces.c
*** emacs-19.30/src/w32faces.c	Tue Nov  7 02:38:43 1995
--- emacs-19.31/src/w32faces.c	Mon Jan 15 04:06:29 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  /* Ported xfaces.c for win32 - Kevin Gallo */
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* Ported xfaces.c for win32 - Kevin Gallo */
*************** the Free Software Foundation, 675 Mass A
*** 70,74 ****
     of FRAME->display.x->param_faces are special - they describe the
     default and mode line faces.  None of the faces in param_faces have
!    GC's.  (See src/dispextern.h for the definiton of struct face.
     lisp/faces.el maintains the isomorphism between face_alist and
     param_faces.)
--- 71,75 ----
     of FRAME->display.x->param_faces are special - they describe the
     default and mode line faces.  None of the faces in param_faces have
!    GC's.  (See src/dispextern.h for the definition of struct face.
     lisp/faces.el maintains the isomorphism between face_alist and
     param_faces.)
diff -2rcpP --exclude=*.elc emacs-19.30/src/w32fns.c emacs-19.31/src/w32fns.c
*** emacs-19.30/src/w32fns.c	Tue Nov  7 02:38:44 1995
--- emacs-19.31/src/w32fns.c	Sat May 25 19:19:20 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  /* Added by Kevin Gallo */
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* Added by Kevin Gallo */
*************** extern void abort ();
*** 41,48 ****
--- 42,72 ----
  extern void free_frame_menubar ();
  extern struct scroll_bar *x_window_to_scroll_bar ();
+ extern int quit_char;
  
  /* The colormap for converting color names to RGB values */
  Lisp_Object Vwin32_color_map;
  
+ /* Non nil if alt key presses are passed on to Windows.  */
+ Lisp_Object Vwin32_pass_alt_to_system;
+ 
+ /* Non nil if left window, right window, and application key events
+    are passed on to Windows.  */
+ Lisp_Object Vwin32_pass_optional_keys_to_system;
+ 
+ /* Switch to control whether we inhibit requests for italicised fonts (which
+    are synthesized, look ugly, and are trashed by cursor movement under NT). */
+ Lisp_Object Vwin32_enable_italics;
+ 
+ /* Enable palette management. */
+ Lisp_Object Vwin32_enable_palette;
+ 
+ /* Control how close left/right button down events must be to
+    be converted to a middle button down event. */
+ Lisp_Object Vwin32_mouse_button_tolerance;
+ 
+ /* Minimum interval between mouse movement (and scroll bar drag)
+    events that are passed on to the event loop. */
+ Lisp_Object Vwin32_mouse_move_interval;
+ 
  /* The name we're using in resource queries.  */
  Lisp_Object Vx_resource_name;
*************** Lisp_Object Quser_size;
*** 132,135 ****
--- 156,173 ----
  Lisp_Object Qdisplay;
  
+ /* State variables for emulating a three button mouse. */
+ #define LMOUSE 1
+ #define MMOUSE 2
+ #define RMOUSE 4
+ 
+ static int button_state = 0;
+ static Win32Msg saved_mouse_button_msg;
+ static unsigned mouse_button_timer;	/* non-zero when timer is active */
+ static Win32Msg saved_mouse_move_msg;
+ static unsigned mouse_move_timer;
+ 
+ #define MOUSE_BUTTON_ID	1
+ #define MOUSE_MOVE_ID	2
+ 
  /* The below are defined in frame.c.  */
  extern Lisp_Object Qheight, Qminibuffer, Qname, Qonly, Qwidth;
*************** extern Lisp_Object Vwindow_system_versio
*** 140,143 ****
--- 178,185 ----
  extern Lisp_Object last_mouse_scroll_bar;
  extern int last_mouse_scroll_bar_pos;
+ 
+ /* From win32term.c. */
+ extern Lisp_Object Vwin32_num_mouse_buttons;
+ 
  Time last_mouse_movement_time;
  
*************** x_report_frame_params (f, alistptr)
*** 816,838 ****
  
  
! #if 0
! DEFUN ("win32-rgb", Fwin32_rgb, Swin32_rgb, 3, 3, 0,
!        "Convert RGB numbers to a windows color reference.")
!     (red, green, blue)
!     Lisp_Object red, green, blue;
! {
!     Lisp_Object rgb;
  
!     CHECK_NUMBER (red, 0);
!     CHECK_NUMBER (green, 0);
!     CHECK_NUMBER (blue, 0);
  
!     XSET (rgb, Lisp_Int, RGB(XUINT(red), XUINT(green), XUINT(blue)));
  
!     return (rgb);
  }
  
  
- #else
  /* The default colors for the win32 color map */
  typedef struct colormap_t 
--- 858,945 ----
  
  
! DEFUN ("win32-define-rgb-color", Fwin32_define_rgb_color, Swin32_define_rgb_color, 4, 4, 0,
!   "Convert RGB numbers to a windows color reference and associate with NAME (a string).\n\
! This adds or updates a named color to win32-color-map, making it available for use.\n\
! The original entry's RGB ref is returned, or nil if the entry is new.")
!     (red, green, blue, name)
!     Lisp_Object red, green, blue, name;
! {
!   Lisp_Object rgb;
!   Lisp_Object oldrgb = Qnil;
!   Lisp_Object entry;
! 
!   CHECK_NUMBER (red, 0);
!   CHECK_NUMBER (green, 0);
!   CHECK_NUMBER (blue, 0);
!   CHECK_STRING (name, 0);
! 
!   XSET (rgb, Lisp_Int, RGB(XUINT (red), XUINT (green), XUINT (blue)));
! 
!   BLOCK_INPUT;
  
!   /* replace existing entry in win32-color-map or add new entry. */
!   entry = Fassoc (name, Vwin32_color_map);
!   if (NILP (entry))
!     {
!       entry = Fcons (name, rgb);
!       Vwin32_color_map = Fcons (entry, Vwin32_color_map);
!     }
!   else
!     {
!       oldrgb = Fcdr (entry);
!       Fsetcdr (entry, rgb);
!     }
  
!   UNBLOCK_INPUT;
  
!   return (oldrgb);
  }
  
+ DEFUN ("win32-load-color-file", Fwin32_load_color_file, Swin32_load_color_file, 1, 1, 0,
+   "Create an alist of color entries from an external file (ie. rgb.txt).\n\
+ Assign this value to win32-color-map to replace the existing color map.\n\
+ \
+ The file should define one named RGB color per line like so:\
+   R G B   name\n\
+ where R,G,B are numbers between 0 and 255 and name is an arbitrary string.")
+     (filename)
+     Lisp_Object filename;
+ {
+   FILE *fp;
+   Lisp_Object cmap = Qnil;
+   Lisp_Object abspath;
+ 
+   CHECK_STRING (filename, 0);
+   abspath = Fexpand_file_name (filename, Qnil);
+ 
+   fp = fopen (XSTRING (filename)->data, "rt");
+   if (fp)
+     {
+       char buf[512];
+       int red, green, blue;
+       int num;
+ 
+       BLOCK_INPUT;
+ 
+       while (fgets (buf, sizeof (buf), fp) != NULL) {
+ 	if (sscanf (buf, "%u %u %u %n", &red, &green, &blue, &num) == 3)
+ 	  {
+ 	    char *name = buf + num;
+ 	    num = strlen (name) - 1;
+ 	    if (name[num] == '\n')
+ 	      name[num] = 0;
+ 	    cmap = Fcons (Fcons (build_string (name),
+ 				 make_number (RGB (red, green, blue))),
+ 			  cmap);
+ 	  }
+       }
+       fclose (fp);
+ 
+       UNBLOCK_INPUT;
+     }
+ 
+   return cmap;
+ }
  
  /* The default colors for the win32 color map */
  typedef struct colormap_t 
*************** typedef struct colormap_t 
*** 844,1087 ****
  colormap_t win32_color_map[] = 
  {
!   {"snow"                      , RGB (255,250,250)},
!   {"ghost white"               , RGB (248,248,255)},
!   {"GhostWhite"                , RGB (248,248,255)},
!   {"white smoke"               , RGB (245,245,245)},
!   {"WhiteSmoke"                , RGB (245,245,245)},
!   {"gainsboro"                 , RGB (220,220,220)},
!   {"floral white"              , RGB (255,250,240)},
!   {"FloralWhite"               , RGB (255,250,240)},
!   {"old lace"                  , RGB (253,245,230)},
!   {"OldLace"                   , RGB (253,245,230)},
!   {"linen"                     , RGB (250,240,230)},
!   {"antique white"             , RGB (250,235,215)},
!   {"AntiqueWhite"              , RGB (250,235,215)},
!   {"papaya whip"               , RGB (255,239,213)},
!   {"PapayaWhip"                , RGB (255,239,213)},
!   {"blanched almond"           , RGB (255,235,205)},
!   {"BlanchedAlmond"            , RGB (255,235,205)},
!   {"bisque"                    , RGB (255,228,196)},
!   {"peach puff"                , RGB (255,218,185)},
!   {"PeachPuff"                 , RGB (255,218,185)},
!   {"navajo white"              , RGB (255,222,173)},
!   {"NavajoWhite"               , RGB (255,222,173)},
!   {"moccasin"                  , RGB (255,228,181)},
!   {"cornsilk"                  , RGB (255,248,220)},
!   {"ivory"                     , RGB (255,255,240)},
!   {"lemon chiffon"             , RGB (255,250,205)},
!   {"LemonChiffon"              , RGB (255,250,205)},
!   {"seashell"                  , RGB (255,245,238)},
!   {"honeydew"                  , RGB (240,255,240)},
!   {"mint cream"                , RGB (245,255,250)},
!   {"MintCream"                 , RGB (245,255,250)},
!   {"azure"                     , RGB (240,255,255)},
!   {"alice blue"                , RGB (240,248,255)},
!   {"AliceBlue"                 , RGB (240,248,255)},
!   {"lavender"                  , RGB (230,230,250)},
!   {"lavender blush"            , RGB (255,240,245)},
!   {"LavenderBlush"             , RGB (255,240,245)},
!   {"misty rose"                , RGB (255,228,225)},
!   {"MistyRose"                 , RGB (255,228,225)},
!   {"white"                     , RGB (255,255,255)},
!   {"black"                     , RGB (  0,  0,  0)},
!   {"dark slate gray"           , RGB ( 47, 79, 79)},
!   {"DarkSlateGray"             , RGB ( 47, 79, 79)},
!   {"dark slate grey"           , RGB ( 47, 79, 79)},
!   {"DarkSlateGrey"             , RGB ( 47, 79, 79)},
!   {"dim gray"                  , RGB (105,105,105)},
!   {"DimGray"                   , RGB (105,105,105)},
!   {"dim grey"                  , RGB (105,105,105)},
!   {"DimGrey"                   , RGB (105,105,105)},
!   {"slate gray"                , RGB (112,128,144)},
!   {"SlateGray"                 , RGB (112,128,144)},
!   {"slate grey"                , RGB (112,128,144)},
!   {"SlateGrey"                 , RGB (112,128,144)},
!   {"light slate gray"          , RGB (119,136,153)},
!   {"LightSlateGray"            , RGB (119,136,153)},
!   {"light slate grey"          , RGB (119,136,153)},
!   {"LightSlateGrey"            , RGB (119,136,153)},
!   {"gray"                      , RGB (190,190,190)},
!   {"grey"                      , RGB (190,190,190)},
!   {"light grey"                , RGB (211,211,211)},
!   {"LightGrey"                 , RGB (211,211,211)},
!   {"light gray"                , RGB (211,211,211)},
!   {"LightGray"                 , RGB (211,211,211)},
!   {"midnight blue"             , RGB ( 25, 25,112)},
!   {"MidnightBlue"              , RGB ( 25, 25,112)},
!   {"navy"                      , RGB (  0,  0,128)},
!   {"navy blue"                 , RGB (  0,  0,128)},
!   {"NavyBlue"                  , RGB (  0,  0,128)},
!   {"cornflower blue"           , RGB (100,149,237)},
!   {"CornflowerBlue"            , RGB (100,149,237)},
!   {"dark slate blue"           , RGB ( 72, 61,139)},
!   {"DarkSlateBlue"             , RGB ( 72, 61,139)},
!   {"slate blue"                , RGB (106, 90,205)},
!   {"SlateBlue"                 , RGB (106, 90,205)},
!   {"medium slate blue"         , RGB (123,104,238)},
!   {"MediumSlateBlue"           , RGB (123,104,238)},
!   {"light slate blue"          , RGB (132,112,255)},
!   {"LightSlateBlue"            , RGB (132,112,255)},
!   {"medium blue"               , RGB (  0,  0,205)},
!   {"MediumBlue"                , RGB (  0,  0,205)},
!   {"royal blue"                , RGB ( 65,105,225)},
!   {"RoyalBlue"                 , RGB ( 65,105,225)},
!   {"blue"                      , RGB (  0,  0,255)},
!   {"dodger blue"               , RGB ( 30,144,255)},
!   {"DodgerBlue"                , RGB ( 30,144,255)},
!   {"deep sky blue"             , RGB (  0,191,255)},
!   {"DeepSkyBlue"               , RGB (  0,191,255)},
!   {"sky blue"                  , RGB (135,206,235)},
!   {"SkyBlue"                   , RGB (135,206,235)},
!   {"light sky blue"            , RGB (135,206,250)},
!   {"LightSkyBlue"              , RGB (135,206,250)},
!   {"steel blue"                , RGB ( 70,130,180)},
!   {"SteelBlue"                 , RGB ( 70,130,180)},
!   {"light steel blue"          , RGB (176,196,222)},
!   {"LightSteelBlue"            , RGB (176,196,222)},
!   {"light blue"                , RGB (173,216,230)},
!   {"LightBlue"                 , RGB (173,216,230)},
!   {"powder blue"               , RGB (176,224,230)},
!   {"PowderBlue"                , RGB (176,224,230)},
!   {"pale turquoise"            , RGB (175,238,238)},
!   {"PaleTurquoise"             , RGB (175,238,238)},
!   {"dark turquoise"            , RGB (  0,206,209)},
!   {"DarkTurquoise"             , RGB (  0,206,209)},
!   {"medium turquoise"          , RGB ( 72,209,204)},
!   {"MediumTurquoise"           , RGB ( 72,209,204)},
!   {"turquoise"                 , RGB ( 64,224,208)},
!   {"cyan"                      , RGB (  0,255,255)},
!   {"light cyan"                , RGB (224,255,255)},
!   {"LightCyan"                 , RGB (224,255,255)},
!   {"cadet blue"                , RGB ( 95,158,160)},
!   {"CadetBlue"                 , RGB ( 95,158,160)},
!   {"medium aquamarine"         , RGB (102,205,170)},
!   {"MediumAquamarine"          , RGB (102,205,170)},
!   {"aquamarine"                , RGB (127,255,212)},
!   {"dark green"                , RGB (  0,100,  0)},
!   {"DarkGreen"                 , RGB (  0,100,  0)},
!   {"dark olive green"          , RGB ( 85,107, 47)},
!   {"DarkOliveGreen"            , RGB ( 85,107, 47)},
!   {"dark sea green"            , RGB (143,188,143)},
!   {"DarkSeaGreen"              , RGB (143,188,143)},
!   {"sea green"                 , RGB ( 46,139, 87)},
!   {"SeaGreen"                  , RGB ( 46,139, 87)},
!   {"medium sea green"          , RGB ( 60,179,113)},
!   {"MediumSeaGreen"            , RGB ( 60,179,113)},
!   {"light sea green"           , RGB ( 32,178,170)},
!   {"LightSeaGreen"             , RGB ( 32,178,170)},
!   {"pale green"                , RGB (152,251,152)},
!   {"PaleGreen"                 , RGB (152,251,152)},
!   {"spring green"              , RGB (  0,255,127)},
!   {"SpringGreen"               , RGB (  0,255,127)},
!   {"lawn green"                , RGB (124,252,  0)},
!   {"LawnGreen"                 , RGB (124,252,  0)},
!   {"green"                     , RGB (  0,255,  0)},
!   {"chartreuse"                , RGB (127,255,  0)},
!   {"medium spring green"       , RGB (  0,250,154)},
!   {"MediumSpringGreen"         , RGB (  0,250,154)},
!   {"green yellow"              , RGB (173,255, 47)},
!   {"GreenYellow"               , RGB (173,255, 47)},
!   {"lime green"                , RGB ( 50,205, 50)},
!   {"LimeGreen"                 , RGB ( 50,205, 50)},
!   {"yellow green"              , RGB (154,205, 50)},
!   {"YellowGreen"               , RGB (154,205, 50)},
!   {"forest green"              , RGB ( 34,139, 34)},
!   {"ForestGreen"               , RGB ( 34,139, 34)},
!   {"olive drab"                , RGB (107,142, 35)},
!   {"OliveDrab"                 , RGB (107,142, 35)},
!   {"dark khaki"                , RGB (189,183,107)},
!   {"DarkKhaki"                 , RGB (189,183,107)},
!   {"khaki"                     , RGB (240,230,140)},
!   {"pale goldenrod"            , RGB (238,232,170)},
!   {"PaleGoldenrod"             , RGB (238,232,170)},
!   {"light goldenrod yellow"    , RGB (250,250,210)},
!   {"LightGoldenrodYellow"      , RGB (250,250,210)},
!   {"light yellow"              , RGB (255,255,224)},
!   {"LightYellow"               , RGB (255,255,224)},
!   {"yellow"                    , RGB (255,255,  0)},
!   {"gold"                      , RGB (255,215,  0)},
!   {"light goldenrod"           , RGB (238,221,130)},
!   {"LightGoldenrod"            , RGB (238,221,130)},
!   {"goldenrod"                 , RGB (218,165, 32)},
!   {"dark goldenrod"            , RGB (184,134, 11)},
!   {"DarkGoldenrod"             , RGB (184,134, 11)},
!   {"rosy brown"                , RGB (188,143,143)},
!   {"RosyBrown"                 , RGB (188,143,143)},
!   {"indian red"                , RGB (205, 92, 92)},
!   {"IndianRed"                 , RGB (205, 92, 92)},
!   {"saddle brown"              , RGB (139, 69, 19)},
!   {"SaddleBrown"               , RGB (139, 69, 19)},
!   {"sienna"                    , RGB (160, 82, 45)},
!   {"peru"                      , RGB (205,133, 63)},
!   {"burlywood"                 , RGB (222,184,135)},
!   {"beige"                     , RGB (245,245,220)},
!   {"wheat"                     , RGB (245,222,179)},
!   {"sandy brown"               , RGB (244,164, 96)},
!   {"SandyBrown"                , RGB (244,164, 96)},
!   {"tan"                       , RGB (210,180,140)},
!   {"chocolate"                 , RGB (210,105, 30)},
!   {"firebrick"                 , RGB (178,34, 34)},
!   {"brown"                     , RGB (165,42, 42)},
!   {"dark salmon"               , RGB (233,150,122)},
!   {"DarkSalmon"                , RGB (233,150,122)},
!   {"salmon"                    , RGB (250,128,114)},
!   {"light salmon"              , RGB (255,160,122)},
!   {"LightSalmon"               , RGB (255,160,122)},
!   {"orange"                    , RGB (255,165,  0)},
!   {"dark orange"               , RGB (255,140,  0)},
!   {"DarkOrange"                , RGB (255,140,  0)},
!   {"coral"                     , RGB (255,127, 80)},
!   {"light coral"               , RGB (240,128,128)},
!   {"LightCoral"                , RGB (240,128,128)},
!   {"tomato"                    , RGB (255, 99, 71)},
!   {"orange red"                , RGB (255, 69,  0)},
!   {"OrangeRed"                 , RGB (255, 69,  0)},
!   {"red"                       , RGB (255,  0,  0)},
!   {"hot pink"                  , RGB (255,105,180)},
!   {"HotPink"                   , RGB (255,105,180)},
!   {"deep pink"                 , RGB (255, 20,147)},
!   {"DeepPink"                  , RGB (255, 20,147)},
!   {"pink"                      , RGB (255,192,203)},
!   {"light pink"                , RGB (255,182,193)},
!   {"LightPink"                 , RGB (255,182,193)},
!   {"pale violet red"           , RGB (219,112,147)},
!   {"PaleVioletRed"             , RGB (219,112,147)},
!   {"maroon"                    , RGB (176, 48, 96)},
!   {"medium violet red"         , RGB (199, 21,133)},
!   {"MediumVioletRed"           , RGB (199, 21,133)},
!   {"violet red"                , RGB (208, 32,144)},
!   {"VioletRed"                 , RGB (208, 32,144)},
!   {"magenta"                   , RGB (255,  0,255)},
!   {"violet"                    , RGB (238,130,238)},
!   {"plum"                      , RGB (221,160,221)},
!   {"orchid"                    , RGB (218,112,214)},
!   {"medium orchid"             , RGB (186, 85,211)},
!   {"MediumOrchid"              , RGB (186, 85,211)},
!   {"dark orchid"               , RGB (153, 50,204)},
!   {"DarkOrchid"                , RGB (153, 50,204)},
!   {"dark violet"               , RGB (148,  0,211)},
!   {"DarkViolet"                , RGB (148,  0,211)},
!   {"blue violet"               , RGB (138, 43,226)},
!   {"BlueViolet"                , RGB (138, 43,226)},
!   {"purple"                    , RGB (160, 32,240)},
!   {"medium purple"             , RGB (147,112,219)},
!   {"MediumPurple"              , RGB (147,112,219)},
!   {"thistle"                   , RGB (216,191,216)},
!   {"gray0"                     , RGB (  0,  0,  0)},
!   {"grey0"                     , RGB (  0,  0,  0)},
!   {"dark grey"                 , RGB (169,169,169)},
!   {"DarkGrey"                  , RGB (169,169,169)},
!   {"dark gray"                 , RGB (169,169,169)},
!   {"DarkGray"                  , RGB (169,169,169)},
!   {"dark blue"                 , RGB (  0,  0,139)},
!   {"DarkBlue"                  , RGB (  0,  0,139)},
!   {"dark cyan"                 , RGB (  0,139,139)},
!   {"DarkCyan"                  , RGB (  0,139,139)},
!   {"dark magenta"              , RGB (139,  0,139)},
!   {"DarkMagenta"               , RGB (139,  0,139)},
!   {"dark red"                  , RGB (139,  0,  0)},
!   {"DarkRed"                   , RGB (139,  0,  0)},
!   {"light green"               , RGB (144,238,144)},
!   {"LightGreen"                , RGB (144,238,144)},
  };
  
--- 951,1194 ----
  colormap_t win32_color_map[] = 
  {
!   {"snow"                      , PALETTERGB (255,250,250)},
!   {"ghost white"               , PALETTERGB (248,248,255)},
!   {"GhostWhite"                , PALETTERGB (248,248,255)},
!   {"white smoke"               , PALETTERGB (245,245,245)},
!   {"WhiteSmoke"                , PALETTERGB (245,245,245)},
!   {"gainsboro"                 , PALETTERGB (220,220,220)},
!   {"floral white"              , PALETTERGB (255,250,240)},
!   {"FloralWhite"               , PALETTERGB (255,250,240)},
!   {"old lace"                  , PALETTERGB (253,245,230)},
!   {"OldLace"                   , PALETTERGB (253,245,230)},
!   {"linen"                     , PALETTERGB (250,240,230)},
!   {"antique white"             , PALETTERGB (250,235,215)},
!   {"AntiqueWhite"              , PALETTERGB (250,235,215)},
!   {"papaya whip"               , PALETTERGB (255,239,213)},
!   {"PapayaWhip"                , PALETTERGB (255,239,213)},
!   {"blanched almond"           , PALETTERGB (255,235,205)},
!   {"BlanchedAlmond"            , PALETTERGB (255,235,205)},
!   {"bisque"                    , PALETTERGB (255,228,196)},
!   {"peach puff"                , PALETTERGB (255,218,185)},
!   {"PeachPuff"                 , PALETTERGB (255,218,185)},
!   {"navajo white"              , PALETTERGB (255,222,173)},
!   {"NavajoWhite"               , PALETTERGB (255,222,173)},
!   {"moccasin"                  , PALETTERGB (255,228,181)},
!   {"cornsilk"                  , PALETTERGB (255,248,220)},
!   {"ivory"                     , PALETTERGB (255,255,240)},
!   {"lemon chiffon"             , PALETTERGB (255,250,205)},
!   {"LemonChiffon"              , PALETTERGB (255,250,205)},
!   {"seashell"                  , PALETTERGB (255,245,238)},
!   {"honeydew"                  , PALETTERGB (240,255,240)},
!   {"mint cream"                , PALETTERGB (245,255,250)},
!   {"MintCream"                 , PALETTERGB (245,255,250)},
!   {"azure"                     , PALETTERGB (240,255,255)},
!   {"alice blue"                , PALETTERGB (240,248,255)},
!   {"AliceBlue"                 , PALETTERGB (240,248,255)},
!   {"lavender"                  , PALETTERGB (230,230,250)},
!   {"lavender blush"            , PALETTERGB (255,240,245)},
!   {"LavenderBlush"             , PALETTERGB (255,240,245)},
!   {"misty rose"                , PALETTERGB (255,228,225)},
!   {"MistyRose"                 , PALETTERGB (255,228,225)},
!   {"white"                     , PALETTERGB (255,255,255)},
!   {"black"                     , PALETTERGB (  0,  0,  0)},
!   {"dark slate gray"           , PALETTERGB ( 47, 79, 79)},
!   {"DarkSlateGray"             , PALETTERGB ( 47, 79, 79)},
!   {"dark slate grey"           , PALETTERGB ( 47, 79, 79)},
!   {"DarkSlateGrey"             , PALETTERGB ( 47, 79, 79)},
!   {"dim gray"                  , PALETTERGB (105,105,105)},
!   {"DimGray"                   , PALETTERGB (105,105,105)},
!   {"dim grey"                  , PALETTERGB (105,105,105)},
!   {"DimGrey"                   , PALETTERGB (105,105,105)},
!   {"slate gray"                , PALETTERGB (112,128,144)},
!   {"SlateGray"                 , PALETTERGB (112,128,144)},
!   {"slate grey"                , PALETTERGB (112,128,144)},
!   {"SlateGrey"                 , PALETTERGB (112,128,144)},
!   {"light slate gray"          , PALETTERGB (119,136,153)},
!   {"LightSlateGray"            , PALETTERGB (119,136,153)},
!   {"light slate grey"          , PALETTERGB (119,136,153)},
!   {"LightSlateGrey"            , PALETTERGB (119,136,153)},
!   {"gray"                      , PALETTERGB (190,190,190)},
!   {"grey"                      , PALETTERGB (190,190,190)},
!   {"light grey"                , PALETTERGB (211,211,211)},
!   {"LightGrey"                 , PALETTERGB (211,211,211)},
!   {"light gray"                , PALETTERGB (211,211,211)},
!   {"LightGray"                 , PALETTERGB (211,211,211)},
!   {"midnight blue"             , PALETTERGB ( 25, 25,112)},
!   {"MidnightBlue"              , PALETTERGB ( 25, 25,112)},
!   {"navy"                      , PALETTERGB (  0,  0,128)},
!   {"navy blue"                 , PALETTERGB (  0,  0,128)},
!   {"NavyBlue"                  , PALETTERGB (  0,  0,128)},
!   {"cornflower blue"           , PALETTERGB (100,149,237)},
!   {"CornflowerBlue"            , PALETTERGB (100,149,237)},
!   {"dark slate blue"           , PALETTERGB ( 72, 61,139)},
!   {"DarkSlateBlue"             , PALETTERGB ( 72, 61,139)},
!   {"slate blue"                , PALETTERGB (106, 90,205)},
!   {"SlateBlue"                 , PALETTERGB (106, 90,205)},
!   {"medium slate blue"         , PALETTERGB (123,104,238)},
!   {"MediumSlateBlue"           , PALETTERGB (123,104,238)},
!   {"light slate blue"          , PALETTERGB (132,112,255)},
!   {"LightSlateBlue"            , PALETTERGB (132,112,255)},
!   {"medium blue"               , PALETTERGB (  0,  0,205)},
!   {"MediumBlue"                , PALETTERGB (  0,  0,205)},
!   {"royal blue"                , PALETTERGB ( 65,105,225)},
!   {"RoyalBlue"                 , PALETTERGB ( 65,105,225)},
!   {"blue"                      , PALETTERGB (  0,  0,255)},
!   {"dodger blue"               , PALETTERGB ( 30,144,255)},
!   {"DodgerBlue"                , PALETTERGB ( 30,144,255)},
!   {"deep sky blue"             , PALETTERGB (  0,191,255)},
!   {"DeepSkyBlue"               , PALETTERGB (  0,191,255)},
!   {"sky blue"                  , PALETTERGB (135,206,235)},
!   {"SkyBlue"                   , PALETTERGB (135,206,235)},
!   {"light sky blue"            , PALETTERGB (135,206,250)},
!   {"LightSkyBlue"              , PALETTERGB (135,206,250)},
!   {"steel blue"                , PALETTERGB ( 70,130,180)},
!   {"SteelBlue"                 , PALETTERGB ( 70,130,180)},
!   {"light steel blue"          , PALETTERGB (176,196,222)},
!   {"LightSteelBlue"            , PALETTERGB (176,196,222)},
!   {"light blue"                , PALETTERGB (173,216,230)},
!   {"LightBlue"                 , PALETTERGB (173,216,230)},
!   {"powder blue"               , PALETTERGB (176,224,230)},
!   {"PowderBlue"                , PALETTERGB (176,224,230)},
!   {"pale turquoise"            , PALETTERGB (175,238,238)},
!   {"PaleTurquoise"             , PALETTERGB (175,238,238)},
!   {"dark turquoise"            , PALETTERGB (  0,206,209)},
!   {"DarkTurquoise"             , PALETTERGB (  0,206,209)},
!   {"medium turquoise"          , PALETTERGB ( 72,209,204)},
!   {"MediumTurquoise"           , PALETTERGB ( 72,209,204)},
!   {"turquoise"                 , PALETTERGB ( 64,224,208)},
!   {"cyan"                      , PALETTERGB (  0,255,255)},
!   {"light cyan"                , PALETTERGB (224,255,255)},
!   {"LightCyan"                 , PALETTERGB (224,255,255)},
!   {"cadet blue"                , PALETTERGB ( 95,158,160)},
!   {"CadetBlue"                 , PALETTERGB ( 95,158,160)},
!   {"medium aquamarine"         , PALETTERGB (102,205,170)},
!   {"MediumAquamarine"          , PALETTERGB (102,205,170)},
!   {"aquamarine"                , PALETTERGB (127,255,212)},
!   {"dark green"                , PALETTERGB (  0,100,  0)},
!   {"DarkGreen"                 , PALETTERGB (  0,100,  0)},
!   {"dark olive green"          , PALETTERGB ( 85,107, 47)},
!   {"DarkOliveGreen"            , PALETTERGB ( 85,107, 47)},
!   {"dark sea green"            , PALETTERGB (143,188,143)},
!   {"DarkSeaGreen"              , PALETTERGB (143,188,143)},
!   {"sea green"                 , PALETTERGB ( 46,139, 87)},
!   {"SeaGreen"                  , PALETTERGB ( 46,139, 87)},
!   {"medium sea green"          , PALETTERGB ( 60,179,113)},
!   {"MediumSeaGreen"            , PALETTERGB ( 60,179,113)},
!   {"light sea green"           , PALETTERGB ( 32,178,170)},
!   {"LightSeaGreen"             , PALETTERGB ( 32,178,170)},
!   {"pale green"                , PALETTERGB (152,251,152)},
!   {"PaleGreen"                 , PALETTERGB (152,251,152)},
!   {"spring green"              , PALETTERGB (  0,255,127)},
!   {"SpringGreen"               , PALETTERGB (  0,255,127)},
!   {"lawn green"                , PALETTERGB (124,252,  0)},
!   {"LawnGreen"                 , PALETTERGB (124,252,  0)},
!   {"green"                     , PALETTERGB (  0,255,  0)},
!   {"chartreuse"                , PALETTERGB (127,255,  0)},
!   {"medium spring green"       , PALETTERGB (  0,250,154)},
!   {"MediumSpringGreen"         , PALETTERGB (  0,250,154)},
!   {"green yellow"              , PALETTERGB (173,255, 47)},
!   {"GreenYellow"               , PALETTERGB (173,255, 47)},
!   {"lime green"                , PALETTERGB ( 50,205, 50)},
!   {"LimeGreen"                 , PALETTERGB ( 50,205, 50)},
!   {"yellow green"              , PALETTERGB (154,205, 50)},
!   {"YellowGreen"               , PALETTERGB (154,205, 50)},
!   {"forest green"              , PALETTERGB ( 34,139, 34)},
!   {"ForestGreen"               , PALETTERGB ( 34,139, 34)},
!   {"olive drab"                , PALETTERGB (107,142, 35)},
!   {"OliveDrab"                 , PALETTERGB (107,142, 35)},
!   {"dark khaki"                , PALETTERGB (189,183,107)},
!   {"DarkKhaki"                 , PALETTERGB (189,183,107)},
!   {"khaki"                     , PALETTERGB (240,230,140)},
!   {"pale goldenrod"            , PALETTERGB (238,232,170)},
!   {"PaleGoldenrod"             , PALETTERGB (238,232,170)},
!   {"light goldenrod yellow"    , PALETTERGB (250,250,210)},
!   {"LightGoldenrodYellow"      , PALETTERGB (250,250,210)},
!   {"light yellow"              , PALETTERGB (255,255,224)},
!   {"LightYellow"               , PALETTERGB (255,255,224)},
!   {"yellow"                    , PALETTERGB (255,255,  0)},
!   {"gold"                      , PALETTERGB (255,215,  0)},
!   {"light goldenrod"           , PALETTERGB (238,221,130)},
!   {"LightGoldenrod"            , PALETTERGB (238,221,130)},
!   {"goldenrod"                 , PALETTERGB (218,165, 32)},
!   {"dark goldenrod"            , PALETTERGB (184,134, 11)},
!   {"DarkGoldenrod"             , PALETTERGB (184,134, 11)},
!   {"rosy brown"                , PALETTERGB (188,143,143)},
!   {"RosyBrown"                 , PALETTERGB (188,143,143)},
!   {"indian red"                , PALETTERGB (205, 92, 92)},
!   {"IndianRed"                 , PALETTERGB (205, 92, 92)},
!   {"saddle brown"              , PALETTERGB (139, 69, 19)},
!   {"SaddleBrown"               , PALETTERGB (139, 69, 19)},
!   {"sienna"                    , PALETTERGB (160, 82, 45)},
!   {"peru"                      , PALETTERGB (205,133, 63)},
!   {"burlywood"                 , PALETTERGB (222,184,135)},
!   {"beige"                     , PALETTERGB (245,245,220)},
!   {"wheat"                     , PALETTERGB (245,222,179)},
!   {"sandy brown"               , PALETTERGB (244,164, 96)},
!   {"SandyBrown"                , PALETTERGB (244,164, 96)},
!   {"tan"                       , PALETTERGB (210,180,140)},
!   {"chocolate"                 , PALETTERGB (210,105, 30)},
!   {"firebrick"                 , PALETTERGB (178,34, 34)},
!   {"brown"                     , PALETTERGB (165,42, 42)},
!   {"dark salmon"               , PALETTERGB (233,150,122)},
!   {"DarkSalmon"                , PALETTERGB (233,150,122)},
!   {"salmon"                    , PALETTERGB (250,128,114)},
!   {"light salmon"              , PALETTERGB (255,160,122)},
!   {"LightSalmon"               , PALETTERGB (255,160,122)},
!   {"orange"                    , PALETTERGB (255,165,  0)},
!   {"dark orange"               , PALETTERGB (255,140,  0)},
!   {"DarkOrange"                , PALETTERGB (255,140,  0)},
!   {"coral"                     , PALETTERGB (255,127, 80)},
!   {"light coral"               , PALETTERGB (240,128,128)},
!   {"LightCoral"                , PALETTERGB (240,128,128)},
!   {"tomato"                    , PALETTERGB (255, 99, 71)},
!   {"orange red"                , PALETTERGB (255, 69,  0)},
!   {"OrangeRed"                 , PALETTERGB (255, 69,  0)},
!   {"red"                       , PALETTERGB (255,  0,  0)},
!   {"hot pink"                  , PALETTERGB (255,105,180)},
!   {"HotPink"                   , PALETTERGB (255,105,180)},
!   {"deep pink"                 , PALETTERGB (255, 20,147)},
!   {"DeepPink"                  , PALETTERGB (255, 20,147)},
!   {"pink"                      , PALETTERGB (255,192,203)},
!   {"light pink"                , PALETTERGB (255,182,193)},
!   {"LightPink"                 , PALETTERGB (255,182,193)},
!   {"pale violet red"           , PALETTERGB (219,112,147)},
!   {"PaleVioletRed"             , PALETTERGB (219,112,147)},
!   {"maroon"                    , PALETTERGB (176, 48, 96)},
!   {"medium violet red"         , PALETTERGB (199, 21,133)},
!   {"MediumVioletRed"           , PALETTERGB (199, 21,133)},
!   {"violet red"                , PALETTERGB (208, 32,144)},
!   {"VioletRed"                 , PALETTERGB (208, 32,144)},
!   {"magenta"                   , PALETTERGB (255,  0,255)},
!   {"violet"                    , PALETTERGB (238,130,238)},
!   {"plum"                      , PALETTERGB (221,160,221)},
!   {"orchid"                    , PALETTERGB (218,112,214)},
!   {"medium orchid"             , PALETTERGB (186, 85,211)},
!   {"MediumOrchid"              , PALETTERGB (186, 85,211)},
!   {"dark orchid"               , PALETTERGB (153, 50,204)},
!   {"DarkOrchid"                , PALETTERGB (153, 50,204)},
!   {"dark violet"               , PALETTERGB (148,  0,211)},
!   {"DarkViolet"                , PALETTERGB (148,  0,211)},
!   {"blue violet"               , PALETTERGB (138, 43,226)},
!   {"BlueViolet"                , PALETTERGB (138, 43,226)},
!   {"purple"                    , PALETTERGB (160, 32,240)},
!   {"medium purple"             , PALETTERGB (147,112,219)},
!   {"MediumPurple"              , PALETTERGB (147,112,219)},
!   {"thistle"                   , PALETTERGB (216,191,216)},
!   {"gray0"                     , PALETTERGB (  0,  0,  0)},
!   {"grey0"                     , PALETTERGB (  0,  0,  0)},
!   {"dark grey"                 , PALETTERGB (169,169,169)},
!   {"DarkGrey"                  , PALETTERGB (169,169,169)},
!   {"dark gray"                 , PALETTERGB (169,169,169)},
!   {"DarkGray"                  , PALETTERGB (169,169,169)},
!   {"dark blue"                 , PALETTERGB (  0,  0,139)},
!   {"DarkBlue"                  , PALETTERGB (  0,  0,139)},
!   {"dark cyan"                 , PALETTERGB (  0,139,139)},
!   {"DarkCyan"                  , PALETTERGB (  0,139,139)},
!   {"dark magenta"              , PALETTERGB (139,  0,139)},
!   {"DarkMagenta"               , PALETTERGB (139,  0,139)},
!   {"dark red"                  , PALETTERGB (139,  0,  0)},
!   {"DarkRed"                   , PALETTERGB (139,  0,  0)},
!   {"light green"               , PALETTERGB (144,238,144)},
!   {"LightGreen"                , PALETTERGB (144,238,144)},
  };
  
*************** DEFUN ("win32-default-color-map", Fwin32
*** 1108,1112 ****
    return (cmap);
  }
- #endif
  
  Lisp_Object 
--- 1215,1218 ----
*************** x_to_win32_color (colorname)
*** 1161,1164 ****
--- 1267,1386 ----
  }
  
+ 
+ void
+ win32_regenerate_palette (FRAME_PTR f)
+ {
+   struct win32_palette_entry * list;
+   LOGPALETTE *          log_palette;
+   HPALETTE              new_palette;
+   int                   i;
+ 
+   /* don't bother trying to create palette if not supported */
+   if (! FRAME_WIN32_DISPLAY_INFO (f)->has_palette)
+     return;
+ 
+   log_palette = (LOGPALETTE *)
+     alloca (sizeof (LOGPALETTE) +
+ 	     FRAME_WIN32_DISPLAY_INFO (f)->num_colors * sizeof (PALETTEENTRY));
+   log_palette->palVersion = 0x300;
+   log_palette->palNumEntries = FRAME_WIN32_DISPLAY_INFO (f)->num_colors;
+ 
+   list = FRAME_WIN32_DISPLAY_INFO (f)->color_list;
+   for (i = 0;
+        i < FRAME_WIN32_DISPLAY_INFO (f)->num_colors;
+        i++, list = list->next)
+     log_palette->palPalEntry[i] = list->entry;
+ 
+   new_palette = CreatePalette (log_palette);
+ 
+   enter_crit ();
+ 
+   if (FRAME_WIN32_DISPLAY_INFO (f)->palette)
+     DeleteObject (FRAME_WIN32_DISPLAY_INFO (f)->palette);
+   FRAME_WIN32_DISPLAY_INFO (f)->palette = new_palette;
+ 
+   /* Realize display palette and garbage all frames. */
+   release_frame_dc (f, get_frame_dc (f));
+ 
+   leave_crit ();
+ }
+ 
+ #define WIN32_COLOR(pe)  RGB (pe.peRed, pe.peGreen, pe.peBlue)
+ #define SET_WIN32_COLOR(pe, color) \
+   do \
+     { \
+       pe.peRed = GetRValue (color); \
+       pe.peGreen = GetGValue (color); \
+       pe.peBlue = GetBValue (color); \
+       pe.peFlags = 0; \
+     } while (0)
+ 
+ #if 0
+ /* Keep these around in case we ever want to track color usage. */
+ void
+ win32_map_color (FRAME_PTR f, COLORREF color)
+ {
+   struct win32_palette_entry * list = FRAME_WIN32_DISPLAY_INFO (f)->color_list;
+ 
+   if (NILP (Vwin32_enable_palette))
+     return;
+ 
+   /* check if color is already mapped */
+   while (list)
+     {
+       if (WIN32_COLOR (list->entry) == color)
+         {
+ 	  ++list->refcount;
+ 	  return;
+ 	}
+       list = list->next;
+     }
+ 
+   /* not already mapped, so add to list and recreate Windows palette */
+   list = (struct win32_palette_entry *)
+     xmalloc (sizeof (struct win32_palette_entry));
+   SET_WIN32_COLOR (list->entry, color);
+   list->refcount = 1;
+   list->next = FRAME_WIN32_DISPLAY_INFO (f)->color_list;
+   FRAME_WIN32_DISPLAY_INFO (f)->color_list = list;
+   FRAME_WIN32_DISPLAY_INFO (f)->num_colors++;
+ 
+   /* set flag that palette must be regenerated */
+   FRAME_WIN32_DISPLAY_INFO (f)->regen_palette = TRUE;
+ }
+ 
+ void
+ win32_unmap_color (FRAME_PTR f, COLORREF color)
+ {
+   struct win32_palette_entry * list = FRAME_WIN32_DISPLAY_INFO (f)->color_list;
+   struct win32_palette_entry **prev = &FRAME_WIN32_DISPLAY_INFO (f)->color_list;
+ 
+   if (NILP (Vwin32_enable_palette))
+     return;
+ 
+   /* check if color is already mapped */
+   while (list)
+     {
+       if (WIN32_COLOR (list->entry) == color)
+         {
+ 	  if (--list->refcount == 0)
+ 	    {
+ 	      *prev = list->next;
+ 	      xfree (list);
+ 	      FRAME_WIN32_DISPLAY_INFO (f)->num_colors--;
+ 	      break;
+ 	    }
+ 	  else
+ 	    return;
+ 	}
+       prev = &list->next;
+       list = list->next;
+     }
+ 
+   /* set flag that palette must be regenerated */
+   FRAME_WIN32_DISPLAY_INFO (f)->regen_palette = TRUE;
+ }
+ #endif
+ 
  /* Decide if color named COLOR is valid for the display associated with
     the selected frame; if so, return the rgb values in COLOR_DEF.
*************** defined_color (f, color, color_def, allo
*** 1178,1184 ****
    if (!NILP (tem)) 
      {
!       *color_def = XUINT (tem);
        return 1;
!     } 
    else 
      {
--- 1400,1439 ----
    if (!NILP (tem)) 
      {
!       if (!NILP (Vwin32_enable_palette))
! 	{
! 	  struct win32_palette_entry * entry =
! 	    FRAME_WIN32_DISPLAY_INFO (f)->color_list;
! 	  struct win32_palette_entry ** prev =
! 	    &FRAME_WIN32_DISPLAY_INFO (f)->color_list;
!       
! 	  /* check if color is already mapped */
! 	  while (entry)
! 	    {
! 	      if (WIN32_COLOR (entry->entry) == XUINT (tem))
! 		break;
! 	      prev = &entry->next;
! 	      entry = entry->next;
! 	    }
! 
! 	  if (entry == NULL && alloc)
! 	    {
! 	      /* not already mapped, so add to list */
! 	      entry = (struct win32_palette_entry *)
! 		xmalloc (sizeof (struct win32_palette_entry));
! 	      SET_WIN32_COLOR (entry->entry, XUINT (tem));
! 	      entry->next = NULL;
! 	      *prev = entry;
! 	      FRAME_WIN32_DISPLAY_INFO (f)->num_colors++;
! 
! 	      /* set flag that palette must be regenerated */
! 	      FRAME_WIN32_DISPLAY_INFO (f)->regen_palette = TRUE;
! 	    }
! 	}
!       /* Ensure COLORREF value is snapped to nearest color in (default)
! 	 palette by simulating the PALETTERGB macro.  This works whether
! 	 or not the display device has a palette. */
!       *color_def = XUINT (tem) | 0x2000000;
        return 1;
!     }
    else 
      {
*************** x_set_foreground_color (f, arg, oldval)
*** 1234,1237 ****
--- 1489,1493 ----
    f->output_data.win32->foreground_pixel
      = x_decode_color (f, arg, BLACK_PIX_DEFAULT (f));
+ 
    if (FRAME_WIN32_WINDOW (f) != 0)
      {
*************** win32_init_class (hinst)
*** 2323,2327 ****
    WNDCLASS wc;
  
!   wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
    wc.lpfnWndProc = (WNDPROC) win32_wnd_proc;
    wc.cbClsExtra = 0;
--- 2579,2583 ----
    WNDCLASS wc;
  
!   wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = (WNDPROC) win32_wnd_proc;
    wc.cbClsExtra = 0;
*************** win32_createwindow (f)
*** 2382,2388 ****
--- 2638,2836 ----
        SetWindowLong (hwnd, WND_Y_UNITS_INDEX, f->output_data.win32->line_height);
        SetWindowLong (hwnd, WND_BACKGROUND_INDEX, f->output_data.win32->background_pixel);
+ 
+       /* Do this to discard the default setting specified by our parent. */
+       ShowWindow (hwnd, SW_HIDE);
      }
  }
  
+ /* Convert between the modifier bits Win32 uses and the modifier bits
+    Emacs uses.  */
+ unsigned int
+ win32_get_modifiers ()
+ {
+   return (((GetKeyState (VK_SHIFT)&0x8000)   ? shift_modifier  : 0) |
+ 	  ((GetKeyState (VK_CONTROL)&0x8000) ? ctrl_modifier   : 0) |
+ 	  ((GetKeyState (VK_MENU)&0x8000)    ? meta_modifier   : 0));
+ }
+ 
+ void 
+ my_post_msg (wmsg, hwnd, msg, wParam, lParam)
+      Win32Msg * wmsg;
+      HWND hwnd;
+      UINT msg;
+      WPARAM wParam;
+      LPARAM lParam;
+ {
+   wmsg->msg.hwnd = hwnd;
+   wmsg->msg.message = msg;
+   wmsg->msg.wParam = wParam;
+   wmsg->msg.lParam = lParam;
+   wmsg->msg.time = GetMessageTime ();
+ 
+   post_msg (wmsg);
+ }
+ 
+ /* GetKeyState and MapVirtualKey on Win95 do not actually distinguish
+    between left and right keys as advertised.  We test for this
+    support dynamically, and set a flag when the support is absent.  If
+    absent, we keep track of the left and right control and alt keys
+    ourselves.  This is particularly necessary on keyboards that rely
+    upon the AltGr key, which is represented as having the left control
+    and right alt keys pressed.  For these keyboards, we need to know
+    when the left alt key has been pressed in addition to the AltGr key
+    so that we can properly support M-AltGr-key sequences (such as M-@
+    on Swedish keyboards).  */
+ 
+ #define EMACS_LCONTROL 0
+ #define EMACS_RCONTROL 1
+ #define EMACS_LMENU    2
+ #define EMACS_RMENU    3
+ 
+ static int modifiers[4];
+ static int modifiers_recorded;
+ static int modifier_key_support_tested;
+ 
+ static void
+ test_modifier_support (unsigned int wparam)
+ {
+   unsigned int l, r;
+ 
+   if (wparam != VK_CONTROL && wparam != VK_MENU)
+     return;
+   if (wparam == VK_CONTROL)
+     {
+       l = VK_LCONTROL;
+       r = VK_RCONTROL;
+     }
+   else
+     {
+       l = VK_LMENU;
+       r = VK_RMENU;
+     }
+   if (!(GetKeyState (l) & 0x8000) && !(GetKeyState (r) & 0x8000))
+     modifiers_recorded = 1;
+   else
+     modifiers_recorded = 0;
+   modifier_key_support_tested = 1;
+ }
+ 
+ static void
+ record_keydown (unsigned int wparam, unsigned int lparam)
+ {
+   int i;
+ 
+   if (!modifier_key_support_tested)
+     test_modifier_support (wparam);
+ 
+   if ((wparam != VK_CONTROL && wparam != VK_MENU) || !modifiers_recorded)
+     return;
+ 
+   if (wparam == VK_CONTROL)
+     i = (lparam & 0x1000000) ? EMACS_RCONTROL : EMACS_LCONTROL;
+   else
+     i = (lparam & 0x1000000) ? EMACS_RMENU : EMACS_LMENU;
+ 
+   modifiers[i] = 1;
+ }
+ 
+ static void
+ record_keyup (unsigned int wparam, unsigned int lparam)
+ {
+   int i;
+ 
+   if ((wparam != VK_CONTROL && wparam != VK_MENU) || !modifiers_recorded)
+     return;
+ 
+   if (wparam == VK_CONTROL)
+     i = (lparam & 0x1000000) ? EMACS_RCONTROL : EMACS_LCONTROL;
+   else
+     i = (lparam & 0x1000000) ? EMACS_RMENU : EMACS_LMENU;
+ 
+   modifiers[i] = 0;
+ }
+ 
+ /* Emacs can lose focus while a modifier key has been pressed.  When
+    it regains focus, be conservative and clear all modifiers since 
+    we cannot reconstruct the left and right modifier state.  */
+ static void
+ reset_modifiers ()
+ {
+   if (!modifiers_recorded)
+     return;
+   bzero (modifiers, sizeof (modifiers));
+ }
+ 
+ static int
+ modifier_set (int vkey)
+ {
+   if (vkey == VK_CAPITAL)
+     return (GetKeyState (vkey) & 0x1);
+   if (!modifiers_recorded)
+     return (GetKeyState (vkey) & 0x8000);
+ 
+   switch (vkey)
+     {
+     case VK_LCONTROL:
+       return modifiers[EMACS_LCONTROL];
+     case VK_RCONTROL:
+       return modifiers[EMACS_RCONTROL];
+     case VK_LMENU:
+       return modifiers[EMACS_LMENU];
+     case VK_RMENU:
+       return modifiers[EMACS_RMENU];
+     default:
+       break;
+     }
+   return (GetKeyState (vkey) & 0x8000);
+ }
+ 
+ /* We map the VK_* modifiers into console modifier constants
+    so that we can use the same routines to handle both console
+    and window input.  */
+ 
+ static int
+ construct_modifiers (unsigned int wparam, unsigned int lparam)
+ {
+   int mods;
+ 
+   if (wparam != VK_CONTROL && wparam != VK_MENU)
+     mods = GetLastError ();
+ 
+   mods = 0;
+   mods |= (modifier_set (VK_SHIFT)) ? SHIFT_PRESSED : 0;
+   mods |= (modifier_set (VK_CAPITAL)) ? CAPSLOCK_ON : 0;
+   mods |= (modifier_set (VK_LCONTROL)) ? LEFT_CTRL_PRESSED : 0;
+   mods |= (modifier_set (VK_RCONTROL)) ? RIGHT_CTRL_PRESSED : 0;
+   mods |= (modifier_set (VK_LMENU)) ? LEFT_ALT_PRESSED : 0;
+   mods |= (modifier_set (VK_RMENU)) ? RIGHT_ALT_PRESSED : 0;
+ 
+   return mods;
+ }
+ 
+ static unsigned int
+ map_keypad_keys (unsigned int wparam, unsigned int lparam)
+ {
+   unsigned int extended = (lparam & 0x1000000L);
+ 
+   if (wparam < VK_CLEAR || wparam > VK_DELETE)
+     return wparam;
+ 
+   if (wparam == VK_RETURN)
+     return (extended ? VK_NUMPAD_ENTER : VK_RETURN);
+ 
+   if (wparam >= VK_PRIOR && wparam <= VK_DOWN)
+     return (!extended ? (VK_NUMPAD_PRIOR + (wparam - VK_PRIOR)) : wparam);
+ 
+   if (wparam == VK_INSERT || wparam == VK_DELETE)
+     return (!extended ? (VK_NUMPAD_INSERT + (wparam - VK_INSERT)) : wparam);
+ 
+   if (wparam == VK_CLEAR)
+     return (!extended ? VK_NUMPAD_CLEAR : wparam);
+ 
+   return wparam;
+ }
+ 
+ /* Main message dispatch loop. */
+ 
  DWORD 
  win_msg_worker (dw)
*************** win_msg_worker (dw)
*** 2427,2477 ****
  }
  
- HDC 
- map_mode (hdc)
-      HDC hdc;
- {
-   if (hdc) 
-     {
- #if 0
-       /* Make mapping mode be in 1/20 of point */
-       
-       SetMapMode (hdc, MM_ANISOTROPIC);
-       SetWindowExtEx (hdc, 1440, 1440, NULL);
-       SetViewportExtEx (hdc,
- 			GetDeviceCaps (hdc, LOGPIXELSX),
- 			GetDeviceCaps (hdc, LOGPIXELSY),
- 			NULL);
- #endif
-     }
-   return (hdc);
- }
- 
- /* Convert between the modifier bits Win32 uses and the modifier bits
-    Emacs uses.  */
- unsigned int
- win32_get_modifiers ()
- {
-   return (((GetKeyState (VK_SHIFT)&0x8000)   ? shift_modifier  : 0) |
- 	  ((GetKeyState (VK_CONTROL)&0x8000) ? ctrl_modifier   : 0) |
- 	  ((GetKeyState (VK_MENU)&0x8000)    ? meta_modifier   : 0));
- }
- 
- void 
- my_post_msg (wmsg, hwnd, msg, wParam, lParam)
-      Win32Msg * wmsg;
-      HWND hwnd;
-      UINT msg;
-      WPARAM wParam;
-      LPARAM lParam;
- {
-   wmsg->msg.hwnd = hwnd;
-   wmsg->msg.message = msg;
-   wmsg->msg.wParam = wParam;
-   wmsg->msg.lParam = lParam;
-   wmsg->msg.time = GetMessageTime ();
- 
-   post_msg (wmsg);
- }
- 
  /* Main window procedure */
  
--- 2875,2878 ----
*************** win32_wnd_proc (hwnd, msg, wParam, lPara
*** 2489,2598 ****
    struct win32_display_info *dpyinfo = &one_win32_display_info;
    Win32Msg wmsg;
!   
    switch (msg) 
      {
      case WM_ERASEBKGND:
!       {
! 	HBRUSH hb;
! 	HANDLE oldobj;
! 	RECT rect;
! 	
! 	GetClientRect (hwnd, &rect);
! 	
! 	hb = CreateSolidBrush (GetWindowLong (hwnd, WND_BACKGROUND_INDEX));
! 	
! 	oldobj = SelectObject ((HDC)wParam, hb);
! 	
! 	FillRect((HDC)wParam, &rect, hb);
! 	
! 	SelectObject((HDC)wParam, oldobj);
! 	
! 	DeleteObject (hb);
! 	
! 	return (0);
!       }
      case WM_PAINT:
        {
  	PAINTSTRUCT paintStruct;
! 		    
  	BeginPaint (hwnd, &paintStruct);
  	wmsg.rect = paintStruct.rcPaint;
  	EndPaint (hwnd, &paintStruct);
!       
  	my_post_msg (&wmsg, hwnd, msg, wParam, lParam);
        
  	return (0);
        }
-       
-     case WM_CREATE:
-       {
- 	HDC hdc = my_get_dc (hwnd);
  
! 	/* Make mapping mode be in 1/20 of point */
! 
! 	map_mode (hdc);
  
- 	ReleaseDC (hwnd, hdc);
-       }
-       
-       return (0);
      case WM_KEYDOWN:
      case WM_SYSKEYDOWN:
! #if 0
!       if (! ((wParam >= VK_BACK && wParam <= VK_TAB)
! 	     || (wParam >= VK_CLEAR && wParam <= VK_RETURN)
! 	     || (wParam == VK_ESCAPE)
! 	     || (wParam >= VK_PRIOR && wParam <= VK_HELP)
! 	     || (wParam >= VK_LWIN && wParam <= VK_APPS)
! 	     || (wParam >= VK_NUMPAD0 && wParam <= VK_F24)
! 	     || (wParam >= VK_NUMLOCK && wParam <= VK_SCROLL)
! 	     || (wParam >= VK_ATTN && wParam <= VK_OEM_CLEAR)
! 	     || !TranslateMessage (&msg1)))
! 	{
! 	  goto dflt;
! 	}
! #endif
!       
!       /* Check for special characters since translate message 
! 	 seems to always indicate true.  */
!       
!       if (wParam == VK_MENU
! 	  || wParam == VK_SHIFT
! 	  || wParam == VK_CONTROL
! 	  || wParam == VK_CAPITAL)
  	break;
!       
!       /* Anything we do not have a name for needs to be translated or 
! 	 returned as ascii keystroke.  */
!       
!       if (lispy_function_keys[wParam] == 0)
  	{
! 	  MSG msg1;
! 	    
! 	  msg1.hwnd = hwnd;
! 	  msg1.message = msg;
! 	  msg1.wParam = wParam;
! 	  msg1.lParam = lParam;
! 	    
! 	  if (TranslateMessage (&msg1))
! 	    break;
! 	  else
! 	    msg = WM_CHAR;
  	}
!       
        /* Fall through */
        
      case WM_SYSCHAR:
      case WM_CHAR:
!       wmsg.dwModifiers = win32_get_modifiers ();
!       
        my_post_msg (&wmsg, hwnd, msg, wParam, lParam);
        break;
      case WM_LBUTTONDOWN:
      case WM_LBUTTONUP:
      case WM_MBUTTONDOWN:
      case WM_MBUTTONUP:
!     case WM_RBUTTONDOWN:
!     case WM_RBUTTONUP:
        {
  	BOOL up;
--- 2890,3113 ----
    struct win32_display_info *dpyinfo = &one_win32_display_info;
    Win32Msg wmsg;
!   int windows_translate;
! 
    switch (msg) 
      {
      case WM_ERASEBKGND:
!       enter_crit ();
!       GetUpdateRect (hwnd, &wmsg.rect, FALSE);
!       leave_crit ();
!       my_post_msg (&wmsg, hwnd, msg, wParam, lParam);
!       return 1;
!     case WM_PALETTECHANGED:
!       /* ignore our own changes */
!       if ((HWND)wParam != hwnd)
!         {
! 	  /* simply notify main thread it may need to update frames */
! 	  my_post_msg (&wmsg, hwnd, msg, wParam, lParam);
! 	}
!       return 0;
      case WM_PAINT:
        {
  	PAINTSTRUCT paintStruct;
! 
! 	enter_crit ();
  	BeginPaint (hwnd, &paintStruct);
  	wmsg.rect = paintStruct.rcPaint;
  	EndPaint (hwnd, &paintStruct);
! 	leave_crit ();
! 
  	my_post_msg (&wmsg, hwnd, msg, wParam, lParam);
        
  	return (0);
        }
  
!     case WM_KEYUP:
!     case WM_SYSKEYUP:
!       record_keyup (wParam, lParam);
!       goto dflt;
  
      case WM_KEYDOWN:
      case WM_SYSKEYDOWN:
!       record_keydown (wParam, lParam);
! 
!       wParam = map_keypad_keys (wParam, lParam);
! 
!       windows_translate = 0;
!       switch (wParam) {
!       case VK_LWIN:
!       case VK_RWIN:
!       case VK_APPS:
! 	/* More support for these keys will likely be necessary.  */
! 	if (!NILP (Vwin32_pass_optional_keys_to_system))
! 	  windows_translate = 1;
  	break;
!       case VK_MENU:
! 	if (NILP (Vwin32_pass_alt_to_system)) 
! 	  return 0;
! 	windows_translate = 1;
! 	break;
!       case VK_CONTROL: 
!       case VK_CAPITAL: 
!       case VK_SHIFT:
! 	windows_translate = 1;
! 	break;
!       default:
! 	/* If not defined as a function key, change it to a WM_CHAR message. */
! 	if (lispy_function_keys[wParam] == 0)
! 	  msg = WM_CHAR;
! 	break;
!       }
! 
!       if (windows_translate)
  	{
! 	  MSG winmsg = { hwnd, msg, wParam, lParam, 0, {0,0} };
! 
! 	  winmsg.time = GetMessageTime ();
! 	  TranslateMessage (&winmsg);
! 	  goto dflt;
  	}
! 
        /* Fall through */
        
      case WM_SYSCHAR:
      case WM_CHAR:
!       wmsg.dwModifiers = construct_modifiers (wParam, lParam);
! 
!       enter_crit ();
        my_post_msg (&wmsg, hwnd, msg, wParam, lParam);
+ 
+ #if 1
+       /* Detect quit_char and set quit-flag directly.  Note that we dow
+          this *after* posting the message to ensure the main thread will
+          be woken up if blocked in sys_select(). */
+       {
+ 	int c = wParam;
+ 	if (isalpha (c) && (wmsg.dwModifiers == LEFT_CTRL_PRESSED 
+ 			    || wmsg.dwModifiers == RIGHT_CTRL_PRESSED))
+ 	  c = make_ctrl_char (c) & 0377;
+ 	if (c == quit_char)
+ 	  Vquit_flag = Qt;
+       }
+ #endif
+ 
+       leave_crit ();
        break;
+ 
+       /* Simulate middle mouse button events when left and right buttons
+ 	 are used together, but only if user has two button mouse. */
      case WM_LBUTTONDOWN:
+     case WM_RBUTTONDOWN:
+       if (XINT (Vwin32_num_mouse_buttons) == 3)
+ 	goto handle_plain_button;
+ 
+       {
+ 	int this = (msg == WM_LBUTTONDOWN) ? LMOUSE : RMOUSE;
+ 	int other = (msg == WM_LBUTTONDOWN) ? RMOUSE : LMOUSE;
+ 
+ 	if (button_state & this)
+ 	  return 0;
+ 
+ 	if (button_state == 0)
+ 	  SetCapture (hwnd);
+ 
+ 	button_state |= this;
+ 
+ 	if (button_state & other)
+ 	  {
+ 	    if (mouse_button_timer)
+ 	      {
+ 		KillTimer (hwnd, mouse_button_timer);
+ 		mouse_button_timer = 0;
+ 
+ 		/* Generate middle mouse event instead. */
+ 		msg = WM_MBUTTONDOWN;
+ 		button_state |= MMOUSE;
+ 	      }
+ 	    else if (button_state & MMOUSE)
+ 	      {
+ 		/* Ignore button event if we've already generated a
+ 		   middle mouse down event.  This happens if the
+ 		   user releases and press one of the two buttons
+ 		   after we've faked a middle mouse event. */
+ 		return 0;
+ 	      }
+ 	    else
+ 	      {
+ 		/* Flush out saved message. */
+ 		post_msg (&saved_mouse_button_msg);
+ 	      }
+ 	    wmsg.dwModifiers = win32_get_modifiers ();
+ 	    my_post_msg (&wmsg, hwnd, msg, wParam, lParam);
+ 
+ 	    /* Clear message buffer. */
+ 	    saved_mouse_button_msg.msg.hwnd = 0;
+ 	  }
+ 	else
+ 	  {
+ 	    /* Hold onto message for now. */
+ 	    mouse_button_timer =
+ 	      SetTimer (hwnd, MOUSE_BUTTON_ID, XINT (Vwin32_mouse_button_tolerance), NULL);
+ 	    saved_mouse_button_msg.msg.hwnd = hwnd;
+ 	    saved_mouse_button_msg.msg.message = msg;
+ 	    saved_mouse_button_msg.msg.wParam = wParam;
+ 	    saved_mouse_button_msg.msg.lParam = lParam;
+ 	    saved_mouse_button_msg.msg.time = GetMessageTime ();
+ 	    saved_mouse_button_msg.dwModifiers = win32_get_modifiers ();
+ 	  }
+       }
+       return 0;
+ 
      case WM_LBUTTONUP:
+     case WM_RBUTTONUP:
+       if (XINT (Vwin32_num_mouse_buttons) == 3)
+ 	goto handle_plain_button;
+ 
+       {
+ 	int this = (msg == WM_LBUTTONUP) ? LMOUSE : RMOUSE;
+ 	int other = (msg == WM_LBUTTONUP) ? RMOUSE : LMOUSE;
+ 
+ 	if ((button_state & this) == 0)
+ 	  return 0;
+ 
+ 	button_state &= ~this;
+ 
+ 	if (button_state & MMOUSE)
+ 	  {
+ 	    /* Only generate event when second button is released. */
+ 	    if ((button_state & other) == 0)
+ 	      {
+ 		msg = WM_MBUTTONUP;
+ 		button_state &= ~MMOUSE;
+ 
+ 		if (button_state) abort ();
+ 	      }
+ 	    else
+ 	      return 0;
+ 	  }
+ 	else
+ 	  {
+ 	    /* Flush out saved message if necessary. */
+ 	    if (saved_mouse_button_msg.msg.hwnd)
+ 	      {
+ 		post_msg (&saved_mouse_button_msg);
+ 	      }
+ 	  }
+ 	wmsg.dwModifiers = win32_get_modifiers ();
+ 	my_post_msg (&wmsg, hwnd, msg, wParam, lParam);
+ 
+ 	/* Always clear message buffer and cancel timer. */
+ 	saved_mouse_button_msg.msg.hwnd = 0;
+ 	KillTimer (hwnd, mouse_button_timer);
+ 	mouse_button_timer = 0;
+ 
+ 	if (button_state == 0)
+ 	  ReleaseCapture ();
+       }
+       return 0;
+ 
      case WM_MBUTTONDOWN:
      case WM_MBUTTONUP:
!     handle_plain_button:
        {
  	BOOL up;
*************** win32_wnd_proc (hwnd, msg, wParam, lPara
*** 2606,2623 ****
        
        wmsg.dwModifiers = win32_get_modifiers ();
-       
        my_post_msg (&wmsg, hwnd, msg, wParam, lParam);
!       goto dflt;
      case WM_MOUSEMOVE:
      case WM_MOVE:
      case WM_SIZE:
-     case WM_SETFOCUS:
-     case WM_KILLFOCUS:
-     case WM_CLOSE:
-     case WM_VSCROLL:
      case WM_SYSCOMMAND:
      case WM_COMMAND:
        my_post_msg (&wmsg, hwnd, msg, wParam, lParam);
        goto dflt;
      case WM_WINDOWPOSCHANGING:
        {
--- 3121,3205 ----
        
        wmsg.dwModifiers = win32_get_modifiers ();
        my_post_msg (&wmsg, hwnd, msg, wParam, lParam);
!       return 0;
! 
!     case WM_VSCROLL:
      case WM_MOUSEMOVE:
+       if (XINT (Vwin32_mouse_move_interval) <= 0
+ 	  || (msg == WM_MOUSEMOVE && button_state == 0))
+   	{
+ 	  wmsg.dwModifiers = win32_get_modifiers ();
+ 	  my_post_msg (&wmsg, hwnd, msg, wParam, lParam);
+ 	  return 0;
+   	}
+   
+       /* Hang onto mouse move and scroll messages for a bit, to avoid
+ 	 sending such events to Emacs faster than it can process them.
+ 	 If we get more events before the timer from the first message
+ 	 expires, we just replace the first message. */
+ 
+       if (saved_mouse_move_msg.msg.hwnd == 0)
+ 	mouse_move_timer =
+ 	  SetTimer (hwnd, MOUSE_MOVE_ID, XINT (Vwin32_mouse_move_interval), NULL);
+ 
+       /* Hold onto message for now. */
+       saved_mouse_move_msg.msg.hwnd = hwnd;
+       saved_mouse_move_msg.msg.message = msg;
+       saved_mouse_move_msg.msg.wParam = wParam;
+       saved_mouse_move_msg.msg.lParam = lParam;
+       saved_mouse_move_msg.msg.time = GetMessageTime ();
+       saved_mouse_move_msg.dwModifiers = win32_get_modifiers ();
+   
+       return 0;
+ 
+     case WM_TIMER:
+       /* Flush out saved messages if necessary. */
+       if (wParam == mouse_button_timer)
+ 	{
+ 	  if (saved_mouse_button_msg.msg.hwnd)
+ 	    {
+ 	      post_msg (&saved_mouse_button_msg);
+ 	      saved_mouse_button_msg.msg.hwnd = 0;
+ 	    }
+ 	  KillTimer (hwnd, mouse_button_timer);
+ 	  mouse_button_timer = 0;
+ 	}
+       else if (wParam == mouse_move_timer)
+ 	{
+ 	  if (saved_mouse_move_msg.msg.hwnd)
+ 	    {
+ 	      post_msg (&saved_mouse_move_msg);
+ 	      saved_mouse_move_msg.msg.hwnd = 0;
+ 	    }
+ 	  KillTimer (hwnd, mouse_move_timer);
+ 	  mouse_move_timer = 0;
+ 	}
+       return 0;
+   
+     case WM_NCACTIVATE:
+       /* Windows doesn't send us focus messages when putting up and
+ 	 taking down a system popup dialog as for Ctrl-Alt-Del on Win95.
+ 	 The only indication we get that something happened is receiving
+ 	 this message afterwards.  So this is a good time to reset our
+ 	 keyboard modifiers' state. */
+       reset_modifiers ();
+       goto dflt;
+ 
+     case WM_KILLFOCUS:
+     case WM_SETFOCUS:
+       reset_modifiers ();
      case WM_MOVE:
      case WM_SIZE:
      case WM_SYSCOMMAND:
      case WM_COMMAND:
+       wmsg.dwModifiers = win32_get_modifiers ();
        my_post_msg (&wmsg, hwnd, msg, wParam, lParam);
        goto dflt;
+ 
+     case WM_CLOSE:
+       wmsg.dwModifiers = win32_get_modifiers ();
+       my_post_msg (&wmsg, hwnd, msg, wParam, lParam);
+       return 0;
+ 
      case WM_WINDOWPOSCHANGING:
        {
*************** win32_wnd_proc (hwnd, msg, wParam, lPara
*** 2636,2639 ****
--- 3218,3222 ----
  	    RECT wr;
  	    
+ 	    wp.length = sizeof(wp);
  	    GetWindowRect (hwnd, &wr);
  	    
*************** win32_wnd_proc (hwnd, msg, wParam, lPara
*** 2685,2688 ****
--- 3268,3279 ----
        
        goto dflt;
+     case WM_EMACS_SHOWWINDOW:
+       return ShowWindow (hwnd, wParam);
+     case WM_EMACS_SETWINDOWPOS:
+       {
+ 	Win32WindowPos * pos = (Win32WindowPos *) wParam;
+ 	return SetWindowPos (hwnd, pos->hwndAfter,
+ 			     pos->x, pos->y, pos->cx, pos->cy, pos->flags);
+       }
      case WM_EMACS_DESTROYWINDOW:
        DestroyWindow ((HWND) wParam);
*************** This function is an internal primitive--
*** 2858,2861 ****
--- 3449,3454 ----
    /* Note that Windows does support scroll bars.  */
    FRAME_CAN_HAVE_SCROLL_BARS (f) = 1;
+   /* By default, make scrollbars the system standard width. */
+   f->scroll_bar_pixel_width = GetSystemMetrics (SM_CXVSCROLL);
  
    XSETFRAME (frame, f);
*************** This function is an internal primitive--
*** 2929,2933 ****
  #endif
      if (! STRINGP (font))
!       font = x_new_font (f, "-*-terminal-medium-r-normal-*-*-180-*-*-c-120-*-*");
      UNBLOCK_INPUT;
      if (! STRINGP (font))
--- 3522,3526 ----
  #endif
      if (! STRINGP (font))
!       font = x_new_font (f, "-*-Fixedsys-*-r-*-*-12-90-*-*-c-*-*-*");
      UNBLOCK_INPUT;
      if (! STRINGP (font))
*************** x_get_focus_frame (frame)
*** 3081,3122 ****
  
  DEFUN ("focus-frame", Ffocus_frame, Sfocus_frame, 1, 1, 0,
!   "Set the focus on FRAME.")
    (frame)
       Lisp_Object frame;
  {
-   CHECK_LIVE_FRAME (frame, 0);
- 
-   if (FRAME_WIN32_P (XFRAME (frame)))
-     {
-       BLOCK_INPUT;
-       x_focus_on_frame (XFRAME (frame));
-       UNBLOCK_INPUT;
-       return frame;
-     }
- 
    return Qnil;
  }
  
  DEFUN ("unfocus-frame", Funfocus_frame, Sunfocus_frame, 0, 0, 0,
!        "If a frame has been focused, release it.")
!      ()
  {
-   if (FRAME_WIN32_P (selected_frame))
-     {
-       struct win32_display_info *dpyinfo = FRAME_WIN32_DISPLAY_INFO (selected_frame);
- 
-       if (dpyinfo->win32_focus_frame)
- 	{
- 	  BLOCK_INPUT;
- 	  x_unfocus_frame (dpyinfo->win32_focus_frame);
- 	  UNBLOCK_INPUT;
- 	}
-     }
-   
    return Qnil;
  }
  
! XFontStruct 
! *win32_load_font (dpyinfo,name)
  struct win32_display_info *dpyinfo;
  char * name;
--- 3674,3693 ----
  
  DEFUN ("focus-frame", Ffocus_frame, Sfocus_frame, 1, 1, 0,
!   "This function is obsolete, and does nothing.")
    (frame)
       Lisp_Object frame;
  {
    return Qnil;
  }
  
  DEFUN ("unfocus-frame", Funfocus_frame, Sunfocus_frame, 0, 0, 0,
!   "This function is obsolete, and does nothing.")
!   ()
  {
    return Qnil;
  }
  
! XFontStruct *
! win32_load_font (dpyinfo,name)
  struct win32_display_info *dpyinfo;
  char * name;
*************** char * name;
*** 3124,3168 ****
    XFontStruct * font = NULL;
    BOOL ok;
!   
    {
      LOGFONT lf;
! 	
!     if (!name || !x_to_win32_font(name, &lf)) 
        return (NULL);
! 	
      font = (XFontStruct *) xmalloc (sizeof (XFontStruct));
! 	
      if (!font) return (NULL);
! 	
      BLOCK_INPUT;
! 	
!     font->hfont = CreateFontIndirect(&lf);
    }
-   
-     if (font->hfont == NULL) 
-       {
- 	ok = FALSE;
-       } 
-     else 
-       {
- 	HDC hdc;
- 	HANDLE oldobj;
  
! 	hdc = my_get_dc (dpyinfo->root_window);
! 	
! 	oldobj = SelectObject (hdc, font->hfont);
! 	
! 	ok = GetTextMetrics (hdc, &font->tm);
! 	
! 	SelectObject (hdc, oldobj);
! 	
! 	ReleaseDC (dpyinfo->root_window, hdc);
!       }
!   
    UNBLOCK_INPUT;
!   
    if (ok) return (font);
!   
!   win32_unload_font(dpyinfo, font);
    return (NULL);
  }
--- 3695,3735 ----
    XFontStruct * font = NULL;
    BOOL ok;
! 
    {
      LOGFONT lf;
! 
!     if (!name || !x_to_win32_font (name, &lf))
        return (NULL);
! 
      font = (XFontStruct *) xmalloc (sizeof (XFontStruct));
! 
      if (!font) return (NULL);
! 
      BLOCK_INPUT;
! 
!     font->hfont = CreateFontIndirect (&lf);
    }
  
!   if (font->hfont == NULL) 
!     {
!       ok = FALSE;
!     } 
!   else 
!     {
!       HDC hdc;
!       HANDLE oldobj;
! 
!       hdc = GetDC (dpyinfo->root_window);
!       oldobj = SelectObject (hdc, font->hfont);
!       ok = GetTextMetrics (hdc, &font->tm);
!       SelectObject (hdc, oldobj);
!       ReleaseDC (dpyinfo->root_window, hdc);
!     }
! 
    UNBLOCK_INPUT;
! 
    if (ok) return (font);
! 
!   win32_unload_font (dpyinfo, font);
    return (NULL);
  }
*************** x_to_win32_weight (lpw)
*** 3259,3287 ****
  {
    if (!lpw) return (FW_DONTCARE);
!   
!   if (stricmp (lpw, "bold") == 0)
!     return (FW_BOLD);
!   else if (stricmp (lpw, "demibold") == 0)
!     return (FW_SEMIBOLD);
!   else if (stricmp (lpw, "medium") == 0)
!     return (FW_MEDIUM);
!   else if (stricmp (lpw, "normal") == 0)
!     return (FW_NORMAL);
    else
!     return (FW_DONTCARE);
  }
  
  char * 
  win32_to_x_weight (fnweight)
       int fnweight;
  {
!   if (fnweight >= FW_BOLD) 
!     return ("bold");
!   else if (fnweight >= FW_SEMIBOLD) 
!     return ("demibold");
!   else if (fnweight >= FW_MEDIUM) 
!     return ("medium");
!   else  
!     return ("normal");
  }
  
--- 3826,3893 ----
  {
    if (!lpw) return (FW_DONTCARE);
! 
!   if (stricmp (lpw,"heavy") == 0)             return FW_HEAVY;
!   else if (stricmp (lpw,"extrabold") == 0)    return FW_EXTRABOLD;
!   else if (stricmp (lpw,"bold") == 0)         return FW_BOLD;
!   else if (stricmp (lpw,"demibold") == 0)     return FW_SEMIBOLD;
!   else if (stricmp (lpw,"medium") == 0)       return FW_MEDIUM;
!   else if (stricmp (lpw,"normal") == 0)       return FW_NORMAL;
!   else if (stricmp (lpw,"light") == 0)        return FW_LIGHT;
!   else if (stricmp (lpw,"extralight") == 0)   return FW_EXTRALIGHT;
!   else if (stricmp (lpw,"thin") == 0)         return FW_THIN;
    else
!     return FW_DONTCARE;
  }
  
+ 
  char * 
  win32_to_x_weight (fnweight)
       int fnweight;
  {
!   if (fnweight >= FW_HEAVY)      return "heavy";
!   if (fnweight >= FW_EXTRABOLD)  return "extrabold";
!   if (fnweight >= FW_BOLD)       return "bold";
!   if (fnweight >= FW_SEMIBOLD)   return "semibold";
!   if (fnweight >= FW_MEDIUM)     return "medium";
!   if (fnweight >= FW_NORMAL)     return "normal";
!   if (fnweight >= FW_LIGHT)      return "light";
!   if (fnweight >= FW_EXTRALIGHT) return "extralight";
!   if (fnweight >= FW_THIN)       return "thin";
!   else
!     return "*";
! }
! 
! LONG
! x_to_win32_charset (lpcs)
!     char * lpcs;
! {
!   if (!lpcs) return (0);
! 
!   if (stricmp (lpcs,"ansi") == 0)               return ANSI_CHARSET;
!   else if (stricmp (lpcs,"iso8859-1") == 0)     return ANSI_CHARSET;
!   else if (stricmp (lpcs,"iso8859") == 0)       return ANSI_CHARSET;
!   else if (stricmp (lpcs,"oem") == 0)	        return OEM_CHARSET;
! #ifdef UNICODE_CHARSET
!   else if (stricmp (lpcs,"unicode") == 0)       return UNICODE_CHARSET;
!   else if (stricmp (lpcs,"iso10646") == 0)      return UNICODE_CHARSET;
! #endif
!   else
!     return 0;
! }
! 
! char *
! win32_to_x_charset (fncharset)
!     int fncharset;
! {
!   switch (fncharset)
!     {
!     case ANSI_CHARSET:     return "ansi";
!     case OEM_CHARSET:      return "oem";
!     case SYMBOL_CHARSET:   return "symbol";
! #ifdef UNICODE_CHARSET
!     case UNICODE_CHARSET:  return "unicode";
! #endif
!     }
!   return "*";
  }
  
*************** win32_to_x_font (lplogfont, lpxstr, len)
*** 3292,3319 ****
       int len;
  {
!   if (!lpxstr) return (FALSE);
  
!   if (lplogfont) 
      {
!       int height = (lplogfont->lfHeight * 1440) 
! 	/ one_win32_display_info.height_in;
!       int width = (lplogfont->lfWidth * 1440) 
! 	/ one_win32_display_info.width_in;
! 
!       height = abs (height);
!       _snprintf (lpxstr, len - 1,
! 		 "-*-%s-%s-%c-%s-%s-*-%d-*-*-%c-%d-*-*-",
! 		 lplogfont->lfFaceName,
! 		 win32_to_x_weight (lplogfont->lfWeight),
! 		 lplogfont->lfItalic ? 'i' : 'r',
! 		 "*", "*", 
! 		 height,
! 		 ((lplogfont->lfPitchAndFamily & 0x3) == VARIABLE_PITCH) ? 'p' : 'c',
! 		 width);
!     } 
!   else 
      {
!       strncpy (lpxstr, "-*-*-*-*-*-*-*-*-*-*-*-*-*-*-", len - 1);
      }
  
    lpxstr[len - 1] = 0;		/* just to be sure */
--- 3898,3937 ----
       int len;
  {
!   char height_pixels[8];
!   char height_dpi[8];
!   char width_pixels[8];
! 
!   if (!lpxstr) abort ();
  
!   if (!lplogfont)
!     return FALSE;
! 
!   if (lplogfont->lfHeight)
      {
!       sprintf (height_pixels, "%u", abs (lplogfont->lfHeight));
!       sprintf (height_dpi, "%u",
! 	       (abs (lplogfont->lfHeight) * 720) / one_win32_display_info.height_in);
!     }
!   else
      {
!       strcpy (height_pixels, "*");
!       strcpy (height_dpi, "*");
      }
+   if (lplogfont->lfWidth)
+     sprintf (width_pixels, "%u", lplogfont->lfWidth * 10);
+   else
+     strcpy (width_pixels, "*");
+ 
+   _snprintf (lpxstr, len - 1,
+ 	     "-*-%s-%s-%c-*-*-%s-%s-*-*-%c-%s-*-%s-",
+ 	     lplogfont->lfFaceName,
+ 	     win32_to_x_weight (lplogfont->lfWeight),
+ 	     lplogfont->lfItalic?'i':'r',
+ 	     height_pixels,
+ 	     height_dpi,
+ 	     ((lplogfont->lfPitchAndFamily & 0x3) == VARIABLE_PITCH) ? 'p' : 'c',
+ 	     width_pixels,
+ 	     win32_to_x_charset (lplogfont->lfCharSet)
+ 	     );
  
    lpxstr[len - 1] = 0;		/* just to be sure */
*************** x_to_win32_font (lpxstr, lplogfont)
*** 3329,3383 ****
    
    memset (lplogfont, 0, sizeof (*lplogfont));
!   
!   lplogfont->lfCharSet = OEM_CHARSET;
    lplogfont->lfOutPrecision = OUT_DEFAULT_PRECIS;
    lplogfont->lfClipPrecision = CLIP_DEFAULT_PRECIS;
    lplogfont->lfQuality = DEFAULT_QUALITY;
    
!   if (lpxstr && *lpxstr == '-') lpxstr++;
!   
!   {
!     int fields;
!     char name[50], weight[20], slant, pitch, height[10], width[10];
!     
!     fields = (lpxstr
! 	      ? sscanf (lpxstr, 
! 			"%*[^-]-%[^-]-%[^-]-%c-%*[^-]-%*[^-]-%*[^-]-%[^-]-%*[^-]-%*[^-]-%c-%[^-]",
! 			name, weight, &slant, height, &pitch, width)
! 	      : 0);
!     
!     if (fields == EOF) return (FALSE);
!     
!     if (fields > 0 && name[0] != '*') 
!       {
! 	strncpy (lplogfont->lfFaceName, name, LF_FACESIZE);
!       } 
!     else 
        {
! 	lplogfont->lfFaceName[0] = 0;
        }
!     
!     fields--;
!     
!     lplogfont->lfWeight = x_to_win32_weight((fields > 0 ? weight : ""));
!     
!     fields--;
!     
!     lplogfont->lfItalic = (fields > 0 && slant == 'i');
!     
!     fields--;
!     
!     if (fields > 0 && height[0] != '*')
!       lplogfont->lfHeight = (atoi (height) * one_win32_display_info.height_in) / 1440;
!     
!     fields--;
!     
!     lplogfont->lfPitchAndFamily = (fields > 0 && pitch == 'p') ? VARIABLE_PITCH : FIXED_PITCH;
!     
!     fields--;
!     
!     if (fields > 0 && width[0] != '*')
!       lplogfont->lfWidth = (atoi (width) * one_win32_display_info.width_in) / 1440;
!   }
    
    return (TRUE);
--- 3947,4076 ----
    
    memset (lplogfont, 0, sizeof (*lplogfont));
! 
! #if 0
    lplogfont->lfOutPrecision = OUT_DEFAULT_PRECIS;
    lplogfont->lfClipPrecision = CLIP_DEFAULT_PRECIS;
    lplogfont->lfQuality = DEFAULT_QUALITY;
+ #else
+   /* go for maximum quality */
+   lplogfont->lfOutPrecision = OUT_STROKE_PRECIS;
+   lplogfont->lfClipPrecision = CLIP_STROKE_PRECIS;
+   lplogfont->lfQuality = PROOF_QUALITY;
+ #endif
+ 
+   if (!lpxstr)
+     return FALSE;
+ 
+   /* Provide a simple escape mechanism for specifying Windows font names
+    * directly -- if font spec does not beginning with '-', assume this
+    * format:
+    *   "<font name>[:height in pixels[:width in pixels[:weight]]]"
+    */
    
!   if (*lpxstr == '-')
!     {
!       int fields;
!       char name[50], weight[20], slant, pitch, pixels[10], height[10], width[10], remainder[20];
!       char * encoding;
! 
!       fields = sscanf (lpxstr,
! 		       "-%*[^-]-%49[^-]-%19[^-]-%c-%*[^-]-%*[^-]-%9[^-]-%9[^-]-%*[^-]-%*[^-]-%c-%9[^-]-%19s",
! 		       name, weight, &slant, pixels, height, &pitch, width, remainder);
! 
!       if (fields == EOF) return (FALSE);
! 
!       if (fields > 0 && name[0] != '*')
!         {
! 	  strncpy (lplogfont->lfFaceName,name, LF_FACESIZE);
! 	  lplogfont->lfFaceName[LF_FACESIZE-1] = 0;
! 	}
!       else
!         {
! 	  lplogfont->lfFaceName[0] = 0;
! 	}
! 
!       fields--;
! 
!       lplogfont->lfWeight = x_to_win32_weight ((fields > 0 ? weight : ""));
! 
!       fields--;
! 
!       if (!NILP (Vwin32_enable_italics))
! 	lplogfont->lfItalic = (fields > 0 && slant == 'i');
! 
!       fields--;
! 
!       if (fields > 0 && pixels[0] != '*')
! 	lplogfont->lfHeight = atoi (pixels);
! 
!       fields--;
! 
!       if (fields > 0 && lplogfont->lfHeight == 0 && height[0] != '*')
! 	lplogfont->lfHeight = (atoi (height)
! 			       * one_win32_display_info.height_in) / 720;
! 
!       fields--;
! 
!       lplogfont->lfPitchAndFamily =
! 	(fields > 0 && pitch == 'p') ? VARIABLE_PITCH : FIXED_PITCH;
! 
!       fields--;
! 
!       if (fields > 0 && width[0] != '*')
! 	lplogfont->lfWidth = atoi (width) / 10;
! 
!       fields--;
! 
!       /* Not all font specs include the registry field, so we allow for an
! 	 optional registry field before the encoding when parsing
! 	 remainder.  Also we strip the trailing '-' if present. */
        {
! 	int len = strlen (remainder);
! 	if (len > 0 && remainder[len-1] == '-')
! 	  remainder[len-1] = 0;
        }
!       encoding = remainder;
!       if (strncmp (encoding, "*-", 2) == 0)
! 	encoding += 2;
!       lplogfont->lfCharSet = x_to_win32_charset (fields > 0 ? encoding : "");
!     }
!   else
!     {
!       int fields;
!       char name[100], height[10], width[10], weight[20];
! 
!       fields = sscanf (lpxstr,
! 		       "%99[^:]:%9[^:]:%9[^:]:%19s",
! 		       name, height, width, weight);
! 
!       if (fields == EOF) return (FALSE);
! 
!       if (fields > 0)
!         {
! 	  strncpy (lplogfont->lfFaceName,name, LF_FACESIZE);
! 	  lplogfont->lfFaceName[LF_FACESIZE-1] = 0;
! 	}
!       else
!         {
! 	  lplogfont->lfFaceName[0] = 0;
! 	}
! 
!       fields--;
! 
!       if (fields > 0)
! 	lplogfont->lfHeight = atoi (height);
! 
!       fields--;
! 
!       if (fields > 0)
! 	lplogfont->lfWidth = atoi (width);
! 
!       fields--;
! 
!       lplogfont->lfWeight = x_to_win32_weight ((fields > 0 ? weight : ""));
!     }
! 
!   /* This makes TrueType fonts work better. */
!   lplogfont->lfHeight = - abs (lplogfont->lfHeight);
    
    return (TRUE);
*************** typedef struct enumfont_t 
*** 3422,3425 ****
--- 4115,4119 ----
    HDC hdc;
    int numFonts;
+   LOGFONT logfont;
    XFontStruct *size_ref;
    Lisp_Object *pattern;
*************** enum_font_cb2 (lplf, lptm, FontType, lpe
*** 3443,3446 ****
--- 4137,4146 ----
      char buf[100];
  
+     if (!NILP (*(lpef->pattern)) && FontType == TRUETYPE_FONTTYPE)
+       {
+ 	lplf->elfLogFont.lfHeight = lpef->logfont.lfHeight;
+ 	lplf->elfLogFont.lfWidth = lpef->logfont.lfWidth;
+       }
+ 
      if (!win32_to_x_font (lplf, buf, 100)) return (0);
  
*************** even if they match PATTERN and FACE.")
*** 3571,3577 ****
    ef.tail = ef.head = &namelist;
    ef.numFonts = 0;
  
    {
!     ef.hdc = my_get_dc (FRAME_WIN32_WINDOW (f));
  
      EnumFontFamilies (ef.hdc, NULL, (FONTENUMPROC) enum_font_cb1, (LPARAM)&ef);
--- 4271,4278 ----
    ef.tail = ef.head = &namelist;
    ef.numFonts = 0;
+   x_to_win32_font (STRINGP (pattern) ? XSTRING (pattern)->data : NULL, &ef.logfont);
  
    {
!     ef.hdc = GetDC (FRAME_WIN32_WINDOW (f));
  
      EnumFontFamilies (ef.hdc, NULL, (FONTENUMPROC) enum_font_cb1, (LPARAM)&ef);
*************** If omitted or nil, that stands for the s
*** 3759,3765 ****
    int cap;
  
!   hdc = my_get_dc (dpyinfo->root_window);
!   
!   cap = GetDeviceCaps (hdc,NUMCOLORS);
    
    ReleaseDC (dpyinfo->root_window, hdc);
--- 4460,4468 ----
    int cap;
  
!   hdc = GetDC (dpyinfo->root_window);
!   if (dpyinfo->has_palette)
!     cap = GetDeviceCaps (hdc,SIZEPALETTE);
!   else
!     cap = GetDeviceCaps (hdc,NUMCOLORS);
    
    ReleaseDC (dpyinfo->root_window, hdc);
*************** If omitted or nil, that stands for the s
*** 3840,3844 ****
    int cap;
  
!   hdc = my_get_dc (dpyinfo->root_window);
    
    cap = GetDeviceCaps (hdc, VERTSIZE);
--- 4543,4547 ----
    int cap;
  
!   hdc = GetDC (dpyinfo->root_window);
    
    cap = GetDeviceCaps (hdc, VERTSIZE);
*************** If omitted or nil, that stands for the s
*** 3862,3866 ****
    int cap;
  
!   hdc = my_get_dc (dpyinfo->root_window);
    
    cap = GetDeviceCaps (hdc, HORZSIZE);
--- 4565,4569 ----
    int cap;
  
!   hdc = GetDC (dpyinfo->root_window);
    
    cap = GetDeviceCaps (hdc, HORZSIZE);
*************** terminate Emacs if we can't open the con
*** 4019,4023 ****
      CHECK_STRING (xrm_string, 1);
  
!   Vwin32_color_map = Fwin32_default_color_map ();
  
    if (! NILP (xrm_string))
--- 4722,4746 ----
      CHECK_STRING (xrm_string, 1);
  
!   /* Allow color mapping to be defined externally; first look in user's
!      HOME directory, then in Emacs etc dir for a file called rgb.txt. */
!   {
!     Lisp_Object color_file;
!     struct gcpro gcpro1;
! 
!     color_file = build_string("~/rgb.txt");
! 
!     GCPRO1 (color_file);
! 
!     if (NILP (Ffile_readable_p (color_file)))
!       color_file =
! 	Fexpand_file_name (build_string ("rgb.txt"),
! 			   Fsymbol_value (intern ("data-directory")));
! 
!     Vwin32_color_map = Fwin32_load_color_file (color_file);
! 
!     UNGCPRO;
!   }
!   if (NILP (Vwin32_color_map))
!     Vwin32_color_map = Fwin32_default_color_map ();
  
    if (! NILP (xrm_string))
*************** terminate Emacs if we can't open the con
*** 4027,4030 ****
--- 4750,4762 ----
  
    /* Use this general default value to start with.  */
+   /* First remove .exe suffix from invocation-name - it looks ugly. */
+   {
+     char basename[ MAX_PATH ], *str;
+ 
+     strcpy (basename, XSTRING (Vinvocation_name)->data);
+     str = strrchr (basename, '.');
+     if (str) *str = 0;
+     Vinvocation_name = build_string (basename);
+   }
    Vx_resource_name = Vinvocation_name;
  
*************** syms_of_win32fns ()
*** 4219,4222 ****
--- 4951,4991 ----
    Vwin32_color_map = Qnil;
  
+   DEFVAR_LISP ("win32-pass-alt-to-system", &Vwin32_pass_alt_to_system,
+ 	       "Non-nil if alt key presses are passed on to Windows.\n\
+ When non-nil, for example, alt pressed and released and then space will\n\
+ open the System menu.  When nil, Emacs silently swallows alt key events.");
+   Vwin32_pass_alt_to_system = Qnil;
+ 
+   DEFVAR_LISP ("win32-pass-optional-keys-to-system", 
+ 	       &Vwin32_pass_optional_keys_to_system,
+ 	       "Non-nil if the 'optional' keys (left window, right window,\n\
+ and application keys) are passed on to Windows.");
+   Vwin32_pass_optional_keys_to_system = Qnil;
+ 
+   DEFVAR_LISP ("win32-enable-italics", &Vwin32_enable_italics,
+ 	       "Non-nil enables selection of artificially italicized fonts.");
+   Vwin32_enable_italics = Qnil;
+ 
+   DEFVAR_LISP ("win32-enable-palette", &Vwin32_enable_palette,
+ 	       "Non-nil enables Windows palette management to map colors exactly.");
+   Vwin32_enable_palette = Qt;
+ 
+   DEFVAR_INT ("win32-mouse-button-tolerance",
+ 	      &Vwin32_mouse_button_tolerance,
+ 	      "Analogue of double click interval for faking middle mouse events.\n\
+ The value is the minimum time in milliseconds that must elapse between\n\
+ left/right button down events before they are considered distinct events.\n\
+ If both mouse buttons are depressed within this interval, a middle mouse\n\
+ button down event is generated instead.");
+   XSETINT (Vwin32_mouse_button_tolerance, GetDoubleClickTime () / 2);
+ 
+   DEFVAR_INT ("win32-mouse-move-interval",
+ 	      &Vwin32_mouse_move_interval,
+ 	      "Minimum interval between mouse move events.\n\
+ The value is the minimum time in milliseconds that must elapse between\n\
+ successive mouse move (or scroll bar drag) events before they are\n\
+ reported as lisp events.");
+   XSETINT (Vwin32_mouse_move_interval, 50);
+ 
    init_x_parm_symbols ();
  
*************** unless you set it to something else.");
*** 4294,4297 ****
--- 5063,5069 ----
  
    defsubr (&Swin32_select_font);
+   defsubr (&Swin32_define_rgb_color);
+   defsubr (&Swin32_default_color_map);
+   defsubr (&Swin32_load_color_file);
  }
  
*************** void 
*** 4301,4308 ****
  win32_abort()
  {
!     MessageBox (NULL,
! 		"A fatal error has occurred - aborting!",
! 		"Emacs Abort Dialog",
! 		MB_OK|MB_ICONEXCLAMATION);
!     abort();
  }
--- 5073,5095 ----
  win32_abort()
  {
!   int button;
!   button = MessageBox (NULL,
! 		       "A fatal error has occurred!\n\n"
! 		       "Select Abort to exit, Retry to debug, Ignore to continue",
! 		       "Emacs Abort Dialog",
! 		       MB_ICONEXCLAMATION | MB_TASKMODAL
! 		       | MB_SETFOREGROUND | MB_ABORTRETRYIGNORE);
!   switch (button)
!     {
!     case IDRETRY:
!       DebugBreak ();
!       break;
!     case IDIGNORE:
!       break;
!     case IDABORT:
!     default:
!       abort ();
!       break;
!     }
  }
+ 
diff -2rcpP --exclude=*.elc emacs-19.30/src/w32menu.c emacs-19.31/src/w32menu.c
*** emacs-19.30/src/w32menu.c	Tue Nov  7 02:38:45 1995
--- emacs-19.31/src/w32menu.c	Tue May 21 14:09:46 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  /* Written by Kevin Gallo.  */
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* Written by Kevin Gallo.  */
*************** the Free Software Foundation, 675 Mass A
*** 30,33 ****
--- 31,35 ----
  #include "keyboard.h"
  #include "blockinput.h"
+ #include "buffer.h"
  
  /* This may include sys/types.h, and that somehow loses
*************** typedef struct menu_map 
*** 53,59 ****
--- 55,70 ----
  } menu_map;
  
+ Lisp_Object Qdebug_on_next_call;
+ 
  extern Lisp_Object Qmenu_enable;
  extern Lisp_Object Qmenu_bar;
  
+ extern Lisp_Object Voverriding_local_map;
+ extern Lisp_Object Voverriding_local_map_menu_flag;
+ 
+ extern Lisp_Object Qoverriding_local_map, Qoverriding_terminal_local_map;
+ 
+ extern Lisp_Object Qmenu_bar_update_hook;
+ 
  static Lisp_Object win32_dialog_show ();
  static Lisp_Object win32menu_show ();
*************** single_keymap_panes (lpmm, keymap, pane_
*** 587,591 ****
  }
  
! /* Push all the panes and items of a menu decsribed by the
     alist-of-alists MENU.
     This handles old-fashioned calls to x-popup-menu.  */
--- 598,602 ----
  }
  
! /* Push all the panes and items of a menu described by the
     alist-of-alists MENU.
     This handles old-fashioned calls to x-popup-menu.  */
*************** get_list_of_items_event (pane, lpnum)
*** 1012,1016 ****
  }
  
! /* Push all the panes and items of a menu decsribed by the
     alist-of-alists MENU.
     This handles old-fashioned calls to x-popup-menu.  */
--- 1023,1027 ----
  }
  
! /* Push all the panes and items of a menu described by the
     alist-of-alists MENU.
     This handles old-fashioned calls to x-popup-menu.  */
*************** get_frame_menubar_event (f, num)
*** 1354,1358 ****
      items = FRAME_MENU_BAR_ITEMS (f) = menu_bar_items (FRAME_MENU_BAR_ITEMS (f));
    
!   for (i = 0; i < XVECTOR (items)->size; i += 3)
      {
        Lisp_Object event;
--- 1365,1369 ----
      items = FRAME_MENU_BAR_ITEMS (f) = menu_bar_items (FRAME_MENU_BAR_ITEMS (f));
    
!   for (i = 0; i < XVECTOR (items)->size; i += 4)
      {
        Lisp_Object event;
*************** set_frame_menubar (f, first_time)
*** 1384,1387 ****
--- 1395,1425 ----
    struct gcpro gcpro1;
    menu_map mm;
+   int count = specpdl_ptr - specpdl;
+ 
+   struct buffer *prev = current_buffer;
+   Lisp_Object buffer;
+ 
+   buffer = XWINDOW (FRAME_SELECTED_WINDOW (f))->buffer;
+   specbind (Qinhibit_quit, Qt);
+   /* Don't let the debugger step into this code
+      because it is not reentrant.  */
+   specbind (Qdebug_on_next_call, Qnil);
+ 
+   record_unwind_protect (Fstore_match_data, Fmatch_data ());
+   if (NILP (Voverriding_local_map_menu_flag))
+     {
+       specbind (Qoverriding_terminal_local_map, Qnil);
+       specbind (Qoverriding_local_map, Qnil);
+     }
+ 
+   set_buffer_internal_1 (XBUFFER (buffer));
+ 
+   /* Run the Lucid hook.  */
+   call1 (Vrun_hooks, Qactivate_menubar_hook);
+   /* If it has changed current-menubar from previous value,
+      really recompute the menubar from the value.  */
+   if (! NILP (Vlucid_menu_bar_dirty_flag))
+     call0 (Qrecompute_lucid_menubar);
+   safe_run_hooks (Qmenu_bar_update_hook);
    
    BLOCK_INPUT;
*************** set_frame_menubar (f, first_time)
*** 1389,1393 ****
    GCPRO1 (items);
    
!   if (NILP (items = FRAME_MENU_BAR_ITEMS (f)))
      items = FRAME_MENU_BAR_ITEMS (f) = menu_bar_items (FRAME_MENU_BAR_ITEMS (f));
    
--- 1427,1432 ----
    GCPRO1 (items);
    
!   items = FRAME_MENU_BAR_ITEMS (f);
!   if (NILP (items))
      items = FRAME_MENU_BAR_ITEMS (f) = menu_bar_items (FRAME_MENU_BAR_ITEMS (f));
    
*************** set_frame_menubar (f, first_time)
*** 1397,1402 ****
    
    discard_menu_items (&mm);
  
!   for (i = 0; i < XVECTOR (items)->size; i += 3)
      {
        Lisp_Object string;
--- 1436,1442 ----
    
    discard_menu_items (&mm);
+   UNBLOCK_INPUT;
  
!   for (i = 0; i < XVECTOR (items)->size; i += 4)
      {
        Lisp_Object string;
*************** set_frame_menubar (f, first_time)
*** 1409,1412 ****
--- 1449,1454 ----
  	break;
        
+       /* Input must not be blocked here
+ 	 because we call general Lisp code and internal_condition_case_1.  */
        new_hmenu = create_menu_items (&mm,
  				     XVECTOR (items)->contents[i + 2],
*************** set_frame_menubar (f, first_time)
*** 1416,1423 ****
--- 1458,1468 ----
  	continue;
        
+       BLOCK_INPUT;
        AppendMenu (hmenu, MF_POPUP, (UINT)new_hmenu,
  		  (char *) XSTRING (string)->data);
+       UNBLOCK_INPUT;
      }
    
+   BLOCK_INPUT;
    {
      HMENU old = GetMenu (FRAME_WIN32_WINDOW (f));
*************** set_frame_menubar (f, first_time)
*** 1427,1432 ****
--- 1472,1479 ----
    
   error:
+   set_buffer_internal_1 (prev);
    UNGCPRO;
    UNBLOCK_INPUT;
+   unbind_to (count, Qnil);
  }
  
*************** free_frame_menubar (f)
*** 1445,1449 ****
    UNBLOCK_INPUT;
  }
! /* Called from Fwin32_create_frame to create the inital menubar of a frame
     before it is mapped, so that the window is mapped with the menubar already
     there instead of us tacking it on later and thrashing the window after it
--- 1492,1496 ----
    UNBLOCK_INPUT;
  }
! /* Called from Fwin32_create_frame to create the initial menubar of a frame
     before it is mapped, so that the window is mapped with the menubar already
     there instead of us tacking it on later and thrashing the window after it
*************** win32_dialog_show (f, menubarp, keymaps,
*** 1913,1916 ****
--- 1960,1966 ----
  syms_of_win32menu ()
  {
+   Qdebug_on_next_call = intern ("debug-on-next-call");
+   staticpro (&Qdebug_on_next_call);
+ 
    defsubr (&Sx_popup_menu);
    defsubr (&Sx_popup_dialog);
diff -2rcpP --exclude=*.elc emacs-19.30/src/w32reg.c emacs-19.31/src/w32reg.c
*** emacs-19.30/src/w32reg.c	Tue Nov  7 02:38:45 1995
--- emacs-19.31/src/w32reg.c	Fri May  3 14:31:11 1996
***************
*** 2,11 ****
     Copyright (C) 1990, 1993, 1994 Free Software Foundation.
  
! This program 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.
  
! This program 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
--- 2,13 ----
     Copyright (C) 1990, 1993, 1994 Free Software Foundation.
  
! 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 deta
*** 13,18 ****
  
  You should have received a copy of the GNU General Public License
! along with this program; see the file COPYING.  If not, write to
! the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  
  /* Written by Kevin Gallo */
--- 15,21 ----
  
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* Written by Kevin Gallo */
*************** the Free Software Foundation, 675 Mass A
*** 26,30 ****
  #include <string.h>
  
! #define REG_ROOT "SOFTWARE\\GNU\\Emacs\\"
  
  LPBYTE 
--- 29,33 ----
  #include <string.h>
  
! #define REG_ROOT "SOFTWARE\\GNU\\Emacs"
  
  LPBYTE 
diff -2rcpP --exclude=*.elc emacs-19.30/src/w32select.c emacs-19.31/src/w32select.c
*** emacs-19.30/src/w32select.c	Tue Nov  7 02:38:45 1995
--- emacs-19.31/src/w32select.c	Tue May 14 14:53:44 1996
***************
*** 2,20 ****
     Copyright (C) 1993, 1994 Free Software Foundation.
     
!    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.  */
  
  /* Written by Kevin Gallo */
--- 2,21 ----
     Copyright (C) 1993, 1994 Free Software Foundation.
     
! 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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* Written by Kevin Gallo */
***************
*** 27,30 ****
--- 28,33 ----
  #include "blockinput.h"
  
+ Lisp_Object QCLIPBOARD;
+ 
  #if 0
  DEFUN ("win32-open-clipboard", Fwin32_open_clipboard, Swin32_open_clipboard, 0, 1, 0,
*************** DEFUN ("win32-set-clipboard-data", Fwin3
*** 86,89 ****
--- 89,96 ----
    BOOL ok = TRUE;
    HANDLE htext;
+   int nbytes;
+   int truelen;
+   unsigned char *src;
+   unsigned char *dst;
    
    CHECK_STRING (string, 0);
*************** DEFUN ("win32-set-clipboard-data", Fwin3
*** 93,130 ****
    
    BLOCK_INPUT;
!   
!   /* Allocate twice the amount so we can convert lf to cr-lf */
!   
!   if ((htext = GlobalAlloc (GMEM_MOVEABLE | GMEM_DDESHARE, (2 * XSTRING (string)->size) + 1)) == NULL)
      goto error;
-   
-   {
-     unsigned char *lptext;
      
!     if ((lptext = (unsigned char *)GlobalLock (htext)) == NULL)
!       goto error;
! 	    
      {
!       int i = XSTRING (string)->size;
!       int newsize = XSTRING (string)->size;
!       register char *p1 = XSTRING (string)->data;
!       register char *p2 = lptext;
!       
!       while (i--)
  	{
! 	  if (*p1 == '\n')
! 	    {
! 	      newsize++;
! 	      *p2++ = '\r';
! 	    }
! 	  
! 	  *p2++ = *p1++;
! 	}
!       
!       *p2 = 0;
      }
      
!     GlobalUnlock (htext);
!   }
    
    if (!OpenClipboard ((!NILP (frame) && FRAME_WIN32_P (XFRAME (frame))) ? FRAME_WIN32_WINDOW (XFRAME (frame)) : NULL))
--- 100,149 ----
    
    BLOCK_INPUT;
! 
!   nbytes = XSTRING (string)->size + 1;
!   src = XSTRING (string)->data;
! 
!   /* need to know final size after '\r' chars are inserted (the
!      standard CF_TEXT clipboard format uses CRLF line endings,
!      while Emacs uses just LF internally) */
! 
!   truelen = nbytes;
!   dst = src;
!   /* avoid using strchr because it recomputes the length everytime */
!   while ((dst = memchr (dst, '\n', nbytes - (dst - src))) != NULL)
!     {
!       truelen++;
!       dst++;
!     }
! 
!   if ((htext = GlobalAlloc (GMEM_MOVEABLE | GMEM_DDESHARE, truelen)) == NULL)
!     goto error;
! 
!   if ((dst = (unsigned char *) GlobalLock (htext)) == NULL)
      goto error;
      
!   /* convert to CRLF line endings expected by clipboard */
!   while (1)
      {
!       unsigned char *next;
!       /* copy next line or remaining bytes including '\0' */
!       next = _memccpy (dst, src, '\n', nbytes);
!       if (next)
  	{
! 	  /* copied one line ending with '\n' */
! 	  int copied = next - dst;
! 	  nbytes -= copied;
! 	  src += copied;
! 	  /* insert '\r' before '\n' */
! 	  next[-1] = '\r';
! 	  next[0] = '\n';
! 	  dst = next + 1;
! 	}	    
!       else
! 	/* copied remaining partial line -> now finished */
! 	break;
      }
      
!   GlobalUnlock (htext);
    
    if (!OpenClipboard ((!NILP (frame) && FRAME_WIN32_P (XFRAME (frame))) ? FRAME_WIN32_WINDOW (XFRAME (frame)) : NULL))
*************** DEFUN ("win32-get-clipboard-data", Fwin3
*** 167,205 ****
      goto closeclip;
  
- 	    
    {
!     unsigned char *lptext;
      int nbytes;
      
!     if ((lptext = (unsigned char *)GlobalLock (htext)) == NULL)
        goto closeclip;
      
!     nbytes = strlen (lptext);
!     
!     {
!       char *buf = (char *) xmalloc (nbytes);
!       register char *p1 = lptext;
!       register char *p2 = buf;
!       int i = nbytes;
!       
!       if (buf == NULL) goto closeclip;
!       
!       while (i--)
! 	{
! 	  if (p1[0] == '\r' && i && p1[1] == '\n')
! 	    {
! 	      p1++;
! 	      i--;
! 	      nbytes--;
! 	    }
  
- 	  *p2++ = *p1++;
- 	}
-       
-       ret = make_string (buf, nbytes);
-       
-       xfree (buf);
-     }
-     
      GlobalUnlock (htext);
    }
--- 186,237 ----
      goto closeclip;
  
    {
!     unsigned char *src;
!     unsigned char *dst;
      int nbytes;
+     int truelen;
      
!     if ((src = (unsigned char *) GlobalLock (htext)) == NULL)
        goto closeclip;
      
!     nbytes = strlen (src);
! 
!     /* need to know final size after '\r' chars are removed because
!        we can't change the string size manually, and doing an extra
!        copy is silly */
! 
!     truelen = nbytes;
!     dst = src;
!     /* avoid using strchr because it recomputes the length everytime */
!     while ((dst = memchr (dst, '\r', nbytes - (dst - src))) != NULL)
!       {
! 	truelen--;
! 	dst++;
!       }
! 
!     ret = make_uninit_string (truelen);
! 
!     /* convert CRLF line endings (the standard CF_TEXT clipboard
!        format) to LF endings as used internally by Emacs */
! 
!     dst = XSTRING (ret)->data;
!     while (1)
!       {
! 	unsigned char *next;
! 	/* copy next line or remaining bytes excluding '\0' */
! 	next = _memccpy (dst, src, '\r', nbytes);
! 	if (next)
! 	  {
! 	    /* copied one line ending with '\r' */
! 	    int copied = next - dst;
! 	    nbytes -= copied;
! 	    dst += copied - 1;		/* overwrite '\r' */
! 	    src += copied;
! 	  }	    
! 	else
! 	  /* copied remaining partial line -> now finished */
! 	  break;
!       }
  
      GlobalUnlock (htext);
    }
*************** DEFUN ("win32-get-clipboard-data", Fwin3
*** 214,217 ****
--- 246,287 ----
  }
  
+ /* Support checking for a clipboard selection. */
+ 
+ DEFUN ("x-selection-exists-p", Fx_selection_exists_p, Sx_selection_exists_p,
+   0, 1, 0,
+   "Whether there is an owner for the given X Selection.\n\
+ The arg should be the name of the selection in question, typically one of\n\
+ the symbols `PRIMARY', `SECONDARY', or `CLIPBOARD'.\n\
+ \(Those are literal upper-case symbol names, since that's what X expects.)\n\
+ For convenience, the symbol nil is the same as `PRIMARY',\n\
+ and t is the same as `SECONDARY'.")
+   (selection)
+      Lisp_Object selection;
+ {
+   CHECK_SYMBOL (selection, 0);
+ 
+   /* Return nil for PRIMARY and SECONDARY selections; for CLIPBOARD, check
+      if the clipboard currently has valid text format contents. */
+ 
+   if (EQ (selection, QCLIPBOARD))
+     {
+       Lisp_Object val = Qnil;
+ 
+       if (OpenClipboard (NULL))
+ 	{
+ 	  int format = 0;
+ 	  while (format = EnumClipboardFormats (format))
+ 	    if (format == CF_TEXT)
+ 	      {
+ 		val = Qt;
+ 		break;
+ 	      }
+ 	  CloseClipboard ();
+ 	}
+       return val;
+     }
+   return Qnil;
+ }
+ 
  void 
  syms_of_win32select ()
*************** syms_of_win32select ()
*** 224,226 ****
--- 294,299 ----
    defsubr (&Swin32_set_clipboard_data);
    defsubr (&Swin32_get_clipboard_data);
+   defsubr (&Sx_selection_exists_p);
+ 
+   QCLIPBOARD = intern ("CLIPBOARD");	staticpro (&QCLIPBOARD);
  }
diff -2rcpP --exclude=*.elc emacs-19.30/src/w32term.c emacs-19.31/src/w32term.c
*** emacs-19.30/src/w32term.c	Tue Nov  7 02:38:47 1995
--- emacs-19.31/src/w32term.c	Sat May 25 13:44:39 1996
*************** the Free Software Foundation, 675 Mass A
*** 50,53 ****
--- 50,55 ----
  extern void free_frame_menubar ();
  
+ extern Lisp_Object Vwindow_system;
+ 
  #define x_any_window_to_frame x_window_to_frame
  #define x_top_window_to_frame x_window_to_frame
*************** static FRAME_PTR last_mouse_frame;
*** 98,101 ****
--- 100,107 ----
  static RECT last_mouse_glyph;
  
+ Lisp_Object Vwin32_num_mouse_buttons;
+ 
+ Lisp_Object Vwin32_swap_mouse_buttons;
+ 
  /* The scroll bar in which the last motion event occurred.
  
*************** win32_fill_rect (f, _hdc, pix, lprect)
*** 195,199 ****
    HDC hdc;
    HBRUSH hb;
-   HANDLE oldobj;
    RECT rect;
    
--- 201,204 ----
*************** win32_fill_rect (f, _hdc, pix, lprect)
*** 203,218 ****
      {
        if (!f) return;
!       hdc = my_get_dc (FRAME_WIN32_WINDOW (f));
      }
    
    hb = CreateSolidBrush (pix);
-   oldobj = SelectObject (hdc, hb);
-   
    FillRect (hdc, lprect, hb);
-   SelectObject (hdc, oldobj);
    DeleteObject (hb);
    
    if (!_hdc)
!     ReleaseDC (FRAME_WIN32_WINDOW (f), hdc);
  }
  
--- 208,220 ----
      {
        if (!f) return;
!       hdc = get_frame_dc (f);
      }
    
    hb = CreateSolidBrush (pix);
    FillRect (hdc, lprect, hb);
    DeleteObject (hb);
    
    if (!_hdc)
!     release_frame_dc (f, hdc);
  }
  
*************** win32_clear_window (f)
*** 222,226 ****
  {
    RECT rect;
!     
    GetClientRect (FRAME_WIN32_WINDOW (f), &rect);
    win32_clear_rect (f, NULL, &rect);
--- 224,228 ----
  {
    RECT rect;
! 
    GetClientRect (FRAME_WIN32_WINDOW (f), &rect);
    win32_clear_rect (f, NULL, &rect);
*************** win32_update_begin (f)
*** 249,252 ****
--- 251,262 ----
    BLOCK_INPUT;
  
+   /* Regenerate display palette before drawing if list of requested
+      colors has changed. */
+   if (FRAME_WIN32_DISPLAY_INFO (f)->regen_palette)
+   {
+     win32_regenerate_palette (f);
+     FRAME_WIN32_DISPLAY_INFO (f)->regen_palette = FALSE;
+   }
+ 
    if (f == FRAME_WIN32_DISPLAY_INFO (f)->mouse_face_mouse_frame)
      {
*************** dumpglyphs (f, left, top, gp, n, hl, jus
*** 418,422 ****
    HDC hdc;
  
!   hdc = my_get_dc (window);
  
    while (n > 0)
--- 428,432 ----
    HDC hdc;
  
!   hdc = get_frame_dc (f);
  
    while (n > 0)
*************** dumpglyphs (f, left, top, gp, n, hl, jus
*** 571,575 ****
      }
  
!   ReleaseDC (window, hdc);
  }
  
--- 581,585 ----
      }
  
!   release_frame_dc (f, hdc);
  }
  
*************** do_line_dance ()
*** 828,832 ****
    x_display_cursor (updating_frame, 0);
  
!   hdc = my_get_dc (FRAME_WIN32_WINDOW (f));
  
    for (i = 0; i < ht; ++i)
--- 838,842 ----
    x_display_cursor (updating_frame, 0);
  
!   hdc = get_frame_dc (f);
  
    for (i = 0; i < ht; ++i)
*************** do_line_dance ()
*** 862,866 ****
        }
  
!   ReleaseDC (FRAME_WIN32_WINDOW (f), hdc);
  
    for (i = 0; i < ht; ++i)
--- 872,876 ----
        }
  
!   release_frame_dc (f, hdc);
  
    for (i = 0; i < ht; ++i)
*************** pixel_to_glyph_coords (f, pix_x, pix_y, 
*** 1098,1101 ****
--- 1108,1119 ----
       int noclip;
  {
+   /* Support tty mode: if Vwindow_system is nil, behave correctly. */
+   if (NILP (Vwindow_system))
+     {
+       *x = pix_x;
+       *y = pix_y;
+       return;
+     }
+ 
    /* Arrange for the division in PIXEL_TO_CHAR_COL etc. to round down
       even for negative values.  */
*************** glyph_to_pixel_coords (f, x, y, pix_x, p
*** 1139,1142 ****
--- 1157,1168 ----
       register int *pix_x, *pix_y;
  {
+   /* Support tty mode: if Vwindow_system is nil, behave correctly. */
+   if (NILP (Vwindow_system))
+     {
+       *pix_x = x;
+       *pix_y = y;
+       return;
+     }
+ 
    *pix_x = CHAR_TO_PIXEL_COL (f, x);
    *pix_y = CHAR_TO_PIXEL_ROW (f, y);
*************** parse_button (message, pbutton, pup)
*** 1163,1179 ****
        break;
      case WM_MBUTTONDOWN:
!       button = 1;
        up = 0;
        break;
      case WM_MBUTTONUP:
!       button = 1;
        up = 1;
        break;
      case WM_RBUTTONDOWN:
!       button = 2;
        up = 0;
        break;
      case WM_RBUTTONUP:
!       button = 2;
        up = 1;
        break;
--- 1189,1217 ----
        break;
      case WM_MBUTTONDOWN:
!       if (NILP (Vwin32_swap_mouse_buttons))
! 	button = 1;
!       else
! 	button = 2;
        up = 0;
        break;
      case WM_MBUTTONUP:
!       if (NILP (Vwin32_swap_mouse_buttons))
! 	button = 1;
!       else
! 	button = 2;
        up = 1;
        break;
      case WM_RBUTTONDOWN:
!       if (NILP (Vwin32_swap_mouse_buttons))
! 	button = 2;
!       else
! 	button = 1;
        up = 0;
        break;
      case WM_RBUTTONUP:
!       if (NILP (Vwin32_swap_mouse_buttons))
! 	button = 2;
!       else
! 	button = 1;
        up = 1;
        break;
*************** note_mouse_movement (frame, msg)
*** 1251,1255 ****
    else if (LOWORD (msg->lParam) < last_mouse_glyph.left
  	   || LOWORD (msg->lParam) > last_mouse_glyph.right
! 	   || HIWORD (msg->lParam) < last_mouse_glyph.left
  	   || HIWORD (msg->lParam) > last_mouse_glyph.bottom)
      {
--- 1289,1293 ----
    else if (LOWORD (msg->lParam) < last_mouse_glyph.left
  	   || LOWORD (msg->lParam) > last_mouse_glyph.right
! 	   || HIWORD (msg->lParam) < last_mouse_glyph.top
  	   || HIWORD (msg->lParam) > last_mouse_glyph.bottom)
      {
*************** my_create_scrollbar (f, bar)
*** 1770,1773 ****
--- 1808,1841 ----
  }
  
+ //#define ATTACH_THREADS
+ 
+ void
+ my_show_window (HWND hwnd, int how)
+ {
+ #ifndef ATTACH_THREADS
+   SendMessage (hwnd, WM_EMACS_SHOWWINDOW, (WPARAM) how, 0);
+ #else
+   ShowWindow (hwnd , how);
+ #endif
+ }
+ 
+ void
+ my_set_window_pos (HWND hwnd, HWND hwndAfter,
+ 		   int x, int y, int cx, int cy, int flags)
+ {
+ #ifndef ATTACH_THREADS
+   Win32WindowPos pos;
+   pos.hwndAfter = hwndAfter;
+   pos.x = x;
+   pos.y = y;
+   pos.cx = cx;
+   pos.cy = cy;
+   pos.flags = flags;
+   SendMessage (hwnd, WM_EMACS_SETWINDOWPOS, (WPARAM) &pos, 0);
+ #else
+   SetWindowPos (hwnd, hwndAfter, x, y, cx, cy, flags);
+ #endif
+ }
+ 
  void
  my_destroy_window (f, hwnd)
*************** x_scroll_bar_set_handle (bar, start, end
*** 1856,1862 ****
    XSETINT (bar->end, end);
  
!   /* If we are less than half of the page use start otherwise use end */
! 
!   SetScrollPos (w, SB_CTL, ((start >> 1) < bar->height)?start:end, TRUE);
  
    UNBLOCK_INPUT;
--- 1924,1928 ----
    XSETINT (bar->end, end);
  
!   SetScrollPos (w, SB_CTL, start, TRUE);
  
    UNBLOCK_INPUT;
*************** x_scroll_bar_move (bar, top, left, width
*** 1877,1880 ****
--- 1943,1948 ----
    MoveWindow (w, left, top, width, height, TRUE);
    SetScrollRange (w, SB_CTL, 0, height, FALSE);
+   InvalidateRect (w, NULL, FALSE);
+   my_show_window (w, SW_NORMAL);
  
    XSETINT (bar->left, left);
*************** win32_judge_scroll_bars (f)
*** 2069,2073 ****
     This may be called from a signal handler, so we have to ignore GC
     mark bits.  */
! static void
  x_scroll_bar_handle_click (bar, msg, emacs_event)
       struct scroll_bar *bar;
--- 2137,2142 ----
     This may be called from a signal handler, so we have to ignore GC
     mark bits.  */
! 
! static int
  x_scroll_bar_handle_click (bar, msg, emacs_event)
       struct scroll_bar *bar;
*************** x_scroll_bar_handle_click (bar, msg, ema
*** 2078,2087 ****
      abort ();
  
!   emacs_event->kind = scroll_bar_click;
    emacs_event->code = 0;
!   emacs_event->modifiers = (msg->dwModifiers
! 			   | ((LOWORD (msg->msg.wParam) == SB_ENDSCROLL)
! 			      ? up_modifier
! 			      : down_modifier));
    emacs_event->frame_or_window = bar->window;
    emacs_event->timestamp = msg->msg.time;
--- 2147,2154 ----
      abort ();
  
!   emacs_event->kind = win32_scroll_bar_click;
    emacs_event->code = 0;
!   /* not really meaningful to distinguish up/down */
!   emacs_event->modifiers = msg->dwModifiers;
    emacs_event->frame_or_window = bar->window;
    emacs_event->timestamp = msg->msg.time;
*************** x_scroll_bar_handle_click (bar, msg, ema
*** 2095,2138 ****
  
      switch (LOWORD (msg->msg.wParam))
!     {
!     case SB_THUMBPOSITION:
!     case SB_THUMBTRACK:
  	emacs_event->part = scroll_bar_handle;
  	if (VERTICAL_SCROLL_BAR_TOP_RANGE (XINT (bar->height)) <= 0xffff)
  	    y = HIWORD (msg->msg.wParam);
  	break;
!     case SB_LINEDOWN:
! 	emacs_event->part = scroll_bar_handle;
! 	if (y < top_range) y++;
  	break;
!     case SB_LINEUP:
! 	emacs_event->part = scroll_bar_handle;
! 	if (y) y--;
  	break;
!     case SB_PAGEUP:
  	emacs_event->part = scroll_bar_above_handle;
  	break;
!     case SB_PAGEDOWN:
  	emacs_event->part = scroll_bar_below_handle;
  	break;
!     case SB_TOP:
  	emacs_event->part = scroll_bar_handle;
  	y = 0;
  	break;
!     case SB_BOTTOM:
  	emacs_event->part = scroll_bar_handle;
  	y = top_range;
  	break;
!     case SB_ENDSCROLL:
! 	emacs_event->part = scroll_bar_handle;
! 	x_scroll_bar_set_handle (bar, y , y, 0);
! 	break;
!     default:
  	emacs_event->part = scroll_bar_handle;
  	break;
!     }
  
      XSETINT (emacs_event->x, y);
      XSETINT (emacs_event->y, top_range);
    }
  }
--- 2162,2204 ----
  
      switch (LOWORD (msg->msg.wParam))
!       {
!       case SB_THUMBTRACK:
  	emacs_event->part = scroll_bar_handle;
  	if (VERTICAL_SCROLL_BAR_TOP_RANGE (XINT (bar->height)) <= 0xffff)
  	    y = HIWORD (msg->msg.wParam);
  	break;
!       case SB_LINEDOWN:
! 	emacs_event->part = scroll_bar_down_arrow;
  	break;
!       case SB_LINEUP:
! 	emacs_event->part = scroll_bar_up_arrow;
  	break;
!       case SB_PAGEUP:
  	emacs_event->part = scroll_bar_above_handle;
  	break;
!       case SB_PAGEDOWN:
  	emacs_event->part = scroll_bar_below_handle;
  	break;
!       case SB_TOP:
  	emacs_event->part = scroll_bar_handle;
  	y = 0;
  	break;
!       case SB_BOTTOM:
  	emacs_event->part = scroll_bar_handle;
  	y = top_range;
  	break;
!       case SB_THUMBPOSITION:
  	emacs_event->part = scroll_bar_handle;
  	break;
!       case SB_ENDSCROLL:
!       default:
! 	SetScrollPos (SCROLL_BAR_WIN32_WINDOW (bar), SB_CTL, y, TRUE);
! 	return FALSE;
!       }
  
      XSETINT (emacs_event->x, y);
      XSETINT (emacs_event->y, top_range);
+ 
+     return TRUE;
    }
  }
*************** x_scroll_bar_clear (f)
*** 2196,2206 ****
       FRAME_PTR f;
  {
- #if 0
    Lisp_Object bar;
  
    for (bar = FRAME_SCROLL_BARS (f); VECTORP (bar);
         bar = XSCROLL_BAR (bar)->next)
!     UpdateWindow (SCROLL_BAR_WIN32_WINDOW (XSCROLL_BAR (bar)));
! #endif
  }
  
--- 2262,2294 ----
       FRAME_PTR f;
  {
    Lisp_Object bar;
  
    for (bar = FRAME_SCROLL_BARS (f); VECTORP (bar);
         bar = XSCROLL_BAR (bar)->next)
!     {
!       HWND window = SCROLL_BAR_WIN32_WINDOW (XSCROLL_BAR (bar));
!       HDC hdc = GetDC (window);
!       RECT rect;
! 
!       my_show_window (window, SW_HIDE);
!       GetClientRect (window, &rect);
!       select_palette (f, hdc);
!       win32_clear_rect (f, hdc, &rect);
!       deselect_palette (f, hdc);
!     }
! }
! 
! show_scroll_bars (f, how)
!      FRAME_PTR f;
!      int how;
! {
!   Lisp_Object bar;
! 
!   for (bar = FRAME_SCROLL_BARS (f); VECTORP (bar);
!        bar = XSCROLL_BAR (bar)->next)
!     {
!       HWND window = SCROLL_BAR_WIN32_WINDOW (XSCROLL_BAR (bar));
!       my_show_window (window, how);
!     }
  }
  
*************** int temp_index;
*** 2218,2221 ****
--- 2306,2340 ----
  short temp_buffer[100];
  
+ extern int key_event (KEY_EVENT_RECORD *, struct input_event *);
+ 
+ /* Map a Win32 WM_CHAR message into a KEY_EVENT_RECORD so that
+    we can use the same routines to handle input in both console
+    and window modes.  */
+ 
+ static void
+ convert_to_key_event (Win32Msg *msgp, KEY_EVENT_RECORD *eventp)
+ {
+   eventp->bKeyDown = TRUE;
+   eventp->wRepeatCount = 1;
+   eventp->wVirtualKeyCode = msgp->msg.wParam;
+   eventp->wVirtualScanCode = (msgp->msg.lParam & 0xFF0000) >> 16;
+   eventp->uChar.AsciiChar = 0;
+   eventp->dwControlKeyState = msgp->dwModifiers;
+ }
+ 
+ /* Return nonzero if the virtual key is a dead key.  */
+ 
+ static int
+ is_dead_key (int wparam)
+ {
+   unsigned int code = MapVirtualKey (wparam, 2);
+ 
+   /* Win95 returns 0x8000, NT returns 0x80000000.  */
+   if ((code & 0x8000) || (code & 0x80000000))
+     return 1;
+   else
+     return 0;
+ }
+ 
  /* Read events coming from the Win32 shell.
     This routine is called by the SIGIO handler.
*************** w32_read_socket (sd, bufp, numchars, wai
*** 2272,2276 ****
      abort ();                   /* Don't think this happens. */
  
!   while (get_next_msg (&msg, 0))
      {
        switch (msg.msg.message)
--- 2391,2395 ----
      abort ();                   /* Don't think this happens. */
  
!   while (get_next_msg (&msg, FALSE))
      {
        switch (msg.msg.message)
*************** w32_read_socket (sd, bufp, numchars, wai
*** 2308,2311 ****
--- 2427,2436 ----
  	  
  	  break;
+ 	case WM_PALETTECHANGED:
+ 	  f = x_window_to_frame (dpyinfo, msg.msg.hwnd);
+ 	  if (f)
+ 	    /* Realize palette - will force update if needed. */
+ 	    release_frame_dc (f, get_frame_dc (f));
+ 	  break;
  	case WM_KEYDOWN:
  	case WM_SYSKEYDOWN:
*************** w32_read_socket (sd, bufp, numchars, wai
*** 2319,2323 ****
  	      bufp->kind = non_ascii_keystroke;
  	      bufp->code = msg.msg.wParam;
! 	      bufp->modifiers = msg.dwModifiers;
  	      XSETFRAME (bufp->frame_or_window, f);
  	      bufp->timestamp = msg.msg.time;
--- 2444,2448 ----
  	      bufp->kind = non_ascii_keystroke;
  	      bufp->code = msg.msg.wParam;
! 	      bufp->modifiers = win32_kbd_mods_to_emacs (msg.dwModifiers);
  	      XSETFRAME (bufp->frame_or_window, f);
  	      bufp->timestamp = msg.msg.time;
*************** w32_read_socket (sd, bufp, numchars, wai
*** 2335,2349 ****
  	      if (numchars > 1) 
  		{
  		  if (temp_index == sizeof temp_buffer / sizeof (short))
  		    temp_index = 0;
! 		  temp_buffer[temp_index++] = msg.msg.wParam;
! 		  bufp->kind = ascii_keystroke;
! 		  bufp->code = msg.msg.wParam;
  		  XSETFRAME (bufp->frame_or_window, f);
! 		  bufp->modifiers = msg.dwModifiers;
! 		  bufp->timestamp = msg.msg.time;
! 		  bufp++;
! 		  numchars--;
! 		  count++;
  		} 
  	      else 
--- 2460,2491 ----
  	      if (numchars > 1) 
  		{
+ 		  int add;
+ 		  KEY_EVENT_RECORD key, *keyp = &key;
+ 
  		  if (temp_index == sizeof temp_buffer / sizeof (short))
  		    temp_index = 0;
! 		  
! 		  convert_to_key_event (&msg, keyp);
! 		  add = key_event (keyp, bufp);
  		  XSETFRAME (bufp->frame_or_window, f);
! 		  if (add == -1)
! 		    {
! 		      /* The key pressed generated two characters, most likely
! 			 an accent character and a key that could not be
! 			 combined with it.  Prepend the message on the queue
! 			 again to process the second character (which is
! 			 being held internally in key_event), and process
! 			 the first character now.  */
! 		      prepend_msg (&msg);
! 		      add = 1;
! 		    }
! 
! 		  /* Throw dead keys away.  */
! 		  if (is_dead_key (msg.msg.wParam))
! 		    break;
! 
! 		  bufp += add;
! 		  numchars -= add;
! 		  count += add;
  		} 
  	      else 
*************** w32_read_socket (sd, bufp, numchars, wai
*** 2414,2421 ****
  	    if (bar && numchars >= 1)
  	      {
! 		x_scroll_bar_handle_click (bar, &msg, bufp);
! 		bufp++;
! 		count++;
! 		numchars--;
  	      }
  	  }
--- 2556,2565 ----
  	    if (bar && numchars >= 1)
  	      {
! 		if (x_scroll_bar_handle_click (bar, &msg, bufp))
! 		  {
! 		    bufp++;
! 		    count++;
! 		    numchars--;
! 		  }
  	      }
  	  }
*************** w32_read_socket (sd, bufp, numchars, wai
*** 2485,2489 ****
  	  break;
  	case WM_SYSCOMMAND:
! 	  switch (msg.msg.wParam) 
  	    {
  	    case SC_CLOSE:
--- 2629,2633 ----
  	  break;
  	case WM_SYSCOMMAND:
! 	  switch (msg.msg.wParam & 0xfff0)  /* Lower 4 bits used by Windows. */
  	    {
  	    case SC_CLOSE:
*************** x_draw_box (f)
*** 2636,2640 ****
    HDC hdc;
    
!   hdc = my_get_dc (FRAME_WIN32_WINDOW (f));
    
    hb = CreateSolidBrush (f->output_data.win32->cursor_pixel);
--- 2780,2784 ----
    HDC hdc;
    
!   hdc = get_frame_dc (f);
    
    hb = CreateSolidBrush (f->output_data.win32->cursor_pixel);
*************** x_draw_box (f)
*** 2642,2658 ****
    rect.left = CHAR_TO_PIXEL_COL (f, curs_x);
    rect.top  = CHAR_TO_PIXEL_ROW (f, curs_y);
!   rect.right = rect.left + FONT_WIDTH (f->output_data.win32->font) - 1;
!   rect.bottom = rect.top + f->output_data.win32->line_height - 1;
!   
!   /*    rect.left++; */
!   /*    rect.top++; */
!   rect.right--;
!   rect.bottom--;
!   
    FrameRect (hdc, &rect, hb);
-   
    DeleteObject (hb);
!   
!   ReleaseDC (FRAME_WIN32_WINDOW (f), hdc);
  }
  
--- 2786,2796 ----
    rect.left = CHAR_TO_PIXEL_COL (f, curs_x);
    rect.top  = CHAR_TO_PIXEL_ROW (f, curs_y);
!   rect.right = rect.left + FONT_WIDTH (f->output_data.win32->font);
!   rect.bottom = rect.top + f->output_data.win32->line_height;
! 
    FrameRect (hdc, &rect, hb);
    DeleteObject (hb);
! 
!   release_frame_dc (f, hdc);
  }
  
*************** x_set_offset (f, xoff, yoff, change_grav
*** 3082,3090 ****
      }
  
!   SetWindowPos (FRAME_WIN32_WINDOW (f),
! 		NULL,
! 		modified_left, modified_top,
! 		0,0,
! 		SWP_NOZORDER | SWP_NOSIZE);
    UNBLOCK_INPUT;
  }
--- 3220,3228 ----
      }
  
!   my_set_window_pos (FRAME_WIN32_WINDOW (f),
! 		     NULL,
! 		     modified_left, modified_top,
! 		     0,0,
! 		     SWP_NOZORDER | SWP_NOSIZE);
    UNBLOCK_INPUT;
  }
*************** x_set_window_size (f, change_gravity, co
*** 3129,3138 ****
      /* All windows have an extra pixel */
  
!     SetWindowPos (FRAME_WIN32_WINDOW (f),
! 		  NULL, 
! 		  0, 0,
! 		  rect.right - rect.left + 1,
! 		  rect.bottom - rect.top + 1,
! 		  SWP_NOZORDER | SWP_NOMOVE);
    }
    
--- 3267,3276 ----
      /* All windows have an extra pixel */
  
!     my_set_window_pos (FRAME_WIN32_WINDOW (f),
! 		       NULL, 
! 		       0, 0,
! 		       rect.right - rect.left + 1,
! 		       rect.bottom - rect.top + 1,
! 		       SWP_NOZORDER | SWP_NOMOVE);
    }
    
*************** x_raise_frame (f)
*** 3224,3234 ****
       struct frame *f;
  {
!   if (f->async_visible)
      {
        BLOCK_INPUT;
!       SetWindowPos (FRAME_WIN32_WINDOW (f),
! 		    HWND_TOP,
! 		    0, 0, 0, 0,
! 		    SWP_NOSIZE | SWP_NOMOVE);
        UNBLOCK_INPUT;
      }
--- 3362,3372 ----
       struct frame *f;
  {
! //  if (f->async_visible)
      {
        BLOCK_INPUT;
!       my_set_window_pos (FRAME_WIN32_WINDOW (f),
! 		         HWND_TOP,
! 		         0, 0, 0, 0,
! 		         SWP_NOSIZE | SWP_NOMOVE);
        UNBLOCK_INPUT;
      }
*************** x_lower_frame (f)
*** 3240,3250 ****
       struct frame *f;
  {
!   if (f->async_visible)
      {
        BLOCK_INPUT;
!       SetWindowPos (FRAME_WIN32_WINDOW (f),
! 		    HWND_BOTTOM,
! 		    0, 0, 0, 0,
! 		    SWP_NOSIZE | SWP_NOMOVE);
        UNBLOCK_INPUT;
      }
--- 3378,3388 ----
       struct frame *f;
  {
! //  if (f->async_visible)
      {
        BLOCK_INPUT;
!       my_set_window_pos (FRAME_WIN32_WINDOW (f),
! 		         HWND_BOTTOM,
! 		         0, 0, 0, 0,
! 		         SWP_NOSIZE | SWP_NOMOVE);
        UNBLOCK_INPUT;
      }
*************** x_make_frame_visible (f)
*** 3284,3292 ****
        if (! FRAME_ICONIFIED_P (f)
  	  && ! f->output_data.win32->asked_for_visible)
  	x_set_offset (f, f->output_data.win32->left_pos, f->output_data.win32->top_pos, 0);
  
        f->output_data.win32->asked_for_visible = 1;
  
!       ShowWindow (FRAME_WIN32_WINDOW (f), SW_SHOW);
      }
  
--- 3422,3433 ----
        if (! FRAME_ICONIFIED_P (f)
  	  && ! f->output_data.win32->asked_for_visible)
+       {
  	x_set_offset (f, f->output_data.win32->left_pos, f->output_data.win32->top_pos, 0);
+ //	SetForegroundWindow (FRAME_WIN32_WINDOW (f));
+       }
  
        f->output_data.win32->asked_for_visible = 1;
  
!       my_show_window (FRAME_WIN32_WINDOW (f), SW_SHOWNORMAL);
      }
  
*************** x_make_frame_invisible (f)
*** 3351,3355 ****
    BLOCK_INPUT;
    
!   ShowWindow (FRAME_WIN32_WINDOW (f), SW_HIDE);
    
    /* We can't distinguish this from iconification
--- 3492,3496 ----
    BLOCK_INPUT;
    
!   my_show_window (FRAME_WIN32_WINDOW (f), SW_HIDE);
    
    /* We can't distinguish this from iconification
*************** x_make_frame_invisible (f)
*** 3368,3372 ****
  /* Change window state from mapped to iconified. */
  
! void x_iconify_frame (f)
       struct frame *f;
  {
--- 3509,3514 ----
  /* Change window state from mapped to iconified. */
  
! void
! x_iconify_frame (f)
       struct frame *f;
  {
*************** void x_iconify_frame (f)
*** 3382,3386 ****
    BLOCK_INPUT;
  
!   ShowWindow (FRAME_WIN32_WINDOW (f), SW_SHOWMINIMIZED);
  
    f->async_iconified = 1;
--- 3524,3530 ----
    BLOCK_INPUT;
  
!   my_show_window (FRAME_WIN32_WINDOW (f), SW_SHOWMINIMIZED);
!   /* The frame doesn't seem to be lowered automatically. */
!   x_lower_frame (f);
  
    f->async_iconified = 1;
*************** win32_term_init (display_name, xrm_optio
*** 3547,3551 ****
    dpyinfo->xrdb = xrdb;
  #endif
!   hdc = my_get_dc (GetDesktopWindow ());
    
    dpyinfo->height = GetDeviceCaps (hdc, VERTRES);
--- 3691,3695 ----
    dpyinfo->xrdb = xrdb;
  #endif
!   hdc = GetDC (GetDesktopWindow ());
    
    dpyinfo->height = GetDeviceCaps (hdc, VERTRES);
*************** win32_term_init (display_name, xrm_optio
*** 3556,3559 ****
--- 3700,3704 ----
    dpyinfo->height_in = GetDeviceCaps (hdc, LOGPIXELSX);
    dpyinfo->width_in = GetDeviceCaps (hdc, LOGPIXELSY);
+   dpyinfo->has_palette = GetDeviceCaps (hdc, RASTERCAPS) & RC_PALETTE;
    dpyinfo->grabbed = 0;
    dpyinfo->reference_count = 0;
*************** win32_term_init (display_name, xrm_optio
*** 3577,3580 ****
--- 3722,3737 ----
    ReleaseDC (GetDesktopWindow (), hdc);
  
+   /* Determine if there is a middle mouse button, to allow parse_button
+      to decide whether right mouse events should be mouse-2 or
+      mouse-3. */
+   XSETINT (Vwin32_num_mouse_buttons, GetSystemMetrics (SM_CMOUSEBUTTONS));
+ 
+   /* initialise palette with white and black */
+   {
+     COLORREF color;
+     defined_color (0, "white", &color, 1);
+     defined_color (0, "black", &color, 1);
+   }
+ 
  #ifndef F_SETOWN_BUG
  #ifdef F_SETOWN
*************** x_delete_display (dpyinfo)
*** 3626,3629 ****
--- 3783,3801 ----
      }
  
+   /* free palette table */
+   {
+     struct win32_palette_entry * plist;
+ 
+     plist = dpyinfo->color_list;
+     while (plist)
+     {
+       struct win32_palette_entry * pentry = plist;
+       plist = plist->next;
+       xfree(pentry);
+     }
+     dpyinfo->color_list = NULL;
+     if (dpyinfo->palette)
+       DeleteObject(dpyinfo->palette);
+   }
    xfree (dpyinfo->font_table);
    xfree (dpyinfo->win32_id_name);
*************** win32_initialize ()
*** 3694,3699 ****
    }
    
!   /*  AttachThreadInput (dwWinThreadId, dwMainThreadId, TRUE); */
! 
  }
  
--- 3866,3880 ----
    }
    
!   /* It is desirable that mainThread should have the same notion of
!      focus window and active window as winThread.  Unfortunately, the
!      following call to AttachThreadInput, which should do precisely what
!      we need, causes major problems when Emacs is linked as a console
!      program.  Unfortunately, we have good reasons for doing that, so
!      instead we need to send messages to winThread to make some API
!      calls for us (ones that affect, or depend on, the active/focus
!      window state.  */
! #ifdef ATTACH_THREADS
!   AttachThreadInput (dwMainThreadId, dwWinThreadId, TRUE);
! #endif
  }
  
*************** syms_of_win32term ()
*** 3709,3711 ****
--- 3890,3903 ----
    staticpro (&Qvendor_specific_keysyms);
    Qvendor_specific_keysyms = intern ("vendor-specific-keysyms");
+ 
+   DEFVAR_INT ("win32-num-mouse-buttons",
+ 	      &Vwin32_num_mouse_buttons,
+ 	      "Number of physical mouse buttons.");
+   Vwin32_num_mouse_buttons = Qnil;
+ 
+   DEFVAR_LISP ("win32-swap-mouse-buttons",
+ 	      &Vwin32_swap_mouse_buttons,
+ 	      "Swap the mapping of middle and right mouse buttons.\n\
+ When nil, middle button is mouse-2 and right button is mouse-3.");
+   Vwin32_swap_mouse_buttons = Qnil;
  }
diff -2rcpP --exclude=*.elc emacs-19.30/src/w32term.h emacs-19.31/src/w32term.h
*** emacs-19.30/src/w32term.h	Tue Nov 14 14:14:09 1995
--- emacs-19.31/src/w32term.h	Fri May  3 14:31:34 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  /* Added by Kevin Gallo */
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* Added by Kevin Gallo */
*************** the Free Software Foundation, 675 Mass A
*** 25,32 ****
  #define EMACS_CLASS "Emacs"
  
! #define BLACK_PIX_DEFAULT(f) RGB(0,0,0)
! #define WHITE_PIX_DEFAULT(f) RGB(255,255,255)
  
! #define FONT_WIDTH(f)	((f)->tm.tmMaxCharWidth)
  #define FONT_HEIGHT(f)	((f)->tm.tmHeight)
  #define FONT_BASE(f)    ((f)->tm.tmAscent)
--- 26,33 ----
  #define EMACS_CLASS "Emacs"
  
! #define BLACK_PIX_DEFAULT(f) PALETTERGB(0,0,0)
! #define WHITE_PIX_DEFAULT(f) PALETTERGB(255,255,255)
  
! #define FONT_WIDTH(f)	((f)->tm.tmAveCharWidth)
  #define FONT_HEIGHT(f)	((f)->tm.tmHeight)
  #define FONT_BASE(f)    ((f)->tm.tmAscent)
*************** struct win32_bitmap_record 
*** 75,78 ****
--- 76,96 ----
    int height, width, depth;
  };
+ 
+ /* Palette book-keeping stuff for mapping requested colors into the
+    system palette.  Keep a ref-counted list of requested colors and
+    regenerate the app palette whenever the requested list changes. */
+ 
+ extern Lisp_Object Vwin32_enable_palette;
+ 
+ struct win32_palette_entry {
+   struct win32_palette_entry * next;
+   PALETTEENTRY entry;
+ #if 0
+   unsigned refcount;
+ #endif
+ };
+ 
+ extern void win32_regenerate_palette(struct frame *f);
+ 
  
  /* For each display (currently only one on win32), we have a structure that
*************** struct win32_display_info
*** 102,105 ****
--- 120,132 ----
    Cursor vertical_scroll_bar_cursor;
  
+   /* color palette information */
+   int has_palette;
+   struct win32_palette_entry * color_list;
+   unsigned num_colors;
+   HPALETTE palette;
+ 
+   /* deferred action flags checked when starting frame update */
+   int regen_palette;
+ 
    /* A table of all the fonts we have already loaded.  */
    struct font_info *font_table;
*************** extern struct win32_display_info *win32_
*** 187,190 ****
--- 214,220 ----
  struct win32_output
  {
+   /* Original palette (used to deselect real palette after drawing) */
+   HPALETTE old_palette;
+ 
    /* Position of the Win32 window (x and y offsets in root window).  */
    int left_pos;
*************** extern XFontStruct *win32_load_font ();
*** 548,555 ****
  extern void win32_unload_font ();
  
- extern HDC map_mode();
- 
- #define my_get_dc(hwnd) (map_mode (GetDC (hwnd)))
- 
  #define WM_EMACS_START                 (WM_USER + 1)
  #define WM_EMACS_KILL                  (WM_EMACS_START + 0x00)
--- 578,581 ----
*************** extern HDC map_mode();
*** 557,563 ****
  #define WM_EMACS_DONE                  (WM_EMACS_START + 0x02)
  #define WM_EMACS_CREATESCROLLBAR       (WM_EMACS_START + 0x03)
! #define WM_EMACS_DESTROYWINDOW         (WM_EMACS_START + 0x04)
  #define WM_EMACS_END                   (WM_EMACS_START + 0x10)
  
  #define WND_X_UNITS_INDEX      (0) 
  #define WND_Y_UNITS_INDEX      (4) 
--- 583,600 ----
  #define WM_EMACS_DONE                  (WM_EMACS_START + 0x02)
  #define WM_EMACS_CREATESCROLLBAR       (WM_EMACS_START + 0x03)
! #define WM_EMACS_SHOWWINDOW            (WM_EMACS_START + 0x04)
! #define WM_EMACS_SETWINDOWPOS          (WM_EMACS_START + 0x05)
! #define WM_EMACS_DESTROYWINDOW         (WM_EMACS_START + 0x06)
  #define WM_EMACS_END                   (WM_EMACS_START + 0x10)
  
+ typedef struct {
+   HWND hwndAfter;
+   int x;
+   int y;
+   int cx;
+   int cy;
+   int flags;
+ } Win32WindowPos;
+ 
  #define WND_X_UNITS_INDEX      (0) 
  #define WND_Y_UNITS_INDEX      (4) 
*************** typedef struct Win32Msg {
*** 578,586 ****
  } Win32Msg;
  
  extern void init_crit ();
- extern void enter_crit ();
- extern void leave_crit ();
  extern void delete_crit ();
  
  extern BOOL get_next_msg ();
  extern BOOL post_msg ();
--- 615,631 ----
  } Win32Msg;
  
+ extern CRITICAL_SECTION critsect;
+ 
  extern void init_crit ();
  extern void delete_crit ();
  
+ #define enter_crit() EnterCriticalSection (&critsect)
+ #define leave_crit() LeaveCriticalSection (&critsect)
+ 
+ extern void select_palette (struct frame * f, HDC hdc);
+ extern void deselect_palette (struct frame * f, HDC hdc);
+ extern HDC get_frame_dc (struct frame * f);
+ extern int release_frame_dc (struct frame * f, HDC hDC);
+ 
  extern BOOL get_next_msg ();
  extern BOOL post_msg ();
*************** extern void wait_for_sync ();
*** 588,589 ****
--- 633,658 ----
  
  extern BOOL parse_button ();
+ 
+ /* Keypad command key support.  Win32 doesn't have virtual keys defined
+    for the function keys on the keypad (they are mapped to the standard
+    fuction keys), so we define our own.  */
+ #define VK_NUMPAD_BEGIN		0x92
+ #define VK_NUMPAD_CLEAR		(VK_NUMPAD_BEGIN + 0)
+ #define VK_NUMPAD_ENTER		(VK_NUMPAD_BEGIN + 1)
+ #define VK_NUMPAD_PRIOR		(VK_NUMPAD_BEGIN + 2)
+ #define VK_NUMPAD_NEXT		(VK_NUMPAD_BEGIN + 3)
+ #define VK_NUMPAD_END		(VK_NUMPAD_BEGIN + 4)
+ #define VK_NUMPAD_HOME		(VK_NUMPAD_BEGIN + 5)
+ #define VK_NUMPAD_LEFT		(VK_NUMPAD_BEGIN + 6)
+ #define VK_NUMPAD_UP		(VK_NUMPAD_BEGIN + 7)
+ #define VK_NUMPAD_RIGHT		(VK_NUMPAD_BEGIN + 8)
+ #define VK_NUMPAD_DOWN		(VK_NUMPAD_BEGIN + 9)
+ #define VK_NUMPAD_INSERT	(VK_NUMPAD_BEGIN + 10)
+ #define VK_NUMPAD_DELETE	(VK_NUMPAD_BEGIN + 11)
+ 
+ #ifndef VK_LWIN
+ /* Older compiler environments don't have these defined.  */
+ #define VK_LWIN			0x5B
+ #define VK_RWIN			0x5C
+ #define VK_APPS			0x5D
+ #endif
diff -2rcpP --exclude=*.elc emacs-19.30/src/w32xfns.c emacs-19.31/src/w32xfns.c
*** emacs-19.30/src/w32xfns.c	Tue Nov  7 02:38:47 1995
--- emacs-19.31/src/w32xfns.c	Fri May  3 14:31:40 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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 <signal.h>
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  #include <signal.h>
*************** the Free Software Foundation, 675 Mass A
*** 22,25 ****
--- 23,27 ----
  #include <stdio.h>
  #include "lisp.h"
+ #include "frame.h"
  #include "blockinput.h"
  #include "w32term.h"
*************** the Free Software Foundation, 675 Mass A
*** 31,35 ****
  CRITICAL_SECTION critsect;
  extern HANDLE keyboard_handle;
! HANDLE hEvent = NULL;
  
  void 
--- 33,37 ----
  CRITICAL_SECTION critsect;
  extern HANDLE keyboard_handle;
! HANDLE input_available = NULL;
  
  void 
*************** init_crit ()
*** 37,64 ****
  {
    InitializeCriticalSection (&critsect);
-   keyboard_handle = hEvent = CreateEvent (NULL, FALSE, FALSE, NULL);
- }
  
! void 
! enter_crit ()
! {
!   EnterCriticalSection (&critsect);
  }
  
  void 
! leave_crit ()
  {
!   LeaveCriticalSection (&critsect);
  }
  
! void 
! delete_crit ()
  {
!   DeleteCriticalSection (&critsect);
!   if (hEvent)
      {
!       CloseHandle (hEvent);
!       hEvent = NULL;
      }
  }
  
--- 39,112 ----
  {
    InitializeCriticalSection (&critsect);
  
!   /* For safety, input_available should only be reset by get_next_msg
!      when the input queue is empty, so make it a manual reset event. */
!   keyboard_handle = input_available = CreateEvent (NULL, TRUE, FALSE, NULL);
  }
  
  void 
! delete_crit ()
  {
!   DeleteCriticalSection (&critsect);
! 
!   if (input_available)
!     {
!       CloseHandle (input_available);
!       input_available = NULL;
!     }
  }
  
! void
! select_palette (FRAME_PTR f, HDC hdc)
  {
!   if (!NILP (Vwin32_enable_palette))
!     f->output_data.win32->old_palette =
!       SelectPalette (hdc, one_win32_display_info.palette, FALSE);
!   else
!     f->output_data.win32->old_palette = NULL;
! 
!   if (RealizePalette (hdc))
!   {
!     Lisp_Object frame, framelist;
!     FOR_EACH_FRAME (framelist, frame)
      {
!       SET_FRAME_GARBAGED (XFRAME (frame));
      }
+   }
+ }
+ 
+ void
+ deselect_palette (FRAME_PTR f, HDC hdc)
+ {
+   if (f->output_data.win32->old_palette)
+     SelectPalette (hdc, f->output_data.win32->old_palette, FALSE);
+ }
+ 
+ /* Get a DC for frame and select palette for drawing; force an update of
+    all frames if palette's mapping changes.  */
+ HDC
+ get_frame_dc (FRAME_PTR f)
+ {
+   HDC hdc;
+ 
+   enter_crit ();
+ 
+   hdc = GetDC (f->output_data.win32->window_desc);
+   select_palette (f, hdc);
+ 
+   return hdc;
+ }
+ 
+ int
+ release_frame_dc (FRAME_PTR f, HDC hdc)
+ {
+   int ret;
+ 
+   deselect_palette (f, hdc);
+   ret = ReleaseDC (f->output_data.win32->window_desc, hdc);
+ 
+   leave_crit ();
+ 
+   return ret;
  }
  
*************** get_next_msg (lpmsg, bWait)
*** 87,91 ****
      {
        leave_crit ();
!       WaitForSingleObject (hEvent, INFINITE);
        enter_crit ();
      }
--- 135,139 ----
      {
        leave_crit ();
!       WaitForSingleObject (input_available, INFINITE);
        enter_crit ();
      }
*************** get_next_msg (lpmsg, bWait)
*** 107,110 ****
--- 155,161 ----
        bRet = TRUE;
      }
+ 
+   if (nQueue == 0)
+     ResetEvent (input_available);
    
    leave_crit ();
*************** post_msg (lpmsg)
*** 119,123 ****
    int_msg * lpNew = (int_msg *) myalloc (sizeof (int_msg));
  
!   if (!lpNew) return (FALSE);
  
    bcopy (lpmsg, &(lpNew->w32msg), sizeof (Win32Msg));
--- 170,175 ----
    int_msg * lpNew = (int_msg *) myalloc (sizeof (int_msg));
  
!   if (!lpNew)
!     return (FALSE);
  
    bcopy (lpmsg, &(lpNew->w32msg), sizeof (Win32Msg));
*************** post_msg (lpmsg)
*** 133,140 ****
      {
        lpHead = lpNew;
-       SetEvent (hEvent);
      }
  
    lpTail = lpNew;
      
    leave_crit ();
--- 185,192 ----
      {
        lpHead = lpNew;
      }
  
    lpTail = lpNew;
+   SetEvent (input_available);
      
    leave_crit ();
*************** post_msg (lpmsg)
*** 143,146 ****
--- 195,219 ----
  }
  
+ BOOL
+ prepend_msg (Win32Msg *lpmsg)
+ {
+   int_msg * lpNew = (int_msg *) myalloc (sizeof (int_msg));
+ 
+   if (!lpNew)
+     return (FALSE);
+ 
+   bcopy (lpmsg, &(lpNew->w32msg), sizeof (Win32Msg));
+ 
+   enter_crit ();
+ 
+   nQueue++;
+   lpNew->lpNext = lpHead;
+   lpHead = lpNew;
+ 
+   leave_crit ();
+ 
+   return (TRUE);
+ }
+ 
  /*
   *    XParseGeometry parses strings of the form
*************** XParseGeometry (string, x, y, width, hei
*** 278,284 ****
  }
  
! /* The semantics of the use of using_x_p is really using_a_window_system.  */
  int
! using_x_p (void)
  {
    return 1;
--- 351,357 ----
  }
  
! /* We can use mouse menus when we wish.  */
  int
! have_menus_p (void)
  {
    return 1;
diff -2rcpP --exclude=*.elc emacs-19.30/src/widget.c emacs-19.31/src/widget.c
*** emacs-19.30/src/widget.c	Tue Jul 25 20:03:38 1995
--- emacs-19.31/src/widget.c	Thu Apr 18 00:13:15 1996
*************** GNU General Public License for more deta
*** 16,23 ****
  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.  */
  
  /* Emacs 19 face widget ported by Fred Pierresteguy */
  
  #include <config.h>
  #include <stdio.h>
--- 16,34 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* Emacs 19 face widget ported by Fred Pierresteguy */
  
+ /* This file has been censored by the Communications Decency Act.
+    That law was passed under the guise of a ban on pornography, but
+    it bans far more than that.  This file did not contain pornography,
+    but it was censored nonetheless.
+ 
+    For information on US government censorship of the Internet, and
+    what you can do to bring back freedom of the press, see the web
+    site http://www.vtw.org/
+    */
+ 
  #include <config.h>
  #include <stdio.h>
*************** pixel_to_char_size (ew, pixel_width, pix
*** 183,188 ****
  {
    struct frame* f = ew->emacs_frame.frame;
!   *char_width = PIXEL_TO_CHAR_WIDTH (f, pixel_width);
!   *char_height = PIXEL_TO_CHAR_HEIGHT (f, pixel_height);
  }
  
--- 194,199 ----
  {
    struct frame* f = ew->emacs_frame.frame;
!   *char_width = PIXEL_TO_CHAR_WIDTH (f, (int) pixel_width);
!   *char_height = PIXEL_TO_CHAR_HEIGHT (f, (int) pixel_height);
  }
  
*************** set_frame_size (ew)
*** 312,316 ****
    if (! XtIsSubclass (wmshell, shellWidgetClass)) abort ();
  
!   /* We don't need this for the momment. The geometry is computed in 
       xfns.c.  */
  #if 0
--- 323,327 ----
    if (! XtIsSubclass (wmshell, shellWidgetClass)) abort ();
  
!   /* We don't need this for the moment. The geometry is computed in 
       xfns.c.  */
  #if 0
*************** update_various_frame_slots (ew)
*** 632,636 ****
  {
    struct x_output *x = ew->emacs_frame.frame->output_data.x;
!   x->pixel_height = ew->core.height;
    x->pixel_width = ew->core.width;
    x->internal_border_width = ew->emacs_frame.internal_border_width;
--- 643,647 ----
  {
    struct x_output *x = ew->emacs_frame.frame->output_data.x;
!   x->pixel_height = ew->core.height + x->menubar_height;
    x->pixel_width = ew->core.width;
    x->internal_border_width = ew->emacs_frame.internal_border_width;
*************** update_from_various_frame_slots (ew)
*** 643,647 ****
  {
    struct x_output *x = ew->emacs_frame.frame->output_data.x;
!   ew->core.height = x->pixel_height;
    ew->core.width = x->pixel_width;
    ew->core.background_pixel = x->background_pixel;
--- 654,658 ----
  {
    struct x_output *x = ew->emacs_frame.frame->output_data.x;
!   ew->core.height = x->pixel_height - x->menubar_height;
    ew->core.width = x->pixel_width;
    ew->core.background_pixel = x->background_pixel;
*************** EmacsFrameRealize (widget, mask, attrs)
*** 722,732 ****
    EmacsFrame ew = (EmacsFrame)widget;
  
!   attrs->event_mask = (KeyPressMask | ExposureMask | ButtonPressMask |
! 		       ButtonReleaseMask | StructureNotifyMask |
! 		       FocusChangeMask | PointerMotionHintMask |
! 		       PointerMotionMask | LeaveWindowMask | EnterWindowMask |
! 		       VisibilityChangeMask | PropertyChangeMask |
! 		       StructureNotifyMask | SubstructureNotifyMask |
! 		       SubstructureRedirectMask);
    *mask |= CWEventMask;
    XtCreateWindow (widget, InputOutput, (Visual *)CopyFromParent, *mask,
--- 733,738 ----
    EmacsFrame ew = (EmacsFrame)widget;
  
!   attrs->event_mask = (STANDARD_EVENT_SET | PropertyChangeMask
! 		       | SubstructureNotifyMask | SubstructureRedirectMask);
    *mask |= CWEventMask;
    XtCreateWindow (widget, InputOutput, (Visual *)CopyFromParent, *mask,
*************** EmacsFrameResize (widget)
*** 771,775 ****
  
    pixel_to_char_size (ew, ew->core.width, ew->core.height, &columns, &rows);
!   change_frame_size (f, rows, columns, 1, 0);
    update_wm_hints (ew); 
    update_various_frame_slots (ew);
--- 777,781 ----
  
    pixel_to_char_size (ew, ew->core.width, ew->core.height, &columns, &rows);
!   change_frame_size (f, rows, columns, 0, 1);
    update_wm_hints (ew); 
    update_various_frame_slots (ew);
*************** EmacsFrameSetValues (cur_widget, req_wid
*** 841,845 ****
       and calling XIconifyWindow doesn't work either (even thought the window
       has been created.)  Perhaps there is some property we could smash
!      directly, but I'm sick of this for now.  Xt is a steaming pile of shit!
     */
    if (cur->emacs_frame.iconic != new->emacs_frame.iconic)
--- 847,851 ----
       and calling XIconifyWindow doesn't work either (even thought the window
       has been created.)  Perhaps there is some property we could smash
!      directly, but I'm sick of this for now.
     */
    if (cur->emacs_frame.iconic != new->emacs_frame.iconic)
diff -2rcpP --exclude=*.elc emacs-19.30/src/widget.h emacs-19.31/src/widget.h
*** emacs-19.30/src/widget.h	Sun Oct  2 08:33:26 1994
--- emacs-19.31/src/widget.h	Mon Jan 15 04:06:29 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  /* Emacs 19 face widget ported by Fred Pierresteguy */
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* Emacs 19 face widget ported by Fred Pierresteguy */
diff -2rcpP --exclude=*.elc emacs-19.30/src/widgetprv.h emacs-19.31/src/widgetprv.h
*** emacs-19.30/src/widgetprv.h	Sat Sep  3 22:00:30 1994
--- emacs-19.31/src/widgetprv.h	Mon Jan 15 04:06:29 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  /* Emacs 19 face widget ported by Fred Pierresteguy */
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* Emacs 19 face widget ported by Fred Pierresteguy */
diff -2rcpP --exclude=*.elc emacs-19.30/src/win32.h emacs-19.31/src/win32.h
*** emacs-19.30/src/win32.h	Tue Nov  7 02:38:47 1995
--- emacs-19.31/src/win32.h	Mon Jan 15 04:06:29 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  #ifndef __WIN32_H__
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  #ifndef __WIN32_H__
diff -2rcpP --exclude=*.elc emacs-19.30/src/window.c emacs-19.31/src/window.c
*** emacs-19.30/src/window.c	Tue Nov 21 13:18:45 1995
--- emacs-19.31/src/window.c	Tue Apr  9 17:59:53 1996
***************
*** 1,5 ****
  /* Window creation, deletion and examination for GNU Emacs.
     Does not include redisplay.
!    Copyright (C) 1985, 86, 87, 93, 94, 95 Free Software Foundation, Inc.
  
  This file is part of GNU Emacs.
--- 1,5 ----
  /* Window creation, deletion and examination for GNU Emacs.
     Does not include redisplay.
!    Copyright (C) 1985, 86, 87, 93, 94, 95, 96 Free Software Foundation, Inc.
  
  This file is part of GNU Emacs.
*************** GNU General Public License for more deta
*** 17,21 ****
  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 <config.h>
--- 17,22 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  #include <config.h>
*************** Lisp_Object Vsame_window_regexps;
*** 98,102 ****
  Lisp_Object Qtemp_buffer_show_hook;
  
! /* Fdisplay_buffer always splits the largest window 
     if that window is more than this high.  */
  int split_height_threshold;
--- 99,103 ----
  Lisp_Object Qtemp_buffer_show_hook;
  
! /* Fdisplay_buffer always splits the largest window
     if that window is more than this high.  */
  int split_height_threshold;
*************** int next_screen_context_lines;
*** 108,127 ****
  static int sequence_number;
  
  #define min(a, b) ((a) < (b) ? (a) : (b))
  
  DEFUN ("windowp", Fwindowp, Swindowp, 1, 1, 0,
!   "Returns t if OBJ is a window.")
!   (obj)
!      Lisp_Object obj;
  {
!   return WINDOWP (obj) ? Qt : Qnil;
  }
  
  DEFUN ("window-live-p", Fwindow_live_p, Swindow_live_p, 1, 1, 0,
!   "Returns t if OBJ is a window which is currently visible.")
!      (obj)
!      Lisp_Object obj;
  {
!   return (WINDOWP (obj) && ! NILP (XWINDOW (obj)->buffer) ? Qt : Qnil);
  }
  
--- 109,133 ----
  static int sequence_number;
  
+ /* Nonzero after init_window_once has finished.  */
+ static int window_initialized;
+ 
  #define min(a, b) ((a) < (b) ? (a) : (b))
+ 
+ extern Lisp_Object Qwindow_scroll_functions, Vwindow_scroll_functions;
  
  DEFUN ("windowp", Fwindowp, Swindowp, 1, 1, 0,
!   "Returns t if OBJECT is a window.")
!   (object)
!      Lisp_Object object;
  {
!   return WINDOWP (object) ? Qt : Qnil;
  }
  
  DEFUN ("window-live-p", Fwindow_live_p, Swindow_live_p, 1, 1, 0,
!   "Returns t if OBJECT is a window which is currently visible.")
!      (object)
!      Lisp_Object object;
  {
!   return (WINDOWP (object) && ! NILP (XWINDOW (object)->buffer) ? Qt : Qnil);
  }
  
*************** coordinates_in_window (w, x, y)
*** 388,392 ****
        && ! MINI_WINDOW_P (w))
      return 2;
!   
    /* Is the character in the right border?  */
    if (*x == left + width - 1
--- 394,398 ----
        && ! MINI_WINDOW_P (w))
      return 2;
! 
    /* Is the character in the right border?  */
    if (*x == left + width - 1
*************** If they are on the border between WINDOW
*** 431,435 ****
      case 2:			/* In mode line of window. */
        return Qmode_line;
!       
      case 3:			/* On right border of window.  */
        return Qvertical_line;
--- 437,441 ----
      case 2:			/* In mode line of window. */
        return Qmode_line;
! 
      case 3:			/* On right border of window.  */
        return Qvertical_line;
*************** window_from_coordinates (frame, x, y, pa
*** 468,472 ****
      }
    while (! EQ (tem, first));
!   
    return Qnil;
  }
--- 474,478 ----
      }
    while (! EQ (tem, first));
! 
    return Qnil;
  }
*************** DEFUN ("next-window", Fnext_window, Snex
*** 1024,1028 ****
  	}
      }
!   /* Which windows are acceptible?
       Exit the loop and accept this window if
       this isn't a minibuffer window,
--- 1030,1034 ----
  	}
      }
!   /* Which windows are acceptable?
       Exit the loop and accept this window if
       this isn't a minibuffer window,
*************** DEFUN ("next-window", Fnext_window, Snex
*** 1043,1047 ****
  
  DEFUN ("previous-window", Ffoo, Sfoo, 0, 3, 0,
!   "Return the window preceeding WINDOW in canonical ordering of windows.\n\
  If omitted, WINDOW defaults to the selected window.\n\
  \n\
--- 1049,1053 ----
  
  DEFUN ("previous-window", Ffoo, Sfoo, 0, 3, 0,
!   "Return the window preceding WINDOW in canonical ordering of windows.\n\
  If omitted, WINDOW defaults to the selected window.\n\
  \n\
*************** DEFUN ("previous-window", Fprevious_wind
*** 1186,1190 ****
  	}
      }
!   /* Which windows are acceptible?
       Exit the loop and accept this window if
       this isn't a minibuffer window,
--- 1192,1196 ----
  	}
      }
!   /* Which windows are acceptable?
       Exit the loop and accept this window if
       this isn't a minibuffer window,
*************** This command selects the window ARG step
*** 1206,1218 ****
  A negative ARG moves in the opposite order.  If the optional second\n\
  argument ALL_FRAMES is non-nil, cycle through all frames.")
!   (n, all_frames)
!      register Lisp_Object n, all_frames;
  {
    register int i;
    register Lisp_Object w;
  
!   CHECK_NUMBER (n, 0);
    w = selected_window;
!   i = XINT (n);
  
    while (i > 0)
--- 1212,1224 ----
  A negative ARG moves in the opposite order.  If the optional second\n\
  argument ALL_FRAMES is non-nil, cycle through all frames.")
!   (arg, all_frames)
!      register Lisp_Object arg, all_frames;
  {
    register int i;
    register Lisp_Object w;
  
!   CHECK_NUMBER (arg, 0);
    w = selected_window;
!   i = XINT (arg);
  
    while (i > 0)
*************** window_loop (type, obj, mini, frames)
*** 1469,1473 ****
  
    return best_window;
! }     
  
  DEFUN ("get-lru-window", Fget_lru_window, Sget_lru_window, 0, 1, 0,
--- 1475,1479 ----
  
    return best_window;
! }
  
  DEFUN ("get-lru-window", Fget_lru_window, Sget_lru_window, 0, 1, 0,
*************** DEFUN ("replace-buffer-in-windows", Frep
*** 1625,1628 ****
--- 1631,1654 ----
    return Qnil;
  }
+ 
+ /* Replace BUFFER with some other buffer in all windows
+    of all frames, even those on other keyboards.  */
+ 
+ void
+ replace_buffer_in_all_windows (buffer)
+      Lisp_Object buffer;
+ {
+ #ifdef MULTI_KBOARD
+   Lisp_Object tail, frame;
+ 
+   /* A single call to window_loop won't do the job
+      because it only considers frames on the current keyboard.
+      So loop manually over frames, and handle each one.  */
+   FOR_EACH_FRAME (tail, frame)
+     window_loop (UNSHOW_BUFFER, buffer, 0, frame);
+ #else
+   window_loop (UNSHOW_BUFFER, buffer, 0, Qt);
+ #endif
+ }
  
  /* Set the height of WINDOW and all its inferiors.  */
*************** check_frame_size (frame, rows, cols)
*** 1654,1658 ****
  {
    /* For height, we have to see:
!      whether the frame has a minibuffer, 
       whether it wants a mode line, and
       whether it has a menu bar.  */
--- 1680,1684 ----
  {
    /* For height, we have to see:
!      whether the frame has a minibuffer,
       whether it wants a mode line, and
       whether it has a menu bar.  */
*************** set_window_width (window, width, nodelet
*** 1803,1806 ****
--- 1829,1840 ----
  int window_select_count;
  
+ Lisp_Object
+ Fset_window_buffer_unwind (obuf)
+      Lisp_Object obuf;
+ {
+   Fset_buffer (obuf);
+   return Qnil;
+ }
+ 
  DEFUN ("set-window-buffer", Fset_window_buffer, Sset_window_buffer, 2, 2, 0,
    "Make WINDOW display BUFFER as its contents.\n\
*************** BUFFER can be a buffer or buffer name.")
*** 1811,1814 ****
--- 1845,1849 ----
    register Lisp_Object tem;
    register struct window *w = decode_window (window);
+   int count = specpdl_ptr - specpdl;
  
    buffer = Fget_buffer (buffer);
*************** BUFFER can be a buffer or buffer name.")
*** 1834,1838 ****
    XSETFASTINT (w->window_end_pos, 0);
    w->window_end_valid = Qnil;
!   XSETFASTINT(w->hscroll, 0);
    Fset_marker (w->pointm,
  	       make_number (BUF_PT (XBUFFER (buffer))),
--- 1869,1873 ----
    XSETFASTINT (w->window_end_pos, 0);
    w->window_end_valid = Qnil;
!   XSETFASTINT (w->hscroll, 0);
    Fset_marker (w->pointm,
  	       make_number (BUF_PT (XBUFFER (buffer))),
*************** BUFFER can be a buffer or buffer name.")
*** 1845,1850 ****
--- 1880,1902 ----
    XSETFASTINT (w->last_modified, 0);
    windows_or_buffers_changed++;
+ 
+   /* We must select BUFFER for running the window-scroll-functions.
+      If WINDOW is selected, switch permanently.
+      Otherwise, switch but go back to the ambient buffer afterward.  */
    if (EQ (window, selected_window))
      Fset_buffer (buffer);
+   /* We can't check ! NILP (Vwindow_scroll_functions) here
+      because that might itself be a local variable.  */
+   else if (window_initialized)
+     {
+       record_unwind_protect (Fset_window_buffer_unwind, Fcurrent_buffer ());
+       Fset_buffer (buffer);
+     }
+ 
+   if (! NILP (Vwindow_scroll_functions))
+     run_hook_with_args_2 (Qwindow_scroll_functions, window,
+ 			  Fmarker_position (w->start));
+ 
+   unbind_to (count, Qnil);
  
    return Qnil;
*************** before each command.")
*** 1912,1916 ****
  }
  
! /* Deiconify the frame containing the window WINDOW, then return WINDOW.  */
  
  static Lisp_Object
--- 1964,1976 ----
  }
  
! /* Deiconify the frame containing the window WINDOW,
!    unless it is the selected frame;
!    then return WINDOW.
! 
!    The reason for the exception for the selected frame
!    is that it seems better not to change the selected frames visibility
!    merely because of displaying a different buffer in it.
!    The deiconification is useful when a buffer gets shown in
!    another frame that you were not using lately.  */
  
  static Lisp_Object
*************** display_buffer_1 (window)
*** 1921,1926 ****
    FRAME_PTR f = XFRAME (WINDOW_FRAME (XWINDOW (window)));
    FRAME_SAMPLE_VISIBILITY (f);
!   if (FRAME_ICONIFIED_P (f))
!     Fmake_frame_visible (WINDOW_FRAME (XWINDOW (window)));
  #endif
    return window;
--- 1981,1991 ----
    FRAME_PTR f = XFRAME (WINDOW_FRAME (XWINDOW (window)));
    FRAME_SAMPLE_VISIBILITY (f);
!   if (f != selected_frame)
!     {
!       if (FRAME_ICONIFIED_P (f))
! 	Fmake_frame_visible (WINDOW_FRAME (XWINDOW (window)));
!       else if (FRAME_VISIBLE_P (f))
! 	Fraise_frame (WINDOW_FRAME (XWINDOW (window)));
!     }
  #endif
    return window;
*************** Returns the window displaying BUFFER.")
*** 2015,2019 ****
        if (!NILP (tem))
  	return call2 (Vspecial_display_function, buffer, XCONS (tem)->cdr);
!       
        for (tem = Vspecial_display_regexps; CONSP (tem); tem = XCONS (tem)->cdr)
  	{
--- 2080,2084 ----
        if (!NILP (tem))
  	return call2 (Vspecial_display_function, buffer, XCONS (tem)->cdr);
! 
        for (tem = Vspecial_display_regexps; CONSP (tem); tem = XCONS (tem)->cdr)
  	{
*************** Returns the window displaying BUFFER.")
*** 2054,2058 ****
        Lisp_Object frames;
  
!       frames = Qnil;      
  #ifdef MULTI_FRAME
        if (FRAME_MINIBUF_ONLY_P (selected_frame))
--- 2119,2123 ----
        Lisp_Object frames;
  
!       frames = Qnil;
  #ifdef MULTI_FRAME
        if (FRAME_MINIBUF_ONLY_P (selected_frame))
*************** temp_output_buffer_show (buf)
*** 2186,2190 ****
        set_marker_restricted (w->pointm, make_number (1), buf);
  
!       /* Run temp-buffer-show-hook, with the chosen window selected.  */ 
        if (!NILP (Vrun_hooks))
  	{
--- 2251,2255 ----
        set_marker_restricted (w->pointm, make_number (1), buf);
  
!       /* Run temp-buffer-show-hook, with the chosen window selected.  */
        if (!NILP (Vrun_hooks))
  	{
*************** DEFUN ("split-window", Fsplit_window, Ss
*** 2247,2258 ****
    "Split WINDOW, putting SIZE lines in the first of the pair.\n\
  WINDOW defaults to selected one and SIZE to half its size.\n\
! If optional third arg HOR-FLAG is non-nil, split side by side\n\
  and put SIZE columns in the first of the pair.")
!   (window, chsize, horflag)
!      Lisp_Object window, chsize, horflag;
  {
    register Lisp_Object new;
    register struct window *o, *p;
!   register int size;
  
    if (NILP (window))
--- 2312,2326 ----
    "Split WINDOW, putting SIZE lines in the first of the pair.\n\
  WINDOW defaults to selected one and SIZE to half its size.\n\
! If optional third arg HORFLAG is non-nil, split side by side\n\
  and put SIZE columns in the first of the pair.")
!   (window, size, horflag)
!      Lisp_Object window, size, horflag;
  {
    register Lisp_Object new;
    register struct window *o, *p;
!   FRAME_PTR fo;
!   register int size_int;
!   int internal_width;
!   int separator_width = 1;
  
    if (NILP (window))
*************** and put SIZE columns in the first of the
*** 2262,2284 ****
  
    o = XWINDOW (window);
  
!   if (NILP (chsize))
      {
        if (!NILP (horflag))
! 	/* Round odd size up, since this is for the left-hand window,
! 	   and it will lose a column for the separators.  */
! 	size = ((XFASTINT (o->width) + 1) & -2) >> 1;
        else
! 	size = XFASTINT (o->height) >> 1;
      }
    else
      {
!       CHECK_NUMBER (chsize, 1);
!       size = XINT (chsize);
      }
  
    if (MINI_WINDOW_P (o))
      error ("Attempt to split minibuffer window");
!   else if (FRAME_NO_SPLIT_P (XFRAME (WINDOW_FRAME (o))))
      error ("Attempt to split unsplittable frame");
  
--- 2330,2356 ----
  
    o = XWINDOW (window);
+   fo = XFRAME (WINDOW_FRAME (o));
+   if (FRAME_HAS_VERTICAL_SCROLL_BARS (fo))
+     separator_width = FRAME_SCROLL_BAR_COLS (fo);
+   internal_width = window_internal_width (o);
  
!   if (NILP (size))
      {
        if (!NILP (horflag))
! 	/* Calculate the size of the left-hand window, by dividing
! 	   the usable space in columns by two. */
! 	size_int = (internal_width - separator_width) >> 1;
        else
! 	size_int = XFASTINT (o->height) >> 1;
      }
    else
      {
!       CHECK_NUMBER (size, 1);
!       size_int = XINT (size);
      }
  
    if (MINI_WINDOW_P (o))
      error ("Attempt to split minibuffer window");
!   else if (FRAME_NO_SPLIT_P (fo))
      error ("Attempt to split unsplittable frame");
  
*************** and put SIZE columns in the first of the
*** 2287,2295 ****
    if (NILP (horflag))
      {
!       if (size < window_min_height)
! 	error ("Window height %d too small (after splitting)", size);
!       if (size + window_min_height > XFASTINT (o->height))
! 	error ("Window height %d too small (after splitting)", 
! 	       XFASTINT (o->height) - size);
        if (NILP (o->parent)
  	  || NILP (XWINDOW (o->parent)->vchild))
--- 2359,2367 ----
    if (NILP (horflag))
      {
!       if (size_int < window_min_height)
! 	error ("Window height %d too small (after splitting)", size_int);
!       if (size_int + window_min_height > XFASTINT (o->height))
! 	error ("Window height %d too small (after splitting)",
! 	       XFASTINT (o->height) - size_int);
        if (NILP (o->parent)
  	  || NILP (XWINDOW (o->parent)->vchild))
*************** and put SIZE columns in the first of the
*** 2302,2310 ****
    else
      {
!       if (size < window_min_width)
! 	error ("Window width %d too small (after splitting)", size);
!       if (size + window_min_width > XFASTINT (o->width))
! 	error ("Window width %d too small (after splitting)", 
! 	       XFASTINT (o->width) - size);
        if (NILP (o->parent)
  	  || NILP (XWINDOW (o->parent)->hchild))
--- 2374,2382 ----
    else
      {
!       if (size_int < window_min_width)
! 	error ("Window width %d too small (after splitting)", size_int);
!       if (internal_width - size_int - separator_width < window_min_width)
! 	error ("Window width %d too small (after splitting)",
! 	       internal_width - size_int - separator_width);
        if (NILP (o->parent)
  	  || NILP (XWINDOW (o->parent)->hchild))
*************** and put SIZE columns in the first of the
*** 2321,2325 ****
  
    windows_or_buffers_changed++;
!   FRAME_WINDOW_SIZES_CHANGED (XFRAME (WINDOW_FRAME (o))) = 1;
    new = make_window ();
    p = XWINDOW (new);
--- 2393,2397 ----
  
    windows_or_buffers_changed++;
!   FRAME_WINDOW_SIZES_CHANGED (fo) = 1;
    new = make_window ();
    p = XWINDOW (new);
*************** and put SIZE columns in the first of the
*** 2342,2348 ****
        p->height = o->height;
        p->top = o->top;
!       XSETFASTINT (p->width, XFASTINT (o->width) - size);
!       XSETFASTINT (o->width, size);
!       XSETFASTINT (p->left, XFASTINT (o->left) + size);
      }
    else
--- 2414,2421 ----
        p->height = o->height;
        p->top = o->top;
!       size_int += separator_width;
!       XSETFASTINT (p->width, internal_width - size_int);
!       XSETFASTINT (o->width, size_int);
!       XSETFASTINT (p->left, XFASTINT (o->left) + size_int);
      }
    else
*************** and put SIZE columns in the first of the
*** 2350,2356 ****
        p->left = o->left;
        p->width = o->width;
!       XSETFASTINT (p->height, XFASTINT (o->height) - size);
!       XSETFASTINT (o->height, size);
!       XSETFASTINT (p->top, XFASTINT (o->top) + size);
      }
  
--- 2423,2429 ----
        p->left = o->left;
        p->width = o->width;
!       XSETFASTINT (p->height, XFASTINT (o->height) - size_int);
!       XSETFASTINT (o->height, size_int);
!       XSETFASTINT (p->top, XFASTINT (o->top) + size_int);
      }
  
*************** DEFUN ("enlarge-window", Fenlarge_window
*** 2361,2369 ****
    "Make current window ARG lines bigger.\n\
  From program, optional second arg non-nil means grow sideways ARG columns.")
!   (n, side)
!      register Lisp_Object n, side;
  {
!   CHECK_NUMBER (n, 0);
!   change_window_height (XINT (n), !NILP (side));
    return Qnil;
  }
--- 2434,2442 ----
    "Make current window ARG lines bigger.\n\
  From program, optional second arg non-nil means grow sideways ARG columns.")
!   (arg, side)
!      register Lisp_Object arg, side;
  {
!   CHECK_NUMBER (arg, 0);
!   change_window_height (XINT (arg), !NILP (side));
    return Qnil;
  }
*************** From program, optional second arg non-ni
*** 2371,2380 ****
  DEFUN ("shrink-window", Fshrink_window, Sshrink_window, 1, 2, "p",
    "Make current window ARG lines smaller.\n\
! From program, optional second arg non-nil means shrink sideways ARG columns.")
!   (n, side)
!      register Lisp_Object n, side;
  {
!   CHECK_NUMBER (n, 0);
!   change_window_height (-XINT (n), !NILP (side));
    return Qnil;
  }
--- 2444,2453 ----
  DEFUN ("shrink-window", Fshrink_window, Sshrink_window, 1, 2, "p",
    "Make current window ARG lines smaller.\n\
! From program, optional second arg non-nil means shrink sideways arg columns.")
!   (arg, side)
!      register Lisp_Object arg, side;
  {
!   CHECK_NUMBER (arg, 0);
!   change_window_height (-XINT (arg), !NILP (side));
    return Qnil;
  }
*************** window_scroll (window, n, noerror)
*** 2591,2595 ****
  
    /* Always set force_start so that redisplay_window will run
!      thw window-scroll-functions.  */
    w->force_start = Qt;
  
--- 2664,2668 ----
  
    /* Always set force_start so that redisplay_window will run
!      the window-scroll-functions.  */
    w->force_start = Qt;
  
*************** A near full screen is `next-screen-conte
*** 2686,2693 ****
  Negative ARG means scroll downward.\n\
  When calling from a program, supply a number as argument or nil.")
!   (n)
!      Lisp_Object n;
  {
!   scroll_command (n, 1);
    return Qnil;
  }
--- 2759,2766 ----
  Negative ARG means scroll downward.\n\
  When calling from a program, supply a number as argument or nil.")
!   (arg)
!      Lisp_Object arg;
  {
!   scroll_command (arg, 1);
    return Qnil;
  }
*************** A near full screen is `next-screen-conte
*** 2698,2705 ****
  Negative ARG means scroll upward.\n\
  When calling from a program, supply a number as argument or nil.")
!   (n)
!      Lisp_Object n;
  {
!   scroll_command (n, -1);
    return Qnil;
  }
--- 2771,2778 ----
  Negative ARG means scroll upward.\n\
  When calling from a program, supply a number as argument or nil.")
!   (arg)
!      Lisp_Object arg;
  {
!   scroll_command (arg, -1);
    return Qnil;
  }
*************** specifies the window to scroll.\n\
*** 2758,2763 ****
  If `other-window-scroll-buffer' is non-nil, scroll the window\n\
  showing that buffer, popping the buffer up if necessary.")
!   (n)
!      register Lisp_Object n;
  {
    register Lisp_Object window;
--- 2831,2836 ----
  If `other-window-scroll-buffer' is non-nil, scroll the window\n\
  showing that buffer, popping the buffer up if necessary.")
!   (arg)
!      register Lisp_Object arg;
  {
    register Lisp_Object window;
*************** showing that buffer, popping the buffer 
*** 2778,2791 ****
    SET_PT (marker_position (w->pointm));
  
!   if (NILP (n))
      window_scroll (window, defalt, 1);
!   else if (EQ (n, Qminus))
      window_scroll (window, -defalt, 1);
    else
      {
!       if (CONSP (n))
! 	n = Fcar (n);
!       CHECK_NUMBER (n, 0);
!       window_scroll (window, XINT (n), 1);
      }
  
--- 2851,2864 ----
    SET_PT (marker_position (w->pointm));
  
!   if (NILP (arg))
      window_scroll (window, defalt, 1);
!   else if (EQ (arg, Qminus))
      window_scroll (window, -defalt, 1);
    else
      {
!       if (CONSP (arg))
! 	arg = Fcar (arg);
!       CHECK_NUMBER (arg, 0);
!       window_scroll (window, XINT (arg), 1);
      }
  
*************** DEFUN ("recenter", Frecenter, Srecenter,
*** 2835,2842 ****
  The desired position of point is always relative to the current window.\n\
  Just C-u as prefix means put point in the center of the window.\n\
! No arg (i.e., it is nil) erases the entire frame and then\n\
  redraws with point in the center of the current window.")
!   (n)
!      register Lisp_Object n;
  {
    register struct window *w = XWINDOW (selected_window);
--- 2908,2915 ----
  The desired position of point is always relative to the current window.\n\
  Just C-u as prefix means put point in the center of the window.\n\
! If ARG is omitted or nil, erases the entire frame and then\n\
  redraws with point in the center of the current window.")
!   (arg)
!      register Lisp_Object arg;
  {
    register struct window *w = XWINDOW (selected_window);
*************** redraws with point in the center of the 
*** 2844,2868 ****
    struct position pos;
  
!   if (NILP (n))
      {
        extern int frame_garbaged;
  
        SET_FRAME_GARBAGED (XFRAME (WINDOW_FRAME (w)));
!       XSETFASTINT (n, ht / 2);
      }
!   else if (CONSP (n)) /* Just C-u. */
      {
!       XSETFASTINT (n, ht / 2);
      }
    else
      {
!       n = Fprefix_numeric_value (n);
!       CHECK_NUMBER (n, 0);
      }
  
!   if (XINT (n) < 0)
!     XSETINT (n, XINT (n) + ht);
  
!   pos = *vmotion (point, - XINT (n), w);
  
    Fset_marker (w->start, make_number (pos.bufpos), w->buffer);
--- 2917,2941 ----
    struct position pos;
  
!   if (NILP (arg))
      {
        extern int frame_garbaged;
  
        SET_FRAME_GARBAGED (XFRAME (WINDOW_FRAME (w)));
!       XSETFASTINT (arg, ht / 2);
      }
!   else if (CONSP (arg)) /* Just C-u. */
      {
!       XSETFASTINT (arg, ht / 2);
      }
    else
      {
!       arg = Fprefix_numeric_value (arg);
!       CHECK_NUMBER (arg, 0);
      }
  
!   if (XINT (arg) < 0)
!     XSETINT (arg, XINT (arg) + ht);
  
!   pos = *vmotion (point, - XINT (arg), w);
  
    Fset_marker (w->start, make_number (pos.bufpos), w->buffer);
*************** struct saved_window
*** 2951,2959 ****
  
  DEFUN ("window-configuration-p", Fwindow_configuration_p, Swindow_configuration_p, 1, 1, 0,
!   "T if OBJECT is a window-configration object.")
!   (obj)
!      Lisp_Object obj;
  {
!   if (WINDOW_CONFIGURATIONP (obj))
      return Qt;
    return Qnil;
--- 3024,3032 ----
  
  DEFUN ("window-configuration-p", Fwindow_configuration_p, Swindow_configuration_p, 1, 1, 0,
!   "T if OBJECT is a window-configuration object.")
!   (object)
!      Lisp_Object object;
  {
!   if (WINDOW_CONFIGURATIONP (object))
      return Qt;
    return Qnil;
*************** by `current-window-configuration' (which
*** 3027,3031 ****
  	 Mark all windows now on frame as "deleted".
  	 Restoring the new configuration "undeletes" any that are in it.
! 	 
  	 Save their current buffers in their height fields, since we may
  	 need it later, if a buffer saved in the configuration is now
--- 3100,3104 ----
  	 Mark all windows now on frame as "deleted".
  	 Restoring the new configuration "undeletes" any that are in it.
! 
  	 Save their current buffers in their height fields, since we may
  	 need it later, if a buffer saved in the configuration is now
*************** init_window_once ()
*** 3422,3425 ****
--- 3495,3500 ----
    XSETFASTINT (XWINDOW (selected_window)->use_time, ++window_select_count);
  #endif /* not MULTI_FRAME */
+ 
+   window_initialized = 1;
  }
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/window.h emacs-19.31/src/window.h
*** emacs-19.30/src/window.h	Fri Nov 10 11:05:04 1995
--- emacs-19.31/src/window.h	Mon Jan 15 04:06:29 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
diff -2rcpP --exclude=*.elc emacs-19.30/src/xdisp.c emacs-19.31/src/xdisp.c
*** emacs-19.30/src/xdisp.c	Tue Nov 14 12:48:56 1995
--- emacs-19.31/src/xdisp.c	Fri May 17 17:11:25 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** static int debug_end_pos;
*** 159,162 ****
--- 160,164 ----
  int mode_line_inverse_video;
  
+ static void redisplay_internal ();
  static int message_log_check_duplicate ();
  static void echo_area_display ();
*************** static int line_number_display_limit;
*** 228,231 ****
--- 230,235 ----
  Lisp_Object Vmessage_log_max;
  
+ /* Output a newline in the *Messages* buffer if "needs" one.  */
+ 
  void
  message_log_maybe_newline ()
*************** message_dolog (m, len, nlflag)
*** 249,252 ****
--- 253,257 ----
        struct buffer *oldbuf;
        int oldpoint, oldbegv, oldzv;
+       int old_windows_or_buffers_changed = windows_or_buffers_changed;
  
        oldbuf = current_buffer;
*************** message_dolog (m, len, nlflag)
*** 317,325 ****
        TEMP_SET_PT (oldpoint);
        set_buffer_internal (oldbuf);
        message_log_need_newline = !nlflag;
      }
  }
  
- 
  /* We are at the end of the buffer after just having inserted a newline.
     (Note: We depend on the fact we won't be crossing the gap.)
--- 322,330 ----
        TEMP_SET_PT (oldpoint);
        set_buffer_internal (oldbuf);
+       windows_or_buffers_changed = old_windows_or_buffers_changed;
        message_log_need_newline = !nlflag;
      }
  }
  
  /* We are at the end of the buffer after just having inserted a newline.
     (Note: We depend on the fact we won't be crossing the gap.)
*************** message_log_check_duplicate (prev_bol, t
*** 359,367 ****
    return 0;
  }
! 
  /* Display an echo area message M with a specified length of LEN chars.
!    The string may include null characters.  If m is 0, clear out any
     existing message, and let the minibuffer text show through.
!    Do not pass text that is stored in a Lisp string.  */
  
  void
--- 364,377 ----
    return 0;
  }
! 
  /* Display an echo area message M with a specified length of LEN chars.
!    The string may include null characters.  If M is 0, clear out any
     existing message, and let the minibuffer text show through.
! 
!    The buffer M must continue to exist until after the echo area
!    gets cleared or some other message gets displayed there.
! 
!    Do not pass text that is stored in a Lisp string.
!    Do not pass text in a buffer that was alloca'd.  */
  
  void
*************** message2 (m, len)
*** 378,382 ****
  
  
! /* The non-logging part of that function.  */
  
  void
--- 388,392 ----
  
  
! /* The non-logging counterpart of message2.  */
  
  void
*************** message2_nolog (m, len)
*** 431,434 ****
--- 441,453 ----
      }
  }
+ 
+ /* Display a null-terminated echo area message M.  If M is 0, clear out any
+    existing message, and let the minibuffer text show through.
+ 
+    The buffer M must continue to exist until after the echo area
+    gets cleared or some other message gets displayed there.
+ 
+    Do not pass text that is stored in a Lisp string.
+    Do not pass text in a buffer that was alloca'd.  */
  
  void
*************** truncate_echo_area (len)
*** 464,469 ****
  int message_buf_print;
  
! /* Dump an informative message to the minibuf.  If m is 0, clear out
     any existing message, and let the minibuffer text show through.  */
  /* VARARGS 1 */
  void
--- 483,489 ----
  int message_buf_print;
  
! /* Dump an informative message to the minibuf.  If M is 0, clear out
     any existing message, and let the minibuffer text show through.  */
+ 
  /* VARARGS 1 */
  void
*************** message (m, a1, a2, a3)
*** 531,535 ****
  }
  
! /* The non-logging version of that function.  */
  void
  message_nolog (m, a1, a2, a3)
--- 551,555 ----
  }
  
! /* The non-logging version of message.  */
  void
  message_nolog (m, a1, a2, a3)
*************** update_echo_area ()
*** 549,553 ****
    message2 (echo_area_glyphs, echo_area_glyphs_length);
  }
! 
  static void
  echo_area_display ()
--- 569,573 ----
    message2 (echo_area_glyphs, echo_area_glyphs_length);
  }
! 
  static void
  echo_area_display ()
*************** echo_area_display ()
*** 612,615 ****
--- 632,637 ----
    previous_echo_glyphs = echo_area_glyphs;
  }
+ 
+ /* Update frame titles.  */
  
  #ifdef HAVE_WINDOW_SYSTEM
*************** prepare_menu_bars ()
*** 708,712 ****
       I think that is no longer a concern.  */
  #ifdef HAVE_WINDOW_SYSTEM
!   if (windows_or_buffers_changed)
      {
        Lisp_Object tail, frame;
--- 730,734 ----
       I think that is no longer a concern.  */
  #ifdef HAVE_WINDOW_SYSTEM
!   if (windows_or_buffers_changed || update_mode_lines)
      {
        Lisp_Object tail, frame;
*************** void
*** 788,791 ****
--- 810,826 ----
  redisplay ()
  {
+   redisplay_internal (0);
+ }
+ 
+ /* If PRESERVE_ECHO_AREA is nonzero, it means this redisplay
+    is not in response to any user action; therefore, we should
+    preserve the echo area.  (Actually, our caller does that job.)
+    Perhaps in the future avoid recentering windows
+    if it is not necessary; currently that causes some problems.  */
+ 
+ static void
+ redisplay_internal (preserve_echo_area)
+      int preserve_echo_area;
+ {
    register struct window *w = XWINDOW (selected_window);
    register int pause;
*************** redisplay ()
*** 798,801 ****
--- 833,841 ----
      return;
  
+ #ifdef USE_X_TOOLKIT
+   if (popup_activated ())
+     return;
+ #endif
+ 
  #ifdef MULTI_FRAME
    if (FRAME_TERMCAP_P (selected_frame)
*************** redisplay ()
*** 1043,1047 ****
  
  	      if (FRAME_VISIBLE_P (f))
! 		redisplay_windows (FRAME_ROOT_WINDOW (f));
  
  	      /* Any scroll bars which redisplay_windows should have nuked
--- 1083,1087 ----
  
  	      if (FRAME_VISIBLE_P (f))
! 		redisplay_windows (FRAME_ROOT_WINDOW (f), preserve_echo_area);
  
  	      /* Any scroll bars which redisplay_windows should have nuked
*************** redisplay ()
*** 1054,1058 ****
    else if (FRAME_VISIBLE_P (selected_frame))
      {
!       redisplay_window (selected_window, 1);
        if (XFASTINT (w->width) != FRAME_WIDTH (selected_frame))
  	preserve_other_columns (w);
--- 1094,1098 ----
    else if (FRAME_VISIBLE_P (selected_frame))
      {
!       redisplay_window (selected_window, 1, preserve_echo_area);
        if (XFASTINT (w->width) != FRAME_WIDTH (selected_frame))
  	preserve_other_columns (w);
*************** redisplay_preserve_echo_area ()
*** 1208,1216 ****
      {
        echo_area_glyphs = previous_echo_glyphs;
!       redisplay ();
        echo_area_glyphs = 0;
      }
    else
!     redisplay ();
  }
  
--- 1248,1256 ----
      {
        echo_area_glyphs = previous_echo_glyphs;
!       redisplay_internal (1);
        echo_area_glyphs = 0;
      }
    else
!     redisplay_internal (1);
  }
  
*************** mark_window_display_accurate (window, fl
*** 1242,1246 ****
        w->window_end_valid = w->buffer;
        w->update_mode_line = Qnil;
!       if (!NILP (w->buffer))
  	XBUFFER (w->buffer)->clip_changed = 0;
  
--- 1282,1286 ----
        w->window_end_valid = w->buffer;
        w->update_mode_line = Qnil;
!       if (!NILP (w->buffer) && flag)
  	XBUFFER (w->buffer)->clip_changed = 0;
  
*************** update_menu_bar (f, save_match_data)
*** 1285,1289 ****
      w->update_mode_line = Qt;
  
!   if (FRAME_X_P (f)
        ?
  #if defined (USE_X_TOOLKIT) || defined (HAVE_NTGUI)
--- 1325,1329 ----
      w->update_mode_line = Qt;
  
!   if (FRAME_WINDOW_P (f)
        ?
  #if defined (USE_X_TOOLKIT) || defined (HAVE_NTGUI)
*************** update_menu_bar (f, save_match_data)
*** 1328,1335 ****
  	  if (! NILP (Vlucid_menu_bar_dirty_flag))
  	    call0 (Qrecompute_lucid_menubar);
! 	  call1 (Vrun_hooks, Qmenu_bar_update_hook);
  	  FRAME_MENU_BAR_ITEMS (f) = menu_bar_items (FRAME_MENU_BAR_ITEMS (f));
  #if defined (USE_X_TOOLKIT) || defined (HAVE_NTGUI)
! 	  if (FRAME_X_P (f))
  	    set_frame_menubar (f, 0, 0);
  #endif /* USE_X_TOOLKIT || HAVE_NTGUI */
--- 1368,1377 ----
  	  if (! NILP (Vlucid_menu_bar_dirty_flag))
  	    call0 (Qrecompute_lucid_menubar);
! 	  safe_run_hooks (Qmenu_bar_update_hook);
  	  FRAME_MENU_BAR_ITEMS (f) = menu_bar_items (FRAME_MENU_BAR_ITEMS (f));
+ 	  /* Make sure to redisplay the menu bar in case we change it.  */
+ 	  w->update_mode_line = Qt;
  #if defined (USE_X_TOOLKIT) || defined (HAVE_NTGUI)
! 	  if (FRAME_WINDOW_P (f))
  	    set_frame_menubar (f, 0, 0);
  #endif /* USE_X_TOOLKIT || HAVE_NTGUI */
*************** int do_id = 1;
*** 1346,1354 ****
  
  static void
! redisplay_windows (window)
       Lisp_Object window;
  {
    for (; !NILP (window); window = XWINDOW (window)->next)
!     redisplay_window (window, 0);
  }
  
--- 1388,1397 ----
  
  static void
! redisplay_windows (window, preserve_echo_area)
       Lisp_Object window;
+      int preserve_echo_area;
  {
    for (; !NILP (window); window = XWINDOW (window)->next)
!     redisplay_window (window, 0, preserve_echo_area);
  }
  
*************** redisplay_windows (window)
*** 1356,1362 ****
  
  static void
! redisplay_window (window, just_this_one)
       Lisp_Object window;
!      int just_this_one;
  {
    register struct window *w = XWINDOW (window);
--- 1399,1405 ----
  
  static void
! redisplay_window (window, just_this_one, preserve_echo_area)
       Lisp_Object window;
!      int just_this_one, preserve_echo_area;
  {
    register struct window *w = XWINDOW (window);
*************** redisplay_window (window, just_this_one)
*** 1380,1389 ****
    if (!NILP (w->vchild))
      {
!       redisplay_windows (w->vchild);
        return;
      }
    if (!NILP (w->hchild))
      {
!       redisplay_windows (w->hchild);
        return;
      }
--- 1423,1432 ----
    if (!NILP (w->vchild))
      {
!       redisplay_windows (w->vchild, preserve_echo_area);
        return;
      }
    if (!NILP (w->hchild))
      {
!       redisplay_windows (w->hchild, preserve_echo_area);
        return;
      }
*************** redisplay_window (window, just_this_one)
*** 1501,1504 ****
--- 1544,1548 ----
    if (!NILP (w->force_start))
      {
+       w->force_start = Qnil;
        /* Forget any recorded base line for line number display.  */
        w->base_line_number = Qnil;
*************** redisplay_window (window, just_this_one)
*** 1506,1509 ****
--- 1550,1557 ----
  	 Also, run the hook window-scroll-functions
  	 because we have scrolled.  */
+       /* Note, we do this after clearing force_start because
+ 	 if there's an error, it is better to forget about force_start
+ 	 than to get into an infinite loop calling the hook functions
+ 	 and having them get more errors.  */
        if (!update_mode_line
  	  || ! NILP (Vwindow_scroll_functions))
*************** redisplay_window (window, just_this_one)
*** 1516,1523 ****
  	  w->update_mode_line = Qt;
  	  if (! NILP (Vwindow_scroll_functions))
! 	    run_hook_with_args_2 (Qwindow_scroll_functions, window,
! 				  make_number (startp));
  	}
-       w->force_start = Qnil;
        XSETFASTINT (w->last_modified, 0);
        if (startp < BEGV) startp = BEGV;
--- 1564,1573 ----
  	  w->update_mode_line = Qt;
  	  if (! NILP (Vwindow_scroll_functions))
! 	    {
! 	      run_hook_with_args_2 (Qwindow_scroll_functions, window,
! 				    make_number (startp));
! 	      startp = marker_position (w->start);
! 	    }
  	}
        XSETFASTINT (w->last_modified, 0);
        if (startp < BEGV) startp = BEGV;
*************** redisplay_window (window, just_this_one)
*** 1560,1564 ****
  
    /* Handle case where text has not changed, only point,
!      and it has not moved off the frame */
  
    /* This code is not used for minibuffer for the sake of
--- 1610,1614 ----
  
    /* Handle case where text has not changed, only point,
!      and it has not moved off the frame.  */
  
    /* This code is not used for minibuffer for the sake of
*************** redisplay_window (window, just_this_one)
*** 1647,1652 ****
      }
    else if (startp >= BEGV && startp <= ZV
! 	   /* Avoid starting display at end of buffer! */
! 	   && (startp < ZV || startp == BEGV
  	       || (XFASTINT (w->last_modified) >= MODIFF)))
      {
--- 1697,1710 ----
      }
    else if (startp >= BEGV && startp <= ZV
! 	   && (startp < ZV
! 	       /* Avoid starting at end of buffer.  */
! #if 0 /* This change causes trouble for M-! finger & RET.
! 	 It will have to be considered later.  */
! 	       || ! EQ (window, selected_window)
! 	       /* Don't do the recentering if redisplay
! 		  is not for no user action.  */
! 	       || preserve_echo_area
! #endif
! 	       || startp == BEGV
  	       || (XFASTINT (w->last_modified) >= MODIFF)))
      {
*************** redisplay_window (window, just_this_one)
*** 1678,1682 ****
    /* Try to scroll by specified few lines */
  
!   if (scroll_step && !current_buffer->clip_changed)
      {
        if (PT > startp)
--- 1736,1741 ----
    /* Try to scroll by specified few lines */
  
!   if (scroll_step && !current_buffer->clip_changed
!       && startp >= BEGV && startp <= ZV)
      {
        if (PT > startp)
*************** redisplay_window (window, just_this_one)
*** 1692,1697 ****
  	{
  	  if (! NILP (Vwindow_scroll_functions))
! 	    run_hook_with_args_2 (Qwindow_scroll_functions, window,
! 				  make_number (pos.bufpos));
  	  try_window (window, pos.bufpos);
  	  if (cursor_vpos >= 0)
--- 1751,1760 ----
  	{
  	  if (! NILP (Vwindow_scroll_functions))
! 	    {
! 	      Fset_marker (w->start, make_number (pos.bufpos), Qnil);
! 	      run_hook_with_args_2 (Qwindow_scroll_functions, window,
! 				    make_number (pos.bufpos));
! 	      pos.bufpos = marker_position (w->start);
! 	    }
  	  try_window (window, pos.bufpos);
  	  if (cursor_vpos >= 0)
*************** recenter:
*** 1716,1722 ****
  
    pos = *vmotion (PT, - (height / 2), w);
    if (! NILP (Vwindow_scroll_functions))
!     run_hook_with_args_2 (Qwindow_scroll_functions, window,
! 			  make_number (pos.bufpos));
    try_window (window, pos.bufpos);
  
--- 1779,1791 ----
  
    pos = *vmotion (PT, - (height / 2), w);
+   /* Set startp here explicitly in case that helps avoid an infinite loop
+      in case the window-scroll-functions functions get errors.  */
+   Fset_marker (w->start, make_number (pos.bufpos), Qnil);
    if (! NILP (Vwindow_scroll_functions))
!     {
!       run_hook_with_args_2 (Qwindow_scroll_functions, window,
! 			    make_number (pos.bufpos));
!       pos.bufpos = marker_position (w->start);
!     }
    try_window (window, pos.bufpos);
  
*************** done:
*** 1744,1748 ****
    /* When we reach a frame's selected window, redo the frame's menu bar.  */
    if (update_mode_line
!       && (FRAME_X_P (f)
  	  ?
  #if defined (USE_X_TOOLKIT) || defined (HAVE_NTGUI)
--- 1813,1817 ----
    /* When we reach a frame's selected window, redo the frame's menu bar.  */
    if (update_mode_line
!       && (FRAME_WINDOW_P (f)
  	  ?
  #if defined (USE_X_TOOLKIT) || defined (HAVE_NTGUI)
*************** try_window_id (window)
*** 2094,2099 ****
  		 screen line at bp.vpos has changed.
  		 (This can happen in a deletion that ends in mid-line.)
! 		 To adjust properly, we need to make things constent at
! 		 the position ep.
  		 So do a second adjust to make that happen.
  		 Note that stop_vpos >= ep.vpos, so it is sufficient
--- 2163,2168 ----
  		 screen line at bp.vpos has changed.
  		 (This can happen in a deletion that ends in mid-line.)
! 		 To adjust properly, we need to make things consistent
! 		 at the position ep.
  		 So do a second adjust to make that happen.
  		 Note that stop_vpos >= ep.vpos, so it is sufficient
*************** display_text_line (w, start, vpos, hpos,
*** 2731,2737 ****
  	      XSETWINDOW (args[1], w);
  	      XSETINT (args[2], e_t_h);
- 	      Frun_hook_with_args (3, args);
  
  	      w->redisplay_end_trigger = Qnil;
  	      e_t_h = ZV;
  	      /* Notice if it changed the face of this character.  */
--- 2800,2809 ----
  	      XSETWINDOW (args[1], w);
  	      XSETINT (args[2], e_t_h);
  
+ 	      /* Since we are *trying* to run these functions,
+ 		 don't try to run them again, even if they get an error.  */
  	      w->redisplay_end_trigger = Qnil;
+ 	      Frun_hook_with_args (3, args);
+ 
  	      e_t_h = ZV;
  	      /* Notice if it changed the face of this character.  */
*************** display_menu_bar (w)
*** 3180,3184 ****
  
  #ifdef HAVE_NTGUI
!   return;
  #endif
  
--- 3252,3257 ----
  
  #ifdef HAVE_NTGUI
!   if (!NILP (Vwindow_system))
!     return;
  #endif
  
*************** display_menu_bar (w)
*** 3191,3195 ****
  
    items = FRAME_MENU_BAR_ITEMS (f);
!   for (i = 0; i < XVECTOR (items)->size; i += 3)
      {
        Lisp_Object pos, string;
--- 3264,3268 ----
  
    items = FRAME_MENU_BAR_ITEMS (f);
!   for (i = 0; i < XVECTOR (items)->size; i += 4)
      {
        Lisp_Object pos, string;
*************** display_menu_bar (w)
*** 3198,3202 ****
  	break;
  
!       XSETFASTINT (XVECTOR (items)->contents[i + 2], hpos);
  
        if (hpos < maxendcol)
--- 3271,3275 ----
  	break;
  
!       XSETFASTINT (XVECTOR (items)->contents[i + 3], hpos);
  
        if (hpos < maxendcol)
*************** decode_mode_spec (w, c, spec_width, maxw
*** 3652,3659 ****
        /* %F displays the frame name.  */
  #ifdef MULTI_FRAME
!       return (char *) XSTRING (selected_frame->name)->data;
! #else
!       return "Emacs";
  #endif
  
      case 'f': 
--- 3725,3734 ----
        /* %F displays the frame name.  */
  #ifdef MULTI_FRAME
!       if (!NILP (f->title))
! 	return (char *) XSTRING (f->title)->data;
!       if (f->explicit_name || FRAME_TERMCAP_P (f))
! 	return (char *) XSTRING (f->name)->data;
  #endif
+       return "Emacs";
  
      case 'f': 
*************** decode_mode_spec (w, c, spec_width, maxw
*** 3791,3795 ****
  	else
  	  {
! 	    total = ((pos - BUF_BEGV (b)) * 100 + total - 1) / total;
  	    /* We can't normally display a 3-digit number,
  	       so get us a 2-digit number that is close.  */
--- 3866,3874 ----
  	else
  	  {
! 	    if (total > 1000000)
! 	      /* Do it differently for a large value, to avoid overflow.  */
! 	      total = ((pos - BUF_BEGV (b)) + (total / 100) - 1) / (total / 100);
! 	    else
! 	      total = ((pos - BUF_BEGV (b)) * 100 + total - 1) / total;
  	    /* We can't normally display a 3-digit number,
  	       so get us a 2-digit number that is close.  */
*************** decode_mode_spec (w, c, spec_width, maxw
*** 3817,3821 ****
  	else
  	  {
! 	    total = ((botpos - BUF_BEGV (b)) * 100 + total - 1) / total;
  	    /* We can't normally display a 3-digit number,
  	       so get us a 2-digit number that is close.  */
--- 3896,3904 ----
  	else
  	  {
! 	    if (total > 1000000)
! 	      /* Do it differently for a large value, to avoid overflow.  */
! 	      total = ((botpos - BUF_BEGV (b)) + (total / 100) - 1) / (total / 100);
! 	    else
! 	      total = ((botpos - BUF_BEGV (b)) * 100 + total - 1) / total;
  	    /* We can't normally display a 3-digit number,
  	       so get us a 2-digit number that is close.  */
diff -2rcpP --exclude=*.elc emacs-19.30/src/xfaces.c emacs-19.31/src/xfaces.c
*** emacs-19.30/src/xfaces.c	Wed Nov 22 07:10:16 1995
--- emacs-19.31/src/xfaces.c	Mon Jan 15 04:06:29 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  /* This is derived from work by Lucid (some parts very loosely so).  */
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* This is derived from work by Lucid (some parts very loosely so).  */
*************** the Free Software Foundation, 675 Mass A
*** 96,100 ****
     of FRAME->output_data.x->param_faces are special - they describe the
     default and mode line faces.  None of the faces in param_faces have
!    GC's.  (See src/dispextern.h for the definiton of struct face.
     lisp/faces.el maintains the isomorphism between face_alist and
     param_faces.)
--- 97,101 ----
     of FRAME->output_data.x->param_faces are special - they describe the
     default and mode line faces.  None of the faces in param_faces have
!    GC's.  (See src/dispextern.h for the definition of struct face.
     lisp/faces.el maintains the isomorphism between face_alist and
     param_faces.)
*************** unload_color (f, pixel)
*** 425,446 ****
  
  DEFUN ("pixmap-spec-p", Fpixmap_spec_p, Spixmap_spec_p, 1, 1, 0,
!   "Return t if ARG is a valid pixmap specification.")
!   (arg)
!      Lisp_Object arg;
  {
    Lisp_Object height, width;
  
!   return ((STRINGP (arg)
! 	   || (CONSP (arg)
! 	       && CONSP (XCONS (arg)->cdr)
! 	       && CONSP (XCONS (XCONS (arg)->cdr)->cdr)
! 	       && NILP (XCONS (XCONS (XCONS (arg)->cdr)->cdr)->cdr)
! 	       && (width = XCONS (arg)->car, INTEGERP (width))
! 	       && (height = XCONS (XCONS (arg)->cdr)->car, INTEGERP (height))
! 	       && STRINGP (XCONS (XCONS (XCONS (arg)->cdr)->cdr)->car)
  	       && XINT (width) > 0
  	       && XINT (height) > 0
  	       /* The string must have enough bits for width * height.  */
! 	       && ((XSTRING (XCONS (XCONS (XCONS (arg)->cdr)->cdr)->car)->size
  		    * (BITS_PER_INT / sizeof (int)))
  		   >= XFASTINT (width) * XFASTINT (height))))
--- 426,447 ----
  
  DEFUN ("pixmap-spec-p", Fpixmap_spec_p, Spixmap_spec_p, 1, 1, 0,
!   "Return t if OBJECT is a valid pixmap specification.")
!   (object)
!      Lisp_Object object;
  {
    Lisp_Object height, width;
  
!   return ((STRINGP (object)
! 	   || (CONSP (object)
! 	       && CONSP (XCONS (object)->cdr)
! 	       && CONSP (XCONS (XCONS (object)->cdr)->cdr)
! 	       && NILP (XCONS (XCONS (XCONS (object)->cdr)->cdr)->cdr)
! 	       && (width = XCONS (object)->car, INTEGERP (width))
! 	       && (height = XCONS (XCONS (object)->cdr)->car, INTEGERP (height))
! 	       && STRINGP (XCONS (XCONS (XCONS (object)->cdr)->cdr)->car)
  	       && XINT (width) > 0
  	       && XINT (height) > 0
  	       /* The string must have enough bits for width * height.  */
! 	       && ((XSTRING (XCONS (XCONS (XCONS (object)->cdr)->cdr)->car)->size
  		    * (BITS_PER_INT / sizeof (int)))
  		   >= XFASTINT (width) * XFASTINT (height))))
diff -2rcpP --exclude=*.elc emacs-19.30/src/xfns.c emacs-19.31/src/xfns.c
*** emacs-19.30/src/xfns.c	Sat Nov 11 02:09:38 1995
--- emacs-19.31/src/xfns.c	Fri Apr 26 12:21:49 1996
***************
*** 1,4 ****
  /* Functions for the X window system.
!    Copyright (C) 1989, 1992, 1993, 1994, 1995 Free Software Foundation.
  
  This file is part of GNU Emacs.
--- 1,4 ----
  /* Functions for the X window system.
!    Copyright (C) 1989, 1992, 1993, 1994, 1995, 1996 Free Software Foundation.
  
  This file is part of GNU Emacs.
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  /* Completely rewritten by Richard Stallman.  */
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* Completely rewritten by Richard Stallman.  */
*************** the Free Software Foundation, 675 Mass A
*** 36,44 ****
  #include "keyboard.h"
  #include "blockinput.h"
! #include "paths.h"
  
  #ifdef HAVE_X_WINDOWS
  extern void abort ();
  
  #ifndef VMS
  #if 1 /* Used to be #ifdef EMACS_BITMAP_FILES, but this should always work.  */
--- 37,52 ----
  #include "keyboard.h"
  #include "blockinput.h"
! #include <paths.h>
  
  #ifdef HAVE_X_WINDOWS
  extern void abort ();
  
+ /* On some systems, the character-composition stuff is broken in X11R5.  */
+ #if defined (HAVE_X11R5) && ! defined (HAVE_X11R6)
+ #ifdef X11R5_INHIBIT_I18N
+ #define X_I18N_INHIBITED
+ #endif
+ #endif
+ 
  #ifndef VMS
  #if 1 /* Used to be #ifdef EMACS_BITMAP_FILES, but this should always work.  */
*************** Lisp_Object Qdisplay;
*** 189,193 ****
  /* The below are defined in frame.c.  */
  extern Lisp_Object Qheight, Qminibuffer, Qname, Qonly, Qwidth;
! extern Lisp_Object Qunsplittable, Qmenu_bar_lines, Qbuffer_predicate;
  
  extern Lisp_Object Vwindow_system_version;
--- 197,201 ----
  /* The below are defined in frame.c.  */
  extern Lisp_Object Qheight, Qminibuffer, Qname, Qonly, Qwidth;
! extern Lisp_Object Qunsplittable, Qmenu_bar_lines, Qbuffer_predicate, Qtitle;
  
  extern Lisp_Object Vwindow_system_version;
*************** check_x ()
*** 202,209 ****
  }
  
! /* Nonzero if using X for display.  */
  
  int
! using_x_p ()
  {
    return x_in_use;
--- 210,218 ----
  }
  
! /* Nonzero if we can use mouse menus.
!    You should not call this unless HAVE_MENUS is defined.  */
  
  int
! have_menus_p ()
  {
    return x_in_use;
*************** check_x_frame (frame)
*** 227,231 ****
      }
    if (! FRAME_X_P (f))
!     error ("non-X frame used");
    return f;
  }
--- 236,240 ----
      }
    if (! FRAME_X_P (f))
!     error ("Non-X frame used");
    return f;
  }
*************** check_x_display_info (frame)
*** 257,261 ****
        f = XFRAME (frame);
        if (! FRAME_X_P (f))
! 	error ("non-X frame used");
        return FRAME_X_DISPLAY_INFO (f);
      }
--- 266,270 ----
        f = XFRAME (frame);
        if (! FRAME_X_P (f))
! 	error ("Non-X frame used");
        return FRAME_X_DISPLAY_INFO (f);
      }
*************** x_destroy_all_bitmaps (dpyinfo)
*** 636,660 ****
     The name of a parameter, as a Lisp symbol,
     has an `x-frame-parameter' property which is an integer in Lisp
!    but can be interpreted as an `enum x_frame_parm' in C.  */
! 
! enum x_frame_parm
! {
!   X_PARM_FOREGROUND_COLOR,
!   X_PARM_BACKGROUND_COLOR,
!   X_PARM_MOUSE_COLOR,
!   X_PARM_CURSOR_COLOR,
!   X_PARM_BORDER_COLOR,
!   X_PARM_ICON_TYPE,
!   X_PARM_FONT,
!   X_PARM_BORDER_WIDTH,
!   X_PARM_INTERNAL_BORDER_WIDTH,
!   X_PARM_NAME,
!   X_PARM_AUTORAISE,
!   X_PARM_AUTOLOWER,
!   X_PARM_VERT_SCROLL_BAR,
!   X_PARM_VISIBILITY,
!   X_PARM_MENU_BAR_LINES
! };
! 
  
  struct x_frame_parm_table
--- 645,649 ----
     The name of a parameter, as a Lisp symbol,
     has an `x-frame-parameter' property which is an integer in Lisp
!    that is an index in this table.  */
  
  struct x_frame_parm_table
*************** void x_set_visibility ();
*** 682,708 ****
  void x_set_menu_bar_lines ();
  void x_set_scroll_bar_width ();
  void x_set_unsplittable ();
  
  static struct x_frame_parm_table x_frame_parms[] =
  {
!   "foreground-color", x_set_foreground_color,
    "background-color", x_set_background_color,
-   "mouse-color", x_set_mouse_color,
-   "cursor-color", x_set_cursor_color,
    "border-color", x_set_border_color,
    "cursor-type", x_set_cursor_type,
-   "icon-type", x_set_icon_type,
-   "icon-name", x_set_icon_name,
    "font", x_set_font,
!   "border-width", x_set_border_width,
    "internal-border-width", x_set_internal_border_width,
-   "name", x_explicitly_set_name,
-   "auto-raise", x_set_autoraise,
-   "auto-lower", x_set_autolower,
-   "vertical-scroll-bars", x_set_vertical_scroll_bars,
-   "visibility", x_set_visibility,
    "menu-bar-lines", x_set_menu_bar_lines,
    "scroll-bar-width", x_set_scroll_bar_width,
    "unsplittable", x_set_unsplittable,
  };
  
--- 671,699 ----
  void x_set_menu_bar_lines ();
  void x_set_scroll_bar_width ();
+ void x_set_title ();
  void x_set_unsplittable ();
  
  static struct x_frame_parm_table x_frame_parms[] =
  {
!   "auto-raise", x_set_autoraise,
!   "auto-lower", x_set_autolower,
    "background-color", x_set_background_color,
    "border-color", x_set_border_color,
+   "border-width", x_set_border_width,
+   "cursor-color", x_set_cursor_color,
    "cursor-type", x_set_cursor_type,
    "font", x_set_font,
!   "foreground-color", x_set_foreground_color,
!   "icon-name", x_set_icon_name,
!   "icon-type", x_set_icon_type,
    "internal-border-width", x_set_internal_border_width,
    "menu-bar-lines", x_set_menu_bar_lines,
+   "mouse-color", x_set_mouse_color,
+   "name", x_explicitly_set_name,
    "scroll-bar-width", x_set_scroll_bar_width,
+   "title", x_set_title,
    "unsplittable", x_set_unsplittable,
+   "vertical-scroll-bars", x_set_vertical_scroll_bars,
+   "visibility", x_set_visibility,
  };
  
*************** x_set_frame_parameters (f, alist)
*** 841,847 ****
    /* Don't die if just one of these was set.  */
    if (EQ (width, Qunbound))
!     XSETINT (width, FRAME_WIDTH (f));
    if (EQ (height, Qunbound))
!     XSETINT (height, FRAME_HEIGHT (f));
  
    /* Don't set these parameters unless they've been explicitly
--- 832,848 ----
    /* Don't die if just one of these was set.  */
    if (EQ (width, Qunbound))
!     {
!       if (FRAME_NEW_WIDTH (f))
! 	XSETINT (width, FRAME_NEW_WIDTH (f));
!       else
! 	XSETINT (width, FRAME_WIDTH (f));
!     }
    if (EQ (height, Qunbound))
!     {
!       if (FRAME_NEW_HEIGHT (f))
! 	XSETINT (height, FRAME_NEW_HEIGHT (f));
!       else
! 	XSETINT (height, FRAME_HEIGHT (f));
!     }
  
    /* Don't set these parameters unless they've been explicitly
*************** x_set_frame_parameters (f, alist)
*** 861,865 ****
  
      if ((NUMBERP (width) && XINT (width) != FRAME_WIDTH (f))
! 	|| (NUMBERP (height) && XINT (height) != FRAME_HEIGHT (f)))
        Fset_frame_size (frame, width, height);
  
--- 862,867 ----
  
      if ((NUMBERP (width) && XINT (width) != FRAME_WIDTH (f))
! 	|| (NUMBERP (height) && XINT (height) != FRAME_HEIGHT (f))
! 	|| FRAME_NEW_HEIGHT (f) || FRAME_NEW_WIDTH (f))
        Fset_frame_size (frame, width, height);
  
*************** x_real_positions (f, xptr, yptr)
*** 966,970 ****
  		  &f->output_data.x->parent_desc,
  		  &tmp_children, &tmp_nchildren);
!       xfree (tmp_children);
  
        win_x = win_y = 0;
--- 968,972 ----
  		  &f->output_data.x->parent_desc,
  		  &tmp_children, &tmp_nchildren);
!       XFree ((char *) tmp_children);
  
        win_x = win_y = 0;
*************** defined_color (f, color, color_def, allo
*** 1121,1126 ****
  	      if (trial_delta < nearest_delta) 
  		{
! 		  nearest = x;
! 		  nearest_delta = trial_delta;
  		}
  	    }
--- 1123,1136 ----
  	      if (trial_delta < nearest_delta) 
  		{
! 		  XColor temp;
! 		  temp.red = cells[x].red;
! 		  temp.green = cells[x].green;
! 		  temp.blue = cells[x].blue;
! 		  status = XAllocColor (display, screen_colormap, &temp);
! 		  if (status)
! 		    {
! 		      nearest = x;
! 		      nearest_delta = trial_delta;
! 		    }
  		}
  	    }
*************** x_set_cursor_color (f, arg, oldval)
*** 1394,1398 ****
      }
  }
! 
  /* Set the border-color of frame F to value described by ARG.
     ARG can be a string naming a color.
--- 1404,1408 ----
      }
  }
! 
  /* Set the border-color of frame F to value described by ARG.
     ARG can be a string naming a color.
*************** x_set_cursor_type (f, arg, oldval)
*** 1473,1477 ****
    update_mode_lines++;
  }
! 
  void
  x_set_icon_type (f, arg, oldval)
--- 1483,1487 ----
    update_mode_lines++;
  }
! 
  void
  x_set_icon_type (f, arg, oldval)
*************** x_set_icon_name (f, arg, oldval)
*** 1550,1553 ****
--- 1560,1565 ----
  			(char *) XSTRING ((!NILP (f->icon_name)
  					   ? f->icon_name
+ 					   : !NILP (f->title)
+ 					   ? f->title
  					   : f->name))->data);
  
*************** x_set_icon_name (f, arg, oldval)
*** 1561,1565 ****
    UNBLOCK_INPUT;
  }
! 
  extern Lisp_Object x_new_font ();
  
--- 1573,1577 ----
    UNBLOCK_INPUT;
  }
! 
  extern Lisp_Object x_new_font ();
  
*************** x_set_font (f, arg, oldval)
*** 1578,1582 ****
    
    if (EQ (result, Qnil))
!     error ("Font \"%s\" is not defined", XSTRING (arg)->data);
    else if (EQ (result, Qt))
      error ("the characters of the given font have varying widths");
--- 1590,1594 ----
    
    if (EQ (result, Qnil))
!     error ("Font `%s' is not defined", XSTRING (arg)->data);
    else if (EQ (result, Qt))
      error ("the characters of the given font have varying widths");
*************** x_set_visibility (f, value, oldval)
*** 1650,1654 ****
      Fmake_frame_visible (frame);
  }
! 
  static void
  x_set_menu_bar_lines_1 (window, n)
--- 1662,1666 ----
      Fmake_frame_visible (frame);
  }
! 
  static void
  x_set_menu_bar_lines_1 (window, n)
*************** x_set_menu_bar_lines (f, value, oldval)
*** 1698,1702 ****
      {
        FRAME_EXTERNAL_MENU_BAR (f) = 1;
!       if (f->output_data.x->menubar_widget == 0)
  	/* Make sure next redisplay shows the menu bar.  */
  	XWINDOW (FRAME_SELECTED_WINDOW (f))->update_mode_line = Qt;
--- 1710,1714 ----
      {
        FRAME_EXTERNAL_MENU_BAR (f) = 1;
!       if (FRAME_X_P (f) && f->output_data.x->menubar_widget == 0)
  	/* Make sure next redisplay shows the menu bar.  */
  	XWINDOW (FRAME_SELECTED_WINDOW (f))->update_mode_line = Qt;
*************** x_set_menu_bar_lines (f, value, oldval)
*** 1707,1711 ****
  	free_frame_menubar (f);
        FRAME_EXTERNAL_MENU_BAR (f) = 0;
!       f->output_data.x->menubar_widget = 0;
      }
  #else /* not USE_X_TOOLKIT */
--- 1719,1724 ----
  	free_frame_menubar (f);
        FRAME_EXTERNAL_MENU_BAR (f) = 0;
!       if (FRAME_X_P (f))
! 	f->output_data.x->menubar_widget = 0;
      }
  #else /* not USE_X_TOOLKIT */
*************** x_set_menu_bar_lines (f, value, oldval)
*** 1714,1718 ****
  #endif /* not USE_X_TOOLKIT */
  }
! 
  /* Change the name of frame F to NAME.  If NAME is nil, set F's name to
         x_id_name.
--- 1727,1731 ----
  #endif /* not USE_X_TOOLKIT */
  }
! 
  /* Change the name of frame F to NAME.  If NAME is nil, set F's name to
         x_id_name.
*************** x_set_name (f, name, explicit)
*** 1763,1766 ****
--- 1776,1786 ----
      return;
  
+   f->name = name;
+ 
+   /* For setting the frame title, the title parameter should override
+      the name parameter.  */
+   if (! NILP (f->title))
+     name = f->title;
+ 
    if (FRAME_X_WINDOW (f))
      {
*************** x_set_name (f, name, explicit)
*** 1800,1805 ****
        UNBLOCK_INPUT;
      }
- 
-   f->name = name;
  }
  
--- 1820,1823 ----
*************** x_implicitly_set_name (f, arg, oldval)
*** 1825,1830 ****
--- 1843,1914 ----
    x_set_name (f, arg, 0);
  }
+ 
+ /* Change the title of frame F to NAME.
+    If NAME is nil, use the frame name as the title.
+ 
+    If EXPLICIT is non-zero, that indicates that lisp code is setting the
+        name; if NAME is a string, set F's name to NAME and set
+        F->explicit_name; if NAME is Qnil, then clear F->explicit_name.
+ 
+    If EXPLICIT is zero, that indicates that Emacs redisplay code is
+        suggesting a new name, which lisp code should override; if
+        F->explicit_name is set, ignore the new name; otherwise, set it.  */
  
  void
+ x_set_title (f, name)
+      struct frame *f;
+      Lisp_Object name;
+ {
+   /* Don't change the title if it's already NAME.  */
+   if (EQ (name, f->title))
+     return;
+ 
+   update_mode_lines = 1;
+ 
+   f->title = name;
+ 
+   if (NILP (name))
+     name = f->name;
+ 
+   if (FRAME_X_WINDOW (f))
+     {
+       BLOCK_INPUT;
+ #ifdef HAVE_X11R4
+       {
+ 	XTextProperty text, icon;
+ 	Lisp_Object icon_name;
+ 
+ 	text.value = XSTRING (name)->data;
+ 	text.encoding = XA_STRING;
+ 	text.format = 8;
+ 	text.nitems = XSTRING (name)->size;
+ 
+ 	icon_name = (!NILP (f->icon_name) ? f->icon_name : name);
+ 
+ 	icon.value = XSTRING (icon_name)->data;
+ 	icon.encoding = XA_STRING;
+ 	icon.format = 8;
+ 	icon.nitems = XSTRING (icon_name)->size;
+ #ifdef USE_X_TOOLKIT
+ 	XSetWMName (FRAME_X_DISPLAY (f),
+ 		    XtWindow (f->output_data.x->widget), &text);
+ 	XSetWMIconName (FRAME_X_DISPLAY (f), XtWindow (f->output_data.x->widget),
+ 			&icon);
+ #else /* not USE_X_TOOLKIT */
+ 	XSetWMName (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), &text);
+ 	XSetWMIconName (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), &icon);
+ #endif /* not USE_X_TOOLKIT */
+       }
+ #else /* not HAVE_X11R4 */
+       XSetIconName (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
+ 		    XSTRING (name)->data);
+       XStoreName (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
+ 		  XSTRING (name)->data);
+ #endif /* not HAVE_X11R4 */
+       UNBLOCK_INPUT;
+     }
+ }
+ 
+ void
  x_set_autoraise (f, arg, oldval)
       struct frame *f;
*************** x_window (f, window_prompting, minibuffe
*** 2584,2587 ****
--- 2668,2672 ----
  
  #ifdef HAVE_X_I18N
+ #ifndef X_I18N_INHIBITED
    { 
      XIM xim;
*************** x_window (f, window_prompting, minibuffe
*** 2599,2607 ****
  
  	if (xic == 0)
! 	  XCloseIM (xim);
        }
      FRAME_XIC (f) = xic;
    }
! #endif
  
    f->output_data.x->wm_hints.input = True;
--- 2684,2700 ----
  
  	if (xic == 0)
! 	  {
! 	    XCloseIM (xim);
! 	    xim = NULL;
! 	  }
        }
+     FRAME_XIM (f) = xim;
      FRAME_XIC (f) = xic;
    }
! #else /* X_I18N_INHIBITED */
!   FRAME_XIM (f) = 0;
!   FRAME_XIC (f) = 0;
! #endif /* X_I18N_INHIBITED */
! #endif /* HAVE_X_I18N */
  
    f->output_data.x->wm_hints.input = True;
*************** x_window (f)
*** 2697,2700 ****
--- 2790,2794 ----
  		     attribute_mask, &attributes);
  #ifdef HAVE_X_I18N
+ #ifndef X_I18N_INHIBITED
    { 
      XIM xim;
*************** x_window (f)
*** 2712,2721 ****
  
  	if (!xic)
! 	  XCloseIM (xim);
        }
  
      FRAME_XIC (f) = xic;
    }
! #endif
  
    validate_x_resource_name ();
--- 2806,2823 ----
  
  	if (!xic)
! 	  {
! 	    XCloseIM (xim);
! 	    xim = NULL;
! 	  }
        }
  
+     FRAME_XIM (f) = xim;
      FRAME_XIC (f) = xic;
    }
! #else /* X_I18N_INHIBITED */
!   FRAME_XIM (f) = 0;
!   FRAME_XIC (f) = 0;
! #endif /* X_I18N_INHIBITED */
! #endif /* HAVE_X_I18N */
  
    validate_x_resource_name ();
*************** x_window (f)
*** 2738,2741 ****
--- 2840,2844 ----
    XSetWMHints (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
  	       &f->output_data.x->wm_hints);
+   f->output_data.x->wm_hints.icon_pixmap = None;
  
    /* Request "save yourself" and "delete window" commands from wm.  */
*************** This function is an internal primitive--
*** 2930,2934 ****
  #endif
  
!   name = x_get_arg (parms, Qname, "title", "Title", string);
    if (!STRINGP (name)
        && ! EQ (name, Qunbound)
--- 3033,3037 ----
  #endif
  
!   name = x_get_arg (parms, Qname, "name", "Name", string);
    if (!STRINGP (name)
        && ! EQ (name, Qunbound)
*************** This function is an internal primitive--
*** 3085,3088 ****
--- 3188,3193 ----
    x_default_parameter (f, parms, Qbuffer_predicate, Qnil,
  		       "bufferPredicate", "BufferPredicate", symbol);
+   x_default_parameter (f, parms, Qtitle, Qnil,
+ 		       "title", "Title", string);
  
    f->output_data.x->parent_desc = FRAME_X_DISPLAY_INFO (f)->root_window;
*************** even if they match PATTERN and FACE.")
*** 3255,3259 ****
        /* Don't die if we get called with a terminal frame.  */
        if (! FRAME_X_P (f))
! 	error ("non-X frame used in `x-list-fonts'");
  
        face_id = face_name_id_number (f, face);
--- 3360,3364 ----
        /* Don't die if we get called with a terminal frame.  */
        if (! FRAME_X_P (f))
! 	error ("Non-X frame used in `x-list-fonts'");
  
        face_id = face_name_id_number (f, face);
*************** even if they match PATTERN and FACE.")
*** 3293,3300 ****
  	  XFontStruct *thisinfo;
  
!           thisinfo = XLoadQueryFont (FRAME_X_DISPLAY (f),
  				     XSTRING (XCONS (tem)->car)->data);
  
!           if (thisinfo && same_size_fonts (thisinfo, size_ref))
  	    newlist = Fcons (XCONS (tem)->car, newlist);
  
--- 3398,3410 ----
  	  XFontStruct *thisinfo;
  
! 	  x_catch_errors (FRAME_X_DISPLAY (f));
! 
! 	  thisinfo = XLoadQueryFont (FRAME_X_DISPLAY (f),
  				     XSTRING (XCONS (tem)->car)->data);
  
! 	  x_check_errors (FRAME_X_DISPLAY (f), "XLoadQueryFont failure: %s");
! 	  x_uncatch_errors (FRAME_X_DISPLAY (f));
! 
! 	  if (thisinfo && same_size_fonts (thisinfo, size_ref))
  	    newlist = Fcons (XCONS (tem)->car, newlist);
  
*************** even if they match PATTERN and FACE.")
*** 3310,3313 ****
--- 3420,3425 ----
    BLOCK_INPUT;
  
+   x_catch_errors (FRAME_X_DISPLAY (f));
+ 
    /* Solaris 2.3 has a bug in XListFontsWithInfo.  */
  #ifndef BROKEN_XLISTFONTSWITHINFO
*************** even if they match PATTERN and FACE.")
*** 3325,3328 ****
--- 3437,3443 ----
  			&num_fonts); /* count_return */
  
+   x_check_errors (FRAME_X_DISPLAY (f), "XListFonts failure: %s");
+   x_uncatch_errors (FRAME_X_DISPLAY (f));
+ 
    UNBLOCK_INPUT;
  
*************** even if they match PATTERN and FACE.")
*** 3357,3364 ****
--- 3472,3491 ----
  
  	      BLOCK_INPUT;
+ 
+ 	      x_catch_errors (FRAME_X_DISPLAY (f));
  	      thisinfo = XLoadQueryFont (FRAME_X_DISPLAY (f), names[i]);
+ 	      x_check_errors (FRAME_X_DISPLAY (f),
+ 			      "XLoadQueryFont failure: %s");
+ 	      x_uncatch_errors (FRAME_X_DISPLAY (f));
+ 
  	      UNBLOCK_INPUT;
  
  	      keeper = thisinfo && same_size_fonts (thisinfo, size_ref);
+ 	      BLOCK_INPUT;
+ 	      if (thisinfo && ! keeper)
+ 		XFreeFont (FRAME_X_DISPLAY (f), thisinfo);
+ 	      else if (thisinfo)
+ 		XFreeFontInfo (NULL, thisinfo, 1);
+ 	      UNBLOCK_INPUT;
  #else
  	      keeper = same_size_fonts (&info[i], size_ref);
diff -2rcpP --exclude=*.elc emacs-19.30/src/xmenu.c emacs-19.31/src/xmenu.c
*** emacs-19.30/src/xmenu.c	Fri Nov 10 13:53:34 1995
--- emacs-19.31/src/xmenu.c	Mon Apr 29 11:28:51 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  /* X pop-up deck-of-cards menu facility for gnuemacs.
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* X pop-up deck-of-cards menu facility for gnuemacs.
*************** single_keymap_panes (keymap, pane_name, 
*** 674,678 ****
  }
  
! /* Push all the panes and items of a menu decsribed by the
     alist-of-alists MENU.
     This handles old-fashioned calls to x-popup-menu.  */
--- 675,679 ----
  }
  
! /* Push all the panes and items of a menu described by the
     alist-of-alists MENU.
     This handles old-fashioned calls to x-popup-menu.  */
*************** cached information about equivalent key 
*** 771,774 ****
--- 772,776 ----
    struct gcpro gcpro1;
  
+ #ifdef HAVE_MENUS
    if (! NILP (position))
      {
*************** cached information about equivalent key 
*** 844,847 ****
--- 846,850 ----
        ypos += XINT (y);
      }
+ #endif /* HAVE_MENUS */
  
    title = Qnil;
*************** cached information about equivalent key 
*** 923,926 ****
--- 926,930 ----
      }
  
+ #ifdef HAVE_MENUS
    /* Display them in a menu.  */
    BLOCK_INPUT;
*************** cached information about equivalent key 
*** 933,936 ****
--- 937,941 ----
  
    UNGCPRO;
+ #endif /* HAVE_MENUS */
  
    if (error_name) error (error_name);
*************** cached information about equivalent key 
*** 938,941 ****
--- 943,948 ----
  }
  
+ #ifdef HAVE_MENUS
+ 
  DEFUN ("x-popup-dialog", Fx_popup_dialog, Sx_popup_dialog, 2, 2, 0,
    "Pop up a dialog box and return user's selection.\n\
*************** on the left of the dialog box and all fo
*** 1052,1056 ****
  
  /* Loop in Xt until the menu pulldown or dialog popup has been
!    popped down (deactivated).
  
     NOTE: All calls to popup_get_selection should be protected
--- 1059,1064 ----
  
  /* Loop in Xt until the menu pulldown or dialog popup has been
!    popped down (deactivated).  This is used for x-popup-menu
!    and x-popup-dialog; it is not used for the menu bar any more.
  
     NOTE: All calls to popup_get_selection should be protected
*************** popup_deactivate_callback (widget, id, c
*** 1292,1295 ****
--- 1300,1316 ----
  }
  
+ /* Allocate a widget_value, blocking input.  */
+ 
+ widget_value *
+ xmalloc_widget_value ()
+ {
+   widget_value *value;
+ 
+   BLOCK_INPUT;
+   value = malloc_widget_value ();
+   UNBLOCK_INPUT;
+ 
+   return value;
+ }
  
  /* This recursively calls free_widget_value on the tree of widgets.
*************** single_submenu (item_key, item_name, map
*** 1372,1376 ****
    submenu_stack
      = (widget_value **) alloca (menu_items_used * sizeof (widget_value *));
!   wv = malloc_widget_value ();
    wv->name = "menu";
    wv->value = 0;
--- 1393,1397 ----
    submenu_stack
      = (widget_value **) alloca (menu_items_used * sizeof (widget_value *));
!   wv = xmalloc_widget_value ();
    wv->name = "menu";
    wv->value = 0;
*************** single_submenu (item_key, item_name, map
*** 1426,1430 ****
  	  if (strcmp (pane_string, ""))
  	    {
! 	      wv = malloc_widget_value ();
  	      if (save_wv)
  		save_wv->next = wv;
--- 1447,1451 ----
  	  if (strcmp (pane_string, ""))
  	    {
! 	      wv = xmalloc_widget_value ();
  	      if (save_wv)
  		save_wv->next = wv;
*************** single_submenu (item_key, item_name, map
*** 1453,1457 ****
  	  def = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_DEFINITION];
  
! 	  wv = malloc_widget_value ();
  	  if (prev_wv) 
  	    prev_wv->next = wv;
--- 1474,1478 ----
  	  def = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_DEFINITION];
  
! 	  wv = xmalloc_widget_value ();
  	  if (prev_wv) 
  	    prev_wv->next = wv;
*************** set_frame_menubar (f, first_time, deep_p
*** 1569,1573 ****
      deep_p = 1;
  
!   wv = malloc_widget_value ();
    wv->name = "menubar";
    wv->value = 0;
--- 1590,1594 ----
      deep_p = 1;
  
!   wv = xmalloc_widget_value ();
    wv->name = "menubar";
    wv->value = 0;
*************** set_frame_menubar (f, first_time, deep_p
*** 1608,1612 ****
        if (! NILP (Vlucid_menu_bar_dirty_flag))
  	call0 (Qrecompute_lucid_menubar);
!       call1 (Vrun_hooks, Qmenu_bar_update_hook);
        FRAME_MENU_BAR_ITEMS (f) = menu_bar_items (FRAME_MENU_BAR_ITEMS (f));
  
--- 1629,1633 ----
        if (! NILP (Vlucid_menu_bar_dirty_flag))
  	call0 (Qrecompute_lucid_menubar);
!       safe_run_hooks (Qmenu_bar_update_hook);
        FRAME_MENU_BAR_ITEMS (f) = menu_bar_items (FRAME_MENU_BAR_ITEMS (f));
  
*************** set_frame_menubar (f, first_time, deep_p
*** 1623,1627 ****
        menu_items_allocated = XVECTOR (menu_items)->size;
        init_menu_items ();
!       for (i = 0; i < XVECTOR (items)->size; i += 3)
  	{
  	  Lisp_Object key, string, maps;
--- 1644,1648 ----
        menu_items_allocated = XVECTOR (menu_items)->size;
        init_menu_items ();
!       for (i = 0; i < XVECTOR (items)->size; i += 4)
  	{
  	  Lisp_Object key, string, maps;
*************** set_frame_menubar (f, first_time, deep_p
*** 1655,1659 ****
  	    || (previous_items[i] != XVECTOR (menu_items)->contents[i]))
  	  break;
!       if (i == menu_items_used && i == previous_menu_items_used)
  	{
  	  free_menubar_widget_value_tree (first_wv);
--- 1676,1680 ----
  	    || (previous_items[i] != XVECTOR (menu_items)->contents[i]))
  	  break;
!       if (i == menu_items_used && i == previous_menu_items_used && i != 0)
  	{
  	  free_menubar_widget_value_tree (first_wv);
*************** set_frame_menubar (f, first_time, deep_p
*** 1666,1670 ****
  	 so it's safe to store data from a Lisp_String.  */
        wv = first_wv->contents;
!       for (i = 0; i < XVECTOR (items)->size; i += 3)
  	{
  	  Lisp_Object string;
--- 1687,1691 ----
  	 so it's safe to store data from a Lisp_String.  */
        wv = first_wv->contents;
!       for (i = 0; i < XVECTOR (items)->size; i += 4)
  	{
  	  Lisp_Object string;
*************** set_frame_menubar (f, first_time, deep_p
*** 1686,1690 ****
  
        items = FRAME_MENU_BAR_ITEMS (f);
!       for (i = 0; i < XVECTOR (items)->size; i += 3)
  	{
  	  Lisp_Object string;
--- 1707,1711 ----
  
        items = FRAME_MENU_BAR_ITEMS (f);
!       for (i = 0; i < XVECTOR (items)->size; i += 4)
  	{
  	  Lisp_Object string;
*************** set_frame_menubar (f, first_time, deep_p
*** 1694,1698 ****
  	    break;
  
! 	  wv = malloc_widget_value ();
  	  wv->name = (char *) XSTRING (string)->data;
  	  wv->value = 0;
--- 1715,1719 ----
  	    break;
  
! 	  wv = xmalloc_widget_value ();
  	  wv->name = (char *) XSTRING (string)->data;
  	  wv->value = 0;
*************** set_frame_menubar (f, first_time, deep_p
*** 1705,1708 ****
--- 1726,1734 ----
  	  prev_wv = wv;
  	}
+ 
+       /* Forget what we thought we knew about what is in the
+ 	 detailed contents of the menu bar menus.
+ 	 Changing the top level always destroys the contents.  */
+       f->menu_bar_items_used = 0;
      }
  
*************** set_frame_menubar (f, first_time, deep_p
*** 1761,1765 ****
  }
  
! /* Called from Fx_create_frame to create the inital menubar of a frame
     before it is mapped, so that the window is mapped with the menubar already
     there instead of us tacking it on later and thrashing the window after it
--- 1787,1791 ----
  }
  
! /* Called from Fx_create_frame to create the initial menubar of a frame
     before it is mapped, so that the window is mapped with the menubar already
     there instead of us tacking it on later and thrashing the window after it
*************** xmenu_show (f, x, y, for_click, keymaps,
*** 1877,1881 ****
    /* Create a tree of widget_value objects
       representing the panes and their items.  */
!   wv = malloc_widget_value ();
    wv->name = "menu";
    wv->value = 0;
--- 1903,1907 ----
    /* Create a tree of widget_value objects
       representing the panes and their items.  */
!   wv = xmalloc_widget_value ();
    wv->name = "menu";
    wv->value = 0;
*************** xmenu_show (f, x, y, for_click, keymaps,
*** 1929,1933 ****
  	  if (!keymaps && strcmp (pane_string, ""))
  	    {
! 	      wv = malloc_widget_value ();
  	      if (save_wv)
  		save_wv->next = wv;
--- 1955,1959 ----
  	  if (!keymaps && strcmp (pane_string, ""))
  	    {
! 	      wv = xmalloc_widget_value ();
  	      if (save_wv)
  		save_wv->next = wv;
*************** xmenu_show (f, x, y, for_click, keymaps,
*** 1960,1964 ****
  	  def = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_DEFINITION];
  
! 	  wv = malloc_widget_value ();
  	  if (prev_wv) 
  	    prev_wv->next = wv;
--- 1986,1990 ----
  	  def = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_DEFINITION];
  
! 	  wv = xmalloc_widget_value ();
  	  if (prev_wv) 
  	    prev_wv->next = wv;
*************** xmenu_show (f, x, y, for_click, keymaps,
*** 1984,1990 ****
    if (!NILP (title))
      {
!       widget_value *wv_title = malloc_widget_value ();
!       widget_value *wv_sep1 = malloc_widget_value ();
!       widget_value *wv_sep2 = malloc_widget_value ();
  
        wv_sep2->name = "--";
--- 2010,2016 ----
    if (!NILP (title))
      {
!       widget_value *wv_title = xmalloc_widget_value ();
!       widget_value *wv_sep1 = xmalloc_widget_value ();
!       widget_value *wv_sep2 = xmalloc_widget_value ();
  
        wv_sep2->name = "--";
*************** xdialog_show (f, keymaps, title, error)
*** 2189,2193 ****
      pane_string = (NILP (pane_name)
  		   ? "" : (char *) XSTRING (pane_name)->data);  
!     prev_wv = malloc_widget_value ();
      prev_wv->value = pane_string;
      if (keymaps && !NILP (prefix))
--- 2215,2219 ----
      pane_string = (NILP (pane_name)
  		   ? "" : (char *) XSTRING (pane_name)->data);  
!     prev_wv = xmalloc_widget_value ();
      prev_wv->value = pane_string;
      if (keymaps && !NILP (prefix))
*************** xdialog_show (f, keymaps, title, error)
*** 2230,2234 ****
  	  }
  
! 	wv = malloc_widget_value ();
  	prev_wv->next = wv;
  	wv->name = (char *) button_names[nb_buttons];
--- 2256,2260 ----
  	  }
  
! 	wv = xmalloc_widget_value ();
  	prev_wv->next = wv;
  	wv->name = (char *) button_names[nb_buttons];
*************** xdialog_show (f, keymaps, title, error)
*** 2252,2256 ****
        left_count = nb_buttons - nb_buttons / 2;
  
!     wv = malloc_widget_value ();
      wv->name = dialog_name;
  
--- 2278,2282 ----
        left_count = nb_buttons - nb_buttons / 2;
  
!     wv = xmalloc_widget_value ();
      wv->name = dialog_name;
  
*************** xmenu_show (f, x, y, for_click, keymaps,
*** 2612,2615 ****
--- 2638,2643 ----
  
  #endif /* not USE_X_TOOLKIT */
+ 
+ #endif /* HAVE_MENUS */
  
  syms_of_xmenu ()
*************** syms_of_xmenu ()
*** 2627,2630 ****
--- 2655,2660 ----
  
    defsubr (&Sx_popup_menu);
+ #ifdef HAVE_MENUS
    defsubr (&Sx_popup_dialog);
+ #endif
  }
diff -2rcpP --exclude=*.elc emacs-19.30/src/xrdb.c emacs-19.31/src/xrdb.c
*** emacs-19.30/src/xrdb.c	Sun Apr  9 00:54:08 1995
--- emacs-19.31/src/xrdb.c	Mon Jan 15 04:06:29 1996
***************
*** 2,11 ****
     Copyright (C) 1990, 1993, 1994 Free Software Foundation.
  
! This program 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.
  
! This program 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
--- 2,13 ----
     Copyright (C) 1990, 1993, 1994 Free Software Foundation.
  
! 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 deta
*** 13,18 ****
  
  You should have received a copy of the GNU General Public License
! along with this program; see the file COPYING.  If not, write to
! the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  
  /* Written by jla, 4/90 */
--- 15,21 ----
  
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* Written by jla, 4/90 */
diff -2rcpP --exclude=*.elc emacs-19.30/src/xselect.c emacs-19.31/src/xselect.c
*** emacs-19.30/src/xselect.c	Wed Nov 15 13:33:14 1995
--- emacs-19.31/src/xselect.c	Thu Jan 25 17:00:10 1996
***************
*** 1,4 ****
  /* X Selection processing for Emacs.
!    Copyright (C) 1993, 1994, 1995 Free Software Foundation.
  
  This file is part of GNU Emacs.
--- 1,4 ----
  /* X Selection processing for Emacs.
!    Copyright (C) 1993, 1994, 1995, 1996 Free Software Foundation.
  
  This file is part of GNU Emacs.
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  
*************** the Free Software Foundation, 675 Mass A
*** 28,33 ****
  #include "blockinput.h"
  
- #define xfree free
- 
  #define CUT_BUFFER_SUPPORT
  
--- 29,32 ----
*************** x_atom_to_symbol (dpyinfo, display, atom
*** 211,214 ****
--- 210,214 ----
    val = intern (str);
    BLOCK_INPUT;
+   /* This was allocated by Xlib, so use XFree.  */
    XFree (str);
    UNBLOCK_INPUT;
*************** static struct input_event *x_selection_c
*** 413,417 ****
  
  /* Used as an unwind-protect clause so that, if a selection-converter signals
!    an error, we tell the requestor that we were unable to do what they wanted
     before we throw to top-level or go into the debugger or whatever.  */
  
--- 413,417 ----
  
  /* Used as an unwind-protect clause so that, if a selection-converter signals
!    an error, we tell the requester that we were unable to do what they wanted
     before we throw to top-level or go into the debugger or whatever.  */
  
*************** x_reply_selection_request (event, format
*** 559,563 ****
  
        if (x_window_to_frame (dpyinfo, window)) /* #### debug */
! 	error ("attempt to transfer an INCR to ourself!");
  #if 0
        fprintf (stderr, "\nINCR %d\n", bytes_remaining);
--- 559,563 ----
  
        if (x_window_to_frame (dpyinfo, window)) /* #### debug */
! 	error ("Attempt to transfer an INCR to ourself!");
  #if 0
        fprintf (stderr, "\nINCR %d\n", bytes_remaining);
*************** x_reply_selection_request (event, format
*** 577,581 ****
        UNBLOCK_INPUT;
  
!       /* First, wait for the requestor to ack by deleting the property.
  	 This can run random lisp code (process handlers) or signal.  */
        if (! had_errors)
--- 577,581 ----
        UNBLOCK_INPUT;
  
!       /* First, wait for the requester to ack by deleting the property.
  	 This can run random lisp code (process handlers) or signal.  */
        if (! had_errors)
*************** x_reply_selection_request (event, format
*** 608,617 ****
  	    break;
  
! 	  /* Now wait for the requestor to ack this chunk by deleting the
  	     property.	 This can run random lisp code or signal.
  	   */
  	  wait_for_property_change (wait_object);
  	}
!       /* Now write a zero-length chunk to the property to tell the requestor
  	 that we're done.  */
  #if 0
--- 608,617 ----
  	    break;
  
! 	  /* Now wait for the requester to ack this chunk by deleting the
  	     property.	 This can run random lisp code or signal.
  	   */
  	  wait_for_property_change (wait_object);
  	}
!       /* Now write a zero-length chunk to the property to tell the requester
  	 that we're done.  */
  #if 0
*************** x_handle_selection_request (event)
*** 720,725 ****
        x_selection_current_request = 0;
  
        if (!nofree)
! 	xfree (data);
      }
    unbind_to (count, Qnil);
--- 720,727 ----
        x_selection_current_request = 0;
  
+       /* Use free, not XFree, because lisp_data_to_selection_data
+ 	 calls xmalloc itself.  */
        if (!nofree)
! 	free (data);
      }
    unbind_to (count, Qnil);
*************** unexpect_property_change (location)
*** 918,922 ****
  	  else
  	    property_change_wait_list = rest->next;
! 	  xfree (rest);
  	  return;
  	}
--- 920,924 ----
  	  else
  	    property_change_wait_list = rest->next;
! 	  free (rest);
  	  return;
  	}
*************** wait_for_property_change (location)
*** 968,972 ****
  
        if (NILP (XCONS (property_change_reply)->car))
! 	error ("timed out waiting for property-notify event");
      }
  
--- 970,974 ----
  
        if (NILP (XCONS (property_change_reply)->car))
! 	error ("Timed out waiting for property-notify event");
      }
  
*************** x_handle_property_notify (event)
*** 1007,1011 ****
  	  else
  	    property_change_wait_list = rest->next;
! 	  xfree (rest);
  	  return;
  	}
--- 1009,1013 ----
  	  else
  	    property_change_wait_list = rest->next;
! 	  free (rest);
  	  return;
  	}
*************** x_get_foreign_selection (selection_symbo
*** 1139,1143 ****
  
    if (NILP (XCONS (reading_selection_reply)->car))
!     error ("timed out waiting for reply from selection owner");
  
    /* Otherwise, the selection is waiting for us on the requested property.  */
--- 1141,1147 ----
  
    if (NILP (XCONS (reading_selection_reply)->car))
!     error ("Timed out waiting for reply from selection owner");
!   if (EQ (XCONS (reading_selection_reply)->car, Qlambda))
!     error ("No `%s' selection", XSYMBOL (selection_symbol)->name->data);
  
    /* Otherwise, the selection is waiting for us on the requested property.  */
*************** x_get_foreign_selection (selection_symbo
*** 1150,1153 ****
--- 1154,1159 ----
  /* Subroutines of x_get_window_property_as_lisp_data */
  
+ /* Use free, not XFree, to free the data obtained with this function.  */
+ 
  static void
  x_get_window_property (display, window, property, data_ret, bytes_ret,
*************** x_get_window_property (display, window, 
*** 1186,1190 ****
        return;
      }
!   xfree ((char *) tmp_data);
    
    if (*actual_type_ret == None || *actual_format_ret == 0)
--- 1192,1197 ----
        return;
      }
!   /* This was allocated by Xlib, so use XFree.  */
!   XFree ((char *) tmp_data);
    
    if (*actual_type_ret == None || *actual_format_ret == 0)
*************** x_get_window_property (display, window, 
*** 1197,1201 ****
    *data_ret = (unsigned char *) xmalloc (total_size);
    
!   /* Now read, until weve gotten it all.  */
    while (bytes_remaining)
      {
--- 1204,1208 ----
    *data_ret = (unsigned char *) xmalloc (total_size);
    
!   /* Now read, until we've gotten it all.  */
    while (bytes_remaining)
      {
*************** x_get_window_property (display, window, 
*** 1221,1225 ****
        bcopy (tmp_data, (*data_ret) + offset, *actual_size_ret);
        offset += *actual_size_ret;
!       xfree ((char *) tmp_data);
      }
  
--- 1228,1233 ----
        bcopy (tmp_data, (*data_ret) + offset, *actual_size_ret);
        offset += *actual_size_ret;
!       /* This was allocated by Xlib, so use XFree.  */
!       XFree ((char *) tmp_data);
      }
  
*************** x_get_window_property (display, window, 
*** 1229,1232 ****
--- 1237,1242 ----
  }
  
+ /* Use free, not XFree, to free the data obtained with this function.  */
+ 
  static void
  receive_incremental_selection (display, window, property, target_type,
*************** receive_incremental_selection (display, 
*** 1274,1278 ****
        wait_for_property_change (wait_object);
        /* expect it again immediately, because x_get_window_property may
! 	 .. no it wont, I dont get it.
  	 .. Ok, I get it now, the Xt code that implements INCR is broken.
         */
--- 1284,1288 ----
        wait_for_property_change (wait_object);
        /* expect it again immediately, because x_get_window_property may
! 	 .. no it won't, I don't get it.
  	 .. Ok, I get it now, the Xt code that implements INCR is broken.
         */
*************** receive_incremental_selection (display, 
*** 1289,1293 ****
  	    XSelectInput (display, window, STANDARD_EVENT_SET);
  	  unexpect_property_change (wait_object);
! 	  if (tmp_data) xfree (tmp_data);
  	  break;
  	}
--- 1299,1305 ----
  	    XSelectInput (display, window, STANDARD_EVENT_SET);
  	  unexpect_property_change (wait_object);
! 	  /* Use free, not XFree, because x_get_window_property
! 	     calls xmalloc itself.  */
! 	  if (tmp_data) free (tmp_data);
  	  break;
  	}
*************** receive_incremental_selection (display, 
*** 1314,1318 ****
        bcopy (tmp_data, (*data_ret) + offset, tmp_size_bytes);
        offset += tmp_size_bytes;
!       xfree (tmp_data);
      }
  }
--- 1326,1332 ----
        bcopy (tmp_data, (*data_ret) + offset, tmp_size_bytes);
        offset += tmp_size_bytes;
!       /* Use free, not XFree, because x_get_window_property
! 	 calls xmalloc itself.  */
!       free (tmp_data);
      }
  }
*************** x_get_window_property_as_lisp_data (disp
*** 1370,1374 ****
        unsigned int min_size_bytes = * ((unsigned int *) data);
        BLOCK_INPUT;
!       XFree ((char *) data);
        UNBLOCK_INPUT;
        receive_incremental_selection (display, window, property, target_type,
--- 1384,1390 ----
        unsigned int min_size_bytes = * ((unsigned int *) data);
        BLOCK_INPUT;
!       /* Use free, not XFree, because x_get_window_property
! 	 calls xmalloc itself.  */
!       free ((char *) data);
        UNBLOCK_INPUT;
        receive_incremental_selection (display, window, property, target_type,
*************** x_get_window_property_as_lisp_data (disp
*** 1388,1392 ****
  				     actual_type, actual_format);
    
!   xfree ((char *) data);
    return val;
  }
--- 1404,1410 ----
  				     actual_type, actual_format);
    
!   /* Use free, not XFree, because x_get_window_property
!      calls xmalloc itself.  */
!   free ((char *) data);
    return val;
  }
*************** selection_data_to_lisp_data (display, da
*** 1490,1493 ****
--- 1508,1513 ----
  
  
+ /* Use free, not XFree, to free the data obtained with this function.  */
+ 
  static void
  lisp_data_to_selection_data (display, obj,
*************** clean_local_selection_data (obj)
*** 1692,1696 ****
  
  /* Called from XTread_socket to handle SelectionNotify events.
!    If it's the selection we are waiting for, stop waiting.  */
  
  void
--- 1712,1718 ----
  
  /* Called from XTread_socket to handle SelectionNotify events.
!    If it's the selection we are waiting for, stop waiting
!    by setting the car of reading_selection_reply to non-nil.
!    We store t there if the reply is successful, lambda if not.  */
  
  void
*************** x_handle_selection_notify (event)
*** 1703,1707 ****
      return;
  
!   XCONS (reading_selection_reply)->car = Qt;
  }
  
--- 1725,1730 ----
      return;
  
!   XCONS (reading_selection_reply)->car
!     = (event->property != 0 ? Qt : Qlambda);
  }
  
*************** anything that the functions on `selectio
*** 1720,1724 ****
    check_x ();
    CHECK_SYMBOL (selection_name, 0);
!   if (NILP (selection_value)) error ("selection-value may not be nil.");
    x_own_selection (selection_name, selection_value);
    return selection_value;
--- 1743,1747 ----
    check_x ();
    CHECK_SYMBOL (selection_name, 0);
!   if (NILP (selection_value)) error ("selection-value may not be nil");
    x_own_selection (selection_name, selection_value);
    return selection_value;
*************** DEFUN ("x-get-cut-buffer-internal", Fx_g
*** 1972,1976 ****
  
    ret = (bytes ? make_string ((char *) data, bytes) : Qnil);
!   xfree (data);
    return ret;
  }
--- 1995,2001 ----
  
    ret = (bytes ? make_string ((char *) data, bytes) : Qnil);
!   /* Use free, not XFree, because x_get_window_property
!      calls xmalloc itself.  */
!   free (data);
    return ret;
  }
*************** it merely informs you that they have hap
*** 2143,2147 ****
    DEFVAR_INT ("x-selection-timeout", &x_selection_timeout,
     "Number of milliseconds to wait for a selection reply.\n\
! If the selection owner doens't reply in this time, we give up.\n\
  A value of 0 means wait as long as necessary.  This is initialized from the\n\
  \"*selectionTimeout\" resource.");
--- 2168,2172 ----
    DEFVAR_INT ("x-selection-timeout", &x_selection_timeout,
     "Number of milliseconds to wait for a selection reply.\n\
! If the selection owner doesn't reply in this time, we give up.\n\
  A value of 0 means wait as long as necessary.  This is initialized from the\n\
  \"*selectionTimeout\" resource.");
diff -2rcpP --exclude=*.elc emacs-19.30/src/xterm.c emacs-19.31/src/xterm.c
*** emacs-19.30/src/xterm.c	Wed Nov 22 17:23:45 1995
--- emacs-19.31/src/xterm.c	Sat May 25 19:27:09 1996
***************
*** 1,4 ****
  /* X Communication module for terminals which understand the X protocol.
!    Copyright (C) 1989, 1993, 1994, 1995 Free Software Foundation, Inc.
  
  This file is part of GNU Emacs.
--- 1,4 ----
  /* X Communication module for terminals which understand the X protocol.
!    Copyright (C) 1989, 93, 94, 95, 1996 Free Software Foundation, Inc.
  
  This file is part of GNU Emacs.
*************** GNU General Public License for more deta
*** 16,20 ****
  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.  */
  
  /* Xt features made by Fred Pierresteguy.  */
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  /* Xt features made by Fred Pierresteguy.  */
*************** the Free Software Foundation, 675 Mass A
*** 85,88 ****
--- 86,93 ----
  
  #ifdef USE_X_TOOLKIT
+ #include <X11/Shell.h>
+ #endif
+ 
+ #ifdef USE_X_TOOLKIT
  extern void free_frame_menubar ();
  extern FRAME_PTR x_menubar_window_to_frame ();
*************** extern void _XEditResCheckMessages ();
*** 105,115 ****
  #endif
  
! #ifdef HAVE_X11XTR6
  /* So we can do setlocale.  */
  #include <locale.h>
  #endif
  
  #define min(a,b) ((a)<(b) ? (a) : (b))
  #define max(a,b) ((a)>(b) ? (a) : (b))
  
  /* This is a chain of structures for all the X displays currently in use.  */
--- 110,135 ----
  #endif
  
! #ifdef HAVE_SETLOCALE
  /* So we can do setlocale.  */
  #include <locale.h>
  #endif
  
+ #ifdef SOLARIS2
+ /* memmove will be defined as a macro in Xfuncs.h unless
+    <string.h> is included beforehand.  The declaration for memmove in
+    <string.h> will cause a syntax error when Xfuncs.h later includes it.  */
+ #include <string.h>
+ #endif
+ 
+ #ifdef SOLARIS2
+ #define X_CONNECTION_LOCK_FLAG XlibDisplayWriting
+ #endif
+ 
+ #ifndef min
  #define min(a,b) ((a)<(b) ? (a) : (b))
+ #endif
+ #ifndef max
  #define max(a,b) ((a)>(b) ? (a) : (b))
+ #endif
  
  /* This is a chain of structures for all the X displays currently in use.  */
*************** static int curs_y;
*** 158,161 ****
--- 178,188 ----
  /* Mouse movement.
  
+    Formerly, we used PointerMotionHintMask (in STANDARD_EVENT_MASK)
+    so that we would have to call XQueryPointer after each MotionNotify
+    event to ask for another such event.  However, this made mouse tracking
+    slow, and there was a bug that made it eventually stop.
+ 
+    Simply asking for MotionNotify all the time seems to work better.
+ 
     In order to avoid asking for motion events and then throwing most
     of them away or busy-polling the server for mouse positions, we ask
*************** static int curs_y;
*** 167,177 ****
     is at least as efficient as getting motion events when mouse
     tracking is on, and I suspect only negligibly worse when tracking
!    is off.
! 
!    The silly O'Reilly & Associates Nutshell guides barely document
!    pointer motion hints at all (I think you have to infer how they
!    work from an example), and the description of XQueryPointer doesn't
!    mention that calling it causes you to get another motion hint from
!    the server, which is very important.  */
  
  /* Where the mouse was last time we reported a mouse event.  */
--- 194,198 ----
     is at least as efficient as getting motion events when mouse
     tracking is on, and I suspect only negligibly worse when tracking
!    is off.  */
  
  /* Where the mouse was last time we reported a mouse event.  */
*************** extern Lisp_Object Vcommand_line_args, V
*** 217,223 ****
  extern Lisp_Object Vx_no_window_manager;
  
- /* Nonzero enables some debugging for the X interface code. */
- extern int _Xdebug;
- 
  extern Lisp_Object Qface, Qmouse_face;
  
--- 238,241 ----
*************** x_find_modifier_meanings (dpyinfo)
*** 1565,1570 ****
    XDisplayKeycodes (dpyinfo->display, &min_code, &max_code);
  #else
!   min_code = display->min_keycode;
!   max_code = display->max_keycode;
  #endif
  
--- 1583,1588 ----
    XDisplayKeycodes (dpyinfo->display, &min_code, &max_code);
  #else
!   min_code = dpyinfo->display->min_keycode;
!   max_code = dpyinfo->display->max_keycode;
  #endif
  
*************** note_mouse_movement (frame, event)
*** 1832,1846 ****
  
        note_mouse_highlight (frame, -1, -1);
- 
-       /* Ask for another mouse motion event.  */
-       {
- 	int dummy;
- 	Window dummy_window;
- 
- 	XQueryPointer (event->display, FRAME_X_WINDOW (frame),
- 		       &dummy_window, &dummy_window,
- 		       &dummy, &dummy, &dummy, &dummy,
- 		       (unsigned int *) &dummy);
-       }
      }
  
--- 1850,1853 ----
*************** note_mouse_movement (frame, event)
*** 1855,1882 ****
  
        note_mouse_highlight (frame, event->x, event->y);
- 
-       /* Ask for another mouse motion event.  */
-       {
- 	int dummy;
- 	Window dummy_window;
- 
- 	XQueryPointer (event->display, FRAME_X_WINDOW (frame),
- 		       &dummy_window, &dummy_window,
- 		       &dummy, &dummy, &dummy, &dummy,
- 		       (unsigned int *) &dummy);
-       }
-     }
-   else
-     {
-       /* It's on the same glyph.  Call XQueryPointer so we'll get an
- 	 event the next time the mouse moves and we can see if it's
- 	 *still* on the same glyph.  */
-       int dummy;
-       Window dummy_window;
- 
-       XQueryPointer (event->display, FRAME_X_WINDOW (frame),
- 		     &dummy_window, &dummy_window,
- 		     &dummy, &dummy, &dummy, &dummy,
- 		     (unsigned int *) &dummy);
      }
  }
--- 1862,1865 ----
*************** static void x_scroll_bar_report_motion (
*** 2253,2259 ****
  
     This clears the mouse_moved flag, so we can wait for the next mouse
!    movement.  This also calls XQueryPointer, which will cause the
!    server to give us another MotionNotify when the mouse moves
!    again. */
  
  static void
--- 2236,2240 ----
  
     This clears the mouse_moved flag, so we can wait for the next mouse
!    movement.  */
  
  static void
*************** x_scroll_bar_note_movement (bar, event)
*** 2996,3011 ****
  	}
      }
- 
-   /* Call XQueryPointer so we'll get an event the next time the mouse
-      moves and we can see *still* on the same position.  */
-   {
-     int dummy;
-     Window dummy_window;
- 
-     XQueryPointer (event->xmotion.display, event->xmotion.window,
- 		   &dummy_window, &dummy_window,
- 		   &dummy, &dummy, &dummy, &dummy,
- 		   (unsigned int *) &dummy);
-   }
  }
  
--- 2977,2980 ----
*************** x_scroll_bar_clear (f)
*** 3096,3103 ****
    Lisp_Object bar;
  
!   for (bar = FRAME_SCROLL_BARS (f); VECTORP (bar);
!        bar = XSCROLL_BAR (bar)->next)
!     XClearArea (FRAME_X_DISPLAY (f), SCROLL_BAR_X_WINDOW (XSCROLL_BAR (bar)),
! 		0, 0, 0, 0, True);
  }
  
--- 3065,3076 ----
    Lisp_Object bar;
  
!   /* We can have scroll bars even if this is 0,
!      if we just turned off scroll bar mode.
!      But in that case we should not clear them.  */
!   if (FRAME_HAS_VERTICAL_SCROLL_BARS (f))
!     for (bar = FRAME_SCROLL_BARS (f); VECTORP (bar);
! 	 bar = XSCROLL_BAR (bar)->next)
!       XClearArea (FRAME_X_DISPLAY (f), SCROLL_BAR_X_WINDOW (XSCROLL_BAR (bar)),
! 		  0, 0, 0, 0, True);
  }
  
*************** XTread_socket (sd, bufp, numchars, waitp
*** 3298,3302 ****
        /* If available, Xlib uses FIOSNBIO to make the socket
  	 non-blocking, and then looks for EWOULDBLOCK.  If O_NDELAY is set,
! 	 FIOSNBIO is ignored, and instead of signalling EWOULDBLOCK,
  	 a read returns 0, which Xlib interprets as equivalent to EPIPE. */
        fcntl (dpyinfo->connection, F_SETFL, 0);
--- 3271,3275 ----
        /* If available, Xlib uses FIOSNBIO to make the socket
  	 non-blocking, and then looks for EWOULDBLOCK.  If O_NDELAY is set,
! 	 FIOSNBIO is ignored, and instead of signaling EWOULDBLOCK,
  	 a read returns 0, which Xlib interprets as equivalent to EPIPE. */
        fcntl (dpyinfo->connection, F_SETFL, 0);
*************** XTread_socket (sd, bufp, numchars, waitp
*** 3462,3465 ****
--- 3435,3439 ----
  		SELECTION_EVENT_SELECTION (bufp) = eventp->selection;
  		SELECTION_EVENT_TIME (bufp) = eventp->time;
+ 		bufp->frame_or_window = Qnil;
  		bufp++;
  
*************** XTread_socket (sd, bufp, numchars, waitp
*** 3491,3494 ****
--- 3465,3469 ----
  		  SELECTION_EVENT_PROPERTY (bufp) = eventp->property;
  		  SELECTION_EVENT_TIME (bufp) = eventp->time;
+ 		  bufp->frame_or_window = Qnil;
  		  bufp++;
  
*************** XTread_socket (sd, bufp, numchars, waitp
*** 3592,3599 ****
  		  numchars--;
  		}
- #ifdef USE_X_TOOLKIT
  	      goto OTHER;
- #endif /* USE_X_TOOLKIT */
- 	      break;
  
  	    case MapNotify:
--- 3567,3571 ----
*************** XTread_socket (sd, bufp, numchars, waitp
*** 3618,3622 ****
  		      numchars--;
  		    }
! 		  else
  		    /* Force a redisplay sooner or later
  		       to update the frame titles
--- 3590,3595 ----
  		      numchars--;
  		    }
! 		  else if (! NILP(Vframe_list)
! 			   && ! NILP (XCONS (Vframe_list)->cdr))
  		    /* Force a redisplay sooner or later
  		       to update the frame titles
*************** XTread_socket (sd, bufp, numchars, waitp
*** 3624,3631 ****
  		    record_asynch_buffer_change ();
  		}
- #ifdef USE_X_TOOLKIT
  	      goto OTHER;
- #endif /* USE_X_TOOLKIT */
- 	      break;
  
  	      /* Turn off processing if we become fully obscured. */
--- 3597,3601 ----
*************** XTread_socket (sd, bufp, numchars, waitp
*** 3791,3795 ****
  		    abort ();
  		}
! 	      break;
  
  	      /* Here's a possible interpretation of the whole
--- 3761,3765 ----
  		    abort ();
  		}
! 	      goto OTHER;
  
  	      /* Here's a possible interpretation of the whole
*************** XTread_socket (sd, bufp, numchars, waitp
*** 3819,3826 ****
  	      if (f)
  		note_mouse_movement (f, &event.xmotion);
- #ifdef USE_X_TOOLKIT
  	      goto OTHER;
- #endif /* USE_X_TOOLKIT */
- 	      break;
  
  	    case FocusIn:
--- 3789,3793 ----
*************** XTread_socket (sd, bufp, numchars, waitp
*** 3836,3844 ****
  #endif
  
- #ifdef USE_X_TOOLKIT
  	      goto OTHER;
- #endif /* USE_X_TOOLKIT */
- 	      break;
- 
  
  	    case LeaveNotify:
--- 3803,3807 ----
*************** XTread_socket (sd, bufp, numchars, waitp
*** 3861,3868 ****
  		    }
  		}
- #ifdef USE_X_TOOLKIT
  	      goto OTHER;
- #endif /* USE_X_TOOLKIT */
- 	      break;
  
  	    case FocusOut:
--- 3824,3828 ----
*************** XTread_socket (sd, bufp, numchars, waitp
*** 3879,3886 ****
  #endif
  
- #ifdef USE_X_TOOLKIT
  	      goto OTHER;
- #endif /* USE_X_TOOLKIT */
- 	      break;
  
  	    case MotionNotify:
--- 3839,3843 ----
*************** XTread_socket (sd, bufp, numchars, waitp
*** 3906,3913 ****
  		  }
  	      }
- #ifdef USE_X_TOOLKIT
  	      goto OTHER;
- #endif /* USE_X_TOOLKIT */
- 	      break;
  
  	    case ConfigureNotify:
--- 3863,3867 ----
*************** XTread_socket (sd, bufp, numchars, waitp
*** 3998,4006 ****
  		  }
  		}
- #ifdef USE_X_TOOLKIT
  	      goto OTHER;
- #else
- 	      break;
- #endif
  
  	    case ButtonPress:
--- 3952,3956 ----
*************** XTread_socket (sd, bufp, numchars, waitp
*** 4104,4115 ****
  		  XRefreshKeyboardMapping (&event.xmapping);
  		}
- #ifdef USE_X_TOOLKIT
  	      goto OTHER;
- #endif /* USE_X_TOOLKIT */
- 	      break;
  
  	    default:
- #ifdef USE_X_TOOLKIT
  	    OTHER:
  	      BLOCK_INPUT;
  	      XtDispatchEvent (&event);
--- 4054,4062 ----
  		  XRefreshKeyboardMapping (&event.xmapping);
  		}
  	      goto OTHER;
  
  	    default:
  	    OTHER:
+ #ifdef USE_X_TOOLKIT
  	      BLOCK_INPUT;
  	      XtDispatchEvent (&event);
*************** x_update_cursor (f, on)
*** 4412,4415 ****
--- 4359,4367 ----
       int on;
  {
+   /* If we don't have any previous cursor position to use,
+      leave the cursor off.  */
+   if (f->phys_cursor_x < 0)
+     return;
+ 
    BLOCK_INPUT;
  
*************** x_connection_closed (display, error_mess
*** 4529,4539 ****
    Lisp_Object frame, tail;
  
!   /* Whatever we were in the middle of, we are going to throw out of it,
!      so reassure various things that have error checks about being
!      called with input blocked.  */
!   TOTALLY_UNBLOCK_INPUT;
  
!   if (_Xdebug)
!     abort ();
  
    /* First delete frames whose minibuffers are on frames
--- 4481,4487 ----
    Lisp_Object frame, tail;
  
!   /* Indicate that this display is dead.  */
  
!   dpyinfo->display = 0;
  
    /* First delete frames whose minibuffers are on frames
*************** x_connection_closed (display, error_mess
*** 4564,4568 ****
        }
  
!   x_delete_display (dpyinfo);
  
    if (x_display_list == 0)
--- 4512,4517 ----
        }
  
!   if (dpyinfo)
!     x_delete_display (dpyinfo);
  
    if (x_display_list == 0)
*************** x_error_quitter (display, error)
*** 4598,4602 ****
  
    XGetErrorText (display, error->error_code, buf, sizeof (buf));
!   sprintf (buf1, "X protocol error: %s on protocol request %d",
  	   buf, error->request_code);
    x_connection_closed (display, buf1);
--- 4547,4551 ----
  
    XGetErrorText (display, error->error_code, buf, sizeof (buf));
!   sprintf (buf1, "X protocol error: %s on protocol request %d\n",
  	   buf, error->request_code);
    x_connection_closed (display, buf1);
*************** x_connection_signal_1 (signalnum)	/* If 
*** 4640,4644 ****
  {
    signal (SIGPIPE, x_connection_signal);
!   x_connection_closed (x_connection_signal_dpyinfo,
  		       "connection was lost");
  }
--- 4589,4593 ----
  {
    signal (SIGPIPE, x_connection_signal);
!   x_connection_closed (x_connection_signal_dpyinfo->display,
  		       "connection was lost");
  }
*************** x_connection_signal (signalnum)	/* If we
*** 4650,4654 ****
    x_connection_signal_dpyinfo = x_display_list;
  
!   sigunblock (SIGPIPE);
  
    while (x_connection_signal_dpyinfo)
--- 4599,4603 ----
    x_connection_signal_dpyinfo = x_display_list;
  
!   sigunblock (sigmask (SIGPIPE));
  
    while (x_connection_signal_dpyinfo)
*************** x_connection_signal (signalnum)	/* If we
*** 4656,4660 ****
--- 4605,4612 ----
        signal (SIGPIPE, x_connection_signal_1);
  
+       x_connection_close_if_hung (x_connection_signal_dpyinfo);
+ 
        XNoOp (x_connection_signal_dpyinfo->display);
+ 
        XSync (x_connection_signal_dpyinfo->display, False);
  
*************** x_new_font (f, fontname)
*** 4828,4831 ****
--- 4780,4784 ----
        XFontStruct *font;
        int n_fonts;
+       Atom FONT_atom;
  
        /* Try to find a character-cell font in the list.  */
*************** x_new_font (f, fontname)
*** 4873,4881 ****
        /* Try to get the full name of FONT.  Put it in full_name.  */
        full_name = 0;
        for (i = 0; i < font->n_properties; i++)
  	{
! 	  char *atom
! 	    = XGetAtomName (FRAME_X_DISPLAY (f), font->properties[i].name);
! 	  if (!strcmp (atom, "FONT"))
  	    {
  	      char *name = XGetAtomName (FRAME_X_DISPLAY (f),
--- 4826,4833 ----
        /* Try to get the full name of FONT.  Put it in full_name.  */
        full_name = 0;
+       FONT_atom = XInternAtom (FRAME_X_DISPLAY (f), "FONT", False);
        for (i = 0; i < font->n_properties; i++)
  	{
! 	  if (FONT_atom == font->properties[i].name)
  	    {
  	      char *name = XGetAtomName (FRAME_X_DISPLAY (f),
*************** x_new_font (f, fontname)
*** 4901,4906 ****
  	      break;
  	    }
- 
- 	  XFree (atom);
  	}
  
--- 4853,4856 ----
*************** x_new_font (f, fontname)
*** 4959,4962 ****
--- 4909,4915 ----
  }
  
+ /* Calculate the absolute position in frame F
+    from its current recorded position values and gravity.  */
+ 
  x_calc_absolute_position (f)
       struct frame *f;
*************** x_calc_absolute_position (f)
*** 4996,5010 ****
    if (flags & XNegative)
      f->output_data.x->left_pos = (FRAME_X_DISPLAY_INFO (f)->width
! 			      - 2 * f->output_data.x->border_width - win_x
! 			      - PIXEL_WIDTH (f)
! 			      + f->output_data.x->left_pos);
  
    if (flags & YNegative)
      f->output_data.x->top_pos = (FRAME_X_DISPLAY_INFO (f)->height
! 			     - 2 * f->output_data.x->border_width - win_y
! 			     - PIXEL_HEIGHT (f)
! 			     - (FRAME_EXTERNAL_MENU_BAR (f)
! 				? f->output_data.x->menubar_height : 0)
! 			     + f->output_data.x->top_pos);
    /* The left_pos and top_pos
       are now relative to the top and left screen edges,
--- 4949,4964 ----
    if (flags & XNegative)
      f->output_data.x->left_pos = (FRAME_X_DISPLAY_INFO (f)->width
! 				  - 2 * f->output_data.x->border_width - win_x
! 				  - PIXEL_WIDTH (f)
! 				  + f->output_data.x->left_pos);
  
    if (flags & YNegative)
+     /* We used to subtract f->output_data.x->menubar_height here
+        in the toolkit case, but PIXEL_HEIGHT already includes that.  */
      f->output_data.x->top_pos = (FRAME_X_DISPLAY_INFO (f)->height
! 				 - 2 * f->output_data.x->border_width - win_y
! 				 - PIXEL_HEIGHT (f)
! 				 + f->output_data.x->top_pos);
! 
    /* The left_pos and top_pos
       are now relative to the top and left screen edges,
*************** x_set_window_size (f, change_gravity, co
*** 5074,5080 ****
    int pixelwidth, pixelheight;
    int mask;
  
- #ifdef USE_X_TOOLKIT
    BLOCK_INPUT;
    {
      /* The x and y position of the widget is clobbered by the
--- 5028,5037 ----
    int pixelwidth, pixelheight;
    int mask;
+   Lisp_Object window;
+   struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
  
    BLOCK_INPUT;
+ 
+ #ifdef USE_X_TOOLKIT
    {
      /* The x and y position of the widget is clobbered by the
*************** x_set_window_size (f, change_gravity, co
*** 5088,5097 ****
      f->output_data.x->widget->core.y = ypos;
    }
-   UNBLOCK_INPUT;
  
  #else /* not USE_X_TOOLKIT */
  
-   BLOCK_INPUT;
- 
    check_frame_size (f, &rows, &cols);
    f->output_data.x->vertical_scroll_bar_extra
--- 5045,5051 ----
*************** x_set_window_size (f, change_gravity, co
*** 5125,5128 ****
--- 5079,5092 ----
    PIXEL_HEIGHT (f) = pixelheight;
  
+   /* We've set {FRAME,PIXEL}_{WIDTH,HEIGHT} to the values we hope to
+      receive in the ConfigureNotify event; if we get what we asked
+      for, then the event won't cause the screen to become garbaged, so
+      we have to make sure to do it here.  */
+   SET_FRAME_GARBAGED (f);
+ 
+   XFlush (FRAME_X_DISPLAY (f));
+ 
+ #endif /* not USE_X_TOOLKIT */
+ 
    /* If cursor was outside the new size, mark it as off.  */
    if (f->phys_cursor_y >= rows
*************** x_set_window_size (f, change_gravity, co
*** 5133,5145 ****
      }
  
!   /* We've set {FRAME,PIXEL}_{WIDTH,HEIGHT} to the values we hope to
!      receive in the ConfigureNotify event; if we get what we asked
!      for, then the event won't cause the screen to become garbaged, so
!      we have to make sure to do it here.  */
!   SET_FRAME_GARBAGED (f);
  
-   XFlush (FRAME_X_DISPLAY (f));
    UNBLOCK_INPUT;
- #endif /* not USE_X_TOOLKIT */
  }
  
--- 5097,5113 ----
      }
  
!   /* Clear out any recollection of where the mouse highlighting was,
!      since it might be in a place that's outside the new frame size. 
!      Actually checking whether it is outside is a pain in the neck,
!      so don't try--just let the highlighting be done afresh with new size.  */
!   window = dpyinfo->mouse_face_window;
!   if (! NILP (window) && XFRAME (window) == f)
!     {
!       dpyinfo->mouse_face_beg_row = dpyinfo->mouse_face_beg_col = -1;
!       dpyinfo->mouse_face_end_row = dpyinfo->mouse_face_end_col = -1;
!       dpyinfo->mouse_face_window = Qnil;
!     }
  
    UNBLOCK_INPUT;
  }
  
*************** x_lower_frame (f)
*** 5248,5256 ****
  
  static void
! XTframe_raise_lower (f, raise)
       FRAME_PTR f;
!      int raise;
  {
!   if (raise)
      x_raise_frame (f);
    else
--- 5216,5224 ----
  
  static void
! XTframe_raise_lower (f, raise_flag)
       FRAME_PTR f;
!      int raise_flag;
  {
!   if (raise_flag)
      x_raise_frame (f);
    else
*************** x_destroy_window (f)
*** 5546,5559 ****
    BLOCK_INPUT;
  
!   if (f->output_data.x->icon_desc != 0)
!     XDestroyWindow (FRAME_X_DISPLAY (f), f->output_data.x->icon_desc);
!   XDestroyWindow (FRAME_X_DISPLAY (f), f->output_data.x->window_desc);
  #ifdef USE_X_TOOLKIT
!   XtDestroyWidget (f->output_data.x->widget);
!   free_frame_menubar (f);
  #endif /* USE_X_TOOLKIT */
  
!   free_frame_faces (f);
!   XFlush (FRAME_X_DISPLAY (f));
  
    xfree (f->output_data.x);
--- 5514,5544 ----
    BLOCK_INPUT;
  
!   /* If a display connection is dead, don't try sending more
!      commands to the X server.  */
!   if (dpyinfo->display != 0)
!     {
!       if (f->output_data.x->icon_desc != 0)
! 	XDestroyWindow (FRAME_X_DISPLAY (f), f->output_data.x->icon_desc);
! #ifdef HAVE_X_I18N
!       if (FRAME_XIM (f))
! 	{
! 	  XDestroyIC (FRAME_XIC (f));
! #if ! defined (SOLARIS2) || defined (HAVE_X11R6)
! 	  /* This line causes crashes on Solaris with Openwin,
! 	     due to an apparent bug in XCloseIM.
! 	     X11R6 seems not to have the bug.  */
! 	  XCloseIM (FRAME_XIM (f));
! #endif
! 	}
! #endif
!       XDestroyWindow (FRAME_X_DISPLAY (f), f->output_data.x->window_desc);
  #ifdef USE_X_TOOLKIT
!       XtDestroyWidget (f->output_data.x->widget);
!       free_frame_menubar (f);
  #endif /* USE_X_TOOLKIT */
  
!       free_frame_faces (f);
!       XFlush (FRAME_X_DISPLAY (f));
!     }
  
    xfree (f->output_data.x);
*************** x_wm_set_icon_pixmap (f, pixmap_id)
*** 5754,5757 ****
--- 5739,5744 ----
       int pixmap_id;
  {
+   Pixmap icon_pixmap;
+ 
  #ifdef USE_X_TOOLKIT
    Window window = XtWindow (f->output_data.x->widget);
*************** x_wm_set_icon_pixmap (f, pixmap_id)
*** 5762,5766 ****
    if (pixmap_id > 0)
      {
!       Pixmap icon_pixmap = x_bitmap_pixmap (f, pixmap_id);
        f->output_data.x->wm_hints.icon_pixmap = icon_pixmap;
      }
--- 5749,5753 ----
    if (pixmap_id > 0)
      {
!       icon_pixmap = x_bitmap_pixmap (f, pixmap_id);
        f->output_data.x->wm_hints.icon_pixmap = icon_pixmap;
      }
*************** x_wm_set_icon_pixmap (f, pixmap_id)
*** 5781,5786 ****
--- 5768,5785 ----
      }
  
+ #ifdef USE_X_TOOLKIT /* same as in x_wm_set_window_state.  */
+ 
+   {
+     Arg al[1];
+     XtSetArg (al[0], XtNiconPixmap, icon_pixmap);
+     XtSetValues (f->output_data.x->widget, al, 1);
+   }
+ 
+ #else /* not USE_X_TOOLKIT */
+   
    f->output_data.x->wm_hints.flags |= IconPixmapHint;
    XSetWMHints (FRAME_X_DISPLAY (f), window, &f->output_data.x->wm_hints);
+ 
+ #endif /* not USE_X_TOOLKIT */
  }
  
*************** x_term_init (display_name, xrm_option, r
*** 5869,5873 ****
  
  #ifdef HAVE_X_I18N
!   setlocale (LC_ALL, NULL);
  #endif
  
--- 5868,5875 ----
  
  #ifdef HAVE_X_I18N
!   setlocale (LC_ALL, "");
!   /* In case we just overrode what init_lread did, redo it.  */
!   setlocale (LC_NUMERIC, "C");
!   setlocale (LC_TIME, "C");
  #endif
  
*************** x_term_init (display_name, xrm_option, r
*** 5899,5902 ****
--- 5901,5905 ----
  
  #ifdef HAVE_X11XTR6
+     /* I think this is to compensate for XtSetLanguageProc.  */
      setlocale (LC_NUMERIC, "C");
      setlocale (LC_TIME, "C");
*************** syms_of_xterm ()
*** 6224,6226 ****
    Qvendor_specific_keysyms = intern ("vendor-specific-keysyms");
  }
! #endif /* ! defined (HAVE_X_WINDOWS) */
--- 6227,6274 ----
    Qvendor_specific_keysyms = intern ("vendor-specific-keysyms");
  }
! 
! /* Avoid warnings or errors from including Xlibint.h.
!    We don't need these functions for the rest of this file.  */
! #undef bzero
! #undef bcopy
! #undef bcmp
! #undef min
! #undef max
! 
! #ifdef X_CONNECTION_LOCK_FLAG
! #define free loserfree
! #define malloc losermalloc
! #define exit loserexit
! #define abort loserabort
! /* For XlibDisplayWriting */
! #include <X11/Xlibint.h>
! #endif
! 
! /* Check whether display connection DPYINFO is hung
!    because its thread-interlock is locked.
!    If it is, close the connection.
!    Do nothing if this system does not have a thread interlock.  */
! 
! x_connection_close_if_hung (dpyinfo)
!      struct x_display_info *dpyinfo;
! {      
!   /* This tests (1) whether X_CONNECTION_LOCK_FLAG is defined at all,
!      and (2) whether the name it is defined as is itself defined.
!      (It ought to have been defined by Xlibint.h.  */
! #if X_CONNECTION_LOCK_FLAG
! 
!   if (dpyinfo->display->flags & X_CONNECTION_LOCK_FLAG)
!     {
!       /* If the thread-interlock is locked, assume this connection is dead.
! 	 This assumes that the library does not make other threads
! 	 that can be locking the display legitimately.  */
! 
!       dpyinfo->display->flags &= ~X_CONNECTION_LOCK_FLAG;
!       x_connection_closed (dpyinfo->display, "connection was lost");
!     }
! #endif /* X_CONNECTION_LOCK_FLAG */
! }
! 
! /* Don't put any additional functions here!  */
! 
! #endif /* not HAVE_X_WINDOWS */
diff -2rcpP --exclude=*.elc emacs-19.30/src/xterm.h emacs-19.31/src/xterm.h
*** emacs-19.30/src/xterm.h	Tue Nov  7 02:11:07 1995
--- emacs-19.31/src/xterm.h	Thu Apr 18 00:12:27 1996
*************** GNU General Public License for more deta
*** 16,20 ****
  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 <X11/Xlib.h>
--- 16,21 ----
  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, Inc., 59 Temple Place - Suite 330,
! Boston, MA 02111-1307, USA.  */
  
  #include <X11/Xlib.h>
*************** the Free Software Foundation, 675 Mass A
*** 94,116 ****
  #define FONT_BASE(f)    ((f)->ascent)
  
- #define CHECK_X_FRAME(f, frame)			\
-   if (NILP (frame))				\
-     f = selected_frame;				\
-   else						\
-     {						\
-       CHECK_LIVE_FRAME (frame, 0);		\
-       f = XFRAME (frame);			\
-     }						\
-   if (! FRAME_X_P (f))
- 
-   
- 
  /* The mask of events that text windows always want to receive.  This
!    does not include mouse movement events.  It is used when the window
!    is created (in x_window) and and in selection processing.
! 
!    We do include ButtonReleases in this set because Emacs isn't always
!    fast enough to catch them when it wants them, and they're rare
!    enough that they don't use much processor time.  */
  
  #define STANDARD_EVENT_SET      \
--- 95,101 ----
  #define FONT_BASE(f)    ((f)->ascent)
  
  /* The mask of events that text windows always want to receive.  This
!    includes mouse movement events, since handling the mouse-font text property
!    means that we must track mouse motion all the time.  */
  
  #define STANDARD_EVENT_SET      \
*************** the Free Software Foundation, 675 Mass A
*** 120,124 ****
     | ButtonReleaseMask		\
     | PointerMotionMask		\
-    | PointerMotionHintMask	\
     | StructureNotifyMask	\
     | FocusChangeMask		\
--- 105,108 ----
*************** struct x_output
*** 489,492 ****
--- 473,478 ----
  
  #ifdef HAVE_X_I18N
+   /* Input method. */
+   XIM xim;
    /* Input context (currently, this means Compose key handler setup).  */
    XIC xic;
*************** struct x_output
*** 530,533 ****
--- 516,520 ----
  #define FRAME_DESIRED_CURSOR(f) ((f)->output_data.x->desired_cursor)
  
+ #define FRAME_XIM(f) ((f)->output_data.x->xim)
  #define FRAME_XIC(f) ((f)->output_data.x->xic)
  
*************** struct scroll_bar {
*** 704,712 ****
  
  /* For an event of kind selection_request_event,
!    this structure really describes the contents.  */
  struct selection_input_event
  {
    int kind;
    Display *display;
    Window requestor;
    Atom selection, target, property;
--- 691,703 ----
  
  /* For an event of kind selection_request_event,
!    this structure really describes the contents.
!    **Don't make this struct longer!**
!    If it overlaps the frame_or_window field of struct input_event,
!    that will cause GC to crash.  */
  struct selection_input_event
  {
    int kind;
    Display *display;
+   /* We spell it with an "o" here because X does.  */
    Window requestor;
    Atom selection, target, property;
*************** struct selection_input_event
*** 716,719 ****
--- 707,711 ----
  #define SELECTION_EVENT_DISPLAY(eventp)	\
    (((struct selection_input_event *) (eventp))->display)
+ /* We spell it with an "o" here because X does.  */
  #define SELECTION_EVENT_REQUESTOR(eventp)	\
    (((struct selection_input_event *) (eventp))->requestor)
diff -2rcpP --exclude=*.elc emacs-19.30/vms/VMSINSTALL emacs-19.31/vms/VMSINSTALL
*** emacs-19.30/vms/VMSINSTALL	Thu Nov 12 16:05:44 1992
--- emacs-19.31/vms/VMSINSTALL	Thu Jan  4 16:19:33 1996
*************** This renames all files in the Emacs dist
*** 43,47 ****
  
  Now execute the command file DEV:[LIB.EMACS.VMS]EMACS.COM.  This defines a
! command EMACS that runs a suspendable permanent Emacs.  To fully install
  Emacs, you must arrange for users to run this file on login, or arrange for
  this file to be run when the system boots.
--- 43,47 ----
  
  Now execute the command file DEV:[LIB.EMACS.VMS]EMACS.COM.  This defines a
! command EMACS that runs a suspendible permanent Emacs.  To fully install
  Emacs, you must arrange for users to run this file on login, or arrange for
  this file to be run when the system boots.
diff -2rcpP --exclude=*.elc emacs-19.30/vms/VMSNOTES emacs-19.31/vms/VMSNOTES
*** emacs-19.30/vms/VMSNOTES	Thu Nov 12 16:05:45 1992
--- emacs-19.31/vms/VMSNOTES	Thu Jan  4 16:19:34 1996
*************** subprocess currently do not work on VMS.
*** 8,12 ****
  These include Dired, listing a file directory, reading and sending mail,
  reading and posting netnews, spelling correction, displaying the time and
! load in the mode line, queueing output for printing, and the `sort-columns'
  command.  Naturally, the commands to view Unix manual pages and execute Unix
  shell commands also do not work.
--- 8,12 ----
  These include Dired, listing a file directory, reading and sending mail,
  reading and posting netnews, spelling correction, displaying the time and
! load in the mode line, queuing output for printing, and the `sort-columns'
  command.  Naturally, the commands to view Unix manual pages and execute Unix
  shell commands also do not work.
*************** with multiple equivalences.
*** 43,47 ****
  
  find-file prompts with the current directory.  You can then type a relative
! directory spec to get somewhere else in the hirearchy.  For instance:
  
  Find File: emacs_library:[src][-.lisp]startup.el
--- 43,47 ----
  
  find-file prompts with the current directory.  You can then type a relative
! directory spec to get somewhere else in the hierarchy.  For instance:
  
  Find File: emacs_library:[src][-.lisp]startup.el
diff -2rcpP --exclude=*.elc emacs-19.30/vms/link.com emacs-19.31/vms/link.com
*** emacs-19.30/vms/link.com	Tue May 18 19:04:22 1993
--- emacs-19.31/vms/link.com	Thu Jan  4 16:19:35 1996
*************** environ
*** 84,88 ****
  !multinet:multinet_socket_library/share
  ! If you don't have UCX, comment the following line.
! sys$library:ucx$ipc/library ! You cannot link in the shareable.
  ! If you don't link for X, comment the following line.
  sys$share:decw$xlibshr/share
--- 84,88 ----
  !multinet:multinet_socket_library/share
  ! If you don't have UCX, comment the following line.
! sys$library:ucx$ipc/library ! You cannot link in the sharable.
  ! If you don't link for X, comment the following line.
  sys$share:decw$xlibshr/share
diff -2rcpP --exclude=*.elc emacs-19.30/vms/logout.com emacs-19.31/vms/logout.com
*** emacs-19.30/vms/logout.com	Fri Nov  6 19:34:03 1992
--- emacs-19.31/vms/logout.com	Thu Jan  4 16:19:36 1996
*************** $ err := write sys$error
*** 22,26 ****
  $ on control_y then goto abort
  $!
! $! Check for the existence of subprocecess before allowing logout.
  $! Loop through the process list to find out if the emacs process exists.
  $!
--- 22,26 ----
  $ on control_y then goto abort
  $!
! $! Check for the existence of subprocess before allowing logout.
  $! Loop through the process list to find out if the emacs process exists.
  $!
end-of-emacs-patch-kit
